Compare commits
115 commits
new-border
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d8bc95c92 | ||
|
|
63880e0e8c | ||
|
|
8c1444f00a | ||
|
|
949fa30152 | ||
|
|
f7d3870567 | ||
|
|
157a27d43d | ||
|
|
1b46601ce8 | ||
|
|
80c0d4deab | ||
|
|
f95004f654 | ||
|
|
c9cd741aff | ||
|
|
e34481b6eb | ||
|
|
d21fb9b627 | ||
|
|
20a9d491a2 | ||
|
|
041de9d5ed | ||
|
|
1cdbf532af | ||
|
|
82e5fe2d8c | ||
|
|
cad88abdb0 | ||
|
|
05249c8c04 | ||
|
|
408b2558dc | ||
|
|
f43133ac41 | ||
|
|
ed5ddca5ba | ||
|
|
69afafe811 | ||
|
|
bf1e913f05 | ||
|
|
0bcaa068f2 | ||
|
|
78c5b503f9 | ||
|
|
d62d18f172 | ||
|
|
a2ae2c364f | ||
|
|
7e6d7b8f81 | ||
|
|
ee8546da18 | ||
|
|
3b773e4265 | ||
|
|
80557b3ac0 | ||
|
|
70175db429 | ||
|
|
d9adaae5b0 | ||
|
|
480e7e61b6 | ||
|
|
f2c504397e | ||
|
|
cefdcf6954 | ||
|
|
417372677f | ||
|
|
fee72a1dbc | ||
|
|
dbd53b8475 | ||
|
|
3c934ddcef | ||
|
|
e635a49536 | ||
|
|
acec356c81 | ||
|
|
d1a62b47c3 | ||
|
|
88d35b725b | ||
|
|
eb45005047 | ||
|
|
265605bba0 | ||
|
|
dfe1b156d1 | ||
|
|
fd48a8732f | ||
|
|
97a3ef357d | ||
|
|
baa8d3702f | ||
|
|
e1e6f5684e | ||
|
|
d5b6971814 | ||
|
|
8f33f7865d | ||
|
|
1bfe4780d4 | ||
|
|
e27bd176bf | ||
|
|
fdd76d6d0c | ||
|
|
c6240401f5 | ||
|
|
ae3fa0e679 | ||
|
|
5672401b15 | ||
|
|
9d95e11eda | ||
|
|
99b3470e82 | ||
|
|
b05145c951 | ||
|
|
122b2bdd48 | ||
|
|
0fc072649e | ||
|
|
93a4c0fbf7 | ||
|
|
a48a29a7a5 | ||
|
|
bcf69163cd | ||
|
|
8e426a32bc | ||
|
|
f50b867be8 | ||
|
|
c1197ad37f | ||
|
|
9b7bb7b568 | ||
|
|
59cd71631e | ||
|
|
2d46e47464 | ||
|
|
44667d89fa | ||
|
|
86802f701c | ||
|
|
e468917731 | ||
|
|
d140f50b35 | ||
|
|
561c0d8cde | ||
|
|
58ab1c2cd5 | ||
|
|
66f323af70 | ||
|
|
517446069a | ||
|
|
f07106e604 | ||
|
|
ef0bc661cf | ||
|
|
df763d6457 | ||
|
|
8984255158 | ||
|
|
b424650ab5 | ||
|
|
f12657b39f | ||
|
|
29e4eb91c1 | ||
|
|
269efc8dc9 | ||
|
|
4e7c9e56fc | ||
|
|
cc3a5cf79a | ||
|
|
65f1bf027a | ||
|
|
479043f255 | ||
|
|
0c195f690a | ||
|
|
c2f67d72e8 | ||
|
|
eae52b1cb0 | ||
|
|
9b6c815148 | ||
|
|
e8d14b302e | ||
|
|
c3e8a0ef2a | ||
|
|
e1f561b53c | ||
|
|
e2324731de | ||
|
|
a3ead0786a | ||
|
|
042a4a255f | ||
|
|
793c79d14b | ||
|
|
25326a0114 | ||
|
|
a60d8c0d58 | ||
|
|
071f914fa1 | ||
|
|
a31ea592d6 | ||
|
|
fe3658672c | ||
|
|
ebce95dc60 | ||
|
|
b85ca045e0 | ||
|
|
e967ecf900 | ||
|
|
f2b39d620c | ||
|
|
78389b2acf | ||
|
|
b2477cc70c |
125 changed files with 1556 additions and 1933 deletions
|
|
@ -18,11 +18,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "./dist/css/bootstrap-utilities.css",
|
"path": "./dist/css/bootstrap-utilities.css",
|
||||||
"maxSize": "7 kB"
|
"maxSize": "7.5 kB"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "./dist/css/bootstrap-utilities.min.css",
|
"path": "./dist/css/bootstrap-utilities.min.css",
|
||||||
"maxSize": "6.25 kB"
|
"maxSize": "6.75 kB"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "./dist/css/bootstrap.css",
|
"path": "./dist/css/bootstrap.css",
|
||||||
|
|
|
||||||
|
|
@ -43,15 +43,14 @@
|
||||||
],
|
],
|
||||||
"unicorn/consistent-function-scoping": "off",
|
"unicorn/consistent-function-scoping": "off",
|
||||||
"unicorn/explicit-length-check": "off",
|
"unicorn/explicit-length-check": "off",
|
||||||
"unicorn/import-index": "off",
|
"unicorn/no-array-callback-reference": "off",
|
||||||
"unicorn/no-fn-reference-in-iterator": "off",
|
|
||||||
"unicorn/no-for-loop": "off",
|
"unicorn/no-for-loop": "off",
|
||||||
"unicorn/no-null": "off",
|
"unicorn/no-null": "off",
|
||||||
"unicorn/no-unused-properties": "error",
|
"unicorn/no-unused-properties": "error",
|
||||||
"unicorn/no-useless-undefined": "off",
|
"unicorn/no-useless-undefined": "off",
|
||||||
"unicorn/prefer-dataset": "off",
|
"unicorn/prefer-dom-node-append": "off",
|
||||||
"unicorn/prefer-node-append": "off",
|
"unicorn/prefer-dom-node-dataset": "off",
|
||||||
"unicorn/prefer-node-remove": "off",
|
"unicorn/prefer-dom-node-remove": "off",
|
||||||
"unicorn/prefer-optional-catch-binding": "off",
|
"unicorn/prefer-optional-catch-binding": "off",
|
||||||
"unicorn/prefer-query-selector": "off",
|
"unicorn/prefer-query-selector": "off",
|
||||||
"unicorn/prevent-abbreviations": "off"
|
"unicorn/prevent-abbreviations": "off"
|
||||||
|
|
|
||||||
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
|
|
@ -15,3 +15,10 @@ updates:
|
||||||
- v5
|
- v5
|
||||||
versioning-strategy: increase
|
versioning-strategy: increase
|
||||||
rebase-strategy: disabled
|
rebase-strategy: disabled
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
day: tuesday
|
||||||
|
time: "12:00"
|
||||||
|
timezone: Europe/Athens
|
||||||
|
|
|
||||||
14
.github/release-drafter.yml
vendored
14
.github/release-drafter.yml
vendored
|
|
@ -4,6 +4,9 @@ prerelease: true
|
||||||
exclude-labels:
|
exclude-labels:
|
||||||
- 'skip-changelog'
|
- 'skip-changelog'
|
||||||
categories:
|
categories:
|
||||||
|
- title: '❗ Breaking Changes'
|
||||||
|
labels:
|
||||||
|
- 'breaking-change'
|
||||||
- title: '🚀 Features'
|
- title: '🚀 Features'
|
||||||
labels:
|
labels:
|
||||||
- 'new-feature'
|
- 'new-feature'
|
||||||
|
|
@ -14,6 +17,9 @@ categories:
|
||||||
- 'fix'
|
- 'fix'
|
||||||
- 'bugfix'
|
- 'bugfix'
|
||||||
- 'bug'
|
- 'bug'
|
||||||
|
- title: '⚡ Performance Improvements'
|
||||||
|
labels:
|
||||||
|
- 'performance'
|
||||||
- title: '🎨 CSS'
|
- title: '🎨 CSS'
|
||||||
labels:
|
labels:
|
||||||
- 'css'
|
- 'css'
|
||||||
|
|
@ -26,11 +32,19 @@ categories:
|
||||||
- title: '🌎 Accessibility'
|
- title: '🌎 Accessibility'
|
||||||
labels:
|
labels:
|
||||||
- 'accessibility'
|
- 'accessibility'
|
||||||
|
- title: '🔧 Utility API'
|
||||||
|
labels:
|
||||||
|
- 'utility API'
|
||||||
|
- 'utilities'
|
||||||
|
- title: '🏭 Tests'
|
||||||
|
labels:
|
||||||
|
- 'tests'
|
||||||
- title: '🧰 Misc'
|
- title: '🧰 Misc'
|
||||||
labels:
|
labels:
|
||||||
- 'build'
|
- 'build'
|
||||||
- 'meta'
|
- 'meta'
|
||||||
- 'chore'
|
- 'chore'
|
||||||
|
- 'CI'
|
||||||
- title: '📦 Dependencies'
|
- title: '📦 Dependencies'
|
||||||
labels:
|
labels:
|
||||||
- 'dependencies'
|
- 'dependencies'
|
||||||
|
|
|
||||||
9
.github/workflows/browserstack.yml
vendored
9
.github/workflows/browserstack.yml
vendored
|
|
@ -4,9 +4,8 @@ on:
|
||||||
push:
|
push:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
browserstack:
|
browserstack:
|
||||||
|
|
@ -19,7 +18,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
@ -29,8 +28,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-
|
${{ runner.os }}-node-v${{ env.NODE }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
9
.github/workflows/bundlewatch.yml
vendored
9
.github/workflows/bundlewatch.yml
vendored
|
|
@ -7,9 +7,8 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
bundlewatch:
|
bundlewatch:
|
||||||
|
|
@ -20,7 +19,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
@ -30,8 +29,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-
|
${{ runner.os }}-node-v${{ env.NODE }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
9
.github/workflows/codeql.yml
vendored
9
.github/workflows/codeql.yml
vendored
|
|
@ -22,15 +22,6 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
with:
|
|
||||||
# We must fetch at least the immediate parents so that if this is
|
|
||||||
# a pull request then we can checkout the head.
|
|
||||||
fetch-depth: 2
|
|
||||||
|
|
||||||
# If this run was triggered by a pull request event, then checkout
|
|
||||||
# the head of the pull request instead of the merge commit.
|
|
||||||
- run: git checkout HEAD^2
|
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|
|
||||||
9
.github/workflows/css.yml
vendored
9
.github/workflows/css.yml
vendored
|
|
@ -7,9 +7,8 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
css:
|
css:
|
||||||
|
|
@ -20,7 +19,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
@ -30,8 +29,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-
|
${{ runner.os }}-node-v${{ env.NODE }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
9
.github/workflows/docs.yml
vendored
9
.github/workflows/docs.yml
vendored
|
|
@ -7,9 +7,8 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docs:
|
docs:
|
||||||
|
|
@ -20,7 +19,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
@ -32,8 +31,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-
|
${{ runner.os }}-node-v${{ env.NODE }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
7
.github/workflows/js.yml
vendored
7
.github/workflows/js.yml
vendored
|
|
@ -7,7 +7,6 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
@ -25,7 +24,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node }}
|
node-version: ${{ matrix.node }}
|
||||||
|
|
||||||
|
|
@ -35,8 +34,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}}
|
key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ matrix.node }}-
|
${{ runner.os }}-node-v${{ matrix.node }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
9
.github/workflows/lint.yml
vendored
9
.github/workflows/lint.yml
vendored
|
|
@ -7,9 +7,8 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
|
|
@ -20,7 +19,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
@ -30,8 +29,8 @@ jobs:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
|
||||||
${{ runner.OS }}-node-v${{ env.NODE }}-
|
${{ runner.os }}-node-v${{ env.NODE }}-
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
|
||||||
5
.github/workflows/node-sass.yml
vendored
5
.github/workflows/node-sass.yml
vendored
|
|
@ -7,9 +7,8 @@ on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CI: true
|
|
||||||
FORCE_COLOR: 2
|
FORCE_COLOR: 2
|
||||||
NODE: 14.x
|
NODE: 14
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
css:
|
css:
|
||||||
|
|
@ -20,7 +19,7 @@ jobs:
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: "${{ env.NODE }}"
|
node-version: "${{ env.NODE }}"
|
||||||
|
|
||||||
|
|
|
||||||
11
.gitignore
vendored
11
.gitignore
vendored
|
|
@ -1,19 +1,8 @@
|
||||||
# Ignore docs files
|
# Ignore docs files
|
||||||
/_gh_pages/
|
/_gh_pages/
|
||||||
# This is the old Jekyll docs dist folder;
|
|
||||||
# keeping it here so that when we switch branches it doesn't show up
|
|
||||||
/site/docs/**/dist/
|
|
||||||
# Jekyll's cache folder; keeping it for the same reason as above
|
|
||||||
/site/.jekyll-cache/
|
|
||||||
# Hugo resources folder
|
# Hugo resources folder
|
||||||
/resources/
|
/resources/
|
||||||
|
|
||||||
# Ignore ruby/bundler files;
|
|
||||||
# keeping them here so that when we switch branches they don't show up
|
|
||||||
/.bundle/
|
|
||||||
/vendor/
|
|
||||||
/.ruby-version
|
|
||||||
|
|
||||||
# Numerous always-ignore extensions
|
# Numerous always-ignore extensions
|
||||||
*.diff
|
*.diff
|
||||||
*.err
|
*.err
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@
|
||||||
"stylelint-config-twbs-bootstrap/scss"
|
"stylelint-config-twbs-bootstrap/scss"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"declaration-property-value-disallowed-list": {
|
||||||
|
"border": "none",
|
||||||
|
"outline": "none"
|
||||||
|
},
|
||||||
"function-disallowed-list": [
|
"function-disallowed-list": [
|
||||||
"calc",
|
"calc",
|
||||||
"lighten",
|
"lighten",
|
||||||
|
|
|
||||||
4
LICENSE
4
LICENSE
|
|
@ -1,7 +1,7 @@
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2011-2020 Twitter, Inc.
|
Copyright (c) 2011-2021 Twitter, Inc.
|
||||||
Copyright (c) 2011-2020 The Bootstrap Authors
|
Copyright (c) 2011-2021 The Bootstrap Authors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
||||||
|
|
@ -236,4 +236,4 @@ Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com
|
||||||
|
|
||||||
## Copyright and license
|
## Copyright and license
|
||||||
|
|
||||||
Code and documentation copyright 2011–2020 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).
|
Code and documentation copyright 2011–2021 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Script to build our plugins to use them separately.
|
* Script to build our plugins to use them separately.
|
||||||
* Copyright 2020 The Bootstrap Authors
|
* Copyright 2020-2021 The Bootstrap Authors
|
||||||
* Copyright 2020 Twitter, Inc.
|
* Copyright 2020-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -29,6 +29,7 @@ const bsPlugins = {
|
||||||
Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'),
|
Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'),
|
||||||
SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'),
|
SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'),
|
||||||
Alert: path.resolve(__dirname, '../js/src/alert.js'),
|
Alert: path.resolve(__dirname, '../js/src/alert.js'),
|
||||||
|
Base: path.resolve(__dirname, '../js/src/base-component.js'),
|
||||||
Button: path.resolve(__dirname, '../js/src/button.js'),
|
Button: path.resolve(__dirname, '../js/src/button.js'),
|
||||||
Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
|
Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
|
||||||
Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
|
Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
|
||||||
|
|
@ -44,11 +45,13 @@ const bsPlugins = {
|
||||||
const defaultPluginConfig = {
|
const defaultPluginConfig = {
|
||||||
external: [
|
external: [
|
||||||
bsPlugins.Data,
|
bsPlugins.Data,
|
||||||
|
bsPlugins.Base,
|
||||||
bsPlugins.EventHandler,
|
bsPlugins.EventHandler,
|
||||||
bsPlugins.SelectorEngine
|
bsPlugins.SelectorEngine
|
||||||
],
|
],
|
||||||
globals: {
|
globals: {
|
||||||
[bsPlugins.Data]: 'Data',
|
[bsPlugins.Data]: 'Data',
|
||||||
|
[bsPlugins.Base]: 'Base',
|
||||||
[bsPlugins.EventHandler]: 'EventHandler',
|
[bsPlugins.EventHandler]: 'EventHandler',
|
||||||
[bsPlugins.SelectorEngine]: 'SelectorEngine'
|
[bsPlugins.SelectorEngine]: 'SelectorEngine'
|
||||||
}
|
}
|
||||||
|
|
@ -73,6 +76,7 @@ const getConfigByPluginKey = pluginKey => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
pluginKey === 'Base' ||
|
||||||
pluginKey === 'Button' ||
|
pluginKey === 'Button' ||
|
||||||
pluginKey === 'Carousel' ||
|
pluginKey === 'Carousel' ||
|
||||||
pluginKey === 'Collapse' ||
|
pluginKey === 'Collapse' ||
|
||||||
|
|
@ -112,11 +116,13 @@ const getConfigByPluginKey = pluginKey => {
|
||||||
return {
|
return {
|
||||||
external: [
|
external: [
|
||||||
bsPlugins.Data,
|
bsPlugins.Data,
|
||||||
|
bsPlugins.Base,
|
||||||
bsPlugins.EventHandler,
|
bsPlugins.EventHandler,
|
||||||
bsPlugins.Manipulator
|
bsPlugins.Manipulator
|
||||||
],
|
],
|
||||||
globals: {
|
globals: {
|
||||||
[bsPlugins.Data]: 'Data',
|
[bsPlugins.Data]: 'Data',
|
||||||
|
[bsPlugins.Base]: 'Base',
|
||||||
[bsPlugins.EventHandler]: 'EventHandler',
|
[bsPlugins.EventHandler]: 'EventHandler',
|
||||||
[bsPlugins.Manipulator]: 'Manipulator'
|
[bsPlugins.Manipulator]: 'Manipulator'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Script to update version number references in the project.
|
* Script to update version number references in the project.
|
||||||
* Copyright 2017-2020 The Bootstrap Authors
|
* Copyright 2017-2021 The Bootstrap Authors
|
||||||
* Copyright 2017-2020 Twitter, Inc.
|
* Copyright 2017-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
* Remember to use the same vendor files as the CDN ones,
|
* Remember to use the same vendor files as the CDN ones,
|
||||||
* otherwise the hashes won't match!
|
* otherwise the hashes won't match!
|
||||||
*
|
*
|
||||||
* Copyright 2017-2020 The Bootstrap Authors
|
* Copyright 2017-2021 The Bootstrap Authors
|
||||||
* Copyright 2017-2020 Twitter, Inc.
|
* Copyright 2017-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Script to run vnu-jar if Java is available.
|
* Script to run vnu-jar if Java is available.
|
||||||
* Copyright 2017-2020 The Bootstrap Authors
|
* Copyright 2017-2021 The Bootstrap Authors
|
||||||
* Copyright 2017-2020 Twitter, Inc.
|
* Copyright 2017-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
/*!
|
/*!
|
||||||
* Script to create the built examples zip archive;
|
* Script to create the built examples zip archive;
|
||||||
* requires the `zip` command to be present!
|
* requires the `zip` command to be present!
|
||||||
* Copyright 2020 The Bootstrap Authors
|
* Copyright 2020-2021 The Bootstrap Authors
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -12,36 +12,67 @@
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const sh = require('shelljs')
|
const sh = require('shelljs')
|
||||||
|
|
||||||
const { version, version_short: versionShort } = require('../package.json')
|
const pkg = require('../package.json')
|
||||||
|
|
||||||
const folderName = `bootstrap-${version}-examples`
|
const versionShort = pkg.config.version_short
|
||||||
|
const distFolder = `bootstrap-${pkg.version}-examples`
|
||||||
|
const rootDocsDir = '_gh_pages'
|
||||||
|
const docsDir = `${rootDocsDir}/docs/${versionShort}/`
|
||||||
|
|
||||||
|
// these are the files we need in the examples
|
||||||
|
const cssFiles = [
|
||||||
|
'bootstrap.min.css',
|
||||||
|
'bootstrap.min.css.map',
|
||||||
|
'bootstrap.rtl.min.css',
|
||||||
|
'bootstrap.rtl.min.css.map'
|
||||||
|
]
|
||||||
|
const jsFiles = [
|
||||||
|
'bootstrap.bundle.min.js',
|
||||||
|
'bootstrap.bundle.min.js.map'
|
||||||
|
]
|
||||||
|
const imgFiles = [
|
||||||
|
'bootstrap-logo.svg',
|
||||||
|
'bootstrap-logo-white.svg'
|
||||||
|
]
|
||||||
|
|
||||||
sh.config.fatal = true
|
sh.config.fatal = true
|
||||||
|
|
||||||
if (!sh.test('-d', '_gh_pages')) {
|
if (!sh.test('-d', rootDocsDir)) {
|
||||||
throw new Error('The "_gh_pages" folder does not exist, did you forget building the docs?')
|
throw new Error(`The "${rootDocsDir}" folder does not exist, did you forget building the docs?`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// switch to the root dir
|
// switch to the root dir
|
||||||
sh.cd(path.join(__dirname, '..'))
|
sh.cd(path.join(__dirname, '..'))
|
||||||
|
|
||||||
// remove any previously created folder with the same name
|
// remove any previously created folder/zip with the same name
|
||||||
sh.rm('-rf', folderName)
|
sh.rm('-rf', [distFolder, `${distFolder}.zip`])
|
||||||
// create any folders so that `cp` works
|
|
||||||
sh.mkdir('-p', folderName)
|
|
||||||
sh.mkdir('-p', `${folderName}/assets/brand/`)
|
|
||||||
|
|
||||||
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/examples/*`, folderName)
|
// create any folders so that `cp` works
|
||||||
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/dist/`, `${folderName}/assets/`)
|
sh.mkdir('-p', [
|
||||||
// also copy the two brand images we use in the examples
|
distFolder,
|
||||||
sh.cp('-f', [
|
`${distFolder}/assets/brand/`,
|
||||||
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-logo.svg`,
|
`${distFolder}/assets/dist/css/`,
|
||||||
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-logo-white.svg`
|
`${distFolder}/assets/dist/js/`
|
||||||
], `${folderName}/assets/brand/`)
|
])
|
||||||
sh.rm(`${folderName}/index.html`)
|
|
||||||
|
sh.cp('-Rf', `${docsDir}/examples/*`, distFolder)
|
||||||
|
|
||||||
|
cssFiles.forEach(file => {
|
||||||
|
sh.cp('-f', `${docsDir}/dist/css/${file}`, `${distFolder}/assets/dist/css/`)
|
||||||
|
})
|
||||||
|
|
||||||
|
jsFiles.forEach(file => {
|
||||||
|
sh.cp('-f', `${docsDir}/dist/js/${file}`, `${distFolder}/assets/dist/js/`)
|
||||||
|
})
|
||||||
|
|
||||||
|
imgFiles.forEach(file => {
|
||||||
|
sh.cp('-f', `${docsDir}/assets/brand/${file}`, `${distFolder}/assets/brand/`)
|
||||||
|
})
|
||||||
|
|
||||||
|
sh.rm(`${distFolder}/index.html`)
|
||||||
|
|
||||||
// get all examples' HTML files
|
// get all examples' HTML files
|
||||||
sh.find(`${folderName}/**/*.html`).forEach(file => {
|
sh.find(`${distFolder}/**/*.html`).forEach(file => {
|
||||||
const fileContents = sh.cat(file)
|
const fileContents = sh.cat(file)
|
||||||
.toString()
|
.toString()
|
||||||
.replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../')
|
.replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../')
|
||||||
|
|
@ -53,7 +84,7 @@ sh.find(`${folderName}/**/*.html`).forEach(file => {
|
||||||
})
|
})
|
||||||
|
|
||||||
// create the zip file
|
// create the zip file
|
||||||
sh.exec(`zip -r9 "${folderName}.zip" "${folderName}"`, { fatal: true })
|
sh.exec(`zip -r9 "${distFolder}.zip" "${distFolder}"`)
|
||||||
|
|
||||||
// remove the folder we created
|
// remove the folder we created
|
||||||
sh.rm('-rf', folderName)
|
sh.rm('-rf', distFolder)
|
||||||
|
|
|
||||||
|
|
@ -75,5 +75,5 @@ params:
|
||||||
js_hash: "sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj"
|
js_hash: "sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj"
|
||||||
js_bundle: "https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
|
js_bundle: "https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
|
||||||
js_bundle_hash: "sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
|
js_bundle_hash: "sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
|
||||||
popper: "https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"
|
popper: "https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js"
|
||||||
popper_hash: "sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU"
|
popper_hash: "sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi"
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import {
|
||||||
getElementFromSelector,
|
getElementFromSelector,
|
||||||
getTransitionDurationFromElement,
|
getTransitionDurationFromElement,
|
||||||
isVisible,
|
isVisible,
|
||||||
|
isRTL,
|
||||||
reflow,
|
reflow,
|
||||||
triggerTransitionEnd,
|
triggerTransitionEnd,
|
||||||
typeCheckConfig
|
typeCheckConfig
|
||||||
|
|
@ -250,12 +251,20 @@ class Carousel extends BaseComponent {
|
||||||
|
|
||||||
// swipe left
|
// swipe left
|
||||||
if (direction > 0) {
|
if (direction > 0) {
|
||||||
this.prev()
|
if (isRTL) {
|
||||||
|
this.next()
|
||||||
|
} else {
|
||||||
|
this.prev()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// swipe right
|
// swipe right
|
||||||
if (direction < 0) {
|
if (direction < 0) {
|
||||||
this.next()
|
if (isRTL) {
|
||||||
|
this.prev()
|
||||||
|
} else {
|
||||||
|
this.next()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,10 +348,18 @@ class Carousel extends BaseComponent {
|
||||||
|
|
||||||
if (event.key === ARROW_LEFT_KEY) {
|
if (event.key === ARROW_LEFT_KEY) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
this.prev()
|
if (isRTL) {
|
||||||
|
this.next()
|
||||||
|
} else {
|
||||||
|
this.prev()
|
||||||
|
}
|
||||||
} else if (event.key === ARROW_RIGHT_KEY) {
|
} else if (event.key === ARROW_RIGHT_KEY) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
this.next()
|
if (isRTL) {
|
||||||
|
this.prev()
|
||||||
|
} else {
|
||||||
|
this.next()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -371,7 +371,7 @@ class Collapse extends BaseComponent {
|
||||||
|
|
||||||
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
||||||
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
||||||
if (event.target.tagName === 'A') {
|
if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ function bootstrapDelegationHandler(element, selector, fn) {
|
||||||
event.delegateTarget = target
|
event.delegateTarget = target
|
||||||
|
|
||||||
if (handler.oneOff) {
|
if (handler.oneOff) {
|
||||||
|
// eslint-disable-next-line unicorn/consistent-destructuring
|
||||||
EventHandler.off(element, event.type, fn)
|
EventHandler.off(element, event.type, fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ const DefaultType = {
|
||||||
offset: '(number|string|function)',
|
offset: '(number|string|function)',
|
||||||
flip: 'boolean',
|
flip: 'boolean',
|
||||||
boundary: '(string|element)',
|
boundary: '(string|element)',
|
||||||
reference: '(string|element)',
|
reference: '(string|element|object)',
|
||||||
display: 'string',
|
display: 'string',
|
||||||
popperConfig: '(null|object)'
|
popperConfig: '(null|object)'
|
||||||
}
|
}
|
||||||
|
|
@ -172,6 +172,8 @@ class Dropdown extends BaseComponent {
|
||||||
if (typeof this._config.reference.jquery !== 'undefined') {
|
if (typeof this._config.reference.jquery !== 'undefined') {
|
||||||
referenceElement = this._config.reference[0]
|
referenceElement = this._config.reference[0]
|
||||||
}
|
}
|
||||||
|
} else if (typeof this._config.reference === 'object') {
|
||||||
|
referenceElement = this._config.reference
|
||||||
}
|
}
|
||||||
|
|
||||||
this._popper = Popper.createPopper(referenceElement, this._menu, this._getPopperConfig())
|
this._popper = Popper.createPopper(referenceElement, this._menu, this._getPopperConfig())
|
||||||
|
|
@ -257,6 +259,13 @@ class Dropdown extends BaseComponent {
|
||||||
|
|
||||||
typeCheckConfig(NAME, config, this.constructor.DefaultType)
|
typeCheckConfig(NAME, config, this.constructor.DefaultType)
|
||||||
|
|
||||||
|
if (typeof config.reference === 'object' && !isElement(config.reference) &&
|
||||||
|
typeof config.reference.getBoundingClientRect !== 'function'
|
||||||
|
) {
|
||||||
|
// Popper virtual elements require a getBoundingClientRect method
|
||||||
|
throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`)
|
||||||
|
}
|
||||||
|
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -590,7 +590,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
|
||||||
data = new Modal(target, config)
|
data = new Modal(target, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
data.show(this)
|
data.toggle(this)
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ class ScrollSpy extends BaseComponent {
|
||||||
this._activeTarget = null
|
this._activeTarget = null
|
||||||
this._scrollHeight = 0
|
this._scrollHeight = 0
|
||||||
|
|
||||||
EventHandler.on(this._scrollElement, EVENT_SCROLL, event => this._process(event))
|
EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())
|
||||||
|
|
||||||
this.refresh()
|
this.refresh()
|
||||||
this._process()
|
this._process()
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ const DefaultType = {
|
||||||
selector: '(string|boolean)',
|
selector: '(string|boolean)',
|
||||||
placement: '(string|function)',
|
placement: '(string|function)',
|
||||||
container: '(string|element|boolean)',
|
container: '(string|element|boolean)',
|
||||||
fallbackPlacements: '(null|array)',
|
fallbackPlacements: 'array',
|
||||||
boundary: '(string|element)',
|
boundary: '(string|element)',
|
||||||
customClass: '(string|function)',
|
customClass: '(string|function)',
|
||||||
sanitize: 'boolean',
|
sanitize: 'boolean',
|
||||||
|
|
@ -81,7 +81,7 @@ const Default = {
|
||||||
selector: false,
|
selector: false,
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
container: false,
|
container: false,
|
||||||
fallbackPlacements: null,
|
fallbackPlacements: ['top', 'right', 'bottom', 'left'],
|
||||||
boundary: 'clippingParents',
|
boundary: 'clippingParents',
|
||||||
customClass: '',
|
customClass: '',
|
||||||
sanitize: true,
|
sanitize: true,
|
||||||
|
|
@ -466,22 +466,16 @@ class Tooltip extends BaseComponent {
|
||||||
// Private
|
// Private
|
||||||
|
|
||||||
_getPopperConfig(attachment) {
|
_getPopperConfig(attachment) {
|
||||||
const flipModifier = {
|
|
||||||
name: 'flip',
|
|
||||||
options: {
|
|
||||||
altBoundary: true,
|
|
||||||
fallbackPlacements: ['top', 'right', 'bottom', 'left']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.config.fallbackPlacements) {
|
|
||||||
flipModifier.options.fallbackPlacements = this.config.fallbackPlacements
|
|
||||||
}
|
|
||||||
|
|
||||||
const defaultBsConfig = {
|
const defaultBsConfig = {
|
||||||
placement: attachment,
|
placement: attachment,
|
||||||
modifiers: [
|
modifiers: [
|
||||||
flipModifier,
|
{
|
||||||
|
name: 'flip',
|
||||||
|
options: {
|
||||||
|
altBoundary: true,
|
||||||
|
fallbackPlacements: this.config.fallbackPlacements
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'preventOverflow',
|
name: 'preventOverflow',
|
||||||
options: {
|
options: {
|
||||||
|
|
|
||||||
|
|
@ -111,15 +111,14 @@ const typeCheckConfig = (componentName, config, configTypes) => {
|
||||||
Object.keys(configTypes).forEach(property => {
|
Object.keys(configTypes).forEach(property => {
|
||||||
const expectedTypes = configTypes[property]
|
const expectedTypes = configTypes[property]
|
||||||
const value = config[property]
|
const value = config[property]
|
||||||
const valueType = value && isElement(value) ?
|
const valueType = value && isElement(value) ? 'element' : toType(value)
|
||||||
'element' :
|
|
||||||
toType(value)
|
|
||||||
|
|
||||||
if (!new RegExp(expectedTypes).test(valueType)) {
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
||||||
throw new Error(
|
throw new TypeError(
|
||||||
`${componentName.toUpperCase()}: ` +
|
`${componentName.toUpperCase()}: ` +
|
||||||
`Option "${property}" provided type "${valueType}" ` +
|
`Option "${property}" provided type "${valueType}" ` +
|
||||||
`but expected type "${expectedTypes}".`)
|
`but expected type "${expectedTypes}".`
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
|
||||||
|
|
||||||
if (allowedAttributeList.includes(attrName)) {
|
if (allowedAttributeList.includes(attrName)) {
|
||||||
if (uriAttrs.has(attrName)) {
|
if (uriAttrs.has(attrName)) {
|
||||||
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
|
return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
@ -47,7 +47,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
|
||||||
|
|
||||||
// Check if a regular expression validates the attribute.
|
// Check if a regular expression validates the attribute.
|
||||||
for (let i = 0, len = regExp.length; i < len; i++) {
|
for (let i = 0, len = regExp.length; i < len; i++) {
|
||||||
if (attrName.match(regExp[i])) {
|
if (regExp[i].test(attrName)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,21 +5,21 @@ const browsers = {
|
||||||
safariMac: {
|
safariMac: {
|
||||||
base: 'BrowserStack',
|
base: 'BrowserStack',
|
||||||
os: 'OS X',
|
os: 'OS X',
|
||||||
os_version: 'High Sierra',
|
os_version: 'Catalina',
|
||||||
browser: 'Safari',
|
browser: 'Safari',
|
||||||
browser_version: 'latest'
|
browser_version: 'latest'
|
||||||
},
|
},
|
||||||
chromeMac: {
|
chromeMac: {
|
||||||
base: 'BrowserStack',
|
base: 'BrowserStack',
|
||||||
os: 'OS X',
|
os: 'OS X',
|
||||||
os_version: 'High Sierra',
|
os_version: 'Catalina',
|
||||||
browser: 'Chrome',
|
browser: 'Chrome',
|
||||||
browser_version: 'latest'
|
browser_version: 'latest'
|
||||||
},
|
},
|
||||||
firefoxMac: {
|
firefoxMac: {
|
||||||
base: 'BrowserStack',
|
base: 'BrowserStack',
|
||||||
os: 'OS X',
|
os: 'OS X',
|
||||||
os_version: 'High Sierra',
|
os_version: 'Catalina',
|
||||||
browser: 'Firefox',
|
browser: 'Firefox',
|
||||||
browser_version: 'latest'
|
browser_version: 'latest'
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
/* eslint-env node */
|
/* eslint-env node */
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const ip = require('ip')
|
const ip = require('ip')
|
||||||
const { babel } = require('@rollup/plugin-babel')
|
const { babel } = require('@rollup/plugin-babel')
|
||||||
|
|
@ -12,10 +14,11 @@ const {
|
||||||
browsersKeys
|
browsersKeys
|
||||||
} = require('./browsers')
|
} = require('./browsers')
|
||||||
|
|
||||||
const { env } = process
|
const ENV = process.env
|
||||||
const browserStack = env.BROWSER === 'true'
|
const BROWSERSTACK = Boolean(ENV.BROWSERSTACK)
|
||||||
const debug = env.DEBUG === 'true'
|
const DEBUG = Boolean(ENV.DEBUG)
|
||||||
const jQueryTest = env.JQUERY === 'true'
|
const JQUERY_TEST = Boolean(ENV.JQUERY)
|
||||||
|
|
||||||
const frameworks = [
|
const frameworks = [
|
||||||
'jasmine'
|
'jasmine'
|
||||||
]
|
]
|
||||||
|
|
@ -30,16 +33,16 @@ const reporters = ['dots']
|
||||||
const detectBrowsers = {
|
const detectBrowsers = {
|
||||||
usePhantomJS: false,
|
usePhantomJS: false,
|
||||||
postDetection(availableBrowser) {
|
postDetection(availableBrowser) {
|
||||||
if (env.CI === true || availableBrowser.includes('Chrome')) {
|
if (ENV.CI === true || availableBrowser.includes('Chrome')) {
|
||||||
return debug ? ['Chrome'] : ['ChromeHeadless']
|
return DEBUG ? ['Chrome'] : ['ChromeHeadless']
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availableBrowser.includes('Chromium')) {
|
if (availableBrowser.includes('Chromium')) {
|
||||||
return debug ? ['Chromium'] : ['ChromiumHeadless']
|
return DEBUG ? ['Chromium'] : ['ChromiumHeadless']
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availableBrowser.includes('Firefox')) {
|
if (availableBrowser.includes('Firefox')) {
|
||||||
return debug ? ['Firefox'] : ['FirefoxHeadless']
|
return DEBUG ? ['Firefox'] : ['FirefoxHeadless']
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('Please install Chrome, Chromium or Firefox')
|
throw new Error('Please install Chrome, Chromium or Firefox')
|
||||||
|
|
@ -59,7 +62,7 @@ const conf = {
|
||||||
colors: true,
|
colors: true,
|
||||||
autoWatch: false,
|
autoWatch: false,
|
||||||
singleRun: true,
|
singleRun: true,
|
||||||
concurrency: Infinity,
|
concurrency: Number.POSITIVE_INFINITY,
|
||||||
client: {
|
client: {
|
||||||
clearContext: false
|
clearContext: false
|
||||||
},
|
},
|
||||||
|
|
@ -67,7 +70,7 @@ const conf = {
|
||||||
'node_modules/hammer-simulator/index.js',
|
'node_modules/hammer-simulator/index.js',
|
||||||
{
|
{
|
||||||
pattern: 'js/tests/unit/**/!(jquery).spec.js',
|
pattern: 'js/tests/unit/**/!(jquery).spec.js',
|
||||||
watched: !browserStack
|
watched: !BROWSERSTACK
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
preprocessors: {
|
preprocessors: {
|
||||||
|
|
@ -101,11 +104,11 @@ const conf = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (browserStack) {
|
if (BROWSERSTACK) {
|
||||||
conf.hostname = ip.address()
|
conf.hostname = ip.address()
|
||||||
conf.browserStack = {
|
conf.browserStack = {
|
||||||
username: env.BROWSER_STACK_USERNAME,
|
username: ENV.BROWSER_STACK_USERNAME,
|
||||||
accessKey: env.BROWSER_STACK_ACCESS_KEY,
|
accessKey: ENV.BROWSER_STACK_ACCESS_KEY,
|
||||||
build: `bootstrap-${new Date().toISOString()}`,
|
build: `bootstrap-${new Date().toISOString()}`,
|
||||||
project: 'Bootstrap',
|
project: 'Bootstrap',
|
||||||
retryLimit: 2
|
retryLimit: 2
|
||||||
|
|
@ -114,7 +117,7 @@ if (browserStack) {
|
||||||
conf.customLaunchers = browsers
|
conf.customLaunchers = browsers
|
||||||
conf.browsers = browsersKeys
|
conf.browsers = browsersKeys
|
||||||
reporters.push('BrowserStack', 'kjhtml')
|
reporters.push('BrowserStack', 'kjhtml')
|
||||||
} else if (jQueryTest) {
|
} else if (JQUERY_TEST) {
|
||||||
frameworks.push('detectBrowsers')
|
frameworks.push('detectBrowsers')
|
||||||
plugins.push(
|
plugins.push(
|
||||||
'karma-chrome-launcher',
|
'karma-chrome-launcher',
|
||||||
|
|
@ -155,7 +158,7 @@ if (browserStack) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug) {
|
if (DEBUG) {
|
||||||
conf.hostname = ip.address()
|
conf.hostname = ip.address()
|
||||||
plugins.push('karma-jasmine-html-reporter')
|
plugins.push('karma-jasmine-html-reporter')
|
||||||
reporters.push('kjhtml')
|
reporters.push('kjhtml')
|
||||||
|
|
@ -169,7 +172,6 @@ conf.plugins = plugins
|
||||||
conf.reporters = reporters
|
conf.reporters = reporters
|
||||||
|
|
||||||
module.exports = karmaConfig => {
|
module.exports = karmaConfig => {
|
||||||
// possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
|
conf.logLevel = karmaConfig.LOG_ERROR
|
||||||
conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
|
|
||||||
karmaConfig.set(conf)
|
karmaConfig.set(conf)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -905,7 +905,7 @@ describe('Carousel', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('to', () => {
|
describe('to', () => {
|
||||||
it('should go directement to the provided index', done => {
|
it('should go directly to the provided index', done => {
|
||||||
fixtureEl.innerHTML = [
|
fixtureEl.innerHTML = [
|
||||||
'<div id="myCarousel" class="carousel slide">',
|
'<div id="myCarousel" class="carousel slide">',
|
||||||
' <div class="carousel-inner">',
|
' <div class="carousel-inner">',
|
||||||
|
|
@ -1136,11 +1136,9 @@ describe('Carousel', () => {
|
||||||
jQueryMock.fn.carousel = Carousel.jQueryInterface
|
jQueryMock.fn.carousel = Carousel.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.carousel.call(jQueryMock, action)
|
jQueryMock.fn.carousel.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -374,6 +374,29 @@ describe('Collapse', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('data-api', () => {
|
describe('data-api', () => {
|
||||||
|
it('should prevent url change if click on nested elements', done => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a role="button" data-bs-toggle="collapse" class="collapsed" href="#collapse">',
|
||||||
|
' <span id="nested"></span>',
|
||||||
|
'</a>',
|
||||||
|
'<div id="collapse" class="collapse"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const triggerEl = fixtureEl.querySelector('a')
|
||||||
|
const nestedTriggerEl = fixtureEl.querySelector('#nested')
|
||||||
|
|
||||||
|
spyOn(Event.prototype, 'preventDefault').and.callThrough()
|
||||||
|
|
||||||
|
triggerEl.addEventListener('click', event => {
|
||||||
|
expect(event.target.isEqualNode(nestedTriggerEl)).toEqual(true)
|
||||||
|
expect(event.delegateTarget.isEqualNode(triggerEl)).toEqual(true)
|
||||||
|
expect(Event.prototype.preventDefault).toHaveBeenCalled()
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
|
||||||
|
nestedTriggerEl.click()
|
||||||
|
})
|
||||||
|
|
||||||
it('should show multiple collapsed elements', done => {
|
it('should show multiple collapsed elements', done => {
|
||||||
fixtureEl.innerHTML = [
|
fixtureEl.innerHTML = [
|
||||||
'<a role="button" data-bs-toggle="collapse" class="collapsed" href=".multi"></a>',
|
'<a role="button" data-bs-toggle="collapse" class="collapsed" href=".multi"></a>',
|
||||||
|
|
@ -796,11 +819,9 @@ describe('Collapse', () => {
|
||||||
jQueryMock.fn.collapse = Collapse.jQueryInterface
|
jQueryMock.fn.collapse = Collapse.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.collapse.call(jQueryMock, action)
|
jQueryMock.fn.collapse.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -367,6 +367,58 @@ describe('Dropdown', () => {
|
||||||
dropdown.toggle()
|
dropdown.toggle()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should toggle a dropdown with a valid virtual element reference', done => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<div class="dropdown">',
|
||||||
|
' <button class="btn dropdown-toggle visually-hidden" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>',
|
||||||
|
' <div class="dropdown-menu">',
|
||||||
|
' <a class="dropdown-item" href="#">Secondary link</a>',
|
||||||
|
' </div>',
|
||||||
|
'</div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
|
||||||
|
const virtualElement = {
|
||||||
|
getBoundingClientRect() {
|
||||||
|
return {
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
left: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(() => new Dropdown(btnDropdown, {
|
||||||
|
reference: {}
|
||||||
|
})).toThrowError(TypeError, 'DROPDOWN: Option "reference" provided type "object" without a required "getBoundingClientRect" method.')
|
||||||
|
|
||||||
|
expect(() => new Dropdown(btnDropdown, {
|
||||||
|
reference: {
|
||||||
|
getBoundingClientRect: 'not-a-function'
|
||||||
|
}
|
||||||
|
})).toThrowError(TypeError, 'DROPDOWN: Option "reference" provided type "object" without a required "getBoundingClientRect" method.')
|
||||||
|
|
||||||
|
// use onFirstUpdate as Poppers internal update is executed async
|
||||||
|
const dropdown = new Dropdown(btnDropdown, {
|
||||||
|
reference: virtualElement,
|
||||||
|
popperConfig: {
|
||||||
|
onFirstUpdate() {
|
||||||
|
expect(virtualElement.getBoundingClientRect).toHaveBeenCalled()
|
||||||
|
expect(btnDropdown.classList.contains('show')).toEqual(true)
|
||||||
|
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
spyOn(virtualElement, 'getBoundingClientRect').and.callThrough()
|
||||||
|
|
||||||
|
dropdown.toggle()
|
||||||
|
})
|
||||||
|
|
||||||
it('should not toggle a dropdown if the element is disabled', done => {
|
it('should not toggle a dropdown if the element is disabled', done => {
|
||||||
fixtureEl.innerHTML = [
|
fixtureEl.innerHTML = [
|
||||||
'<div class="dropdown">',
|
'<div class="dropdown">',
|
||||||
|
|
@ -1505,11 +1557,9 @@ describe('Dropdown', () => {
|
||||||
jQueryMock.fn.dropdown = Dropdown.jQueryInterface
|
jQueryMock.fn.dropdown = Dropdown.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.dropdown.call(jQueryMock, action)
|
jQueryMock.fn.dropdown.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,6 @@ describe('jQuery', () => {
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
|
|
||||||
$(fixtureEl).find('button').click()
|
$(fixtureEl).find('button').trigger('click')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -870,7 +870,7 @@ describe('Modal', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('data-api', () => {
|
describe('data-api', () => {
|
||||||
it('should open modal', done => {
|
it('should toggle modal', done => {
|
||||||
fixtureEl.innerHTML = [
|
fixtureEl.innerHTML = [
|
||||||
'<button type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"></button>',
|
'<button type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"></button>',
|
||||||
'<div id="exampleModal" class="modal"><div class="modal-dialog"></div></div>'
|
'<div id="exampleModal" class="modal"><div class="modal-dialog"></div></div>'
|
||||||
|
|
@ -885,6 +885,15 @@ describe('Modal', () => {
|
||||||
expect(modalEl.getAttribute('aria-hidden')).toEqual(null)
|
expect(modalEl.getAttribute('aria-hidden')).toEqual(null)
|
||||||
expect(modalEl.style.display).toEqual('block')
|
expect(modalEl.style.display).toEqual('block')
|
||||||
expect(document.querySelector('.modal-backdrop')).toBeDefined()
|
expect(document.querySelector('.modal-backdrop')).toBeDefined()
|
||||||
|
setTimeout(() => trigger.click(), 10)
|
||||||
|
})
|
||||||
|
|
||||||
|
modalEl.addEventListener('hidden.bs.modal', () => {
|
||||||
|
expect(modalEl.getAttribute('aria-modal')).toEqual(null)
|
||||||
|
expect(modalEl.getAttribute('role')).toEqual(null)
|
||||||
|
expect(modalEl.getAttribute('aria-hidden')).toEqual('true')
|
||||||
|
expect(modalEl.style.display).toEqual('none')
|
||||||
|
expect(document.querySelector('.modal-backdrop')).toEqual(null)
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1061,11 +1070,9 @@ describe('Modal', () => {
|
||||||
jQueryMock.fn.modal = Modal.jQueryInterface
|
jQueryMock.fn.modal = Modal.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.modal.call(jQueryMock, action)
|
jQueryMock.fn.modal.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should call show method', () => {
|
it('should call show method', () => {
|
||||||
|
|
|
||||||
|
|
@ -206,11 +206,9 @@ describe('Popover', () => {
|
||||||
jQueryMock.fn.popover = Popover.jQueryInterface
|
jQueryMock.fn.popover = Popover.jQueryInterface
|
||||||
jQueryMock.elements = [popoverEl]
|
jQueryMock.elements = [popoverEl]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.popover.call(jQueryMock, action)
|
jQueryMock.fn.popover.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should should call show method', () => {
|
it('should should call show method', () => {
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ describe('ScrollSpy', () => {
|
||||||
fixtureEl.innerHTML = [
|
fixtureEl.innerHTML = [
|
||||||
'<nav id="navigation" class="navbar">',
|
'<nav id="navigation" class="navbar">',
|
||||||
' <ul class="navbar-nav">',
|
' <ul class="navbar-nav">',
|
||||||
' <li class="nav-item active"><a class="nav-link" id="one-link" href="#">One</a></li>',
|
' <li class="nav-item"><a class="nav-link active" id="one-link" href="#">One</a></li>',
|
||||||
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
|
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
|
||||||
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
|
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
|
||||||
' </ul>',
|
' </ul>',
|
||||||
|
|
@ -177,7 +177,7 @@ describe('ScrollSpy', () => {
|
||||||
'<div id="header" style="height: 500px;"></div>',
|
'<div id="header" style="height: 500px;"></div>',
|
||||||
'<nav id="navigation" class="navbar">',
|
'<nav id="navigation" class="navbar">',
|
||||||
' <ul class="navbar-nav">',
|
' <ul class="navbar-nav">',
|
||||||
' <li class="nav-item active"><a class="nav-link" id="one-link" href="#one">One</a></li>',
|
' <li class="nav-item"><a class="nav-link active" id="one-link" href="#one">One</a></li>',
|
||||||
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
|
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
|
||||||
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
|
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
|
||||||
' </ul>',
|
' </ul>',
|
||||||
|
|
@ -625,11 +625,9 @@ describe('ScrollSpy', () => {
|
||||||
jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface
|
jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.scrollspy.call(jQueryMock, action)
|
jQueryMock.fn.scrollspy.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -397,11 +397,9 @@ describe('Tab', () => {
|
||||||
jQueryMock.fn.tab = Tab.jQueryInterface
|
jQueryMock.fn.tab = Tab.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.tab.call(jQueryMock, action)
|
jQueryMock.fn.tab.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -368,11 +368,9 @@ describe('Toast', () => {
|
||||||
jQueryMock.fn.toast = Toast.jQueryInterface
|
jQueryMock.fn.toast = Toast.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.toast.call(jQueryMock, action)
|
jQueryMock.fn.toast.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -286,7 +286,7 @@ describe('Tooltip', () => {
|
||||||
expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
|
expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should destroy a tooltip after it is shown and hidden', () => {
|
it('should destroy a tooltip after it is shown and hidden', done => {
|
||||||
fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">'
|
fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">'
|
||||||
|
|
||||||
const tooltipEl = fixtureEl.querySelector('a')
|
const tooltipEl = fixtureEl.querySelector('a')
|
||||||
|
|
@ -299,6 +299,7 @@ describe('Tooltip', () => {
|
||||||
tooltip.dispose()
|
tooltip.dispose()
|
||||||
expect(tooltip.tip).toEqual(null)
|
expect(tooltip.tip).toEqual(null)
|
||||||
expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
|
expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
|
||||||
|
done()
|
||||||
})
|
})
|
||||||
|
|
||||||
tooltip.show()
|
tooltip.show()
|
||||||
|
|
@ -1206,11 +1207,9 @@ describe('Tooltip', () => {
|
||||||
jQueryMock.fn.tooltip = Tooltip.jQueryInterface
|
jQueryMock.fn.tooltip = Tooltip.jQueryInterface
|
||||||
jQueryMock.elements = [div]
|
jQueryMock.elements = [div]
|
||||||
|
|
||||||
try {
|
expect(() => {
|
||||||
jQueryMock.fn.tooltip.call(jQueryMock, action)
|
jQueryMock.fn.tooltip.call(jQueryMock, action)
|
||||||
} catch (error) {
|
}).toThrowError(TypeError, `No method named "${action}"`)
|
||||||
expect(error.message).toEqual(`No method named "${action}"`)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ describe('Util', () => {
|
||||||
|
|
||||||
expect(() => {
|
expect(() => {
|
||||||
Util.typeCheckConfig(namePlugin, config, defaultType)
|
Util.typeCheckConfig(namePlugin, config, defaultType)
|
||||||
}).toThrow(new Error('COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".'))
|
}).toThrowError(TypeError, 'COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should return null stringified when null is passed', () => {
|
it('should return null stringified when null is passed', () => {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="navbarResponsive">
|
<div class="collapse navbar-collapse" id="navbarResponsive">
|
||||||
<ul class="navbar-nav">
|
<ul class="navbar-nav">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" aria-current="page">Home</a>
|
<a class="nav-link active" href="#" aria-current="page">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">Link</a>
|
<a class="nav-link" href="#">Link</a>
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@
|
||||||
<div class="collapse navbar-expand-md" id="navbarResponsive">
|
<div class="collapse navbar-expand-md" id="navbarResponsive">
|
||||||
<a class="navbar-brand" href="#">This shouldn't jump!</a>
|
<a class="navbar-brand" href="#">This shouldn't jump!</a>
|
||||||
<ul class="navbar-nav">
|
<ul class="navbar-nav">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" aria-current="page">Home</a>
|
<a class="nav-link active" href="#" aria-current="page">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">Link</a>
|
<a class="nav-link" href="#">Link</a>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>bootstrap</id>
|
<id>bootstrap</id>
|
||||||
<!-- pulled from package.json -->
|
<!-- pulled from package.json -->
|
||||||
<version>4</version>
|
<version>5</version>
|
||||||
<title>Bootstrap CSS</title>
|
<title>Bootstrap CSS</title>
|
||||||
<authors>The Bootstrap Authors, Twitter Inc.</authors>
|
<authors>The Bootstrap Authors, Twitter Inc.</authors>
|
||||||
<owners>bootstrap</owners>
|
<owners>bootstrap</owners>
|
||||||
|
|
@ -14,11 +14,8 @@
|
||||||
<projectUrl>https://getbootstrap.com/</projectUrl>
|
<projectUrl>https://getbootstrap.com/</projectUrl>
|
||||||
<icon>bootstrap.png</icon>
|
<icon>bootstrap.png</icon>
|
||||||
<license type="file">LICENSE.txt</license>
|
<license type="file">LICENSE.txt</license>
|
||||||
<copyright>Copyright 2017-2020</copyright>
|
<copyright>Copyright 2017-2021</copyright>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<dependencies>
|
|
||||||
<dependency id="@popperjs/core" version="[2.5.4,3)" />
|
|
||||||
</dependencies>
|
|
||||||
<tags>css mobile-first responsive front-end framework web</tags>
|
<tags>css mobile-first responsive front-end framework web</tags>
|
||||||
<contentFiles>
|
<contentFiles>
|
||||||
<files include="**/*" buildAction="Content" />
|
<files include="**/*" buildAction="Content" />
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>bootstrap.sass</id>
|
<id>bootstrap.sass</id>
|
||||||
<!-- pulled from package.json -->
|
<!-- pulled from package.json -->
|
||||||
<version>4</version>
|
<version>5</version>
|
||||||
<title>Bootstrap Sass</title>
|
<title>Bootstrap Sass</title>
|
||||||
<authors>The Bootstrap Authors, Twitter Inc.</authors>
|
<authors>The Bootstrap Authors, Twitter Inc.</authors>
|
||||||
<owners>bootstrap</owners>
|
<owners>bootstrap</owners>
|
||||||
|
|
@ -14,11 +14,8 @@
|
||||||
<projectUrl>https://getbootstrap.com/</projectUrl>
|
<projectUrl>https://getbootstrap.com/</projectUrl>
|
||||||
<icon>bootstrap.png</icon>
|
<icon>bootstrap.png</icon>
|
||||||
<license type="file">LICENSE.txt</license>
|
<license type="file">LICENSE.txt</license>
|
||||||
<copyright>Copyright 2017-2020</copyright>
|
<copyright>Copyright 2017-2021</copyright>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<dependencies>
|
|
||||||
<dependency id="@popperjs/core" version="[2.5.4,3)" />
|
|
||||||
</dependencies>
|
|
||||||
<tags>css sass mobile-first responsive front-end framework web</tags>
|
<tags>css sass mobile-first responsive front-end framework web</tags>
|
||||||
<contentFiles>
|
<contentFiles>
|
||||||
<files include="**/*" buildAction="Content" />
|
<files include="**/*" buildAction="Content" />
|
||||||
|
|
|
||||||
2256
package-lock.json
generated
2256
package-lock.json
generated
File diff suppressed because it is too large
Load diff
48
package.json
48
package.json
|
|
@ -2,7 +2,9 @@
|
||||||
"name": "bootstrap",
|
"name": "bootstrap",
|
||||||
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
|
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
|
||||||
"version": "5.0.0-beta1",
|
"version": "5.0.0-beta1",
|
||||||
"version_short": "5.0",
|
"config": {
|
||||||
|
"version_short": "5.0"
|
||||||
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"css",
|
"css",
|
||||||
"sass",
|
"sass",
|
||||||
|
|
@ -32,7 +34,7 @@
|
||||||
"css-prefix": "npm-run-all --parallel css-prefix-*",
|
"css-prefix": "npm-run-all --parallel css-prefix-*",
|
||||||
"css-prefix-main": "postcss --config build/postcss.config.js --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
|
"css-prefix-main": "postcss --config build/postcss.config.js --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
|
||||||
"css-prefix-examples": "postcss --config build/postcss.config.js --replace \"site/content/**/*.css\"",
|
"css-prefix-examples": "postcss --config build/postcss.config.js --replace \"site/content/**/*.css\"",
|
||||||
"css-prefix-examples-rtl": "cross-env-shell NODE_ENV=RTL postcss --config build/postcss.config.js --dir \"site/content/docs/$npm_package_version_short/examples/\" --ext \".rtl.css\" --base \"site/content/docs/$npm_package_version_short/examples/\" \"site/content/docs/$npm_package_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.css\" \"!site/content/docs/$npm_package_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.rtl.css\"",
|
"css-prefix-examples-rtl": "cross-env-shell NODE_ENV=RTL postcss --config build/postcss.config.js --dir \"site/content/docs/$npm_package_config_version_short/examples/\" --ext \".rtl.css\" --base \"site/content/docs/$npm_package_config_version_short/examples/\" \"site/content/docs/$npm_package_config_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.css\" \"!site/content/docs/$npm_package_config_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.rtl.css\"",
|
||||||
"js": "npm-run-all js-compile js-minify",
|
"js": "npm-run-all js-compile js-minify",
|
||||||
"js-compile": "npm-run-all --parallel js-compile-*",
|
"js-compile": "npm-run-all --parallel js-compile-*",
|
||||||
"js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js --sourcemap",
|
"js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js --sourcemap",
|
||||||
|
|
@ -49,7 +51,7 @@
|
||||||
"js-test-karma": "karma start js/tests/karma.conf.js",
|
"js-test-karma": "karma start js/tests/karma.conf.js",
|
||||||
"js-test-integration-bundle": "rollup --config js/tests/integration/rollup.bundle.js",
|
"js-test-integration-bundle": "rollup --config js/tests/integration/rollup.bundle.js",
|
||||||
"js-test-integration-modularity": "rollup --config js/tests/integration/rollup.bundle-modularity.js",
|
"js-test-integration-modularity": "rollup --config js/tests/integration/rollup.bundle-modularity.js",
|
||||||
"js-test-cloud": "cross-env BROWSER=true npm run js-test-karma",
|
"js-test-cloud": "cross-env BROWSERSTACK=true npm run js-test-karma",
|
||||||
"js-test-jquery": "cross-env JQUERY=true npm run js-test-karma",
|
"js-test-jquery": "cross-env JQUERY=true npm run js-test-karma",
|
||||||
"lint": "npm-run-all --parallel js-lint css-lint lockfile-lint",
|
"lint": "npm-run-all --parallel js-lint css-lint lockfile-lint",
|
||||||
"docs": "npm-run-all docs-build docs-lint",
|
"docs": "npm-run-all docs-build docs-lint",
|
||||||
|
|
@ -95,32 +97,32 @@
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@popperjs/core": "^2.5.4"
|
"@popperjs/core": "^2.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.12.10",
|
"@babel/cli": "^7.12.10",
|
||||||
"@babel/core": "^7.12.10",
|
"@babel/core": "^7.12.10",
|
||||||
"@babel/preset-env": "^7.12.10",
|
"@babel/preset-env": "^7.12.11",
|
||||||
"@popperjs/core": "^2.5.4",
|
"@popperjs/core": "^2.6.0",
|
||||||
"@rollup/plugin-babel": "^5.2.2",
|
"@rollup/plugin-babel": "^5.2.2",
|
||||||
"@rollup/plugin-commonjs": "^17.0.0",
|
"@rollup/plugin-commonjs": "^17.0.0",
|
||||||
"@rollup/plugin-node-resolve": "^11.0.0",
|
"@rollup/plugin-node-resolve": "^11.0.1",
|
||||||
"@rollup/plugin-replace": "^2.3.4",
|
"@rollup/plugin-replace": "^2.3.4",
|
||||||
"autoprefixer": "^10.1.0",
|
"autoprefixer": "^10.2.1",
|
||||||
"bundlewatch": "^0.3.1",
|
"bundlewatch": "^0.3.1",
|
||||||
"clean-css-cli": "^4.3.0",
|
"clean-css-cli": "^4.3.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"eslint": "^7.15.0",
|
"eslint": "^7.17.0",
|
||||||
"eslint-config-xo": "^0.33.1",
|
"eslint-config-xo": "^0.34.0",
|
||||||
"eslint-plugin-import": "^2.22.1",
|
"eslint-plugin-import": "^2.22.1",
|
||||||
"eslint-plugin-unicorn": "^23.0.0",
|
"eslint-plugin-unicorn": "^26.0.1",
|
||||||
"find-unused-sass-variables": "^3.0.0",
|
"find-unused-sass-variables": "^3.1.0",
|
||||||
"glob": "^7.1.6",
|
"glob": "^7.1.6",
|
||||||
"hammer-simulator": "0.0.1",
|
"hammer-simulator": "0.0.1",
|
||||||
"hugo-bin": "^0.67.0",
|
"hugo-bin": "^0.68.0",
|
||||||
"ip": "^1.1.5",
|
"ip": "^1.1.5",
|
||||||
"jquery": "^3.5.1",
|
"jquery": "^3.5.1",
|
||||||
"karma": "^5.2.3",
|
"karma": "^6.0.0",
|
||||||
"karma-browserstack-launcher": "1.4.0",
|
"karma-browserstack-launcher": "1.4.0",
|
||||||
"karma-chrome-launcher": "^3.1.0",
|
"karma-chrome-launcher": "^3.1.0",
|
||||||
"karma-coverage-istanbul-reporter": "^3.0.3",
|
"karma-coverage-istanbul-reporter": "^3.0.3",
|
||||||
|
|
@ -129,16 +131,16 @@
|
||||||
"karma-jasmine": "^4.0.1",
|
"karma-jasmine": "^4.0.1",
|
||||||
"karma-jasmine-html-reporter": "^1.5.4",
|
"karma-jasmine-html-reporter": "^1.5.4",
|
||||||
"karma-rollup-preprocessor": "^7.0.5",
|
"karma-rollup-preprocessor": "^7.0.5",
|
||||||
"linkinator": "^2.8.0",
|
"linkinator": "^2.11.2",
|
||||||
"lockfile-lint": "^4.3.7",
|
"lockfile-lint": "^4.3.7",
|
||||||
"nodemon": "^2.0.6",
|
"nodemon": "^2.0.7",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"postcss": "^8.2.1",
|
"postcss": "^8.2.4",
|
||||||
"postcss-cli": "^8.3.0",
|
"postcss-cli": "^8.3.1",
|
||||||
"rollup": "^2.34.2",
|
"rollup": "^2.36.1",
|
||||||
"rollup-plugin-istanbul": "^2.0.1",
|
"rollup-plugin-istanbul": "^3.0.0",
|
||||||
"rtlcss": "^2.6.2",
|
"rtlcss": "^3.0.0",
|
||||||
"sass": "^1.30.0",
|
"sass": "^1.32.4",
|
||||||
"shelljs": "^0.8.4",
|
"shelljs": "^0.8.4",
|
||||||
"stylelint": "^13.8.0",
|
"stylelint": "^13.8.0",
|
||||||
"stylelint-config-twbs-bootstrap": "^2.1.0",
|
"stylelint-config-twbs-bootstrap": "^2.1.0",
|
||||||
|
|
@ -168,7 +170,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@popperjs/core": "^2.5.4"
|
"@popperjs/core": "^2.6.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,14 +44,14 @@
|
||||||
// Generate contextual modifier classes for colorizing the alert.
|
// Generate contextual modifier classes for colorizing the alert.
|
||||||
|
|
||||||
@each $state, $value in $theme-colors {
|
@each $state, $value in $theme-colors {
|
||||||
$background: shift-color($value, $alert-bg-scale);
|
$alert-background: shift-color($value, $alert-bg-scale);
|
||||||
$border: shift-color($value, $alert-border-scale);
|
$alert-border: shift-color($value, $alert-border-scale);
|
||||||
$color: shift-color($value, $alert-color-scale);
|
$alert-color: shift-color($value, $alert-color-scale);
|
||||||
@if (contrast-ratio($background, $color) < $min-contrast-ratio) {
|
@if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
|
||||||
$color: mix($value, color-contrast($background), abs($alert-color-scale));
|
$alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
|
||||||
}
|
}
|
||||||
.alert-#{$state} {
|
.alert-#{$state} {
|
||||||
@include alert-variant($background, $border, $color);
|
@include alert-variant($alert-background, $alert-border, $alert-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// scss-docs-end alert-modifiers
|
// scss-docs-end alert-modifiers
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: none;
|
outline: 0;
|
||||||
box-shadow: $btn-close-focus-shadow;
|
box-shadow: $btn-close-focus-shadow;
|
||||||
opacity: $btn-close-focus-opacity;
|
opacity: $btn-close-focus-opacity;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -152,12 +152,12 @@
|
||||||
// Organizationally, this must come after the `:hover` states.
|
// Organizationally, this must come after the `:hover` states.
|
||||||
|
|
||||||
@each $state, $value in $theme-colors {
|
@each $state, $value in $theme-colors {
|
||||||
$background: shift-color($value, $list-group-item-bg-scale);
|
$list-group-background: shift-color($value, $list-group-item-bg-scale);
|
||||||
$color: shift-color($value, $list-group-item-color-scale);
|
$list-group-color: shift-color($value, $list-group-item-color-scale);
|
||||||
@if (contrast-ratio($background, $color) < $min-contrast-ratio) {
|
@if (contrast-ratio($list-group-background, $list-group-color) < $min-contrast-ratio) {
|
||||||
$color: mix($value, color-contrast($background), abs($alert-color-scale));
|
$list-group-color: mix($value, color-contrast($list-group-background), abs($alert-color-scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
@include list-group-item-variant($state, $background, $color);
|
@include list-group-item-variant($state, $list-group-background, $list-group-color);
|
||||||
}
|
}
|
||||||
// scss-docs-end list-group-modifiers
|
// scss-docs-end list-group-modifiers
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,9 @@
|
||||||
@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);
|
@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);
|
||||||
|
|
||||||
.pagination-lg {
|
.pagination-lg {
|
||||||
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $border-radius-lg);
|
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pagination-sm {
|
.pagination-sm {
|
||||||
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $border-radius-sm);
|
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -411,13 +411,13 @@ button {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work around a Firefox bug where the transparent `button` background
|
// Explicitly remove focus outline in Chromium when it shouldn't be
|
||||||
// results in a loss of the default `button` focus styles.
|
// visible (e.g. as result of mouse click or touch tap). It already
|
||||||
// Credit https://github.com/suitcss/base/
|
// should be doing this automatically, but seems to currently be
|
||||||
|
// confused and applies its very visible two-tone outline anyway.
|
||||||
|
|
||||||
button:focus {
|
button:focus:not(:focus-visible) {
|
||||||
outline: dotted 1px;
|
outline: 0;
|
||||||
outline: -webkit-focus-ring-color auto 5px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Remove the margin in Firefox and Safari
|
// 1. Remove the margin in Firefox and Safari
|
||||||
|
|
|
||||||
|
|
@ -47,4 +47,5 @@
|
||||||
|
|
||||||
.toast-body {
|
.toast-body {
|
||||||
padding: $toast-padding-x; // apply to both vertical and horizontal
|
padding: $toast-padding-x; // apply to both vertical and horizontal
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -110,15 +110,7 @@ $utilities: map-merge(
|
||||||
"border-color": (
|
"border-color": (
|
||||||
property: border-color,
|
property: border-color,
|
||||||
class: border,
|
class: border,
|
||||||
values: map-merge(
|
values: map-merge($theme-colors, ("white": $white))
|
||||||
$theme-colors,
|
|
||||||
(
|
|
||||||
"white": $white,
|
|
||||||
"gray-500": $gray-500,
|
|
||||||
"gray-700": $gray-700,
|
|
||||||
"black": $black
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
"border-width": (
|
"border-width": (
|
||||||
property: border-width,
|
property: border-width,
|
||||||
|
|
@ -481,8 +473,6 @@ $utilities: map-merge(
|
||||||
(
|
(
|
||||||
"body": $body-bg,
|
"body": $body-bg,
|
||||||
"white": $white,
|
"white": $white,
|
||||||
"gray": $gray-400,
|
|
||||||
"black": black,
|
|
||||||
"transparent": transparent
|
"transparent": transparent
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -612,6 +612,15 @@ $btn-border-radius-lg: $border-radius-lg !default;
|
||||||
|
|
||||||
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
||||||
|
|
||||||
|
$btn-hover-bg-shade-amount: 15% !default;
|
||||||
|
$btn-hover-bg-tint-amount: 15% !default;
|
||||||
|
$btn-hover-border-shade-amount: 20% !default;
|
||||||
|
$btn-hover-border-tint-amount: 10% !default;
|
||||||
|
$btn-active-bg-shade-amount: 20% !default;
|
||||||
|
$btn-active-bg-tint-amount: 20% !default;
|
||||||
|
$btn-active-border-shade-amount: 25% !default;
|
||||||
|
$btn-active-border-tint-amount: 10% !default;
|
||||||
|
|
||||||
|
|
||||||
// Forms
|
// Forms
|
||||||
|
|
||||||
|
|
@ -735,7 +744,7 @@ $form-select-padding-y: $input-padding-y !default;
|
||||||
$form-select-padding-x: $input-padding-x !default;
|
$form-select-padding-x: $input-padding-x !default;
|
||||||
$form-select-font-family: $input-font-family !default;
|
$form-select-font-family: $input-font-family !default;
|
||||||
$form-select-font-size: $input-font-size !default;
|
$form-select-font-size: $input-font-size !default;
|
||||||
$form-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
|
$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image
|
||||||
$form-select-font-weight: $input-font-weight !default;
|
$form-select-font-weight: $input-font-weight !default;
|
||||||
$form-select-line-height: $input-line-height !default;
|
$form-select-line-height: $input-line-height !default;
|
||||||
$form-select-color: $input-color !default;
|
$form-select-color: $input-color !default;
|
||||||
|
|
@ -748,8 +757,8 @@ $form-select-bg-size: 16px 12px !default; // In pixels because ima
|
||||||
$form-select-indicator-color: $gray-800 !default;
|
$form-select-indicator-color: $gray-800 !default;
|
||||||
$form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>") !default;
|
$form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>") !default;
|
||||||
|
|
||||||
$form-select-feedback-icon-padding-end: add(1em * .75, (2 * $form-select-padding-y * .75) + $form-select-padding-x + $form-select-indicator-padding) !default;
|
$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;
|
||||||
$form-select-feedback-icon-position: center right ($form-select-padding-x + $form-select-indicator-padding) !default;
|
$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;
|
||||||
$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
|
$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
|
||||||
|
|
||||||
$form-select-border-width: $input-border-width !default;
|
$form-select-border-width: $input-border-width !default;
|
||||||
|
|
@ -929,7 +938,7 @@ $dropdown-box-shadow: $box-shadow !default;
|
||||||
|
|
||||||
$dropdown-link-color: $gray-900 !default;
|
$dropdown-link-color: $gray-900 !default;
|
||||||
$dropdown-link-hover-color: shade-color($gray-900, 10%) !default;
|
$dropdown-link-hover-color: shade-color($gray-900, 10%) !default;
|
||||||
$dropdown-link-hover-bg: $gray-100 !default;
|
$dropdown-link-hover-bg: $gray-200 !default;
|
||||||
|
|
||||||
$dropdown-link-active-color: $component-active-color !default;
|
$dropdown-link-active-color: $component-active-color !default;
|
||||||
$dropdown-link-active-bg: $component-active-bg !default;
|
$dropdown-link-active-bg: $component-active-bg !default;
|
||||||
|
|
@ -991,6 +1000,9 @@ $pagination-disabled-border-color: $gray-300 !default;
|
||||||
|
|
||||||
$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
||||||
|
|
||||||
|
$pagination-border-radius-sm: $border-radius-sm !default;
|
||||||
|
$pagination-border-radius-lg: $border-radius-lg !default;
|
||||||
|
|
||||||
// Cards
|
// Cards
|
||||||
|
|
||||||
$card-spacer-y: $spacer !default;
|
$card-spacer-y: $spacer !default;
|
||||||
|
|
|
||||||
4
scss/bootstrap-grid.scss
vendored
4
scss/bootstrap-grid.scss
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap Grid v5.0.0-beta1 (https://getbootstrap.com/)
|
* Bootstrap Grid v5.0.0-beta1 (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
4
scss/bootstrap-reboot.scss
vendored
4
scss/bootstrap-reboot.scss
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap Reboot v5.0.0-beta1 (https://getbootstrap.com/)
|
* Bootstrap Reboot v5.0.0-beta1 (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
8
scss/bootstrap-utilities.scss
vendored
8
scss/bootstrap-utilities.scss
vendored
|
|
@ -1,18 +1,18 @@
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap Utilities v5.0.0-beta1 (https://getbootstrap.com/)
|
* Bootstrap Utilities v5.0.0-beta1 (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
|
|
||||||
@import "functions";
|
@import "functions";
|
||||||
@import "variables";
|
@import "variables";
|
||||||
@import "mixins";
|
@import "mixins";
|
||||||
@import "utilities";
|
@import "utilities";
|
||||||
|
|
||||||
|
// Helpers
|
||||||
|
@import "helpers";
|
||||||
|
|
||||||
// Utilities
|
// Utilities
|
||||||
|
|
||||||
@import "utilities/api";
|
@import "utilities/api";
|
||||||
|
|
|
||||||
4
scss/bootstrap.scss
vendored
4
scss/bootstrap.scss
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap v5.0.0-beta1 (https://getbootstrap.com/)
|
* Bootstrap v5.0.0-beta1 (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
appearance: none;
|
appearance: none;
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: none;
|
outline: 0;
|
||||||
|
|
||||||
// Pseudo-elements must be split across multiple rulesets to have an effect.
|
// Pseudo-elements must be split across multiple rulesets to have an effect.
|
||||||
// No box-shadow() mixin for focus accessibility.
|
// No box-shadow() mixin for focus accessibility.
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
.form-select {
|
.form-select {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: $form-select-padding-y ($form-select-padding-x + $form-select-indicator-padding) $form-select-padding-y $form-select-padding-x;
|
padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
|
||||||
font-family: $form-select-font-family;
|
font-family: $form-select-font-family;
|
||||||
@include font-size($form-select-font-size);
|
@include font-size($form-select-font-size);
|
||||||
font-weight: $form-select-font-weight;
|
font-weight: $form-select-font-weight;
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,6 @@
|
||||||
|
|
||||||
// scss-docs-start form-validation-states-loop
|
// scss-docs-start form-validation-states-loop
|
||||||
@each $state, $data in $form-validation-states {
|
@each $state, $data in $form-validation-states {
|
||||||
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
|
@include form-validation-state($state, $data...);
|
||||||
}
|
}
|
||||||
// scss-docs-end form-validation-states-loop
|
// scss-docs-end form-validation-states-loop
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: var(--aspect-ratio);
|
padding-top: var(--#{$variable-prefix}aspect-ratio);
|
||||||
content: "";
|
content: "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -21,6 +21,6 @@
|
||||||
|
|
||||||
@each $key, $ratio in $aspect-ratios {
|
@each $key, $ratio in $aspect-ratios {
|
||||||
.ratio-#{$key} {
|
.ratio-#{$key} {
|
||||||
--aspect-ratio: #{$ratio};
|
--#{$variable-prefix}aspect-ratio: #{$ratio};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,6 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
.visually-hidden,
|
.visually-hidden,
|
||||||
.visually-hidden-focusable:not(:focus) {
|
.visually-hidden-focusable:not(:focus):not(:focus-within) {
|
||||||
@include visually-hidden();
|
@include visually-hidden();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@
|
||||||
$background,
|
$background,
|
||||||
$border,
|
$border,
|
||||||
$color: color-contrast($background),
|
$color: color-contrast($background),
|
||||||
$hover-background: if($color == $color-contrast-light, shade-color($background, 15%), tint-color($background, 15%)),
|
$hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
|
||||||
$hover-border: if($color == $color-contrast-light, shade-color($border, 20%), tint-color($border, 10%)),
|
$hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
|
||||||
$hover-color: color-contrast($hover-background),
|
$hover-color: color-contrast($hover-background),
|
||||||
$active-background: if($color == $color-contrast-light, shade-color($background, 20%), tint-color($background, 20%)),
|
$active-background: if($color == $color-contrast-light, shade-color($background,$btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
|
||||||
$active-border: if($color == $color-contrast-light, shade-color($border, 25%), tint-color($border, 10%)),
|
$active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
|
||||||
$active-color: color-contrast($active-background),
|
$active-color: color-contrast($active-background),
|
||||||
$disabled-background: $background,
|
$disabled-background: $background,
|
||||||
$disabled-border: $border,
|
$disabled-border: $border,
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin form-validation-state($state, $color, $icon) {
|
@mixin form-validation-state(
|
||||||
|
$state,
|
||||||
|
$color,
|
||||||
|
$icon,
|
||||||
|
$tooltip-color: color-contrast($color),
|
||||||
|
$tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
|
||||||
|
$focus-box-shadow: 0 0 0 $input-focus-width rgba($color, $input-btn-focus-color-opacity)
|
||||||
|
) {
|
||||||
.#{$state}-feedback {
|
.#{$state}-feedback {
|
||||||
display: none;
|
display: none;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
@ -33,8 +40,8 @@
|
||||||
margin-top: .1rem;
|
margin-top: .1rem;
|
||||||
@include font-size($form-feedback-tooltip-font-size);
|
@include font-size($form-feedback-tooltip-font-size);
|
||||||
line-height: $form-feedback-tooltip-line-height;
|
line-height: $form-feedback-tooltip-line-height;
|
||||||
color: color-contrast($color);
|
color: $tooltip-color;
|
||||||
background-color: rgba($color, $form-feedback-tooltip-opacity);
|
background-color: $tooltip-bg-color;
|
||||||
@include border-radius($form-feedback-tooltip-border-radius);
|
@include border-radius($form-feedback-tooltip-border-radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +66,7 @@
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
border-color: $color;
|
border-color: $color;
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, $input-btn-focus-color-opacity);
|
box-shadow: $focus-box-shadow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -87,7 +94,7 @@
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
border-color: $color;
|
border-color: $color;
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
box-shadow: $focus-box-shadow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -101,7 +108,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
box-shadow: $focus-box-shadow;
|
||||||
}
|
}
|
||||||
|
|
||||||
~ .form-check-label {
|
~ .form-check-label {
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,13 @@
|
||||||
border: 0 !important;
|
border: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use to only display content when it's focused.
|
// Use to only display content when it's focused, or one of its child elements is focused
|
||||||
|
// (i.e. when focus is within the element/container that the class was applied to)
|
||||||
//
|
//
|
||||||
// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
|
// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
|
||||||
|
|
||||||
@mixin visually-hidden-focusable() {
|
@mixin visually-hidden-focusable() {
|
||||||
&:not(:focus) {
|
&:not(:focus):not(:focus-within) {
|
||||||
@include visually-hidden();
|
@include visually-hidden();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@
|
||||||
"strict": "error",
|
"strict": "error",
|
||||||
"unicorn/no-for-loop": "off",
|
"unicorn/no-for-loop": "off",
|
||||||
"unicorn/no-null": "off",
|
"unicorn/no-null": "off",
|
||||||
"unicorn/prefer-dataset": "off",
|
"unicorn/prefer-dom-node-append": "off",
|
||||||
"unicorn/prefer-node-append": "off",
|
"unicorn/prefer-dom-node-dataset": "off",
|
||||||
"unicorn/prefer-query-selector": "off",
|
"unicorn/prefer-query-selector": "off",
|
||||||
"unicorn/prevent-abbreviations": "off"
|
"unicorn/prevent-abbreviations": "off"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* JavaScript for Bootstrap's docs (https://getbootstrap.com/)
|
* JavaScript for Bootstrap's docs (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
||||||
* For details, see https://creativecommons.org/licenses/by/3.0/.
|
* For details, see https://creativecommons.org/licenses/by/3.0/.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,8 @@
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
@include border-radius();
|
@include border-radius();
|
||||||
|
|
||||||
&:hover {
|
&:hover,
|
||||||
|
&:focus {
|
||||||
color: $white;
|
color: $white;
|
||||||
background-color: $primary;
|
background-color: $primary;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@
|
||||||
width: 16rem;
|
width: 16rem;
|
||||||
|
|
||||||
@include media-breakpoint-up(md) {
|
@include media-breakpoint-up(md) {
|
||||||
--aspect-ratio: 50%; // 2x1
|
--bs-aspect-ratio: 50%; // 2x1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@
|
||||||
padding: .25rem .5rem;
|
padding: .25rem .5rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: rgba($black, .65);
|
color: rgba($black, .65);
|
||||||
background-color: none;
|
background-color: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
|
|
||||||
&:hover,
|
&:hover,
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,7 @@
|
||||||
// stylelint-disable declaration-no-important
|
|
||||||
|
|
||||||
.skippy {
|
.skippy {
|
||||||
background-color: $bd-purple;
|
background-color: $bd-purple;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus-within a {
|
|
||||||
position: static !important;
|
|
||||||
width: auto !important;
|
|
||||||
height: auto !important;
|
|
||||||
padding: $spacer / 2 !important;
|
|
||||||
margin: $spacer / 4 !important;
|
|
||||||
overflow: visible !important;
|
|
||||||
clip: auto !important;
|
|
||||||
white-space: normal !important;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap Docs (https://getbootstrap.com/)
|
* Bootstrap Docs (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2020 The Bootstrap Authors
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
* Copyright 2011-2020 Twitter, Inc.
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
||||||
* For details, see https://creativecommons.org/licenses/by/3.0/.
|
* For details, see https://creativecommons.org/licenses/by/3.0/.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,34 @@ Add `data-bs-interval=""` to a `.carousel-item` to change the amount of time to
|
||||||
</div>
|
</div>
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
|
|
||||||
|
### Disable touch swiping
|
||||||
|
|
||||||
|
Carousels support swiping left/right on touchscreen devices to move between slides. This can be disabled using the `data-bs-touch` attribute. The example below also does not include the `data-bs-ride` attribute and has `data-bs-interval="false"` so it doesn't autoplay.
|
||||||
|
|
||||||
|
{{< example >}}
|
||||||
|
<div id="carouselExampleControlsNoTouching" class="carousel slide" data-bs-touch="false" data-bs-interval="false">
|
||||||
|
<div class="carousel-inner">
|
||||||
|
<div class="carousel-item active">
|
||||||
|
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#555" background="#777" text="First slide" >}}
|
||||||
|
</div>
|
||||||
|
<div class="carousel-item">
|
||||||
|
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#444" background="#666" text="Second slide" >}}
|
||||||
|
</div>
|
||||||
|
<div class="carousel-item">
|
||||||
|
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#333" background="#555" text="Third slide" >}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="carousel-control-prev" href="#carouselExampleControlsNoTouching" role="button" data-bs-slide="prev">
|
||||||
|
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||||
|
<span class="visually-hidden">Previous</span>
|
||||||
|
</a>
|
||||||
|
<a class="carousel-control-next" href="#carouselExampleControlsNoTouching" role="button" data-bs-slide="next">
|
||||||
|
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||||
|
<span class="visually-hidden">Next</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{< /example >}}
|
||||||
|
|
||||||
## Dark variant
|
## Dark variant
|
||||||
|
|
||||||
Add `.carousel-dark` to the `.carousel` for darker controls, indicators, and captions. Controls have been inverted from their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`.
|
Add `.carousel-dark` to the `.carousel` for darker controls, indicators, and captions. Controls have been inverted from their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`.
|
||||||
|
|
@ -286,7 +314,7 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
|
||||||
<td><code>interval</code></td>
|
<td><code>interval</code></td>
|
||||||
<td>number</td>
|
<td>number</td>
|
||||||
<td><code>5000</code></td>
|
<td><code>5000</code></td>
|
||||||
<td>The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.</td>
|
<td>The amount of time to delay between automatically cycling an item. If <code>false</code>, carousel will not automatically cycle.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>keyboard</code></td>
|
<td><code>keyboard</code></td>
|
||||||
|
|
@ -297,15 +325,15 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>pause</code></td>
|
<td><code>pause</code></td>
|
||||||
<td>string | boolean</td>
|
<td>string | boolean</td>
|
||||||
<td><code>"hover"</code></td>
|
<td><code>'hover'</code></td>
|
||||||
<td><p>If set to <code>"hover"</code>, pauses the cycling of the carousel on <code>mouseenter</code> and resumes the cycling of the carousel on <code>mouseleave</code>. If set to <code>false</code>, hovering over the carousel won't pause it.</p>
|
<td><p>If set to <code>'hover'</code>, pauses the cycling of the carousel on <code>mouseenter</code> and resumes the cycling of the carousel on <code>mouseleave</code>. If set to <code>false</code>, hovering over the carousel won't pause it.</p>
|
||||||
<p>On touch-enabled devices, when set to <code>"hover"</code>, cycling will pause on <code>touchend</code> (once the user finished interacting with the carousel) for two intervals, before automatically resuming. Note that this is in addition to the above mouse behavior.</p></td>
|
<p>On touch-enabled devices, when set to <code>'hover'</code>, cycling will pause on <code>touchend</code> (once the user finished interacting with the carousel) for two intervals, before automatically resuming. Note that this is in addition to the above mouse behavior.</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>slide</code></td>
|
<td><code>ride</code></td>
|
||||||
<td>string | boolean</td>
|
<td>string | boolean</td>
|
||||||
<td><code>false</code></td>
|
<td><code>false</code></td>
|
||||||
<td>Autoplays the carousel after the user manually cycles the first item. If "carousel", autoplays the carousel on load.</td>
|
<td>Autoplays the carousel after the user manually cycles the first item. If set to <code>'carousel'</code>, autoplays the carousel on load.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>wrap</code></td>
|
<td><code>wrap</code></td>
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ Click the buttons below to show and hide another element via class changes:
|
||||||
- `.collapsing` is applied during transitions
|
- `.collapsing` is applied during transitions
|
||||||
- `.collapse.show` shows content
|
- `.collapse.show` shows content
|
||||||
|
|
||||||
You can use a link with the `href` attribute, or a button with the `data-bs-target` attribute. In both cases, the `data-bs-toggle="collapse"` is required.
|
Generally, we recommend using a button with the `data-bs-target` attribute. While not recommended from a semantic point of view, you can also use a link with the `href` attribute (and a `role="button"`). In both cases, the `data-bs-toggle="collapse"` is required.
|
||||||
|
|
||||||
{{< example >}}
|
{{< example >}}
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -35,7 +35,7 @@ You can use a link with the `href` attribute, or a button with the `data-bs-targ
|
||||||
</p>
|
</p>
|
||||||
<div class="collapse" id="collapseExample">
|
<div class="collapse" id="collapseExample">
|
||||||
<div class="card card-body">
|
<div class="card card-body">
|
||||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
|
Some placeholder content for the collapse component. This panel is hidden by default but revealed when the user activates the relevant trigger.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
|
|
@ -55,14 +55,14 @@ Multiple `<button>` or `<a>` can show and hide an element if they each reference
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="collapse multi-collapse" id="multiCollapseExample1">
|
<div class="collapse multi-collapse" id="multiCollapseExample1">
|
||||||
<div class="card card-body">
|
<div class="card card-body">
|
||||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
|
Some placeholder content for the first collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="collapse multi-collapse" id="multiCollapseExample2">
|
<div class="collapse multi-collapse" id="multiCollapseExample2">
|
||||||
<div class="card card-body">
|
<div class="card card-body">
|
||||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident.
|
Some placeholder content for the second collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -886,9 +886,9 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>reference</code></td>
|
<td><code>reference</code></td>
|
||||||
<td>string | element</td>
|
<td>string | element | object</td>
|
||||||
<td><code>'toggle'</code></td>
|
<td><code>'toggle'</code></td>
|
||||||
<td>Reference element of the dropdown menu. Accepts the values of <code>'toggle'</code>, <code>'parent'</code>, or an HTMLElement reference. For more information refer to Popper's <a href="https://popper.js.org/docs/v2/constructors/#createpopper">constructor docs</a>.</td>
|
<td>Reference element of the dropdown menu. Accepts the values of <code>'toggle'</code>, <code>'parent'</code>, an HTMLElement reference or an object providing <code>getBoundingClientRect</code>. For more information refer to Popper's <a href="https://popper.js.org/docs/v2/constructors/#createpopper">constructor docs</a> and <a href="https://popper.js.org/docs/v2/virtual-elements/">virtual element docs</a>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>display</code></td>
|
<td><code>display</code></td>
|
||||||
|
|
|
||||||
|
|
@ -124,9 +124,9 @@ Adding images to the `.navbar-brand` will likely always require custom styles or
|
||||||
|
|
||||||
Navbar navigation links build on our `.nav` options with their own modifier class and require the use of [toggler classes](#toggler) for proper responsive styling. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned.
|
Navbar navigation links build on our `.nav` options with their own modifier class and require the use of [toggler classes](#toggler) for proper responsive styling. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned.
|
||||||
|
|
||||||
Active states—with `.active`—to indicate the current page can be applied directly to `.nav-link`s or their immediate parent `.nav-item`s.
|
Add the `.active` class on `.nav-link` to indicate the current page.
|
||||||
|
|
||||||
Please note that you should also add the `aria-current` attribute on the `.nav-link` itself.
|
Please note that you should also add the `aria-current` attribute on the active `.nav-link`.
|
||||||
|
|
||||||
{{< example >}}
|
{{< example >}}
|
||||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
|
|
||||||
|
|
@ -306,7 +306,7 @@ Add dropdown menus with a little extra HTML and the [dropdowns JavaScript plugin
|
||||||
|
|
||||||
## JavaScript behavior
|
## JavaScript behavior
|
||||||
|
|
||||||
Use the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our navigational tabs and pills to create tabbable panes of local content, even via dropdown menus.
|
Use the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our navigational tabs and pills to create tabbable panes of local content.
|
||||||
|
|
||||||
Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#tabpanel), require `role="tablist"`, `role="tab"`, `role="tabpanel"`, and additional `aria-` attributes in order to convey their structure, functionality and current state to users of assistive technologies (such as screen readers).
|
Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#tabpanel), require `role="tablist"`, `role="tab"`, `role="tabpanel"`, and additional `aria-` attributes in order to convey their structure, functionality and current state to users of assistive technologies (such as screen readers).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,40 +62,20 @@ var popover = new bootstrap.Popover(document.querySelector('.example-popover'),
|
||||||
|
|
||||||
Four options are available: top, right, bottom, and left aligned. Directions are mirrored when using Bootstrap in RTL.
|
Four options are available: top, right, bottom, and left aligned. Directions are mirrored when using Bootstrap in RTL.
|
||||||
|
|
||||||
<div class="bd-example popover-demo">
|
{{< example >}}
|
||||||
<div class="bd-example-popovers">
|
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on top
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on right
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on bottom
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on left
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
```html
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on top
|
Popover on top
|
||||||
</button>
|
</button>
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on right
|
Popover on right
|
||||||
</button>
|
</button>
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on bottom
|
Popover on bottom
|
||||||
</button>
|
</button>
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
|
|
||||||
Popover on left
|
Popover on left
|
||||||
</button>
|
</button>
|
||||||
```
|
{{< /example >}}
|
||||||
|
|
||||||
### Dismiss on next click
|
### Dismiss on next click
|
||||||
|
|
||||||
|
|
@ -119,13 +99,13 @@ var popover = new bootstrap.Popover(document.querySelector('.popover-dismiss'),
|
||||||
|
|
||||||
### Disabled elements
|
### Disabled elements
|
||||||
|
|
||||||
Elements with the `disabled` attribute aren't interactive, meaning users cannot hover or click them to trigger a popover (or tooltip). As a workaround, you'll want to trigger the popover from a wrapper `<div>` or `<span>` and override the `pointer-events` on the disabled element.
|
Elements with the `disabled` attribute aren't interactive, meaning users cannot hover or click them to trigger a popover (or tooltip). As a workaround, you'll want to trigger the popover from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`.
|
||||||
|
|
||||||
For disabled popover triggers, you may also prefer `data-bs-trigger="hover"` so that the popover appears as immediate visual feedback to your users as they may not expect to _click_ on a disabled element.
|
For disabled popover triggers, you may also prefer `data-bs-trigger="hover focus"` so that the popover appears as immediate visual feedback to your users as they may not expect to _click_ on a disabled element.
|
||||||
|
|
||||||
{{< example >}}
|
{{< example >}}
|
||||||
<span class="d-inline-block" data-bs-toggle="popover" data-bs-content="Disabled popover">
|
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
|
||||||
<button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button>
|
<button class="btn btn-primary" type="button" disabled>Disabled button</button>
|
||||||
</span>
|
</span>
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
|
|
||||||
|
|
@ -249,9 +229,9 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>fallbackPlacements</code></td>
|
<td><code>fallbackPlacements</code></td>
|
||||||
<td>string | array</td>
|
<td>array</td>
|
||||||
<td><code>'flip'</code></td>
|
<td><code>['top', 'right', 'bottom', 'left']</code></td>
|
||||||
<td>Allow to specify which position Popper will use on fallback. For more information refer to
|
<td>Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to
|
||||||
Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
|
Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ Toasts are as flexible as you need and have very little required markup. At a mi
|
||||||
|
|
||||||
### Translucent
|
### Translucent
|
||||||
|
|
||||||
Toasts are slightly translucent, too, so they blend over whatever they might appear over. For browsers that support the `backdrop-filter` CSS property, we'll also attempt to blur the elements under a toast.
|
Toasts are slightly translucent, too, so they blend over whatever they might appear over.
|
||||||
|
|
||||||
{{< example class="bg-dark" >}}
|
{{< example class="bg-dark" >}}
|
||||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||||
|
|
@ -120,7 +120,7 @@ Alternatively, you can also add additional controls and components to toasts.
|
||||||
|
|
||||||
### Color schemes
|
### Color schemes
|
||||||
|
|
||||||
Building on the above example, you can create different toast color schemes with our [color utilities]({{< docsref "/utilities/colors" >}}). Here we've added `.bg-primary` and `.text-white` to the `.toast`, and then added `.text-white` to our close button. For a crisp edge, we remove the default border with `.border-0`.
|
Building on the above example, you can create different toast color schemes with our [color utilities]({{< docsref "/utilities/colors" >}}). Here we've added `.bg-primary` and `.text-white` to the `.toast`, and then added `.btn-close-white` to our close button. For a crisp edge, we remove the default border with `.border-0`.
|
||||||
|
|
||||||
{{< example class="bg-light" >}}
|
{{< example class="bg-light" >}}
|
||||||
<div class="toast d-flex align-items-center text-white bg-primary border-0" role="alert" aria-live="assertive" aria-atomic="true">
|
<div class="toast d-flex align-items-center text-white bg-primary border-0" role="alert" aria-live="assertive" aria-atomic="true">
|
||||||
|
|
@ -137,7 +137,7 @@ Place toasts with custom CSS as you need them. The top right is often used for n
|
||||||
|
|
||||||
{{< example >}}
|
{{< example >}}
|
||||||
<form>
|
<form>
|
||||||
<div class="form-group mb-3">
|
<div class="mb-3">
|
||||||
<label for="selectToastPlacement">Toast placement</label>
|
<label for="selectToastPlacement">Toast placement</label>
|
||||||
<select class="form-select mt-2" id="selectToastPlacement">
|
<select class="form-select mt-2" id="selectToastPlacement">
|
||||||
<option value="" selected>Select a position...</option>
|
<option value="" selected>Select a position...</option>
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||||||
Hover over the links below to see tooltips:
|
Hover over the links below to see tooltips:
|
||||||
|
|
||||||
<div class="bd-example tooltip-demo">
|
<div class="bd-example tooltip-demo">
|
||||||
<p class="muted">Placeholder text to demonstrate some <a href="#" data-bs-toggle="tooltip" title="Default tooltip">inline links</a>with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href="#" data-bs-toggle="tooltip" title="Another tooltip">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how <a href="#" data-bs-toggle="tooltip" title="Another one here too">these tooltips on links</a> can work in practice, once you use them on <a href="#" data-bs-toggle="tooltip" title="The last tip!">your own</a> site or project.
|
<p class="muted">Placeholder text to demonstrate some <a href="#" data-bs-toggle="tooltip" title="Default tooltip">inline links</a> with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href="#" data-bs-toggle="tooltip" title="Another tooltip">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how <a href="#" data-bs-toggle="tooltip" title="Another one here too">these tooltips on links</a> can work in practice, once you use them on <a href="#" data-bs-toggle="tooltip" title="The last tip!">your own</a> site or project.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -145,12 +145,12 @@ You should only add tooltips to HTML elements that are traditionally keyboard-fo
|
||||||
|
|
||||||
### Disabled elements
|
### Disabled elements
|
||||||
|
|
||||||
Elements with the `disabled` attribute aren't interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you'll want to trigger the tooltip from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`, and override the `pointer-events` on the disabled element.
|
Elements with the `disabled` attribute aren't interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you'll want to trigger the tooltip from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`.
|
||||||
|
|
||||||
<div class="tooltip-demo">
|
<div class="tooltip-demo">
|
||||||
{{< example >}}
|
{{< example >}}
|
||||||
<span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" title="Disabled tooltip">
|
<span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" title="Disabled tooltip">
|
||||||
<button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button>
|
<button class="btn btn-primary" type="button" disabled>Disabled button</button>
|
||||||
</span>
|
</span>
|
||||||
{{< /example >}}
|
{{< /example >}}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -254,9 +254,9 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>fallbackPlacements</code></td>
|
<td><code>fallbackPlacements</code></td>
|
||||||
<td>null | array</td>
|
<td>array</td>
|
||||||
<td><code>null</code></td>
|
<td><code>['top', 'right', 'bottom', 'left']</code></td>
|
||||||
<td>Allow to specify which position Popper will use on fallback. For more information refer to
|
<td>Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to
|
||||||
Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
|
Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,8 @@ Bootstrap utilizes a "native font stack" or "system font stack" for optimum text
|
||||||
|
|
||||||
```scss
|
```scss
|
||||||
$font-family-sans-serif:
|
$font-family-sans-serif:
|
||||||
|
// Cross-platform generic font family (default user interface font)
|
||||||
|
system-ui,
|
||||||
// Safari for macOS and iOS (San Francisco)
|
// Safari for macOS and iOS (San Francisco)
|
||||||
-apple-system,
|
-apple-system,
|
||||||
// Chrome < 56 for macOS (San Francisco)
|
// Chrome < 56 for macOS (San Francisco)
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ You can find and customize these variables for key global options in Bootstrap's
|
||||||
| ------------------------------ | ---------------------------------- | -------------------------------------------------------------------------------------- |
|
| ------------------------------ | ---------------------------------- | -------------------------------------------------------------------------------------- |
|
||||||
| `$spacer` | `1rem` (default), or any value > 0 | Specifies the default spacer value to programmatically generate our [spacer utilities]({{< docsref "/utilities/spacing" >}}). |
|
| `$spacer` | `1rem` (default), or any value > 0 | Specifies the default spacer value to programmatically generate our [spacer utilities]({{< docsref "/utilities/spacing" >}}). |
|
||||||
| `$enable-rounded` | `true` (default) or `false` | Enables predefined `border-radius` styles on various components. |
|
| `$enable-rounded` | `true` (default) or `false` | Enables predefined `border-radius` styles on various components. |
|
||||||
| `$enable-shadows` | `true` or `false` (default) | Enables predefined `box-shadow` styles on various components. |
|
| `$enable-shadows` | `true` or `false` (default) | Enables predefined decorative `box-shadow` styles on various components. Does not affect `box-shadow`s used for focus states. |
|
||||||
| `$enable-gradients` | `true` or `false` (default) | Enables predefined gradients via `background-image` styles on various components. |
|
| `$enable-gradients` | `true` or `false` (default) | Enables predefined gradients via `background-image` styles on various components. |
|
||||||
| `$enable-transitions` | `true` (default) or `false` | Enables predefined `transition`s on various components. |
|
| `$enable-transitions` | `true` (default) or `false` | Enables predefined `transition`s on various components. |
|
||||||
| `$enable-reduced-motion` | `true` (default) or `false` | Enables the [`prefers-reduced-motion` media query]({{< docsref "/getting-started/accessibility#reduced-motion" >}}), which suppresses certain animations/transitions based on the users' browser/operating system preferences. |
|
| `$enable-reduced-motion` | `true` (default) or `false` | Enables the [`prefers-reduced-motion` media query]({{< docsref "/getting-started/accessibility#reduced-motion" >}}), which suppresses certain animations/transitions based on the users' browser/operating system preferences. |
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,18 @@ While we cannot go into details here on how to use every package manager, we can
|
||||||
For those who want to use the distribution files, review the [getting started page]({{< docsref "/getting-started/introduction" >}}) for how to include those files and an example HTML page. From there, consult the docs for the layout, components, and behaviors you'd like to use.
|
For those who want to use the distribution files, review the [getting started page]({{< docsref "/getting-started/introduction" >}}) for how to include those files and an example HTML page. From there, consult the docs for the layout, components, and behaviors you'd like to use.
|
||||||
|
|
||||||
As you familiarize yourself with Bootstrap, continue exploring this section for more details on how to utilize our global options, making use of and changing our color system, how we build our components, how to use our growing list of CSS custom properties, and how to optimize your code when building with Bootstrap.
|
As you familiarize yourself with Bootstrap, continue exploring this section for more details on how to utilize our global options, making use of and changing our color system, how we build our components, how to use our growing list of CSS custom properties, and how to optimize your code when building with Bootstrap.
|
||||||
|
|
||||||
|
## CSPs and embedded SVGs
|
||||||
|
|
||||||
|
Several Bootstrap components include embedded SVGs in our CSS to style components consistently and easily across browsers and devices. **For organizations with more strict <abbr title="Content Security Policy">CSP</abbr> configurations**, we've documented all instances of our embedded SVGs (all of which are applied via `background-image`) so you can more thoroughly review your options.
|
||||||
|
|
||||||
|
- [Accordion]({{< docsref "/components/accordion" >}})
|
||||||
|
- [Close button]({{< docsref "/components/close-button" >}}) (used in alerts and modals)
|
||||||
|
- [Form checkboxes and radio buttons]({{< docsref "/forms/checks-radios" >}})
|
||||||
|
- [Form switches]({{< docsref "/forms/checks-radios#switches" >}})
|
||||||
|
- [Form validation icons]({{< docsref "/forms/validation#server-side" >}})
|
||||||
|
- [Select menus]({{< docsref "/forms/select" >}})
|
||||||
|
- [Carousel controls]({{< docsref "/components/carousel#with-controls" >}})
|
||||||
|
- [Navbar toggle buttons]({{< docsref "/components/navbar#responsive-behaviors" >}})
|
||||||
|
|
||||||
|
Based on [community conversation](https://github.com/twbs/bootstrap/issues/25394), some options for addressing this in your own codebase include replacing the URLs with locally hosted assets, removing the images and using inline images (not possible in all components), and modifying your CSP. Our recommendation is to carefully review your own security policies and decide on a best path forward, if necessary.
|
||||||
|
|
@ -6,7 +6,7 @@ group: customize
|
||||||
toc: true
|
toc: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Utilize our source Sass files to take advantage of variables, maps, mixins, and more. In our build we've increased the Sass rounding precision to 6 (by default it's 5) to prevent issues with browser rounding.
|
Utilize our source Sass files to take advantage of variables, maps, mixins, and more.
|
||||||
|
|
||||||
## File structure
|
## File structure
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ direction: rtl
|
||||||
<section class="py-5 text-center container">
|
<section class="py-5 text-center container">
|
||||||
<div class="row py-lg-5">
|
<div class="row py-lg-5">
|
||||||
<div class="col-lg-6 col-md-8 mx-auto">
|
<div class="col-lg-6 col-md-8 mx-auto">
|
||||||
<h1 class="font-weight-light">مثال الألبوم</h1>
|
<h1 class="fw-light">مثال الألبوم</h1>
|
||||||
<p class="lead text-muted">شيء قصير وقائد حول المجموعة أدناه - محتوياتها ، ومنشئها ، وما إلى ذلك. اجعلها قصيرة ولطيفة ، ولكن ليست قصيرة جدًا حتى لا يتخطى الناس ببساطة هذه المجموعة تمامًا.</p>
|
<p class="lead text-muted">شيء قصير وقائد حول المجموعة أدناه - محتوياتها ، ومنشئها ، وما إلى ذلك. اجعلها قصيرة ولطيفة ، ولكن ليست قصيرة جدًا حتى لا يتخطى الناس ببساطة هذه المجموعة تمامًا.</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="#" class="btn btn-primary my-2">الدعوة الرئيسية للعمل</a>
|
<a href="#" class="btn btn-primary my-2">الدعوة الرئيسية للعمل</a>
|
||||||
|
|
|
||||||
|
|
@ -47,9 +47,9 @@ include_js: false
|
||||||
<main class="container">
|
<main class="container">
|
||||||
<div class="p-4 p-md-5 mb-4 text-white rounded bg-dark">
|
<div class="p-4 p-md-5 mb-4 text-white rounded bg-dark">
|
||||||
<div class="col-md-6 px-0">
|
<div class="col-md-6 px-0">
|
||||||
<h1 class="display-4 font-italic">عنوان مشاركة مدونة مميزة أطول</h1>
|
<h1 class="display-4 fst-italic">عنوان مشاركة مدونة مميزة أطول</h1>
|
||||||
<p class="lead my-3">أسطر نصية متعددة تشكل الجزء الأمامي ، لإعلام القراء الجدد بسرعة وكفاءة حول أكثر الأشياء إثارة للاهتمام في محتويات هذه المشاركة.</p>
|
<p class="lead my-3">أسطر نصية متعددة تشكل الجزء الأمامي ، لإعلام القراء الجدد بسرعة وكفاءة حول أكثر الأشياء إثارة للاهتمام في محتويات هذه المشاركة.</p>
|
||||||
<p class="lead mb-0"><a href="#" class="text-white font-weight-bold">أكمل القراءة...</a></p>
|
<p class="lead mb-0"><a href="#" class="text-white fw-bold">أكمل القراءة...</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -86,7 +86,7 @@ include_js: false
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<h3 class="pb-4 mb-4 font-italic border-bottom">
|
<h3 class="pb-4 mb-4 fst-italic border-bottom">
|
||||||
من Firehose
|
من Firehose
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|
@ -158,12 +158,12 @@ include_js: false
|
||||||
|
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="p-4 mb-3 bg-light rounded">
|
<div class="p-4 mb-3 bg-light rounded">
|
||||||
<h4 class="font-italic">حول</h4>
|
<h4 class="fst-italic">حول</h4>
|
||||||
<p class="mb-0">بل مدن وإعلان بتخصيص إيطاليا. حيث عقبت أساسي وتنامت و, وباءت وايرلندا وقد بـ, مرمى سقطت إحكام يكن و. كل ومن تصفح بالرّغم الاندونيسية. ٣٠ انتباه والروسية كلّ, الوراء ولكسمبورغ عن لكل. الخاصّة والإتحاد لان بل, وقد الهجوم وتنامت و.</p>
|
<p class="mb-0">بل مدن وإعلان بتخصيص إيطاليا. حيث عقبت أساسي وتنامت و, وباءت وايرلندا وقد بـ, مرمى سقطت إحكام يكن و. كل ومن تصفح بالرّغم الاندونيسية. ٣٠ انتباه والروسية كلّ, الوراء ولكسمبورغ عن لكل. الخاصّة والإتحاد لان بل, وقد الهجوم وتنامت و.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<h4 class="font-italic">أرشيف</h4>
|
<h4 class="fst-italic">أرشيف</h4>
|
||||||
<ol class="list-unstyled mb-0">
|
<ol class="list-unstyled mb-0">
|
||||||
<li><a href="#">مارس 2014</a></li>
|
<li><a href="#">مارس 2014</a></li>
|
||||||
<li><a href="#">شباط 2014</a></li>
|
<li><a href="#">شباط 2014</a></li>
|
||||||
|
|
@ -181,7 +181,7 @@ include_js: false
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<h4 class="font-italic">في مكان آخر</h4>
|
<h4 class="fst-italic">في مكان آخر</h4>
|
||||||
<ol class="list-unstyled">
|
<ol class="list-unstyled">
|
||||||
<li><a href="#">GitHub</a></li>
|
<li><a href="#">GitHub</a></li>
|
||||||
<li><a href="#">Twitter</a></li>
|
<li><a href="#">Twitter</a></li>
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ include_js: false
|
||||||
<main class="container">
|
<main class="container">
|
||||||
<div class="p-4 p-md-5 mb-4 text-white rounded bg-dark">
|
<div class="p-4 p-md-5 mb-4 text-white rounded bg-dark">
|
||||||
<div class="col-md-6 px-0">
|
<div class="col-md-6 px-0">
|
||||||
<h1 class="display-4 font-italic">Title of a longer featured blog post</h1>
|
<h1 class="display-4 fst-italic">Title of a longer featured blog post</h1>
|
||||||
<p class="lead my-3">Multiple lines of text that form the lede, informing new readers quickly and efficiently about what’s most interesting in this post’s contents.</p>
|
<p class="lead my-3">Multiple lines of text that form the lede, informing new readers quickly and efficiently about what’s most interesting in this post’s contents.</p>
|
||||||
<p class="lead mb-0"><a href="#" class="text-white fw-bold">Continue reading...</a></p>
|
<p class="lead mb-0"><a href="#" class="text-white fw-bold">Continue reading...</a></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -85,7 +85,7 @@ include_js: false
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<h3 class="pb-4 mb-4 font-italic border-bottom">
|
<h3 class="pb-4 mb-4 fst-italic border-bottom">
|
||||||
From the Firehose
|
From the Firehose
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|
@ -156,12 +156,12 @@ include_js: false
|
||||||
|
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="p-4 mb-3 bg-light rounded">
|
<div class="p-4 mb-3 bg-light rounded">
|
||||||
<h4 class="font-italic">About</h4>
|
<h4 class="fst-italic">About</h4>
|
||||||
<p class="mb-0">Saw you downtown singing the Blues. Watch you circle the drain. Why don't you let me stop by? Heavy is the head that <em>wears the crown</em>. Yes, we make angels cry, raining down on earth from up above.</p>
|
<p class="mb-0">Saw you downtown singing the Blues. Watch you circle the drain. Why don't you let me stop by? Heavy is the head that <em>wears the crown</em>. Yes, we make angels cry, raining down on earth from up above.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<h4 class="font-italic">Archives</h4>
|
<h4 class="fst-italic">Archives</h4>
|
||||||
<ol class="list-unstyled mb-0">
|
<ol class="list-unstyled mb-0">
|
||||||
<li><a href="#">March 2014</a></li>
|
<li><a href="#">March 2014</a></li>
|
||||||
<li><a href="#">February 2014</a></li>
|
<li><a href="#">February 2014</a></li>
|
||||||
|
|
@ -179,7 +179,7 @@ include_js: false
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<h4 class="font-italic">Elsewhere</h4>
|
<h4 class="fst-italic">Elsewhere</h4>
|
||||||
<ol class="list-unstyled">
|
<ol class="list-unstyled">
|
||||||
<li><a href="#">GitHub</a></li>
|
<li><a href="#">GitHub</a></li>
|
||||||
<li><a href="#">Twitter</a></li>
|
<li><a href="#">Twitter</a></li>
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ extra_css:
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" aria-current="page" href="#">الصفحة الرئيسية</a>
|
<a class="nav-link active" aria-current="page" href="#">الصفحة الرئيسية</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">حلقة الوصل</a>
|
<a class="nav-link" href="#">حلقة الوصل</a>
|
||||||
|
|
@ -49,7 +49,7 @@ extra_css:
|
||||||
<div class="carousel-caption text-start">
|
<div class="carousel-caption text-start">
|
||||||
<h1>عنوان المثال.</h1>
|
<h1>عنوان المثال.</h1>
|
||||||
<p> نهاية الأوضاع ان أضف, هو مما رجوعهم وقدّموا. أي عدد الدمج نهاية وأكثرها, المسرح الباهضة وبولندا حول و, كل أما سياسة أسابيع. مع حيث قُدُماً الكونجرس, بها و خيار ٢٠٠٤, كلا في مكّن وقام. مع يكن زهاء بالفشل, الجوي الصين الشمال إذ على.</p>
|
<p> نهاية الأوضاع ان أضف, هو مما رجوعهم وقدّموا. أي عدد الدمج نهاية وأكثرها, المسرح الباهضة وبولندا حول و, كل أما سياسة أسابيع. مع حيث قُدُماً الكونجرس, بها و خيار ٢٠٠٤, كلا في مكّن وقام. مع يكن زهاء بالفشل, الجوي الصين الشمال إذ على.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">سجل اليوم</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">سجل اليوم</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -59,7 +59,7 @@ extra_css:
|
||||||
<div class="carousel-caption">
|
<div class="carousel-caption">
|
||||||
<h1>عنوان مثال آخر.</h1>
|
<h1>عنوان مثال آخر.</h1>
|
||||||
<p>ثم تزامناً الفرنسي الإقتصادية دار. لكل عن الضغوط المتّبعة, أن حتى إختار المدن بالإنزال. عن الشمل بالفشل تلك, بل أراض أوزار بلديهما حول. دون لكون والتي ثم, كُلفة ويعزى استطاعوا أن لمّ. جُل بخطوط واحدة البشريةً.</p>
|
<p>ثم تزامناً الفرنسي الإقتصادية دار. لكل عن الضغوط المتّبعة, أن حتى إختار المدن بالإنزال. عن الشمل بالفشل تلك, بل أراض أوزار بلديهما حول. دون لكون والتي ثم, كُلفة ويعزى استطاعوا أن لمّ. جُل بخطوط واحدة البشريةً.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">أعرف أكثر</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">أعرف أكثر</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -69,7 +69,7 @@ extra_css:
|
||||||
<div class="carousel-caption text-end">
|
<div class="carousel-caption text-end">
|
||||||
<h1>واحد أكثر لقياس جيد.</h1>
|
<h1>واحد أكثر لقياس جيد.</h1>
|
||||||
<p>قررت العصبة إيطاليا وتم أن, عن سكان وقامت الحكومة وفي. كان بـ اوروبا اليابانية, ثمّة بوابة يتعلّق عل بعض. عدم رئيس الآلاف أن حدى.</p>
|
<p>قررت العصبة إيطاليا وتم أن, عن سكان وقامت الحكومة وفي. كان بـ اوروبا اليابانية, ثمّة بوابة يتعلّق عل بعض. عدم رئيس الآلاف أن حدى.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">تصفح المعرض</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">تصفح المعرض</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -97,19 +97,19 @@ extra_css:
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>عنوان</h2>
|
<h2>عنوان</h2>
|
||||||
<p>ان وتم عجّل الأجل, قبل نتيجة المشترك بـ, أي جعل جورج أوزار المسرح. أن وإعلان الساحل تلك, مكن ان استبدال الباهضة التكاليف. الى ماذا اليميني الحكومة في, إجلاء نتيجة قبل تم. مساعدة بولندا، أي هذه الحكم.</p>
|
<p>ان وتم عجّل الأجل, قبل نتيجة المشترك بـ, أي جعل جورج أوزار المسرح. أن وإعلان الساحل تلك, مكن ان استبدال الباهضة التكاليف. الى ماذا اليميني الحكومة في, إجلاء نتيجة قبل تم. مساعدة بولندا، أي هذه الحكم.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">عرض التفاصيل</a></p>
|
<p><a class="btn btn-secondary" href="#">عرض التفاصيل</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>عنوان</h2>
|
<h2>عنوان</h2>
|
||||||
<p>هو أخر إتفاقية الدولارات الأوروبيّون, ثانية طوكيو و به،, ونتج أعمال مما أم. عن الا يونيو أفريقيا, السيطرة التقليدي ومن ٣٠. هو الغالي الإتفاقية ويكيبيديا، مكن, و الى هُزم اعتداء وايرلندا. وقبل بمباركة الأوروبيّون عن فقد, بتحدّي والفلبين ما كلا.</p>
|
<p>هو أخر إتفاقية الدولارات الأوروبيّون, ثانية طوكيو و به،, ونتج أعمال مما أم. عن الا يونيو أفريقيا, السيطرة التقليدي ومن ٣٠. هو الغالي الإتفاقية ويكيبيديا، مكن, و الى هُزم اعتداء وايرلندا. وقبل بمباركة الأوروبيّون عن فقد, بتحدّي والفلبين ما كلا.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">عرض التفاصيل</a></p>
|
<p><a class="btn btn-secondary" href="#">عرض التفاصيل</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>عنوان</h2>
|
<h2>عنوان</h2>
|
||||||
<p>غير عن الثقيل وسمّيت الأوضاع, لم تاريخ بالحرب للسيطرة حين, دار اللا تطوير تم. الى بشرية اليابان في. أما الشهيرة الإثنان وايرلندا ما, لإعلان واشتدّت و مدن. في غير والحزب للسيطرة الإكتفاء. ثانية الكونجرس الا من, جُل ٣٠ وبداية الشرقية.</p>
|
<p>غير عن الثقيل وسمّيت الأوضاع, لم تاريخ بالحرب للسيطرة حين, دار اللا تطوير تم. الى بشرية اليابان في. أما الشهيرة الإثنان وايرلندا ما, لإعلان واشتدّت و مدن. في غير والحزب للسيطرة الإكتفاء. ثانية الكونجرس الا من, جُل ٣٠ وبداية الشرقية.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">عرض التفاصيل</a></p>
|
<p><a class="btn btn-secondary" href="#">عرض التفاصيل</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
</div><!-- /.row -->
|
</div><!-- /.row -->
|
||||||
|
|
||||||
|
|
@ -162,6 +162,6 @@ extra_css:
|
||||||
<!-- FOOTER -->
|
<!-- FOOTER -->
|
||||||
<footer class="container">
|
<footer class="container">
|
||||||
<p class="float-end"><a href="#">عد إلى الأعلى</a></p>
|
<p class="float-end"><a href="#">عد إلى الأعلى</a></p>
|
||||||
<p>© 2017-{{< year >}} Company, Inc. · <a href="#">خصوصية</a> · <a href="#">شروط</a></p>
|
<p>© 2017–{{< year >}} Company, Inc. · <a href="#">خصوصية</a> · <a href="#">شروط</a></p>
|
||||||
</footer>
|
</footer>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ extra_css:
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" aria-current="page" href="#">Home</a>
|
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">Link</a>
|
<a class="nav-link" href="#">Link</a>
|
||||||
|
|
@ -48,7 +48,7 @@ extra_css:
|
||||||
<div class="carousel-caption text-start">
|
<div class="carousel-caption text-start">
|
||||||
<h1>Example headline.</h1>
|
<h1>Example headline.</h1>
|
||||||
<p>Some representative placeholder content for the first slide of the carousel.</p>
|
<p>Some representative placeholder content for the first slide of the carousel.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">Sign up today</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">Sign up today</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -58,7 +58,7 @@ extra_css:
|
||||||
<div class="carousel-caption">
|
<div class="carousel-caption">
|
||||||
<h1>Another example headline.</h1>
|
<h1>Another example headline.</h1>
|
||||||
<p>Some representative placeholder content for the second slide of the carousel.</p>
|
<p>Some representative placeholder content for the second slide of the carousel.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">Learn more</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">Learn more</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -68,7 +68,7 @@ extra_css:
|
||||||
<div class="carousel-caption text-end">
|
<div class="carousel-caption text-end">
|
||||||
<h1>One more for good measure.</h1>
|
<h1>One more for good measure.</h1>
|
||||||
<p>Some representative placeholder content for the third slide of this carousel.</p>
|
<p>Some representative placeholder content for the third slide of this carousel.</p>
|
||||||
<p><a class="btn btn-lg btn-primary" href="#" role="button">Browse gallery</a></p>
|
<p><a class="btn btn-lg btn-primary" href="#">Browse gallery</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -96,19 +96,19 @@ extra_css:
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>Heading</h2>
|
<h2>Heading</h2>
|
||||||
<p>Some representative placeholder content for the three columns of text below the carousel. This is the first column.</p>
|
<p>Some representative placeholder content for the three columns of text below the carousel. This is the first column.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">View details »</a></p>
|
<p><a class="btn btn-secondary" href="#">View details »</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>Heading</h2>
|
<h2>Heading</h2>
|
||||||
<p>Another exciting bit of representative placeholder content. This time, we've moved on to the second column.</p>
|
<p>Another exciting bit of representative placeholder content. This time, we've moved on to the second column.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">View details »</a></p>
|
<p><a class="btn btn-secondary" href="#">View details »</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
{{< placeholder width="140" height="140" background="#777" color="#777" class="rounded-circle" >}}
|
||||||
<h2>Heading</h2>
|
<h2>Heading</h2>
|
||||||
<p>And lastly this, the third column of representative placeholder content.</p>
|
<p>And lastly this, the third column of representative placeholder content.</p>
|
||||||
<p><a class="btn btn-secondary" href="#" role="button">View details »</a></p>
|
<p><a class="btn btn-secondary" href="#">View details »</a></p>
|
||||||
</div><!-- /.col-lg-4 -->
|
</div><!-- /.col-lg-4 -->
|
||||||
</div><!-- /.row -->
|
</div><!-- /.row -->
|
||||||
|
|
||||||
|
|
@ -161,6 +161,6 @@ extra_css:
|
||||||
<!-- FOOTER -->
|
<!-- FOOTER -->
|
||||||
<footer class="container">
|
<footer class="container">
|
||||||
<p class="float-end"><a href="#">Back to top</a></p>
|
<p class="float-end"><a href="#">Back to top</a></p>
|
||||||
<p>© 2017-{{< year >}} Company, Inc. · <a href="#">Privacy</a> · <a href="#">Terms</a></p>
|
<p>© 2017–{{< year >}} Company, Inc. · <a href="#">Privacy</a> · <a href="#">Terms</a></p>
|
||||||
</footer>
|
</footer>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,10 @@ body {
|
||||||
line-height: 0;
|
line-height: 0;
|
||||||
content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
|
content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
|
||||||
transition: transform .35s ease;
|
transition: transform .35s ease;
|
||||||
|
|
||||||
|
/* rtl:raw:
|
||||||
|
transform: rotate(180deg) translateX(-2px);
|
||||||
|
*/
|
||||||
transform-origin: .5em 50%;
|
transform-origin: .5em 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ body {
|
||||||
line-height: 0;
|
line-height: 0;
|
||||||
content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
|
content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
|
||||||
transition: transform .35s ease;
|
transition: transform .35s ease;
|
||||||
|
transform: rotate(180deg) translateX(-2px);
|
||||||
transform-origin: .5em 50%;
|
transform-origin: .5em 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ body_class: "bg-light"
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="username" class="form-label">اسم المستخدم</label>
|
<label for="username" class="form-label">اسم المستخدم</label>
|
||||||
<div class="input-group">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text">@</span>
|
<span class="input-group-text">@</span>
|
||||||
<input type="text" class="form-control" id="username" placeholder="اسم المستخدم" required>
|
<input type="text" class="form-control" id="username" placeholder="اسم المستخدم" required>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ body_class: "bg-light"
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="username" class="form-label">Username</label>
|
<label for="username" class="form-label">Username</label>
|
||||||
<div class="input-group">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text">@</span>
|
<span class="input-group-text">@</span>
|
||||||
<input type="text" class="form-control" id="username" placeholder="Username" required>
|
<input type="text" class="form-control" id="username" placeholder="Username" required>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ title: Bottom navbar example
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav">
|
<ul class="navbar-nav">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" aria-current="page" href="#">Home</a>
|
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">Link</a>
|
<a class="nav-link" href="#">Link</a>
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ extra_css:
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||||
<li class="nav-item active">
|
<li class="nav-item">
|
||||||
<a class="nav-link" aria-current="page" href="#">Home</a>
|
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#">Link</a>
|
<a class="nav-link" href="#">Link</a>
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue