1
0
mirror of https://github.com/tabler/tabler.git synced 2025-12-23 18:34:25 +04:00

Compare commits

..

2 Commits

196 changed files with 4107 additions and 6264 deletions

View File

@@ -1,6 +0,0 @@
---
"@tabler/core": minor
"@tabler/preview": minor
---
Added new "Pay" page with dedicated layout, navigation link, and payment form (card + PayPal).

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": minor
---
Added `.btn-ghost` button variant with transparent background and hover effects.

View File

@@ -1,5 +0,0 @@
---
"@tabler/preview": minor
---
Add a color palette in the signing component

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Fix icon alignment for `.btn-sm` and `.btn-xl` sizes

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Fix mixed declarations in SCSS

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Updated `stroke-width` for `.icon-sm` from `1` to `1.5` for better visibility.

View File

@@ -1,6 +0,0 @@
---
"@tabler/core": patch
"@tabler/preview": patch
---
Introduced `bg-blur` utility for backdrop blur effects and increased container-tight width for layout flexibility.

View File

@@ -1,5 +0,0 @@
---
"@tabler/preview": patch
---
Update icons to v3.34.1 (75 new icons)

View File

@@ -1,5 +0,0 @@
---
"@tabler/preview": patch
---
Update activity messages

View File

@@ -1,5 +0,0 @@
---
"@tabler/preview": minor
---
Added new onboarding page with progress indicator and navigation layout.

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Fix double bottom border in tables.

View File

@@ -1,6 +0,0 @@
---
"@tabler/core": minor
"@tabler/preview": minor
---
Added Progress Background component with text labels and value display.

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": minor
---
Added large and extra-large sizes for progress component (`.progress-lg`, `.progress-xl`).

View File

@@ -1,6 +0,0 @@
---
"@tabler/core": minor
"@tabler/preview": minor
---
Added Progress Steps component for step-by-step navigation indicators.

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Added smooth transitions for progress bar width and background color changes.

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Updated skip-link to use `visually-hidden` class for better accessibility.

View File

@@ -1,5 +0,0 @@
---
"@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.).

View File

@@ -1,5 +0,0 @@
---
"@tabler/core": patch
---
Update Bootstrap to v5.3.8

View File

@@ -1,6 +0,0 @@
---
"@tabler/core": patch
"@tabler/preview": patch
---
Updated trending component to use `arrow-up`/`arrow-down` icons instead of `trending-up`/`trending-down`.

View File

@@ -1,5 +0,0 @@
---
"@tabler/docs": patch
---
Fix Docs search in dark mode

View File

@@ -1,5 +0,0 @@
---
"@tabler/preview": patch
---
Fix responsive layputs in 'Form Elements' page

View File

@@ -1,100 +0,0 @@
---
description: Cursor Rules for Tabler Changesets
globs:
alwaysApply: true
---
### File Structure
- Each change must be in a separate changeset file in `.changeset/` directory
- Use descriptive kebab-case filenames (e.g., `progress-sizes.md`, `button-ghost.md`)
- Follow the standard changeset format with frontmatter and description
### Change Description Format
- **One sentence per changeset** - keep descriptions concise and focused
- Use **backticks for code elements**: classes (`.btn-ghost`), properties (`stroke-width`), values (`1.5`), icons (`arrow-up`)
- Start with action verbs: "Added", "Updated", "Fixed", "Removed"
- Be specific about what was changed
### Version Bump Guidelines
- **Major**: Breaking changes, complete rewrites
- **Minor**: New features, new components, new pages, significant enhancements
- **Patch**: Bug fixes, small improvements, style updates, accessibility fixes
### Package Selection
- `"@tabler/core"`: Changes to SCSS, core functionality, CSS classes
- `"@tabler/preview"`: New pages, demo updates, preview-specific changes
- `"@tabler/docs"`: Documentation updates
- Use multiple packages when change affects multiple areas
### Examples
#### New Feature (Minor)
```md
---
"@tabler/core": minor
"@tabler/preview": minor
---
Added Progress Steps component for step-by-step navigation indicators.
```
#### Bug Fix (Patch)
```md
---
"@tabler/core": patch
---
Updated `stroke-width` for `.icon-sm` from `1` to `1.5` for better visibility.
```
#### New Page (Minor)
```md
---
"@tabler/preview": minor
---
Added new onboarding page with progress indicator and navigation layout.
```
#### Style Enhancement (Patch)
```md
---
"@tabler/core": patch
---
Added smooth transitions for progress bar width and background color changes.
```
### Code Formatting Rules
- Class names: `.btn-ghost`, `.progress-lg`, `.icon-sm`
- CSS properties: `stroke-width`, `background-color`, `width`
- Values: `1.5`, `transparent`, `100%`
- Icon names: `arrow-up`, `arrow-down`, `trending-up`
- HTML attributes: `aria-label`, `role`, `data-*`
- JavaScript functions: `addEventListener()`, `querySelector()`
### Common Patterns
- **Component additions**: "Added [ComponentName] component for [purpose]"
- **Size variants**: "Added [size] size variant for [component] (`.class-size`)"
- **Style fixes**: "Fixed [issue] in [component/element]"
- **Icon updates**: "Updated [component] to use `new-icon` instead of `old-icon`"
- **Accessibility**: "Improved accessibility by [specific change]"
### Commit Message Format
Use English for commit messages following conventional commit format when possible:
- `feat: add progress steps component`
- `fix: update icon stroke width for better visibility`
- `style: add smooth transitions to progress bars`

View File

@@ -1,171 +0,0 @@
---
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

View File

@@ -1,56 +0,0 @@
---
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

View File

@@ -26,7 +26,7 @@ jobs:
if: false if: false
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v5 uses: actions/checkout@v4
- name: Cache turbo build setup - name: Cache turbo build setup
uses: actions/cache@v4 uses: actions/cache@v4
@@ -36,14 +36,13 @@ jobs:
restore-keys: | restore-keys: |
${{ runner.os }}-turbo- ${{ runner.os }}-turbo-
- name: Install PNPM
uses: pnpm/action-setup@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v5 uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
cache: 'pnpm'
- name: Install PNPM
uses: pnpm/action-setup@v4
- name: Get installed Playwright version - name: Get installed Playwright version
id: playwright-version id: playwright-version

View File

@@ -17,7 +17,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v5 uses: actions/checkout@v4
- name: Cache turbo build setup - name: Cache turbo build setup
uses: actions/cache@v4 uses: actions/cache@v4
@@ -27,14 +27,13 @@ jobs:
restore-keys: | restore-keys: |
${{ runner.os }}-turbo- ${{ runner.os }}-turbo-
- name: Install PNPM
uses: pnpm/action-setup@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v5 uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
cache: 'pnpm'
- name: Install PNPM
uses: pnpm/action-setup@v4
- name: Set up Bundler - name: Set up Bundler
uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repo - name: Checkout Repo
uses: actions/checkout@v5 uses: actions/checkout@v4
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -11,7 +11,7 @@ jobs:
pull-requests: write pull-requests: write
issues: write issues: write
steps: steps:
- uses: actions/stale@v10 - uses: actions/stale@v9
with: with:
days-before-issue-stale: 360 days-before-issue-stale: 360
days-before-issue-close: 14 days-before-issue-close: 14

View File

@@ -12,10 +12,11 @@ jobs:
name: Verify lock file integrity name: Verify lock file integrity
steps: steps:
- name: Clone Tabler - name: Clone Tabler
uses: actions/checkout@v5 uses: actions/checkout@v4
- name: Prevent lock file change - name: Prevent lock file change
uses: xalvarez/prevent-file-change-action@v2 uses: xalvarez/prevent-file-change-action@v2
with: with:
githubToken: ${{ secrets.GITHUB_TOKEN }} githubToken: ${{ secrets.GITHUB_TOKEN }}
pattern: Gemfile.lock|pnpm-lock.json|pnpm-lock.yaml pattern: Gemfile.lock|pnpm-lock.json
trustedAuthors: codecalm, BG-Software-BG, dependabot trustedAuthors: codecalm, dependabot

View File

@@ -21,17 +21,16 @@ jobs:
pull-requests: write # to create pull request pull-requests: write # to create pull request
steps: steps:
- name: Checkout Repo - name: Checkout Repo
uses: actions/checkout@v5 uses: actions/checkout@v4
- name: Setup Node.js 18
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install PNPM - name: Install PNPM
uses: pnpm/action-setup@v4 uses: pnpm/action-setup@v4
- name: Setup Node.js 18
uses: actions/setup-node@v5
with:
node-version: "${{ env.NODE }}"
cache: 'pnpm'
- name: Install Dependencies - name: Install Dependencies
run: pnpm install run: pnpm install

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v5 uses: actions/checkout@v4
- name: Cache turbo build setup - name: Cache turbo build setup
uses: actions/cache@v4 uses: actions/cache@v4
@@ -24,14 +24,13 @@ jobs:
restore-keys: | restore-keys: |
${{ runner.os }}-turbo- ${{ runner.os }}-turbo-
- name: Install PNPM
uses: pnpm/action-setup@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v5 uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
cache: 'pnpm'
- name: Install PNPM
uses: pnpm/action-setup@v4
- run: node --version - run: node --version

View File

@@ -1,24 +1,5 @@
# @tabler/core # @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 ## 1.3.2
### Patch Changes ### Patch Changes

View File

@@ -1,25 +0,0 @@
// 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);
}
});
}

View File

@@ -7,7 +7,6 @@ import "./src/popover"
import "./src/switch-icon" import "./src/switch-icon"
import "./src/tab" import "./src/tab"
import "./src/toast" import "./src/toast"
import "./src/sortable"
export * as bootstrap from "bootstrap" export * as bootstrap from "bootstrap"
export * as tabler from "./src/tabler" export * as tabler from "./src/tabler"

View File

@@ -38,12 +38,6 @@
"dist/list.min.js" "dist/list.min.js"
] ]
}, },
"sortablejs": {
"npm": "sortablejs",
"js": [
"Sortable.min.js"
]
},
"masonry": { "masonry": {
"js": [ "js": [
"https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js" "https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js"

View File

@@ -1,6 +1,6 @@
{ {
"name": "@tabler/core", "name": "@tabler/core",
"version": "1.4.0", "version": "1.3.2",
"description": "Premium and Open Source dashboard template with responsive and high quality UI.", "description": "Premium and Open Source dashboard template with responsive and high quality UI.",
"homepage": "https://tabler.io", "homepage": "https://tabler.io",
"scripts": { "scripts": {
@@ -8,7 +8,7 @@
"build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy && pnpm run generate-sri", "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy && pnpm run generate-sri",
"clean": "shx rm -rf dist demo", "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": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-rtl && pnpm run css-minify && pnpm run css-banner",
"css-compile": "sass --no-source-map --load-path=node_modules --style expanded scss/:dist/css/", "css-compile": "sass scss/:dist/css/ --no-source-map --load-path=node_modules",
"css-banner": "node .build/add-banner.mjs", "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-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\"", "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\"",
@@ -146,29 +146,28 @@
}, },
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"bootstrap": "5.3.8" "bootstrap": "5.3.6"
}, },
"devDependencies": { "devDependencies": {
"@hotwired/turbo": "^8.0.13", "@hotwired/turbo": "^8.0.13",
"@melloware/coloris": "^0.25.0", "@melloware/coloris": "^0.24.2",
"apexcharts": "3.54.1", "apexcharts": "3.54.1",
"autosize": "^6.0.1", "autosize": "^6.0.1",
"choices.js": "^11.1.0", "choices.js": "^11.1.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"countup.js": "^2.9.0", "countup.js": "^2.8.2",
"dropzone": "^6.0.0-beta.2", "dropzone": "^6.0.0-beta.2",
"flatpickr": "^4.6.13", "flatpickr": "^4.6.13",
"fslightbox": "^3.7.4", "fslightbox": "^3.6.0",
"fullcalendar": "^6.1.19", "fullcalendar": "^6.1.17",
"hugerte": "^1.0.9", "hugerte": "^1.0.9",
"imask": "^7.6.1", "imask": "^7.6.1",
"jsvectormap": "^1.7.0", "jsvectormap": "^1.6.0",
"list.js": "^2.3.1", "list.js": "^2.3.1",
"litepicker": "^2.0.12", "litepicker": "^2.0.12",
"nouislider": "^15.8.1", "nouislider": "^15.8.1",
"plyr": "^3.8.3", "plyr": "^3.7.8",
"signature_pad": "^5.1.1", "signature_pad": "^5.0.7",
"sortablejs": "^1.15.6",
"star-rating.js": "^4.3.1", "star-rating.js": "^4.3.1",
"tom-select": "^2.4.3", "tom-select": "^2.4.3",
"typed.js": "^2.1.0" "typed.js": "^2.1.0"

View File

@@ -1,7 +1,14 @@
// Layout & components // Layout & components
@layer props {
@import "bootstrap/scss/root"; @import "bootstrap/scss/root";
}
@layer reset {
@import "bootstrap/scss/reboot"; @import "bootstrap/scss/reboot";
@import "bootstrap/scss/type"; @import "bootstrap/scss/type";
}
@layer components {
@import "bootstrap/scss/images"; @import "bootstrap/scss/images";
@import "bootstrap/scss/containers"; @import "bootstrap/scss/containers";
@import "bootstrap/scss/grid"; @import "bootstrap/scss/grid";
@@ -14,6 +21,7 @@
@import "bootstrap/scss/nav"; @import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar"; @import "bootstrap/scss/navbar";
@import "bootstrap/scss/card"; @import "bootstrap/scss/card";
@import "bootstrap/scss/breadcrumb";
@import "bootstrap/scss/pagination"; @import "bootstrap/scss/pagination";
@import "bootstrap/scss/progress"; @import "bootstrap/scss/progress";
@import "bootstrap/scss/list-group"; @import "bootstrap/scss/list-group";
@@ -25,6 +33,9 @@
@import "bootstrap/scss/spinners"; @import "bootstrap/scss/spinners";
@import "bootstrap/scss/offcanvas"; @import "bootstrap/scss/offcanvas";
@import "bootstrap/scss/placeholders"; @import "bootstrap/scss/placeholders";
}
// Utilities // Utilities
@layer utilities {
@import "bootstrap/scss/utilities/api"; @import "bootstrap/scss/utilities/api";
}

View File

@@ -1,4 +1,5 @@
// Config // Config
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables"; @import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark"; @import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps"; @import "bootstrap/scss/maps";

View File

@@ -1,5 +1,3 @@
@use "sass:color";
@mixin caret($direction: down) { @mixin caret($direction: down) {
$selector: "after"; $selector: "after";
@@ -76,5 +74,5 @@
// TODO: remove when https://github.com/twbs/bootstrap/pull/37425/ will be released // TODO: remove when https://github.com/twbs/bootstrap/pull/37425/ will be released
// //
@function opaque($background, $foreground) { @function opaque($background, $foreground) {
@return color.mix(rgba($foreground, 1), $background, color.alpha($foreground) * 100%); @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);
} }

View File

@@ -1,4 +1,4 @@
@import "bootstrap/scss/functions";
@import "mixins"; @import "mixins";
@import "variables"; @import "variables";

View File

@@ -1,10 +1,15 @@
@layer props, reset, layout, components, themes, vendors, utils;
@import "config"; @import "config";
@layer props {
@import "props";
}
@import "bootstrap-components"; @import "bootstrap-components";
@import "props"; @layer layout {
@import "fonts/webfonts"; @import "fonts/webfonts";
@import "layout/root"; @import "layout/root";
@import "layout/animations"; @import "layout/animations";
@import "layout/core"; @import "layout/core";
@@ -12,7 +17,9 @@
@import "layout/page"; @import "layout/page";
@import "layout/footer"; @import "layout/footer";
@import "layout/dark"; @import "layout/dark";
}
@layer components {
@import "ui/accordion"; @import "ui/accordion";
@import "ui/alerts"; @import "ui/alerts";
@import "ui/avatars"; @import "ui/avatars";
@@ -66,9 +73,10 @@
@import "ui/offcanvas"; @import "ui/offcanvas";
@import "ui/chat"; @import "ui/chat";
@import "ui/signature"; @import "ui/signature";
@import "helpers/index"; @import "helpers/index";
}
@layer utilities {
@import "utils/background"; @import "utils/background";
@import "utils/colors"; @import "utils/colors";
@import "utils/scroll"; @import "utils/scroll";
@@ -76,9 +84,4 @@
@import "utils/opacity"; @import "utils/opacity";
@import "utils/shadow"; @import "utils/shadow";
@import "utils/text"; @import "utils/text";
@import "utils/hover"; }
@import "debug";
@import "debug";

View File

@@ -1,49 +0,0 @@
$debug: false;
@if $debug {
$colors: (
"blue": $blue,
"azure": $azure,
"indigo": $indigo,
"purple": $purple,
"pink": $pink,
"red": $red,
"orange": $orange,
"yellow": $yellow,
"lime": $lime,
"green": $green,
"teal": $teal,
"cyan": $cyan,
);
@each $name, $color in $colors {
@debug ("#{$name}: '#{$color}'");
@debug ("#{$name}-100: '#{tint-color($color, 8)}'");
@debug ("#{$name}-200: '#{tint-color($color, 6)}'");
@debug ("#{$name}-300: '#{tint-color($color, 4)}'");
@debug ("#{$name}-400: '#{tint-color($color, 2)}'");
@debug ("#{$name}-500: '#{$color}'");
@debug ("#{$name}-600: '#{shade-color($color, 2)}'");
@debug ("#{$name}-700: '#{shade-color($color, 4)}'");
@debug ("#{$name}-800: '#{shade-color($color, 6)}'");
@debug ("#{$name}-900: '#{shade-color($color, 8)}'");
}
@debug ("gray: '#{$gray-500}'");
@debug ("gray-100: '#{$gray-100}'");
@debug ("gray-200: '#{$gray-200}'");
@debug ("gray-300: '#{$gray-300}'");
@debug ("gray-400: '#{$gray-400}'");
@debug ("gray-500: '#{$gray-500}'");
@debug ("gray-600: '#{$gray-600}'");
@debug ("gray-700: '#{$gray-700}'");
@debug ("gray-800: '#{$gray-800}'");
@debug ("gray-900: '#{$gray-900}'");
@debug ("border-color: '#{$border-color}'");
@debug ("text-secondary: '#{$text-secondary}'");
@each $name, $color in $social-colors {
@debug ("#{$name}: '#{$color}'");
}
}

View File

@@ -1,4 +1,3 @@
@use "sass:map";
@import "config"; @import "config";
:root, :root,
@@ -31,7 +30,7 @@
--#{$prefix}brand: #{$primary}; --#{$prefix}brand: #{$primary};
/** Theme colors */ /** 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}: #{$color};
--#{$prefix}#{$name}-rgb: #{to-rgb($color)}; --#{$prefix}#{$name}-rgb: #{to-rgb($color)};
--#{$prefix}#{$name}-fg: #{if(contrast-ratio($color) > $min-contrast-ratio, var(--#{$prefix}light), var(--#{$prefix}dark))}; --#{$prefix}#{$name}-fg: #{if(contrast-ratio($color) > $min-contrast-ratio, var(--#{$prefix}light), var(--#{$prefix}dark))};

View File

@@ -1,8 +1,6 @@
@use "sass:map";
$negative-spacers-extra: if( $negative-spacers-extra: if(
$enable-negative-margins, $enable-negative-margins,
negativify-map(map.merge($spacers, $spacers-extra)), negativify-map(map-merge($spacers, $spacers-extra)),
null null
); );

View File

@@ -110,13 +110,6 @@ $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, 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": ( "bg-gradient-direction": (
property: --#{$prefix}gradient-direction, property: --#{$prefix}gradient-direction,
class: bg-gradient, class: bg-gradient,

View File

@@ -1,8 +1,3 @@
@use "sass:string";
@use "sass:math";
@use "sass:map";
@use "sass:color";
$prefix: "tblr-" !default; $prefix: "tblr-" !default;
// BASE CONFIG // BASE CONFIG
@@ -28,10 +23,10 @@ $font-google-monospaced: null !default;
$font-local: null !default; $font-local: null !default;
$font-icons: () !default; $font-icons: () !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-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: string.unquote("#{if($font-google-monospaced, "#{$font-google-monospaced}, ", '')}") Monaco, Consolas, Liberation Mono, Courier New, monospace !default; $font-family-monospace: 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-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 //Icons
$icon-stroke-width: 1.5 !default; $icon-stroke-width: 1.5 !default;
@@ -57,9 +52,9 @@ $line-height-700: 3rem !default;
$font-size-base: 0.875rem !default; $font-size-base: 0.875rem !default;
$spacing-wide: 0.04em !default; $spacing-wide: .04em !default;
$spacing-normal: 0 !default; $spacing-normal: 0 !default;
$spacing-tight: -0.04em !default; $spacing-tight: -.04em !default;
$body-letter-spacing: 0 !default; $body-letter-spacing: 0 !default;
@@ -73,12 +68,12 @@ $headings-font-weight: var(--#{$prefix}font-weight-bold) !default;
$headings-margin-bottom: var(--#{$prefix}spacer) !default; $headings-margin-bottom: var(--#{$prefix}spacer) !default;
$font-weights: ( $font-weights: (
"light": $font-weight-light, 'light': $font-weight-light,
"normal": $font-weight-normal, 'normal': $font-weight-normal,
"medium": $font-weight-medium, 'medium': $font-weight-medium,
"bold": $font-weight-bold, 'bold': $font-weight-bold,
"black": $font-weight-black, 'black': $font-weight-black,
"headings": $headings-font-weight, 'headings': $headings-font-weight,
) !default; ) !default;
$line-height-base: divide(1.25rem, $font-size-base) !default; $line-height-base: divide(1.25rem, $font-size-base) !default;
@@ -104,8 +99,8 @@ $h5-line-height: 1rem !default;
$h6-font-size: 0.625rem !default; $h6-font-size: 0.625rem !default;
$h6-line-height: 1rem !default; $h6-line-height: 1rem !default;
$font-size-reative-xs: 0.71428571em !default; $font-size-reative-xs: .71428571em !default;
$font-size-reative-sm: 0.85714285em !default; $font-size-reative-sm: .85714285em !default;
$font-size-reative-md: 1em !default; $font-size-reative-md: 1em !default;
$font-sizes: ( $font-sizes: (
@@ -205,7 +200,7 @@ $border-color-translucent: rgba(4, 32, 69, 0.1);
$border-dark-color: $gray-400 !default; $border-dark-color: $gray-400 !default;
$border-dark-color-translucent: rgba(4, 32, 69, 0.27); $border-dark-color-translucent: rgba(4, 32, 69, 0.27);
$border-active-color: color.mix($text-secondary, #ffffff, math.percentage($border-active-opacity)) !default; $border-active-color: mix($text-secondary, #ffffff, percentage($border-active-opacity)) !default;
$border-active-color-translucent: rgba($text-secondary, $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; $active-bg: rgba(var(--#{$prefix}primary-rgb), 0.04) !default;
@@ -215,7 +210,7 @@ $active-border-color: var(--#{$prefix}primary) !default;
$hover-bg: rgba(var(--#{$prefix}secondary-rgb), 0.08) !default; $hover-bg: rgba(var(--#{$prefix}secondary-rgb), 0.08) !default;
$disabled-bg: var(--#{$prefix}bg-surface-secondary) !default; $disabled-bg: var(--#{$prefix}bg-surface-secondary) !default;
$disabled-color: color-transparent(var(--#{$prefix}body-color), 0.4) !default; $disabled-color: color-transparent(var(--#{$prefix}body-color), .4) !default;
$primary: $blue !default; $primary: $blue !default;
$secondary: $text-secondary !default; $secondary: $text-secondary !default;
@@ -287,12 +282,12 @@ $gray-colors: (
gray-950: $gray-950, gray-950: $gray-950,
) !default; ) !default;
$theme-colors: map.merge($theme-colors, map.merge($extra-colors, ())); $theme-colors: map-merge($theme-colors, map-merge($extra-colors, ()));
// BACKDROPS // BACKDROPS
$backdrop-opacity: .32 !default; $backdrop-opacity: 24% !default;
$backdrop-blur: 4px !default; $backdrop-blur: 4px !default;
$backdrop-bg: light-dark(var(--#{$prefix}gray-800), var(--#{$prefix}black)) !default; $backdrop-bg: var(--#{$prefix}gray-800) !default;
$backdrops: ( $backdrops: (
dark: color-mix(in srgb, var(--#{$prefix}color-dark), transparent var(--#{$prefix}backdrop-opacity)), 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)), light: color-mix(in srgb, var(--#{$prefix}color-light), transparent var(--#{$prefix}backdrop-opacity)),
@@ -346,7 +341,7 @@ $kbd-border-radius: var(--#{$prefix}border-radius) !default;
// Avatars // Avatars
$avatar-size: 2.5rem !default; $avatar-size: 2.5rem !default;
$avatar-status-size: 0.75rem !default; $avatar-status-size: .75rem !default;
$avatar-font-size: 1rem !default; $avatar-font-size: 1rem !default;
$avatar-icon-size: 1.5rem !default; $avatar-icon-size: 1.5rem !default;
$avatar-brand-size: 1.25rem !default; $avatar-brand-size: 1.25rem !default;
@@ -354,52 +349,52 @@ $avatar-bg: var(--#{$prefix}bg-surface-secondary) !default;
$avatar-sizes: ( $avatar-sizes: (
"xxs": ( "xxs": (
size: 1rem, size: 1rem,
font-size: 0.5rem, font-size: .5rem,
icon-size: 0.5rem, icon-size: .5rem,
status-size: 0.25rem, status-size: .25rem,
brand-size: 0.5rem, brand-size: .5rem
), ),
"xs": ( "xs": (
size: 1.25rem, size: 1.25rem,
font-size: $h6-font-size, font-size: $h6-font-size,
icon-size: 0.75rem, icon-size: .75rem,
status-size: 0.375rem, status-size: .375rem,
brand-size: 0.75rem, brand-size: .75rem
), ),
"sm": ( "sm": (
size: 2rem, size: 2rem,
font-size: $h5-font-size, font-size: $h5-font-size,
icon-size: 1.5rem, icon-size: 1.5rem,
status-size: 0.5rem, status-size: .5rem,
brand-size: 1rem, brand-size: 1rem
), ),
"md": ( "md": (
size: 2.5rem, size: 2.5rem,
font-size: $h4-font-size, font-size: $h4-font-size,
icon-size: 1.5rem, icon-size: 1.5rem,
status-size: 0.75rem, status-size: .75rem,
brand-size: 1.25rem, brand-size: 1.25rem
), ),
"lg": ( "lg": (
size: 3rem, size: 3rem,
font-size: $h2-font-size, font-size: $h2-font-size,
icon-size: 2rem, icon-size: 2rem,
status-size: 0.75rem, status-size: .75rem,
brand-size: 1.25rem, brand-size: 1.25rem
), ),
"xl": ( "xl": (
size: 5rem, size: 5rem,
font-size: 2rem, font-size: 2rem,
icon-size: 3rem, icon-size: 3rem,
status-size: 1rem, status-size: 1rem,
brand-size: 1.25rem, brand-size: 1.25rem
), ),
"2xl": ( "2xl": (
size: 7rem, size: 7rem,
font-size: 3rem, font-size: 3rem,
icon-size: 5rem, icon-size: 5rem,
status-size: 1rem, status-size: 1rem,
brand-size: 2rem, brand-size: 2rem
), ),
) !default; ) !default;
$avatar-border-radius: var(--#{$prefix}border-radius) !default; $avatar-border-radius: var(--#{$prefix}border-radius) !default;
@@ -432,7 +427,7 @@ $grid-gutter-width: 1rem !default;
$container-variations: ( $container-variations: (
slim: 16rem, slim: 16rem,
tight: 32rem, tight: 30rem,
narrow: 61.875rem, narrow: 61.875rem,
) !default; ) !default;
@@ -482,7 +477,7 @@ $size-spacers: (
full: 100%, full: 100%,
) !default; ) !default;
$size-values: map.merge( $size-values: map-merge(
$spacers, $spacers,
( (
25: 25%, 25: 25%,
@@ -591,71 +586,41 @@ $badge-color: var(--#{$prefix}secondary) !default;
$badge-bg-color: var(--#{$prefix}bg-surface-secondary) !default; $badge-bg-color: var(--#{$prefix}bg-surface-secondary) !default;
// Buttons // Buttons
$input-btn-border-width: var(--#{$prefix}border-width) !default; $input-btn-line-height: $line-height-base !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-line-height-sm: divide(1rem, $input-btn-font-size-sm) !default;
$input-btn-icon-size-sm: 1rem !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-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-icon-size: $icon-size !default;
$input-btn-padding-y-lg: 0.6875rem !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-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-x-lg: 1.5rem !default;
$input-btn-line-height-lg: 1.5rem !default; $input-btn-padding-y-lg: 0.75rem - 0.0625rem !default;
$input-btn-font-size-lg: $h3-font-size !default; $input-btn-line-height-lg: 2rem !default;
$input-btn-icon-size-lg: 1.5rem !default; $input-btn-icon-size-lg: 2rem !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 // Inputs
$input-height: null !default; $input-height: null !default;
$input-height-sm: null !default; $input-height-sm: null !default;
$input-height-lg: null !default; $input-height-lg: null !default;
$input-border-radius: var(--#{$prefix}border-radius) !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-color: var(--#{$prefix}body-color) !default;
$input-focus-color: var(--#{$prefix}body-color) !default; $input-focus-color: var(--#{$prefix}body-color) !default;
$input-box-shadow: var(--#{$prefix}shadow-input) !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 // Buttons
$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; $btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; $btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
$btn-disabled-opacity: 0.4 !default; $btn-disabled-opacity: .4 !default;
$btn-padding-x: 1rem !default;
$btn-font-weight: var(--#{$prefix}font-weight-medium) !default; $btn-font-weight: var(--#{$prefix}font-weight-medium) !default;
$btn-border-color: var(--#{$prefix}border-color) !default; $btn-border-color: var(--#{$prefix}border-color) !default;
$btn-border-radius: var(--#{$prefix}border-radius) !default; $btn-border-radius: var(--#{$prefix}border-radius) !default;
@@ -675,7 +640,7 @@ $card-border-color: var(--#{$prefix}border-color-translucent) !default;
$card-border-radius: var(--#{$prefix}border-radius-lg) !default; $card-border-radius: var(--#{$prefix}border-radius-lg) !default;
$card-spacer-x: 1.25rem !default; $card-spacer-x: 1.25rem !default;
$card-spacer-y: 1.25rem !default; $card-spacer-y: 1rem !default;
$card-cap-bg: var(--#{$prefix}bg-surface-tertiary) !default; $card-cap-bg: var(--#{$prefix}bg-surface-tertiary) !default;
$card-cap-color: inherit !default; $card-cap-color: inherit !default;
@@ -754,9 +719,9 @@ $list-group-item-padding-y: $card-cap-padding-y !default;
$list-group-item-padding-x: $card-cap-padding-x !default; $list-group-item-padding-x: $card-cap-padding-x !default;
// Modals // Modals
$modal-backdrop-opacity: $backdrop-opacity !default; $modal-backdrop-opacity: 0.24 !default;
$modal-backdrop-bg: $backdrop-bg !default; $modal-backdrop-bg: $backdrop-bg !default;
$modal-backdrop-blur: $backdrop-blur !default; $modal-backdrop-blur: 4px !default;
$modal-fade-transform: translate(0, -1rem) !default; $modal-fade-transform: translate(0, -1rem) !default;
@@ -846,7 +811,7 @@ $navbar-toggler-focus-width: 0 !default;
$navbar-overlap-height: 9rem !default; $navbar-overlap-height: 9rem !default;
$navbar-nav-link-padding-x: $nav-link-padding-x !default; $navbar-nav-link-padding-x: $nav-link-padding-x !default;
$navbar-nav-link-hover-bg: rgba(0, 0, 0, 0.04) !default; $navbar-nav-link-hover-bg: rgba(0, 0, 0, .04) !default;
$navbar-active-border-color: var(--#{$prefix}primary) !default; $navbar-active-border-color: var(--#{$prefix}primary) !default;
@@ -863,8 +828,8 @@ $popover-bg: var(--#{$prefix}bg-surface) !default;
$popover-header-bg: transparent !default; $popover-header-bg: transparent !default;
$popover-border-color: var(--#{$prefix}border-color) !default; $popover-border-color: var(--#{$prefix}border-color) !default;
$popover-body-color: inherit !default; $popover-body-color: inherit !default;
$popover-body-padding-x: 0.5rem !default; $popover-body-padding-x: .5rem !default;
$popover-body-padding-y: 0.5rem !default; $popover-body-padding-y: .5rem !default;
$popover-box-shadow: var(--#{$prefix}shadow-lg) !default; $popover-box-shadow: var(--#{$prefix}shadow-lg) !default;
// Footer // Footer

View File

@@ -1,5 +1,3 @@
@use "sass:map";
// //
// Clearfix // Clearfix
// //
@@ -88,7 +86,7 @@
} }
// Responsive sticky top and bottom // Responsive sticky top and bottom
@each $breakpoint in map.keys($grid-breakpoints) { @each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) { @include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints); $infix: breakpoint-infix($breakpoint, $grid-breakpoints);

View File

@@ -1,50 +1,39 @@
@keyframes pulse { @keyframes pulse {
0% { from {
transform: scale(1); opacity: 1;
transform: scale3d(.8, .8, .8)
} }
14% { 50% {
transform: scale(1.25); transform: scale3d(1, 1, 1);
opacity: 1
} }
28% { to {
transform: scale(1); opacity: 1;
} transform: scale3d(.8, .8, .8)
42% {
transform: scale(1.25);
}
70% {
transform: scale(1);
} }
} }
@keyframes tada { @keyframes tada {
0% { 0% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1)
} }
10%, 10%, 5% {
5% { transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -5deg)
transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -5deg);
} }
15%, 15%, 25%, 35%, 45% {
25%, transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 5deg)
35%,
45% {
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 5deg);
} }
20%, 20%, 30%, 40% {
30%, transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -5deg)
40% {
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -5deg);
} }
50% { 50% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1)
} }
} }
@@ -72,27 +61,3 @@
} }
} }
@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);
}
}

View File

@@ -1,5 +1,3 @@
@use "sass:map";
// stylelint-disable property-no-vendor-prefix // stylelint-disable property-no-vendor-prefix
body { body {
letter-spacing: $body-letter-spacing; letter-spacing: $body-letter-spacing;
@@ -37,7 +35,7 @@ body {
// //
.layout-boxed { .layout-boxed {
--#{$prefix}theme-boxed-border-radius: 0; --#{$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) { @include media-breakpoint-up(md) {
background: $dark linear-gradient(to right, rgba(#fff, .1), transparent) fixed; background: $dark linear-gradient(to right, rgba(#fff, .1), transparent) fixed;

View File

@@ -1,5 +1,3 @@
@use "sass:map";
@mixin navbar-vertical-nav { @mixin navbar-vertical-nav {
.navbar-collapse { .navbar-collapse {
flex-direction: column; flex-direction: column;
@@ -126,7 +124,7 @@ Navbar
} }
.navbar-expand { .navbar-expand {
@each $breakpoint in map.keys($grid-breakpoints) { @each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints); $next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints); $infix: breakpoint-infix($next, $grid-breakpoints);
@@ -162,8 +160,7 @@ Navbar
&.navbar-vertical { &.navbar-vertical {
box-shadow: inset calc(-1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color); 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); box-shadow: inset calc(1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color);
} }
} }
@@ -175,8 +172,7 @@ Navbar
} }
} }
&.navbar-vertical.navbar-right, &.navbar-vertical.navbar-right {
&.navbar-vertical.navbar-end {
~ .navbar, ~ .navbar,
~ .page-wrapper { ~ .page-wrapper {
margin-left: 0; margin-left: 0;
@@ -223,13 +219,13 @@ Navbar toggler
width: 1.25em; width: 1.25em;
background: currentColor; background: currentColor;
border-radius: 10px; border-radius: 10px;
position: relative;
@include transition( @include transition(
top $navbar-toggler-animation-time $navbar-toggler-animation-time, top $navbar-toggler-animation-time $navbar-toggler-animation-time,
bottom $navbar-toggler-animation-time $navbar-toggler-animation-time, bottom $navbar-toggler-animation-time $navbar-toggler-animation-time,
transform $navbar-toggler-animation-time, transform $navbar-toggler-animation-time,
opacity 0s $navbar-toggler-animation-time opacity 0s $navbar-toggler-animation-time
); );
position: relative;
&:before, &:before,
&:after { &:after {
@@ -309,7 +305,7 @@ Navbar vertical
@if $enable-navbar-vertical { @if $enable-navbar-vertical {
.navbar-vertical { .navbar-vertical {
&.navbar-expand { &.navbar-expand {
@each $breakpoint in map.keys($grid-breakpoints) { @each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints); $next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints); $infix: breakpoint-infix($next, $grid-breakpoints);
@@ -322,12 +318,11 @@ Navbar vertical
bottom: 0; bottom: 0;
z-index: $zindex-fixed; z-index: $zindex-fixed;
align-items: flex-start; align-items: flex-start;
@include transition(transform $transition-time);
overflow-y: scroll; overflow-y: scroll;
padding: 0; padding: 0;
@include transition(transform $transition-time);
&.navbar-right, &.navbar-right {
&.navbar-end {
left: auto; left: auto;
right: 0; right: 0;
} }
@@ -369,8 +364,7 @@ Navbar vertical
} }
} }
&.navbar-right ~ .page, &.navbar-right ~ .page {
&.navbar-end ~ .page {
padding-left: 0; padding-left: 0;
padding-right: $sidebar-width; padding-right: $sidebar-width;
} }

View File

@@ -1,5 +1,3 @@
@use "sass:map";
.shape { .shape {
--#{$prefix}shape-size: #{$avatar-size}; --#{$prefix}shape-size: #{$avatar-size};
--#{$prefix}shape-icon-size: #{$avatar-icon-size}; --#{$prefix}shape-icon-size: #{$avatar-icon-size};
@@ -20,8 +18,8 @@
@each $avatar-size, $size in $avatar-sizes { @each $avatar-size, $size in $avatar-sizes {
.shape-#{$avatar-size} { .shape-#{$avatar-size} {
--#{$prefix}shape-size: #{map.get($size, size)}; --#{$prefix}shape-size: #{map-get($size, size)};
--#{$prefix}shape-icon-size: #{map.get($size, icon-size)}; --#{$prefix}shape-icon-size: #{map-get($size, icon-size)};
} }
} }

View File

@@ -1,12 +1,5 @@
@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) { @function theme-color-lighter($color, $background: #fff) {
@return color.mix($color, $background, 10%); @return mix($color, $background, 10%);
} }
@function theme-color-darker($color) { @function theme-color-darker($color) {
@@ -17,10 +10,10 @@
// Replace all occurrences of a substring within a string. // Replace all occurrences of a substring within a string.
// //
@function str-replace($string, $search, $replace: "") { @function str-replace($string, $search, $replace: "") {
$index: string.index($string, $search); $index: str-index($string, $search);
@if $index { @if $index {
@return string.slice($string, 1, $index - 1) + $replace + str-replace(string.slice($string, $index + string.length($search)), $search, $replace); @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
} }
@return $string; @return $string;
@@ -44,23 +37,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); $n: index($breakpoint-names, $name);
@if not $n { @if not $n {
@error "breakpoint `#{$name}` not found in `#{$breakpoints}`"; @error "breakpoint `#{$name}` not found in `#{$breakpoints}`";
} }
@return if($n > 1, list.nth($breakpoint-names, $n - 1), null); @return if($n > 1, nth($breakpoint-names, $n - 1), null);
} }
// //
// Escape SVG strings. // Escape SVG strings.
// //
@function escape-svg($string) { @function escape-svg($string) {
@if string.index($string, "data:image/svg+xml") { @if str-index($string, "data:image/svg+xml") {
@each $char, $encoded in $escaped-characters { @each $char, $encoded in $escaped-characters {
// Do not escape the url brackets // Do not escape the url brackets
@if string.index($string, "url(") == 1 { @if str-index($string, "url(") == 1 {
$string: url("#{str-replace(string.slice($string, 6, -3), $char, $encoded)}"); $string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
} @else { } @else {
$string: str-replace($string, $char, $encoded); $string: str-replace($string, $char, $encoded);
} }
@@ -77,7 +70,7 @@
* @return {String} - The percentage representation of the value. * @return {String} - The percentage representation of the value.
*/ */
@function to-percentage($value) { @function to-percentage($value) {
@return if(math.is-unitless($value), math.percentage($value), $value); @return if(unitless($value), percentage($value), $value);
} }
/** /**
@@ -101,306 +94,3 @@
@return url('data:image/svg+xml;charset=UTF-8,#{$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;
}

View File

@@ -1,2 +1,5 @@
@import "config"; @import "config";
@layer components {
@import "ui/flags"; @import "ui/flags";
}

View File

@@ -1,7 +1,7 @@
@import "config"; @import "config";
@import "variables";
@import "utilities-marketing"; @import "utilities-marketing";
@layer components {
@import "marketing/core"; @import "marketing/core";
@import "marketing/hero"; @import "marketing/hero";
@import "marketing/browser"; @import "marketing/browser";
@@ -9,5 +9,8 @@
@import "marketing/filters"; @import "marketing/filters";
@import "marketing/pricing"; @import "marketing/pricing";
@import "marketing/shape"; @import "marketing/shape";
}
@layer utilities {
@import "bootstrap/scss/utilities/api"; @import "bootstrap/scss/utilities/api";
}

View File

@@ -1,2 +1,5 @@
@import "config"; @import "config";
@layer components {
@import "ui/payments"; @import "ui/payments";
}

View File

@@ -1,2 +1,5 @@
@import "config"; @import "config";
@layer components {
@import "ui/social"; @import "ui/social";
}

View File

@@ -1,5 +1,6 @@
@import "config"; @import "config";
@layer themes {
[data-bs-theme-base="slate"] { [data-bs-theme-base="slate"] {
--#{$prefix}gray-50: #f8fafc; --#{$prefix}gray-50: #f8fafc;
--#{$prefix}gray-100: #f1f5f9; --#{$prefix}gray-100: #f1f5f9;
@@ -119,3 +120,4 @@
} }
} }
} }
}

View File

@@ -1,5 +1,6 @@
@import "config"; @import "config";
@layer vendors {
@import "vendor/nouislider"; @import "vendor/nouislider";
@import "vendor/litepicker"; @import "vendor/litepicker";
@import "vendor/tom-select"; @import "vendor/tom-select";
@@ -14,3 +15,4 @@
@import "vendor/typed"; @import "vendor/typed";
@import "vendor/turbo"; @import "vendor/turbo";
@import "vendor/fullcalendar"; @import "vendor/fullcalendar";
}

View File

@@ -1,5 +1,3 @@
@use "sass:map";
.avatar { .avatar {
--#{$prefix}avatar-size: var(--#{$prefix}avatar-list-size, #{$avatar-size}); --#{$prefix}avatar-size: var(--#{$prefix}avatar-list-size, #{$avatar-size});
--#{$prefix}avatar-status-size: #{$avatar-status-size}; --#{$prefix}avatar-status-size: #{$avatar-status-size};
@@ -57,15 +55,15 @@
@each $avatar-size, $size in $avatar-sizes { @each $avatar-size, $size in $avatar-sizes {
.avatar-#{$avatar-size} { .avatar-#{$avatar-size} {
--#{$prefix}avatar-size: #{map.get($size, size)}; --#{$prefix}avatar-size: #{map-get($size, size)};
--#{$prefix}avatar-status-size: #{map.get($size, status-size)}; --#{$prefix}avatar-status-size: #{map-get($size, status-size)};
--#{$prefix}avatar-font-size: #{map.get($size, font-size)}; --#{$prefix}avatar-font-size: #{map-get($size, font-size)};
--#{$prefix}avatar-icon-size: #{map.get($size, icon-size)}; --#{$prefix}avatar-icon-size: #{map-get($size, icon-size)};
--#{$prefix}avatar-brand-size: #{map.get($size, brand-size)}; --#{$prefix}avatar-brand-size: #{map-get($size, brand-size)};
.badge:empty { .badge:empty {
width: map.get($size, status-size); width: map-get($size, status-size);
height: map.get($size, status-size); height: map-get($size, status-size);
} }
} }
} }
@@ -96,7 +94,7 @@
@each $avatar-size, $size in $avatar-sizes { @each $avatar-size, $size in $avatar-sizes {
.avatar-list-#{$avatar-size} { .avatar-list-#{$avatar-size} {
--#{$prefix}avatar-list-size: #{map.get($size, size)}; --#{$prefix}avatar-list-size: #{map-get($size, size)};
} }
} }

View File

@@ -1,23 +1,7 @@
.breadcrumb { .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-active-font-weight: #{$breadcrumb-active-font-weight};
--#{$prefix}breadcrumb-item-disabled-color: #{$breadcrumb-disabled-color}; --#{$prefix}breadcrumb-item-disabled-color: #{$breadcrumb-disabled-color};
--#{$prefix}breadcrumb-link-color: #{$breadcrumb-link-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; padding: 0;
margin: 0; margin: 0;
background: transparent; background: transparent;
@@ -37,7 +21,6 @@
.breadcrumb-item { .breadcrumb-item {
&.active { &.active {
color: var(--#{$prefix}breadcrumb-item-active-color);
font-weight: var(--#{$prefix}breadcrumb-item-active-font-weight); font-weight: var(--#{$prefix}breadcrumb-item-active-font-weight);
a { a {
@@ -58,20 +41,6 @@
pointer-events: none; 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 { @each $name, $symbol in $breadcrumb-variants {

View File

@@ -1,17 +1,16 @@
@use "sass:color"; @use "sass:color";
@use "sass:map";
// //
// Button // Button
// //
.btn { .btn {
--#{$prefix}btn-icon-size: #{$input-btn-icon-size}; --#{$prefix}btn-icon-size: #{$input-btn-icon-size};
--#{$prefix}btn-icon-color: inherit;
--#{$prefix}btn-bg: var(--#{$prefix}bg-surface); --#{$prefix}btn-bg: var(--#{$prefix}bg-surface);
--#{$prefix}btn-color: var(--#{$prefix}body-color); --#{$prefix}btn-color: var(--#{$prefix}body-color);
--#{$prefix}btn-border-color: #{$btn-border-color}; --#{$prefix}btn-border-color: #{$btn-border-color};
--#{$prefix}btn-hover-bg: var(--#{$prefix}btn-bg); --#{$prefix}btn-hover-bg: var(--#{$prefix}btn-bg);
--#{$prefix}btn-hover-border-color: var(--#{$prefix}border-active-color); --#{$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-color: #{$active-color};
--#{$prefix}btn-active-bg: #{$active-bg}; --#{$prefix}btn-active-bg: #{$active-bg};
--#{$prefix}btn-active-border-color: #{$active-border-color}; --#{$prefix}btn-active-border-color: #{$active-border-color};
@@ -22,8 +21,6 @@
white-space: nowrap; white-space: nowrap;
box-shadow: var(--#{$prefix}btn-box-shadow); box-shadow: var(--#{$prefix}btn-box-shadow);
position: relative; 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 { .icon {
width: var(--#{$prefix}btn-icon-size); width: var(--#{$prefix}btn-icon-size);
@@ -32,7 +29,7 @@
font-size: var(--#{$prefix}btn-icon-size); font-size: var(--#{$prefix}btn-icon-size);
margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4); margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4);
vertical-align: bottom; vertical-align: bottom;
color: var(--#{$prefix}btn-icon-color); color: inherit;
} }
.avatar { .avatar {
@@ -41,8 +38,7 @@
margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4); 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); margin: 0 calc(var(--#{$prefix}btn-padding-x) / -4) 0 calc(var(--#{$prefix}btn-padding-x) / 2);
} }
@@ -76,9 +72,9 @@
// //
// Button color variations // 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} { .btn-#{$color} {
@if $color == "dark" { @if $color == 'dark' {
--#{$prefix}btn-border-color: var(--#{$prefix}dark-mode-border-color); --#{$prefix}btn-border-color: var(--#{$prefix}dark-mode-border-color);
--#{$prefix}btn-hover-border-color: var(--#{$prefix}dark-mode-border-active-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); --#{$prefix}btn-active-border-color: var(--#{$prefix}dark-mode-border-active-color);
@@ -99,8 +95,7 @@
--#{$prefix}btn-box-shadow: var(--#{$prefix}shadow-input); --#{$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-color: var(--#{$prefix}#{$color});
--#{$prefix}btn-bg: transparent; --#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-color: var(--#{$prefix}#{$color}); --#{$prefix}btn-border-color: var(--#{$prefix}#{$color});
@@ -109,22 +104,11 @@
--#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color}); --#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color});
--#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg); --#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg);
--#{$prefix}btn-active-bg: var(--#{$prefix}#{$color}); --#{$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-color: var(--#{$prefix}#{$color});
--#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$color}); --#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$color});
} }
.btn-ghost { .btn-ghost-#{$color} {
--#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-color: transparent;
--#{$prefix}btn-box-shadow: none;
--#{$prefix}btn-hover-bg: var(--#{$prefix}bg-surface-secondary);
--#{$prefix}btn-hover-border-color: transparent;
--#{$prefix}btn-hover-color: var(--#{$prefix}body-color);
}
.btn-ghost-#{$color},
.btn-ghost.btn-#{$color} {
--#{$prefix}btn-color: var(--#{$prefix}#{$color}); --#{$prefix}btn-color: var(--#{$prefix}#{$color});
--#{$prefix}btn-bg: transparent; --#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-color: transparent; --#{$prefix}btn-border-color: transparent;
@@ -146,27 +130,16 @@
// //
// Button sizes // Button sizes
// //
.btn-sm, .btn-sm, .btn-group-sm > .btn {
.btn-group-sm > .btn {
--#{$prefix}btn-line-height: #{$input-btn-line-height-sm}; --#{$prefix}btn-line-height: #{$input-btn-line-height-sm};
--#{$prefix}btn-icon-size: #{$input-btn-icon-size-sm}; --#{$prefix}btn-icon-size: #{$input-btn-icon-size-sm};
} }
.btn-lg, .btn-lg, .btn-group-lg > .btn {
.btn-group-lg > .btn {
--#{$prefix}btn-line-height: #{$input-btn-line-height-lg}; --#{$prefix}btn-line-height: #{$input-btn-line-height-lg};
--#{$prefix}btn-icon-size: #{$input-btn-icon-size-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 // Button shapes
// //
@@ -187,18 +160,15 @@
// //
// Icon button // Icon button
// //
.btn-icon, .btn-icon {
.btn-action { 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));
padding-left: 0; padding-left: 0;
padding-right: 0; padding-right: 0;
.icon { .icon {
margin: calc(-1 * var(--#{$prefix}btn-padding-x)); 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));
} }
// //
@@ -245,7 +215,7 @@
height: var(--#{$prefix}btn-icon-size); height: var(--#{$prefix}btn-icon-size);
left: calc(50% - var(--#{$prefix}btn-icon-size) / 2); left: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
top: calc(50% - var(--#{$prefix}btn-icon-size) / 2); top: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
animation: spinner-border 0.75s linear infinite; animation: spinner-border .75s linear infinite;
} }
} }
@@ -254,7 +224,14 @@
// //
.btn-action { .btn-action {
--#{$prefix}border-color: transparent; --#{$prefix}border-color: transparent;
padding: 0;
border: 0;
color: var(--#{$prefix}secondary); color: var(--#{$prefix}secondary);
display: inline-flex;
width: 2rem;
height: 2rem;
align-items: center;
justify-content: center;
border-radius: var(--#{$prefix}border-radius); border-radius: var(--#{$prefix}border-radius);
background: transparent; background: transparent;
box-shadow: none; box-shadow: none;
@@ -272,7 +249,6 @@
&.show { &.show {
color: var(--#{$prefix}body-color); color: var(--#{$prefix}body-color);
background: var(--#{$prefix}active-bg); background: var(--#{$prefix}active-bg);
border-color: transparent;
} }
&.show { &.show {
@@ -283,64 +259,3 @@
.btn-actions { .btn-actions {
display: flex; 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;
}
}
}
}

View File

@@ -111,11 +111,11 @@
justify-content: center; justify-content: center;
padding: $card-spacer-y $card-spacer-x; padding: $card-spacer-y $card-spacer-x;
text-align: center; text-align: center;
@include transition(background $transition-time);
border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color); border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color);
flex: 1; flex: 1;
color: inherit; color: inherit;
font-weight: var(--#{$prefix}font-weight-medium); font-weight: var(--#{$prefix}font-weight-medium);
@include transition(background $transition-time);
&:hover { &:hover {
text-decoration: none; text-decoration: none;
@@ -215,13 +215,11 @@ Stacked card
} }
// Card rotate // Card rotate
.card-rotate-left, .card-rotate-left {
.card-rotate-start {
transform: rotate(-1.5deg); transform: rotate(-1.5deg);
} }
.card-rotate-right, .card-rotate-right {
.card-rotate-end {
transform: rotate(1.5deg); transform: rotate(1.5deg);
} }
@@ -438,23 +436,6 @@ Card table
} }
} }
tbody {
tr {
&:last-child {
td {
border-bottom: 0;
}
}
}
}
tfoot {
tr {
&:last-child {
border-bottom: 0;
}
}
}
.card-body + & { .card-body + & {
border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}table-border-color); border-top: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}table-border-color);
} }

View File

@@ -24,7 +24,6 @@
color: var(--#{$prefix}btn-close-color); color: var(--#{$prefix}btn-close-color);
text-decoration: none; text-decoration: none;
opacity: var(--#{$prefix}btn-close-hover-opacity); opacity: var(--#{$prefix}btn-close-hover-opacity);
background-color: var(--#{$prefix}btn-close-color);
} }
&:focus { &:focus {

View File

@@ -96,7 +96,7 @@
.dropend { .dropend {
> .dropdown-menu { > .dropdown-menu {
margin-top: subtract(calc(-1 * $dropdown-padding-y), 1px); margin-top: subtract(-$dropdown-padding-y, 1px);
margin-left: -.25rem; margin-left: -.25rem;
} }

View File

@@ -1,5 +1,3 @@
@use "sass:map";
$countries: ( $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' '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'
); );
@@ -28,6 +26,6 @@ $countries: (
@each $flag-size, $size in $flag-sizes { @each $flag-size, $size in $flag-sizes {
.flag-#{$flag-size} { .flag-#{$flag-size} {
height: map.get($size, size); height: map-get($size, size);
} }
} }

View File

@@ -15,7 +15,7 @@ Form label
&.required { &.required {
&:after { &:after {
content: "*"; content: "*";
margin-left: 0.25rem; margin-left: .25rem;
color: $red; color: $red;
} }
} }
@@ -39,17 +39,17 @@ Form hint
} }
& + .form-control { & + .form-control {
margin-top: 0.25rem; margin-top: .25rem;
} }
.form-label + & { .form-label + & {
margin-top: -0.25rem; margin-top: -.25rem;
} }
.input-group + &, .input-group + &,
.form-control + &, .form-control + &,
.form-select + & { .form-select + & {
margin-top: 0.5rem; margin-top: .5rem;
color: $form-secondary-color; color: $form-secondary-color;
} }
} }
@@ -90,18 +90,18 @@ Form control
} }
.form-control-dark { .form-control-dark {
background-color: rgba($black, 0.1); background-color: rgba($black, .1);
color: $white; color: $white;
border-color: transparent; border-color: transparent;
&:focus { &:focus {
background-color: rgba($black, 0.1); background-color: rgba($black, .1);
box-shadow: none; box-shadow: none;
border-color: rgba($white, 0.24); border-color: rgba($white, .24);
} }
&::placeholder { &::placeholder {
color: rgba($white, 0.6); color: rgba($white, .6);
} }
} }
@@ -144,7 +144,7 @@ Form help
justify-content: center; justify-content: center;
width: 1.125rem; width: 1.125rem;
height: 1.125rem; height: 1.125rem;
font-size: 0.75rem; font-size: .75rem;
color: $form-secondary-color; color: $form-secondary-color;
text-align: center; text-align: center;
text-decoration: none; text-decoration: none;
@@ -161,6 +161,8 @@ Form help
} }
} }
/** /**
Input group Input group
*/ */
@@ -206,21 +208,19 @@ Input group
.input-group-text { .input-group-text {
background: $form-check-input-bg; background: $form-check-input-bg;
z-index: 10;
@include transition($input-transition); @include transition($input-transition);
&:first-child { &:first-child {
padding-right: 0; padding-right: 0;
border-right: 0;
} }
&:last-child { &:last-child {
padding-left: 0; padding-left: 0;
border-left: 0;
} }
} }
} }
/** /**
Upload files Upload files
*/ */

View File

@@ -1,5 +1,3 @@
@use "sass:map";
.row > * { .row > * {
min-width: 0; min-width: 0;
} }
@@ -19,8 +17,8 @@
@each $name, $value in (0: 0, sm: .375rem, md: 1.5rem, lg: 3rem) { @each $name, $value in (0: 0, sm: .375rem, md: 1.5rem, lg: 3rem) {
.row-#{$name} { .row-#{$name} {
margin-right: calc(-1 * $value); margin-right: (-$value);
margin-left: calc(-1 * $value); margin-left: -($value);
> .col, > .col,
> [class*="col-"] { > [class*="col-"] {
@@ -56,7 +54,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}'); $name-prefixed: if($name == null, null, '-#{$name}');
.space-y#{$name-prefixed} { .space-y#{$name-prefixed} {
@@ -71,7 +69,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}'); $name-prefixed: if($name == null, null, '-#{$name}');
.divide-y#{$name-prefixed} { .divide-y#{$name-prefixed} {

View File

@@ -37,7 +37,7 @@
// //
.icon-sm { .icon-sm {
--#{$prefix}icon-size: 1rem; --#{$prefix}icon-size: 1rem;
stroke-width: 1.5; stroke-width: 1;
} }
.icon-md { .icon-md {

View File

@@ -1,7 +1,5 @@
@use "sass:math";
.img-responsive { .img-responsive {
--#{$prefix}img-responsive-ratio: #{math.percentage(.75)}; --#{$prefix}img-responsive-ratio: #{percentage(.75)};
background: no-repeat center/cover; background: no-repeat center/cover;
padding-top: var(--#{$prefix}img-responsive-ratio); padding-top: var(--#{$prefix}img-responsive-ratio);
} }

View File

@@ -30,6 +30,14 @@
border-left-width: $border-width-wide; border-left-width: $border-width-wide;
} }
.list-group-item {
&:active,
&:focus,
&:hover {
background-color: $dropdown-link-hover-bg;
}
}
.list-group-item { .list-group-item {
&.disabled, &.disabled,
&:disabled { &:disabled {
@@ -50,14 +58,6 @@
} }
.list-group-hoverable { .list-group-hoverable {
.list-group-item {
&:active,
&:focus,
&:hover {
background-color: $dropdown-link-hover-bg;
}
}
.list-group-item-actions { .list-group-item-actions {
opacity: 0; opacity: 0;
@include transition(opacity $transition-time); @include transition(opacity $transition-time);

View File

@@ -22,7 +22,7 @@
} }
&.nav-pills { &.nav-pills {
margin: 0 calc(-1 * $nav-link-padding-x); margin: 0 (-$nav-link-padding-x);
} }
} }
@@ -65,8 +65,8 @@
.nav-link { .nav-link {
display: flex; display: flex;
align-items: center;
@include transition(color $transition-time, background-color $transition-time); @include transition(color $transition-time, background-color $transition-time);
align-items: center;
&:hover, &:hover,
&:focus { &:focus {

View File

@@ -9,11 +9,11 @@
.page-link { .page-link {
min-width: 2rem; min-width: 2rem;
border-radius: var(--#{$prefix}pagination-border-radius); border-radius: var(--#{$prefix}pagination-border-radius);
}
.page-item:not(.active) .page-link:hover { &:hover {
background: var(--#{$prefix}pagination-hover-bg); background: var(--#{$prefix}pagination-hover-bg);
} }
}
.page-text { .page-text {
padding-left: .5rem; padding-left: .5rem;

View File

@@ -1,5 +1,3 @@
@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-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 { .payment {
@@ -25,6 +23,6 @@ $payment-icons: ("2c2p", "2checkout", "adyen", "affirm", "alipay-plus", "alipay"
@each $payment-size, $size in $payment-sizes { @each $payment-size, $size in $payment-sizes {
.payment-#{$payment-size} { .payment-#{$payment-size} {
height: map.get($size, size); height: map-get($size, size);
} }
} }

View File

@@ -42,20 +42,11 @@ Progress
height: .25rem; height: .25rem;
} }
.progress-lg {
height: .75rem;
}
.progress-xl {
height: 1rem;
}
/** /**
Progress bar Progress bar
*/ */
.progress-bar { .progress-bar {
height: 100%; height: 100%;
@include transition(width $transition-time, background $transition-time);
} }
.progress-bar-indeterminate { .progress-bar-indeterminate {
@@ -114,31 +105,3 @@ Progressbg
margin-left: auto; margin-left: auto;
padding-left: 2rem; padding-left: 2rem;
} }
/**
Progress steps
*/
.progress-steps {
display: flex;
flex-wrap: nowrap;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
gap: .25rem;
}
.progress-steps-item {
flex: 1 1 0;
min-height: .25rem;
margin-top: 0;
color: inherit;
text-align: center;
cursor: default;
background-color: var(--tblr-border-color);
border-radius: var(--#{$prefix}border-radius-pill);
@at-root a#{&} {
cursor: pointer;
}
}

View File

@@ -1,5 +1,3 @@
@use "sass:map";
$apps: ( $apps: (
"apple", "apple",
"discord", "discord",
@@ -49,6 +47,6 @@ $apps: (
@each $flag-size, $size in $flag-sizes { @each $flag-size, $size in $flag-sizes {
.social-#{$flag-size} { .social-#{$flag-size} {
height: map.get($size, size); height: map-get($size, size);
} }
} }

View File

@@ -7,3 +7,7 @@
margin-left: .25rem; margin-left: .25rem;
} }
} }
.star {
}

View File

@@ -122,9 +122,7 @@
// Slide variant // Slide variant
.switch-icon-slide-up, .switch-icon-slide-up,
.switch-icon-slide-left, .switch-icon-slide-left,
.switch-icon-slide-start,
.switch-icon-slide-right, .switch-icon-slide-right,
.switch-icon-slide-end,
.switch-icon-slide-down { .switch-icon-slide-down {
overflow: hidden; overflow: hidden;
@@ -152,8 +150,7 @@
} }
} }
.switch-icon-slide-left, .switch-icon-slide-left {
.switch-icon-slide-start {
.switch-icon-a { .switch-icon-a {
transform: translateX(0); transform: translateX(0);
} }
@@ -173,8 +170,7 @@
} }
} }
.switch-icon-slide-right, .switch-icon-slide-right {
.switch-icon-slide-end {
.switch-icon-a { .switch-icon-a {
transform: translateX(0); transform: translateX(0);
} }

View File

@@ -18,6 +18,10 @@
.table { .table {
margin-bottom: 0; margin-bottom: 0;
} }
+ .card-footer {
border-top: 0;
}
} }
.table-transparent { .table-transparent {
@@ -108,10 +112,11 @@ Table sort
display: block; display: block;
width: 100%; width: 100%;
text-align: inherit; text-align: inherit;
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); @include transition(color $transition-time);
margin: (-$table-th-padding-y) (-$table-th-padding-x);
padding: $table-th-padding-y $table-th-padding-x;
&:hover, &:hover,
&.asc, &.asc,
&.desc { &.desc {

View File

@@ -3,12 +3,11 @@ Select group
*/ */
.form-selectgroup { .form-selectgroup {
display: inline-flex; display: inline-flex;
margin: 0; margin: 0 -.5rem -.5rem 0;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.5rem;
.form-selectgroup-item { .form-selectgroup-item {
margin: 0; margin: 0 .5rem .5rem 0;
} }
} }

View File

@@ -1,7 +1,5 @@
@use "sass:map";
// All colors // All colors
@each $color, $value in map.merge($theme-colors, ( white: $white)) { @each $color, $value in map-merge($theme-colors, ( white: $white)) {
.bg-#{"" + $color} { .bg-#{"" + $color} {
background-color: color-mix(in srgb, var(--#{$prefix}#{$color}) calc(var(--#{$prefix}bg-opacity, 1) * 100%), transparent) !important; background-color: color-mix(in srgb, var(--#{$prefix}#{$color}) calc(var(--#{$prefix}bg-opacity, 1) * 100%), transparent) !important;
} }

View File

@@ -1,47 +0,0 @@
%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);
}
}

View File

@@ -33,8 +33,8 @@
.noUi-horizontal & { .noUi-horizontal & {
width: $form-range-thumb-width; width: $form-range-thumb-width;
height: $form-range-thumb-height; height: $form-range-thumb-height;
top: calc($form-range-thumb-height * -.5); top: (-$form-range-thumb-height * .5);
right: calc($form-range-thumb-height * -.5); right: (-$form-range-thumb-height * .5);
margin: 1px 1px 0 0; margin: 1px 1px 0 0;
} }

View File

@@ -1,24 +1,18 @@
# Tabler Documentation Changelog # @tabler/docs
## 1.4.0 ## 1.3.2
### Patch Changes ### Patch Changes
- 6c38a48: Update Bootstrap to v5.3.7 - Updated dependencies [446c34e]
- 6c47b5f: Change `package.json` to `core/libs.json` as a source of libraries - @tabler/core@1.3.2
- 70a41e4: Replace a package list in `download.md` with a link to the 3rd-party libraries page
- Updated dependencies [6c4dd36] ## 1.3.1
- Updated dependencies [6fec73a]
- Updated dependencies [9951fe9] ### Patch Changes
- Updated dependencies [db6200a]
- Updated dependencies [e96f055] - Updated dependencies [a7f73d7]
- Updated dependencies [a200d30] - @tabler/core@1.3.1
- Updated dependencies [6c38a48]
- Updated dependencies [2a12f72]
- Updated dependencies [49ab9ea]
- Updated dependencies [666a296]
- Updated dependencies [cfd4cb6]
- @tabler/core@1.4.0
## 1.3.0 ## 1.3.0
@@ -44,3 +38,59 @@
- 5fa662b: Use color-input examples in documentation - 5fa662b: Use color-input examples in documentation
- 5619b2d: Fix `src` links to images in README and getting-started docs page - 5619b2d: Fix `src` links to images in README and getting-started docs page
- f8075f6: Add documentation for 3rd-party libraries and resources - f8075f6: Add documentation for 3rd-party libraries and resources
- Updated dependencies [cac5d92]
- Updated dependencies [f94b153]
- Updated dependencies [c127d65]
- Updated dependencies [b6e9b18]
- Updated dependencies [8850f61]
- Updated dependencies [9910dd0]
- Updated dependencies [638f36c]
- Updated dependencies [0d501e9]
- Updated dependencies [a1af801]
- Updated dependencies [3a02ef9]
- Updated dependencies [b9d434d]
- Updated dependencies [fd0fd47]
- Updated dependencies [74e5d26]
- Updated dependencies [72a1d67]
- Updated dependencies [bb617b8]
- Updated dependencies [d73d78e]
- Updated dependencies [19a3d20]
- Updated dependencies [b5e2f54]
- Updated dependencies [a41c956]
- Updated dependencies [79bd867]
- Updated dependencies [e675389]
- Updated dependencies [9007e73]
- @tabler/core@1.3.0
## 1.0.1
### 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

View File

@@ -100,12 +100,12 @@ You can use icons in badges to make them more visually appealing. The example be
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. 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 -%} {% capture html -%}
{% include "ui/badge.html" text="Star" icon-end="arrow-right" -%} {% include "ui/badge.html" text="Star" icon-right="arrow-right" -%}
{% include "ui/badge.html" text="Heart" icon-end="arrow-right" -%} {% include "ui/badge.html" text="Heart" icon-right="arrow-right" -%}
{% include "ui/badge.html" text="Check" icon-end="arrow-right" -%} {% include "ui/badge.html" text="Check" icon-right="arrow-right" -%}
{% include "ui/badge.html" text="X" icon-end="arrow-right" -%} {% include "ui/badge.html" text="X" icon-right="arrow-right" -%}
{% include "ui/badge.html" text="Plus" icon-end="arrow-right" -%} {% include "ui/badge.html" text="Plus" icon-right="arrow-right" -%}
{% include "ui/badge.html" text="Minus" icon-end="arrow-right" -%} {% include "ui/badge.html" text="Minus" icon-right="arrow-right" -%}
{%- endcapture %} {%- endcapture %}
{% include "docs/example.html" html=html centered %} {% include "docs/example.html" html=html centered %}

View File

@@ -409,16 +409,6 @@ Add the `.btn-loading` class to show a button's loading state, which can be usef
{%- endcapture -%} {%- 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 ## List of buttons
Create a list of buttons using the `.btn-list` container to display different actions a user can take. If you add additional styling, such as colors, you will be able to focus users' attention on a particular action or suggest the result. Create a list of buttons using the `.btn-list` container to display different actions a user can take. If you add additional styling, such as colors, you will be able to focus users' attention on a particular action or suggest the result.
@@ -486,26 +476,6 @@ Use the `.text-center` or the `.text-end` modifiers to change the buttons' align
{%- endcapture -%} {%- 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 ## Buttons with avatars
Use buttons with avatars to simplify the process of interaction and make your design more personalized. Buttons can contain avatars and labels or only avatars, if displayed on a smaller space. Use buttons with avatars to simplify the process of interaction and make your design more personalized. Buttons can contain avatars and labels or only avatars, if displayed on a smaller space.
@@ -538,142 +508,3 @@ Use buttons with avatars to simplify the process of interaction and make your de
</a> </a>
{%- endcapture -%} {%- 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 %}

View File

@@ -170,10 +170,40 @@ By using a progress bar component as a background element, designers can create
Thanks to this you can create a nice looking statistics section: Thanks to this you can create a nice looking statistics section:
{% capture html -%} {% capture html -%}
{% include "ui/progressbg.html" value="65" text="Poland" show-value=true %} <div class="progressbg">
{% include "ui/progressbg.html" value="35" text="Germany" show-value=true %} <div class="progress progressbg-progress">
{% include "ui/progressbg.html" value="28" text="United Stated" show-value=true %} <div class="progress-bar bg-primary-lt" style="width: 65%"></div>
{% include "ui/progressbg.html" value="20" text="United Kingdom" show-value=true %} </div>
{% include "ui/progressbg.html" value="15" text="France" show-value=true %} <div class="progressbg-text">Poland</div>
<div class="progressbg-value">65%</div>
</div>
<div class="progressbg">
<div class="progress progressbg-progress">
<div class="progress-bar bg-primary-lt" style="width: 35%"></div>
</div>
<div class="progressbg-text">Germany</div>
<div class="progressbg-value">35%</div>
</div>
<div class="progressbg">
<div class="progress progressbg-progress">
<div class="progress-bar bg-primary-lt" style="width: 28%"></div>
</div>
<div class="progressbg-text">United Stated</div>
<div class="progressbg-value">28%</div>
</div>
<div class="progressbg">
<div class="progress progressbg-progress">
<div class="progress-bar bg-primary-lt" style="width: 20%"></div>
</div>
<div class="progressbg-text">United Kingdom</div>
<div class="progressbg-value">20%</div>
</div>
<div class="progressbg">
<div class="progress progressbg-progress">
<div class="progress-bar bg-primary-lt" style="width: 15%"></div>
</div>
<div class="progressbg-text">France</div>
<div class="progressbg-value">15%</div>
</div>
{%- endcapture %} {%- endcapture %}
{% include "docs/example.html" html=html vertical card %} {% include "docs/example.html" html=html vertical card %}

View File

@@ -175,7 +175,7 @@ You can also add a fancy animation to add variety to your button. See demo below
</svg> </svg>
</span> </span>
</button> </button>
<button class="switch-icon switch-icon-slide-end" data-bs-toggle="switch-icon"> <button class="switch-icon switch-icon-slide-right" data-bs-toggle="switch-icon">
<span class="switch-icon-a text-secondary"> <span class="switch-icon-a text-secondary">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View File

@@ -28,9 +28,17 @@ Install Tabler in your Node.js powered apps with the npm package:
{% include "docs/tabs-package.html" name="@tabler/core" %} {% include "docs/tabs-package.html" name="@tabler/core" %}
## 3rd-party Libraries
Tabler uses other packages to enhance its functionality - for example, charts and input masks. These are not automatically installed to avoid huge Tabler uses other packages to enhance its functionality - for example, charts and input masks. These are not automatically installed to avoid huge
dependency trees and need to be installed by using `npm install`. The full list of recommended libraries is available on the dependency trees and need to be installed by using npm install. We support the following packages as of writing.
[3rd-party Libraries & Resources](/ui/getting-started/references) page.
For the most recent list of supported packages, you can also check the [libs.json](https://github.com/tabler/tabler/blob/dev/core/libs.json) file. - [apexcharts](https://apexcharts.com/)
- [autosize](http://www.jacklmoore.com/autosize/)
- [choices.js](https://github.com/Choices-js/Choices)
- [countup.js](https://inorganik.github.io/countUp.js/)
- [flatpickr](https://flatpickr.js.org/)
- [imask](https://imask.js.org/)
- [litepicker](https://litepicker.com/)
- [nouislider](https://refreshless.com/nouislider/)
- [tom-select](https://tom-select.js.org/)
For the complete list of supported packages you can check the peerDependencies section in our [package.json](https://github.com/tabler/tabler/blob/dev/package.json)

View File

@@ -1,6 +1,5 @@
import { appFilters } from "../shared/e11ty/filters.mjs" import { appFilters } from "../shared/e11ty/filters.mjs"
import { appData } from "../shared/e11ty/data.mjs"; import { appData } from "../shared/e11ty/data.mjs";
import { appConfig } from "../shared/e11ty/config.mjs";
import { readFileSync, existsSync } from 'node:fs'; import { readFileSync, existsSync } from 'node:fs';
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
import { join, dirname } from 'node:path'; import { join, dirname } from 'node:path';
@@ -14,7 +13,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
export default function (eleventyConfig) { export default function (eleventyConfig) {
const environment = process.env.NODE_ENV || "production"; const environment = process.env.NODE_ENV || "production";
appConfig(eleventyConfig);
appFilters(eleventyConfig); appFilters(eleventyConfig);
appData(eleventyConfig); appData(eleventyConfig);
@@ -31,6 +29,11 @@ export default function (eleventyConfig) {
}); });
eleventyConfig.setInputDirectory("content"); eleventyConfig.setInputDirectory("content");
eleventyConfig.setOutputDirectory("dist");
eleventyConfig.setLayoutsDirectory("../../shared/layouts");
eleventyConfig.setIncludesDirectory("../../shared/includes");
eleventyConfig.setDataDirectory("../../shared/data");
eleventyConfig.amendLibrary('md', () => { }); eleventyConfig.amendLibrary('md', () => { });

View File

@@ -1,6 +1,6 @@
{ {
"name": "@tabler/docs", "name": "@tabler/docs",
"version": "1.4.0", "version": "1.3.2",
"description": "", "description": "",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -25,11 +25,11 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@11ty/eleventy": "3.1.0", "@11ty/eleventy": "^3.1.0",
"@docsearch/css": "^3.9.0", "@docsearch/css": "^3.9.0",
"@docsearch/js": "^3.9.0", "@docsearch/js": "^3.9.0",
"flat-cache": "^6.1.11", "flat-cache": "^6.1.8",
"shiki": "^3.7.0" "shiki": "^3.2.2"
}, },
"dependencies": { "dependencies": {
"@tabler/core": "workspace:*" "@tabler/core": "workspace:*"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -3,7 +3,6 @@
:root { :root {
--docsearch-primary-color: var(--tblr-primary); --docsearch-primary-color: var(--tblr-primary);
--docsearch-searchbox-background: var(--tblr-bg-surface); --docsearch-searchbox-background: var(--tblr-bg-surface);
--docsearch-searchbox-focus-background: var(--tblr-bg-surface);
--docsearch-text-color: var(--tblr-body-text); --docsearch-text-color: var(--tblr-body-text);
--docsearch-key-shadow: 0 0 0 1px var(--tblr-border-color); --docsearch-key-shadow: 0 0 0 1px var(--tblr-border-color);
--docsearch-key-gradient: var(--tblr-bg-surface-secondary); --docsearch-key-gradient: var(--tblr-bg-surface-secondary);
@@ -26,80 +25,6 @@
transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out;
} }
.DocSearch-SearchBar {
display: flex;
padding: var(--docsearch-spacing) var(--docsearch-spacing) 0;
background-color: var(--tblr-bg-surface) !important;
}
.DocSearch-Hit-source {
background: none !important;
}
.DocSearch-Dropdown {
background-color: var(--tblr-bg-surface) !important;
}
.DocSearch-Hit a {
background-color: var(--tblr-bg-surface-secondary) !important;
border: 1px solid var(--tblr-border-color) !important;
color: var(--tblr-body-color) !important;
box-shadow: none !important;
&:hover {
background-color: var(--tblr-bg-surface-tertiary) !important;
border-color: var(--tblr-border-color-active) !important;
}
}
.DocSearch-Hit-Container {
color: var(--tblr-body-color) !important;
}
.DocSearch-Hit-title {
color: var(--tblr-body-color) !important;
}
.DocSearch-Hit-path {
color: var(--tblr-muted) !important;
}
.DocSearch-Hit[aria-selected="true"] a {
background-color: var(--tblr-primary) !important;
border-color: var(--tblr-primary) !important;
color: var(--tblr-primary-fg) !important;
}
.DocSearch-Hit[aria-selected="true"] .DocSearch-Hit-Container,
.DocSearch-Hit[aria-selected="true"] .DocSearch-Hit-title,
.DocSearch-Hit[aria-selected="true"] .DocSearch-Hit-path {
color: var(--tblr-primary-fg) !important;
}
.DocSearch-Modal {
background-color: var(--tblr-bg-surface) !important;
box-shadow: var(--tblr-shadow-dropdown) !important;
}
.DocSearch-Form {
background-color: var(--tblr-bg-surface-secondary) !important;
border: 1px solid var(--tblr-border-color) !important;
}
.DocSearch-Input {
color: var(--tblr-body-color) !important;
&::placeholder {
color: var(--tblr-muted) !important;
}
}
.DocSearch-Footer {
background-color: var(--tblr-bg-surface) !important;
border-top: 1px solid var(--tblr-border-color) !important;
box-shadow: none !important;
}
.DocSearch-Button-Key { .DocSearch-Button-Key {
top: 0; top: 0;
} }

View File

@@ -14,39 +14,37 @@
"zip-package": "node .build/zip-package.mjs", "zip-package": "node .build/zip-package.mjs",
"start": "pnpm dev" "start": "pnpm dev"
}, },
"packageManager": "pnpm@10.12.4", "packageManager": "pnpm@10.11.0",
"dependencies": {
"shx": "^0.4.0"
},
"devDependencies": { "devDependencies": {
"@argos-ci/playwright": "^5.0.5", "@argos-ci/playwright": "^5.0.3",
"@changesets/changelog-github": "^0.5.1", "@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.29.5", "@changesets/cli": "^2.29.4",
"@playwright/test": "^1.53.2", "@playwright/test": "^1.52.0",
"@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-commonjs": "^28.0.3",
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-replace": "^6.0.2",
"adm-zip": "^0.5.16", "adm-zip": "^0.5.16",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"bundlewatch": "^0.4.1", "bundlewatch": "^0.4.1",
"clean-css-cli": "^5.6.3", "clean-css-cli": "^5.6.3",
"concurrently": "^9.2.0", "concurrently": "^9.1.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"fs-extra": "^11.3.0", "fs-extra": "^11.3.0",
"glob": "^11.0.3", "glob": "^11.0.2",
"js-beautify": "^1.15.4", "js-beautify": "^1.15.4",
"nodemon": "^3.1.10", "nodemon": "^3.1.10",
"pnpm": "^10.6.5", "pnpm": "10.6.5",
"postcss": "^8.5.6", "postcss": "^8.5.3",
"postcss-cli": "^11.0.1", "postcss-cli": "^11.0.1",
"prettier": "^3.6.2", "prettier": "^3.5.3",
"rollup": "4.44.2", "rollup": "4.40.2",
"rollup-plugin-dotenv": "^0.5.1", "rollup-plugin-dotenv": "^0.5.1",
"rtlcss": "^4.3.0", "rtlcss": "^4.3.0",
"sass": "1.89.2", "sass": "1.71.0",
"shelljs": "^0.10.0", "shelljs": "^0.10.0",
"terser": "^5.43.1", "shx": "^0.4.0",
"turbo": "^2.5.4" "terser": "^5.39.2",
"turbo": "^2.5.3"
} }
} }

1057
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,5 @@
# @tabler/preview # @tabler/preview
## 1.4.0
### Patch Changes
- 6c38a48: Update Bootstrap to v5.3.7
- 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.2 ## 1.3.2
### Patch Changes ### Patch Changes
@@ -37,3 +19,26 @@
### Patch Changes ### Patch Changes
- 8850f61: Enhance pagination component with new styles - 8850f61: Enhance pagination component with new styles
- Updated dependencies [cac5d92]
- Updated dependencies [f94b153]
- Updated dependencies [c127d65]
- Updated dependencies [b6e9b18]
- Updated dependencies [8850f61]
- Updated dependencies [9910dd0]
- Updated dependencies [638f36c]
- Updated dependencies [0d501e9]
- Updated dependencies [a1af801]
- Updated dependencies [3a02ef9]
- Updated dependencies [b9d434d]
- Updated dependencies [fd0fd47]
- Updated dependencies [74e5d26]
- Updated dependencies [72a1d67]
- Updated dependencies [bb617b8]
- Updated dependencies [d73d78e]
- Updated dependencies [19a3d20]
- Updated dependencies [b5e2f54]
- Updated dependencies [a41c956]
- Updated dependencies [79bd867]
- Updated dependencies [e675389]
- Updated dependencies [9007e73]
- @tabler/core@1.3.0

View File

@@ -4,21 +4,24 @@ import { join } from 'node:path';
import { sync } from 'glob'; import { sync } from 'glob';
import { appFilters } from "../shared/e11ty/filters.mjs"; import { appFilters } from "../shared/e11ty/filters.mjs";
import { appData } from "../shared/e11ty/data.mjs" import { appData } from "../shared/e11ty/data.mjs"
import { appConfig } from "../shared/e11ty/config.mjs"
/** @type {import('@11ty/eleventy').LocalConfig} */ /** @type {import('@11ty/eleventy').LocalConfig} */
export default function (eleventyConfig) { export default function (eleventyConfig) {
const environment = process.env.NODE_ENV || "production"; const environment = process.env.NODE_ENV || "production";
const currentDir = process.cwd();
appConfig(eleventyConfig);
appFilters(eleventyConfig); appFilters(eleventyConfig);
appData(eleventyConfig); appData(eleventyConfig);
eleventyConfig.setInputDirectory("pages");
eleventyConfig.setOutputDirectory("dist");
eleventyConfig.setLayoutsDirectory("../../shared/layouts");
eleventyConfig.setIncludesDirectory("../../shared/includes");
eleventyConfig.setDataDirectory("../../shared/data");
eleventyConfig.addPassthroughCopy({ eleventyConfig.addPassthroughCopy({
"node_modules/@tabler/core/dist": "dist", "node_modules/@tabler/core/dist": "dist",
"pages/favicon.ico": "favicon.ico", "pages/favicon.ico": "favicon.ico",
"pages/favicon-dev.ico": "favicon-dev.ico",
"static": "static", "static": "static",
}); });
@@ -43,6 +46,169 @@ export default function (eleventyConfig) {
}); });
}); });
/**
* Filters
*/
eleventyConfig.addFilter("miliseconds_to_minutes", function (value) {
// Raturn 3:45 time format
const minutes = Math.floor(value / 60000);
const seconds = ((value % 60000) / 1000).toFixed(0);
return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
});
eleventyConfig.addFilter("relative", (page) => {
const segments = (page.url || '').replace(/^\//).split('/');
if (segments.length === 1) {
return '.';
} else {
return '../'.repeat(segments.length - 1).slice(0, -1);
}
});
eleventyConfig.addFilter("contains", (items, item) => {
return items && Array.isArray(items) && items.includes(item);
});
eleventyConfig.addFilter("concat_objects", function (object, object2) {
if (
object &&
object2 &&
typeof object === 'object' &&
typeof object2 === 'object' &&
!Array.isArray(object) &&
!Array.isArray(object2)
) {
return { ...object, ...object2 };
}
return object;
});
eleventyConfig.addFilter("replace_regex", function (input, regStr, replStr) {
const regex = new RegExp(regStr, 'gm');
return input.replace(regex, replStr);
});
eleventyConfig.addFilter("timestamp_to_date", function (timestamp) {
const date = new Date(timestamp * 1000); // Convert timestamp to milliseconds
return date.toISOString().split('T')[0]; // Extract the date in 'YYYY-MM-DD' format
});
eleventyConfig.addFilter("split_to_n", function (arr, n) {
const chunkSize = Math.round(arr.length / n);
const result = [];
for (let i = 0; i < arr.length; i += chunkSize) {
result.push(arr.slice(i, i + chunkSize));
}
return result;
})
eleventyConfig.addFilter("format_number", function (value) {
return value.toString()
.split('')
.reverse()
.reduce((acc, char, index) => {
if (index > 0 && index % 3 === 0) {
acc.push(',');
}
acc.push(char);
return acc;
}, [])
.reverse()
.join('');
});
function randomNumber(x, min = 0, max = 100, round = 0) {
let value = ((x * x * Math.PI * Math.E * (max + 1) * (Math.sin(x) / Math.cos(x * x))) % (max + 1 - min)) + min;
value = value > max ? max : value;
value = value < min ? min : value;
if (round !== 0) {
value = parseFloat(value.toFixed(round));
} else {
value = Math.floor(value);
}
return value;
}
eleventyConfig.addFilter("random_date_ago", function (x, daysAgo = 100) {
const today = new Date();
const randomDaysAgo = randomNumber(x, 0, daysAgo);
today.setDate(today.getDate() - randomDaysAgo);
return today;
});
eleventyConfig.addFilter("random_date", function (x, startDate = null, endDate = null) {
const start = new Date(startDate ? startDate : '2024-01-01').getTime() / 1000;
const end = new Date(endDate ? endDate : '2024-12-30').getTime() / 1000;
const randomTimestamp = randomNumber(x, start, end);
return new Date(randomTimestamp * 1000);
});
eleventyConfig.addFilter("random_item", function (x, items) {
const index = randomNumber(x, 0, items.length - 1);
return items[index];
});
eleventyConfig.addFilter("random_number", randomNumber);
eleventyConfig.addFilter("first_letters", function capitalizeFirstLetter(string) {
return string.split(' ').map(word => word.charAt(0)).join('');
})
eleventyConfig.addFilter("uc_first", function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
})
eleventyConfig.addFilter("size", function (elem) {
if (elem instanceof Object) {
return Object.keys(elem).length;
}
return elem.length;
})
eleventyConfig.addFilter("first", function (elem) {
if (elem instanceof Object) {
return elem[Object.keys(elem)[0]];
}
return elem[0];
})
// time ago from today
eleventyConfig.addFilter("timeago", function (date) {
const seconds = Math.floor((new Date() - date) / 1000);
let interval = Math.floor(seconds / 31536000);
if (interval > 1) {
return interval + " years ago";
}
interval = Math.floor(seconds / 2592000);
if (interval > 1) {
return interval + " months ago";
}
interval = Math.floor(seconds / 86400);
if (interval > 1) {
return interval + " days ago";
}
interval = Math.floor(seconds / 3600);
if (interval > 1) {
return interval + " hours ago";
}
interval = Math.floor(seconds / 60);
if (interval > 1) {
return interval + " minutes ago";
}
if (seconds > 0) {
return Math.floor(seconds) + " seconds ago";
}
return "now";
})
/** /**
* Shortcodes * Shortcodes

View File

@@ -1,12 +1,12 @@
{ {
"name": "@tabler/preview", "name": "@tabler/preview",
"version": "1.4.0", "version": "1.3.2",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run html", "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run html",
"dev": "pnpm run clean && pnpm run watch", "dev": "pnpm run clean && pnpm run watch",
"watch": "concurrently \"pnpm run watch-html\" \"pnpm run watch-css\" \"pnpm run watch-js\"", "watch": "concurrently \"pnpm run watch-html\" \"pnpm run watch-css\" \"pnpm run watch-js\"",
"watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --watch --incremental", "watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --incremental",
"watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js\"", "watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js\"",
"watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"", "watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"",
"css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify", "css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify",
@@ -31,13 +31,13 @@
"zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip demo/*" "zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip demo/*"
}, },
"devDependencies": { "devDependencies": {
"@11ty/eleventy": "3.1.0", "@11ty/eleventy": "^3.1.0",
"imageoptim-cli": "^3.1.9", "imageoptim-cli": "^3.1.9",
"request": "^2.88.2" "request": "^2.88.2"
}, },
"dependencies": { "dependencies": {
"@tabler/core": "workspace:*", "@tabler/core": "workspace:*",
"@tabler/icons": "^3.34.1" "@tabler/icons": "^3.31.0"
}, },
"prettier": { "prettier": {
"tabWidth": 2, "tabWidth": 2,

View File

@@ -6,7 +6,7 @@ layout: default
permalink: activity.html permalink: activity.html
--- ---
<div class="row"> <div class="row justify-content-center">
<div class="col-8"> <div class="col-8">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">

View File

@@ -7,177 +7,91 @@ permalink: buttons.html
--- ---
<div class="row row-cards"> <div class="row row-cards">
<div class="col-md-6"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Standard Buttons</h3> <h3 class="card-title">Standard Buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> {% include "parts/buttons-table.html" show-link=true show-states=true %}
{% for color in site.themeColors %}
<a class="btn btn-{{ color[0] }}">{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Outline Buttons</h3> <h3 class="card-title">Outline Buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> <p>Use <code>.btn-outline-*</code> class for outline buttons.
{% for color in site.themeColors %} </p>
<a class="btn btn-outline btn-{{ color[0] }}">{% include "ui/icon.html" {% include "parts/buttons-table.html" prefix="btn-outline-" show-states=true %}
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Ghost Buttons</h3> <h3 class="card-title">Ghost Buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> <p>Use <code>.btn-ghost-*</code> class for ghost buttons.
{% for color in site.themeColors %} </p>
<a class="btn btn-ghost btn-{{ color[0] }}">{% include "ui/icon.html" {% include "parts/buttons-table.html" prefix="btn-ghost-" show-states=true %}
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Square Buttons</h3> <h3 class="card-title">Square Buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> <p>Use <code>.btn-square</code> class for square buttons.
{% for color in site.themeColors %} </p>
<a class="btn btn-square btn-{{ color[0] }}"> {% include "parts/buttons-table.html" class="btn-square" show-states=true %}
{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}
</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Pill Buttons</h3> <h3 class="card-title">Pill Buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> <p>Use <code>.btn-pill</code> class for pill buttons.
{% for color in site.themeColors %} </p>
<a class="btn btn-pill btn-{{ color[0] }}"> {% include "parts/buttons-table.html" class="btn-pill" show-states=true %}
{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}
</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Extra colors</h3> <h3 class="card-title">Extra colors</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> {% include "parts/buttons-table.html" variants=site.colors hide-labels=true icon="star" auto-columns=true %}
{% for color in site.colors %}
<a class="btn btn-{{ color[0] }}">{% include "ui/icon.html"
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Icon buttons</h3> <h3 class="card-title">Icon buttons</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> {% include "parts/buttons-table.html" variants=site.socialColors hide-labels=true icon-only=true auto-columns=true %}
{% for app in site.socialColors %}
<a class="btn btn-icon btn-{{ app[0] }}">{% include "ui/icon.html" icon=app[1].icon %}</a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> <div class="col-12">
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Social colors</h3> <h3 class="card-title">Social colors</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="btn-list"> {% include "parts/buttons-table.html" variants=site.socialColors hide-labels=true icon=true auto-columns=true %}
{% for app in site.socialColors %}
<a class="btn btn-{{ app[0] }}">{% include "ui/icon.html" icon=app[1].icon %} {{ app[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
{% assign actions = 'edit,copy,settings,clipboard,x' | split: ',' %}
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Action buttons</h3>
</div>
<div class="card-body">
<div class="btn-actions">
{% for action in actions %}
<a class="btn btn-action">{% include "ui/icon.html" icon=action %}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons with icon</h3>
</div>
<div class="card-body">
<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>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons size</h3>
</div>
<div class="card-body">
<div class="space-y">
{% assign sizes = 'sm,md,lg,xl' | split: ',' %}
{% for size in sizes %}
<div class="btn-list">
{% include "ui/button.html" size=size text="Button" %}
{% include "ui/button.html" size=size icon="star" icon-only %}
{% include "ui/button.html" size=size icon="star" text="Button" %}
{% include "ui/button.html" size=size icon-end="star" text="Button" %}
</div>
{% endfor %}
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -62,13 +62,13 @@ permalink: cards.html
</div> </div>
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
<div class="card card-rotate-end"> <div class="card card-rotate-right">
<div class="card-body">Card rotate end</div> <div class="card-body">Card rotate right</div>
</div> </div>
</div> </div>
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
<div class="card card-rotate-start"> <div class="card card-rotate-left">
<div class="card-body">Card rotate start</div> <div class="card-body">Card rotate left</div>
</div> </div>
</div> </div>
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
@@ -127,7 +127,7 @@ permalink: cards.html
{% include "cards/card.html" status-bottom="success" title="Card with bottom status" %} {% include "cards/card.html" status-bottom="success" title="Card with bottom status" %}
</div> </div>
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
{% include "cards/card.html" status-start="primary" title="Card with side status" %} {% include "cards/card.html" status-left="primary" title="Card with side status" %}
</div> </div>
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">

Some files were not shown because too many files have changed in this diff Show More