@zambon-dev/ui 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +2329 -0
  2. package/README.md +80 -2
  3. package/fesm2022/zambon-dev-ui-framework.mjs +5960 -0
  4. package/fesm2022/zambon-dev-ui-framework.mjs.map +1 -0
  5. package/fesm2022/zambon-dev-ui-library.mjs +5795 -0
  6. package/fesm2022/zambon-dev-ui-library.mjs.map +1 -0
  7. package/fesm2022/zambon-dev-ui-shared.mjs +2517 -0
  8. package/fesm2022/zambon-dev-ui-shared.mjs.map +1 -0
  9. package/fesm2022/zambon-dev-ui-testing.mjs +76 -0
  10. package/fesm2022/zambon-dev-ui-testing.mjs.map +1 -0
  11. package/fesm2022/zambon-dev-ui.mjs +3 -0
  12. package/i18n/framework/en.json +63 -0
  13. package/i18n/framework/pt.json +63 -0
  14. package/i18n/shared/external-content/en.json +12 -0
  15. package/i18n/shared/external-content/pt.json +12 -0
  16. package/i18n/shared/language-selector/en.json +5 -0
  17. package/i18n/shared/language-selector/pt.json +5 -0
  18. package/i18n/shared/login/en.json +14 -0
  19. package/i18n/shared/login/pt.json +14 -0
  20. package/i18n/shared/operations-history/en.json +5 -0
  21. package/i18n/shared/operations-history/pt.json +5 -0
  22. package/i18n/shared/services-history/en.json +14 -0
  23. package/i18n/shared/services-history/pt.json +14 -0
  24. package/i18n/shared/top-bar/en.json +7 -0
  25. package/i18n/shared/top-bar/pt.json +7 -0
  26. package/package.json +106 -4
  27. package/styles/common.scss +10 -0
  28. package/styles/components/button.scss +101 -0
  29. package/styles/components/card.scss +13 -0
  30. package/styles/components/dropdown-static.scss +35 -0
  31. package/styles/components/input-group.scss +44 -0
  32. package/styles/components/input.scss +99 -0
  33. package/styles/components/label.scss +3 -0
  34. package/styles/components/row.scss +48 -0
  35. package/styles/mixins/background.scss +31 -0
  36. package/styles/theme.css +75 -0
  37. package/styles/variables.scss +60 -0
  38. package/types/zambon-dev-ui-framework.d.ts +1496 -0
  39. package/types/zambon-dev-ui-library.d.ts +1675 -0
  40. package/types/zambon-dev-ui-shared.d.ts +675 -0
  41. package/types/zambon-dev-ui-testing.d.ts +51 -0
  42. package/types/zambon-dev-ui.d.ts +3 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "ExternalContent-Blocked-Title": "Cannot be displayed",
3
+ "ExternalContent-Blocked-Message": "This menu item points to an address that is not allowed. Ask an administrator to review it.",
4
+ "ExternalContent-Insecure-Title": "Cannot be embedded",
5
+ "ExternalContent-Insecure-Message": "This address is http, and the browser will not display insecure content inside a secure page. Open it in a new browser tab, or ask an administrator for an https address.",
6
+ "ExternalContent-OpenInNewTab": "Open in a new browser tab",
7
+ "ExternalContent-SlowHint": "Still loading. Some sites do not allow being displayed inside another application — try opening it in a new browser tab.",
8
+ "ExternalContent-Unavailable-Title": "Content unavailable",
9
+ "ExternalContent-Unavailable-Message": "Reopen this item from the menu to load it.",
10
+
11
+ "": ""
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "ExternalContent-Blocked-Title": "Não é possível exibir",
3
+ "ExternalContent-Blocked-Message": "Este item de menu aponta para um endereço não permitido. Peça a um administrador para revisá-lo.",
4
+ "ExternalContent-Insecure-Title": "Não pode ser incorporado",
5
+ "ExternalContent-Insecure-Message": "Este endereço é http, e o navegador não exibe conteúdo não seguro dentro de uma página segura. Abra em uma nova aba do navegador ou peça a um administrador um endereço https.",
6
+ "ExternalContent-OpenInNewTab": "Abrir em nova aba do navegador",
7
+ "ExternalContent-SlowHint": "Ainda carregando. Alguns sites não permitem ser exibidos dentro de outra aplicação — tente abrir em uma nova aba do navegador.",
8
+ "ExternalContent-Unavailable-Title": "Conteúdo indisponível",
9
+ "ExternalContent-Unavailable-Message": "Reabra este item pelo menu para carregá-lo.",
10
+
11
+ "": ""
12
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "LanguageSelector-Title": "Select language",
3
+
4
+ "": ""
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "LanguageSelector-Title": "Selecionar idioma",
3
+
4
+ "": ""
5
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "Login-DesignBy": "Design by Ricardo Zambon",
3
+ "Login-Errors-InternalServerError": "Occurred some error with the server, please try again.",
4
+ "Login-Errors-Invalid": "The username or password you entered is incorrect.",
5
+ "Login-Password-Required": "Please enter the password",
6
+ "Login-Password": "Type your password",
7
+ "Login-RememberMe": "Remember me",
8
+ "Login-SelectLanguage": "Select language",
9
+ "Login-SignIn": "Sign In",
10
+ "Login-Username-Required": "Please enter the username",
11
+ "Login-Username": "Type your username",
12
+
13
+ "": ""
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "Login-DesignBy": "Design por Ricardo Zambon",
3
+ "Login-Errors-InternalServerError": "Ocorreu algum erro no servidor, por favor tente novamente.",
4
+ "Login-Errors-Invalid": "O usuário ou senha informados são inválidos",
5
+ "Login-Password-Required": "Por favor informe a senha",
6
+ "Login-Password": "Digite a sua senha",
7
+ "Login-RememberMe": "Lembrar de mim",
8
+ "Login-SelectLanguage": "Selecionar idioma",
9
+ "Login-SignIn": "Entrar",
10
+ "Login-Username-Required": "Por favor informe o usuário",
11
+ "Login-Username": "Digite o seu usuário",
12
+
13
+ "": ""
14
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "OperationsHistory-Modal-Title": "Object changes details",
3
+
4
+ "": ""
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "OperationsHistory-Modal-Title": "Detalhes de alteração do objeto",
3
+
4
+ "": ""
5
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "ServicesHistory-Field-ChangedBy": "Employee",
3
+ "ServicesHistory-Field-ChangedOnFrom": "From",
4
+ "ServicesHistory-Field-ChangedOnTo": "To",
5
+ "ServicesHistory-Field-Name": "Action",
6
+ "ServicesHistory-Field-OnlyCurrentEntity": "This record only?",
7
+ "ServicesHistory-Field-OnlyCurrentEntity-Notes": "An action usually writes to more than one table, and every operation it performed is listed by default — that is what shows the related records a change also touched. Tick this to see only the operations on this record.",
8
+ "ServicesHistory-Filters-Title": "History filters",
9
+ "ServicesHistory-FormGroup-Operations": "Operations",
10
+ "ServicesHistory-FormGroup-Period": "Period",
11
+ "ServicesHistory-FormGroup-Service": "Action",
12
+
13
+ "": ""
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "ServicesHistory-Field-ChangedBy": "Funcionário",
3
+ "ServicesHistory-Field-ChangedOnFrom": "De",
4
+ "ServicesHistory-Field-ChangedOnTo": "Até",
5
+ "ServicesHistory-Field-Name": "Ação",
6
+ "ServicesHistory-Field-OnlyCurrentEntity": "Apenas este registro?",
7
+ "ServicesHistory-Field-OnlyCurrentEntity-Notes": "Uma ação costuma alterar mais de uma tabela, e por padrão são listadas todas as operações que ela realizou — é isso que mostra os registros relacionados que a alteração também tocou. Marque para ver somente as operações sobre este registro.",
8
+ "ServicesHistory-Filters-Title": "Filtros do histórico",
9
+ "ServicesHistory-FormGroup-Operations": "Operações",
10
+ "ServicesHistory-FormGroup-Period": "Período",
11
+ "ServicesHistory-FormGroup-Service": "Ação",
12
+
13
+ "": ""
14
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "TopBar-Notifications-Title": "Notifications",
3
+ "TopBar-Notifications-Empty": "No notifications",
4
+ "TopBar-Notifications-MarkAllRead": "Mark all as read",
5
+
6
+ "": ""
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "TopBar-Notifications-Title": "Notificações",
3
+ "TopBar-Notifications-Empty": "Nenhuma notificação",
4
+ "TopBar-Notifications-MarkAllRead": "Marcar todas como lidas",
5
+
6
+ "": ""
7
+ }
package/package.json CHANGED
@@ -1,6 +1,108 @@
1
1
  {
2
2
  "name": "@zambon-dev/ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Angular UI components, application framework and shared application layer for Zambon applications.",
5
+ "keywords": [
6
+ "angular",
7
+ "components",
8
+ "framework",
9
+ "shared",
10
+ "ui",
11
+ "zambon",
12
+ "zlibraries"
13
+ ],
14
+ "author": "Ricardo Zambon",
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/RicardoZambon/ZLibraries.git",
19
+ "directory": "libs/ui"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/RicardoZambon/ZLibraries/issues"
23
+ },
24
+ "homepage": "https://github.com/RicardoZambon/ZLibraries/tree/main/libs/ui#readme",
25
+ "peerDependencies": {
26
+ "@angular/cdk": "^22.0.0",
27
+ "@angular/common": "^22.0.0",
28
+ "@angular/core": "^22.0.0",
29
+ "@angular/forms": "^22.0.0",
30
+ "@angular/platform-browser": "^22.0.0",
31
+ "@angular/router": "^22.0.0",
32
+ "@auth0/angular-jwt": "^5.2.0",
33
+ "@microsoft/signalr": "^10.0.0",
34
+ "@ngx-translate/core": "^16.0.4",
35
+ "ngx-resize-observer": "^4.0.0",
36
+ "ngx-translate-multi-http-loader": "^19.0.2",
37
+ "rxjs": "^7.8.0"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "sideEffects": [
43
+ "**/*.scss"
44
+ ],
45
+ "exports": {
46
+ "./styles/common": {
47
+ "sass": "./styles/common.scss",
48
+ "style": "./styles/common.scss",
49
+ "default": "./styles/common.scss"
50
+ },
51
+ "./styles/common.scss": {
52
+ "sass": "./styles/common.scss",
53
+ "style": "./styles/common.scss",
54
+ "default": "./styles/common.scss"
55
+ },
56
+ "./styles/variables": {
57
+ "sass": "./styles/variables.scss",
58
+ "style": "./styles/variables.scss",
59
+ "default": "./styles/variables.scss"
60
+ },
61
+ "./styles/variables.scss": {
62
+ "sass": "./styles/variables.scss",
63
+ "style": "./styles/variables.scss",
64
+ "default": "./styles/variables.scss"
65
+ },
66
+ "./styles/theme": {
67
+ "style": "./styles/theme.css",
68
+ "default": "./styles/theme.css"
69
+ },
70
+ "./styles/theme.css": {
71
+ "style": "./styles/theme.css",
72
+ "default": "./styles/theme.css"
73
+ },
74
+ "./i18n/*": {
75
+ "default": "./i18n/*"
76
+ },
77
+ "./package.json": {
78
+ "default": "./package.json"
79
+ },
80
+ ".": {
81
+ "types": "./types/zambon-dev-ui.d.ts",
82
+ "default": "./fesm2022/zambon-dev-ui.mjs"
83
+ },
84
+ "./framework": {
85
+ "types": "./types/zambon-dev-ui-framework.d.ts",
86
+ "default": "./fesm2022/zambon-dev-ui-framework.mjs"
87
+ },
88
+ "./library": {
89
+ "types": "./types/zambon-dev-ui-library.d.ts",
90
+ "default": "./fesm2022/zambon-dev-ui-library.mjs"
91
+ },
92
+ "./shared": {
93
+ "types": "./types/zambon-dev-ui-shared.d.ts",
94
+ "default": "./fesm2022/zambon-dev-ui-shared.mjs"
95
+ },
96
+ "./testing": {
97
+ "types": "./types/zambon-dev-ui-testing.d.ts",
98
+ "default": "./fesm2022/zambon-dev-ui-testing.mjs"
99
+ }
100
+ },
101
+ "style": "styles/common.scss",
102
+ "module": "fesm2022/zambon-dev-ui.mjs",
103
+ "typings": "types/zambon-dev-ui.d.ts",
104
+ "type": "module",
105
+ "dependencies": {
106
+ "tslib": "^2.3.0"
107
+ }
108
+ }
@@ -0,0 +1,10 @@
1
+ @reference './theme.css';
2
+
3
+ @import 'variables';
4
+ @import 'components/button';
5
+ @import 'components/card';
6
+ @import 'components/dropdown-static';
7
+ @import 'components/input';
8
+ @import 'components/input-group';
9
+ @import 'components/label';
10
+ @import 'components/row';
@@ -0,0 +1,101 @@
1
+ input[type='button'],
2
+ input[type='reset'],
3
+ input[type='submit'],
4
+ button,
5
+ a {
6
+ &.btn {
7
+ @apply relative px-3 py-1.5 inline-block text-center rounded-sm select-none;
8
+ @apply bg-slate-700 text-white;
9
+ @apply transition-all;
10
+
11
+ @apply focus:ring-4 focus:ring-slate-600/30;
12
+ @apply focus:bg-slate-800 hover:bg-slate-800;
13
+ @apply active:bg-slate-900;
14
+
15
+ i:not(:last-child) {
16
+ @apply mr-2;
17
+ }
18
+
19
+ &.disabled,
20
+ &:disabled {
21
+ @apply pointer-events-none opacity-[.60] ring-0;
22
+ }
23
+
24
+ &.error {
25
+ @apply bg-red-700 focus:ring-red-600/30;
26
+ @apply focus:bg-red-800 hover:bg-red-800;
27
+ @apply active:bg-red-900;
28
+
29
+ i:before {
30
+ @apply content-['\f00d'];
31
+ }
32
+ }
33
+
34
+ &.success {
35
+ @apply bg-green-700 ring-4 ring-green-600/30;
36
+ @apply pointer-events-none opacity-[.60];
37
+
38
+ i:before {
39
+ @apply content-['\f00c'];
40
+ }
41
+ }
42
+
43
+ &.loading {
44
+ @apply pointer-events-none opacity-[.60] ring-0 pl-8;
45
+ @apply transition-[margin-left] duration-200 ease-in-out;
46
+
47
+ &:before {
48
+ @apply content-[''] absolute left-2 top-0 bg-center bg-contain bg-no-repeat w-5 h-full animate-spin text-white;
49
+ @apply transition-opacity duration-200 ease-in-out;
50
+ background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"%3E%3Ccircle style="opacity:.25" cx="12" cy="12" r="10" stroke="white" stroke-width="4"%3E%3C/circle%3E%3Cpath style="opacity:.75" fill="white" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"%3E%3C/path%3E%3C/svg%3E');
51
+ }
52
+
53
+ i {
54
+ @apply invisible;
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ @mixin button($color) {
61
+ input[type='button'],
62
+ input[type='reset'],
63
+ input[type='submit'],
64
+ button,
65
+ a {
66
+ &.btn {
67
+ @for $i from 1 through 7 {
68
+ &.#{$color + '-' + $i + '00'} {
69
+ @if $i > 4 {
70
+ @apply text-white;
71
+ } @else {
72
+ @apply text-black;
73
+
74
+ &.loading:before {
75
+ background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"%3E%3Ccircle style="opacity:.25" cx="12" cy="12" r="10" stroke="black" stroke-width="4"%3E%3C/circle%3E%3Cpath style="opacity:.75" fill="black" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"%3E%3C/path%3E%3C/svg%3E');
76
+ }
77
+ }
78
+
79
+ @apply #{'bg-' + $color + '-' + $i + '00'};
80
+
81
+ $ring: $i + '00/30';
82
+ @if $i < 5 {
83
+ $ring: '400/20';
84
+ }
85
+
86
+ @apply #{'focus:ring-' + $color + '-' + $ring};
87
+ @apply #{'focus:bg-' + $color + '-' + ($i+1) + '00'};
88
+ @apply #{'hover:bg-' + $color + '-' + ($i+1) + '00'};
89
+ @apply #{'active:bg-' + $color + '-' + ($i+2) + '00'};
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+
96
+ $colors:
97
+ 'slate', 'gray', 'zinc', 'neutral', 'stone', 'red', 'orange', 'amber', 'yellow', 'lime', 'green', 'emerald', 'teal',
98
+ 'cyan', 'sky', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose', 'primary';
99
+ @each $color in $colors {
100
+ @include button($color);
101
+ }
@@ -0,0 +1,13 @@
1
+ .card {
2
+ @apply border rounded-lg relative mt-4 pt-3 px-2 pb-2;
3
+ @apply bg-white/80 border-gray-300/90;
4
+ @apply grid gap-3;
5
+
6
+ .title {
7
+ @apply text-lg font-semibold absolute -top-4 left-2 px-2 bg-white;
8
+ }
9
+
10
+ .input-group:not(:first-child) {
11
+ @apply mt-0;
12
+ }
13
+ }
@@ -0,0 +1,35 @@
1
+ .dropdown {
2
+ @apply relative;
3
+
4
+ .btn {
5
+ @apply bg-neutral-600/60 text-white border border-neutral-900/40 backdrop-blur-md;
6
+
7
+ @apply focus:ring-neutral-600/30;
8
+ @apply focus:bg-neutral-600/70 hover:bg-neutral-600/70;
9
+ @apply active:bg-neutral-600/80;
10
+
11
+ &:after {
12
+ @apply content-[''] inline-block ml-1 align-middle;
13
+ @apply border-x-[.3em] border-t-[.3em] border-solid border-x-white/0;
14
+ }
15
+ }
16
+
17
+ &.show ul {
18
+ @apply block;
19
+ }
20
+
21
+ &.right ul {
22
+ @apply right-0;
23
+ }
24
+
25
+ ul {
26
+ @apply absolute hidden py-1 rounded-sm shadow-sm;
27
+ @apply bg-white/95 border border-neutral-400 backdrop-blur-md shadow-md;
28
+
29
+ .dropdown-item {
30
+ @apply block p-2 cursor-pointer whitespace-nowrap select-none;
31
+ @apply focus:bg-neutral-200/80 hover:bg-neutral-200/80;
32
+ @apply active:bg-slate-400 active:text-white;
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,44 @@
1
+ .input-group {
2
+ &.inline {
3
+ @apply flex flex-row-reverse flex-wrap items-stretch mb-3;
4
+
5
+ .input-group-text {
6
+ @apply py-1.5 px-3 rounded-l flex flex-row items-center whitespace-nowrap select-none;
7
+ @apply bg-slate-500 text-gray-50 border-blue-400;
8
+ }
9
+
10
+ input[type='text'].form-input,
11
+ input[type='password'].form-input {
12
+ @apply mt-0 rounded-l-none -ml-1;
13
+ @apply w-1 grow;
14
+
15
+ &.ng-touched.ng-invalid {
16
+ ~ .input-group-text {
17
+ @apply bg-red-600;
18
+ }
19
+ }
20
+ }
21
+ }
22
+
23
+ &.checkbox {
24
+ @apply pt-[1.85rem] text-center;
25
+ }
26
+
27
+ &:not(:first-child) {
28
+ @apply mt-3;
29
+ }
30
+
31
+ input[type='text'].form-input,
32
+ input[type='password'].form-input {
33
+ &.ng-touched.ng-invalid {
34
+ ~ .validations {
35
+ @apply block;
36
+ }
37
+ }
38
+ }
39
+
40
+ .validations {
41
+ @apply hidden basis-full mt-1;
42
+ @apply text-red-600 text-sm;
43
+ }
44
+ }
@@ -0,0 +1,99 @@
1
+ .form-input {
2
+ @apply border-gray-400;
3
+ @apply focus:border-gray-400 focus:ring-4 focus:ring-primary-400/30;
4
+ @apply transition-colors transition-shadow;
5
+
6
+ @apply invalid:border-red-400;
7
+
8
+ @apply disabled:bg-slate-100;
9
+
10
+ &.ng-invalid.ng-touched {
11
+ @apply border-red-600;
12
+ }
13
+ }
14
+
15
+ input[type='text'],
16
+ input[type='number'],
17
+ input[type='password'],
18
+ textarea {
19
+ &.form-input {
20
+ @apply mt-1 block w-full rounded-md shadow-xs;
21
+
22
+ &.ng-invalid.ng-touched {
23
+ @apply pr-9;
24
+ @apply focus:ring-red-400/30;
25
+ @apply bg-no-repeat bg-[right_0.5625rem_center] bg-[length:1.125rem_1.125rem];
26
+ background-image: url("data:image/svg+xml,%3csvg class='text-white' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
27
+ }
28
+ }
29
+ }
30
+
31
+ input[type='checkbox'].form-input {
32
+ @apply p-0.5 h-5 w-5 rounded-sm relative;
33
+ @apply inline-flex flex-row justify-end;
34
+ @apply appearance-none bg-white;
35
+
36
+ @apply disabled:pointer-events-none disabled:opacity-50;
37
+
38
+ &:not(.switch) {
39
+ @apply border-2 shadow-md focus:ring-3 focus:shadow-none;
40
+
41
+ &:before {
42
+ @apply content-[''] rounded-sm;
43
+ @apply flex items-center justify-center absolute inset-0 p-1;
44
+ font-family: var(--fa-family-classic, 'Font Awesome 6 Free');
45
+ font-weight: 900;
46
+ }
47
+ }
48
+
49
+ &:checked {
50
+ @apply bg-none bg-primary-400 border-primary-400/80;
51
+
52
+ &:before {
53
+ @apply content-['\f00c'];
54
+ @apply text-white;
55
+ }
56
+ }
57
+
58
+ &:disabled {
59
+ ~ label {
60
+ @apply opacity-50;
61
+ }
62
+ }
63
+
64
+ ~ label {
65
+ @apply ml-2 select-none;
66
+ }
67
+ }
68
+
69
+ input[type='checkbox'].form-input.switch {
70
+ @apply w-10 rounded-[2rem];
71
+ @apply appearance-none bg-white;
72
+
73
+ &:before {
74
+ @apply content-[''] h-full aspect-square rounded-full;
75
+ @apply bg-slate-500/60;
76
+ }
77
+
78
+ &:after {
79
+ @apply content-[''] grow;
80
+ transition: flex-grow 0.15s ease-in-out;
81
+ }
82
+
83
+ &:focus:before {
84
+ @apply bg-slate-500/60;
85
+ }
86
+
87
+ &:checked {
88
+ @apply bg-none bg-primary-400 border-primary-400/80;
89
+
90
+ &:before {
91
+ @apply content-[''];
92
+ @apply bg-white;
93
+ }
94
+
95
+ &:after {
96
+ @apply grow-0;
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,3 @@
1
+ .form-label {
2
+ @apply block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2;
3
+ }
@@ -0,0 +1,48 @@
1
+ .row {
2
+ @apply grid gap-3;
3
+
4
+ &.cols-1 {
5
+ @apply grid-cols-1;
6
+ }
7
+ &.cols-2 {
8
+ @apply grid-cols-2;
9
+ }
10
+ &.cols-3 {
11
+ @apply grid-cols-3;
12
+ }
13
+ &.cols-4 {
14
+ @apply grid-cols-4;
15
+ }
16
+ &.cols-5 {
17
+ @apply grid-cols-5;
18
+ }
19
+ &.cols-6 {
20
+ @apply grid-cols-6;
21
+ }
22
+ &.cols-7 {
23
+ @apply grid-cols-7;
24
+ }
25
+ &.cols-8 {
26
+ @apply grid-cols-8;
27
+ }
28
+ &.cols-9 {
29
+ @apply grid-cols-9;
30
+ }
31
+ &.cols-10 {
32
+ @apply grid-cols-10;
33
+ }
34
+ &.cols-11 {
35
+ @apply grid-cols-11;
36
+ }
37
+ &.cols-12 {
38
+ @apply grid-cols-12;
39
+ }
40
+
41
+ .input-group ~ .input-group {
42
+ @apply mt-0;
43
+ }
44
+
45
+ ~ .row {
46
+ @apply mt-3;
47
+ }
48
+ }
@@ -0,0 +1,31 @@
1
+ @mixin fixed-background($image, $color) {
2
+ @apply fixed -z-50 w-full h-screen;
3
+
4
+ @include background($image, $color);
5
+ }
6
+
7
+ @mixin background($image, $color) {
8
+ @apply overflow-hidden;
9
+
10
+ &,
11
+ &:before {
12
+ @apply bg-[url(#{$image})] bg-fixed bg-cover;
13
+ }
14
+
15
+ &:before,
16
+ &:after {
17
+ @apply content-[''] absolute inset-0;
18
+ }
19
+
20
+ &:before {
21
+ @apply blur-sm;
22
+ }
23
+
24
+ &:after {
25
+ @apply #{$color};
26
+ }
27
+
28
+ * {
29
+ @apply z-10;
30
+ }
31
+ }