mirror of
https://github.com/tabler/tabler.git
synced 2025-12-21 17:34:25 +04:00
Compare commits
160 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ad191817e | ||
|
|
1eb8b4fa40 | ||
|
|
58ad1008c9 | ||
|
|
c0e757e252 | ||
|
|
5e119d4c06 | ||
|
|
c860288558 | ||
|
|
596237e8cc | ||
|
|
736e60408b | ||
|
|
212d560a87 | ||
|
|
0ee3c0a3b4 | ||
|
|
bddacee9ad | ||
|
|
2c3efda2bd | ||
|
|
4834022361 | ||
|
|
e16457fd2e | ||
|
|
8b12ba0b01 | ||
|
|
d2c812e023 | ||
|
|
8947d7c7b7 | ||
|
|
399a5c59f9 | ||
|
|
ad22d046c3 | ||
|
|
b8b63d7e94 | ||
|
|
ab8009b771 | ||
|
|
bd35fd39cf | ||
|
|
4b65380293 | ||
|
|
2c73788cd1 | ||
|
|
a967970419 | ||
|
|
64baa141e7 | ||
|
|
49ab9ea931 | ||
|
|
a8c41914c4 | ||
|
|
9951fe9b1d | ||
|
|
cfd4cb6624 | ||
|
|
6fec73a3c4 | ||
|
|
29cc0cd378 | ||
|
|
6c47b5f868 | ||
|
|
6c38a48af1 | ||
|
|
6c4dd3670d | ||
|
|
2a12f72b28 | ||
|
|
f91b0f7cfa | ||
|
|
af816227bc | ||
|
|
59b6f73a06 | ||
|
|
266d5ad773 | ||
|
|
db6200a998 | ||
|
|
70a41e4fc2 | ||
|
|
e96f055238 | ||
|
|
a200d30f04 | ||
|
|
666a296a62 | ||
|
|
545defc852 | ||
|
|
1b0f8206ee | ||
|
|
c2cb3d3255 | ||
|
|
a0377f9752 | ||
|
|
c914ecfb05 | ||
|
|
57afd0bb11 | ||
|
|
8db1c08744 | ||
|
|
08e4919ae1 | ||
|
|
ef9d75f32f | ||
|
|
3e35545edc | ||
|
|
446c34eceb | ||
|
|
90285704e4 | ||
|
|
a7f73d7f7e | ||
|
|
d66c6a70eb | ||
|
|
ad54f61429 | ||
|
|
9007e73cb6 | ||
|
|
0d106a89b7 | ||
|
|
0d59e2f13a | ||
|
|
8850f6128f | ||
|
|
a1af8014e8 | ||
|
|
c8fee60023 | ||
|
|
d8c70a8b94 | ||
|
|
b70cb48e0b | ||
|
|
5b8746c702 | ||
|
|
f2c0c65f98 | ||
|
|
06021fad99 | ||
|
|
bd67b3f82e | ||
|
|
8e2acc82e0 | ||
|
|
85f212293d | ||
|
|
72a1d67709 | ||
|
|
638f36c0c5 | ||
|
|
f769abd70b | ||
|
|
3a02ef9c55 | ||
|
|
38ea9aa4e7 | ||
|
|
acbe4ff35f | ||
|
|
b5e2f54bf8 | ||
|
|
e2411b3518 | ||
|
|
44a1979b78 | ||
|
|
bccdeee779 | ||
|
|
5cb041275d | ||
|
|
27c866b3c3 | ||
|
|
c127d65605 | ||
|
|
f15d2b97f8 | ||
|
|
1f4906cc40 | ||
|
|
f8075f69c0 | ||
|
|
fd0fd47bb2 | ||
|
|
a41c9565f1 | ||
|
|
7fc1d5c11c | ||
|
|
222ddd4b2f | ||
|
|
ddd3753cde | ||
|
|
b9d434dcd4 | ||
|
|
6a3513f8e9 | ||
|
|
21bf92608d | ||
|
|
bb617b8dd2 | ||
|
|
5fa662bfae | ||
|
|
467c529fdc | ||
|
|
7773ff22b9 | ||
|
|
1867e0e482 | ||
|
|
67c9400918 | ||
|
|
7917f868e9 | ||
|
|
5619b2d8be | ||
|
|
9b15b942cb | ||
|
|
5b3e201d06 | ||
|
|
8470c9b315 | ||
|
|
dce63db1e6 | ||
|
|
278967b028 | ||
|
|
7082ea1c56 | ||
|
|
c42b104fe5 | ||
|
|
e546706f4c | ||
|
|
6d5e950235 | ||
|
|
665472cf69 | ||
|
|
468b055005 | ||
|
|
895f943270 | ||
|
|
3eaa90203b | ||
|
|
79bd867db5 | ||
|
|
e265681a48 | ||
|
|
cac5d92c7d | ||
|
|
b6e9b18ce9 | ||
|
|
849e286df0 | ||
|
|
b6ce7b8feb | ||
|
|
7b7265347c | ||
|
|
e675389871 | ||
|
|
b548430688 | ||
|
|
b45d85089e | ||
|
|
8f701859ad | ||
|
|
78c9c71365 | ||
|
|
5d8752eea0 | ||
|
|
6452669803 | ||
|
|
bf750451f1 | ||
|
|
83b11a8b35 | ||
|
|
42da37e737 | ||
|
|
0f335cda27 | ||
|
|
a6c24bb44f | ||
|
|
e975ea7e74 | ||
|
|
92ec44cf4a | ||
|
|
8da9fa869f | ||
|
|
67f3571a4f | ||
|
|
8710940952 | ||
|
|
7295678c34 | ||
|
|
a037e8e429 | ||
|
|
3da4395d10 | ||
|
|
f9f9663b2a | ||
|
|
a922c1f226 | ||
|
|
9069dcba54 | ||
|
|
7fbe4b5bc9 | ||
|
|
9ebd9f1d24 | ||
|
|
88b9e87c6e | ||
|
|
d4886607f0 | ||
|
|
1546e9ccc4 | ||
|
|
f25da87043 | ||
|
|
2ac915cd93 | ||
|
|
fa89c6fa73 | ||
|
|
c4d21a4666 | ||
|
|
baa6056c4c | ||
|
|
dc24132a7d |
30
.build/zip-package.mjs
Normal file
30
.build/zip-package.mjs
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import AdmZip from 'adm-zip';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
// Get __dirname in ESM
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
const pkg = JSON.parse(
|
||||
readFileSync(path.join(__dirname, '../core', 'package.json'), 'utf8')
|
||||
)
|
||||
|
||||
// Create zip instance and add folder
|
||||
const zip = new AdmZip();
|
||||
zip.addLocalFolder(path.join(__dirname, '../preview/dist'), 'dashboard');
|
||||
|
||||
zip.addLocalFile(path.join(__dirname, '../preview/static', 'og.png'), '.', 'preview.png');
|
||||
|
||||
zip.addFile("documentation.url", Buffer.from("[InternetShortcut]\nURL = https://tabler.io/docs"));
|
||||
|
||||
|
||||
// Folder to zip and output path
|
||||
const outputZipPath = path.join(__dirname, '../packages-zip', `tabler-${pkg.version}.zip`);
|
||||
|
||||
// Write the zip file
|
||||
zip.writeZip(outputZipPath);
|
||||
|
||||
console.log(`Zipped folder to ${outputZipPath}`);
|
||||
6
.changeset/angry-bananas-brake.md
Normal file
6
.changeset/angry-bananas-brake.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"@tabler/core": minor
|
||||
"@tabler/preview": minor
|
||||
---
|
||||
|
||||
Added new "Pay" page with dedicated layout, navigation link, and payment form (card + PayPal).
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Add SRI hashes to scripts and styles
|
||||
5
.changeset/chilled-pans-cheer.md
Normal file
5
.changeset/chilled-pans-cheer.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/preview": minor
|
||||
---
|
||||
|
||||
Add a color palette in the signing component
|
||||
@@ -3,8 +3,18 @@
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [],
|
||||
"linked": [],
|
||||
"linked": [
|
||||
[
|
||||
"@tabler/core",
|
||||
"@tabler/preview",
|
||||
"@tabler/docs"
|
||||
]
|
||||
],
|
||||
"access": "public",
|
||||
"baseBranch": "dev",
|
||||
"ignore": []
|
||||
"ignore": [],
|
||||
"privatePackages": {
|
||||
"version": true,
|
||||
"tag": false
|
||||
}
|
||||
}
|
||||
|
||||
5
.changeset/curvy-timers-sneeze.md
Normal file
5
.changeset/curvy-timers-sneeze.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/core": patch
|
||||
---
|
||||
|
||||
Fix icon alignment for `.btn-sm` and `.btn-xl` sizes
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Correct `aria-label` of app menu link
|
||||
5
.changeset/fresh-rockets-retire.md
Normal file
5
.changeset/fresh-rockets-retire.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/core": patch
|
||||
---
|
||||
|
||||
Fix mixed declarations in SCSS
|
||||
6
.changeset/late-pugs-breathe2.md
Normal file
6
.changeset/late-pugs-breathe2.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"@tabler/core": patch
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Introduced `bg-blur` utility for backdrop blur effects and increased container-tight width for layout flexibility.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Fix color badge in navbar menu
|
||||
5
.changeset/light-cooks-hug.md
Normal file
5
.changeset/light-cooks-hug.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Update icons to v3.34.1 (75 new icons)
|
||||
@@ -2,4 +2,4 @@
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Add "text features" menu item
|
||||
Update activity messages
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Add missing `tw` entry in `flags.json`
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Delete missing demo RTL style
|
||||
5
.changeset/three-seas-move.md
Normal file
5
.changeset/three-seas-move.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/core": patch
|
||||
---
|
||||
|
||||
Updated deprecated global functions (`map-merge`, `str-slice`, `percentage`, etc.) with their module-based equivalents (`map.merge`, `string.slice`, `math.percentage`, etc.).
|
||||
5
.changeset/tricky-moons-laugh.md
Normal file
5
.changeset/tricky-moons-laugh.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/docs": patch
|
||||
---
|
||||
|
||||
Fix Docs search in dark mode
|
||||
5
.changeset/twelve-tables-attack.md
Normal file
5
.changeset/twelve-tables-attack.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@tabler/preview": patch
|
||||
---
|
||||
|
||||
Fix responsive layputs in 'Form Elements' page
|
||||
171
.cursor/rules/html-elements.mdc
Normal file
171
.cursor/rules/html-elements.mdc
Normal file
@@ -0,0 +1,171 @@
|
||||
---
|
||||
description: Tabler Project HTML Elements Guidelines
|
||||
globs: ["**/*.html", "**/*.liquid", "**/*.md"]
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
## HTML Elements Guidelines
|
||||
|
||||
### 1. Icons
|
||||
|
||||
When you need to use an icon, always use the Tabler icon include syntax:
|
||||
|
||||
```html
|
||||
{% include "ui/icon.html" icon="ICON_NAME" %}
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
|
||||
- `{% include "ui/icon.html" icon="home" %}`
|
||||
- `{% include "ui/icon.html" icon="building-community" %}`
|
||||
- `{% include "ui/icon.html" icon="map-pin" %}`
|
||||
|
||||
### 2. Page Links
|
||||
|
||||
When linking to other pages, always use the relative page syntax:
|
||||
|
||||
```html
|
||||
href="{{ page | relative }}/url.html"
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
|
||||
- `href="{{ page | relative }}/job-post.html"`
|
||||
- `href="{{ page | relative }}/job-listing.html"`
|
||||
- `href="{{ page | relative }}/marketing/index.html"`
|
||||
|
||||
### 3. Static Generation
|
||||
|
||||
All pages are statically generated to HTML using Eleventy (11ty). Keep this in mind when:
|
||||
|
||||
- Writing frontmatter (must be static YAML, no Liquid templating)
|
||||
- Creating dynamic content (use Liquid templating in the body, not frontmatter)
|
||||
- Linking between pages (use relative paths)
|
||||
|
||||
### 4. Additional Guidelines
|
||||
|
||||
#### Frontmatter Rules
|
||||
|
||||
- Frontmatter must be static YAML
|
||||
- Cannot use Liquid templating in frontmatter
|
||||
- Use static values for title, permalink, etc.
|
||||
|
||||
#### Liquid Templating
|
||||
|
||||
- Use Liquid templating only in the HTML body
|
||||
- Access data using `{{ variable }}` syntax
|
||||
- Use `{% for %}` loops for dynamic content
|
||||
- Use `{% if %}` conditions for conditional rendering
|
||||
|
||||
#### File Structure
|
||||
|
||||
- Pages go in `preview/pages/`
|
||||
- Includes go in `shared/includes/`
|
||||
- Data files go in `shared/data/`
|
||||
- Documentation goes in `docs/content/`
|
||||
|
||||
#### CSS Classes
|
||||
|
||||
- Use Bootstrap 5 classes
|
||||
- Use Tabler's custom CSS classes
|
||||
- Follow the pattern: `--#{$prefix}component-property`
|
||||
|
||||
#### Accessibility
|
||||
|
||||
- Include proper ARIA labels
|
||||
- Use semantic HTML elements
|
||||
- Ensure proper heading hierarchy
|
||||
- Add alt text for images
|
||||
|
||||
### 5. Component Usage
|
||||
|
||||
#### Cards
|
||||
|
||||
- Use `card` class for main containers
|
||||
- Use `card-body` for content areas
|
||||
- Use `card-header` for card headers
|
||||
- Use `card-title` for card title
|
||||
|
||||
#### Buttons
|
||||
|
||||
- Use `btn` class for all buttons
|
||||
- Use `btn-primary` for primary actions
|
||||
- Use `btn` for secondary actions, don't use `btn-outline-secondary`
|
||||
- Use `btn-sm` for smaller buttons
|
||||
- Use `w-100` for full-width buttons
|
||||
|
||||
#### Forms
|
||||
|
||||
- Use `form-control` for input fields
|
||||
- Use `form-label` for labels
|
||||
- Use `form-check` for checkboxes/radio buttons
|
||||
- Use `form-select` for dropdowns
|
||||
|
||||
#### Layout
|
||||
|
||||
- Use Bootstrap grid system (`row`, `col-*`)
|
||||
- Use `container-xl` for main containers
|
||||
- Use `page-wrapper` for page structure
|
||||
- Use `page-body` for main content area
|
||||
|
||||
#### Badges
|
||||
|
||||
- Use `badge` class for badges
|
||||
- Don't use `badge-outline` for badges, use `badge` class instead
|
||||
- Don't use `badge-primary` for badges, use `badge` class instead
|
||||
- Don't change the text color of badges
|
||||
|
||||
#### Markdown
|
||||
|
||||
- Use `markdown` class for markdown content
|
||||
- Apply to containers that render markdown content
|
||||
- Example: `<div class="markdown">...</div>`
|
||||
|
||||
#### Rest of the rules
|
||||
|
||||
- Read the rest of the rules in the `docs/content/ui/` folder
|
||||
|
||||
### 6. Data Integration
|
||||
|
||||
#### Using JSON Data
|
||||
|
||||
```liquid
|
||||
{% for item in items %}
|
||||
<div>{{ item.name }}</div>
|
||||
{% endfor %}
|
||||
```
|
||||
|
||||
#### Conditional Rendering
|
||||
|
||||
```liquid
|
||||
{% if condition %}
|
||||
<div>Content</div>
|
||||
{% endif %}
|
||||
```
|
||||
|
||||
#### Including Components
|
||||
|
||||
```liquid
|
||||
{% include "ui/button.html" color="primary" text="Click me" %}
|
||||
```
|
||||
|
||||
### 7. Best Practices
|
||||
|
||||
#### Performance
|
||||
|
||||
- Minimize nested loops
|
||||
- Use `limit` filters when iterating large datasets
|
||||
- Optimize images for web use
|
||||
|
||||
#### Code Organization
|
||||
|
||||
- Keep components modular and reusable
|
||||
- Use consistent naming conventions
|
||||
- Comment complex logic
|
||||
- Group related functionality together
|
||||
|
||||
#### Error Handling
|
||||
|
||||
- Always check if data exists before using it
|
||||
- Provide fallback content for missing data
|
||||
- Use `{% if %}` guards for optional content
|
||||
56
.cursor/rules/main.mdc
Normal file
56
.cursor/rules/main.mdc
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
description: Tabler Project Rules
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
## Documentation Standards
|
||||
|
||||
- Always write documentation in English (not Polish) for technical content
|
||||
- Use clear, descriptive headings with proper hierarchy (##, ###)
|
||||
- Include practical examples with code snippets
|
||||
- Add explanations for each component's purpose and usage
|
||||
- Use consistent formatting for code blocks and examples
|
||||
|
||||
## CSS/SCSS Guidelines
|
||||
|
||||
- Follow Tabler's CSS custom properties pattern: `--#{$prefix}component-property`
|
||||
- Use semantic class names that describe purpose, not appearance
|
||||
- Maintain consistent spacing and indentation in SCSS files
|
||||
- Group related styles together with clear comments
|
||||
- Use Bootstrap-compatible class naming conventions
|
||||
|
||||
## Component Documentation Structure
|
||||
|
||||
- Start with a brief description of the component's purpose
|
||||
- Show basic usage examples first
|
||||
- Include variations and modifiers
|
||||
- Add accessibility considerations where relevant
|
||||
- Provide code examples that are copy-paste ready
|
||||
|
||||
## File Organization
|
||||
|
||||
- Keep documentation files in `docs/content/ui/components/`
|
||||
- Use consistent naming: lowercase with hyphens
|
||||
- Include frontmatter with title, summary, and description
|
||||
- Link to Bootstrap documentation when relevant
|
||||
|
||||
## Code Examples
|
||||
|
||||
- Use Liquid templating syntax for dynamic examples
|
||||
- Include both HTML and rendered output
|
||||
- Show responsive behavior where applicable
|
||||
- Demonstrate proper accessibility attributes
|
||||
|
||||
## Git Commit Messages
|
||||
|
||||
- Use English for commit messages
|
||||
- Follow conventional commit format when possible
|
||||
- Be descriptive about what was changed and why
|
||||
|
||||
## Project-Specific Conventions
|
||||
|
||||
- Tabler uses Bootstrap 5 as a foundation
|
||||
- Custom components extend Bootstrap functionality
|
||||
- Documentation should be comprehensive but concise
|
||||
- Examples should be practical and immediately usable
|
||||
4
.github/workflows/argos.yml
vendored
4
.github/workflows/argos.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
if: false
|
||||
steps:
|
||||
- name: Clone repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Cache turbo build setup
|
||||
uses: actions/cache@v4
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
${{ runner.os }}-turbo-
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: "${{ env.NODE }}"
|
||||
|
||||
|
||||
4
.github/workflows/bundlewatch.yml
vendored
4
.github/workflows/bundlewatch.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Clone repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Cache turbo build setup
|
||||
uses: actions/cache@v4
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
${{ runner.os }}-turbo-
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: "${{ env.NODE }}"
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
2
.github/workflows/close_inactive.yml
vendored
2
.github/workflows/close_inactive.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
pull-requests: write
|
||||
issues: write
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
days-before-issue-stale: 360
|
||||
days-before-issue-close: 14
|
||||
|
||||
7
.github/workflows/lockfiles.yaml
vendored
7
.github/workflows/lockfiles.yaml
vendored
@@ -12,11 +12,10 @@ jobs:
|
||||
name: Verify lock file integrity
|
||||
steps:
|
||||
- name: Clone Tabler
|
||||
uses: actions/checkout@v4
|
||||
|
||||
uses: actions/checkout@v5
|
||||
- name: Prevent lock file change
|
||||
uses: xalvarez/prevent-file-change-action@v2
|
||||
with:
|
||||
githubToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
pattern: Gemfile.lock|pnpm-lock.json
|
||||
trustedAuthors: codecalm, dependabot
|
||||
pattern: Gemfile.lock|pnpm-lock.json|pnpm-lock.yaml
|
||||
trustedAuthors: codecalm, BG-Software-BG, dependabot
|
||||
|
||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@@ -21,10 +21,10 @@ jobs:
|
||||
pull-requests: write # to create pull request
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node.js 18
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
|
||||
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Clone repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Cache turbo build setup
|
||||
uses: actions/cache@v4
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
${{ runner.os }}-turbo-
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: "${{ env.NODE }}"
|
||||
|
||||
|
||||
26
README.md
26
README.md
@@ -1,5 +1,5 @@
|
||||
<p align="center">
|
||||
<a href="https://github.com/tabler/tabler"><img src="https://raw.githubusercontent.com/tabler/tabler/refs/heads/dev/preview/static/logo.svg" alt="A premium and open source dashboard template with a responsive and high-quality UI." width="300"></a><br><br>
|
||||
<a href="https://github.com/tabler/tabler"><img src="https://raw.githubusercontent.com/tabler/tabler/refs/heads/dev/shared/static/logo.svg" alt="A premium and open source dashboard template with a responsive and high-quality UI." width="300"></a><br><br>
|
||||
A premium and open source dashboard template with a responsive and high-quality UI.
|
||||
</p>
|
||||
|
||||
@@ -23,24 +23,8 @@ A premium and open source dashboard template with a responsive and high-quality
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sponsors/codecalm" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/preview/static/sponsor-banner-homepage.svg" alt="Sponsor Banner">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## Testing
|
||||
|
||||
<p align="center">Visual testing with:</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://argos-ci.com/" target="_blank">
|
||||
<picture>
|
||||
<img src="https://github.com/user-attachments/assets/7d231a26-eff5-4fc5-8392-b2a679a7c572" alt="Argos-CI" height="164" />
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">Browser testing via:</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -59,7 +43,7 @@ Tabler is fully responsive and compatible with all modern browsers. Thanks to it
|
||||
|
||||
<p align="center">
|
||||
<a href="https://preview.tabler.io" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/preview/static/tabler-preview.png" alt="Tabler Preview">
|
||||
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview.png" alt="Tabler Preview">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -75,7 +59,7 @@ We've created this admin panel for everyone who wants to create templates based
|
||||
|
||||
## 📖 Documentation
|
||||
|
||||
The documentation is available at https://tabler.io/docs/
|
||||
The documentation is available at https://docs.tabler.io/
|
||||
|
||||
## 🪴 Project Activity
|
||||
|
||||
@@ -140,8 +124,8 @@ pnpm install
|
||||
```sh
|
||||
pnpm run start
|
||||
```
|
||||
5. Open [http://localhost:3000](http://localhost:3000) in your browser, and voilà.
|
||||
Any change in the `/src` directory will rebuild the application and refresh the page.
|
||||
5. Open [http://localhost:3000](http://localhost:3000) to view the preview website in your browser, or [http://localhost:3010](http://localhost:3010) to view the documentation website - and voilà.
|
||||
Changes to most of the source files of Tabler core, preview and docs will rebuild the application and refresh the page.
|
||||
|
||||
**Note**:
|
||||
If you wish to perform a one-off build without auto-refresh on any changes, you can run:
|
||||
|
||||
33
core/.build/copy-libs.mjs
Normal file
33
core/.build/copy-libs.mjs
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict'
|
||||
|
||||
import { existsSync, mkdirSync, lstatSync } from 'fs'
|
||||
import { emptyDirSync, copySync } from 'fs-extra/esm'
|
||||
import libs from '../libs.json' with { type: 'json' }
|
||||
import { fileURLToPath } from 'url'
|
||||
import { join, dirname } from 'node:path';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
emptyDirSync(join(__dirname, '..', 'dist/libs'))
|
||||
|
||||
for(const name in libs) {
|
||||
const { npm } = libs[name]
|
||||
|
||||
if (npm) {
|
||||
const from = join(__dirname, '..', `node_modules/${npm}`)
|
||||
const to = join(__dirname, '..', `dist/libs/${npm}`)
|
||||
|
||||
// create dir in dist/libs
|
||||
if (!existsSync(to)) {
|
||||
mkdirSync(to, { recursive: true })
|
||||
}
|
||||
|
||||
copySync(from, to, {
|
||||
dereference: true,
|
||||
})
|
||||
|
||||
console.log(`Successfully copied ${npm}`)
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,66 @@
|
||||
# @tabler/core
|
||||
|
||||
## 1.4.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 9951fe9: Enhance button and hover animations
|
||||
- a200d30: Improve breadcrumb styles
|
||||
- 49ab9ea: Add new Tabler Illustrations
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 6c4dd36: Update class names from `*-left`, `*-right` to `*-start`, `*-end`
|
||||
- 6fec73a: Fix relative line heights in buttons
|
||||
- db6200a: Remove `license_key` option from HugeRTE init object
|
||||
- e96f055: Add different favicon to development environment
|
||||
- 6c38a48: Update Bootstrap to v5.3.7
|
||||
- 2a12f72: Update CSS calculations to use `calc()`
|
||||
- 666a296: Fix list group item hoverable only with `.list-group-hoverable` class
|
||||
- cfd4cb6: Fix `.pagination-link` hover styles to non-active items
|
||||
|
||||
## 1.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 446c34e: Fix README file in core package
|
||||
|
||||
## 1.3.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- a7f73d7: Fix README file in core package
|
||||
|
||||
## 1.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- a1af801: Add FullCalendar integration
|
||||
- b9d434d: Add new charts to dashboard pages
|
||||
- 79bd867: Add new form layout page
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cac5d92: Update illustrations to v1.7
|
||||
- f94b153: Add SRI hashes to scripts and styles
|
||||
- c127d65: Fix colour picker preview page not displaying correctly
|
||||
- b6e9b18: Update icons to v3.31.0
|
||||
- 8850f61: Enhance pagination component with new styles
|
||||
- 9910dd0: Add "text features" menu item
|
||||
- 638f36c: Refactor SCSS variable names for shadows
|
||||
- 0d501e9: Correct `aria-label` of app menu link
|
||||
- 3a02ef9: Fix some marketing site rows overflowing on mobile
|
||||
- fd0fd47: Improve card footer layout and enhance entry display format in invoices
|
||||
- 74e5d26: Fix color badge in navbar menu
|
||||
- 72a1d67: Add clipboard functionality to Tabler documentation
|
||||
- bb617b8: Fix colour swatches on small screens
|
||||
- d73d78e: Add missing `tw` entry in `flags.json`
|
||||
- 19a3d20: Delete missing demo RTL style
|
||||
- b5e2f54: Enhance dropdown components for better accessibility
|
||||
- a41c956: Remove unnecessary `!important` from body padding
|
||||
- e675389: Fix missing border-radius to `.card-header-tabs`
|
||||
- 9007e73: Fix FAQ accordion structure
|
||||
|
||||
## 1.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
42
core/README.md
Normal file
42
core/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Tabler Core
|
||||
|
||||
Tabler Core is a set of components and utilities for building web applications. It provides a collection of pre-designed components, such as buttons, forms, modals, and more, that can be easily customized and integrated into your projects.
|
||||
|
||||
## 🔎 Preview
|
||||
|
||||
Tabler is fully responsive and compatible with all modern browsers. Thanks to its modern and user-friendly design you can create a fully functional interface that users will love! Choose the layouts and components you need and customize them to make your design consistent and eye-catching. Every component has been created with attention to detail to make your interface beautiful!
|
||||
|
||||
<p align="center">
|
||||
<a href="https://preview.tabler.io" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/tabler/tabler/dev/shared/static/tabler-preview.png" alt="Tabler Preview">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## Installation
|
||||
|
||||
To install Tabler Core, you can use npm or yarn. Run one of the following commands in your terminal:
|
||||
|
||||
```bash
|
||||
npm install @tabler/core
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```bash
|
||||
pnpm add @tabler/core
|
||||
```
|
||||
|
||||
## Sponsors
|
||||
|
||||
**If you want to support our project and help us grow it, you can [become a sponsor on GitHub](https://github.com/sponsors/codecalm) or just [donate on PayPal](https://paypal.me/codecalm) :)**
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sponsors/codecalm">
|
||||
<img src="https://cdn.jsdelivr.net/gh/tabler/sponsors@latest/sponsors.svg" alt="Tabler sponsors">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
## License
|
||||
|
||||
See the [LICENSE](https://github.com/tabler/tabler/blob/master/LICENSE) file.
|
||||
@@ -5,15 +5,19 @@ if (elements.length) {
|
||||
let options = {};
|
||||
try {
|
||||
const dataOptions = element.getAttribute('data-countup') ? JSON.parse(element.getAttribute('data-countup')) : {};
|
||||
options = Object.assign({'enableScrollSpy': true}, dataOptions);
|
||||
options = Object.assign({
|
||||
'enableScrollSpy': true
|
||||
}, dataOptions);
|
||||
|
||||
} catch (error) {}
|
||||
|
||||
const value = parseInt(element.innerHTML, 10);
|
||||
|
||||
const countUp = new window.countUp.CountUp(element, value, options);
|
||||
if (!countUp.error) {
|
||||
countUp.start();
|
||||
if (window.countUp && window.countUp.CountUp) {
|
||||
const countUp = new window.countUp.CountUp(element, value, options);
|
||||
if (!countUp.error) {
|
||||
countUp.start();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
25
core/js/src/sortable.js
Normal file
25
core/js/src/sortable.js
Normal file
@@ -0,0 +1,25 @@
|
||||
// SortableJS plugin
|
||||
// Initializes Sortable on elements marked with [data-sortable]
|
||||
// Allows options via JSON in data attribute: data-sortable='{"animation":150}'
|
||||
|
||||
const sortableElements = document.querySelectorAll('[data-sortable]');
|
||||
|
||||
if (sortableElements.length) {
|
||||
sortableElements.forEach(function (element) {
|
||||
let options = {};
|
||||
|
||||
try {
|
||||
const rawOptions = element.getAttribute('data-sortable');
|
||||
options = rawOptions ? JSON.parse(rawOptions) : {};
|
||||
} catch (e) {
|
||||
// ignore invalid JSON
|
||||
}
|
||||
|
||||
if (window.Sortable) {
|
||||
// eslint-disable-next-line no-new
|
||||
new window.Sortable(element, options);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import "./src/popover"
|
||||
import "./src/switch-icon"
|
||||
import "./src/tab"
|
||||
import "./src/toast"
|
||||
import "./src/sortable"
|
||||
|
||||
export * as bootstrap from "bootstrap"
|
||||
export * as tabler from "./src/tabler"
|
||||
|
||||
170
core/libs.json
Normal file
170
core/libs.json
Normal file
@@ -0,0 +1,170 @@
|
||||
{
|
||||
"imask": {
|
||||
"npm": "imask",
|
||||
"js": [
|
||||
"dist/imask.min.js"
|
||||
]
|
||||
},
|
||||
"autosize": {
|
||||
"npm": "autosize",
|
||||
"js": [
|
||||
"dist/autosize.min.js"
|
||||
]
|
||||
},
|
||||
"apexcharts": {
|
||||
"npm": "apexcharts",
|
||||
"js": [
|
||||
"dist/apexcharts.min.js"
|
||||
]
|
||||
},
|
||||
"nouislider": {
|
||||
"npm": "nouislider",
|
||||
"js": [
|
||||
"dist/nouislider.min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/nouislider.min.css"
|
||||
]
|
||||
},
|
||||
"countup": {
|
||||
"npm": "countup.js",
|
||||
"js": [
|
||||
"dist/countUp.umd.js"
|
||||
]
|
||||
},
|
||||
"lists": {
|
||||
"npm": "list.js",
|
||||
"js": [
|
||||
"dist/list.min.js"
|
||||
]
|
||||
},
|
||||
"sortablejs": {
|
||||
"npm": "sortablejs",
|
||||
"js": [
|
||||
"Sortable.min.js"
|
||||
]
|
||||
},
|
||||
"masonry": {
|
||||
"js": [
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js"
|
||||
]
|
||||
},
|
||||
"mapbox": {
|
||||
"js": [
|
||||
"https://api.mapbox.com/mapbox-gl-js/v1.8.0/mapbox-gl.js"
|
||||
],
|
||||
"css": [
|
||||
"https://api.mapbox.com/mapbox-gl-js/v1.8.0/mapbox-gl.css"
|
||||
]
|
||||
},
|
||||
"google-maps": {
|
||||
"js": [
|
||||
"https://maps.googleapis.com/maps/api/js?key=GOOGLE_MAPS_KEY"
|
||||
]
|
||||
},
|
||||
"litepicker": {
|
||||
"npm": "litepicker",
|
||||
"js": [
|
||||
"dist/litepicker.js"
|
||||
]
|
||||
},
|
||||
"tom-select": {
|
||||
"npm": "tom-select",
|
||||
"js": [
|
||||
"dist/js/tom-select.base.min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/css/tom-select.bootstrap5.min.css"
|
||||
]
|
||||
},
|
||||
"jsvectormap": {
|
||||
"npm": "jsvectormap",
|
||||
"js": [
|
||||
"dist/jsvectormap.min.js",
|
||||
"dist/maps/world.js",
|
||||
"dist/maps/world-merc.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/jsvectormap.css"
|
||||
]
|
||||
},
|
||||
"fslightbox": {
|
||||
"npm": "fslightbox",
|
||||
"js": [
|
||||
"index.js"
|
||||
]
|
||||
},
|
||||
"hugerte": {
|
||||
"npm": "hugerte",
|
||||
"js": [
|
||||
"hugerte.min.js"
|
||||
]
|
||||
},
|
||||
"plyr": {
|
||||
"npm": "plyr",
|
||||
"js": [
|
||||
"dist/plyr.min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/plyr.css"
|
||||
]
|
||||
},
|
||||
"dropzone": {
|
||||
"npm": "dropzone",
|
||||
"js": [
|
||||
"dist/dropzone-min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/dropzone.css"
|
||||
]
|
||||
},
|
||||
"star-rating.js": {
|
||||
"npm": "star-rating.js",
|
||||
"js": [
|
||||
"dist/star-rating.min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/star-rating.min.css"
|
||||
]
|
||||
},
|
||||
"coloris.js": {
|
||||
"npm": "@melloware/coloris",
|
||||
"js": [
|
||||
"dist/umd/coloris.min.js"
|
||||
],
|
||||
"css": [
|
||||
"dist/coloris.min.css"
|
||||
]
|
||||
},
|
||||
"typed.js": {
|
||||
"npm": "typed.js",
|
||||
"js": [
|
||||
"dist/typed.umd.js"
|
||||
]
|
||||
},
|
||||
"signature_pad": {
|
||||
"npm": "signature_pad",
|
||||
"js": [
|
||||
"dist/signature_pad.umd.min.js"
|
||||
]
|
||||
},
|
||||
"clipboard": {
|
||||
"npm": "clipboard",
|
||||
"js": [
|
||||
"dist/clipboard.min.js"
|
||||
]
|
||||
},
|
||||
"fullcalendar": {
|
||||
"npm": "fullcalendar",
|
||||
"js": [
|
||||
"index.global.min.js"
|
||||
]
|
||||
},
|
||||
"turbo": {
|
||||
"npm": "@hotwired/turbo",
|
||||
"js": [
|
||||
"dist/turbo.es2017-umd.js"
|
||||
],
|
||||
"head": true
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"name": "@tabler/core",
|
||||
"version": "1.2.0",
|
||||
"version": "1.4.0",
|
||||
"description": "Premium and Open Source dashboard template with responsive and high quality UI.",
|
||||
"homepage": "https://tabler.io",
|
||||
"scripts": {
|
||||
"dev": "pnpm run watch",
|
||||
"dev": "pnpm run clean && pnpm run copy && pnpm run watch",
|
||||
"build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy && pnpm run generate-sri",
|
||||
"clean": "shx rm -rf dist demo",
|
||||
"css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-rtl && pnpm run css-minify && pnpm run css-banner",
|
||||
"css-compile": "sass scss/:dist/css/ --no-source-map --load-path=node_modules",
|
||||
"css-compile": "sass --no-source-map --load-path=node_modules --style expanded scss/:dist/css/",
|
||||
"css-banner": "node .build/add-banner.mjs",
|
||||
"css-prefix": "postcss --config .build/postcss.config.mjs --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
|
||||
"css-rtl": "cross-env NODE_ENV=RTL postcss --config .build/postcss.config.mjs --dir \"dist/css\" --ext \".rtl.css\" \"dist/css/*.css\" \"!dist/css/*.min.css\" \"!dist/css/*.rtl.css\"",
|
||||
@@ -26,8 +26,9 @@
|
||||
"js-minify-standalone-esm": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/tabler.esm.js.map,includeSources,url=tabler.esm.min.js.map\" --output dist/js/tabler.esm.min.js dist/js/tabler.esm.js",
|
||||
"js-minify-theme": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/tabler-theme.js.map,includeSources,url=tabler-theme.min.js.map\" --output dist/js/tabler-theme.min.js dist/js/tabler-theme.js",
|
||||
"js-minify-theme-esm": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/tabler-theme.esm.js.map,includeSources,url=tabler-theme.esm.min.js.map\" --output dist/js/tabler-theme.esm.min.js dist/js/tabler-theme.esm.js",
|
||||
"copy": "pnpm run copy-img",
|
||||
"copy": "pnpm run copy-img && pnpm run copy-libs",
|
||||
"copy-img": "shx mkdir -p dist/img && shx cp -rf img/* dist/img",
|
||||
"copy-libs": "node .build/copy-libs.mjs",
|
||||
"watch": "concurrently \"pnpm run watch-css\" \"pnpm run watch-js\"",
|
||||
"watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css-compile && pnpm run css-prefix\"",
|
||||
"watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js-compile\"",
|
||||
@@ -66,7 +67,8 @@
|
||||
"dist/**/*",
|
||||
"js/**/*.{js,map}",
|
||||
"img/**/*.{svg}",
|
||||
"scss/**/*.scss"
|
||||
"scss/**/*.scss",
|
||||
"libs.json"
|
||||
],
|
||||
"style": "dist/css/tabler.css",
|
||||
"sass": "scss/tabler.scss",
|
||||
@@ -144,7 +146,32 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@popperjs/core": "^2.11.8",
|
||||
"bootstrap": "5.3.5"
|
||||
"bootstrap": "5.3.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@hotwired/turbo": "^8.0.13",
|
||||
"@melloware/coloris": "^0.25.0",
|
||||
"apexcharts": "3.54.1",
|
||||
"autosize": "^6.0.1",
|
||||
"choices.js": "^11.1.0",
|
||||
"clipboard": "^2.0.11",
|
||||
"countup.js": "^2.9.0",
|
||||
"dropzone": "^6.0.0-beta.2",
|
||||
"flatpickr": "^4.6.13",
|
||||
"fslightbox": "^3.6.1",
|
||||
"fullcalendar": "^6.1.18",
|
||||
"hugerte": "^1.0.9",
|
||||
"imask": "^7.6.1",
|
||||
"jsvectormap": "^1.7.0",
|
||||
"list.js": "^2.3.1",
|
||||
"litepicker": "^2.0.12",
|
||||
"nouislider": "^15.8.1",
|
||||
"plyr": "^3.7.8",
|
||||
"signature_pad": "^5.0.10",
|
||||
"sortablejs": "^1.15.0",
|
||||
"star-rating.js": "^4.3.1",
|
||||
"tom-select": "^2.4.3",
|
||||
"typed.js": "^2.1.0"
|
||||
},
|
||||
"directories": {
|
||||
"doc": "docs"
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
@import "bootstrap/scss/nav";
|
||||
@import "bootstrap/scss/navbar";
|
||||
@import "bootstrap/scss/card";
|
||||
@import "bootstrap/scss/breadcrumb";
|
||||
@import "bootstrap/scss/pagination";
|
||||
@import "bootstrap/scss/progress";
|
||||
@import "bootstrap/scss/list-group";
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// Config
|
||||
@import "bootstrap/scss/functions";
|
||||
@import "bootstrap/scss/variables";
|
||||
@import "bootstrap/scss/variables-dark";
|
||||
@import "bootstrap/scss/maps";
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:color";
|
||||
|
||||
@mixin caret($direction: down) {
|
||||
$selector: "after";
|
||||
|
||||
@@ -74,5 +76,5 @@
|
||||
// TODO: remove when https://github.com/twbs/bootstrap/pull/37425/ will be released
|
||||
//
|
||||
@function opaque($background, $foreground) {
|
||||
@return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);
|
||||
@return color.mix(rgba($foreground, 1), $background, color.alpha($foreground) * 100%);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import "bootstrap/scss/functions";
|
||||
|
||||
|
||||
@import "mixins";
|
||||
@import "variables";
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
@import "utils/opacity";
|
||||
@import "utils/shadow";
|
||||
@import "utils/text";
|
||||
@import "utils/hover";
|
||||
|
||||
@import "debug";
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
@use "sass:map";
|
||||
@import "config";
|
||||
|
||||
:root,
|
||||
@@ -30,7 +31,7 @@
|
||||
--#{$prefix}brand: #{$primary};
|
||||
|
||||
/** Theme colors */
|
||||
@each $name, $color in map-merge($theme-colors, $social-colors) {
|
||||
@each $name, $color in map.merge($theme-colors, $social-colors) {
|
||||
--#{$prefix}#{$name}: #{$color};
|
||||
--#{$prefix}#{$name}-rgb: #{to-rgb($color)};
|
||||
--#{$prefix}#{$name}-fg: #{if(contrast-ratio($color) > $min-contrast-ratio, var(--#{$prefix}light), var(--#{$prefix}dark))};
|
||||
@@ -42,9 +43,9 @@
|
||||
--#{$prefix}#{$name}-lt-rgb: #{to-rgb(theme-color-lighter($color))};
|
||||
}
|
||||
|
||||
/** Social colors */
|
||||
@each $name, $color in $social-colors {
|
||||
--#{$prefix}#{$name}: #{$color};
|
||||
/** Gray colors */
|
||||
@each $name, $color in $gray-colors {
|
||||
--#{$prefix}#{$name}-fg: #{if(contrast-ratio($color, white) > $min-contrast-ratio, var(--#{$prefix}white), var(--#{$prefix}body-color))};
|
||||
}
|
||||
|
||||
/** Spacers */
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
@use "sass:map";
|
||||
|
||||
$negative-spacers-extra: if(
|
||||
$enable-negative-margins,
|
||||
negativify-map(map-merge($spacers, $spacers-extra)),
|
||||
negativify-map(map.merge($spacers, $spacers-extra)),
|
||||
null
|
||||
);
|
||||
|
||||
|
||||
@@ -110,6 +110,13 @@ $utilities: (
|
||||
null: linear-gradient(var(--#{$prefix}gradient-direction, to right), var(--#{$prefix}gradient-stops, var(--#{$prefix}gradient-from, transparent), var(--#{$prefix}gradient-to, transparent))) no-repeat,
|
||||
),
|
||||
),
|
||||
"bg-blur": (
|
||||
property: backdrop-filter,
|
||||
class: bg-blur,
|
||||
values: (
|
||||
null: blur($backdrop-blur)
|
||||
)
|
||||
),
|
||||
"bg-gradient-direction": (
|
||||
property: --#{$prefix}gradient-direction,
|
||||
class: bg-gradient,
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
@use "sass:string";
|
||||
@use "sass:math";
|
||||
@use "sass:map";
|
||||
@use "sass:color";
|
||||
|
||||
$prefix: "tblr-" !default;
|
||||
|
||||
// BASE CONFIG
|
||||
@@ -23,10 +28,10 @@ $font-google-monospaced: null !default;
|
||||
$font-local: null !default;
|
||||
$font-icons: () !default;
|
||||
|
||||
$font-family-sans-serif: unquote("#{if($font-local, "#{$font-local}, ", ' ')}#{if($font-google, "#{$font-google}, ", ' ')}") 'Inter Var', Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif !default;
|
||||
$font-family-monospace: unquote("#{if($font-google-monospaced, "#{$font-google-monospaced}, ", '')}") Monaco, Consolas, Liberation Mono, Courier New, monospace !default;
|
||||
$font-family-sans-serif: string.unquote("#{if($font-local, "#{$font-local}, ", ' ')}#{if($font-google, "#{$font-google}, ", ' ')}") 'Inter Var', Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif !default;
|
||||
$font-family-monospace: string.unquote("#{if($font-google-monospaced, "#{$font-google-monospaced}, ", '')}") Monaco, Consolas, Liberation Mono, Courier New, monospace !default;
|
||||
$font-family-serif: "Georgia", "Times New Roman", times, serif !default;
|
||||
$font-family-comic: "Comic Sans MS", "Comic Sans", 'Chalkboard SE', 'Comic Neue', sans-serif, cursive !default;
|
||||
$font-family-comic: "Comic Sans MS", "Comic Sans", "Chalkboard SE", "Comic Neue", sans-serif, cursive !default;
|
||||
|
||||
//Icons
|
||||
$icon-stroke-width: 1.5 !default;
|
||||
@@ -52,9 +57,9 @@ $line-height-700: 3rem !default;
|
||||
|
||||
$font-size-base: 0.875rem !default;
|
||||
|
||||
$spacing-wide: .04em !default;
|
||||
$spacing-wide: 0.04em !default;
|
||||
$spacing-normal: 0 !default;
|
||||
$spacing-tight: -.04em !default;
|
||||
$spacing-tight: -0.04em !default;
|
||||
|
||||
$body-letter-spacing: 0 !default;
|
||||
|
||||
@@ -68,12 +73,12 @@ $headings-font-weight: var(--#{$prefix}font-weight-bold) !default;
|
||||
$headings-margin-bottom: var(--#{$prefix}spacer) !default;
|
||||
|
||||
$font-weights: (
|
||||
'light': $font-weight-light,
|
||||
'normal': $font-weight-normal,
|
||||
'medium': $font-weight-medium,
|
||||
'bold': $font-weight-bold,
|
||||
'black': $font-weight-black,
|
||||
'headings': $headings-font-weight,
|
||||
"light": $font-weight-light,
|
||||
"normal": $font-weight-normal,
|
||||
"medium": $font-weight-medium,
|
||||
"bold": $font-weight-bold,
|
||||
"black": $font-weight-black,
|
||||
"headings": $headings-font-weight,
|
||||
) !default;
|
||||
|
||||
$line-height-base: divide(1.25rem, $font-size-base) !default;
|
||||
@@ -99,8 +104,8 @@ $h5-line-height: 1rem !default;
|
||||
$h6-font-size: 0.625rem !default;
|
||||
$h6-line-height: 1rem !default;
|
||||
|
||||
$font-size-reative-xs: .71428571em !default;
|
||||
$font-size-reative-sm: .85714285em !default;
|
||||
$font-size-reative-xs: 0.71428571em !default;
|
||||
$font-size-reative-sm: 0.85714285em !default;
|
||||
$font-size-reative-md: 1em !default;
|
||||
|
||||
$font-sizes: (
|
||||
@@ -146,7 +151,7 @@ $border-light-opacity: 0.08 !default;
|
||||
$border-dark-opacity: 0.24 !default;
|
||||
$border-active-opacity: 0.58 !default;
|
||||
|
||||
$gray-50: #f9fafb !default;
|
||||
$gray-50: #f9fafb !default;
|
||||
$gray-100: #f3f4f6 !default;
|
||||
$gray-200: #e5e7eb !default;
|
||||
$gray-300: #d1d5db !default;
|
||||
@@ -200,7 +205,7 @@ $border-color-translucent: rgba(4, 32, 69, 0.1);
|
||||
$border-dark-color: $gray-400 !default;
|
||||
$border-dark-color-translucent: rgba(4, 32, 69, 0.27);
|
||||
|
||||
$border-active-color: mix($text-secondary, #ffffff, percentage($border-active-opacity)) !default;
|
||||
$border-active-color: color.mix($text-secondary, #ffffff, math.percentage($border-active-opacity)) !default;
|
||||
$border-active-color-translucent: rgba($text-secondary, $border-active-opacity) !default;
|
||||
|
||||
$active-bg: rgba(var(--#{$prefix}primary-rgb), 0.04) !default;
|
||||
@@ -210,7 +215,7 @@ $active-border-color: var(--#{$prefix}primary) !default;
|
||||
$hover-bg: rgba(var(--#{$prefix}secondary-rgb), 0.08) !default;
|
||||
|
||||
$disabled-bg: var(--#{$prefix}bg-surface-secondary) !default;
|
||||
$disabled-color: color-transparent(var(--#{$prefix}body-color), .4) !default;
|
||||
$disabled-color: color-transparent(var(--#{$prefix}body-color), 0.4) !default;
|
||||
|
||||
$primary: $blue !default;
|
||||
$secondary: $text-secondary !default;
|
||||
@@ -279,20 +284,21 @@ $gray-colors: (
|
||||
gray-700: $gray-700,
|
||||
gray-800: $gray-800,
|
||||
gray-900: $gray-900,
|
||||
gray-950: $gray-950,
|
||||
) !default;
|
||||
|
||||
$theme-colors: map-merge($theme-colors, map-merge($extra-colors, ()));
|
||||
$theme-colors: map.merge($theme-colors, map.merge($extra-colors, ()));
|
||||
|
||||
// BACKDROPS
|
||||
$backdrop-opacity: 24% !default;
|
||||
$backdrop-opacity: .32 !default;
|
||||
$backdrop-blur: 4px !default;
|
||||
$backdrop-bg: var(--#{$prefix}gray-800) !default;
|
||||
$backdrop-bg: light-dark(var(--#{$prefix}gray-800), var(--#{$prefix}black)) !default;
|
||||
$backdrops: (
|
||||
dark: color-mix(in srgb, var(--#{$prefix}color-dark), transparent var(--#{$prefix}backdrop-opacity)),
|
||||
light: color-mix(in srgb, var(--#{$prefix}color-light), transparent var(--#{$prefix}backdrop-opacity)),
|
||||
) !default;
|
||||
|
||||
// Borders
|
||||
// Borders
|
||||
$border-width: 1px !default;
|
||||
$border-width-wide: 2px !default;
|
||||
|
||||
@@ -320,10 +326,10 @@ $border-values: (
|
||||
$icon-color: var(--#{$prefix}gray-400) !default;
|
||||
|
||||
// Code
|
||||
$code-color: var(--#{$prefix}primary) !default;
|
||||
$code-color: light-dark(var(--#{$prefix}gray-600), var(--#{$prefix}gray-400)) !default;
|
||||
$code-bg: light-dark(var(--#{$prefix}gray-100), var(--#{$prefix}gray-900)) !default;
|
||||
$code-font-size: $font-size-reative-sm !default;
|
||||
$code-line-height: 1.25rem !default;
|
||||
$code-bg: var(--#{$prefix}primary-lt) !default;
|
||||
|
||||
$pre-padding: 1rem !default;
|
||||
$pre-bg: var(--#{$prefix}bg-surface-dark) !default;
|
||||
@@ -340,7 +346,7 @@ $kbd-border-radius: var(--#{$prefix}border-radius) !default;
|
||||
|
||||
// Avatars
|
||||
$avatar-size: 2.5rem !default;
|
||||
$avatar-status-size: .75rem !default;
|
||||
$avatar-status-size: 0.75rem !default;
|
||||
$avatar-font-size: 1rem !default;
|
||||
$avatar-icon-size: 1.5rem !default;
|
||||
$avatar-brand-size: 1.25rem !default;
|
||||
@@ -348,52 +354,52 @@ $avatar-bg: var(--#{$prefix}bg-surface-secondary) !default;
|
||||
$avatar-sizes: (
|
||||
"xxs": (
|
||||
size: 1rem,
|
||||
font-size: .5rem,
|
||||
icon-size: .5rem,
|
||||
status-size: .25rem,
|
||||
brand-size: .5rem
|
||||
font-size: 0.5rem,
|
||||
icon-size: 0.5rem,
|
||||
status-size: 0.25rem,
|
||||
brand-size: 0.5rem,
|
||||
),
|
||||
"xs": (
|
||||
size: 1.25rem,
|
||||
font-size: $h6-font-size,
|
||||
icon-size: .75rem,
|
||||
status-size: .375rem,
|
||||
brand-size: .75rem
|
||||
icon-size: 0.75rem,
|
||||
status-size: 0.375rem,
|
||||
brand-size: 0.75rem,
|
||||
),
|
||||
"sm": (
|
||||
size: 2rem,
|
||||
font-size: $h5-font-size,
|
||||
icon-size: 1.5rem,
|
||||
status-size: .5rem,
|
||||
brand-size: 1rem
|
||||
status-size: 0.5rem,
|
||||
brand-size: 1rem,
|
||||
),
|
||||
"md": (
|
||||
size: 2.5rem,
|
||||
font-size: $h4-font-size,
|
||||
icon-size: 1.5rem,
|
||||
status-size: .75rem,
|
||||
brand-size: 1.25rem
|
||||
status-size: 0.75rem,
|
||||
brand-size: 1.25rem,
|
||||
),
|
||||
"lg": (
|
||||
size: 3rem,
|
||||
font-size: $h2-font-size,
|
||||
icon-size: 2rem,
|
||||
status-size: .75rem,
|
||||
brand-size: 1.25rem
|
||||
status-size: 0.75rem,
|
||||
brand-size: 1.25rem,
|
||||
),
|
||||
"xl": (
|
||||
size: 5rem,
|
||||
font-size: 2rem,
|
||||
icon-size: 3rem,
|
||||
status-size: 1rem,
|
||||
brand-size: 1.25rem
|
||||
brand-size: 1.25rem,
|
||||
),
|
||||
"2xl": (
|
||||
size: 7rem,
|
||||
font-size: 3rem,
|
||||
icon-size: 5rem,
|
||||
status-size: 1rem,
|
||||
brand-size: 2rem
|
||||
brand-size: 2rem,
|
||||
),
|
||||
) !default;
|
||||
$avatar-border-radius: var(--#{$prefix}border-radius) !default;
|
||||
@@ -426,7 +432,7 @@ $grid-gutter-width: 1rem !default;
|
||||
|
||||
$container-variations: (
|
||||
slim: 16rem,
|
||||
tight: 30rem,
|
||||
tight: 32rem,
|
||||
narrow: 61.875rem,
|
||||
) !default;
|
||||
|
||||
@@ -476,7 +482,7 @@ $size-spacers: (
|
||||
full: 100%,
|
||||
) !default;
|
||||
|
||||
$size-values: map-merge(
|
||||
$size-values: map.merge(
|
||||
$spacers,
|
||||
(
|
||||
25: 25%,
|
||||
@@ -585,41 +591,71 @@ $badge-color: var(--#{$prefix}secondary) !default;
|
||||
$badge-bg-color: var(--#{$prefix}bg-surface-secondary) !default;
|
||||
|
||||
// Buttons
|
||||
$input-btn-line-height: $line-height-base !default;
|
||||
$input-btn-font-size: $font-size-base !default;
|
||||
$input-btn-font-family: var(--#{$prefix}body-font-face) !default;
|
||||
$input-btn-padding-y: 0.5rem - 0.0625rem !default;
|
||||
$input-btn-icon-size: $icon-size !default;
|
||||
$input-btn-border-width: var(--#{$prefix}border-width) !default;
|
||||
$input-btn-font-family: var(--#{$prefix}body-font-family) !default;
|
||||
$input-btn-focus-width: 0.25rem !default;
|
||||
|
||||
$input-btn-padding-y-sm: 0.3125rem !default;
|
||||
$input-btn-padding-x-sm: 0.5rem !default;
|
||||
$input-btn-font-size-sm: $h5-font-size !default;
|
||||
$input-btn-padding-x-sm: 0.25rem !default;
|
||||
$input-btn-padding-y-sm: 0.125rem - 0.0625rem !default;
|
||||
$input-btn-line-height-sm: 1rem !default;
|
||||
$input-btn-line-height-sm: divide(1rem, $input-btn-font-size-sm) !default;
|
||||
$input-btn-icon-size-sm: 1rem !default;
|
||||
|
||||
$input-btn-font-size-lg: $h2-font-size !default;
|
||||
$input-btn-padding-x-lg: 1.5rem !default;
|
||||
$input-btn-padding-y-lg: 0.75rem - 0.0625rem !default;
|
||||
$input-btn-line-height-lg: 2rem !default;
|
||||
$input-btn-icon-size-lg: 2rem !default;
|
||||
$input-btn-padding-y: 0.5625rem !default;
|
||||
$input-btn-padding-x: 1rem !default;
|
||||
$input-btn-line-height: 1.25rem !default;
|
||||
$input-btn-font-size: $font-size-base !default;
|
||||
$input-btn-icon-size: $icon-size !default;
|
||||
|
||||
$input-btn-padding-y-lg: 0.6875rem !default;
|
||||
$input-btn-padding-x-lg: 1.5rem !default;
|
||||
$input-btn-line-height-lg: 1.5rem !default;
|
||||
$input-btn-font-size-lg: $h3-font-size !default;
|
||||
$input-btn-icon-size-lg: 1.5rem !default;
|
||||
|
||||
$input-btn-padding-y-xl: 0.6875rem !default;
|
||||
$input-btn-padding-x-xl: 2rem !default;
|
||||
$input-btn-font-size-xl: $h1-font-size !default;
|
||||
$input-btn-line-height-xl: divide(2rem, $input-btn-font-size-lg) !default;
|
||||
$input-btn-icon-size-xl: 2rem !default;
|
||||
|
||||
$input-btn-focus-width: 0.25rem !default;
|
||||
|
||||
// Inputs
|
||||
$input-height: null !default;
|
||||
$input-height-sm: null !default;
|
||||
$input-height-lg: null !default;
|
||||
$input-border-radius: var(--#{$prefix}border-radius) !default;
|
||||
$input-padding-y: $input-btn-padding-y !default;
|
||||
$input-padding-x: $input-btn-padding-x !default;
|
||||
$input-color: var(--#{$prefix}body-color) !default;
|
||||
$input-focus-color: var(--#{$prefix}body-color) !default;
|
||||
$input-box-shadow: var(--#{$prefix}shadow-input) !default;
|
||||
|
||||
$input-border-width: $input-btn-border-width !default;
|
||||
$input-line-height: $input-btn-line-height !default;
|
||||
$input-height-border: calc(#{$input-border-width} * 2) !default;
|
||||
|
||||
$input-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$input-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$input-font-size-sm: $input-btn-font-size-sm !default;
|
||||
|
||||
$input-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$input-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$input-font-size-lg: $input-btn-font-size-lg !default;
|
||||
|
||||
$input-height-inner: add($input-line-height, calc($input-padding-y * 2)) !default;
|
||||
$input-height-inner-half: add($input-line-height, $input-padding-y) !default;
|
||||
$input-height-inner-quarter: add($input-line-height, calc($input-padding-y * 0.5)) !default;
|
||||
|
||||
$input-height: add($input-line-height, add(calc($input-padding-y * 2), $input-height-border, false)) !default;
|
||||
$input-height-sm: add($input-line-height, add(calc($input-padding-y-sm * 2), $input-height-border, false)) !default;
|
||||
$input-height-lg: add($input-line-height, add(calc($input-padding-y-lg * 2), $input-height-border, false)) !default;
|
||||
|
||||
// Buttons
|
||||
$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
|
||||
$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
|
||||
|
||||
$btn-disabled-opacity: .4 !default;
|
||||
$btn-padding-x: 1rem !default;
|
||||
$btn-disabled-opacity: 0.4 !default;
|
||||
$btn-font-weight: var(--#{$prefix}font-weight-medium) !default;
|
||||
$btn-border-color: var(--#{$prefix}border-color) !default;
|
||||
$btn-border-radius: var(--#{$prefix}border-radius) !default;
|
||||
@@ -627,8 +663,8 @@ $btn-box-shadow: var(--#{$prefix}shadow-input) !default;
|
||||
|
||||
// Cards
|
||||
$card-title-spacer-y: 1.25rem !default;
|
||||
$card-box-shadow: var(--#{$prefix}box-shadow-card) !default;
|
||||
$card-hover-box-shadow: var(--#{$prefix}box-shadow-card-hover) !default;
|
||||
$card-box-shadow: var(--#{$prefix}shadow-card) !default;
|
||||
$card-hover-box-shadow: var(--#{$prefix}shadow-card-hover) !default;
|
||||
|
||||
$card-bg: var(--#{$prefix}bg-surface) !default;
|
||||
$card-bg-hover: $white !default;
|
||||
@@ -718,9 +754,9 @@ $list-group-item-padding-y: $card-cap-padding-y !default;
|
||||
$list-group-item-padding-x: $card-cap-padding-x !default;
|
||||
|
||||
// Modals
|
||||
$modal-backdrop-opacity: 0.24 !default;
|
||||
$modal-backdrop-opacity: $backdrop-opacity !default;
|
||||
$modal-backdrop-bg: $backdrop-bg !default;
|
||||
$modal-backdrop-blur: 4px !default;
|
||||
$modal-backdrop-blur: $backdrop-blur !default;
|
||||
|
||||
$modal-fade-transform: translate(0, -1rem) !default;
|
||||
|
||||
@@ -810,7 +846,7 @@ $navbar-toggler-focus-width: 0 !default;
|
||||
$navbar-overlap-height: 9rem !default;
|
||||
|
||||
$navbar-nav-link-padding-x: $nav-link-padding-x !default;
|
||||
$navbar-nav-link-hover-bg: rgba(0, 0, 0, .04) !default;
|
||||
$navbar-nav-link-hover-bg: rgba(0, 0, 0, 0.04) !default;
|
||||
|
||||
$navbar-active-border-color: var(--#{$prefix}primary) !default;
|
||||
|
||||
@@ -827,9 +863,9 @@ $popover-bg: var(--#{$prefix}bg-surface) !default;
|
||||
$popover-header-bg: transparent !default;
|
||||
$popover-border-color: var(--#{$prefix}border-color) !default;
|
||||
$popover-body-color: inherit !default;
|
||||
$popover-body-padding-x: .5rem !default;
|
||||
$popover-body-padding-y: .5rem !default;
|
||||
$popover-box-shadow: var(--#{$prefix}box-shadow-lg) !default;
|
||||
$popover-body-padding-x: 0.5rem !default;
|
||||
$popover-body-padding-y: 0.5rem !default;
|
||||
$popover-box-shadow: var(--#{$prefix}shadow-lg) !default;
|
||||
|
||||
// Footer
|
||||
$footer-padding-y: 2rem !default;
|
||||
@@ -838,13 +874,17 @@ $footer-border-color: var(--#{$prefix}border-color) !default;
|
||||
$footer-color: var(--#{$prefix}gray-500) !default;
|
||||
|
||||
// Pagination
|
||||
$pagination-border-width: 0 !default;
|
||||
$pagination-padding-y: 0.25rem !default;
|
||||
$pagination-border-width: 1px !default;
|
||||
$pagination-border-color: transparent !default;
|
||||
$pagination-padding-y: calc(0.25rem + 1px) !default;
|
||||
$pagination-padding-x: 0.25rem !default;
|
||||
$pagination-color: var(--#{$prefix}gray-500) !default;
|
||||
$pagination-color: var(--#{$prefix}body-color) !default;
|
||||
$pagination-bg: transparent !default;
|
||||
$pagination-hover-bg: var(--#{$prefix}active-bg) !default;
|
||||
$pagination-hover-border-color: var(--#{$prefix}pagination-border-color) !default;
|
||||
$pagination-disabled-bg: transparent !default;
|
||||
$pagination-disabled-color: var(--#{$prefix}disabled-color) !default;
|
||||
$pagination-disabled-border-color: var(--#{$prefix}pagination-border-color) !default;
|
||||
|
||||
$pagination-active-bg: var(--#{$prefix}primary) !default;
|
||||
$pagination-active-border-color: var(--#{$prefix}primary) !default;
|
||||
@@ -891,7 +931,7 @@ $table-sort-desc-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org
|
||||
// Toasts
|
||||
$toast-border-color: var(--#{$prefix}border-color) !default;
|
||||
$toast-header-color: var(--#{$prefix}gray-500) !default;
|
||||
$toast-background-color: var(--#{$prefix}bg-surface) !default;
|
||||
$toast-background-color: var(--#{$prefix}bg-surface) !default;
|
||||
|
||||
// Tracking
|
||||
$tracking-height: 1.5rem !default;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
//
|
||||
// Clearfix
|
||||
//
|
||||
@@ -86,7 +88,7 @@
|
||||
}
|
||||
|
||||
// Responsive sticky top and bottom
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
@each $breakpoint in map.keys($grid-breakpoints) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
|
||||
@@ -1,39 +1,50 @@
|
||||
@keyframes pulse {
|
||||
from {
|
||||
opacity: 1;
|
||||
transform: scale3d(.8, .8, .8)
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1
|
||||
14% {
|
||||
transform: scale(1.25);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale3d(.8, .8, .8)
|
||||
28% {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
42% {
|
||||
transform: scale(1.25);
|
||||
}
|
||||
|
||||
70% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes tada {
|
||||
0% {
|
||||
transform: scale3d(1, 1, 1)
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
|
||||
10%, 5% {
|
||||
transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -5deg)
|
||||
10%,
|
||||
5% {
|
||||
transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -5deg);
|
||||
}
|
||||
|
||||
15%, 25%, 35%, 45% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 5deg)
|
||||
15%,
|
||||
25%,
|
||||
35%,
|
||||
45% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 5deg);
|
||||
}
|
||||
|
||||
20%, 30%, 40% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -5deg)
|
||||
20%,
|
||||
30%,
|
||||
40% {
|
||||
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -5deg);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scale3d(1, 1, 1)
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,3 +72,27 @@
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
0% {
|
||||
transform: scaleX(1);
|
||||
}
|
||||
|
||||
20% {
|
||||
transform: scale3d(0.9, 0.9, 0.9) rotate(-5deg);
|
||||
}
|
||||
|
||||
50%,
|
||||
70%,
|
||||
90% {
|
||||
transform: scale3d(1.25, 1.25, 1.25) rotate(5deg);
|
||||
}
|
||||
|
||||
60%,
|
||||
80% {
|
||||
transform: scale3d(1.25, 1.25, 1.25) rotate(-5deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: scaleX(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
// stylelint-disable property-no-vendor-prefix
|
||||
body {
|
||||
letter-spacing: $body-letter-spacing;
|
||||
@@ -7,7 +9,7 @@ body {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
padding: 0 !important;
|
||||
padding: 0;
|
||||
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
@@ -35,7 +37,7 @@ body {
|
||||
//
|
||||
.layout-boxed {
|
||||
--#{$prefix}theme-boxed-border-radius: 0;
|
||||
--#{$prefix}theme-boxed-width: #{map-get($container-max-widths, xxl)};
|
||||
--#{$prefix}theme-boxed-width: #{map.get($container-max-widths, xxl)};
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
background: $dark linear-gradient(to right, rgba(#fff, .1), transparent) fixed;
|
||||
|
||||
@@ -61,9 +61,6 @@
|
||||
|
||||
--#{$prefix}btn-color: #{$darken-dark};
|
||||
|
||||
--#{$prefix}code-color: var(--#{$prefix}body-color);
|
||||
--#{$prefix}code-bg: #{$border-dark-color-dark};
|
||||
|
||||
.navbar-brand-autodark {
|
||||
.navbar-brand-image {
|
||||
@include autodark-image;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
@mixin navbar-vertical-nav {
|
||||
.navbar-collapse {
|
||||
flex-direction: column;
|
||||
@@ -124,7 +126,7 @@ Navbar
|
||||
}
|
||||
|
||||
.navbar-expand {
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
@each $breakpoint in map.keys($grid-breakpoints) {
|
||||
$next: breakpoint-next($breakpoint, $grid-breakpoints);
|
||||
$infix: breakpoint-infix($next, $grid-breakpoints);
|
||||
|
||||
@@ -160,7 +162,8 @@ Navbar
|
||||
&.navbar-vertical {
|
||||
box-shadow: inset calc(-1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color);
|
||||
|
||||
&.navbar-right {
|
||||
&.navbar-right,
|
||||
&.navbar-end {
|
||||
box-shadow: inset calc(1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color);
|
||||
}
|
||||
}
|
||||
@@ -172,7 +175,8 @@ Navbar
|
||||
}
|
||||
}
|
||||
|
||||
&.navbar-vertical.navbar-right {
|
||||
&.navbar-vertical.navbar-right,
|
||||
&.navbar-vertical.navbar-end {
|
||||
~ .navbar,
|
||||
~ .page-wrapper {
|
||||
margin-left: 0;
|
||||
@@ -219,14 +223,14 @@ Navbar toggler
|
||||
width: 1.25em;
|
||||
background: currentColor;
|
||||
border-radius: 10px;
|
||||
position: relative;
|
||||
@include transition(
|
||||
top $navbar-toggler-animation-time $navbar-toggler-animation-time,
|
||||
bottom $navbar-toggler-animation-time $navbar-toggler-animation-time,
|
||||
transform $navbar-toggler-animation-time,
|
||||
opacity 0s $navbar-toggler-animation-time
|
||||
);
|
||||
position: relative;
|
||||
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
content: "";
|
||||
@@ -305,7 +309,7 @@ Navbar vertical
|
||||
@if $enable-navbar-vertical {
|
||||
.navbar-vertical {
|
||||
&.navbar-expand {
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
@each $breakpoint in map.keys($grid-breakpoints) {
|
||||
$next: breakpoint-next($breakpoint, $grid-breakpoints);
|
||||
$infix: breakpoint-infix($next, $grid-breakpoints);
|
||||
|
||||
@@ -318,11 +322,12 @@ Navbar vertical
|
||||
bottom: 0;
|
||||
z-index: $zindex-fixed;
|
||||
align-items: flex-start;
|
||||
@include transition(transform $transition-time);
|
||||
overflow-y: scroll;
|
||||
padding: 0;
|
||||
@include transition(transform $transition-time);
|
||||
|
||||
&.navbar-right {
|
||||
&.navbar-right,
|
||||
&.navbar-end {
|
||||
left: auto;
|
||||
right: 0;
|
||||
}
|
||||
@@ -364,7 +369,8 @@ Navbar vertical
|
||||
}
|
||||
}
|
||||
|
||||
&.navbar-right ~ .page {
|
||||
&.navbar-right ~ .page,
|
||||
&.navbar-end ~ .page {
|
||||
padding-left: 0;
|
||||
padding-right: $sidebar-width;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
.shape {
|
||||
--#{$prefix}shape-size: #{$avatar-size};
|
||||
--#{$prefix}shape-icon-size: #{$avatar-icon-size};
|
||||
@@ -18,8 +20,8 @@
|
||||
|
||||
@each $avatar-size, $size in $avatar-sizes {
|
||||
.shape-#{$avatar-size} {
|
||||
--#{$prefix}shape-size: #{map-get($size, size)};
|
||||
--#{$prefix}shape-icon-size: #{map-get($size, icon-size)};
|
||||
--#{$prefix}shape-size: #{map.get($size, size)};
|
||||
--#{$prefix}shape-icon-size: #{map.get($size, icon-size)};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
@use "sass:math";
|
||||
@use "sass:string";
|
||||
@use "sass:list";
|
||||
@use "sass:map";
|
||||
@use "sass:color";
|
||||
@use "sass:meta";
|
||||
|
||||
@function theme-color-lighter($color, $background: #fff) {
|
||||
@return mix($color, $background, 10%);
|
||||
@return color.mix($color, $background, 10%);
|
||||
}
|
||||
|
||||
@function theme-color-darker($color) {
|
||||
@@ -10,10 +17,10 @@
|
||||
// Replace all occurrences of a substring within a string.
|
||||
//
|
||||
@function str-replace($string, $search, $replace: "") {
|
||||
$index: str-index($string, $search);
|
||||
$index: string.index($string, $search);
|
||||
|
||||
@if $index {
|
||||
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
||||
@return string.slice($string, 1, $index - 1) + $replace + str-replace(string.slice($string, $index + string.length($search)), $search, $replace);
|
||||
}
|
||||
|
||||
@return $string;
|
||||
@@ -37,23 +44,23 @@
|
||||
}
|
||||
}
|
||||
|
||||
@function breakpoint-prev($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
|
||||
@function breakpoint-prev($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map.keys($breakpoints)) {
|
||||
$n: index($breakpoint-names, $name);
|
||||
@if not $n {
|
||||
@error "breakpoint `#{$name}` not found in `#{$breakpoints}`";
|
||||
}
|
||||
@return if($n > 1, nth($breakpoint-names, $n - 1), null);
|
||||
@return if($n > 1, list.nth($breakpoint-names, $n - 1), null);
|
||||
}
|
||||
|
||||
//
|
||||
// Escape SVG strings.
|
||||
//
|
||||
@function escape-svg($string) {
|
||||
@if str-index($string, "data:image/svg+xml") {
|
||||
@if string.index($string, "data:image/svg+xml") {
|
||||
@each $char, $encoded in $escaped-characters {
|
||||
// Do not escape the url brackets
|
||||
@if str-index($string, "url(") == 1 {
|
||||
$string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
|
||||
@if string.index($string, "url(") == 1 {
|
||||
$string: url("#{str-replace(string.slice($string, 6, -3), $char, $encoded)}");
|
||||
} @else {
|
||||
$string: str-replace($string, $char, $encoded);
|
||||
}
|
||||
@@ -70,7 +77,7 @@
|
||||
* @return {String} - The percentage representation of the value.
|
||||
*/
|
||||
@function to-percentage($value) {
|
||||
@return if(unitless($value), percentage($value), $value);
|
||||
@return if(math.is-unitless($value), math.percentage($value), $value);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,4 +100,307 @@
|
||||
$svg: str-replace($svg, '<svg', '<svg xmlns="http://www.w3.org/2000/svg"');
|
||||
|
||||
@return url('data:image/svg+xml;charset=UTF-8,#{$svg}');
|
||||
}
|
||||
|
||||
// Bootstrap functions
|
||||
//
|
||||
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
|
||||
|
||||
// Ascending
|
||||
// Used to evaluate Sass maps like our grid breakpoints.
|
||||
@mixin _assert-ascending($map, $map-name) {
|
||||
$prev-key: null;
|
||||
$prev-num: null;
|
||||
@each $key, $num in $map {
|
||||
@if $prev-num == null or math.unit($num) == "%" or math.unit($prev-num) == "%" {
|
||||
// Do nothing
|
||||
} @else if not math.compatible($prev-num, $num) {
|
||||
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
} @else if $prev-num >= $num {
|
||||
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
}
|
||||
$prev-key: $key;
|
||||
$prev-num: $num;
|
||||
}
|
||||
}
|
||||
|
||||
// Starts at zero
|
||||
// Used to ensure the min-width of the lowest breakpoint starts at 0.
|
||||
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
|
||||
@if list.length($map) > 0 {
|
||||
$values: map.values($map);
|
||||
$first-value: list.nth($values, 1);
|
||||
@if $first-value != 0 {
|
||||
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Colors
|
||||
@function to-rgb($value) {
|
||||
@return color.channel($value, "red", $space: rgb), color.channel($value, "green", $space: rgb), color.channel($value, "blue", $space: rgb);
|
||||
}
|
||||
|
||||
// stylelint-disable scss/dollar-variable-pattern
|
||||
@function rgba-css-var($identifier, $target) {
|
||||
@if $identifier == "body" and $target == "bg" {
|
||||
@return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));
|
||||
} @if $identifier == "body" and $target == "text" {
|
||||
@return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));
|
||||
} @else {
|
||||
@return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));
|
||||
}
|
||||
}
|
||||
|
||||
@function map-loop($map, $func, $args...) {
|
||||
$_map: ();
|
||||
|
||||
@each $key, $value in $map {
|
||||
// allow to pass the $key and $value of the map as an function argument
|
||||
$_args: ();
|
||||
@each $arg in $args {
|
||||
$_args: list.append($_args, if($arg == "$key", $key, if($arg == "$value", $value, $arg)));
|
||||
}
|
||||
|
||||
$_map: map.merge($_map, ($key: meta.call(meta.get-function($func), $_args...)));
|
||||
}
|
||||
|
||||
@return $_map;
|
||||
}
|
||||
// stylelint-enable scss/dollar-variable-pattern
|
||||
|
||||
@function varify($list) {
|
||||
$result: null;
|
||||
@each $entry in $list {
|
||||
$result: list.append($result, var(--#{$prefix}#{$entry}), space);
|
||||
}
|
||||
@return $result;
|
||||
}
|
||||
|
||||
// Internal Bootstrap function to turn maps into its negative variant.
|
||||
// It prefixes the keys with `n` and makes the value negative.
|
||||
@function negativify-map($map) {
|
||||
$result: ();
|
||||
@each $key, $value in $map {
|
||||
@if $key != 0 {
|
||||
$result: map.merge($result, ("n" + $key: (-$value)));
|
||||
}
|
||||
}
|
||||
@return $result;
|
||||
}
|
||||
|
||||
// Get multiple keys from a sass map
|
||||
@function map-get-multiple($map, $values) {
|
||||
$result: ();
|
||||
@each $key, $value in $map {
|
||||
@if (index($values, $key) != null) {
|
||||
$result: map.merge($result, ($key: $value));
|
||||
}
|
||||
}
|
||||
@return $result;
|
||||
}
|
||||
|
||||
// Merge multiple maps
|
||||
@function map-merge-multiple($maps...) {
|
||||
$merged-maps: ();
|
||||
|
||||
@each $map in $maps {
|
||||
$merged-maps: map.merge($merged-maps, $map);
|
||||
}
|
||||
@return $merged-maps;
|
||||
}
|
||||
|
||||
// Replace `$search` with `$replace` in `$string`
|
||||
// Used on our SVG icon backgrounds for custom forms.
|
||||
//
|
||||
// @author Kitty Giraudel
|
||||
// @param {String} $string - Initial string
|
||||
// @param {String} $search - Substring to replace
|
||||
// @param {String} $replace ('') - New value
|
||||
// @return {String} - Updated string
|
||||
@function str-replace($string, $search, $replace: "") {
|
||||
$index: string.index($string, $search);
|
||||
|
||||
@if $index {
|
||||
@return string.slice($string, 1, $index - 1) + $replace + str-replace(string.slice($string, $index + string.length($search)), $search, $replace);
|
||||
}
|
||||
|
||||
@return $string;
|
||||
}
|
||||
|
||||
// See https://codepen.io/kevinweber/pen/dXWoRw
|
||||
//
|
||||
// Requires the use of quotes around data URIs.
|
||||
|
||||
@function escape-svg($string) {
|
||||
@if string.index($string, "data:image/svg+xml") {
|
||||
@each $char, $encoded in $escaped-characters {
|
||||
// Do not escape the url brackets
|
||||
@if string.index($string, "url(") == 1 {
|
||||
$string: url("#{str-replace(string.slice($string, 6, -3), $char, $encoded)}");
|
||||
} @else {
|
||||
$string: str-replace($string, $char, $encoded);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@return $string;
|
||||
}
|
||||
|
||||
// Color contrast
|
||||
// See https://github.com/twbs/bootstrap/pull/30168
|
||||
|
||||
// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)
|
||||
// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern
|
||||
$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;
|
||||
|
||||
@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {
|
||||
$foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;
|
||||
$max-ratio: 0;
|
||||
$max-ratio-color: null;
|
||||
|
||||
@each $color in $foregrounds {
|
||||
$contrast-ratio: contrast-ratio($background, $color);
|
||||
@if $contrast-ratio >= $min-contrast-ratio {
|
||||
@return $color;
|
||||
} @else if $contrast-ratio > $max-ratio {
|
||||
$max-ratio: $contrast-ratio;
|
||||
$max-ratio-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
@warn "Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...";
|
||||
|
||||
@return $max-ratio-color;
|
||||
}
|
||||
|
||||
@function contrast-ratio($background, $foreground: $color-contrast-light) {
|
||||
$l1: luminance($background);
|
||||
$l2: luminance(opaque($background, $foreground));
|
||||
|
||||
@return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));
|
||||
}
|
||||
|
||||
// Return WCAG2.2 relative luminance
|
||||
// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance
|
||||
// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio
|
||||
@function luminance($color) {
|
||||
$rgb: (
|
||||
"r": math.round(color.channel($color, "red", $space: rgb)),
|
||||
"g": math.round(color.channel($color, "green", $space: rgb)),
|
||||
"b": math.round(color.channel($color, "blue", $space: rgb))
|
||||
);
|
||||
|
||||
@each $name, $value in $rgb {
|
||||
$value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), list.nth($_luminance-list, $value + 1));
|
||||
$rgb: map.merge($rgb, ($name: $value));
|
||||
}
|
||||
|
||||
@return (map.get($rgb, "r") * .2126) + (map.get($rgb, "g") * .7152) + (map.get($rgb, "b") * .0722);
|
||||
}
|
||||
|
||||
// Return opaque color
|
||||
// opaque(#fff, rgba(0, 0, 0, .5)) => #808080
|
||||
@function opaque($background, $foreground) {
|
||||
@return color.mix(rgba($foreground, 1), $background, color.opacity($foreground) * 100%);
|
||||
}
|
||||
|
||||
// scss-docs-start color-functions
|
||||
// Tint a color: mix a color with white
|
||||
@function tint-color($color, $weight) {
|
||||
@return color.mix(white, $color, $weight);
|
||||
}
|
||||
|
||||
// Shade a color: mix a color with black
|
||||
@function shade-color($color, $weight) {
|
||||
@return color.mix(black, $color, $weight);
|
||||
}
|
||||
|
||||
// Shade the color if the weight is positive, else tint it
|
||||
@function shift-color($color, $weight) {
|
||||
@return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));
|
||||
}
|
||||
// scss-docs-end color-functions
|
||||
|
||||
// Return valid calc
|
||||
@function add($value1, $value2, $return-calc: true) {
|
||||
@if $value1 == null {
|
||||
@return $value2;
|
||||
}
|
||||
|
||||
@if $value2 == null {
|
||||
@return $value1;
|
||||
}
|
||||
|
||||
@if meta.type-of($value1) == number and meta.type-of($value2) == number and math.compatible($value1, $value2) {
|
||||
@return $value1 + $value2;
|
||||
}
|
||||
|
||||
@return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + string.unquote(" + ") + $value2);
|
||||
}
|
||||
|
||||
@function subtract($value1, $value2, $return-calc: true) {
|
||||
@if $value1 == null and $value2 == null {
|
||||
@return null;
|
||||
}
|
||||
|
||||
@if $value1 == null {
|
||||
@return -$value2;
|
||||
}
|
||||
|
||||
@if $value2 == null {
|
||||
@return $value1;
|
||||
}
|
||||
|
||||
@if meta.type-of($value1) == number and meta.type-of($value2) == number and math.compatible($value1, $value2) {
|
||||
@return $value1 - $value2;
|
||||
}
|
||||
|
||||
@if meta.type-of($value2) != number {
|
||||
$value2: string.unquote("(") + $value2 + string.unquote(")");
|
||||
}
|
||||
|
||||
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + string.unquote(" - ") + $value2);
|
||||
}
|
||||
|
||||
@function divide($dividend, $divisor, $precision: 10) {
|
||||
$sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);
|
||||
$dividend: math.abs($dividend);
|
||||
$divisor: math.abs($divisor);
|
||||
@if $dividend == 0 {
|
||||
@return 0;
|
||||
}
|
||||
@if $divisor == 0 {
|
||||
@error "Cannot divide by 0";
|
||||
}
|
||||
$remainder: $dividend;
|
||||
$result: 0;
|
||||
$factor: 10;
|
||||
@while ($remainder > 0 and $precision >= 0) {
|
||||
$quotient: 0;
|
||||
@while ($remainder >= $divisor) {
|
||||
$remainder: $remainder - $divisor;
|
||||
$quotient: $quotient + 1;
|
||||
}
|
||||
$result: $result * 10 + $quotient;
|
||||
$factor: $factor * .1;
|
||||
$remainder: $remainder * 10;
|
||||
$precision: $precision - 1;
|
||||
@if ($precision < 0 and $remainder >= $divisor * 5) {
|
||||
$result: $result + 1;
|
||||
}
|
||||
}
|
||||
$result: $result * $factor * $sign;
|
||||
$dividend-unit: math.unit($dividend);
|
||||
$divisor-unit: math.unit($divisor);
|
||||
$unit-map: (
|
||||
"px": 1px,
|
||||
"rem": 1rem,
|
||||
"em": 1em,
|
||||
"%": 1%
|
||||
);
|
||||
@if ($dividend-unit != $divisor-unit and map.has-key($unit-map, $dividend-unit)) {
|
||||
$result: $result * map.get($unit-map, $dividend-unit);
|
||||
}
|
||||
@return $result;
|
||||
}
|
||||
@@ -13,4 +13,4 @@
|
||||
@import "vendor/coloris";
|
||||
@import "vendor/typed";
|
||||
@import "vendor/turbo";
|
||||
|
||||
@import "vendor/fullcalendar";
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
position: relative;
|
||||
padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);
|
||||
margin-bottom: var(--#{$prefix}alert-margin-bottom);
|
||||
background-color: var(--#{$prefix}alert-bg);
|
||||
background-color: color-mix(in srgb, var(--#{$prefix}alert-bg), var(--#{$prefix}bg-surface));
|
||||
border-radius: var(--#{$prefix}alert-border-radius);
|
||||
border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}alert-border-color);
|
||||
display: flex;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
.avatar {
|
||||
--#{$prefix}avatar-size: var(--#{$prefix}avatar-list-size, #{$avatar-size});
|
||||
--#{$prefix}avatar-status-size: #{$avatar-status-size};
|
||||
@@ -55,15 +57,15 @@
|
||||
|
||||
@each $avatar-size, $size in $avatar-sizes {
|
||||
.avatar-#{$avatar-size} {
|
||||
--#{$prefix}avatar-size: #{map-get($size, size)};
|
||||
--#{$prefix}avatar-status-size: #{map-get($size, status-size)};
|
||||
--#{$prefix}avatar-font-size: #{map-get($size, font-size)};
|
||||
--#{$prefix}avatar-icon-size: #{map-get($size, icon-size)};
|
||||
--#{$prefix}avatar-brand-size: #{map-get($size, brand-size)};
|
||||
--#{$prefix}avatar-size: #{map.get($size, size)};
|
||||
--#{$prefix}avatar-status-size: #{map.get($size, status-size)};
|
||||
--#{$prefix}avatar-font-size: #{map.get($size, font-size)};
|
||||
--#{$prefix}avatar-icon-size: #{map.get($size, icon-size)};
|
||||
--#{$prefix}avatar-brand-size: #{map.get($size, brand-size)};
|
||||
|
||||
.badge:empty {
|
||||
width: map-get($size, status-size);
|
||||
height: map-get($size, status-size);
|
||||
width: map.get($size, status-size);
|
||||
height: map.get($size, status-size);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,7 +96,7 @@
|
||||
|
||||
@each $avatar-size, $size in $avatar-sizes {
|
||||
.avatar-list-#{$avatar-size} {
|
||||
--#{$prefix}avatar-list-size: #{map-get($size, size)};
|
||||
--#{$prefix}avatar-list-size: #{map.get($size, size)};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,23 @@
|
||||
.breadcrumb {
|
||||
--#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x};
|
||||
--#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y};
|
||||
--#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom};
|
||||
--#{$prefix}breadcrumb-font-size: #{$breadcrumb-font-size};
|
||||
--#{$prefix}breadcrumb-bg: #{$breadcrumb-bg};
|
||||
--#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius};
|
||||
--#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color};
|
||||
--#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x};
|
||||
--#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color};
|
||||
--#{$prefix}breadcrumb-item-active-font-weight: #{$breadcrumb-active-font-weight};
|
||||
--#{$prefix}breadcrumb-item-disabled-color: #{$breadcrumb-disabled-color};
|
||||
--#{$prefix}breadcrumb-link-color: #{$breadcrumb-link-color};
|
||||
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@include font-size(var(--#{$prefix}breadcrumb-font-size));
|
||||
list-style: none;
|
||||
background-color: var(--#{$prefix}breadcrumb-bg);
|
||||
@include border-radius(var(--#{$prefix}breadcrumb-border-radius));
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background: transparent;
|
||||
@@ -21,6 +37,7 @@
|
||||
|
||||
.breadcrumb-item {
|
||||
&.active {
|
||||
color: var(--#{$prefix}breadcrumb-item-active-color);
|
||||
font-weight: var(--#{$prefix}breadcrumb-item-active-font-weight);
|
||||
|
||||
a {
|
||||
@@ -41,6 +58,20 @@
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
& + & {
|
||||
padding-left: var(--#{$prefix}breadcrumb-item-padding-x);
|
||||
|
||||
&::before {
|
||||
float: left;
|
||||
padding-right: var(--#{$prefix}breadcrumb-item-padding-x);
|
||||
color: var(--#{$prefix}breadcrumb-divider-color);
|
||||
content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider));
|
||||
/*rtl:raw:
|
||||
transform: scaleX(-1);
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@each $name, $symbol in $breadcrumb-variants {
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
@use "sass:color";
|
||||
@use "sass:map";
|
||||
|
||||
//
|
||||
// Button
|
||||
//
|
||||
.btn {
|
||||
--#{$prefix}btn-icon-size: #{$input-btn-icon-size};
|
||||
--#{$prefix}btn-icon-color: inherit;
|
||||
--#{$prefix}btn-bg: var(--#{$prefix}bg-surface);
|
||||
--#{$prefix}btn-color: var(--#{$prefix}body-color);
|
||||
--#{$prefix}btn-border-color: #{$btn-border-color};
|
||||
--#{$prefix}btn-hover-bg: var(--#{$prefix}btn-bg);
|
||||
--#{$prefix}btn-hover-border-color: var(--#{$prefix}border-active-color);
|
||||
--#{$prefix}btn-box-shadow: var(--#{$prefix}shadow-input);
|
||||
--#{$prefix}btn-active-color: #{$active-color};
|
||||
--#{$prefix}btn-active-bg: #{$active-bg};
|
||||
--#{$prefix}btn-active-border-color: #{$active-border-color};
|
||||
@@ -21,6 +22,9 @@
|
||||
white-space: nowrap;
|
||||
box-shadow: var(--#{$prefix}btn-box-shadow);
|
||||
position: relative;
|
||||
min-width: calc((var(--#{$prefix}btn-line-height) * 1) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
|
||||
min-height: calc((var(--#{$prefix}btn-line-height) * 1) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
|
||||
|
||||
|
||||
.icon {
|
||||
width: var(--#{$prefix}btn-icon-size);
|
||||
@@ -29,7 +33,7 @@
|
||||
font-size: var(--#{$prefix}btn-icon-size);
|
||||
margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4);
|
||||
vertical-align: bottom;
|
||||
color: inherit;
|
||||
color: var(--#{$prefix}btn-icon-color);
|
||||
}
|
||||
|
||||
.avatar {
|
||||
@@ -38,7 +42,8 @@
|
||||
margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4);
|
||||
}
|
||||
|
||||
.icon-right {
|
||||
.icon-right,
|
||||
.icon-end {
|
||||
margin: 0 calc(var(--#{$prefix}btn-padding-x) / -4) 0 calc(var(--#{$prefix}btn-padding-x) / 2);
|
||||
}
|
||||
|
||||
@@ -72,9 +77,9 @@
|
||||
//
|
||||
// Button color variations
|
||||
//
|
||||
@each $color, $value in map-merge($theme-colors, $social-colors) {
|
||||
@each $color, $value in map.merge($theme-colors, $social-colors) {
|
||||
.btn-#{$color} {
|
||||
@if $color == 'dark' {
|
||||
@if $color == "dark" {
|
||||
--#{$prefix}btn-border-color: var(--#{$prefix}dark-mode-border-color);
|
||||
--#{$prefix}btn-hover-border-color: var(--#{$prefix}dark-mode-border-active-color);
|
||||
--#{$prefix}btn-active-border-color: var(--#{$prefix}dark-mode-border-active-color);
|
||||
@@ -95,7 +100,8 @@
|
||||
--#{$prefix}btn-box-shadow: var(--#{$prefix}shadow-input);
|
||||
}
|
||||
|
||||
.btn-outline-#{$color} {
|
||||
.btn-outline-#{$color},
|
||||
.btn-outline.btn-#{$color} {
|
||||
--#{$prefix}btn-color: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-bg: transparent;
|
||||
--#{$prefix}btn-border-color: var(--#{$prefix}#{$color});
|
||||
@@ -104,11 +110,13 @@
|
||||
--#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg);
|
||||
--#{$prefix}btn-active-bg: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-active-border-color: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-disabled-color: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$color});
|
||||
}
|
||||
|
||||
.btn-ghost-#{$color} {
|
||||
.btn-ghost-#{$color},
|
||||
.btn-ghost.btn-#{$color} {
|
||||
--#{$prefix}btn-color: var(--#{$prefix}#{$color});
|
||||
--#{$prefix}btn-bg: transparent;
|
||||
--#{$prefix}btn-border-color: transparent;
|
||||
@@ -130,16 +138,27 @@
|
||||
//
|
||||
// Button sizes
|
||||
//
|
||||
.btn-sm, .btn-group-sm > .btn {
|
||||
.btn-sm,
|
||||
.btn-group-sm > .btn {
|
||||
--#{$prefix}btn-line-height: #{$input-btn-line-height-sm};
|
||||
--#{$prefix}btn-icon-size: #{$input-btn-icon-size-sm};
|
||||
}
|
||||
|
||||
.btn-lg, .btn-group-lg > .btn {
|
||||
.btn-lg,
|
||||
.btn-group-lg > .btn {
|
||||
--#{$prefix}btn-line-height: #{$input-btn-line-height-lg};
|
||||
--#{$prefix}btn-icon-size: #{$input-btn-icon-size-lg};
|
||||
}
|
||||
|
||||
.btn-xl,
|
||||
.btn-group-xl > .btn {
|
||||
--#{$prefix}btn-line-height: #{$input-btn-line-height-xl};
|
||||
--#{$prefix}btn-icon-size: #{$input-btn-icon-size-xl};
|
||||
--#{$prefix}btn-padding-y: #{$input-btn-padding-y-xl};
|
||||
--#{$prefix}btn-padding-x: #{$input-btn-padding-x-xl};
|
||||
--#{$prefix}btn-font-size: #{$input-btn-font-size-xl};
|
||||
}
|
||||
|
||||
//
|
||||
// Button shapes
|
||||
//
|
||||
@@ -160,15 +179,18 @@
|
||||
//
|
||||
// Icon button
|
||||
//
|
||||
.btn-icon {
|
||||
min-width: calc((var(--#{$prefix}btn-line-height) * var(--#{$prefix}btn-font-size)) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
|
||||
min-height: calc((var(--#{$prefix}btn-line-height) * var(--#{$prefix}btn-font-size)) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
|
||||
.btn-icon,
|
||||
.btn-action {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
|
||||
.icon {
|
||||
margin: calc(-1 * var(--#{$prefix}btn-padding-x));
|
||||
}
|
||||
//[BUG] btn-sm and btn-xl with an icon looks broken
|
||||
//issue #2470 fixed
|
||||
min-width: calc(var(--#{$prefix}btn-icon-size) + (var(--#{$prefix}btn-padding-x) * 2));
|
||||
min-height: calc(var(--#{$prefix}btn-icon-size) + (var(--#{$prefix}btn-padding-y) * 2));
|
||||
}
|
||||
|
||||
//
|
||||
@@ -215,7 +237,7 @@
|
||||
height: var(--#{$prefix}btn-icon-size);
|
||||
left: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
|
||||
top: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
|
||||
animation: spinner-border .75s linear infinite;
|
||||
animation: spinner-border 0.75s linear infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,14 +246,7 @@
|
||||
//
|
||||
.btn-action {
|
||||
--#{$prefix}border-color: transparent;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
color: var(--#{$prefix}secondary);
|
||||
display: inline-flex;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: var(--#{$prefix}border-radius);
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
@@ -249,6 +264,7 @@
|
||||
&.show {
|
||||
color: var(--#{$prefix}body-color);
|
||||
background: var(--#{$prefix}active-bg);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
&.show {
|
||||
@@ -258,4 +274,65 @@
|
||||
|
||||
.btn-actions {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-animate-icon {
|
||||
.icon {
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: translateX(4px);
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-animate-icon-rotate {
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-animate-icon-move-start {
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: translateX(-4px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-animate-icon-pulse {
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: none;
|
||||
animation: pulse 0.9s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-animate-icon-shake {
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: none;
|
||||
animation: shake 0.9s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-animate-icon-tada {
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
.icon {
|
||||
transform: none;
|
||||
animation: tada 0.9s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,11 +111,11 @@
|
||||
justify-content: center;
|
||||
padding: $card-spacer-y $card-spacer-x;
|
||||
text-align: center;
|
||||
@include transition(background $transition-time);
|
||||
border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color);
|
||||
flex: 1;
|
||||
color: inherit;
|
||||
font-weight: var(--#{$prefix}font-weight-medium);
|
||||
@include transition(background $transition-time);
|
||||
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
@@ -205,6 +205,7 @@ Stacked card
|
||||
flex: 1;
|
||||
margin: calc(var(--#{$prefix}card-cap-padding-y) * -1) calc(var(--#{$prefix}card-cap-padding-x) * -1) calc(var(--#{$prefix}card-cap-padding-y) * -1);
|
||||
padding: calc(var(--#{$prefix}card-cap-padding-y) * .5) calc(var(--#{$prefix}card-cap-padding-x) * .5) 0;
|
||||
border-radius: var(--#{$prefix}card-border-radius) var(--#{$prefix}card-border-radius) 0 0;
|
||||
}
|
||||
|
||||
.card-header-pills {
|
||||
@@ -214,11 +215,13 @@ Stacked card
|
||||
}
|
||||
|
||||
// Card rotate
|
||||
.card-rotate-left {
|
||||
.card-rotate-left,
|
||||
.card-rotate-start {
|
||||
transform: rotate(-1.5deg);
|
||||
}
|
||||
|
||||
.card-rotate-right {
|
||||
.card-rotate-right,
|
||||
.card-rotate-end {
|
||||
transform: rotate(1.5deg);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
color: var(--#{$prefix}btn-close-color);
|
||||
text-decoration: none;
|
||||
opacity: var(--#{$prefix}btn-close-hover-opacity);
|
||||
background-color: var(--#{$prefix}btn-close-color);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
.dropend {
|
||||
> .dropdown-menu {
|
||||
margin-top: subtract(-$dropdown-padding-y, 1px);
|
||||
margin-top: subtract(calc(-1 * $dropdown-padding-y), 1px);
|
||||
margin-left: -.25rem;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
$countries: (
|
||||
'ad', 'af', 'ae', 'afrun', 'ag', 'ai', 'al', 'am', 'ao', 'aq', 'ar', 'as', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj', 'bl', 'bm', 'bn', 'bo', 'bq-bo', 'bq-sa', 'bq-se', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cw', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb-eng', 'gb-sct', 'gb', 'gb-wls', 'gb-nir', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mf', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nc', 'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa', 'rainbow', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'ss', 'st', 'sv', 'sx', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'tr', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'um', 'unasur', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'za', 'zm', 'zw'
|
||||
);
|
||||
@@ -26,6 +28,6 @@ $countries: (
|
||||
|
||||
@each $flag-size, $size in $flag-sizes {
|
||||
.flag-#{$flag-size} {
|
||||
height: map-get($size, size);
|
||||
height: map.get($size, size);
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ Form label
|
||||
&.required {
|
||||
&:after {
|
||||
content: "*";
|
||||
margin-left: .25rem;
|
||||
margin-left: 0.25rem;
|
||||
color: $red;
|
||||
}
|
||||
}
|
||||
@@ -39,17 +39,17 @@ Form hint
|
||||
}
|
||||
|
||||
& + .form-control {
|
||||
margin-top: .25rem;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
.form-label + & {
|
||||
margin-top: -.25rem;
|
||||
margin-top: -0.25rem;
|
||||
}
|
||||
|
||||
.input-group + &,
|
||||
.form-control + &,
|
||||
.form-select + & {
|
||||
margin-top: .5rem;
|
||||
margin-top: 0.5rem;
|
||||
color: $form-secondary-color;
|
||||
}
|
||||
}
|
||||
@@ -90,18 +90,18 @@ Form control
|
||||
}
|
||||
|
||||
.form-control-dark {
|
||||
background-color: rgba($black, .1);
|
||||
background-color: rgba($black, 0.1);
|
||||
color: $white;
|
||||
border-color: transparent;
|
||||
|
||||
&:focus {
|
||||
background-color: rgba($black, .1);
|
||||
background-color: rgba($black, 0.1);
|
||||
box-shadow: none;
|
||||
border-color: rgba($white, .24);
|
||||
border-color: rgba($white, 0.24);
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
color: rgba($white, .6);
|
||||
color: rgba($white, 0.6);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ Form help
|
||||
justify-content: center;
|
||||
width: 1.125rem;
|
||||
height: 1.125rem;
|
||||
font-size: .75rem;
|
||||
font-size: 0.75rem;
|
||||
color: $form-secondary-color;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
@@ -161,8 +161,6 @@ Form help
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Input group
|
||||
*/
|
||||
@@ -208,19 +206,21 @@ Input group
|
||||
|
||||
.input-group-text {
|
||||
background: $form-check-input-bg;
|
||||
z-index: 10;
|
||||
@include transition($input-transition);
|
||||
|
||||
&:first-child {
|
||||
padding-right: 0;
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
padding-left: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Upload files
|
||||
*/
|
||||
@@ -248,4 +248,4 @@ Forms on mobile devices
|
||||
@include media-breakpoint-down(sm) {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
.row > * {
|
||||
min-width: 0;
|
||||
}
|
||||
@@ -17,8 +19,8 @@
|
||||
|
||||
@each $name, $value in (0: 0, sm: .375rem, md: 1.5rem, lg: 3rem) {
|
||||
.row-#{$name} {
|
||||
margin-right: (-$value);
|
||||
margin-left: -($value);
|
||||
margin-right: calc(-1 * $value);
|
||||
margin-left: calc(-1 * $value);
|
||||
|
||||
> .col,
|
||||
> [class*="col-"] {
|
||||
@@ -54,7 +56,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@each $name, $size in map-merge((null: $spacer), $spacers) {
|
||||
@each $name, $size in map.merge((null: $spacer), $spacers) {
|
||||
$name-prefixed: if($name == null, null, '-#{$name}');
|
||||
|
||||
.space-y#{$name-prefixed} {
|
||||
@@ -69,7 +71,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@each $name, $size in map-merge((null: $spacer), $spacers) {
|
||||
@each $name, $size in map.merge((null: $spacer), $spacers) {
|
||||
$name-prefixed: if($name == null, null, '-#{$name}');
|
||||
|
||||
.divide-y#{$name-prefixed} {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
@use "sass:math";
|
||||
|
||||
.img-responsive {
|
||||
--#{$prefix}img-responsive-ratio: #{percentage(.75)};
|
||||
--#{$prefix}img-responsive-ratio: #{math.percentage(.75)};
|
||||
background: no-repeat center/cover;
|
||||
padding-top: var(--#{$prefix}img-responsive-ratio);
|
||||
}
|
||||
|
||||
@@ -30,14 +30,6 @@
|
||||
border-left-width: $border-width-wide;
|
||||
}
|
||||
|
||||
.list-group-item {
|
||||
&:active,
|
||||
&:focus,
|
||||
&:hover {
|
||||
background-color: $dropdown-link-hover-bg;
|
||||
}
|
||||
}
|
||||
|
||||
.list-group-item {
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
@@ -58,6 +50,14 @@
|
||||
}
|
||||
|
||||
.list-group-hoverable {
|
||||
.list-group-item {
|
||||
&:active,
|
||||
&:focus,
|
||||
&:hover {
|
||||
background-color: $dropdown-link-hover-bg;
|
||||
}
|
||||
}
|
||||
|
||||
.list-group-item-actions {
|
||||
opacity: 0;
|
||||
@include transition(opacity $transition-time);
|
||||
|
||||
@@ -31,7 +31,8 @@ Markdown
|
||||
}
|
||||
|
||||
> table {
|
||||
@extend .table, .table-bordered;
|
||||
font-size: var(--#{$prefix}body-font-size);
|
||||
@extend .table, .table-bordered, .table-sm;
|
||||
}
|
||||
|
||||
> blockquote {
|
||||
@@ -46,7 +47,7 @@ Markdown
|
||||
border: 1px solid var(--#{$prefix}border-color);
|
||||
}
|
||||
|
||||
> pre {
|
||||
pre {
|
||||
max-height: 20rem;
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@
|
||||
}
|
||||
|
||||
&.nav-pills {
|
||||
margin: 0 (-$nav-link-padding-x);
|
||||
margin: 0 calc(-1 * $nav-link-padding-x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
margin: 0 0 calc(-1 * #{$nav-bordered-border-width});
|
||||
border: 0;
|
||||
border-bottom: $nav-bordered-link-active-border-width var(--#{$prefix}border-style) transparent;
|
||||
|
||||
&:hover {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-link.active,
|
||||
@@ -61,8 +65,8 @@
|
||||
|
||||
.nav-link {
|
||||
display: flex;
|
||||
@include transition(color $transition-time, background-color $transition-time);
|
||||
align-items: center;
|
||||
@include transition(color $transition-time, background-color $transition-time);
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
|
||||
@@ -1,25 +1,28 @@
|
||||
.pagination {
|
||||
margin: 0;
|
||||
--#{$prefix}pagination-gap: .25rem;
|
||||
user-select: none;
|
||||
gap: var(--#{$prefix}pagination-gap);
|
||||
line-height: var(--#{$prefix}body-line-height);
|
||||
}
|
||||
|
||||
.page-link {
|
||||
min-width: 1.75rem;
|
||||
border-radius: var(--#{$prefix}border-radius);
|
||||
min-width: 2rem;
|
||||
border-radius: var(--#{$prefix}pagination-border-radius);
|
||||
}
|
||||
|
||||
.page-item:not(.active) .page-link:hover {
|
||||
background: var(--#{$prefix}pagination-hover-bg);
|
||||
}
|
||||
|
||||
.page-text {
|
||||
padding-left: .5rem;
|
||||
padding-right: .5rem;
|
||||
}
|
||||
|
||||
.page-item {
|
||||
text-align: center;
|
||||
|
||||
&:not(.active) {
|
||||
.page-link {
|
||||
&:hover {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.page-prev,
|
||||
&.page-next {
|
||||
flex: 0 0 50%;
|
||||
@@ -56,3 +59,13 @@
|
||||
color: $pagination-disabled-color;
|
||||
}
|
||||
}
|
||||
|
||||
.pagination-outline {
|
||||
--#{$prefix}pagination-border-color: var(--#{$prefix}border-color);
|
||||
--#{$prefix}pagination-disabled-border-color: var(--#{$prefix}border-color);
|
||||
--#{$prefix}pagination-border-width: 1px;
|
||||
}
|
||||
|
||||
.pagination-circle {
|
||||
--#{$prefix}pagination-border-radius: var(--tblr-border-radius-pill);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
$payment-icons: ("2c2p", "2checkout", "adyen", "affirm", "alipay-plus", "alipay", "allegro-pay", "amazon-pay", "amazon", "americanexpress", "applepay", "authorize", "autopay", "bancontact", "binance-usd", "bitcoin", "bitpay", "bkash", "blik", "braintree", "cash-app", "chime", "cirrus", "clickandbuy", "coinkite", "dinersclub", "directdebit", "discover", "dotpay", "dwolla", "easypaisa", "ebay", "elo", "epayco", "esewa", "ethereum", "eway", "fonepay", "giropay", "google-pay", "googlewallet", "hubspot", "ingenico", "ideal", "imepay", "jcb", "khalti", "klarna", "laser", "litecoin", "maestro", "mastercard", "mercado-pago", "metamask", "mir", "monero", "moneygram", "neteller", "ogone", "okpay", "opensea", "paybox", "payconiq", "payka", "payline", "paymill", "payone", "payoneer", "paypal", "paypo", "paysafe", "paysafecard", "payu", "payza", "poli", "przelewy24", "revolut-pay", "ripple", "sage", "samsung-pay", "sepa", "shop-pay", "shopify", "skrill", "solana", "solo", "spingo", "square", "stax", "stripe", "switch", "tether", "tpay", "troy", "true-usd", "ukash", "unionpay", "venmo", "verifone", "verisign", "visa", "we-chat-pay", "webmoney", "westernunion", "wise", "worldpay", "zelle");
|
||||
|
||||
.payment {
|
||||
@@ -23,6 +25,6 @@ $payment-icons: ("2c2p", "2checkout", "adyen", "affirm", "alipay-plus", "alipay"
|
||||
|
||||
@each $payment-size, $size in $payment-sizes {
|
||||
.payment-#{$payment-size} {
|
||||
height: map-get($size, size);
|
||||
height: map.get($size, size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@use "sass:map";
|
||||
|
||||
$apps: (
|
||||
"apple",
|
||||
"discord",
|
||||
@@ -47,6 +49,6 @@ $apps: (
|
||||
|
||||
@each $flag-size, $size in $flag-sizes {
|
||||
.social-#{$flag-size} {
|
||||
height: map-get($size, size);
|
||||
height: map.get($size, size);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,3 @@
|
||||
margin-left: .25rem;
|
||||
}
|
||||
}
|
||||
|
||||
.star {
|
||||
|
||||
}
|
||||
|
||||
@@ -122,7 +122,9 @@
|
||||
// Slide variant
|
||||
.switch-icon-slide-up,
|
||||
.switch-icon-slide-left,
|
||||
.switch-icon-slide-start,
|
||||
.switch-icon-slide-right,
|
||||
.switch-icon-slide-end,
|
||||
.switch-icon-slide-down {
|
||||
overflow: hidden;
|
||||
|
||||
@@ -150,7 +152,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
.switch-icon-slide-left {
|
||||
.switch-icon-slide-left,
|
||||
.switch-icon-slide-start {
|
||||
.switch-icon-a {
|
||||
transform: translateX(0);
|
||||
}
|
||||
@@ -170,7 +173,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
.switch-icon-slide-right {
|
||||
.switch-icon-slide-right,
|
||||
.switch-icon-slide-end {
|
||||
.switch-icon-a {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
@@ -112,10 +112,9 @@ Table sort
|
||||
display: block;
|
||||
width: 100%;
|
||||
text-align: inherit;
|
||||
@include transition(color $transition-time);
|
||||
|
||||
margin: (-$table-th-padding-y) (-$table-th-padding-x);
|
||||
margin: calc(-1 * $table-th-padding-y) calc(-1 * $table-th-padding-x);
|
||||
padding: $table-th-padding-y $table-th-padding-x;
|
||||
@include transition(color $transition-time);
|
||||
|
||||
&:hover,
|
||||
&.asc,
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
justify-content: center;
|
||||
width: var(--#{$prefix}timeline-icon-size, $avatar-size);
|
||||
height: var(--#{$prefix}timeline-icon-size, $avatar-size);
|
||||
background: var(--#{$prefix}gray-200);
|
||||
background: var(--#{$prefix}bg-surface-secondary);
|
||||
color: var(--#{$prefix}secondary);
|
||||
border-radius: var(--#{$prefix}border-radius);
|
||||
z-index: 5
|
||||
|
||||
@@ -71,6 +71,10 @@ h6,
|
||||
line-height: var(--#{$prefix}line-height-h6);
|
||||
}
|
||||
|
||||
.fs-base {
|
||||
font-size: var(--#{$prefix}body-font-size);
|
||||
}
|
||||
|
||||
strong,
|
||||
.strong,
|
||||
b {
|
||||
@@ -212,7 +216,7 @@ Mentions
|
||||
*/
|
||||
.mention {
|
||||
display: inline-block;
|
||||
box-shadow: var(--#{$prefix}box-shadow-border);
|
||||
box-shadow: var(--#{$prefix}shadow-border);
|
||||
border-radius: var(--#{$prefix}border-radius-pill);
|
||||
line-height: calc(16em / 12);
|
||||
font-size: calc(12em / 14);
|
||||
@@ -241,7 +245,7 @@ Mentions
|
||||
margin: calc(-2em / 12) calc(4em / 12) 0 calc(-4em / 12);
|
||||
display: inline-flex;
|
||||
background: no-repeat center center/cover;
|
||||
box-shadow: var(--#{$prefix}box-shadow-border);
|
||||
box-shadow: var(--#{$prefix}shadow-border);
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -280,7 +284,6 @@ $text-variants: (
|
||||
counter-reset: step;
|
||||
border-left: 1px solid var(--#{$prefix}border-color);
|
||||
margin-bottom: 2rem;
|
||||
flex-direction: column;
|
||||
|
||||
h3 {
|
||||
counter-increment: step;
|
||||
@@ -312,3 +315,16 @@ $text-variants: (
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.callout {
|
||||
margin-bottom: 1.5rem;
|
||||
border: 1px solid var(--#{$prefix}primary-200);
|
||||
border-radius: var(--#{$prefix}border-radius);
|
||||
padding: .5rem 1rem;
|
||||
background: var(--#{$prefix}primary-lt);
|
||||
|
||||
&>:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
@use "sass:map";
|
||||
|
||||
// All colors
|
||||
@each $color, $value in map-merge($theme-colors, ( white: $white)) {
|
||||
@each $color, $value in map.merge($theme-colors, ( white: $white)) {
|
||||
.bg-#{"" + $color} {
|
||||
background-color: color-mix(in srgb, var(--#{$prefix}#{$color}) calc(var(--#{$prefix}bg-opacity, 1) * 100%), transparent) !important;
|
||||
}
|
||||
@@ -64,7 +66,7 @@
|
||||
}
|
||||
|
||||
.text-#{"" + $color}-fg {
|
||||
color: $value !important;
|
||||
color: var(--#{$prefix}#{$color}-fg) !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +77,7 @@
|
||||
}
|
||||
|
||||
.text-#{"" + $color}-fg {
|
||||
color: $value !important;
|
||||
color: var(--#{$prefix}#{$color}-fg) !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
47
core/scss/utils/_hover.scss
Normal file
47
core/scss/utils/_hover.scss
Normal file
@@ -0,0 +1,47 @@
|
||||
%hover-animation {
|
||||
transition: transform 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
will-change: transform;
|
||||
}
|
||||
}
|
||||
|
||||
.hover-elevate-up {
|
||||
@extend %hover-animation;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-4px);
|
||||
}
|
||||
}
|
||||
|
||||
.hover-elevate-down {
|
||||
@extend %hover-animation;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(4px);
|
||||
}
|
||||
}
|
||||
|
||||
.hover-scale {
|
||||
@extend %hover-animation;
|
||||
|
||||
&:hover {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
}
|
||||
|
||||
.hover-rotate-end {
|
||||
@extend %hover-animation;
|
||||
|
||||
&:hover {
|
||||
transform: rotate(4deg);
|
||||
}
|
||||
}
|
||||
|
||||
.hover-rotate-start {
|
||||
@extend %hover-animation;
|
||||
|
||||
&:hover {
|
||||
transform: rotate(-4deg);
|
||||
}
|
||||
}
|
||||
4
core/scss/vendor/_apexcharts.scss
vendored
4
core/scss/vendor/_apexcharts.scss
vendored
@@ -45,4 +45,8 @@
|
||||
.apexcharts-svg,
|
||||
.apexcharts-canvas {
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
.apexcharts-pie-area {
|
||||
stroke: var(--#{$prefix}bg-surface) !important;
|
||||
}
|
||||
55
core/scss/vendor/_fullcalendar.scss
vendored
Normal file
55
core/scss/vendor/_fullcalendar.scss
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
:root {
|
||||
--fc-border-color: var(--#{$prefix}border-color);
|
||||
--fc-daygrid-event-dot-width: 5px;
|
||||
|
||||
--fc-event-bg-color: var(--#{$prefix}primary-lt);
|
||||
--fc-event-border-color: var(--#{$prefix}primary-200);
|
||||
--fc-event-text-color: var(--#{$prefix}body-color);
|
||||
}
|
||||
|
||||
.fc-toolbar-title {
|
||||
font-size: var(--#{$prefix}font-size-h3) !important;
|
||||
font-weight: var(--#{$prefix}font-weight-medium);
|
||||
}
|
||||
|
||||
.fc-daygrid-dot-event {
|
||||
background-color: var(--fc-event-bg-color);
|
||||
border: 1px solid var(--fc-event-border-color);
|
||||
color: var(--fc-event-text-color);
|
||||
padding-top: 1px;
|
||||
padding-bottom: 1px;
|
||||
|
||||
.fc-event-title {
|
||||
font-weight: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.fc-col-header-cell {
|
||||
background-color: var(--#{$prefix}bg-surface-secondary);
|
||||
color: var(--#{$prefix}secondary);
|
||||
text-transform: uppercase;
|
||||
font-weight: var(--#{$prefix}font-weight-medium);
|
||||
font-size: var(--#{$prefix}font-size-h5);
|
||||
padding-top: .5rem !important;
|
||||
padding-bottom: .5rem !important;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.fc-event-time {
|
||||
font-weight: var(--#{$prefix}font-weight-bold) !important;
|
||||
}
|
||||
|
||||
.fc-col-header-cell-cushion {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.fc-daygrid-day-number {
|
||||
color: var(--#{$prefix}secondary);
|
||||
}
|
||||
|
||||
.fc-button {
|
||||
color: var(--#{$prefix}body-color) !important;
|
||||
background-color: transparent !important;
|
||||
border-color: var(--#{$prefix}border-color) !important;
|
||||
font-weight: var(--#{$prefix}font-weight-medium) !important;
|
||||
}
|
||||
4
core/scss/vendor/_nouislider.scss
vendored
4
core/scss/vendor/_nouislider.scss
vendored
@@ -33,8 +33,8 @@
|
||||
.noUi-horizontal & {
|
||||
width: $form-range-thumb-width;
|
||||
height: $form-range-thumb-height;
|
||||
top: (-$form-range-thumb-height * .5);
|
||||
right: (-$form-range-thumb-height * .5);
|
||||
top: calc($form-range-thumb-height * -.5);
|
||||
right: calc($form-range-thumb-height * -.5);
|
||||
margin: 1px 1px 0 0;
|
||||
}
|
||||
|
||||
|
||||
34
core/scss/vendor/_tinymce.scss
vendored
34
core/scss/vendor/_tinymce.scss
vendored
@@ -1,34 +0,0 @@
|
||||
.tox-hugerte {
|
||||
border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color) !important;
|
||||
border-radius: $border-radius !important;
|
||||
font-family: var(--#{$prefix}font-sans-serif) !important;
|
||||
}
|
||||
|
||||
.tox-toolbar__group {
|
||||
padding: 0 .5rem 0;
|
||||
}
|
||||
|
||||
.tox .tox-toolbar__primary {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.tox:not(.tox-hugerte-inline) {
|
||||
.tox-editor-header {
|
||||
border-bottom: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color) !important;
|
||||
box-shadow: none !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.tox-tbtn {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.tox-statusbar {
|
||||
border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color) !important;
|
||||
}
|
||||
|
||||
.tox .tox-toolbar-overlord,
|
||||
.tox:not(.tox-hugerte-inline) .tox-editor-header {
|
||||
background: transparent !important;
|
||||
}
|
||||
14
core/scss/vendor/_wysiwyg.scss
vendored
14
core/scss/vendor/_wysiwyg.scss
vendored
@@ -21,7 +21,19 @@
|
||||
}
|
||||
|
||||
.tox-tbtn {
|
||||
margin: 0 !important;
|
||||
margin: 0 !important;
|
||||
background: var(--#{$prefix}bg-surface) !important;
|
||||
|
||||
&:hover,
|
||||
&.tox-tbtn--enabled {
|
||||
background: var(--#{$prefix}bg-surface-secondary) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.tox-edit-area {
|
||||
&::before {
|
||||
border: none !important
|
||||
}
|
||||
}
|
||||
|
||||
.tox-statusbar {
|
||||
|
||||
@@ -15,16 +15,13 @@ const plugins = [
|
||||
babel({
|
||||
exclude: 'node_modules/**',
|
||||
babelHelpers: 'bundled'
|
||||
})
|
||||
]
|
||||
|
||||
plugins.push(
|
||||
}),
|
||||
replace({
|
||||
'process.env.NODE_ENV': '"production"',
|
||||
preventAssignment: true
|
||||
}),
|
||||
nodeResolve()
|
||||
)
|
||||
]
|
||||
|
||||
const rollupConfig = {
|
||||
input: [
|
||||
|
||||
@@ -1,34 +1,46 @@
|
||||
# @tabler/docs
|
||||
# Tabler Documentation Changelog
|
||||
|
||||
## 1.0.1
|
||||
## 1.4.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [c59bc9d]
|
||||
- Updated dependencies [f9e4da2]
|
||||
- Updated dependencies [aea3b0a]
|
||||
- Updated dependencies [92a3afe]
|
||||
- Updated dependencies [3fc7b84]
|
||||
- Updated dependencies [199f39a]
|
||||
- Updated dependencies [2f8a372]
|
||||
- Updated dependencies [9fceadd]
|
||||
- Updated dependencies [44250db]
|
||||
- Updated dependencies [be1f3d1]
|
||||
- Updated dependencies [c20d076]
|
||||
- Updated dependencies [042e50f]
|
||||
- Updated dependencies [473fa38]
|
||||
- Updated dependencies [8646192]
|
||||
- Updated dependencies [922bb03]
|
||||
- Updated dependencies [44250db]
|
||||
- Updated dependencies [9bbcb99]
|
||||
- Updated dependencies [b17b488]
|
||||
- Updated dependencies [ddcd3a7]
|
||||
- Updated dependencies [e3d68d6]
|
||||
- Updated dependencies [215eaa4]
|
||||
- Updated dependencies [4846828]
|
||||
- Updated dependencies [6b6617a]
|
||||
- Updated dependencies [94bea00]
|
||||
- Updated dependencies [e14e492]
|
||||
- Updated dependencies [6d6d1bd]
|
||||
- Updated dependencies [6c566cf]
|
||||
- @tabler/core@1.2.0
|
||||
- 6c38a48: Update Bootstrap to v5.3.7
|
||||
- 6c47b5f: Change `package.json` to `core/libs.json` as a source of libraries
|
||||
- 70a41e4: Replace a package list in `download.md` with a link to the 3rd-party libraries page
|
||||
- Updated dependencies [6c4dd36]
|
||||
- Updated dependencies [6fec73a]
|
||||
- Updated dependencies [9951fe9]
|
||||
- Updated dependencies [db6200a]
|
||||
- Updated dependencies [e96f055]
|
||||
- Updated dependencies [a200d30]
|
||||
- Updated dependencies [6c38a48]
|
||||
- Updated dependencies [2a12f72]
|
||||
- Updated dependencies [49ab9ea]
|
||||
- Updated dependencies [666a296]
|
||||
- Updated dependencies [cfd4cb6]
|
||||
- @tabler/core@1.4.0
|
||||
|
||||
## 1.3.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 8f70185: Improve Introduction, Base, Layout and Plugins sections in documentation
|
||||
- e546706: Fix input mask example in docs
|
||||
- 8850f61: Enhance pagination component with new styles
|
||||
- 8470c9b: Fix broken links to other docs section and tabler.io website; improve some labels.
|
||||
- 6a3513f: Fix links in Tabler Emails introduction, improve "How to contribute" and other small fixes
|
||||
- 278967b: Fix switch icon examples with filled icons in documentation
|
||||
- 38ea9aa: Use primary color for `::selection` inside `<code>` in docs
|
||||
- 5b3e201: Fix documentation: remove duplicated code examples; increase height of dropdown examples; fix some links
|
||||
- 7b72653: Fix ribbon component in the documentation
|
||||
- c42b104: Fix incorrect label text on form elements docs page
|
||||
- 895f943: Use tabs-package include to show webfont install steps
|
||||
- 665472c: Demonstrate sticky header table more clearly in docs
|
||||
- 7917f86: Replace non-existent Vimeo file and enhance the inline player documentation
|
||||
- 7fc1d5c: Exclude headings in the carousel and modal examples from ToC
|
||||
- 7773ff2: Exclude headings inside `.example` from the Table of Contents
|
||||
- 222ddd4: Change WYSIWYG title to uppercase
|
||||
- 9b15b94: Add missing `.steps-vertical` classes in docs
|
||||
- 5fa662b: Use color-input examples in documentation
|
||||
- 5619b2d: Fix `src` links to images in README and getting-started docs page
|
||||
- f8075f6: Add documentation for 3rd-party libraries and resources
|
||||
|
||||
@@ -44,8 +44,8 @@ The **Tabler Emails** package is organized into a clear and efficient folder str
|
||||
|
||||
### 1. Email Templates: `emails/`
|
||||
This folder contains {{ emailsCount }} email subfolders, each with a specific template. Each email folder contains the following files:
|
||||
* Compiled HTML files for light and dark themes. Read more about their usage in the [Compiled HTML](/docs/emails/compiled-html) section.
|
||||
* Source HTML files for light and dark themes. Find more information in the [Source HTML](/docs/emails/source-html) section.
|
||||
* Compiled HTML files for light and dark themes. Read more about their usage in the [Compiled HTML](/emails/introduction/compiled-html) section.
|
||||
* Source HTML files for light and dark themes. Find more information in the [Source HTML](/emails/introduction/source-html) section.
|
||||
* Screenshot images for desktop and mobile views.
|
||||
* Assets folder with images used in the email template and the CSS file with styles.
|
||||
|
||||
@@ -60,4 +60,6 @@ It contains 4 subfolders with images used across the different email templates:
|
||||
This file contains the license information for the Tabler Emails package.
|
||||
|
||||
### 4. Readme: `readme.html`
|
||||
This file with the main information about the Tabler Emails package. It contains a brief description of the package and instructions on how to use it.
|
||||
This file contains the main information about the Tabler Emails package, including a brief description and instructions on how to use it.
|
||||
|
||||
Do you like our templates? **Find out more and purchase on [our website]({{ site.homepage }}/emails)**.
|
||||
@@ -9,21 +9,7 @@ summary: Tabler Icons as a webfont allows you to easily include icons in your pr
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
yarn add @tabler/icons-webfont
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
npm install @tabler/icons-webfont
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
pnpm install @tabler/icons-webfont
|
||||
```
|
||||
{% include "docs/tabs-package.html" name="@tabler/icons-webfont" %}
|
||||
|
||||
or just [download from Github](https://github.com/tabler/tabler-icons/releases).
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Use Tabler Icons directly in Figma.
|
||||
summary: The Tabler Figma plugin allows designers to seamlessly integrate Tabler Icons into their Figma projects, providing quick access to a vast library of customizable icons that enhance the design workflow.
|
||||
---
|
||||
|
||||

|
||||

|
||||
|
||||
The Tabler Icons Figma plugin is an essential tool for designers looking to enhance their workflow. It provides seamless access to a comprehensive library of high-quality, customizable icons directly within Figma. Whether you're designing dashboards, websites, or mobile apps, this plugin allows you to quickly search, preview, and integrate Tabler Icons into your projects, saving time and ensuring a consistent, modern aesthetic.
|
||||
|
||||
|
||||
@@ -74,4 +74,6 @@ This folder contains SVG files using CSS variables for flexible theming.
|
||||
- `dark/`: Dark-themed illustrations.
|
||||
- `light/`: Light-themed illustrations.
|
||||
|
||||
This structure ensures easy access to various formats and themes, making Tabler Illustrations a versatile tool for developers and designers alike.
|
||||
This structure ensures easy access to various formats and themes, making Tabler Illustrations a versatile tool for developers and designers alike.
|
||||
|
||||
**Find out more and purchase Tabler Illustrations at [our website]({{ site.homepage }}/illustrations)**.
|
||||
@@ -511,7 +511,7 @@ Look at the example below to see how you can change the color of the skin.
|
||||
|
||||
Tabler Illustrations uses `--tblr-primary` as a fallback color if `--tblr-illustrations-primary` is not set, so if you have a primary color set in your design system, you can use that to ensure consistency across your project.
|
||||
|
||||
```html example columns={1} centered vertical separated height="30rem"
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div>
|
||||
@@ -785,8 +785,8 @@ Tabler Illustrations uses `--tblr-primary` as a fallback color if `--tblr-illust
|
||||
});
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Dark version of the illustration
|
||||
|
||||
|
||||
17
docs/content/illustrations/introduction/preview.md
Normal file
17
docs/content/illustrations/introduction/preview.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
title: Preview
|
||||
summary: "Tabler Illustrations offers 80 illustrations in two themes: light and dark. You can use them in your projects to enhance the visual appeal and convey messages effectively."
|
||||
---
|
||||
|
||||
Look at full list of illustrations below and see how they look. Find out more and purchase Tabler Illustrations at [our website]({{ site.homepage }}/illustrations).
|
||||
|
||||
{% assign all-illustrations = illustrations | sort %}
|
||||
<div class="row g-2 gy-6">
|
||||
{% for illustration in all-illustrations %}
|
||||
<div class="col-6 col-md-4 col-lg-3 text-center">
|
||||
<img src="/static/illustrations/light/{{ illustration }}.png" alt="{{ illustration }}" class="hide-theme-dark" />
|
||||
<img src="/static/illustrations/dark/{{ illustration }}.png" alt="{{ illustration }}" class="hide-theme-light" />
|
||||
<code>{{ illustration }}</code>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
@@ -3,7 +3,8 @@ title: Welcome to Tabler Documentation
|
||||
summary: Tabler Docs provides a comprehensive guide to help you get started with the Tabler ecosystem, including its UI components, plugins, and icons. Explore detailed documentation to understand and leverage the full potential of Tabler in your projects.
|
||||
---
|
||||
|
||||
<ResponsiveImage src="/docs/tabler.png" src-dark="/docs/tabler-dark.png" alt="Tabler" width="816" height="620" class="mb-4" />
|
||||
<img src="/img/tabler.png" alt="Tabler" class="mb-4 hide-theme-dark border-0" width="816" height="620" />
|
||||
<img src="/img/tabler-dark.png" alt="Tabler" class="mb-4 hide-theme-light border-0" width="816" height="620" />
|
||||
|
||||
Find all the guides and resources you need to develop with Tabler and our other tools. Explore our UI components, icons, illustrations, and email templates to enhance your web development experience. Our tools are designed to be easy to use, customizable, and fully responsive, ensuring that your projects look great on any device.
|
||||
|
||||
|
||||
@@ -10,15 +10,6 @@ description: Role of typography in interface design.
|
||||
Use HTML headings to organize content on your website and make the structure clear and user-friendly. The `h1` to `h6` tags are used to define HTML headings.
|
||||
The `h1` tag is the highest level and the `h6` tag is the lowest level.
|
||||
|
||||
```html
|
||||
<h1>H1 Heading</h1>
|
||||
<h2>H2 Heading</h2>
|
||||
<h3>H3 Heading</h3>
|
||||
<h4>H4 Heading</h4>
|
||||
<h5>H5 Heading</h5>
|
||||
<h6>H6 Heading</h6>
|
||||
```
|
||||
|
||||
Below are examples of headings with different levels:
|
||||
|
||||
{% capture html -%}
|
||||
@@ -29,7 +20,7 @@ Below are examples of headings with different levels:
|
||||
<h5>H5 Heading</h5>
|
||||
<h6>H6 Heading</h6>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html vertical %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Paragraphs
|
||||
|
||||
@@ -55,32 +46,15 @@ If you use a second paragraph, it will be separated from the first one by a blan
|
||||
|
||||
Use a variety of semantic text elements, depending on how you want to display particular fragments of content.
|
||||
|
||||
```html
|
||||
<abbr title="Internationalization">I18N</abbr>
|
||||
<strong>Bold</strong>
|
||||
<cite>Citation</cite>
|
||||
<code>Hello World!</code>
|
||||
<del>Deleted</del>
|
||||
<em>Emphasis</em>
|
||||
<i>Italic</i>
|
||||
<ins>Inserted</ins>
|
||||
<kbd>Ctrl + S</kbd>
|
||||
<mark>Highlighted</mark>
|
||||
<s>Strikethrough</s>
|
||||
<samp>Sample</samp>
|
||||
Text <sub>Subscripted</sub> Text <sup>Superscripted</sup>
|
||||
<time>20:00</time>
|
||||
<u>Underline</u>
|
||||
<var>x</var> = <var>y</var> + 2
|
||||
```
|
||||
|
||||
Here are examples of semantic text elements:
|
||||
|
||||
{% capture html -%}
|
||||
<div>
|
||||
<abbr title="Internationalization">I18N</abbr>
|
||||
</div>
|
||||
<div><strong>Bold</strong></div>
|
||||
<div>
|
||||
<strong>Bold</strong>
|
||||
</div>
|
||||
<div>
|
||||
<cite>Citation</cite>
|
||||
</div>
|
||||
@@ -111,19 +85,23 @@ Here are examples of semantic text elements:
|
||||
<div>
|
||||
<samp>Sample</samp>
|
||||
</div>
|
||||
<div>Text <sub>Subscripted</sub></div>
|
||||
<div>Text <sup>Superscripted</sup></div>
|
||||
<div>
|
||||
Text <sub>Subscript</sub>
|
||||
</div>
|
||||
<div>
|
||||
Text <sup>Superscript</sup>
|
||||
</div>
|
||||
<div>
|
||||
<time>20:00</time>
|
||||
</div>
|
||||
<div>
|
||||
<u>Underline</u>
|
||||
</div>
|
||||
<div><var>x</var> = <var>y</var> + 2</div>
|
||||
<div>
|
||||
<var>x</var> = <var>y</var> + 2
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html vertical %}
|
||||
|
||||
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Horizontal rules
|
||||
|
||||
@@ -144,15 +122,11 @@ Use the `hr` tag to represent a thematic break between paragraphs within one sec
|
||||
</p>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html vertical %}
|
||||
|
||||
```html
|
||||
<hr />
|
||||
```
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Horizontal rules with label
|
||||
|
||||
You can also add a label to a horizontal rule and align it as you see fit.
|
||||
You can also add a label to a horizontal rule and align it as you see fit. Centered label is the default.
|
||||
|
||||
{% capture html -%}
|
||||
<p>
|
||||
@@ -173,15 +147,22 @@ You can also add a label to a horizontal rule and align it as you see fit.
|
||||
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
|
||||
labore et dolore magna aliquyam erat, sed diam voluptua.
|
||||
</p>
|
||||
<div class="hr-text hr-text-end">
|
||||
<div class="hr-text hr-text-start">
|
||||
<span>Rule text</span>
|
||||
</div>
|
||||
<p>
|
||||
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
|
||||
takimata sanctus est Lorem ipsum dolor sit amet.
|
||||
</p>
|
||||
<div class="hr-text hr-text-end">
|
||||
<span>Rule text</span>
|
||||
</div>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
|
||||
labore et dolore magna aliquyam erat, sed diam voluptua.
|
||||
</p>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html raw %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Optimized for different alphabets
|
||||
|
||||
@@ -198,45 +179,33 @@ Tabler has been optimized to correctly display content in any language. It suppo
|
||||
<p>אלפבית עברי</p>
|
||||
<p>อักษรไทย</p>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html raw %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Text transform
|
||||
|
||||
Transform the content of components with text capitalization classes.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="text-lowercase">Lowercased text.</div>
|
||||
<div class="text-uppercase">Uppercased text.</div>
|
||||
<div class="text-capitalize">Capitalized text.</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html raw %}
|
||||
|
||||
```html
|
||||
<p class="text-lowercase">Lowercased text.</p>
|
||||
<p class="text-uppercase">Uppercased text.</p>
|
||||
<p class="text-capitalize">Capitalized text.</p>
|
||||
```
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Letter spacing
|
||||
|
||||
Control the tracking (letter spacing) of an element and make it tight, wide or normal.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="tracking-tight">Lorem ipsum dolor sit amet. Tight letter spacing.</div>
|
||||
<div class="tracking-normal">Lorem ipsum dolor sit amet. Normal letter spacing.</div>
|
||||
<div class="tracking-wide">Lorem ipsum dolor sit amet. Wide letter spacing.</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html raw %}
|
||||
|
||||
```html
|
||||
<p class="tracking-tight">Lorem ipsum dolor sit amet. Tight letter spacing.</p>
|
||||
<p class="tracking-normal">Lorem ipsum dolor sit amet. Normal letter spacing.</p>
|
||||
<p class="tracking-wide">Lorem ipsum dolor sit amet. Wide letter spacing.</p>
|
||||
```
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Line height
|
||||
|
||||
Control the leading (line height) of an element.
|
||||
Control the leading (line height) of an element using the `.lh-*` classes. The line height is the vertical space between lines of text.
|
||||
|
||||
{% capture html -%}
|
||||
<p class="lh-1">
|
||||
@@ -254,15 +223,6 @@ Control the leading (line height) of an element.
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
To control the line height of an element, use the following classes:
|
||||
|
||||
```html
|
||||
<p class="lh-1">...</p>
|
||||
<p class="lh-sm">...</p>
|
||||
<p class="lh-base">...</p>
|
||||
<p class="lh-lg">...</p>
|
||||
```
|
||||
|
||||
## Antialiasing
|
||||
|
||||
Control the font smoothing of an element.
|
||||
@@ -273,21 +233,17 @@ Use the `.antialiased` utility to render text using subpixel antialiasing or use
|
||||
<div class="antialiased">Text with antialiasing</div>
|
||||
<div class="subpixel-antialiased">Text without antialiasing</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html raw %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Keyboard input
|
||||
|
||||
Use the `<kbd>` to indicate input that is typically entered via keyboard.
|
||||
|
||||
{% capture html -%}
|
||||
<div>To edit settings, press <kbd>ctrl</kbd> + <kbd>,</kbd> or <kbd>ctrl</kbd> + <kbd>C</kbd>.</div>
|
||||
To edit settings, press <kbd>ctrl</kbd> + <kbd>,</kbd> or <kbd>ctrl</kbd> + <kbd>C</kbd>.
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
```html
|
||||
To edit settings, press <kbd>ctrl</kbd> + <kbd>,</kbd> or <kbd>ctrl</kbd> + <kbd>C</kbd>.
|
||||
```
|
||||
|
||||
## Markdown elements
|
||||
|
||||
If you can't use the CSS classes you want, or you just want to use HTML tags, use the `.markdown` class in a container. It will apply the default styles for markdown elements.
|
||||
|
||||
@@ -14,22 +14,10 @@ Combine `alert` class with one of the following: `alert-success`, `alert-info`,
|
||||
Alert classes affect the color of all the text inside an alert. Use another class, e.g. `text-secondary` to change the color of the alert's content.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="alert alert-success" role="alert">
|
||||
<h4 class="alert-title">Wow! Everything worked!</h4>
|
||||
<div class="text-secondary">Your account has been saved!</div>
|
||||
</div>
|
||||
<div class="alert alert-info" role="alert">
|
||||
<h4 class="alert-title">Did you know?</h4>
|
||||
<div class="text-secondary">Here is something that you might like to know.</div>
|
||||
</div>
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<h4 class="alert-title">Uh oh, something went wrong</h4>
|
||||
<div class="text-secondary">Sorry! There was a problem with your request.</div>
|
||||
</div>
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<h4 class="alert-title">I'm so sorry…</h4>
|
||||
<div class="text-secondary">Your account has been deleted and can't be restored.</div>
|
||||
</div>
|
||||
{% include "ui/alert.html" type="success" title="Wow! Everything worked!" description="Your account has been saved!" %}
|
||||
{% include "ui/alert.html" type="info" title="Did you know?" description="Here is something that you might like to know." %}
|
||||
{% include "ui/alert.html" type="warning" title="Uh oh, something went wrong" description="Sorry! There was a problem with your request." %}
|
||||
{% include "ui/alert.html" type="danger" title="I'm so sorry…" description="Your account has been deleted and can't be restored." %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -38,9 +26,7 @@ Alert classes affect the color of all the text inside an alert. Use another clas
|
||||
Add a link to your alert message to redirect users to the details they need to complete or additional information they should read. Use `alert-link` class to style the link and match the text color.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="alert alert-danger m-0">
|
||||
This is a danger alert — <a href="#" class="alert-link">check it out</a>!
|
||||
</div>
|
||||
{% include "ui/alert.html" type="danger" title="This is a danger alert" link="check it out" %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -53,34 +39,7 @@ Add the `x` close button to make an alert modal dismissible. Thanks to that, you
|
||||
```
|
||||
|
||||
{% capture html -%}
|
||||
<div class="alert alert-success alert-dismissible" role="alert">
|
||||
<div>
|
||||
<h4 class="alert-title">Wow! Everything worked!</h4>
|
||||
<div class="text-secondary">Your account has been saved!</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
<div class="alert alert-info alert-dismissible" role="alert">
|
||||
<div>
|
||||
<h4 class="alert-title">Did you know?</h4>
|
||||
<div class="text-secondary">Here is something that you might like to know.</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<div>
|
||||
<h4 class="alert-title">Uh oh, something went wrong</h4>
|
||||
<div class="text-secondary">Sorry! There was a problem with your request.</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
<div class="alert alert-danger alert-dismissible" role="alert">
|
||||
<div>
|
||||
<h4 class="alert-title">I'm so sorry…</h4>
|
||||
<div class="text-secondary">Your account has been deleted and can't be restored.</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% include "ui/alert.html" type="danger" title="This is a danger alert" show-close %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -415,4 +374,6 @@ You're not limited to the 4 default alert colors. You can use any [base or socia
|
||||
|
||||
## SASS variables
|
||||
|
||||
You can customize the alert colors by changing the SASS variables. The default values are:
|
||||
|
||||
{% scss-docs "alert-variables" "ui/_alerts.scss" %}
|
||||
@@ -13,12 +13,6 @@ Add the autosize element to your input to make it automatically adjust to the le
|
||||
|
||||
To create autosize textarea, add the `data-bs-toggle="autosize"` attribute to the textarea element:
|
||||
|
||||
```html
|
||||
<textarea class="form-control" data-bs-toggle="autosize" placeholder="Type something…"></textarea>
|
||||
```
|
||||
|
||||
Look at the example below to see how the autosize element works:
|
||||
|
||||
{% capture html -%}
|
||||
<label class="form-label">Autosize example</label>
|
||||
<textarea class="form-control" data-bs-toggle="autosize" placeholder="Type something…"></textarea>
|
||||
|
||||
@@ -56,15 +56,9 @@ Besides pictures and initials, you can also use icons to make the avatars more u
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
```html
|
||||
<span class="avatar">
|
||||
{% include "ui/icon.html" icon="user" %}
|
||||
</span>
|
||||
```
|
||||
|
||||
## Avatar initials color
|
||||
|
||||
Customize the color of the avatars' background. You can click [here](/docs/ui/base/colors) to see the list of available colors.
|
||||
Customize the color of the avatars' background. See the [full list of available colors](/ui/base/colors) for more details.
|
||||
|
||||
{% capture html -%}
|
||||
<span class="avatar bg-green-lt">AB</span>
|
||||
|
||||
@@ -10,50 +10,56 @@ bootstrapLink: components/badge/
|
||||
The default badges are square and come in the basic set of colors.
|
||||
|
||||
{% capture html -%}
|
||||
<span class="badge bg-blue-lt">Blue</span>
|
||||
<span class="badge bg-azure-lt">Azure</span>
|
||||
<span class="badge bg-indigo-lt">Indigo</span>
|
||||
<span class="badge bg-purple-lt">Purple</span>
|
||||
<span class="badge bg-pink-lt">Pink</span>
|
||||
<span class="badge bg-red-lt">Red</span>
|
||||
<span class="badge bg-orange-lt">Orange</span>
|
||||
<span class="badge bg-yellow-lt">Yellow</span>
|
||||
<span class="badge bg-lime-lt">Lime</span>
|
||||
<span class="badge bg-green-lt">Green</span>
|
||||
<span class="badge bg-teal-lt">Teal</span>
|
||||
<span class="badge bg-cyan-lt">Cyan</span>
|
||||
<div class="badges-list">
|
||||
{% for color in site.colors -%}
|
||||
{% include "ui/badge.html" color=color[0] text=color[1].title %}
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
## Headings
|
||||
|
||||
Badges can be used in headings to draw attention to new or important information. You can use them in any heading level, from `<h1>` to `<h6>`. The example below shows how to use badges in headings.
|
||||
|
||||
{% capture html -%}
|
||||
<h1>Example heading <span class="badge">New</span></h1>
|
||||
<h2>Example heading <span class="badge">New</span></h2>
|
||||
<h3>Example heading <span class="badge">New</span></h3>
|
||||
<h4>Example heading <span class="badge">New</span></h4>
|
||||
<h5>Example heading <span class="badge">New</span></h5>
|
||||
<h6>Example heading <span class="badge">New</span></h6>
|
||||
<h1>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h1>
|
||||
<h2>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h2>
|
||||
<h3>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h3>
|
||||
<h4>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h4>
|
||||
<h5>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h5>
|
||||
<h6>
|
||||
Example heading
|
||||
{% include "ui/badge.html" text="New" -%}
|
||||
</h6>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
## Outline badges
|
||||
## Light versions of badges
|
||||
|
||||
You can use the `-lt` classes to create a light version of the badge. This is useful for creating a more subtle look.
|
||||
|
||||
For example you can use the `bg-blue-lt` class to create a light blue badge. If you add the `text-blue-lt-fg` class, the text will be blue as well.
|
||||
|
||||
{% capture html -%}
|
||||
<span class="badge badge-outline text-blue">blue</span>
|
||||
<span class="badge badge-outline text-azure">azure</span>
|
||||
<span class="badge badge-outline text-indigo">indigo</span>
|
||||
<span class="badge badge-outline text-purple">purple</span>
|
||||
<span class="badge badge-outline text-pink">pink</span>
|
||||
<span class="badge badge-outline text-red">red</span>
|
||||
<span class="badge badge-outline text-orange">orange</span>
|
||||
<span class="badge badge-outline text-yellow">yellow</span>
|
||||
<span class="badge badge-outline text-lime">lime</span>
|
||||
<span class="badge badge-outline text-green">green</span>
|
||||
<span class="badge badge-outline text-teal">teal</span>
|
||||
<span class="badge badge-outline text-cyan">cyan</span>
|
||||
{%- for color in site.colors -%}
|
||||
{% include "ui/badge.html" color=color[0] text=color[1].title light %}
|
||||
{%- endfor -%}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
@@ -62,18 +68,44 @@ The default badges are square and come in the basic set of colors.
|
||||
Use the `.badge-pill` class if you want to create a badge with rounded corners. Its width will adjust to the label text.
|
||||
|
||||
{% capture html -%}
|
||||
<span class="badge badge-pill bg-blue-lt">1</span>
|
||||
<span class="badge badge-pill bg-azure-lt">2</span>
|
||||
<span class="badge badge-pill bg-indigo-lt">3</span>
|
||||
<span class="badge badge-pill bg-purple-lt">4</span>
|
||||
<span class="badge badge-pill bg-pink-lt">5</span>
|
||||
<span class="badge badge-pill bg-red-lt">6</span>
|
||||
<span class="badge badge-pill bg-orange-lt">7</span>
|
||||
<span class="badge badge-pill bg-yellow-lt">8</span>
|
||||
<span class="badge badge-pill bg-lime-lt">9</span>
|
||||
<span class="badge badge-pill bg-green-lt">10</span>
|
||||
<span class="badge badge-pill bg-teal-lt">11</span>
|
||||
<span class="badge badge-pill bg-cyan-lt">12</span>
|
||||
{%- for color in site.colors -%}
|
||||
{% include "ui/badge.html" color=color[0] text=color[1].title class="badge-pill" %}
|
||||
{%- endfor -%}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
You can use it to create a pill with numbers, for example, to show the number of unread messages. The badge will adjust its width to the number of digits.
|
||||
|
||||
{% capture html -%}
|
||||
{%- for color in site.colors -%}
|
||||
{% include "ui/badge.html" color=color[0] text=forloop.index class="badge-pill" %}
|
||||
{%- endfor -%}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
## Badges with icons
|
||||
|
||||
You can use icons in badges to make them more visually appealing. The example below demonstrates how to use icons in badges.
|
||||
|
||||
{% capture html -%}
|
||||
{% include "ui/badge.html" text="Star" icon="star" -%}
|
||||
{% include "ui/badge.html" text="Heart" icon="heart" -%}
|
||||
{% include "ui/badge.html" text="Check" icon="check" -%}
|
||||
{% include "ui/badge.html" text="X" icon="x" -%}
|
||||
{% include "ui/badge.html" text="Plus" icon="plus" -%}
|
||||
{% include "ui/badge.html" text="Minus" icon="minus" -%}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
You can also use an icon on the right side of the badge. The example below demonstrates how to use icons on the right side of badges.
|
||||
|
||||
{% capture html -%}
|
||||
{% include "ui/badge.html" text="Star" icon-end="arrow-right" -%}
|
||||
{% include "ui/badge.html" text="Heart" icon-end="arrow-right" -%}
|
||||
{% include "ui/badge.html" text="Check" icon-end="arrow-right" -%}
|
||||
{% include "ui/badge.html" text="X" icon-end="arrow-right" -%}
|
||||
{% include "ui/badge.html" text="Plus" icon-end="arrow-right" -%}
|
||||
{% include "ui/badge.html" text="Minus" icon-end="arrow-right" -%}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
@@ -99,20 +131,55 @@ Place the badge within an `<a>` element if you want it to perform the function o
|
||||
|
||||
## Button with badge
|
||||
|
||||
Badges can be used as part of links or buttons to provide a counter.
|
||||
Badges can be used as parts of links or buttons to provide, for example, a counter. Use the `.badge-notification` class to create a notification badge. This class will position the badge in the top right corner of the button.
|
||||
|
||||
```
|
||||
<button type="button" class="btn">
|
||||
Notifications <span class="badge bg-red-lt ms-2">4</span>
|
||||
</button>
|
||||
```
|
||||
|
||||
The results can be seen in the example below.
|
||||
If you don't provide text for the badge, you end up with a small dot. This is useful for creating a simple notification button.
|
||||
|
||||
{% capture html -%}
|
||||
<button type="button" class="btn">Notifications <span class="badge bg-red-lt ms-2">4</span></button>
|
||||
<button type="button" class="btn">
|
||||
Notifications <span class="badge bg-green-lt ms-2">4</span>
|
||||
Notifications {% include "ui/badge.html" text="2" color="red" class="ms-2" -%}
|
||||
</button>
|
||||
<button type="button" class="btn">
|
||||
Inbox {% include "ui/badge.html" text="4" color="red" class="badge-notification" -%}
|
||||
</button>
|
||||
<button type="button" class="btn">
|
||||
Profile {% include "ui/badge.html" text="" color="red" class="badge-notification" -%}
|
||||
</button>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
## Animated badges
|
||||
|
||||
You can use the `.badge-blink` class to create a blinking effect. This class will add a CSS animation to the badge, so it will blink to draw attention.
|
||||
|
||||
{% capture html -%}
|
||||
<button type="button" class="btn">
|
||||
Profile {% include "ui/badge.html" text="" color="red" class="badge-notification badge-blink" -%}
|
||||
</button>
|
||||
{% endcapture %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
## Size Options
|
||||
|
||||
Use `.badge-sm` or `.badge-lg` to change badge size according to your needs. The default size is `.badge` and it is used in the examples above.
|
||||
|
||||
{% capture html -%}
|
||||
<div>
|
||||
{% include "ui/badge.html" color="primary" scale="sm" text="New" class="badge-sm" -%}
|
||||
{% include "ui/badge.html" color="primary" scale="sm" text="1" class="badge-pill" -%}
|
||||
</div>
|
||||
<div>
|
||||
{% include "ui/badge.html" color="primary" text="New" class="badge-sm" -%}
|
||||
{% include "ui/badge.html" color="primary" text="1" class="badge-pill" -%}
|
||||
</div>
|
||||
<div>
|
||||
{% include "ui/badge.html" color="primary" scale="lg" text="New" class="badge-sm" -%}
|
||||
{% include "ui/badge.html" color="primary" scale="lg" text="1" class="badge-pill" -%}
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html centered vertical %}
|
||||
|
||||
|
||||
## More examples
|
||||
|
||||
If you want to see more examples of badges, you can check out the [Bootstrap documentation](https://getbootstrap.com/docs/5.3/components/badge/) for badges. You can also find more examples in the Tabler [Badges](https://preview.tabler.io/badges.html) preview.
|
||||
@@ -9,122 +9,41 @@ description: Navigation aid for better structure.
|
||||
|
||||
Use the `breadcrumb` class to add a breadcrumb to your interface design for better navigation. The `active` modifier in a `li` tag will help you indicate the current page location and facilitate navigation within your website or app.
|
||||
|
||||
```html
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">...</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">...</a>
|
||||
</li>
|
||||
</ol>
|
||||
```
|
||||
|
||||
Look at the example below to see how breadcrumbs work in practice.
|
||||
|
||||
{% capture html -%}
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
{% include "docs/example.html" html=html centered %}
|
||||
|
||||
## Different separators
|
||||
|
||||
You can use different breadcrumb styles to match your website or app design. Choose between `breadcrumb-dots`, `breadcrumb-arrows`, and `breadcrumb-bullets` to create a unique look.
|
||||
|
||||
```html
|
||||
<ol class="breadcrumb breadcrumb-dots">
|
||||
...
|
||||
</ol>
|
||||
```
|
||||
|
||||
This example shows how to use different breadcrumb styles.
|
||||
|
||||
{% capture html -%}
|
||||
<ol class="breadcrumb breadcrumb-dots">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
<ol class="breadcrumb breadcrumb-arrows">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
<ol class="breadcrumb breadcrumb-bullets">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" separator="dots" %}
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" separator="arrows" %}
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" separator="bullets" %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html vertical separated %}
|
||||
{% include "docs/example.html" html=html vertical separated centered %}
|
||||
|
||||
## With icon
|
||||
|
||||
You can use icons in breadcrumbs to make them more visually appealing. The example below demonstrates how to use icons in breadcrumbs.
|
||||
|
||||
{% capture html -%}
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">
|
||||
{% include "ui/icon.html" icon="home" %}
|
||||
</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" home-icon %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
{% include "docs/example.html" html=html vertical separated %}
|
||||
|
||||
## Muted breadcrumbs
|
||||
|
||||
You can use the `breadcrumb-muted` class to create a muted breadcrumb style. This style is perfect for breadcrumbs that are not the main focus of your website or app.
|
||||
|
||||
{% capture html -%}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb breadcrumb-muted">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Data</a>
|
||||
</li>
|
||||
</ol>
|
||||
</nav>
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Data" class="breadcrumb-muted" %}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -136,24 +55,9 @@ You can use breadcrumbs in headers to show the current page location and provide
|
||||
<div class="page-header">
|
||||
<div class="row align-items-center mw-100">
|
||||
<div class="col">
|
||||
<div class="mb-1">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Home</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="#">Library</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
<a href="#">Articles</a>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
{% include "ui/breadcrumb.html" pages="Home,Library,Articles" -%}
|
||||
<h2 class="page-title">
|
||||
<span class="text-truncate"
|
||||
>Knights of Ni, we are but simple travelers who seek the enchanter who lives beyond these
|
||||
woods.</span
|
||||
>
|
||||
<span class="text-truncate">How to Build a Modern Dashboard with Tabler</span>
|
||||
</h2>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
@@ -168,5 +72,5 @@ You can use breadcrumbs in headers to show the current page location and provide
|
||||
</div>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
{% include "docs/example.html" html=html centered vertical %}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ As one of the most common elements of UI design, buttons have a very important f
|
||||
<input type="submit" class="btn" value="Submit" />
|
||||
<input type="reset" class="btn" value="Reset" />
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Default button
|
||||
|
||||
@@ -25,7 +25,7 @@ The standard button creates a white background and subtle hover animation. It's
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn" role="button">Link</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Button variations
|
||||
|
||||
@@ -41,7 +41,7 @@ Use the button classes that correspond to the function of your button. The big r
|
||||
<a href="#" class="btn btn-dark">Dark</a>
|
||||
<a href="#" class="btn btn-light">Light</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered -%}
|
||||
{%- include "docs/example.html" html=html separated centered %}
|
||||
|
||||
## Disabled buttons
|
||||
|
||||
@@ -57,7 +57,7 @@ Make buttons look inactive to show that an action is possible once the user meet
|
||||
<a href="#" class="btn btn-dark disabled">Dark</a>
|
||||
<a href="#" class="btn btn-light disabled">Light</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered -%}
|
||||
{%- include "docs/example.html" html=html separated centered %}
|
||||
|
||||
## Color variations
|
||||
|
||||
@@ -77,7 +77,7 @@ Choose the right color for your button to make it go well with your design and d
|
||||
<a href="#" class="btn btn-teal">Teal</a>
|
||||
<a href="#" class="btn btn-cyan">Cyan</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered -%}
|
||||
{%- include "docs/example.html" html=html separated centered %}
|
||||
|
||||
## Ghost buttons
|
||||
|
||||
@@ -95,7 +95,7 @@ Use the `.btn-ghost-*` class to make your button look simple yet aesthetically a
|
||||
<a href="#" class="btn btn-ghost-light">Light</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated vertical -%}
|
||||
{%- include "docs/example.html" html=html separated vertical %}
|
||||
|
||||
## Square buttons
|
||||
|
||||
@@ -104,7 +104,7 @@ Use the `.btn-square` class to remove the border radius, if you want the corners
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn btn-square">Square button</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Pill buttons
|
||||
|
||||
@@ -113,7 +113,7 @@ Add the `.btn-pill` class to your button to make it rounded and give it a modern
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn btn-pill">Pill button</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Outline buttons
|
||||
|
||||
@@ -129,7 +129,7 @@ Replace the default modifier class with the `.btn-outline-*` class, if you want
|
||||
<a href="#" class="btn btn-outline-dark">Dark</a>
|
||||
<a href="#" class="btn btn-outline-light">Light</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Button size
|
||||
|
||||
@@ -139,19 +139,19 @@ Add `.btn-lg` or `.btn-sm` to change the size of your button and differentiate t
|
||||
<button type="button" class="btn btn-primary btn-lg">Large button</button>
|
||||
<button type="button" class="btn btn-lg">Large button</button>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
{% capture html -%}
|
||||
<button type="button" class="btn btn-primary btn-sm">Small button</button>
|
||||
<button type="button" class="btn btn-sm">Small button</button>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Buttons with icons
|
||||
|
||||
Label your button with text and add an icon to communicate the action and make it easy to identify for users. Icons are easily recognized and improve the aesthetics of your button design, giving it a modern and attractive look.
|
||||
|
||||
Icons can be found [**here**](/docs/components/icons)
|
||||
See all icons at [tabler.io/icons]({{ site.icons.link }}).
|
||||
|
||||
{% capture html -%}
|
||||
<button type="button" class="btn">
|
||||
@@ -179,7 +179,7 @@ Icons can be found [**here**](/docs/components/icons)
|
||||
Comment
|
||||
</button>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Social buttons
|
||||
|
||||
@@ -243,7 +243,7 @@ You can use the icons of popular social networking sites, which users are famili
|
||||
Tabler
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered hide-code -%}
|
||||
{%- include "docs/example.html" html=html separated centered hide-code %}
|
||||
|
||||
```html
|
||||
<a href="#" class="btn btn-facebook">
|
||||
@@ -298,7 +298,7 @@ You can also add an icon without the name of a social networking site, if you wa
|
||||
{%- include "ui/icon.html" icon="brand-tabler" -%}
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated vertical hide-code -%}
|
||||
{%- include "docs/example.html" html=html separated vertical hide-code %}
|
||||
|
||||
```html
|
||||
<a href="#" class="btn btn-facebook btn-icon" aria-label="Button">
|
||||
@@ -333,7 +333,7 @@ Add the `.btn-icon` class to remove unnecessary padding from your button and use
|
||||
{%- include "ui/icon.html" icon="git-merge" -%}
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered hide-code -%}
|
||||
{%- include "docs/example.html" html=html separated centered hide-code %}
|
||||
|
||||
```html
|
||||
<a href="#" class="btn btn-primary btn-icon" aria-label="Button">
|
||||
@@ -373,7 +373,7 @@ Create a dropdown button that will encourage users to click for more options. Yo
|
||||
</div>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered hide-code -%}
|
||||
{%- include "docs/example.html" html=html centered hide-code height="260px" %}
|
||||
|
||||
```html
|
||||
<div class="dropdown">
|
||||
@@ -399,7 +399,7 @@ Add the `.btn-loading` class to show a button's loading state, which can be usef
|
||||
Loading button with loooong content
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn btn-primary">
|
||||
@@ -407,7 +407,17 @@ Add the `.btn-loading` class to show a button's loading state, which can be usef
|
||||
Button
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Full width buttons
|
||||
|
||||
Add the `.w-100` class to make buttons span the full width of their container. This is useful for mobile-first designs or when you want buttons to take up the entire available space.
|
||||
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn btn-primary w-100">Full width button</a>
|
||||
<a href="#" class="btn btn-outline-secondary w-100">Full width outline button</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated %}
|
||||
|
||||
## List of buttons
|
||||
|
||||
@@ -420,7 +430,7 @@ Create a list of buttons using the `.btn-list` container to display different ac
|
||||
<a href="#" class="btn btn-danger">Cancel</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
If the list is long, it will be wrapped and some buttons will be moved to the next line, keeping them all evenly spaced.
|
||||
|
||||
@@ -447,7 +457,7 @@ If the list is long, it will be wrapped and some buttons will be moved to the ne
|
||||
<a href="#" class="btn">Nineteen</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
Use the `.text-center` or the `.text-end` modifiers to change the buttons' alignment and place them where they suit best.
|
||||
|
||||
@@ -457,7 +467,7 @@ Use the `.text-center` or the `.text-end` modifiers to change the buttons' align
|
||||
<a href="#" class="btn btn-primary">Save changes</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html -%}
|
||||
{%- include "docs/example.html" html=html %}
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-list justify-content-end">
|
||||
@@ -465,7 +475,7 @@ Use the `.text-center` or the `.text-end` modifiers to change the buttons' align
|
||||
<a href="#" class="btn btn-primary">Save changes</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html -%}
|
||||
{%- include "docs/example.html" html=html %}
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-list">
|
||||
@@ -474,7 +484,27 @@ Use the `.text-center` or the `.text-end` modifiers to change the buttons' align
|
||||
<a href="#" class="btn btn-primary">Save changes</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html -%}
|
||||
{%- include "docs/example.html" html=html %}
|
||||
|
||||
## Buttons with badges
|
||||
|
||||
Add badges to buttons to display additional information like counts, notifications, or status indicators. Badges automatically position themselves within the button layout.
|
||||
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn">
|
||||
Notifications
|
||||
<span class="badge ms-2">14</span>
|
||||
</a>
|
||||
<a href="#" class="btn">
|
||||
Messages
|
||||
<span class="badge ms-2">3</span>
|
||||
</a>
|
||||
<a href="#" class="btn">
|
||||
Alerts
|
||||
<span class="badge ms-2">7</span>
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Buttons with avatars
|
||||
|
||||
@@ -507,4 +537,143 @@ Use buttons with avatars to simplify the process of interaction and make your de
|
||||
Avatar
|
||||
</a>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Buttons with animations on hover
|
||||
|
||||
Add a subtle animation effect to your buttons when users hover over them. This can enhance the interactivity and provide visual feedback to improve the user experience.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-list">
|
||||
<a class="btn btn-animate-icon">
|
||||
Save {% include "ui/icon.html" icon="arrow-right" class="icon-end" %}
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-rotate">
|
||||
{% include "ui/icon.html" icon="plus" %} Add
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-shake">
|
||||
{% include "ui/icon.html" icon="bell" %} Notifications
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-rotate">
|
||||
{% include "ui/icon.html" icon="settings" %} Settings
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-pulse">
|
||||
{% include "ui/icon.html" icon="heart" %} Love
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-rotate">
|
||||
{% include "ui/icon.html" icon="x" %} Close
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-tada">
|
||||
{% include "ui/icon.html" icon="check" %} Confirm
|
||||
</a>
|
||||
<a class="btn btn-animate-icon">
|
||||
Next {% include "ui/icon.html" icon="chevron-right" class="icon-end" %}
|
||||
</a>
|
||||
<a class="btn btn-animate-icon btn-animate-icon-move-start">
|
||||
{% include "ui/icon.html" icon="chevron-left" %} Previous
|
||||
</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html %}
|
||||
|
||||
## Button sizes
|
||||
|
||||
Use size modifiers to change the size of your buttons. Available sizes: `.btn-xs`, `.btn-sm`, default, `.btn-lg`, `.btn-xl`.
|
||||
|
||||
{% capture html -%}
|
||||
<button type="button" class="btn btn-sm">Small button</button>
|
||||
<button type="button" class="btn">Default button</button>
|
||||
<button type="button" class="btn btn-lg">Large button</button>
|
||||
<button type="button" class="btn btn-xl">Extra large button</button>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html separated centered vertical %}
|
||||
|
||||
## Link buttons
|
||||
|
||||
Use the `.btn-link` class to create buttons that look like links but maintain button functionality. These are useful for secondary actions that shouldn't compete with primary buttons for attention.
|
||||
|
||||
{% capture html -%}
|
||||
<a href="#" class="btn btn-link">Link button</a>
|
||||
<button type="button" class="btn btn-link">Link button</button>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Action buttons
|
||||
|
||||
Use the `.btn-action` class to create subtle action buttons that are perfect for card headers, toolbars, or other interface elements where you want minimal visual impact.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-actions">
|
||||
<a href="#" class="btn btn-action" aria-label="Edit">
|
||||
{%- include "ui/icon.html" icon="edit" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action" aria-label="Copy">
|
||||
{%- include "ui/icon.html" icon="copy" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action" aria-label="Settings">
|
||||
{%- include "ui/icon.html" icon="settings" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action" aria-label="Delete">
|
||||
{%- include "ui/icon.html" icon="trash" -%}
|
||||
</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Action button groups
|
||||
|
||||
Use the `.btn-actions` container to group multiple action buttons together. This creates a cohesive set of related actions that work well in card headers, toolbars, or other interface elements.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-actions">
|
||||
<a href="#" class="btn btn-action">
|
||||
{%- include "ui/icon.html" icon="refresh" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action">
|
||||
{%- include "ui/icon.html" icon="chevron-up" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action">
|
||||
{%- include "ui/icon.html" icon="dots-vertical" -%}
|
||||
</a>
|
||||
<a href="#" class="btn btn-action">
|
||||
{%- include "ui/icon.html" icon="x" -%}
|
||||
</a>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
## Button groups
|
||||
|
||||
Use button groups to combine related buttons together. Button groups are perfect for creating toolbars, segmented controls, or any interface where multiple related actions should be visually grouped.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-group" role="group">
|
||||
<button type="button" class="btn">Left</button>
|
||||
<button type="button" class="btn">Middle</button>
|
||||
<button type="button" class="btn">Right</button>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-group" role="group">
|
||||
<input type="radio" class="btn-check" name="btn-radio" id="btn-radio-1" autocomplete="off" checked>
|
||||
<label class="btn" for="btn-radio-1">Radio 1</label>
|
||||
|
||||
<input type="radio" class="btn-check" name="btn-radio" id="btn-radio-2" autocomplete="off">
|
||||
<label class="btn" for="btn-radio-2">Radio 2</label>
|
||||
|
||||
<input type="radio" class="btn-check" name="btn-radio" id="btn-radio-3" autocomplete="off">
|
||||
<label class="btn" for="btn-radio-3">Radio 3</label>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
{% capture html -%}
|
||||
<div class="btn-group-vertical" role="group">
|
||||
<button type="button" class="btn">Top</button>
|
||||
<button type="button" class="btn">Middle</button>
|
||||
<button type="button" class="btn">Bottom</button>
|
||||
</div>
|
||||
{%- endcapture -%}
|
||||
{%- include "docs/example.html" html=html centered %}
|
||||
|
||||
@@ -16,7 +16,7 @@ Use the `.card` and `.card-body` classes to create a card and use it as the basi
|
||||
</div>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column %}
|
||||
|
||||
## Card padding
|
||||
|
||||
@@ -38,14 +38,7 @@ Cards with the `.card-sm` class are well suited for small items such as widgets,
|
||||
<div class="card-body">This is some text within a card body.</div>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" %}
|
||||
|
||||
```html
|
||||
<div class="card card-sm">...</div>
|
||||
<div class="card">...</div>
|
||||
<div class="card card-md">...</div>
|
||||
<div class="card card-lg">...</div>
|
||||
```
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column %}
|
||||
|
||||
## Card with title
|
||||
|
||||
@@ -67,7 +60,7 @@ Add a title to your card by including the `.card-title` class within `.card-body
|
||||
</div>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column vertical %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column %}
|
||||
|
||||
## Card with title and image
|
||||
|
||||
@@ -89,7 +82,7 @@ To create a more visually appealing card, add a title and an image. Thanks to th
|
||||
</div>
|
||||
</div>
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column %}
|
||||
|
||||
## Blog post card
|
||||
|
||||
@@ -169,7 +162,7 @@ You can also add an image on the left side of the card. To do it, add the `.card
|
||||
</a>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="card-body">
|
||||
<div class="card-body h-full d-flex flex-column">
|
||||
<h3 class="card-title">
|
||||
<a href="#">Shut up!</a>
|
||||
</h3>
|
||||
@@ -198,7 +191,7 @@ You can also add an image on the left side of the card. To do it, add the `.card
|
||||
|
||||
## Color variations
|
||||
|
||||
Add a status color to your card, either at the top or on the side of the card, to customize it and make it more eye-catching.
|
||||
Add a status color to your card, either at the top or on the side of the card, to customize it and make it more eye-catching. Use `card-status-*` and `bg-*` classes to change the placement and color of the status border.
|
||||
|
||||
{% capture html -%}
|
||||
<div class="row row-deck">
|
||||
@@ -230,29 +223,6 @@ Add a status color to your card, either at the top or on the side of the card, t
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" %}
|
||||
|
||||
```html
|
||||
<div class="card">
|
||||
<div class="card-status-top bg-danger"></div>
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Card with top status</h3>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt,
|
||||
iste, itaque minima neque pariatur perferendis sed suscipit velit vitae voluptatem.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-status-start bg-green"></div>
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Card with side status</h3>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt,
|
||||
iste, itaque minima neque pariatur perferendis sed suscipit velit vitae voluptatem.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Stacked card
|
||||
|
||||
Use the `card-stacked` class to stack up multiple cards, if you want to save screen space or create a visually appealing effect.
|
||||
@@ -332,66 +302,3 @@ Organize multiple cards into tabs to be able to display more content in a well-o
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html bg="surface-secondary" column %}
|
||||
|
||||
```html
|
||||
<!-- Cards with tabs component -->
|
||||
<div class="card-tabs">
|
||||
<!-- Cards navigation -->
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="nav-item">
|
||||
<a href="#tab-top-1" class="nav-link active" data-bs-toggle="tab">Tab 1</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tab-top-2" class="nav-link" data-bs-toggle="tab">Tab 2</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tab-top-3" class="nav-link" data-bs-toggle="tab">Tab 3</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tab-top-4" class="nav-link" data-bs-toggle="tab">Tab 4</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<!-- Content of card #1 -->
|
||||
<div id="tab-top-1" class="card tab-pane active show">
|
||||
<div class="card-body">
|
||||
<div class="card-title">Content of tab #1</div>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci, alias aliquid
|
||||
distinctio dolorem expedita, fugiat hic magni molestiae molestias odit.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Content of card #2 -->
|
||||
<div id="tab-top-2" class="card tab-pane">
|
||||
<div class="card-body">
|
||||
<div class="card-title">Content of tab #2</div>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci, alias aliquid
|
||||
distinctio dolorem expedita, fugiat hic magni molestiae molestias odit.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Content of card #3 -->
|
||||
<div id="tab-top-3" class="card tab-pane">
|
||||
<div class="card-body">
|
||||
<div class="card-title">Content of tab #3</div>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci, alias aliquid
|
||||
distinctio dolorem expedita, fugiat hic magni molestiae molestias odit.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Content of card #4 -->
|
||||
<div id="tab-top-4" class="card tab-pane">
|
||||
<div class="card-body">
|
||||
<div class="card-title">Content of tab #4</div>
|
||||
<p class="text-secondary">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci, alias aliquid
|
||||
distinctio dolorem expedita, fugiat hic magni molestiae molestias odit.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
|
||||
@@ -381,6 +381,7 @@ An example of adding thumbnails on the right side:
|
||||
## Carousel with captions
|
||||
|
||||
Add captions to your slides easily with the `.carousel-caption` element within any `.carousel-item`. To make the text more readable on the image you can add `carousel-caption-background` which will add a black overlay over the image.
|
||||
Below the `md` responsive breakpoint, the captions on the following example will be hidden as they have the `d-none` class applied to them.
|
||||
|
||||
{% capture html -%}
|
||||
<div id="carousel-captions" class="carousel slide" data-bs-ride="carousel">
|
||||
|
||||
@@ -16,105 +16,10 @@ Line charts are an essential tool for visualizing data trends over time. They ar
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-demo-line" class="chart-lg"></div>
|
||||
{% include "ui/chart.html" chart-id="demo-line" legend height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-demo-line"), {
|
||||
chart: {
|
||||
type: "line",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
fill: {
|
||||
opacity: 1,
|
||||
},
|
||||
stroke: {
|
||||
width: 2,
|
||||
lineCap: "round",
|
||||
curve: "straight",
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "Session Duration",
|
||||
data: [117, 92, 94, 98, 75, 110, 69, 80, 109, 113, 115, 95],
|
||||
},
|
||||
{
|
||||
name: "Page Views",
|
||||
data: [59, 80, 61, 66, 70, 84, 87, 64, 94, 56, 55, 67],
|
||||
},
|
||||
{
|
||||
name: "Total Visits",
|
||||
data: [53, 51, 52, 41, 46, 60, 45, 43, 30, 50, 58, 59],
|
||||
},
|
||||
],
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -20,
|
||||
right: 0,
|
||||
left: -4,
|
||||
bottom: -4,
|
||||
},
|
||||
strokeDashArray: 4,
|
||||
},
|
||||
xaxis: {
|
||||
labels: {
|
||||
padding: 0,
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false,
|
||||
},
|
||||
type: "datetime",
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
padding: 4,
|
||||
},
|
||||
},
|
||||
labels: [
|
||||
"2020-06-21",
|
||||
"2020-06-22",
|
||||
"2020-06-23",
|
||||
"2020-06-24",
|
||||
"2020-06-25",
|
||||
"2020-06-26",
|
||||
"2020-06-27",
|
||||
"2020-06-28",
|
||||
"2020-06-29",
|
||||
"2020-06-30",
|
||||
"2020-07-01",
|
||||
"2020-07-02",
|
||||
],
|
||||
colors: ["var(--tblr-yellow)", "var(--tblr-green)", "var(--tblr-primary)"],
|
||||
legend: {
|
||||
show: true,
|
||||
position: "bottom",
|
||||
offsetY: 12,
|
||||
markers: {
|
||||
width: 10,
|
||||
height: 10,
|
||||
radius: 100,
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 8,
|
||||
vertical: 8,
|
||||
},
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -125,103 +30,10 @@ Area charts are ideal for representing cumulative data over time. They add visua
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-demo-area" class="chart-lg"></div>
|
||||
{% include "ui/chart.html" chart-id="demo-area" height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-demo-area"), {
|
||||
chart: {
|
||||
type: "area",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
},
|
||||
fill: {
|
||||
opacity: 0.16,
|
||||
type: "solid",
|
||||
},
|
||||
stroke: {
|
||||
width: 2,
|
||||
lineCap: "round",
|
||||
curve: "smooth",
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "series1",
|
||||
data: [56, 40, 39, 47, 34, 48, 44],
|
||||
},
|
||||
{
|
||||
name: "series2",
|
||||
data: [45, 43, 30, 23, 38, 39, 54],
|
||||
},
|
||||
],
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -20,
|
||||
right: 0,
|
||||
left: -4,
|
||||
bottom: -4,
|
||||
},
|
||||
strokeDashArray: 4,
|
||||
},
|
||||
xaxis: {
|
||||
labels: {
|
||||
padding: 0,
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false,
|
||||
},
|
||||
axisBorder: {
|
||||
show: false,
|
||||
},
|
||||
type: "datetime",
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
padding: 4,
|
||||
},
|
||||
},
|
||||
labels: [
|
||||
"2020-06-21",
|
||||
"2020-06-22",
|
||||
"2020-06-23",
|
||||
"2020-06-24",
|
||||
"2020-06-25",
|
||||
"2020-06-26",
|
||||
"2020-06-27",
|
||||
],
|
||||
colors: ["var(--tblr-primary)", "var(--tblr-purple)"],
|
||||
legend: {
|
||||
show: true,
|
||||
position: "bottom",
|
||||
offsetY: 12,
|
||||
markers: {
|
||||
width: 10,
|
||||
height: 10,
|
||||
radius: 100,
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 8,
|
||||
vertical: 8,
|
||||
},
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -232,116 +44,10 @@ Bar charts are highly effective for comparing data across different categories.
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-demo-bar" class="chart-lg"></div>
|
||||
{% include "ui/chart.html" chart-id="demo-bar" height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-demo-bar"), {
|
||||
chart: {
|
||||
type: "bar",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
stacked: true,
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
barHeight: "50%",
|
||||
horizontal: true,
|
||||
},
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
},
|
||||
fill: {
|
||||
opacity: 1,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "Container for a Fanta",
|
||||
data: [44, 55, 41, 37, 22, 43, 21],
|
||||
},
|
||||
{
|
||||
name: "Strange sunglasses",
|
||||
data: [53, 32, 33, 52, 13, 43, 32],
|
||||
},
|
||||
{
|
||||
name: "Pen Pineapple Apple Pen",
|
||||
data: [12, 17, 11, 9, 15, 11, 20],
|
||||
},
|
||||
{
|
||||
name: "Binoculars",
|
||||
data: [9, 7, 5, 8, 6, 9, 4],
|
||||
},
|
||||
{
|
||||
name: "Magical notebook",
|
||||
data: [25, 12, 19, 32, 25, 24, 10],
|
||||
},
|
||||
],
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -20,
|
||||
right: 0,
|
||||
left: -4,
|
||||
bottom: -4,
|
||||
},
|
||||
strokeDashArray: 4,
|
||||
},
|
||||
xaxis: {
|
||||
labels: {
|
||||
padding: 0,
|
||||
formatter: function (val) {
|
||||
return val + "K";
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false,
|
||||
},
|
||||
axisBorder: {
|
||||
show: false,
|
||||
},
|
||||
categories: ["2008", "2009", "2010", "2011", "2012", "2013", "2014"],
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
padding: 4,
|
||||
},
|
||||
},
|
||||
colors: [
|
||||
"var(--tblr-purple)",
|
||||
"var(--tblr-green)",
|
||||
"var(--tblr-yellow)",
|
||||
"var(--tblr-red)",
|
||||
"var(--tblr-primary)",
|
||||
],
|
||||
legend: {
|
||||
show: true,
|
||||
position: "bottom",
|
||||
offsetY: 12,
|
||||
markers: {
|
||||
width: 10,
|
||||
height: 10,
|
||||
radius: 100,
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 8,
|
||||
vertical: 8,
|
||||
},
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -352,58 +58,10 @@ Pie charts are a simple and effective way to visualize proportions and ratios. T
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-demo-pie" class="chart-lg"></div>
|
||||
{% include "ui/chart.html" chart-id="demo-pie" height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-demo-pie"), {
|
||||
chart: {
|
||||
type: "donut",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
sparkline: {
|
||||
enabled: true,
|
||||
},
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
fill: {
|
||||
opacity: 1,
|
||||
},
|
||||
series: [44, 55, 12, 2],
|
||||
labels: ["Direct", "Affilliate", "E-mail", "Other"],
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
grid: {
|
||||
strokeDashArray: 4,
|
||||
},
|
||||
colors: [
|
||||
"var(--tblr-primary)",
|
||||
"color-mix(in oklab, var(--tblr-primary) 0.8, transparent)",
|
||||
"color-mix(in oklab, var(--tblr-primary) 0.6, transparent)",
|
||||
"var(--tblr-gray-300)",
|
||||
],
|
||||
legend: {
|
||||
show: true,
|
||||
position: "bottom",
|
||||
offsetY: 12,
|
||||
markers: {
|
||||
width: 10,
|
||||
height: 10,
|
||||
radius: 100,
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 8,
|
||||
vertical: 8,
|
||||
},
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -414,119 +72,10 @@ Heatmaps provide a graphical representation of data where individual values are
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-demo-heatmap" class="chart-lg"></div>
|
||||
{% include "ui/chart-heatmap.html" chart-id="demo-heatmap" height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-demo-heatmap"), {
|
||||
chart: {
|
||||
type: "heatmap",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
fill: {
|
||||
opacity: 1,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "New York",
|
||||
data: [
|
||||
{ x: "Monday", y: 22 },
|
||||
{ x: "Tuesday", y: 24 },
|
||||
{ x: "Wednesday", y: 19 },
|
||||
{ x: "Thursday", y: 23 },
|
||||
{ x: "Friday", y: 25 },
|
||||
{ x: "Saturday", y: 27 },
|
||||
{ x: "Sunday", y: 26 },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Los Angeles",
|
||||
data: [
|
||||
{ x: "Monday", y: 28 },
|
||||
{ x: "Tuesday", y: 30 },
|
||||
{ x: "Wednesday", y: 27 },
|
||||
{ x: "Thursday", y: 29 },
|
||||
{ x: "Friday", y: 31 },
|
||||
{ x: "Saturday", y: 32 },
|
||||
{ x: "Sunday", y: 33 },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Chicago",
|
||||
data: [
|
||||
{ x: "Monday", y: 18 },
|
||||
{ x: "Tuesday", y: 20 },
|
||||
{ x: "Wednesday", y: 17 },
|
||||
{ x: "Thursday", y: 19 },
|
||||
{ x: "Friday", y: 21 },
|
||||
{ x: "Saturday", y: 22 },
|
||||
{ x: "Sunday", y: 23 },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Houston",
|
||||
data: [
|
||||
{ x: "Monday", y: 25 },
|
||||
{ x: "Tuesday", y: 27 },
|
||||
{ x: "Wednesday", y: 24 },
|
||||
{ x: "Thursday", y: 26 },
|
||||
{ x: "Friday", y: 28 },
|
||||
{ x: "Saturday", y: 29 },
|
||||
{ x: "Sunday", y: 30 },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Phoenix",
|
||||
data: [
|
||||
{ x: "Monday", y: 33 },
|
||||
{ x: "Tuesday", y: 35 },
|
||||
{ x: "Wednesday", y: 32 },
|
||||
{ x: "Thursday", y: 34 },
|
||||
{ x: "Friday", y: 36 },
|
||||
{ x: "Saturday", y: 37 },
|
||||
{ x: "Sunday", y: 38 },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Philadelphia",
|
||||
data: [
|
||||
{ x: "Monday", y: 20 },
|
||||
{ x: "Tuesday", y: 22 },
|
||||
{ x: "Wednesday", y: 19 },
|
||||
{ x: "Thursday", y: 21 },
|
||||
{ x: "Friday", y: 23 },
|
||||
{ x: "Saturday", y: 24 },
|
||||
{ x: "Sunday", y: 25 },
|
||||
],
|
||||
},
|
||||
],
|
||||
colors: ["var(--tblr-primary)"],
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
},
|
||||
xaxis: {
|
||||
tooltip: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
title: {
|
||||
text: "Average Temperature by Day and City",
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
@@ -537,167 +86,9 @@ For more complex data visualizations, you can create advanced charts with multip
|
||||
{% capture html -%}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div id="chart-social-referrals" class="chart-lg"></div>
|
||||
{% include "ui/chart.html" chart-id="social-referrals" height=15 %}
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
window.ApexCharts &&
|
||||
new ApexCharts(document.getElementById("chart-social-referrals"), {
|
||||
chart: {
|
||||
type: "line",
|
||||
fontFamily: "inherit",
|
||||
height: 240,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
animations: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
fill: {
|
||||
opacity: 1,
|
||||
},
|
||||
stroke: {
|
||||
width: 2,
|
||||
lineCap: "round",
|
||||
curve: "smooth",
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "Facebook",
|
||||
data: [
|
||||
13281, 8521, 15038, 9983, 15417, 8888, 7052, 14270, 5214, 9587, 5950, 16852, 17836,
|
||||
12217, 17406, 12262, 9147, 14961, 18292, 15230, 13435, 10649, 5140, 13680, 4508,
|
||||
13271, 13413, 5543, 18727, 18238, 18175, 6246, 5864, 17847, 9170, 6445, 12945, 8142,
|
||||
8980, 10422, 15535, 11569, 10114, 17621, 16138, 13046, 6652, 9906, 14100, 16495, 6749,
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Twitter",
|
||||
data: [
|
||||
3680, 1862, 3070, 2252, 5348, 3091, 3000, 3984, 5176, 5325, 2420, 5474, 3098, 1893,
|
||||
3748, 2879, 4197, 5186, 4213, 4334, 2807, 1594, 4863, 2030, 3752, 4856, 5341, 3954,
|
||||
3461, 3097, 3404, 4949, 2283, 3227, 3630, 2360, 3477, 4675, 1901, 2252, 3347, 2954,
|
||||
5029, 2079, 2830, 3292, 4578, 3401, 4104, 3749, 4457, 3734,
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Dribbble",
|
||||
data: [
|
||||
722, 1866, 961, 1108, 1110, 561, 1753, 1815, 1985, 776, 859, 547, 1488, 766, 702, 621,
|
||||
1599, 1372, 1620, 963, 759, 764, 739, 789, 1696, 1454, 1842, 734, 551, 1689, 1924,
|
||||
1875, 908, 1675, 1541, 1953, 534, 502, 1524, 1867, 719, 1472, 1608, 1025, 889, 1150,
|
||||
654, 1695, 1662, 1285, 1787,
|
||||
],
|
||||
},
|
||||
],
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -20,
|
||||
right: 0,
|
||||
left: -4,
|
||||
bottom: -4,
|
||||
},
|
||||
strokeDashArray: 4,
|
||||
xaxis: {
|
||||
lines: {
|
||||
show: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
xaxis: {
|
||||
labels: {
|
||||
padding: 0,
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false,
|
||||
},
|
||||
type: "datetime",
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
padding: 4,
|
||||
},
|
||||
},
|
||||
labels: [
|
||||
"2020-06-21",
|
||||
"2020-06-22",
|
||||
"2020-06-23",
|
||||
"2020-06-24",
|
||||
"2020-06-25",
|
||||
"2020-06-26",
|
||||
"2020-06-27",
|
||||
"2020-06-28",
|
||||
"2020-06-29",
|
||||
"2020-06-30",
|
||||
"2020-07-01",
|
||||
"2020-07-02",
|
||||
"2020-07-03",
|
||||
"2020-07-04",
|
||||
"2020-07-05",
|
||||
"2020-07-06",
|
||||
"2020-07-07",
|
||||
"2020-07-08",
|
||||
"2020-07-09",
|
||||
"2020-07-10",
|
||||
"2020-07-11",
|
||||
"2020-07-12",
|
||||
"2020-07-13",
|
||||
"2020-07-14",
|
||||
"2020-07-15",
|
||||
"2020-07-16",
|
||||
"2020-07-17",
|
||||
"2020-07-18",
|
||||
"2020-07-19",
|
||||
"2020-07-20",
|
||||
"2020-07-21",
|
||||
"2020-07-22",
|
||||
"2020-07-23",
|
||||
"2020-07-24",
|
||||
"2020-07-25",
|
||||
"2020-07-26",
|
||||
"2020-07-27",
|
||||
"2020-07-28",
|
||||
"2020-07-29",
|
||||
"2020-07-30",
|
||||
"2020-07-31",
|
||||
"2020-08-01",
|
||||
"2020-08-02",
|
||||
"2020-08-03",
|
||||
"2020-08-04",
|
||||
"2020-08-05",
|
||||
"2020-08-06",
|
||||
"2020-08-07",
|
||||
"2020-08-08",
|
||||
"2020-08-09",
|
||||
"2020-08-10",
|
||||
],
|
||||
colors: [
|
||||
"var(--tblr-facebook)",
|
||||
"var(--tblr-twitter)",
|
||||
"var(--tblr-dribbble)",
|
||||
],
|
||||
legend: {
|
||||
show: true,
|
||||
position: "bottom",
|
||||
offsetY: 12,
|
||||
markers: {
|
||||
width: 10,
|
||||
height: 10,
|
||||
radius: 100,
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 8,
|
||||
vertical: 8,
|
||||
},
|
||||
},
|
||||
}).render();
|
||||
});
|
||||
</script>
|
||||
{{ script }}
|
||||
{%- endcapture %}
|
||||
{% include "docs/example.html" html=html %}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user