@luizleon/sf.prefeiturasp.vuecomponents 4.0.2 → 4.0.3

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 (85) hide show
  1. package/package.json +5 -2
  2. package/src/axios/axiosClient.ts +0 -207
  3. package/src/common/appResult.ts +0 -34
  4. package/src/components/button/Button.vue +0 -104
  5. package/src/components/content/Content.vue +0 -49
  6. package/src/components/drawer/Drawer.vue +0 -146
  7. package/src/components/icon/Icon.vue +0 -96
  8. package/src/components/internal/HeaderAvatar.vue +0 -73
  9. package/src/components/internal/LoadingCircle.vue +0 -16
  10. package/src/components/internal/MenuIcon.vue +0 -13
  11. package/src/components/internal/ScrollToTop.vue +0 -26
  12. package/src/components/internal/ThemeToggle.ts +0 -41
  13. package/src/components/internal/ThemeToggle.vue +0 -23
  14. package/src/components/internal/cssClassBuilder.ts +0 -44
  15. package/src/components/internal/getMaxZindex.ts +0 -15
  16. package/src/components/layout/Layout.d.ts +0 -38
  17. package/src/components/layout/Layout.vue +0 -58
  18. package/src/components/message/Message.vue +0 -65
  19. package/src/components/navmenu/NavMenu.vue +0 -109
  20. package/src/components/tabnavigation/TabNavigation.vue +0 -125
  21. package/src/components/tooltip/Tooltip.vue +0 -91
  22. package/src/index.ts +0 -53
  23. package/src/keycloak.d.ts +0 -671
  24. package/src/keycloak.js +0 -1731
  25. package/src/services/authService.ts +0 -118
  26. package/src/services/dialogService.ts +0 -109
  27. package/src/services/navMenuService.ts +0 -21
  28. package/src/style/componentes.scss +0 -20
  29. package/src/style/src/_functions.scss +0 -19
  30. package/src/style/src/_mixins.scss +0 -193
  31. package/src/style/src/_variables.scss +0 -12
  32. package/src/style/src/components/_button.scss +0 -104
  33. package/src/style/src/components/_content.scss +0 -57
  34. package/src/style/src/components/_drawer.scss +0 -89
  35. package/src/style/src/components/_headerAvatar.scss +0 -22
  36. package/src/style/src/components/_icon.scss +0 -119
  37. package/src/style/src/components/_layout.scss +0 -160
  38. package/src/style/src/components/_loading-circle.scss +0 -24
  39. package/src/style/src/components/_mask.scss +0 -35
  40. package/src/style/src/components/_message.scss +0 -47
  41. package/src/style/src/components/_navmenulink.scss +0 -31
  42. package/src/style/src/components/_scrollToTop.scss +0 -28
  43. package/src/style/src/components/_svg_icon.scss +0 -5
  44. package/src/style/src/components/_tab-navigation.scss +0 -93
  45. package/src/style/src/components/_themetoggle.scss +0 -52
  46. package/src/style/src/components/_tooltip.scss +0 -53
  47. package/src/style/src/sweetalert/_sweetalert.scss +0 -9
  48. package/src/style/src/sweetalert/scss/_animations.scss +0 -197
  49. package/src/style/src/sweetalert/scss/_body.scss +0 -45
  50. package/src/style/src/sweetalert/scss/_core.scss +0 -862
  51. package/src/style/src/sweetalert/scss/_mixins.scss +0 -16
  52. package/src/style/src/sweetalert/scss/_theming.scss +0 -8
  53. package/src/style/src/sweetalert/scss/_toasts-animations.scss +0 -83
  54. package/src/style/src/sweetalert/scss/_toasts-body.scss +0 -85
  55. package/src/style/src/sweetalert/scss/_toasts.scss +0 -203
  56. package/src/style/src/sweetalert/scss/_variables.scss +0 -271
  57. package/src/ts-helpers.d.ts +0 -44
  58. package/src/types/index.ts +0 -59
  59. package/src/vite-env.d.ts +0 -1
  60. package/tsconfig.json +0 -22
  61. package/vite.config.js +0 -29
  62. /package/dist/{src/axios → axios}/axiosClient.d.ts +0 -0
  63. /package/dist/{src/common → common}/appResult.d.ts +0 -0
  64. /package/dist/{src/components → components}/button/Button.d.ts +0 -0
  65. /package/dist/{src/components → components}/content/Content.d.ts +0 -0
  66. /package/dist/{src/components → components}/drawer/Drawer.d.ts +0 -0
  67. /package/dist/{src/components → components}/icon/Icon.d.ts +0 -0
  68. /package/dist/{src/components → components}/internal/HeaderAvatar.d.ts +0 -0
  69. /package/dist/{src/components → components}/internal/LoadingCircle.d.ts +0 -0
  70. /package/dist/{src/components → components}/internal/MenuIcon.d.ts +0 -0
  71. /package/dist/{src/components → components}/internal/ScrollToTop.d.ts +0 -0
  72. /package/dist/{src/components → components}/internal/ThemeToggle.d.ts +0 -0
  73. /package/dist/{src/components → components}/internal/cssClassBuilder.d.ts +0 -0
  74. /package/dist/{src/components → components}/internal/getMaxZindex.d.ts +0 -0
  75. /package/dist/{src/components → components}/layout/Layout.d.ts +0 -0
  76. /package/dist/{src/components → components}/message/Message.d.ts +0 -0
  77. /package/dist/{src/components → components}/navmenu/NavMenu.d.ts +0 -0
  78. /package/dist/{src/components → components}/tabnavigation/TabNavigation.d.ts +0 -0
  79. /package/dist/{src/components → components}/tooltip/Tooltip.d.ts +0 -0
  80. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  81. /package/dist/{src/keycloak.d.ts → keycloak.d.ts} +0 -0
  82. /package/dist/{src/services → services}/authService.d.ts +0 -0
  83. /package/dist/{src/services → services}/dialogService.d.ts +0 -0
  84. /package/dist/{src/services → services}/navMenuService.d.ts +0 -0
  85. /package/dist/{src/types → types}/index.d.ts +0 -0
@@ -1,118 +0,0 @@
1
- import { IAuthService, User } from "../types";
2
- import Keycloak, {
3
- KeycloakConfig,
4
- KeycloakInitOptions,
5
- } from "./../keycloak";
6
-
7
- async function CheckSilentLoginFile() {
8
- const fileName = "silent-login.html";
9
- const result = await fetch(location.origin + "/" + fileName)
10
- .then(async (r) => {
11
- if (r.status !== 200) return false;
12
- const text = await r.text();
13
- return text.includes("silent-login-iframe-result");
14
- })
15
- .catch(() => {
16
- return false;
17
- });
18
- if (!result) {
19
- const error = `O arquivo ${fileName} não foi localizado no projeto ou não possui o conteúdo correto!`;
20
- console.warn(error);
21
- document.documentElement.setAttribute("data-app-message", error);
22
- }
23
- return result;
24
- }
25
-
26
- let AuthService: IAuthService;
27
-
28
- function ConfigAuthService(config?: KeycloakConfig): IAuthService {
29
- if (!config) {
30
- return AuthService;
31
- }
32
-
33
- const keycloakInstance = new Keycloak(config);
34
-
35
- const User: User = {} as User;
36
-
37
- const Init = async (
38
- initOptions: KeycloakInitOptions = {},
39
- callback?: () => void
40
- ) => {
41
- const check = await CheckSilentLoginFile();
42
- if (!check) return;
43
- if (initOptions.onLoad === "login-required") {
44
- document.documentElement.setAttribute(
45
- "data-app-message",
46
- "Autorizando..."
47
- );
48
- }
49
- return keycloakInstance
50
- .init(initOptions)
51
- .then(async (authenticated) => {
52
- if (authenticated) {
53
- await FetchUserInfo();
54
- }
55
- if (callback && typeof callback === "function") {
56
- try {
57
- callback();
58
- document.documentElement.classList.add("app-mounted");
59
- } catch (e) {
60
- console.error(e);
61
- document.documentElement.setAttribute(
62
- "data-app-message",
63
- "Ocorreu um erro na inicialização. Verifique o console para mais detalhes."
64
- );
65
- }
66
- }
67
- })
68
- .catch((e: any) => {
69
- document.documentElement.setAttribute(
70
- "data-app-message",
71
- "Ocorreu na comunicação com o servidor de autenticação."
72
- );
73
- });
74
- };
75
-
76
- const FetchUserInfo = async () => {
77
- const info: any = await keycloakInstance.loadUserInfo();
78
- User.email = info.email ?? "";
79
- User.emailVerified = info.email_verified === true;
80
- User.firstName = info.given_name ?? "";
81
- User.lastName = info.family_name ?? "";
82
- User.name = info.name ?? "";
83
- User.sub = info.sub ?? "";
84
- User.username = info.preferred_username ?? "";
85
- User.roles = [...(info.role ?? [])];
86
- User.groups = [...(info.group ?? [])];
87
- User.IsInRole = (role: string) => {
88
- return User.roles.includes(role);
89
- };
90
- sessionStorage.setItem("name", User.name);
91
- };
92
-
93
- const Logout = () => {
94
- keycloakInstance
95
- .logout({
96
- redirectUri: location.origin,
97
- })
98
- .then(() => {
99
- sessionStorage.removeItem("name");
100
- });
101
- };
102
-
103
- AuthService = {
104
- Instance: keycloakInstance,
105
- User,
106
- Init,
107
- Logout,
108
- };
109
-
110
- return AuthService;
111
- }
112
-
113
- const UseAuthService = () => AuthService;
114
-
115
- const StartAuthService = (config: KeycloakConfig) =>
116
- ConfigAuthService(config);
117
-
118
- export { StartAuthService, UseAuthService };
@@ -1,109 +0,0 @@
1
- import Swal, { SweetAlertIcon } from "sweetalert2";
2
- import DOMPurify from "dompurify";
3
-
4
- interface ConfirmOptions {
5
- text: string;
6
- title?: string;
7
- confirmLabel?: string;
8
- rejectLabel?: string;
9
- }
10
-
11
- interface AlertOptions {
12
- text: string | string[];
13
- title?: string;
14
- icon?: SweetAlertIcon;
15
- }
16
-
17
- class Base {
18
- get IsVisible(): boolean {
19
- return Swal.isVisible();
20
- }
21
- }
22
-
23
- class AlertService extends Base {
24
- constructor() {
25
- super();
26
- }
27
- async CreateAlertAsync(
28
- options: AlertOptions | string | string[]
29
- ): Promise<boolean> {
30
- let icon: SweetAlertIcon = "info";
31
- let html: string;
32
- let title: string;
33
- if (typeof options === "string" || Array.isArray(options)) {
34
- html = Array.isArray(options)
35
- ? options.join("<br />")
36
- : options;
37
- } else {
38
- icon = options.icon ?? "info";
39
- title = options.title ?? "";
40
- html = Array.isArray(options.text)
41
- ? options.text.join("<br />")
42
- : options.text;
43
- }
44
- return new Promise((r) => {
45
- Swal.fire({
46
- allowEscapeKey: false,
47
- allowOutsideClick: false,
48
- icon,
49
- title,
50
- html: `<div style="max-height: 50vh; overflow: auto">${DOMPurify.sanitize(
51
- html
52
- )}</div>`,
53
- }).then(() => r(true));
54
- });
55
- }
56
-
57
- async AlertAsync(message: string | string[]): Promise<boolean> {
58
- return this.CreateAlertAsync({
59
- text: message,
60
- icon: "info",
61
- });
62
- }
63
-
64
- async AlertErrorAsync(error: string | string[]): Promise<boolean> {
65
- return this.CreateAlertAsync({
66
- text: error,
67
- icon: "error",
68
- });
69
- }
70
-
71
- async AlertSuccessAsync(
72
- message: string | string[]
73
- ): Promise<boolean> {
74
- return this.CreateAlertAsync({
75
- text: message,
76
- icon: "success",
77
- });
78
- }
79
- }
80
-
81
- class ConfirmService extends Base {
82
- async CreateConfirmAsync(
83
- options: ConfirmOptions
84
- ): Promise<boolean> {
85
- return new Promise((r) => {
86
- Swal.fire({
87
- showCancelButton: true,
88
- allowEscapeKey: false,
89
- allowOutsideClick: false,
90
- icon: "question",
91
- title: options.title,
92
- html: DOMPurify.sanitize(options.text),
93
- confirmButtonText: options.confirmLabel ?? "confirmar",
94
- cancelButtonText: options.rejectLabel ?? "cancelar",
95
- }).then((x: any) => {
96
- r(x.isConfirmed === true);
97
- });
98
- });
99
- }
100
- async ConfirmAsync(message: string) {
101
- return this.CreateConfirmAsync({
102
- text: message,
103
- });
104
- }
105
- }
106
-
107
- export const UseAlertService = () => new AlertService();
108
-
109
- export const UseConfirmService = () => new ConfirmService();
@@ -1,21 +0,0 @@
1
- import { ref, Ref } from "vue";
2
-
3
- class NavMenuService {
4
- private _visible: Ref<boolean> = ref(false);
5
- get IsVisible() {
6
- return this._visible.value === true;
7
- }
8
- Toggle() {
9
- this._visible.value = !this._visible.value;
10
- }
11
- Close() {
12
- this._visible.value = false;
13
- }
14
- Open() {
15
- this._visible.value = true;
16
- }
17
- }
18
-
19
- const LkNavMenuService = new NavMenuService();
20
-
21
- export const UseNavMenuService = () => LkNavMenuService;
@@ -1,20 +0,0 @@
1
- @use "./src/mixins" as mx;
2
-
3
- @include mx.theme-colors-class();
4
-
5
- @import "./src/components/layout";
6
- @import "./src/components/themetoggle";
7
- @import "./src/components/svg_icon";
8
- @import "./src/components/loading-circle";
9
- @import "./src/components/icon";
10
- @import "./src/components/tooltip";
11
- @import "./src/components/drawer";
12
- @import "./src/components/navmenulink";
13
- @import "./src/components/content";
14
- @import "./src/components/scrollToTop";
15
- @import "./src/sweetalert/sweetalert";
16
- @import "./src/components/headerAvatar";
17
- @import "./src/components/tab-navigation";
18
- @import "./src/components/button";
19
- @import "./src/components/mask";
20
- @import "./src/components/message";
@@ -1,19 +0,0 @@
1
- @function theme-colors($dark: false) {
2
- @return "primary", "info", "success", "warn", "help", "error",
3
- "secondary";
4
- }
5
-
6
- @function str-replace($string, $search, $replace: "") {
7
- $index: str-index($string, $search);
8
-
9
- @if $index {
10
- @return str-slice($string, 1, $index - 1) + $replace +
11
- str-replace(
12
- str-slice($string, $index + str-length($search)),
13
- $search,
14
- $replace
15
- );
16
- }
17
-
18
- @return $string;
19
- }
@@ -1,193 +0,0 @@
1
- @use "sass:map";
2
- @use "sass:list";
3
- @use "sass:color";
4
- @use "sass:math";
5
- @import "./variables";
6
- @import "./functions";
7
-
8
- @mixin avatar-colors($dark: false) {
9
- $red: #f44336;
10
- $pink: #e91e63;
11
- $purple: #9c27b0;
12
- $deepPurple: #673ab7;
13
- $indigo: #3f51b5;
14
- $blue: #2196f3;
15
- $lightBlue: #03a9f4;
16
- $cyan: #00bcd4;
17
- $teal: #009688;
18
- $green: #4caf50;
19
- $lightGreen: #8bc34a;
20
- $lime: #cddc39;
21
- $yellow: #ffeb3b;
22
- $amber: #ffc107;
23
- $orange: #ff9800;
24
- $deepOrange: #ff5722;
25
- $brown: #795548;
26
- $gray: #9e9e9e;
27
- $blueGray: #607d8b;
28
-
29
- $colors: (
30
- "--red": $red,
31
- "--pink": $pink,
32
- "--purple": $purple,
33
- "--deepPurple": $deepPurple,
34
- "--indigo": $indigo,
35
- "--blue": $blue,
36
- "--lightBlue": $lightBlue,
37
- "--cyan": $cyan,
38
- "--teal": $teal,
39
- "--green": $green,
40
- "--lightGreen": $lightGreen,
41
- "--lime": $lime,
42
- "--yellow": $yellow,
43
- "--amber": $amber,
44
- "--orange": $orange,
45
- "--deepOrange": $deepOrange,
46
- "--brown": $brown,
47
- "--gray": $gray,
48
- "--blueGray": $blueGray,
49
- );
50
-
51
- $incr: 0;
52
-
53
- @each $key, $value in $colors {
54
- $bgColor: color.scale($value, $lightness: -40%);
55
- $color: color.scale($value, $lightness: 90%);
56
-
57
- @if ($dark) {
58
- $bgColor: color.scale($value, $lightness: 40%);
59
- $color: color.scale($value, $lightness: -90%);
60
- }
61
-
62
- &[data-cor="#{$incr}"] {
63
- color: $color;
64
- background-color: $bgColor;
65
-
66
- &[data-hover]:hover {
67
- box-shadow: 0 0 0 2px color.scale($bgColor, $alpha: -50%);
68
- cursor: pointer;
69
- }
70
- }
71
-
72
- $incr: $incr + 1;
73
- }
74
- }
75
-
76
- @mixin button-colors($dark: false) {
77
- @each $color in $theme-colors-list {
78
- $button-var-color: var(#{$color}-color);
79
- $button-filled-color: #fff;
80
- @if ($color == "--warn") {
81
- $button-filled-color: #000;
82
- }
83
- &[data-color="#{str-replace($color, '--')}"] {
84
- @media (pointer: fine) {
85
- &:focus-visible {
86
- outline: 2px solid $button-var-color;
87
- outline-offset: 1px;
88
- border-color: var(--bg-color);
89
- }
90
- }
91
- &:active {
92
- transition: 0s;
93
- filter: brightness(0.9);
94
- }
95
- &.#{$prefix}button-filled {
96
- color: #{$button-filled-color};
97
- background-color: $button-var-color;
98
- }
99
- &.#{$prefix}button-outlined,
100
- &.#{$prefix}button-text {
101
- color: $button-var-color;
102
- background-color: transparent;
103
- @media (pointer: fine) {
104
- &:hover,
105
- &:focus-visible {
106
- background: color-mix(
107
- in srgb,
108
- currentColor 10%,
109
- transparent
110
- );
111
- }
112
- }
113
- }
114
- &.#{$prefix}button-text {
115
- border-color: transparent !important;
116
- }
117
- }
118
- }
119
- }
120
-
121
- @mixin dot-colors() {
122
- @each $color in $theme-colors-list {
123
- $colorName: str-replace($color, "--");
124
- &[data-color="#{$colorName}"] {
125
- background-color: var(#{$color}-color);
126
- }
127
- }
128
- }
129
-
130
- @mixin input-colors() {
131
- @each $color in $theme-colors-list {
132
- $colorName: str-replace($color, "--");
133
- &[data-color="#{$colorName}"] {
134
- color: var(#{$color}-color);
135
- }
136
- }
137
- }
138
-
139
- @mixin toast-colors() {
140
- @each $color, $colorValue in $theme-colors-list {
141
- $colorName: str-replace($color, "--");
142
- &.toast-#{$colorName} {
143
- --toast-progress-color: var(#{$color}-color);
144
- --toast-bg-color: hsla(
145
- var(#{$color}-color-h),
146
- var(#{$color}-color-s),
147
- var(#{$color}-color-l),
148
- 0.9
149
- );
150
- }
151
- }
152
- }
153
-
154
- @mixin theme-colors-class() {
155
- @each $color in $theme-colors-list {
156
- $colorName: str-replace($color, "--");
157
- .#{$colorName}-color:not(
158
- :disabled,
159
- .disabled,
160
- .component-disabled
161
- ) {
162
- color: var(#{$color}-color) !important;
163
- }
164
- .#{$colorName}-bgcolor:not(
165
- :disabled,
166
- .disabled,
167
- .component-disabled
168
- ) {
169
- background-color: var(#{$color}-color) !important;
170
- }
171
- }
172
- }
173
-
174
- @mixin material-symbols-outlined {
175
- font-family: "Material Symbols Outlined";
176
- font-weight: normal;
177
- font-style: normal;
178
- font-size: 24px;
179
- line-height: 1;
180
- letter-spacing: normal;
181
- text-transform: none;
182
- display: inline-block;
183
- white-space: nowrap;
184
- word-wrap: normal;
185
- direction: ltr;
186
- font-feature-settings: "liga";
187
- -webkit-font-smoothing: antialiased;
188
- }
189
-
190
- @mixin material-symbols-filled {
191
- @include material-symbols-outlined;
192
- font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 24;
193
- }
@@ -1,12 +0,0 @@
1
- $prefix: "sf-" !default;
2
-
3
- $theme-colors-list: (
4
- "--primary",
5
- "--info",
6
- "--success",
7
- "--warn",
8
- "--help",
9
- "--error",
10
- "--secondary",
11
- "--text"
12
- );
@@ -1,104 +0,0 @@
1
- @use "../mixins";
2
-
3
- .#{$prefix}button {
4
- position: relative;
5
- display: inline-flex;
6
- align-items: center;
7
- border-radius: 6px;
8
- border: 1px solid transparent;
9
- width: fit-content;
10
- word-break: break-word;
11
- font-weight: 400;
12
- transition: opacity 0.2s ease-in-out;
13
- &:hover {
14
- cursor: pointer;
15
- }
16
-
17
- .#{$prefix}button-label {
18
- white-space: wrap;
19
- }
20
-
21
- .#{$prefix}icon {
22
- position: absolute;
23
- color: unset !important;
24
- > button {
25
- color: currentColor !important;
26
- }
27
- }
28
-
29
- &.#{$prefix}component-loading {
30
- color: var(--disabled-color) !important;
31
- border-color: var(--disabled-color) !important;
32
- .#{$prefix}button-label {
33
- color: transparent !important;
34
- }
35
- }
36
-
37
- &.#{$prefix}button-filled:disabled {
38
- background-color: hsla(
39
- var(--disabled-color-h),
40
- var(--disabled-color-s),
41
- var(--disabled-color-l),
42
- 0.5
43
- ) !important;
44
- }
45
-
46
- &.#{$prefix}button-small {
47
- min-height: 32px;
48
- font-size: 0.875rem;
49
- padding: 0 12px;
50
- &.#{$prefix}button-with-icon {
51
- padding-left: 28px;
52
- }
53
- .#{$prefix}icon {
54
- inset: 0 0 0 6px;
55
- &.#{$prefix}component-loading {
56
- inset: 0 0 0 50%;
57
- margin-left: -8px;
58
- }
59
- }
60
- }
61
-
62
- &.#{$prefix}button-medium {
63
- min-height: 36px;
64
- font-size: 1rem;
65
- padding: 0 12px;
66
- &.#{$prefix}button-with-icon {
67
- padding-left: 38px;
68
- }
69
- .#{$prefix}icon {
70
- inset: 0 0 0 8px;
71
- &.#{$prefix}component-loading {
72
- inset: 0 0 0 50%;
73
- margin-left: -12px;
74
- }
75
- }
76
- }
77
-
78
- &.#{$prefix}button-large {
79
- min-height: 48px;
80
- font-size: 1.25rem;
81
- padding: 0 16px;
82
- &.#{$prefix}button-with-icon {
83
- padding-left: 54px;
84
- }
85
- .#{$prefix}icon {
86
- inset: 0 0 0 10px;
87
- &.#{$prefix}component-loading {
88
- inset: 0 0 0 50%;
89
- margin-left: -18px;
90
- }
91
- }
92
- .#{$prefix}button-label {
93
- line-height: 48px;
94
- }
95
- }
96
-
97
- @include button-colors;
98
- }
99
-
100
- html.dark {
101
- .#{$prefix}button {
102
- @include button-colors(true);
103
- }
104
- }
@@ -1,57 +0,0 @@
1
- @import "../mixins";
2
-
3
- .sf-content {
4
- height: 100%;
5
- overflow: hidden;
6
- position: relative;
7
- > .sf-content-body {
8
- height: calc(100% - 25%);
9
- overflow: auto;
10
- scroll-behavior: smooth;
11
- padding: 1rem;
12
- &.sf-content-no-padding {
13
- padding: 0;
14
- }
15
- }
16
- > .sf-content-header {
17
- top: 0;
18
- border-bottom: 1px solid var(--surface-900-color);
19
- }
20
- > .sf-content-footer {
21
- bottom: 0;
22
- border-top: 1px solid var(--surface-900-color);
23
- }
24
- > .sf-content-header,
25
- > .sf-content-footer {
26
- width: 100%;
27
- padding: 0 1rem;
28
- height: 60px;
29
- display: flex;
30
- align-items: center;
31
- gap: 0.5rem;
32
- &:empty {
33
- display: none;
34
- height: 0;
35
- }
36
- &.sf-content-no-padding {
37
- padding: 0;
38
- gap: 0;
39
- }
40
- }
41
- > .sf-content-header {
42
- background-color: var(--bg-color);
43
- }
44
- > .sf-content-footer {
45
- background-color: var(--surface-300-color);
46
- }
47
- &:has(.sf-content-header:empty) > .sf-content-body {
48
- height: calc(100% - 60px);
49
- }
50
- &:has(.sf-content-footer:empty) > .sf-content-body {
51
- height: calc(100% - 60px);
52
- }
53
- &:has(.sf-content-header:empty):has(.sf-content-footer:empty)
54
- > .sf-content-body {
55
- height: 100%;
56
- }
57
- }