feat: initial commit - Band Management application

This commit is contained in:
2026-01-06 03:11:46 +01:00
commit 34e12e00b3
24543 changed files with 3991790 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
>= 0.5%
last 4 major versions

View File

@@ -0,0 +1,24 @@
{
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jquery": true
},
"plugins": ["prettier"],
"extends": ["airbnb-base", "plugin:prettier/recommended"],
"rules": {
"prettier/prettier": "error",
"no-underscore-dangle": "off",
"semi": ["error", "never"],
"arrow-parens": ["error", "as-needed"],
"no-param-reassign": "off",
"no-plusplus": [
"error",
{
"allowForLoopAfterthoughts": true
}
],
"no-cond-assign": ["error", "except-parens"]
}
}

View File

@@ -0,0 +1,209 @@
* text eol=lf
## GITATTRIBUTES FOR WEB PROJECTS
#
# These settings are for any web project.
#
# Details per file setting:
# text These files should be normalized (i.e. convert CRLF to LF).
# binary These files are binary and should be left untouched.
#
# Note that binary is a macro for -text -diff.
######################################################################
# Auto detect
## Handle line endings automatically for files detected as
## text and leave all files detected as binary untouched.
## This will handle all files NOT defined below.
* text=auto
# Source code
*.bash text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.coffee text
*.css text diff=css
*.htm text diff=html
*.html text diff=html
*.inc text
*.ini text
*.js text
*.json text
*.jsx text
*.less text
*.ls text
*.map text -diff
*.od text
*.onlydata text
*.php text diff=php
*.pl text
*.ps1 text eol=crlf
*.py text diff=python
*.rb text diff=ruby
*.sass text
*.scm text
*.scss text diff=css
*.sh text eol=lf
.husky/* text eol=lf
*.sql text
*.styl text
*.tag text
*.ts text
*.tsx text
*.xml text
*.xhtml text diff=html
# Docker
Dockerfile text
# Documentation
*.ipynb text eol=lf
*.markdown text diff=markdown
*.md text diff=markdown
*.mdwn text diff=markdown
*.mdown text diff=markdown
*.mkd text diff=markdown
*.mkdn text diff=markdown
*.mdtxt text
*.mdtext text
*.txt text
AUTHORS text
CHANGELOG text
CHANGES text
CONTRIBUTING text
COPYING text
copyright text
*COPYRIGHT* text
INSTALL text
license text
LICENSE text
NEWS text
readme text
*README* text
TODO text
# Templates
*.dot text
*.ejs text
*.erb text
*.haml text
*.handlebars text
*.hbs text
*.hbt text
*.jade text
*.latte text
*.mustache text
*.njk text
*.phtml text
*.svelte text
*.tmpl text
*.tpl text
*.twig text
*.vue text
# Configs
*.cnf text
*.conf text
*.config text
.editorconfig text
.env text
.gitattributes text
.gitconfig text
.htaccess text
*.lock text -diff
package.json text eol=lf
package-lock.json text eol=lf -diff
pnpm-lock.yaml text eol=lf -diff
.prettierrc text
yarn.lock text -diff
*.toml text
*.yaml text
*.yml text
browserslist text
Makefile text
makefile text
# Heroku
Procfile text
# Graphics
*.ai binary
*.bmp binary
*.eps binary
*.gif binary
*.gifv binary
*.ico binary
*.jng binary
*.jp2 binary
*.jpg binary
*.jpeg binary
*.jpx binary
*.jxr binary
*.pdf binary
*.png binary
*.psb binary
*.psd binary
# SVG treated as an asset (binary) by default.
# *.svg text
# If you want to treat it as binary,
# use the following line instead.
*.svg binary
*.svgz binary
*.tif binary
*.tiff binary
*.wbmp binary
*.webp binary
# Audio
*.kar binary
*.m4a binary
*.mid binary
*.midi binary
*.mp3 binary
*.ogg binary
*.ra binary
# Video
*.3gpp binary
*.3gp binary
*.as binary
*.asf binary
*.asx binary
*.avi binary
*.fla binary
*.flv binary
*.m4v binary
*.mng binary
*.mov binary
*.mp4 binary
*.mpeg binary
*.mpg binary
*.ogv binary
*.swc binary
*.swf binary
*.webm binary
# Archives
*.7z binary
*.gz binary
*.jar binary
*.rar binary
*.tar binary
*.zip binary
# Fonts
*.ttf binary
*.eot binary
*.otf binary
*.woff binary
*.woff2 binary
# Executables
*.exe binary
*.pyc binary
# RC files (like .babelrc or .eslintrc)
*.*rc text
# Ignore files (like .npmignore or .gitignore)
*.*ignore text

View File

@@ -0,0 +1,29 @@
{
"arrowParens": "avoid",
"bracketSpacing": true,
"bracketSameLine": true,
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxSingleQuote": true,
"printWidth": 120,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "none",
"useTabs": false,
"endOfLine": "lf",
"embeddedLanguageFormatting": "auto",
"overrides": [
{
"files": [
"js/**/*.js"
],
"options": {
"semi": false
}
}
]
}

View File

@@ -0,0 +1,4 @@
dist
node_modules
build
_temp/

View File

@@ -0,0 +1,133 @@
{
"extends": [
"stylelint-config-standard-scss",
"stylelint-config-idiomatic-order",
"@stylistic/stylelint-config"
],
"plugins": [
"stylelint-use-logical-spec",
"@stylistic/stylelint-plugin"
],
"rules": {
"alpha-value-notation": null,
"at-rule-empty-line-before": null,
"block-no-empty": null,
"color-function-notation": null,
"color-named": "never",
"custom-property-empty-line-before": null,
"custom-property-pattern": null,
"declaration-block-no-redundant-longhand-properties": null,
"declaration-empty-line-before": null,
"declaration-no-important": null,
"font-family-no-missing-generic-family-keyword": [
true,
{
"ignoreFontFamilies": [
"boxicons",
"tabler-icons",
"remix-icons"
]
}
],
"font-weight-notation": [
"numeric",
{
"ignore": [
"relative"
]
}
],
"function-url-no-scheme-relative": true,
"liberty/use-logical-spec": true,
"media-feature-range-notation": null,
"media-query-no-invalid": null,
"no-descending-specificity": null,
"no-invalid-double-slash-comments": true,
"no-invalid-position-at-import-rule": null,
"number-max-precision": null,
"rule-empty-line-before": null,
"selector-class-pattern": null,
"selector-id-pattern": null,
"selector-max-attribute": 2,
"selector-max-id": 1,
"selector-max-specificity": null,
"selector-not-notation": null,
"scss/at-extend-no-missing-placeholder": null,
"scss/at-function-named-arguments": "never",
"scss/at-if-closing-brace-newline-after": null,
"scss/at-if-closing-brace-space-after": null,
"scss/at-if-no-null": null,
"scss/at-mixin-pattern": null,
"scss/at-mixin-argumentless-call-parentheses": "always",
"scss/at-rule-conditional-no-parentheses": null,
"scss/comment-no-empty": null,
"scss/dimension-no-non-numeric-values": true,
"scss/dollar-variable-empty-line-before": null,
"scss/dollar-variable-pattern": null,
"scss/double-slash-comment-empty-line-before": null,
"scss/double-slash-comment-whitespace-inside": null,
"scss/function-quote-no-quoted-strings-inside": null,
"scss/media-feature-value-dollar-variable": null,
"scss/no-global-function-names": null,
"@stylistic/at-rule-name-space-after": "always",
"@stylistic/at-rule-semicolon-space-before": "never",
"@stylistic/block-closing-brace-empty-line-before": null,
"@stylistic/block-closing-brace-newline-after": [
"always",
{
"ignoreAtRules": [
"if",
"else"
]
}
],
"@stylistic/block-opening-brace-space-before": null,
"@stylistic/declaration-block-semicolon-newline-before": "never-multi-line",
"@stylistic/indentation": 2,
"@stylistic/max-empty-lines": 2,
"@stylistic/max-line-length": [
220,
{
"ignore": "comments"
}
],
"@stylistic/no-eol-whitespace": true,
"@stylistic/number-leading-zero": "never",
"@stylistic/selector-list-comma-newline-before": "never-multi-line",
"@stylistic/selector-list-comma-space-after": "always-single-line",
"@stylistic/selector-list-comma-space-before": "never-single-line",
"@stylistic/unicode-bom": "never"
},
"overrides": [
{
"files": [
"**/_bootstrap-extended/**/*.scss"
],
"rules": {
"declaration-property-value-disallowed-list": {
"border": "none",
"outline": "none"
},
"function-disallowed-list": [
"lighten",
"darken"
],
"property-disallowed-list": [
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"transition"
],
"scss/dollar-variable-default": [
true,
{
"ignore": "local"
}
],
"scss/selector-no-union-class-name": true
}
}
]
}

View File

@@ -0,0 +1,15 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"formulahendry.auto-close-tag",
"formulahendry.auto-rename-tag",
"abusaidm.html-snippets",
"syler.sass-indented",
"mrmlnc.vscode-scss",
"gamunu.vscode-yarn",
"zignd.html-css-class-completion",
"stylelint.vscode-stylelint",
]
}

View File

@@ -0,0 +1,67 @@
{
"editor.wordWrap": "off",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
},
"files.trimFinalNewlines": true,
"diffEditor.ignoreTrimWhitespace": true,
"search.exclude": {
"**/node_modules": true,
"*.min.js": true,
"*.min.css": true
},
// JS
"javascript.updateImportsOnFileMove.enabled": "always",
// JSON
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
"[jsonc]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
// Extension: Prettier
"prettier.requireConfig": true,
"prettier.configPath": ".prettierrc.json",
"prettier.ignorePath": ".prettierignore",
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
// Extension: Stylelint
"stylelint.packageManager": "pnpm",
"stylelint.validate": [
"scss"
],
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
// Extension: Git
"git.rebaseWhenSync": true,
"git.enableSmartCommit": true,
// Extension: ESLint
"eslint.packageManager": "yarn",
"eslint.format.enable": true,
// "eslint.workingDirectories": [
// "src",
// "dev"
// ],
"eslint.options": {
"overrideConfigFile": ".eslintrc.json"
},
"eslint.validate": [
"vue",
"html",
"javascript",
"typescript",
"javascriptreact",
"typescriptreact"
],
// Extension: npm
"npm.packageManager": "yarn",
}

View File

@@ -0,0 +1,105 @@
/*
* demo.css
* File include item demo only specific css only
******************************************************************************/
.menu .app-brand.demo {
height: 64px;
}
.app-brand-logo.demo svg {
width: 34px;
height: 24px;
}
.app-brand-text.demo {
font-size: 1.375rem;
}
/* ! For .layout-navbar-fixed added fix padding top to .layout-page */
/* Default navbar */
.layout-navbar-fixed .layout-wrapper:not(.layout-without-menu) .layout-page {
padding-top: 64px !important;
}
.layout-navbar-fixed .layout-wrapper:not(.layout-horizontal):not(.layout-without-menu) .layout-page {
padding-top: 72px !important;
}
/* Navbar page z-index issue solution */
.content-wrapper .navbar {
z-index: auto;
}
/*
* Content
******************************************************************************/
.demo-blocks > * {
display: block !important;
}
.demo-inline-spacing > * {
margin: 1rem 0.375rem 0 0 !important;
}
/* ? .demo-vertical-spacing class is used to have vertical margins between elements. To remove margin-top from the first-child, use .demo-only-element class with .demo-vertical-spacing class. For example, we have used this class in forms-input-groups.html file. */
.demo-vertical-spacing > * {
margin-top: 1rem !important;
margin-bottom: 0 !important;
}
.demo-vertical-spacing.demo-only-element > :first-child {
margin-top: 0 !important;
}
.demo-vertical-spacing-lg > * {
margin-top: 1.875rem !important;
margin-bottom: 0 !important;
}
.demo-vertical-spacing-lg.demo-only-element > :first-child {
margin-top: 0 !important;
}
.demo-vertical-spacing-xl > * {
margin-top: 5rem !important;
margin-bottom: 0 !important;
}
.demo-vertical-spacing-xl.demo-only-element > :first-child {
margin-top: 0 !important;
}
/* Dropdown buttons going out of small screens */
@media (max-width: 576px) {
#dropdown-variation-demo .btn-group .text-truncate {
width: 254px;
position: relative;
}
#dropdown-variation-demo .btn-group .text-truncate::after {
position: absolute;
top: 45%;
right: 0.65rem;
}
}
/*
* Layout demo
******************************************************************************/
.layout-demo-wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
margin-top: 1rem;
}
.layout-demo-placeholder img {
width: 900px;
}
.layout-demo-info {
text-align: center;
margin-top: 1rem;
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="64.7547" y="4.67169" x="19.4209"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="22.3447"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="65.5146"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="71.4014"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="77.2881"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="40.2264" y="19.6135" x="44.3525"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="19.0455" y="19.6135" x="19.4209"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="65.1591" y="42.4545" x="19.4209"></rect></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="90.6244" y="4.67169" x="6.6875"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="4.90566" y="6.87164" x="10.165"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="4.90566" y="6.87164" x="75.2002"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="4.90566" y="6.87164" x="82.0674"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="4.90566" y="6.87164" x="88.9346"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="55.9476" y="19.6135" x="41.3652"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="26.4888" y="19.6135" x="6.6875"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="90.6244" y="42.4545" x="6.6875"></rect></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="57.5885" width="24.0976" y="4.12146" x="5.20215"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="13.8545" y="16.8697" x="10.3232"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="9.87943" y="25.5618" x="10.3232"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="12.3826" y="34.2538" x="10.3232"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="6.08818" y="42.946" x="10.3232"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="8.09094" y="51.6384" x="10.3232"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="57.5885" width="62.3885" y="4.12134" x="35.5137"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="13.8545" y="14.1833" x="43.7578"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="32.8013" y="22.8753" x="43.7578"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="41.2076" y="31.5674" x="43.7578"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="32.8013" y="40.2593" x="43.7578"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="5.77482" y="48.9517" x="43.7578"></rect></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="57.5885" width="24.0976" y="4.12134" x="73.4756"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="13.8545" y="16.8697" x="78.5986"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="9.87943" y="25.5618" x="82.5713"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="12.3826" y="34.2537" x="80.0693"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="6.08818" y="42.9459" x="86.3633"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="8.09094" y="51.6382" x="84.3613"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="57.5885" width="62.3885" y="4.12146" x="5.20215"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="13.8545" y="14.1833" x="45.709"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="32.8013" y="22.8754" x="26.7617"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="41.2076" y="31.5674" x="18.3555"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="32.8013" y="40.2594" x="26.7617"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.04605" height="2.0921" width="5.77482" y="48.9517" x="53.7881"></rect></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98">
<rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="64.7547" y="4.67169" x="19.4209"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="22.3447"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="65.5146"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="71.4014"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87164" x="77.2881"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="40.2264" y="19.6135" x="44.3525"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="19.0455" y="19.6135" x="19.4209"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="65.1591" y="42.4545" x="19.4209"></rect>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="46.8212" y="19.6136" x="44.0068"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="22.1679" y="19.6136" x="14.9854"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="75.8413" y="42.4547" x="14.9854"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="9.00999" width="74.1506" y="4.68896" x="14.9248"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="5.38019" width="6.00327" y="6.50403" x="20.0264"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="33.877"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="48.3652"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="62.8506"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="77.3379"></rect></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><path fill-opacity="0.04" fill="currentColor" d="M0 4C0 1.79086 1.79086 0 4 0H13.7359V66H4C1.79086 66 0 64.2091 0 62V4Z"></path><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="23.8839" x="2.94336"></rect><rect fill-opacity="0.3" fill="currentColor" rx="2" height="6.79412" width="6.86793" y="5.88135" x="3.43359"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="34.4382" x="2.94336"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="44.9923" x="2.94336"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="55.5463" x="2.94336"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="75.437" y="4.67169" x="21.4717"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="25.6172"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="78.248"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="84.1348"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="90.0215"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="46.8212" y="19.6134" x="50.4912"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="22.1679" y="19.6134" x="21.4717"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="75.8413" y="42.4545" x="21.4717"></rect></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><path fill-opacity="0.08" fill="currentColor" d="M0 4C0 1.79086 1.79086 0 4 0H27.4717V66H4C1.79086 66 0 64.2091 0 62V4Z"></path><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="23.8839" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="2" height="9.70588" width="9.81132" y="5.88135" x="8.83008"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="34.4381" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="44.9923" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="55.5462" x="4.90625"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="64.7547" y="4.67166" x="34.1152"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="37.0391"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="80.21"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="86.0957"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="91.9824"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="40.2264" y="19.6134" x="58.4844"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="19.0455" y="19.6134" x="34.1152"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="64.7547" y="42.4545" x="34.1152"></rect></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98">
<rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="46.8212" y="19.6136" x="44.0068"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="22.1679" y="19.6136" x="14.9854"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="75.8413" y="42.4547" x="14.9854"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="9.00999" width="74.1506" y="4.68896" x="14.9248"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="5.38019" width="6.00327" y="6.50403" x="20.0264"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="33.877"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="48.3652"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="62.8506"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.23064" height="2.46129" width="6.6372" y="7.96356" x="77.3379"></rect>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98">
<rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect>
<path fill-opacity="0.06" fill="currentColor" d="M0 4C0 1.79086 1.79086 0 4 0H13.7359V66H4C1.79086 66 0 64.2091 0 62V4Z"></path>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="23.8839" x="2.94336"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="2" height="6.79412" width="6.86793" y="5.88135" x="3.43359"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="34.4382" x="2.94336"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="44.9923" x="2.94336"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="7.84906" y="55.5463" x="2.94336"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="75.437" y="4.67169" x="21.4717"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="25.6172"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="78.248"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="84.1348"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="90.0215"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="46.8212" y="19.6134" x="50.4912"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="22.1679" y="19.6134" x="21.4717"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="75.8413" y="42.4545" x="21.4717"></rect>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98">
<rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect>
<path fill-opacity="0.08" fill="currentColor" d="M0 4C0 1.79086 1.79086 0 4 0H27.4717V66H4C1.79086 66 0 64.2091 0 62V4Z"></path>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="23.8839" x="4.90625"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="2" height="9.70588" width="9.81132" y="5.88135" x="8.83008"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="34.4382" x="4.90625"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="44.9923" x="4.90625"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="55.5463" x="4.90625"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="64.7547" y="4.67169" x="32.1523"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="35.0781"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="78.248"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="84.1348"></rect>
<rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="90.0215"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="40.2264" y="19.6134" x="57.0859"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="19.0455" y="19.6134" x="32.1523"></rect>
<rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="65.1591" y="42.4545" x="32.1523"></rect>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="23.8839" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="2" height="9.70588" width="9.81132" y="5.88135" x="8.83008"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="34.4381" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="44.9923" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="55.5462" x="4.90625"></rect><rect stroke-opacity="0.12" stroke="currentColor" rx="1.5" height="7.8" width="63.7547" y="5.17166" x="34.6152"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="37.0391"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="80.21"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="86.0957"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="91.002"></rect><rect stroke-opacity="0.12" stroke="currentColor" rx="1.5" height="16.6" width="39.2264" y="20.1134" x="58.9844"></rect><rect stroke-opacity="0.12" stroke="currentColor" rx="1.5" height="16.6" width="18.0455" y="20.1134" x="34.6152"></rect><rect stroke-opacity="0.12" stroke="currentColor" rx="1.5" height="16.6" width="63.7547" y="42.9545" x="34.6152"></rect></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 104 66" height="62" width="98"><rect fill-opacity="0.02" fill="currentColor" rx="4" height="66" width="104"></rect><path fill-opacity="0.08" fill="currentColor" d="M0 4C0 1.79086 1.79086 0 4 0H27.4717V66H4C1.79086 66 0 64.2091 0 62V4Z"></path><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="23.8839" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="2" height="9.70588" width="9.81132" y="5.88135" x="8.83008"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="34.4381" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="44.9923" x="4.90625"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1.39473" height="2.78946" width="17.6604" y="55.5462" x="4.90625"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="8.8" width="64.7547" y="4.67166" x="34.1152"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="37.0391"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="80.21"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="86.0957"></rect><rect fill-opacity="0.3" fill="currentColor" rx="1" height="4.4" width="3.92453" y="6.87158" x="91.9824"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="40.2264" y="19.6134" x="58.4844"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="19.0455" y="19.6134" x="34.1152"></rect><rect fill-opacity="0.08" fill="currentColor" rx="2" height="17.6" width="64.7547" y="42.4545" x="34.1152"></rect></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,99 @@
/**
* Config
* -------------------------------------------------------------------------------------
* ! IMPORTANT: Make sure you clear the browser local storage In order to see the config changes in the template.
* ! To clear local storage: (https://www.leadshook.com/help/how-to-clear-local-storage-in-google-chrome-browser/).
*/
'use strict';
/* JS global variables
!Please use the hex color code (#000) here. Don't use rgba(), hsl(), etc
*/
window.config = {
// global color variables for charts except chartjs
colors: {
primary: window.Helpers.getCssVar('primary'),
secondary: window.Helpers.getCssVar('secondary'),
success: window.Helpers.getCssVar('success'),
info: window.Helpers.getCssVar('info'),
warning: window.Helpers.getCssVar('warning'),
danger: window.Helpers.getCssVar('danger'),
dark: window.Helpers.getCssVar('dark'),
black: window.Helpers.getCssVar('pure-black'),
white: window.Helpers.getCssVar('white'),
cardColor: window.Helpers.getCssVar('paper-bg'),
bodyBg: window.Helpers.getCssVar('body-bg'),
bodyColor: window.Helpers.getCssVar('body-color'),
headingColor: window.Helpers.getCssVar('heading-color'),
textMuted: window.Helpers.getCssVar('secondary-color'),
borderColor: window.Helpers.getCssVar('border-color')
},
colors_label: {
primary: window.Helpers.getCssVar('primary-bg-subtle'),
secondary: window.Helpers.getCssVar('secondary-bg-subtle'),
success: window.Helpers.getCssVar('success-bg-subtle'),
info: window.Helpers.getCssVar('info-bg-subtle'),
warning: window.Helpers.getCssVar('warning-bg-subtle'),
danger: window.Helpers.getCssVar('danger-bg-subtle'),
dark: window.Helpers.getCssVar('dark-bg-subtle')
},
fontFamily: window.Helpers.getCssVar('font-family-base'),
enableMenuLocalStorage: true // Enable menu state with local storage support
};
window.assetsPath = document.documentElement.getAttribute('data-assets-path');
window.templateName = document.documentElement.getAttribute('data-template');
/**
* TemplateCustomizer
* ! You must use(include) template-customizer.js to use TemplateCustomizer settings
* -----------------------------------------------------------------------------------------------
*/
/**
* TemplateCustomizer settings
* -------------------------------------------------------------------------------------
* displayCustomizer: true(Show customizer), false(Hide customizer)
* lang: To set default language, Add more languages and set default. Fallback language is 'en'
* defaultPrimaryColor: '#7367F0' | Set default primary color
* defaultSkin: 0(Default), 1(Bordered)
* defaultTheme: 'light', 'dark', 'system'
* defaultSemiDark: true, false (For dark menu only)
* defaultContentLayout: 'compact', 'wide' (compact=container-xxl, wide=container-fluid)
* defaultHeaderType: 'static', 'fixed' (for horizontal layout only)
* defaultMenuCollapsed: true, false (For vertical layout only)
* defaultNavbarType: 'sticky', 'static', 'hidden' (For vertical layout only)
* defaultTextDir: 'ltr', 'rtl' (Direction)
* defaultFooterFixed: true, false (For vertical layout only)
* defaultShowDropdownOnHover : true, false (for horizontal layout only)
* controls: [ 'color', 'theme', 'skins', 'semiDark', 'layoutCollapsed', 'layoutNavbarOptions', 'headerType', 'contentLayout', 'rtl' ] | Show/Hide customizer controls
*/
if (typeof TemplateCustomizer !== 'undefined') {
window.templateCustomizer = new TemplateCustomizer({
displayCustomizer: true,
lang: localStorage.getItem('templateCustomizer-' + templateName + '--Lang') || 'en', // Set default language here
// defaultPrimaryColor: '#D11BB4',
// defaultSkin: 1,
// defaultTheme: 'system',
// defaultSemiDark: true,
// defaultContentLayout: 'wide',
// defaultHeaderType: 'static',
// defaultMenuCollapsed: true,
// defaultNavbarType: 'static',
// defaultTextDir: 'rtl',
// defaultFooterFixed: false,
// defaultShowDropdownOnHover: false,
controls: [
'color',
'theme',
'skins',
'semiDark',
'layoutCollapsed',
'layoutNavbarOptions',
'headerType',
'contentLayout',
'rtl'
]
});
}

View File

@@ -0,0 +1,715 @@
/**
* Main
*/
'use strict';
window.isRtl = window.Helpers.isRtl();
window.isDarkStyle = window.Helpers.isDarkStyle();
let menu,
animate,
isHorizontalLayout = false;
if (document.getElementById('layout-menu')) {
isHorizontalLayout = document.getElementById('layout-menu').classList.contains('menu-horizontal');
}
document.addEventListener('DOMContentLoaded', function () {
// class for ios specific styles
if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
document.body.classList.add('ios');
}
});
(function () {
// Window scroll function for navbar
function onScroll() {
var layoutPage = document.querySelector('.layout-page');
if (layoutPage) {
if (window.scrollY > 0) {
layoutPage.classList.add('window-scrolled');
} else {
layoutPage.classList.remove('window-scrolled');
}
}
}
// On load time out
setTimeout(() => {
onScroll();
}, 200);
// On window scroll
window.onscroll = function () {
onScroll();
};
setTimeout(function () {
window.Helpers.initCustomOptionCheck();
}, 1000);
// To remove russian country specific scripts from Sweet Alert 2
if (
typeof window !== 'undefined' &&
/^ru\b/.test(navigator.language) &&
location.host.match(/\.(ru|su|by|xn--p1ai)$/)
) {
localStorage.removeItem('swal-initiation');
document.body.style.pointerEvents = 'system';
setInterval(() => {
if (document.body.style.pointerEvents === 'none') {
document.body.style.pointerEvents = 'system';
}
}, 100);
HTMLAudioElement.prototype.play = function () {
return Promise.resolve();
};
}
if (typeof Waves !== 'undefined') {
Waves.init();
Waves.attach(
".btn[class*='btn-']:not(.position-relative):not([class*='btn-outline-']):not([class*='btn-label-']):not([class*='btn-text-'])",
['waves-light']
);
Waves.attach("[class*='btn-outline-']:not(.position-relative)");
Waves.attach("[class*='btn-label-']:not(.position-relative)");
Waves.attach("[class*='btn-text-']:not(.position-relative)");
Waves.attach('.pagination:not([class*="pagination-outline-"]) .page-item.active .page-link', ['waves-light']);
Waves.attach('.pagination .page-item .page-link');
Waves.attach('.dropdown-menu .dropdown-item');
Waves.attach('[data-bs-theme="light"] .list-group .list-group-item-action');
Waves.attach('[data-bs-theme="dark"] .list-group .list-group-item-action', ['waves-light']);
Waves.attach('.nav-tabs:not(.nav-tabs-widget) .nav-item .nav-link');
Waves.attach('.nav-pills .nav-item .nav-link', ['waves-light']);
}
// Initialize menu
//-----------------
let layoutMenuEl = document.querySelectorAll('#layout-menu');
layoutMenuEl.forEach(function (element) {
menu = new Menu(element, {
orientation: isHorizontalLayout ? 'horizontal' : 'vertical',
closeChildren: isHorizontalLayout ? true : false,
// ? This option only works with Horizontal menu
showDropdownOnHover: localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') // If value(showDropdownOnHover) is set in local storage
? localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') === 'true' // Use the local storage value
: window.templateCustomizer !== undefined // If value is set in config.js
? window.templateCustomizer.settings.defaultShowDropdownOnHover // Use the config.js value
: true // Use this if you are not using the config.js and want to set value directly from here
});
// Change parameter to true if you want scroll animation
window.Helpers.scrollToActive((animate = false));
window.Helpers.mainMenu = menu;
});
// Initialize menu togglers and bind click on each
let menuToggler = document.querySelectorAll('.layout-menu-toggle');
menuToggler.forEach(item => {
item.addEventListener('click', event => {
event.preventDefault();
window.Helpers.toggleCollapsed();
// Enable menu state with local storage support if enableMenuLocalStorage = true from config.js
if (config.enableMenuLocalStorage && !window.Helpers.isSmallScreen()) {
try {
localStorage.setItem(
'templateCustomizer-' + templateName + '--LayoutCollapsed',
String(window.Helpers.isCollapsed())
);
// Update customizer checkbox state on click of menu toggler
let layoutCollapsedCustomizerOptions = document.querySelector('.template-customizer-layouts-options');
if (layoutCollapsedCustomizerOptions) {
let layoutCollapsedVal = window.Helpers.isCollapsed() ? 'collapsed' : 'expanded';
layoutCollapsedCustomizerOptions.querySelector(`input[value="${layoutCollapsedVal}"]`).click();
}
} catch (e) {}
}
});
});
// Menu swipe gesture
// Detect swipe gesture on the target element and call swipe In
window.Helpers.swipeIn('.drag-target', function (e) {
window.Helpers.setCollapsed(false);
});
// Detect swipe gesture on the target element and call swipe Out
window.Helpers.swipeOut('#layout-menu', function (e) {
if (window.Helpers.isSmallScreen()) window.Helpers.setCollapsed(true);
});
// Display in main menu when menu scrolls
let menuInnerContainer = document.getElementsByClassName('menu-inner'),
menuInnerShadow = document.getElementsByClassName('menu-inner-shadow')[0];
if (menuInnerContainer.length > 0 && menuInnerShadow) {
menuInnerContainer[0].addEventListener('ps-scroll-y', function () {
if (this.querySelector('.ps__thumb-y').offsetTop) {
menuInnerShadow.style.display = 'block';
} else {
menuInnerShadow.style.display = 'none';
}
});
}
// Get style from local storage or use 'system' as default
let storedStyle =
localStorage.getItem('templateCustomizer-' + templateName + '--Theme') || // if no template style then use Customizer style
(window.templateCustomizer?.settings?.defaultStyle ?? document.documentElement.getAttribute('data-bs-theme')); //!if there is no Customizer then use default style as light
// Run switchImage function based on the stored style
window.Helpers.switchImage(storedStyle);
// Update light/dark image based on current style
window.Helpers.setTheme(window.Helpers.getPreferredTheme());
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = window.Helpers.getStoredTheme();
if (storedTheme !== 'light' && storedTheme !== 'dark') {
window.Helpers.setTheme(window.Helpers.getPreferredTheme());
}
});
function getScrollbarWidth() {
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
document.body.style.setProperty('--bs-scrollbar-width', `${scrollbarWidth}px`);
}
getScrollbarWidth();
window.addEventListener('DOMContentLoaded', () => {
window.Helpers.showActiveTheme(window.Helpers.getPreferredTheme());
getScrollbarWidth();
// Toggle Universal Sidebar
window.Helpers.initSidebarToggle();
document.querySelectorAll('[data-bs-theme-value]').forEach(toggle => {
toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-bs-theme-value');
window.Helpers.setStoredTheme(templateName, theme);
window.Helpers.setTheme(theme);
window.Helpers.showActiveTheme(theme, true);
window.Helpers.syncCustomOptions(theme);
let currTheme = theme;
if (theme === 'system') {
currTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
const semiDarkL = document.querySelector('.template-customizer-semiDark');
if (semiDarkL) {
if (theme === 'dark') {
semiDarkL.classList.add('d-none');
} else {
semiDarkL.classList.remove('d-none');
}
}
window.Helpers.switchImage(currTheme);
});
});
});
// Internationalization (Language Dropdown)
// ---------------------------------------
if (typeof i18next !== 'undefined' && typeof i18NextHttpBackend !== 'undefined') {
i18next
.use(i18NextHttpBackend)
.init({
lng: window.templateCustomizer ? window.templateCustomizer.settings.lang : 'en',
debug: false,
fallbackLng: 'en',
backend: {
loadPath: assetsPath + 'json/locales/{{lng}}.json'
},
returnObjects: true
})
.then(function (t) {
localize();
});
}
let languageDropdown = document.getElementsByClassName('dropdown-language');
if (languageDropdown.length) {
let dropdownItems = languageDropdown[0].querySelectorAll('.dropdown-item');
for (let i = 0; i < dropdownItems.length; i++) {
dropdownItems[i].addEventListener('click', function () {
let currentLanguage = this.getAttribute('data-language');
let textDirection = this.getAttribute('data-text-direction');
for (let sibling of this.parentNode.children) {
var siblingEle = sibling.parentElement.parentNode.firstChild;
// Loop through each sibling and push to the array
while (siblingEle) {
if (siblingEle.nodeType === 1 && siblingEle !== siblingEle.parentElement) {
siblingEle.querySelector('.dropdown-item').classList.remove('active');
}
siblingEle = siblingEle.nextSibling;
}
}
this.classList.add('active');
i18next.changeLanguage(currentLanguage, (err, t) => {
window.templateCustomizer ? window.templateCustomizer.setLang(currentLanguage) : '';
directionChange(textDirection);
if (err) return console.log('something went wrong loading', err);
localize();
window.Helpers.syncCustomOptionsRtl(textDirection);
});
});
}
function directionChange(textDirection) {
document.documentElement.setAttribute('dir', textDirection);
if (textDirection === 'rtl') {
if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') !== 'true')
window.templateCustomizer ? window.templateCustomizer.setRtl(true) : '';
} else {
if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') === 'true')
window.templateCustomizer ? window.templateCustomizer.setRtl(false) : '';
}
}
}
function localize() {
let i18nList = document.querySelectorAll('[data-i18n]');
// Set the current language in dd
let currentLanguageEle = document.querySelector('.dropdown-item[data-language="' + i18next.language + '"]');
if (currentLanguageEle) {
currentLanguageEle.click();
}
i18nList.forEach(function (item) {
item.innerHTML = i18next.t(item.dataset.i18n);
/* FIX: Uncomment the following line to hide elements with the i18n attribute before translation to prevent text change flicker */
// item.style.visibility = 'visible';
});
}
// Notification
// ------------
const notificationMarkAsReadAll = document.querySelector('.dropdown-notifications-all');
const notificationMarkAsReadList = document.querySelectorAll('.dropdown-notifications-read');
// Notification: Mark as all as read
if (notificationMarkAsReadAll) {
notificationMarkAsReadAll.addEventListener('click', event => {
notificationMarkAsReadList.forEach(item => {
item.closest('.dropdown-notifications-item').classList.add('marked-as-read');
});
});
}
// Notification: Mark as read/unread onclick of dot
if (notificationMarkAsReadList) {
notificationMarkAsReadList.forEach(item => {
item.addEventListener('click', event => {
item.closest('.dropdown-notifications-item').classList.toggle('marked-as-read');
});
});
}
// Notification: Mark as read/unread onclick of dot
const notificationArchiveMessageList = document.querySelectorAll('.dropdown-notifications-archive');
notificationArchiveMessageList.forEach(item => {
item.addEventListener('click', event => {
item.closest('.dropdown-notifications-item').remove();
});
});
// Init helpers & misc
// --------------------
// Init BS Tooltip
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
// Accordion active class
const accordionActiveFunction = function (e) {
if (e.type == 'show.bs.collapse' || e.type == 'show.bs.collapse') {
e.target.closest('.accordion-item').classList.add('active');
} else {
e.target.closest('.accordion-item').classList.remove('active');
}
};
const accordionTriggerList = [].slice.call(document.querySelectorAll('.accordion'));
const accordionList = accordionTriggerList.map(function (accordionTriggerEl) {
accordionTriggerEl.addEventListener('show.bs.collapse', accordionActiveFunction);
accordionTriggerEl.addEventListener('hide.bs.collapse', accordionActiveFunction);
});
// Auto update layout based on screen size
window.Helpers.setAutoUpdate(true);
// Toggle Password Visibility
window.Helpers.initPasswordToggle();
// Speech To Text
window.Helpers.initSpeechToText();
// Init PerfectScrollbar in Navbar Dropdown (i.e notification)
window.Helpers.initNavbarDropdownScrollbar();
let horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']");
if (horizontalMenuTemplate) {
// if screen size is small then set navbar fixed
if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
window.Helpers.setNavbarFixed('fixed');
} else {
window.Helpers.setNavbarFixed('');
}
}
// On window resize listener
// -------------------------
window.addEventListener(
'resize',
function (event) {
// Horizontal Layout : Update menu based on window size
if (horizontalMenuTemplate) {
// if screen size is small then set navbar fixed
if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
window.Helpers.setNavbarFixed('fixed');
} else {
window.Helpers.setNavbarFixed('');
}
setTimeout(function () {
if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
if (document.getElementById('layout-menu')) {
if (document.getElementById('layout-menu').classList.contains('menu-horizontal')) {
menu.switchMenu('vertical');
}
}
} else {
if (document.getElementById('layout-menu')) {
if (document.getElementById('layout-menu').classList.contains('menu-vertical')) {
menu.switchMenu('horizontal');
}
}
}
}, 100);
}
},
true
);
// Manage menu expanded/collapsed with templateCustomizer & local storage
//------------------------------------------------------------------
// If current layout is horizontal OR current window screen is small (overlay menu) than return from here
if (isHorizontalLayout || window.Helpers.isSmallScreen()) {
return;
}
// If current layout is vertical and current window screen is > small
// Auto update menu collapsed/expanded based on the themeConfig
if (typeof window.templateCustomizer !== 'undefined') {
if (window.templateCustomizer.settings.defaultMenuCollapsed) {
window.Helpers.setCollapsed(true, false);
} else {
window.Helpers.setCollapsed(false, false);
}
if (window.templateCustomizer.settings.semiDark) {
document.querySelector('#layout-menu').setAttribute('data-bs-theme', 'dark');
}
}
// Manage menu expanded/collapsed state with local storage support If enableMenuLocalStorage = true in config.js
if (typeof config !== 'undefined') {
if (config.enableMenuLocalStorage) {
try {
if (localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') !== null)
window.Helpers.setCollapsed(
localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') === 'true',
false
);
} catch (e) {}
}
}
})();
// Search Configuration
const SearchConfig = {
container: '#autocomplete',
placeholder: 'Search [CTRL + K]',
classNames: {
detachedContainer: 'd-flex flex-column',
detachedFormContainer: 'd-flex align-items-center justify-content-between border-bottom',
form: 'd-flex align-items-center',
input: 'search-control border-none',
detachedCancelButton: 'btn-search-close',
panel: 'flex-grow content-wrapper overflow-hidden position-relative',
panelLayout: 'h-100',
clearButton: 'd-none',
item: 'd-block'
}
};
// Search state and data
let data = {};
let currentFocusIndex = -1;
// Utils
function isMacOS() {
return /Mac|iPod|iPhone|iPad/.test(navigator.userAgent);
}
// Load search data
function loadSearchData() {
const searchJson = $('#layout-menu').hasClass('menu-horizontal') ? 'search-horizontal.json' : 'search-vertical.json';
fetch(assetsPath + 'json/' + searchJson)
.then(response => {
if (!response.ok) throw new Error('Failed to fetch data');
return response.json();
})
.then(json => {
data = json;
initializeAutocomplete();
})
.catch(error => console.error('Error loading JSON:', error));
}
// Initialize autocomplete
function initializeAutocomplete() {
const searchElement = document.getElementById('autocomplete');
if (!searchElement) return;
return autocomplete({
...SearchConfig,
openOnFocus: true,
onStateChange({ state, setQuery }) {
// When autocomplete is opened
if (state.isOpen) {
// Hide body scroll and add padding to prevent layout shift
document.body.style.overflow = 'hidden';
document.body.style.paddingRight = 'var(--bs-scrollbar-width)';
// Replace "Cancel" text with icon
const cancelIcon = document.querySelector('.aa-DetachedCancelButton');
if (cancelIcon) {
cancelIcon.innerHTML =
'<span class="text-body-secondary">[esc]</span> <span class="icon-base icon-md ti tabler-x text-heading"></span>';
}
// Perfect Scrollbar
if (!window.autoCompletePS) {
const panel = document.querySelector('.aa-Panel');
if (panel) {
window.autoCompletePS = new PerfectScrollbar(panel);
}
}
} else {
// When autocomplete is closed
if (state.status === 'idle' && state.query) {
setQuery('');
}
// Restore body scroll and padding when autocomplete is closed
document.body.style.overflow = 'auto';
document.body.style.paddingRight = '';
}
},
render(args, root) {
const { render, html, children, state } = args;
// Initial Suggestions
if (!state.query) {
const initialSuggestions = html`
<div class="p-5 p-lg-12">
<div class="row g-4">
${Object.entries(data.suggestions || {}).map(
([section, items]) => html`
<div class="col-md-6 suggestion-section">
<p class="search-headings mb-2">${section}</p>
<div class="suggestion-items">
${items.map(
item => html`
<a href="${item.url}" class="suggestion-item d-flex align-items-center">
<i class="icon-base ti ${item.icon}"></i>
<span>${item.name}</span>
</a>
`
)}
</div>
</div>
`
)}
</div>
</div>
`;
render(initialSuggestions, root);
return;
}
// No items
if (!args.sections.length) {
render(
html`
<div class="search-no-results-wrapper">
<div class="d-flex justify-content-center align-items-center h-100">
<div class="text-center text-heading">
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24">
<g
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="0.6">
<path d="M14 3v4a1 1 0 0 0 1 1h4" />
<path d="M17 21H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2m-5-4h.01M12 11v3" />
</g>
</svg>
<h5 class="mt-2">No results found</h5>
</div>
</div>
</div>
`,
root
);
return;
}
render(children, root);
window.autoCompletePS?.update();
},
getSources() {
const sources = [];
// Add navigation sources if available
if (data.navigation) {
// Add other navigation sources first
const navigationSources = Object.keys(data.navigation)
.filter(section => section !== 'files' && section !== 'members')
.map(section => ({
sourceId: `nav-${section}`,
getItems({ query }) {
const items = data.navigation[section];
if (!query) return items;
return items.filter(item => item.name.toLowerCase().includes(query.toLowerCase()));
},
getItemUrl({ item }) {
return item.url;
},
templates: {
header({ items, html }) {
if (items.length === 0) return null;
return html`<span class="search-headings">${section}</span>`;
},
item({ item, html }) {
return html`
<a href="${item.url}" class="d-flex justify-content-between align-items-center">
<span class="item-wrapper"><i class="icon-base ti ${item.icon}"></i>${item.name}</span>
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewBox="0 0 24 24">
<g
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.8"
color="currentColor">
<path d="M11 6h4.5a4.5 4.5 0 1 1 0 9H4" />
<path d="M7 12s-3 2.21-3 3s3 3 3 3" />
</g>
</svg>
</a>
`;
}
}
}));
sources.push(...navigationSources);
// Add Files source second
if (data.navigation.files) {
sources.push({
sourceId: 'files',
getItems({ query }) {
const items = data.navigation.files;
if (!query) return items;
return items.filter(item => item.name.toLowerCase().includes(query.toLowerCase()));
},
getItemUrl({ item }) {
return item.url;
},
templates: {
header({ items, html }) {
if (items.length === 0) return null;
return html`<span class="search-headings">Files</span>`;
},
item({ item, html }) {
return html`
<a href="${item.url}" class="d-flex align-items-center position-relative px-4 py-2">
<div class="file-preview me-2">
<img src="${assetsPath}${item.src}" alt="${item.name}" class="rounded" width="42" />
</div>
<div class="flex-grow-1">
<h6 class="mb-0">${item.name}</h6>
<small class="text-body-secondary">${item.subtitle}</small>
</div>
${item.meta
? html`
<div class="position-absolute end-0 me-4">
<span class="text-body-secondary small">${item.meta}</span>
</div>
`
: ''}
</a>
`;
}
}
});
}
// Add Members source last
if (data.navigation.members) {
sources.push({
sourceId: 'members',
getItems({ query }) {
const items = data.navigation.members;
if (!query) return items;
return items.filter(item => item.name.toLowerCase().includes(query.toLowerCase()));
},
getItemUrl({ item }) {
return item.url;
},
templates: {
header({ items, html }) {
if (items.length === 0) return null;
return html`<span class="search-headings">Members</span>`;
},
item({ item, html }) {
return html`
<a href="${item.url}" class="d-flex align-items-center py-2 px-4">
<div class="avatar me-2">
<img src="${assetsPath}${item.src}" alt="${item.name}" class="rounded-circle" width="32" />
</div>
<div class="flex-grow-1">
<h6 class="mb-0">${item.name}</h6>
<small class="text-body-secondary">${item.subtitle}</small>
</div>
</a>
`;
}
}
});
}
}
return sources;
}
});
}
// Initialize search shortcut
document.addEventListener('keydown', event => {
if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
event.preventDefault();
document.querySelector('.aa-DetachedSearchButton').click();
}
});
// Load search data on page load
if (document.documentElement.querySelector('#autocomplete')) {
loadSearchData();
}

View File

@@ -0,0 +1,67 @@
module.exports = {
base: {
// Excludes folders relative to `root` directory.
exclude: [
'html',
'html-starter',
'html-demo',
'dist',
'build',
'assets',
'tasks',
'node_modules',
'_temp',
'fonts'
],
// Base Path to Serve from using Browser Sync, Currently set to root of the project
// You can also point to specific folder like 'build/'
serverPath: './',
// To generate HTML files in development mode
buildTemplatePath: 'html/vertical-menu-template',
// Folder for production build
buildPath: './build'
},
development: {
// Build path can be both relative or absolute.
// Current dist path is `./assets/vendor` which will be used by templates from `html\` directory. Set distPath: './assets/vendor' to generate assets in dist folder.
distPath: './assets/vendor',
// To generate HTML files in development mode
buildTemplatePath: 'html/vertical-menu-template',
// Minify assets.
minify: false,
// Generate sourcemaps.
sourcemaps: false,
// https://webpack.js.org/configuration/devtool/#development
devtool: 'eval-source-map',
// Use this option with caution because it will remove entire output directory.
// Will affect only and `build` command
cleanDist: true
},
production: {
// Build path can be both relative or absolute.
// Current dist path is `./assets/vendor` which will be used by templates from `html\` directory. Set distPath: './assets/vendor' to generate assets in dist folder.
distPath: './assets/vendor',
// Minify assets.
// Note: Webpack will minify js sources in production mode regardless to this option
minify: true,
// Generate sourcemaps.
sourcemaps: false,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Use this option with caution because it will remove entire output directory.
// Will affect only `build:prod` command
cleanDist: true
}
};

View File

@@ -0,0 +1,151 @@
const fs = require('fs').promises;
const path = require('path');
const deepmerge = require('deepmerge');
const env = require('gulp-environment');
const { importDirectory, cleanupSVG, parseColors, isEmptyColor, runSVGO } = require('@iconify/tools');
const { getIcons, stringToIcon, getIconsCSS } = require('@iconify/utils');
// Set environment variable
process.env.NODE_ENV = env.current.name;
let serverPath;
let templatePath;
let buildPath;
// Load configuration
const conf = (() => {
const _conf = require('../../build-config');
serverPath = _conf.base.serverPath;
templatePath = _conf.base.buildTemplatePath;
buildPath = _conf.base.buildPath;
return deepmerge.all([{}, _conf.base || {}, _conf[process.env.NODE_ENV] || {}]);
})();
// Icon sources
const sources = {
json: [require.resolve('@iconify/json/json/tabler.json')]
};
// CSS target path for generated icons
const cssTarget = path.resolve(__dirname, '../../' + conf.distPath.replace(/^\.\//, '') + '/fonts/iconify-icons.css');
// Main function to generate CSS
(async function () {
try {
const allIcons = [];
// Process JSON sources
if (sources.json) {
for (let i = 0; i < sources.json.length; i++) {
const item = sources.json[i];
const filename = typeof item === 'string' ? item : item.filename;
const content = JSON.parse(await fs.readFile(filename, 'utf8'));
// Filter icons if specific icons are provided
if (typeof item !== 'string' && item.icons?.length) {
const filteredContent = getIcons(content, item.icons);
if (!filteredContent) {
throw new Error(`Cannot find required icons in ${filename}`);
}
allIcons.push(filteredContent);
} else {
allIcons.push(content);
}
}
}
// Process SVG sources if provided
if (sources.svg) {
for (let i = 0; i < sources.svg.length; i++) {
const source = sources.svg[i];
const iconSet = await importDirectory(source.dir, {
prefix: source.prefix
});
// Iterate over icons and process each SVG
await iconSet.forEach(async (name, type) => {
if (type !== 'icon') {
return;
}
const svg = iconSet.toSVG(name);
if (!svg) {
iconSet.remove(name);
return;
}
try {
// Clean up and optimize SVG
await cleanupSVG(svg);
if (source.monotone) {
await parseColors(svg, {
defaultColor: 'currentColor',
callback: (attr, colorStr, color) => {
return !color || isEmptyColor(color) ? colorStr : 'currentColor';
}
});
}
await runSVGO(svg);
} catch (err) {
console.error(`Error parsing ${name} from ${source.dir}:`, err);
iconSet.remove(name);
return;
}
iconSet.fromSVG(name, svg);
allIcons.push(iconSet.export());
});
}
}
// Generate the CSS content from all collected icons
const cssContent = allIcons
.map(iconSet =>
getIconsCSS(iconSet, Object.keys(iconSet.icons), {
iconSelector: '.{prefix}-{name}',
commonSelector: '.ti',
format: conf.minify ? 'compressed' : 'expanded'
})
)
.join('\n');
// Write the generated CSS to the target file
await fs.writeFile(cssTarget, cssContent, 'utf8');
console.log(`Saved CSS to ${cssTarget}`);
} catch (err) {
console.error('Error during icon CSS generation:', err);
}
})();
/**
* Organizes a list of icons by prefix.
* @param {Array} icons - Array of icon names
* @returns {Object} - Sorted icons grouped by prefix
*/
function organizeIconsList(icons) {
const sorted = {};
icons.forEach(icon => {
const item = stringToIcon(icon);
if (!item) {
return;
}
const prefix = item.prefix;
const prefixList = sorted[prefix] ? sorted[prefix] : (sorted[prefix] = []);
const name = item.name;
if (prefixList.indexOf(name) === -1) {
prefixList.push(name);
}
});
return sorted;
}

View File

@@ -0,0 +1,98 @@
const path = require('path');
// Config
// -------------------------------------------------------------------------------
const env = require('gulp-environment');
process.env.NODE_ENV = env.current.name;
let serverPath;
const conf = (() => {
const _conf = require('./build-config');
serverPath = _conf.base.serverPath;
templatePath = _conf.base.buildTemplatePath;
buildPath = _conf.base.buildPath;
return require('deepmerge').all([{}, _conf.base || {}, _conf[process.env.NODE_ENV] || {}]);
})();
conf.distPath = path.resolve(__dirname, conf.distPath).replace(/\\/g, '/');
// Modules
// -------------------------------------------------------------------------------
const { parallel, series, watch } = require('gulp');
const { deleteAsync } = require('del');
const colors = require('ansi-colors');
const browserSync = require('browser-sync').create();
colors.enabled = require('color-support').hasBasic;
// Utilities
// -------------------------------------------------------------------------------
function srcGlob(...src) {
return src.concat(conf.exclude.map(d => `!${d}/**/*`));
}
// Tasks
// -------------------------------------------------------------------------------
const buildTasks = require('./tasks/build')(conf, srcGlob);
const prodTasks = require('./tasks/prod')(conf);
// Clean build directory
// -------------------------------------------------------------------------------
const cleanTask = function () {
return deleteAsync([conf.distPath, buildPath], {
force: true
});
};
// Watch
// -------------------------------------------------------------------------------
const watchTask = function () {
watch(srcGlob('**/*.scss', '!fonts/**/*.scss'), buildTasks.css);
watch(srcGlob('fonts/**/*.scss'), parallel(buildTasks.css, buildTasks.fonts));
watch(srcGlob('**/*.@(js|es6)', '!*.js'), buildTasks.js);
// watch(srcGlob('**/*.png', '**/*.gif', '**/*.jpg', '**/*.jpeg', '**/*.svg', '**/*.swf'), copyTasks.copyAssets)
};
// Serve
// -------------------------------------------------------------------------------
const serveTasks = function () {
browserSync.init({
// ? You can change server path variable from build-config.js file
server: serverPath
});
watch([
// ? You can change add/remove files/folders watch paths in below array
'html/**/*.html',
'html-starter/**/*.html',
'assets/vendor/css/*.css',
'assets/css/*.css',
'assets/js/*.js'
]).on('change', browserSync.reload);
};
const serveTask = parallel([serveTasks, watchTask]);
// Build (Dev & Prod)
// -------------------------------------------------------------------------------
const buildTask = conf.cleanDist
? series(cleanTask, env.current.name === 'production' ? [buildTasks.all, prodTasks.all] : buildTasks.all)
: series(env.current.name === 'production' ? [buildTasks.all, prodTasks.all] : buildTasks.all);
// Exports
// -------------------------------------------------------------------------------
module.exports = {
default: buildTask,
build: buildTask,
'build:js': buildTasks.js,
'build:theme': buildTasks.theme,
'build:css': buildTasks.css,
'build:fonts': buildTasks.fonts,
'build:copy': parallel([buildTasks.copy]),
watch: watchTask,
serve: serveTask
};

View File

@@ -0,0 +1,289 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="horizontal-menu-template-no-customizer-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 1 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-navbar-full layout-horizontal layout-without-menu">
<div class="layout-container">
<!-- Navbar -->
<nav class="layout-navbar navbar navbar-expand-xl align-items-center" id="layout-navbar">
<div class="container-xxl">
<div class="navbar-brand app-brand demo d-none d-xl-flex py-0 me-4 ms-0">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold text-heading">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto d-xl-none">
<i class="icon-base ti tabler-x icon-sm d-flex align-items-center justify-content-center"></i>
</a>
</div>
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</div>
</nav>
<!-- / Navbar -->
<!-- Layout container -->
<div class="layout-page">
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu-horizontal menu-horizontal menu flex-grow-0">
<div class="container-xxl d-flex h-100">
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item active">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</div>
</aside>
<!-- / Menu -->
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 1</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!--/ Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!--/ Content wrapper -->
</div>
<!--/ Layout container -->
</div>
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
<!--/ Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,290 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="horizontal-menu-template-no-customizer-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 2 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-navbar-full layout-horizontal layout-without-menu">
<div class="layout-container">
<!-- Navbar -->
<nav class="layout-navbar navbar navbar-expand-xl align-items-center" id="layout-navbar">
<div class="container-xxl">
<div class="navbar-brand app-brand demo d-none d-xl-flex py-0 me-4 ms-0">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold text-heading">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto d-xl-none">
<i class="icon-base ti tabler-x icon-sm d-flex align-items-center justify-content-center"></i>
</a>
</div>
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</div>
</nav>
<!-- / Navbar -->
<!-- Layout container -->
<div class="layout-page">
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu-horizontal menu-horizontal menu flex-grow-0">
<div class="container-xxl d-flex h-100">
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item active">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</div>
</aside>
<!-- / Menu -->
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 2</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!--/ Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!--/ Content wrapper -->
</div>
<!--/ Layout container -->
</div>
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
<!--/ Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,345 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="horizontal-menu-template-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 1 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/libs/pickr/pickr-themes.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Template customizer: To hide customizer set displayCustomizer value false in config.js. -->
<script src="../../assets/vendor/js/template-customizer.js"></script>
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-navbar-full layout-horizontal layout-without-menu">
<div class="layout-container">
<!-- Navbar -->
<nav class="layout-navbar navbar navbar-expand-xl align-items-center" id="layout-navbar">
<div class="container-xxl">
<div class="navbar-brand app-brand demo d-none d-xl-flex py-0 me-4 ms-0">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold text-heading">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto d-xl-none">
<i class="icon-base ti tabler-x icon-sm d-flex align-items-center justify-content-center"></i>
</a>
</div>
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<div class="navbar-nav align-items-center">
<div class="nav-item dropdown me-2 me-xl-0">
<a
class="nav-link dropdown-toggle hide-arrow"
id="nav-theme"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<i class="icon-base ti tabler-sun icon-md theme-icon-active"></i>
<span class="d-none ms-2" id="nav-theme-text">Toggle theme</span>
</a>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="nav-theme-text">
<li>
<button
type="button"
class="dropdown-item align-items-center active"
data-bs-theme-value="light"
aria-pressed="false">
<span><i class="icon-base ti tabler-sun icon-md me-3" data-icon="sun"></i>Light</span>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="dark"
aria-pressed="true">
<span
><i class="icon-base ti tabler-moon-stars icon-md me-3" data-icon="moon-stars"></i>Dark</span
>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="system"
aria-pressed="false">
<span
><i
class="icon-base ti tabler-device-desktop-analytics icon-md me-3"
data-icon="device-desktop-analytics"></i
>System</span
>
</button>
</li>
</ul>
</div>
</div>
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</div>
</nav>
<!-- / Navbar -->
<!-- Layout container -->
<div class="layout-page">
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu-horizontal menu-horizontal menu flex-grow-0">
<div class="container-xxl d-flex h-100">
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item active">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</div>
</aside>
<!-- / Menu -->
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 1</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!--/ Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!--/ Content wrapper -->
</div>
<!--/ Layout container -->
</div>
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
<!--/ Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/pickr/pickr.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,346 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="horizontal-menu-template-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 2 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/libs/pickr/pickr-themes.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Template customizer: To hide customizer set displayCustomizer value false in config.js. -->
<script src="../../assets/vendor/js/template-customizer.js"></script>
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-navbar-full layout-horizontal layout-without-menu">
<div class="layout-container">
<!-- Navbar -->
<nav class="layout-navbar navbar navbar-expand-xl align-items-center" id="layout-navbar">
<div class="container-xxl">
<div class="navbar-brand app-brand demo d-none d-xl-flex py-0 me-4 ms-0">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold text-heading">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto d-xl-none">
<i class="icon-base ti tabler-x icon-sm d-flex align-items-center justify-content-center"></i>
</a>
</div>
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<div class="navbar-nav align-items-center">
<div class="nav-item dropdown me-2 me-xl-0">
<a
class="nav-link dropdown-toggle hide-arrow"
id="nav-theme"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<i class="icon-base ti tabler-sun icon-md theme-icon-active"></i>
<span class="d-none ms-2" id="nav-theme-text">Toggle theme</span>
</a>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="nav-theme-text">
<li>
<button
type="button"
class="dropdown-item align-items-center active"
data-bs-theme-value="light"
aria-pressed="false">
<span><i class="icon-base ti tabler-sun icon-md me-3" data-icon="sun"></i>Light</span>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="dark"
aria-pressed="true">
<span
><i class="icon-base ti tabler-moon-stars icon-md me-3" data-icon="moon-stars"></i>Dark</span
>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="system"
aria-pressed="false">
<span
><i
class="icon-base ti tabler-device-desktop-analytics icon-md me-3"
data-icon="device-desktop-analytics"></i
>System</span
>
</button>
</li>
</ul>
</div>
</div>
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</div>
</nav>
<!-- / Navbar -->
<!-- Layout container -->
<div class="layout-page">
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu-horizontal menu-horizontal menu flex-grow-0">
<div class="container-xxl d-flex h-100">
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item active">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</div>
</aside>
<!-- / Menu -->
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 2</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!--/ Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!--/ Content wrapper -->
</div>
<!--/ Layout container -->
</div>
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
<!--/ Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/pickr/pickr.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,296 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="vertical-menu-template-no-customizer-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 1 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-content-navbar ">
<div class="layout-container">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu">
<div class="app-brand demo ">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold ms-3">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto">
<i class="icon-base ti menu-toggle-icon d-none d-xl-block"></i>
<i class="icon-base ti tabler-x d-block d-xl-none"></i>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item active">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</aside>
<div class="menu-mobile-toggler d-xl-none rounded-1">
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large text-bg-secondary p-2 rounded-1">
<i class="ti tabler-menu icon-base"></i>
<i class="ti tabler-chevron-right icon-base"></i>
</a>
</div>
<!-- / Menu -->
<!-- Layout container -->
<div class="layout-page">
<!-- Navbar -->
<nav
class="layout-navbar container-xxl navbar-detached navbar navbar-expand-xl align-items-center bg-navbar-theme"
id="layout-navbar">
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</nav>
<!-- / Navbar -->
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 1</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!-- / Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!-- Content wrapper -->
</div>
<!-- / Layout page -->
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
</div>
<!-- / Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,297 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="vertical-menu-template-no-customizer-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 2 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-content-navbar ">
<div class="layout-container">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu">
<div class="app-brand demo ">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold ms-3">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto">
<i class="icon-base ti menu-toggle-icon d-none d-xl-block"></i>
<i class="icon-base ti tabler-x d-block d-xl-none"></i>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item active">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</aside>
<div class="menu-mobile-toggler d-xl-none rounded-1">
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large text-bg-secondary p-2 rounded-1">
<i class="ti tabler-menu icon-base"></i>
<i class="ti tabler-chevron-right icon-base"></i>
</a>
</div>
<!-- / Menu -->
<!-- Layout container -->
<div class="layout-page">
<!-- Navbar -->
<nav
class="layout-navbar container-xxl navbar-detached navbar navbar-expand-xl align-items-center bg-navbar-theme"
id="layout-navbar">
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</nav>
<!-- / Navbar -->
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 2</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!-- / Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!-- Content wrapper -->
</div>
<!-- / Layout page -->
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
</div>
<!-- / Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,352 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="vertical-menu-template-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 1 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/libs/pickr/pickr-themes.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Template customizer: To hide customizer set displayCustomizer value false in config.js. -->
<script src="../../assets/vendor/js/template-customizer.js"></script>
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-content-navbar ">
<div class="layout-container">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu">
<div class="app-brand demo ">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold ms-3">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto">
<i class="icon-base ti menu-toggle-icon d-none d-xl-block"></i>
<i class="icon-base ti tabler-x d-block d-xl-none"></i>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item active">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</aside>
<div class="menu-mobile-toggler d-xl-none rounded-1">
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large text-bg-secondary p-2 rounded-1">
<i class="ti tabler-menu icon-base"></i>
<i class="ti tabler-chevron-right icon-base"></i>
</a>
</div>
<!-- / Menu -->
<!-- Layout container -->
<div class="layout-page">
<!-- Navbar -->
<nav
class="layout-navbar container-xxl navbar-detached navbar navbar-expand-xl align-items-center bg-navbar-theme"
id="layout-navbar">
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<div class="navbar-nav align-items-center">
<div class="nav-item dropdown me-2 me-xl-0">
<a
class="nav-link dropdown-toggle hide-arrow"
id="nav-theme"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<i class="icon-base ti tabler-sun icon-md theme-icon-active"></i>
<span class="d-none ms-2" id="nav-theme-text">Toggle theme</span>
</a>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="nav-theme-text">
<li>
<button
type="button"
class="dropdown-item align-items-center active"
data-bs-theme-value="light"
aria-pressed="false">
<span><i class="icon-base ti tabler-sun icon-md me-3" data-icon="sun"></i>Light</span>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="dark"
aria-pressed="true">
<span
><i class="icon-base ti tabler-moon-stars icon-md me-3" data-icon="moon-stars"></i>Dark</span
>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="system"
aria-pressed="false">
<span
><i
class="icon-base ti tabler-device-desktop-analytics icon-md me-3"
data-icon="device-desktop-analytics"></i
>System</span
>
</button>
</li>
</ul>
</div>
</div>
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</nav>
<!-- / Navbar -->
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 1</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!-- / Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!-- Content wrapper -->
</div>
<!-- / Layout page -->
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
</div>
<!-- / Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/pickr/pickr.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,353 @@
<!doctype html>
<html
lang="en"
class=" layout-navbar-fixed layout-menu-fixed layout-compact "
dir="ltr"
data-skin="default"
data-bs-theme="light"
data-assets-path="../../assets/"
data-template="vertical-menu-template-starter">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="robots" content="noindex, nofollow" />
<title>Demo: Page 2 - Starter Kit | Vuexy - Bootstrap Dashboard PRO</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="../../assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&ampdisplay=swap"
rel="stylesheet" />
<link rel="stylesheet" href="../../assets/vendor/fonts/iconify-icons.css" />
<script src="../../assets/vendor/libs/@algolia/autocomplete-js.js"></script>
<!-- Core CSS -->
<!-- build:css assets/vendor/css/theme.css -->
<link rel="stylesheet" href="../../assets/vendor/libs/node-waves/node-waves.css" />
<link rel="stylesheet" href="../../assets/vendor/libs/pickr/pickr-themes.css" />
<link rel="stylesheet" href="../../assets/vendor/css/core.css" />
<link rel="stylesheet" href="../../assets/css/demo.css" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css" />
<!-- endbuild -->
<!-- Page CSS -->
<!-- Helpers -->
<script src="../../assets/vendor/js/helpers.js"></script>
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
<!--? Template customizer: To hide customizer set displayCustomizer value false in config.js. -->
<script src="../../assets/vendor/js/template-customizer.js"></script>
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
<script src="../../assets/js/config.js"></script>
</head>
<body>
<!-- Layout wrapper -->
<div class="layout-wrapper layout-content-navbar ">
<div class="layout-container">
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu">
<div class="app-brand demo ">
<a href="index.html" class="app-brand-link">
<span class="app-brand-logo demo">
<span class="text-primary">
<svg width="32" height="22" viewBox="0 0 32 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.00172773 0V6.85398C0.00172773 6.85398 -0.133178 9.01207 1.98092 10.8388L13.6912 21.9964L19.7809 21.9181L18.8042 9.88248L16.4951 7.17289L9.23799 0H0.00172773Z"
fill="currentColor" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.69824 16.4364L12.5199 3.23696L16.5541 7.25596L7.69824 16.4364Z"
fill="#161616" />
<path
opacity="0.06"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.07751 15.9175L13.9419 4.63989L16.5849 7.28475L8.07751 15.9175Z"
fill="#161616" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.77295 16.3566L23.6563 0H32V6.88383C32 6.88383 31.8262 9.17836 30.6591 10.4057L19.7824 22H13.6938L7.77295 16.3566Z"
fill="currentColor" />
</svg>
</span>
</span>
<span class="app-brand-text demo menu-text fw-bold ms-3">Vuexy</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto">
<i class="icon-base ti menu-toggle-icon d-none d-xl-block"></i>
<i class="icon-base ti tabler-x d-block d-xl-none"></i>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul class="menu-inner py-1">
<!-- Page -->
<li class="menu-item">
<a href="index.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-smart-home"></i>
<div data-i18n="Page 1">Page 1</div>
</a>
</li>
<li class="menu-item active">
<a href="page-2.html" class="menu-link">
<i class="menu-icon icon-base ti tabler-app-window"></i>
<div data-i18n="Page 2">Page 2</div>
</a>
</li>
</ul>
</aside>
<div class="menu-mobile-toggler d-xl-none rounded-1">
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large text-bg-secondary p-2 rounded-1">
<i class="ti tabler-menu icon-base"></i>
<i class="ti tabler-chevron-right icon-base"></i>
</a>
</div>
<!-- / Menu -->
<!-- Layout container -->
<div class="layout-page">
<!-- Navbar -->
<nav
class="layout-navbar container-xxl navbar-detached navbar navbar-expand-xl align-items-center bg-navbar-theme"
id="layout-navbar">
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none ">
<a class="nav-item nav-link px-0 me-xl-6" href="javascript:void(0)">
<i class="icon-base ti tabler-menu-2 icon-md"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center justify-content-end" id="navbar-collapse">
<div class="navbar-nav align-items-center">
<div class="nav-item dropdown me-2 me-xl-0">
<a
class="nav-link dropdown-toggle hide-arrow"
id="nav-theme"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<i class="icon-base ti tabler-sun icon-md theme-icon-active"></i>
<span class="d-none ms-2" id="nav-theme-text">Toggle theme</span>
</a>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="nav-theme-text">
<li>
<button
type="button"
class="dropdown-item align-items-center active"
data-bs-theme-value="light"
aria-pressed="false">
<span><i class="icon-base ti tabler-sun icon-md me-3" data-icon="sun"></i>Light</span>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="dark"
aria-pressed="true">
<span
><i class="icon-base ti tabler-moon-stars icon-md me-3" data-icon="moon-stars"></i>Dark</span
>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item align-items-center"
data-bs-theme-value="system"
aria-pressed="false">
<span
><i
class="icon-base ti tabler-device-desktop-analytics icon-md me-3"
data-icon="device-desktop-analytics"></i
>System</span
>
</button>
</li>
</ul>
</div>
</div>
<ul class="navbar-nav flex-row align-items-center ms-md-auto">
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a
class="nav-link dropdown-toggle hide-arrow p-0"
href="javascript:void(0);"
data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="../../assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-0">John Doe</h6>
<small class="text-body-secondary">Admin</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-user icon-md me-3"></i><span>My Profile</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<i class="icon-base ti tabler-settings icon-md me-3"></i><span>Settings</span>
</a>
</li>
<li>
<a class="dropdown-item" href="#">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 icon-base ti tabler-credit-card icon-md me-3"></i
><span class="flex-grow-1 align-middle">Billing Plan</span>
<span class="flex-shrink-0 badge rounded-pill bg-danger">4</span>
</span>
</a>
</li>
<li>
<div class="dropdown-divider my-1 mx-n2"></div>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0);">
<i class="icon-base ti tabler-power icon-md me-3"></i><span>Log Out</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</div>
</nav>
<!-- / Navbar -->
<!-- Content wrapper -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="py-4 mb-6">Page 2</h4>
<p>
Sample page.<br />For more layout options use
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation//layouts.html"
target="_blank"
class="fw-medium"
>Layout docs</a
>.
</p>
</div>
<!-- / Content -->
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme">
<div class="container-xxl">
<div
class="footer-container d-flex align-items-center justify-content-between py-4 flex-md-row flex-column">
<div class="text-body">
&#169;
<script>
document.write(new Date().getFullYear());
</script>
, made with ❤️ by <a href="https://pixinvent.com" target="_blank" class="footer-link">Pixinvent</a>
</div>
<div class="d-none d-lg-inline-block">
<a
href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/"
target="_blank"
class="footer-link me-4"
>Documentation</a
>
</div>
</div>
</div>
</footer>
<!-- / Footer -->
<div class="content-backdrop fade"></div>
</div>
<!-- Content wrapper -->
</div>
<!-- / Layout page -->
</div>
<!-- Overlay -->
<div class="layout-overlay layout-menu-toggle"></div>
<!-- Drag Target Area To SlideIn Menu On Small Screens -->
<div class="drag-target"></div>
</div>
<!-- / Layout wrapper -->
<!-- Core JS -->
<!-- build:js assets/vendor/js/theme.js -->
<script src="../../assets/vendor/libs/jquery/jquery.js"></script>
<script src="../../assets/vendor/libs/popper/popper.js"></script>
<script src="../../assets/vendor/js/bootstrap.js"></script>
<script src="../../assets/vendor/libs/node-waves/node-waves.js"></script>
<script src="../../assets/vendor/libs/pickr/pickr.js"></script>
<script src="../../assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js"></script>
<script src="../../assets/vendor/libs/hammer/hammer.js"></script>
<script src="../../assets/vendor/js/menu.js"></script>
<!-- endbuild -->
<!-- Vendors JS -->
<!-- Main JS -->
<script src="../../assets/js/main.js"></script>
<!-- Page JS -->
</body>
</html>

View File

@@ -0,0 +1,162 @@
<!doctype html>
<html
lang="en"
class="customizer-hide"
dir="ltr"
data-bs-theme="light"
data-skin="default"
data-assets-path="../../assets/"
data-template="vertical-menu-template-no-customizer">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<title>Vuexy | Vuexy - Bootstrap Admin Template</title>
<meta name="description" content="" />
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="assets/img/favicon/favicon.ico" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet" />
<!-- Core CSS -->
<link rel="stylesheet" href="assets/vendor/css/core.css" />
<link rel="stylesheet" href="assets/css/demo.css" />
</head>
<body>
<!-- Content -->
<div class="container flex-grow-1 container-p-y my-2">
<h3>Thank you for purchasing Vuexy! 😇</h3>
<p>
Easily navigate to demos, documentation, support or changelog using below links.<br />
Git repo access link helps you to request the repository access, once approved one can use the repository to
raise an issus(support, feature request & feedback) and track future updates & releases.
</p>
<!-- Examples -->
<div class="row mt-sm-4 mt-3">
<div class="col-12 mb-3">
<div class="card">
<h5 class="card-header">Template Links</h5>
<!-- Template Demo Links -->
<table class="table">
<thead>
<tr>
<th scope="col">Starter</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a href="html/vertical-menu-template/index.html" target="_blank">Vertical Menu Template</a>
</td>
</tr>
<tr>
<td>
<a href="html/vertical-menu-template-no-customizer/index.html" target="_blank"
>Vertical Menu Template</a
>
(Without Customizer)
</td>
</tr>
<tr>
<td>
<a href="html/horizontal-menu-template/index.html" target="_blank">Horizontal Menu Template</a>
</td>
</tr>
<tr>
<td>
<a href="html/horizontal-menu-template-no-customizer/index.html" target="_blank"
>Horizontal Menu Template</a
>
(Without Customizer)
</td>
</tr>
</tbody>
</table>
<!--/ Template Demo Links -->
</div>
</div>
<div class="col-12 mb-3">
<div class="card">
<h5 class="card-header">Other Important Links</h5>
<!-- Other Links -->
<table class="table">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">URL</th>
</tr>
</thead>
<tbody>
<tr>
<td>License</td>
<td>
<a href="https://themeforest.net/licenses/standard" target="_blank"
>https://themeforest.net/licenses/standard</a
>
</td>
</tr>
<tr>
<td>Documentation</td>
<td>
<a href="https://demos.pixinvent.com/vuexy-html-admin-template/documentation/" target="_blank"
>https://demos.pixinvent.com/vuexy-html-admin-template/documentation/</a
>
</td>
</tr>
<tr>
<td>Changelog</td>
<td>
<a href="https://demos.pixinvent.com/vuexy/changelog.html" target="_blank"
>https://demos.pixinvent.com/vuexy/changelog.html</a
>
</td>
</tr>
<tr>
<td>GitHub Repository Access</td>
<td>
<a href="https://tools.pixinvent.com/github/github-access" target="_blank"
>https://tools.pixinvent.com/github/github-access</a
>
</td>
</tr>
<tr>
<td>Support</td>
<td>
<a href="https://pixinvent.ticksy.com/" target="_blank">https://pixinvent.ticksy.com/</a>
</td>
</tr>
</tbody>
</table>
<!--/ Other Links -->
</div>
</div>
</div>
<div class="text-big py-4">
<p>
Please dont forget to rate and share <strong>Vuexy</strong> and leave a nice review, it means a lot for us
and our theme. Simply log in to
<a href="https://themeforest.net/" target="_blank"><strong>https://themeforest.net/</strong></a> Account, go
to Downloads section and click 5 stars next to the <strong>Vuexy</strong> template.
</p>
</div>
</div>
<!-- / Content -->
</body>
</html>

View File

@@ -0,0 +1,101 @@
<div id="template-customizer" class="card rounded-0">
<a href="javascript:void(0)" class="template-customizer-open-btn" tabindex="-1"></a>
<div class="p-6 m-0 lh-1 border-bottom template-customizer-header position-relative py-4">
<h6 class="template-customizer-t-panel_header mb-1"></h6>
<p class="template-customizer-t-panel_sub_header mb-0 small"></p>
<div class="d-flex align-items-center gap-2 position-absolute end-0 top-0 mt-6 me-5">
<a
href="javascript:void(0)"
class="template-customizer-reset-btn text-heading"
data-bs-toggle="tooltip"
data-bs-placement="bottom"
title="Reset Customizer"
><i class="icon-base ti tabler-refresh icon-lg"></i
><span class="badge rounded-pill bg-danger badge-dot badge-notifications d-none"></span
></a>
<a href="javascript:void(0)" class="template-customizer-close-btn fw-light text-heading" tabindex="-1">
<i class="icon-base ti tabler-x icon-lg"></i>
</a>
</div>
</div>
<div class="template-customizer-inner pt-6">
<!-- Theming -->
<div class="template-customizer-theming">
<h5 class="m-0 px-6 pb-6">
<span class="template-customizer-t-theming_header bg-label-primary rounded-1 py-1 px-3 small"></span>
</h5>
<!-- Color -->
<div class="m-0 px-6 pb-6 template-customizer-color w-100">
<label for="customizerColor" class="form-label d-block template-customizer-t-color_label mb-2"></label>
<div class="row template-customizer-colors-options"></div>
</div>
<!-- Theme -->
<div class="m-0 px-6 pb-6 template-customizer-theme w-100">
<label for="customizerTheme" class="form-label d-block template-customizer-t-theme_label mb-2"></label>
<div class="row px-1 template-customizer-themes-options"></div>
</div>
<!-- Skins -->
<div class="m-0 px-6 pb-6 template-customizer-skins w-100">
<label for="customizerSkin" class="form-label template-customizer-t-skin_label mb-2"></label>
<div class="row px-1 template-customizer-skins-options"></div>
</div>
<!-- Semi Dark -->
<div class="m-0 px-6 template-customizer-semiDark w-100 d-flex justify-content-between pe-12">
<span class="form-label template-customizer-t-semiDark_label"></span>
<label class="switch template-customizer-t-semiDark_label">
<input type="checkbox" class="template-customizer-semi-dark-switch switch-input" />
<span class="switch-toggle-slider">
<span class="switch-on"></span>
<span class="switch-off"></span>
</span>
</label>
</div>
<hr class="m-0 px-6 my-6" />
</div>
<!--/ Theming -->
<!-- Layout -->
<div class="template-customizer-layout">
<h5 class="m-0 px-6 pb-6">
<span class="template-customizer-t-layout_header bg-label-primary rounded-2 py-1 px-3 small"></span>
</h5>
<!-- Layout(Menu) -->
<div class="m-0 px-6 pb-6 d-block template-customizer-layouts">
<label for="customizerStyle" class="form-label d-block template-customizer-t-layout_label mb-2"></label>
<div class="row px-1 template-customizer-layouts-options"></div>
</div>
<!-- Header Options for Horizontal -->
<div class="m-0 px-6 pb-6 template-customizer-headerOptions w-100">
<label for="customizerHeader" class="form-label template-customizer-t-layout_header_label mb-2"></label>
<div class="row px-1 template-customizer-header-options"></div>
</div>
<!-- Fixed navbar -->
<div class="m-0 px-6 pb-6 template-customizer-layoutNavbarOptions w-100">
<label for="customizerNavbar" class="form-label template-customizer-t-layout_navbar_label mb-2"></label>
<div class="row px-1 template-customizer-navbar-options"></div>
</div>
<!-- Content -->
<div class="m-0 px-6 pb-6 template-customizer-content w-100">
<label for="customizerContent" class="form-label template-customizer-t-content_label mb-2"></label>
<div class="row px-1 template-customizer-content-options"></div>
</div>
<!-- Directions -->
<div class="m-0 px-6 pb-6 template-customizer-directions w-100">
<label for="customizerDirection" class="form-label template-customizer-t-direction_label mb-2"></label>
<div class="row px-1 template-customizer-directions-options"></div>
</div>
</div>
<!--/ Layout -->
</div>
</div>

View File

@@ -0,0 +1,219 @@
/*
* Template Customizer Style
**/
$customizer-width: 400px;
$customizer-hide-width: 1200px;
$customizer-spacer: 20px;
$customizer-font-size: inherit;
$open-btn-size: 38px;
$open-btn-spacer: 0;
$open-btn-font-size: 18px;
$open-btn-top: 180px;
$open-btn-color: #fff;
$open-btn-border-radius: .375rem;
#template-customizer {
position: fixed;
z-index: 99999999;
display: flex;
flex-direction: column;
block-size: 100%;
-webkit-box-direction: normal;
-webkit-box-orient: vertical;
box-shadow: 0 .3125rem 1.375rem 0 rgba(34, 48, 62, .18);
font-family: "Public Sans", -apple-system, blinkmacsystemfont, "Segoe UI", Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-size: $customizer-font-size;
inline-size: $customizer-width;
inset-block-start: 0;
inset-inline-end: 0;
transform: translateX($customizer-width + $customizer-spacer);
transition: transform .2s ease-in;
[data-bs-theme="dark"] & {
box-shadow: 0 .3125rem 1.375rem 0 rgba(20, 20, 29, .26);
}
h5 {
position: relative;
font-size: 11px;
}
.form-label {
font-size: .9375rem;
font-weight: 500;
}
/* Color option styles */
.template-customizer-colors-options{
display: flex;
flex-direction: row;
justify-content: space-around;
margin: 0;
gap: .3rem;
.custom-option{
inline-size: 50px;
.custom-option-content{
padding: 0;
min-block-size: 46px;
.pcr-button{
padding: .625rem;
block-size: 30px;
inline-size: 30px;
&::before,
&::after{
border-radius: .5rem;
}
&:focus{
box-shadow: none;
}
}
}
}
.custom-option-body{
border-radius: .5rem;
block-size: 30px;
inline-size: 30px;
}
}
/* Font Icons sizing and alignments */
.custom-option-icon{
padding: 0;
.custom-option-content {
display: flex;
align-items: center;
justify-content: center;
min-block-size: 50px;
}
}
/* border-color for hr */
hr{
border-color: var(--bs-border-color);
}
/* To update svg image's color */
.custom-option{
border-width: 2px;
margin: 0;
&.custom-option-image .custom-option-content .custom-option-body svg {
inline-size: 100%;
}
}
&.template-customizer-open {
transform: none;
transition-delay: .1s;
.template-customizer-theme .custom-option.checked{
background-color: rgba(var(--bs-primary-rgb), .08);
*,
*::before,
*::after{
color: var(--bs-primary);
}
}
.custom-option.checked {
border-width: 2px;
color: var(--bs-primary);
.custom-option-content {
border: none;
}
}
}
.template-customizer-header {
a:hover {
&,
.icon-base {
color: inherit !important;
}
}
}
/* Customizer button */
.template-customizer-open-btn {
position: absolute;
z-index: -1;
display: block;
background: var(--bs-primary);
block-size: $open-btn-size;
border-end-start-radius: $open-btn-border-radius;
border-start-start-radius: $open-btn-border-radius;
box-shadow: 0 .125rem .25rem 0 rgba(var(--bs-primary-rgb), .4);
color: $open-btn-color;
font-size: $open-btn-font-size;
inline-size: $open-btn-size;
inset-block-start: $open-btn-top;
inset-inline-start: 0;
line-height: $open-btn-size;
opacity: 1;
text-align: center;
transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
transition: all .1s linear .2s;
&::before {
position: absolute;
display: block;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABClJREFUaEPtmY1RFEEQhbsjUCIQIhAiUCNQIxAiECIQIxAiECIAIpAMhAiECIQI2vquZqnZvp6fhb3SK5mqq6Ju92b69bzXf6is+dI1t1+eAfztG5z1BsxsU0S+ici2iPB3vm5E5EpEDlSVv2dZswFIxv8UkZcNy+5EZGcuEHMCOBeR951uvVDVD53vVl+bE8DvDu8Pxtyo6ta/BsByg1R15Bwzqz5/LJgn34CZwfnPInI4BUB6/1hV0cSjVxcAM4PbcBZjL0XklIPN7Is3fLCkdQPpPYw/VNXj5IhPIvJWRIhSl6p60ULWBGBm30Vk123EwRxCuIzWkkjNrCZywith10ewE1Xdq4GoAjCz/RTXW44Ynt+LyBEfT43kYfbj86J3w5Q32DNcRQDpwF+dkQXDMey8xem0L3TEqB4g3PZWad8agBMRgZPeu96D1/C2Zbh3X0p80Op1xxloztN48bMQQNoc7+eLEuAoPSPiIDY4Ooo+E6ixeNXM+D3GERz2U3CIqMstLJUgJQDe+7eq6mub0NYEkLAKwEHkiBQDCZtddZCZ8d6r7JDwFkoARklHRPZUFVDVZWbwGuNrC4EfdOzFrRABh3Wnqhv+d70AEBLGFROPmeHlnM81G69UdSd6IUuM0GgUVn1uqWmg5EmMfBeEyB7Pe3txBkY+rGT8j0J+WXq/BgDkUCaqLgEAnwcRog0veMIqFAAwCy2wnw+bI2GaGboBgF9k5N0o0rUSGUb4eO0BeO9j/GYhkSHMHMTIqwGARX6p6a+nlPBl8kZuXMD9j6pKfF9aZuaFOdJCEL5D4eYb9wCYVCanrBmGyii/tIq+SLj/HQBCaM5bLzwfPqdQ6FpVHyra4IbuVbXaY7dETC2ESPNNWiIOi69CcdgSMXsh4tNSUiklMgwmC0aNd08Y5WAES6HHehM4gu97wyhBgWpgqXsrASglprDy7CwhehMZOSbK6JMSma+Fio1KltCmlBIj7gfZOGx8ppQSXrhzFnOhJ/31BDkjFHRvOd09x0mRBA9SFgxUgHpQg0q0t5ymPMlL+EnldFTfDA0NAmf+OTQ0X0sRouf7NNkYGhrOYNrxtIaGg83MNzVDSe3LXLhP7O/yrCsCz1zlWTpjWkuZAOBpX3yVnLqI1yLCOKU6qMrmP7SSrUEw54XF4WBIK5FxCMOr3lVsfGqNSmPzBXUnJTIX1jyVBq9wO6UObOpgC5GjO98vFKnTdQMZXxEsWZlDiCZMIxAbNxQOqlpVZtobejBaZNoBnRDzMFpkxvTQOD36BlrcySZuI6p1ACB6LU3wWuf5581+oHfD1vi89bz3nFUC8Nm7ZlP3nKkFbM4bWPt/MSFwklprYItwt6cmvpWJ2IVcQBCz6bLysSCv3SaANCiTsnaNRrNRqMXVVT1/BrAqz/buu/Y38Ad3KC5PARej0QAAAABJRU5ErkJggg==");
background-size: 100% 100%;
block-size: 22px;
content: "";
inline-size: 22px;
inset-block-start: 50%;
inset-inline-start: 50%;
transform: translate(-50%, -50%);
:dir(rtl) & {
margin-inline-start: 2px;
transform: translate(50%, -50%);
}
}
/* Customizer Hidden */
.customizer-hide & {
display: none;
}
:dir(rtl) & {
transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
}
}
&.template-customizer-open .template-customizer-open-btn {
opacity: 0;
transform: none;
transition-delay: 0s;
}
/* Customizer inner */
.template-customizer-inner {
position: relative;
overflow: auto;
flex: 0 1 auto;
-webkit-box-flex: 0;
opacity: 1;
transition: opacity .2s;
}
}
@media (max-width: $customizer-hide-width) {
#template-customizer {
display: none;
visibility: hidden;
}
}
.layout-menu-100vh #template-customizer {
block-size: 100dvh;
}
/* RTL */
:dir(rtl) {
#template-customizer:not(.template-customizer-open){
transform: translateX(-($customizer-width + $customizer-spacer));
}
}

View File

@@ -0,0 +1,7 @@
import * as bootstrap from 'bootstrap'
try {
window.bootstrap = bootstrap
} catch (e) {}
export { bootstrap }

View File

@@ -0,0 +1,990 @@
const TRANSITION_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd']
const DELTA = 5
class Menu {
constructor(el, config = {}, _PS = null) {
this._el = el
this._horizontal = config.orientation === 'horizontal'
this._animate = config.animate !== false
this._accordion = config.accordion !== false
this._showDropdownOnHover = Boolean(config.showDropdownOnHover)
this._closeChildren = Boolean(config.closeChildren)
this._rtl = document.documentElement.getAttribute('dir') === 'rtl' || document.body.getAttribute('dir') === 'rtl'
this._onOpen = config.onOpen || (() => {})
this._onOpened = config.onOpened || (() => {})
this._onClose = config.onClose || (() => {})
this._onClosed = config.onClosed || (() => {})
this._psScroll = null
this._topParent = null
this._menuBgClass = null
el.classList.add('menu')
el.classList[this._animate ? 'remove' : 'add']('menu-no-animation')
if (!this._horizontal) {
el.classList.add('menu-vertical')
el.classList.remove('menu-horizontal')
const PerfectScrollbarLib = _PS || window.PerfectScrollbar
if (PerfectScrollbarLib) {
this._scrollbar = new PerfectScrollbarLib(el.querySelector('.menu-inner'), {
suppressScrollX: true,
wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
})
window.Helpers.menuPsScroll = this._scrollbar
} else {
el.querySelector('.menu-inner').classList.add('overflow-auto')
}
} else {
el.classList.add('menu-horizontal')
el.classList.remove('menu-vertical')
this._inner = el.querySelector('.menu-inner')
const container = this._inner.parentNode
this._prevBtn = el.querySelector('.menu-horizontal-prev')
if (!this._prevBtn) {
this._prevBtn = document.createElement('a')
this._prevBtn.href = '#'
this._prevBtn.className = 'menu-horizontal-prev'
container.appendChild(this._prevBtn)
}
this._wrapper = el.querySelector('.menu-horizontal-wrapper')
if (!this._wrapper) {
this._wrapper = document.createElement('div')
this._wrapper.className = 'menu-horizontal-wrapper'
this._wrapper.appendChild(this._inner)
container.appendChild(this._wrapper)
}
this._nextBtn = el.querySelector('.menu-horizontal-next')
if (!this._nextBtn) {
this._nextBtn = document.createElement('a')
this._nextBtn.href = '#'
this._nextBtn.className = 'menu-horizontal-next'
container.appendChild(this._nextBtn)
}
this._innerPosition = 0
this.update()
}
// Switch to vertical menu on small screen for horizontal menu layout on page load
if (this._horizontal && window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
this.switchMenu('vertical')
} else {
this._bindEvents()
}
// Link menu instance to element
el.menuInstance = this
const semiDarkEl = localStorage.getItem(`templateCustomizer-${templateName}--SemiDark`)
if (semiDarkEl === 'true') {
document.querySelector('#layout-menu').setAttribute('data-bs-theme', 'dark')
}
}
_bindEvents() {
// Click Event
this._evntElClick = e => {
// Find top parent element
if (e.target.closest('ul') && e.target.closest('ul').classList.contains('menu-inner')) {
const menuItem = Menu._findParent(e.target, 'menu-item', false)
// eslint-disable-next-line prefer-destructuring
if (menuItem) this._topParent = menuItem.childNodes[0]
}
const toggleLink = e.target.classList.contains('menu-toggle')
? e.target
: Menu._findParent(e.target, 'menu-toggle', false)
if (toggleLink) {
e.preventDefault()
if (toggleLink.getAttribute('data-hover') !== 'true') {
this.toggle(toggleLink)
}
}
}
if ((!this._showDropdownOnHover && this._horizontal) || !this._horizontal || window.Helpers.isMobileDevice)
this._el.addEventListener('click', this._evntElClick)
this._evntWindowResize = () => {
this.update()
if (this._lastWidth !== window.innerWidth) {
this._lastWidth = window.innerWidth
this.update()
}
const horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']")
if (!this._horizontal && !horizontalMenuTemplate) this.manageScroll()
}
window.addEventListener('resize', this._evntWindowResize)
if (this._horizontal) {
this._evntPrevBtnClick = e => {
e.preventDefault()
if (this._prevBtn.classList.contains('disabled')) return
this._slide('prev')
}
this._prevBtn.addEventListener('click', this._evntPrevBtnClick)
this._evntNextBtnClick = e => {
e.preventDefault()
if (this._nextBtn.classList.contains('disabled')) return
this._slide('next')
}
this._nextBtn.addEventListener('click', this._evntNextBtnClick)
this._evntBodyClick = e => {
if (!this._inner.contains(e.target) && this._el.querySelectorAll('.menu-inner > .menu-item.open').length)
this.closeAll()
}
document.body.addEventListener('click', this._evntBodyClick)
if (this._showDropdownOnHover) {
/** ***********************************************
* Horizontal Menu Mouse Over Event
* ? e.target !== e.currentTarget condition to disable mouseover event on whole menu navbar
* ? !e.target.parentNode.classList.contains('open') to disable mouseover events on icon, text and dropdown arrow
*/
this._evntElMouseOver = e => {
if (e.target !== e.currentTarget && !e.target.parentNode.classList.contains('open')) {
const toggleLink = e.target.classList.contains('menu-toggle') ? e.target : null
if (toggleLink) {
e.preventDefault()
if (toggleLink.getAttribute('data-hover') !== 'true') {
this.toggle(toggleLink)
}
}
}
e.stopPropagation()
}
if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
this._el.addEventListener('mouseover', this._evntElMouseOver)
}
/** ***********************************************
* Horizontal Menu Mouse Out Event
* ? e.target !== e.currentTarget condition to disable mouseout event on whole menu navbar
* ? mouseOutEl.parentNode.classList.contains('open') to check if the mouseout element has open class or not
* ? !mouseOutEl.classList.contains('menu-toggle') to check if mouseout was from single menu item and not from the one which has submenu
* ? !mouseOverEl.parentNode.classList.contains('menu-link') to disable mouseout event for icon, text and dropdown arrow
*/
this._evntElMouseOut = e => {
const mainEl = e.currentTarget
const mouseOutEl = e.target
const mouseOverEl = e.toElement || e.relatedTarget
// Find absolute parent of any menu item from which mouseout event triggered
if (mouseOutEl.closest('ul') && mouseOutEl.closest('ul').classList.contains('menu-inner')) {
this._topParent = mouseOutEl
}
if (
mouseOutEl !== mainEl &&
(mouseOutEl.parentNode.classList.contains('open') || !mouseOutEl.classList.contains('menu-toggle')) &&
mouseOverEl &&
mouseOverEl.parentNode &&
!mouseOverEl.parentNode.classList.contains('menu-link')
) {
// When mouse goes totally out of menu items, check mouse over element to confirm it's not the child of menu, once confirmed close the menu
if (this._topParent && !Menu.childOf(mouseOverEl, this._topParent.parentNode)) {
const toggleLink = this._topParent.classList.contains('menu-toggle') ? this._topParent : null
if (toggleLink) {
e.preventDefault()
if (toggleLink.getAttribute('data-hover') !== 'true') {
this.toggle(toggleLink)
this._topParent = null
}
}
}
// When mouse enter the sub menu, check if it's child of the initially mouse overed menu item(Actual Parent),
// if it's the parent do not close the sub menu else close the sub menu
if (Menu.childOf(mouseOverEl, mouseOutEl.parentNode)) {
return
}
const toggleLink = mouseOutEl.classList.contains('menu-toggle') ? mouseOutEl : null
if (toggleLink) {
e.preventDefault()
if (toggleLink.getAttribute('data-hover') !== 'true') {
this.toggle(toggleLink)
}
}
}
e.stopPropagation()
}
if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
this._el.addEventListener('mouseout', this._evntElMouseOut)
}
}
}
}
static childOf(/* child node */ c, /* parent node */ p) {
// returns boolean
if (c.parentNode) {
while ((c = c.parentNode) && c !== p);
return !!c
}
return false
}
_unbindEvents() {
if (this._evntElClick) {
this._el.removeEventListener('click', this._evntElClick)
this._evntElClick = null
}
if (this._evntElMouseOver) {
this._el.removeEventListener('mouseover', this._evntElMouseOver)
this._evntElMouseOver = null
}
if (this._evntElMouseOut) {
this._el.removeEventListener('mouseout', this._evntElMouseOut)
this._evntElMouseOut = null
}
if (this._evntWindowResize) {
window.removeEventListener('resize', this._evntWindowResize)
this._evntWindowResize = null
}
if (this._evntBodyClick) {
document.body.removeEventListener('click', this._evntBodyClick)
this._evntBodyClick = null
}
if (this._evntInnerMousemove) {
this._inner.removeEventListener('mousemove', this._evntInnerMousemove)
this._evntInnerMousemove = null
}
if (this._evntInnerMouseleave) {
this._inner.removeEventListener('mouseleave', this._evntInnerMouseleave)
this._evntInnerMouseleave = null
}
}
static _isRoot(item) {
return !Menu._findParent(item, 'menu-item', false)
}
static _findParent(el, cls, throwError = true) {
if (el.tagName.toUpperCase() === 'BODY') return null
el = el.parentNode
while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
el = el.parentNode
}
el = el.tagName.toUpperCase() !== 'BODY' ? el : null
if (!el && throwError) throw new Error(`Cannot find \`.${cls}\` parent element`)
return el
}
static _findChild(el, cls) {
const items = el.childNodes
const found = []
for (let i = 0, l = items.length; i < l; i++) {
if (items[i].classList) {
let passed = 0
for (let j = 0; j < cls.length; j++) {
if (items[i].classList.contains(cls[j])) passed += 1
}
if (cls.length === passed) found.push(items[i])
}
}
return found
}
static _findMenu(item) {
let curEl = item.childNodes[0]
let menu = null
while (curEl && !menu) {
if (curEl.classList && curEl.classList.contains('menu-sub')) menu = curEl
curEl = curEl.nextSibling
}
if (!menu) throw new Error('Cannot find `.menu-sub` element for the current `.menu-toggle`')
return menu
}
// Has class
static _hasClass(cls, el = window.Helpers.ROOT_EL) {
let result = false
cls.split(' ').forEach(c => {
if (el.classList.contains(c)) result = true
})
return result
}
open(el, closeChildren = this._closeChildren) {
const item = this._findUnopenedParent(Menu._getItem(el, true), closeChildren)
if (!item) return
const toggleLink = Menu._getLink(item, true)
Menu._promisify(this._onOpen, this, item, toggleLink, Menu._findMenu(item))
.then(() => {
if (!this._horizontal || !Menu._isRoot(item)) {
if (this._animate && !this._horizontal) {
window.requestAnimationFrame(() => this._toggleAnimation(true, item, false))
if (this._accordion) this._closeOther(item, closeChildren)
} else if (this._animate) {
this._toggleDropdown(true, item, closeChildren)
// eslint-disable-next-line no-unused-expressions
this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
} else {
item.classList.add('open')
// eslint-disable-next-line no-unused-expressions
this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
if (this._accordion) this._closeOther(item, closeChildren)
}
} else {
this._toggleDropdown(true, item, closeChildren)
// eslint-disable-next-line no-unused-expressions
this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
}
})
.catch(() => {})
}
close(el, closeChildren = this._closeChildren, _autoClose = false) {
const item = Menu._getItem(el, true)
const toggleLink = Menu._getLink(el, true)
if (!item.classList.contains('open') || item.classList.contains('disabled')) return
Menu._promisify(this._onClose, this, item, toggleLink, Menu._findMenu(item), _autoClose)
.then(() => {
if (!this._horizontal || !Menu._isRoot(item)) {
if (this._animate && !this._horizontal) {
window.requestAnimationFrame(() => this._toggleAnimation(false, item, closeChildren))
} else {
item.classList.remove('open')
if (closeChildren) {
const opened = item.querySelectorAll('.menu-item.open')
for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
}
// eslint-disable-next-line no-unused-expressions
this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
}
} else {
this._toggleDropdown(false, item, closeChildren)
// eslint-disable-next-line no-unused-expressions
this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
}
})
.catch(() => {})
}
_closeOther(item, closeChildren) {
const opened = Menu._findChild(item.parentNode, ['menu-item', 'open'])
for (let i = 0, l = opened.length; i < l; i++) {
if (opened[i] !== item) this.close(opened[i], closeChildren)
}
}
toggle(el, closeChildren = this._closeChildren) {
const item = Menu._getItem(el, true)
if (item.classList.contains('open')) this.close(item, closeChildren)
else this.open(item, closeChildren)
}
_toggleDropdown(show, item, closeChildren) {
const menu = Menu._findMenu(item)
const actualItem = item
let subMenuItem = false
let nestingLevel = 0
if (show) {
// Check if this is a submenu item and calculate nesting level
let parentMenu = Menu._findParent(actualItem, 'menu-sub', false)
if (parentMenu) {
subMenuItem = true
// Calculate nesting level by counting parent menu-sub elements
let currentParent = parentMenu
while (currentParent) {
nestingLevel++
currentParent = Menu._findParent(currentParent.parentNode, 'menu-sub', false)
}
item = this._topParent ? this._topParent.parentNode : item
}
const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
const position = this._innerPosition
const itemOffset = this._getItemOffset(item)
const itemWidth = Math.round(item.getBoundingClientRect().width)
if (itemOffset - DELTA <= -1 * position) {
this._innerPosition = -1 * itemOffset
} else if (itemOffset + position + itemWidth + DELTA >= wrapperWidth) {
if (itemWidth > wrapperWidth) {
this._innerPosition = -1 * itemOffset
} else {
this._innerPosition = -1 * (itemOffset + itemWidth - wrapperWidth)
}
}
actualItem.classList.add('open')
const menuWidth = Math.round(menu.getBoundingClientRect().width)
if (subMenuItem) {
// Get the actual position of the submenu item relative to viewport
const actualItemRect = actualItem.getBoundingClientRect()
const wrapperRect = this._wrapper.getBoundingClientRect()
const actualItemOffset = actualItemRect.left - wrapperRect.left
// For nested submenus, calculate if there's enough space on the right
// considering the cumulative width of nested levels
const spaceNeeded = menuWidth + (nestingLevel > 1 ? menuWidth * 0.5 : 0)
if (actualItemOffset + actualItemRect.width + spaceNeeded > wrapperWidth && menuWidth < wrapperWidth) {
menu.style.left = this._rtl ? '100%' : '-105%'
}
} else if (
itemOffset + this._innerPosition + menuWidth > wrapperWidth &&
menuWidth < wrapperWidth &&
menuWidth > itemWidth
) {
menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = `-${menuWidth - itemWidth}px`
}
this._closeOther(actualItem, closeChildren)
this._updateSlider()
} else {
const toggle = Menu._findChild(item, ['menu-toggle'])
// eslint-disable-next-line no-unused-expressions
toggle.length && toggle[0].removeAttribute('data-hover', 'true')
item.classList.remove('open')
menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = null
menu.style.left = null
if (closeChildren) {
const opened = menu.querySelectorAll('.menu-item.open')
for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
}
}
}
_slide(direction) {
const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
const innerWidth = this._innerWidth
let newPosition
if (direction === 'next') {
newPosition = this._getSlideNextPos()
if (innerWidth + newPosition < wrapperWidth) {
newPosition = wrapperWidth - innerWidth
}
} else {
newPosition = this._getSlidePrevPos()
if (newPosition > 0) newPosition = 0
}
this._innerPosition = newPosition
this.update()
}
_getSlideNextPos() {
const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
const position = this._innerPosition
let curItem = this._inner.childNodes[0]
let left = 0
while (curItem) {
if (curItem.tagName) {
const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
if (left + position - DELTA <= wrapperWidth && left + position + curItemWidth + DELTA >= wrapperWidth) {
if (curItemWidth > wrapperWidth && left === -1 * position) left += curItemWidth
break
}
left += curItemWidth
}
curItem = curItem.nextSibling
}
return -1 * left
}
_getSlidePrevPos() {
const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
const position = this._innerPosition
let curItem = this._inner.childNodes[0]
let left = 0
while (curItem) {
if (curItem.tagName) {
const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
if (left - DELTA <= -1 * position && left + curItemWidth + DELTA >= -1 * position) {
if (curItemWidth <= wrapperWidth) left = left + curItemWidth - wrapperWidth
break
}
left += curItemWidth
}
curItem = curItem.nextSibling
}
return -1 * left
}
static _getItem(el, toggle) {
let item = null
const selector = toggle ? 'menu-toggle' : 'menu-link'
if (el.classList.contains('menu-item')) {
if (Menu._findChild(el, [selector]).length) item = el
} else if (el.classList.contains(selector)) {
item = el.parentNode.classList.contains('menu-item') ? el.parentNode : null
}
if (!item) {
throw new Error(`${toggle ? 'Toggable ' : ''}\`.menu-item\` element not found.`)
}
return item
}
static _getLink(el, toggle) {
let found = []
const selector = toggle ? 'menu-toggle' : 'menu-link'
if (el.classList.contains(selector)) found = [el]
else if (el.classList.contains('menu-item')) found = Menu._findChild(el, [selector])
if (!found.length) throw new Error(`\`${selector}\` element not found.`)
return found[0]
}
_findUnopenedParent(item, closeChildren) {
let tree = []
let parentItem = null
while (item) {
if (item.classList.contains('disabled')) {
parentItem = null
tree = []
} else {
if (!item.classList.contains('open')) parentItem = item
tree.push(item)
}
item = Menu._findParent(item, 'menu-item', false)
}
if (!parentItem) return null
if (tree.length === 1) return parentItem
tree = tree.slice(0, tree.indexOf(parentItem))
for (let i = 0, l = tree.length; i < l; i++) {
tree[i].classList.add('open')
if (this._accordion) {
const openedItems = Menu._findChild(tree[i].parentNode, ['menu-item', 'open'])
for (let j = 0, k = openedItems.length; j < k; j++) {
if (openedItems[j] !== tree[i]) {
openedItems[j].classList.remove('open')
if (closeChildren) {
const openedChildren = openedItems[j].querySelectorAll('.menu-item.open')
for (let x = 0, z = openedChildren.length; x < z; x++) {
openedChildren[x].classList.remove('open')
}
}
}
}
}
}
return parentItem
}
_toggleAnimation(open, item, closeChildren) {
const toggleLink = Menu._getLink(item, true)
const menu = Menu._findMenu(item)
Menu._unbindAnimationEndEvent(item)
const linkHeight = Math.round(toggleLink.getBoundingClientRect().height)
item.style.overflow = 'hidden'
const clearItemStyle = () => {
item.classList.remove('menu-item-animating')
item.classList.remove('menu-item-closing')
item.style.overflow = null
item.style.height = null
if (!this._horizontal) this.update()
}
if (open) {
item.style.height = `${linkHeight}px`
item.classList.add('menu-item-animating')
item.classList.add('open')
Menu._bindAnimationEndEvent(item, () => {
clearItemStyle()
this._onOpened(this, item, toggleLink, menu)
})
setTimeout(() => {
item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
}, 50)
} else {
item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
item.classList.add('menu-item-animating')
item.classList.add('menu-item-closing')
Menu._bindAnimationEndEvent(item, () => {
item.classList.remove('open')
clearItemStyle()
if (closeChildren) {
const opened = item.querySelectorAll('.menu-item.open')
for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
}
this._onClosed(this, item, toggleLink, menu)
})
setTimeout(() => {
item.style.height = `${linkHeight}px`
}, 50)
}
}
static _bindAnimationEndEvent(el, handler) {
const cb = e => {
if (e.target !== el) return
Menu._unbindAnimationEndEvent(el)
handler(e)
}
let duration = window.getComputedStyle(el).transitionDuration
duration = parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000)
el._menuAnimationEndEventCb = cb
TRANSITION_EVENTS.forEach(ev => el.addEventListener(ev, el._menuAnimationEndEventCb, false))
el._menuAnimationEndEventTimeout = setTimeout(() => {
cb({ target: el })
}, duration + 50)
}
_getItemOffset(item) {
let curItem = this._inner.childNodes[0]
let left = 0
while (curItem !== item) {
if (curItem.tagName) {
left += Math.round(curItem.getBoundingClientRect().width)
}
curItem = curItem.nextSibling
}
return left
}
_updateSlider(wrapperWidth = null, innerWidth = null, position = null) {
const _wrapperWidth = wrapperWidth !== null ? wrapperWidth : Math.round(this._wrapper.getBoundingClientRect().width)
const _innerWidth = innerWidth !== null ? innerWidth : this._innerWidth
const _position = position !== null ? position : this._innerPosition
if (_innerWidth < _wrapperWidth || window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
this._prevBtn.classList.add('d-none')
this._nextBtn.classList.add('d-none')
} else {
this._prevBtn.classList.remove('d-none')
this._nextBtn.classList.remove('d-none')
}
if (_innerWidth > _wrapperWidth && window.innerWidth > window.Helpers.LAYOUT_BREAKPOINT) {
if (_position === 0) this._prevBtn.classList.add('disabled')
else this._prevBtn.classList.remove('disabled')
if (_innerWidth + _position <= _wrapperWidth) this._nextBtn.classList.add('disabled')
else this._nextBtn.classList.remove('disabled')
}
}
static _promisify(fn, ...args) {
const result = fn(...args)
if (result instanceof Promise) {
return result
}
if (result === false) {
return Promise.reject()
}
return Promise.resolve()
}
get _innerWidth() {
const items = this._inner.childNodes
let width = 0
for (let i = 0, l = items.length; i < l; i++) {
if (items[i].tagName) {
width += Math.round(items[i].getBoundingClientRect().width)
}
}
return width
}
get _innerPosition() {
return parseInt(this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] || '0px', 10)
}
set _innerPosition(value) {
this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] = `${value}px`
return value
}
static _unbindAnimationEndEvent(el) {
const cb = el._menuAnimationEndEventCb
if (el._menuAnimationEndEventTimeout) {
clearTimeout(el._menuAnimationEndEventTimeout)
el._menuAnimationEndEventTimeout = null
}
if (!cb) return
TRANSITION_EVENTS.forEach(ev => el.removeEventListener(ev, cb, false))
el._menuAnimationEndEventCb = null
}
closeAll(closeChildren = this._closeChildren) {
const opened = this._el.querySelectorAll('.menu-inner > .menu-item.open')
for (let i = 0, l = opened.length; i < l; i++) this.close(opened[i], closeChildren)
}
static setDisabled(el, disabled) {
Menu._getItem(el, false).classList[disabled ? 'add' : 'remove']('disabled')
}
static isActive(el) {
return Menu._getItem(el, false).classList.contains('active')
}
static isOpened(el) {
return Menu._getItem(el, false).classList.contains('open')
}
static isDisabled(el) {
return Menu._getItem(el, false).classList.contains('disabled')
}
update() {
if (!this._horizontal) {
if (this._scrollbar) {
this._scrollbar.update()
}
} else {
this.closeAll()
const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
const innerWidth = this._innerWidth
let position = this._innerPosition
if (wrapperWidth - position > innerWidth) {
position = wrapperWidth - innerWidth
if (position > 0) position = 0
this._innerPosition = position
}
this._updateSlider(wrapperWidth, innerWidth, position)
}
}
manageScroll() {
const { PerfectScrollbar } = window
const menuInner = document.querySelector('.menu-inner')
if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
if (this._scrollbar !== null) {
this._scrollbar.destroy()
this._scrollbar = null
}
menuInner.classList.add('overflow-auto')
} else {
if (this._scrollbar === null) {
const menuScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
suppressScrollX: true,
wheelPropagation: false
})
this._scrollbar = menuScroll
}
menuInner.classList.remove('overflow-auto')
}
}
switchMenu(menu) {
// Unbind Events
this._unbindEvents()
// const html = document.documentElement
const navbar = document.querySelector('nav.layout-navbar')
const navbarCollapse = document.querySelector('#navbar-collapse')
const asideMenuWrapper = document.querySelector('#layout-menu div')
const asideMenu = document.querySelector('#layout-menu')
const horzMenuClasses = ['layout-menu-horizontal', 'menu', 'menu-horizontal', 'container-fluid', 'flex-grow-0']
const vertMenuClasses = ['layout-menu', 'menu', 'menu-vertical']
const horzMenuWrapper = document.querySelector('.menu-horizontal-wrapper')
const menuInner = document.querySelector('.menu-inner')
const brand = document.querySelector('.app-brand')
const menuToggler = document.querySelector('.layout-menu-toggle')
const activeMenuItems = document.querySelectorAll('.menu-inner .active')
const { PerfectScrollbar } = window
if (menu === 'vertical') {
this._horizontal = false
asideMenuWrapper.insertBefore(brand, horzMenuWrapper)
asideMenuWrapper.insertBefore(menuInner, horzMenuWrapper)
asideMenuWrapper.classList.add('flex-column', 'p-0')
asideMenu.classList.remove(...asideMenu.classList)
asideMenu.classList.add(...vertMenuClasses, this._menuBgClass)
brand.classList.remove('d-none', 'd-lg-flex')
menuToggler.classList.remove('d-none')
if (PerfectScrollbar !== undefined) {
this._psScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
suppressScrollX: true,
wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
})
}
menuInner.classList.add('overflow-auto')
// Add open class to active items
for (let i = 0; i < activeMenuItems.length - 1; ++i) {
activeMenuItems[i].classList.add('open')
}
} else {
this._horizontal = true
navbar.children[0].insertBefore(brand, navbarCollapse)
brand.classList.add('d-none', 'd-lg-flex')
horzMenuWrapper.appendChild(menuInner)
asideMenuWrapper.classList.remove('flex-column', 'p-0')
asideMenu.classList.remove(...asideMenu.classList)
asideMenu.classList.add(...horzMenuClasses, this._menuBgClass)
menuToggler.classList.add('d-none')
menuInner.classList.remove('overflow-auto')
// Remove open class from active items
for (let i = 0; i < activeMenuItems.length; ++i) {
activeMenuItems[i].classList.remove('open')
}
}
const semiDarkEl = localStorage.getItem(`templateCustomizer-${templateName}--SemiDark`)
if (semiDarkEl) {
asideMenu.setAttribute('data-bs-theme', 'dark')
}
this._bindEvents()
}
destroy() {
if (!this._el) return
this._unbindEvents()
const items = this._el.querySelectorAll('.menu-item')
for (let i = 0, l = items.length; i < l; i++) {
Menu._unbindAnimationEndEvent(items[i])
items[i].classList.remove('menu-item-animating')
items[i].classList.remove('open')
items[i].style.overflow = null
items[i].style.height = null
}
const menus = this._el.querySelectorAll('.menu-menu')
for (let i2 = 0, l2 = menus.length; i2 < l2; i2++) {
menus[i2].style.marginRight = null
menus[i2].style.marginLeft = null
}
this._el.classList.remove('menu-no-animation')
if (this._wrapper) {
this._prevBtn.parentNode.removeChild(this._prevBtn)
this._nextBtn.parentNode.removeChild(this._nextBtn)
this._wrapper.parentNode.insertBefore(this._inner, this._wrapper)
this._wrapper.parentNode.removeChild(this._wrapper)
this._inner.style.marginLeft = null
this._inner.style.marginRight = null
}
this._el.menuInstance = null
delete this._el.menuInstance
this._el = null
this._horizontal = null
this._animate = null
this._accordion = null
this._showDropdownOnHover = null
this._closeChildren = null
this._rtl = null
this._onOpen = null
this._onOpened = null
this._onClose = null
this._onClosed = null
if (this._scrollbar) {
this._scrollbar.destroy()
this._scrollbar = null
}
this._inner = null
this._prevBtn = null
this._wrapper = null
this._nextBtn = null
}
}
window.Menu = Menu
export { Menu }

View File

@@ -0,0 +1,9 @@
// import { autocomplete } from '@algolia/autocomplete-js';
import { autocomplete, getAlgoliaResults } from '@algolia/autocomplete-js';
try {
window.autocomplete = autocomplete;
} catch (e) {}
export { autocomplete };

View File

@@ -0,0 +1,8 @@
import jQuery from 'jquery/dist/jquery';
const $ = jQuery;
try {
window.jQuery = window.$ = jQuery;
} catch (e) {}
export { jQuery, $ };

View File

@@ -0,0 +1,3 @@
import nodeWaves from 'node-waves/src/js/waves';
export { nodeWaves };

View File

@@ -0,0 +1,3 @@
/* Waves
******************************************************************************* */
@import "node-waves/src/scss/waves";

View File

@@ -0,0 +1,7 @@
import PerfectScrollbar from 'perfect-scrollbar/dist/perfect-scrollbar';
try {
window.PerfectScrollbar = PerfectScrollbar;
} catch (e) {}
export { PerfectScrollbar };

View File

@@ -0,0 +1,85 @@
@import "../../scss/_bootstrap-extended/include";
@import "perfect-scrollbar/css/perfect-scrollbar";
$ps-width: .25rem !default;
$ps-hover-width: .375rem !default;
.ps {
position: relative;
.ps__rail-x {
block-size: $ps-width;
}
.ps__rail-y {
z-index: 3;
inline-size: $ps-width;
}
.ps__rail-x,
.ps__rail-y,
.ps__thumb-x,
.ps__thumb-y {
@include border-radius($border-radius-pill);
}
.ps__rail-x:hover,
.ps__rail-x:focus,
.ps__rail-x.ps--clicking,
.ps__rail-x:hover > .ps__thumb-x,
.ps__rail-x:focus > .ps__thumb-x,
.ps__rail-x.ps--clicking > .ps__thumb-x {
block-size: $ps-hover-width;
}
.ps__rail-y:hover,
.ps__rail-y:focus,
.ps__rail-y.ps--clicking,
.ps__rail-y:hover > .ps__thumb-y,
.ps__rail-y:focus > .ps__thumb-y,
.ps__rail-y.ps--clicking > .ps__thumb-y {
inline-size: $ps-hover-width;
}
.ps__thumb-x {
block-size: $ps-width;
inset-block-end: 0;
}
.ps__thumb-y {
inline-size: $ps-width;
inset-inline-end: 0;
}
.ps__thumb-x,
.ps__thumb-y {
background-color: var(--#{$prefix}gray-400);
}
.ps__rail-x:hover,
.ps__rail-y:hover,
.ps__rail-x:focus,
.ps__rail-y:focus,
.ps__rail-x.ps--clicking,
.ps__rail-y.ps--clicking {
background-color: var(--#{$prefix}gray-200);
}
.ps__rail-x:hover > .ps__thumb-x,
.ps__rail-y:hover > .ps__thumb-y,
.ps__rail-x:focus > .ps__thumb-x,
.ps__rail-y:focus > .ps__thumb-y,
.ps__rail-x.ps--clicking > .ps__thumb-x,
.ps__rail-y.ps--clicking > .ps__thumb-y {
background-color: var(--#{$prefix}gray-700);
}
}
/* Firefox width issue fixed */
@supports (-moz-appearance: none) {
#both-scrollbars-example {
margin-block: 0;
margin-inline: auto;
max-inline-size: 1080px;
padding-inline: 0;
}
}

View File

@@ -0,0 +1,9 @@
@import "@simonwep/pickr/dist/themes/classic.min";
.pcr-app[data-theme="classic"] .pcr-selection .pcr-color-preview{
margin-inline-end: .75em;
}
.pcr-app[data-theme="classic"] .pcr-selection .pcr-color-chooser,
.pcr-app[data-theme="classic"] .pcr-selection .pcr-color-opacity {
margin-inline: .45em;
}

View File

@@ -0,0 +1,11 @@
@import "@simonwep/pickr/dist/themes/monolith.min";
.pcr-app[data-theme="monolith"] .pcr-selection .pcr-color-preview .pcr-last-color {
@include border-radius(0);
@include border-start-radius(.15em);
}
.pcr-app[data-theme="monolith"] .pcr-selection .pcr-color-preview .pcr-current-color {
@include border-radius(0);
@include border-end-radius(.15em);
}

View File

@@ -0,0 +1,5 @@
@import "@simonwep/pickr/dist/themes/nano.min";
.pcr-app[data-theme="nano"] .pcr-selection .pcr-color-preview {
margin-inline: .6em;
}

View File

@@ -0,0 +1,33 @@
/* Pickr */
/* ******************************************************************************* */
@import "../../scss/_bootstrap-extended/include";
@import "pickr-classic";
@import "pickr-monolith";
@import "pickr-nano";
/* Update as per the customizer settings */
.pcr-app{
z-index: 999999999;
background: var(--#{$prefix}paper-bg);
.pcr-interaction input{
&.pcr-type.active,
&.pcr-save {
background: var(--#{$prefix}primary);
}
&.pcr-result{
border: 1px solid var(--#{$prefix}border-color);
background: var(--#{$prefix}body-bg);
color: var(--#{$prefix}base-color);
}
&:focus {
box-shadow: 0 0 0 1px rgba(var(--#{$prefix}paper-bg-rgb), .85), 0 0 0 3px rgba(var(--#{$prefix}primary-rgb), .75);
}
}
.pcr-type:not(.active) {
background: var(--#{$prefix}body-bg);
color: var(--#{$prefix}body-color);
}
}

View File

@@ -0,0 +1,7 @@
import Pickr from '@simonwep/pickr/dist/pickr.es5.min';
try {
window.Pickr = Pickr;
} catch (e) {}
export { Pickr };

View File

@@ -0,0 +1,10 @@
import Popper from '@popperjs/core/dist/umd/popper.min';
// Required to enable animations on dropdowns/tooltips/popovers
// Popper.Defaults.modifiers.computeStyle.gpuAcceleration = false
try {
window.Popper = Popper;
} catch (e) {}
export { Popper };

View File

@@ -0,0 +1,134 @@
{
"name": "Vuexy",
"version": "3.0.0",
"private": true,
"license": "Commercial",
"files": [
".buildrc.json",
".browserslistrc"
],
"scripts": {
"build": "npx gulp build",
"build:js": "npx gulp build:js",
"build:theme": "npx gulp build:theme",
"build:css": "npx gulp build:css",
"build:fonts": "npx gulp build:fonts",
"build:prod": "npx gulp build --env=production",
"build:prod:js": "npx gulp build:js --env=production",
"build:prod:css": "npx gulp build:css --env=production",
"build:prod:fonts": "npx gulp build:fonts --env=production",
"watch": "npx gulp watch",
"serve": "npx gulp serve",
"format:scss": "npx stylelint --fix \"**/*.scss\""
},
"dependencies": {
"@algolia/autocomplete-js": "1.18.1",
"@algolia/autocomplete-theme-classic": "1.18.1",
"@iconify/json": "2.2.332",
"@iconify/tools": "4.1.2",
"@iconify/types": "2.0.0",
"@iconify/utils": "2.3.0",
"@popperjs/core": "2.11.8",
"@simonwep/pickr": "1.9.1",
"bootstrap": "5.3.5",
"hammerjs": "2.0.8",
"jquery": "3.7.1",
"node-waves": "0.7.6",
"perfect-scrollbar": "1.5.6"
},
"devDependencies": {
"@babel/core": "7.26.10",
"@babel/plugin-transform-destructuring": "7.23.3",
"@babel/plugin-transform-object-rest-spread": "7.23.4",
"@babel/plugin-transform-template-literals": "7.23.3",
"@babel/preset-env": "7.26.9",
"@stylistic/stylelint-config": "1.0.1",
"@stylistic/stylelint-plugin": "2.1.3",
"ajv": "8.17.1",
"ansi-colors": "4.1.3",
"babel-loader": "9.1.3",
"browser-sync": "3.0.4",
"color-support": "1.1.3",
"css-loader": "6.9.1",
"deepmerge": "4.3.1",
"del": "8.0.0",
"eslint": "9.16.0",
"eslint-config-airbnb-base": "15.0.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-prettier": "5.2.6",
"fancy-log": "2.0.0",
"gulp": "4.0.2",
"gulp-autoprefixer": "8.0.0",
"gulp-dart-sass": "1.1.0",
"gulp-environment": "1.5.2",
"gulp-exec": "5.0.0",
"gulp-if": "3.0.0",
"gulp-purgecss": "7.0.2",
"gulp-rename": "2.0.0",
"gulp-replace": "1.1.4",
"gulp-sourcemaps": "3.0.0",
"gulp-uglify": "3.0.2",
"gulp-useref": "5.0.0",
"html-loader": "4.2.0",
"js-beautify": "1.15.4",
"prettier": "3.5.3",
"sass": "1.76.0",
"sass-loader": "14.0.0",
"string-replace-webpack-plugin": "0.1.3",
"style-loader": "3.3.4",
"stylelint": "16.19.1",
"stylelint-config-idiomatic-order": "10.0.0",
"stylelint-config-standard-scss": "13.1.0",
"stylelint-use-logical-spec": "5.0.1",
"terser-webpack-plugin": "5.3.14",
"webpack": "5.89.0",
"yarn": "1.22.22"
},
"overrides": {
"algoliasearch": "5.17.1",
"@algolia/client-search": "5.17.1",
"@algolia/autocomplete-plugin-algolia-insights": "1.18.1",
"prop-types": "15.8.1",
"postcss": "8.5.3",
"search-insights": "2.17.3",
"superagent": "3.8.3",
"chokidar": "3.6.0",
"source-map-resolve": "0.6.0",
"sass": "1.76.0",
"rimraf": "4.0.0"
},
"resolutions": {
"algoliasearch": "5.17.1",
"@algolia/client-search": "5.17.1",
"@algolia/autocomplete-plugin-algolia-insights": "1.18.1",
"prop-types": "15.8.1",
"postcss": "8.5.3",
"search-insights": "2.17.3",
"superagent": "3.8.3",
"chokidar": "3.6.0",
"source-map-resolve": "0.6.0",
"sass": "1.76.0",
"rimraf": "4.0.0",
"eslint": "9.16.0",
"react": "19.1.0",
"react-dom": "19.1.0"
},
"gulp-environment": {
"environments": [
{
"name": "development",
"aliases": [
"dev"
]
},
{
"name": "production",
"aliases": [
"prod"
]
}
],
"default": "development"
}
}

View File

@@ -0,0 +1,37 @@
// Configuration
@import "_bootstrap-extended/include";
@import "_bootstrap-extended/utilities";
// Layout & components
@import "_bootstrap-extended/root";
@import "_bootstrap-extended/skin";
@import "_bootstrap-extended/reboot";
@import "_bootstrap-extended/type";
@import "_bootstrap-extended/tables";
@import "_bootstrap-extended/forms";
@import "_bootstrap-extended/buttons";
@import "_bootstrap-extended/dropdown";
@import "_bootstrap-extended/button-group";
@import "_bootstrap-extended/nav";
@import "_bootstrap-extended/navbar";
@import "_bootstrap-extended/card";
@import "_bootstrap-extended/accordion";
@import "_bootstrap-extended/breadcrumb";
@import "_bootstrap-extended/pagination";
@import "_bootstrap-extended/badge";
@import "_bootstrap-extended/alert";
@import "_bootstrap-extended/progress";
@import "_bootstrap-extended/list-group";
@import "_bootstrap-extended/toasts";
@import "_bootstrap-extended/modal";
@import "_bootstrap-extended/tooltip";
@import "_bootstrap-extended/popover";
@import "_bootstrap-extended/carousel";
@import "_bootstrap-extended/spinners";
@import "_bootstrap-extended/offcanvas";
// Helpers
@import "_bootstrap-extended/helpers";
// Utilities
@import "bootstrap/scss/utilities/api";

View File

@@ -0,0 +1,234 @@
// Accordions
// *******************************************************************************
.accordion {
--#{$prefix}accordion-box-shadow: #{$box-shadow-xs};
--#{$prefix}accordion-active-box-shadow: #{$box-shadow};
--#{$prefix}accordion-active-bg: var(--#{$prefix}accordion-bg);
--#{$prefix}accordion-btn-active-bg: var(--#{$prefix}accordion-active-bg);
--#{$prefix}accordion-btn-focus-box-shadow: none;
--#{$prefix}accordion-btn-focus-shadow-width: 0;
.accordion-button {
padding-inline-start: calc($accordion-padding-x + .25rem);
&::after {
background: var(--#{$prefix}accordion-btn-color);
mask-image: var(--#{$prefix}accordion-btn-icon);
mask-repeat: no-repeat;
mask-size: 100% 100%;
}
&:not(.collapsed) {
&::after {
mask-image: var(--#{$prefix}accordion-btn-active-icon);
}
}
}
.accordion-body {
padding-inline-start: calc($accordion-body-padding-x + .25rem);
}
&.accordion-without-arrow {
.accordion-button::after {
background: none;
}
}
&:not(.accordion-custom-button):not(.accordion-arrow-left) {
.accordion-item {
@include border-radius(var(--#{$prefix}accordion-border-radius));
> .accordion-header .accordion-button {
@include border-radius(var(--#{$prefix}accordion-inner-border-radius));
}
&:not(:first-of-type) {
border-block-start: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color);
}
&:not(:last-of-type) {
margin-block-end: $spacer * .5;
}
}
}
// Outline variant
&[class*="accordion-outline-"] {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-bg: transparent;
--#{$prefix}accordion-active-bg: transparent;
--#{$prefix}accordion-border-width: #{$accordion-border-width};
}
// Bordered with Background variant
&[class*="border-background-"] {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-border-width: #{$accordion-border-width};
}
// Solid Accordion With Active Border
&[class*="accordion-border-solid-"] {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-border-width: #{$accordion-border-width};
.accordion-button.collapsed::after {
background-image: str-replace(str-replace($accordion-button-icon, "#{$accordion-icon-color}", CURRE), "#", "%23");
}
}
}
.accordion-item {
box-shadow: var(--#{$prefix}accordion-box-shadow);
&.active {
background-color: var(--#{$prefix}accordion-active-bg);
box-shadow: var(--#{$prefix}accordion-active-box-shadow);
}
}
.accordion-header {
line-height: $line-height-base;
& + .accordion-collapse .accordion-body {
padding-block-start: 0;
}
}
/* Accordion border radius */
.accordion-button {
font-weight: inherit;
&::after{
margin-inline-end: initial;
margin-inline-start: auto;
}
&:not(.collapsed) {
background-color: var(--#{$prefix}accordion-btn-active-bg);
box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-btn-focus-shadow-width)) 0 var(--#{$prefix}accordion-border-color);
}
&.collapsed {
&::after {
transform: rotate(-90deg);
:dir(rtl) & {
transform: rotate(90deg);
}
}
}
}
/* arrow left */
.accordion-arrow-left {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-btn-padding-y: calc(#{$accordion-padding-y} + .0625rem);
--#{$prefix}accordion-btn-padding-x: 0;
--#{$prefix}accordion-body-padding-y: calc(#{$accordion-body-padding-y} + .0625rem);
.accordion-item {
&:not(:first-of-type) {
border-block-start: $accordion-border-width solid var(--#{$prefix}accordion-border-color);
}
}
.accordion-button {
padding-inline: 0;
&::after {
display: none;
}
&:not(.collapsed) {
&::before {
background: var(--#{$prefix}accordion-active-color);
mask-image: var(--#{$prefix}accordion-btn-active-icon);
transform: var(--#{$prefix}accordion-btn-icon-transform);
}
}
&.collapsed {
&::before {
transform: rotate(-90deg);
}
}
&::before {
background: var(--#{$prefix}accordion-btn-color);
block-size: var(--#{$prefix}accordion-btn-icon-width);
content: "";
inline-size: var(--#{$prefix}accordion-btn-icon-width);
margin-inline: 0 .9rem;
mask-image: var(--#{$prefix}accordion-btn-icon);
mask-repeat: no-repeat;
mask-size: 100% 100%;
@include transition(var(--#{$prefix}accordion-btn-icon-transition));
}
}
.accordion-header + .accordion-collapse .accordion-body {
padding-inline-start: calc(#{$accordion-padding-x} + .0625rem);
}
}
/* Accordion custom button */
.accordion-custom-button {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-border-width: #{$accordion-border-width};
--#{$prefix}accordion-border-color: var(--#{$prefix}border-color);
--#{$prefix}accordion-btn-bg: #fafafa;
--#{$prefix}accordion-btn-active-bg: #fafafa;
--#{$prefix}accordion-btn-padding-y: calc(#{$accordion-padding-y} + .02rem);
--#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};
--#{$prefix}accordion-btn-focus-shadow-width: #{$accordion-border-width};
--#{$prefix}accordion-btn-icon: #{escape-svg($accordion-custom-button-icon)};
--#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-custom-button-active-icon)};
.accordion-item {
.accordion-body {
padding-block-start: $accordion-body-padding-y;
}
}
}
/* Generate contextual modifier classes for colorizing the alert */
@each $state in map-keys($theme-colors) {
.accordion-header-#{$state} {
--#{$prefix}accordion-active-color: var(--#{$prefix}#{$state});
}
.accordion-border-background-#{$state} {
--#{$prefix}accordion-color: var(--#{$prefix}#{$state});
--#{$prefix}accordion-active-color: var(--#{$prefix}#{$state});
--#{$prefix}accordion-border-color: var(--#{$prefix}#{$state});
--#{$prefix}accordion-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) var(--#{$prefix}bg-label-tint-amount), var(--#{$prefix}#{$state}));
--#{$prefix}accordion-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) var(--#{$prefix}bg-label-tint-amount), var(--#{$prefix}#{$state}));
--#{$prefix}accordion-btn-color: var(--#{$prefix}#{$state});
}
.accordion-outline-#{$state} {
--#{$prefix}accordion-border-color: var(--#{$prefix}#{$state});
}
.accordion-solid-#{$state} {
--#{$prefix}accordion-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}accordion-active-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}accordion-btn-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}accordion-border-color: var(--#{$prefix}#{$state});
--#{$prefix}accordion-bg: var(--#{$prefix}#{$state});
--#{$prefix}accordion-active-bg: var(--#{$prefix}#{$state});
}
.accordion-border-solid-#{$state} {
--#{$prefix}accordion-btn-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}accordion-border-color: var(--#{$prefix}#{$state});
--#{$prefix}accordion-bg: var(--#{$prefix}#{$state});
--#{$prefix}accordion-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) var(--#{$prefix}bg-label-tint-amount), var(--#{$prefix}#{$state}));
--#{$prefix}accordion-active-color: var(--#{$prefix}#{$state});
}
}
/* Dark Theme */
@if $enable-dark-mode {
@include color-mode(dark) {
.accordion {
&:not([class*="accordion-border-background-"], [class*="accordion-border-solid-"], [class*="accordion-solid-"]) {
--#{$prefix}accordion-btn-color: #{$accordion-button-color-dark};
}
&:not([class*="accordion-header-"], [class*="accordion-border-background-"], [class*="accordion-border-solid-"], [class*="accordion-solid-"]) {
--#{$prefix}accordion-active-color: #{$accordion-button-active-color-dark};
}
}
.accordion-custom-button {
--#{$prefix}accordion-btn-bg: #353a52;
--#{$prefix}accordion-btn-active-bg: #353a52;
.accordion-button::after {
--#{$prefix}accordion-btn-icon: #{escape-svg($accordion-custom-button-icon-dark)};
--#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-custom-button-active-icon-dark)};
}
}
}
}

View File

@@ -0,0 +1,96 @@
// Alerts
// *******************************************************************************
/* Alert icon styles */
.alert {
--#{$prefix}alert-link-hover-color: var(--#{$prefix}primary);
--#{$prefix}alert-hr: var(--#{$prefix}black);
--#{$prefix}alert-icon-color: var(--#{$prefix}white);
--#{$prefix}alert-icon-bg: var(--#{$prefix}black);
--#{$prefix}alert-close-icon: var(--#{$prefix}black);
line-height: 1.375rem;
&[class*="alert-"] {
hr {
background-color: var(--#{$prefix}alert-hr);
color: var(--#{$prefix}alert-hr);
}
}
.alert-link {
&:hover {
color: var(--#{$prefix}alert-link-hover-color);
}
}
.alert-icon {
display: flex;
align-items: center;
justify-content: center;
background-color: var(--#{$prefix}alert-icon-bg);
block-size: $alert-icon-size;
color: var(--#{$prefix}alert-icon-color);
inline-size: $alert-icon-size;
margin-inline-end: $spacer;
}
&[class*="alert-solid-"] {
--#{$prefix}alert-link-color: var(--#{$prefix}white);
--#{$prefix}alert-link-hover-color: var(--#{$prefix}white);
--#{$prefix}alert-hr: var(--#{$prefix}white);
--#{$prefix}alert-icon-bg: var(--#{$prefix}white);
--#{$prefix}alert-close-icon: var(--#{$prefix}white);
.alert-icon {
box-shadow: $box-shadow-xs;
}
}
}
/* Adjust close link position */
.alert-dismissible {
padding-inline-end: $alert-dismissible-padding-r;
padding-inline-start: $alert-padding-x;
.btn-close {
padding: 0;
background: var(--#{$prefix}alert-close-icon);
block-size: .8125rem;
filter: none;
inline-size: .8125rem;
inset-inline: auto 0;
margin-block: calc(#{$alert-padding-y} * 1.35);
margin-inline: calc(#{$alert-padding-x} * 1.15);
mask-image: str-replace($btn-close-bg, "#{$btn-close-color}", currentColor);
mask-repeat: no-repeat;
mask-size: 100% 100%;
}
}
// scss-docs-start alert-modifiers
// Generate contextual modifier classes for colorizing the alert
@each $state in map-keys($theme-colors) {
.alert-#{$state} {
--#{$prefix}alert-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-close-icon: var(--#{$prefix}#{$state});
--#{$prefix}alert-link-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-link-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-hr: var(--#{$prefix}#{$state});
--#{$prefix}alert-icon-bg: var(--#{$prefix}#{$state});
--#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-bg-subtle);
}
.alert-solid-#{$state} {
--#{$prefix}alert-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}alert-bg: var(--#{$prefix}#{$state});
--#{$prefix}alert-border-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-icon-color: var(--#{$prefix}#{$state});
}
.alert-outline-#{$state} {
--#{$prefix}alert-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-close-icon: var(--#{$prefix}#{$state});
--#{$prefix}alert-link-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-link-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-border-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-hr: var(--#{$prefix}#{$state});
--#{$prefix}alert-icon-color: var(--#{$prefix}#{$state});
--#{$prefix}alert-icon-bg: var(--#{$prefix}#{$state}-bg-subtle);
}
}
// scss-docs-end alert-modifiers

View File

@@ -0,0 +1,92 @@
// Badges
// ? Bootstrap use bg-label-variant and bg color for solid and label style, hence we have not created mixin for that.
// *******************************************************************************
.badge {
--#{$prefix}badge-border-width: #{$badge-border-width};
--#{$prefix}badge-border-color: var(--#{$prefix}primary);
--#{$prefix}badge-bg-color: #{$badge-bg-color};
border: var(--#{$prefix}badge-border-width) var(--#{$prefix}border-style) var(--#{$prefix}badge-border-color);
background-color: var(--#{$prefix}badge-bg-color);
--#{$prefix}badge-border-radius: #{$border-radius-sm};
--#{$prefix}badge-glow-shadow-color: var(--#{$prefix}primary-rgb);
// badge outline style
&[class*="badge-outline"] {
--#{$prefix}badge-border-width: 1px;
background-color: transparent;
--#{$prefix}badge-padding-x: #{calc($badge-padding-x - .0625rem)};
--#{$prefix}badge-padding-y: #{calc($badge-padding-y - .0625rem)};
}
// badge glow style
&.bg-glow[class*="bg-"] {
box-shadow: 0 .125rem .188rem 0 rgba(var(--#{$prefix}badge-glow-shadow-color), .3);
}
}
/* Badge Center Style */
.badge-center {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 3px;
block-size: #{$badge-height};
inline-size: #{$badge-width};
line-height: $line-height-base;
--#{$prefix}badge-font-size: #{$badge-center-font-size};
.icon-base {
@include icon-base(.875rem);
}
}
/* Dots Style */
.badge.badge-dot {
display: inline-block;
padding: 0;
@include border-radius(50%);
margin: 0;
block-size: .5rem;
inline-size: .5rem;
}
/* Notifications */
.badge.badge-notifications {
position: absolute;
margin: 0;
inset-block-start: auto;
transform: translate(-50%, -30%);
:dir(rtl) &{
transform: translate(50%, -30%);
}
&:not(.badge-center) {
font-size: .582rem;
line-height: .75rem;
padding-block: .05rem;
padding-inline: .2rem;
}
.btn[class*="btn-"] & {
transform: translate(-50%, -50%);
:dir(rtl) &{
transform: translate(50%, -50%);
}
}
}
@each $state in map-keys($theme-colors) {
.badge-outline-#{$state},
.btn[class*="-outline"] .badge-outline-#{$state} {
--#{$prefix}badge-color: var(--#{$prefix}#{$state});
--#{$prefix}badge-border-color: var(--#{$prefix}#{$state});
}
.bg-#{$state}.bg-glow {
--#{$prefix}badge-glow-shadow-color: var(--#{$prefix}#{$state}-rgb);
}
}

View File

@@ -0,0 +1,55 @@
// Breadcrumbs
// *******************************************************************************
.breadcrumb {
--#{$prefix}breadcrumb-color: #{$breadcrumb-color};
}
.breadcrumb-item {
a {
color: var(--#{$prefix}breadcrumb-color);
&:hover,
&:focus {
color: $breadcrumb-item-hover-color;
}
}
.icon-base.breadcrumb-icon {
color: var(--#{$prefix}breadcrumb-divider-color);
}
}
.breadcrumb-item.active a {
&,
&:hover,
&:focus,
&:active {
color: inherit;
}
}
.breadcrumb-custom-icon .breadcrumb-item + .breadcrumb-item::before {
content: none !important;
}
// RTL
// ******************************************************************************
:dir(rtl) {
.breadcrumb-item {
& + .breadcrumb-item {
padding-inline: $breadcrumb-item-padding-x 0;
&::before {
content: "#{$breadcrumb-divider-flipped}";
float: inline-start;
padding-inline: 0 $breadcrumb-item-padding-x;
}
}
.icon-base.breadcrumb-icon {
transform: scaleX(-1);
}
}
}

View File

@@ -0,0 +1,137 @@
// Button groups
// *******************************************************************************
.btn-group {
--#{$prefix}btn-group-border-radius: #{$btn-border-radius};
&.btn-group-sm {
--#{$prefix}btn-group-border-radius: #{$btn-border-radius-sm};
}
&.btn-group-xs {
--#{$prefix}btn-group-border-radius: #{$btn-border-radius-xs};
}
&.btn-group-lg {
--#{$prefix}btn-group-border-radius: #{$btn-border-radius-lg};
}
&.btn-group-xl {
--#{$prefix}btn-group-border-radius: #{$btn-border-radius-xl};
}
> :not(.btn-check:first-of-type) + .btn,
> .btn-group:not(:first-child) {
margin: 0;
margin-inline-start: calc(#{$btn-border-width} * -1);
}
&:has(> .dropdown-toggle) .btn[class*="btn-label-"] {
margin-inline-end: calc(#{$btn-border-width} * -1);
}
&:not(.btn-group-vertical) {
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn.dropdown-toggle-split:first-child,
> .btn-group:not(:last-child) > .btn,
> .btn:nth-child(n + 3),
> :not(.btn-check) + .btn,
> .btn-group:not(:first-child) > .btn {
@include border-radius(var(--#{$prefix}btn-group-border-radius));
}
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn.dropdown-toggle-split:first-child,
> .btn-group:not(:last-child) > .btn {
border-end-end-radius: 0 !important;
border-start-end-radius: 0 !important;
}
> .btn:nth-child(n + 3),
> :not(.btn-check) + .btn,
> .btn-group:not(:first-child) > .btn {
border-end-start-radius: 0 !important;
border-start-start-radius: 0 !important;
}
}
&.btn-group-vertical {
> :not(.btn-check:first-child) + .btn,
> .btn-group:not(:first-child) {
margin: 0;
margin-block-start: calc(#{$btn-border-width} * -1);
}
.btn:not([class*="btn-outline-"]) {
border-inline-color: var(--#{$prefix}btn-bg);
&:hover {
border-inline-color: var(--#{$prefix}btn-hover-bg);
}
}
> .btn:first-child,
> .btn.dropdown-toggle-split:first-child,
> .btn-group:first-child > .btn {
@include border-top-radius(var(--#{$prefix}btn-group-border-radius));
}
> .btn:last-child,
> .btn.dropdown-toggle-split:last-child,
> .btn-group:last-child > .btn {
@include border-bottom-radius(var(--#{$prefix}btn-group-border-radius));
}
}
}
// Split button
// *******************************************************************************
.dropdown-toggle-split,
.btn-lg + .dropdown-toggle-split,
.btn-group-lg > .btn + .dropdown-toggle-split,
.input-group-lg .btn + .dropdown-toggle-split,
.btn-xl + .dropdown-toggle-split,
.btn-group-xl > .btn + .dropdown-toggle-split {
padding-inline: .92em;
}
.btn-sm + .dropdown-toggle-split,
.btn-group-sm > .btn + .dropdown-toggle-split,
.input-group-sm .btn + .dropdown-toggle-split {
padding-inline: .6em;
}
.btn-xs + .dropdown-toggle-split,
.btn-group-xs > .btn + .dropdown-toggle-split {
padding-inline: .5em;
}
// Sizing
// *******************************************************************************
.btn-group-xs > .btn {
@extend .btn-xs;
}
.btn-group-xl > .btn {
@extend .btn-xl;
}
/* Button groups border */
.btn-group:not(.btn-group-vertical) > .btn-group:first-child > .btn:not([class*="btn-outline-"]):first-child,
.input-group > .btn:not([class*="btn-outline-"]):first-child,
:not(.btn-group, .input-group) > .btn-group:not(.btn-group-vertical) > .btn:not([class*="btn-outline-"]):first-child,
.input-group > .btn-group:first-child > .btn:not([class*="btn-outline-"]):first-child {
border-inline-start-color: transparent;
}
.btn-group:not(.btn-group-vertical) > .btn-group:last-child > .btn:not([class*="btn-outline-"]):last-of-type,
.input-group > .btn:not([class*="btn-outline-"]):last-of-type,
:not(.btn-group, .input-group) > .btn-group:not(.btn-group-vertical) > .btn:not([class*="btn-outline-"]):last-of-type,
.input-group > .btn-group:last-child > .btn:not([class*="btn-outline-"]):last-of-type {
border-inline-end-color: transparent;
}
.btn-group-vertical > .btn-group-vertical:first-child > .btn:not([class*="btn-outline-"]):first-child,
:not(.btn-group-vertical, .input-group) > .btn-group-vertical > .btn:not([class*="btn-outline-"]):first-child {
border-block-start-color: transparent;
}
.btn-group-vertical > .btn-group-vertical:last-child > .btn:not([class*="btn-outline-"]):last-of-type,
:not(.btn-group-vertical, .input-group) > .btn-group-vertical > .btn:not([class*="btn-outline-"]):last-of-type {
border-block-end-color: transparent;
}

View File

@@ -0,0 +1,363 @@
// Buttons
// *******************************************************************************
.btn {
--#{$prefix}btn-box-shadow-rgb: transparent;
--#{$prefix}btn-focus-shadow-rgb: transparent;
--#{$prefix}btn-active-shadow-rgb: transparent;
--#{$prefix}btn-box-shadow: 0 .125rem .375rem rgba(var(--#{$prefix}btn-box-shadow-rgb), .3);
--#{$prefix}btn-focus-box-shadow: 0 .125rem .375rem rgba(var(--#{$prefix}btn-focus-shadow-rgb), .3);
--#{$prefix}btn-active-border-color: transparent;
--#{$prefix}btn-active-shadow: 0 .125rem .375rem rgba(var(--#{$prefix}btn-active-shadow-rgb), .3);
display: inline-flex;
align-items: center;
justify-content: center;
box-shadow: var(--#{$prefix}btn-box-shadow);
.btn-group &,
.input-group & {
border-inline-end: $input-btn-border-width solid var(--#{$prefix}btn-group-border-color);
border-inline-start: $input-btn-border-width solid var(--#{$prefix}btn-group-border-color);
}
.btn-group-vertical & {
border-block-end: $input-btn-border-width solid var(--#{$prefix}btn-group-border-color);
border-block-start: $input-btn-border-width solid var(--#{$prefix}btn-group-border-color);
}
&.waves-effect:not(.waves-light) {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}btn-waves-effect-color), .2) 0,
rgba(var(--#{$prefix}btn-waves-effect-color), .3) 40%,
rgba(var(--#{$prefix}btn-waves-effect-color), .4) 50%,
rgba(var(--#{$prefix}btn-waves-effect-color), .5) 60%,
rgba(var(--#{$prefix}white-rgb), 0) 70%
);
}
}
.btn-check:checked + &,
:not(.btn-check) + &:active:not([class*="btn-label-"]),
&:first-child:active:not([class*="btn-label-"]),
&.active:not([class*="btn-label-"]),
&.show {
box-shadow: var(--#{$prefix}btn-active-shadow);
}
&:disabled,
&.disabled,
fieldset:disabled & {
box-shadow: none;
}
&:focus {
--#{$prefix}btn-color: var(--#{$prefix}btn-active-color);
--#{$prefix}btn-bg: var(--#{$prefix}btn-active-bg);
}
/* Table Action Dropdown fix */
&:not([class*="btn-"]):active,
&:not([class*="btn-"]).active,
&:not([class*="btn-"]).show,
&:not([class*="btn-"]) {
--#{$prefix}btn-border-width: 0;
}
/* Buttons Variant */
/* Label */
&[class*="btn-label-"] {
--#{$prefix}btn-box-shadow: none;
&:focus {
--#{$prefix}btn-color: var(--#{$prefix}btn-active-color);
--#{$prefix}btn-bg: var(--#{$prefix}btn-active-bg);
}
&:focus-visible {
--#{$prefix}btn-focus-box-shadow: none;
--#{$prefix}btn-active-box-shadow: none;
}
&.show {
--#{$prefix}btn-active-shadow: none;
}
}
/* Outline */
&[class*="btn-outline-"] {
&:not(:focus) {
--#{$prefix}btn-bg: transparent;
}
--#{$prefix}btn-box-shadow: none;
--#{$prefix}btn-focus-box-shadow: none;
--#{$prefix}btn-active-shadow: none;
--#{$prefix}btn-disabled-bg: transparent;
.badge {
--#{$prefix}badge-bg-color: var(--#{$prefix}btn-hover-bg);
--#{$prefix}badge-color: var(--#{$prefix}btn-hover-color);
}
&:hover .badge,
&:focus:hover .badge,
&:focus:not(:hover) .badge,
&:active .badge,
&.active .badge,
.show > &.dropdown-toggle .badge {
&:not([class*="badge-outline"]) {
--#{$prefix}badge-bg-color: var(--#{$prefix}btn-hover-color);
--#{$prefix}badge-color: var(--#{$prefix}btn-badge-color);
}
}
}
&.btn-white {
--#{$prefix}btn-bg: var(--#{$prefix}white);
--#{$prefix}btn-color: var(--#{$prefix}body-color);
--#{$prefix}btn-border-color: var(--#{$prefix}white);
--#{$prefix}btn-hover-color: var(--#{$prefix}black);
--#{$prefix}btn-hover-bg: var(--#{$prefix}btn-bg);
--#{$prefix}btn-hover-border-color: var(--#{$prefix}btn-border-color);
--#{$prefix}btn-active-color: var(--#{$prefix}btn-hover-color);
--#{$prefix}btn-active-bg: var(--#{$prefix}btn-hover-bg);
--#{$prefix}btn-active-border-color: var(--#{$prefix}btn-hover-border-color);
--#{$prefix}btn-box-shadow-rgb: var(--#{$prefix}white-rgb);
--#{$prefix}btn-active-shadow-rgb: var(--#{$prefix}btn-box-shadow-rgb);
}
/* Text */
&[class*="btn-text-"] {
--#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-color: transparent;
--#{$prefix}btn-box-shadow: none;
--#{$prefix}btn-focus-box-shadow: none;
--#{$prefix}btn-active-shadow: none;
--#{$prefix}btn-disabled-bg: transparent;
--#{$prefix}btn-disabled-border-color: transparent;
}
&[class*="btn-"]:active:not([class*="btn-text"]):not(.dropdown-toggle),
&[class*="btn-"].active:not([class*="btn-text"]):not(.dropdown-toggle) {
transform: scale(.98);
@include transition(all .135s ease-in-out);
}
&:not(.dropdown-toggle):not([class*="btn-text-"]) {
transform: scale(1.001);
@include transition(all .135s ease-in-out);
}
}
/* Badge within button */
.btn .badge {
@include transition($btn-transition);
inset-block-start: 0;
}
label.btn {
margin-block-end: 0;
}
/* Button Sizes */
.btn-xl {
@include button-size($btn-padding-y-xl, $btn-padding-x-xl, $btn-font-size-xl, $btn-border-radius-xl);
}
.btn-sm {
line-height: $btn-line-height-sm;
}
.btn-xs {
@include button-size($btn-padding-y-xs, $btn-padding-x-xs, $btn-font-size-xs, $btn-border-radius-xs);
}
/* Icon button */
.btn-icon {
$btn-icon-size-xl: ($btn-font-size-xl * $btn-line-height-xl) + ($btn-padding-y-xl * 2);
$btn-icon-font-size-xl: $btn-font-size-xl * $btn-line-height-xl;
$btn-icon-size-lg: ($btn-font-size-lg * $btn-line-height-lg) + ($btn-padding-y-lg * 2);
$btn-icon-font-size-lg: $btn-font-size-lg * $btn-line-height-lg;
$btn-icon-size: ($btn-font-size * $btn-line-height) + ($btn-padding-y * 2);
$btn-icon-font-size: $btn-font-size * $btn-line-height;
$btn-icon-size-sm: ($btn-font-size-sm * $btn-line-height-sm) + ($btn-padding-y-sm * 2);
$btn-icon-font-size-sm: $btn-font-size-sm;
$btn-icon-size-xs: ($btn-font-size-xs * $btn-line-height-xs) + ($btn-padding-y-xs * 2);
$btn-icon-font-size-xs: $btn-font-size-xs;
$borders-width: calc(#{$btn-border-width} * 2);
display: inline-flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
padding: 0;
block-size: calc(#{$btn-icon-size} + #{$borders-width});
font-size: $btn-icon-font-size;
inline-size: calc(#{$btn-icon-size} + #{$borders-width});
.icon-base{
@include icon-base($btn-icon-font-size);
}
&.btn-xl {
block-size: calc(#{$btn-icon-size-xl} + #{$borders-width});
inline-size: calc(#{$btn-icon-size-xl} + #{$borders-width});
.icon-base {
@include icon-base($btn-icon-font-size-xl);
}
}
&.btn-lg {
block-size: calc(#{$btn-icon-size-lg} + #{$borders-width});
font-size: $btn-icon-font-size-lg;
inline-size: calc(#{$btn-icon-size-lg} + #{$borders-width});
.icon-base {
@include icon-base($btn-icon-font-size-lg);
}
}
&.btn-sm {
block-size: calc(#{$btn-icon-size-sm} + #{$borders-width});
font-size: $btn-icon-font-size-sm;
inline-size: calc(#{$btn-icon-size-sm} + #{$borders-width});
.icon-base {
@include icon-base($btn-font-size-sm);
}
}
&.btn-xs {
block-size: calc(#{$btn-icon-size-xs} + #{$borders-width});
font-size: $btn-icon-font-size-xs;
inline-size: calc(#{$btn-icon-size-xs} + #{$borders-width});
.icon-base {
@include icon-base($btn-font-size-xs);
}
}
}
/* Link buttons */
.btn.btn-link {
font-size: inherit;
}
.btn-pinned {
position: absolute;
inset-block-start: 1.25rem;
inset-inline-end: 1.23rem;
}
/* Button focus */
button:focus,
button:focus-visible {
outline: 0;
}
/* Generate contextual modifier classes for colorizing the button */
/* The $custom-theme-colors variable is used to ensure that the colors for the social buttons
come from a separate array. To achieve this, both the $custom-colors and $theme-colors
arrays are merged in the _color.scss file. */
@each $state in map-keys($custom-theme-colors) {
/* Default */
.btn-#{$state} {
--#{$prefix}btn-bg: var(--#{$prefix}#{$state});
--#{$prefix}btn-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-hover-bg: color-mix(in sRGB, #{$color-contrast-dark} #{$btn-hover-bg-shade-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-hover-border-color: var(--#{$prefix}btn-hover-bg);
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-active-bg: color-mix(in sRGB, #{$color-contrast-dark} #{$btn-active-bg-shade-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-active-border-color: var(--#{$prefix}btn-active-bg);
--#{$prefix}btn-box-shadow-rgb: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-focus-shadow-rgb: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-active-shadow-rgb: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-disabled-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-disabled-bg: var(--#{$prefix}#{$state});
--#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-group-border-color: color-mix(in sRGB, #{$color-contrast-dark} #{$btn-active-bg-shade-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
}
/* Label */
.btn-label-#{$state}{
--#{$prefix}btn-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-label-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-border-color: var(--#{$prefix}btn-bg);
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-label-active-shade-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-hover-border-color: var(--#{$prefix}btn-hover-bg);
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-label-active-shade-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-active-border-color: var(--#{$prefix}btn-active-bg);
--#{$prefix}btn-focus-shadow-rgb: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-active-shadow-rgb: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-disabled-color: var(--#{$prefix}btn-color);
--#{$prefix}btn-disabled-bg: var(--#{$prefix}btn-bg);
--#{$prefix}btn-disabled-border-color: var(--#{$prefix}btn-border-color);
--#{$prefix}btn-group-border-color: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-label-border-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
}
/* Outline */
.btn-outline-#{$state}{
--#{$prefix}btn-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-badge-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-outline-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-hover-border-color: var(--#{$prefix}btn-border-color);
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-outline-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-active-border-color: var(--#{$prefix}btn-border-color);
--#{$prefix}btn-disabled-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-group-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
}
/* Text */
.btn-text-#{$state} {
--#{$prefix}btn-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-group-border-color: var(--#{$prefix}#{$state});
--#{$prefix}btn-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-text-hover-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-hover-border-color: var(--#{$prefix}btn-hover-bg);
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$btn-text-active-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}btn-active-border-color: var(--#{$prefix}btn-active-bg);
--#{$prefix}btn-disabled-color: var(--#{$prefix}#{$state});
}
}
/* Dark Theme */
@if $enable-dark-mode {
@include color-mode(dark) {
@each $state in map-keys($custom-theme-colors) {
.btn-label-#{$state} {
@if $state == "github" or $state == "slack" {
--#{$prefix}btn-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) 60%, var(--#{$prefix}#{$state}));
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) 40%, var(--#{$prefix}#{$state}));
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}paper-bg) 40%, var(--#{$prefix}#{$state}));
}
}
.btn-text-#{$state} {
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}#{$state}) #{$btn-text-hover-shade-amount}, var(--#{$prefix}paper-bg));
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}#{$state}) #{$btn-text-active-shade-amount}, var(--#{$prefix}paper-bg));
@if $state == "github" or $state == "slack" {
--#{$prefix}btn-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-hover-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-bg: color-mix(in sRGB, var(--#{$prefix}#{$state}) 25%, var(--#{$prefix}paper-bg));
--#{$prefix}btn-hover-bg: color-mix(in sRGB, var(--#{$prefix}#{$state}) 50%, var(--#{$prefix}paper-bg));
--#{$prefix}btn-active-bg: color-mix(in sRGB, var(--#{$prefix}#{$state}) 50%, var(--#{$prefix}paper-bg));
--#{$prefix}btn-active-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-group-border-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}btn-waves-effect-color: var(--#{$prefix}#{$state}-contrast-rgb);
}
}
}
}
}

View File

@@ -0,0 +1,296 @@
// Cards
// *******************************************************************************
.card {
--#{$prefix}card-hover-box-shadow: #{$box-shadow-lg};
--#{$prefix}card-border-bottom-color: #{$card-border-color};
--#{$prefix}card-hover-border-color: #{$card-border-color};
--#{$prefix}card-hover-border-bottom-color: #{$card-border-color};
box-shadow: var(--#{$prefix}card-box-shadow);
.card-header + .card-body,
.card-header + .card-content > .card-body:first-of-type,
.card-header + .card-footer,
.card-body + .card-footer {
padding-block-start: 0;
}
.card-header,
.card-footer {
--#{$prefix}card-border-width: #{$card-border-width};
}
.featured-date {
background-color: var(--#{$prefix}card-bg);
}
.card-link {
+ .card-link {
margin-inline: $card-spacer-x 0;
}
}
hr {
color: var(--#{$prefix}card-border-color);
}
/* Card Statistics specific separator */
.card-separator {
border-inline-end: var(--#{$prefix}border-width) solid var(--#{$prefix}card-border-color);
@include media-breakpoint-down(md) {
border-block-end: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);
border-inline-end-width: 0 !important;
padding-block-end: $card-spacer-y;
}
}
/* List groups */
> .list-group {
border-block-end-width: $border-width;
border-block-start-width: $border-width;
.list-group-item {
padding-inline: $card-spacer-x;
}
}
/* Card Widget Separator */
.card-widget-separator-wrapper {
@include media-breakpoint-down(lg) {
.card-widget-separator {
.card-widget-2.border-end {
border-inline-end: none !important;
border-inline-start: none !important;
}
}
}
@include media-breakpoint-down(sm) {
.card-widget-separator {
.card-widget-1.border-end,
.card-widget-2.border-end,
.card-widget-3.border-end {
border-block-end: 1px solid var(--#{$prefix}card-border-color);
border-inline-end: none !important;
border-inline-start: none !important;
}
}
}
}
/* color border bottom and shadow in card */
&[class*="card-border-shadow-"] {
border-block-end: none;
@include transition($card-transition);
&::after {
position: absolute;
@include border-radius($card-border-radius);
block-size: $card-spacer-y;
border-block-end: .125rem solid var(--#{$prefix}card-border-bottom-color);
content: "";
inline-size: 100%;
inset-block-end: 0;
inset-inline-start: 0;
@include transition($card-transition);
}
&:hover {
box-shadow: var(--#{$prefix}card-hover-box-shadow);
&::after {
border-color: var(--#{$prefix}card-hover-border-bottom-color);
border-block-end-width: .1875rem;
}
}
}
/* card hover border color */
&[class*="card-hover-border-"],
[class*="card-hover-border-"] {
border-width: $border-width;
@include transition($card-transition);
&:hover {
border-color: var(--#{$prefix}card-hover-border-color);
}
}
.collapse > .card-body,
.collapsing > .card-body {
padding-block-start: 0;
}
}
/* adding class with card background color */
.bg-card {
background-color: var(--#{$prefix}card-bg);
}
/* Card header elements
******************************************************** */
.card-header.header-elements,
.card-title.header-elements {
display: flex;
flex-wrap: wrap;
align-items: center;
inline-size: 100%;
}
.card-header-elements,
.card-title-elements {
display: flex;
flex-wrap: wrap;
align-items: center;
& + &,
> * + * {
margin-inline-start: .25rem;
}
}
.card-title {
&:not(:is(h1, h2, h3, h4, h5, h6)) {
color: var(--#{$prefix}body-color);
}
}
/* Horizontal card radius issue fix
******************************************************** */
.card-img-left,
.card-img-right {
block-size: 100%;
object-fit: cover;
}
.card-img-left {
@include border-start-radius($card-inner-border-radius);
@include border-end-radius(0);
@include media-breakpoint-down(md) {
@include border-top-radius($card-inner-border-radius);
@include border-bottom-radius(0);
}
}
.card-img-right {
@include border-end-radius($card-inner-border-radius);
@include border-start-radius(0);
@include media-breakpoint-down(md) {
@include border-bottom-radius($card-inner-border-radius);
@include border-top-radius(0);
}
}
// Card group
// ********************************************************
.card-group {
--#{$prefix}card-box-shadow: #{$card-box-shadow};
--#{$prefix}card-bg: #{$card-bg};
@include media-breakpoint-up(sm) {
@include border-radius($card-border-radius);
background-color: var(--#{$prefix}card-bg);
box-shadow: var(--#{$prefix}card-box-shadow);
.card {
box-shadow: none;
+ .card {
border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);
border-inline-start: 0;
margin-inline: 0;
}
.card-img-top,
.card-header,
.card-img-bottom,
.card-footer {
@include border-radius(0);
}
&:is(:last-child) {
.card-img-top,
.card-header {
@include border-top-end-radius($card-border-radius);
}
.card-img-bottom,
.card-footer {
@include border-bottom-end-radius($card-border-radius);
}
}
&:is(:first-child) {
.card-img-top,
.card-header {
@include border-top-start-radius($card-border-radius);
}
.card-img-bottom,
.card-footer {
@include border-bottom-start-radius($card-border-radius);
}
}
}
}
}
/* Card action */
.card-action {
/* Expand card(fullscreen) */
&.card-fullscreen {
position: fixed;
z-index: 9999;
display: block;
overflow: auto;
border: 0;
@include border-radius(0);
block-size: 100%;
inline-size: 100%;
inset: 0;
}
/* Alert */
.card-alert {
position: absolute;
z-index: 999;
inline-size: 100%;
.alert {
border-end-end-radius: 0;
border-end-start-radius: 0;
}
}
/* Card header */
.card-header {
&.collapsed {
border-block-end: 0;
}
display: flex;
.card-action-title {
flex-grow: 1;
margin-inline-end: .5rem;
}
.card-action-element {
a {
color: var(--#{$prefix}heading-color);
}
}
}
/* Block UI loader */
.notiflix-block {
h5 {
color: var(--#{$prefix}body-color);
margin-block: 1rem 0;
}
}
.collapse > .card-body,
.collapsing > .card-body {
padding-block-start: 0;
}
}
/* Generate contextual modifier classes for colorizing the border bottom and shadow in the card */
@each $state in map-keys($theme-colors) {
.card-border-shadow-#{$state} {
--#{$prefix}card-border-bottom-color: color-mix(in sRGB, var(--#{$prefix}card-bg) var(--#{$prefix}border-subtle-amount), var(--#{$prefix}#{$state}));
--#{$prefix}card-hover-border-bottom-color: var(--#{$prefix}#{$state});
}
.card-hover-border-#{$state} {
--#{$prefix}card-hover-border-color: color-mix(in sRGB, var(--#{$prefix}card-bg) #{$card-hover-border-scale}, var(--#{$prefix}#{$state}));
}
}

View File

@@ -0,0 +1,50 @@
// Carousel
// *******************************************************************************
.carousel {
.carousel-item.active,
.carousel-item.carousel-item-start {
h1,
.h1,
h2,
.h2,
h3,
.h3,
h4,
.h4,
h5,
.h5,
h6,
.h6 {
color: $carousel-caption-color;
}
}
}
.carousel.carousel-dark {
.carousel-item,
.carousel-item.active,
.carousel-item.carousel-item-start {
h1,
.h1,
h2,
.h2,
h3,
.h3,
h4,
.h4,
h5,
.h5,
h6,
.h6 {
color: $carousel-dark-caption-color;
}
}
}
[data-bs-theme="dark"] {
.carousel:not(.carousel-dark) .carousel-caption,
&.carousel:not(.carousel-dark) .carousel-caption {
color: $carousel-caption-color;
}
}

View File

@@ -0,0 +1,88 @@
// Dropdowns
// *****************************************************************
.dropdown-menu {
box-shadow: var(--#{$prefix}dropdown-box-shadow);
text-align: start;
> li:not(.disabled) > a:not(.dropdown-item):active,
> li:not(.disabled) > a:not(.dropdown-item).active,
> li.active:not(.disabled) > a:not(.dropdown-item) {
background-color: var(--#{$prefix}dropdown-link-active-bg);
color: var(--#{$prefix}dropdown-link-active-color);
}
/* Mega dropdown inside the dropdown menu */
.mega-dropdown > & {
inset-inline: 0;
}
}
.btn-xs.dropdown-toggle::after {
@include caret-down(.45em);
}
/* Split dropdowns */
.dropdown-toggle-split {
&::after,
.dropup &::after,
.dropend &::after {
margin-inline: 0;
}
.dropstart &::before {
margin-inline: 0;
}
}
/* Dropdown item line height */
.dropdown-item {
@include border-radius(var(--#{$prefix}dropdown-border-radius));
li:not(:first-child) &,
.dropdown-menu &:not(:first-child) {
margin-block-start: 2px;
}
&.waves-effect {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}primary-rgb), .2) 0,
rgba(var(--#{$prefix}primary-rgb), .3) 40%,
rgba(var(--#{$prefix}primary-rgb), .4) 50%,
rgba(var(--#{$prefix}primary-rgb), .5) 60%,
rgba(var(--#{$prefix}white-rgb), 0) 70%
);
}
}
&.text-danger:active {
color: var(--#{$prefix}primary) !important;
}
}
/* Hidden dropdown toggle arrow */
.dropdown-toggle.hide-arrow,
.dropdown-toggle-hide-arrow > .dropdown-toggle {
&::before,
&::after {
display: none;
}
}
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-start {
--#{$prefix}position: start;
&[data-bs-popper] {
inset-inline: 0 auto;
}
}
.dropdown-menu#{$infix}-end {
--#{$prefix}position: end;
&[data-bs-popper] {
inset-inline: auto 0;
}
}
}
}

View File

@@ -0,0 +1,12 @@
// Forms
// *****************************************************************
@import "forms/labels";
@import "forms/form-text";
@import "forms/form-control";
@import "forms/form-select";
@import "forms/form-check";
@import "forms/form-range";
@import "forms/input-group";
@import "forms/floating-labels";
@import "forms/validation";

View File

@@ -0,0 +1,45 @@
// Functions
// Remove the unit of a length
@function strip-unit($number) {
@if type-of($number) == "number" and not unitless($number) {
@return divide($number, ($number * 0 + 1));
}
@return $number;
}
// Convert size px to rem
@function px-to-rem($value) {
// Assumes the browser default font size = `16px`
@return (divide(strip-unit($value), 16)) * 1rem;
}
// Convert size rem to px
@function rem-to-px($value) {
// Assumes the browser default font size = `16px`
@return (strip-unit($value) * 16) * 1px;
}
// * Colors
// *******************************************************************************
// ? Override shade, tint and shift function with custom background color option i.e $card-bg to make it similar like design
// Shade a color: mix a color with background/white
@function tint-color($color, $weight, $background: null) {
$background: if($background, $background, #fff);
@return mix($background, $color, $weight);
}
// Shade a color: mix a color with background/black
@function shade-color($color, $weight, $background: null) {
$background: if($background, $background, #000);
@return mix($background, $color, $weight);
}
// Shade the color if the weight is positive, else tint it
@function shift-color($color, $weight, $background: null) {
@return if($weight > 0, shade-color($color, $weight, $background), tint-color($color, -$weight));
}

View File

@@ -0,0 +1,15 @@
// Functions
@import "bootstrap/scss/functions"; // Bootstrap core functions
@import "functions"; // Bootstrap extended functions
// Variables
@import "../_custom-variables/bootstrap-extended-dark"; // Bootstrap extended custom dark variable (for customization purpose)
@import "../_custom-variables/bootstrap-extended"; // Bootstrap extended custom variable (for customization purpose)
@import "variables-dark"; // Bootstrap extended dark variable
@import "variables"; // Bootstrap extended variable
@import "bootstrap/scss/variables"; // Bootstrap core variable
@import "bootstrap/scss/maps"; // Bootstrap core maps
// Mixins
@import "bootstrap/scss/mixins"; // Bootstrap core mixins
@import "mixins"; // Bootstrap extended mixins

View File

@@ -0,0 +1,16 @@
// Functions
@import "bootstrap/scss/functions"; // Bootstrap core functions
@import "functions"; // Bootstrap extended functions
// Variables
@import "../_custom-variables/bootstrap-extended-dark"; // Bootstrap Dark extended custom variable (for customization purpose)
@import "../_custom-variables/bootstrap-extended"; // Bootstrap extended custom variable (for customization purpose)
@import "variables-dark"; // Bootstrap extended dark variable
@import "variables"; // Bootstrap extended variable
@import "bootstrap/scss/variables"; // Bootstrap core variable
@import "bootstrap/scss/variables-dark"; // Bootstrap core variable dark
@import "bootstrap/scss/maps"; // Bootstrap core maps
// Mixins
@import "bootstrap/scss/mixins"; // Bootstrap core mixins
@import "mixins"; // Bootstrap extended mixins

View File

@@ -0,0 +1,223 @@
/* List groups
******************************************************************************* */
/* List Group Mixin */
.list-group {
--#{$prefix}list-group-timeline-bg: var(--#{$prefix}primary);
--#{$prefix}list-group-border-color: var(--#{$prefix}border-color);
--#{$prefix}list-group-active-border-color: var(--#{$prefix}border-color);
--#{$prefix}list-group-action-hover-color: var(--#{$prefix}body-color);
--#{$prefix}list-group-action-active-color: var(--#{$prefix}body-color);
--#{$prefix}list-group-active-bg: var(--#{$prefix}primary-bg-subtle);
.list-group-item {
line-height: 1.375rem;
padding-block-end: calc($list-group-item-padding-y - 1px);
}
&:not([class*="list-group-flush"]) .list-group-item:first-of-type {
padding-block-start: calc($list-group-item-padding-y - 1px);
}
&[class*="list-group-flush"] .list-group-item:last-of-type {
padding-block-end: $list-group-item-padding-y;
}
&[class*="list-group-horizontal-md"] .list-group-item {
word-wrap: normal;
@include media-breakpoint-up(md) {
padding-block-start: calc($list-group-item-padding-y - 1px);
}
}
// Timeline CSS
&.list-group-timeline {
position: relative;
&::before {
position: absolute;
background-color: var(--#{$prefix}border-color);
block-size: 100%;
content: "";
inline-size: 1px;
inset-block: 0;
inset-inline-start: .2rem;
}
.list-group-item {
border: 0;
padding-inline-start: 1.25rem;
&::before {
position: absolute;
background-color: var(--#{$prefix}list-group-timeline-bg);
block-size: 7px;
content: "";
inline-size: 7px;
inset-block-start: 50%;
inset-inline-start: 0;
margin-block-start: -3.5px;
@include border-radius(100%);
}
}
}
.list-group-item.active {
color: var(--#{$prefix}primary);
h1,
.h1,
h2,
.h2,
h3,
.h3,
h4,
.h4,
h5,
.h5,
h6,
.h6 {
color: var(--#{$prefix}primary);
}
&,
&:hover,
&:focus {
--#{$prefix}list-group-color: var(--#{$prefix}primary);
}
}
.list-group-item-action {
--#{$prefix}list-group-action-color: var(--#{$prefix}heading-color);
}
}
/* RTL
******************************************************************************* */
:dir(rtl) {
.list-group {
padding-inline-start: 0;
// List group horizontal RTL style
&.list-group-horizontal {
.list-group-item {
&:first-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
@include border-start-radius(0);
}
&:last-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
border-inline-end-width: 1px;
@include border-end-radius(0);
}
}
}
@include media-breakpoint-up(sm) {
&.list-group-horizontal-sm {
.list-group-item {
&:first-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
@include border-start-radius(0);
}
&:last-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
border-inline-end-width: 1px;
@include border-end-radius(0);
}
}
}
}
@include media-breakpoint-up(md) {
&.list-group-horizontal-md {
.list-group-item {
&:first-child {
@include border-radius(0);
@include border-start-radius(var(--#{$prefix}list-group-border-radius));
}
&:last-child {
@include border-radius(0);
border-inline-end-width: 1px;
@include border-end-radius(var(--#{$prefix}list-group-border-radius));
}
}
}
}
@include media-breakpoint-up(lg) {
&.list-group-horizontal-lg {
.list-group-item {
&:first-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
@include border-start-radius(0);
}
&:last-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
border-inline-end-width: 1px;
@include border-end-radius(0);
}
}
}
}
@include media-breakpoint-up(xl) {
&.list-group-horizontal-xl {
.list-group-item {
&:first-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
@include border-start-radius(0);
}
&:last-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
border-inline-end-width: 1px;
@include border-end-radius(0);
}
}
}
}
@include media-breakpoint-up(xxl) {
&.list-group-horizontal-xxl {
.list-group-item {
&:first-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
@include border-start-radius(0);
}
&:last-child {
@include border-radius(var(--#{$prefix}list-group-border-radius));
border-inline-end-width: 1px;
@include border-end-radius(0);
}
}
}
}
}
}
@if $enable-dark-mode {
@include color-mode(dark) {
.list-group {
--#{$prefix}list-group-color: #{$gray-900-dark};
}
}
}
// scss-docs-start list-group-modifiers
@each $state in map-keys($theme-colors) {
.list-group-item-#{$state} {
--#{$prefix}list-group-border-color: var(--#{$prefix}#{$state});
--#{$prefix}list-group-active-border-color: var(--#{$prefix}#{$state});
--#{$prefix}list-group-active-bg: var(--#{$prefix}#{$state});
--#{$prefix}list-group-color: var(--#{$prefix}#{$state}-text-emphasis);
}
.list-group-timeline-#{$state} {
--#{$prefix}list-group-timeline-bg: var(--#{$prefix}#{$state});
}
}
// scss-docs-end list-group-modifiers

View File

@@ -0,0 +1,4 @@
// Mixins - Template mixins (custom and overrides)
@import "mixins/caret";
@import "mixins/misc";
@import "mixins/border-radius";

View File

@@ -0,0 +1,361 @@
/* Modals
******************************************************************************* */
/* Modal Shadow */
.modal-content {
box-shadow: var(--#{$prefix}modal-box-shadow);
}
.modal {
.btn-close {
padding: .614rem;
background-color: var(--#{$prefix}paper-bg);
background-image: none;
box-shadow: var(--#{$prefix}box-shadow-xs);
filter: none;
opacity: 1;
transform: translate(23px, -25px);
@include border-radius($border-radius-sm);
@include transition(all .23s ease .1s);
/* For hover effect of close btn */
&:hover,
&:focus,
&:active {
opacity: 1;
outline: 0;
transform: translate(20px, -20px);
:dir(rtl) & {
transform: translate(26px, -20px);
}
}
&::before{
display: block;
background-color: var(--#{$prefix}secondary-color);
block-size: .6875rem;
content: "";
inline-size: .6875rem;
mask-image: str-replace(str-replace($btn-close-bg, "#{$btn-close-color}", currentColor), "#", "%23");
mask-repeat: no-repeat;
mask-size: 100% 100%;
}
}
.modal-header {
position: relative;
.btn-close {
position: absolute;
inset-block-start: $modal-dialog-margin;
inset-inline-end: $modal-dialog-margin - .6875rem;
}
}
/* modal footer */
.modal-footer {
padding: $modal-footer-padding;
> * {
margin-block: 0;
&:last-child {
margin-inline-end: 0;
}
&:first-child {
margin-inline-start: 0;
}
}
}
/*
! remove close button animation & shadow for .modal-dialog-scrollable, .modal-fullscreen, .modal-top modal */
.modal-dialog-scrollable,
.modal-fullscreen,
&.modal-top {
.btn-close {
box-shadow: none;
transform: translate(0, 0);
&:hover {
transform: translate(0, 0);
}
}
}
}
.carousel-control-prev,
.carousel-control-next {
color: var(--#{$prefix}primary);
&:hover,
&:focus {
color: var(--#{$prefix}primary);
}
}
/* Onboarding Modals
******************************************************************************* */
.modal-onboarding {
.close-label {
position: absolute;
font-size: .8rem;
inset-block-start: .85rem;
opacity: $btn-close-opacity;
&:hover {
opacity: $btn-close-hover-opacity;
}
}
.onboarding-content {
margin: 2rem;
}
form {
margin-block-start: 2rem;
text-align: start;
}
// Carousel Inside Modal
.carousel .carousel-indicators {
inset-block-end: -10px;
[data-bs-target] {
background-color: var(--#{$prefix}primary);
}
}
.carousel-control-prev,
.carousel-control-next {
inset-block: auto .75rem;
opacity: 1;
:dir(rtl) & {
flex-direction: row-reverse;
}
}
.carousel-control-prev {
inset-inline-start: 1rem;
:dir(rtl) & {
inset-inline-end: 1rem;
inset-inline-start: auto;
}
}
.carousel-control-next {
inset-inline-end: 0;
:dir(rtl) & {
inset-inline-end: auto;
inset-inline-start: 0;
}
}
.onboarding-horizontal {
display: flex;
align-items: center;
justify-content: space-between;
.onboarding-media {
margin: 2rem;
margin-block-start: 0;
}
}
}
/* Top modals
******************************************************************************* */
.modal-top {
.modal-dialog {
margin-block-start: 0;
}
.modal-content {
@include border-top-radius(0);
}
}
/* Transparent modals
****************************************************************************** */
.modal-transparent {
.modal-dialog {
display: flex;
margin-block: 0;
margin-inline: auto;
min-block-size: 100vh;
}
.modal-content {
border: 0;
margin: auto;
background: transparent;
box-shadow: none;
inline-size: 100%;
}
.btn-close {
position: absolute;
background-color: transparent;
background-image:
str-replace(
str-replace(str-replace($btn-close-bg, "#{$btn-close-color}", $white), "#", "%23"),
"fill-opacity='0.5'",
"fill-opacity='1'"
);
box-shadow: none;
inset-block-start: 0;
inset-inline-end: $modal-inner-padding;
:dir(rtl) & {
inset-inline-end: calc($modal-inner-padding * -2);
}
opacity: 1;
padding-block: $btn-close-padding-y;
padding-inline: $btn-close-padding-x;
&::before {
content: none;
}
}
}
/* Modal Simple (Modal Examples)
****************************************************************************** */
.modal-simple {
.modal-content {
padding: $modal-simple-padding;
@include media-breakpoint-down(md) {
padding: calc($modal-simple-padding * .5);
}
}
.btn-close {
position: absolute;
inset-block-start: -($modal-simple-padding - $modal-simple-close-position);
inset-inline-end: -($modal-simple-padding - $modal-simple-close-position);
:dir(rtl) & {
inset-inline-end: -($modal-simple-padding + $modal-simple-close-position * 2);
}
// For small screen set top, left/right 0 p-3, p-md-5
@include media-breakpoint-down(md) {
inset-block-start: -.75rem;
inset-inline-end: -.75rem;
:dir(rtl) & {
inset-inline-end: -($modal-simple-padding + $modal-simple-close-position);
}
}
}
}
/* Refer & Earn Modal Example */
.modal-refer-and-earn {
.modal-refer-and-earn-step {
display: flex;
align-items: center;
justify-content: center;
@include border-radius($card-border-radius);
block-size: 88px;
inline-size: 88px;
.icon-base {
@include icon-base(2.5rem);
}
}
}
/* Add new address modal */
.modal-add-new-address {
.custom-option-icon:not(.checked) svg {
stroke: var(--#{$prefix}heading-color);
}
.custom-option-icon.checked svg {
stroke: var(--#{$prefix}primary);
}
}
/* Share project modal */
.modal-share-project {
@include media-breakpoint-down(sm) {
.dropdown-toggle::after {
margin-inline: 0;
}
}
}
/* Modal Animations
****************************************************************************** */
/* Slide from Top */
.modal-top.fade .modal-dialog,
.modal-top .modal.fade .modal-dialog {
transform: translateY(-100%);
}
.modal-top.show .modal-dialog,
.modal-top .modal.show .modal-dialog {
transform: translateY(0);
}
/* Transparent */
.modal-transparent.fade .modal-dialog,
.modal-transparent .modal.fade .modal-dialog {
transform: scale(.5, .5);
}
.modal-transparent.show .modal-dialog,
.modal-transparent .modal.show .modal-dialog {
transform: scale(1, 1);
}
/* Responsive
******************************************************************************* */
@include media-breakpoint-down(lg) {
.modal-onboarding .onboarding-horizontal {
flex-direction: column;
}
}
@include media-breakpoint-down(md) {
.modal {
.modal-dialog:not(.modal-fullscreen) {
padding-block: 0;
padding-inline: .75rem;
}
.carousel-control-prev,
.carousel-control-next {
display: none;
}
}
}
@include media-breakpoint-up(sm) {
.modal-content {
box-shadow: var(--#{$prefix}modal-box-shadow);
}
.modal-dialog.modal-sm {
max-inline-size: $modal-sm;
}
}
@include media-breakpoint-up(xl) {
.modal-xl .modal-dialog {
max-inline-size: $modal-xl;
}
}
/* Dark theme
******************************************************************************* */
@if $enable-dark-mode {
@include color-mode(dark) {
.modal-backdrop {
--#{$prefix}backdrop-bg: #{$modal-backdrop-bg-dark};
--#{$prefix}backdrop-opacity: #{$modal-backdrop-opacity-dark};
}
}
}
/* RTL mode
******************************************************************************* */
:dir(rtl) {
.modal:not(.modal-top) .modal-header .btn-close {
inset-inline-end: $modal-dialog-margin - 3.55rem;
}
}

View File

@@ -0,0 +1,431 @@
/* Nav
******************************************************************************* */
.nav {
flex-wrap: inherit;
padding-inline-start: 0;
.nav-item {
white-space: nowrap;
}
&:not(.nav-pills){
.nav-link {
&:hover,
&:focus {
color: $nav-link-hover-color;
}
}
}
&.nav-sm,
.nav-sm > & {
--#{$prefix}nav-link-padding-y: #{$nav-link-padding-y-sm};
--#{$prefix}nav-link-padding-x: #{$nav-link-padding-x-sm};
--#{$prefix}nav-link-font-size: #{$font-size-sm};
--#{$prefix}nav-link-line-height: #{$nav-link-line-height-sm};
}
&.nav-lg,
.nav-lg > & {
--#{$prefix}nav-link-padding-y: #{$nav-link-padding-y-lg};
--#{$prefix}nav-link-padding-x: #{$nav-link-padding-x-lg};
--#{$prefix}nav-link-font-size: #{$font-size-lg};
--#{$prefix}nav-link-line-height: #{$nav-link-line-height-lg};
}
}
/* nav tabs shadow */
.nav-tabs-shadow {
border: 1px solid var(--#{$prefix}nav-border-color);
box-shadow: var(--#{$prefix}nav-box-shadow);
.card & {
box-shadow: none;
}
}
/* Tab and pills style */
.nav-tabs,
.nav-pills {
.nav-link {
display: inline-flex;
align-items: center;
justify-content: center;
text-transform: capitalize;
}
&:not(.nav-fill):not(.nav-justified) .nav-link {
inline-size: 100%;
margin-inline-end: $nav-spacer;
}
}
.tab-content:not(.doc-example-content) {
z-index: 1;
padding: $card-spacer-y;
.tab-pane {
opacity: 0;
transform: translateX(-30px);
@include transition(all linear .1s);
:dir(rtl) & {
transform: translateX(30px);
}
&.show {
opacity: 1;
transform: unset !important;
@include transition(all ease-out .2s .1s);
}
}
}
/* For scrollable navs/tabs/pills */
.nav-scrollable {
display: -webkit-inline-box;
display: -moz-inline-box;
overflow: auto;
flex-wrap: nowrap;
inline-size: 100%;
}
.nav-tabs{
position: relative;
.tab-slider {
position: absolute;
block-size: 2px;
.nav-align-left &,
.nav-align-right & {
inline-size: 2px !important;
}
}
/* Widget Tabs */
&.widget-nav-tabs {
border: 0 !important;
overflow-x: auto;
.nav-link {
border: $border-width dashed var(--#{$prefix}border-color);
@include media-breakpoint-up(md) {
block-size: 100px !important;
inline-size: 110px !important;
padding-block: 1rem;
@include border-radius($border-radius);
}
@include media-breakpoint-down(md) {
padding: 0;
border: 0 !important;
}
&.active {
border: $border-width solid var(--#{$prefix}border-color);
border-color: var(--#{$prefix}primary);
box-shadow: none !important;
.badge {
background-color: $component-hover-bg !important;
color: $component-active-bg !important;
}
}
.tab-widget-title {
@include media-breakpoint-down(md) {
display: none;
}
}
}
}
/* Tab link */
.nav-link {
@include border-radius(0);
background-clip: padding-box;
&.waves-effect {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}primary-rgb), .2) 0,
rgba(var(--#{$prefix}primary-rgb), .3) 40%,
rgba(var(--#{$prefix}primary-rgb), .4) 50%,
rgba(var(--#{$prefix}primary-rgb), .5) 60%,
rgba(var(--#{$prefix}white-rgb), 0) 70%
);
}
}
}
.nav-link.active,
.nav-item.show .nav-link {
&,
&:hover,
&:focus {
box-shadow: 0 -2px 0 $nav-tabs-link-active-border-color inset;
.nav-align-top & {
box-shadow: 0 -2px 0 $nav-tabs-link-active-border-color inset;
}
.nav-align-bottom & {
box-shadow: 0 2px 0 $nav-tabs-link-active-border-color inset;
}
.nav-align-left & {
box-shadow: -2px 0 0 $nav-tabs-link-active-border-color inset;
:dir(rtl) & {
box-shadow: 2px 0 0 $nav-tabs-link-active-border-color inset;
}
}
.nav-align-right & {
box-shadow: 2px 0 0 $nav-tabs-link-active-border-color inset;
:dir(rtl) & {
box-shadow: -2px 0 0 $nav-tabs-link-active-border-color inset;
}
}
}
}
}
.nav-pills {
.nav-link {
padding-block: $nav-pills-padding-y;
padding-inline: $nav-pills-padding-x;
&:not(.active){
&:hover,
&:focus {
&.waves-effect {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}primary-rgb), .2) 0,
rgba(var(--#{$prefix}primary-rgb), .3) 40%,
rgba(var(--#{$prefix}primary-rgb), .4) 50%,
rgba(var(--#{$prefix}primary-rgb), .5) 60%,
rgba(var(--#{$prefix}white-rgb), 0) 70%
);
}
}
}
}
&.active {
box-shadow: 0 .125rem .375rem 0 rgba(var(--#{$prefix}primary-rgb), .3);
}
}
& .nav-item .nav-link:not(.active):hover {
background-color: $nav-pills-link-hover-bg;
border-block-end: none;
padding-block-end: $nav-link-padding-y;
}
~ .tab-content {
border: 1px solid var(--#{$prefix}nav-border-color);
box-shadow: var(--#{$prefix}nav-box-shadow);
}
}
/* Top, Right, Bottom & Left Tabbed panels */
.nav-align-top,
.nav-align-right,
.nav-align-bottom,
.nav-align-left {
> .tab-content {
background: $nav-tabs-bg;
}
.nav-tabs {
background: $nav-tabs-bg;
}
display: flex;
> .nav,
> div > .nav {
position: relative;
z-index: 1;
}
&:has(.nav-tabs) {
@include border-radius($border-radius !important);
}
}
.nav-align-right,
.nav-align-left {
align-items: stretch;
> .nav,
> div > .nav {
flex-direction: column;
flex-grow: 0;
border-block-end-width: 0;
}
> .nav.nav-pills .nav-item:not(:last-child),
> div > .nav.nav-pills .nav-item:not(:last-child) {
margin-block: 0 $nav-spacer !important;
margin-inline: 0 !important;
}
> .tab-content {
flex-grow: 1;
.tab-pane {
transform: translateY(-30px);
&.show {
transform: translateY(0);
}
}
}
}
/* Top tabs */
.nav-align-top {
.tab-content {
@include border-bottom-radius($border-radius);
}
flex-direction: column;
.nav-tabs {
border-block-end: $border-width solid var(--#{$prefix}nav-tabs-border-color);
@include border-top-radius($border-radius);
& .nav-link:not(.active):hover {
border-block-end: 2px solid $nav-pills-link-hover-bg !important;
padding-block-end: calc($nav-link-padding-y - .125rem);
}
&.nav-lg .nav-link:not(.active):hover {
padding-block-end: calc($nav-link-padding-y-lg - .125rem);
}
&.nav-sm .nav-link:not(.active):hover {
padding-block-end: calc($nav-link-padding-y-sm - .1125rem);
}
}
.nav-pills ~ .tab-content {
@include border-top-radius($border-radius);
}
}
.nav-align-top,
.nav-align-bottom,
.card {
> .tab-content {
.tab-pane {
transform: translateX(-30px);
:dir(rtl) & {
transform: translateX(30px);
}
&.show {
transform: translateX(0) !important;
}
}
}
> .nav.nav-pills .nav-item:not(:last-child) {
margin-inline-end: $nav-spacer;
}
}
/* Right tabs */
.nav-align-right {
.tab-content {
border-end-start-radius: $border-radius;
border-start-start-radius: $border-radius;
}
flex-direction: row-reverse;
.nav-tabs {
position: relative;
border-end-end-radius: $border-radius;
border-inline-start: $border-width solid var(--#{$prefix}nav-tabs-border-color);
border-start-end-radius: $border-radius;
.tab-slider {
inset-inline-start: 0;
}
~ .tab-content {
.card & {
border-inline-end: $nav-tabs-border-width solid var(--#{$prefix}nav-tabs-border-color);
}
}
& .nav-link:not(.active):hover {
border-inline-start: 2px solid $nav-pills-link-hover-bg !important;
padding-inline-start: calc($nav-link-padding-x - .125rem);
}
&.nav-lg .nav-link:not(.active):hover {
padding-inline-start: calc($nav-link-padding-x-lg - .125rem);
}
&.nav-sm .nav-link:not(.active):hover {
padding-inline-start: calc($nav-link-padding-x-sm - .125rem);
}
}
> .nav .nav-item,
> div > .nav .nav-item {
margin-inline: 0;
}
.nav-link {
justify-content: end;
text-align: end;
}
.nav-pills ~ .tab-content {
@include border-radius($border-radius);
}
}
/* Bottom tabs */
.nav-align-bottom {
.tab-content {
@include border-top-radius($border-radius);
}
flex-direction: column-reverse;
> .nav .nav-item,
> div > .nav .nav-item {
margin-block: 0;
}
> .nav,
> div > .nav {
border-block-end-width: 0;
border-block-start: $nav-tabs-border-width solid var(--#{$prefix}nav-tabs-border-color);
}
.nav-tabs {
border-block-start: $border-width solid var(--#{$prefix}nav-tabs-border-color);
@include border-bottom-radius($border-radius);
.tab-slider {
inset-block-end: inherit !important;
}
& .nav-link:not(.active):hover {
border-block-start: 2px solid $nav-pills-link-hover-bg !important;
padding-block-start: calc($nav-link-padding-y - .125rem);
}
&.nav-lg .nav-link:not(.active):hover {
padding-block-start: calc($nav-link-padding-y-lg - .125rem);
}
&.nav-sm .nav-link:not(.active):hover {
padding-block-start: calc($nav-link-padding-y-sm - .1125rem);
}
}
.nav-pills ~ .tab-content {
@include border-bottom-radius($border-radius);
}
}
/* Left tabs */
.nav-align-left {
.tab-content {
@include border-end-radius($border-radius);
}
.nav-tabs {
position: relative;
~ .tab-content {
.card & {
border-inline-start: $nav-tabs-border-width solid var(--#{$prefix}nav-tabs-border-color);
}
}
border-inline-end: $border-width solid var(--#{$prefix}nav-tabs-border-color);
& .nav-link:not(.active):hover {
border-inline-end: 2px solid $nav-pills-link-hover-bg !important;
padding-inline-end: calc($nav-link-padding-x - .125rem);
}
&.nav-lg .nav-link:not(.active):hover {
padding-inline-end: calc($nav-link-padding-x-lg - .125rem);
}
&.nav-sm .nav-link:not(.active):hover {
padding-inline-end: calc($nav-link-padding-x-sm - .125rem);
}
}
> .nav .nav-item,
> div > .nav .nav-item {
margin-inline: 0;
}
.nav-link {
justify-content: start;
text-align: start;
}
.nav-pills ~ .tab-content {
@include border-start-radius($border-radius !important);
}
&:has(.nav-tabs) {
overflow: hidden;
}
}

View File

@@ -0,0 +1,78 @@
/* Navbar
******************************************************************************* */
.layout-navbar {
background-color: var(--#{$prefix}body-bg);
}
.layout-navbar-fixed {
.window-scrolled{
.layout-navbar {
background-color: var(--#{$prefix}navbar-bg);
}
}
}
/* Mega dropdown
****************************************************************************** */
.mega-dropdown {
.dropdown-toggle {
box-shadow: none;
outline: 0;
}
.dropdown-menu {
inline-size: 100%;
}
}
.navbar {
&.bg-body-tertiary {
--#{$prefix}navbar-color: var(--#{$prefix}body-color);
--#{$prefix}navbar-hover-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}base-color) 40%, var(--#{$prefix}paper-bg));
--#{$prefix}navbar-active-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-brand-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}base-color) 70%, var(--#{$prefix}paper-bg));
.form-control::placeholder {
color: var(--#{$prefix}body-color);
}
.input-group-text:not(:focus),
.form-control:not(:focus) {
border-color: color-mix(in sRGB, var(--#{$prefix}base-color) 30%, var(--#{$prefix}paper-bg));
}
}
&.bg-white {
--#{$prefix}navbar-color: color-mix(in sRGB, var(--#{$prefix}pure-black) #{$bg-label-tint-amount}, var(--#{$prefix}white));
--#{$prefix}navbar-hover-color: var(--#{$prefix}pure-black);
--#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}pure-black) 40%, var(--#{$prefix}white));
--#{$prefix}navbar-active-color: var(--#{$prefix}pure-black);
--#{$prefix}navbar-brand-color: var(--#{$prefix}pure-black);
--#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}pure-black) #{$bg-label-tint-amount}, var(--#{$prefix}white));
}
&[class*="bg-"]:not(.bg-body-tertiary, .bg-white) {
background-color: var(--#{$prefix}navbar-bg) !important;
}
}
/* Generate contextual modifier classes for colorizing the navbar */
@each $state in map-keys($theme-colors) {
.navbar.bg-#{$state} {
@if $state == "light" {
--#{$prefix}navbar-bg: rgba(var(--#{$prefix}#{$state}-rgb), .88);
--#{$prefix}navbar-color: var(--#{$prefix}body-color);
--#{$prefix}navbar-hover-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}base-color) 40%, var(--#{$prefix}paper-bg));
--#{$prefix}navbar-active-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-brand-color: var(--#{$prefix}heading-color);
--#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}base-color) 70%, var(--#{$prefix}paper-bg));
}
@else {
--#{$prefix}navbar-bg: rgba(var(--#{$prefix}#{$state}-rgb), .88);
--#{$prefix}navbar-color: color-mix(in sRGB, var(--#{$prefix}#{$state}-contrast) #{$bg-label-tint-amount}, var(--#{$prefix}#{$state}));
--#{$prefix}navbar-hover-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}navbar-disabled-color: color-mix(in sRGB, var(--#{$prefix}#{$state}-contrast) 60%, var(--#{$prefix}#{$state}));
--#{$prefix}navbar-active-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}navbar-brand-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}navbar-brand-hover-color: color-mix(in sRGB, var(--#{$prefix}paper-bg) #{$bg-label-tint-amount}, var(--#{$prefix}#{$state}));
}
}
}

View File

@@ -0,0 +1,41 @@
/* Offcanvas
******************************************************************************* */
.offcanvas {
box-shadow: var(--#{$prefix}offcanvas-box-shadow);
.offcanvas-header {
.btn-close {
padding: .44rem;
background-size: .875rem;
margin-block: ($offcanvas-padding-y * -.5) ($offcanvas-padding-x * -.5);
margin-inline: auto ($offcanvas-padding-y * .167);
}
}
&.offcanvas-start {
inset-inline: 0 auto;
}
&.offcanvas-end {
inset-inline: auto 0;
}
}
// RTL
// *******************************************************************************
:dir(rtl) {
.offcanvas-start {
transform: translateX(100%);
}
.offcanvas-end {
transform: translateX(-100%);
}
}
// Dark theme
// *******************************************************************************
@if $enable-dark-mode {
@include color-mode(dark) {
.offcanvas-backdrop {
@include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg-dark, $offcanvas-backdrop-opacity-dark);
}
}
}

View File

@@ -0,0 +1,255 @@
/* Pagination
******************************************************************************* */
.pagination {
--#{$prefix}pagination-box-shadow-color: #{$pagination-box-shadow-color};
--#{$prefix}pagination-waves-effect-color: var(--#{$prefix}primary-rgb);
&[class*="pagination-outline-"] {
.page-item.active .page-link {
box-shadow: none;
&.waves-effect {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}pagination-waves-effect-color), .2) 0,
rgba(var(--#{$prefix}pagination-waves-effect-color), .3) 40%,
rgba(var(--#{$prefix}pagination-waves-effect-color), .4) 50%,
rgba(var(--#{$prefix}pagination-waves-effect-color), .5) 60%,
rgba($black, 0) 70%
);
}
}
}
.page-item:not(.active) .page-link,
& li > a:not(.page-link) {
--#{$prefix}pagination-bg: transparent;
--#{$prefix}pagination-hover-bg: #{$gray-100};
--#{$prefix}pagination-hover-color: var(--#{$prefix}pagination-color);
--#{$prefix}pagination-hover-border-color: #{rgba($black, .22)};
--#{$prefix}pagination-focus-bg: #{$gray-100};
--#{$prefix}pagination-focus-color: var(--#{$prefix}pagination-color);
}
}
&.pagination-lg {
--#{$prefix}pagination-font-size: #{$font-size-lg};
}
&.pagination-sm {
--#{$prefix}pagination-font-size: #{$font-size-sm};
}
.page-item:not(.disabled, .active) .page-link,
& li > a:not(.page-link) {
&:focus {
color: var(--#{$prefix}pagination-focus-color);
}
}
.page-item.active .page-link,
& li.active > a:not(.page-link) {
box-shadow: 0 .125rem .25rem 0 rgba(var(--#{$prefix}pagination-box-shadow-color), .4);
color: var(--#{$prefix}pagination-active-color);
}
&:not([class*="pagination-outline-"]) {
.page-link {
border-color: transparent;
}
.page-item .page-link,
& li > a:not(.page-link) {
&.waves-effect:not(.waves-light) {
.waves-ripple {
background:
radial-gradient(
rgba(var(--#{$prefix}pagination-waves-effect-color), .2) 0,
rgba(var(--#{$prefix}pagination-waves-effect-color), .3) 40%,
rgba(var(--#{$prefix}pagination-waves-effect-color), .4) 50%,
rgba(var(--#{$prefix}pagination-waves-effect-color), .5) 60%,
rgba($black, 0) 70%
);
}
}
}
}
// Pagination shapes + border less
&.pagination-square .page-item a {
@include border-radius(0);
}
&.pagination-round .page-item a {
@include border-radius(50%);
}
&.pagination-rounded .page-item a {
@include border-radius($border-radius);
}
&.pagination-sm.pagination-rounded .page-item a {
@include border-radius($border-radius-sm);
}
&.pagination-lg.pagination-rounded .page-item a {
@include border-radius($border-radius-lg);
}
}
/* Pagination disabled style */
.page-item {
&.disabled,
&[disabled] {
.page-link {
opacity: $pagination-disabled-opacity;
pointer-events: none;
}
}
}
/* Pagination basic style */
.page-link,
.page-link > a {
@include border-radius($border-radius);
display: inline-flex !important;
align-items: center;
justify-content: center;
min-block-size:
calc(
#{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-y * 2)} + calc(#{$pagination-border-width} * 2)"}
);
min-inline-size:
calc(
#{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-x * 1.923)} + calc(#{$pagination-border-width} * 2)"}
);
}
/* Sizing
******************************************************************************* */
/* Pagination Large */
.pagination-lg .page-link,
.pagination-lg > li > a:not(.page-link) {
min-block-size:
calc(
#{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-y-lg * 2.33)} + calc(#{$pagination-border-width} * 2)"}
);
min-inline-size:
calc(
#{"#{($font-size-base * $pagination-line-height) + ($pagination-padding-x-lg * 1.615)} + calc(#{$pagination-border-width} * 2)"}
);
}
.pagination-lg > .page-item {
&.first,
&.last,
&.next,
&.prev,
&.previous {
.page-link {
padding-inline: $pagination-padding-y-lg - .0845rem;
}
}
}
/* Pagination Small */
.pagination-sm .page-link,
.pagination-sm > li > a:not(.page-link) {
min-block-size:
calc(
#{"#{($font-size-sm * $pagination-line-height) + ($pagination-padding-y-sm * 2)} + calc(#{$pagination-border-width} * 2)"}
);
min-inline-size:
calc(
#{"#{($font-size-sm * $pagination-line-height) + ($pagination-padding-x-sm * 2.356)} + calc(#{$pagination-border-width} * 2)"}
);
}
.pagination-sm > .page-item {
&.first,
&.last,
&.next,
&.prev,
&.previous {
.page-link {
padding-block: $pagination-padding-y-sm - .1055rem;
padding-inline: $pagination-padding-y-sm - .1055rem;
}
}
}
/* Add spacing between pagination items */
.page-item + .page-item .page-link,
.pagination li + li > a:not(.page-link) {
.pagination-sm & {
margin-inline-start: .25rem;
}
.pagination-lg & {
margin-inline-start: .5rem;
}
}
/* RTL pagination
******************************************************************************* */
/* Add spacing between pagination items */
:dir(rtl) {
.pagination {
padding-inline-end: 0;
}
.page-item .page-link,
.pagination li > a:not(.page-link) {
margin-inline: 0 $pagination-margin-start;
}
.page-item {
&.first,
&.last,
&.next,
&.prev,
&.previous {
.page-link {
.icon-base {
transform: rotate(180deg);
}
}
}
}
}
/* Dark theme
******************************************************************************* */
@if $enable-dark-mode {
@include color-mode(dark) {
.pagination {
--#{$prefix}pagination-color: #{$headings-color-dark};
--#{$prefix}pagination-bg: #{$gray-75-dark};
--#{$prefix}pagination-disabled-color: var(--#{$prefix}pagination-color);
&[class*="pagination-outline-"] {
.page-item:not(.active) .page-link,
& li > a:not(.page-link) {
--#{$prefix}pagination-border-color: #{rgba($white-dark, .22)};
--#{$prefix}pagination-hover-bg: #{$gray-75-dark};
--#{$prefix}pagination-hover-border-color: var(--#{$prefix}pagination-border-color);
--#{$prefix}pagination-focus-bg: var(--#{$prefix}pagination-hover-bg);
--#{$prefix}pagination-disabled-border-color: var(--#{$prefix}pagination-border-color);
}
}
}
}
}
// scss-docs-start pagination-modifiers
@each $state in map-keys($theme-colors) {
.pagination {
&.pagination-#{$state} {
--#{$prefix}pagination-hover-bg: var(--#{$prefix}#{$state}-bg-subtle);
--#{$prefix}pagination-hover-color: var(--#{$prefix}#{$state});
--#{$prefix}pagination-focus-bg: var(--#{$prefix}#{$state}-bg-subtle);
--#{$prefix}pagination-focus-color: var(--#{$prefix}#{$state});
--#{$prefix}pagination-active-bg: var(--#{$prefix}#{$state});
--#{$prefix}pagination-box-shadow-color: var(--#{$prefix}#{$state}-rgb);
--#{$prefix}pagination-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
}
&.pagination-outline-#{$state} {
--#{$prefix}pagination-active-bg: var(--#{$prefix}#{$state}-bg-subtle);
--#{$prefix}pagination-active-color: var(--#{$prefix}#{$state});
--#{$prefix}pagination-active-border-color: var(--#{$prefix}#{$state});
--#{$prefix}pagination-waves-effect-color: var(--#{$prefix}#{$state}-rgb);
}
}
}
// scss-docs-end pagination-modifiers

View File

@@ -0,0 +1,120 @@
/* Popovers
******************************************************************************* */
.modal-open .popover {
z-index: $zindex-modal + 1;
}
.popover:not(.custom-popover) {
--#{$prefix}popover-header-bg: transparent;
.popover-header {
--#{$prefix}popover-border-width: 0;
padding-block-end: 0;
}
.popover-arrow::after {
--#{$prefix}popover-arrow-border: var(--#{$prefix}popover-bg);
}
}
.popover:has([class^="popover-"]):not(.custom-popover) {
--#{$prefix}popover-border-color: transparent;
--#{$prefix}popover-header-bg: transparent;
.popover-body {
background-color: transparent;
}
}
.popover:has([class^="popover-header-"]) {
--#{$prefix}popover-border-color: #{$popover-border-color};
--#{$prefix}popover-body-color: var(--#{$prefix}body-color);
--#{$prefix}popover-header-bg: var(--#{$prefix}primary);
}
.popover {
box-shadow: var(--#{$prefix}popover-box-shadow);
// Popover header padding and font-size
.popover-header {
font-size: $h5-font-size;
padding-block-end: 0;
}
// Popover body padding
.popover-body {
padding-block-start: $spacer;
}
.popover-arrow {
z-index: 1;
}
&:not(.custom-popover).bs-popover-auto {
> .popover-arrow::before {
--#{$prefix}popover-bg: #{rgba(var(--#{$prefix}white-rgb), .1)};
}
&[data-popper-placement="bottom"] > {
.popover-arrow {
&::after {
border-block-end-color: var(--#{$prefix}popover-arrow-border);
inset-block-start: 1px;
}
}
.popover-header::before {
--#{$prefix}popover-border-width: 0;
}
}
}
[data-bs-theme="light"] & {
&.popover-dark {
--#{$prefix}popover-bg: color-mix(in sRGB, var(--#{$prefix}base-color) 90%, var(--#{$prefix}paper-bg));
}
}
}
/* custom popover
******************************************************************************* */
.custom-popover {
--#{$prefix}popover-max-width: 200px;
--#{$prefix}popover-header-color: var(--#{$prefix}white);
--#{$prefix}popover-body-padding-x: 1rem;
--#{$prefix}popover-body-padding-y: .5rem;
.popover-header {
--#{$prefix}popover-header-bg: var(--#{$prefix}primary);
}
}
/* Dark
******************************************************************************* */
@if $enable-dark-mode {
@include color-mode(dark) {
.popover:not(.custom-popover) .popover-arrow::before {
--#{$prefix}popover-arrow-border: #{rgba(var(--#{$prefix}white-rgb), .05)};
}
}
}
// scss-docs-start popover-modifiers
@each $state in map-keys($theme-colors) {
.popover {
&.popover-#{$state} {
--#{$prefix}popover-bg: var(--#{$prefix}#{$state});
--#{$prefix}popover-header-bg: var(--#{$prefix}#{$state});
--#{$prefix}popover-header-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}popover-body-color: var(--#{$prefix}#{$state}-contrast);
& > .popover-arrow::after {
--#{$prefix}popover-arrow-border: var(--#{$prefix}#{$state});
}
}
&.popover-header-#{$state} {
.popover-header,
&.bs-popover-auto[data-popper-placement="bottom"] > .popover-arrow::after {
--#{$prefix}popover-header-bg: var(--#{$prefix}#{$state});
--#{$prefix}popover-header-color: var(--#{$prefix}#{$state}-contrast);
}
& > .popover-arrow::after {
--#{$prefix}popover-arrow-border: var(--#{$prefix}#{$state});
}
}
}
}
// scss-docs-end popover-modifiers

View File

@@ -0,0 +1,41 @@
/* Progress
******************************************************************************* */
.progress {
--#{$prefix}progress-bar-shadow-color: #{$progress-bar-shadow-color};
.progress-bar {
background-color: var(--#{$prefix}primary);
box-shadow: 0 2px 4px 0 var(--#{$prefix}progress-bar-shadow-color);
color: var(--#{$prefix}white);
}
&:has(:only-child) {
overflow: visible;
}
.progress-bar:first-child {
@include border-start-radius($progress-border-radius);
}
.progress-bar:last-child {
@include border-end-radius($progress-border-radius);
}
}
/* RTL
******************************************************************************* */
:dir(rtl) {
.progress-bar-striped {
@include gradient-striped(rgba(var(--#{$prefix}white-rgb), .15), -45deg);
}
.progress-bar-animated {
animation-direction: reverse;
}
}
@each $state in map-keys($theme-colors) {
.progress-bar.bg-#{$state} {
--#{$prefix}progress-bar-shadow-color: rgba(var(--#{$prefix}#{$state}-rgb), .3);
}
}

View File

@@ -0,0 +1,71 @@
/* Reboot */
b,
strong {
font-weight: $font-weight-bold;
}
caption {
text-align: start;
}
dd {
margin-inline-start: 0;
}
// TODO: checkinbs6 - a new variable has been created because the $link-color scss variable was being used,and changing the color did not reflect the update. this new variable ensures that future color changes are applied correctly.
a {
color: var(--#{$prefix}custom-link-color);
&:hover {
color: color-mix(in sRGB, var(--#{$prefix}custom-link-color) 80%, var(--#{$prefix}base-color));
}
&:not([href]) {
&,
&:hover {
color: inherit;
text-decoration: none;
}
}
}
/* Autofill input bg and text color issue on different OS and browsers */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
textarea:-webkit-autofill,
textarea:-webkit-autofill:hover,
textarea:-webkit-autofill:focus,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus,
input:-internal-autofill-selected {
background-clip: text !important;
}
h1 {
line-height: $h1-line-height;
}
h2 {
line-height: $h2-line-height;
}
h3 {
line-height: $h3-line-height;
}
h4 {
line-height: $h4-line-height;
}
h5 {
line-height: $h5-line-height;
}
h6 {
line-height: $h6-line-height;
}
img[data-app-light-img][data-app-dark-img] {
visibility: visible;
}

View File

@@ -0,0 +1,123 @@
/* The color-scheme CSS property https://web.dev/color-scheme/ */
:root{
// variable prefix
--prefix: #{$prefix};
--#{$prefix}pure-black: #{$pure-black};
--#{$prefix}pure-black-rgb: #{$pure-black-rgb};
// Icons sizing
--#{$prefix}icon-size: #{$icon-size};
--#{$prefix}icon-size-xs: #{$icon-size-xs};
--#{$prefix}icon-size-sm: #{$icon-size-sm};
--#{$prefix}icon-size-md: #{$icon-size-md};
--#{$prefix}icon-size-lg: #{$icon-size-lg};
--#{$prefix}icon-size-xl: #{$icon-size-xl};
@function calculate-contrast($color) {
@return if(lightness($color) > 75%, var(--#{$prefix}black), var(--#{$prefix}white));
}
@each $color, $value in $custom-theme-colors {
// Construct CSS variable names with Sass interpolation
--#{$prefix}#{$color}-contrast: #{calculate-contrast($value)};
}
}
:root,
[data-bs-theme="light"] {
// global custom variables
--#{$prefix}bg-label-tint-amount: #{$bg-label-tint-amount};
--#{$prefix}border-subtle-amount: #{$border-subtle-amount};
--#{$prefix}base-color: #{$black};
--#{$prefix}base-color-rgb: #{$base-rgb};
--#{$prefix}paper-bg: #{$paper-bg};
--#{$prefix}paper-bg-rgb: #{$paper-bg-rgb};
--#{$prefix}min-contrast-ratio: #{$min-contrast-ratio};
// Box-shadow variables
--#{$prefix}box-shadow: #{$box-shadow};
--#{$prefix}box-shadow-xs: #{$box-shadow-xs};
--#{$prefix}box-shadow-sm: #{$box-shadow-sm};
--#{$prefix}box-shadow-lg: #{$box-shadow-lg};
--#{$prefix}box-shadow-xl: #{$box-shadow-xl};
--#{$prefix}floating-component-shadow: #{$floating-component-shadow};
// TODO: CheckInBS6 - A new variable has been created because the `$link-color` SCSS #{to-rgb($link-color)} variable was being used, and changing the color did not reflect the update. This new variable ensures that future color changes are applied correctly.
--#{$prefix}custom-link-color: var(--#{$prefix}primary);
// Navbar
--#{$prefix}navbar-bg: #{$navbar-bg};
--#{$prefix}navbar-box-shadow: #{$navbar-box-shadow};
--#{$prefix}navbar-border-width: #{$border-width};
--#{$prefix}navbar-border-color: #{$navbar-bg};
// Menu
--#{$prefix}menu-header-color: #{$navbar-light-color};
// Tabs & Pills
--#{$prefix}nav-box-shadow: #{$nav-box-shadow};
--#{$prefix}nav-border-color: #{$nav-border-color};
}
[data-bs-theme="dark"] {
@function calculate-contrast($color) {
@return if(lightness($color) > 75%, var(--#{$prefix}black), var(--#{$prefix}white));
}
@each $color, $value in $theme-colors-dark {
--#{$prefix}#{$color}-contrast: #{calculate-contrast($value)};
}
}
@if $enable-dark-mode {
@include color-mode(dark, true) {
color-scheme: dark;
@each $color, $value in $grays-dark {
--#{$prefix}gray-#{$color}: #{$value};
}
@each $color, $value in $theme-colors-dark {
--#{$prefix}#{$color}: #{$value};
}
@each $color, $value in $theme-colors-rgb-dark {
--#{$prefix}#{$color}-rgb: #{$value};
}
// global custom variables
--#{$prefix}bg-label-tint-amount: #{$bg-label-tint-amount-dark};
--#{$prefix}border-subtle-amount: #{$border-subtle-amount-dark};
--#{$prefix}base-color: #{$base-dark};
--#{$prefix}base-color-rgb: #{$base-rgb-dark};
--#{$prefix}paper-bg: #{$paper-bg-dark};
--#{$prefix}paper-bg-rgb: #{$paper-bg-rgb-dark};
// Box-shadow variables
--#{$prefix}box-shadow: #{$box-shadow-dark};
--#{$prefix}box-shadow-xs: #{$box-shadow-xs-dark};
--#{$prefix}box-shadow-sm: #{$box-shadow-sm-dark};
--#{$prefix}box-shadow-lg: #{$box-shadow-lg-dark};
--#{$prefix}box-shadow-xl: #{$box-shadow-xl-dark};
--#{$prefix}floating-component-shadow: #{$floating-component-shadow-dark};
}
}
/*
? styles specifically for apex-chart dark variant */
.apexcharts-theme-dark {
@each $color, $value in $theme-colors-dark {
--#{$prefix}#{$color}: #{$value};
}
--#{$prefix}border-color: #{$gray-200-dark};
--#{$prefix}box-shadow: #{$box-shadow-dark};
--#{$prefix}body-color: #{$body-color-dark};
--#{$prefix}heading-color: #{$headings-color-dark};
--#{$prefix}paper-bg: #{$paper-bg-dark};
--#{$prefix}base-color: #{$base-dark};
--#{$prefix}secondary-color: #{$body-secondary-color-dark};
}

View File

@@ -0,0 +1,193 @@
/* The color-scheme CSS property https://web.dev/color-scheme/ */
:root,
[data-bs-theme="light"] {
@if ($bordered-style == true){
/* Bordered Skin Variables */
&[data-skin="bordered"]{
--#{$prefix}body-bg: var(--#{$prefix}paper-bg);
--#{$prefix}navbar-bg: var(--#{$prefix}paper-bg);
--#{$prefix}navbar-box-shadow: none;
--#{$prefix}navbar-border-color: var(--#{$prefix}border-color);
--#{$prefix}menu-box-shadow: 0 0 0 1px var(--#{$prefix}border-color);
--#{$prefix}menu-horizontal-menu-box-shadow: 0 0 0 1px #{$border-color};
--#{$prefix}menu-horizontal-menu-sub-box-shadow: 0 0 0 1px #{$border-color};
--tagify-dropdown-box-shadow: none;
--tagify-dropdown-border-width: #{$border-width};
.layout-navbar.navbar-detached {
box-shadow: 0 0 0 1px var(--#{$prefix}border-color);
}
.footer{
--#{$prefix}footer-border-width: 1px;
--#{$prefix}footer-box-shadow: none;
}
// Accordion
.accordion {
--#{$prefix}accordion-box-shadow: none;
--#{$prefix}accordion-active-box-shadow: none;
--#{$prefix}accordion-border-color: #{$border-color};
}
// Button
.btn {
--#{$prefix}btn-box-shadow: none;
--#{$prefix}btn-focus-box-shadow: none;
--#{$prefix}btn-active-shadow: none;
}
// Dropdown
.dropdown-menu {
--#{$prefix}dropdown-box-shadow: none;
--#{$prefix}dropdown-border-width: #{$border-width};
}
// modal
.modal:not(.modal-transparent) .modal-content{
--#{$prefix}modal-box-shadow: none;
--#{$prefix}modal-border-width: #{$border-width};
}
// offcanvas
.offcanvas {
--#{$prefix}offcanvas-box-shadow: none;
--#{$prefix}offcanvas-border-width: #{$border-width};
}
:dir(rtl) {
.offcanvas-start {
border-inline-end: #{$border-width} #{$border-style} var(--#{$prefix}offcanvas-border-color);
border-inline-start: 0;
}
.offcanvas-end {
border-inline-end: 0;
border-inline-start: #{$border-width} #{$border-style} var(--#{$prefix}offcanvas-border-color);
}
}
.toast,
.bs-toast.toast {
--#{$prefix}toast-box-shadow: none;
--#{$prefix}toast-border-width: #{$border-width};
}
.notyf__toast {
&.notyf__success,
&.notyf__error,
&.notyf__info,
&.notyf__warning {
box-shadow: none;
}
}
// Tabs & Pills
--#{$prefix}nav-box-shadow: none;
--#{$prefix}nav-border-color: var(--#{$prefix}border-color);
// Pagination
.pagination {
--#{$prefix}pagination-box-shadow-color: transparent;
}
// Card
.card {
--#{$prefix}card-box-shadow: 0px 0px 0px var(--#{$prefix}border-width) var(--#{$prefix}card-border-color);
--#{$prefix}card-hover-box-shadow: 0px 0px 0px var(--#{$prefix}border-width) var(--#{$prefix}card-border-color);
}
.card-group {
--#{$prefix}card-box-shadow: none;
.card {
--#{$prefix}card-border-width: #{$border-width};
}
}
// popover
.popover:not(.custom-popover) {
--#{$prefix}popover-box-shadow: none;
--#{$prefix}popover-border-color: var(--#{$prefix}border-color);
}
// avatar
.avatar {
--#{$prefix}box-shadow: none;
}
// shepherd
.shepherd-element {
box-shadow: none;
}
// sweetalert2
.swal2-container .swal2-popup {
box-shadow: none;
}
// apexcharts
.apexcharts-canvas .apexcharts-tooltip {
box-shadow: none;
}
// sliders
.noUi-target .noUi-tooltip {
box-shadow: none;
}
// third-party libraries
.ql-toolbar .ql-picker-options,
.ql-snow .ql-tooltip,
.flatpickr-calendar,
.daterangepicker,
.ui-timepicker-wrapper,
.pcr-app,
.bs-stepper:not(.wizard-modern),
.bs-stepper.wizard-modern .bs-stepper-content {
border-width: var(--#{$prefix}border-width);
border-style: var(--#{$prefix}border-style);
border-color: var(--#{$prefix}border-color);
box-shadow: none;
}
// dropzone
.dz-preview {
border-width: var(--#{$prefix}border-width);
box-shadow: none;
}
// Kanban
.app-kanban .kanban-wrapper .kanban-board .kanban-item {
border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color);
box-shadow: none;
&:hover {
box-shadow: none;
}
}
// select & tags
.select2-container {
--#{$prefix}select-dropdown-border-width: #{$border-width};
--#{$prefix}select-dropdown-box-shadow: none;
}
// authentication
.authentication-wrapper .authentication-bg {
border-inline-start: 1px solid var(--#{$prefix}border-color);
}
.twitter-typeahead .tt-menu {
border-width: #{$border-width};
box-shadow: none;
}
}
}
}
@if ($bordered-style == true) {
/* Bordered Skin Variables */
[data-skin="bordered"] {
[data-bs-theme="dark"] {
--#{$prefix}menu-horizontal-menu-box-shadow: 0 0 0 1px #{$border-color-dark};
--#{$prefix}menu-horizontal-menu-sub-box-shadow: 0 0 0 1px #{$border-color-dark};
}
}
}

View File

@@ -0,0 +1,38 @@
/* Spinners */
/* Large size */
.spinner-border-lg,
.spinner-grow-lg {
--#{$prefix}spinner-border-width: #{$spinner-border-width-lg};
--#{$prefix}spinner-height: #{$spinner-height-lg};
--#{$prefix}spinner-width: #{$spinner-width-lg};
}
/* Within button
******************************************************************************* */
.btn {
.spinner-border,
.spinner-grow {
--#{$prefix}spinner-height: 1em;
--#{$prefix}spinner-width: 1em;
inset-block-start: -.0625rem;
}
.spinner-border {
--#{$prefix}spinner-border-width: .15em;
}
}
@keyframes spinner-border-rtl {
to {
transform: rotate(-360deg);
}
}
/* RTL */
:dir(rtl) {
.spinner-border {
animation-name: spinner-border-rtl;
}
}

View File

@@ -0,0 +1,122 @@
/* Tables
******************************************************************************** */
/* ios fix for drodown-menu being clipped off when used in tables */
.ios .table tr > td .dropdown {
position: relative;
}
/* Firefox fix for table head border bottom */
.table {
> :not(caption) > * > * {
background-clip: padding-box;
}
tr {
> td {
.dropdown {
position: static;
}
}
}
.btn-icon,
.btn:not([class*="btn-"]) {
color: var(--#{$prefix}table-color);
}
// Table heading style
th {
color: var(--#{$prefix}heading-color);
font-size: $font-size-sm;
letter-spacing: .2px;
text-transform: uppercase;
}
&:not(.table-borderless):not(.dataTable) thead th {
border-block-start-width: var(--#{$prefix}border-width);
}
// Removed left padding from the first column and right padding from the last column
&.table-flush-spacing {
thead,
tbody {
tr > td:first-child {
padding-inline-start: 0;
}
tr > td:last-child {
padding-inline-end: 0;
}
}
}
// Style for table inside card
.card & {
margin-block-end: 0;
}
&.table-dark,
.table-dark {
th {
--#{$prefix}heading-color: var(--#{$prefix}table-color);
border-block-start: 1px solid $table-border-color;
}
}
&.table-light,
.table-light {
border-color: #{$border-color};
}
&.table-sm {
thead tr th {
padding-block: $table-head-padding-y-sm;
}
}
thead tr th {
padding-block: 1rem;
padding-inline-end: 1rem;
}
}
/* class for to remove table border bottom */
.table-border-bottom-0 {
tr:last-child {
td,
th {
border-block-end-width: 0;
}
}
}
// TODO: CheckInBS6 Review the `table-variants` mixin in Bootstrap 6 and update our overrides if needed to reflect any changes.
@each $state in map-keys($theme-colors) {
.table-#{$state} {
--#{$prefix}table-bg: rgba(var(--#{$prefix}#{$state}-rgb), .2);
--#{$prefix}table-hover-bg: color-mix(in sRGB, var(--#{$prefix}body-bg) #{$table-hover-bg-factor-amount}, var(--#{$prefix}table-bg));
--#{$prefix}table-striped-bg: color-mix(in sRGB, var(--#{$prefix}body-bg) #{$table-striped-bg-factor-amount}, var(--#{$prefix}table-bg));
--#{$prefix}table-border-color: color-mix(in sRGB, var(--#{$prefix}table-bg) #{$table-border-factor-amount}, var(--#{$prefix}table-color));
--#{$prefix}table-active-bg: color-mix(in sRGB, var(--#{$prefix}body-bg) #{$table-active-bg-factor-amount}, var(--#{$prefix}table-bg));
@if $state == "dark" or $state == "light" {
--#{$prefix}table-bg: var(--#{$prefix}#{$state});
--#{$prefix}table-hover-bg: color-mix(in sRGB, var(--#{$prefix}table-color) 3.5%, var(--#{$prefix}table-bg));
--#{$prefix}table-striped-bg: color-mix(in sRGB, var(--#{$prefix}table-color) 2.9%, var(--#{$prefix}table-bg));
--#{$prefix}table-active-bg: color-mix(in sRGB, var(--#{$prefix}table-color) 4%, var(--#{$prefix}table-bg));
}
}
}
@if $enable-dark-mode {
@include color-mode(dark) {
.table {
--#{$prefix}table-hover-bg: rgba(var(--#{$prefix}body-bg-rgb), #{$table-hover-bg-factor-dark});
--#{$prefix}table-active-bg: rgba(var(--#{$prefix}body-bg-rgb), #{$table-active-bg-factor-dark});
}
@each $state in map-keys($theme-colors) {
.table-#{$state} {
--#{$prefix}table-color: var(--#{$prefix}#{$state}-contrast);
--#{$prefix}table-hover-color: var(--#{$prefix}table-color);
--#{$prefix}table-striped-color: var(--#{$prefix}table-color);
--#{$prefix}table-active-color: var(--#{$prefix}table-color);
}
}
}
}

View File

@@ -0,0 +1,67 @@
/* Toasts
******************************************************************************* */
.bs-toast[class^="bg-"],
.bs-toast[class*=" bg-"] {
--#{$prefix}toast-header-color: var(--#{$prefix}white);
--#{$prefix}toast-color: var(--#{$prefix}white);
}
.toast {
--#{$prefix}toast-font-size: #{$font-size-base};
}
.toast-body {
font-size: $font-size-sm;
}
.toast.bs-toast {
z-index: $zindex-toast;
background-color: var(--#{$prefix}toast-bg) !important;
}
.toast-container {
--#{$prefix}toast-zindex: 8;
}
.toast-header {
--#{$prefix}toast-border-width: 1px;
.btn-close {
margin-inline: $toast-padding-x $toast-padding-x * -.5;
}
}
/* Bootstrap Toasts Example */
.toast-ex {
position: fixed;
inset-block-start: 4.1rem;
inset-inline: auto .5rem;
}
/* Placement Toast example */
.toast-placement-ex {
position: fixed;
}
@if $enable-dark-mode {
@include color-mode(dark, true) {
color-scheme: dark;
.toast {
&:not([class*="bg-"]){
.btn-close{
--#{$prefix}btn-close-white-filter: grayscale(1);
}
}
}
}
}
/* Generate contextual modifier classes for colorizing the alert */
@each $state in map-keys($theme-colors) {
.bs-toast{
&.bg-#{$state} {
--#{$prefix}toast-bg: rgba(var(--#{$prefix}#{$state}-rgb), .85);
--#{$prefix}toast-box-shadow: 0 .25rem 1rem rgba(var(--#{$prefix}#{$state}-rgb), .4);
}
}
}

View File

@@ -0,0 +1,81 @@
/* Tooltips
******************************************************************************* */
/* Open modal tooltip z-index */
.modal-open .tooltip {
z-index: $zindex-modal + 2;
}
.tooltip-inner {
box-shadow: $tooltip-box-shadow;
font-weight: $font-weight-medium;
}
[class^="tooltip-"],
[class^="tooltip-"] > .tooltip{
&.bs-tooltip-auto {
&[data-popper-placement="top"] .tooltip-arrow::before {
border-block-start-color: var(--#{$prefix}tooltip-arrow-bg);
}
&[data-popper-placement="left"] .tooltip-arrow::before {
border-inline-start-color: var(--#{$prefix}tooltip-arrow-bg);
}
&[data-popper-placement="bottom"] .tooltip-arrow::before {
border-block-end-color: var(--#{$prefix}tooltip-arrow-bg);
}
&[data-popper-placement="right"] .tooltip-arrow::before {
border-inline-end-color: var(--#{$prefix}tooltip-arrow-bg);
}
}
}
/* Dark theme
******************************************************************************* */
@if $enable-dark-mode {
@include color-mode(dark) {
.tooltip {
--#{$prefix}tooltip-bg: #{$tooltip-bg-dark};
}
}
}
/* RTL
******************************************************************************* */
:dir(rtl) {
.bs-tooltip-auto {
&[data-popper-placement="right"] {
.tooltip-arrow {
&::before {
border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;
border-inline-start-color: var(--#{$prefix}tooltip-arrow-bg);
inset-inline-start: -1px;
}
}
}
&[data-popper-placement="left"] {
.tooltip-arrow {
&::before {
border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;
border-inline-end-color: var(--#{$prefix}tooltip-arrow-bg);
inset-inline-end: -1px;
}
}
}
}
}
// scss-docs-start tooltip-modifiers
@each $state in map-keys($theme-colors) {
.tooltip.tooltip-#{$state}, .tooltip-#{$state} > .tooltip {
--#{$prefix}tooltip-bg: var(--#{$prefix}#{$state});
--#{$prefix}tooltip-color: var(--#{$prefix}#{$state}-contrast);
}
}
// scss-docs-end tooltip-modifiers

View File

@@ -0,0 +1,19 @@
/* Type */
.list-inline,
.list-unstyled {
padding-inline-start: 0;
}
.list-inline-item:not(:last-child) {
margin-inline: 0 $list-inline-padding;
}
@if $enable-dark-mode {
@include color-mode(dark, true) {
color-scheme: dark;
.blockquote-footer {
color: $blockquote-footer-color-dark;
}
}
}

View File

@@ -0,0 +1,239 @@
// Variables
// Variables should follow the `$component-state-property-size` formula for
// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
// (C) Custom variables for extended components of bootstrap only
// ! _variable-dark.scss file overrides _variable.scss file.
// Colors
// *******************************************************************************
// scss-docs-start gray-color-variables
$white-dark: #fff !default;
$black-dark: #2f3349 !default;
$base-dark: #e1def5 !default;
// Instead of using a card bg, use a paper bg.
$paper-bg-dark: #2f3349 !default; // (C)
$paper-bg-rgb-dark: #{to-rgb($paper-bg-dark)} !default; // (C)
$base-rgb-dark: #{to-rgb($base-dark)} !default; // (C)
$gray-25-dark: #33374d !default; // (C)
$gray-50-dark: #3a3d53 !default; // (C)
$gray-75-dark: #3d4157 !default; // (C)
$gray-100-dark: #535876 !default;
$gray-200-dark: #44485e !default;
$gray-300-dark: #64667d !default;
$gray-400-dark: #76778e !default;
$gray-500-dark: #9293ae !default;
$gray-600-dark: #9a9ab0 !default;
$gray-700-dark: #acabc1 !default;
$gray-800-dark: #bdbcd3 !default;
$gray-900-dark: #cfcde4 !default;
// scss-docs-end gray-color-variables
// scss-docs-start gray-colors-map
$grays-dark: (
"25": $gray-25-dark,
"50": $gray-50-dark,
"75": $gray-75-dark,
"100": $gray-100-dark,
"200": $gray-200-dark,
"300": $gray-300-dark,
"400": $gray-400-dark,
"500": $gray-500-dark,
"600": $gray-600-dark,
"700": $gray-700-dark,
"800": $gray-800-dark,
"900": $gray-900-dark
) !default;
// scss-docs-end gray-colors-map
// scss-docs-start color-variables
$blue-dark: #007bff !default;
$indigo-dark: #6610f2 !default;
$purple-dark: #7367f0 !default;
$pink-dark: #e83e8c !default;
$red-dark: #ff4c51 !default;
$orange-dark: #fd7e14 !default;
$yellow-dark: #ff9f43 !default;
$green-dark: #28c76f !default;
$teal-dark: #20c997 !default;
$cyan-dark: #00bad1 !default;
// scss-docs-end color-variables
// scss-docs-start theme-color-variables
$primary-dark: $purple-dark !default;
$secondary-dark: #808390 !default;
$success-dark: $green-dark !default;
$info-dark: $cyan-dark !default;
$warning-dark: $yellow-dark !default;
$danger-dark: $red-dark !default;
$light-dark: #494a5d !default;
$dark-dark: #6b6c9d !default;
$gray-dark: $gray-500-dark !default; // (C)
// scss-docs-end theme-color-variables
// scss-docs-start theme-colors-map
$theme-colors-dark: (
"primary": $primary-dark,
"secondary": $secondary-dark,
"success": $success-dark,
"info": $info-dark,
"warning": $warning-dark,
"danger": $danger-dark,
"light": $light-dark,
"dark": $dark-dark,
"gray": $gray-dark
) !default;
// scss-docs-end theme-colors-map
$theme-colors-rgb-dark: map-loop($theme-colors-dark, to-rgb, "$value") !default;
// Typography
// *******************************************************************************
$blockquote-footer-color-dark: $gray-600-dark !default;
// TODO: Remove this variable not used in dark theme
$body-bg-dark: #25293c !default;
// scss-docs-start theme-text-dark-variables
$light-text-emphasis-dark: $gray-700-dark !default;
$dark-text-emphasis-dark: $base-dark !default;
// scss-docs-end theme-text-dark-variables
$bg-label-tint-amount-dark: 84% !default; // (C)
$border-subtle-amount-dark: 61% !default; // (C)
// scss-docs-start theme-bg-subtle-dark-variables
$primary-bg-subtle-dark: shade-color($primary-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$secondary-bg-subtle-dark: shade-color($secondary-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$success-bg-subtle-dark: shade-color($success-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$info-bg-subtle-dark: shade-color($info-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$warning-bg-subtle-dark: shade-color($warning-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$danger-bg-subtle-dark: shade-color($danger-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$light-bg-subtle-dark: shade-color($light-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
$dark-bg-subtle-dark: shade-color($dark-dark, $bg-label-tint-amount-dark, $paper-bg-dark) !default;
// scss-docs-end theme-bg-subtle-dark-variables
// scss-docs-start theme-border-subtle-dark-variables
$primary-border-subtle-dark: shift-color($primary-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$secondary-border-subtle-dark: shift-color($secondary-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$success-border-subtle-dark: shift-color($success-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$info-border-subtle-dark: shift-color($info-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$warning-border-subtle-dark: shift-color($warning-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$danger-border-subtle-dark: shift-color($danger-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$light-border-subtle-dark: shift-color($light-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
$dark-border-subtle-dark: shift-color($dark-dark, $border-subtle-amount-dark, $paper-bg-dark) !default;
// scss-docs-end theme-border-subtle-dark-variables
// Body
// *******************************************************************************
$body-color-dark: $gray-700-dark !default;
$body-secondary-color-dark: $gray-400-dark !default;
$body-secondary-bg-dark: $gray-400-dark !default;
$body-tertiary-color-dark: rgba($body-color-dark, .5) !default;
$body-tertiary-bg-dark: mix($gray-100-dark, $body-bg-dark, 90%) !default;
// Components
// *******************************************************************************
$alert-border-scale-dark: -84% !default;
$alert-color-scale-dark: 0% !default;
$border-color-dark: $gray-200-dark !default;
// scss-docs-start box-shadow-variables
$shadow-bg-dark: #131120 !default; // (C)
$box-shadow-dark: 0 .1875rem .75rem 0 rgba($shadow-bg-dark, .2) !default;
$box-shadow-xs-dark: 0 .0625rem .375rem 0 rgba($shadow-bg-dark, .16) !default;
$box-shadow-sm-dark: 0 .125rem .5rem 0 rgba($shadow-bg-dark, .18) !default;
$box-shadow-lg-dark: 0 .25rem 1.125rem 0 rgba($shadow-bg-dark, .22) !default;
$box-shadow-xl-dark: 0 .3125rem 1.875rem 0 rgba($shadow-bg-dark, .24) !default;
// scss-docs-end box-shadow-variables
$floating-component-border-color-dark: rgba($white-dark, .05) !default; // (C)
$floating-component-shadow-dark: 0 .31rem 1.25rem 0 rgba($black-dark, .4) !default; // (C)
// * Typography
// *******************************************************************************
$headings-color-dark: $gray-900-dark !default;
$table-hover-bg-factor-dark: .75 !default;
$table-active-bg-factor-dark: .75 !default;
// Accordion
// *******************************************************************************
$accordion-button-color-dark: $headings-color-dark !default;
$accordion-button-active-color-dark: $headings-color-dark !default;
$accordion-icon-color-dark: $headings-color-dark !default;
$accordion-icon-active-color-dark: $headings-color-dark !default;
$accordion-button-icon-dark: url("data:image/svg+xml,%3csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cg id='bx-chevron-down'%3e%3cpath id='Vector' d='M13.5775 7.74417L9.99997 11.3217L6.42247 7.74417L5.24414 8.9225L9.99997 13.6783L14.7558 8.9225L13.5775 7.74417Z' fill='#{$accordion-icon-active-color-dark}' fill-opacity='0.9'/%3e%3c/g%3e%3c/svg%3e") !default;
$accordion-button-active-icon-dark: $accordion-button-icon-dark !default;
$accordion-custom-button-icon-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$accordion-icon-active-color-dark}' viewBox='0 0 24 24'%3E%3Cpath d='M19 11h-6V5h-2v6H5v2h6v6h2v-6h6z'%3E%3C/path%3E%3C/svg%3E") !default; // (C)
$accordion-custom-button-active-icon-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$accordion-icon-active-color-dark}' viewBox='0 0 24 24'%3E%3Cpath d='M5 11h14v2H5z'%3E%3C/path%3E%3C/svg%3E") !default; // (C)
// Forms
// *******************************************************************************
$input-border-color-dark: color-mix(in srgb, $base-dark 22%, $black-dark) !default;
$input-disabled-border-color-dark: rgba($base-dark, .23) !default;
$input-group-addon-border-color-dark: $input-border-color-dark !default;
$form-switch-bg-image-dark: url("data:image/svg+xml,%3csvg width='22' height='22' viewBox='0 0 22 22' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cg filter='url(%23a)'%3e%3ccircle cx='12' cy='11' r='8.5' fill='#{$white-dark}'/%3e%3c/g%3e%3cdefs%3e%3cfilter id='a' x='0' y='0' width='22' height='22' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3e%3cfeFlood flood-opacity='0' result='BackgroundImageFix'/%3e%3cfeColorMatrix in='SourceAlpha' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3e%3cfeOffset dy='2'/%3e%3cfeGaussianBlur stdDeviation='2'/%3e%3cfeColorMatrix values='0 0 0 0 0.180392 0 0 0 0 0.14902 0 0 0 0 0.239216 0 0 0 0.16 0'/%3e%3cfeBlend in2='BackgroundImageFix' result='effect1_dropShadow_6488_3264'/%3e%3cfeBlend in='SourceGraphic' in2='effect1_dropShadow_6488_3264' result='shape'/%3e%3c/filter%3e%3c/defs%3e%3c/svg%3e") !default;
$form-select-indicator-dark: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 22" fill="none"><path d="M10.9999 12.0743L15.5374 7.53676L16.8336 8.83292L10.9999 14.6666L5.16626 8.83292L6.46243 7.53676L10.9999 12.0743Z" fill="#{$white-dark}" fill-opacity="0.9"/></svg>') !default;
$form-select-disabled-indicator-dark: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 22" fill="none"><path d="M10.9999 12.0743L15.5374 7.53676L16.8336 8.83292L10.9999 14.6666L5.16626 8.83292L6.46243 7.53676L10.9999 12.0743Z" fill="#{$body-secondary-color-dark}" fill-opacity="0.9"/></svg>') !default; // (C)
// scss-docs-start form-validation-colors-dark
$form-valid-color-dark: $success-dark !default;
$form-valid-border-color-dark: $success-dark !default;
$form-invalid-color-dark: $danger-dark !default;
$form-invalid-border-color-dark: $danger-dark !default;
// scss-docs-end form-validation-colors-dark
// Modals
// *******************************************************************************
$modal-backdrop-bg-dark: #171925 !default;
$modal-backdrop-opacity-dark: .6 !default;
// Offcanvas
// *******************************************************************************
$offcanvas-backdrop-bg-dark: $modal-backdrop-bg-dark !default;
$offcanvas-backdrop-opacity-dark: $modal-backdrop-opacity-dark !default;
// List group
// *******************************************************************************
$list-group-item-bg-scale-dark: -70% !default;
$list-group-item-bg-hover-scale-dark: 10% !default; // (C)
// Tooltips
// *******************************************************************************
$tooltip-bg-dark: #f7f4ff !default;
// Close
// *******************************************************************************
$btn-close-color-dark: $base-dark !default;
$kbd-color-dark: $dark-dark !default;

View File

@@ -0,0 +1,39 @@
/* Floating Labels
******************************************************************************* */
/* Display placeholder on focus */
.form-floating {
> label {
inset-inline-start: 0;
}
> .form-control:focus,
> .form-control:not(:placeholder-shown) {
&::placeholder {
color: $input-placeholder-color;
}
}
> .form-control:focus,
> .form-control:focus:not(:placeholder-shown),
> .form-select:focus,
> .form-select:focus:not(:placeholder-shown) {
~ label {
color: $component-active-bg;
}
}
}
:dir(rtl) {
.form-floating {
> label {
transform-origin: 100% 0;
}
> .form-control:focus,
> .form-control:not(:placeholder-shown),
> .form-select,
> .form-control:-webkit-autofill {
~ label {
transform: $form-floating-label-transform-rtl;
}
}
}
}

View File

@@ -0,0 +1,98 @@
/* Checkboxes and Radios
******************************************************************************* */
.form-check {
position: relative;
padding-inline: $form-check-padding-start 0;
.form-check-input {
float: inline-start;
margin-inline-start: $form-check-padding-start * -1;
}
&.form-check-reverse {
padding-inline: 0 $form-check-padding-start;
.form-check-input {
float: inline-end;
margin-inline-end: $form-check-padding-start * -1;
}
}
}
.form-check-input {
--#{$prefix}form-check-input-checked-bg: #{$form-check-input-checked-bg-color};
--#{$prefix}form-check-input-checked-border-color: #{$form-check-input-checked-border-color};
--#{$prefix}form-check-shadow-color: var(--#{$prefix}primary-rgb);
--#{$prefix}form-check-box-shadow: 0 .125rem .375rem 0 rgba(var(--#{$prefix}form-check-shadow-color), .3);
cursor: $form-check-label-cursor;
&:disabled {
--#{$prefix}form-check-bg: #{$form-check-input-disabled-bg};
border-color: $form-check-input-disabled-bg;
}
&:checked {
border-color: var(--#{$prefix}form-check-input-checked-border-color);
background-color: var(--#{$prefix}form-check-input-checked-bg);
box-shadow: var(--#{$prefix}form-check-box-shadow);
}
&[type="checkbox"]:indeterminate {
border-color: var(--#{$prefix}form-check-input-checked-border-color);
background-color: var(--#{$prefix}form-check-input-checked-bg);
box-shadow: var(--#{$prefix}form-check-box-shadow);
}
&:active {
filter: none;
}
}
/* Only for checkbox and radio (not for bs default switch)
? .dt-checkboxes-cell class is used for DataTables checkboxes */
.form-check:not(.form-switch),
.dt-checkboxes-cell {
.form-check-input[type="radio"] {
background-size: 1.3125rem;
&:not(:checked) {
background-size: .75rem;
}
}
}
.form-check-inline {
margin-inline: 0 $form-check-inline-margin-end;
}
// Switches
// *******************************************************************************
.form-switch {
padding-inline-start: $form-switch-padding-start;
.form-check-input {
:dir(rtl) & {
background-position: right center;
&:checked {
background-position: $form-switch-checked-bg-position-rtl;
}
}
&:not(:checked) {
background-color: $form-switch-bg;
box-shadow: $form-switch-box-shadow;
}
border: 0;
margin-inline-start: $form-switch-padding-start * -1;
}
&.form-check-reverse {
padding-inline-end: $form-switch-padding-start;
.form-check-input {
margin-inline-end: $form-switch-padding-start * -1;
}
}
}
/* Generate contextual modifier classes for colorizing the form check */
@each $state in map-keys($custom-theme-colors) {
.form-check-#{$state} {
.form-check-input {
--#{$prefix}form-check-input-checked-bg: var(--#{$prefix}#{$state});
--#{$prefix}form-check-input-checked-border-color: var(--#{$prefix}#{$state});
--#{$prefix}form-check-shadow-color: var(--#{$prefix}#{$state}-rgb);
}
&.custom-option.checked {
--#{$prefix}custom-option-border-color: var(--#{$prefix}#{$state});
}
}
}

View File

@@ -0,0 +1,103 @@
/* Form control
******************************************************************************* */
.form-control {
/*
? Form control (all size) padding calc due to border increase on focus */
padding-block: calc($input-padding-y - $input-border-width);
padding-inline: calc($input-padding-x - $input-border-width);
// form input placeholder animation
&::placeholder,
&:focus::placeholder {
@include transition(all ease .2s);
}
// border color on hover state when element not in focus or disabled
&:hover {
&:not(:focus):not(.tagify--focus) {
border-color: $input-hover-border-color;
}
}
// ! FIX: wizard-ex input type number placeholder align issue
&[type="number"] {
.input-group & {
line-height: 1.375rem;
min-block-size: 2.375rem;
}
.input-group-lg & {
line-height: 1.5rem;
min-block-size: 3rem;
}
.input-group-sm & {
min-block-size: 1.875rem;
}
}
&:not([readonly]) {
&:focus::placeholder {
transform: translateX(4px);
:dir(rtl) & {
transform: translateX(-4px);
}
}
}
&:focus,
.was-validated &:invalid,
.was-validated &:valid,
&.is-invalid,
&.is-valid {
border-width: $input-focus-border-width;
padding-block: calc($input-padding-y - $input-focus-border-width);
padding-inline: calc($input-padding-x - $input-focus-border-width);
&::file-selector-button {
box-shadow: $input-border-width 0 0 $input-focus-border-color;
}
}
&.form-control-lg {
padding-block: calc($input-padding-y-lg - $input-border-width);
padding-inline: calc($input-padding-x-lg - $input-border-width);
&:focus,
.was-validated &:invalid,
.was-validated &:valid,
&.is-invalid,
&.is-valid {
padding-block: calc($input-padding-y-lg - $input-focus-border-width);
padding-inline: calc($input-padding-x-lg - $input-focus-border-width);
}
&::file-selector-button {
margin-block: (-$input-padding-y-lg - .0625rem);
padding-block: calc($input-padding-y-lg + .0625rem);
}
}
&.form-control-sm {
padding-block: calc($input-padding-y-sm - $input-border-width);
padding-inline: calc($input-padding-x-sm - $input-border-width);
&:focus,
.was-validated &:invalid,
.was-validated &:valid,
&.is-invalid,
&.is-valid {
padding-block: calc($input-padding-y-sm - $input-focus-border-width);
padding-inline: calc($input-padding-x-sm - $input-focus-border-width);
}
&::file-selector-button {
margin-block: (-$input-padding-y-sm - .0625rem);
padding-block: calc($input-padding-y-sm + .0625rem);
}
}
&.autosize{
field-sizing: content;
min-block-size: $autozise-min-height;
overflow-x: hidden;
resize: none;
}
}
/* RTL */
:dir(rtl) {
input[type="tel"] {
text-align: end;
}
}

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