forked from data.coop/website
Compare commits
126 commits
list-badge
...
main
Author | SHA1 | Date | |
---|---|---|---|
Sam A. | 8f6ff15ff5 | ||
Sam A. | 9c0de66d7e | ||
benjaoming | d03d9fef68 | ||
benjaoming | 56612b28fb | ||
benjaoming | 2fa1832041 | ||
Benjamin Bach | 6427e4b770 | ||
Benjamin Bach | 5ab14dea00 | ||
Benjamin Bach | 23adc3214a | ||
Sam A. | 560b05522a | ||
Sam A. | 44668abc6d | ||
Sam A. | 324a77af35 | ||
Daniel N | 19bc81287f | ||
Daniel N | 3644523cf0 | ||
Sam A. | 948fb1bf66 | ||
benjaoming | a255bc06d6 | ||
benjaoming | 7020e342af | ||
Daniel N | 52a42938db | ||
Daniel N | 1a61003ef7 | ||
Sam A. | 1ae0988d2c | ||
Sam A. | 5e284532a2 | ||
valberg | 9c57c309e2 | ||
valberg | df10ca4ec5 | ||
valberg | e096bcec9c | ||
valberg | a0e5a4d2f1 | ||
benjaoming | 84c1194df6 | ||
benjaoming | dbddff9b6f | ||
benjaoming | 573c71db16 | ||
Benjamin Bach | d25e971def | ||
valberg | e1657ec054 | ||
benjaoming | b239cf3ed8 | ||
Benjamin Bach | fa55a258cc | ||
valberg | 35d2419cac | ||
benjaoming | ea17521fda | ||
valberg | d9637f084c | ||
valberg | c413779a4c | ||
Benjamin Bach | 84a7870c40 | ||
benjaoming | be42e72234 | ||
benjaoming | 1b047ab7e1 | ||
Benjamin Bach | 9f3594f867 | ||
Sam A. | 14fd8ef231 | ||
benjaoming | 91e1f0ac19 | ||
benjaoming | d6df8b1ef4 | ||
Daniel N | e2569e1e2e | ||
Sam A. | 888ddf8465 | ||
Sam A. | 69d2c5b671 | ||
benjaoming | dcc5a231b4 | ||
benjaoming | 6fed406c31 | ||
Benjamin Bach | 268a576b3b | ||
benjaoming | 509b750f0f | ||
Benjamin Bach | 2d6463444d | ||
Benjamin Bach | faeb00cffb | ||
benjaoming | 23d103122c | ||
Benjamin Bach | e320c7be2b | ||
Benjamin Bach | 396a4f8520 | ||
benjaoming | f11ece120b | ||
Benjamin Bach | a5b576e790 | ||
benjaoming | 9c15dfa218 | ||
benjaoming | e82dcb95ed | ||
benjaoming | be0d2ae924 | ||
Sam A. | c4235917c2 | ||
Sam A. | 8b1ee20ba6 | ||
Sam A. | 59ebb1338c | ||
benjaoming | 7ba1a77f5c | ||
benjaoming | 5c18f863d1 | ||
Sam A. | 2cab915021 | ||
Sam A. | d24cdab7e9 | ||
Sam A. | cd06781700 | ||
Sam A. | 730d80ce07 | ||
Benjamin Bach | 943a6ed79e | ||
benjaoming | 3519e9d841 | ||
benjaoming | 96f127aee0 | ||
Sam A. | 1a46bf02d3 | ||
Sam A. | 84f78ee052 | ||
Sam A. | cecf3a26a7 | ||
Sam A. | fe0131dd9b | ||
Sam A. | 3c692301e1 | ||
Sam A. | d71d58f9c6 | ||
Benjamin Bach | 3177b1f6f8 | ||
Benjamin Bach | f4daf56245 | ||
Benjamin Bach | 1321a1d0d3 | ||
benjaoming | f437ff8cb8 | ||
Benjamin Bach | 4941f363e3 | ||
Benjamin Bach | 3884e8c8ae | ||
Benjamin Bach | b5e39c3d19 | ||
Benjamin Bach | 94ee445a24 | ||
benjaoming | 723e2864cb | ||
benjaoming | e2b912ab3f | ||
Benjamin Bach | f60bd27991 | ||
Benjamin Bach | 5a5ad3fbc7 | ||
Benjamin Bach | f2eba1ed12 | ||
Benjamin Bach | 2c080ba5a7 | ||
Benjamin Bach | 9b49d6e4df | ||
benjaoming | b73401f7ad | ||
Benjamin Bach | 5f63a83991 | ||
Benjamin Bach | 152e10821c | ||
Sam A. | 7b82481100 | ||
Sam A. | d12f644147 | ||
Sam A. | d148d05e56 | ||
Sam A. | 9a80f6de26 | ||
Benjamin Bach | 29c9c000c9 | ||
Benjamin Bach | 1d198e21d1 | ||
Benjamin Bach | 3def060a6e | ||
Benjamin Bach | 03c7d882bf | ||
Sam A. | 574e042a1f | ||
Sam A. | c788fe68ca | ||
Sam A. | f767317661 | ||
Sam A. | 77d8177ef7 | ||
Sam A. | 658dc73085 | ||
Sam A. | a2c51388a8 | ||
Sam A. | 90b784dd22 | ||
Sam A. | b58affea8e | ||
benjaoming | a3e3d6d2d8 | ||
Benjamin Bach | 1b638ab7ad | ||
benjaoming | 68f4f97271 | ||
Benjamin Bach | b3affc1643 | ||
benjaoming | a9de76d2e8 | ||
benjaoming | 2f40c9c518 | ||
Benjamin Bach | bf4b4e2770 | ||
Benjamin Bach | bab30c960a | ||
benjaoming | e411796241 | ||
Benjamin Bach | f5f40320b8 | ||
benjaoming | acafbe6aed | ||
Benjamin Bach | 93b431fced | ||
benjaoming | 002931d602 | ||
Benjamin Bach | bedbfb17ec | ||
benjaoming | a2e75abdc4 |
56
.devcontainer/Dockerfile
Normal file
56
.devcontainer/Dockerfile
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04
|
||||||
|
|
||||||
|
ARG USER=vscode
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
RUN usermod -s /usr/bin/zsh ${USER}
|
||||||
|
|
||||||
|
# VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version.
|
||||||
|
ARG VARIANT=hugo_extended
|
||||||
|
# VERSION can be either 'latest' or a specific version number
|
||||||
|
ARG VERSION=latest
|
||||||
|
|
||||||
|
# Download Hugo
|
||||||
|
RUN case ${VERSION} in \
|
||||||
|
latest) \
|
||||||
|
export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\
|
||||||
|
esac && \
|
||||||
|
echo ${VERSION} && \
|
||||||
|
case $(uname -m) in \
|
||||||
|
aarch64) \
|
||||||
|
export ARCH=ARM64 ;; \
|
||||||
|
*) \
|
||||||
|
export ARCH=64bit ;; \
|
||||||
|
esac && \
|
||||||
|
echo ${ARCH} && \
|
||||||
|
wget -O ${VERSION}.tar.gz https://github.com/gohugoio/hugo/releases/download/v${VERSION}/${VARIANT}_${VERSION}_Linux-${ARCH}.tar.gz && \
|
||||||
|
tar xf ${VERSION}.tar.gz && \
|
||||||
|
mv hugo /usr/bin/hugo
|
||||||
|
|
||||||
|
# Hugo dev server port
|
||||||
|
EXPOSE 1313
|
||||||
|
|
||||||
|
|
||||||
|
USER ${USER}
|
||||||
|
ARG HOME=/home/${USER}
|
||||||
|
WORKDIR ${HOME}
|
||||||
|
|
||||||
|
ARG PNPM_HOME=${HOME}/.local/share/pnpm
|
||||||
|
ENV PATH="${PNPM_HOME}:$PATH"
|
||||||
|
RUN <<EOT
|
||||||
|
wget -qO- https://get.pnpm.io/install.sh | ENV="${HOME}/.zshrc" SHELL=/bin/zsh sh -
|
||||||
|
pnpm env use -g lts
|
||||||
|
EOT
|
||||||
|
|
||||||
|
ARG OHMYZSH_HOME=${HOME}/.oh-my-zsh
|
||||||
|
|
||||||
|
# ARG OHMYZSH_THEME=${OHMYZSH_HOME}/custom/themes
|
||||||
|
# RUN <<EOT
|
||||||
|
# git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${OHMYZSH_THEME}/powerlevel10k
|
||||||
|
# sed -i 's|ZSH_THEME="devcontainers"|ZSH_THEME="powerlevel10k/powerlevel10k"|g' .zshrc
|
||||||
|
# echo 'POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true' >> .zshrc
|
||||||
|
# EOT
|
||||||
|
|
||||||
|
RUN <<EOT
|
||||||
|
hugo completion zsh > ${OHMYZSH_HOME}/plugins/git/_hugo
|
||||||
|
EOT
|
51
.devcontainer/devcontainer.json
Normal file
51
.devcontainer/devcontainer.json
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
"name": "Hugo & pnpm",
|
||||||
|
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
|
||||||
|
// 👇 Features to add to the Dev Container. More info: https://containers.dev/implementors/features.
|
||||||
|
// "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {} },
|
||||||
|
|
||||||
|
// 👇 Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
|
// "forwardPorts": [],
|
||||||
|
|
||||||
|
// Configure tool-specific properties.
|
||||||
|
"customizations": {
|
||||||
|
// Configure properties specific to VS Code.
|
||||||
|
"vscode": {
|
||||||
|
// Set *default* container specific settings.json values on container create.
|
||||||
|
"settings": {
|
||||||
|
"html.format.templating": true
|
||||||
|
},
|
||||||
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
|
"extensions": [
|
||||||
|
// https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter
|
||||||
|
"eliostruyf.vscode-front-matter",
|
||||||
|
// https://marketplace.visualstudio.com/items?itemName=rusnasonov.vscode-hugo
|
||||||
|
"rusnasonov.vscode-hugo",
|
||||||
|
// https://marketplace.visualstudio.com/items?itemName=budparr.language-hugo-vscode
|
||||||
|
"budparr.language-hugo-vscode",
|
||||||
|
// https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-hugo-themer
|
||||||
|
"eliostruyf.vscode-hugo-themer",
|
||||||
|
// https://marketplace.visualstudio.com/items?itemName=kaellarkin.hugo-shortcode-syntax
|
||||||
|
"kaellarkin.hugo-shortcode-syntax",
|
||||||
|
|
||||||
|
// "csstools.postcss",
|
||||||
|
|
||||||
|
// "esbenp.prettier-vscode",
|
||||||
|
// "tamasfe.even-better-toml",
|
||||||
|
// "naumovs.color-highlight",
|
||||||
|
// "GitHub.vscode-pull-request-github",
|
||||||
|
// "eamodio.gitlens",
|
||||||
|
"davidanson.vscode-markdownlint",
|
||||||
|
"streetsidesoftware.code-spell-checker"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
|
||||||
|
"postCreateCommand": "pnpm install-completion zsh"
|
||||||
|
}
|
78
.drone.yml
78
.drone.yml
|
@ -2,16 +2,32 @@ kind: pipeline
|
||||||
name: default
|
name: default
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build
|
# stable site
|
||||||
image: debian:buster-slim
|
- name: build_stable
|
||||||
|
image: floryn90/hugo:ext-alpine-ci
|
||||||
|
user: root
|
||||||
|
environment:
|
||||||
|
HUGO_SECURITY_HTTP_URLS: none
|
||||||
commands:
|
commands:
|
||||||
- apt-get update; apt-get upgrade -y
|
|
||||||
- apt-get install -y wget git
|
|
||||||
- wget https://github.com/gohugoio/hugo/releases/download/v0.80.0/hugo_extended_0.80.0_Linux-64bit.deb -O hugo.deb
|
|
||||||
- dpkg -i hugo.deb
|
|
||||||
- hugo --destination _site/
|
- hugo --destination _site/
|
||||||
|
when:
|
||||||
- name: docker
|
branch:
|
||||||
|
- main
|
||||||
|
|
||||||
|
# staging site
|
||||||
|
- name: build_staging
|
||||||
|
image: floryn90/hugo:ext-alpine-ci
|
||||||
|
user: root
|
||||||
|
environment:
|
||||||
|
HUGO_SECURITY_HTTP_URLS: none
|
||||||
|
commands:
|
||||||
|
- hugo --baseURL "https://staging.data.coop" --destination _site/
|
||||||
|
when:
|
||||||
|
branch:
|
||||||
|
- staging
|
||||||
|
|
||||||
|
# stable site
|
||||||
|
- name: docker_stable
|
||||||
image: plugins/docker
|
image: plugins/docker
|
||||||
settings:
|
settings:
|
||||||
repo: docker.data.coop/data-coop-website
|
repo: docker.data.coop/data-coop-website
|
||||||
|
@ -20,19 +36,47 @@ steps:
|
||||||
from_secret: DOCKER_USERNAME
|
from_secret: DOCKER_USERNAME
|
||||||
password:
|
password:
|
||||||
from_secret: DOCKER_PASSWORD
|
from_secret: DOCKER_PASSWORD
|
||||||
tags:
|
tags:
|
||||||
- "${DRONE_BUILD_NUMBER}"
|
- "${DRONE_BUILD_NUMBER}"
|
||||||
- "hugo"
|
- "stable"
|
||||||
when:
|
when:
|
||||||
branch:
|
branch:
|
||||||
- new
|
- main
|
||||||
|
event:
|
||||||
|
exclude:
|
||||||
|
- pull_request
|
||||||
|
|
||||||
- name: notify
|
# staging site
|
||||||
image: plugins/matrix
|
- name: docker_staging
|
||||||
|
image: plugins/docker
|
||||||
settings:
|
settings:
|
||||||
homeserver: https://data.coop
|
repo: docker.data.coop/data-coop-website
|
||||||
roomid: plKSghHbepWeUEtbHE:data.coop
|
registry: docker.data.coop
|
||||||
username:
|
username:
|
||||||
from_secret: matrix_username
|
from_secret: DOCKER_USERNAME
|
||||||
password:
|
password:
|
||||||
from_secret: matrix_password
|
from_secret: DOCKER_PASSWORD
|
||||||
|
tags:
|
||||||
|
- "${DRONE_BUILD_NUMBER}"
|
||||||
|
- "staging"
|
||||||
|
when:
|
||||||
|
branch:
|
||||||
|
- staging
|
||||||
|
event:
|
||||||
|
exclude:
|
||||||
|
- pull_request
|
||||||
|
|
||||||
|
# - name: notify
|
||||||
|
# image: spotlightkid/drone-matrixchat-notify:latest
|
||||||
|
# settings:
|
||||||
|
# homeserver: https://data.coop
|
||||||
|
# roomid: '!plKSghHbepWeUEtbHE:data.coop'
|
||||||
|
# userid:
|
||||||
|
# from_secret: matrix_username
|
||||||
|
# password:
|
||||||
|
# from_secret: matrix_password
|
||||||
|
# markdown: 'yes'
|
||||||
|
# template: |
|
||||||
|
# `${DRONE_REPO}` build #${DRONE_BUILD_NUMBER} status: **${DRONE_BUILD_STATUS}**
|
||||||
|
#
|
||||||
|
# ${DRONE_PULL_REQUEST_TITLE}](${DRONE_COMMIT_LINK})
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
FROM debian:buster-slim
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get upgrade -y && \
|
|
||||||
apt-get install -y wget git && \
|
|
||||||
wget https://github.com/gohugoio/hugo/releases/download/v0.111.1/hugo_extended_0.111.1_linux-amd64.deb -O hugo.deb && \
|
|
||||||
dpkg -i hugo.deb
|
|
|
@ -10,7 +10,7 @@ Running with Docker
|
||||||
|
|
||||||
In `docker-compose.yml`, we have specified a `serve` target which you can run locally like this:
|
In `docker-compose.yml`, we have specified a `serve` target which you can run locally like this:
|
||||||
|
|
||||||
``` {.sourceCode .bash}
|
```bash
|
||||||
docker-compose up serve
|
docker-compose up serve
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ file an issue!
|
||||||
|
|
||||||
Example recipe
|
Example recipe
|
||||||
|
|
||||||
``` {.sourceCode .bash}
|
```bash
|
||||||
# Fetch .deb from Github
|
# Fetch .deb from Github
|
||||||
wget https://github.com/gohugoio/hugo/releases/download/v0.80.0/hugo_extended_X.Y.Z_Linux-64bit.deb -O hugo_extended.deb
|
wget https://github.com/gohugoio/hugo/releases/download/v0.80.0/hugo_extended_X.Y.Z_Linux-64bit.deb -O hugo_extended.deb
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ hugo server
|
||||||
Deploying the site
|
Deploying the site
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
Simply pushing to `master` in our main repo at
|
Simply pushing to `main` in our main repo at
|
||||||
<https://git.data.coop/data.coop/website/> will trigger a
|
<https://git.data.coop/data.coop/website/> will trigger a
|
||||||
build-and-deploy of the website.
|
build-and-deploy of the website.
|
||||||
|
|
||||||
|
|
8
ROADMAP
8
ROADMAP
|
@ -1,8 +0,0 @@
|
||||||
|
|
||||||
Uge 1: Basal bootstrap skellet, fonte farver osv. TJEK
|
|
||||||
Uge 2: HTML skabelon og Hugo skelet til undersider
|
|
||||||
Uge 3: Beta-hjemmeside, "style guide"
|
|
||||||
Uge 4: Indhold og lancering
|
|
||||||
|
|
||||||
|
|
||||||
|
|
17
config.yaml
17
config.yaml
|
@ -1,4 +1,4 @@
|
||||||
baseURL: https://new.data.coop
|
baseURL: https://data.coop
|
||||||
|
|
||||||
copyright: CC-BY, see https://creativecommons.org/licenses/by/4.0/
|
copyright: CC-BY, see https://creativecommons.org/licenses/by/4.0/
|
||||||
|
|
||||||
|
@ -17,7 +17,15 @@ markup:
|
||||||
languages:
|
languages:
|
||||||
da:
|
da:
|
||||||
title: data.coop
|
title: data.coop
|
||||||
weight: 1
|
params:
|
||||||
|
description: "Et datakollektiv, der passer på dine data."
|
||||||
|
weight: 1
|
||||||
|
# First Hugo looks in your post front matter for an images value (images: [""])
|
||||||
|
# Then Hugo searchs for image page resources with feature, cover or thumbnail in their name. These are images files under a directory that matches the post (e.g. content\posts\first-post)
|
||||||
|
# If not images are found, Hugo looks for images (images: [""]) in your site config
|
||||||
|
# If no image if found, then an image-less Twitter summary card is used instead of summary_large_image
|
||||||
|
# https://digitaldrummerj.me/hugo-preview-when-sharing-twitter/
|
||||||
|
images: ["/static/img/some_card_preview_large_da.png"]
|
||||||
LanguageName: Dansk
|
LanguageName: Dansk
|
||||||
menu:
|
menu:
|
||||||
nav:
|
nav:
|
||||||
|
@ -35,7 +43,10 @@ languages:
|
||||||
weight: 4
|
weight: 4
|
||||||
en:
|
en:
|
||||||
title: data.coop
|
title: data.coop
|
||||||
|
params:
|
||||||
|
description: "A data collective that takes care of your data."
|
||||||
weight: 2
|
weight: 2
|
||||||
|
images: ["/static/img/some_card_preview_large_en.png"]
|
||||||
LanguageName: English
|
LanguageName: English
|
||||||
menu:
|
menu:
|
||||||
nav:
|
nav:
|
||||||
|
@ -52,5 +63,3 @@ languages:
|
||||||
url: "en/rights/"
|
url: "en/rights/"
|
||||||
weight: 4
|
weight: 4
|
||||||
|
|
||||||
params:
|
|
||||||
description: "Et datakollektiv, der passer på dine data."
|
|
||||||
|
|
|
@ -38,3 +38,4 @@ Vores kerneprincipper er:
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
Ud fra de kerneprincipper vil vi med tiden udbyde onlinetjenester til medlemmerne. Hovedtanken er, at vi som udgangspunkt stoler mere på hinanden end på "de store" som f.eks. Google, Microsoft eller Facebook.
|
Ud fra de kerneprincipper vil vi med tiden udbyde onlinetjenester til medlemmerne. Hovedtanken er, at vi som udgangspunkt stoler mere på hinanden end på "de store" som f.eks. Google, Microsoft eller Facebook.
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,45 @@
|
||||||
---
|
---
|
||||||
title: Velcome to data.coop
|
title: Welcome to data.coop
|
||||||
---
|
---
|
||||||
|
|
||||||
We are an association whose purpose is to look after the members' data. Our core principles are
|
data.coop is a cooperative, which owns and operates a digital infrastructure for its members. Our fundamental vision is to protect our members' data.
|
||||||
|
The community consists of members around the Copenhagen-area and is open to inquiries from abroad to start sister infrastructures based on the same principles.
|
||||||
|
|
||||||
- Privacy
|
Our core principles are:
|
||||||
- Encryption
|
|
||||||
- Decentralization
|
<dl class="principles-list">
|
||||||
- Zero-knowledge
|
<dt>
|
||||||
|
<img src="/static/img/icons/no-surveillance.svg" />
|
||||||
|
Privacy
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
We protect member data together.
|
||||||
|
We do not share them for profit.
|
||||||
|
Data is always encrypted in transit.
|
||||||
|
</dd>
|
||||||
|
<dt>
|
||||||
|
<img src="/static/img/icons/encrypted.svg" />
|
||||||
|
Encryption
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
We provide secure services that are thoroughly declared.
|
||||||
|
</dd>
|
||||||
|
<dt>
|
||||||
|
<img src="/static/img/icons/decentralised.svg" />
|
||||||
|
Decentralization
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
Our services exist together with other decentralized counterparts.
|
||||||
|
</dd>
|
||||||
|
<dt>
|
||||||
|
<img src="/static/img/icons/zero-knowledge.svg" />
|
||||||
|
Zero knowledge
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
Whenever possible, we ensure that a system administrator does not have technical ability to access member data.
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
From these core principles, we will continue to develop services for members.
|
||||||
|
The idea is that we trust each other more than any Big Tech operators, such as Google, Microsoft or Facebook.
|
||||||
|
|
||||||
Based on the core principles, over time we will provide online services to members. The main idea is,
|
|
||||||
that we basically rely more on each other than on the "big ones" such as Google, Microsoft or Facebook.
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
title: "Om os"
|
title: "Om os"
|
||||||
---
|
---
|
||||||
|
|
||||||
**data.coop** er en forening og et kooperativ.
|
**[data.coop]({{< ref "/" >}})** er en forening og et kooperativ.
|
||||||
|
|
||||||
Vi — medlemmerne i kooperativet — ejer vores egne data.
|
Vi — medlemmerne i kooperativet — ejer vores egne data.
|
||||||
|
|
||||||
|
@ -17,5 +17,5 @@ Du kan finde os på:
|
||||||
|
|
||||||
* Matrix: [#data.coop:data.coop](https://matrix.to/#/#data.coop:data.coop)
|
* Matrix: [#data.coop:data.coop](https://matrix.to/#/#data.coop:data.coop)
|
||||||
* IRC (Libera.chat): #data.coop
|
* IRC (Libera.chat): #data.coop
|
||||||
* Vores [Gitea server](https://git.data.coop/data.coop/)
|
* Vores [Forgejo server](https://git.data.coop/data.coop/)
|
||||||
* På Fødiverset/Mastodon: <a rel="me" href="https://social.data.coop/@datacoop">@datacoop@data.coop</a>
|
* På Fødiverset/Mastodon: <a rel="me" href="https://social.data.coop/@datacoop">@datacoop@data.coop</a>
|
||||||
|
|
|
@ -2,7 +2,23 @@
|
||||||
title: "About"
|
title: "About"
|
||||||
---
|
---
|
||||||
|
|
||||||
## This Theme
|
**[data.coop]({{< ref "/" >}})** is an association and a cooperative.
|
||||||
|
|
||||||
Thanks for visiting this theme demo. If you're interested, checkout my other stuff over at <https://zwbetz.com>
|
The community consists of members around the Copenhagen-area and is open to inquiries from abroad to start sister infrastructures based on the same principles.
|
||||||
|
If you are interested in becoming a member of data.coop but you are not able to participate in physical meetings in Copenhagen, we encourage that you get in touch with us about a vision you have for your community, rather than signing up as a member.
|
||||||
|
|
||||||
|
We — the members of the cooperative — own our own data.
|
||||||
|
|
||||||
|
In practice, this means that:
|
||||||
|
|
||||||
|
* We own our own hardware.
|
||||||
|
* We only use Open Source Software.
|
||||||
|
|
||||||
|
The cooperative owns 2 rack servers, of which one is in use and one is spare.
|
||||||
|
|
||||||
|
You can find us here:
|
||||||
|
|
||||||
|
* Matrix: [#data.coop:data.coop](https://matrix.to/#/#data.coop:data.coop)
|
||||||
|
* IRC (Libera.chat): #data.coop
|
||||||
|
* Our [Forgejo server](https://git.data.coop/data.coop/)
|
||||||
|
* In the Fediverse/Mastodon: <a rel="me" href="https://social.data.coop/@datacoop">@datacoop@data.coop</a>
|
||||||
|
|
|
@ -2,18 +2,35 @@
|
||||||
title: Bliv medlem
|
title: Bliv medlem
|
||||||
---
|
---
|
||||||
|
|
||||||
[data.coop](https://data.coop) er en demokratisk forening. Medlemmer bestemmer
|
[data.coop]({{< ref "/" >}}) er en demokratisk forening. Medlemmer bestemmer
|
||||||
over foreningens generelle drift og hvordan data skal forvaltes. Dette sker som i en helt klassisk forening i henhold til vores vedtægter på den årlige
|
over foreningens generelle drift og hvordan data skal forvaltes. Dette sker som i en helt klassisk forening i henhold til vores vedtægter på den årlige
|
||||||
generalforsamling.
|
generalforsamling.
|
||||||
|
|
||||||
Du bliver medlem ved at overføre penge til vores konto og sende en email til
|
Du bør læse vores [vedtægter]({{< ref "/rights.md" >}}) og især vores [Acceptable Usage Policy (AUP)](https://git.data.coop/data.coop/dokumenter/src/branch/main/Acceptable%20Usage%20Policy.md) inden du melder dig ind. Har du spørgsmål, kan du finde os på [Matrix og IRC]({{< ref "/about.md" >}}) eller [sende en e-mail til bestyrelsen](mailto:board@data.coop).
|
||||||
vores kasserer, [benjaoming@data.coop](mailto:benjaoming@data.coop), med dit navn.
|
|
||||||
|
|
||||||
* Reg. 8401 (Merkur)
|
## Medlemspris
|
||||||
* Kontonr. 1016866
|
|
||||||
* Tekst på overførslen: Fornavn+efternavn
|
|
||||||
|
|
||||||
Årligt kontingent: **300 kr** (dog gerne mere)\
|
Vores kontingentår løber fra og med 1. juli til og med 30. juni.
|
||||||
Nedsat kontingent for studerende/arbejdsløse: **50 kr**
|
|
||||||
|
|
||||||
Kontingent-perioden gælder for det år, man melder sig ind i.
|
Medlemskab består af et kontingent til foreningen, samt en medlemsydelse for brug af tjenesterne. Betalinger følger det kontingentåret. Dvs. medlemskab er fortløbende fra betaling af kontingent frem til overstået ordinær generalforsamling. Medlemsydelsen er ligeledes 1 år forudbetalt og følger også kontingentåret, dog i indmeldelsesåret er kun indregnet tilbageværende måneder til og med juni.
|
||||||
|
|
||||||
|
* Almindeligt medlem: **600 kr / år**
|
||||||
|
* Heraf 150 kr kontingent
|
||||||
|
* ...og 450 kr medlemsydelse (inkl. moms)
|
||||||
|
* Nedsat kontingent: **100 kr / år**
|
||||||
|
* Heraf 50 kr kontingent
|
||||||
|
* ...og 50 kr medlemsydelse (inkl. moms)
|
||||||
|
|
||||||
|
Nedsat kontingent tilbydes til studerende og arbejdsløse.
|
||||||
|
|
||||||
|
## Sådan melder du dig ind
|
||||||
|
|
||||||
|
En betalingsløsning er under udvikling.
|
||||||
|
|
||||||
|
Du melder dig ind ved at skrive til kasserer@data.coop med følgende information:
|
||||||
|
|
||||||
|
* At du har læst og er enig i vores [vedtægter]({{< ref "/rights.md" >}}) og [Acceptable Usage Policy (AUP)](https://git.data.coop/data.coop/dokumenter/src/branch/main/Acceptable%20Usage%20Policy.md).
|
||||||
|
* Ønsket primært brugernavn
|
||||||
|
* Ønsket email-adresse
|
||||||
|
|
||||||
|
Herefter kan vi sende dig en invitation og et betalingslink.
|
||||||
|
|
|
@ -2,4 +2,43 @@
|
||||||
title: Become a member
|
title: Become a member
|
||||||
---
|
---
|
||||||
|
|
||||||
:P
|
[data.coop]({{< ref "/" >}}) is a cooperative established as a democratic association.
|
||||||
|
The members decide on the association's operations and how data should be governed.
|
||||||
|
Governance resembles any classic association: We have legal statutes and formal general assemblies.
|
||||||
|
|
||||||
|
You need to read our [statutes]({{< relref "/rights.md" >}}) and our
|
||||||
|
[Acceptable Usage Policy (AUP)](https://git.data.coop/data.coop/dokumenter/src/branch/main/Acceptable%20Usage%20Policy.md)
|
||||||
|
before becoming a member.
|
||||||
|
If you have questions, you can find us on [Matrix or IRC]({{< ref "/about.md" >}}) or [send an email to the board](mailto:board@data.coop).
|
||||||
|
|
||||||
|
*English speakers:* We would love to have you as a member.
|
||||||
|
Many parts of this organization are already in English,
|
||||||
|
but our legal documents are not (yet).
|
||||||
|
Please write us if you have any questions.
|
||||||
|
|
||||||
|
## Price
|
||||||
|
|
||||||
|
Our membership period runs from one general assembly to the next => July 1st until June 30th.
|
||||||
|
|
||||||
|
A membership is comprised of a contingent to the association and a service fee. Payments follow the membership period.
|
||||||
|
|
||||||
|
* Ordinary membershio: **600 kr / år**
|
||||||
|
* ...of which 150 kr is contingent
|
||||||
|
* ...and 450 kr are service fee (incl. VAT)
|
||||||
|
* Reduced membership: **100 kr / år**
|
||||||
|
* ...of which 50 kr is contingent
|
||||||
|
* ...and 50 kr is service fee (incl. VAT)
|
||||||
|
|
||||||
|
The reduced membership is offered to students and unemployed members.
|
||||||
|
|
||||||
|
## How to become a member
|
||||||
|
|
||||||
|
We are developing a sign-up form.
|
||||||
|
|
||||||
|
Currently, you sign up by writing kasserer@data.coop with the following info:
|
||||||
|
|
||||||
|
* That you have read and agree to our [statutes]({{< ref "/rights.md" >}}) and [Acceptable Usage Policy (AUP)](https://git.data.coop/data.coop/dokumenter/src/branch/main/Acceptable%20Usage%20Policy.md).
|
||||||
|
* A desired primary username
|
||||||
|
* The email address to connect to your account
|
||||||
|
|
||||||
|
After this, we can send you an invite and payment link.
|
||||||
|
|
|
@ -43,13 +43,15 @@ foreningens hjemmeside og mailinglister. Ordinær generalforsamling afholdes
|
||||||
hvert år inden udgangen af september måned. Dagsorden for ordinær
|
hvert år inden udgangen af september måned. Dagsorden for ordinær
|
||||||
generalforsamling skal indeholde følgende punkter:
|
generalforsamling skal indeholde følgende punkter:
|
||||||
|
|
||||||
1. Valg af dirigent og referent.
|
1. Formalia
|
||||||
|
1. Valg af dirigent.
|
||||||
|
2. Generalforsamlingens lovlighed (er indkaldelsen sket rettidigt).
|
||||||
|
3. Valg af referent.
|
||||||
2. Bestyrelsens beretning.
|
2. Bestyrelsens beretning.
|
||||||
3. Fremlæggelse af regnskab, budget og kontingent.
|
3. Fremlæggelse og godkendelse af regnskab, budget og kontingent.
|
||||||
4. Indkomne forslag.
|
4. Indkomne forslag.
|
||||||
5. Godkendelse af vedtægtsændringer og Acceptable Use Policy
|
5. Valg (Jf. § 3)
|
||||||
6. Valg (Jf. § 3)
|
6. Eventuelt
|
||||||
7. Eventuelt
|
|
||||||
|
|
||||||
### § 4.1. Afholdelse af generalforsamlinger og bestyrelsesmøder
|
### § 4.1. Afholdelse af generalforsamlinger og bestyrelsesmøder
|
||||||
Generalforsamlinger og bestyrelsesmøder kan afholdes på internettet.
|
Generalforsamlinger og bestyrelsesmøder kan afholdes på internettet.
|
||||||
|
@ -77,10 +79,14 @@ Bestyrelsen fastsætter selv sin forretningsorden.
|
||||||
Bestyrelsen kan sammensætte samarbejdsgrupper af medlemmer, der kan fungerer
|
Bestyrelsen kan sammensætte samarbejdsgrupper af medlemmer, der kan fungerer
|
||||||
som idéudviklingsforum for foreningen.
|
som idéudviklingsforum for foreningen.
|
||||||
|
|
||||||
|
### § 5.1 Tegningsret
|
||||||
|
|
||||||
Tegningsret for foreningen har forpersonen og kassereren, dog ved køb, salg eller
|
Tegningsret for foreningen har forpersonen og kassereren, dog ved køb, salg eller
|
||||||
pantsætning af fast ejendom, indgåelse af driftsaftaler samt ved optagelse af
|
pantsætning af fast ejendom, indgåelse af driftsaftaler samt ved optagelse af
|
||||||
lån, af den samlede bestyrelse.
|
lån, af den samlede bestyrelse.
|
||||||
|
|
||||||
|
Den samlede bestyrelse kan meddele prokura til individuelle medlemmer af bestyrelsen.
|
||||||
|
|
||||||
## § 6. Medlemskab
|
## § 6. Medlemskab
|
||||||
Som medlem kan enhver fysisk person optages, som har interesse i at støtte
|
Som medlem kan enhver fysisk person optages, som har interesse i at støtte
|
||||||
foreningens formål. Medlemskab er bindende for et år ad gangen.
|
foreningens formål. Medlemskab er bindende for et år ad gangen.
|
||||||
|
@ -108,14 +114,56 @@ på en ekstraordinær generalforsamling.
|
||||||
|
|
||||||
Mistillid til administratorer skal meldes til bestyrelsen. Bestyrelsen kan midlertidigt fratage en administrator vedkommendes administrationsrettigheder, indtil mistillidserklæringen mod vedkommende er behandlet.
|
Mistillid til administratorer skal meldes til bestyrelsen. Bestyrelsen kan midlertidigt fratage en administrator vedkommendes administrationsrettigheder, indtil mistillidserklæringen mod vedkommende er behandlet.
|
||||||
|
|
||||||
## § 8. Kontingent/finansiering
|
## § 8. Moderationspolitik
|
||||||
|
Foreningen vedtager en moderationspolitik for foreningens sociale tjenester på generalforsamlingen. Moderationspolitikken håndhæves af et moderatorhold.
|
||||||
|
|
||||||
|
### § 8.1 Udpegning af moderatorer
|
||||||
|
Bestyrelsen udpeger moderatorer.
|
||||||
|
|
||||||
|
Udpegning af moderatorer skal annonceres til foreningens medlemmer.
|
||||||
|
|
||||||
|
Kun medlemmer af foreningen kan bestride hvervet som moderator. Moderatorer skal så vidt muligt findes udenfor bestyrelsen, dog skal mindst én moderator samtidig være bestyrelsesmedlem.
|
||||||
|
|
||||||
|
### § 8.2 Mistillid til moderatorer
|
||||||
|
Hvis der er mistillid til en eller flere moderatorer skal dette behandles
|
||||||
|
på en ekstraordinær generalforsamling.
|
||||||
|
|
||||||
|
Mistillid til moderatorer skal meldes til bestyrelsen. Bestyrelsen kan midlertidigt fratage en moderator vedkommendes moderatorrettigheder, indtil mistillidserklæringen mod vedkommende er behandlet.
|
||||||
|
|
||||||
|
## § 9. Kontingent/finansiering
|
||||||
De årlige kontingenter fastsættes af generalforsamlingen.
|
De årlige kontingenter fastsættes af generalforsamlingen.
|
||||||
|
|
||||||
Foreningen kan herudover finansieres ved sponsor- og annoncestøtte samt bidrag
|
Foreningen kan herudover finansieres ved sponsor- og annoncestøtte samt bidrag
|
||||||
fra offentlige/private virksomheder, fonde, øvrige foreninger/institutioner og
|
fra offentlige/private virksomheder, fonde, øvrige foreninger/institutioner og
|
||||||
private personer, så længe det ikke stiller krav til foreningens dispositioner.
|
private personer, så længe det ikke stiller krav til foreningens dispositioner.
|
||||||
|
|
||||||
## § 9. Ekstraordinær generalforsamling
|
## § 10. Medlemsydelse
|
||||||
|
|
||||||
|
Foreningen stiller tjenester til rådighed for sine medlemmer mod betaling af medlemsydelse.
|
||||||
|
|
||||||
|
Medlemsydelsen defineres og prissættes af bestyrelsen.
|
||||||
|
|
||||||
|
### § 10.1 Leverings- og betalingsbetingelser
|
||||||
|
|
||||||
|
Bestyrelsen fastsætter leverings- og betalingsbetingelser, såsom betalingsperioder, frister og refusion.
|
||||||
|
|
||||||
|
Bestyrelsen forudsætter sig ret til at pålægge gebyrer eller lukke for tjenester ved udebleven betaling.
|
||||||
|
|
||||||
|
### § 10.2 Ændring af medlemsydelser og betalingsbetingelser
|
||||||
|
|
||||||
|
Ændring af ydelser og betalingsbetingelser skal annonceres til foreningens medlemmer mindst 30 dage inden ændringen træder i kraft.
|
||||||
|
|
||||||
|
Tilføjelser af flere tjenester eller ændringer på konfigurationen af tjenester anses IKKE som ændringer, der kræver varslinger.
|
||||||
|
|
||||||
|
### § 10.3 Indsigelse mod ændringer
|
||||||
|
|
||||||
|
Hvis et eller flere medlemmer er uenige i ændringer af medlemsydelsen eller betalingsbetingelser, kan de indsende en skriftlig indsigelse til bestyrelsen.
|
||||||
|
|
||||||
|
Indsigelsen skal være bestyrelsen i hænde senest 14 dage før ændringen træder i kraft.
|
||||||
|
|
||||||
|
Hvis bestyrelsen modtager indsigelser fra mindst 1/3 af foreningens medlemmer, skal bestyrelsen indkalde til en ekstraordinær generalforsamling, hvor ændringen skal fremsættes som forslag og godkendes af generalforsamlingen.
|
||||||
|
|
||||||
|
## § 11. Ekstraordinær generalforsamling
|
||||||
Indkaldelse sker, hvis et flertal af bestyrelsen ønsker det.
|
Indkaldelse sker, hvis et flertal af bestyrelsen ønsker det.
|
||||||
|
|
||||||
Indkaldelse sker, hvis 1/3 af medlemmerne ønsker det.
|
Indkaldelse sker, hvis 1/3 af medlemmerne ønsker det.
|
||||||
|
@ -124,10 +172,10 @@ Indkaldelse sker under samme betingelser, som anført i §4.
|
||||||
|
|
||||||
Dagsorden skal motiveres.
|
Dagsorden skal motiveres.
|
||||||
|
|
||||||
## § 10. Regnskab
|
## § 12. Regnskab
|
||||||
Regnskabsåret for Foreningen er kalenderåret.
|
Regnskabsåret for Foreningen er kalenderåret.
|
||||||
|
|
||||||
## § 11. Opløsning
|
## § 13. Opløsning
|
||||||
Opløsning af foreningen kræver et flertal på ¾ af generalforsamlingens eller
|
Opløsning af foreningen kræver et flertal på ¾ af generalforsamlingens eller
|
||||||
den ekstraordinære generalforsamlings fremmødte medlemmer.
|
den ekstraordinære generalforsamlings fremmødte medlemmer.
|
||||||
|
|
||||||
|
|
164
content/rights.en.md
Normal file
164
content/rights.en.md
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
---
|
||||||
|
title: Legal statutes of data.coop
|
||||||
|
---
|
||||||
|
|
||||||
|
> This translation is provided solely for the purpose of guidance. The [Danish version](/rights/) remains the official and legally binding version.
|
||||||
|
|
||||||
|
## § 1. Name and location
|
||||||
|
The name of the association is: data.coop
|
||||||
|
|
||||||
|
The association is based in the city of Copenhagen but (its activities are) primarily online.
|
||||||
|
|
||||||
|
## § 2. Aim
|
||||||
|
|
||||||
|
The main aims of the association is to provide digital infrastructure to its members, while keeping the core principles of the association — privacy, encryption, decentralization and zero knowledge — in focus.
|
||||||
|
|
||||||
|
### § 2.1 Secondary aims
|
||||||
|
|
||||||
|
* The association works to promote its core principles.
|
||||||
|
* The association helps people act responsibly online.
|
||||||
|
* The association collaborates with other data cooperatives and/or helps other start up similar initiatives.
|
||||||
|
* The association may provide its services to other non-profits, grassroots movements and similar, working independently of the association with goals that match the aims and core principles of the association.
|
||||||
|
|
||||||
|
## § 3. Governance
|
||||||
|
Overriding power of the association lies with the General Assembly, consisting of members with a valid proof of membership.
|
||||||
|
|
||||||
|
The General Assembly elects:
|
||||||
|
|
||||||
|
- A board of 5 members
|
||||||
|
- 2 alternate board members
|
||||||
|
- 1 financial auditor
|
||||||
|
- Optionally, 1 alternate financial auditor
|
||||||
|
|
||||||
|
Board members are elected for a period of 2 years, so that at least 2 members are up for election every year. The auditor and alternates are up for election every year.
|
||||||
|
|
||||||
|
## § 4. The General Assembly (GA)
|
||||||
|
The board calls for meetings of the GA no less than 14 days prior through the website of the association and mailing lists. The GA meets every year before the end of September. The agenda of the annual meeting of the GA must include the following items:
|
||||||
|
|
||||||
|
1. Formalities
|
||||||
|
1. Election of a meeting chair and notetaker
|
||||||
|
2. Legality of the meeting (was the meeting called in time)
|
||||||
|
3. Election of a notetaker
|
||||||
|
2. Report from the board
|
||||||
|
3. Presentation and approval of accounts, budget and membership fee
|
||||||
|
4. Incoming motions
|
||||||
|
5. Elections (as per §3)
|
||||||
|
6. Any other business
|
||||||
|
|
||||||
|
### § 4.1. Holding of meetings of the GA and the board
|
||||||
|
Meetings of the GA and the board may take place online.
|
||||||
|
|
||||||
|
### § 4.2. Incoming motions and statute amendments
|
||||||
|
|
||||||
|
Motions and statute amendments must be received by the board no less than a week before the meeting of the GA and presented to members no less than 4 days before the the meeting of the GA.
|
||||||
|
|
||||||
|
### § 4.3. Statute amendments
|
||||||
|
|
||||||
|
Passing of statute amendments requires a three-quarters majority of members present at the meeting of the GA.
|
||||||
|
|
||||||
|
### § 4.4. Motions
|
||||||
|
Passing of motions requires a simple majority of members present at the meeting of the GA.
|
||||||
|
|
||||||
|
## § 5. The board of the association
|
||||||
|
The executive power of the association lies with the board (as per §3). The board itself elects its officers including a chair, a vice chair and a treasurer. The board delegates handling of daily business of the association to an executive committee consisting of the chair, vice chair and treasurer.
|
||||||
|
|
||||||
|
The board is in charge of drafting the accounts and the budget.
|
||||||
|
|
||||||
|
The board itself determines its own rules of procedure.
|
||||||
|
|
||||||
|
The board may create ad-hoc working groups consisting of members, functioning as fora for developing ideas for the association.
|
||||||
|
|
||||||
|
### §5.1 Legal authority
|
||||||
|
|
||||||
|
The chair and treasurer have legal authority, but when it comes to purchasing, selling, or mortgaging real estate, making service agreements, or taking loans, the board as a whole must agree to bind the association.
|
||||||
|
|
||||||
|
The board as a whole may assign power of attorney to individual members of the board.
|
||||||
|
|
||||||
|
## § 6. Membership
|
||||||
|
Any physical person who supports the aims of the association may become a member. Membership is binding for one year at a time.
|
||||||
|
|
||||||
|
The board has the authority to remove members from the association if they act in violation of the Acceptable Use Policy (AUP).
|
||||||
|
|
||||||
|
Membership is continuous from the payment of dues until the conclusion of the annual meeting of the GA.
|
||||||
|
|
||||||
|
## § 7. Administrators
|
||||||
|
The services offered by the associated are maintained by a team of administrators. Only members of the association can assume the role of administrator.
|
||||||
|
|
||||||
|
Only administrators hold administrative access to the servers and services of the association.
|
||||||
|
|
||||||
|
### § 7.1 Appointment of administrators
|
||||||
|
The board appoints administrators.
|
||||||
|
|
||||||
|
The appointment of administrators must be announced to the members of the association.
|
||||||
|
|
||||||
|
### § 7.2 Mistrust of administrators
|
||||||
|
Mistrust towards one or more administrators must be addressed at an extraordinary meeting of the GA.
|
||||||
|
|
||||||
|
Mistrust towards administrators must be reported to the board. The board has the authority to temporarily suspend an administrator's administrative rights until the declaration of mistrust against them is addressed
|
||||||
|
|
||||||
|
## § 8. Moderation policy
|
||||||
|
The association maintains a moderation policy for its social services, approved by the GA. The moderation policy is enforced by a team of moderators.
|
||||||
|
|
||||||
|
### § 8.1 Appointment of moderators
|
||||||
|
The board appoints moderators.
|
||||||
|
|
||||||
|
The appointment of moderators must be announced to the members of the association.
|
||||||
|
|
||||||
|
Only members of the association can hold the position of moderator. Ideally, moderators should not be board members, however, at least one moderator must also be a board member.
|
||||||
|
|
||||||
|
### § 8.2 Mistrust of moderators
|
||||||
|
Mistrust towards one or more moderators must be addressed at an extraordinary meeting of the GA.
|
||||||
|
|
||||||
|
Mistrust towards moderators must be reported to the board. The board has the authority to temporarily suspend a moderator's moderator rights until the declaration of mistrust against them is addressed
|
||||||
|
|
||||||
|
## § 9. Membership fees/funding
|
||||||
|
Annual membership fees are decided by the GA.
|
||||||
|
|
||||||
|
Additionally, the association can receive funding through sponsorships, advertising support, as well as contributions from public/private companies, foundations, other associations/institutions, and private individuals, as long as it does not impose conditions on the association's decisions.
|
||||||
|
|
||||||
|
## § 10. Service fees
|
||||||
|
|
||||||
|
The association provides services to its members who pay a service fee.
|
||||||
|
|
||||||
|
The service fee is defined and determined by the board.
|
||||||
|
|
||||||
|
### § 10.1 Terms of delivery and payment
|
||||||
|
|
||||||
|
The board determines the terms of delivery and payment, such as terms, payment times and refunds.
|
||||||
|
|
||||||
|
The board reserves the right to charge late fees or suspend services in case of lacking payments.
|
||||||
|
|
||||||
|
### § 10.2 Change of service fees and payment terms
|
||||||
|
|
||||||
|
Changes to service fees or payment terms must be announced to the members of the association no later than 30 days before taking effect.
|
||||||
|
|
||||||
|
The addition of services or changes to service configurations are NOT considered changes requiring notice.
|
||||||
|
|
||||||
|
### § 10.3 Disputing changes
|
||||||
|
|
||||||
|
If one or more members disagree with changes in service fees or payment terms, they may file a dispute in writing to the board.
|
||||||
|
|
||||||
|
The dispute must be received by the board no later than 14 days before the change would take effect.
|
||||||
|
|
||||||
|
If the board receives disputes from at least 1/3 of the members of the association, the board must call for an extraordinary GA, at which the change must be presented as a motion to be approved by the GA.
|
||||||
|
|
||||||
|
## § 11. Extraordinary General Assembly (GA)
|
||||||
|
Extraordinary GAs may be called if desired by a majority of the board.
|
||||||
|
|
||||||
|
Extraordinary GAs may be called if desired by one-third of the members.
|
||||||
|
|
||||||
|
Extraordinary GAs are called following the same terms as in §4.
|
||||||
|
|
||||||
|
The agenda must be substantiated.
|
||||||
|
|
||||||
|
## § 12. Accounts
|
||||||
|
The association's financial year is the calendar year.
|
||||||
|
|
||||||
|
## § 13. Dissolution
|
||||||
|
Dissolution of the association requires a majority vote of three-quarters of members present at the GA or extraordinary GA.
|
||||||
|
|
||||||
|
The dissolution must then be approved at a subsequent extraordinary GA.
|
||||||
|
|
||||||
|
In the event of the dissolution of the association, the association's assets shall be transferred to European Digital Rights (EDRi) and Free Software Foundation Europe (FSFE)
|
||||||
|
|
||||||
|
The association data.coop was founded on June 24, 2014.
|
|
@ -5,10 +5,10 @@ title: Tjenester
|
||||||
|
|
||||||
Visse tjenester **data.coop** driver er kun for medlemmer, andre er åbne for alle.
|
Visse tjenester **data.coop** driver er kun for medlemmer, andre er åbne for alle.
|
||||||
|
|
||||||
Alle tjenester er benævnt med [badges](/badges/), der deklarerer i hvor høj grad den
|
Alle tjenester er benævnt med [badges]({{< ref "/services/#badges" >}}), der deklarerer i hvor høj grad den
|
||||||
enkelte tjeneste lever op til [kerneprincipperne defineret i formålsparagraffen
|
enkelte tjeneste lever op til [kerneprincipperne defineret i formålsparagraffen
|
||||||
i vores vedtægter](/_pages/vedtaegter.html#-2-form%C3%A5l).
|
i vores vedtægter]({{< ref "/rights.md#-2-formål" >}}).
|
||||||
|
|
||||||
Vi har skrevet en definition af [hvad de forskellige badges dækker over](/badges/).
|
Vi har skrevet en definition af [hvad de forskellige badges dækker over]({{< ref "/services/#badges" >}}).
|
||||||
|
|
||||||
Klik på hver tjenestes navn for at se detaljer:
|
Klik på hver tjenestes navn for at se detaljer:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: Gitea
|
title: Forgejo
|
||||||
service_badges:
|
service_badges:
|
||||||
stability: positive
|
stability: positive
|
||||||
secure_connection: positive
|
secure_connection: positive
|
||||||
|
@ -11,5 +11,8 @@ service_badges:
|
||||||
logging: negative
|
logging: negative
|
||||||
---
|
---
|
||||||
|
|
||||||
Skriver du kode eller anden tekst som du gerne vil holde under versionsstyring, kan du gemme det her.
|
Skriver du kode eller anden tekst som du gerne vil holde under versionsstyring,
|
||||||
|
kan du gemme det på denne fantastiske Git-platform.<!--more-->
|
||||||
|
|
||||||
|
Platformen er åben for alle data.coops medlemmer,
|
||||||
|
og du kan forespørge konti til ikke-medlemmer.
|
18
content/services/forgejo.en.md
Normal file
18
content/services/forgejo.en.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Forgejo
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
secure_connection: positive
|
||||||
|
anonymity: partial
|
||||||
|
encrypted_storage: negative
|
||||||
|
zero_knowledge: negative
|
||||||
|
backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
If you write code or other types of texts that need revisioning,
|
||||||
|
you can use this fantastic Git platform<!--more-->
|
||||||
|
|
||||||
|
The platform is open for all data.coop members,
|
||||||
|
and you can ask for accounts for non-members.
|
|
@ -4,11 +4,17 @@ title: HedgeDoc
|
||||||
service_badges:
|
service_badges:
|
||||||
stability: positive
|
stability: positive
|
||||||
connection_security: positive
|
connection_security: positive
|
||||||
connection_anonymous: negative
|
connection_anonymous: partial
|
||||||
storage_encrypted: negative
|
storage_encrypted: negative
|
||||||
zero_knowledge: partial
|
zero_knowledge: partial
|
||||||
storage_backup: positive
|
storage_backup: positive
|
||||||
logging: negative
|
logging: negative
|
||||||
---
|
---
|
||||||
|
|
||||||
Skriv
|
Tag tilfældige noter eller skriv dokumenter i Markdown: HedgeDoc kan bruges til mange ting.<!--more-->
|
||||||
|
|
||||||
|
De fleste bruger HedgeDoc til hurtigt at tage noter eller starte dokumenter.
|
||||||
|
Man kan skrive samtidig.
|
||||||
|
Og resultatet er flot.
|
||||||
|
|
||||||
|
Der findes også flere udvidelser, bl.a. Mermaid-diagrammer. Læs mere på [HedgeDoc's hjemmeside](https://hedgedoc.org/).
|
||||||
|
|
22
content/services/hedgedoc.en.md
Normal file
22
content/services/hedgedoc.en.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: HedgeDoc
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: partial
|
||||||
|
storage_encrypted: negative
|
||||||
|
zero_knowledge: partial
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Take random notes or write full documents in Markdown: HedgeDoc can be used for many things.<!--more-->
|
||||||
|
|
||||||
|
Most people use HedgeDoc for quickly making notes are bootstrapping documents.
|
||||||
|
You can collaborate in real-time with others.
|
||||||
|
And the results are pretty!
|
||||||
|
|
||||||
|
There are also several extensions, for instance for Mermaid diagrams.
|
||||||
|
|
||||||
|
Read more on the [HedgeDoc website](https://hedgedoc.org/).
|
14
content/services/mastodon.en.md
Normal file
14
content/services/mastodon.en.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Mastodon
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: negative
|
||||||
|
storage_encrypted: negative
|
||||||
|
zero_knowledge: partial
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Share cat photos and memes and see what other interesting people are doing.
|
|
@ -5,10 +5,17 @@ service_badges:
|
||||||
stability: positive
|
stability: positive
|
||||||
connection_security: positive
|
connection_security: positive
|
||||||
connection_anonymous: negative
|
connection_anonymous: negative
|
||||||
storage_encrypted: negative
|
storage_encrypted: positive
|
||||||
zero_knowledge: partial
|
zero_knowledge: partial
|
||||||
storage_backup: positive
|
storage_backup: positive
|
||||||
logging: negative
|
logging: negative
|
||||||
---
|
---
|
||||||
|
|
||||||
Chat
|
Matrix er en chat-server, som kan rigtig mange ting. Den kan bruges som alternativ til f.eks. Slack, Discord, IRC og meget andet.
|
||||||
|
Vi har også vores egen hostede version af reference-klienten Element på [element.data.coop](https://element.data.coop/).<!--more-->
|
||||||
|
|
||||||
|
Du kan bruge Matrix til at kommunikere med andre på hele Matrix-netværket,
|
||||||
|
dvs. ikke bare andre data.coop-medlemmer.
|
||||||
|
|
||||||
|
Matrix er en kæmpestor platform, som muliggør en lang række interaktionsformer.
|
||||||
|
Bl.a. har flere konferencer oprettet rum til live videostream og chat.
|
||||||
|
|
22
content/services/matrix.en.md
Normal file
22
content/services/matrix.en.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Matrix
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: negative
|
||||||
|
storage_encrypted: positive
|
||||||
|
zero_knowledge: partial
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Matrix is a chat server that's capable of a lot of things.
|
||||||
|
It can be used as an alternative for Slack, Discord, IRC and lots more.
|
||||||
|
We have our own hosted version of its reference client Element available at [element.data.coop](https://element.data.coop/).<!--more-->
|
||||||
|
|
||||||
|
You can use Matrix for communicating with the entire Matrix network,
|
||||||
|
not just data.coop members.
|
||||||
|
|
||||||
|
Matrix is a gigantic platform which enables a wide range of communication types.
|
||||||
|
It supports channels, live videos and chat.
|
15
content/services/nextcloud.en.md
Normal file
15
content/services/nextcloud.en.md
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Nextcloud
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: partial
|
||||||
|
storage_encrypted: negative
|
||||||
|
zero_knowledge: negative
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Store your files, calendar, contacts and many other things in the local cloud.
|
||||||
|
Access from all your devices.
|
14
content/services/passit.en.md
Normal file
14
content/services/passit.en.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Passit
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: positive
|
||||||
|
storage_encrypted: positive
|
||||||
|
zero_knowledge: partial
|
||||||
|
storage_backup: positive
|
||||||
|
logging: positive
|
||||||
|
---
|
||||||
|
|
||||||
|
Helps you remember your strong, unique passwords for websites and applications.
|
17
content/services/privatebin.da.md
Normal file
17
content/services/privatebin.da.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PrivateBin
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: partial
|
||||||
|
storage_encrypted: positive
|
||||||
|
zero_knowledge: positive
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Del en simpel hemmelighed gennem et unikt og hemmeligt link.
|
||||||
|
Du kan tilsætte password og sørge for, at hemmeligheden slettes automatisk.<!--more-->
|
||||||
|
|
||||||
|
Denne service er åben for alle og kræver ikke login.
|
17
content/services/privatebin.en.md
Normal file
17
content/services/privatebin.en.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PrivateBin
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: partial
|
||||||
|
storage_encrypted: positive
|
||||||
|
zero_knowledge: positive
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Share a secret through a unique and secret link.
|
||||||
|
You can add a password and make the secret expire and delete itself.<!--more-->
|
||||||
|
|
||||||
|
This service is open and does not require a login.
|
|
@ -11,4 +11,5 @@ service_badges:
|
||||||
logging: negative
|
logging: negative
|
||||||
---
|
---
|
||||||
|
|
||||||
Aftaler
|
Rallly gør det nemt at finde en dato med dine venner/familie/gruppe.
|
||||||
|
Det minder om Doodle, men det er bedre!
|
15
content/services/rallly.en.md
Normal file
15
content/services/rallly.en.md
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: Rallly
|
||||||
|
service_badges:
|
||||||
|
stability: positive
|
||||||
|
connection_security: positive
|
||||||
|
connection_anonymous: partial
|
||||||
|
storage_encrypted: negative
|
||||||
|
zero_knowledge: negative
|
||||||
|
storage_backup: positive
|
||||||
|
logging: negative
|
||||||
|
---
|
||||||
|
|
||||||
|
Rally makes it easy to find a date for an event with your friends, family or any other group of people.
|
||||||
|
It's a lot like Doodle, but better!
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
layout: page
|
|
||||||
title: Opdateringer
|
|
||||||
---
|
|
||||||
|
|
||||||
## Opdateringer og nyheder
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
layout: page
|
|
||||||
title: Updates
|
|
||||||
---
|
|
||||||
|
|
||||||
## Updates and news
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,52 +1,74 @@
|
||||||
# This determines which badges are active and the order to display them in
|
# This determines which badges are active and the order to display them in
|
||||||
active_badges:
|
active_badges:
|
||||||
- stability
|
- stability
|
||||||
- secure_connection
|
- secure_connection
|
||||||
- encrypted_storage
|
- encrypted_storage
|
||||||
- zero_knowledge
|
- zero_knowledge
|
||||||
- backup
|
- backup
|
||||||
- logging
|
- logging
|
||||||
- anonymity
|
- anonymity
|
||||||
|
|
||||||
badges:
|
badges:
|
||||||
|
|
||||||
stability:
|
stability:
|
||||||
name: stabilitet
|
name: Stabilitet
|
||||||
description: Det første badge er som sådan ikke relateret til hvorvidt tjenesten lever op til vores formålsparagraf. Det angiver i stedet hvorvidt tjenesten er stabil nok til at vi vil anbefale almindelige mennesker at bruge den. Vi tilbyder løbende nye tjenester, og der vil være en periode i starten af en tjenestes levetid hvor vi anser den som værende “ustabil”, indtil den har vist sit værd med en mindre skare af brugere der er med på at tjenesten kan være ustabil. Alle er dog stadig velkomne til at benytte sig af tjenesten, så længe de er indforstået med dette forbehold for stabiliteten.
|
description: |
|
||||||
|
*Tjenesten er altid tilgængelig.*
|
||||||
|
|
||||||
|
Dette badge beskriver hvor stabil tjenesten er, dvs. om der er stor eller lille risiko for nedetid og/eller tab af data. I starten af enhver tjenestes levetid vil den være mindre stabil, da den ikke er testet i brug endnu.
|
||||||
|
|
||||||
icon: stable.svg
|
icon: stable.svg
|
||||||
|
|
||||||
secure_connection:
|
secure_connection:
|
||||||
name: sikker forbindelse
|
name: Sikker forbindelse
|
||||||
description: Sikker forbindelse angiver at trafikken over internettet mellem dig og tjenesten er krypteret. Du kender det som regel som en hængelås foran adresselinjen i din browser. Det betyder at ingen andre end dig og tjenesten kan se hvad der bliver sendt frem og tilbage mellem dig og tjenesten.
|
description: |
|
||||||
|
*Data kan kun ses af dig og tjenesten.*
|
||||||
|
|
||||||
|
Trafikken mellem dig og tjenesten er krypteret. F.eks. viser browsere en hængelås foran adresselinjen, når forbindelsen er krypteret. Det betyder at kun dig og tjenesten kan se indholdet af data.
|
||||||
|
|
||||||
icon: secure-connection.svg
|
icon: secure-connection.svg
|
||||||
|
|
||||||
encrypted_storage:
|
encrypted_storage:
|
||||||
name: krypteret opbevaring af data
|
name: Krypteret opbevaring af data
|
||||||
description: Tjenestens data gemmes krypteret, og er dermed ikke umiddelbart læsbare for andre end tjenesten selv og data.coops systemadministratorer. I tilfælde af at data lækkes (fx ved virtuelt eller fysisk indbrud), kræver det en særlig “hovednøgle” at læse data, som datatyven forhåbentligt ikke er i besiddelse af.
|
description: |
|
||||||
|
Tjenestens data opbevares i krypteret form, eksempelvis på en krypteret
|
||||||
|
harddisk. Dette er med til at beskytte dataen i tilfælde af fysisk
|
||||||
|
indbrud, da det kun er systemadministratorerne der har hovednøglen til at
|
||||||
|
låse op for adgang til dataen.
|
||||||
icon: encrypted-data-storage.svg
|
icon: encrypted-data-storage.svg
|
||||||
|
|
||||||
zero_knowledge:
|
zero_knowledge:
|
||||||
name: zero knowledge
|
name: Zero-knowledge
|
||||||
description: Data gemmes krypteret, og tjenesten er konstrueret på en måde, så selv ikke data.coops systemadministratorer har mulighed for at tilgå og læse brugernes data. Der findes simpelthen ingen “hovednøgle” som giver fuld datadgang, og det er dermed kun brugerne selv der kan læse deres data. I tilfælde af at data lækkes, er ingen større katastrofe sket, da der heller ikke er risiko for at datatyven også har stjålet hovednøglen, da der ingen hovednøgle er.
|
description: |
|
||||||
|
*Du har den eneste nøgle.*
|
||||||
|
|
||||||
|
I dette tilfælde har data.coops systemadministratorer ikke mulighed for at tilgå data. Der er ingen “hovednøgle”. Det giver mere sikkerhed, men betyder også at data er tabt, hvis man mister sin nøgle.
|
||||||
icon: zero-knowledge.svg
|
icon: zero-knowledge.svg
|
||||||
|
|
||||||
backup:
|
backup:
|
||||||
name: Backup
|
name: Backup
|
||||||
description: |
|
description: |
|
||||||
Der tages løbende backup af tjenestens data, for at minimere skadens omfang i tilfælde af tekniske nedbrud.
|
Tjenestens data sikkerhedskopieres løbende, for at minimere skadens
|
||||||
|
omfang i tilfælde af tekniske nedbrud eller cyberangreb.
|
||||||
**Bemærk:** Vi tager pt. slet ikke backup af noget, men det står selvfølgelig højt på vores prioritetsliste.
|
Sikkerhedskopierne opbevares et andet fysisk sted end serveren som
|
||||||
|
tjenesten kører på.
|
||||||
icon: backup.svg
|
icon: backup.svg
|
||||||
|
|
||||||
|
# TODO: We should describe how we label logging that isn't fully documented as configured.
|
||||||
logging:
|
logging:
|
||||||
name: Logning
|
name: Logning
|
||||||
description: |
|
description: |
|
||||||
Dette badge er lidt omvendt: Det positive badge tildeles tjenester der ikke foretager logning.
|
Teknisk logning handler primært om *metadata*, som også kan kaldes *data om data*. Hvem bruger hvad hvornår? På den ene side er det relevant for systemadministratorerne at se, hvorfor serveren eks. er på overarbejde, men ligesom alle data kan det misbruges. Eks. til at bevise at en bruger har været online på det pågældende tidspunkt.
|
||||||
|
|
||||||
Logning fungerer på forskellig vis og foretages i større eller mindre grad. Som regel giver logning data.coops systemadministratorer overordnet indsigt i hvordan tjenester bruges, men ikke i det konkrete data tjenesten behandler for brugerne. Fx vil logning afsløre overfor data.coops systemadministratorer, at nogen overfører en fil, men ikke hvad selve filen indeholder eller hvem der overfører filen.
|
Bemærk at "positiv" status for logning betyder, at tjenesten laver forventet minimal logning af meta-data, hvilke vi tilstræber at dokumentere for hver enkelt tjeneste. En "negativ" status betyder at der logges mere end nødvendigt.
|
||||||
icon: logging.svg
|
icon: logging.svg
|
||||||
|
|
||||||
anonymity:
|
anonymity:
|
||||||
name: Anonym adgang
|
name: Anonym adgang
|
||||||
description: Tjenester med anonym adgang kan benyttes helt uden at man skal være registreret ved tjenesten. De fleste tjenester kræver en form for registrering af brugerne, da de data tjenesten indeholder knyttes til de enkelte brugere. Nogle tjenester tilbyder anonym læseadgang. Fx kan det kræve registrering at uploade en fil til tjenesten, men andre kan downloade filen at være registreret.
|
description: |
|
||||||
|
Tjenester med anonym adgang kan benyttes uden at være registreret. Dette
|
||||||
|
betyder at man kan benytte tjenesten helt anonymt og uden at opgive
|
||||||
|
personoplysninger. Dog kan nogle tjenester have begrænset adgang hvis man
|
||||||
|
ikke er registreret. F.eks. kan det være, at man ved en tjeneste kun kan
|
||||||
|
uploade en fil hvis man har en bruger, men alle kan downloade filen
|
||||||
|
anonymt uden et login.
|
||||||
icon: anonymous-access.svg
|
icon: anonymous-access.svg
|
||||||
|
|
|
@ -1,17 +1,26 @@
|
||||||
status:
|
status:
|
||||||
|
|
||||||
positive:
|
positive:
|
||||||
|
order: 1
|
||||||
name: positiv
|
name: positiv
|
||||||
description: Tjenesten lever op til kravene til det badget dækker over.
|
description: Tjenesten lever op til kravene til det badget dækker over.
|
||||||
css_class: "positive"
|
css_class: "positive"
|
||||||
|
|
||||||
partial:
|
partial:
|
||||||
name: Delvis
|
order: 2
|
||||||
|
name: delvis
|
||||||
description: Tjenesten lever delvist op til det badget dækker over. Dog i en sådan grad at vi mener det er værd at fremhæve.
|
description: Tjenesten lever delvist op til det badget dækker over. Dog i en sådan grad at vi mener det er værd at fremhæve.
|
||||||
css_class: "partial"
|
css_class: "partial"
|
||||||
|
|
||||||
negative:
|
negative:
|
||||||
|
order: 3
|
||||||
name: negativ
|
name: negativ
|
||||||
description: Tjenesten lever ikke op til det badget dækker over.
|
description: Tjenesten lever ikke op til det badget dækker over.
|
||||||
css_class: "negative"
|
css_class: "negative"
|
||||||
|
|
||||||
|
none:
|
||||||
|
order: 4
|
||||||
|
name: uoplyst
|
||||||
|
description: Dette badge er udefineret for denne tjeneste. Dette skyldes sansynligvis, at vi mangler en klar redegørelse.
|
||||||
|
css_class: "none"
|
||||||
|
|
||||||
|
|
75
data/badges/en/badges.yaml
Normal file
75
data/badges/en/badges.yaml
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
# This determines which badges are active and the order to display them in
|
||||||
|
active_badges:
|
||||||
|
- stability
|
||||||
|
- secure_connection
|
||||||
|
- encrypted_storage
|
||||||
|
- zero_knowledge
|
||||||
|
- backup
|
||||||
|
- logging
|
||||||
|
- anonymity
|
||||||
|
|
||||||
|
badges:
|
||||||
|
stability:
|
||||||
|
name: Stability
|
||||||
|
description: |
|
||||||
|
*Service is always available.*
|
||||||
|
|
||||||
|
This badge describes how stable the service is. For instance if there is a big or small risk that the service may suffer from outages or loss of data. Immediately after launching a service, it might be considered less stable than after it has matured through long-time tests and usage.
|
||||||
|
|
||||||
|
icon: stable.svg
|
||||||
|
|
||||||
|
secure_connection:
|
||||||
|
name: Secure connection
|
||||||
|
description: |
|
||||||
|
*Data can only be seen by you and the service.*
|
||||||
|
|
||||||
|
The traffic between you and the service is encrypted. For instance, the browser will display a padlock in the address bar when the connection is encrypted. This means that it's only you and the service that can see transferred data.
|
||||||
|
|
||||||
|
icon: secure-connection.svg
|
||||||
|
|
||||||
|
encrypted_storage:
|
||||||
|
name: Encrypted storage
|
||||||
|
description: |
|
||||||
|
The service stores data in an ecrypted way, for instance on an encrypted storage media.
|
||||||
|
This ensures that the data is protected in case of a physical breach of security,
|
||||||
|
since it's only the system administrator who has the encryption key that can decrypt storage media.
|
||||||
|
icon: encrypted-data-storage.svg
|
||||||
|
|
||||||
|
zero_knowledge:
|
||||||
|
name: Zero knowledge
|
||||||
|
description: |
|
||||||
|
*You have the only key.*
|
||||||
|
|
||||||
|
In this case, data.coop's system administrator cannot access data.
|
||||||
|
There is no "main key". This provides more security, but it also means that data will be lost if you lose the key.
|
||||||
|
|
||||||
|
icon: zero-knowledge.svg
|
||||||
|
|
||||||
|
backup:
|
||||||
|
name: Backup
|
||||||
|
description: |
|
||||||
|
The service's data is backed up frequently in order to minimize damages from technical outages or cyber attacks.
|
||||||
|
Backups are stored in another physical location than the server.
|
||||||
|
icon: backup.svg
|
||||||
|
|
||||||
|
# TODO: We should describe how we label logging that isn't fully documented as configured.
|
||||||
|
logging:
|
||||||
|
name: Logging
|
||||||
|
description: |
|
||||||
|
Technical logging is primarily about *meta data*, which can be understood as *data about data*.
|
||||||
|
Who does what and when? On one side, it's relevant for system administrators to see why a server is overloaded, but as with all data this can be abused.
|
||||||
|
For instance, it can be used to prove that what a user was doing at a specific time.
|
||||||
|
|
||||||
|
Note that "positive" status for logging means that the service is performing an expected amount of *minimal* logging of meta data.
|
||||||
|
We strive to document this data for every service. A "negative" status means that unnecessary amounts of logging take place.
|
||||||
|
icon: logging.svg
|
||||||
|
|
||||||
|
anonymity:
|
||||||
|
name: Anonymous access
|
||||||
|
description: |
|
||||||
|
Services with anonymous access can be used without registration and authentication.
|
||||||
|
This means that the service can be used anonymously without sharing personal information.
|
||||||
|
Some services may have limited access for unregistered users.
|
||||||
|
This may be relevant for instance for a service where a registered user can upload a file
|
||||||
|
and an unregistered user can download the file.
|
||||||
|
icon: anonymous-access.svg
|
26
data/badges/en/status.yaml
Normal file
26
data/badges/en/status.yaml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
status:
|
||||||
|
|
||||||
|
positive:
|
||||||
|
order: 1
|
||||||
|
name: positive
|
||||||
|
description: Service satisfies the requirements of the badge.
|
||||||
|
css_class: "positive"
|
||||||
|
|
||||||
|
partial:
|
||||||
|
order: 2
|
||||||
|
name: partial
|
||||||
|
description: Service partially satisfies the requirements of the badge. But to an extend that we find worth noting.
|
||||||
|
css_class: "partial"
|
||||||
|
|
||||||
|
negative:
|
||||||
|
order: 3
|
||||||
|
name: negative
|
||||||
|
description: Service does not live up to badge requirements.
|
||||||
|
css_class: "negative"
|
||||||
|
|
||||||
|
none:
|
||||||
|
order: 4
|
||||||
|
name: undefined
|
||||||
|
description: The requirements of the badge are currently undefined. This is likely due to a lack of analysis and full understanding.
|
||||||
|
css_class: "none"
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
version: "3"
|
version: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
serve:
|
server:
|
||||||
build:
|
image: floryn90/hugo:ext-alpine
|
||||||
context: .
|
command: server
|
||||||
dockerfile: Dockerfile_hugo
|
|
||||||
command: |
|
|
||||||
/bin/bash -c "
|
|
||||||
cd /code
|
|
||||||
hugo serve
|
|
||||||
"
|
|
||||||
network_mode: "host"
|
|
||||||
volumes:
|
volumes:
|
||||||
- .:/code
|
- ".:/src"
|
||||||
|
ports:
|
||||||
|
- "1313:1313"
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<browserconfig>
|
|
||||||
<msapplication>
|
|
||||||
<tile>
|
|
||||||
<square150x150logo src="/static/img/mstile-150x150.png"/>
|
|
||||||
<TileColor>#4b3aba</TileColor>
|
|
||||||
</tile>
|
|
||||||
</msapplication>
|
|
||||||
</browserconfig>
|
|
37
static/static/img/forgejo_logo.svg
Normal file
37
static/static/img/forgejo_logo.svg
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
>
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work rdf:about="https://codeberg.org/forgejo/governance/src/branch/main/branding#logo">
|
||||||
|
<dc:title>Forgejo logo</dc:title>
|
||||||
|
<cc:creator rdf:resource="https://caesarschinas.com/"><cc:attributionName>Caesar Schinas</cc:attributionName></cc:creator>
|
||||||
|
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<style type="text/css">
|
||||||
|
:root, svg {
|
||||||
|
color-scheme: dark light;
|
||||||
|
}
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: #4b3aba;
|
||||||
|
stroke-width: 15;
|
||||||
|
}
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: #4b3aba;
|
||||||
|
stroke-width: 25;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g transform="translate(6,6)">
|
||||||
|
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" />
|
||||||
|
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" />
|
||||||
|
<circle cx="142" cy="20" r="18" />
|
||||||
|
<circle cx="142" cy="88" r="18" />
|
||||||
|
<circle cx="58" cy="180" r="18" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -1,57 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
version="1.1"
|
|
||||||
id="main_outline"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
viewBox="0 0 640 640"
|
|
||||||
xml:space="preserve"
|
|
||||||
sodipodi:docname="gitea_logo.svg"
|
|
||||||
style="enable-background:new 0 0 640 640;"
|
|
||||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
|
||||||
id="defs16" /><sodipodi:namedview
|
|
||||||
id="namedview14"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="1.2984375"
|
|
||||||
inkscape:cx="320.38508"
|
|
||||||
inkscape:cy="320.77016"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1011"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="main_outline" />
|
|
||||||
<g
|
|
||||||
id="g11"
|
|
||||||
transform="matrix(1,0,0,1.0012257,0,-0.17537094)">
|
|
||||||
<path
|
|
||||||
id="teabag"
|
|
||||||
style="fill:#ffffff"
|
|
||||||
d="M 395.9,484.2 269,423.2 c -12.5,-6 -17.9,-21.2 -11.8,-33.8 l 61,-126.9 c 6,-12.5 21.2,-17.9 33.8,-11.8 17.2,8.3 27.1,13 27.1,13 l -0.1,-109.2 16.7,-0.1 0.1,117.1 c 0,0 57.4,24.2 83.1,40.1 3.7,2.3 10.2,6.8 12.9,14.4 2.1,6.1 2,13.1 -1,19.3 l -61,126.9 c -6.2,12.7 -21.4,18.1 -33.9,12 z" />
|
|
||||||
<g
|
|
||||||
id="g9">
|
|
||||||
<g
|
|
||||||
id="g7">
|
|
||||||
<path
|
|
||||||
style="fill:#4b3aba"
|
|
||||||
d="m 622.7,149.8 c -4.1,-4.1 -9.6,-4 -9.6,-4 0,0 -117.2,6.6 -177.9,8 -13.3,0.3 -26.5,0.6 -39.6,0.7 0,39.1 0,78.2 0,117.2 -5.5,-2.6 -11.1,-5.3 -16.6,-7.9 0,-36.4 -0.1,-109.2 -0.1,-109.2 -29,0.4 -89.2,-2.2 -89.2,-2.2 0,0 -141.4,-7.1 -156.8,-8.5 -9.8,-0.6 -22.5,-2.1 -39,1.5 -8.7,1.8 -33.5,7.4 -53.8,26.9 -45,40.1 -33.5,103.9 -32.1,113.5 1.7,11.7 6.9,44.2 31.7,72.5 45.8,56.1 144.4,54.8 144.4,54.8 0,0 12.1,28.9 30.6,55.5 25,33.1 50.7,58.9 75.7,62 63,0 188.9,-0.1 188.9,-0.1 0,0 12,0.1 28.3,-10.3 14,-8.5 26.5,-23.4 26.5,-23.4 0,0 12.9,-13.8 30.9,-45.3 5.5,-9.7 10.1,-19.1 14.1,-28 0,0 55.2,-117.1 55.2,-231.1 -1.1,-34.5 -9.6,-40.6 -11.6,-42.6 z M 125.6,353.9 c -25.9,-8.5 -36.9,-18.7 -36.9,-18.7 0,0 -19.1,-13.4 -28.7,-39.8 -16.5,-44.2 -1.4,-71.2 -1.4,-71.2 0,0 8.4,-22.5 38.5,-30 13.8,-3.7 31,-3.1 31,-3.1 0,0 7.1,59.4 15.7,94.2 7.2,29.2 24.8,77.7 24.8,77.7 0,0 -26.1,-3.1 -43,-9.1 z m 300.3,107.6 c 0,0 -6.1,14.5 -19.6,15.4 -5.8,0.4 -10.3,-1.2 -10.3,-1.2 0,0 -0.3,-0.1 -5.3,-2.1 l -112.9,-55 c 0,0 -10.9,-5.7 -12.8,-15.6 -2.2,-8.1 2.7,-18.1 2.7,-18.1 L 322,273 c 0,0 4.8,-9.7 12.2,-13 0.6,-0.3 2.3,-1 4.5,-1.5 8.1,-2.1 18,2.8 18,2.8 L 467.4,315 c 0,0 12.6,5.7 15.3,16.2 1.9,7.4 -0.5,14 -1.8,17.2 -6.3,15.4 -55,113.1 -55,113.1 z"
|
|
||||||
id="path3" />
|
|
||||||
<path
|
|
||||||
style="fill:#4b3aba"
|
|
||||||
d="m 326.8,380.1 c -8.2,0.1 -15.4,5.8 -17.3,13.8 -1.9,8 2,16.3 9.1,20 7.7,4 17.5,1.8 22.7,-5.4 5.1,-7.1 4.3,-16.9 -1.8,-23.1 l 24,-49.1 c 1.5,0.1 3.7,0.2 6.2,-0.5 4.1,-0.9 7.1,-3.6 7.1,-3.6 4.2,1.8 8.6,3.8 13.2,6.1 4.8,2.4 9.3,4.9 13.4,7.3 0.9,0.5 1.8,1.1 2.8,1.9 1.6,1.3 3.4,3.1 4.7,5.5 1.9,5.5 -1.9,14.9 -1.9,14.9 -2.3,7.6 -18.4,40.6 -18.4,40.6 -8.1,-0.2 -15.3,5 -17.7,12.5 -2.6,8.1 1.1,17.3 8.9,21.3 7.8,4 17.4,1.7 22.5,-5.3 5,-6.8 4.6,-16.3 -1.1,-22.6 1.9,-3.7 3.7,-7.4 5.6,-11.3 5,-10.4 13.5,-30.4 13.5,-30.4 0.9,-1.7 5.7,-10.3 2.7,-21.3 -2.5,-11.4 -12.6,-16.7 -12.6,-16.7 -12.2,-7.9 -29.2,-15.2 -29.2,-15.2 0,0 0,-4.1 -1.1,-7.1 -1.1,-3.1 -2.8,-5.1 -3.9,-6.3 4.7,-9.7 9.4,-19.3 14.1,-29 -4.1,-2 -8.1,-4 -12.2,-6.1 -4.8,9.8 -9.7,19.7 -14.5,29.5 -6.7,-0.1 -12.9,3.5 -16.1,9.4 -3.4,6.3 -2.7,14.1 1.9,19.8 -8.2,16.8 -16.4,33.6 -24.6,50.4 z"
|
|
||||||
id="path5" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.6 KiB |
BIN
static/static/img/some_card_preview_large_da.png
Normal file
BIN
static/static/img/some_card_preview_large_da.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
BIN
static/static/img/some_card_preview_large_en.png
Normal file
BIN
static/static/img/some_card_preview_large_en.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
|
@ -1,51 +0,0 @@
|
||||||
//
|
|
||||||
// Base styles
|
|
||||||
//
|
|
||||||
|
|
||||||
.alert {
|
|
||||||
position: relative;
|
|
||||||
padding: $alert-padding-y $alert-padding-x;
|
|
||||||
margin-bottom: $alert-margin-bottom;
|
|
||||||
border: $alert-border-width solid transparent;
|
|
||||||
@include border-radius($alert-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Headings for larger alerts
|
|
||||||
.alert-heading {
|
|
||||||
// Specified to prevent conflicts of changing $headings-color
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Provide class for links that match alerts
|
|
||||||
.alert-link {
|
|
||||||
font-weight: $alert-link-font-weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Dismissible alerts
|
|
||||||
//
|
|
||||||
// Expand the right padding and account for the close button's positioning.
|
|
||||||
|
|
||||||
.alert-dismissible {
|
|
||||||
padding-right: $close-font-size + $alert-padding-x * 2;
|
|
||||||
|
|
||||||
// Adjust close link position
|
|
||||||
.close {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
padding: $alert-padding-y $alert-padding-x;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Alternate styles
|
|
||||||
//
|
|
||||||
// Generate contextual modifier classes for colorizing the alert.
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
.alert-#{$color} {
|
|
||||||
@include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
// Base class
|
|
||||||
//
|
|
||||||
// Requires one of the contextual, color modifier classes for `color` and
|
|
||||||
// `background-color`.
|
|
||||||
|
|
||||||
.badge {
|
|
||||||
display: inline-block;
|
|
||||||
padding: $badge-padding-y $badge-padding-x;
|
|
||||||
@include font-size($badge-font-size);
|
|
||||||
font-weight: $badge-font-weight;
|
|
||||||
line-height: 1;
|
|
||||||
text-align: center;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: baseline;
|
|
||||||
@include border-radius($badge-border-radius);
|
|
||||||
@include transition($badge-transition);
|
|
||||||
|
|
||||||
@at-root a#{&} {
|
|
||||||
@include hover-focus() {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty badges collapse automatically
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick fix for badges in buttons
|
|
||||||
.btn .badge {
|
|
||||||
position: relative;
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pill badges
|
|
||||||
//
|
|
||||||
// Make them extra rounded with a modifier to replace v3's badges.
|
|
||||||
|
|
||||||
.badge-pill {
|
|
||||||
padding-right: $badge-pill-padding-x;
|
|
||||||
padding-left: $badge-pill-padding-x;
|
|
||||||
@include border-radius($badge-pill-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
//
|
|
||||||
// Contextual variations (linked badges get darker on :hover).
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
.badge-#{$color} {
|
|
||||||
@include badge-variant($value);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
.breadcrumb {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
|
|
||||||
margin-bottom: $breadcrumb-margin-bottom;
|
|
||||||
@include font-size($breadcrumb-font-size);
|
|
||||||
list-style: none;
|
|
||||||
background-color: $breadcrumb-bg;
|
|
||||||
@include border-radius($breadcrumb-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.breadcrumb-item {
|
|
||||||
// The separator between breadcrumbs (by default, a forward-slash: "/")
|
|
||||||
+ .breadcrumb-item {
|
|
||||||
padding-left: $breadcrumb-item-padding;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
display: inline-block; // Suppress underlining of the separator in modern browsers
|
|
||||||
padding-right: $breadcrumb-item-padding;
|
|
||||||
color: $breadcrumb-divider-color;
|
|
||||||
content: escape-svg($breadcrumb-divider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
|
|
||||||
// without `<ul>`s. The `::before` pseudo-element generates an element
|
|
||||||
// *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
|
|
||||||
//
|
|
||||||
// To trick IE into suppressing the underline, we give the pseudo-element an
|
|
||||||
// underline and then immediately remove it.
|
|
||||||
+ .breadcrumb-item:hover::before {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
// stylelint-disable-next-line no-duplicate-selectors
|
|
||||||
+ .breadcrumb-item:hover::before {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
color: $breadcrumb-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,163 +0,0 @@
|
||||||
// stylelint-disable selector-no-qualifying-type
|
|
||||||
|
|
||||||
// Make the div behave like a button
|
|
||||||
.btn-group,
|
|
||||||
.btn-group-vertical {
|
|
||||||
position: relative;
|
|
||||||
display: inline-flex;
|
|
||||||
vertical-align: middle; // match .btn alignment given font-size hack above
|
|
||||||
|
|
||||||
> .btn {
|
|
||||||
position: relative;
|
|
||||||
flex: 1 1 auto;
|
|
||||||
|
|
||||||
// Bring the hover, focused, and "active" buttons to the front to overlay
|
|
||||||
// the borders properly
|
|
||||||
@include hover() {
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
&:focus,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional: Group multiple button groups together for a toolbar
|
|
||||||
.btn-toolbar {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
|
|
||||||
.input-group {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group {
|
|
||||||
// Prevent double borders when buttons are next to each other
|
|
||||||
> .btn:not(:first-child),
|
|
||||||
> .btn-group:not(:first-child) {
|
|
||||||
margin-left: -$btn-border-width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset rounded corners
|
|
||||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
|
||||||
> .btn-group:not(:last-child) > .btn {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn:not(:first-child),
|
|
||||||
> .btn-group:not(:first-child) > .btn {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
//
|
|
||||||
// Remix the default button sizing classes into new ones for easier manipulation.
|
|
||||||
|
|
||||||
.btn-group-sm > .btn { @extend .btn-sm; }
|
|
||||||
.btn-group-lg > .btn { @extend .btn-lg; }
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Split button dropdowns
|
|
||||||
//
|
|
||||||
|
|
||||||
.dropdown-toggle-split {
|
|
||||||
padding-right: $btn-padding-x * .75;
|
|
||||||
padding-left: $btn-padding-x * .75;
|
|
||||||
|
|
||||||
&::after,
|
|
||||||
.dropup &::after,
|
|
||||||
.dropright &::after {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropleft &::before {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-sm + .dropdown-toggle-split {
|
|
||||||
padding-right: $btn-padding-x-sm * .75;
|
|
||||||
padding-left: $btn-padding-x-sm * .75;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-lg + .dropdown-toggle-split {
|
|
||||||
padding-right: $btn-padding-x-lg * .75;
|
|
||||||
padding-left: $btn-padding-x-lg * .75;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// The clickable button for toggling the menu
|
|
||||||
// Set the same inset shadow as the :active state
|
|
||||||
.btn-group.show .dropdown-toggle {
|
|
||||||
@include box-shadow($btn-active-box-shadow);
|
|
||||||
|
|
||||||
// Show no shadow for `.btn-link` since it has no other button styles.
|
|
||||||
&.btn-link {
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Vertical button groups
|
|
||||||
//
|
|
||||||
|
|
||||||
.btn-group-vertical {
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn:not(:first-child),
|
|
||||||
> .btn-group:not(:first-child) {
|
|
||||||
margin-top: -$btn-border-width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset rounded corners
|
|
||||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
|
||||||
> .btn-group:not(:last-child) > .btn {
|
|
||||||
@include border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn:not(:first-child),
|
|
||||||
> .btn-group:not(:first-child) > .btn {
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkbox and radio options
|
|
||||||
//
|
|
||||||
// In order to support the browser's form validation feedback, powered by the
|
|
||||||
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
|
||||||
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
|
||||||
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
|
||||||
// certain cases which is prevented by using `clip` and `pointer-events`.
|
|
||||||
// This way, we ensure a DOM element is visible to position the popover from.
|
|
||||||
//
|
|
||||||
// See https://github.com/twbs/bootstrap/pull/12794 and
|
|
||||||
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
|
||||||
|
|
||||||
.btn-group-toggle {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group > .btn {
|
|
||||||
margin-bottom: 0; // Override default `<label>` value
|
|
||||||
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
position: absolute;
|
|
||||||
clip: rect(0, 0, 0, 0);
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,139 +0,0 @@
|
||||||
// stylelint-disable selector-no-qualifying-type
|
|
||||||
|
|
||||||
//
|
|
||||||
// Base styles
|
|
||||||
//
|
|
||||||
|
|
||||||
.btn {
|
|
||||||
display: inline-block;
|
|
||||||
font-family: $btn-font-family;
|
|
||||||
font-weight: $btn-font-weight;
|
|
||||||
color: $body-color;
|
|
||||||
text-align: center;
|
|
||||||
white-space: $btn-white-space;
|
|
||||||
vertical-align: middle;
|
|
||||||
cursor: if($enable-pointer-cursor-for-buttons, pointer, null);
|
|
||||||
user-select: none;
|
|
||||||
background-color: transparent;
|
|
||||||
border: $btn-border-width solid transparent;
|
|
||||||
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
|
|
||||||
@include transition($btn-transition);
|
|
||||||
|
|
||||||
@include hover() {
|
|
||||||
color: $body-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
outline: 0;
|
|
||||||
box-shadow: $btn-focus-box-shadow;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled comes first so active can properly restyle
|
|
||||||
&.disabled,
|
|
||||||
&:disabled {
|
|
||||||
opacity: $btn-disabled-opacity;
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:disabled):not(.disabled):active,
|
|
||||||
&:not(:disabled):not(.disabled).active {
|
|
||||||
@include box-shadow($btn-active-box-shadow);
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Future-proof disabling of clicks on `<a>` elements
|
|
||||||
a.btn.disabled,
|
|
||||||
fieldset:disabled a.btn {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alternate buttons
|
|
||||||
//
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
.btn-#{$color} {
|
|
||||||
@include button-variant($value, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
.btn-outline-#{$color} {
|
|
||||||
@include button-outline-variant($value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Link buttons
|
|
||||||
//
|
|
||||||
|
|
||||||
// Make a button look and behave like a link
|
|
||||||
.btn-link {
|
|
||||||
font-weight: $font-weight-normal;
|
|
||||||
color: $link-color;
|
|
||||||
text-decoration: $link-decoration;
|
|
||||||
|
|
||||||
@include hover() {
|
|
||||||
color: $link-hover-color;
|
|
||||||
text-decoration: $link-hover-decoration;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
text-decoration: $link-hover-decoration;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled,
|
|
||||||
&.disabled {
|
|
||||||
color: $btn-link-disabled-color;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No need for an active state here
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Button Sizes
|
|
||||||
//
|
|
||||||
|
|
||||||
.btn-lg {
|
|
||||||
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-sm {
|
|
||||||
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Block button
|
|
||||||
//
|
|
||||||
|
|
||||||
.btn-block {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
// Vertically space out multiple block buttons
|
|
||||||
+ .btn-block {
|
|
||||||
margin-top: $btn-block-spacing-y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specificity overrides
|
|
||||||
input[type="submit"],
|
|
||||||
input[type="reset"],
|
|
||||||
input[type="button"] {
|
|
||||||
&.btn-block {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,278 +0,0 @@
|
||||||
//
|
|
||||||
// Base styles
|
|
||||||
//
|
|
||||||
|
|
||||||
.card {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
|
|
||||||
height: $card-height;
|
|
||||||
word-wrap: break-word;
|
|
||||||
background-color: $card-bg;
|
|
||||||
background-clip: border-box;
|
|
||||||
border: $card-border-width solid $card-border-color;
|
|
||||||
@include border-radius($card-border-radius);
|
|
||||||
|
|
||||||
> hr {
|
|
||||||
margin-right: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .list-group:first-child {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
@include border-top-radius($card-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .list-group:last-child {
|
|
||||||
.list-group-item:last-child {
|
|
||||||
@include border-bottom-radius($card-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-body {
|
|
||||||
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
|
|
||||||
// as much space as possible, ensuring footers are aligned to the bottom.
|
|
||||||
flex: 1 1 auto;
|
|
||||||
// Workaround for the image size bug in IE
|
|
||||||
// See: https://github.com/twbs/bootstrap/pull/28855
|
|
||||||
min-height: 1px;
|
|
||||||
padding: $card-spacer-x;
|
|
||||||
color: $card-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-title {
|
|
||||||
margin-bottom: $card-spacer-y;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-subtitle {
|
|
||||||
margin-top: -$card-spacer-y / 2;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-text:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-link {
|
|
||||||
@include hover() {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ .card-link {
|
|
||||||
margin-left: $card-spacer-x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Optional textual caps
|
|
||||||
//
|
|
||||||
|
|
||||||
.card-header {
|
|
||||||
padding: $card-spacer-y $card-spacer-x;
|
|
||||||
margin-bottom: 0; // Removes the default margin-bottom of <hN>
|
|
||||||
color: $card-cap-color;
|
|
||||||
background-color: $card-cap-bg;
|
|
||||||
border-bottom: $card-border-width solid $card-border-color;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ .list-group {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
border-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-footer {
|
|
||||||
padding: $card-spacer-y $card-spacer-x;
|
|
||||||
background-color: $card-cap-bg;
|
|
||||||
border-top: $card-border-width solid $card-border-color;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Header navs
|
|
||||||
//
|
|
||||||
|
|
||||||
.card-header-tabs {
|
|
||||||
margin-right: -$card-spacer-x / 2;
|
|
||||||
margin-bottom: -$card-spacer-y;
|
|
||||||
margin-left: -$card-spacer-x / 2;
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header-pills {
|
|
||||||
margin-right: -$card-spacer-x / 2;
|
|
||||||
margin-left: -$card-spacer-x / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Card image
|
|
||||||
.card-img-overlay {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
padding: $card-img-overlay-padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-img,
|
|
||||||
.card-img-top,
|
|
||||||
.card-img-bottom {
|
|
||||||
flex-shrink: 0; // For IE: https://github.com/twbs/bootstrap/issues/29396
|
|
||||||
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-img,
|
|
||||||
.card-img-top {
|
|
||||||
@include border-top-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-img,
|
|
||||||
.card-img-bottom {
|
|
||||||
@include border-bottom-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Card deck
|
|
||||||
|
|
||||||
.card-deck {
|
|
||||||
.card {
|
|
||||||
margin-bottom: $card-deck-margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
margin-right: -$card-deck-margin;
|
|
||||||
margin-left: -$card-deck-margin;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
|
|
||||||
flex: 1 0 0%;
|
|
||||||
margin-right: $card-deck-margin;
|
|
||||||
margin-bottom: 0; // Override the default
|
|
||||||
margin-left: $card-deck-margin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Card groups
|
|
||||||
//
|
|
||||||
|
|
||||||
.card-group {
|
|
||||||
// The child selector allows nested `.card` within `.card-group`
|
|
||||||
// to display properly.
|
|
||||||
> .card {
|
|
||||||
margin-bottom: $card-group-margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
// The child selector allows nested `.card` within `.card-group`
|
|
||||||
// to display properly.
|
|
||||||
> .card {
|
|
||||||
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
|
|
||||||
flex: 1 0 0%;
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
+ .card {
|
|
||||||
margin-left: 0;
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle rounded corners
|
|
||||||
@if $enable-rounded {
|
|
||||||
&:not(:last-child) {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
|
|
||||||
.card-img-top,
|
|
||||||
.card-header {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
}
|
|
||||||
.card-img-bottom,
|
|
||||||
.card-footer {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-bottom-right-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:first-child) {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
|
|
||||||
.card-img-top,
|
|
||||||
.card-header {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
}
|
|
||||||
.card-img-bottom,
|
|
||||||
.card-footer {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Columns
|
|
||||||
//
|
|
||||||
|
|
||||||
.card-columns {
|
|
||||||
.card {
|
|
||||||
margin-bottom: $card-columns-margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
column-count: $card-columns-count;
|
|
||||||
column-gap: $card-columns-gap;
|
|
||||||
orphans: 1;
|
|
||||||
widows: 1;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
display: inline-block; // Don't let them vertically span multiple columns
|
|
||||||
width: 100%; // Don't let their width change
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Accordion
|
|
||||||
//
|
|
||||||
|
|
||||||
.accordion {
|
|
||||||
> .card {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
|
||||||
border-bottom: 0;
|
|
||||||
@include border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:first-of-type) {
|
|
||||||
@include border-top-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
> .card-header {
|
|
||||||
@include border-radius(0);
|
|
||||||
margin-bottom: -$card-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,197 +0,0 @@
|
||||||
// Notes on the classes:
|
|
||||||
//
|
|
||||||
// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
|
|
||||||
// even when their scroll action started on a carousel, but for compatibility (with Firefox)
|
|
||||||
// we're preventing all actions instead
|
|
||||||
// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
|
|
||||||
// the active slide is heading.
|
|
||||||
// 3. .active.carousel-item is the current slide.
|
|
||||||
// 4. .active.carousel-item-left and .active.carousel-item-right is the current
|
|
||||||
// slide in its in-transition state. Only one of these occurs at a time.
|
|
||||||
// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
|
|
||||||
// is the upcoming slide in transition.
|
|
||||||
|
|
||||||
.carousel {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel.pointer-event {
|
|
||||||
touch-action: pan-y;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-inner {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
@include clearfix();
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-item {
|
|
||||||
position: relative;
|
|
||||||
display: none;
|
|
||||||
float: left;
|
|
||||||
width: 100%;
|
|
||||||
margin-right: -100%;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
@include transition($carousel-transition);
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-item.active,
|
|
||||||
.carousel-item-next,
|
|
||||||
.carousel-item-prev {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-item-next:not(.carousel-item-left),
|
|
||||||
.active.carousel-item-right {
|
|
||||||
transform: translateX(100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-item-prev:not(.carousel-item-right),
|
|
||||||
.active.carousel-item-left {
|
|
||||||
transform: translateX(-100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alternate transitions
|
|
||||||
//
|
|
||||||
|
|
||||||
.carousel-fade {
|
|
||||||
.carousel-item {
|
|
||||||
opacity: 0;
|
|
||||||
transition-property: opacity;
|
|
||||||
transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-item.active,
|
|
||||||
.carousel-item-next.carousel-item-left,
|
|
||||||
.carousel-item-prev.carousel-item-right {
|
|
||||||
z-index: 1;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.active.carousel-item-left,
|
|
||||||
.active.carousel-item-right {
|
|
||||||
z-index: 0;
|
|
||||||
opacity: 0;
|
|
||||||
@include transition(opacity 0s $carousel-transition-duration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Left/right controls for nav
|
|
||||||
//
|
|
||||||
|
|
||||||
.carousel-control-prev,
|
|
||||||
.carousel-control-next {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 1;
|
|
||||||
// Use flex for alignment (1-3)
|
|
||||||
display: flex; // 1. allow flex styles
|
|
||||||
align-items: center; // 2. vertically center contents
|
|
||||||
justify-content: center; // 3. horizontally center contents
|
|
||||||
width: $carousel-control-width;
|
|
||||||
color: $carousel-control-color;
|
|
||||||
text-align: center;
|
|
||||||
opacity: $carousel-control-opacity;
|
|
||||||
@include transition($carousel-control-transition);
|
|
||||||
|
|
||||||
// Hover/focus state
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $carousel-control-color;
|
|
||||||
text-decoration: none;
|
|
||||||
outline: 0;
|
|
||||||
opacity: $carousel-control-hover-opacity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.carousel-control-prev {
|
|
||||||
left: 0;
|
|
||||||
@if $enable-gradients {
|
|
||||||
background-image: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.carousel-control-next {
|
|
||||||
right: 0;
|
|
||||||
@if $enable-gradients {
|
|
||||||
background-image: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Icons for within
|
|
||||||
.carousel-control-prev-icon,
|
|
||||||
.carousel-control-next-icon {
|
|
||||||
display: inline-block;
|
|
||||||
width: $carousel-control-icon-width;
|
|
||||||
height: $carousel-control-icon-width;
|
|
||||||
background: no-repeat 50% / 100% 100%;
|
|
||||||
}
|
|
||||||
.carousel-control-prev-icon {
|
|
||||||
background-image: escape-svg($carousel-control-prev-icon-bg);
|
|
||||||
}
|
|
||||||
.carousel-control-next-icon {
|
|
||||||
background-image: escape-svg($carousel-control-next-icon-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Optional indicator pips
|
|
||||||
//
|
|
||||||
// Add an ordered list with the following class and add a list item for each
|
|
||||||
// slide your carousel holds.
|
|
||||||
|
|
||||||
.carousel-indicators {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 15;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
padding-left: 0; // override <ol> default
|
|
||||||
// Use the .carousel-control's width as margin so we don't overlay those
|
|
||||||
margin-right: $carousel-control-width;
|
|
||||||
margin-left: $carousel-control-width;
|
|
||||||
list-style: none;
|
|
||||||
|
|
||||||
li {
|
|
||||||
box-sizing: content-box;
|
|
||||||
flex: 0 1 auto;
|
|
||||||
width: $carousel-indicator-width;
|
|
||||||
height: $carousel-indicator-height;
|
|
||||||
margin-right: $carousel-indicator-spacer;
|
|
||||||
margin-left: $carousel-indicator-spacer;
|
|
||||||
text-indent: -999px;
|
|
||||||
cursor: pointer;
|
|
||||||
background-color: $carousel-indicator-active-bg;
|
|
||||||
background-clip: padding-box;
|
|
||||||
// Use transparent borders to increase the hit area by 10px on top and bottom.
|
|
||||||
border-top: $carousel-indicator-hit-area-height solid transparent;
|
|
||||||
border-bottom: $carousel-indicator-hit-area-height solid transparent;
|
|
||||||
opacity: .5;
|
|
||||||
@include transition($carousel-indicator-transition);
|
|
||||||
}
|
|
||||||
|
|
||||||
.active {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Optional captions
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
.carousel-caption {
|
|
||||||
position: absolute;
|
|
||||||
right: (100% - $carousel-caption-width) / 2;
|
|
||||||
bottom: 20px;
|
|
||||||
left: (100% - $carousel-caption-width) / 2;
|
|
||||||
z-index: 10;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-bottom: 20px;
|
|
||||||
color: $carousel-caption-color;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
.close {
|
|
||||||
float: right;
|
|
||||||
@include font-size($close-font-size);
|
|
||||||
font-weight: $close-font-weight;
|
|
||||||
line-height: 1;
|
|
||||||
color: $close-color;
|
|
||||||
text-shadow: $close-text-shadow;
|
|
||||||
opacity: .5;
|
|
||||||
|
|
||||||
// Override <a>'s hover style
|
|
||||||
@include hover() {
|
|
||||||
color: $close-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:disabled):not(.disabled) {
|
|
||||||
@include hover-focus() {
|
|
||||||
opacity: .75;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Additional properties for button version
|
|
||||||
// iOS requires the button element instead of an anchor tag.
|
|
||||||
// If you want the anchor version, it requires `href="#"`.
|
|
||||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
|
||||||
|
|
||||||
// stylelint-disable-next-line selector-no-qualifying-type
|
|
||||||
button.close {
|
|
||||||
padding: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Future-proof disabling of clicks on `<a>` elements
|
|
||||||
|
|
||||||
// stylelint-disable-next-line selector-no-qualifying-type
|
|
||||||
a.close.disabled {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
// Inline code
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// User input typically entered via keyboard
|
|
||||||
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);
|
|
||||||
@include box-shadow($kbd-box-shadow);
|
|
||||||
|
|
||||||
kbd {
|
|
||||||
padding: 0;
|
|
||||||
@include font-size(100%);
|
|
||||||
font-weight: $nested-kbd-font-weight;
|
|
||||||
@include box-shadow(none);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blocks of code
|
|
||||||
pre {
|
|
||||||
display: block;
|
|
||||||
@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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable scrollable blocks of code
|
|
||||||
.pre-scrollable {
|
|
||||||
max-height: $pre-scrollable-max-height;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
|
@ -1,521 +0,0 @@
|
||||||
// Embedded icons from Open Iconic.
|
|
||||||
// Released under MIT and copyright 2014 Waybury.
|
|
||||||
// https://useiconic.com/open
|
|
||||||
|
|
||||||
|
|
||||||
// Checkboxes and radios
|
|
||||||
//
|
|
||||||
// Base class takes care of all the key behavioral aspects.
|
|
||||||
|
|
||||||
.custom-control {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
min-height: $font-size-base * $line-height-base;
|
|
||||||
padding-left: $custom-control-gutter + $custom-control-indicator-size;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-inline {
|
|
||||||
display: inline-flex;
|
|
||||||
margin-right: $custom-control-spacer-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
z-index: -1; // Put the input behind the label so it doesn't overlay text
|
|
||||||
width: $custom-control-indicator-size;
|
|
||||||
height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2;
|
|
||||||
opacity: 0;
|
|
||||||
|
|
||||||
&:checked ~ .custom-control-label::before {
|
|
||||||
color: $custom-control-indicator-checked-color;
|
|
||||||
border-color: $custom-control-indicator-checked-border-color;
|
|
||||||
@include gradient-bg($custom-control-indicator-checked-bg);
|
|
||||||
@include box-shadow($custom-control-indicator-checked-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus ~ .custom-control-label::before {
|
|
||||||
// the mixin is not used here to make sure there is feedback
|
|
||||||
@if $enable-shadows {
|
|
||||||
box-shadow: $input-box-shadow, $input-focus-box-shadow;
|
|
||||||
} @else {
|
|
||||||
box-shadow: $custom-control-indicator-focus-box-shadow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus:not(:checked) ~ .custom-control-label::before {
|
|
||||||
border-color: $custom-control-indicator-focus-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:disabled):active ~ .custom-control-label::before {
|
|
||||||
color: $custom-control-indicator-active-color;
|
|
||||||
background-color: $custom-control-indicator-active-bg;
|
|
||||||
border-color: $custom-control-indicator-active-border-color;
|
|
||||||
@include box-shadow($custom-control-indicator-active-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
|
|
||||||
&[disabled],
|
|
||||||
&:disabled {
|
|
||||||
~ .custom-control-label {
|
|
||||||
color: $custom-control-label-disabled-color;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
background-color: $custom-control-indicator-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom control indicators
|
|
||||||
//
|
|
||||||
// Build the custom controls out of pseudo-elements.
|
|
||||||
|
|
||||||
.custom-control-label {
|
|
||||||
position: relative;
|
|
||||||
margin-bottom: 0;
|
|
||||||
color: $custom-control-label-color;
|
|
||||||
vertical-align: top;
|
|
||||||
cursor: $custom-control-cursor;
|
|
||||||
|
|
||||||
// Background-color and (when enabled) gradient
|
|
||||||
&::before {
|
|
||||||
position: absolute;
|
|
||||||
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
|
|
||||||
left: -($custom-control-gutter + $custom-control-indicator-size);
|
|
||||||
display: block;
|
|
||||||
width: $custom-control-indicator-size;
|
|
||||||
height: $custom-control-indicator-size;
|
|
||||||
pointer-events: none;
|
|
||||||
content: "";
|
|
||||||
background-color: $custom-control-indicator-bg;
|
|
||||||
border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
|
|
||||||
@include box-shadow($custom-control-indicator-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Foreground (icon)
|
|
||||||
&::after {
|
|
||||||
position: absolute;
|
|
||||||
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
|
|
||||||
left: -($custom-control-gutter + $custom-control-indicator-size);
|
|
||||||
display: block;
|
|
||||||
width: $custom-control-indicator-size;
|
|
||||||
height: $custom-control-indicator-size;
|
|
||||||
content: "";
|
|
||||||
background: no-repeat 50% / #{$custom-control-indicator-bg-size};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkboxes
|
|
||||||
//
|
|
||||||
// Tweak just a few things for checkboxes.
|
|
||||||
|
|
||||||
.custom-checkbox {
|
|
||||||
.custom-control-label::before {
|
|
||||||
@include border-radius($custom-checkbox-indicator-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:checked ~ .custom-control-label {
|
|
||||||
&::after {
|
|
||||||
background-image: escape-svg($custom-checkbox-indicator-icon-checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:indeterminate ~ .custom-control-label {
|
|
||||||
&::before {
|
|
||||||
border-color: $custom-checkbox-indicator-indeterminate-border-color;
|
|
||||||
@include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
|
|
||||||
@include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
|
|
||||||
}
|
|
||||||
&::after {
|
|
||||||
background-image: escape-svg($custom-checkbox-indicator-icon-indeterminate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:disabled {
|
|
||||||
&:checked ~ .custom-control-label::before {
|
|
||||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
|
||||||
}
|
|
||||||
&:indeterminate ~ .custom-control-label::before {
|
|
||||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Radios
|
|
||||||
//
|
|
||||||
// Tweak just a few things for radios.
|
|
||||||
|
|
||||||
.custom-radio {
|
|
||||||
.custom-control-label::before {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-radius: $custom-radio-indicator-border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:checked ~ .custom-control-label {
|
|
||||||
&::after {
|
|
||||||
background-image: escape-svg($custom-radio-indicator-icon-checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:disabled {
|
|
||||||
&:checked ~ .custom-control-label::before {
|
|
||||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// switches
|
|
||||||
//
|
|
||||||
// Tweak a few things for switches
|
|
||||||
|
|
||||||
.custom-switch {
|
|
||||||
padding-left: $custom-switch-width + $custom-control-gutter;
|
|
||||||
|
|
||||||
.custom-control-label {
|
|
||||||
&::before {
|
|
||||||
left: -($custom-switch-width + $custom-control-gutter);
|
|
||||||
width: $custom-switch-width;
|
|
||||||
pointer-events: all;
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-radius: $custom-switch-indicator-border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2);
|
|
||||||
left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);
|
|
||||||
width: $custom-switch-indicator-size;
|
|
||||||
height: $custom-switch-indicator-size;
|
|
||||||
background-color: $custom-control-indicator-border-color;
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-radius: $custom-switch-indicator-border-radius;
|
|
||||||
@include transition(transform .15s ease-in-out, $custom-forms-transition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:checked ~ .custom-control-label {
|
|
||||||
&::after {
|
|
||||||
background-color: $custom-control-indicator-bg;
|
|
||||||
transform: translateX($custom-switch-width - $custom-control-indicator-size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input:disabled {
|
|
||||||
&:checked ~ .custom-control-label::before {
|
|
||||||
background-color: $custom-control-indicator-checked-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Select
|
|
||||||
//
|
|
||||||
// Replaces the browser default select with a custom one, mostly pulled from
|
|
||||||
// https://primer.github.io/.
|
|
||||||
//
|
|
||||||
|
|
||||||
.custom-select {
|
|
||||||
display: inline-block;
|
|
||||||
width: 100%;
|
|
||||||
height: $custom-select-height;
|
|
||||||
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
|
|
||||||
font-family: $custom-select-font-family;
|
|
||||||
@include font-size($custom-select-font-size);
|
|
||||||
font-weight: $custom-select-font-weight;
|
|
||||||
line-height: $custom-select-line-height;
|
|
||||||
color: $custom-select-color;
|
|
||||||
vertical-align: middle;
|
|
||||||
background: $custom-select-bg $custom-select-background;
|
|
||||||
border: $custom-select-border-width solid $custom-select-border-color;
|
|
||||||
@include border-radius($custom-select-border-radius, 0);
|
|
||||||
@include box-shadow($custom-select-box-shadow);
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
border-color: $custom-select-focus-border-color;
|
|
||||||
outline: 0;
|
|
||||||
@if $enable-shadows {
|
|
||||||
box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;
|
|
||||||
} @else {
|
|
||||||
box-shadow: $custom-select-focus-box-shadow;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-value {
|
|
||||||
// For visual consistency with other platforms/browsers,
|
|
||||||
// suppress the default white text on blue background highlight given to
|
|
||||||
// the selected option text when the (still closed) <select> receives focus
|
|
||||||
// in IE and (under certain conditions) Edge.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/19398.
|
|
||||||
color: $input-color;
|
|
||||||
background-color: $input-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&[multiple],
|
|
||||||
&[size]:not([size="1"]) {
|
|
||||||
height: auto;
|
|
||||||
padding-right: $custom-select-padding-x;
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
color: $custom-select-disabled-color;
|
|
||||||
background-color: $custom-select-disabled-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hides the default caret in IE11
|
|
||||||
&::-ms-expand {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove outline from select box in FF
|
|
||||||
&:-moz-focusring {
|
|
||||||
color: transparent;
|
|
||||||
text-shadow: 0 0 0 $custom-select-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-select-sm {
|
|
||||||
height: $custom-select-height-sm;
|
|
||||||
padding-top: $custom-select-padding-y-sm;
|
|
||||||
padding-bottom: $custom-select-padding-y-sm;
|
|
||||||
padding-left: $custom-select-padding-x-sm;
|
|
||||||
@include font-size($custom-select-font-size-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-select-lg {
|
|
||||||
height: $custom-select-height-lg;
|
|
||||||
padding-top: $custom-select-padding-y-lg;
|
|
||||||
padding-bottom: $custom-select-padding-y-lg;
|
|
||||||
padding-left: $custom-select-padding-x-lg;
|
|
||||||
@include font-size($custom-select-font-size-lg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// File
|
|
||||||
//
|
|
||||||
// Custom file input.
|
|
||||||
|
|
||||||
.custom-file {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
width: 100%;
|
|
||||||
height: $custom-file-height;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-file-input {
|
|
||||||
position: relative;
|
|
||||||
z-index: 2;
|
|
||||||
width: 100%;
|
|
||||||
height: $custom-file-height;
|
|
||||||
margin: 0;
|
|
||||||
opacity: 0;
|
|
||||||
|
|
||||||
&:focus ~ .custom-file-label {
|
|
||||||
border-color: $custom-file-focus-border-color;
|
|
||||||
box-shadow: $custom-file-focus-box-shadow;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
|
|
||||||
&[disabled] ~ .custom-file-label,
|
|
||||||
&:disabled ~ .custom-file-label {
|
|
||||||
background-color: $custom-file-disabled-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $lang, $value in $custom-file-text {
|
|
||||||
&:lang(#{$lang}) ~ .custom-file-label::after {
|
|
||||||
content: $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~ .custom-file-label[data-browse]::after {
|
|
||||||
content: attr(data-browse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-file-label {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
height: $custom-file-height;
|
|
||||||
padding: $custom-file-padding-y $custom-file-padding-x;
|
|
||||||
font-family: $custom-file-font-family;
|
|
||||||
font-weight: $custom-file-font-weight;
|
|
||||||
line-height: $custom-file-line-height;
|
|
||||||
color: $custom-file-color;
|
|
||||||
background-color: $custom-file-bg;
|
|
||||||
border: $custom-file-border-width solid $custom-file-border-color;
|
|
||||||
@include border-radius($custom-file-border-radius);
|
|
||||||
@include box-shadow($custom-file-box-shadow);
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 3;
|
|
||||||
display: block;
|
|
||||||
height: $custom-file-height-inner;
|
|
||||||
padding: $custom-file-padding-y $custom-file-padding-x;
|
|
||||||
line-height: $custom-file-line-height;
|
|
||||||
color: $custom-file-button-color;
|
|
||||||
content: "Browse";
|
|
||||||
@include gradient-bg($custom-file-button-bg);
|
|
||||||
border-left: inherit;
|
|
||||||
@include border-radius(0 $custom-file-border-radius $custom-file-border-radius 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.
|
|
||||||
|
|
||||||
.custom-range {
|
|
||||||
width: 100%;
|
|
||||||
height: add($custom-range-thumb-height, $custom-range-thumb-focus-box-shadow-width * 2);
|
|
||||||
padding: 0; // Need to reset padding
|
|
||||||
background-color: transparent;
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline: none;
|
|
||||||
|
|
||||||
// Pseudo-elements must be split across multiple rulesets to have an effect.
|
|
||||||
// No box-shadow() mixin for focus accessibility.
|
|
||||||
&::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
|
|
||||||
&::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
|
|
||||||
&::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-moz-focus-outer {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-webkit-slider-thumb {
|
|
||||||
width: $custom-range-thumb-width;
|
|
||||||
height: $custom-range-thumb-height;
|
|
||||||
margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
|
|
||||||
@include gradient-bg($custom-range-thumb-bg);
|
|
||||||
border: $custom-range-thumb-border;
|
|
||||||
@include border-radius($custom-range-thumb-border-radius);
|
|
||||||
@include box-shadow($custom-range-thumb-box-shadow);
|
|
||||||
@include transition($custom-forms-transition);
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
@include gradient-bg($custom-range-thumb-active-bg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-webkit-slider-runnable-track {
|
|
||||||
width: $custom-range-track-width;
|
|
||||||
height: $custom-range-track-height;
|
|
||||||
color: transparent; // Why?
|
|
||||||
cursor: $custom-range-track-cursor;
|
|
||||||
background-color: $custom-range-track-bg;
|
|
||||||
border-color: transparent;
|
|
||||||
@include border-radius($custom-range-track-border-radius);
|
|
||||||
@include box-shadow($custom-range-track-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-moz-range-thumb {
|
|
||||||
width: $custom-range-thumb-width;
|
|
||||||
height: $custom-range-thumb-height;
|
|
||||||
@include gradient-bg($custom-range-thumb-bg);
|
|
||||||
border: $custom-range-thumb-border;
|
|
||||||
@include border-radius($custom-range-thumb-border-radius);
|
|
||||||
@include box-shadow($custom-range-thumb-box-shadow);
|
|
||||||
@include transition($custom-forms-transition);
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
@include gradient-bg($custom-range-thumb-active-bg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-moz-range-track {
|
|
||||||
width: $custom-range-track-width;
|
|
||||||
height: $custom-range-track-height;
|
|
||||||
color: transparent;
|
|
||||||
cursor: $custom-range-track-cursor;
|
|
||||||
background-color: $custom-range-track-bg;
|
|
||||||
border-color: transparent; // Firefox specific?
|
|
||||||
@include border-radius($custom-range-track-border-radius);
|
|
||||||
@include box-shadow($custom-range-track-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-thumb {
|
|
||||||
width: $custom-range-thumb-width;
|
|
||||||
height: $custom-range-thumb-height;
|
|
||||||
margin-top: 0; // Edge specific
|
|
||||||
margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
|
|
||||||
margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
|
|
||||||
@include gradient-bg($custom-range-thumb-bg);
|
|
||||||
border: $custom-range-thumb-border;
|
|
||||||
@include border-radius($custom-range-thumb-border-radius);
|
|
||||||
@include box-shadow($custom-range-thumb-box-shadow);
|
|
||||||
@include transition($custom-forms-transition);
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
@include gradient-bg($custom-range-thumb-active-bg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-track {
|
|
||||||
width: $custom-range-track-width;
|
|
||||||
height: $custom-range-track-height;
|
|
||||||
color: transparent;
|
|
||||||
cursor: $custom-range-track-cursor;
|
|
||||||
background-color: transparent;
|
|
||||||
border-color: transparent;
|
|
||||||
border-width: $custom-range-thumb-height / 2;
|
|
||||||
@include box-shadow($custom-range-track-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-fill-lower {
|
|
||||||
background-color: $custom-range-track-bg;
|
|
||||||
@include border-radius($custom-range-track-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-fill-upper {
|
|
||||||
margin-right: 15px; // arbitrary?
|
|
||||||
background-color: $custom-range-track-bg;
|
|
||||||
@include border-radius($custom-range-track-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
&::-webkit-slider-thumb {
|
|
||||||
background-color: $custom-range-thumb-disabled-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-webkit-slider-runnable-track {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-moz-range-thumb {
|
|
||||||
background-color: $custom-range-thumb-disabled-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-moz-range-track {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-thumb {
|
|
||||||
background-color: $custom-range-thumb-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-label::before,
|
|
||||||
.custom-file-label,
|
|
||||||
.custom-select {
|
|
||||||
@include transition($custom-forms-transition);
|
|
||||||
}
|
|
|
@ -1,191 +0,0 @@
|
||||||
// The dropdown wrapper (`<div>`)
|
|
||||||
.dropup,
|
|
||||||
.dropright,
|
|
||||||
.dropdown,
|
|
||||||
.dropleft {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-toggle {
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
// Generate the caret automatically
|
|
||||||
@include caret();
|
|
||||||
}
|
|
||||||
|
|
||||||
// The dropdown menu
|
|
||||||
.dropdown-menu {
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-dropdown;
|
|
||||||
display: none; // none by default, but block on "open" of the menu
|
|
||||||
float: left;
|
|
||||||
min-width: $dropdown-min-width;
|
|
||||||
padding: $dropdown-padding-y 0;
|
|
||||||
margin: $dropdown-spacer 0 0; // override default ul
|
|
||||||
@include font-size($dropdown-font-size);
|
|
||||||
color: $dropdown-color;
|
|
||||||
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
|
|
||||||
list-style: none;
|
|
||||||
background-color: $dropdown-bg;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border: $dropdown-border-width solid $dropdown-border-color;
|
|
||||||
@include border-radius($dropdown-border-radius);
|
|
||||||
@include box-shadow($dropdown-box-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
|
||||||
@include media-breakpoint-up($breakpoint) {
|
|
||||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
|
||||||
|
|
||||||
.dropdown-menu#{$infix}-left {
|
|
||||||
right: auto;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu#{$infix}-right {
|
|
||||||
right: 0;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
|
||||||
// Just add .dropup after the standard .dropdown class and you're set.
|
|
||||||
.dropup {
|
|
||||||
.dropdown-menu {
|
|
||||||
top: auto;
|
|
||||||
bottom: 100%;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: $dropdown-spacer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-toggle {
|
|
||||||
@include caret(up);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropright {
|
|
||||||
.dropdown-menu {
|
|
||||||
top: 0;
|
|
||||||
right: auto;
|
|
||||||
left: 100%;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-left: $dropdown-spacer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-toggle {
|
|
||||||
@include caret(right);
|
|
||||||
&::after {
|
|
||||||
vertical-align: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropleft {
|
|
||||||
.dropdown-menu {
|
|
||||||
top: 0;
|
|
||||||
right: 100%;
|
|
||||||
left: auto;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-right: $dropdown-spacer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-toggle {
|
|
||||||
@include caret(left);
|
|
||||||
&::before {
|
|
||||||
vertical-align: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// When enabled Popper.js, reset basic dropdown position
|
|
||||||
// stylelint-disable-next-line no-duplicate-selectors
|
|
||||||
.dropdown-menu {
|
|
||||||
&[x-placement^="top"],
|
|
||||||
&[x-placement^="right"],
|
|
||||||
&[x-placement^="bottom"],
|
|
||||||
&[x-placement^="left"] {
|
|
||||||
right: auto;
|
|
||||||
bottom: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dividers (basically an `<hr>`) within the dropdown
|
|
||||||
.dropdown-divider {
|
|
||||||
@include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Links, buttons, and more within the dropdown menu
|
|
||||||
//
|
|
||||||
// `<button>`-specific styles are denoted with `// For <button>s`
|
|
||||||
.dropdown-item {
|
|
||||||
display: block;
|
|
||||||
width: 100%; // For `<button>`s
|
|
||||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
|
||||||
clear: both;
|
|
||||||
font-weight: $font-weight-normal;
|
|
||||||
color: $dropdown-link-color;
|
|
||||||
text-align: inherit; // For `<button>`s
|
|
||||||
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
|
||||||
background-color: transparent; // For `<button>`s
|
|
||||||
border: 0; // For `<button>`s
|
|
||||||
|
|
||||||
// Prevent dropdown overflow if there's no padding
|
|
||||||
// See https://github.com/twbs/bootstrap/pull/27703
|
|
||||||
@if $dropdown-padding-y == 0 {
|
|
||||||
&:first-child {
|
|
||||||
@include border-top-radius($dropdown-inner-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
@include border-bottom-radius($dropdown-inner-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $dropdown-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
@include gradient-bg($dropdown-link-hover-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active,
|
|
||||||
&:active {
|
|
||||||
color: $dropdown-link-active-color;
|
|
||||||
text-decoration: none;
|
|
||||||
@include gradient-bg($dropdown-link-active-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&:disabled {
|
|
||||||
color: $dropdown-link-disabled-color;
|
|
||||||
pointer-events: none;
|
|
||||||
background-color: transparent;
|
|
||||||
// Remove CSS gradients if they're enabled
|
|
||||||
@if $enable-gradients {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu.show {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown section headers
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
padding: $dropdown-padding-y $dropdown-item-padding-x;
|
|
||||||
margin-bottom: 0; // for use with heading elements
|
|
||||||
@include font-size($font-size-sm);
|
|
||||||
color: $dropdown-header-color;
|
|
||||||
white-space: nowrap; // as with > li > a
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown text
|
|
||||||
.dropdown-item-text {
|
|
||||||
display: block;
|
|
||||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
|
||||||
color: $dropdown-link-color;
|
|
||||||
}
|
|
|
@ -1,338 +0,0 @@
|
||||||
// stylelint-disable selector-no-qualifying-type
|
|
||||||
|
|
||||||
//
|
|
||||||
// Textual form controls
|
|
||||||
//
|
|
||||||
|
|
||||||
.form-control {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: $input-height;
|
|
||||||
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;
|
|
||||||
|
|
||||||
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
|
|
||||||
@include border-radius($input-border-radius, 0);
|
|
||||||
|
|
||||||
@include box-shadow($input-box-shadow);
|
|
||||||
@include transition($input-transition);
|
|
||||||
|
|
||||||
// Unstyle the caret on `<select>`s in IE10+.
|
|
||||||
&::-ms-expand {
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove select outline from select box in FF
|
|
||||||
&:-moz-focusring {
|
|
||||||
color: transparent;
|
|
||||||
text-shadow: 0 0 0 $input-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Customize the `:focus` state to imitate native WebKit styles.
|
|
||||||
@include form-control-focus($ignore-warning: true);
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
select.form-control {
|
|
||||||
&:focus::-ms-value {
|
|
||||||
// Suppress the nested default white text on blue background highlight given to
|
|
||||||
// the selected option text when the (still closed) <select> receives focus
|
|
||||||
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
|
|
||||||
// match the appearance of the native widget.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/19398.
|
|
||||||
color: $input-color;
|
|
||||||
background-color: $input-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make file inputs better match text inputs by forcing them to new lines.
|
|
||||||
.form-control-file,
|
|
||||||
.form-control-range {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Labels
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 `<label>/<legend>` default
|
|
||||||
@include font-size(inherit); // Override the `<legend>` default
|
|
||||||
line-height: $input-line-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
.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);
|
|
||||||
line-height: $input-line-height-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);
|
|
||||||
line-height: $input-line-height-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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
|
|
||||||
@include font-size($input-font-size);
|
|
||||||
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 {
|
|
||||||
height: $input-height-sm;
|
|
||||||
padding: $input-padding-y-sm $input-padding-x-sm;
|
|
||||||
@include font-size($input-font-size-sm);
|
|
||||||
line-height: $input-line-height-sm;
|
|
||||||
@include border-radius($input-border-radius-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control-lg {
|
|
||||||
height: $input-height-lg;
|
|
||||||
padding: $input-padding-y-lg $input-padding-x-lg;
|
|
||||||
@include font-size($input-font-size-lg);
|
|
||||||
line-height: $input-line-height-lg;
|
|
||||||
@include border-radius($input-border-radius-lg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// stylelint-disable-next-line no-duplicate-selectors
|
|
||||||
select.form-control {
|
|
||||||
&[size],
|
|
||||||
&[multiple] {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea.form-control {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Form groups
|
|
||||||
//
|
|
||||||
// Designed to help with the organization and spacing of vertical forms. For
|
|
||||||
// horizontal forms, use the predefined grid classes.
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
margin-bottom: $form-group-margin-bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-text {
|
|
||||||
display: block;
|
|
||||||
margin-top: $form-text-margin-top;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form grid
|
|
||||||
//
|
|
||||||
// Special replacement for our grid system's `.row` for tighter form layouts.
|
|
||||||
|
|
||||||
.form-row {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-right: -$form-grid-gutter-width / 2;
|
|
||||||
margin-left: -$form-grid-gutter-width / 2;
|
|
||||||
|
|
||||||
> .col,
|
|
||||||
> [class*="col-"] {
|
|
||||||
padding-right: $form-grid-gutter-width / 2;
|
|
||||||
padding-left: $form-grid-gutter-width / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkboxes and radios
|
|
||||||
//
|
|
||||||
// Indent the labels to position radios/checkboxes as hanging controls.
|
|
||||||
|
|
||||||
.form-check {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding-left: $form-check-input-gutter;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-check-input {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: $form-check-input-margin-y;
|
|
||||||
margin-left: -$form-check-input-gutter;
|
|
||||||
|
|
||||||
// Use [disabled] and :disabled for workaround https://github.com/twbs/bootstrap/issues/28247
|
|
||||||
&[disabled] ~ .form-check-label,
|
|
||||||
&:disabled ~ .form-check-label {
|
|
||||||
color: $text-muted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-check-label {
|
|
||||||
margin-bottom: 0; // Override default `<label>` bottom margin
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-check-inline {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
padding-left: 0; // Override base .form-check
|
|
||||||
margin-right: $form-check-inline-margin-x;
|
|
||||||
|
|
||||||
// Undo .form-check-input defaults and add some `margin-right`.
|
|
||||||
.form-check-input {
|
|
||||||
position: static;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-right: $form-check-inline-input-margin-x;
|
|
||||||
margin-left: 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.
|
|
||||||
|
|
||||||
@each $state, $data in $form-validation-states {
|
|
||||||
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inline forms
|
|
||||||
//
|
|
||||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
|
||||||
// forms begin stacked on extra small (mobile) devices and then go inline when
|
|
||||||
// viewports reach <768px.
|
|
||||||
//
|
|
||||||
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
|
||||||
// default HTML form controls and our custom form controls (e.g., input groups).
|
|
||||||
|
|
||||||
.form-inline {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
|
|
||||||
|
|
||||||
// Because we use flex, the initial sizing of checkboxes is collapsed and
|
|
||||||
// doesn't occupy the full-width (which is what we want for xs grid tier),
|
|
||||||
// so we force that here.
|
|
||||||
.form-check {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kick in the inline
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
label {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inline-block all the things for "inline"
|
|
||||||
.form-group {
|
|
||||||
display: flex;
|
|
||||||
flex: 0 0 auto;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow folks to *not* use `.form-group`
|
|
||||||
.form-control {
|
|
||||||
display: inline-block;
|
|
||||||
width: auto; // Prevent labels from stacking above inputs in `.form-group`
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make static controls behave like regular ones
|
|
||||||
.form-control-plaintext {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group,
|
|
||||||
.custom-select {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove default margin on radios/checkboxes that were used for stacking, and
|
|
||||||
// then undo the floating of radios and checkboxes to match.
|
|
||||||
.form-check {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: auto;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
.form-check-input {
|
|
||||||
position: relative;
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-right: $form-check-input-margin-x;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control {
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.custom-control-label {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,134 +0,0 @@
|
||||||
// Bootstrap functions
|
|
||||||
//
|
|
||||||
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
|
|
||||||
|
|
||||||
// Ascending
|
|
||||||
// Used to evaluate Sass maps like our grid breakpoints.
|
|
||||||
@mixin _assert-ascending($map, $map-name) {
|
|
||||||
$prev-key: null;
|
|
||||||
$prev-num: null;
|
|
||||||
@each $key, $num in $map {
|
|
||||||
@if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
|
|
||||||
// Do nothing
|
|
||||||
} @else if not comparable($prev-num, $num) {
|
|
||||||
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
|
||||||
} @else if $prev-num >= $num {
|
|
||||||
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
|
||||||
}
|
|
||||||
$prev-key: $key;
|
|
||||||
$prev-num: $num;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Starts at zero
|
|
||||||
// Used to ensure the min-width of the lowest breakpoint starts at 0.
|
|
||||||
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
|
|
||||||
$values: map-values($map);
|
|
||||||
$first-value: nth($values, 1);
|
|
||||||
@if $first-value != 0 {
|
|
||||||
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace `$search` with `$replace` in `$string`
|
|
||||||
// Used on our SVG icon backgrounds for custom forms.
|
|
||||||
//
|
|
||||||
// @author Hugo Giraudel
|
|
||||||
// @param {String} $string - Initial string
|
|
||||||
// @param {String} $search - Substring to replace
|
|
||||||
// @param {String} $replace ('') - New value
|
|
||||||
// @return {String} - Updated string
|
|
||||||
@function str-replace($string, $search, $replace: "") {
|
|
||||||
$index: str-index($string, $search);
|
|
||||||
|
|
||||||
@if $index {
|
|
||||||
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
|
||||||
}
|
|
||||||
|
|
||||||
@return $string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// See https://codepen.io/kevinweber/pen/dXWoRw
|
|
||||||
@function escape-svg($string) {
|
|
||||||
@if str-index($string, "data:image/svg+xml") {
|
|
||||||
@each $char, $encoded in $escaped-characters {
|
|
||||||
$string: str-replace($string, $char, $encoded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@return $string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Color contrast
|
|
||||||
@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
|
|
||||||
$r: red($color);
|
|
||||||
$g: green($color);
|
|
||||||
$b: blue($color);
|
|
||||||
|
|
||||||
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
|
|
||||||
|
|
||||||
@if ($yiq >= $yiq-contrasted-threshold) {
|
|
||||||
@return $dark;
|
|
||||||
} @else {
|
|
||||||
@return $light;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve color Sass maps
|
|
||||||
@function color($key: "blue") {
|
|
||||||
@return map-get($colors, $key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@function theme-color($key: "primary") {
|
|
||||||
@return map-get($theme-colors, $key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@function gray($key: "100") {
|
|
||||||
@return map-get($grays, $key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request a theme color level
|
|
||||||
@function theme-color-level($color-name: "primary", $level: 0) {
|
|
||||||
$color: theme-color($color-name);
|
|
||||||
$color-base: if($level > 0, $black, $white);
|
|
||||||
$level: abs($level);
|
|
||||||
|
|
||||||
@return mix($color-base, $color, $level * $theme-color-interval);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return valid calc
|
|
||||||
@function add($value1, $value2, $return-calc: true) {
|
|
||||||
@if $value1 == null {
|
|
||||||
@return $value2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $value2 == null {
|
|
||||||
@return $value1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
|
|
||||||
@return $value1 + $value2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@function subtract($value1, $value2, $return-calc: true) {
|
|
||||||
@if $value1 == null and $value2 == null {
|
|
||||||
@return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $value1 == null {
|
|
||||||
@return -$value2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $value2 == null {
|
|
||||||
@return $value1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
|
|
||||||
@return $value1 - $value2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
// Container widths
|
|
||||||
//
|
|
||||||
// Set the container width, and override it for fixed navbars in media queries.
|
|
||||||
|
|
||||||
@if $enable-grid-classes {
|
|
||||||
// Single container class with breakpoint max-widths
|
|
||||||
.container {
|
|
||||||
@include make-container();
|
|
||||||
@include make-container-max-widths();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 100% wide container at all breakpoints
|
|
||||||
.container-fluid {
|
|
||||||
@include make-container();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Responsive containers that are 100% wide until a breakpoint
|
|
||||||
@each $breakpoint, $container-max-width in $container-max-widths {
|
|
||||||
.container-#{$breakpoint} {
|
|
||||||
@extend .container-fluid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up($breakpoint, $grid-breakpoints) {
|
|
||||||
%responsive-container-#{$breakpoint} {
|
|
||||||
max-width: $container-max-width;
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $name, $width in $grid-breakpoints {
|
|
||||||
@if ($container-max-width > $width or $breakpoint == $name) {
|
|
||||||
.container#{breakpoint-infix($name, $grid-breakpoints)} {
|
|
||||||
@extend %responsive-container-#{$breakpoint};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Row
|
|
||||||
//
|
|
||||||
// Rows contain your columns.
|
|
||||||
|
|
||||||
@if $enable-grid-classes {
|
|
||||||
.row {
|
|
||||||
@include make-row();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the negative margin from default .row, then the horizontal padding
|
|
||||||
// from all immediate children columns (to prevent runaway style inheritance).
|
|
||||||
.no-gutters {
|
|
||||||
margin-right: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
|
|
||||||
> .col,
|
|
||||||
> [class*="col-"] {
|
|
||||||
padding-right: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Columns
|
|
||||||
//
|
|
||||||
// Common styles for small and large grid columns
|
|
||||||
|
|
||||||
@if $enable-grid-classes {
|
|
||||||
@include make-grid-columns();
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
// Responsive images (ensure images don't scale beyond their parents)
|
|
||||||
//
|
|
||||||
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
|
|
||||||
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
|
|
||||||
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
|
|
||||||
// which weren't expecting the images within themselves to be involuntarily resized.
|
|
||||||
// See also https://github.com/twbs/bootstrap/issues/18178
|
|
||||||
.img-fluid {
|
|
||||||
@include img-fluid();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Image thumbnails
|
|
||||||
.img-thumbnail {
|
|
||||||
padding: $thumbnail-padding;
|
|
||||||
background-color: $thumbnail-bg;
|
|
||||||
border: $thumbnail-border-width solid $thumbnail-border-color;
|
|
||||||
@include border-radius($thumbnail-border-radius);
|
|
||||||
@include box-shadow($thumbnail-box-shadow);
|
|
||||||
|
|
||||||
// Keep them at most 100% wide
|
|
||||||
@include img-fluid();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Figures
|
|
||||||
//
|
|
||||||
|
|
||||||
.figure {
|
|
||||||
// Ensures the caption's text aligns with the image.
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.figure-img {
|
|
||||||
margin-bottom: $spacer / 2;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.figure-caption {
|
|
||||||
@include font-size($figure-caption-font-size);
|
|
||||||
color: $figure-caption-color;
|
|
||||||
}
|
|
|
@ -1,191 +0,0 @@
|
||||||
// stylelint-disable selector-no-qualifying-type
|
|
||||||
|
|
||||||
//
|
|
||||||
// Base styles
|
|
||||||
//
|
|
||||||
|
|
||||||
.input-group {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap; // For form validation feedback
|
|
||||||
align-items: stretch;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
> .form-control,
|
|
||||||
> .form-control-plaintext,
|
|
||||||
> .custom-select,
|
|
||||||
> .custom-file {
|
|
||||||
position: relative; // For focus state's z-index
|
|
||||||
flex: 1 1 0%;
|
|
||||||
min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
+ .form-control,
|
|
||||||
+ .custom-select,
|
|
||||||
+ .custom-file {
|
|
||||||
margin-left: -$input-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bring the "active" form control to the top of surrounding elements
|
|
||||||
> .form-control:focus,
|
|
||||||
> .custom-select:focus,
|
|
||||||
> .custom-file .custom-file-input:focus ~ .custom-file-label {
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bring the custom file input above the label
|
|
||||||
> .custom-file .custom-file-input:focus {
|
|
||||||
z-index: 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .form-control,
|
|
||||||
> .custom-select {
|
|
||||||
&:not(:last-child) { @include border-right-radius(0); }
|
|
||||||
&:not(:first-child) { @include border-left-radius(0); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom file inputs have more complex markup, thus requiring different
|
|
||||||
// border-radius overrides.
|
|
||||||
> .custom-file {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
&:not(:last-child) .custom-file-label,
|
|
||||||
&:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
|
|
||||||
&:not(:first-child) .custom-file-label { @include border-left-radius(0); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Prepend and append
|
|
||||||
//
|
|
||||||
// While it requires one extra layer of HTML for each, dedicated prepend and
|
|
||||||
// append elements allow us to 1) be less clever, 2) simplify our selectors, and
|
|
||||||
// 3) support HTML5 form validation.
|
|
||||||
|
|
||||||
.input-group-prepend,
|
|
||||||
.input-group-append {
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn + .btn,
|
|
||||||
.btn + .input-group-text,
|
|
||||||
.input-group-text + .input-group-text,
|
|
||||||
.input-group-text + .btn {
|
|
||||||
margin-left: -$input-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-prepend { margin-right: -$input-border-width; }
|
|
||||||
.input-group-append { margin-left: -$input-border-width; }
|
|
||||||
|
|
||||||
|
|
||||||
// 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-padding-y $input-padding-x;
|
|
||||||
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
|
|
||||||
@include font-size($input-font-size); // Match inputs
|
|
||||||
font-weight: $font-weight-normal;
|
|
||||||
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);
|
|
||||||
|
|
||||||
// Nuke default margins from checkboxes and radios to vertically center within.
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
//
|
|
||||||
// Remix the default form control sizing classes into new ones for easier
|
|
||||||
// manipulation.
|
|
||||||
|
|
||||||
.input-group-lg > .form-control:not(textarea),
|
|
||||||
.input-group-lg > .custom-select {
|
|
||||||
height: $input-height-lg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-lg > .form-control,
|
|
||||||
.input-group-lg > .custom-select,
|
|
||||||
.input-group-lg > .input-group-prepend > .input-group-text,
|
|
||||||
.input-group-lg > .input-group-append > .input-group-text,
|
|
||||||
.input-group-lg > .input-group-prepend > .btn,
|
|
||||||
.input-group-lg > .input-group-append > .btn {
|
|
||||||
padding: $input-padding-y-lg $input-padding-x-lg;
|
|
||||||
@include font-size($input-font-size-lg);
|
|
||||||
line-height: $input-line-height-lg;
|
|
||||||
@include border-radius($input-border-radius-lg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-sm > .form-control:not(textarea),
|
|
||||||
.input-group-sm > .custom-select {
|
|
||||||
height: $input-height-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-sm > .form-control,
|
|
||||||
.input-group-sm > .custom-select,
|
|
||||||
.input-group-sm > .input-group-prepend > .input-group-text,
|
|
||||||
.input-group-sm > .input-group-append > .input-group-text,
|
|
||||||
.input-group-sm > .input-group-prepend > .btn,
|
|
||||||
.input-group-sm > .input-group-append > .btn {
|
|
||||||
padding: $input-padding-y-sm $input-padding-x-sm;
|
|
||||||
@include font-size($input-font-size-sm);
|
|
||||||
line-height: $input-line-height-sm;
|
|
||||||
@include border-radius($input-border-radius-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-lg > .custom-select,
|
|
||||||
.input-group-sm > .custom-select {
|
|
||||||
padding-right: $custom-select-padding-x + $custom-select-indicator-padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Prepend and append 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.
|
|
||||||
|
|
||||||
|
|
||||||
.input-group > .input-group-prepend > .btn,
|
|
||||||
.input-group > .input-group-prepend > .input-group-text,
|
|
||||||
.input-group > .input-group-append:not(:last-child) > .btn,
|
|
||||||
.input-group > .input-group-append:not(:last-child) > .input-group-text,
|
|
||||||
.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
|
||||||
.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
|
|
||||||
@include border-right-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group > .input-group-append > .btn,
|
|
||||||
.input-group > .input-group-append > .input-group-text,
|
|
||||||
.input-group > .input-group-prepend:not(:first-child) > .btn,
|
|
||||||
.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
|
|
||||||
.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
|
|
||||||
.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
|
|
||||||
@include border-left-radius(0);
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
.jumbotron {
|
|
||||||
padding: $jumbotron-padding ($jumbotron-padding / 2);
|
|
||||||
margin-bottom: $jumbotron-padding;
|
|
||||||
color: $jumbotron-color;
|
|
||||||
background-color: $jumbotron-bg;
|
|
||||||
@include border-radius($border-radius-lg);
|
|
||||||
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
padding: ($jumbotron-padding * 2) $jumbotron-padding;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.jumbotron-fluid {
|
|
||||||
padding-right: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
@include border-radius(0);
|
|
||||||
}
|
|
|
@ -1,158 +0,0 @@
|
||||||
// Base class
|
|
||||||
//
|
|
||||||
// Easily usable on <ul>, <ol>, or <div>.
|
|
||||||
|
|
||||||
.list-group {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
// No need to set list-style: none; since .list-group-item is block level
|
|
||||||
padding-left: 0; // reset padding because ul and ol
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Interactive list items
|
|
||||||
//
|
|
||||||
// Use anchor or button elements instead of `li`s or `div`s to create interactive
|
|
||||||
// list items. Includes an extra `.active` modifier class for selected items.
|
|
||||||
|
|
||||||
.list-group-item-action {
|
|
||||||
width: 100%; // For `<button>`s (anchors become 100% by default though)
|
|
||||||
color: $list-group-action-color;
|
|
||||||
text-align: inherit; // For `<button>`s (anchors inherit)
|
|
||||||
|
|
||||||
// Hover state
|
|
||||||
@include hover-focus() {
|
|
||||||
z-index: 1; // Place hover/focus items above their siblings for proper border styling
|
|
||||||
color: $list-group-action-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: $list-group-hover-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
color: $list-group-action-active-color;
|
|
||||||
background-color: $list-group-action-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Individual list items
|
|
||||||
//
|
|
||||||
// Use on `li`s or `div`s within the `.list-group` parent.
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: $list-group-item-padding-y $list-group-item-padding-x;
|
|
||||||
color: $list-group-color;
|
|
||||||
background-color: $list-group-bg;
|
|
||||||
border: $list-group-border-width solid $list-group-border-color;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
@include border-top-radius($list-group-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
@include border-bottom-radius($list-group-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&:disabled {
|
|
||||||
color: $list-group-disabled-color;
|
|
||||||
pointer-events: none;
|
|
||||||
background-color: $list-group-disabled-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Include both here for `<a>`s and `<button>`s
|
|
||||||
&.active {
|
|
||||||
z-index: 2; // Place active items above their siblings for proper border styling
|
|
||||||
color: $list-group-active-color;
|
|
||||||
background-color: $list-group-active-bg;
|
|
||||||
border-color: $list-group-active-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
& + & {
|
|
||||||
border-top-width: 0;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
margin-top: -$list-group-border-width;
|
|
||||||
border-top-width: $list-group-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Horizontal
|
|
||||||
//
|
|
||||||
// Change the layout of list group items from vertical (default) to horizontal.
|
|
||||||
|
|
||||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
|
||||||
@include media-breakpoint-up($breakpoint) {
|
|
||||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
|
||||||
|
|
||||||
.list-group-horizontal#{$infix} {
|
|
||||||
flex-direction: row;
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
&:first-child {
|
|
||||||
@include border-bottom-left-radius($list-group-border-radius);
|
|
||||||
@include border-top-right-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
@include border-top-right-radius($list-group-border-radius);
|
|
||||||
@include border-bottom-left-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
& + .list-group-item {
|
|
||||||
border-top-width: $list-group-border-width;
|
|
||||||
border-left-width: 0;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
margin-left: -$list-group-border-width;
|
|
||||||
border-left-width: $list-group-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Flush list items
|
|
||||||
//
|
|
||||||
// Remove borders and border-radius to keep list group items edge-to-edge. Most
|
|
||||||
// useful within other components (e.g., cards).
|
|
||||||
|
|
||||||
.list-group-flush {
|
|
||||||
.list-group-item {
|
|
||||||
border-right-width: 0;
|
|
||||||
border-left-width: 0;
|
|
||||||
@include border-radius(0);
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
border-top-width: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
.list-group-item:last-child {
|
|
||||||
border-bottom-width: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Contextual variants
|
|
||||||
//
|
|
||||||
// Add modifier classes to change text and background color on individual items.
|
|
||||||
// Organizationally, this must come after the `:hover` states.
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
.media {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-body {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
// Toggles
|
|
||||||
//
|
|
||||||
// Used in conjunction with global variables to enable certain theme features.
|
|
||||||
|
|
||||||
// Vendor
|
|
||||||
@import "vendor/rfs";
|
|
||||||
|
|
||||||
// Deprecate
|
|
||||||
@import "mixins/deprecate";
|
|
||||||
|
|
||||||
// Utilities
|
|
||||||
@import "mixins/breakpoints";
|
|
||||||
@import "mixins/hover";
|
|
||||||
@import "mixins/image";
|
|
||||||
@import "mixins/badge";
|
|
||||||
@import "mixins/resize";
|
|
||||||
@import "mixins/screen-reader";
|
|
||||||
@import "mixins/size";
|
|
||||||
@import "mixins/reset-text";
|
|
||||||
@import "mixins/text-emphasis";
|
|
||||||
@import "mixins/text-hide";
|
|
||||||
@import "mixins/text-truncate";
|
|
||||||
@import "mixins/visibility";
|
|
||||||
|
|
||||||
// Components
|
|
||||||
@import "mixins/alert";
|
|
||||||
@import "mixins/buttons";
|
|
||||||
@import "mixins/caret";
|
|
||||||
@import "mixins/pagination";
|
|
||||||
@import "mixins/lists";
|
|
||||||
@import "mixins/list-group";
|
|
||||||
@import "mixins/nav-divider";
|
|
||||||
@import "mixins/forms";
|
|
||||||
@import "mixins/table-row";
|
|
||||||
|
|
||||||
// Skins
|
|
||||||
@import "mixins/background-variant";
|
|
||||||
@import "mixins/border-radius";
|
|
||||||
@import "mixins/box-shadow";
|
|
||||||
@import "mixins/gradients";
|
|
||||||
@import "mixins/transition";
|
|
||||||
|
|
||||||
// Layout
|
|
||||||
@import "mixins/clearfix";
|
|
||||||
@import "mixins/grid-framework";
|
|
||||||
@import "mixins/grid";
|
|
||||||
@import "mixins/float";
|
|
|
@ -1,239 +0,0 @@
|
||||||
// .modal-open - body class for killing the scroll
|
|
||||||
// .modal - container to scroll within
|
|
||||||
// .modal-dialog - positioning shell for the actual modal
|
|
||||||
// .modal-content - actual modal w/ bg and corners and stuff
|
|
||||||
|
|
||||||
|
|
||||||
.modal-open {
|
|
||||||
// Kill the scroll on the body
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.modal {
|
|
||||||
overflow-x: hidden;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container that the modal scrolls within
|
|
||||||
.modal {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-modal;
|
|
||||||
display: none;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
// Prevent Chrome on Windows from adding a focus outline. For details, see
|
|
||||||
// https://github.com/twbs/bootstrap/pull/10951.
|
|
||||||
outline: 0;
|
|
||||||
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
|
|
||||||
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
|
|
||||||
// See also https://github.com/twbs/bootstrap/issues/17695
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shell div to position the modal with bottom padding
|
|
||||||
.modal-dialog {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
margin: $modal-dialog-margin;
|
|
||||||
// allow clicks to pass through for custom click handling to close modal
|
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
// When fading in the modal, animate it to slide down
|
|
||||||
.modal.fade & {
|
|
||||||
@include transition($modal-transition);
|
|
||||||
transform: $modal-fade-transform;
|
|
||||||
}
|
|
||||||
.modal.show & {
|
|
||||||
transform: $modal-show-transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When trying to close, animate focus to scale
|
|
||||||
.modal.modal-static & {
|
|
||||||
transform: $modal-scale-transform;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-dialog-scrollable {
|
|
||||||
display: flex; // IE10/11
|
|
||||||
max-height: subtract(100%, $modal-dialog-margin * 2);
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
max-height: subtract(100vh, $modal-dialog-margin * 2); // IE10/11
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-header,
|
|
||||||
.modal-footer {
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-body {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-dialog-centered {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
min-height: subtract(100%, $modal-dialog-margin * 2);
|
|
||||||
|
|
||||||
// Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
|
|
||||||
&::before {
|
|
||||||
display: block; // IE10
|
|
||||||
height: subtract(100vh, $modal-dialog-margin * 2);
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure `.modal-body` shows scrollbar (IE10/11)
|
|
||||||
&.modal-dialog-scrollable {
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
max-height: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual modal
|
|
||||||
.modal-content {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
|
|
||||||
// counteract the pointer-events: none; in the .modal-dialog
|
|
||||||
color: $modal-content-color;
|
|
||||||
pointer-events: auto;
|
|
||||||
background-color: $modal-content-bg;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border: $modal-content-border-width solid $modal-content-border-color;
|
|
||||||
@include border-radius($modal-content-border-radius);
|
|
||||||
@include box-shadow($modal-content-box-shadow-xs);
|
|
||||||
// Remove focus outline from opened modal
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal background
|
|
||||||
.modal-backdrop {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: $zindex-modal-backdrop;
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
background-color: $modal-backdrop-bg;
|
|
||||||
|
|
||||||
// Fade for backdrop
|
|
||||||
&.fade { opacity: 0; }
|
|
||||||
&.show { opacity: $modal-backdrop-opacity; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal header
|
|
||||||
// Top section of the modal w/ title and dismiss
|
|
||||||
.modal-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start; // so the close btn always stays on the upper right corner
|
|
||||||
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
|
|
||||||
padding: $modal-header-padding;
|
|
||||||
border-bottom: $modal-header-border-width solid $modal-header-border-color;
|
|
||||||
@include border-top-radius($modal-content-inner-border-radius);
|
|
||||||
|
|
||||||
.close {
|
|
||||||
padding: $modal-header-padding;
|
|
||||||
// auto on the left force icon to the right even when there is no .modal-title
|
|
||||||
margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Title text within header
|
|
||||||
.modal-title {
|
|
||||||
margin-bottom: 0;
|
|
||||||
line-height: $modal-title-line-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal body
|
|
||||||
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
|
||||||
.modal-body {
|
|
||||||
position: relative;
|
|
||||||
// Enable `flex-grow: 1` so that the body take up as much space as possible
|
|
||||||
// when there should be a fixed height on `.modal-dialog`.
|
|
||||||
flex: 1 1 auto;
|
|
||||||
padding: $modal-inner-padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Footer (for actions)
|
|
||||||
.modal-footer {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center; // vertically center
|
|
||||||
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
|
|
||||||
padding: $modal-inner-padding - $modal-footer-margin-between / 2;
|
|
||||||
border-top: $modal-footer-border-width solid $modal-footer-border-color;
|
|
||||||
@include border-bottom-radius($modal-content-inner-border-radius);
|
|
||||||
|
|
||||||
// Place margin between footer elements
|
|
||||||
// This solution is far from ideal because of the universal selector usage,
|
|
||||||
// but is needed to fix https://github.com/twbs/bootstrap/issues/24800
|
|
||||||
// stylelint-disable-next-line selector-max-universal
|
|
||||||
> * {
|
|
||||||
margin: $modal-footer-margin-between / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Measure scrollbar width for padding body during modal show/hide
|
|
||||||
.modal-scrollbar-measure {
|
|
||||||
position: absolute;
|
|
||||||
top: -9999px;
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale up the modal
|
|
||||||
@include media-breakpoint-up(sm) {
|
|
||||||
// Automatically set modal's width for larger viewports
|
|
||||||
.modal-dialog {
|
|
||||||
max-width: $modal-md;
|
|
||||||
margin: $modal-dialog-margin-y-sm-up auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-dialog-scrollable {
|
|
||||||
max-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
max-height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-dialog-centered {
|
|
||||||
min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
@include box-shadow($modal-content-box-shadow-sm-up);
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-sm { max-width: $modal-sm; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(lg) {
|
|
||||||
.modal-lg,
|
|
||||||
.modal-xl {
|
|
||||||
max-width: $modal-lg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up(xl) {
|
|
||||||
.modal-xl { max-width: $modal-xl; }
|
|
||||||
}
|
|
|
@ -1,120 +0,0 @@
|
||||||
// Base class
|
|
||||||
//
|
|
||||||
// Kickstart any navigation component with a set of style resets. Works with
|
|
||||||
// `<nav>`s, `<ul>`s or `<ol>`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 hover-focus() {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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-item {
|
|
||||||
margin-bottom: -$nav-tabs-border-width;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-link {
|
|
||||||
border: $nav-tabs-border-width solid transparent;
|
|
||||||
@include border-top-radius($nav-tabs-border-radius);
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
border-color: $nav-tabs-link-hover-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.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 {
|
|
||||||
@include border-radius($nav-pills-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-link.active,
|
|
||||||
.show > .nav-link {
|
|
||||||
color: $nav-pills-link-active-color;
|
|
||||||
background-color: $nav-pills-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Justified variants
|
|
||||||
//
|
|
||||||
|
|
||||||
.nav-fill {
|
|
||||||
.nav-item {
|
|
||||||
flex: 1 1 auto;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-justified {
|
|
||||||
.nav-item {
|
|
||||||
flex-basis: 0;
|
|
||||||
flex-grow: 1;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tabbable tabs
|
|
||||||
//
|
|
||||||
// Hide tabbable panes to start, show them when `.active`
|
|
||||||
|
|
||||||
.tab-content {
|
|
||||||
> .tab-pane {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
> .active {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,324 +0,0 @@
|
||||||
// Contents
|
|
||||||
//
|
|
||||||
// Navbar
|
|
||||||
// Navbar brand
|
|
||||||
// Navbar nav
|
|
||||||
// Navbar text
|
|
||||||
// Navbar divider
|
|
||||||
// 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: $navbar-padding-y $navbar-padding-x;
|
|
||||||
|
|
||||||
// Because flex properties aren't inherited, we need to redeclare these first
|
|
||||||
// few properties so that content nested within behave properly.
|
|
||||||
%container-flex-properties {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
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 {
|
|
||||||
display: inline-block;
|
|
||||||
padding-top: $navbar-brand-padding-y;
|
|
||||||
padding-bottom: $navbar-brand-padding-y;
|
|
||||||
margin-right: $navbar-padding-x;
|
|
||||||
@include font-size($navbar-brand-font-size);
|
|
||||||
line-height: inherit;
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar text
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
display: inline-block;
|
|
||||||
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 hover-focus() {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
content: "";
|
|
||||||
background: no-repeat center center;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
&#{$infix} {
|
|
||||||
@include media-breakpoint-down($breakpoint) {
|
|
||||||
%container-navbar-expand-#{$breakpoint} {
|
|
||||||
padding-right: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .container,
|
|
||||||
> .container-fluid {
|
|
||||||
@extend %container-navbar-expand-#{$breakpoint};
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $size, $container-max-width in $container-max-widths {
|
|
||||||
> .container#{breakpoint-infix($size, $container-max-widths)} {
|
|
||||||
@extend %container-navbar-expand-#{$breakpoint};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up($next) {
|
|
||||||
flex-flow: row 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For nesting containers, have to redeclare for alignment purposes
|
|
||||||
%container-nesting-#{$breakpoint} {
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .container,
|
|
||||||
> .container-fluid {
|
|
||||||
@extend %container-nesting-#{$breakpoint};
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $size, $container-max-width in $container-max-widths {
|
|
||||||
> .container#{breakpoint-infix($size, $container-max-widths)} {
|
|
||||||
@extend %container-nesting-#{$breakpoint};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse {
|
|
||||||
display: flex !important; // stylelint-disable-line declaration-no-important
|
|
||||||
|
|
||||||
// Changes flex-bases to auto because of an IE10 bug
|
|
||||||
flex-basis: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-toggler {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-light-brand-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
.nav-link {
|
|
||||||
color: $navbar-light-color;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-light-hover-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
color: $navbar-light-disabled-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.show > .nav-link,
|
|
||||||
.active > .nav-link,
|
|
||||||
.nav-link.show,
|
|
||||||
.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 {
|
|
||||||
color: $navbar-light-active-color;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-light-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// White links against a dark background
|
|
||||||
.navbar-dark {
|
|
||||||
.navbar-brand {
|
|
||||||
color: $navbar-dark-brand-color;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-dark-brand-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
.nav-link {
|
|
||||||
color: $navbar-dark-color;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-dark-hover-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
color: $navbar-dark-disabled-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.show > .nav-link,
|
|
||||||
.active > .nav-link,
|
|
||||||
.nav-link.show,
|
|
||||||
.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 {
|
|
||||||
color: $navbar-dark-active-color;
|
|
||||||
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $navbar-dark-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
.pagination {
|
|
||||||
display: flex;
|
|
||||||
@include list-unstyled();
|
|
||||||
@include border-radius();
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-link {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: $pagination-padding-y $pagination-padding-x;
|
|
||||||
margin-left: -$pagination-border-width;
|
|
||||||
line-height: $pagination-line-height;
|
|
||||||
color: $pagination-color;
|
|
||||||
background-color: $pagination-bg;
|
|
||||||
border: $pagination-border-width solid $pagination-border-color;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
z-index: 2;
|
|
||||||
color: $pagination-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: $pagination-hover-bg;
|
|
||||||
border-color: $pagination-hover-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
z-index: 3;
|
|
||||||
outline: $pagination-focus-outline;
|
|
||||||
box-shadow: $pagination-focus-box-shadow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-item {
|
|
||||||
&:first-child {
|
|
||||||
.page-link {
|
|
||||||
margin-left: 0;
|
|
||||||
@include border-left-radius($border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
.page-link {
|
|
||||||
@include border-right-radius($border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active .page-link {
|
|
||||||
z-index: 3;
|
|
||||||
color: $pagination-active-color;
|
|
||||||
background-color: $pagination-active-bg;
|
|
||||||
border-color: $pagination-active-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled .page-link {
|
|
||||||
color: $pagination-disabled-color;
|
|
||||||
pointer-events: none;
|
|
||||||
// Opinionated: remove the "hand" cursor set previously for .page-link
|
|
||||||
cursor: auto;
|
|
||||||
background-color: $pagination-disabled-bg;
|
|
||||||
border-color: $pagination-disabled-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Sizing
|
|
||||||
//
|
|
||||||
|
|
||||||
.pagination-lg {
|
|
||||||
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-sm {
|
|
||||||
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
|
|
||||||
}
|
|
|
@ -1,170 +0,0 @@
|
||||||
.popover {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
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);
|
|
||||||
|
|
||||||
.arrow {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
width: $popover-arrow-width;
|
|
||||||
height: $popover-arrow-height;
|
|
||||||
margin: 0 $popover-border-radius;
|
|
||||||
|
|
||||||
&::before,
|
|
||||||
&::after {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
content: "";
|
|
||||||
border-color: transparent;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bs-popover-top {
|
|
||||||
margin-bottom: $popover-arrow-height;
|
|
||||||
|
|
||||||
> .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-right {
|
|
||||||
margin-left: $popover-arrow-height;
|
|
||||||
|
|
||||||
> .arrow {
|
|
||||||
left: subtract(-$popover-arrow-height, $popover-border-width);
|
|
||||||
width: $popover-arrow-height;
|
|
||||||
height: $popover-arrow-width;
|
|
||||||
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
|
|
||||||
|
|
||||||
&::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 {
|
|
||||||
margin-top: $popover-arrow-height;
|
|
||||||
|
|
||||||
> .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-left {
|
|
||||||
margin-right: $popover-arrow-height;
|
|
||||||
|
|
||||||
> .arrow {
|
|
||||||
right: subtract(-$popover-arrow-height, $popover-border-width);
|
|
||||||
width: $popover-arrow-height;
|
|
||||||
height: $popover-arrow-width;
|
|
||||||
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
|
|
||||||
|
|
||||||
&::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 {
|
|
||||||
&[x-placement^="top"] {
|
|
||||||
@extend .bs-popover-top;
|
|
||||||
}
|
|
||||||
&[x-placement^="right"] {
|
|
||||||
@extend .bs-popover-right;
|
|
||||||
}
|
|
||||||
&[x-placement^="bottom"] {
|
|
||||||
@extend .bs-popover-bottom;
|
|
||||||
}
|
|
||||||
&[x-placement^="left"] {
|
|
||||||
@extend .bs-popover-left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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 darken($popover-header-bg, 5%);
|
|
||||||
@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;
|
|
||||||
}
|
|
|
@ -1,141 +0,0 @@
|
||||||
// stylelint-disable declaration-no-important, selector-no-qualifying-type
|
|
||||||
|
|
||||||
// Source: https://github.com/h5bp/main.css/blob/master/src/_print.css
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Print styles.
|
|
||||||
// Inlined to avoid the additional HTTP request:
|
|
||||||
// https://www.phpied.com/delay-loading-your-print-css/
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
@if $enable-print-styles {
|
|
||||||
@media print {
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
// Bootstrap specific; comment out `color` and `background`
|
|
||||||
//color: $black !important; // Black prints faster
|
|
||||||
text-shadow: none !important;
|
|
||||||
//background: transparent !important;
|
|
||||||
box-shadow: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
&:not(.btn) {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific; comment the following selector out
|
|
||||||
//a[href]::after {
|
|
||||||
// content: " (" attr(href) ")";
|
|
||||||
//}
|
|
||||||
|
|
||||||
abbr[title]::after {
|
|
||||||
content: " (" attr(title) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific; comment the following selector out
|
|
||||||
//
|
|
||||||
// Don't show links that are fragment identifiers,
|
|
||||||
// or use the `javascript:` pseudo protocol
|
|
||||||
//
|
|
||||||
|
|
||||||
//a[href^="#"]::after,
|
|
||||||
//a[href^="javascript:"]::after {
|
|
||||||
// content: "";
|
|
||||||
//}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap !important;
|
|
||||||
}
|
|
||||||
pre,
|
|
||||||
blockquote {
|
|
||||||
border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Printing Tables:
|
|
||||||
// https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables
|
|
||||||
//
|
|
||||||
|
|
||||||
thead {
|
|
||||||
display: table-header-group;
|
|
||||||
}
|
|
||||||
|
|
||||||
tr,
|
|
||||||
img {
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific changes start
|
|
||||||
|
|
||||||
// Specify a size and min-width to make printing closer across browsers.
|
|
||||||
// We don't set margin here because it breaks `size` in Chrome. We also
|
|
||||||
// don't use `!important` on `size` as it breaks in Chrome.
|
|
||||||
@page {
|
|
||||||
size: $print-page-size;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
min-width: $print-body-min-width !important;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
min-width: $print-body-min-width !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap components
|
|
||||||
.navbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.badge {
|
|
||||||
border: $border-width solid $black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table {
|
|
||||||
border-collapse: collapse !important;
|
|
||||||
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
background-color: $white !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-bordered {
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
border: 1px solid $gray-300 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-dark {
|
|
||||||
color: inherit;
|
|
||||||
|
|
||||||
th,
|
|
||||||
td,
|
|
||||||
thead th,
|
|
||||||
tbody + tbody {
|
|
||||||
border-color: $table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table .thead-dark th {
|
|
||||||
color: inherit;
|
|
||||||
border-color: $table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap specific changes end
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
// Disable animation if transitions are disabled
|
|
||||||
@if $enable-transitions {
|
|
||||||
@keyframes progress-bar-stripes {
|
|
||||||
from { background-position: $progress-height 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.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-stripes $progress-bar-animation-timing;
|
|
||||||
|
|
||||||
@if $enable-prefers-reduced-motion-media-query {
|
|
||||||
@media (prefers-reduced-motion: reduce) {
|
|
||||||
animation: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,482 +0,0 @@
|
||||||
// stylelint-disable at-rule-no-vendor-prefix, 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
|
|
||||||
//
|
|
||||||
// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
|
|
||||||
// 2. Change the default font family in all browsers.
|
|
||||||
// 3. Correct the line height in all browsers.
|
|
||||||
// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
|
|
||||||
// 5. Change the default tap highlight to be completely transparent in iOS.
|
|
||||||
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: border-box; // 1
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-family: sans-serif; // 2
|
|
||||||
line-height: 1.15; // 3
|
|
||||||
-webkit-text-size-adjust: 100%; // 4
|
|
||||||
-webkit-tap-highlight-color: rgba($black, 0); // 5
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
|
|
||||||
// TODO: remove in v5
|
|
||||||
// stylelint-disable-next-line selector-list-comma-newline-after
|
|
||||||
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Body
|
|
||||||
//
|
|
||||||
// 1. Remove the margin in all browsers.
|
|
||||||
// 2. As a best practice, apply a default `background-color`.
|
|
||||||
// 3. Set an explicit initial text-align value so that we can later use
|
|
||||||
// the `inherit` value on things like `<th>` elements.
|
|
||||||
|
|
||||||
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: left; // 3
|
|
||||||
background-color: $body-bg; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline
|
|
||||||
// on elements that programmatically receive focus but wouldn't normally show a visible
|
|
||||||
// focus outline. In general, this would mean that the outline is only applied if the
|
|
||||||
// interaction that led to the element receiving programmatic focus was a keyboard interaction,
|
|
||||||
// or the browser has somehow determined that the user is primarily a keyboard user and/or
|
|
||||||
// wants focus outlines to always be presented.
|
|
||||||
//
|
|
||||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
|
|
||||||
// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/
|
|
||||||
[tabindex="-1"]:focus:not(:focus-visible) {
|
|
||||||
outline: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Content grouping
|
|
||||||
//
|
|
||||||
// 1. Add the correct box sizing in Firefox.
|
|
||||||
// 2. Show the overflow in Edge and IE.
|
|
||||||
|
|
||||||
hr {
|
|
||||||
box-sizing: content-box; // 1
|
|
||||||
height: 0; // 1
|
|
||||||
overflow: visible; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Typography
|
|
||||||
//
|
|
||||||
|
|
||||||
// Remove top margins from headings
|
|
||||||
//
|
|
||||||
// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
|
|
||||||
// margin for easier control within type scales as it avoids margin collapsing.
|
|
||||||
// stylelint-disable-next-line selector-list-comma-newline-after
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: $headings-margin-bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset margins on paragraphs
|
|
||||||
//
|
|
||||||
// Similarly, the top margin on `<p>`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-* attribute for our tooltip plugin
|
|
||||||
// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
|
||||||
// 3. Add explicit cursor to indicate changed behavior.
|
|
||||||
// 4. Remove the bottom border in Firefox 39-.
|
|
||||||
// 5. Prevent the text-decoration to be skipped.
|
|
||||||
|
|
||||||
abbr[title],
|
|
||||||
abbr[data-original-title] { // 1
|
|
||||||
text-decoration: underline; // 2
|
|
||||||
text-decoration: underline dotted; // 2
|
|
||||||
cursor: help; // 3
|
|
||||||
border-bottom: 0; // 4
|
|
||||||
text-decoration-skip-ink: none; // 5
|
|
||||||
}
|
|
||||||
|
|
||||||
address {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
font-style: normal;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
margin-bottom: .5rem;
|
|
||||||
margin-left: 0; // Undo browser default
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote {
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari
|
|
||||||
}
|
|
||||||
|
|
||||||
small {
|
|
||||||
@include font-size(80%); // Add the correct font size in all browsers
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prevent `sub` and `sup` elements from affecting the line height in
|
|
||||||
// all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
sub,
|
|
||||||
sup {
|
|
||||||
position: relative;
|
|
||||||
@include font-size(75%);
|
|
||||||
line-height: 0;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub { bottom: -.25em; }
|
|
||||||
sup { top: -.5em; }
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Links
|
|
||||||
//
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: $link-color;
|
|
||||||
text-decoration: $link-decoration;
|
|
||||||
background-color: transparent; // Remove the gray background on active links in IE 10.
|
|
||||||
|
|
||||||
@include 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]) {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
@include hover() {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Code
|
|
||||||
//
|
|
||||||
|
|
||||||
pre,
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
samp {
|
|
||||||
font-family: $font-family-monospace;
|
|
||||||
@include font-size(1em); // Correct the odd `em` font sizing in all browsers.
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
// Remove browser default top margin
|
|
||||||
margin-top: 0;
|
|
||||||
// Reset browser default of `1em` to use `rem`s
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
// Don't allow content to break outside
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Figures
|
|
||||||
//
|
|
||||||
|
|
||||||
figure {
|
|
||||||
// Apply a consistent margin strategy (matches our type styles).
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Images and content
|
|
||||||
//
|
|
||||||
|
|
||||||
img {
|
|
||||||
vertical-align: middle;
|
|
||||||
border-style: none; // Remove the border on images inside links in IE 10-.
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
// Workaround for the SVG overflow bug in IE10/11 is still required.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/26878
|
|
||||||
overflow: hidden;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Tables
|
|
||||||
//
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-collapse: collapse; // Prevent double borders
|
|
||||||
}
|
|
||||||
|
|
||||||
caption {
|
|
||||||
padding-top: $table-cell-padding;
|
|
||||||
padding-bottom: $table-cell-padding;
|
|
||||||
color: $table-caption-color;
|
|
||||||
text-align: left;
|
|
||||||
caption-side: bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
|
||||||
// Matches default `<td>` alignment by inheriting from the `<body>`, or the
|
|
||||||
// closest parent with a set `text-align`.
|
|
||||||
text-align: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Forms
|
|
||||||
//
|
|
||||||
|
|
||||||
label {
|
|
||||||
// Allow labels to use `margin` for spacing.
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: $label-margin-bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the default `border-radius` that macOS Chrome adds.
|
|
||||||
//
|
|
||||||
// Details at https://github.com/twbs/bootstrap/issues/24093
|
|
||||||
button {
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work around a Firefox/IE bug where the transparent `button` background
|
|
||||||
// results in a loss of the default `button` focus styles.
|
|
||||||
//
|
|
||||||
// Credit: https://github.com/suitcss/base/
|
|
||||||
button:focus {
|
|
||||||
outline: 1px dotted;
|
|
||||||
outline: 5px auto -webkit-focus-ring-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
select,
|
|
||||||
optgroup,
|
|
||||||
textarea {
|
|
||||||
margin: 0; // Remove the margin in Firefox and Safari
|
|
||||||
font-family: inherit;
|
|
||||||
@include font-size(inherit);
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
input {
|
|
||||||
overflow: visible; // Show the overflow in Edge
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
select {
|
|
||||||
text-transform: none; // Remove the inheritance of text transform in Firefox
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the inheritance of word-wrap in Safari.
|
|
||||||
//
|
|
||||||
// Details at https://github.com/twbs/bootstrap/issues/24990
|
|
||||||
select {
|
|
||||||
word-wrap: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
button,
|
|
||||||
[type="button"], // 1
|
|
||||||
[type="reset"],
|
|
||||||
[type="submit"] {
|
|
||||||
-webkit-appearance: button; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opinionated: add "hand" cursor to non-disabled button elements.
|
|
||||||
@if $enable-pointer-cursor-for-buttons {
|
|
||||||
button,
|
|
||||||
[type="button"],
|
|
||||||
[type="reset"],
|
|
||||||
[type="submit"] {
|
|
||||||
&:not(:disabled) {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
|
|
||||||
button::-moz-focus-inner,
|
|
||||||
[type="button"]::-moz-focus-inner,
|
|
||||||
[type="reset"]::-moz-focus-inner,
|
|
||||||
[type="submit"]::-moz-focus-inner {
|
|
||||||
padding: 0;
|
|
||||||
border-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
|
|
||||||
padding: 0; // 2. Remove the padding in IE 10-
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input[type="date"],
|
|
||||||
input[type="time"],
|
|
||||||
input[type="datetime-local"],
|
|
||||||
input[type="month"] {
|
|
||||||
// Remove the default appearance of temporal inputs to avoid a Mobile Safari
|
|
||||||
// bug where setting a custom line-height prevents text from being vertically
|
|
||||||
// centered within the input.
|
|
||||||
// See https://bugs.webkit.org/show_bug.cgi?id=139848
|
|
||||||
// and https://github.com/twbs/bootstrap/issues/11266
|
|
||||||
-webkit-appearance: listbox;
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
overflow: auto; // Remove the default vertical scrollbar in IE.
|
|
||||||
// Textareas should really only resize vertically so they don't break their (horizontal) containers.
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
// Browsers set a default `min-width: min-content;` on fieldsets,
|
|
||||||
// unlike e.g. `<div>`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
|
|
||||||
min-width: 0;
|
|
||||||
// Reset the default outline behavior of fieldsets so they don't affect page layout.
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. Correct the text wrapping in Edge and IE.
|
|
||||||
// 2. Correct the color inheritance from `fieldset` elements in IE.
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%; // 1
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: .5rem;
|
|
||||||
@include font-size(1.5rem);
|
|
||||||
line-height: inherit;
|
|
||||||
color: inherit; // 2
|
|
||||||
white-space: normal; // 1
|
|
||||||
}
|
|
||||||
|
|
||||||
progress {
|
|
||||||
vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Correct the cursor style of increment and decrement buttons in Chrome.
|
|
||||||
[type="number"]::-webkit-inner-spin-button,
|
|
||||||
[type="number"]::-webkit-outer-spin-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
[type="search"] {
|
|
||||||
// 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.
|
|
||||||
outline-offset: -2px; // 2. Correct the outline style in Safari.
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove the inner padding in Chrome and Safari on macOS.
|
|
||||||
//
|
|
||||||
|
|
||||||
[type="search"]::-webkit-search-decoration {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct the inability to style clickable types in iOS and Safari.
|
|
||||||
// 2. Change font properties to `inherit` in Safari.
|
|
||||||
//
|
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
|
||||||
font: inherit; // 2
|
|
||||||
-webkit-appearance: button; // 1
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct element displays
|
|
||||||
//
|
|
||||||
|
|
||||||
output {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
summary {
|
|
||||||
display: list-item; // Add the correct display in all browsers
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
template {
|
|
||||||
display: none; // Add the correct display in IE
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always hide an element with the `hidden` HTML attribute (from PureCSS).
|
|
||||||
// Needed for proper display in IE 10-.
|
|
||||||
[hidden] {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
// Do not forget to update getting-started/theming.md!
|
|
||||||
:root {
|
|
||||||
// Custom variable values only support SassScript inside `#{}`.
|
|
||||||
@each $color, $value in $colors {
|
|
||||||
--#{$color}: #{$value};
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
--#{$color}: #{$value};
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $bp, $value in $grid-breakpoints {
|
|
||||||
--breakpoint-#{$bp}: #{$value};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use `inspect` for lists so that quoted items keep the quotes.
|
|
||||||
// See https://github.com/sass/sass/issues/2383#issuecomment-336349172
|
|
||||||
--font-family-sans-serif: #{inspect($font-family-sans-serif)};
|
|
||||||
--font-family-monospace: #{inspect($font-family-monospace)};
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
//
|
|
||||||
// Rotating border
|
|
||||||
//
|
|
||||||
|
|
||||||
@keyframes spinner-border {
|
|
||||||
to { transform: rotate(360deg); }
|
|
||||||
}
|
|
||||||
|
|
||||||
.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-blacklist
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spinner-border .75s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spinner-border-sm {
|
|
||||||
width: $spinner-width-sm;
|
|
||||||
height: $spinner-height-sm;
|
|
||||||
border-width: $spinner-border-width-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Growing circle
|
|
||||||
//
|
|
||||||
|
|
||||||
@keyframes spinner-grow {
|
|
||||||
0% {
|
|
||||||
transform: scale(0);
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.spinner-grow {
|
|
||||||
display: inline-block;
|
|
||||||
width: $spinner-width;
|
|
||||||
height: $spinner-height;
|
|
||||||
vertical-align: text-bottom;
|
|
||||||
background-color: currentColor;
|
|
||||||
// stylelint-disable-next-line property-blacklist
|
|
||||||
border-radius: 50%;
|
|
||||||
opacity: 0;
|
|
||||||
animation: spinner-grow .75s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spinner-grow-sm {
|
|
||||||
width: $spinner-width-sm;
|
|
||||||
height: $spinner-height-sm;
|
|
||||||
}
|
|
|
@ -1,185 +0,0 @@
|
||||||
//
|
|
||||||
// Basic Bootstrap table
|
|
||||||
//
|
|
||||||
|
|
||||||
.table {
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: $spacer;
|
|
||||||
color: $table-color;
|
|
||||||
background-color: $table-bg; // Reset for nesting within parents with `background-color`.
|
|
||||||
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
padding: $table-cell-padding;
|
|
||||||
vertical-align: top;
|
|
||||||
border-top: $table-border-width solid $table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead th {
|
|
||||||
vertical-align: bottom;
|
|
||||||
border-bottom: (2 * $table-border-width) solid $table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody + tbody {
|
|
||||||
border-top: (2 * $table-border-width) solid $table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Condensed table w/ half padding
|
|
||||||
//
|
|
||||||
|
|
||||||
.table-sm {
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
padding: $table-cell-padding-sm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Border versions
|
|
||||||
//
|
|
||||||
// Add or remove borders all around the table and between all the columns.
|
|
||||||
|
|
||||||
.table-bordered {
|
|
||||||
border: $table-border-width solid $table-border-color;
|
|
||||||
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
border: $table-border-width solid $table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead {
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
border-bottom-width: 2 * $table-border-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-borderless {
|
|
||||||
th,
|
|
||||||
td,
|
|
||||||
thead th,
|
|
||||||
tbody + tbody {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zebra-striping
|
|
||||||
//
|
|
||||||
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
|
|
||||||
|
|
||||||
.table-striped {
|
|
||||||
tbody tr:nth-of-type(#{$table-striped-order}) {
|
|
||||||
background-color: $table-accent-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hover effect
|
|
||||||
//
|
|
||||||
// Placed here since it has to come after the potential zebra striping
|
|
||||||
|
|
||||||
.table-hover {
|
|
||||||
tbody tr {
|
|
||||||
@include hover() {
|
|
||||||
color: $table-hover-color;
|
|
||||||
background-color: $table-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Table backgrounds
|
|
||||||
//
|
|
||||||
// Exact selectors below required to override `.table-striped` and prevent
|
|
||||||
// inheritance to nested tables.
|
|
||||||
|
|
||||||
@each $color, $value in $theme-colors {
|
|
||||||
@include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));
|
|
||||||
}
|
|
||||||
|
|
||||||
@include table-row-variant(active, $table-active-bg);
|
|
||||||
|
|
||||||
|
|
||||||
// Dark styles
|
|
||||||
//
|
|
||||||
// Same table markup, but inverted color scheme: dark background and light text.
|
|
||||||
|
|
||||||
// stylelint-disable-next-line no-duplicate-selectors
|
|
||||||
.table {
|
|
||||||
.thead-dark {
|
|
||||||
th {
|
|
||||||
color: $table-dark-color;
|
|
||||||
background-color: $table-dark-bg;
|
|
||||||
border-color: $table-dark-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.thead-light {
|
|
||||||
th {
|
|
||||||
color: $table-head-color;
|
|
||||||
background-color: $table-head-bg;
|
|
||||||
border-color: $table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-dark {
|
|
||||||
color: $table-dark-color;
|
|
||||||
background-color: $table-dark-bg;
|
|
||||||
|
|
||||||
th,
|
|
||||||
td,
|
|
||||||
thead th {
|
|
||||||
border-color: $table-dark-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.table-bordered {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.table-striped {
|
|
||||||
tbody tr:nth-of-type(#{$table-striped-order}) {
|
|
||||||
background-color: $table-dark-accent-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.table-hover {
|
|
||||||
tbody tr {
|
|
||||||
@include hover() {
|
|
||||||
color: $table-dark-hover-color;
|
|
||||||
background-color: $table-dark-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Responsive tables
|
|
||||||
//
|
|
||||||
// Generate series of `.table-responsive-*` classes for configuring the screen
|
|
||||||
// size of where your table will overflow.
|
|
||||||
|
|
||||||
.table-responsive {
|
|
||||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
|
||||||
$next: breakpoint-next($breakpoint, $grid-breakpoints);
|
|
||||||
$infix: breakpoint-infix($next, $grid-breakpoints);
|
|
||||||
|
|
||||||
&#{$infix} {
|
|
||||||
@include media-breakpoint-down($breakpoint) {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
|
|
||||||
// Prevent double border on horizontal scroll due to use of `display: block;`
|
|
||||||
> .table-bordered {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
.toast {
|
|
||||||
max-width: $toast-max-width;
|
|
||||||
overflow: hidden; // cheap rounded corners on nested items
|
|
||||||
@include font-size($toast-font-size);
|
|
||||||
color: $toast-color;
|
|
||||||
background-color: $toast-background-color;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border: $toast-border-width solid $toast-border-color;
|
|
||||||
box-shadow: $toast-box-shadow;
|
|
||||||
backdrop-filter: blur(10px);
|
|
||||||
opacity: 0;
|
|
||||||
@include border-radius($toast-border-radius);
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-bottom: $toast-padding-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.showing {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.show {
|
|
||||||
display: block;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.hide {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toast-body {
|
|
||||||
padding: $toast-padding-x; // apply to both vertical and horizontal
|
|
||||||
}
|
|
|
@ -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; }
|
|
||||||
|
|
||||||
.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;
|
|
||||||
|
|
||||||
.arrow {
|
|
||||||
bottom: 0;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
top: 0;
|
|
||||||
border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
|
|
||||||
border-top-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bs-tooltip-right {
|
|
||||||
padding: 0 $tooltip-arrow-height;
|
|
||||||
|
|
||||||
.arrow {
|
|
||||||
left: 0;
|
|
||||||
width: $tooltip-arrow-height;
|
|
||||||
height: $tooltip-arrow-width;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
right: 0;
|
|
||||||
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;
|
|
||||||
|
|
||||||
.arrow {
|
|
||||||
top: 0;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
bottom: 0;
|
|
||||||
border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
|
|
||||||
border-bottom-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bs-tooltip-left {
|
|
||||||
padding: 0 $tooltip-arrow-height;
|
|
||||||
|
|
||||||
.arrow {
|
|
||||||
right: 0;
|
|
||||||
width: $tooltip-arrow-height;
|
|
||||||
height: $tooltip-arrow-width;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
left: 0;
|
|
||||||
border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
|
|
||||||
border-left-color: $tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bs-tooltip-auto {
|
|
||||||
&[x-placement^="top"] {
|
|
||||||
@extend .bs-tooltip-top;
|
|
||||||
}
|
|
||||||
&[x-placement^="right"] {
|
|
||||||
@extend .bs-tooltip-right;
|
|
||||||
}
|
|
||||||
&[x-placement^="bottom"] {
|
|
||||||
@extend .bs-tooltip-bottom;
|
|
||||||
}
|
|
||||||
&[x-placement^="left"] {
|
|
||||||
@extend .bs-tooltip-left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
.fade {
|
|
||||||
@include transition($transition-fade);
|
|
||||||
|
|
||||||
&:not(.show) {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse {
|
|
||||||
&:not(.show) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapsing {
|
|
||||||
position: relative;
|
|
||||||
height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
@include transition($transition-collapse);
|
|
||||||
}
|
|
|
@ -1,125 +0,0 @@
|
||||||
// stylelint-disable declaration-no-important, selector-list-comma-newline-after
|
|
||||||
|
|
||||||
//
|
|
||||||
// Headings
|
|
||||||
//
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6,
|
|
||||||
.h1, .h2, .h3, .h4, .h5, .h6 {
|
|
||||||
margin-bottom: $headings-margin-bottom;
|
|
||||||
font-family: $headings-font-family;
|
|
||||||
font-weight: $headings-font-weight;
|
|
||||||
line-height: $headings-line-height;
|
|
||||||
color: $headings-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, .h1 { @include font-size($h1-font-size); }
|
|
||||||
h2, .h2 { @include font-size($h2-font-size); }
|
|
||||||
h3, .h3 { @include font-size($h3-font-size); }
|
|
||||||
h4, .h4 { @include font-size($h4-font-size); }
|
|
||||||
h5, .h5 { @include font-size($h5-font-size); }
|
|
||||||
h6, .h6 { @include font-size($h6-font-size); }
|
|
||||||
|
|
||||||
.lead {
|
|
||||||
@include font-size($lead-font-size);
|
|
||||||
font-weight: $lead-font-weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type display classes
|
|
||||||
.display-1 {
|
|
||||||
@include font-size($display1-size);
|
|
||||||
font-weight: $display1-weight;
|
|
||||||
line-height: $display-line-height;
|
|
||||||
}
|
|
||||||
.display-2 {
|
|
||||||
@include font-size($display2-size);
|
|
||||||
font-weight: $display2-weight;
|
|
||||||
line-height: $display-line-height;
|
|
||||||
}
|
|
||||||
.display-3 {
|
|
||||||
@include font-size($display3-size);
|
|
||||||
font-weight: $display3-weight;
|
|
||||||
line-height: $display-line-height;
|
|
||||||
}
|
|
||||||
.display-4 {
|
|
||||||
@include font-size($display4-size);
|
|
||||||
font-weight: $display4-weight;
|
|
||||||
line-height: $display-line-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Horizontal rules
|
|
||||||
//
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin-top: $hr-margin-y;
|
|
||||||
margin-bottom: $hr-margin-y;
|
|
||||||
border: 0;
|
|
||||||
border-top: $hr-border-width solid $hr-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Emphasis
|
|
||||||
//
|
|
||||||
|
|
||||||
small,
|
|
||||||
.small {
|
|
||||||
@include font-size($small-font-size);
|
|
||||||
font-weight: $font-weight-normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark,
|
|
||||||
.mark {
|
|
||||||
padding: $mark-padding;
|
|
||||||
background-color: $mark-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// 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(90%);
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blockquotes
|
|
||||||
.blockquote {
|
|
||||||
margin-bottom: $spacer;
|
|
||||||
@include font-size($blockquote-font-size);
|
|
||||||
}
|
|
||||||
|
|
||||||
.blockquote-footer {
|
|
||||||
display: block;
|
|
||||||
@include font-size($blockquote-small-font-size);
|
|
||||||
color: $blockquote-small-color;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: "\2014\00A0"; // em dash, nbsp
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
@import "utilities/align";
|
|
||||||
@import "utilities/background";
|
|
||||||
@import "utilities/borders";
|
|
||||||
@import "utilities/clearfix";
|
|
||||||
@import "utilities/display";
|
|
||||||
@import "utilities/embed";
|
|
||||||
@import "utilities/flex";
|
|
||||||
@import "utilities/float";
|
|
||||||
@import "utilities/overflow";
|
|
||||||
@import "utilities/position";
|
|
||||||
@import "utilities/screenreaders";
|
|
||||||
@import "utilities/shadows";
|
|
||||||
@import "utilities/sizing";
|
|
||||||
@import "utilities/stretched-link";
|
|
||||||
@import "utilities/spacing";
|
|
||||||
@import "utilities/text";
|
|
||||||
@import "utilities/visibility";
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,29 +0,0 @@
|
||||||
/*!
|
|
||||||
* Bootstrap Grid v4.4.1 (https://getbootstrap.com/)
|
|
||||||
* Copyright 2011-2019 The Bootstrap Authors
|
|
||||||
* Copyright 2011-2019 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
html {
|
|
||||||
box-sizing: border-box;
|
|
||||||
-ms-overflow-style: scrollbar;
|
|
||||||
}
|
|
||||||
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
@import "functions";
|
|
||||||
@import "variables";
|
|
||||||
|
|
||||||
@import "mixins/breakpoints";
|
|
||||||
@import "mixins/grid-framework";
|
|
||||||
@import "mixins/grid";
|
|
||||||
|
|
||||||
@import "grid";
|
|
||||||
@import "utilities/display";
|
|
||||||
@import "utilities/flex";
|
|
||||||
@import "utilities/spacing";
|
|
|
@ -1,12 +0,0 @@
|
||||||
/*!
|
|
||||||
* Bootstrap Reboot v4.4.1 (https://getbootstrap.com/)
|
|
||||||
* Copyright 2011-2019 The Bootstrap Authors
|
|
||||||
* Copyright 2011-2019 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
|
||||||
*/
|
|
||||||
|
|
||||||
@import "functions";
|
|
||||||
@import "variables";
|
|
||||||
@import "mixins";
|
|
||||||
@import "reboot";
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*!
|
|
||||||
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
|
||||||
* Copyright 2011-2019 The Bootstrap Authors
|
|
||||||
* Copyright 2011-2019 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
@import "functions";
|
|
||||||
@import "variables";
|
|
||||||
@import "mixins";
|
|
||||||
@import "root";
|
|
||||||
@import "reboot";
|
|
||||||
@import "type";
|
|
||||||
@import "images";
|
|
||||||
@import "code";
|
|
||||||
@import "grid";
|
|
||||||
@import "tables";
|
|
||||||
@import "forms";
|
|
||||||
@import "buttons";
|
|
||||||
@import "transitions";
|
|
||||||
@import "dropdown";
|
|
||||||
@import "button-group";
|
|
||||||
@import "input-group";
|
|
||||||
@import "custom-forms";
|
|
||||||
@import "nav";
|
|
||||||
@import "navbar";
|
|
||||||
@import "card";
|
|
||||||
@import "breadcrumb";
|
|
||||||
@import "pagination";
|
|
||||||
@import "badge";
|
|
||||||
@import "jumbotron";
|
|
||||||
@import "alert";
|
|
||||||
@import "progress";
|
|
||||||
@import "media";
|
|
||||||
@import "list-group";
|
|
||||||
@import "close";
|
|
||||||
@import "toasts";
|
|
||||||
@import "modal";
|
|
||||||
@import "tooltip";
|
|
||||||
@import "popover";
|
|
||||||
@import "carousel";
|
|
||||||
@import "spinners";
|
|
||||||
@import "utilities";
|
|
||||||
@import "print";
|
|
|
@ -1,13 +0,0 @@
|
||||||
@mixin alert-variant($background, $border, $color) {
|
|
||||||
color: $color;
|
|
||||||
@include gradient-bg($background);
|
|
||||||
border-color: $border;
|
|
||||||
|
|
||||||
hr {
|
|
||||||
border-top-color: darken($border, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-link {
|
|
||||||
color: darken($color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
// stylelint-disable declaration-no-important
|
|
||||||
|
|
||||||
// Contextual backgrounds
|
|
||||||
|
|
||||||
@mixin bg-variant($parent, $color, $ignore-warning: false) {
|
|
||||||
#{$parent} {
|
|
||||||
background-color: $color !important;
|
|
||||||
}
|
|
||||||
a#{$parent},
|
|
||||||
button#{$parent} {
|
|
||||||
@include hover-focus() {
|
|
||||||
background-color: darken($color, 10%) !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@include deprecate("The `bg-variant` mixin", "v4.4.0", "v5", $ignore-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin bg-gradient-variant($parent, $color) {
|
|
||||||
#{$parent} {
|
|
||||||
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
@mixin badge-variant($bg) {
|
|
||||||
color: color-yiq($bg);
|
|
||||||
background-color: $bg;
|
|
||||||
|
|
||||||
@at-root a#{&} {
|
|
||||||
@include hover-focus() {
|
|
||||||
color: color-yiq($bg);
|
|
||||||
background-color: darken($bg, 10%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
outline: 0;
|
|
||||||
box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
// stylelint-disable property-blacklist
|
|
||||||
// Single side border-radius
|
|
||||||
|
|
||||||
@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-radius: $radius;
|
|
||||||
}
|
|
||||||
@else if $fallback-border-radius != false {
|
|
||||||
border-radius: $fallback-border-radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-top-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-top-left-radius: $radius;
|
|
||||||
border-top-right-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-right-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-top-right-radius: $radius;
|
|
||||||
border-bottom-right-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-bottom-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-bottom-right-radius: $radius;
|
|
||||||
border-bottom-left-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-left-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-top-left-radius: $radius;
|
|
||||||
border-bottom-left-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-top-left-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-top-left-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-top-right-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-top-right-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-bottom-right-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-bottom-right-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-bottom-left-radius($radius) {
|
|
||||||
@if $enable-rounded {
|
|
||||||
border-bottom-left-radius: $radius;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
@mixin box-shadow($shadow...) {
|
|
||||||
@if $enable-shadows {
|
|
||||||
$result: ();
|
|
||||||
|
|
||||||
@if (length($shadow) == 1) {
|
|
||||||
// We can pass `@include box-shadow(none);`
|
|
||||||
$result: $shadow;
|
|
||||||
} @else {
|
|
||||||
// Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;`
|
|
||||||
@for $i from 1 through length($shadow) {
|
|
||||||
@if nth($shadow, $i) != "none" {
|
|
||||||
$result: append($result, nth($shadow, $i), "comma");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@if (length($result) > 0) {
|
|
||||||
box-shadow: $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,123 +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);
|
|
||||||
@return if($n != null and $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. Null for the largest (last) breakpoint.
|
|
||||||
// The maximum value is calculated as the minimum of the next one less 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(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
|
||||||
// 767.98px
|
|
||||||
@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
|
|
||||||
$next: breakpoint-next($name, $breakpoints);
|
|
||||||
@return if($next, breakpoint-min($next, $breakpoints) - .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);
|
|
||||||
$max: breakpoint-max($name, $breakpoints);
|
|
||||||
|
|
||||||
@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($name, $breakpoints) {
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
// Button variants
|
|
||||||
//
|
|
||||||
// Easily pump out default styles, as well as :hover, :focus, :active,
|
|
||||||
// and disabled options for all buttons
|
|
||||||
|
|
||||||
@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {
|
|
||||||
color: color-yiq($background);
|
|
||||||
@include gradient-bg($background);
|
|
||||||
border-color: $border;
|
|
||||||
@include box-shadow($btn-box-shadow);
|
|
||||||
|
|
||||||
@include hover() {
|
|
||||||
color: color-yiq($hover-background);
|
|
||||||
@include gradient-bg($hover-background);
|
|
||||||
border-color: $hover-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
color: color-yiq($hover-background);
|
|
||||||
@include gradient-bg($hover-background);
|
|
||||||
border-color: $hover-border;
|
|
||||||
// Avoid using mixin so we can pass custom focus shadow properly
|
|
||||||
@if $enable-shadows {
|
|
||||||
box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
|
|
||||||
} @else {
|
|
||||||
box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled comes first so active can properly restyle
|
|
||||||
&.disabled,
|
|
||||||
&:disabled {
|
|
||||||
color: color-yiq($background);
|
|
||||||
background-color: $background;
|
|
||||||
border-color: $border;
|
|
||||||
// Remove CSS gradients if they're enabled
|
|
||||||
@if $enable-gradients {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:disabled):not(.disabled):active,
|
|
||||||
&:not(:disabled):not(.disabled).active,
|
|
||||||
.show > &.dropdown-toggle {
|
|
||||||
color: color-yiq($active-background);
|
|
||||||
background-color: $active-background;
|
|
||||||
@if $enable-gradients {
|
|
||||||
background-image: none; // Remove the gradient for the pressed/active state
|
|
||||||
}
|
|
||||||
border-color: $active-border;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
// Avoid using mixin so we can pass custom focus shadow properly
|
|
||||||
@if $enable-shadows and $btn-active-box-shadow != none {
|
|
||||||
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
|
|
||||||
} @else {
|
|
||||||
box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {
|
|
||||||
color: $color;
|
|
||||||
border-color: $color;
|
|
||||||
|
|
||||||
@include hover() {
|
|
||||||
color: $color-hover;
|
|
||||||
background-color: $active-background;
|
|
||||||
border-color: $active-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.focus {
|
|
||||||
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&:disabled {
|
|
||||||
color: $color;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:disabled):not(.disabled):active,
|
|
||||||
&:not(:disabled):not(.disabled).active,
|
|
||||||
.show > &.dropdown-toggle {
|
|
||||||
color: color-yiq($active-background);
|
|
||||||
background-color: $active-background;
|
|
||||||
border-color: $active-border;
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
// Avoid using mixin so we can pass custom focus shadow properly
|
|
||||||
@if $enable-shadows and $btn-active-box-shadow != none {
|
|
||||||
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);
|
|
||||||
} @else {
|
|
||||||
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Button sizes
|
|
||||||
@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
|
|
||||||
padding: $padding-y $padding-x;
|
|
||||||
@include font-size($font-size);
|
|
||||||
line-height: $line-height;
|
|
||||||
// Manually declare to provide an override to the browser default
|
|
||||||
@include border-radius($border-radius, 0);
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
@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-right() {
|
|
||||||
border-top: $caret-width solid transparent;
|
|
||||||
border-right: 0;
|
|
||||||
border-bottom: $caret-width solid transparent;
|
|
||||||
border-left: $caret-width solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin caret-left() {
|
|
||||||
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 == right {
|
|
||||||
@include caret-right();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $direction == left {
|
|
||||||
&::after {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
display: inline-block;
|
|
||||||
margin-right: $caret-spacing;
|
|
||||||
vertical-align: $caret-vertical-align;
|
|
||||||
content: "";
|
|
||||||
@include caret-left();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:empty::after {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
@mixin clearfix() {
|
|
||||||
&::after {
|
|
||||||
display: block;
|
|
||||||
clear: both;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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}.";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
// stylelint-disable declaration-no-important
|
|
||||||
|
|
||||||
@mixin float-left() {
|
|
||||||
float: left !important;
|
|
||||||
@include deprecate("The `float-left` mixin", "v4.3.0", "v5");
|
|
||||||
}
|
|
||||||
@mixin float-right() {
|
|
||||||
float: right !important;
|
|
||||||
@include deprecate("The `float-right` mixin", "v4.3.0", "v5");
|
|
||||||
}
|
|
||||||
@mixin float-none() {
|
|
||||||
float: none !important;
|
|
||||||
@include deprecate("The `float-none` mixin", "v4.3.0", "v5");
|
|
||||||
}
|
|
|
@ -1,177 +0,0 @@
|
||||||
// Form control focus state
|
|
||||||
//
|
|
||||||
// Generate a customized focus state and for any input with the specified color,
|
|
||||||
// which defaults to the `$input-focus-border-color` variable.
|
|
||||||
//
|
|
||||||
// We highly encourage you to not customize the default value, but instead use
|
|
||||||
// this to tweak colors on an as-needed basis. This aesthetic change is based on
|
|
||||||
// WebKit's default styles, but applicable to a wider range of browsers. Its
|
|
||||||
// usability and accessibility should be taken into account with any change.
|
|
||||||
//
|
|
||||||
// Example usage: change the default blue border and shadow to white for better
|
|
||||||
// contrast against a dark gray background.
|
|
||||||
@mixin form-control-focus($ignore-warning: false) {
|
|
||||||
&:focus {
|
|
||||||
color: $input-focus-color;
|
|
||||||
background-color: $input-focus-bg;
|
|
||||||
border-color: $input-focus-border-color;
|
|
||||||
outline: 0;
|
|
||||||
// Avoid using mixin so we can pass custom focus shadow properly
|
|
||||||
@if $enable-shadows {
|
|
||||||
box-shadow: $input-box-shadow, $input-focus-box-shadow;
|
|
||||||
} @else {
|
|
||||||
box-shadow: $input-focus-box-shadow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@include deprecate("The `form-control-focus()` mixin", "v4.4.0", "v5", $ignore-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
@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) {
|
|
||||||
.#{$state}-feedback {
|
|
||||||
display: none;
|
|
||||||
width: 100%;
|
|
||||||
margin-top: $form-feedback-margin-top;
|
|
||||||
@include font-size($form-feedback-font-size);
|
|
||||||
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: color-yiq($color);
|
|
||||||
background-color: rgba($color, $form-feedback-tooltip-opacity);
|
|
||||||
@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: 0 0 0 $input-focus-width rgba($color, .25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-select {
|
|
||||||
@include form-validation-state-selector($state) {
|
|
||||||
border-color: $color;
|
|
||||||
|
|
||||||
@if $enable-validation-icons {
|
|
||||||
padding-right: $custom-select-feedback-icon-padding-right;
|
|
||||||
background: $custom-select-background, escape-svg($icon) $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
border-color: $color;
|
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-check-input {
|
|
||||||
@include form-validation-state-selector($state) {
|
|
||||||
~ .form-check-label {
|
|
||||||
color: $color;
|
|
||||||
}
|
|
||||||
|
|
||||||
~ .#{$state}-feedback,
|
|
||||||
~ .#{$state}-tooltip {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-control-input {
|
|
||||||
@include form-validation-state-selector($state) {
|
|
||||||
~ .custom-control-label {
|
|
||||||
color: $color;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
border-color: $color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:checked {
|
|
||||||
~ .custom-control-label::before {
|
|
||||||
border-color: lighten($color, 10%);
|
|
||||||
@include gradient-bg(lighten($color, 10%));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
~ .custom-control-label::before {
|
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:checked) ~ .custom-control-label::before {
|
|
||||||
border-color: $color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// custom file
|
|
||||||
.custom-file-input {
|
|
||||||
@include form-validation-state-selector($state) {
|
|
||||||
~ .custom-file-label {
|
|
||||||
border-color: $color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
~ .custom-file-label {
|
|
||||||
border-color: $color;
|
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
// Gradients
|
|
||||||
|
|
||||||
@mixin gradient-bg($color) {
|
|
||||||
@if $enable-gradients {
|
|
||||||
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;
|
|
||||||
} @else {
|
|
||||||
background-color: $color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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: 0%, $end-percent: 100%) {
|
|
||||||
background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {
|
|
||||||
background-image: linear-gradient($deg, $start-color, $end-color);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
}
|
|
||||||
@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);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
@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);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
|
|
||||||
background-image: radial-gradient(circle, $inner-color, $outer-color);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
@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);
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
// 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) {
|
|
||||||
// Common properties for all breakpoints
|
|
||||||
%grid-column {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
padding-right: $gutter / 2;
|
|
||||||
padding-left: $gutter / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@each $breakpoint in map-keys($breakpoints) {
|
|
||||||
$infix: breakpoint-infix($breakpoint, $breakpoints);
|
|
||||||
|
|
||||||
// Allow columns to stretch full width below their breakpoints
|
|
||||||
@for $i from 1 through $columns {
|
|
||||||
.col#{$infix}-#{$i} {
|
|
||||||
@extend %grid-column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.col#{$infix},
|
|
||||||
.col#{$infix}-auto {
|
|
||||||
@extend %grid-column;
|
|
||||||
}
|
|
||||||
|
|
||||||
@include media-breakpoint-up($breakpoint, $breakpoints) {
|
|
||||||
// Provide basic `.col-{bp}` classes for equal-width flexbox columns
|
|
||||||
.col#{$infix} {
|
|
||||||
flex-basis: 0;
|
|
||||||
flex-grow: 1;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@for $i from 1 through $grid-row-columns {
|
|
||||||
.row-cols#{$infix}-#{$i} {
|
|
||||||
@include row-cols($i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.col#{$infix}-auto {
|
|
||||||
@include make-col-auto();
|
|
||||||
}
|
|
||||||
|
|
||||||
@for $i from 1 through $columns {
|
|
||||||
.col#{$infix}-#{$i} {
|
|
||||||
@include make-col($i, $columns);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.order#{$infix}-first { order: -1; }
|
|
||||||
|
|
||||||
.order#{$infix}-last { order: $columns + 1; }
|
|
||||||
|
|
||||||
@for $i from 0 through $columns {
|
|
||||||
.order#{$infix}-#{$i} { order: $i; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// `$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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
/// Grid system
|
|
||||||
//
|
|
||||||
// Generate semantic grid columns with these mixins.
|
|
||||||
|
|
||||||
@mixin make-container($gutter: $grid-gutter-width) {
|
|
||||||
width: 100%;
|
|
||||||
padding-right: $gutter / 2;
|
|
||||||
padding-left: $gutter / 2;
|
|
||||||
margin-right: auto;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// For each breakpoint, define the maximum width of the container in a media query
|
|
||||||
@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
|
|
||||||
@each $breakpoint, $container-max-width in $max-widths {
|
|
||||||
@include media-breakpoint-up($breakpoint, $breakpoints) {
|
|
||||||
max-width: $container-max-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin make-row($gutter: $grid-gutter-width) {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-right: -$gutter / 2;
|
|
||||||
margin-left: -$gutter / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin make-col-ready($gutter: $grid-gutter-width) {
|
|
||||||
position: relative;
|
|
||||||
// Prevent columns from becoming too narrow when at smaller grid tiers by
|
|
||||||
// always setting `width: 100%;`. This works because we use `flex` values
|
|
||||||
// later on to override this initial width.
|
|
||||||
width: 100%;
|
|
||||||
padding-right: $gutter / 2;
|
|
||||||
padding-left: $gutter / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin make-col($size, $columns: $grid-columns) {
|
|
||||||
flex: 0 0 percentage($size / $columns);
|
|
||||||
// Add a `max-width` to ensure content within each column does not blow out
|
|
||||||
// the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
|
|
||||||
// do not appear to require this.
|
|
||||||
max-width: percentage($size / $columns);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin make-col-auto() {
|
|
||||||
flex: 0 0 auto;
|
|
||||||
width: auto;
|
|
||||||
max-width: 100%; // Reset earlier grid tiers
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 100% / $count;
|
|
||||||
max-width: 100% / $count;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
// Hover mixin and `$enable-hover-media-query` are deprecated.
|
|
||||||
//
|
|
||||||
// Originally added during our alphas and maintained during betas, this mixin was
|
|
||||||
// designed to prevent `:hover` stickiness on iOS-an issue where hover styles
|
|
||||||
// would persist after initial touch.
|
|
||||||
//
|
|
||||||
// For backward compatibility, we've kept these mixins and updated them to
|
|
||||||
// always return their regular pseudo-classes instead of a shimmed media query.
|
|
||||||
//
|
|
||||||
// Issue: https://github.com/twbs/bootstrap/issues/25195
|
|
||||||
|
|
||||||
@mixin hover() {
|
|
||||||
&:hover { @content; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin hover-focus() {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin plain-hover-focus() {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin hover-focus-active() {
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active {
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Retina image
|
|
||||||
//
|
|
||||||
// Short retina mixin for setting background-image and -size.
|
|
||||||
|
|
||||||
@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
|
|
||||||
background-image: url($file-1x);
|
|
||||||
|
|
||||||
// Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
|
|
||||||
// but doesn't convert dppx=>dpi.
|
|
||||||
// There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
|
|
||||||
// Compatibility info: https://caniuse.com/#feat=css-media-resolution
|
|
||||||
@media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
|
|
||||||
only screen and (min-resolution: 2dppx) { // Standardized
|
|
||||||
background-image: url($file-2x);
|
|
||||||
background-size: $width-1x $height-1x;
|
|
||||||
}
|
|
||||||
@include deprecate("`img-retina()`", "v4.3.0", "v5");
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
// List Groups
|
|
||||||
|
|
||||||
@mixin list-group-item-variant($state, $background, $color) {
|
|
||||||
.list-group-item-#{$state} {
|
|
||||||
color: $color;
|
|
||||||
background-color: $background;
|
|
||||||
|
|
||||||
&.list-group-item-action {
|
|
||||||
@include hover-focus() {
|
|
||||||
color: $color;
|
|
||||||
background-color: darken($background, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
color: $white;
|
|
||||||
background-color: $color;
|
|
||||||
border-color: $color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue