diff --git a/jambotron-ui/angular.json b/jambotron-ui/angular.json
index 07de4b3..70ac9aa 100644
--- a/jambotron-ui/angular.json
+++ b/jambotron-ui/angular.json
@@ -19,8 +19,7 @@
"options": {
"browser": "src/main.ts",
"polyfills": [
- "zone.js",
- "@angular/localize/init"
+ "zone.js"
],
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
@@ -28,15 +27,22 @@
{
"glob": "**/*",
"input": "public"
+ },
+ {
+ "glob": "**/*",
+ "input": "src/assets/",
+ "output": "/assets/"
}
],
"styles": [
- {
- "input": "node_modules/@progress/kendo-theme-default/dist/all.css"
- },
- "@angular/material/prebuilt-themes/cyan-orange.css",
+ "@angular/material/prebuilt-themes/azure-blue.css",
"src/styles.scss"
- ]
+ ],
+ "server": "src/main.server.ts",
+ "outputMode": "server",
+ "ssr": {
+ "entry": "src/server.ts"
+ }
},
"configurations": {
"production": {
@@ -44,7 +50,7 @@
{
"type": "initial",
"maximumWarning": "500kB",
- "maximumError": "5MB"
+ "maximumError": "1MB"
},
{
"type": "anyComponentStyle",
@@ -82,8 +88,7 @@
"options": {
"polyfills": [
"zone.js",
- "zone.js/testing",
- "@angular/localize/init"
+ "zone.js/testing"
],
"tsConfig": "tsconfig.spec.json",
"inlineStyleLanguage": "scss",
@@ -94,10 +99,7 @@
}
],
"styles": [
- {
- "input": "node_modules/@progress/kendo-theme-default/dist/all.css"
- },
- "@angular/material/prebuilt-themes/cyan-orange.css",
+ "@angular/material/prebuilt-themes/azure-blue.css",
"src/styles.scss"
]
}
diff --git a/jambotron-ui/package-lock.json b/jambotron-ui/package-lock.json
index 04f2bbb..4ad1649 100644
--- a/jambotron-ui/package-lock.json
+++ b/jambotron-ui/package-lock.json
@@ -8,43 +8,24 @@
"name": "jambotron-ui",
"version": "0.0.0",
"dependencies": {
- "@angular/animations": "^20.0.3",
+ "@angular/animations": "^20.0.4",
"@angular/cdk": "^20.0.3",
"@angular/common": "^20.0.0",
"@angular/compiler": "^20.0.0",
"@angular/core": "^20.0.0",
"@angular/forms": "^20.0.0",
- "@angular/localize": "^20.0.0",
"@angular/material": "^20.0.3",
"@angular/platform-browser": "^20.0.0",
- "@angular/platform-browser-dynamic": "^20.0.3",
"@angular/platform-server": "^20.0.0",
"@angular/router": "^20.0.0",
"@angular/ssr": "^20.0.2",
+ "@ant-design/icons-angular": "19.0.0",
+ "@ng-bootstrap/ng-bootstrap": "19.0.0",
+ "@popperjs/core": "2.11.8",
"@primeng/themes": "^19.1.3",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-dialog": "19.1.1",
- "@progress/kendo-angular-dropdowns": "19.1.1",
- "@progress/kendo-angular-editor": "^19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-indicators": "^19.1.1",
- "@progress/kendo-angular-inputs": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-label": "19.1.1",
- "@progress/kendo-angular-layout": "19.1.1",
- "@progress/kendo-angular-navigation": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-angular-progressbar": "19.1.1",
- "@progress/kendo-angular-toolbar": "19.1.1",
- "@progress/kendo-angular-treeview": "19.1.1",
- "@progress/kendo-angular-utils": "^19.1.1",
- "@progress/kendo-drawing": "^1.21.0",
- "@progress/kendo-licensing": "^1.5.0",
- "@progress/kendo-svg-icons": "^4.0.0",
- "@progress/kendo-theme-default": "11.0.2",
+ "bootstrap": "5.3.6",
"express": "^5.1.0",
+ "ngx-scrollbar": "18.0.0",
"primeng": "^19.1.3",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
@@ -70,6 +51,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -80,13 +62,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.2000.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.2.tgz",
- "integrity": "sha512-adJYWJWuyXFtCOg2lZTV/7CImf4ifxd6c//VXuq5kx7AiSGTIH5Nf2xTQe8ZAZqytUmDgnoNMDhGRQ9b3C5TnA==",
+ "version": "0.2000.3",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.3.tgz",
+ "integrity": "sha512-37S4dzlwB3C8gnBlwxjjvNUqwSeKnDe2j1XWg7sj94kbg/jLJV0Db/Dvb7zJjKher6Ed1Bnj3pMOM206ALJW2A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.2",
+ "@angular-devkit/core": "20.0.3",
"rxjs": "7.8.2"
},
"engines": {
@@ -96,9 +78,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.2.tgz",
- "integrity": "sha512-qqTSpcIw+TqJ6u/tkQzqgpwVelHsHr8Jhws1Vlx6E0L6E+cRILBK48i9ttE+oYkQlcopQ3VZAmzcZodXJ1SQ9Q==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.3.tgz",
+ "integrity": "sha512-XgEIbIky0pMtJSomHRaf16BT1jzJNQCm2geNZ642n3cj8fYLm4jHJX/r738kIfbHWoWXT/hlTmVgIH9TdQPicA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -124,13 +106,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.2.tgz",
- "integrity": "sha512-r1aSZhcadLtUMhzUUfy+pkJdZW93z8WQtpGR24y88yFpPgDL5kY85VSlOzjGgo1vEs8Dd7ADcOcsVsUW8MxQ3A==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.3.tgz",
+ "integrity": "sha512-T679AQXenG6e4fdC/HXrps0Dqy1EYKb4pFNLQqZHR9mfyeq/vxFWs3ga/yMiqvqMPUK5W5FucEpFZJQQmc7M+w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.2",
+ "@angular-devkit/core": "20.0.3",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "8.2.0",
@@ -143,9 +125,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.3.tgz",
- "integrity": "sha512-R6yv2RmrH49nW1ybgoOMw5pWzqaRYo8Kn3VtvrUDBty4TXjwc0addaw/t89n0smO3/lmBB4vnlRScePAEQZ/3w==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.4.tgz",
+ "integrity": "sha512-s0kRcEply2A1ThvFmb0+o+hEpAbPn08lpK8xjWZryM4cMrwjgsUE0OZHZPBANP4I1xT7Z82l+fmQbH+vX48EyA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -154,19 +136,19 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.3",
- "@angular/core": "20.0.3"
+ "@angular/common": "20.0.4",
+ "@angular/core": "20.0.4"
}
},
"node_modules/@angular/build": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.2.tgz",
- "integrity": "sha512-nxha/dncAwEbY0nkgDWeiWSi+MSCJBuQbFf5bjTZ+pu0fS+5SOQllZKzZE9H+dms/JsLHm2YmPiScIYVvUenDw==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.3.tgz",
+ "integrity": "sha512-xA5eTGop85SI/+hfiOSJR/xI1w1NK3qylpEZ277YRaw8Ikh7r1DKPJOMGBfXNd8QsZYBSWGHA8SXvCmOh/hvLQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2000.2",
+ "@angular-devkit/architect": "0.2000.3",
"@babel/core": "7.27.1",
"@babel/helper-annotate-as-pure": "7.27.1",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -208,7 +190,7 @@
"@angular/platform-browser": "^20.0.0",
"@angular/platform-server": "^20.0.0",
"@angular/service-worker": "^20.0.0",
- "@angular/ssr": "^20.0.2",
+ "@angular/ssr": "^20.0.3",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^20.0.0",
@@ -273,18 +255,18 @@
}
},
"node_modules/@angular/cli": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.2.tgz",
- "integrity": "sha512-LzBONPETA1uCZuylgZRYe+vImf8i+rRrwAgOBHWbW2wxut9ZQ8ZFwQgNkjvDhE7DLmsFV+GskfAs5+Td/5LZwA==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.3.tgz",
+ "integrity": "sha512-tDYcUrxq8Y9wK6EqwJ6Gn+4IF+VpPVikmpuqzqrUtYzqvRTqYtkyhJsAu3Ec6d6941mL2U3ZnMm3sjOxPPNkjA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.2000.2",
- "@angular-devkit/core": "20.0.2",
- "@angular-devkit/schematics": "20.0.2",
+ "@angular-devkit/architect": "0.2000.3",
+ "@angular-devkit/core": "20.0.3",
+ "@angular-devkit/schematics": "20.0.3",
"@inquirer/prompts": "7.5.1",
"@listr2/prompt-adapter-inquirer": "2.0.22",
- "@schematics/angular": "20.0.2",
+ "@schematics/angular": "20.0.3",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
@@ -306,9 +288,9 @@
}
},
"node_modules/@angular/common": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.3.tgz",
- "integrity": "sha512-HqqVqaj+xzByWJOIrONVRkpvM6mRuGmC+m9wKixhc9f+xXsymVTBR6xg+G/RwyYP2NuC5chxIZbaJTz2Hj+6+g==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.4.tgz",
+ "integrity": "sha512-fWgxe2rgSKgI36ummBYnBN4YUrmp4CHbfEG3RMeJho/vhHKguk2/o6BgL9zvnKybvbWmuaqbkHogi+y0LeJ8Ww==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -317,14 +299,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "20.0.3",
+ "@angular/core": "20.0.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.3.tgz",
- "integrity": "sha512-CShPNvqqV5Cleyho8CKtcFlt7l2thHPUdXZPtKHH3Zf43KojvJbJksZLBz6ZbyoQdgxNMYSfbh4h0UbSGtPOzQ==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.4.tgz",
+ "integrity": "sha512-1bP3P8Ll/KUYMPiE6TDjkMXkqCDVgSUAUsVCgzAxz4mcMuc9PnlbhQazpWHCkCDIjGFZ5XIAsS49V7tfaTbLDw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -334,9 +316,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.3.tgz",
- "integrity": "sha512-u+fYnx1sRrwL0fd8kaAD2LqJjfe/Zj7zyOv0A3Ue7r8jzdNsPU8MWr/QyBaWlqSpPEpR+kD3xmDvRT9ra9RTBA==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.4.tgz",
+ "integrity": "sha512-2FP1WMRexAMcDPNE3YO3zB++sCgND9O/qJC5rgKbAebpbmOrCDMUBRlftkwiLT+UhTM9PjhTtAGtK7C+2iwx1g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -357,7 +339,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.3",
+ "@angular/compiler": "20.0.4",
"typescript": ">=5.8 <5.9"
},
"peerDependenciesMeta": {
@@ -476,9 +458,9 @@
}
},
"node_modules/@angular/core": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.3.tgz",
- "integrity": "sha512-kB6w1bQgClfmkTbWJeD3vSLqX0e3uSaJD6KJ7XXT1IEaqUs4J+mKRKHQyxpJlpdUb7R+jDaHSM/vrVF15/L2rA==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.4.tgz",
+ "integrity": "sha512-JhSl3B6CrJ9kegLffgWVFGF4D4bWLV/9r8R0+h78vU+ppdPFPWDha7WnirF31cPIg3pBzy6wn103Kcy9Ri5M5w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -487,7 +469,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "20.0.3",
+ "@angular/compiler": "20.0.4",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0"
},
@@ -501,9 +483,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.3.tgz",
- "integrity": "sha512-tb4M+c+/JnmPmtTb3+Si/DWGttnCEW5rvi4u55q+EFxYGQO0GeHa53yQTl1e2ngQLT9/kgmDAsJ2mt1Ql9N6xg==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.4.tgz",
+ "integrity": "sha512-bFTMgJSHiLr80ELymRykZW6o5QroDlk+g5AFFiY9yxM8I0DV5YpCNBefv8GiuWubE+Lw6LkQ/HMYeXYJMTue3A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -512,138 +494,12 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.3",
- "@angular/core": "20.0.3",
- "@angular/platform-browser": "20.0.3",
+ "@angular/common": "20.0.4",
+ "@angular/core": "20.0.4",
+ "@angular/platform-browser": "20.0.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
- "node_modules/@angular/localize": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.0.3.tgz",
- "integrity": "sha512-1vcIvXQqrWGFyLcLlmANdfv66DrJ44ZHxGITZYfGoy062Ffa8nvGSyEMe41LLU729Ygy+caLYzr5G5GAOqs/yg==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "7.27.4",
- "@types/babel__core": "7.20.5",
- "tinyglobby": "^0.2.12",
- "yargs": "^18.0.0"
- },
- "bin": {
- "localize-extract": "tools/bundles/src/extract/cli.js",
- "localize-migrate": "tools/bundles/src/migrate/cli.js",
- "localize-translate": "tools/bundles/src/translate/cli.js"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- },
- "peerDependencies": {
- "@angular/compiler": "20.0.3",
- "@angular/compiler-cli": "20.0.3"
- }
- },
- "node_modules/@angular/localize/node_modules/@babel/core": {
- "version": "7.27.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
- "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.27.3",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-module-transforms": "^7.27.3",
- "@babel/helpers": "^7.27.4",
- "@babel/parser": "^7.27.4",
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.27.4",
- "@babel/types": "^7.27.3",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@angular/localize/node_modules/cliui": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
- "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^7.2.0",
- "strip-ansi": "^7.1.0",
- "wrap-ansi": "^9.0.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@angular/localize/node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "license": "MIT"
- },
- "node_modules/@angular/localize/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@angular/localize/node_modules/wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.2.1",
- "string-width": "^7.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@angular/localize/node_modules/yargs": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
- "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^9.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "string-width": "^7.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^22.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
- "node_modules/@angular/localize/node_modules/yargs-parser": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
- "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
- "license": "ISC",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
"node_modules/@angular/material": {
"version": "20.0.3",
"resolved": "https://registry.npmjs.org/@angular/material/-/material-20.0.3.tgz",
@@ -662,9 +518,9 @@
}
},
"node_modules/@angular/platform-browser": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.3.tgz",
- "integrity": "sha512-cba0bibw9dJ8b+a2a8mwkiq5/HPiakY9P5OiJEVefN+2V/K9CND/pW+KIbW0/P6KhSSDQ29xgcGRseVtkjYLmg==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.4.tgz",
+ "integrity": "sha512-hMJYvtZlNPh4Tt6JrnK+vmBmHWok04EkuJwyPcPhlle1u6/LihuCj4suELLqCanX9EzyNgvyKnws0i6JE/qh8Q==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -673,9 +529,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/animations": "20.0.3",
- "@angular/common": "20.0.3",
- "@angular/core": "20.0.3"
+ "@angular/animations": "20.0.4",
+ "@angular/common": "20.0.4",
+ "@angular/core": "20.0.4"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -683,28 +539,10 @@
}
}
},
- "node_modules/@angular/platform-browser-dynamic": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.3.tgz",
- "integrity": "sha512-EUC0q9/L7nBQOJkOi7aKz0cKXym7XIZtZJjZ+K7hCZaE92wb+Uk5YdBfBaq6hJ3aEp896GUs3FVFI6Rxklrm2A==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.3.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- },
- "peerDependencies": {
- "@angular/common": "20.0.3",
- "@angular/compiler": "20.0.3",
- "@angular/core": "20.0.3",
- "@angular/platform-browser": "20.0.3"
- }
- },
"node_modules/@angular/platform-server": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.0.3.tgz",
- "integrity": "sha512-7v0BSHgbohgxAJ0pROOtHJzwvp7AHf9sZd3Lws+UzRp0UUzdtUj2qDH1Ag1lQbXx6yxSLbsVDdVQi7F1woJyVQ==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.0.4.tgz",
+ "integrity": "sha512-jCbBPy/KmWw/rW6400My/+2SumnatciWnyWJVy2tKSHU/WDHQdjgk8djMdZODr+2CDORQzdkdBKqf7TuFK6clA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0",
@@ -714,17 +552,17 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.3",
- "@angular/compiler": "20.0.3",
- "@angular/core": "20.0.3",
- "@angular/platform-browser": "20.0.3",
+ "@angular/common": "20.0.4",
+ "@angular/compiler": "20.0.4",
+ "@angular/core": "20.0.4",
+ "@angular/platform-browser": "20.0.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/router": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.3.tgz",
- "integrity": "sha512-FY2kMZjLh7NUKjSaZ1K26azl67T4aVnOD8PE/w1Ih3eQmSIlHniNP1NmCGMUy6t1O/ZV6sCSKkA5AZFv18wzIQ==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.4.tgz",
+ "integrity": "sha512-t02ukwKh+YDZutR09ZYJVLaC+OPyDxu6ll7A2MFK0BNLPpD9oQc0lDwJZSrqfAhlXU0arWUjmwkNvFdh21/Z5Q==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -733,16 +571,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "20.0.3",
- "@angular/core": "20.0.3",
- "@angular/platform-browser": "20.0.3",
+ "@angular/common": "20.0.4",
+ "@angular/core": "20.0.4",
+ "@angular/platform-browser": "20.0.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/ssr": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.0.2.tgz",
- "integrity": "sha512-BIjjQvSuzzLRwfSbeOeZGA5jj7xFKHeYBs5RuySpGgz5t60GJpyn5h1iAU6GRhMZ4flCwja8CvRkiFjAUa0yIA==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.0.3.tgz",
+ "integrity": "sha512-AuEO05mdcQU1HBZAJ64eNPEoi4vxgA0zmYjdVK+Z55uwhaAPiyU6Ti/irK7y4IpM5WZ0fTKFzxtgD+GuEqai2w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -759,10 +597,48 @@
}
}
},
+ "node_modules/@ant-design/colors": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz",
+ "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@ant-design/fast-color": "^2.0.6"
+ }
+ },
+ "node_modules/@ant-design/fast-color": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz",
+ "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=8.x"
+ }
+ },
+ "node_modules/@ant-design/icons-angular": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-19.0.0.tgz",
+ "integrity": "sha512-bBWFA1cTZwLAFTgpozkeNIHX1nXyZuiUaRzTcAfFEt85eW1X3ypMcBfS/XEVVVzkdTw5Td+E1vwzgfuUlKiYSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ant-design/colors": "^7.0.0",
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0",
+ "@angular/core": "^19.0.0",
+ "@angular/platform-browser": "^19.0.0",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
@@ -777,6 +653,7 @@
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
"integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -834,6 +711,7 @@
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
"integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.5",
@@ -863,6 +741,7 @@
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
@@ -879,6 +758,7 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -888,6 +768,7 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.27.1",
@@ -901,6 +782,7 @@
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.27.1",
@@ -931,6 +813,7 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -940,6 +823,7 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -949,6 +833,7 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -958,6 +843,7 @@
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
"integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
@@ -971,6 +857,7 @@
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
"integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -982,10 +869,20 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
@@ -1000,6 +897,7 @@
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
@@ -1018,6 +916,7 @@
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -1784,6 +1683,7 @@
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
@@ -1801,12 +1701,14 @@
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
@@ -1824,6 +1726,7 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
@@ -1864,6 +1767,7 @@
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
@@ -1878,6 +1782,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1887,6 +1792,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1896,12 +1802,14 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -2434,6 +2342,23 @@
"node": ">= 10"
}
},
+ "node_modules/@ng-bootstrap/ng-bootstrap": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-19.0.0.tgz",
+ "integrity": "sha512-Ryd7L3VdT0zQ5+Y9uA5Kze+4FylUQ7FS04DCiFAjU3eCLxrGirhXiwpE2poMSciZi0nqXodKgKKdUSynZEYY+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^20.0.0",
+ "@angular/core": "^20.0.0",
+ "@angular/forms": "^20.0.0",
+ "@angular/localize": "^20.0.0",
+ "@popperjs/core": "^2.11.8",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
"node_modules/@npmcli/agent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz",
@@ -3046,12 +2971,23 @@
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=14"
}
},
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
"node_modules/@primeng/themes": {
"version": "19.1.3",
"resolved": "https://registry.npmjs.org/@primeng/themes/-/themes-19.1.3.tgz",
@@ -3082,624 +3018,6 @@
"node": ">=12.11.0"
}
},
- "node_modules/@progress/kendo-angular-buttons": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-buttons/-/kendo-angular-buttons-19.1.1.tgz",
- "integrity": "sha512-EwYZdsC+5DAFhE1XD2BX1PoTj756DAysrArgG9M1Xp4zEkPeLvcrcZbK2dlv8ypoZxAt7QvRmbrLi0jCE3JkWQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-common": "^1.0.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-common": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-common/-/kendo-angular-common-19.1.1.tgz",
- "integrity": "sha512-IJUEzxw7wCugZU2LgVvrnzcmike7SbgbiZKIIOJfrn4mkFrNaiBPuYdWvPrKms87DDec/HiAiAPcU0Q4H9Q1lA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-common": "^1.0.1",
- "@progress/kendo-draggable": "^3.0.2",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-dialog": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-dialog/-/kendo-angular-dialog-19.1.1.tgz",
- "integrity": "sha512-q374Tx9gzCUBiA+lPiqU2qXVuJCAUO7fW97QUCMGnA9/UKGnySdApSTbPQnZwk0ERkxcaM/IBecXbOc6yfeRvA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-popup-common": "^1.7.0",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-dropdowns": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-dropdowns/-/kendo-angular-dropdowns-19.1.1.tgz",
- "integrity": "sha512-6GEdPAqtKQm2JnAkkoEH2cwdS7kQ0xorSV32CS2lFKsjiOsUR2lrPx2KaaUFlhs37dG29GMxl2dguyCvSZ024Q==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-common": "^1.0.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/forms": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-navigation": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-angular-treeview": "19.1.1",
- "@progress/kendo-angular-utils": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-editor": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-editor/-/kendo-angular-editor-19.1.1.tgz",
- "integrity": "sha512-gB0ZUAonSw9YqrxCuNW178I8/rgwPuxfLx1/t8YXhGSS4ubScaA01OKSiReDRirgm3nXsNQAoIF5OJSXjfnK7w==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-editor-common": "1.12.3",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/forms": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-dialog": "19.1.1",
- "@progress/kendo-angular-dropdowns": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-inputs": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-label": "19.1.1",
- "@progress/kendo-angular-layout": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-angular-toolbar": "19.1.1",
- "@progress/kendo-drawing": "^1.21.0",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-icons": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-icons/-/kendo-angular-icons-19.1.1.tgz",
- "integrity": "sha512-Efu7OQRVtLTERSOJ+sKFrf+WQWnqTW5QK3bO5s8kLLH6x2P5sLUgb/giayEXoFMC+KcGhSHB/Ff1LueCchIH1A==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "@progress/kendo-svg-icons": "^4.0.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-indicators": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-indicators/-/kendo-angular-indicators-19.1.1.tgz",
- "integrity": "sha512-LMvi90I3LcGYbqFQ4mTdkCkzMe9SezLp1GrnMKZjEoqyk4HDq5HanvxJLHJu06vP7z8R/J7+rQaZmuzzF+zUAg==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-inputs": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-inputs/-/kendo-angular-inputs-19.1.1.tgz",
- "integrity": "sha512-8Rzv9lM/+ampzUAtC0E4+TCGGDab2N+vVqzj2JB3J0uqQNZiCX7/qwMxRHfUi6LCpT9z+UTFBi3QWeu5DqcLHQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-common": "^1.0.1",
- "@progress/kendo-draggable": "^3.0.0",
- "@progress/kendo-inputs-common": "^3.1.0",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/forms": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-dialog": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-navigation": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-angular-utils": "19.1.1",
- "@progress/kendo-drawing": "^1.21.0",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-intl": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-intl/-/kendo-angular-intl-19.1.1.tgz",
- "integrity": "sha512-QXzRagNDvAvi+DVolMw2693cfSmewj/J15dPZXCLkd8igceMMXaDmVJP0Xqq0k55wUfcov81n8uxy1OLCoZsGQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-intl": "^3.1.0",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-l10n": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-l10n/-/kendo-angular-l10n-19.1.1.tgz",
- "integrity": "sha512-iPM7CcZ0ExGuwzAF41AJ0QV1wqRmeRemZcfywlQ+hNdXrB0C3ITv3OSEJkzDDwnVDDPH2O5hf+ZJ2MFZHbBDDA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-label": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-label/-/kendo-angular-label-19.1.1.tgz",
- "integrity": "sha512-a36RaS65MAbNy7eBLu/8SiOPi+ydbcHx1v+YUNOaav8yCx+5tNRC30IdiHF5F22xdq14hxQ7ObiHQ/Lnrskfkg==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/forms": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-layout": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-layout/-/kendo-angular-layout-19.1.1.tgz",
- "integrity": "sha512-O66WCgl8yUYf80p+eiD4llEG8TwlP1z/zclei+cz3zVX+oLtrXb6hxTxwVffm/EyaV1fkGVP2viMZZcC1Wht4g==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-draggable": "^3.0.2",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-progressbar": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-navigation": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-navigation/-/kendo-angular-navigation-19.1.1.tgz",
- "integrity": "sha512-MSMkrLe7IhGaQQzRz13NTSTT4tKDOv343rKuW+WW9URxEHCqM0bWMQXPCdvnurTvH3um16CddhCMuOhwxATU3A==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-popup": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-popup/-/kendo-angular-popup-19.1.1.tgz",
- "integrity": "sha512-tZ04/XPjLxZYL+2rpoD6qAx0je7dQFmXTd2evaouGZPRyjawi7zfArICnc5n+SvpWrUGi8xpM3jPpEvLDzAGhA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-popup-common": "^1.7.0",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-progressbar": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-progressbar/-/kendo-angular-progressbar-19.1.1.tgz",
- "integrity": "sha512-QdfDMkEwLfMd2ad7vH8g+s2f2Zx3LpE++6f69mTn1AU2jiiIa9pp/d+JqW/RqhLPl8WdOUf52xeEdnV3VMWizg==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-schematics": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-schematics/-/kendo-angular-schematics-19.1.1.tgz",
- "integrity": "sha512-teRFzHlrB8RsRNQm3FMtP88wp9aeEIfjbpAWZ7w/dMnbllTyZ4Bd9O2tk7one285LrT9ghbB035A2UMP+4oKhg==",
- "license": "SEE LICENSE in LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@types/semver": "^7.5.0",
- "semver": "^7.5.3"
- },
- "peerDependencies": {
- "@angular-devkit/core": "16 - 20",
- "@angular-devkit/schematics": "16 - 20",
- "@angular/core": "16 - 20",
- "@schematics/angular": "16 - 20",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-toolbar": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-toolbar/-/kendo-angular-toolbar-19.1.1.tgz",
- "integrity": "sha512-8Y813aHj4GZ53jlvdNJRhVpsEfIRF1rXGzYp0AfvaSbvSUrsmgYQ6Wpum+pvJNvWGE6Q/drSpn02zO/AhS9ORQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-indicators": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-treeview": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-treeview/-/kendo-angular-treeview-19.1.1.tgz",
- "integrity": "sha512-fxJnUzKMQc1RBFBoAzFbJphS2MY7i41MtysProznvVvSeBxHEpuQzlATW8noA0j7CKmWFvW9P+l897SiG0H4qg==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-common": "^1.0.1",
- "@progress/kendo-draggable": "^3.0.2",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-inputs": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-angular-utils": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-angular-utils/-/kendo-angular-utils-19.1.1.tgz",
- "integrity": "sha512-0eijm9CnwILx0jeMMJ0reQ72gKdd9kPAymSCAJ8RGuiNXfseJM2gy8zgXQCDkvGHiTZjtdMxBkWBzTYfc0rMEA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-angular-schematics": "19.1.1",
- "@progress/kendo-draggable-common": "^0.2.3",
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@angular/animations": "16 - 20",
- "@angular/common": "16 - 20",
- "@angular/core": "16 - 20",
- "@angular/platform-browser": "16 - 20",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-licensing": "^1.5.0",
- "rxjs": "^6.5.3 || ^7.0.0"
- }
- },
- "node_modules/@progress/kendo-common": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-common/-/kendo-common-1.0.2.tgz",
- "integrity": "sha512-PHxnquetSmtmXiF4dmlQiypzXaFLUEPK3VAOHxmnRDrLxaPrcZfaW9FOOiyur8hv4QmXlohISMwMElZS8Xi1Ag==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "tslib": "^1.7.0"
- }
- },
- "node_modules/@progress/kendo-common/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "license": "0BSD"
- },
- "node_modules/@progress/kendo-draggable": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@progress/kendo-draggable/-/kendo-draggable-3.1.0.tgz",
- "integrity": "sha512-S5AHF9uiy44um+06ABJcjZn/wpO3ZwLahd2BhiTd7NeBVPt5lkj2bjdmkd88GEIIBKmT7FOK308WUt5/MmKVTQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@progress/kendo-draggable-common": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@progress/kendo-draggable-common/-/kendo-draggable-common-0.2.3.tgz",
- "integrity": "sha512-e1FraFsT7zwevswzZlQYL//K+fzmRUvkr/4emp51dzkARLDtGd95BtPNSoXYRG5xYHeueKBS75hzVwQI6Dm3Dg==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "tslib": "^1.7.0"
- }
- },
- "node_modules/@progress/kendo-draggable-common/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "license": "0BSD"
- },
- "node_modules/@progress/kendo-drawing": {
- "version": "1.21.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-drawing/-/kendo-drawing-1.21.2.tgz",
- "integrity": "sha512-1U/0EpVRk71nOMHQVYjdNbUwuZAaTT46xY6PPrtMATPPywIenJuK+NlRQFIdcbyY7/WplHJxLdIrmOVpKJvkcw==",
- "license": "See license in LICENSE.md",
- "dependencies": {
- "@progress/kendo-common": "^1.0.1",
- "@progress/pako-esm": "^1.0.1"
- }
- },
- "node_modules/@progress/kendo-editor-common": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/@progress/kendo-editor-common/-/kendo-editor-common-1.12.3.tgz",
- "integrity": "sha512-vuB0ZE60uBqBTPOEP4YHkr1yJIVB4/HEq5YzrpH1CRuhn1Oexq1r0hItw+VgAEw3cfwdXQnCi20ZtnTvH7GepQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@progress/kendo-common": "^1.0.2",
- "prosemirror-commands": "1.7.1",
- "prosemirror-dropcursor": "1.8.2",
- "prosemirror-gapcursor": "1.3.2",
- "prosemirror-history": "1.4.1",
- "prosemirror-inputrules": "1.5.0",
- "prosemirror-keymap": "1.2.3",
- "prosemirror-model": "1.25.1",
- "prosemirror-schema-list": "1.5.1",
- "prosemirror-state": "1.4.3",
- "prosemirror-tables": "1.7.1",
- "prosemirror-transform": "1.10.4",
- "prosemirror-view": "1.39.3",
- "tslib": "^2.8.1"
- }
- },
- "node_modules/@progress/kendo-inputs-common": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@progress/kendo-inputs-common/-/kendo-inputs-common-3.1.1.tgz",
- "integrity": "sha512-OqID8+2DuAnUET0W1j357qqTPvws6hnByt2h5+uVS7uK9Wmt/NHA0gVhdYmh+Jyv6Pw+S2epSk47mDsfyreKYA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "tslib": "^2.3.1"
- },
- "peerDependencies": {
- "@progress/kendo-drawing": "^1.17.0"
- }
- },
- "node_modules/@progress/kendo-intl": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-intl/-/kendo-intl-3.1.2.tgz",
- "integrity": "sha512-rOtMppQSrScwryMfeQSOdsnRi9Oj1l08HFoEC2ticZ0T2N0/JN9CHt+fuToRx5onXK7QkcbbuNM0D09o8TeeMw==",
- "license": "Apache-2.0"
- },
- "node_modules/@progress/kendo-licensing": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@progress/kendo-licensing/-/kendo-licensing-1.6.0.tgz",
- "integrity": "sha512-vdTDCt9Mn3tixvHPrfsNseVO8dxNyWPlL3OJBXEo8JoCbRdVTjq16pcFtfbPH9Iev/aY0uYVTdGABWXSElzaUw==",
- "hasInstallScript": true,
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "glob": "^10.4.5",
- "jsonwebtoken": "^9.0.2"
- },
- "bin": {
- "kendo-ui-license": "bin/kendo-ui-license.js"
- }
- },
- "node_modules/@progress/kendo-licensing/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@progress/kendo-licensing/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@progress/kendo-licensing/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@progress/kendo-popup-common": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-popup-common/-/kendo-popup-common-1.9.2.tgz",
- "integrity": "sha512-Gs50UafJcERiGuSP/47Yg7ftPX3HQXiK5M9zHB8sHSoc1/AEYd0/Sj5wh8UrVVBAM9b0pUTwmEuzQ/D5yDDd2Q==",
- "license": "Apache-2.0"
- },
- "node_modules/@progress/kendo-svg-icons": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@progress/kendo-svg-icons/-/kendo-svg-icons-4.4.0.tgz",
- "integrity": "sha512-YDq2KH27gQbxNwyUR6WFDEdBteSiY5G0PgV5xiCnjKwCU0GkbdKvzf55basFLiQEfEmIeoIyHsBnFjcsS4kj/w==",
- "license": "Apache-2.0"
- },
- "node_modules/@progress/kendo-theme-core": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-theme-core/-/kendo-theme-core-11.0.2.tgz",
- "integrity": "sha512-z89TLL4HUFNo7AkcTNkHJtvmjT7h+dhSAhMkUeiiE9sTrKZAwglCgnV5Fgs9PX2Y1m5lOLquY2ZT2U7pwVUndg==",
- "license": "Apache-2.0"
- },
- "node_modules/@progress/kendo-theme-default": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-theme-default/-/kendo-theme-default-11.0.2.tgz",
- "integrity": "sha512-CZOYx/M1mzZz6QGhxvN5ZKNMQRrCMrsSSu1Qv1CqzthL6XTORZ/jO4CNjmfFwaVjuRecAHjf6crPJriXkmgJOg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@progress/kendo-svg-icons": "^4.1.0",
- "@progress/kendo-theme-core": "11.0.2",
- "@progress/kendo-theme-utils": "11.0.2"
- }
- },
- "node_modules/@progress/kendo-theme-utils": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/@progress/kendo-theme-utils/-/kendo-theme-utils-11.0.2.tgz",
- "integrity": "sha512-VYf2sYSGwQtEllpP2Otz3nFn6D/9W8fXXYfFyMSLwBW/oNhUq5okljON8008ecgTCU7sSaicof8/aTrI6hIsLg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@progress/kendo-theme-core": "11.0.2"
- }
- },
- "node_modules/@progress/pako-esm": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@progress/pako-esm/-/pako-esm-1.0.1.tgz",
- "integrity": "sha512-O4A3b1EuE9Xe1pC3Xz9Tcn1M/CYrL71f4y/5TXeytOVTkmkzBgYW97fYP2f+54H0e0erWRaqV/kUUB/a8Uxfbw==",
- "license": "SEE LICENSE IN LICENSE.md"
- },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.40.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz",
@@ -3981,14 +3299,14 @@
]
},
"node_modules/@schematics/angular": {
- "version": "20.0.2",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.2.tgz",
- "integrity": "sha512-TyF+/hV+8flAa/Vu8xOQF241Syg9rdbZD1dARdm6edbLo8nwxmHdRsIulRektb7oD5CpTnxpvrcNJjX77nhv6A==",
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.3.tgz",
+ "integrity": "sha512-oWj5UU1gR12KDxQwOUpxweaaF8PPF7t5ymTa/px/nl4YYWd9s5e1skoDNcGHHl0MPHklJzNLxP7O89BORie5vQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "20.0.2",
- "@angular-devkit/schematics": "20.0.2",
+ "@angular-devkit/core": "20.0.3",
+ "@angular-devkit/schematics": "20.0.3",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4134,47 +3452,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
- "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -4260,9 +3537,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "20.19.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz",
- "integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==",
+ "version": "20.19.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz",
+ "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4283,12 +3560,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/semver": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
- "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
- "license": "MIT"
- },
"node_modules/@types/send": {
"version": "0.17.5",
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
@@ -4420,6 +3691,7 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -4432,6 +3704,7 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -4471,6 +3744,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/base64id": {
@@ -4543,6 +3817,25 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/bootstrap": {
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz",
+ "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.8"
+ }
+ },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -4571,6 +3864,7 @@
"version": "4.25.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
"integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -4599,12 +3893,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "license": "BSD-3-Clause"
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -4783,9 +4071,10 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001723",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
- "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
+ "version": "1.0.30001724",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz",
+ "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5012,6 +4301,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -5024,6 +4314,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/colorette": {
@@ -5189,6 +4480,7 @@
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -5203,6 +4495,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@@ -5406,17 +4699,9 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -5424,15 +4709,17 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.167",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz",
- "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==",
+ "version": "1.5.171",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz",
+ "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/emoji-regex": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/encodeurl": {
@@ -5685,6 +4972,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -5824,6 +5112,7 @@
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
"integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
@@ -5896,6 +5185,7 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.6",
@@ -5989,6 +5279,7 @@
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -5998,6 +5289,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
@@ -6007,6 +5299,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
"integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -6098,6 +5391,7 @@
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -6569,6 +5863,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
"license": "ISC"
},
"node_modules/istanbul-lib-coverage": {
@@ -6656,6 +5951,7 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
@@ -6678,6 +5974,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/jsbn": {
@@ -6691,6 +5988,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
@@ -6720,6 +6018,7 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
@@ -6755,49 +6054,6 @@
],
"license": "MIT"
},
- "node_modules/jsonwebtoken": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
- "license": "MIT",
- "dependencies": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">=12",
- "npm": ">=6"
- }
- },
- "node_modules/jwa": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
- "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
- "license": "MIT",
- "dependencies": {
- "buffer-equal-constant-time": "^1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
- "license": "MIT",
- "dependencies": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
- }
- },
"node_modules/karma": {
"version": "6.4.4",
"resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
@@ -7340,48 +6596,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
- "license": "MIT"
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
- "license": "MIT"
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
- "license": "MIT"
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "license": "MIT"
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "license": "MIT"
- },
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "license": "MIT"
- },
"node_modules/log-symbols": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
@@ -7520,6 +6734,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
@@ -7707,6 +6922,7 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -7956,6 +7172,21 @@
"node": ">= 0.6"
}
},
+ "node_modules/ngx-scrollbar": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-scrollbar/-/ngx-scrollbar-18.0.0.tgz",
+ "integrity": "sha512-+ykmY491x+nzXvnecJvZHvDz0YWuX1r7SYMxNG4RVHXm5Z68P/8kd/3ryLD6DXdNWmJawd4NGvqq2ZkUKb/g3A==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/cdk": ">=19.0.0",
+ "@angular/common": ">=19.0.0",
+ "@angular/core": ">=19.0.0",
+ "rxjs": ">=7.0.0"
+ }
+ },
"node_modules/node-addon-api": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
@@ -8089,6 +7320,7 @@
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/nopt": {
@@ -8322,12 +7554,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/orderedmap": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
- "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
- "license": "MIT"
- },
"node_modules/os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -8355,6 +7581,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/pacote": {
@@ -8477,6 +7704,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -8493,6 +7721,7 @@
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^10.2.0",
@@ -8509,6 +7738,7 @@
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/path-to-regexp": {
@@ -8524,12 +7754,14 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -8552,9 +7784,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.5",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
- "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==",
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dev": true,
"funding": [
{
@@ -8632,136 +7864,6 @@
"node": ">=10"
}
},
- "node_modules/prosemirror-commands": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz",
- "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.10.2"
- }
- },
- "node_modules/prosemirror-dropcursor": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz",
- "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.1.0",
- "prosemirror-view": "^1.1.0"
- }
- },
- "node_modules/prosemirror-gapcursor": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz",
- "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-keymap": "^1.0.0",
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-view": "^1.0.0"
- }
- },
- "node_modules/prosemirror-history": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz",
- "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.2.2",
- "prosemirror-transform": "^1.0.0",
- "prosemirror-view": "^1.31.0",
- "rope-sequence": "^1.3.0"
- }
- },
- "node_modules/prosemirror-inputrules": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz",
- "integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.0.0"
- }
- },
- "node_modules/prosemirror-keymap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
- "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "w3c-keyname": "^2.2.0"
- }
- },
- "node_modules/prosemirror-model": {
- "version": "1.25.1",
- "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz",
- "integrity": "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==",
- "license": "MIT",
- "dependencies": {
- "orderedmap": "^2.0.0"
- }
- },
- "node_modules/prosemirror-schema-list": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
- "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.7.3"
- }
- },
- "node_modules/prosemirror-state": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz",
- "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-transform": "^1.0.0",
- "prosemirror-view": "^1.27.0"
- }
- },
- "node_modules/prosemirror-tables": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz",
- "integrity": "sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-keymap": "^1.2.2",
- "prosemirror-model": "^1.25.0",
- "prosemirror-state": "^1.4.3",
- "prosemirror-transform": "^1.10.3",
- "prosemirror-view": "^1.39.1"
- }
- },
- "node_modules/prosemirror-transform": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz",
- "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.21.0"
- }
- },
- "node_modules/prosemirror-view": {
- "version": "1.39.3",
- "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.3.tgz",
- "integrity": "sha512-bY/7kg0LzRE7ytR0zRdSMWX3sknEjw68l836ffLPMh0OG3OYnNuBDUSF3v0vjvnzgYjgY9ZH/RypbARURlcMFA==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.20.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.1.0"
- }
- },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -8991,12 +8093,6 @@
"fsevents": "~2.3.2"
}
},
- "node_modules/rope-sequence": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
- "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
- "license": "MIT"
- },
"node_modules/router": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -9091,6 +8187,7 @@
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -9146,6 +8243,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -9158,6 +8256,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -9239,6 +8338,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=14"
@@ -9606,6 +8706,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
@@ -9624,6 +8725,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -9638,6 +8740,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -9647,12 +8750,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -9662,6 +8767,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -9674,6 +8780,7 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
@@ -9690,6 +8797,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -9702,6 +8810,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -9838,6 +8947,7 @@
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
"integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.4.4",
@@ -10030,6 +9140,7 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -10181,12 +9292,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/w3c-keyname": {
- "version": "2.2.8",
- "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
- "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
- "license": "MIT"
- },
"node_modules/watchpack": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
@@ -10242,6 +9347,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -10259,6 +9365,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10268,6 +9375,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -10283,12 +9391,14 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10298,6 +9408,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -10312,6 +9423,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -10432,6 +9544,7 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
@@ -10441,6 +9554,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
"license": "ISC"
},
"node_modules/yargs": {
diff --git a/jambotron-ui/package.json b/jambotron-ui/package.json
index 5bda2a2..27242fb 100644
--- a/jambotron-ui/package.json
+++ b/jambotron-ui/package.json
@@ -11,43 +11,24 @@
},
"private": true,
"dependencies": {
- "@angular/animations": "^20.0.3",
+ "@angular/animations": "^20.0.4",
"@angular/cdk": "^20.0.3",
"@angular/common": "^20.0.0",
"@angular/compiler": "^20.0.0",
"@angular/core": "^20.0.0",
"@angular/forms": "^20.0.0",
- "@angular/localize": "^20.0.0",
"@angular/material": "^20.0.3",
"@angular/platform-browser": "^20.0.0",
- "@angular/platform-browser-dynamic": "^20.0.3",
"@angular/platform-server": "^20.0.0",
"@angular/router": "^20.0.0",
"@angular/ssr": "^20.0.2",
+ "@ant-design/icons-angular": "19.0.0",
+ "@ng-bootstrap/ng-bootstrap": "19.0.0",
+ "@popperjs/core": "2.11.8",
"@primeng/themes": "^19.1.3",
- "@progress/kendo-angular-buttons": "19.1.1",
- "@progress/kendo-angular-common": "19.1.1",
- "@progress/kendo-angular-dialog": "19.1.1",
- "@progress/kendo-angular-dropdowns": "19.1.1",
- "@progress/kendo-angular-editor": "^19.1.1",
- "@progress/kendo-angular-icons": "19.1.1",
- "@progress/kendo-angular-indicators": "^19.1.1",
- "@progress/kendo-angular-inputs": "19.1.1",
- "@progress/kendo-angular-intl": "19.1.1",
- "@progress/kendo-angular-l10n": "19.1.1",
- "@progress/kendo-angular-label": "19.1.1",
- "@progress/kendo-angular-layout": "19.1.1",
- "@progress/kendo-angular-navigation": "19.1.1",
- "@progress/kendo-angular-popup": "19.1.1",
- "@progress/kendo-angular-progressbar": "19.1.1",
- "@progress/kendo-angular-toolbar": "19.1.1",
- "@progress/kendo-angular-treeview": "19.1.1",
- "@progress/kendo-angular-utils": "^19.1.1",
- "@progress/kendo-drawing": "^1.21.0",
- "@progress/kendo-licensing": "^1.5.0",
- "@progress/kendo-svg-icons": "^4.0.0",
- "@progress/kendo-theme-default": "11.0.2",
+ "bootstrap": "5.3.6",
"express": "^5.1.0",
+ "ngx-scrollbar": "18.0.0",
"primeng": "^19.1.3",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html
new file mode 100644
index 0000000..4c5a4ff
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.html
@@ -0,0 +1,38 @@
+
admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+admin-welcome.component works!
+
+
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.scss b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts
new file mode 100644
index 0000000..664e04c
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AdminWelcomeComponent } from './admin-welcome.component';
+
+describe('AdminWelcomeComponent', () => {
+ let component: AdminWelcomeComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AdminWelcomeComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(AdminWelcomeComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts
new file mode 100644
index 0000000..ba7feb2
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin-welcome.component/admin-welcome.component.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-admin-welcome.component',
+ imports: [],
+ templateUrl: './admin-welcome.component.html',
+ styleUrl: './admin-welcome.component.scss'
+})
+export class AdminWelcomeComponent {
+
+}
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html
new file mode 100644
index 0000000..3876019
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss
new file mode 100644
index 0000000..3cde704
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss
@@ -0,0 +1,22 @@
+.example-container {
+ width: 500px;
+ height: 300px;
+ border: 1px solid rgba(0, 0, 0, 0.5);
+}
+
+.example-sidenav-content {
+ display: flex;
+ height: 100%;
+ align-items: center;
+ justify-content: center;
+}
+
+.example-sidenav {
+ padding: 20px;
+}
+
+.pc-sidebar{
+ top: 120px;
+}
+
+
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts
new file mode 100644
index 0000000..617b55b
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AdminComponent } from './admin.component';
+
+describe('AdminComponent', () => {
+ let component: AdminComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AdminComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(AdminComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts
new file mode 100644
index 0000000..c7496dc
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts
@@ -0,0 +1,112 @@
+import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core';
+import {BreadcrumbComponent} from "../../components/breadcrumb/breadcrumb.component";
+import {NavBarComponent} from "../../layouts/admin-layout/nav-bar/nav-bar.component";
+import {NavigationComponent} from "../../layouts/admin-layout/navigation/navigation.component";
+import {Router, RouterLink, RouterOutlet} from "@angular/router";
+import {DOCUMENT, NgClass, NgStyle} from '@angular/common';
+import {MatDrawerContainer, MatSidenavModule} from '@angular/material/sidenav';
+import {MatButton} from '@angular/material/button';
+import { ScrollPanelModule } from 'primeng/scrollpanel';
+import {MenuItem} from 'primeng/api';
+import {PanelMenu} from 'primeng/panelmenu';
+@Component({
+ selector: 'app-admin.component',
+ imports: [
+ BreadcrumbComponent,
+ NavBarComponent,
+ NavigationComponent,
+ RouterOutlet,
+ NgClass,
+ MatDrawerContainer,
+ MatSidenavModule,
+ ScrollPanelModule,
+ MatButton,
+ RouterLink,
+ PanelMenu,
+ NgStyle,
+
+ ],
+ schemas:[CUSTOM_ELEMENTS_SCHEMA],
+ templateUrl: './admin.component.html',
+ styleUrl: './admin.component.scss'
+})
+export class AdminComponent implements OnInit {
+ private document = inject(DOCUMENT);
+ height = 0;
+
+ items: MenuItem[] | undefined;
+
+
+ constructor(private router: Router) {
+ this.height = 0
+
+
+ }
+
+ // public props
+ navCollapsed: boolean = false;
+ navCollapsedMob: boolean = false;
+
+ // public method
+ navMobClick() {
+ if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ setTimeout(() => {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ }, 100);
+ } else {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ }
+ if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) {
+ document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed');
+ }
+ }
+
+ handleKeyDown(event: KeyboardEvent): void {
+ if (event.key === 'Escape') {
+ this.closeMenu();
+ }
+ }
+
+ closeMenu() {
+ if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
+ document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open');
+ }
+ }
+
+ ngOnInit() {
+
+ if(this.document.defaultView !== null || this.document.defaultView !== undefined) {
+ // @ts-ignore
+ this.height = this.document.defaultView.innerHeight;
+ }
+ else
+ this.height = 0;
+
+ this.items = [
+ {
+ label: 'Admin',
+ icon: 'pi pi-palette',
+ command: () => {
+ this.router.navigate(['/main/admin/welcome']);
+ },
+ items: [
+ {
+ label: 'Settings',
+ icon: 'pi pi-eraser',
+ // route: '/main/admin/settings'
+ command: () => {
+ this.router.navigate(['/main/admin/settings']);
+ }
+ },
+ {
+ label: 'System',
+ icon: 'pi pi-heart',
+ route: '/main/admin/system'
+ }
+ ]
+ }
+ ];
+ }
+
+}
diff --git a/jambotron-ui/src/app/admin-module/admin.module.ts b/jambotron-ui/src/app/admin-module/admin.module.ts
new file mode 100644
index 0000000..105676b
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.module.ts
@@ -0,0 +1,16 @@
+import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core';
+import {mainRouting} from '../main-module/main.routing';
+import {MainComponent} from '../main-module/main.component/main.component';
+import {RouterModule} from '@angular/router';
+import {AdminComponent} from './admin.component/admin.component';
+import {adminRouting} from './admin.routing';
+import { ScrollPanelModule } from 'primeng/scrollpanel';
+@NgModule({
+ declarations: [
+
+ ],
+ imports: [adminRouting, AdminComponent,ScrollPanelModule],
+ exports: [RouterModule],
+ schemas:[CUSTOM_ELEMENTS_SCHEMA]
+})
+export class AdminModule {}
diff --git a/jambotron-ui/src/app/admin-module/admin.routing.ts b/jambotron-ui/src/app/admin-module/admin.routing.ts
new file mode 100644
index 0000000..246ca73
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/admin.routing.ts
@@ -0,0 +1,27 @@
+import {RouterModule, Routes} from '@angular/router';
+import {AdminComponent} from './admin.component/admin.component';
+
+const ADMIN_ROUTES: Routes = [
+ {
+ path: '',
+ component: AdminComponent,
+
+ children: [
+ {
+ path: 'welcome',
+ loadComponent: () => import('../admin-module/admin-welcome.component/admin-welcome.component').then((c) => c.AdminWelcomeComponent),
+ },
+ {
+ path: 'settings',
+ loadComponent: () => import('../admin-module/settings.component/settings.component').then((c) => c.SettingsComponent)
+ },
+ {
+ path: 'system',
+
+ loadComponent: () => import('../admin-module/system.component/system.component').then((c) => c.SystemComponent)
+ }
+ ]
+ }
+];
+
+export const adminRouting = RouterModule.forChild(ADMIN_ROUTES);
diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.html b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html
new file mode 100644
index 0000000..59229f5
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.html
@@ -0,0 +1 @@
+settings.component works!
diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.scss b/jambotron-ui/src/app/admin-module/settings.component/settings.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts b/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts
new file mode 100644
index 0000000..82c748a
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SettingsComponent } from './settings.component';
+
+describe('SettingsComponent', () => {
+ let component: SettingsComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SettingsComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(SettingsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts
new file mode 100644
index 0000000..b7ce784
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/settings.component/settings.component.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-settings.component',
+ imports: [],
+ templateUrl: './settings.component.html',
+ styleUrl: './settings.component.scss'
+})
+export class SettingsComponent {
+
+}
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.html b/jambotron-ui/src/app/admin-module/system.component/system.component.html
new file mode 100644
index 0000000..ca07ac5
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/system.component/system.component.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+ Content 1
+
+ @for (column of displayedColumns; track column) {
+
+ | {{column}} |
+ {{element[column]}} |
+
+ }
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
+
+ Name: {{element.name}}
+ Type: {{element.type}}
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+ Content 2
+
+ @for (column of displayedColumns; track column) {
+
+ | {{column}} |
+ {{element[column]}} |
+
+ }
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
+
+ Name: {{element.name}}
+ Type: {{element.type}}
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.scss b/jambotron-ui/src/app/admin-module/system.component/system.component.scss
new file mode 100644
index 0000000..9fd7d7d
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/system.component/system.component.scss
@@ -0,0 +1,113 @@
+mat-card{
+ //margin: 20px;
+ background-color: rgba(240, 248, 255, 0.7);
+ backdrop-filter: blur(8px);
+}
+
+mat-card-title{
+ color: cyan;
+}
+
+mat-card-subtitle{
+ color: #009dff;
+}
+
+mat-tab{
+ color:black;
+}
+
+
+table {
+ width: 100%;
+ margin-top: 20px;
+ color:lightgrey;
+}
+
+
+mat-list{
+ //background-color: #1389d3;
+ color:black;
+ width: 100%;
+}
+
+mat-list-item{
+ margin: 10px 10px 10px 10px;
+ background-color: #447694;
+
+ color: #009dff;
+}
+
+tr.example-detail-row {
+ height: 0;
+ background: #fffdfd;
+}
+
+tr.example-element-row {
+ cursor: pointer;
+ color: #1389d3;
+ background: #fffdfd;
+}
+
+tr.example-element-row:not(.example-expanded-row):hover {
+ background: whitesmoke;
+}
+
+tr.example-element-row:not(.example-expanded-row):active {
+ background: #efefef;
+}
+
+.example-element-row td {
+ border-bottom-width: 0;
+}
+
+.example-element-detail-wrapper {
+ overflow: hidden;
+ display: grid;
+ grid-template-rows: 0fr;
+ grid-template-columns: 100%;
+ transition: grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.example-element-detail-wrapper-expanded {
+ grid-template-rows: 1fr;
+
+}
+
+.example-element-detail {
+ display: flex;
+ min-height: 0;
+}
+
+.example-element-diagram {
+ min-width: 80px;
+ border: 2px solid black;
+ padding: 8px;
+ font-weight: lighter;
+ margin: 8px 0;
+ height: 104px;
+}
+
+.example-element-symbol {
+ font-weight: bold;
+ font-size: 40px;
+ line-height: normal;
+}
+
+.example-element-description {
+ padding: 16px;
+}
+
+.example-element-description-attribution {
+ opacity: 0.5;
+}
+
+.example-toggle-button {
+ transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.example-toggle-button-expanded {
+ transform: rotate(180deg);
+}
+
+
+
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts b/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts
new file mode 100644
index 0000000..bae84c7
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/system.component/system.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemComponent } from './system.component';
+
+describe('SystemComponent', () => {
+ let component: SystemComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SystemComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(SystemComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/admin-module/system.component/system.component.ts b/jambotron-ui/src/app/admin-module/system.component/system.component.ts
new file mode 100644
index 0000000..115c92d
--- /dev/null
+++ b/jambotron-ui/src/app/admin-module/system.component/system.component.ts
@@ -0,0 +1,138 @@
+import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card';
+import {MatDivider} from '@angular/material/divider';
+import {MatTab, MatTabGroup} from '@angular/material/tabs';
+import {
+ MatCell,
+ MatCellDef,
+ MatColumnDef,
+ MatHeaderCell, MatHeaderCellDef,
+ MatHeaderRow, MatHeaderRowDef,
+ MatRow,
+ MatRowDef,
+ MatTable
+} from '@angular/material/table';
+import {MatList, MatListItem} from '@angular/material/list';
+import {MatIconButton} from '@angular/material/button';
+import {SystemService} from '../../services/system.service';
+import {Bean} from '../../models/Bean';
+import {MatIcon} from '@angular/material/icon';
+
+@Component({
+ selector: 'app-system.component',
+ imports: [
+ MatCard,
+ MatCardHeader,
+ MatCardContent,
+ MatDivider,
+ MatTabGroup,
+ MatTab,
+ MatTable,
+ MatColumnDef,
+ MatIcon,
+ MatCell,
+ MatCellDef,
+ MatList,
+ MatListItem,
+ MatRow,
+ MatHeaderRow,
+ MatRowDef,
+ MatHeaderCell,
+ MatHeaderCellDef,
+ MatIconButton,
+ MatIcon,
+ MatHeaderRowDef
+ ],
+ templateUrl: './system.component.html',
+ styleUrl: './system.component.scss',
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+})
+export class SystemComponent {
+ customBeans:Bean[] = [] ;
+ allBeans:Bean[] = [] ;
+ displayedColumns: string[] = ['shortName', 'typeShortName', 'scope'];
+
+ columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
+
+ expandedElement: Bean | null = null;
+
+ resultsLength = 0;
+ isLoadingResults = true;
+ isRateLimitReached = false;
+
+constructor(private systemService: SystemService) { }
+
+ngOnInit(): void {
+ this.retrieveBeans();
+}
+
+retrieveBeans(): void {
+ this.systemService.getCustomBeans()
+ .subscribe(
+ (data: Bean[]) => {
+ this.customBeans = data;
+ console.log(data);
+ },
+ (error: any) => {
+ console.log(error);
+ });
+ this.systemService.getAllBeans()
+ .subscribe(
+ (data: Bean[]) => {
+ this.allBeans = data;
+ console.log(data);
+ },
+ (error: any) => {
+ console.log(error);
+ });
+}
+
+/** Checks whether an element is expanded. */
+isExpanded(element: Bean) {
+ return this.expandedElement === element;
+}
+
+/** Toggles the expanded state of an element. */
+toggle(element: Bean) {
+ this.expandedElement = this.isExpanded(element) ? null : element;
+}
+
+
+
+//ngAfterViewInit() {
+ //this.exampleDatabase = new ExampleHttpDatabase(this._httpClient);
+
+ // If the user changes the sort order, reset back to the first page.
+ /* this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));
+
+ merge(this.sort.sortChange, this.paginator.page)
+ .pipe(
+ startWith({}),
+ switchMap(() => {
+ this.isLoadingResults = true;
+ return this.exampleDatabase!.getRepoIssues(
+ this.sort.active,
+ this.sort.direction,
+ this.paginator.pageIndex,
+ ).pipe(catchError(() => observableOf(null)));
+ }),
+ map(data => {
+ // Flip flag to show that loading has finished.
+ this.isLoadingResults = false;
+ this.isRateLimitReached = data === null;
+
+ if (data === null) {
+ return [];
+ }
+
+ // Only refresh the result length if there is new data. In case of rate
+ // limit errors, we do not want to reset the paginator to zero, as that
+ // would prevent users from re-triggering requests.
+ this.resultsLength = data.total_count;
+ return data.items;
+ }),
+ )
+ .subscribe(data => (this.data = data));*/
+}
+
+
diff --git a/jambotron-ui/src/app/app-routing.module.ts b/jambotron-ui/src/app/app-routing.module.ts
deleted file mode 100644
index 1d741dc..0000000
--- a/jambotron-ui/src/app/app-routing.module.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { TutorialsListComponent } from './components/tutorials-list/tutorials-list.component';
-import { TutorialDetailsComponent } from './components/tutorial-details/tutorial-details.component';
-import { AddTutorialComponent } from './components/add-tutorial/add-tutorial.component';
-import { BoardAdminComponent } from './components/board-admin/board-admin.component';
-import { BoardModeratorComponent } from './components/board-moderator/board-moderator.component';
-import { BoardUserComponent } from './components/board-user/board-user.component';
-import { ProfileComponent } from './components/profile/profile.component';
-import { RegisterComponent } from './components/register/register.component';
-import { LoginComponent } from './components/login/login.component';
-import { HomeComponent } from './components/home/home.component';
-import {SystemComponent} from './components/system.component/system.component';
-
-
-const routes: Routes = [
- { path: 'home', component: HomeComponent },
- { path: 'login', component: LoginComponent },
- { path: 'register', component: RegisterComponent },
- { path: 'profile', component: ProfileComponent },
- { path: 'user', component: BoardUserComponent },
- { path: 'mod', component: BoardModeratorComponent },
- { path: 'admin', component: BoardAdminComponent },
- { path: '', redirectTo: 'home', pathMatch: 'full' },
- { path: 'tutorials', component: TutorialsListComponent },
- { path: 'tutorials/:id', component: TutorialDetailsComponent },
- { path: 'add', component: AddTutorialComponent },
- { path: 'system', component: SystemComponent}
-];
-
-@NgModule({
- imports: [RouterModule.forRoot(routes, {useHash: true})],
- exports: [RouterModule]
-})
-export class AppRoutingModule { }
diff --git a/jambotron-ui/src/app/app.component.ts b/jambotron-ui/src/app/app.component.ts
index 819c3b1..b51a698 100644
--- a/jambotron-ui/src/app/app.component.ts
+++ b/jambotron-ui/src/app/app.component.ts
@@ -1,16 +1,27 @@
-import {Component, inject, OnInit} from '@angular/core';
+import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core';
import { TokenStorageService } from './services/token-storage.service';
import {MatDialog} from "@angular/material/dialog";
import {DialogComponent} from "./components/dialog/dialog.component";
import {AuthService} from "./services/auth.service";
import {Subscription} from "rxjs";
import {EventBusService} from "./_shared/event-bus.service";
+import {RouterLink, RouterOutlet} from '@angular/router';
+import {MatButton} from '@angular/material/button';
+import {MatToolbar} from '@angular/material/toolbar';
+import {MatIcon} from '@angular/material/icon';
@Component({
- selector: 'app-root',
- templateUrl: './app.component.html',
- styleUrls: ['./app.component.scss'],
- standalone: false
+ selector: 'app-root',
+ templateUrl: './app.component.html',
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ imports: [
+ RouterOutlet,
+ MatIcon,
+ MatButton,
+ RouterLink,
+ MatToolbar
+ ],
+ styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
readonly dialog = inject(MatDialog);
diff --git a/jambotron-ui/src/app/app.config.server.ts b/jambotron-ui/src/app/app.config.server.ts
new file mode 100644
index 0000000..41031f1
--- /dev/null
+++ b/jambotron-ui/src/app/app.config.server.ts
@@ -0,0 +1,12 @@
+import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
+import { provideServerRendering, withRoutes } from '@angular/ssr';
+import { appConfig } from './app.config';
+import { serverRoutes } from './app.routes.server';
+
+const serverConfig: ApplicationConfig = {
+ providers: [
+ provideServerRendering(withRoutes(serverRoutes))
+ ]
+};
+
+export const config = mergeApplicationConfig(appConfig, serverConfig);
diff --git a/jambotron-ui/src/app/app.config.ts b/jambotron-ui/src/app/app.config.ts
new file mode 100644
index 0000000..c1108fe
--- /dev/null
+++ b/jambotron-ui/src/app/app.config.ts
@@ -0,0 +1,28 @@
+import {
+ ApplicationConfig,
+ importProvidersFrom,
+ provideBrowserGlobalErrorListeners,
+ provideZoneChangeDetection
+} from '@angular/core';
+import { provideRouter } from '@angular/router';
+
+import { routes } from './app.routes';
+import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
+import {AppModule} from './app.module';
+import {providePrimeNG} from 'primeng/config';
+import Aura from '@primeng/themes/aura';
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideBrowserGlobalErrorListeners(),
+ provideZoneChangeDetection({ eventCoalescing: true }),
+ provideRouter(routes), provideClientHydration(withEventReplay()),
+
+ importProvidersFrom(AppModule),
+ providePrimeNG({
+ theme: {
+ preset: Aura
+ }
+ })
+ ]
+};
diff --git a/jambotron-ui/src/app/app.html b/jambotron-ui/src/app/app.html
new file mode 100644
index 0000000..0680b43
--- /dev/null
+++ b/jambotron-ui/src/app/app.html
@@ -0,0 +1 @@
+
diff --git a/jambotron-ui/src/app/app.module.ts b/jambotron-ui/src/app/app.module.ts
index ba368f3..421f0dd 100644
--- a/jambotron-ui/src/app/app.module.ts
+++ b/jambotron-ui/src/app/app.module.ts
@@ -1,118 +1,40 @@
-import { NgModule } from '@angular/core';
-import { BrowserModule } from '@angular/platform-browser';
-
-import { AppRoutingModule } from './app-routing.module';
-import {FormsModule, ReactiveFormsModule} from '@angular/forms';
-
-
-import { AppComponent } from './app.component';
-import { TutorialsListComponent } from './components/tutorials-list/tutorials-list.component';
-import { TutorialDetailsComponent } from './components/tutorial-details/tutorial-details.component';
-import { AddTutorialComponent } from './components/add-tutorial/add-tutorial.component';
-import { LoginComponent } from './components/login/login.component';
-import { RegisterComponent } from './components/register/register.component';
-import { HomeComponent } from './components/home/home.component';
-import { ProfileComponent } from './components/profile/profile.component';
-import { BoardAdminComponent } from './components/board-admin/board-admin.component';
-import { BoardModeratorComponent } from './components/board-moderator/board-moderator.component';
-import { BoardUserComponent } from './components/board-user/board-user.component';
-
-import { authInterceptorProviders } from './helpers/auth.interceptor';
-import {provideHttpClient, withInterceptorsFromDi} from "@angular/common/http";
-import {provideAnimationsAsync} from "@angular/platform-browser/animations/async";
-import {MatToolbar} from "@angular/material/toolbar";
-import {MatAnchor, MatButton} from "@angular/material/button";
-import {MatIcon} from "@angular/material/icon";
-import {MatChipGrid, MatChipInput, MatChipListbox, MatChipOption, MatChipRow} from "@angular/material/chips";
-import {MatAutocomplete, MatAutocompleteTrigger, MatOption} from "@angular/material/autocomplete";
-import {MatFormField} from "@angular/material/form-field";
-import {MatLabel} from '@angular/material/form-field';
-
-
-import {
- MatCard, MatCardActions,
- MatCardContent,
- MatCardHeader,
- MatCardImage,
- MatCardSubtitle,
- MatCardTitle
-} from '@angular/material/card';
-import {MatInput} from '@angular/material/input';
-import {EditorComponent} from '@progress/kendo-angular-editor';
-import {ArticleComments} from './components/article-comments/article-comments';
-import {MatProgressSpinner} from '@angular/material/progress-spinner';
-import {providePrimeNG} from 'primeng/config';
-import Aura from '@primeng/themes/aura';
-import {Button} from 'primeng/button';
-import {ScrollPanelModule} from 'primeng/scrollpanel';
-import {Splitter} from 'primeng/splitter';
-
+import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core';
+import { BrowserModule }
+ from '@angular/platform-browser';
+import { BrowserAnimationsModule }
+ from '@angular/platform-browser/animations';
+import { MatIconModule } from '@angular/material/icon';
+import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
+import {MainComponent} from './main-module/main.component/main.component';
+import {authInterceptorProviders} from './helpers/auth.interceptor';
+import {AdminComponent} from './admin-module/admin.component/admin.component';
+import {AdminWelcomeComponent} from './admin-module/admin-welcome.component/admin-welcome.component';
+import {SettingsComponent} from './admin-module/settings.component/settings.component';
+import {SystemComponent} from './admin-module/system.component/system.component';
+import {appRouting} from './app.routes';
+import {App} from './app';
@NgModule({
declarations: [
- AppComponent,
- TutorialsListComponent,
- TutorialDetailsComponent,
- AddTutorialComponent,
-
- RegisterComponent,
- HomeComponent,
- ProfileComponent,
- BoardAdminComponent,
- BoardModeratorComponent,
- BoardUserComponent
],
- bootstrap: [AppComponent],
imports: [
+ appRouting,
+ MainComponent,
BrowserModule,
- AppRoutingModule,
- FormsModule,
- LoginComponent,
- MatToolbar,
- MatButton,
- MatIcon,
- MatAnchor,
- MatChipGrid,
- MatChipRow,
- MatChipInput,
- MatAutocompleteTrigger,
- MatAutocomplete,
- MatOption,
- MatFormField,
- MatChipListbox,
- MatChipOption,
- ReactiveFormsModule,
- MatCardContent,
- MatCardSubtitle,
- MatCardTitle,
- MatCard,
- MatCardHeader,
- MatCardImage,
- MatCardActions,
- MatInput,
- MatLabel,
- EditorComponent,
- ArticleComments,
- MatProgressSpinner,
- Button,
- ScrollPanelModule,
- Splitter
-
+ MatIconModule,
+ BrowserAnimationsModule,
+ AdminComponent,
+ AdminWelcomeComponent,
+ SettingsComponent,
+ SystemComponent
],
providers: [
- authInterceptorProviders,
- provideHttpClient(withInterceptorsFromDi()),
- provideAnimationsAsync(),
- providePrimeNG({
- theme: {
- preset: Aura,
- options: {darkModeSelector: '.p-dark'}
- }
- })
- ] })
-
+ authInterceptorProviders,provideHttpClient(withInterceptorsFromDi())],
+ bootstrap: [],
+ schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+})
export class AppModule { }
diff --git a/jambotron-ui/src/app/app.routes.server.ts b/jambotron-ui/src/app/app.routes.server.ts
new file mode 100644
index 0000000..ffd37b1
--- /dev/null
+++ b/jambotron-ui/src/app/app.routes.server.ts
@@ -0,0 +1,8 @@
+import { RenderMode, ServerRoute } from '@angular/ssr';
+
+export const serverRoutes: ServerRoute[] = [
+ {
+ path: '**',
+ renderMode: RenderMode.Prerender
+ }
+];
diff --git a/jambotron-ui/src/app/app.routes.ts b/jambotron-ui/src/app/app.routes.ts
new file mode 100644
index 0000000..e97767a
--- /dev/null
+++ b/jambotron-ui/src/app/app.routes.ts
@@ -0,0 +1,20 @@
+import {RouterModule, Routes} from '@angular/router';
+import {AdminComponent} from './layouts/admin-layout/admin-layout.component';
+import {MainComponent} from './main-module/main.component/main.component';
+import {NgModule} from '@angular/core';
+
+export const routes: Routes = [
+ {
+ path: '',
+ redirectTo: 'main/home',
+ pathMatch: 'full'
+ },
+ {
+ path: 'main',
+ loadChildren: () =>
+ import('./main-module/main.module').then((m) => m.MainModule),
+ }
+
+];
+export const appRouting = RouterModule.forRoot(routes);
+
diff --git a/jambotron-ui/src/app/app.scss b/jambotron-ui/src/app/app.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/app.spec.ts b/jambotron-ui/src/app/app.spec.ts
new file mode 100644
index 0000000..4438df1
--- /dev/null
+++ b/jambotron-ui/src/app/app.spec.ts
@@ -0,0 +1,23 @@
+import { TestBed } from '@angular/core/testing';
+import { App } from './app';
+
+describe('App', () => {
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [App],
+ }).compileComponents();
+ });
+
+ it('should create the app', () => {
+ const fixture = TestBed.createComponent(App);
+ const app = fixture.componentInstance;
+ expect(app).toBeTruthy();
+ });
+
+ it('should render title', () => {
+ const fixture = TestBed.createComponent(App);
+ fixture.detectChanges();
+ const compiled = fixture.nativeElement as HTMLElement;
+ expect(compiled.querySelector('h1')?.textContent).toContain('Hello, jambotron-ui');
+ });
+});
diff --git a/jambotron-ui/src/app/app.ts b/jambotron-ui/src/app/app.ts
new file mode 100644
index 0000000..649c4a1
--- /dev/null
+++ b/jambotron-ui/src/app/app.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core';
+import { RouterOutlet } from '@angular/router';
+
+@Component({
+ selector: 'app-root',
+ templateUrl: './app.html',
+ imports: [
+ RouterOutlet
+ ],
+ styleUrl: './app.scss'
+})
+export class App {
+ protected title = 'jambotron-ui';
+
+ constructor() { }
+}
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
index 492f71e..1080dfd 100644
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
+++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html
@@ -44,7 +44,8 @@
-
+
+
diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
index 17fa583..31f2132 100644
--- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
+++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts
@@ -1,12 +1,32 @@
-import { Component, OnInit } from '@angular/core';
+import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit} from '@angular/core';
import {Tutorial} from '../../models/tutorial.model';
import {TutorialService} from '../../services/tutorial.service';
+import {MatCard, MatCardActions, MatCardContent, MatCardHeader} from '@angular/material/card';
+import {FormsModule} from '@angular/forms';
+import {MatButton} from '@angular/material/button';
+import {MatFormField, MatInput, MatLabel} from '@angular/material/input';
+import {NgIf} from '@angular/common';
@Component({
selector: 'app-add-tutorial',
templateUrl: './add-tutorial.component.html',
styleUrls: ['./add-tutorial.component.scss'],
- standalone: false
+ imports: [
+ MatCardActions,
+ FormsModule,
+ MatCard,
+ MatCardHeader,
+ MatCardContent,
+ MatFormField,
+ MatLabel,
+
+ MatButton,
+ MatInput,
+ NgIf,
+ MatLabel,
+
+ ],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AddTutorialComponent implements OnInit {
diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts
index 92a9325..1fc3f98 100644
--- a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts
+++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts
@@ -1,25 +1,45 @@
-import {Component, computed, model, OnInit} from '@angular/core';
+import {Component, computed, CUSTOM_ELEMENTS_SCHEMA, model, OnInit} from '@angular/core';
import {User} from "../../models/user.model";
-import {MatChipInputEvent} from "@angular/material/chips";
-import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete";
+import {MatChipGrid, MatChipInput, MatChipInputEvent, MatChipRow} from "@angular/material/chips";
+import {
+ MatAutocomplete,
+ MatAutocompleteSelectedEvent,
+ MatAutocompleteTrigger,
+ MatOption
+} from "@angular/material/autocomplete";
import {COMMA, ENTER} from "@angular/cdk/keycodes";
-import {AsyncPipe} from "@angular/common";
-import {FormControl} from "@angular/forms";
+import {AsyncPipe, NgForOf} from "@angular/common";
+import {FormControl, ReactiveFormsModule} from "@angular/forms";
import {Observable, startWith} from "rxjs";
import {map} from "rxjs/operators";
import {UserService} from '../../services/user.service';
import {RolesService} from '../../services/roles.service';
import {Role} from '../../models/role';
+import {MatIcon} from '@angular/material/icon';
+import {MatFormField} from '@angular/material/form-field';
@Component({
- selector: 'app-board-admin',
- templateUrl: './board-admin.component.html',
- styleUrls: ['./board-admin.component.scss'],
- standalone: false,
+ selector: 'app-board-admin',
+ templateUrl: './board-admin.component.html',
+ styleUrls: ['./board-admin.component.scss'],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ imports: [
+ MatAutocomplete,
+ ReactiveFormsModule,
+ MatOption,
+ NgForOf,
+ MatFormField,
+ MatChipGrid,
+
+ MatChipRow,
+ MatIcon,
+ MatChipInput,
+ MatAutocompleteTrigger
+ ]
})
export class BoardAdminComponent implements OnInit {
private gridApi: any;
diff --git a/jambotron-ui/src/app/components/card/card.component.html b/jambotron-ui/src/app/components/card/card.component.html
new file mode 100644
index 0000000..2716fa8
--- /dev/null
+++ b/jambotron-ui/src/app/components/card/card.component.html
@@ -0,0 +1,16 @@
+
+ @if (showHeader()) {
+
+ }
+ @if (showContent()) {
+
+
+
+ }
+
diff --git a/jambotron-ui/src/app/components/card/card.component.scss b/jambotron-ui/src/app/components/card/card.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/components/card/card.component.ts b/jambotron-ui/src/app/components/card/card.component.ts
new file mode 100644
index 0000000..85f8cd3
--- /dev/null
+++ b/jambotron-ui/src/app/components/card/card.component.ts
@@ -0,0 +1,58 @@
+// Angular import
+import { Component, ContentChild, ElementRef, TemplateRef, input } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+@Component({
+ selector: 'app-card',
+ standalone: true,
+ imports: [CommonModule],
+ templateUrl: './card.component.html',
+ styleUrls: ['./card.component.scss']
+})
+export class CardComponent {
+ // public props
+ /**
+ * Title of card. It will be visible at left side of card header
+ */
+ cardTitle = input();
+
+ /**
+ * Class to be applied at card level
+ */
+ cardClass = input();
+
+ /**
+ * To hide content from card
+ */
+ showContent = input(true);
+
+ /**
+ * Class to be applied at card content.
+ */
+ blockClass = input();
+
+ /**
+ * Class to be applied on card header
+ */
+ headerClass = input();
+
+ /**
+ * To hide header from card
+ */
+ showHeader = input(true);
+
+ /**
+ * padding around card content. default in px
+ */
+ padding = input(20); // set default to 24 px
+
+ /**
+ * Template reference of header actions on custom header
+ */
+ @ContentChild('headerOptionsTemplate') headerOptionsTemplate!: TemplateRef;
+
+ /**
+ * Template reference of header actions besides title at left
+ */
+ @ContentChild('headerTitleTemplate') headerTitleTemplate!: TemplateRef;
+}
diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.ts b/jambotron-ui/src/app/components/dialog/dialog.component.ts
index ae8be84..c2c14e5 100644
--- a/jambotron-ui/src/app/components/dialog/dialog.component.ts
+++ b/jambotron-ui/src/app/components/dialog/dialog.component.ts
@@ -14,7 +14,8 @@ import {MatFormField, MatLabel, MatSuffix} from "@angular/material/form-field";
import {MatInput} from "@angular/material/input";
import {FormsModule} from "@angular/forms";
import {MatIcon} from "@angular/material/icon";
-import {DialogData} from "../../app.component";
+import {DialogData} from '../../main-module/main.component/main.component';
+
diff --git a/jambotron-ui/src/app/components/home.component/home.component.html b/jambotron-ui/src/app/components/home.component/home.component.html
new file mode 100644
index 0000000..c657553
--- /dev/null
+++ b/jambotron-ui/src/app/components/home.component/home.component.html
@@ -0,0 +1,51 @@
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
+home.component works!
diff --git a/jambotron-ui/src/app/components/home.component/home.component.scss b/jambotron-ui/src/app/components/home.component/home.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/components/home/home.component.spec.ts b/jambotron-ui/src/app/components/home.component/home.component.spec.ts
similarity index 89%
rename from jambotron-ui/src/app/components/home/home.component.spec.ts
rename to jambotron-ui/src/app/components/home.component/home.component.spec.ts
index 2c5a172..1191557 100644
--- a/jambotron-ui/src/app/components/home/home.component.spec.ts
+++ b/jambotron-ui/src/app/components/home.component/home.component.spec.ts
@@ -8,12 +8,10 @@ describe('HomeComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [ HomeComponent ]
+ imports: [HomeComponent]
})
.compileComponents();
- });
- beforeEach(() => {
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
diff --git a/jambotron-ui/src/app/components/home.component/home.component.ts b/jambotron-ui/src/app/components/home.component/home.component.ts
new file mode 100644
index 0000000..3565fc4
--- /dev/null
+++ b/jambotron-ui/src/app/components/home.component/home.component.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-home.component',
+ imports: [],
+ templateUrl: './home.component.html',
+ styleUrl: './home.component.scss'
+})
+export class HomeComponent {
+
+}
diff --git a/jambotron-ui/src/app/components/home/home.component.html b/jambotron-ui/src/app/components/home/home.component.html
deleted file mode 100644
index 5cbbd30..0000000
--- a/jambotron-ui/src/app/components/home/home.component.html
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
- Panel 1
-
-
- Panel 2
-
-
-
-
- Lorem ipsum dolor sit amet...
-
-
- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium...
-
-
- At vero eos et accusamus et iusto odio dignissimos...
- dfsd
- f
- sdf
-
- dsf
- sd
- f
- sd
- fs
- fs
- fsfs
- fs
- fs
- fs
- fs
- fs
-
-
-
-
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet...
-
-
- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium...
-
-
- At vero eos et accusamus et iusto odio dignissimos...
- dfsd
- f
- sdf
-
- dsf
- sd
- f
- sd
- fs
- fs
- fsfs
- fs
- fs
- fs
- fs
- fs
-
-
-
-
-
-
-
-
-
-
-
- Tutorials
-
-
-
-
-
-
-
-@defer (on hover; on interaction(showComments)) {
-
-} @placeholder ( ;minimum 1s) {
- Placeholder for comments
-} @loading (minimum 1s; after 500ms) {
- Loading comments...
-} @error {
- Failed to load comments
-}
-
-@for (tutorial of tutorials; track $index){
-
-
-
-
-}
diff --git a/jambotron-ui/src/app/components/home/home.component.scss b/jambotron-ui/src/app/components/home/home.component.scss
deleted file mode 100644
index 7bd62ae..0000000
--- a/jambotron-ui/src/app/components/home/home.component.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-mat-card{
- margin: 20px;
- background-color: rgba(0, 0, 0, 0.7);
-}
-mat-card-title{
- color: cyan;
-}
-.tutorial-card{
- color: white;
-}
diff --git a/jambotron-ui/src/app/components/home/home.component.ts b/jambotron-ui/src/app/components/home/home.component.ts
deleted file mode 100644
index 223eb3a..0000000
--- a/jambotron-ui/src/app/components/home/home.component.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import {Component, computed, OnInit} from '@angular/core';
-import {TutorialService} from '../../services/tutorial.service';
-
-import {Tutorial} from '../../models/tutorial.model';
-import {ArticleComments} from '../article-comments/article-comments';
-import {AddTutorialComponent} from '../add-tutorial/add-tutorial.component';
-import { ScrollPanelModule } from 'primeng/scrollpanel';
-
-@Component({
- selector: 'app-home',
- templateUrl: './home.component.html',
- styleUrls: ['./home.component.scss'],
- standalone: false
-})
-export class HomeComponent implements OnInit {
- content?: string;
-
- tutorials?: Tutorial[];
-
- constructor(private tutorialService: TutorialService) { }
-
- ngOnInit(): void {
- this.retrieveTutorials();
- }
- retrieveTutorials(): void {
- this.tutorialService.getAll()
- .subscribe(
- data => {
- this.tutorials = data;
- console.log(data);
- },
- error => {
- console.log(error);
- });
- }
-
- profileComponent = computed(() => AddTutorialComponent);
-}
diff --git a/jambotron-ui/src/app/components/profile/profile.component.ts b/jambotron-ui/src/app/components/profile/profile.component.ts
index a65ff43..8cad428 100644
--- a/jambotron-ui/src/app/components/profile/profile.component.ts
+++ b/jambotron-ui/src/app/components/profile/profile.component.ts
@@ -1,12 +1,16 @@
import { Component, OnInit } from '@angular/core';
import {TokenStorageService} from '../../services/token-storage.service';
+import {NgForOf, NgIf} from '@angular/common';
@Component({
- selector: 'app-profile',
- templateUrl: './profile.component.html',
- styleUrls: ['./profile.component.scss'],
- standalone: false
+ selector: 'app-profile',
+ templateUrl: './profile.component.html',
+ imports: [
+ NgForOf,
+ NgIf
+ ],
+ styleUrls: ['./profile.component.scss']
})
export class ProfileComponent implements OnInit {
currentUser: any;
diff --git a/jambotron-ui/src/app/components/register/register.component.ts b/jambotron-ui/src/app/components/register/register.component.ts
index 031a95b..65d3c7e 100644
--- a/jambotron-ui/src/app/components/register/register.component.ts
+++ b/jambotron-ui/src/app/components/register/register.component.ts
@@ -1,12 +1,17 @@
import { Component, OnInit } from '@angular/core';
import {AuthService} from '../../services/auth.service';
+import {FormsModule} from '@angular/forms';
+import {NgIf} from '@angular/common';
@Component({
- selector: 'app-register',
- templateUrl: './register.component.html',
- styleUrls: ['./register.component.scss'],
- standalone: false
+ selector: 'app-register',
+ templateUrl: './register.component.html',
+ imports: [
+ FormsModule,
+ NgIf
+ ],
+ styleUrls: ['./register.component.scss']
})
export class RegisterComponent implements OnInit {
form: any = {
diff --git a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
index 9423c10..96a88d3 100644
--- a/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
+++ b/jambotron-ui/src/app/components/tutorial-details/tutorial-details.component.ts
@@ -3,13 +3,18 @@ import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import {Tutorial} from '../../models/tutorial.model';
import {TutorialService} from '../../services/tutorial.service';
+import {FormsModule} from '@angular/forms';
+import {NgIf} from '@angular/common';
@Component({
- selector: 'app-tutorial-details',
- templateUrl: './tutorial-details.component.html',
- styleUrls: ['./tutorial-details.component.scss'],
- standalone: false
+ selector: 'app-tutorial-details',
+ templateUrl: './tutorial-details.component.html',
+ imports: [
+ FormsModule,
+ NgIf
+ ],
+ styleUrls: ['./tutorial-details.component.scss']
})
export class TutorialDetailsComponent implements OnInit {
diff --git a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
index f7f62b1..f1cdb3f 100644
--- a/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
+++ b/jambotron-ui/src/app/components/tutorials-list/tutorials-list.component.ts
@@ -3,12 +3,19 @@ import { Component, OnInit } from '@angular/core';
import {Tutorial} from '../../models/tutorial.model';
import {TutorialService} from '../../services/tutorial.service';
+import {FormsModule} from '@angular/forms';
+import {RouterLink} from '@angular/router';
+import {NgIf} from '@angular/common';
@Component({
- selector: 'app-tutorials-list',
- templateUrl: './tutorials-list.component.html',
- styleUrls: ['./tutorials-list.component.scss'],
- standalone: false
+ selector: 'app-tutorials-list',
+ templateUrl: './tutorials-list.component.html',
+ imports: [
+ FormsModule,
+ RouterLink,
+ NgIf
+ ],
+ styleUrls: ['./tutorials-list.component.scss']
})
export class TutorialsListComponent implements OnInit {
diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html
new file mode 100644
index 0000000..1c6abe5
--- /dev/null
+++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html
@@ -0,0 +1,9 @@
+@for (tutorial of tutorials; track $index){
+
+
+ {{tutorial.title}}
+
+
+
+
+}
diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.scss b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts
new file mode 100644
index 0000000..280f05a
--- /dev/null
+++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { TutorialsComponent } from './tutorials.component';
+
+describe('TutorialsComponent', () => {
+ let component: TutorialsComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TutorialsComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(TutorialsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts
new file mode 100644
index 0000000..c97aa15
--- /dev/null
+++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts
@@ -0,0 +1,39 @@
+import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {Tutorial} from '../../models/tutorial.model';
+import {TutorialService} from '../../services/tutorial.service';
+import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card';
+
+@Component({
+ selector: 'app-tutorials.component',
+ imports: [
+ MatCard,
+ MatCardContent,
+ MatCardHeader
+ ],
+ templateUrl: './tutorials.component.html',
+ styleUrl: './tutorials.component.scss',
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+})
+export class TutorialsComponent {
+ tutorials?: Tutorial[];
+
+ constructor(private tutorialService: TutorialService) {
+ this.retrieveTutorials();
+ }
+
+ // ngOnInit(): void {
+ // this.retrieveTutorials();
+ // }
+
+ retrieveTutorials(): void {
+ this.tutorialService.getAll()
+ .subscribe(
+ data => {
+ this.tutorials = data;
+ console.log(data);
+ },
+ error => {
+ console.log(error);
+ });
+ }
+}
diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.html b/jambotron-ui/src/app/main-module/main.component/main.component.html
new file mode 100644
index 0000000..f60d02d
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.component/main.component.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+ @if (isLoggedIn) {
+
+ }
+
+ @if (showAdminBoard) {
+
+ }
+
+ @if (showAdminBoard) {
+
+ }
+
+
+ @if (isLoggedIn) {
+
+ }
+ @if (!isLoggedIn) {
+
+ }
+ @if (isLoggedIn) {
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.scss b/jambotron-ui/src/app/main-module/main.component/main.component.scss
new file mode 100644
index 0000000..713ba97
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.component/main.component.scss
@@ -0,0 +1,15 @@
+
+mat-toolbar{
+ background-color: rgba(153,153,153,0.16);
+ backdrop-filter: blur(8px);
+}
+.menu-spacer {
+ flex: 1 1 auto;
+}
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1000; // Ensure toolbar stays above other content
+}
diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts b/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts
new file mode 100644
index 0000000..7628b2d
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.component/main.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MainComponent } from './main.component';
+
+describe('MainComponent', () => {
+ let component: MainComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [MainComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(MainComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts
new file mode 100644
index 0000000..d17f946
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts
@@ -0,0 +1,163 @@
+import {Component, CUSTOM_ELEMENTS_SCHEMA, inject} from '@angular/core';
+//import {NavigationComponent} from '../navigation/navigation.component';
+import {NgClass} from '@angular/common';
+import {NavigationComponent} from '../../layouts/admin-layout/navigation/navigation.component';
+import {RouterLink, RouterOutlet} from '@angular/router';
+import {BreadcrumbComponent} from '../../components/breadcrumb/breadcrumb.component';
+import {NavBarComponent} from '../../layouts/admin-layout/nav-bar/nav-bar.component';
+import {MatToolbar} from '@angular/material/toolbar';
+import {MatButton} from '@angular/material/button';
+import {IconDirective} from '@ant-design/icons-angular';
+import {MatDialog} from '@angular/material/dialog';
+import {Subscription} from 'rxjs';
+import {TokenStorageService} from '../../services/token-storage.service';
+import {AuthService} from '../../services/auth.service';
+import {EventBusService} from '../../_shared/event-bus.service';
+import {DialogComponent} from '../../components/dialog/dialog.component';
+
+@Component({
+ selector: 'app-main.component',
+ imports: [
+ NavBarComponent,
+ MatToolbar,
+ MatButton,
+ RouterLink,
+ IconDirective,
+ RouterOutlet
+ ],
+ schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
+ templateUrl: './main.component.html',
+ styleUrl: './main.component.scss'
+})
+export class MainComponent {
+ // public props
+ navCollapsed: boolean = false;
+ navCollapsedMob: boolean = false;
+
+ readonly dialog = inject(MatDialog);
+ //private authService = new AuthService(provideHttpClient())
+ public dialogData : DialogData = {password: "", username: ""};
+
+ private roles: string[] = [];
+ isLoggedIn = false;
+ showAdminBoard = false;
+ showModeratorBoard = false;
+ username?: string;
+
+ eventBusSub?: Subscription;
+ private errorMessage: any;
+ private isLoginFailed: boolean = false;
+
+ private storageService: TokenStorageService = inject(TokenStorageService);
+ private authService: AuthService = inject(AuthService);
+ private eventBusService: EventBusService = inject(EventBusService);
+
+ constructor(
+
+ ) {}
+
+ ngOnInit(): void {
+ this.isLoggedIn = this.storageService.isLoggedIn();
+
+ if (this.isLoggedIn) {
+ const user = this.storageService.getUser();
+ this.roles = user.roles;
+
+ this.showAdminBoard = true;//this.roles.includes('ROLE_ADMIN');
+ this.showModeratorBoard = this.roles.includes('ROLE_MODERATOR');
+
+ this.username = user.username;
+ }
+
+ this.eventBusSub = this.eventBusService.on('logout', () => {
+ this.logout();
+ });
+ }
+
+ // public method
+ navMobClick() {
+ if (this.navCollapsedMob && !document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ setTimeout(() => {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ }, 100);
+ } else {
+ this.navCollapsedMob = !this.navCollapsedMob;
+ }
+ if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('navbar-collapsed')) {
+ document.querySelector('app-navigation.pc-sidebar')?.classList.remove('navbar-collapsed');
+ }
+ }
+
+ handleKeyDown(event: KeyboardEvent): void {
+ if (event.key === 'Escape') {
+ this.closeMenu();
+ }
+ }
+
+ closeMenu() {
+ if (document.querySelector('app-navigation.pc-sidebar')?.classList.contains('mob-open')) {
+ document.querySelector('app-navigation.pc-sidebar')?.classList.remove('mob-open');
+ }
+ }
+
+
+ logout(): void {
+ this.authService.logout().subscribe({
+ next: res => {
+ console.log(res);
+ this.storageService.clean();
+
+ window.location.reload();
+ },
+ error: err => {
+ console.log(err);
+ }
+ });
+ }
+
+ openDialog(enterAnimationDuration: string, exitAnimationDuration: string) {
+
+ let dialogRef = this.dialog.open(DialogComponent, {
+ width: '350px',
+ enterAnimationDuration,
+ exitAnimationDuration,
+ data: {username: this.dialogData.username, password: this.dialogData.password}
+ });
+
+ dialogRef.afterClosed().subscribe(result => {
+ console.log('The dialog was closed');
+ if(result== null){
+ return;
+ }
+ this.dialogData = result;
+
+ this.authService.login(this.dialogData.username, this.dialogData.password).subscribe(
+ data => {
+ this.storageService.saveToken(data.accessToken);
+ this.storageService.saveUser(data);
+
+ this.isLoginFailed = false;
+ this.isLoggedIn = true;
+ let user = this.storageService.getUser();
+ this.roles = user.roles;
+ //this.username = user.username;
+ this.reloadPage();
+ },
+ err => {
+ this.errorMessage = err.error.message;
+ this.isLoginFailed = true;
+ }
+ );
+ });
+
+ }
+ reloadPage(): void {
+ window.location.reload();
+ }
+
+}
+export interface DialogData {
+ username: string;
+ password: string;
+}
diff --git a/jambotron-ui/src/app/main-module/main.module.ts b/jambotron-ui/src/app/main-module/main.module.ts
new file mode 100644
index 0000000..2685f6a
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.module.ts
@@ -0,0 +1,13 @@
+import {RouterModule} from '@angular/router';
+import {MainComponent} from './main.component/main.component';
+import {mainRouting} from './main.routing';
+import {NgModule} from '@angular/core';
+
+@NgModule({
+ declarations: [
+
+ ],
+ imports: [mainRouting, MainComponent],
+ exports: [RouterModule],
+})
+export class MainModule {}
diff --git a/jambotron-ui/src/app/main-module/main.routing.ts b/jambotron-ui/src/app/main-module/main.routing.ts
new file mode 100644
index 0000000..3b921a0
--- /dev/null
+++ b/jambotron-ui/src/app/main-module/main.routing.ts
@@ -0,0 +1,44 @@
+import {RouterModule, Routes} from '@angular/router';
+import {HomeComponent} from '../components/home.component/home.component';
+import {MainComponent} from './main.component/main.component';
+import {TutorialsListComponent} from '../components/tutorials-list/tutorials-list.component';
+import {TutorialsComponent} from '../components/tutorials.component/tutorials.component';
+import {AddTutorialComponent} from '../components/add-tutorial/add-tutorial.component';
+import {RegisterComponent} from '../components/register/register.component';
+import {ProfileComponent} from '../components/profile/profile.component';
+
+const MAIN_ROUTES: Routes =[
+ {
+ path: '',
+ component: MainComponent,
+ children: [
+ {
+ path: 'admin',
+ loadChildren: () =>
+ import('../admin-module/admin.module').then((m) => m.AdminModule),
+ },
+ {
+ path: 'home',
+ component: HomeComponent
+ },
+ {
+ path: 'tutorials',
+ component: TutorialsComponent
+ },
+ {
+ path: 'add-tutorial',
+ component: AddTutorialComponent
+ },
+ {
+ path: 'register',
+ component : RegisterComponent
+ },
+ {
+ path: 'profile',
+ component : ProfileComponent
+ }
+ ],
+ }
+];
+
+export const mainRouting = RouterModule.forChild(MAIN_ROUTES);
diff --git a/jambotron-ui/src/app/services/token-storage.service.ts b/jambotron-ui/src/app/services/token-storage.service.ts
index 67fa073..9e3e747 100644
--- a/jambotron-ui/src/app/services/token-storage.service.ts
+++ b/jambotron-ui/src/app/services/token-storage.service.ts
@@ -1,4 +1,5 @@
-import { Injectable } from '@angular/core';
+import {inject, Injectable} from '@angular/core';
+import {DOCUMENT} from '@angular/common';
const TOKEN_KEY = 'auth-token';
const USER_KEY = 'auth-user';
@@ -7,28 +8,33 @@ const USER_KEY = 'auth-user';
providedIn: 'root'
})
export class TokenStorageService {
- constructor() { }
+
+ private document = inject(DOCUMENT);
+
+ constructor() {
+
+ }
signOut(): void {
- window.sessionStorage.clear();
+ this.document.defaultView?.sessionStorage.clear();
}
public saveToken(token: string): void {
- window.sessionStorage.removeItem(TOKEN_KEY);
- window.sessionStorage.setItem(TOKEN_KEY, token);
+ document.defaultView?.sessionStorage.removeItem(TOKEN_KEY);
+ document.defaultView?.sessionStorage.setItem(TOKEN_KEY, token);
}
- public getToken(): string | null {
- return window.sessionStorage.getItem(TOKEN_KEY);
+ public getToken(): string | null| undefined {
+ return document.defaultView?.sessionStorage.getItem(TOKEN_KEY);
}
public saveUser(user: any): void {
- window.sessionStorage.removeItem(USER_KEY);
- window.sessionStorage.setItem(USER_KEY, JSON.stringify(user));
+ document.defaultView?.sessionStorage.removeItem(USER_KEY);
+ document.defaultView?.sessionStorage.setItem(USER_KEY, JSON.stringify(user));
}
public getUser(): any {
- const user = window.sessionStorage.getItem(USER_KEY);
+ const user = document.defaultView?.sessionStorage.getItem(USER_KEY);
if (user) {
return JSON.parse(user);
}
@@ -37,11 +43,11 @@ export class TokenStorageService {
}
clean(): void {
- window.sessionStorage.clear();
+ document.defaultView?.sessionStorage.clear();
}
public isLoggedIn(): boolean {
- const user = window.sessionStorage.getItem(USER_KEY);
+ const user = this.document.defaultView?.sessionStorage?.getItem(USER_KEY);
if (user) {
return true;
}
diff --git a/jambotron-ui/src/assets/.gitkeep b/jambotron-ui/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/jambotron-ui/src/assets/images/authentication/facebook.svg b/jambotron-ui/src/assets/images/authentication/facebook.svg
new file mode 100644
index 0000000..6d4fd87
--- /dev/null
+++ b/jambotron-ui/src/assets/images/authentication/facebook.svg
@@ -0,0 +1,3 @@
+
diff --git a/jambotron-ui/src/assets/images/authentication/google.svg b/jambotron-ui/src/assets/images/authentication/google.svg
new file mode 100644
index 0000000..bd30fd9
--- /dev/null
+++ b/jambotron-ui/src/assets/images/authentication/google.svg
@@ -0,0 +1,6 @@
+
diff --git a/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg b/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg
new file mode 100644
index 0000000..8307093
--- /dev/null
+++ b/jambotron-ui/src/assets/images/authentication/img-auth-bg.svg
@@ -0,0 +1,5 @@
+
diff --git a/jambotron-ui/src/assets/images/authentication/twitter.svg b/jambotron-ui/src/assets/images/authentication/twitter.svg
new file mode 100644
index 0000000..f868d36
--- /dev/null
+++ b/jambotron-ui/src/assets/images/authentication/twitter.svg
@@ -0,0 +1,3 @@
+
diff --git a/jambotron-ui/src/assets/images/avatar-group.png b/jambotron-ui/src/assets/images/avatar-group.png
new file mode 100644
index 0000000..9b08b0c
Binary files /dev/null and b/jambotron-ui/src/assets/images/avatar-group.png differ
diff --git a/jambotron-ui/src/assets/images/favicon.svg b/jambotron-ui/src/assets/images/favicon.svg
new file mode 100644
index 0000000..3caf057
--- /dev/null
+++ b/jambotron-ui/src/assets/images/favicon.svg
@@ -0,0 +1,16 @@
+
diff --git a/jambotron-ui/src/assets/images/logo-dark.svg b/jambotron-ui/src/assets/images/logo-dark.svg
new file mode 100644
index 0000000..f766a59
--- /dev/null
+++ b/jambotron-ui/src/assets/images/logo-dark.svg
@@ -0,0 +1,17 @@
+
diff --git a/jambotron-ui/src/assets/images/logo-icon.svg b/jambotron-ui/src/assets/images/logo-icon.svg
new file mode 100644
index 0000000..133293d
--- /dev/null
+++ b/jambotron-ui/src/assets/images/logo-icon.svg
@@ -0,0 +1,16 @@
+
diff --git a/jambotron-ui/src/assets/images/logo-white.svg b/jambotron-ui/src/assets/images/logo-white.svg
new file mode 100644
index 0000000..5938737
--- /dev/null
+++ b/jambotron-ui/src/assets/images/logo-white.svg
@@ -0,0 +1,17 @@
+
diff --git a/jambotron-ui/src/assets/images/profile/card.png b/jambotron-ui/src/assets/images/profile/card.png
new file mode 100644
index 0000000..065dd12
Binary files /dev/null and b/jambotron-ui/src/assets/images/profile/card.png differ
diff --git a/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg b/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg
new file mode 100644
index 0000000..98371c8
--- /dev/null
+++ b/jambotron-ui/src/assets/images/profile/img-profile-bottom.svg
@@ -0,0 +1,3 @@
+
diff --git a/jambotron-ui/src/assets/images/profile/img-profile-top.svg b/jambotron-ui/src/assets/images/profile/img-profile-top.svg
new file mode 100644
index 0000000..3d8e6b7
--- /dev/null
+++ b/jambotron-ui/src/assets/images/profile/img-profile-top.svg
@@ -0,0 +1,3 @@
+
diff --git a/jambotron-ui/src/assets/images/user/avatar-1.jpg b/jambotron-ui/src/assets/images/user/avatar-1.jpg
new file mode 100644
index 0000000..8009caa
Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-1.jpg differ
diff --git a/jambotron-ui/src/assets/images/user/avatar-2.jpg b/jambotron-ui/src/assets/images/user/avatar-2.jpg
new file mode 100644
index 0000000..4c7f15d
Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-2.jpg differ
diff --git a/jambotron-ui/src/assets/images/user/avatar-3.jpg b/jambotron-ui/src/assets/images/user/avatar-3.jpg
new file mode 100644
index 0000000..6af59c8
Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-3.jpg differ
diff --git a/jambotron-ui/src/assets/images/user/avatar-4.jpg b/jambotron-ui/src/assets/images/user/avatar-4.jpg
new file mode 100644
index 0000000..7df1e09
Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-4.jpg differ
diff --git a/jambotron-ui/src/assets/images/user/avatar-5.jpg b/jambotron-ui/src/assets/images/user/avatar-5.jpg
new file mode 100644
index 0000000..8bc2ca2
Binary files /dev/null and b/jambotron-ui/src/assets/images/user/avatar-5.jpg differ
diff --git a/jambotron-ui/src/index.html b/jambotron-ui/src/index.html
index 702379c..42711ff 100644
--- a/jambotron-ui/src/index.html
+++ b/jambotron-ui/src/index.html
@@ -5,13 +5,11 @@
JambotronUi
-
-
-
+
-
+
diff --git a/jambotron-ui/src/main.server.ts b/jambotron-ui/src/main.server.ts
new file mode 100644
index 0000000..154ce1c
--- /dev/null
+++ b/jambotron-ui/src/main.server.ts
@@ -0,0 +1,7 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { App } from './app/app';
+import { config } from './app/app.config.server';
+
+const bootstrap = () => bootstrapApplication(App, config);
+
+export default bootstrap;
diff --git a/jambotron-ui/src/main.ts b/jambotron-ui/src/main.ts
index 47f663d..5df75f9 100644
--- a/jambotron-ui/src/main.ts
+++ b/jambotron-ui/src/main.ts
@@ -1,15 +1,6 @@
import { bootstrapApplication } from '@angular/platform-browser';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { appConfig } from './app/app.config';
+import { App } from './app/app';
-import {AppModule} from './app/app.module';
-
-//import('@angular/animations/browser')
-
-platformBrowserDynamic().bootstrapModule(AppModule)
-
- .catch(
- // err => console.error(err)
- (e) => {
- console.error(e.message);
- }
- );
+bootstrapApplication(App, appConfig)
+ .catch((err) => console.error(err));
diff --git a/jambotron-ui/src/scss/bootstrap/bootstrap.scss b/jambotron-ui/src/scss/bootstrap/bootstrap.scss
new file mode 100644
index 0000000..4f81fac
--- /dev/null
+++ b/jambotron-ui/src/scss/bootstrap/bootstrap.scss
@@ -0,0 +1,34 @@
+@import '../../../node_modules/bootstrap/scss/maps';
+@import '../../../node_modules/bootstrap/scss/mixins';
+@import '../../../node_modules/bootstrap/scss/root';
+@import '../../../node_modules/bootstrap/scss/reboot';
+@import '../../../node_modules/bootstrap/scss/type';
+@import '../../../node_modules/bootstrap/scss/images';
+@import '../../../node_modules/bootstrap/scss/containers';
+@import '../../../node_modules/bootstrap/scss/grid';
+@import '../../../node_modules/bootstrap/scss/tables';
+@import '../../../node_modules/bootstrap/scss/forms';
+@import '../../../node_modules/bootstrap/scss/buttons';
+@import '../../../node_modules/bootstrap/scss/transitions';
+@import '../../../node_modules/bootstrap/scss/dropdown';
+@import '../../../node_modules/bootstrap/scss/button-group';
+@import '../../../node_modules/bootstrap/scss/nav';
+@import '../../../node_modules/bootstrap/scss/navbar';
+@import '../../../node_modules/bootstrap/scss/card';
+@import '../../../node_modules/bootstrap/scss/accordion';
+@import '../../../node_modules/bootstrap/scss/breadcrumb';
+@import '../../../node_modules/bootstrap/scss/pagination';
+@import '../../../node_modules/bootstrap/scss/badge';
+@import '../../../node_modules/bootstrap/scss/alert';
+@import '../../../node_modules/bootstrap/scss/progress';
+@import '../../../node_modules/bootstrap/scss/list-group';
+@import '../../../node_modules/bootstrap/scss/close';
+@import '../../../node_modules/bootstrap/scss/toasts';
+@import '../../../node_modules/bootstrap/scss/modal';
+@import '../../../node_modules/bootstrap/scss/tooltip';
+@import '../../../node_modules/bootstrap/scss/popover';
+@import '../../../node_modules/bootstrap/scss/carousel';
+@import '../../../node_modules/bootstrap/scss/spinners';
+@import '../../../node_modules/bootstrap/scss/offcanvas';
+@import '../../../node_modules/bootstrap/scss/placeholders';
+@import '../../../node_modules/bootstrap/scss/helpers';
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff
new file mode 100644
index 0000000..61e1c25
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2
new file mode 100644
index 0000000..6c401bb
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Bold.woff2 differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff
new file mode 100644
index 0000000..8c36a63
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2
new file mode 100644
index 0000000..3b31d33
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Medium.woff2 differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff
new file mode 100644
index 0000000..7d587c4
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2
new file mode 100644
index 0000000..d5ffd2a
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-Regular.woff2 differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff
new file mode 100644
index 0000000..99df06c
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff differ
diff --git a/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2 b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2
new file mode 100644
index 0000000..df746af
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/inter/Inter-SemiBold.woff2 differ
diff --git a/jambotron-ui/src/scss/fonts/inter/inter.css b/jambotron-ui/src/scss/fonts/inter/inter.css
new file mode 100644
index 0000000..c0baa77
--- /dev/null
+++ b/jambotron-ui/src/scss/fonts/inter/inter.css
@@ -0,0 +1,39 @@
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src:
+ url('Inter-Regular.woff2?v=3.13') format('woff2'),
+ url('Inter-Regular.woff?v=3.13') format('woff');
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src:
+ url('Inter-Medium.woff2?v=3.13') format('woff2'),
+ url('Inter-Medium.woff?v=3.13') format('woff');
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src:
+ url('Inter-SemiBold.woff2?v=3.13') format('woff2'),
+ url('Inter-SemiBold.woff?v=3.13') format('woff');
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src:
+ url('Inter-Bold.woff2?v=3.13') format('woff2'),
+ url('Inter-Bold.woff?v=3.13') format('woff');
+}
diff --git a/jambotron-ui/src/scss/fonts/tabler-icons.min.css b/jambotron-ui/src/scss/fonts/tabler-icons.min.css
new file mode 100644
index 0000000..e672ead
--- /dev/null
+++ b/jambotron-ui/src/scss/fonts/tabler-icons.min.css
@@ -0,0 +1,3927 @@
+/*!
+ * Tabler Icons 1.41.1 by tabler - https://tabler.io
+ * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE
+ */
+@font-face {
+ font-family: tabler-icons;
+ font-style: normal;
+ font-weight: 400;
+ src: url(tabler/tabler-icons.eot);
+ src:
+ url(tabler/tabler-icons.eot?#iefix) format('embedded-opentype'),
+ url(tabler/tabler-icons.woff2) format('woff2'),
+ url(tabler/tabler-icons.woff) format('woff'),
+ url(tabler/tabler-icons.ttf) format('truetype'),
+ url(tabler/tabler-icons.svg#tabler-icons) format('svg');
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ @font-face {
+ font-family: tabler-icons;
+ src: url(tabler/tabler-icons.svg#tabler-icons) format('svg');
+ }
+}
+.ti {
+ font-family: tabler-icons !important;
+ speak: none;
+ font-style: normal;
+ font-weight: 400;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.ti-2fa:before {
+ content: '\eca0';
+}
+.ti-3d-cube-sphere:before {
+ content: '\ecd7';
+}
+.ti-a-b:before {
+ content: '\ec36';
+}
+.ti-access-point:before {
+ content: '\ed1b';
+}
+.ti-access-point-off:before {
+ content: '\ed1a';
+}
+.ti-accessible:before {
+ content: '\eba9';
+}
+.ti-activity:before {
+ content: '\ed23';
+}
+.ti-ad:before {
+ content: '\ea02';
+}
+.ti-ad-2:before {
+ content: '\ef1f';
+}
+.ti-adjustments:before {
+ content: '\ea03';
+}
+.ti-adjustments-alt:before {
+ content: '\ec37';
+}
+.ti-adjustments-horizontal:before {
+ content: '\ec38';
+}
+.ti-aerial-lift:before {
+ content: '\edfe';
+}
+.ti-affiliate:before {
+ content: '\edff';
+}
+.ti-alarm:before {
+ content: '\ea04';
+}
+.ti-alert-circle:before {
+ content: '\ea05';
+}
+.ti-alert-octagon:before {
+ content: '\ecc6';
+}
+.ti-alert-triangle:before {
+ content: '\ea06';
+}
+.ti-alien:before {
+ content: '\ebde';
+}
+.ti-align-center:before {
+ content: '\ea07';
+}
+.ti-align-justified:before {
+ content: '\ea08';
+}
+.ti-align-left:before {
+ content: '\ea09';
+}
+.ti-align-right:before {
+ content: '\ea0a';
+}
+.ti-ambulance:before {
+ content: '\ebf5';
+}
+.ti-anchor:before {
+ content: '\eb76';
+}
+.ti-angle:before {
+ content: '\ef20';
+}
+.ti-antenna-bars-1:before {
+ content: '\ecc7';
+}
+.ti-antenna-bars-2:before {
+ content: '\ecc8';
+}
+.ti-antenna-bars-3:before {
+ content: '\ecc9';
+}
+.ti-antenna-bars-4:before {
+ content: '\ecca';
+}
+.ti-antenna-bars-5:before {
+ content: '\eccb';
+}
+.ti-aperture:before {
+ content: '\eb58';
+}
+.ti-apple:before {
+ content: '\ef21';
+}
+.ti-apps:before {
+ content: '\ebb6';
+}
+.ti-archive:before {
+ content: '\ea0b';
+}
+.ti-arrow-back:before {
+ content: '\ea0c';
+}
+.ti-arrow-back-up:before {
+ content: '\eb77';
+}
+.ti-arrow-bar-down:before {
+ content: '\ea0d';
+}
+.ti-arrow-bar-left:before {
+ content: '\ea0e';
+}
+.ti-arrow-bar-right:before {
+ content: '\ea0f';
+}
+.ti-arrow-bar-to-down:before {
+ content: '\ec88';
+}
+.ti-arrow-bar-to-left:before {
+ content: '\ec89';
+}
+.ti-arrow-bar-to-right:before {
+ content: '\ec8a';
+}
+.ti-arrow-bar-to-up:before {
+ content: '\ec8b';
+}
+.ti-arrow-bar-up:before {
+ content: '\ea10';
+}
+.ti-arrow-big-down:before {
+ content: '\edda';
+}
+.ti-arrow-big-left:before {
+ content: '\eddb';
+}
+.ti-arrow-big-right:before {
+ content: '\eddc';
+}
+.ti-arrow-big-top:before {
+ content: '\eddd';
+}
+.ti-arrow-bottom-bar:before {
+ content: '\ed98';
+}
+.ti-arrow-bottom-circle:before {
+ content: '\ed99';
+}
+.ti-arrow-bottom-square:before {
+ content: '\ed9a';
+}
+.ti-arrow-bottom-tail:before {
+ content: '\ed9b';
+}
+.ti-arrow-down:before {
+ content: '\ea16';
+}
+.ti-arrow-down-circle:before {
+ content: '\ea11';
+}
+.ti-arrow-down-left:before {
+ content: '\ea13';
+}
+.ti-arrow-down-left-circle:before {
+ content: '\ea12';
+}
+.ti-arrow-down-right:before {
+ content: '\ea15';
+}
+.ti-arrow-down-right-circle:before {
+ content: '\ea14';
+}
+.ti-arrow-forward:before {
+ content: '\ea17';
+}
+.ti-arrow-forward-up:before {
+ content: '\eb78';
+}
+.ti-arrow-left:before {
+ content: '\ea19';
+}
+.ti-arrow-left-bar:before {
+ content: '\ed9c';
+}
+.ti-arrow-left-circle:before {
+ content: '\ea18';
+}
+.ti-arrow-left-square:before {
+ content: '\ed9d';
+}
+.ti-arrow-left-tail:before {
+ content: '\ed9e';
+}
+.ti-arrow-loop-left:before {
+ content: '\ed9f';
+}
+.ti-arrow-loop-right:before {
+ content: '\eda0';
+}
+.ti-arrow-narrow-down:before {
+ content: '\ea1a';
+}
+.ti-arrow-narrow-left:before {
+ content: '\ea1b';
+}
+.ti-arrow-narrow-right:before {
+ content: '\ea1c';
+}
+.ti-arrow-narrow-up:before {
+ content: '\ea1d';
+}
+.ti-arrow-ramp-left:before {
+ content: '\ed3c';
+}
+.ti-arrow-ramp-right:before {
+ content: '\ed3d';
+}
+.ti-arrow-right:before {
+ content: '\ea1f';
+}
+.ti-arrow-right-bar:before {
+ content: '\eda1';
+}
+.ti-arrow-right-circle:before {
+ content: '\ea1e';
+}
+.ti-arrow-right-square:before {
+ content: '\eda2';
+}
+.ti-arrow-right-tail:before {
+ content: '\eda3';
+}
+.ti-arrow-top-bar:before {
+ content: '\eda4';
+}
+.ti-arrow-top-circle:before {
+ content: '\eda5';
+}
+.ti-arrow-top-square:before {
+ content: '\eda6';
+}
+.ti-arrow-top-tail:before {
+ content: '\eda7';
+}
+.ti-arrow-up:before {
+ content: '\ea25';
+}
+.ti-arrow-up-circle:before {
+ content: '\ea20';
+}
+.ti-arrow-up-left:before {
+ content: '\ea22';
+}
+.ti-arrow-up-left-circle:before {
+ content: '\ea21';
+}
+.ti-arrow-up-right:before {
+ content: '\ea24';
+}
+.ti-arrow-up-right-circle:before {
+ content: '\ea23';
+}
+.ti-arrow-wave-left-down:before {
+ content: '\eda8';
+}
+.ti-arrow-wave-left-up:before {
+ content: '\eda9';
+}
+.ti-arrow-wave-right-down:before {
+ content: '\edaa';
+}
+.ti-arrow-wave-right-up:before {
+ content: '\edab';
+}
+.ti-arrows-diagonal:before {
+ content: '\ea27';
+}
+.ti-arrows-diagonal-2:before {
+ content: '\ea26';
+}
+.ti-arrows-double-ne-sw:before {
+ content: '\edde';
+}
+.ti-arrows-double-nw-se:before {
+ content: '\eddf';
+}
+.ti-arrows-double-se-nw:before {
+ content: '\ede0';
+}
+.ti-arrows-double-sw-ne:before {
+ content: '\ede1';
+}
+.ti-arrows-down:before {
+ content: '\edad';
+}
+.ti-arrows-down-up:before {
+ content: '\edac';
+}
+.ti-arrows-horizontal:before {
+ content: '\eb59';
+}
+.ti-arrows-join:before {
+ content: '\edaf';
+}
+.ti-arrows-join-2:before {
+ content: '\edae';
+}
+.ti-arrows-left:before {
+ content: '\edb1';
+}
+.ti-arrows-left-down:before {
+ content: '\ee00';
+}
+.ti-arrows-left-right:before {
+ content: '\edb0';
+}
+.ti-arrows-maximize:before {
+ content: '\ea28';
+}
+.ti-arrows-minimize:before {
+ content: '\ea29';
+}
+.ti-arrows-right:before {
+ content: '\edb3';
+}
+.ti-arrows-right-down:before {
+ content: '\ee01';
+}
+.ti-arrows-right-left:before {
+ content: '\edb2';
+}
+.ti-arrows-sort:before {
+ content: '\eb5a';
+}
+.ti-arrows-split:before {
+ content: '\edb5';
+}
+.ti-arrows-split-2:before {
+ content: '\edb4';
+}
+.ti-arrows-up:before {
+ content: '\edb7';
+}
+.ti-arrows-up-down:before {
+ content: '\edb6';
+}
+.ti-arrows-up-left:before {
+ content: '\ee02';
+}
+.ti-arrows-up-right:before {
+ content: '\ee03';
+}
+.ti-arrows-vertical:before {
+ content: '\eb5b';
+}
+.ti-artboard:before {
+ content: '\ea2a';
+}
+.ti-aspect-ratio:before {
+ content: '\ed30';
+}
+.ti-at:before {
+ content: '\ea2b';
+}
+.ti-atom:before {
+ content: '\eb79';
+}
+.ti-atom-2:before {
+ content: '\ebdf';
+}
+.ti-award:before {
+ content: '\ea2c';
+}
+.ti-backhoe:before {
+ content: '\ed86';
+}
+.ti-backspace:before {
+ content: '\ea2d';
+}
+.ti-ball-american-football:before {
+ content: '\ee04';
+}
+.ti-ball-basketball:before {
+ content: '\ec28';
+}
+.ti-ball-bowling:before {
+ content: '\ec29';
+}
+.ti-ball-football:before {
+ content: '\ee06';
+}
+.ti-ball-football-off:before {
+ content: '\ee05';
+}
+.ti-ball-tennis:before {
+ content: '\ec2a';
+}
+.ti-ball-volleyball:before {
+ content: '\ec2b';
+}
+.ti-ban:before {
+ content: '\ea2e';
+}
+.ti-bandage:before {
+ content: '\eb7a';
+}
+.ti-barcode:before {
+ content: '\ebc6';
+}
+.ti-basket:before {
+ content: '\ebe1';
+}
+.ti-battery:before {
+ content: '\ea34';
+}
+.ti-battery-1:before {
+ content: '\ea2f';
+}
+.ti-battery-2:before {
+ content: '\ea30';
+}
+.ti-battery-3:before {
+ content: '\ea31';
+}
+.ti-battery-4:before {
+ content: '\ea32';
+}
+.ti-battery-automotive:before {
+ content: '\ee07';
+}
+.ti-battery-charging:before {
+ content: '\ea33';
+}
+.ti-battery-off:before {
+ content: '\ed1c';
+}
+.ti-bed:before {
+ content: '\eb5c';
+}
+.ti-bell:before {
+ content: '\ea35';
+}
+.ti-bell-minus:before {
+ content: '\ede2';
+}
+.ti-bell-off:before {
+ content: '\ece9';
+}
+.ti-bell-plus:before {
+ content: '\ede3';
+}
+.ti-bell-ringing:before {
+ content: '\ed07';
+}
+.ti-bell-ringing-2:before {
+ content: '\ede4';
+}
+.ti-bell-x:before {
+ content: '\ede5';
+}
+.ti-bike:before {
+ content: '\ea36';
+}
+.ti-binary:before {
+ content: '\ee08';
+}
+.ti-biohazard:before {
+ content: '\ecb8';
+}
+.ti-blockquote:before {
+ content: '\ee09';
+}
+.ti-bluetooth:before {
+ content: '\ea37';
+}
+.ti-bluetooth-connected:before {
+ content: '\ecea';
+}
+.ti-bluetooth-off:before {
+ content: '\eceb';
+}
+.ti-bold:before {
+ content: '\eb7b';
+}
+.ti-bolt:before {
+ content: '\ea38';
+}
+.ti-bolt-off:before {
+ content: '\ecec';
+}
+.ti-bone:before {
+ content: '\edb8';
+}
+.ti-book:before {
+ content: '\ea39';
+}
+.ti-bookmark:before {
+ content: '\ea3a';
+}
+.ti-bookmark-off:before {
+ content: '\eced';
+}
+.ti-bookmarks:before {
+ content: '\ed08';
+}
+.ti-border-all:before {
+ content: '\ea3b';
+}
+.ti-border-bottom:before {
+ content: '\ea3c';
+}
+.ti-border-horizontal:before {
+ content: '\ea3d';
+}
+.ti-border-inner:before {
+ content: '\ea3e';
+}
+.ti-border-left:before {
+ content: '\ea3f';
+}
+.ti-border-none:before {
+ content: '\ea40';
+}
+.ti-border-outer:before {
+ content: '\ea41';
+}
+.ti-border-radius:before {
+ content: '\eb7c';
+}
+.ti-border-right:before {
+ content: '\ea42';
+}
+.ti-border-style:before {
+ content: '\ee0a';
+}
+.ti-border-style-2:before {
+ content: '\ef22';
+}
+.ti-border-top:before {
+ content: '\ea43';
+}
+.ti-border-vertical:before {
+ content: '\ea44';
+}
+.ti-bottle:before {
+ content: '\ef0b';
+}
+.ti-box:before {
+ content: '\ea45';
+}
+.ti-box-margin:before {
+ content: '\ee0b';
+}
+.ti-box-model:before {
+ content: '\ee0c';
+}
+.ti-box-model-2:before {
+ content: '\ef23';
+}
+.ti-box-multiple:before {
+ content: '\ee17';
+}
+.ti-box-multiple-0:before {
+ content: '\ee0d';
+}
+.ti-box-multiple-1:before {
+ content: '\ee0e';
+}
+.ti-box-multiple-2:before {
+ content: '\ee0f';
+}
+.ti-box-multiple-3:before {
+ content: '\ee10';
+}
+.ti-box-multiple-4:before {
+ content: '\ee11';
+}
+.ti-box-multiple-5:before {
+ content: '\ee12';
+}
+.ti-box-multiple-6:before {
+ content: '\ee13';
+}
+.ti-box-multiple-7:before {
+ content: '\ee14';
+}
+.ti-box-multiple-8:before {
+ content: '\ee15';
+}
+.ti-box-multiple-9:before {
+ content: '\ee16';
+}
+.ti-box-padding:before {
+ content: '\ee18';
+}
+.ti-braces:before {
+ content: '\ebcc';
+}
+.ti-brackets:before {
+ content: '\ebcd';
+}
+.ti-brand-airbnb:before {
+ content: '\ed68';
+}
+.ti-brand-android:before {
+ content: '\ec16';
+}
+.ti-brand-apple:before {
+ content: '\ec17';
+}
+.ti-brand-apple-arcade:before {
+ content: '\ed69';
+}
+.ti-brand-appstore:before {
+ content: '\ed24';
+}
+.ti-brand-asana:before {
+ content: '\edc5';
+}
+.ti-brand-behance:before {
+ content: '\ec6e';
+}
+.ti-brand-bing:before {
+ content: '\edc6';
+}
+.ti-brand-bitbucket:before {
+ content: '\edc7';
+}
+.ti-brand-booking:before {
+ content: '\edc8';
+}
+.ti-brand-chrome:before {
+ content: '\ec18';
+}
+.ti-brand-codepen:before {
+ content: '\ec6f';
+}
+.ti-brand-codesandbox:before {
+ content: '\ed6a';
+}
+.ti-brand-css3:before {
+ content: '\ed6b';
+}
+.ti-brand-deviantart:before {
+ content: '\ecfb';
+}
+.ti-brand-discord:before {
+ content: '\ece3';
+}
+.ti-brand-disqus:before {
+ content: '\edc9';
+}
+.ti-brand-docker:before {
+ content: '\edca';
+}
+.ti-brand-dribbble:before {
+ content: '\ec19';
+}
+.ti-brand-edge:before {
+ content: '\ecfc';
+}
+.ti-brand-facebook:before {
+ content: '\ec1a';
+}
+.ti-brand-figma:before {
+ content: '\ec93';
+}
+.ti-brand-firefox:before {
+ content: '\ecfd';
+}
+.ti-brand-flickr:before {
+ content: '\ecfe';
+}
+.ti-brand-foursquare:before {
+ content: '\ecff';
+}
+.ti-brand-framer:before {
+ content: '\ec1b';
+}
+.ti-brand-github:before {
+ content: '\ec1c';
+}
+.ti-brand-gitlab:before {
+ content: '\ec1d';
+}
+.ti-brand-google:before {
+ content: '\ec1f';
+}
+.ti-brand-google-analytics:before {
+ content: '\edcb';
+}
+.ti-brand-google-drive:before {
+ content: '\ec1e';
+}
+.ti-brand-google-play:before {
+ content: '\ed25';
+}
+.ti-brand-gravatar:before {
+ content: '\edcc';
+}
+.ti-brand-hipchat:before {
+ content: '\edcd';
+}
+.ti-brand-html5:before {
+ content: '\ed6c';
+}
+.ti-brand-instagram:before {
+ content: '\ec20';
+}
+.ti-brand-javascript:before {
+ content: '\ef0c';
+}
+.ti-brand-kickstarter:before {
+ content: '\edce';
+}
+.ti-brand-kotlin:before {
+ content: '\ed6d';
+}
+.ti-brand-linkedin:before {
+ content: '\ec8c';
+}
+.ti-brand-medium:before {
+ content: '\ec70';
+}
+.ti-brand-messenger:before {
+ content: '\ec71';
+}
+.ti-brand-netflix:before {
+ content: '\edcf';
+}
+.ti-brand-open-source:before {
+ content: '\edd0';
+}
+.ti-brand-opera:before {
+ content: '\ec21';
+}
+.ti-brand-pagekit:before {
+ content: '\edd1';
+}
+.ti-brand-patreon:before {
+ content: '\edd2';
+}
+.ti-brand-paypal:before {
+ content: '\ec22';
+}
+.ti-brand-pinterest:before {
+ content: '\ec8d';
+}
+.ti-brand-pocket:before {
+ content: '\ed00';
+}
+.ti-brand-producthunt:before {
+ content: '\edd3';
+}
+.ti-brand-python:before {
+ content: '\ed01';
+}
+.ti-brand-reddit:before {
+ content: '\ec8e';
+}
+.ti-brand-safari:before {
+ content: '\ec23';
+}
+.ti-brand-sass:before {
+ content: '\edd4';
+}
+.ti-brand-sentry:before {
+ content: '\edd5';
+}
+.ti-brand-shazam:before {
+ content: '\edd6';
+}
+.ti-brand-sketch:before {
+ content: '\ec24';
+}
+.ti-brand-skype:before {
+ content: '\ed02';
+}
+.ti-brand-slack:before {
+ content: '\ec72';
+}
+.ti-brand-snapchat:before {
+ content: '\ec25';
+}
+.ti-brand-soundcloud:before {
+ content: '\ed6e';
+}
+.ti-brand-spotify:before {
+ content: '\ed03';
+}
+.ti-brand-steam:before {
+ content: '\ed6f';
+}
+.ti-brand-stripe:before {
+ content: '\edd7';
+}
+.ti-brand-tabler:before {
+ content: '\ec8f';
+}
+.ti-brand-tailwind:before {
+ content: '\eca1';
+}
+.ti-brand-telegram:before {
+ content: '\ec26';
+}
+.ti-brand-tidal:before {
+ content: '\ed70';
+}
+.ti-brand-tiktok:before {
+ content: '\ec73';
+}
+.ti-brand-tinder:before {
+ content: '\ed71';
+}
+.ti-brand-tumblr:before {
+ content: '\ed04';
+}
+.ti-brand-twitch:before {
+ content: '\ed05';
+}
+.ti-brand-twitter:before {
+ content: '\ec27';
+}
+.ti-brand-unsplash:before {
+ content: '\edd8';
+}
+.ti-brand-vercel:before {
+ content: '\ef24';
+}
+.ti-brand-vimeo:before {
+ content: '\ed06';
+}
+.ti-brand-vk:before {
+ content: '\ed72';
+}
+.ti-brand-whatsapp:before {
+ content: '\ec74';
+}
+.ti-brand-windows:before {
+ content: '\ecd8';
+}
+.ti-brand-yahoo:before {
+ content: '\ed73';
+}
+.ti-brand-ycombinator:before {
+ content: '\edd9';
+}
+.ti-brand-youtube:before {
+ content: '\ec90';
+}
+.ti-briefcase:before {
+ content: '\ea46';
+}
+.ti-brightness:before {
+ content: '\eb7f';
+}
+.ti-brightness-2:before {
+ content: '\ee19';
+}
+.ti-brightness-down:before {
+ content: '\eb7d';
+}
+.ti-brightness-half:before {
+ content: '\ee1a';
+}
+.ti-brightness-up:before {
+ content: '\eb7e';
+}
+.ti-browser:before {
+ content: '\ebb7';
+}
+.ti-brush:before {
+ content: '\ebb8';
+}
+.ti-bucket:before {
+ content: '\ea47';
+}
+.ti-bug:before {
+ content: '\ea48';
+}
+.ti-building:before {
+ content: '\ea4f';
+}
+.ti-building-arch:before {
+ content: '\ea49';
+}
+.ti-building-bank:before {
+ content: '\ebe2';
+}
+.ti-building-bridge:before {
+ content: '\ea4b';
+}
+.ti-building-bridge-2:before {
+ content: '\ea4a';
+}
+.ti-building-carousel:before {
+ content: '\ed87';
+}
+.ti-building-castle:before {
+ content: '\ed88';
+}
+.ti-building-church:before {
+ content: '\ea4c';
+}
+.ti-building-community:before {
+ content: '\ebf6';
+}
+.ti-building-cottage:before {
+ content: '\ee1b';
+}
+.ti-building-factory:before {
+ content: '\ee1c';
+}
+.ti-building-fortress:before {
+ content: '\ed89';
+}
+.ti-building-hospital:before {
+ content: '\ea4d';
+}
+.ti-building-lighthouse:before {
+ content: '\ed8a';
+}
+.ti-building-monument:before {
+ content: '\ed26';
+}
+.ti-building-pavilon:before {
+ content: '\ebf7';
+}
+.ti-building-skyscraper:before {
+ content: '\ec39';
+}
+.ti-building-store:before {
+ content: '\ea4e';
+}
+.ti-building-warehouse:before {
+ content: '\ebe3';
+}
+.ti-bulb:before {
+ content: '\ea51';
+}
+.ti-bulb-off:before {
+ content: '\ea50';
+}
+.ti-bulldozer:before {
+ content: '\ee1d';
+}
+.ti-bus:before {
+ content: '\ebe4';
+}
+.ti-businessplan:before {
+ content: '\ee1e';
+}
+.ti-calculator:before {
+ content: '\eb80';
+}
+.ti-calendar:before {
+ content: '\ea53';
+}
+.ti-calendar-event:before {
+ content: '\ea52';
+}
+.ti-calendar-minus:before {
+ content: '\ebb9';
+}
+.ti-calendar-off:before {
+ content: '\ee1f';
+}
+.ti-calendar-plus:before {
+ content: '\ebba';
+}
+.ti-calendar-stats:before {
+ content: '\ee20';
+}
+.ti-calendar-time:before {
+ content: '\ee21';
+}
+.ti-camera:before {
+ content: '\ea54';
+}
+.ti-camera-minus:before {
+ content: '\ec3a';
+}
+.ti-camera-off:before {
+ content: '\ecee';
+}
+.ti-camera-plus:before {
+ content: '\ec3b';
+}
+.ti-camera-rotate:before {
+ content: '\ee22';
+}
+.ti-camera-selfie:before {
+ content: '\ee23';
+}
+.ti-candy:before {
+ content: '\ef0d';
+}
+.ti-capture:before {
+ content: '\ec3c';
+}
+.ti-car:before {
+ content: '\ebbb';
+}
+.ti-car-crane:before {
+ content: '\ef25';
+}
+.ti-caravan:before {
+ content: '\ec7c';
+}
+.ti-cardboards:before {
+ content: '\ed74';
+}
+.ti-caret-down:before {
+ content: '\eb5d';
+}
+.ti-caret-left:before {
+ content: '\eb5e';
+}
+.ti-caret-right:before {
+ content: '\eb5f';
+}
+.ti-caret-up:before {
+ content: '\eb60';
+}
+.ti-cash:before {
+ content: '\ea55';
+}
+.ti-cash-banknote:before {
+ content: '\ee25';
+}
+.ti-cash-banknote-off:before {
+ content: '\ee24';
+}
+.ti-cast:before {
+ content: '\ea56';
+}
+.ti-ce:before {
+ content: '\ed75';
+}
+.ti-certificate:before {
+ content: '\ed76';
+}
+.ti-charging-pile:before {
+ content: '\ee26';
+}
+.ti-chart-arcs:before {
+ content: '\ee28';
+}
+.ti-chart-arcs-3:before {
+ content: '\ee27';
+}
+.ti-chart-area:before {
+ content: '\ea58';
+}
+.ti-chart-area-line:before {
+ content: '\ea57';
+}
+.ti-chart-arrows:before {
+ content: '\ee2a';
+}
+.ti-chart-arrows-vertical:before {
+ content: '\ee29';
+}
+.ti-chart-bar:before {
+ content: '\ea59';
+}
+.ti-chart-bubble:before {
+ content: '\ec75';
+}
+.ti-chart-candle:before {
+ content: '\ea5a';
+}
+.ti-chart-circles:before {
+ content: '\ee2b';
+}
+.ti-chart-donut:before {
+ content: '\ea5b';
+}
+.ti-chart-donut-2:before {
+ content: '\ee2c';
+}
+.ti-chart-donut-3:before {
+ content: '\ee2d';
+}
+.ti-chart-donut-4:before {
+ content: '\ee2e';
+}
+.ti-chart-dots:before {
+ content: '\ee2f';
+}
+.ti-chart-infographic:before {
+ content: '\ee30';
+}
+.ti-chart-line:before {
+ content: '\ea5c';
+}
+.ti-chart-pie:before {
+ content: '\ea5d';
+}
+.ti-chart-pie-2:before {
+ content: '\ee31';
+}
+.ti-chart-pie-3:before {
+ content: '\ee32';
+}
+.ti-chart-pie-4:before {
+ content: '\ee33';
+}
+.ti-chart-radar:before {
+ content: '\ed77';
+}
+.ti-check:before {
+ content: '\ea5e';
+}
+.ti-checkbox:before {
+ content: '\eba6';
+}
+.ti-checks:before {
+ content: '\ebaa';
+}
+.ti-cheese:before {
+ content: '\ef26';
+}
+.ti-chevron-down:before {
+ content: '\ea5f';
+}
+.ti-chevron-down-left:before {
+ content: '\ed09';
+}
+.ti-chevron-down-right:before {
+ content: '\ed0a';
+}
+.ti-chevron-left:before {
+ content: '\ea60';
+}
+.ti-chevron-right:before {
+ content: '\ea61';
+}
+.ti-chevron-up:before {
+ content: '\ea62';
+}
+.ti-chevron-up-left:before {
+ content: '\ed0b';
+}
+.ti-chevron-up-right:before {
+ content: '\ed0c';
+}
+.ti-chevrons-down:before {
+ content: '\ea63';
+}
+.ti-chevrons-down-left:before {
+ content: '\ed0d';
+}
+.ti-chevrons-down-right:before {
+ content: '\ed0e';
+}
+.ti-chevrons-left:before {
+ content: '\ea64';
+}
+.ti-chevrons-right:before {
+ content: '\ea65';
+}
+.ti-chevrons-up:before {
+ content: '\ea66';
+}
+.ti-chevrons-up-left:before {
+ content: '\ed0f';
+}
+.ti-chevrons-up-right:before {
+ content: '\ed10';
+}
+.ti-christmas-tree:before {
+ content: '\ed78';
+}
+.ti-circle:before {
+ content: '\ea6b';
+}
+.ti-circle-0:before {
+ content: '\ee34';
+}
+.ti-circle-1:before {
+ content: '\ee35';
+}
+.ti-circle-2:before {
+ content: '\ee36';
+}
+.ti-circle-3:before {
+ content: '\ee37';
+}
+.ti-circle-4:before {
+ content: '\ee38';
+}
+.ti-circle-5:before {
+ content: '\ee39';
+}
+.ti-circle-6:before {
+ content: '\ee3a';
+}
+.ti-circle-7:before {
+ content: '\ee3b';
+}
+.ti-circle-8:before {
+ content: '\ee3c';
+}
+.ti-circle-9:before {
+ content: '\ee3d';
+}
+.ti-circle-check:before {
+ content: '\ea67';
+}
+.ti-circle-dashed:before {
+ content: '\ed27';
+}
+.ti-circle-dotted:before {
+ content: '\ed28';
+}
+.ti-circle-half:before {
+ content: '\ee3f';
+}
+.ti-circle-half-vertical:before {
+ content: '\ee3e';
+}
+.ti-circle-minus:before {
+ content: '\ea68';
+}
+.ti-circle-off:before {
+ content: '\ee40';
+}
+.ti-circle-plus:before {
+ content: '\ea69';
+}
+.ti-circle-square:before {
+ content: '\ece4';
+}
+.ti-circle-x:before {
+ content: '\ea6a';
+}
+.ti-circles:before {
+ content: '\ece5';
+}
+.ti-clear-all:before {
+ content: '\ee41';
+}
+.ti-clear-formatting:before {
+ content: '\ebe5';
+}
+.ti-click:before {
+ content: '\ebbc';
+}
+.ti-clipboard:before {
+ content: '\ea6f';
+}
+.ti-clipboard-check:before {
+ content: '\ea6c';
+}
+.ti-clipboard-list:before {
+ content: '\ea6d';
+}
+.ti-clipboard-x:before {
+ content: '\ea6e';
+}
+.ti-clock:before {
+ content: '\ea70';
+}
+.ti-cloud:before {
+ content: '\ea76';
+}
+.ti-cloud-download:before {
+ content: '\ea71';
+}
+.ti-cloud-fog:before {
+ content: '\ecd9';
+}
+.ti-cloud-off:before {
+ content: '\ed3e';
+}
+.ti-cloud-rain:before {
+ content: '\ea72';
+}
+.ti-cloud-snow:before {
+ content: '\ea73';
+}
+.ti-cloud-storm:before {
+ content: '\ea74';
+}
+.ti-cloud-upload:before {
+ content: '\ea75';
+}
+.ti-code:before {
+ content: '\ea77';
+}
+.ti-code-minus:before {
+ content: '\ee42';
+}
+.ti-code-plus:before {
+ content: '\ee43';
+}
+.ti-coffee:before {
+ content: '\ef0e';
+}
+.ti-coin:before {
+ content: '\eb82';
+}
+.ti-color-picker:before {
+ content: '\ebe6';
+}
+.ti-color-swatch:before {
+ content: '\eb61';
+}
+.ti-column-insert-left:before {
+ content: '\ee44';
+}
+.ti-column-insert-right:before {
+ content: '\ee45';
+}
+.ti-columns:before {
+ content: '\eb83';
+}
+.ti-comet:before {
+ content: '\ec76';
+}
+.ti-command:before {
+ content: '\ea78';
+}
+.ti-compass:before {
+ content: '\ea79';
+}
+.ti-confetti:before {
+ content: '\ee46';
+}
+.ti-container:before {
+ content: '\ee47';
+}
+.ti-contrast:before {
+ content: '\ec4e';
+}
+.ti-cookie:before {
+ content: '\ef0f';
+}
+.ti-copy:before {
+ content: '\ea7a';
+}
+.ti-copyleft:before {
+ content: '\ec3d';
+}
+.ti-copyright:before {
+ content: '\ea7b';
+}
+.ti-corner-down-left:before {
+ content: '\ea7c';
+}
+.ti-corner-down-left-double:before {
+ content: '\ee48';
+}
+.ti-corner-down-right:before {
+ content: '\ea7d';
+}
+.ti-corner-down-right-double:before {
+ content: '\ee49';
+}
+.ti-corner-left-down:before {
+ content: '\ea7e';
+}
+.ti-corner-left-down-double:before {
+ content: '\ee4a';
+}
+.ti-corner-left-up:before {
+ content: '\ea7f';
+}
+.ti-corner-left-up-double:before {
+ content: '\ee4b';
+}
+.ti-corner-right-down:before {
+ content: '\ea80';
+}
+.ti-corner-right-down-double:before {
+ content: '\ee4c';
+}
+.ti-corner-right-up:before {
+ content: '\ea81';
+}
+.ti-corner-right-up-double:before {
+ content: '\ee4d';
+}
+.ti-corner-up-left:before {
+ content: '\ea82';
+}
+.ti-corner-up-left-double:before {
+ content: '\ee4e';
+}
+.ti-corner-up-right:before {
+ content: '\ea83';
+}
+.ti-corner-up-right-double:before {
+ content: '\ee4f';
+}
+.ti-crane:before {
+ content: '\ef27';
+}
+.ti-credit-card:before {
+ content: '\ea84';
+}
+.ti-credit-card-off:before {
+ content: '\ed11';
+}
+.ti-crop:before {
+ content: '\ea85';
+}
+.ti-crosshair:before {
+ content: '\ec3e';
+}
+.ti-crown:before {
+ content: '\ed12';
+}
+.ti-crown-off:before {
+ content: '\ee50';
+}
+.ti-cup:before {
+ content: '\ef28';
+}
+.ti-curly-loop:before {
+ content: '\ecda';
+}
+.ti-currency-bahraini:before {
+ content: '\ee51';
+}
+.ti-currency-bath:before {
+ content: '\ee52';
+}
+.ti-currency-bitcoin:before {
+ content: '\ebab';
+}
+.ti-currency-cent:before {
+ content: '\ee53';
+}
+.ti-currency-dinar:before {
+ content: '\ee54';
+}
+.ti-currency-dirham:before {
+ content: '\ee55';
+}
+.ti-currency-dollar:before {
+ content: '\eb84';
+}
+.ti-currency-dollar-australian:before {
+ content: '\ee56';
+}
+.ti-currency-dollar-canadian:before {
+ content: '\ee57';
+}
+.ti-currency-dollar-singapore:before {
+ content: '\ee58';
+}
+.ti-currency-ethereum:before {
+ content: '\ee59';
+}
+.ti-currency-euro:before {
+ content: '\eb85';
+}
+.ti-currency-forint:before {
+ content: '\ee5a';
+}
+.ti-currency-frank:before {
+ content: '\ee5b';
+}
+.ti-currency-krone-czech:before {
+ content: '\ee5c';
+}
+.ti-currency-krone-danish:before {
+ content: '\ee5d';
+}
+.ti-currency-krone-swedish:before {
+ content: '\ee5e';
+}
+.ti-currency-leu:before {
+ content: '\ee5f';
+}
+.ti-currency-lira:before {
+ content: '\ee60';
+}
+.ti-currency-litecoin:before {
+ content: '\ee61';
+}
+.ti-currency-naira:before {
+ content: '\ee62';
+}
+.ti-currency-pound:before {
+ content: '\ebac';
+}
+.ti-currency-real:before {
+ content: '\ee63';
+}
+.ti-currency-renminbi:before {
+ content: '\ee64';
+}
+.ti-currency-ripple:before {
+ content: '\ee65';
+}
+.ti-currency-riyal:before {
+ content: '\ee66';
+}
+.ti-currency-rubel:before {
+ content: '\ee67';
+}
+.ti-currency-rupee:before {
+ content: '\ebad';
+}
+.ti-currency-shekel:before {
+ content: '\ee68';
+}
+.ti-currency-taka:before {
+ content: '\ee69';
+}
+.ti-currency-tugrik:before {
+ content: '\ee6a';
+}
+.ti-currency-won:before {
+ content: '\ee6b';
+}
+.ti-currency-yen:before {
+ content: '\ebae';
+}
+.ti-currency-zloty:before {
+ content: '\ee6c';
+}
+.ti-current-location:before {
+ content: '\ecef';
+}
+.ti-cursor-text:before {
+ content: '\ee6d';
+}
+.ti-cut:before {
+ content: '\ea86';
+}
+.ti-dashboard:before {
+ content: '\ea87';
+}
+.ti-database:before {
+ content: '\ea88';
+}
+.ti-database-export:before {
+ content: '\ee6e';
+}
+.ti-database-import:before {
+ content: '\ee6f';
+}
+.ti-database-off:before {
+ content: '\ee70';
+}
+.ti-details:before {
+ content: '\ee71';
+}
+.ti-device-analytics:before {
+ content: '\ee72';
+}
+.ti-device-audio-tape:before {
+ content: '\ee73';
+}
+.ti-device-cctv:before {
+ content: '\ee74';
+}
+.ti-device-computer-camera:before {
+ content: '\ee76';
+}
+.ti-device-computer-camera-off:before {
+ content: '\ee75';
+}
+.ti-device-desktop:before {
+ content: '\ea89';
+}
+.ti-device-desktop-analytics:before {
+ content: '\ee77';
+}
+.ti-device-desktop-off:before {
+ content: '\ee78';
+}
+.ti-device-floppy:before {
+ content: '\eb62';
+}
+.ti-device-gamepad:before {
+ content: '\eb63';
+}
+.ti-device-laptop:before {
+ content: '\eb64';
+}
+.ti-device-mobile:before {
+ content: '\ea8a';
+}
+.ti-device-mobile-message:before {
+ content: '\ee79';
+}
+.ti-device-mobile-rotated:before {
+ content: '\ecdb';
+}
+.ti-device-mobile-vibration:before {
+ content: '\eb86';
+}
+.ti-device-speaker:before {
+ content: '\ea8b';
+}
+.ti-device-tablet:before {
+ content: '\ea8c';
+}
+.ti-device-tv:before {
+ content: '\ea8d';
+}
+.ti-device-watch:before {
+ content: '\ebf9';
+}
+.ti-devices:before {
+ content: '\eb87';
+}
+.ti-devices-2:before {
+ content: '\ed29';
+}
+.ti-devices-pc:before {
+ content: '\ee7a';
+}
+.ti-diamond:before {
+ content: '\eb65';
+}
+.ti-dice:before {
+ content: '\eb66';
+}
+.ti-dimensions:before {
+ content: '\ee7b';
+}
+.ti-direction:before {
+ content: '\ebfb';
+}
+.ti-direction-horizontal:before {
+ content: '\ebfa';
+}
+.ti-directions:before {
+ content: '\ea8e';
+}
+.ti-disabled:before {
+ content: '\ea8f';
+}
+.ti-disabled-2:before {
+ content: '\ebaf';
+}
+.ti-disc:before {
+ content: '\ea90';
+}
+.ti-discount:before {
+ content: '\ebbd';
+}
+.ti-discount-2:before {
+ content: '\ee7c';
+}
+.ti-divide:before {
+ content: '\ed5c';
+}
+.ti-dna:before {
+ content: '\ee7d';
+}
+.ti-dog-bowl:before {
+ content: '\ef29';
+}
+.ti-dots:before {
+ content: '\ea95';
+}
+.ti-dots-circle-horizontal:before {
+ content: '\ea91';
+}
+.ti-dots-diagonal:before {
+ content: '\ea93';
+}
+.ti-dots-diagonal-2:before {
+ content: '\ea92';
+}
+.ti-dots-vertical:before {
+ content: '\ea94';
+}
+.ti-download:before {
+ content: '\ea96';
+}
+.ti-drag-drop:before {
+ content: '\eb89';
+}
+.ti-drag-drop-2:before {
+ content: '\eb88';
+}
+.ti-drone:before {
+ content: '\ed79';
+}
+.ti-drone-off:before {
+ content: '\ee7e';
+}
+.ti-droplet:before {
+ content: '\ea97';
+}
+.ti-droplet-filled:before {
+ content: '\ee80';
+}
+.ti-droplet-filled-2:before {
+ content: '\ee7f';
+}
+.ti-droplet-half:before {
+ content: '\ee82';
+}
+.ti-droplet-half-2:before {
+ content: '\ee81';
+}
+.ti-droplet-off:before {
+ content: '\ee83';
+}
+.ti-ear:before {
+ content: '\ebce';
+}
+.ti-ear-off:before {
+ content: '\ee84';
+}
+.ti-edit:before {
+ content: '\ea98';
+}
+.ti-edit-circle:before {
+ content: '\ee85';
+}
+.ti-egg:before {
+ content: '\eb8a';
+}
+.ti-emphasis:before {
+ content: '\ebcf';
+}
+.ti-equal:before {
+ content: '\ee87';
+}
+.ti-equal-not:before {
+ content: '\ee86';
+}
+.ti-eraser:before {
+ content: '\eb8b';
+}
+.ti-exchange:before {
+ content: '\ebe7';
+}
+.ti-exposure:before {
+ content: '\eb8c';
+}
+.ti-external-link:before {
+ content: '\ea99';
+}
+.ti-eye:before {
+ content: '\ea9a';
+}
+.ti-eye-check:before {
+ content: '\ee88';
+}
+.ti-eye-off:before {
+ content: '\ecf0';
+}
+.ti-eyeglass:before {
+ content: '\ee8a';
+}
+.ti-eyeglass-2:before {
+ content: '\ee89';
+}
+.ti-face-id:before {
+ content: '\ea9b';
+}
+.ti-fall:before {
+ content: '\ecb9';
+}
+.ti-feather:before {
+ content: '\ee8b';
+}
+.ti-fence:before {
+ content: '\ef2a';
+}
+.ti-file:before {
+ content: '\eaa4';
+}
+.ti-file-alert:before {
+ content: '\ede6';
+}
+.ti-file-analytics:before {
+ content: '\ede7';
+}
+.ti-file-certificate:before {
+ content: '\ed4d';
+}
+.ti-file-check:before {
+ content: '\ea9c';
+}
+.ti-file-code:before {
+ content: '\ebd0';
+}
+.ti-file-code-2:before {
+ content: '\ede8';
+}
+.ti-file-diff:before {
+ content: '\ecf1';
+}
+.ti-file-dislike:before {
+ content: '\ed2a';
+}
+.ti-file-download:before {
+ content: '\ea9d';
+}
+.ti-file-export:before {
+ content: '\ede9';
+}
+.ti-file-horizontal:before {
+ content: '\ebb0';
+}
+.ti-file-import:before {
+ content: '\edea';
+}
+.ti-file-info:before {
+ content: '\edec';
+}
+.ti-file-invoice:before {
+ content: '\eb67';
+}
+.ti-file-like:before {
+ content: '\ed2b';
+}
+.ti-file-minus:before {
+ content: '\ea9e';
+}
+.ti-file-music:before {
+ content: '\ea9f';
+}
+.ti-file-off:before {
+ content: '\ecf2';
+}
+.ti-file-phone:before {
+ content: '\ecdc';
+}
+.ti-file-plus:before {
+ content: '\eaa0';
+}
+.ti-file-report:before {
+ content: '\eded';
+}
+.ti-file-search:before {
+ content: '\ed5d';
+}
+.ti-file-shredder:before {
+ content: '\eaa1';
+}
+.ti-file-symlink:before {
+ content: '\ed53';
+}
+.ti-file-text:before {
+ content: '\eaa2';
+}
+.ti-file-upload:before {
+ content: '\ec91';
+}
+.ti-file-x:before {
+ content: '\eaa3';
+}
+.ti-file-zip:before {
+ content: '\ed4e';
+}
+.ti-files:before {
+ content: '\edef';
+}
+.ti-files-off:before {
+ content: '\edee';
+}
+.ti-filter:before {
+ content: '\eaa5';
+}
+.ti-filter-off:before {
+ content: '\ed2c';
+}
+.ti-fingerprint:before {
+ content: '\ebd1';
+}
+.ti-firetruck:before {
+ content: '\ebe8';
+}
+.ti-fish:before {
+ content: '\ef2b';
+}
+.ti-flag:before {
+ content: '\eaa6';
+}
+.ti-flag-2:before {
+ content: '\ee8c';
+}
+.ti-flag-3:before {
+ content: '\ee8d';
+}
+.ti-flame:before {
+ content: '\ec2c';
+}
+.ti-flare:before {
+ content: '\ee8e';
+}
+.ti-flask:before {
+ content: '\ebd2';
+}
+.ti-flip-horizontal:before {
+ content: '\eaa7';
+}
+.ti-flip-vertical:before {
+ content: '\eaa8';
+}
+.ti-float-center:before {
+ content: '\ebb1';
+}
+.ti-float-left:before {
+ content: '\ebb2';
+}
+.ti-float-none:before {
+ content: '\ed13';
+}
+.ti-float-right:before {
+ content: '\ebb3';
+}
+.ti-focus:before {
+ content: '\eb8d';
+}
+.ti-focus-2:before {
+ content: '\ebd3';
+}
+.ti-fold:before {
+ content: '\ed56';
+}
+.ti-fold-down:before {
+ content: '\ed54';
+}
+.ti-fold-up:before {
+ content: '\ed55';
+}
+.ti-folder:before {
+ content: '\eaad';
+}
+.ti-folder-minus:before {
+ content: '\eaaa';
+}
+.ti-folder-off:before {
+ content: '\ed14';
+}
+.ti-folder-plus:before {
+ content: '\eaab';
+}
+.ti-folder-x:before {
+ content: '\eaac';
+}
+.ti-folders:before {
+ content: '\eaae';
+}
+.ti-forbid:before {
+ content: '\ebd5';
+}
+.ti-forbid-2:before {
+ content: '\ebd4';
+}
+.ti-forklift:before {
+ content: '\ebe9';
+}
+.ti-forms:before {
+ content: '\ee8f';
+}
+.ti-frame:before {
+ content: '\eaaf';
+}
+.ti-friends:before {
+ content: '\eab0';
+}
+.ti-gas-station:before {
+ content: '\ec7d';
+}
+.ti-gauge:before {
+ content: '\eab1';
+}
+.ti-geometry:before {
+ content: '\ee90';
+}
+.ti-ghost:before {
+ content: '\eb8e';
+}
+.ti-gift:before {
+ content: '\eb68';
+}
+.ti-git-branch:before {
+ content: '\eab2';
+}
+.ti-git-commit:before {
+ content: '\eab3';
+}
+.ti-git-compare:before {
+ content: '\eab4';
+}
+.ti-git-fork:before {
+ content: '\eb8f';
+}
+.ti-git-merge:before {
+ content: '\eab5';
+}
+.ti-git-pull-request:before {
+ content: '\eab6';
+}
+.ti-glass:before {
+ content: '\eab8';
+}
+.ti-glass-full:before {
+ content: '\eab7';
+}
+.ti-glass-off:before {
+ content: '\ee91';
+}
+.ti-globe:before {
+ content: '\eab9';
+}
+.ti-golf:before {
+ content: '\ed8c';
+}
+.ti-gps:before {
+ content: '\ed7a';
+}
+.ti-grain:before {
+ content: '\ee92';
+}
+.ti-grid-dots:before {
+ content: '\eaba';
+}
+.ti-grip-horizontal:before {
+ content: '\ec00';
+}
+.ti-grip-vertical:before {
+ content: '\ec01';
+}
+.ti-growth:before {
+ content: '\ee93';
+}
+.ti-h-1:before {
+ content: '\ec94';
+}
+.ti-h-2:before {
+ content: '\ec95';
+}
+.ti-h-3:before {
+ content: '\ec96';
+}
+.ti-h-4:before {
+ content: '\ec97';
+}
+.ti-h-5:before {
+ content: '\ec98';
+}
+.ti-h-6:before {
+ content: '\ec99';
+}
+.ti-hand-finger:before {
+ content: '\ee94';
+}
+.ti-hand-little-finger:before {
+ content: '\ee95';
+}
+.ti-hand-middle-finger:before {
+ content: '\ec2d';
+}
+.ti-hand-off:before {
+ content: '\ed15';
+}
+.ti-hand-ring-finger:before {
+ content: '\ee96';
+}
+.ti-hand-rock:before {
+ content: '\ee97';
+}
+.ti-hand-stop:before {
+ content: '\ec2e';
+}
+.ti-hand-three-fingers:before {
+ content: '\ee98';
+}
+.ti-hand-two-fingers:before {
+ content: '\ee99';
+}
+.ti-hanger:before {
+ content: '\ee9a';
+}
+.ti-hash:before {
+ content: '\eabc';
+}
+.ti-heading:before {
+ content: '\ee9b';
+}
+.ti-headphones:before {
+ content: '\eabd';
+}
+.ti-headphones-off:before {
+ content: '\ed1d';
+}
+.ti-headset:before {
+ content: '\eb90';
+}
+.ti-heart:before {
+ content: '\eabe';
+}
+.ti-heart-broken:before {
+ content: '\ecba';
+}
+.ti-helicopter:before {
+ content: '\ed8e';
+}
+.ti-helicopter-landing:before {
+ content: '\ed8d';
+}
+.ti-help:before {
+ content: '\eabf';
+}
+.ti-hexagon:before {
+ content: '\ec02';
+}
+.ti-hexagon-off:before {
+ content: '\ee9c';
+}
+.ti-hierarchy:before {
+ content: '\ee9e';
+}
+.ti-hierarchy-2:before {
+ content: '\ee9d';
+}
+.ti-history:before {
+ content: '\ebea';
+}
+.ti-home:before {
+ content: '\eac1';
+}
+.ti-home-2:before {
+ content: '\eac0';
+}
+.ti-ice-cream:before {
+ content: '\eac2';
+}
+.ti-ice-cream-2:before {
+ content: '\ee9f';
+}
+.ti-id:before {
+ content: '\eac3';
+}
+.ti-inbox:before {
+ content: '\eac4';
+}
+.ti-indent-decrease:before {
+ content: '\eb91';
+}
+.ti-indent-increase:before {
+ content: '\eb92';
+}
+.ti-infinity:before {
+ content: '\eb69';
+}
+.ti-info-circle:before {
+ content: '\eac5';
+}
+.ti-info-square:before {
+ content: '\eac6';
+}
+.ti-italic:before {
+ content: '\eb93';
+}
+.ti-jump-rope:before {
+ content: '\ed8f';
+}
+.ti-karate:before {
+ content: '\ed32';
+}
+.ti-key:before {
+ content: '\eac7';
+}
+.ti-keyboard:before {
+ content: '\ebd6';
+}
+.ti-keyboard-hide:before {
+ content: '\ec7e';
+}
+.ti-keyboard-off:before {
+ content: '\eea0';
+}
+.ti-keyboard-show:before {
+ content: '\ec7f';
+}
+.ti-language:before {
+ content: '\ebbe';
+}
+.ti-layers-difference:before {
+ content: '\eac8';
+}
+.ti-layers-intersect:before {
+ content: '\eac9';
+}
+.ti-layers-linked:before {
+ content: '\eea1';
+}
+.ti-layers-subtract:before {
+ content: '\eaca';
+}
+.ti-layers-union:before {
+ content: '\eacb';
+}
+.ti-layout:before {
+ content: '\eadb';
+}
+.ti-layout-2:before {
+ content: '\eacc';
+}
+.ti-layout-align-bottom:before {
+ content: '\eacd';
+}
+.ti-layout-align-center:before {
+ content: '\eace';
+}
+.ti-layout-align-left:before {
+ content: '\eacf';
+}
+.ti-layout-align-middle:before {
+ content: '\ead0';
+}
+.ti-layout-align-right:before {
+ content: '\ead1';
+}
+.ti-layout-align-top:before {
+ content: '\ead2';
+}
+.ti-layout-bottombar:before {
+ content: '\ead3';
+}
+.ti-layout-cards:before {
+ content: '\ec13';
+}
+.ti-layout-columns:before {
+ content: '\ead4';
+}
+.ti-layout-distribute-horizontal:before {
+ content: '\ead5';
+}
+.ti-layout-distribute-vertical:before {
+ content: '\ead6';
+}
+.ti-layout-grid:before {
+ content: '\edba';
+}
+.ti-layout-grid-add:before {
+ content: '\edb9';
+}
+.ti-layout-kanban:before {
+ content: '\ec3f';
+}
+.ti-layout-list:before {
+ content: '\ec14';
+}
+.ti-layout-navbar:before {
+ content: '\ead7';
+}
+.ti-layout-rows:before {
+ content: '\ead8';
+}
+.ti-layout-sidebar:before {
+ content: '\eada';
+}
+.ti-layout-sidebar-right:before {
+ content: '\ead9';
+}
+.ti-leaf:before {
+ content: '\ed4f';
+}
+.ti-lego:before {
+ content: '\eadc';
+}
+.ti-lemon:before {
+ content: '\ef10';
+}
+.ti-letter-a:before {
+ content: '\ec50';
+}
+.ti-letter-b:before {
+ content: '\ec51';
+}
+.ti-letter-c:before {
+ content: '\ec52';
+}
+.ti-letter-case:before {
+ content: '\eea5';
+}
+.ti-letter-case-lower:before {
+ content: '\eea2';
+}
+.ti-letter-case-toggle:before {
+ content: '\eea3';
+}
+.ti-letter-case-upper:before {
+ content: '\eea4';
+}
+.ti-letter-d:before {
+ content: '\ec53';
+}
+.ti-letter-e:before {
+ content: '\ec54';
+}
+.ti-letter-f:before {
+ content: '\ec55';
+}
+.ti-letter-g:before {
+ content: '\ec56';
+}
+.ti-letter-h:before {
+ content: '\ec57';
+}
+.ti-letter-i:before {
+ content: '\ec58';
+}
+.ti-letter-j:before {
+ content: '\ec59';
+}
+.ti-letter-k:before {
+ content: '\ec5a';
+}
+.ti-letter-l:before {
+ content: '\ec5b';
+}
+.ti-letter-m:before {
+ content: '\ec5c';
+}
+.ti-letter-n:before {
+ content: '\ec5d';
+}
+.ti-letter-o:before {
+ content: '\ec5e';
+}
+.ti-letter-p:before {
+ content: '\ec5f';
+}
+.ti-letter-q:before {
+ content: '\ec60';
+}
+.ti-letter-r:before {
+ content: '\ec61';
+}
+.ti-letter-s:before {
+ content: '\ec62';
+}
+.ti-letter-spacing:before {
+ content: '\eea6';
+}
+.ti-letter-t:before {
+ content: '\ec63';
+}
+.ti-letter-u:before {
+ content: '\ec64';
+}
+.ti-letter-v:before {
+ content: '\ec65';
+}
+.ti-letter-w:before {
+ content: '\ec66';
+}
+.ti-letter-x:before {
+ content: '\ec67';
+}
+.ti-letter-y:before {
+ content: '\ec68';
+}
+.ti-letter-z:before {
+ content: '\ec69';
+}
+.ti-letters-case:before {
+ content: '\ec6a';
+}
+.ti-license:before {
+ content: '\ebc0';
+}
+.ti-lifebuoy:before {
+ content: '\eadd';
+}
+.ti-line:before {
+ content: '\ec40';
+}
+.ti-line-dashed:before {
+ content: '\eea7';
+}
+.ti-line-dotted:before {
+ content: '\eea8';
+}
+.ti-line-height:before {
+ content: '\eb94';
+}
+.ti-link:before {
+ content: '\eade';
+}
+.ti-list:before {
+ content: '\eb6b';
+}
+.ti-list-check:before {
+ content: '\eb6a';
+}
+.ti-list-numbers:before {
+ content: '\ef11';
+}
+.ti-list-search:before {
+ content: '\eea9';
+}
+.ti-live-photo:before {
+ content: '\eadf';
+}
+.ti-live-view:before {
+ content: '\ec6b';
+}
+.ti-loader:before {
+ content: '\eca3';
+}
+.ti-loader-quarter:before {
+ content: '\eca2';
+}
+.ti-location:before {
+ content: '\eae0';
+}
+.ti-lock:before {
+ content: '\eae2';
+}
+.ti-lock-access:before {
+ content: '\eeaa';
+}
+.ti-lock-off:before {
+ content: '\ed1e';
+}
+.ti-lock-open:before {
+ content: '\eae1';
+}
+.ti-login:before {
+ content: '\eba7';
+}
+.ti-logout:before {
+ content: '\eba8';
+}
+.ti-macro:before {
+ content: '\eeab';
+}
+.ti-magnet:before {
+ content: '\eae3';
+}
+.ti-mail:before {
+ content: '\eae5';
+}
+.ti-mail-forward:before {
+ content: '\eeac';
+}
+.ti-mail-opened:before {
+ content: '\eae4';
+}
+.ti-mailbox:before {
+ content: '\eead';
+}
+.ti-man:before {
+ content: '\eae6';
+}
+.ti-manual-gearbox:before {
+ content: '\ed7b';
+}
+.ti-map:before {
+ content: '\eae9';
+}
+.ti-map-2:before {
+ content: '\eae7';
+}
+.ti-map-pin:before {
+ content: '\eae8';
+}
+.ti-map-pin-off:before {
+ content: '\ecf3';
+}
+.ti-map-pins:before {
+ content: '\ed5e';
+}
+.ti-markdown:before {
+ content: '\ec41';
+}
+.ti-marquee:before {
+ content: '\ec77';
+}
+.ti-marquee-2:before {
+ content: '\eeae';
+}
+.ti-mars:before {
+ content: '\ec80';
+}
+.ti-mask:before {
+ content: '\eeb0';
+}
+.ti-mask-off:before {
+ content: '\eeaf';
+}
+.ti-massage:before {
+ content: '\eeb1';
+}
+.ti-math:before {
+ content: '\ebeb';
+}
+.ti-math-function:before {
+ content: '\eeb2';
+}
+.ti-math-symbols:before {
+ content: '\eeb3';
+}
+.ti-maximize:before {
+ content: '\eaea';
+}
+.ti-meat:before {
+ content: '\ef12';
+}
+.ti-medal:before {
+ content: '\ec78';
+}
+.ti-medical-cross:before {
+ content: '\ec2f';
+}
+.ti-menu:before {
+ content: '\eaeb';
+}
+.ti-menu-2:before {
+ content: '\ec42';
+}
+.ti-message:before {
+ content: '\eaef';
+}
+.ti-message-2:before {
+ content: '\eaec';
+}
+.ti-message-circle:before {
+ content: '\eaed';
+}
+.ti-message-circle-2:before {
+ content: '\ed3f';
+}
+.ti-message-circle-off:before {
+ content: '\ed40';
+}
+.ti-message-dots:before {
+ content: '\eaee';
+}
+.ti-message-off:before {
+ content: '\ed41';
+}
+.ti-message-plus:before {
+ content: '\ec9a';
+}
+.ti-message-report:before {
+ content: '\ec9b';
+}
+.ti-messages:before {
+ content: '\eb6c';
+}
+.ti-messages-off:before {
+ content: '\ed42';
+}
+.ti-microphone:before {
+ content: '\eaf0';
+}
+.ti-microphone-2:before {
+ content: '\ef2c';
+}
+.ti-microphone-off:before {
+ content: '\ed16';
+}
+.ti-milk:before {
+ content: '\ef13';
+}
+.ti-minimize:before {
+ content: '\eaf1';
+}
+.ti-minus:before {
+ content: '\eaf2';
+}
+.ti-minus-vertical:before {
+ content: '\eeb4';
+}
+.ti-mist:before {
+ content: '\ec30';
+}
+.ti-mood-boy:before {
+ content: '\ed2d';
+}
+.ti-mood-confuzed:before {
+ content: '\eaf3';
+}
+.ti-mood-crazy-happy:before {
+ content: '\ed90';
+}
+.ti-mood-cry:before {
+ content: '\ecbb';
+}
+.ti-mood-empty:before {
+ content: '\eeb5';
+}
+.ti-mood-happy:before {
+ content: '\eaf4';
+}
+.ti-mood-kid:before {
+ content: '\ec03';
+}
+.ti-mood-neutral:before {
+ content: '\eaf5';
+}
+.ti-mood-sad:before {
+ content: '\eaf6';
+}
+.ti-mood-smile:before {
+ content: '\eaf7';
+}
+.ti-mood-suprised:before {
+ content: '\ec04';
+}
+.ti-mood-tongue:before {
+ content: '\eb95';
+}
+.ti-moon:before {
+ content: '\eaf8';
+}
+.ti-moon-2:before {
+ content: '\ece6';
+}
+.ti-moon-stars:before {
+ content: '\ece7';
+}
+.ti-moped:before {
+ content: '\ecbc';
+}
+.ti-motorbike:before {
+ content: '\eeb6';
+}
+.ti-mouse:before {
+ content: '\eaf9';
+}
+.ti-movie:before {
+ content: '\eafa';
+}
+.ti-mug:before {
+ content: '\eafb';
+}
+.ti-mushroom:before {
+ content: '\ef14';
+}
+.ti-music:before {
+ content: '\eafc';
+}
+.ti-new-section:before {
+ content: '\ebc1';
+}
+.ti-news:before {
+ content: '\eafd';
+}
+.ti-nfc:before {
+ content: '\eeb7';
+}
+.ti-note:before {
+ content: '\eb6d';
+}
+.ti-notebook:before {
+ content: '\eb96';
+}
+.ti-notes:before {
+ content: '\eb6e';
+}
+.ti-notification:before {
+ content: '\eafe';
+}
+.ti-number-0:before {
+ content: '\edf0';
+}
+.ti-number-1:before {
+ content: '\edf1';
+}
+.ti-number-2:before {
+ content: '\edf2';
+}
+.ti-number-3:before {
+ content: '\edf3';
+}
+.ti-number-4:before {
+ content: '\edf4';
+}
+.ti-number-5:before {
+ content: '\edf5';
+}
+.ti-number-6:before {
+ content: '\edf6';
+}
+.ti-number-7:before {
+ content: '\edf7';
+}
+.ti-number-8:before {
+ content: '\edf8';
+}
+.ti-number-9:before {
+ content: '\edf9';
+}
+.ti-octagon:before {
+ content: '\ecbd';
+}
+.ti-octagon-off:before {
+ content: '\eeb8';
+}
+.ti-old:before {
+ content: '\eeb9';
+}
+.ti-olympics:before {
+ content: '\eeba';
+}
+.ti-omega:before {
+ content: '\eb97';
+}
+.ti-outlet:before {
+ content: '\ebd7';
+}
+.ti-overline:before {
+ content: '\eebb';
+}
+.ti-package:before {
+ content: '\eaff';
+}
+.ti-pacman:before {
+ content: '\eebc';
+}
+.ti-page-break:before {
+ content: '\ec81';
+}
+.ti-paint:before {
+ content: '\eb00';
+}
+.ti-palette:before {
+ content: '\eb01';
+}
+.ti-panorama-horizontal:before {
+ content: '\ed33';
+}
+.ti-panorama-vertical:before {
+ content: '\ed34';
+}
+.ti-paperclip:before {
+ content: '\eb02';
+}
+.ti-parachute:before {
+ content: '\ed7c';
+}
+.ti-parentheses:before {
+ content: '\ebd8';
+}
+.ti-parking:before {
+ content: '\eb03';
+}
+.ti-peace:before {
+ content: '\ecbe';
+}
+.ti-pencil:before {
+ content: '\eb04';
+}
+.ti-pennant:before {
+ content: '\ed7d';
+}
+.ti-pepper:before {
+ content: '\ef15';
+}
+.ti-percentage:before {
+ content: '\ecf4';
+}
+.ti-perspective:before {
+ content: '\eebd';
+}
+.ti-phone:before {
+ content: '\eb09';
+}
+.ti-phone-call:before {
+ content: '\eb05';
+}
+.ti-phone-calling:before {
+ content: '\ec43';
+}
+.ti-phone-check:before {
+ content: '\ec05';
+}
+.ti-phone-incoming:before {
+ content: '\eb06';
+}
+.ti-phone-off:before {
+ content: '\ecf5';
+}
+.ti-phone-outgoing:before {
+ content: '\eb07';
+}
+.ti-phone-pause:before {
+ content: '\eb08';
+}
+.ti-phone-plus:before {
+ content: '\ec06';
+}
+.ti-phone-x:before {
+ content: '\ec07';
+}
+.ti-photo:before {
+ content: '\eb0a';
+}
+.ti-photo-off:before {
+ content: '\ecf6';
+}
+.ti-physotherapist:before {
+ content: '\eebe';
+}
+.ti-picture-in-picture:before {
+ content: '\ed35';
+}
+.ti-picture-in-picture-off:before {
+ content: '\ed43';
+}
+.ti-picture-in-picture-on:before {
+ content: '\ed44';
+}
+.ti-pill:before {
+ content: '\ec44';
+}
+.ti-pin:before {
+ content: '\ec9c';
+}
+.ti-pinned:before {
+ content: '\ed60';
+}
+.ti-pinned-off:before {
+ content: '\ed5f';
+}
+.ti-pizza:before {
+ content: '\edbb';
+}
+.ti-plane:before {
+ content: '\eb6f';
+}
+.ti-plane-arrival:before {
+ content: '\eb99';
+}
+.ti-plane-departure:before {
+ content: '\eb9a';
+}
+.ti-planet:before {
+ content: '\ec08';
+}
+.ti-plant:before {
+ content: '\ed50';
+}
+.ti-plant-2:before {
+ content: '\ed7e';
+}
+.ti-play-card:before {
+ content: '\eebf';
+}
+.ti-player-pause:before {
+ content: '\ed45';
+}
+.ti-player-play:before {
+ content: '\ed46';
+}
+.ti-player-record:before {
+ content: '\ed47';
+}
+.ti-player-skip-back:before {
+ content: '\ed48';
+}
+.ti-player-skip-forward:before {
+ content: '\ed49';
+}
+.ti-player-stop:before {
+ content: '\ed4a';
+}
+.ti-player-track-next:before {
+ content: '\ed4b';
+}
+.ti-player-track-prev:before {
+ content: '\ed4c';
+}
+.ti-playlist:before {
+ content: '\eec0';
+}
+.ti-plug:before {
+ content: '\ebd9';
+}
+.ti-plus:before {
+ content: '\eb0b';
+}
+.ti-point:before {
+ content: '\eb0c';
+}
+.ti-pokeball:before {
+ content: '\eec1';
+}
+.ti-polaroid:before {
+ content: '\eec2';
+}
+.ti-pool:before {
+ content: '\ed91';
+}
+.ti-power:before {
+ content: '\eb0d';
+}
+.ti-pray:before {
+ content: '\ecbf';
+}
+.ti-presentation:before {
+ content: '\eb70';
+}
+.ti-presentation-analytics:before {
+ content: '\eec3';
+}
+.ti-printer:before {
+ content: '\eb0e';
+}
+.ti-prompt:before {
+ content: '\eb0f';
+}
+.ti-propeller:before {
+ content: '\eec4';
+}
+.ti-puzzle:before {
+ content: '\eb10';
+}
+.ti-pyramid:before {
+ content: '\eec5';
+}
+.ti-qrcode:before {
+ content: '\eb11';
+}
+.ti-question-mark:before {
+ content: '\ec9d';
+}
+.ti-radio:before {
+ content: '\ef2d';
+}
+.ti-radioactive:before {
+ content: '\ecc0';
+}
+.ti-radius-bottom-left:before {
+ content: '\eec6';
+}
+.ti-radius-bottom-right:before {
+ content: '\eec7';
+}
+.ti-radius-top-left:before {
+ content: '\eec8';
+}
+.ti-radius-top-right:before {
+ content: '\eec9';
+}
+.ti-rainbow:before {
+ content: '\edbc';
+}
+.ti-receipt:before {
+ content: '\edfd';
+}
+.ti-receipt-2:before {
+ content: '\edfa';
+}
+.ti-receipt-off:before {
+ content: '\edfb';
+}
+.ti-receipt-refund:before {
+ content: '\edfc';
+}
+.ti-receipt-tax:before {
+ content: '\edbd';
+}
+.ti-recharging:before {
+ content: '\eeca';
+}
+.ti-record-mail:before {
+ content: '\eb12';
+}
+.ti-rectangle:before {
+ content: '\ed37';
+}
+.ti-rectangle-vertical:before {
+ content: '\ed36';
+}
+.ti-recycle:before {
+ content: '\eb9b';
+}
+.ti-refresh:before {
+ content: '\eb13';
+}
+.ti-refresh-alert:before {
+ content: '\ed57';
+}
+.ti-registered:before {
+ content: '\eb14';
+}
+.ti-relation-many-to-many:before {
+ content: '\ed7f';
+}
+.ti-relation-one-to-many:before {
+ content: '\ed80';
+}
+.ti-relation-one-to-one:before {
+ content: '\ed81';
+}
+.ti-repeat:before {
+ content: '\eb72';
+}
+.ti-repeat-once:before {
+ content: '\eb71';
+}
+.ti-replace:before {
+ content: '\ebc7';
+}
+.ti-report:before {
+ content: '\eece';
+}
+.ti-report-analytics:before {
+ content: '\eecb';
+}
+.ti-report-medical:before {
+ content: '\eecc';
+}
+.ti-report-money:before {
+ content: '\eecd';
+}
+.ti-resize:before {
+ content: '\eecf';
+}
+.ti-ripple:before {
+ content: '\ed82';
+}
+.ti-road-sign:before {
+ content: '\ecdd';
+}
+.ti-rocket:before {
+ content: '\ec45';
+}
+.ti-rotate:before {
+ content: '\eb16';
+}
+.ti-rotate-2:before {
+ content: '\ebb4';
+}
+.ti-rotate-clockwise:before {
+ content: '\eb15';
+}
+.ti-rotate-clockwise-2:before {
+ content: '\ebb5';
+}
+.ti-rotate-rectangle:before {
+ content: '\ec15';
+}
+.ti-route:before {
+ content: '\eb17';
+}
+.ti-router:before {
+ content: '\eb18';
+}
+.ti-row-insert-bottom:before {
+ content: '\eed0';
+}
+.ti-row-insert-top:before {
+ content: '\eed1';
+}
+.ti-rss:before {
+ content: '\eb19';
+}
+.ti-ruler:before {
+ content: '\eb1a';
+}
+.ti-ruler-2:before {
+ content: '\eed2';
+}
+.ti-run:before {
+ content: '\ec82';
+}
+.ti-sailboat:before {
+ content: '\ec83';
+}
+.ti-salt:before {
+ content: '\ef16';
+}
+.ti-satellite:before {
+ content: '\eed3';
+}
+.ti-sausage:before {
+ content: '\ef17';
+}
+.ti-scale:before {
+ content: '\ebc2';
+}
+.ti-scan:before {
+ content: '\ebc8';
+}
+.ti-school:before {
+ content: '\ecf7';
+}
+.ti-scissors:before {
+ content: '\eb1b';
+}
+.ti-scooter:before {
+ content: '\ec6c';
+}
+.ti-scooter-electric:before {
+ content: '\ecc1';
+}
+.ti-screen-share:before {
+ content: '\ed18';
+}
+.ti-screen-share-off:before {
+ content: '\ed17';
+}
+.ti-scuba-mask:before {
+ content: '\eed4';
+}
+.ti-search:before {
+ content: '\eb1c';
+}
+.ti-section:before {
+ content: '\eed5';
+}
+.ti-seeding:before {
+ content: '\ed51';
+}
+.ti-select:before {
+ content: '\ec9e';
+}
+.ti-selector:before {
+ content: '\eb1d';
+}
+.ti-send:before {
+ content: '\eb1e';
+}
+.ti-separator:before {
+ content: '\ebda';
+}
+.ti-separator-horizontal:before {
+ content: '\ec79';
+}
+.ti-separator-vertical:before {
+ content: '\ec7a';
+}
+.ti-server:before {
+ content: '\eb1f';
+}
+.ti-servicemark:before {
+ content: '\ec09';
+}
+.ti-settings:before {
+ content: '\eb20';
+}
+.ti-settings-automation:before {
+ content: '\eed6';
+}
+.ti-shadow:before {
+ content: '\eed8';
+}
+.ti-shadow-off:before {
+ content: '\eed7';
+}
+.ti-shape:before {
+ content: '\eb9c';
+}
+.ti-shape-2:before {
+ content: '\eed9';
+}
+.ti-shape-3:before {
+ content: '\eeda';
+}
+.ti-share:before {
+ content: '\eb21';
+}
+.ti-shield:before {
+ content: '\eb24';
+}
+.ti-shield-check:before {
+ content: '\eb22';
+}
+.ti-shield-lock:before {
+ content: '\ed58';
+}
+.ti-shield-off:before {
+ content: '\ecf8';
+}
+.ti-shield-x:before {
+ content: '\eb23';
+}
+.ti-ship:before {
+ content: '\ec84';
+}
+.ti-shirt:before {
+ content: '\ec0a';
+}
+.ti-shopping-cart:before {
+ content: '\eb25';
+}
+.ti-shopping-cart-discount:before {
+ content: '\eedb';
+}
+.ti-shopping-cart-off:before {
+ content: '\eedc';
+}
+.ti-shopping-cart-plus:before {
+ content: '\eedd';
+}
+.ti-shopping-cart-x:before {
+ content: '\eede';
+}
+.ti-shredder:before {
+ content: '\eedf';
+}
+.ti-signature:before {
+ content: '\eee0';
+}
+.ti-sitemap:before {
+ content: '\eb9d';
+}
+.ti-skateboard:before {
+ content: '\ecc2';
+}
+.ti-slice:before {
+ content: '\ebdb';
+}
+.ti-slideshow:before {
+ content: '\ebc9';
+}
+.ti-smart-home:before {
+ content: '\ecde';
+}
+.ti-smoking:before {
+ content: '\ecc4';
+}
+.ti-smoking-no:before {
+ content: '\ecc3';
+}
+.ti-snowflake:before {
+ content: '\ec0b';
+}
+.ti-soccer-field:before {
+ content: '\ed92';
+}
+.ti-social:before {
+ content: '\ebec';
+}
+.ti-sock:before {
+ content: '\eee1';
+}
+.ti-sort-ascending:before {
+ content: '\eb26';
+}
+.ti-sort-ascending-2:before {
+ content: '\eee2';
+}
+.ti-sort-ascending-letters:before {
+ content: '\ef18';
+}
+.ti-sort-ascending-numbers:before {
+ content: '\ef19';
+}
+.ti-sort-descending:before {
+ content: '\eb27';
+}
+.ti-sort-descending-2:before {
+ content: '\eee3';
+}
+.ti-sort-descending-letters:before {
+ content: '\ef1a';
+}
+.ti-sort-descending-numbers:before {
+ content: '\ef1b';
+}
+.ti-soup:before {
+ content: '\ef2e';
+}
+.ti-space:before {
+ content: '\ec0c';
+}
+.ti-speakerphone:before {
+ content: '\ed61';
+}
+.ti-speedboat:before {
+ content: '\ed93';
+}
+.ti-sport-billard:before {
+ content: '\eee4';
+}
+.ti-square:before {
+ content: '\eb2c';
+}
+.ti-square-0:before {
+ content: '\eee5';
+}
+.ti-square-1:before {
+ content: '\eee6';
+}
+.ti-square-2:before {
+ content: '\eee7';
+}
+.ti-square-3:before {
+ content: '\eee8';
+}
+.ti-square-4:before {
+ content: '\eee9';
+}
+.ti-square-5:before {
+ content: '\eeea';
+}
+.ti-square-6:before {
+ content: '\eeeb';
+}
+.ti-square-7:before {
+ content: '\eeec';
+}
+.ti-square-8:before {
+ content: '\eeed';
+}
+.ti-square-9:before {
+ content: '\eeee';
+}
+.ti-square-check:before {
+ content: '\eb28';
+}
+.ti-square-dot:before {
+ content: '\ed59';
+}
+.ti-square-forbid:before {
+ content: '\ed5b';
+}
+.ti-square-forbid-2:before {
+ content: '\ed5a';
+}
+.ti-square-minus:before {
+ content: '\eb29';
+}
+.ti-square-off:before {
+ content: '\eeef';
+}
+.ti-square-plus:before {
+ content: '\eb2a';
+}
+.ti-square-root:before {
+ content: '\eef1';
+}
+.ti-square-root-2:before {
+ content: '\eef0';
+}
+.ti-square-rotated:before {
+ content: '\ecdf';
+}
+.ti-square-rotated-off:before {
+ content: '\eef2';
+}
+.ti-square-toggle:before {
+ content: '\eef4';
+}
+.ti-square-toggle-horizontal:before {
+ content: '\eef3';
+}
+.ti-square-x:before {
+ content: '\eb2b';
+}
+.ti-squares-diagonal:before {
+ content: '\eef5';
+}
+.ti-squares-filled:before {
+ content: '\eef6';
+}
+.ti-stack:before {
+ content: '\eb2d';
+}
+.ti-stack-2:before {
+ content: '\eef7';
+}
+.ti-stairs:before {
+ content: '\eca6';
+}
+.ti-stairs-down:before {
+ content: '\eca4';
+}
+.ti-stairs-up:before {
+ content: '\eca5';
+}
+.ti-star:before {
+ content: '\eb2e';
+}
+.ti-star-half:before {
+ content: '\ed19';
+}
+.ti-star-off:before {
+ content: '\ed62';
+}
+.ti-stars:before {
+ content: '\ed38';
+}
+.ti-steering-wheel:before {
+ content: '\ec7b';
+}
+.ti-step-into:before {
+ content: '\ece0';
+}
+.ti-step-out:before {
+ content: '\ece1';
+}
+.ti-stethoscope:before {
+ content: '\edbe';
+}
+.ti-sticker:before {
+ content: '\eb2f';
+}
+.ti-strikethrough:before {
+ content: '\eb9e';
+}
+.ti-submarine:before {
+ content: '\ed94';
+}
+.ti-subscript:before {
+ content: '\eb9f';
+}
+.ti-subtask:before {
+ content: '\ec9f';
+}
+.ti-sum:before {
+ content: '\eb73';
+}
+.ti-sun:before {
+ content: '\eb30';
+}
+.ti-sun-off:before {
+ content: '\ed63';
+}
+.ti-sunrise:before {
+ content: '\ef1c';
+}
+.ti-sunset:before {
+ content: '\ec31';
+}
+.ti-superscript:before {
+ content: '\eba0';
+}
+.ti-swimming:before {
+ content: '\ec92';
+}
+.ti-switch:before {
+ content: '\eb33';
+}
+.ti-switch-2:before {
+ content: '\edbf';
+}
+.ti-switch-3:before {
+ content: '\edc0';
+}
+.ti-switch-horizontal:before {
+ content: '\eb31';
+}
+.ti-switch-vertical:before {
+ content: '\eb32';
+}
+.ti-table:before {
+ content: '\eba1';
+}
+.ti-table-export:before {
+ content: '\eef8';
+}
+.ti-table-import:before {
+ content: '\eef9';
+}
+.ti-table-off:before {
+ content: '\eefa';
+}
+.ti-tag:before {
+ content: '\eb34';
+}
+.ti-tallymark-1:before {
+ content: '\ec46';
+}
+.ti-tallymark-2:before {
+ content: '\ec47';
+}
+.ti-tallymark-3:before {
+ content: '\ec48';
+}
+.ti-tallymark-4:before {
+ content: '\ec49';
+}
+.ti-tallymarks:before {
+ content: '\ec4a';
+}
+.ti-tank:before {
+ content: '\ed95';
+}
+.ti-target:before {
+ content: '\eb35';
+}
+.ti-temperature:before {
+ content: '\eb38';
+}
+.ti-temperature-celsius:before {
+ content: '\eb36';
+}
+.ti-temperature-fahrenheit:before {
+ content: '\eb37';
+}
+.ti-temperature-minus:before {
+ content: '\ebed';
+}
+.ti-temperature-plus:before {
+ content: '\ebee';
+}
+.ti-template:before {
+ content: '\eb39';
+}
+.ti-tent:before {
+ content: '\eefb';
+}
+.ti-terminal:before {
+ content: '\ebdc';
+}
+.ti-terminal-2:before {
+ content: '\ebef';
+}
+.ti-test-pipe:before {
+ content: '\eb3a';
+}
+.ti-text-direction-ltr:before {
+ content: '\eefc';
+}
+.ti-text-direction-rtl:before {
+ content: '\eefd';
+}
+.ti-text-wrap:before {
+ content: '\ebdd';
+}
+.ti-text-wrap-disabled:before {
+ content: '\eca7';
+}
+.ti-thumb-down:before {
+ content: '\eb3b';
+}
+.ti-thumb-up:before {
+ content: '\eb3c';
+}
+.ti-ticket:before {
+ content: '\eb3d';
+}
+.ti-tilt-shift:before {
+ content: '\eefe';
+}
+.ti-tir:before {
+ content: '\ebf0';
+}
+.ti-toggle-left:before {
+ content: '\eb3e';
+}
+.ti-toggle-right:before {
+ content: '\eb3f';
+}
+.ti-tool:before {
+ content: '\eb40';
+}
+.ti-tools:before {
+ content: '\ebca';
+}
+.ti-tools-kitchen:before {
+ content: '\ed64';
+}
+.ti-tools-kitchen-2:before {
+ content: '\eeff';
+}
+.ti-tornado:before {
+ content: '\ece2';
+}
+.ti-tournament:before {
+ content: '\ecd0';
+}
+.ti-track:before {
+ content: '\ef00';
+}
+.ti-tractor:before {
+ content: '\ec0d';
+}
+.ti-trademark:before {
+ content: '\ec0e';
+}
+.ti-traffic-cone:before {
+ content: '\ec0f';
+}
+.ti-traffic-lights:before {
+ content: '\ed39';
+}
+.ti-train:before {
+ content: '\ed96';
+}
+.ti-transfer-in:before {
+ content: '\ef2f';
+}
+.ti-transfer-out:before {
+ content: '\ef30';
+}
+.ti-trash:before {
+ content: '\eb41';
+}
+.ti-trash-off:before {
+ content: '\ed65';
+}
+.ti-tree:before {
+ content: '\ef01';
+}
+.ti-trees:before {
+ content: '\ec10';
+}
+.ti-trending-down:before {
+ content: '\eb42';
+}
+.ti-trending-down-2:before {
+ content: '\edc1';
+}
+.ti-trending-down-3:before {
+ content: '\edc2';
+}
+.ti-trending-up:before {
+ content: '\eb43';
+}
+.ti-trending-up-2:before {
+ content: '\edc3';
+}
+.ti-trending-up-3:before {
+ content: '\edc4';
+}
+.ti-triangle:before {
+ content: '\eb44';
+}
+.ti-triangle-off:before {
+ content: '\ef02';
+}
+.ti-triangle-square-circle:before {
+ content: '\ece8';
+}
+.ti-trident:before {
+ content: '\ecc5';
+}
+.ti-trophy:before {
+ content: '\eb45';
+}
+.ti-truck:before {
+ content: '\ebc4';
+}
+.ti-truck-delivery:before {
+ content: '\ec4b';
+}
+.ti-truck-off:before {
+ content: '\ef03';
+}
+.ti-truck-return:before {
+ content: '\ec4c';
+}
+.ti-typography:before {
+ content: '\ebc5';
+}
+.ti-umbrella:before {
+ content: '\ebf1';
+}
+.ti-underline:before {
+ content: '\eba2';
+}
+.ti-unlink:before {
+ content: '\eb46';
+}
+.ti-upload:before {
+ content: '\eb47';
+}
+.ti-urgent:before {
+ content: '\eb48';
+}
+.ti-user:before {
+ content: '\eb4d';
+}
+.ti-user-check:before {
+ content: '\eb49';
+}
+.ti-user-exclamation:before {
+ content: '\ec12';
+}
+.ti-user-minus:before {
+ content: '\eb4a';
+}
+.ti-user-off:before {
+ content: '\ecf9';
+}
+.ti-user-plus:before {
+ content: '\eb4b';
+}
+.ti-user-x:before {
+ content: '\eb4c';
+}
+.ti-users:before {
+ content: '\ebf2';
+}
+.ti-vaccine:before {
+ content: '\ef04';
+}
+.ti-variable:before {
+ content: '\ef05';
+}
+.ti-vector:before {
+ content: '\eca9';
+}
+.ti-vector-beizer-2:before {
+ content: '\ed3a';
+}
+.ti-vector-bezier:before {
+ content: '\ef1d';
+}
+.ti-vector-triangle:before {
+ content: '\eca8';
+}
+.ti-venus:before {
+ content: '\ec86';
+}
+.ti-versions:before {
+ content: '\ed52';
+}
+.ti-video:before {
+ content: '\ed22';
+}
+.ti-video-minus:before {
+ content: '\ed1f';
+}
+.ti-video-off:before {
+ content: '\ed20';
+}
+.ti-video-plus:before {
+ content: '\ed21';
+}
+.ti-view-360:before {
+ content: '\ed84';
+}
+.ti-viewfinder:before {
+ content: '\eb4e';
+}
+.ti-viewport-narrow:before {
+ content: '\ebf3';
+}
+.ti-viewport-wide:before {
+ content: '\ebf4';
+}
+.ti-virus:before {
+ content: '\eb74';
+}
+.ti-virus-off:before {
+ content: '\ed66';
+}
+.ti-virus-search:before {
+ content: '\ed67';
+}
+.ti-vocabulary:before {
+ content: '\ef1e';
+}
+.ti-volume:before {
+ content: '\eb51';
+}
+.ti-volume-2:before {
+ content: '\eb4f';
+}
+.ti-volume-3:before {
+ content: '\eb50';
+}
+.ti-walk:before {
+ content: '\ec87';
+}
+.ti-wallet:before {
+ content: '\eb75';
+}
+.ti-wand:before {
+ content: '\ebcb';
+}
+.ti-wave-saw-tool:before {
+ content: '\ecd3';
+}
+.ti-wave-sine:before {
+ content: '\ecd4';
+}
+.ti-wave-square:before {
+ content: '\ecd5';
+}
+.ti-wifi:before {
+ content: '\eb52';
+}
+.ti-wifi-0:before {
+ content: '\eba3';
+}
+.ti-wifi-1:before {
+ content: '\eba4';
+}
+.ti-wifi-2:before {
+ content: '\eba5';
+}
+.ti-wifi-off:before {
+ content: '\ecfa';
+}
+.ti-wind:before {
+ content: '\ec34';
+}
+.ti-windmill:before {
+ content: '\ed85';
+}
+.ti-window:before {
+ content: '\ef06';
+}
+.ti-wiper:before {
+ content: '\ecab';
+}
+.ti-wiper-wash:before {
+ content: '\ecaa';
+}
+.ti-woman:before {
+ content: '\eb53';
+}
+.ti-world:before {
+ content: '\eb54';
+}
+.ti-world-latitude:before {
+ content: '\ed2e';
+}
+.ti-world-longitude:before {
+ content: '\ed2f';
+}
+.ti-wrecking-ball:before {
+ content: '\ed97';
+}
+.ti-writing:before {
+ content: '\ef08';
+}
+.ti-writing-sign:before {
+ content: '\ef07';
+}
+.ti-x:before {
+ content: '\eb55';
+}
+.ti-yin-yang:before {
+ content: '\ec35';
+}
+.ti-zodiac-aquarius:before {
+ content: '\ecac';
+}
+.ti-zodiac-aries:before {
+ content: '\ecad';
+}
+.ti-zodiac-cancer:before {
+ content: '\ecae';
+}
+.ti-zodiac-capricorn:before {
+ content: '\ecaf';
+}
+.ti-zodiac-gemini:before {
+ content: '\ecb0';
+}
+.ti-zodiac-leo:before {
+ content: '\ecb1';
+}
+.ti-zodiac-libra:before {
+ content: '\ecb2';
+}
+.ti-zodiac-pisces:before {
+ content: '\ecb3';
+}
+.ti-zodiac-sagittarius:before {
+ content: '\ecb4';
+}
+.ti-zodiac-scorpio:before {
+ content: '\ecb5';
+}
+.ti-zodiac-taurus:before {
+ content: '\ecb6';
+}
+.ti-zodiac-virgo:before {
+ content: '\ecb7';
+}
+.ti-zoom-cancel:before {
+ content: '\ec4d';
+}
+.ti-zoom-check:before {
+ content: '\ef09';
+}
+.ti-zoom-in:before {
+ content: '\eb56';
+}
+.ti-zoom-money:before {
+ content: '\ef0a';
+}
+.ti-zoom-out:before {
+ content: '\eb57';
+}
+.ti-zoom-question:before {
+ content: '\edeb';
+}
diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot
new file mode 100644
index 0000000..a3b3e8c
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.eot differ
diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg
new file mode 100644
index 0000000..5c004e4
--- /dev/null
+++ b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.svg
@@ -0,0 +1,3906 @@
+
+
+
diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf
new file mode 100644
index 0000000..8863a30
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.ttf differ
diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff
new file mode 100644
index 0000000..c78f044
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff differ
diff --git a/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2 b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2
new file mode 100644
index 0000000..1df7554
Binary files /dev/null and b/jambotron-ui/src/scss/fonts/tabler/tabler-icons.woff2 differ
diff --git a/jambotron-ui/src/scss/settings/bootstrap-variables.scss b/jambotron-ui/src/scss/settings/bootstrap-variables.scss
new file mode 100644
index 0000000..fe737ad
--- /dev/null
+++ b/jambotron-ui/src/scss/settings/bootstrap-variables.scss
@@ -0,0 +1,735 @@
+// Variables
+//
+// Variables should follow the `$component-state-property-size` formula for
+// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
+
+// Color system
+
+$grays: (
+ '100': $gray-100,
+ '200': $gray-200,
+ '300': $gray-300,
+ '400': $gray-400,
+ '500': $gray-500,
+ '600': $gray-600,
+ '700': $gray-700,
+ '800': $gray-800,
+ '900': $gray-900
+);
+
+// scss-docs-start colors-map
+$colors: (
+ 'blue': $blue,
+ 'indigo': $indigo,
+ 'purple': $purple,
+ 'pink': $pink,
+ 'red': $red,
+ 'orange': $orange,
+ 'yellow': $yellow,
+ 'green': $green,
+ 'teal': $teal,
+ 'cyan': $cyan,
+ 'black': $black,
+ 'white': $white,
+ 'gray': $gray-600,
+ 'gray-dark': $gray-800
+);
+// scss-docs-end colors-map
+
+$primary: $blue; // change
+$secondary: $secondary; // change
+$success: $green; // change
+$info: $cyan; // change
+$warning: $yellow; // change
+$danger: $red; // change
+$light: $gray-100; // change
+$dark: $dark; // change
+
+// scss-docs-start theme-colors-map
+$theme-colors: (
+ 'primary': $primary,
+ 'secondary': $secondary,
+ 'success': $success,
+ 'info': $info,
+ 'warning': $warning,
+ 'danger': $danger,
+ 'light': $light,
+ 'dark': $dark
+);
+// scss-docs-end theme-colors-map
+
+// scss-docs-start theme-colors-rgb
+$theme-colors-rgb: map-loop($theme-colors, to-rgb, '$value');
+// scss-docs-end theme-colors-rgb
+
+// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.
+// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
+$min-contrast-ratio: 1.55;
+
+// Customize the light and dark text colors for use in our color contrast function.
+$color-contrast-dark: $body-color;
+$color-contrast-light: $white;
+
+// fusv-disable
+$blues: (
+ 'blue-100': $blue-100,
+ 'blue-200': $blue-200,
+ 'blue-300': $blue-300,
+ 'blue-400': $blue-400,
+ 'blue-500': $blue-500,
+ 'blue-600': $blue-600,
+ 'blue-700': $blue-700,
+ 'blue-800': $blue-800,
+ 'blue-900': $blue-900
+);
+
+// Characters which are escaped by the escape-svg function
+$escaped-characters: (('<', '%3c'), ('>', '%3e'), ('#', '%23'), ('(', '%28'), (')', '%29'));
+
+$variable-prefix: bs-; // Deprecated in v5.2.0 for the shorter `$prefix`
+$prefix: $variable-prefix;
+
+// Gradient
+
+$gradient: linear-gradient(180deg, rgba($white, 0.15), rgba($white, 0));
+
+// Spacing
+$spacer: 1rem;
+$spacers: (
+ 0: 0,
+ 1: $spacer * 0.25,
+ 2: $spacer * 0.5,
+ 3: $spacer,
+ 4: $spacer * 1.5,
+ 5: $spacer * 3
+);
+// scss-docs-end spacer-variables-maps
+
+// Position
+//
+// Define the edge positioning anchors of the position utilities.
+
+// scss-docs-start position-map
+$position-values: (
+ 0: 0,
+ 50: 50%,
+ 100: 100%
+);
+// scss-docs-end position-map
+
+// Body
+//
+// Settings for the `` element.
+$body-bg: #fafafb; // change
+$body-color: $gray-900; // change
+$body-text-align: null;
+
+// Links
+//
+// Style anchor elements.
+
+$link-color: $primary;
+$link-decoration: none;
+$link-shade-percentage: 20%;
+$link-hover-color: shift-color($link-color, $link-shade-percentage);
+$link-hover-decoration: underline;
+
+$stretched-link-pseudo-element: after;
+$stretched-link-z-index: 1;
+
+// Paragraphs
+//
+// Style p element.
+
+$paragraph-margin-bottom: 1rem;
+
+// Grid breakpoints
+//
+// Define the minimum dimensions at which your layout will change,
+// adapting to different screen sizes, for use in media queries.
+
+// scss-docs-start grid-breakpoints
+$grid-breakpoints: (
+ xs: 0,
+ sm: 576px,
+ md: 768px,
+ lg: 992px,
+ xl: 1200px,
+ xxl: 1400px
+);
+// scss-docs-end grid-breakpoints
+
+@include _assert-ascending($grid-breakpoints, '$grid-breakpoints');
+@include _assert-starts-at-zero($grid-breakpoints, '$grid-breakpoints');
+
+// Grid containers
+//
+// Define the maximum width of `.container` for different screen sizes.
+
+// scss-docs-start container-max-widths
+$container-max-widths: (
+ sm: 540px,
+ md: 720px,
+ lg: 960px,
+ xl: 1140px,
+ xxl: 1320px
+);
+// scss-docs-end container-max-widths
+
+@include _assert-ascending($container-max-widths, '$container-max-widths');
+
+// Grid columns
+//
+// Set the number of columns and specify the width of the gutters.
+
+$grid-columns: 12;
+$grid-gutter-width: 1.5rem;
+$grid-row-columns: 6;
+
+// Container padding
+
+$container-padding-x: $grid-gutter-width;
+
+// Components
+//
+// Define common padding and border radius sizes and more.
+
+// scss-docs-start border-variables
+$border-width: 1px;
+$border-widths: (
+ 0: 0,
+ 1: 1px,
+ 2: 2px,
+ 3: 3px,
+ 4: 4px,
+ 5: 5px
+);
+
+$border-style: solid;
+$border-color: #e6ebf1;
+$border-color-translucent: rgba($black, 0.175);
+
+$border-radius: 4px; // change
+$border-radius-lg: 6px; // change
+$border-radius-sm: 2px; // change
+$border-radius-pill: 50rem;
+// scss-docs-end border-radius-variables
+
+$box-shadow-sm: 0 0.125rem 0.25rem rgba($black, 0.075);
+$box-shadow: 0 0.5rem 1rem rgba($black, 0.15);
+$box-shadow-lg: 0 1rem 3rem rgba($black, 0.175);
+$box-shadow-inset: inset 0 1px 2px rgba($black, 0.075);
+
+$component-active-color: $white;
+$component-active-bg: var(--bs-primary);
+
+// scss-docs-start caret-variables
+$caret-width: 0.3em;
+$caret-vertical-align: $caret-width * 0.85;
+$caret-spacing: $caret-width * 0.85;
+// scss-docs-end caret-variables
+
+$transition-base: all 0.2s ease-in-out;
+$transition-fade: opacity 0.15s linear;
+// scss-docs-start collapse-transition
+$transition-collapse: height 0.35s ease;
+$transition-collapse-width: width 0.35s ease;
+
+// stylelint-disable function-disallowed-list
+// scss-docs-start aspect-ratios
+$aspect-ratios: (
+ '1x1': 100%,
+ '4x3': calc(3 / 4 * 100%),
+ '16x9': calc(9 / 16 * 100%),
+ '21x9': calc(9 / 21 * 100%)
+);
+// scss-docs-end aspect-ratios
+// stylelint-enable function-disallowed-list
+
+// Typography
+//
+// Font, line-height, and color for body text, headings, and more.
+
+// stylelint-disable value-keyword-case
+$font-family-sans-serif: 'Public Sans', sans-serif; // change
+$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
+// stylelint-enable value-keyword-case
+$font-family-base: var(--#{$variable-prefix}font-sans-serif);
+$font-family-code: var(--#{$variable-prefix}font-monospace);
+
+$font-size-root: null;
+$font-size-base: 0.875rem;
+$font-size-sm: $font-size-base * 0.875;
+$font-size-lg: $font-size-base * 1.25;
+$font-weight-lighter: lighter;
+$font-weight-light: 300;
+$font-weight-normal: 400;
+$font-weight-bold: 700;
+$font-weight-bolder: bolder;
+
+$font-weight-base: $font-weight-normal;
+$line-height-base: 1.5;
+$line-height-sm: 1.25;
+$line-height-lg: 2;
+
+$h1-font-size: 40px; // change
+$h2-font-size: 30px; // change
+$h3-font-size: 24px; // change
+$h4-font-size: 20px; // change
+$h5-font-size: 16px; // change
+$h6-font-size: 14px; // change
+
+// scss-docs-start font-sizes
+$font-sizes: (
+ 1: $h1-font-size,
+ 2: $h2-font-size,
+ 3: $h3-font-size,
+ 4: $h4-font-size,
+ 5: $h5-font-size,
+ 6: $h6-font-size
+);
+// scss-docs-end font-sizes
+
+// scss-docs-end font-sizes
+h1,
+h2 {
+ font-weight: 700;
+}
+
+$headings-margin-bottom: calc($spacer / 2);
+$headings-font-family: null;
+$headings-font-style: null;
+$headings-font-weight: 600;
+$headings-line-height: 1.2;
+$headings-color: #262626;
+$label-color: $gray-900;
+
+// scss-docs-start display-headings
+$display-font-sizes: (
+ 1: 5rem,
+ 2: 4.5rem,
+ 3: 4rem,
+ 4: 3.5rem,
+ 5: 3rem,
+ 6: 2.5rem
+);
+
+$display-font-weight: 300;
+$display-line-height: $headings-line-height;
+// scss-docs-end display-headings
+
+$lead-font-size: $font-size-base * 1.25;
+$lead-font-weight: 300;
+
+$small-font-size: 80%;
+
+$sub-sup-font-size: 0.75em;
+
+$text-muted: $gray-600;
+
+$hr-margin-y: $spacer;
+$hr-color: inherit;
+$hr-height: $border-width;
+$hr-opacity: 0.13;
+
+$legend-margin-bottom: 0.5rem;
+$legend-font-size: 1.5rem;
+$legend-font-weight: null;
+
+$mark-padding: 0.2em;
+
+$dt-font-weight: $font-weight-bold;
+
+$nested-kbd-font-weight: $font-weight-bold;
+
+$list-inline-padding: 0.5rem;
+
+$mark-bg: #fcf8e3;
+// Tables
+//
+// Customizes the `.table` component with basic values, each used across all table variations.
+// scss-docs-start table-variables
+$table-cell-padding-y: 0.9rem;
+$table-cell-padding-x: 0.75rem;
+$table-cell-padding-y-sm: 0.3rem;
+$table-cell-padding-x-sm: 0.3rem;
+
+$table-cell-vertical-align: top;
+
+$table-color: $body-color;
+$table-bg: transparent;
+$table-accent-bg: transparent;
+
+$table-th-font-weight: null;
+$table-striped-color: $table-color;
+$table-striped-bg-factor: 0.05;
+$table-striped-bg: rgba($black, $table-striped-bg-factor);
+
+$table-active-color: $table-color;
+$table-active-bg-factor: 0.1;
+$table-active-bg: rgba($black, $table-active-bg-factor);
+
+$table-hover-color: $table-color;
+$table-hover-bg-factor: 0.02;
+$table-hover-bg: rgba($primary, $table-hover-bg-factor);
+
+$table-border-factor: 0.1;
+$table-border-width: $border-width;
+$table-border-color: $border-color;
+
+$table-striped-order: odd;
+
+$table-group-seperator-color: currentColor;
+$table-caption-color: $text-muted;
+
+$table-bg-scale: -80%;
+
+$table-variants: (
+ 'primary': shift-color($primary, $table-bg-scale),
+ 'secondary': shift-color($secondary, $table-bg-scale),
+ 'success': shift-color($success, $table-bg-scale),
+ 'info': shift-color($info, $table-bg-scale),
+ 'warning': shift-color($warning, $table-bg-scale),
+ 'danger': shift-color($danger, $table-bg-scale),
+ 'light': $light,
+ 'dark': $dark
+);
+// scss-docs-end table-variables
+
+// Buttons + Forms
+//
+// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
+
+$input-btn-padding-y: 0.407rem;
+$input-btn-padding-x: 1rem;
+$input-btn-font-family: null;
+$input-btn-font-size: 0.875rem;
+$input-btn-line-height: $line-height-base;
+
+$input-btn-focus-width: 0.2rem;
+$input-btn-focus-color-opacity: 0.25;
+$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity);
+$input-btn-focus-blur: 0;
+$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;
+
+$input-btn-padding-y-sm: 0.25rem;
+$input-btn-padding-x-sm: 0.5rem;
+$input-btn-font-size-sm: $font-size-sm;
+
+$input-btn-padding-y-lg: 1rem;
+$input-btn-padding-x-lg: 1.3rem;
+$input-btn-font-size-lg: $font-size-lg;
+
+$input-btn-border-width: 1px;
+
+// Buttons
+//
+// For each of Bootstrap's buttons, define text, background, and border color.
+
+$btn-padding-y: $input-btn-padding-y;
+$btn-padding-x: $input-btn-padding-x;
+$btn-font-family: $input-btn-font-family;
+$btn-font-size: $input-btn-font-size;
+$btn-line-height: $input-btn-line-height;
+$btn-white-space: null; // Set to `nowrap` to prevent text wrapping
+
+$btn-padding-y-sm: $input-btn-padding-y-sm;
+$btn-padding-x-sm: $input-btn-padding-x-sm;
+$btn-font-size-sm: $input-btn-font-size-sm;
+
+$btn-padding-y-lg: $input-btn-padding-y-lg;
+$btn-padding-x-lg: $input-btn-padding-x-lg;
+$btn-font-size-lg: $input-btn-font-size-lg;
+
+$btn-border-width: $input-btn-border-width;
+
+$btn-font-weight: 400;
+$btn-box-shadow:
+ inset 0 1px 0 rgba($white, 0.15),
+ 0 1px 1px rgba($black, 0.075);
+$btn-focus-width: $input-btn-focus-width;
+$btn-focus-box-shadow: $input-btn-focus-box-shadow;
+$btn-disabled-opacity: 0.65;
+$btn-active-box-shadow: inset 0 3px 5px rgba($black, 0.125);
+
+$btn-link-color: $link-color;
+$btn-link-hover-color: $link-hover-color;
+$btn-link-disabled-color: $gray-600;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius: 4px;
+$btn-border-radius-sm: 2px;
+$btn-border-radius-lg: 6px;
+
+$btn-transition:
+ color 0.15s ease-in-out,
+ background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+
+$btn-hover-bg-shade-amount: 15%;
+$btn-hover-bg-tint-amount: 15%;
+$btn-hover-border-shade-amount: 20%;
+$btn-hover-border-tint-amount: 10%;
+$btn-active-bg-shade-amount: 20%;
+$btn-active-bg-tint-amount: 20%;
+$btn-active-border-shade-amount: 25%;
+$btn-active-border-tint-amount: 10%;
+// scss-docs-end btn-variables
+
+// Forms
+
+$form-text-margin-top: 0.25rem;
+$form-text-font-size: $small-font-size;
+$form-text-font-style: null;
+$form-text-font-weight: null;
+$form-text-color: $text-muted;
+
+$form-label-margin-bottom: 0.5rem;
+$form-label-font-size: null;
+$form-label-font-style: null;
+$form-label-font-weight: null;
+$form-label-color: $label-color;
+
+$input-padding-y: 0.65rem;
+$input-padding-x: 0.75rem;
+$input-font-family: $input-btn-font-family;
+$input-font-size: $input-btn-font-size;
+$input-font-weight: $font-weight-base;
+$input-line-height: $input-btn-line-height;
+
+$input-padding-y-sm: 0.375rem;
+$input-padding-x-sm: 0.7rem;
+$input-font-size-sm: $input-btn-font-size-sm;
+
+$input-padding-y-lg: 0.775rem;
+$input-padding-x-lg: 0.85rem;
+$input-font-size-lg: $input-btn-font-size-lg;
+
+$input-bg: $white;
+$input-disabled-bg: $gray-200;
+$input-disabled-border-color: null;
+
+$input-color: $body-color;
+$input-border-color: $gray-400;
+$input-border-width: 1px;
+$input-box-shadow: inset 0 1px 1px rgba($black, 0.075);
+
+$input-border-radius: 4px;
+$input-border-radius-sm: 2px;
+$input-border-radius-lg: 6px;
+
+$input-focus-bg: $input-bg;
+$input-focus-border-color: $primary;
+$input-focus-color: $input-color;
+$input-focus-width: $input-btn-focus-width;
+$input-focus-box-shadow: 0 0 0 2px rgba($component-active-bg, 0.2);
+
+$input-placeholder-color: $gray-600;
+$input-plaintext-color: $headings-color;
+
+$input-height-border: $input-border-width * 2;
+
+$input-height-inner: add($input-line-height * 1em, calc($input-padding-y * 2));
+$input-height-inner-half: add($input-line-height * 0.5em, $input-padding-y);
+$input-height-inner-quarter: add($input-line-height * 0.25em, calc($input-padding-y / 2));
+
+$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false));
+$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false));
+$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false));
+
+$input-transition:
+ border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+
+$form-color-width: 3rem;
+// scss-docs-end form-input-variables
+
+// scss-docs-end form-validation-states
+
+// Z-index master list
+
+$zindex-dropdown: 1026;
+$zindex-sticky: 1020;
+$zindex-fixed: 1030;
+
+// Navs
+
+$nav-link-padding-y: 0.5rem;
+$nav-link-padding-x: 1rem;
+$nav-link-font-size: null;
+$nav-link-font-weight: null;
+$nav-link-color: null;
+$nav-link-hover-color: null;
+$nav-link-transition:
+ color 0.15s ease-in-out,
+ background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out;
+$nav-link-disabled-color: $gray-600;
+
+$nav-tabs-border-color: $gray-300;
+$nav-tabs-border-width: $border-width;
+$nav-tabs-border-radius: $border-radius;
+$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color;
+$nav-tabs-link-active-color: $gray-700;
+$nav-tabs-link-active-bg: $white; // change
+$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg;
+
+$nav-pills-border-radius: $border-radius;
+$nav-pills-link-active-color: $component-active-color;
+$nav-pills-link-active-bg: $component-active-bg;
+
+// Navbar
+
+$navbar-padding-y: calc(#{$spacer} / 2);
+$navbar-padding-x: null;
+
+$navbar-nav-link-padding-x: 0.5rem;
+
+$navbar-brand-font-size: $font-size-lg;
+// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
+$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2;
+$navbar-brand-height: $navbar-brand-font-size * $line-height-base;
+$navbar-brand-padding-y: calc(($nav-link-height - $navbar-brand-height) / 2);
+$navbar-brand-margin-end: 1rem;
+
+$navbar-toggler-padding-y: 0.25rem;
+$navbar-toggler-padding-x: 0.75rem;
+$navbar-toggler-font-size: $font-size-lg;
+$navbar-toggler-border-radius: $btn-border-radius;
+$navbar-toggler-focus-width: $btn-focus-width;
+$navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+
+$navbar-dark-color: rgba($white, 0.9);
+$navbar-dark-hover-color: rgba($white, 0.75);
+$navbar-dark-active-color: $white;
+$navbar-dark-disabled-color: rgba($white, 0.25);
+$navbar-dark-toggler-border-color: rgba($white, 0.1);
+
+$navbar-light-color: rgba($black, 0.55);
+$navbar-light-hover-color: rgba($black, 0.7);
+$navbar-light-active-color: rgba($black, 0.9);
+$navbar-light-disabled-color: rgba($black, 0.3);
+$navbar-light-toggler-border-color: rgba($black, 0.1);
+
+$navbar-light-brand-color: $navbar-light-active-color;
+$navbar-light-brand-hover-color: $navbar-light-active-color;
+$navbar-dark-brand-color: $navbar-dark-active-color;
+$navbar-dark-brand-hover-color: $navbar-dark-active-color;
+
+// Dropdowns
+$dropdown-font-size: $font-size-base;
+$dropdown-color: $body-color;
+$dropdown-bg: $white;
+
+// scss-docs-start placeholders
+$placeholder-opacity-max: 0.5;
+$placeholder-opacity-min: 0.2;
+// scss-docs-end placeholders
+
+// Cards
+$card-spacer-y: 25px; // change
+$card-spacer-x: 25px; // change
+$card-title-spacer-y: calc($spacer / 2);
+$card-border-width: 1px; // change
+$card-border-radius: $border-radius;
+$card-border-color: $border-color;
+$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width});
+$card-cap-padding-y: 25px;
+$card-cap-padding-x: 25px;
+$card-cap-bg: transparent;
+$card-cap-color: null;
+$card-height: null;
+$card-color: null;
+$card-bg: $white;
+
+$card-img-overlay-padding: 1.25rem;
+
+$card-group-margin: calc($grid-gutter-width / 2);
+
+// Badges
+$badge-font-size: 0.75em;
+$badge-font-weight: 500;
+$badge-color: $white;
+$badge-padding-y: 0.35em;
+$badge-padding-x: 0.5em;
+$badge-border-radius: 2px;
+
+// List group
+
+$list-group-color: null;
+$list-group-bg: $white;
+$list-group-border-color: $border-color;
+$list-group-border-width: $border-width;
+$list-group-border-radius: $border-radius;
+
+$list-group-item-padding-y: calc($card-spacer-y / 1.5);
+$list-group-item-padding-x: $card-spacer-x;
+$list-group-item-bg-scale: -80%;
+$list-group-item-color-scale: 40%;
+
+$list-group-hover-bg: $gray-100;
+$list-group-active-color: $component-active-color;
+$list-group-active-bg: $component-active-bg;
+$list-group-active-border-color: $list-group-active-bg;
+
+$list-group-disabled-color: $gray-600;
+$list-group-disabled-bg: $list-group-bg;
+
+$list-group-action-color: $gray-700;
+$list-group-action-hover-color: $list-group-action-color;
+
+$list-group-action-active-color: $body-color;
+$list-group-action-active-bg: $gray-200;
+
+// Figures
+
+$figure-caption-font-size: 90%;
+$figure-caption-color: $gray-600;
+
+// Breadcrumbs
+
+$breadcrumb-font-size: null;
+$breadcrumb-padding-y: 2;
+$breadcrumb-padding-x: 0;
+$breadcrumb-item-padding: 0.5rem;
+
+$breadcrumb-margin-bottom: 1rem;
+
+$breadcrumb-bg: null;
+$breadcrumb-divider-color: $gray-600;
+$breadcrumb-active-color: $gray-600;
+$breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='14' height='14' stroke='#{$gray-600}' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round' class='css-i6dzq1'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
+$breadcrumb-divider-flipped: $breadcrumb-divider;
+$breadcrumb-border-radius: null;
+
+// Close
+
+$btn-close-width: 1em;
+$btn-close-height: $btn-close-width;
+$btn-close-padding-x: 0.25em;
+$btn-close-padding-y: $btn-close-padding-x;
+$btn-close-color: $black;
+$btn-close-bg: url("data:image/svg+xml,");
+$btn-close-focus-shadow: $input-btn-focus-box-shadow;
+$btn-close-opacity: 0.5;
+$btn-close-hover-opacity: 0.75;
+$btn-close-focus-opacity: 1;
+$btn-close-disabled-opacity: 0.25;
+$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);
+
+// Code
+
+$code-font-size: 87.5%;
+$code-color: $pink;
+
+$kbd-padding-y: 0.2rem;
+$kbd-padding-x: 0.4rem;
+$kbd-font-size: $code-font-size;
+$kbd-color: $white;
+$kbd-bg: $body-color;
+
+$pre-color: null;
+
+// scss-docs-start theme-colors-rgb
+$theme-colors-rgb: map-loop($theme-colors, to-rgb, '$value');
diff --git a/jambotron-ui/src/scss/settings/color-variables.scss b/jambotron-ui/src/scss/settings/color-variables.scss
new file mode 100644
index 0000000..657a29b
--- /dev/null
+++ b/jambotron-ui/src/scss/settings/color-variables.scss
@@ -0,0 +1,44 @@
+// =======================================
+// List of variables for Preset color
+// =======================================
+
+// Gray color
+$white: #ffffff;
+$gray-100: #fafafa;
+$gray-200: #f5f5f5;
+$gray-300: #f0f0f0;
+$gray-400: #d9d9d9;
+$gray-500: #bfbfbf;
+$gray-600: #8c8c8c;
+$gray-700: #595959;
+$gray-800: #262626;
+$gray-900: #141414;
+$black: #000000;
+
+$blue: #1677ff;
+$indigo: #6610f2;
+$purple: #6f42c1;
+$pink: #e83e8c;
+$red: #ff4d4f;
+$orange: #fd7e14;
+$yellow: #faad14;
+$green: #52c41a;
+$teal: #20c997;
+$cyan: #13c2c2;
+
+$blue-100: tint-color($blue, 80%);
+$blue-200: tint-color($blue, 60%);
+$blue-300: tint-color($blue, 40%);
+$blue-400: tint-color($blue, 20%);
+$blue-500: $blue;
+$blue-600: shade-color($blue, 20%);
+$blue-700: shade-color($blue, 40%);
+$blue-800: shade-color($blue, 60%);
+$blue-900: shade-color($blue, 80%);
+
+$preset-colors: (
+ preset-1: (
+ primary: #1890ff
+ )
+);
+$dark-bg-color: #1a1a1a;
diff --git a/jambotron-ui/src/scss/settings/theme-variables.scss b/jambotron-ui/src/scss/settings/theme-variables.scss
new file mode 100644
index 0000000..e1f2694
--- /dev/null
+++ b/jambotron-ui/src/scss/settings/theme-variables.scss
@@ -0,0 +1,111 @@
+// =======================================
+// List of variables for layout
+// =======================================
+:root {
+ // body
+ --#{$variable-prefix}body-bg: #{$body-bg};
+ --bs-body-bg-rgb: #{to-rgb($body-bg)};
+
+ --pc-heading-color: #{$gray-800};
+ --pc-active-background: #{$gray-200};
+
+ // Navbar
+ --pc-sidebar-background: #{$white};
+ --pc-sidebar-color: #262626;
+ --pc-sidebar-color-rgb: #{to-rgb(#262626)};
+ --pc-sidebar-active-color: var(--bs-primary);
+ --pc-sidebar-shadow: none;
+ --pc-sidebar-caption-color: #{$gray-700};
+
+ // header
+ --pc-header-background: #{$white};
+ --pc-header-color: #262626;
+ --pc-header-shadow: 0 1px 0 0px rgb(240 240 240);
+
+ // card
+ --pc-card-box-shadow: none;
+
+ // horizontal menu
+ --pc-header-submenu-background: #{$white};
+ --pc-header-submenu-color: #{$gray-600};
+}
+
+$header-height: 60px;
+$sidebar-width: 260px;
+$sidebar-collapsed-width: 60px;
+$sidebar-collapsed-active-width: 300px;
+$sidebar-tab-width: 75px;
+$sidebar-tab-navbar-width: 320px;
+
+// horizontal menu
+$topbar-height: 60px;
+
+$soft-bg-level: -90%;
+
+// =====================================
+// Variables for dark layouts
+// =====================================
+
+$dark-layout-color: #121212;
+$dark-layout-color-light: #1e1e1e;
+// header
+$dark-header-color: #d6d6d6;
+$dark-header-shadow: 0 1px 20px 0 rgba(69, 90, 100, 0.08);
+
+// Menu
+$dark-sidebar-color: #bfbfbf;
+$dark-sidebar-caption: #d6d6d6;
+$dark-sidebar-shadow: 0 1px 20px 0 rgba(69, 90, 100, 0.08);
+
+// card block
+$dark-card-shadow: inset 0 0 0 1px #262626;
+
+// =====================================
+// Variables for bootstrap color
+// =====================================
+
+$blue: $blue-500;
+$secondary: $gray-600;
+$indigo: $indigo-500;
+$purple: $purple-500;
+$pink: $pink-500;
+$red: $red-500;
+$orange: $orange-500;
+$yellow: $yellow-500;
+$green: $green-500;
+$teal: $teal-500;
+$cyan: $cyan-500;
+$dark: #262626;
+
+$primary-text: $blue-600;
+$secondary-text: $gray-600;
+$success-text: $green-600;
+$info-text: $cyan-700;
+$warning-text: $yellow-700;
+$danger-text: $red-600;
+$light-text: $gray-600;
+$dark-text: $gray-700;
+
+$primary-bg-subtle: $blue-100;
+$secondary-bg-subtle: $gray-100;
+$success-bg-subtle: $green-100;
+$info-bg-subtle: $cyan-100;
+$warning-bg-subtle: $yellow-100;
+$danger-bg-subtle: $red-100;
+$light-bg-subtle: mix($gray-100, $white);
+$dark-bg-subtle: $gray-400;
+
+$primary-border-subtle: $blue-200;
+$secondary-border-subtle: $gray-200;
+$success-border-subtle: $green-200;
+$info-border-subtle: $cyan-200;
+$warning-border-subtle: $yellow-200;
+$danger-border-subtle: $red-200;
+$light-border-subtle: $gray-200;
+$dark-border-subtle: $gray-500;
+
+$preset-colors: (
+ preset-1: (
+ primary: #1677ff
+ )
+);
diff --git a/jambotron-ui/src/scss/themes/components/avatar.scss b/jambotron-ui/src/scss/themes/components/avatar.scss
new file mode 100644
index 0000000..75140fa
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/avatar.scss
@@ -0,0 +1,18 @@
+.avatar {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: $border-radius;
+ font: {
+ size: 18px;
+ weight: 600;
+ }
+ width: 48px;
+ height: 48px;
+
+ &.avatar-s {
+ width: 40px;
+ height: 40px;
+ font-size: 14px;
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/components/badge.scss b/jambotron-ui/src/scss/themes/components/badge.scss
new file mode 100644
index 0000000..b5d54b5
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/badge.scss
@@ -0,0 +1,13 @@
+// ============================
+// Badge css start
+// ============================
+
+.badge {
+ @each $color, $value in $theme-colors {
+ &.bg-light-#{$color} {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/components/button.scss b/jambotron-ui/src/scss/themes/components/button.scss
new file mode 100644
index 0000000..fa8e741
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/button.scss
@@ -0,0 +1,125 @@
+// ============================
+// Button css start
+// ============================
+
+.btn {
+ font-size: 14px;
+
+ i {
+ font-size: 18px;
+ }
+
+ svg {
+ width: 18px;
+ height: 18px;
+ }
+
+ &[class*='btn-link-'],
+ &[class*='btn-light-'] {
+ box-shadow: none;
+ }
+
+ &[class*='btn-outline-']:not(:hover) {
+ box-shadow: none;
+ }
+
+ &.btn-shadow {
+ box-shadow: 0 6px 7px -1px rgba(80, 86, 175, 0.3);
+ }
+
+ &.btn-sm {
+ i {
+ font-size: 14px;
+ }
+ }
+}
+@each $color, $value in $theme-colors {
+ .btn-light-#{$color} {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ .material-icons-two-tone {
+ background-color: $value;
+ }
+
+ &:hover {
+ background: $value;
+ color: #fff;
+ border-color: $value;
+ .material-icons-two-tone {
+ background-color: #fff;
+ }
+ }
+
+ &.focus,
+ &:focus {
+ background: $value;
+ color: #fff;
+ border-color: $value;
+ .material-icons-two-tone {
+ background-color: #fff;
+ }
+ }
+
+ &:not(:disabled):not(.disabled).active,
+ &:not(:disabled):not(.disabled):active,
+ .show > &.dropdown-toggle {
+ background: $value;
+ color: #fff;
+ border-color: $value;
+ .material-icons-two-tone {
+ background-color: #fff;
+ }
+ }
+ }
+
+ .btn-check:active,
+ .btn-check:checked {
+ + .btn-light-#{$color} {
+ background: $value;
+ color: #fff;
+ border-color: $value;
+ .material-icons-two-tone {
+ background-color: #fff;
+ }
+ }
+ }
+
+ .btn-link-#{$color} {
+ background: transparent;
+ color: $value;
+ border-color: transparent;
+ .material-icons-two-tone {
+ background-color: $value;
+ }
+ &:hover {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ }
+
+ &.focus,
+ &:focus {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ }
+
+ &:not(:disabled):not(.disabled).active,
+ &:not(:disabled):not(.disabled):active,
+ .show > &.dropdown-toggle {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ }
+ }
+
+ .btn-check:active,
+ .btn-check:checked {
+ + .btn-link-#{$color} {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ border-color: shift-color($value, $soft-bg-level);
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/components/card.scss b/jambotron-ui/src/scss/themes/components/card.scss
new file mode 100644
index 0000000..da64faa
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/card.scss
@@ -0,0 +1,58 @@
+.card {
+ margin-bottom: 24px;
+ transition: box-shadow 0.2s ease-in-out;
+
+ .card-header {
+ border-bottom: 1px solid $border-color;
+
+ h5 {
+ margin-bottom: 0;
+ color: $headings-color;
+ font-size: 0.875rem;
+ font-weight: 600;
+
+ + p,
+ + small {
+ margin-top: 10px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+
+ .card-footer {
+ transition: box-shadow 0.2s ease-in-out;
+ border-top: 1px solid $border-color;
+ }
+
+ &:hover {
+ .card-footer[class*='bg-'] {
+ box-shadow: none;
+ }
+ }
+
+ .card-body {
+ &.pc-component {
+ position: relative;
+ padding: 25px;
+ border: 1px solid rgba(215, 223, 233, 0.5);
+ }
+ }
+}
+
+@include media-breakpoint-down(sm) {
+ .card {
+ margin-bottom: 20px;
+ .card-header {
+ padding: 20px;
+ h5 {
+ font-size: 0.875rem;
+ }
+ }
+ .card-body {
+ padding: 20px;
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/components/components.scss b/jambotron-ui/src/scss/themes/components/components.scss
new file mode 100644
index 0000000..76cda15
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/components.scss
@@ -0,0 +1,8 @@
+@import 'avatar';
+@import 'button';
+@import 'badge';
+@import 'dropdown';
+@import 'table';
+@import 'tabs';
+@import 'card';
+@import 'form';
diff --git a/jambotron-ui/src/scss/themes/components/dropdown.scss b/jambotron-ui/src/scss/themes/components/dropdown.scss
new file mode 100644
index 0000000..72362b1
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/dropdown.scss
@@ -0,0 +1,85 @@
+.dropdown-toggle {
+ &.arrow-none {
+ &:after {
+ display: none;
+ }
+ }
+}
+
+.pc-header {
+ .dropdown-menu {
+ animation: 0.3s ease-in-out 0s normal forwards 0.3s fadeIn;
+ }
+}
+@keyframes fadeIn {
+ from {
+ transform: translate3d(0, 8px, 0);
+ opacity: 0;
+ }
+
+ to {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+.dropdown .dropdown-item {
+ display: flex;
+ align-items: center;
+
+ &.active,
+ &:active,
+ &:focus,
+ &:hover {
+ background: var(--pc-active-background);
+ color: var(--bs-dropdown-link-color);
+ i {
+ &.material-icons-two-tone {
+ background-color: $dropdown-link-hover-color;
+ }
+ }
+ }
+}
+
+.dropdown-menu {
+ --bs-dropdown-zindex: 8;
+ box-shadow: 0 4px 24px 0 rgba(62, 57, 107, 0.18);
+ border: none;
+ .dropdown-item {
+ padding: 10px 25px;
+
+ i {
+ font-size: 18px;
+ margin-right: 10px;
+
+ &.material-icons-two-tone {
+ vertical-align: bottom;
+ font-size: 22px;
+ background-color: var(--pc-header-color);
+ }
+ }
+
+ svg {
+ width: 18px;
+ height: 18px;
+ margin-right: 10px;
+ }
+
+ .float-right {
+ svg {
+ width: 14px;
+ height: 14px;
+ }
+ }
+ }
+}
+
+.dropdown-menu-dark {
+ .dropdown-item {
+ &.active,
+ &:active {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/components/form.scss b/jambotron-ui/src/scss/themes/components/form.scss
new file mode 100644
index 0000000..2dfe2d6
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/form.scss
@@ -0,0 +1,255 @@
+.form-group {
+ margin-bottom: 1rem;
+
+ label {
+ font-size: 14px;
+ font-weight: 500;
+ }
+}
+
+select.form-control,
+.form-control {
+ &:hover {
+ background-color: $gray-100;
+ }
+
+ &[readonly] {
+ opacity: 0.6;
+ }
+}
+
+.input-group-text svg {
+ width: 18px;
+ height: 18px;
+}
+
+.form-control-color-picker {
+ height: 43px;
+ padding: 0.5rem;
+}
+
+select.form-control {
+ appearance: none;
+ background: #{$input-bg}
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke='currentColor' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round' class='css-i6dzq1'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E")
+ no-repeat right 0.75rem center/18px 25px;
+
+ &[data-multiselectsplitter-firstselect-selector],
+ &[data-multiselectsplitter-secondselect-selector] {
+ background: none;
+ }
+}
+
+.form-floating {
+ > label {
+ top: 1px;
+ }
+
+ > .form-control:focus,
+ > .form-control:not(:placeholder-shown),
+ > .form-select {
+ ~ label {
+ color: $gray-600;
+ }
+ }
+
+ > .form-control:focus {
+ ~ label {
+ color: $component-active-bg;
+ }
+ }
+
+ > input {
+ color: $body-color;
+ }
+}
+
+.user-card {
+ .form-search {
+ position: relative;
+ i {
+ position: absolute;
+ top: 12px;
+ left: 15px;
+ font-size: 14px;
+ }
+ .form-control {
+ padding-left: 42px;
+ background: transparent;
+ }
+ }
+
+ .btn {
+ i {
+ font-size: inherit;
+ }
+ span {
+ white-space: pre;
+ }
+ }
+}
+
+.form-check {
+ label {
+ cursor: pointer;
+
+ input {
+ cursor: pointer;
+ }
+ }
+}
+
+@each $color, $value in $theme-colors {
+ .form-check {
+ .form-check-input {
+ &.input-#{$color} {
+ &:checked {
+ border-color: $value;
+ background-color: $value;
+ }
+ }
+
+ &.input-light-#{$color} {
+ &:checked {
+ border-color: shift-color($value, $soft-bg-level);
+ background-color: shift-color($value, $soft-bg-level);
+
+ &[type='checkbox'] {
+ background-image: escape-svg(
+ url("data:image/svg+xml,")
+ );
+ }
+
+ &[type='radio'] {
+ background-image: escape-svg(
+ url("data:image/svg+xml,")
+ );
+ }
+ }
+ }
+
+ &.input-#{$color},
+ &.input-light-#{$color} {
+ &:focus {
+ &[type='checkbox'],
+ &[type='radio'] {
+ box-shadow: 0 0 0 0.2rem rgba($value, 0.25);
+ border-color: $value;
+ }
+ }
+ }
+ }
+
+ &.form-switch {
+ .form-check-input.input-light-#{$color} {
+ &:checked {
+ background-image: escape-svg(
+ url("data:image/svg+xml,")
+ );
+ }
+ }
+ }
+ }
+}
+
+.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group > .input-group-append:last-child > .input-group-text:not(:last-child),
+.input-group > .input-group-append:not(:last-child) > .btn,
+.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group > .input-group-prepend > .btn,
+.input-group > .input-group-prepend > .input-group-text {
+ border-right: none;
+}
+
+// sticky header start
+.sticky-action {
+ top: $header-height;
+ position: sticky;
+ z-index: 1020;
+ background: var(--bs-card-bg);
+ border-radius: var(--bs-card-border-radius);
+}
+// sticky header end
+
+// switch v1 start
+.switch-demo {
+ .custom-switch-v1 {
+ margin-bottom: 4px;
+ }
+}
+.custom-switch-v1 {
+ &.form-switch {
+ padding-left: 2.9em;
+
+ .form-check-input {
+ height: 20px;
+ width: 35px;
+ margin-left: -2.9em;
+ background-image: escape-svg(
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='#{$form-switch-color}'/%3e%3c/svg%3e")
+ );
+ transition: 0.35s cubic-bezier(0.54, 1.6, 0.5, 1);
+ //box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
+
+ &[class*='input-light-'] {
+ border: none;
+ }
+
+ &:focus {
+ box-shadow: none;
+ border-color: rgba(0, 0, 0, 0.25);
+ }
+
+ &:checked {
+ background-image: escape-svg(
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='%23ffffff'/%3e%3c/svg%3e")
+ );
+ }
+ }
+
+ @each $color, $value in $theme-colors {
+ .form-check-input.input-light-#{$color} {
+ &:checked {
+ background-image: escape-svg(
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='4.1' fill='#{$value}'/%3e%3c/svg%3e")
+ );
+ }
+ }
+ }
+ }
+
+ // ===========
+ .custom-control-label {
+ &::before {
+ transition: 0.2s cubic-bezier(0.24, 0, 0.5, 1);
+ height: 20px;
+ width: 35px;
+ border-radius: 0.8rem;
+ top: 0;
+ left: -2.55rem;
+ }
+
+ &::after {
+ top: calc(0.15625rem - 2px);
+ left: calc(-2.25rem - 4px);
+ height: 19px;
+ width: 19px;
+ border-radius: 0.7rem;
+ box-shadow:
+ 0 0 0 1px rgba(0, 0, 0, 0.1),
+ 0 4px 0 0 rgba(0, 0, 0, 0.04),
+ 0 4px 9px rgba(0, 0, 0, 0.13),
+ 0 3px 3px rgba(0, 0, 0, 0.05);
+ transition: 0.35s cubic-bezier(0.54, 1.6, 0.5, 1);
+ }
+ }
+
+ .custom-control-input {
+ &:checked ~ .custom-control-label::after {
+ transform: translateX(0.95rem);
+ }
+ }
+
+ // ===========
+}
+// switch v1 end
diff --git a/jambotron-ui/src/scss/themes/components/table.scss b/jambotron-ui/src/scss/themes/components/table.scss
new file mode 100644
index 0000000..39377f4
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/table.scss
@@ -0,0 +1,39 @@
+.table {
+ &.table-align-center {
+ td,
+ th {
+ vertical-align: middle;
+ }
+ }
+ thead th {
+ padding: 0.9rem 0.75rem;
+ }
+ td,
+ th {
+ vertical-align: middle;
+
+ &:first-child {
+ padding-left: 24px;
+ }
+ &:last-child {
+ padding-right: 24px;
+ }
+ }
+ &.table-borderless {
+ td,
+ th {
+ border: none !important;
+ }
+ }
+ thead th {
+ background-color: $gray-100;
+ border-top: 1px solid $gray-300;
+ border-bottom: 2px solid $gray-300;
+ font-size: 12px;
+ }
+}
+
+.table-hover tbody tr:hover {
+ // background-color: transparentize($primary, 0.97);
+ background-color: $gray-200;
+}
diff --git a/jambotron-ui/src/scss/themes/components/tabs.scss b/jambotron-ui/src/scss/themes/components/tabs.scss
new file mode 100644
index 0000000..8b09660
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/components/tabs.scss
@@ -0,0 +1,57 @@
+.tabs-border {
+ &.nav-tabs {
+ .nav-item {
+ margin-bottom: 0;
+ }
+
+ .nav-link {
+ border: none;
+ background:
+ no-repeat center bottom,
+ center 100%;
+ background-size:
+ 0 100%,
+ 100% 100%;
+ transition: background 0.3s ease-out;
+ background-image: linear-gradient(to top, theme-color('primary') 2px, rgba(255, 255, 255, 0) 2px);
+
+ &.active {
+ background-size:
+ 100% 100%,
+ 100% 100%;
+ }
+ }
+ }
+}
+
+.tabs-light {
+ &.nav-pill {
+ + .tab-content {
+ border-top: 1px solid $border-color;
+ }
+
+ .nav-item {
+ margin-bottom: 0;
+
+ .nav-link {
+ color: $primary;
+ background: shift-color($primary, $soft-bg-level);
+ border-radius: 4px;
+ transition: background 0.3s ease-out;
+ }
+
+ + .nav-item {
+ margin-left: 10px;
+ }
+ }
+
+ .nav-link {
+ border: none;
+
+ &.active {
+ color: $white;
+ background: $primary;
+ }
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/general.scss b/jambotron-ui/src/scss/themes/general.scss
new file mode 100644
index 0000000..0157c5a
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/general.scss
@@ -0,0 +1,233 @@
+/** =====================
+ 2. Custom css start
+========================== **/
+
+* {
+ &:focus {
+ outline: none;
+ }
+}
+
+.accordion {
+ --#{$prefix}accordion-color: #{$body-color};
+}
+
+a {
+ color: $black;
+ &:hover {
+ outline: none;
+ text-decoration: none;
+ }
+
+ &:not([href]) {
+ color: inherit;
+ }
+}
+
+p {
+ font-size: 14px;
+}
+
+h6,
+.h6,
+h5,
+.h5,
+h4,
+.h4,
+h3,
+.h3,
+h2,
+.h2,
+h1,
+.h1 {
+ color: var(--pc-heading-color);
+}
+
+b,
+strong {
+ font-weight: 600;
+}
+
+.breadcrumb-default-icon {
+ .breadcrumb-item + .breadcrumb-item::before {
+ position: relative;
+ top: 2px;
+ }
+}
+
+.btn-page {
+ .btn {
+ margin-right: 5px;
+ margin-bottom: 5px;
+ }
+
+ .btn-group {
+ .btn {
+ margin-right: 0;
+ margin-bottom: 0;
+
+ &:last-child {
+ border-left: none;
+ }
+ }
+
+ label {
+ &:first-of-type {
+ border-right: none;
+ }
+ }
+ }
+}
+
+.material-icons-two-tone {
+ background-color: $body-color;
+ -webkit-text-fill-color: transparent;
+ vertical-align: text-bottom;
+ -webkit-background-clip: text;
+
+ &.text-white {
+ background-color: $white;
+ }
+}
+
+.img-radius {
+ border-radius: 50%;
+}
+
+.pc-icon {
+ &:not([class*='wid-']) {
+ width: 22px;
+ }
+
+ &:not([class*='hei-']) {
+ height: 22px;
+ }
+}
+
+/* ========================================================
+ =============== document ======================
+ ========================================================
+
+ Grid examples
+*/
+
+// modal box select
+.ng-dropdown-panel.ng-select-bottom {
+ z-index: 1099;
+}
+
+/* ================================ Blockquote Start ===================== */
+
+@media (min-width: 1600px) {
+ .container {
+ max-width: 1540px;
+ }
+}
+
+.media {
+ display: flex;
+
+ .media-body {
+ flex-grow: 1;
+ }
+}
+
+.blockquote {
+ padding: 0.5rem 1rem;
+}
+
+/* ================================ Blockquote End ===================== */
+
+.color-card {
+ .card-body {
+ margin: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ background: rgba(107, 117, 125, 0.08);
+ border-radius: $border-radius;
+ }
+}
+
+.color-block {
+ border-radius: $border-radius;
+ margin: 4px 0;
+
+ @each $name, $value in $more-colors {
+ $i: 100;
+
+ @while $i<=900 {
+ &.bg-#{$name}-#{$i} {
+ color: color-contrast(map-get($value, $i));
+ }
+
+ &.text-#{$name}-#{$i} {
+ background-color: color-contrast(map-get($value, $i));
+ }
+
+ $i: $i + 100;
+ }
+ }
+}
+
+.row {
+ > div {
+ .color-block {
+ &:first-child {
+ margin-top: 0;
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+}
+
+.pagination {
+ .page-item {
+ .page-link {
+ border-radius: 0;
+ }
+ &:first-child {
+ .page-link {
+ border-radius: var(--bs-pagination-border-radius) 0 0 var(--bs-pagination-border-radius);
+ }
+ }
+ &:last-child {
+ .page-link {
+ border-radius: 0 var(--bs-pagination-border-radius) var(--bs-pagination-border-radius) 0;
+ }
+ }
+ }
+}
+
+.form-search {
+ position: relative;
+ i {
+ position: absolute;
+ top: 12px;
+ left: 15px;
+ font-size: 20px;
+ }
+ .form-control {
+ padding-left: 50px;
+ }
+
+ &.product-search {
+ i {
+ font-size: 13px;
+ color: rgba(0, 0, 0, 0.54);
+ top: 12px;
+ }
+
+ .form-control {
+ padding-left: 35px;
+ }
+ }
+}
+
+// offcanvas page css
+.customer-body {
+ height: calc(100% - 60px);
+}
+.offcanvas-top,
+.offcanvas-bottom {
+ min-height: 240px;
+}
diff --git a/jambotron-ui/src/scss/themes/generic.scss b/jambotron-ui/src/scss/themes/generic.scss
new file mode 100644
index 0000000..102780c
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/generic.scss
@@ -0,0 +1,184 @@
+/** =====================
+ Generic-class css start
+========================== **/
+/*====== Padding , Margin css starts ======*/
+$i: 0;
+@while $i<=50 {
+ .p {
+ &-#{$i} {
+ padding: #{$i}px;
+ }
+
+ &-t-#{$i} {
+ padding-top: #{$i}px;
+ }
+
+ &-b-#{$i} {
+ padding-bottom: #{$i}px;
+ }
+
+ &-l-#{$i} {
+ padding-left: #{$i}px;
+ }
+
+ &-r-#{$i} {
+ padding-right: #{$i}px;
+ }
+ }
+
+ .m {
+ &-#{$i} {
+ margin: #{$i}px;
+ }
+
+ &-t-#{$i} {
+ margin-top: #{$i}px;
+ }
+
+ &-b-#{$i} {
+ margin-bottom: #{$i}px;
+ }
+
+ &-l-#{$i} {
+ margin-left: #{$i}px;
+ }
+
+ &-r-#{$i} {
+ margin-right: #{$i}px;
+ }
+ }
+ $i: $i + 5;
+}
+/*====== Padding , Margin css ends ======*/
+/*====== Font-size css starts ======*/
+$i: 6;
+@while $i<=80 {
+ .f-#{$i} {
+ font-size: #{$i}px;
+ }
+ $i: $i + 2;
+}
+/*====== Font-size css ends ======*/
+/*====== Font-weight css starts ======*/
+$i: 100;
+@while $i<=900 {
+ .f-w-#{$i} {
+ font-weight: #{$i};
+ }
+ $i: $i + 100;
+}
+/*====== Font-weight css ends ======*/
+/*====== width, Height css starts ======*/
+$i: 10;
+@while $i<=150 {
+ .wid-#{$i} {
+ width: #{$i}px;
+ }
+
+ .hei-#{$i} {
+ height: #{$i}px;
+ }
+ $i: $i + 5;
+}
+/*====== width, Height css ends ======*/
+/*====== border-width css starts ======*/
+$i: 1;
+@while $i<=8 {
+ .b-wid-#{$i} {
+ border-width: #{$i}px;
+ }
+ $i: $i + 1;
+}
+/*====== border-width css ends ======*/
+/*====== background starts ======*/
+
+.text-header {
+ color: var(--bs-heading-color);
+}
+.bg-body {
+ background: var(--bs-body-bg);
+}
+@each $color, $value in $theme-colors {
+ .bg-light-#{$color} {
+ background: shift-color($value, $soft-bg-level);
+ color: $value;
+ }
+
+ .icon-svg-#{$color} {
+ fill: shift-color($value, $soft-bg-level);
+ stroke: $value;
+ }
+
+ .material-icons-two-tone {
+ &.text-#{$color} {
+ background-color: $value;
+ }
+ }
+ .text-hover-#{$color}:hover {
+ color: $value !important;
+ }
+}
+/*====== background ends ======*/
+/*====== border color css starts ======*/
+@each $color, $value in $theme-colors {
+ .b-#{$color} {
+ border: 1px solid $value;
+ }
+
+ .border-bottom-#{$color} td {
+ border-bottom: 1px solid $value;
+ }
+
+ .border-bottom-#{$color} th {
+ border-bottom: 1px solid $value !important;
+ }
+
+ .fill-#{$color} {
+ fill: $value;
+ }
+}
+/*====== border color css ends ======*/
+/*====== text-color, background color css starts ======*/
+
+.text-sm {
+ font-size: 0.75rem !important;
+}
+
+/*====== more bootstrap colors start ======*/
+$more-colors: (
+ 'blue': (
+ 100: $blue-100,
+ 200: $blue-200,
+ 300: $blue-300,
+ 400: $blue-400,
+ 500: $blue-500,
+ 600: $blue-600,
+ 700: $blue-700,
+ 800: $blue-800,
+ 900: $blue-900
+ ),
+ 'gray': (
+ 100: $gray-100,
+ 200: $gray-200,
+ 300: $gray-300,
+ 400: $gray-400,
+ 500: $gray-500,
+ 600: $gray-600,
+ 700: $gray-700,
+ 800: $gray-800,
+ 900: $gray-900
+ )
+);
+@each $name, $value in $more-colors {
+ $i: 100;
+ @while $i<=900 {
+ .bg-#{$name}-#{$i} {
+ background: map-get($value, $i);
+ }
+ .text-#{$name}-#{$i} {
+ color: map-get($value, $i);
+ }
+ $i: $i + 100;
+ }
+}
+/*====== more bootstrap colors end ======*/
diff --git a/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss b/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss
new file mode 100644
index 0000000..1b6a23b
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/layouts/breadcrumb/breadcrumb.scss
@@ -0,0 +1,65 @@
+.page-header {
+ display: flex;
+ align-items: center;
+ top: $header-height;
+ left: $sidebar-width;
+ right: 0;
+ z-index: 1023;
+ min-height: 55px;
+ padding: 0px 0px 13px 0px;
+ background: transparent;
+ border-radius: $border-radius;
+
+ .page-block {
+ width: 100%;
+ }
+
+ .page-header-title {
+ display: inline-block;
+ }
+
+ h5 {
+ margin-bottom: 0;
+ margin-right: 8px;
+ padding-right: 8px;
+ font-weight: 500;
+ }
+
+ .breadcrumb {
+ padding: 0;
+ display: inline-flex;
+ margin-bottom: 0;
+ background: transparent;
+ font-size: 13px;
+
+ a {
+ color: var(--pc-sidebar-color);
+ }
+
+ .breadcrumb-item {
+ .home {
+ color: $gray-600;
+ font-size: 14px;
+ }
+
+ a:hover {
+ color: $primary;
+ }
+
+ + .breadcrumb-item::before {
+ position: relative;
+ top: 2px;
+ }
+
+ &:last-child {
+ opacity: 0.75;
+ }
+ }
+
+ svg {
+ width: 14px;
+ height: 14px;
+ vertical-align: baseline;
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/layouts/footer/footer.scss b/jambotron-ui/src/scss/themes/layouts/footer/footer.scss
new file mode 100644
index 0000000..ccfdf10
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/layouts/footer/footer.scss
@@ -0,0 +1,23 @@
+.pc-footer {
+ position: relative;
+ z-index: 995;
+ margin-left: $sidebar-width;
+ margin-top: $header-height;
+ padding: 15px 0;
+ background: rgb(250, 250, 251);
+ padding: 12px 48px;
+
+ .footer-wrapper {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+
+ .footer-link {
+ .list-inline-item:not(:last-child) {
+ margin-right: 0.9rem;
+ }
+ }
+ @media (max-width: 1024px) {
+ margin-left: 0;
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss b/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss
new file mode 100644
index 0000000..320f103
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/layouts/menu/sidebar.scss
@@ -0,0 +1,338 @@
+.pc-sidebar {
+ background: var(--pc-sidebar-background);
+ width: $sidebar-width;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ overflow: hidden;
+ z-index: 1026;
+ box-shadow: var(--pc-sidebar-shadow);
+ display: block;
+ height: 100vh;
+ color: var(--pc-sidebar-color);
+ border-right: 1px solid rgb(240, 240, 240);
+
+ a {
+ color: #262626;
+ cursor: pointer;
+ }
+
+ .navbar-wrapper {
+ width: 100%;
+ height: 100%;
+ }
+
+ ul {
+ list-style: none;
+ padding-left: 0;
+ margin-bottom: 0;
+ }
+
+ .m-header {
+ height: $header-height;
+ display: flex;
+ align-items: center;
+ padding: 16px 24px;
+ position: relative;
+
+ .logo-sm {
+ display: none;
+ }
+ }
+
+ .nav-card {
+ background: $gray-100;
+ }
+
+ .user-profile-section {
+ padding: 10px 24px;
+ border-top: 2px solid rgb(240, 240, 240);
+ .dropdown-toggle::after {
+ display: none;
+ }
+
+ .user-images {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ line-height: 1;
+ border-radius: 50%;
+ overflow: hidden;
+ width: 46px;
+ height: 46px;
+
+ img {
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ object-fit: cover;
+ color: transparent;
+ text-indent: 10000px;
+ }
+ }
+ }
+
+ &.navbar-collapsed {
+ width: 0px;
+ height: 100%;
+ transition: all 0.3s ease-in-out;
+
+ ~ app-nav-bar .pc-header {
+ left: 0px;
+ }
+
+ ~ .pc-footer {
+ margin-left: 20px;
+ }
+
+ ~ .pc-container {
+ margin-left: 0px;
+ }
+
+ .navbar-wrapper {
+ .m-header {
+ left: -260px;
+ }
+ }
+ }
+ .navbar-content {
+ // position: relative;
+ // height: calc(100vh - 60px);
+ padding: 16px 0;
+
+ .coded-inner-navbar {
+ flex-direction: column;
+
+ app-nav-item > li.active:after {
+ top: 0 !important;
+ height: 100% !important;
+ }
+
+ li {
+ &.coded-hasmenu {
+ position: relative;
+ padding-bottom: 2px;
+
+ > a {
+ &:after {
+ content: '\e844';
+ font-family: 'feather';
+ font-size: 15px;
+ border: none;
+ position: absolute;
+ top: 11px;
+ right: 20px;
+ transition: 0.3s ease-in-out;
+ }
+ }
+
+ .coded-submenu {
+ opacity: 0;
+ visibility: hidden;
+ transform-origin: 50% 50%;
+ transition:
+ transform 0.3s,
+ opacity 0.3s;
+ transform-style: preserve-3d;
+ transform: rotateX(-90deg);
+ position: absolute;
+ display: block;
+
+ > app-nav-item li {
+ > a {
+ text-align: left;
+ padding: 12px 30px 12px 55px;
+ margin: 0;
+ display: block;
+
+ &:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 2px;
+ height: 100%;
+ }
+ }
+ }
+
+ > app-nav-collapse li {
+ > a {
+ text-align: left;
+ padding: 12px 30px 12px 55px;
+ margin: 0;
+ display: block;
+ }
+ .coded-submenu > {
+ app-nav-item li {
+ > a {
+ padding: 12px 30px 12px 75px;
+ }
+ }
+ }
+ }
+ }
+
+ &.coded-trigger {
+ > a {
+ &:after {
+ transform: rotate(90deg);
+ }
+ }
+
+ > .coded-submenu {
+ position: relative;
+ opacity: 1;
+ visibility: visible;
+ transform: rotateX(0deg);
+ }
+ }
+ }
+
+ &.coded-menu-caption {
+ font-size: 0.75rem;
+ font-weight: 500;
+ padding: 12px 24px 12px;
+ text-transform: capitalize;
+ position: relative;
+ color: $gray-600;
+
+ &.first-group {
+ padding: 0px 24px 12px;
+ }
+ }
+
+ > a {
+ padding: 12px 16px 12px 28px;
+ display: flex;
+ align-items: center;
+ border-radius: 5px;
+ position: relative;
+
+ .coded-mtext {
+ position: relative;
+ }
+
+ > .coded-micon {
+ font-size: 16px;
+ margin-right: 8px;
+ height: 16px;
+ display: inline-block;
+ text-align: center;
+
+ i {
+ display: flex;
+ }
+
+ + .coded-mtext {
+ position: relative;
+ vertical-align: middle;
+ text-align: center;
+ }
+ }
+ }
+ }
+
+ app-nav-item {
+ li {
+ > a {
+ > .coded-micon {
+ margin-right: 12px;
+ }
+ }
+ }
+ }
+
+ > app-nav-group > app-nav-item {
+ li {
+ position: relative;
+ &:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 2px;
+ height: 100%;
+ }
+ }
+ }
+ }
+ }
+
+ .version {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ margin-bottom: 16px;
+ cursor: pointer;
+
+ label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ padding-left: 8px;
+ padding-right: 8px;
+ white-space: nowrap;
+ background-color: rgb(250, 250, 250);
+ color: rgb(158, 158, 158);
+ border-radius: 16px;
+ }
+ }
+}
+
+@media (min-width: 1025px) {
+ .pc-sidebar {
+ transition: width 0.15s ease;
+ ~ .pc-header {
+ transition: left 0.15s ease;
+ }
+ ~ .pc-footer,
+ ~ .pc-container {
+ transition: margin-left 0.15s ease;
+ }
+ &.pc-sidebar-hide {
+ width: 0;
+ ~ .pc-header {
+ left: 0;
+ }
+ ~ .pc-footer,
+ ~ .pc-container {
+ margin-left: 0px;
+ }
+ }
+ }
+}
+
+@media (max-width: 1024px) {
+ .pc-header .pc-h-item.pc-sidebar-collapse {
+ display: none;
+ }
+ .pc-sidebar {
+ left: -#{$sidebar-width};
+ box-shadow: none;
+ top: 0;
+ transition: all 0.15s ease-in-out;
+
+ &.mob-open {
+ left: 0;
+
+ .navbar-wrapper {
+ position: relative;
+ z-index: 5;
+ background: inherit;
+ }
+
+ ~ .pc-container {
+ .pc-menu-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 1025;
+ }
+ }
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss b/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss
new file mode 100644
index 0000000..7e5240c
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/layouts/navbar/navbar.scss
@@ -0,0 +1,465 @@
+.pc-header {
+ background: var(--pc-header-background);
+ color: var(--pc-header-color);
+ min-height: $header-height;
+ border-bottom: 1px solid rgb(240, 240, 240);
+ position: fixed;
+ left: $sidebar-width;
+ right: 0;
+ z-index: 1025;
+ display: flex;
+
+ ul {
+ margin-bottom: 0;
+ display: inline-flex;
+ }
+
+ .m-header {
+ height: $header-height;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: $sidebar-width;
+ padding: 16px 10px 16px 24px;
+ }
+
+ .header-wrapper {
+ display: flex;
+ padding: 0 25px 0px 12px;
+ flex-grow: 1;
+ justify-content: space-between;
+
+ @include media-breakpoint-down(sm) {
+ padding: 0 15px;
+ }
+ }
+
+ .header-search {
+ position: relative;
+
+ .form-control {
+ border-radius: $border-radius;
+ padding: 0.344rem 1.8rem;
+ width: 200px;
+ max-width: 100%;
+ font-size: 0.75rem;
+
+ @media (max-width: 1024px) {
+ width: 100%;
+ }
+ }
+
+ .search {
+ position: absolute;
+ top: 5px;
+ left: 11px;
+ width: 12px;
+ height: 12px;
+ }
+
+ .btn-search {
+ position: absolute;
+ top: 7px;
+ right: 9px;
+ padding: 0;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 34px;
+ height: 34px;
+ border-radius: $border-radius;
+ }
+ }
+
+ .pc-h-item {
+ min-height: $header-height;
+ display: flex;
+ align-items: center;
+ position: relative;
+ }
+
+ .pc-head-link {
+ margin: 0 8px;
+ position: relative;
+ font-weight: 500;
+ padding: 0;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 34px;
+ height: 34px;
+ border-radius: $border-radius;
+ color: var(--pc-header-color);
+ overflow: hidden;
+
+ &.dropdown-toggle::after {
+ display: none;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 1;
+ background: var(--pc-active-background);
+ border-radius: 50%;
+ transform: scale(0);
+ transition: all 0.08s cubic-bezier(0.37, 0.24, 0.53, 0.99);
+ }
+
+ > img,
+ > span,
+ > svg,
+ > i {
+ position: relative;
+ z-index: 5;
+ transition: all 0.08s cubic-bezier(0.37, 0.24, 0.53, 0.99);
+ }
+
+ > i {
+ color: var(--pc-header-color);
+ font-size: 16px;
+ }
+
+ > svg {
+ width: 20px;
+ height: 20px;
+ }
+
+ &.active,
+ &:active,
+ &:focus,
+ &:hover {
+ text-decoration: none;
+ color: var(--pc-header-color);
+
+ > svg,
+ > i {
+ color: var(--pc-header-color);
+ }
+
+ &::before {
+ border-radius: 0;
+ transform: scale(1);
+ }
+
+ .hamburger {
+ .hamburger-inner {
+ background-color: $secondary;
+
+ &::after,
+ &::before {
+ background-color: $secondary;
+ }
+ }
+ }
+
+ i.material-icons-two-tone {
+ background-color: $secondary;
+ }
+ }
+
+ .pc-h-badge {
+ display: flex;
+ flex-flow: wrap;
+ place-content: center;
+ font-weight: 500;
+ font-size: 0.75rem;
+ line-height: 1;
+ transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
+ transform-origin: 100% 0%;
+ min-width: 16px;
+ height: 16px;
+ padding: 4px;
+ position: absolute;
+ top: 2px;
+ right: 2px;
+ border-radius: 50%;
+ z-index: 9;
+
+ &.dots {
+ width: 9px;
+ height: 9px;
+ top: 7px;
+ right: 16px;
+ padding: 0;
+ }
+ }
+
+ .user-desc,
+ .user-name {
+ display: block;
+ line-height: 1;
+ }
+
+ .user-name {
+ margin-bottom: 5px;
+
+ font: {
+ size: 15px;
+ weight: 600;
+ }
+ }
+
+ .user-desc {
+ font: {
+ size: 12px;
+ weight: 400;
+ }
+
+ color: var(--pc-header-color);
+ }
+
+ .settings {
+ animation: anim-rotate 2s infinite linear;
+ }
+ }
+
+ .pc-h-dropdown {
+ transform: none !important;
+ top: 100% !important;
+
+ &.dropdown-menu-end {
+ right: 0 !important;
+ left: auto !important;
+ }
+ }
+
+ .drp-search {
+ min-width: 20rem;
+ }
+
+ .user-avatar {
+ width: 40px;
+ border-radius: 50%;
+ }
+
+ .header-user-profile {
+ .pc-head-link {
+ width: auto;
+ padding: 7px;
+
+ > span > i {
+ font-size: 22px;
+ margin-right: 8px;
+ }
+
+ .user-avatar {
+ width: 34px;
+ }
+
+ @include media-breakpoint-down(sm) {
+ width: 40px;
+
+ .user-avatar {
+ margin-right: 0;
+ }
+
+ > span,
+ > span > i {
+ display: none;
+ }
+ }
+ }
+ }
+
+ .dropdown-user-profile {
+ min-width: 290px;
+ max-width: 100%;
+ .drp-tabs {
+ border-bottom: 0;
+ display: flex;
+ margin-bottom: 10px;
+ .nav-item {
+ margin-bottom: -0px;
+ .nav-link {
+ position: relative;
+ padding: 0.7rem;
+ font-weight: 500;
+ color: $body-color;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ i {
+ font-size: 18px;
+ margin: 0 4px;
+ }
+ .material-icons-two-tone {
+ font-size: 20px;
+ }
+ &:after {
+ content: '';
+ background: $primary;
+ position: absolute;
+ transition: all 0.3s ease-in-out;
+ left: 50%;
+ right: 50%;
+ bottom: -1px;
+ height: 2px;
+ border-radius: 2px 2px 0 0;
+ }
+ }
+ }
+
+ .nav-link:hover {
+ border-color: transparent;
+ color: $primary;
+ .material-icons-two-tone {
+ background-color: $primary;
+ }
+ }
+
+ .nav-item.show .nav-link,
+ .nav-link.active {
+ border-color: transparent;
+ color: $primary;
+ .material-icons-two-tone {
+ background-color: $primary;
+ }
+ &:after {
+ left: 0;
+ right: 0;
+ }
+ }
+ }
+ .tab-content {
+ .dropdown-item {
+ i {
+ font-size: 14px;
+ }
+ svg {
+ margin-right: 0px;
+ width: 14px;
+ height: 14px;
+ }
+ }
+ }
+ }
+
+ .dropdown-notification {
+ min-width: 420px;
+ max-width: 100%;
+
+ .list-group-item-action {
+ &:active,
+ &:hover,
+ &:focus {
+ background: shift-color($primary, $soft-bg-level);
+ }
+
+ .user-avatar,
+ h5 {
+ cursor: pointer;
+ }
+ }
+
+ .badge {
+ font-size: 0.8125rem;
+ padding: 0.43em 1em;
+ }
+
+ .user-avatar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ font-size: 20px;
+ }
+
+ .notification-file {
+ display: flex;
+ align-items: center;
+
+ i {
+ font-size: 20px;
+ margin-right: 16px;
+ }
+ }
+ @media (max-width: 575.98px) {
+ min-width: 100%;
+ }
+ }
+}
+
+@keyframes anim-rotate {
+ 0% {
+ transform: rotate(0);
+ }
+
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (min-width: 1025px) {
+ .pc-header .pc-h-item.pc-sidebar-popup {
+ display: none;
+ }
+}
+
+@media (max-width: 1024px) {
+ .pc-header {
+ top: 0;
+ left: 0;
+ transition: all 0.15s ease-in-out;
+
+ .m-header {
+ display: none;
+ }
+
+ .pc-head-link {
+ .user-desc,
+ .user-name {
+ display: none;
+ }
+ }
+
+ .pc-mob-drp {
+ &.mob-drp-active {
+ .pc-h-item {
+ display: block;
+ min-height: auto;
+ position: relative;
+
+ .pc-head-link {
+ display: block;
+ margin: 5px 10px !important;
+ }
+
+ .dropdown-menu {
+ position: relative !important;
+ width: 100%;
+ float: none;
+ box-shadow: none;
+ }
+ }
+
+ ul {
+ display: block;
+ }
+ }
+ }
+ }
+}
+
+@include media-breakpoint-down(sm) {
+ .pc-header {
+ .pc-head-link {
+ padding: 0.65rem;
+ margin: 0 5px;
+ }
+
+ .pc-h-item {
+ position: static;
+
+ .pc-h-dropdown {
+ left: 0 !important;
+ right: 0 !important;
+ }
+ }
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/layouts/pc-common.scss b/jambotron-ui/src/scss/themes/layouts/pc-common.scss
new file mode 100644
index 0000000..c45fdd7
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/layouts/pc-common.scss
@@ -0,0 +1,41 @@
+body {
+ background-color: $white;
+}
+
+.pc-container {
+ $temp: $header-height + 53;
+ position: relative;
+ top: $header-height;
+ margin-left: $sidebar-width;
+ min-height: calc(100vh - #{$temp});
+ background: rgba(250, 250, 251, 0.7);
+
+ .coded-content {
+ padding-left: 48px;
+ padding-right: 48px;
+ padding-top: 24px;
+ @include media-breakpoint-down(xl) {
+ &.container {
+ max-width: 100%;
+ }
+ }
+ @include media-breakpoint-down(md) {
+ padding-left: 32px;
+ padding-right: 32px;
+ padding-top: 16px;
+ }
+ }
+
+ .page-header + .row {
+ padding-top: 24px;
+ }
+
+ .page-header + .coded-content {
+ padding-top: calc(30px + 55px);
+ }
+
+ @media (max-width: 1024px) {
+ margin-left: 0px;
+ margin-right: 0px;
+ }
+}
diff --git a/jambotron-ui/src/scss/themes/preset-style.scss b/jambotron-ui/src/scss/themes/preset-style.scss
new file mode 100644
index 0000000..57ca0af
--- /dev/null
+++ b/jambotron-ui/src/scss/themes/preset-style.scss
@@ -0,0 +1,87 @@
+@import '../settings/color-variables.scss';
+
+:root {
+ @each $name, $value in $preset-colors {
+ $pc-primary: map-get($value, 'primary');
+ $color-rgb: to-rgb($pc-primary);
+ --bs-blue: #{$pc-primary};
+ --bs-primary-rgb: #{$color-rgb};
+ }
+}
+
+.pc-sidebar {
+ .coded-inner-navbar {
+ > app-nav-group {
+ > app-nav-collapse {
+ .coded-hasmenu {
+ &.active,
+ &:focus,
+ &:hover {
+ > a {
+ background: rgba(var(--bs-primary-rgb), 0.1);
+ }
+
+ &.coded-trigger {
+ > a {
+ color: var(--bs-blue);
+ background: none;
+ }
+
+ .coded-submenu {
+ > app-nav-item {
+ li {
+ &.active,
+ &:focus,
+ &:hover {
+ > a {
+ background: rgba(var(--bs-primary-rgb), 0.1);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .coded-submenu > app-nav-item li {
+ &.active {
+ > a {
+ background: rgba(var(--bs-primary-rgb), 0.1);
+ color: var(--bs-blue);
+
+ &:before {
+ background: var(--bs-blue);
+ }
+ }
+ }
+ }
+ }
+ > app-nav-item {
+ li {
+ &.nav-item {
+ &.active,
+ &:focus,
+ &:hover {
+ background: rgba(var(--bs-primary-rgb), 0.1);
+ }
+
+ &.active {
+ > a {
+ color: var(--bs-blue);
+
+ .coded-micon {
+ color: var(--bs-blue);
+ }
+ }
+
+ &:before {
+ background: var(--bs-blue);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/jambotron-ui/src/server.ts b/jambotron-ui/src/server.ts
new file mode 100644
index 0000000..e6546c4
--- /dev/null
+++ b/jambotron-ui/src/server.ts
@@ -0,0 +1,68 @@
+import {
+ AngularNodeAppEngine,
+ createNodeRequestHandler,
+ isMainModule,
+ writeResponseToNodeResponse,
+} from '@angular/ssr/node';
+import express from 'express';
+import { join } from 'node:path';
+
+const browserDistFolder = join(import.meta.dirname, '../browser');
+
+const app = express();
+const angularApp = new AngularNodeAppEngine();
+
+/**
+ * Example Express Rest API endpoints can be defined here.
+ * Uncomment and define endpoints as necessary.
+ *
+ * Example:
+ * ```ts
+ * app.get('/api/{*splat}', (req, res) => {
+ * // Handle API request
+ * });
+ * ```
+ */
+
+/**
+ * Serve static files from /browser
+ */
+app.use(
+ express.static(browserDistFolder, {
+ maxAge: '1y',
+ index: false,
+ redirect: false,
+ }),
+);
+
+/**
+ * Handle all other requests by rendering the Angular application.
+ */
+app.use((req, res, next) => {
+ angularApp
+ .handle(req)
+ .then((response) =>
+ response ? writeResponseToNodeResponse(response, res) : next(),
+ )
+ .catch(next);
+});
+
+/**
+ * Start the server if this module is the main entry point.
+ * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000.
+ */
+if (isMainModule(import.meta.url)) {
+ const port = process.env['PORT'] || 4000;
+ app.listen(port, (error) => {
+ if (error) {
+ throw error;
+ }
+
+ console.log(`Node Express server listening on http://localhost:${port}`);
+ });
+}
+
+/**
+ * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions.
+ */
+export const reqHandler = createNodeRequestHandler(app);
diff --git a/jambotron-ui/src/styles.scss b/jambotron-ui/src/styles.scss
index 6a65fe0..cea92f3 100644
--- a/jambotron-ui/src/styles.scss
+++ b/jambotron-ui/src/styles.scss
@@ -1,4 +1,42 @@
/* You can add global styles to this file, and also import other style files */
+/**======================================================================
+=========================================================================
+Template Name: MAntis Angular - Angular Admin Template
+Author: codedThemes
+Support: https://codedthemes.support-hub.io/
+File: style.css
+=========================================================================
+=================================================================================== */
+
+// main framework
+@import '../node_modules/bootstrap/scss/functions';
+@import '../node_modules/bootstrap/scss/variables';
+@import '../node_modules/bootstrap/scss/variables-dark';
+
+@import 'scss/settings/color-variables';
+@import 'scss/settings/theme-variables';
+@import 'scss/settings/bootstrap-variables';
+
+// bootstrap import
+@import 'scss/bootstrap/bootstrap.scss';
+
+@import '../node_modules/bootstrap/scss/utilities';
+@import '../node_modules/bootstrap/scss/utilities/api';
+
+// main framework
+@import 'scss/themes/generic.scss';
+@import 'scss/themes/general.scss';
+
+@import 'scss/themes/components/components.scss';
+
+// theme
+@import 'scss/themes/layouts/menu/sidebar.scss';
+@import 'scss/themes/layouts/navbar/navbar.scss';
+@import 'scss/themes/layouts/pc-common.scss';
+@import 'scss/themes/layouts/breadcrumb/breadcrumb.scss';
+@import 'scss/themes/layouts/footer/footer.scss';
+
+@import 'scss/themes/preset-style.scss';
html, body { height: 100%; }
body {
@@ -8,3 +46,8 @@ body {
background-size: cover;
margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif;
}
+
+.router_outlet_padding{
+ padding-top: 60px;
+ scroll-padding-inline: 40%;
+}
diff --git a/jambotron-ui/tsconfig.app.json b/jambotron-ui/tsconfig.app.json
index 32a7a81..ef19921 100644
--- a/jambotron-ui/tsconfig.app.json
+++ b/jambotron-ui/tsconfig.app.json
@@ -5,8 +5,7 @@
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": [
- "node",
- "@angular/localize"
+ "node"
]
},
"include": [
diff --git a/logs/application.log.2025-06-21.0.gz b/logs/application.log.2025-06-21.0.gz
new file mode 100644
index 0000000..f916f89
Binary files /dev/null and b/logs/application.log.2025-06-21.0.gz differ
diff --git a/logs/application.log.2025-06-22.0.gz b/logs/application.log.2025-06-22.0.gz
new file mode 100644
index 0000000..3f93117
Binary files /dev/null and b/logs/application.log.2025-06-22.0.gz differ
diff --git a/logs/application.log.2025-06-23.0.gz b/logs/application.log.2025-06-23.0.gz
new file mode 100644
index 0000000..83ead94
Binary files /dev/null and b/logs/application.log.2025-06-23.0.gz differ
diff --git a/logs/application.log.2025-06-24.0.gz b/logs/application.log.2025-06-24.0.gz
new file mode 100644
index 0000000..b9e1d05
Binary files /dev/null and b/logs/application.log.2025-06-24.0.gz differ