@luizleon/sf.prefeiturasp.vuecomponents 4.0.2 → 4.0.4

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 (92) hide show
  1. package/dist/{src/components → components}/navmenu/NavMenu.d.ts +4 -3
  2. package/dist/sf.prefeiturasp.vuecomponents.cjs +1 -1
  3. package/dist/sf.prefeiturasp.vuecomponents.cjs.map +1 -1
  4. package/dist/sf.prefeiturasp.vuecomponents.js +2 -2
  5. package/dist/sf.prefeiturasp.vuecomponents.js.map +1 -1
  6. package/dist/sf.prefeiturasp.vuecomponents.umd.cjs +1 -1
  7. package/dist/sf.prefeiturasp.vuecomponents.umd.cjs.map +1 -1
  8. package/dist/style.css +1 -1
  9. package/package.json +5 -2
  10. package/src/axios/axiosClient.ts +0 -207
  11. package/src/common/appResult.ts +0 -34
  12. package/src/components/button/Button.vue +0 -104
  13. package/src/components/content/Content.vue +0 -49
  14. package/src/components/drawer/Drawer.vue +0 -146
  15. package/src/components/icon/Icon.vue +0 -96
  16. package/src/components/internal/HeaderAvatar.vue +0 -73
  17. package/src/components/internal/LoadingCircle.vue +0 -16
  18. package/src/components/internal/MenuIcon.vue +0 -13
  19. package/src/components/internal/ScrollToTop.vue +0 -26
  20. package/src/components/internal/ThemeToggle.ts +0 -41
  21. package/src/components/internal/ThemeToggle.vue +0 -23
  22. package/src/components/internal/cssClassBuilder.ts +0 -44
  23. package/src/components/internal/getMaxZindex.ts +0 -15
  24. package/src/components/layout/Layout.d.ts +0 -38
  25. package/src/components/layout/Layout.vue +0 -58
  26. package/src/components/message/Message.vue +0 -65
  27. package/src/components/navmenu/NavMenu.vue +0 -109
  28. package/src/components/tabnavigation/TabNavigation.vue +0 -125
  29. package/src/components/tooltip/Tooltip.vue +0 -91
  30. package/src/index.ts +0 -53
  31. package/src/keycloak.d.ts +0 -671
  32. package/src/keycloak.js +0 -1731
  33. package/src/services/authService.ts +0 -118
  34. package/src/services/dialogService.ts +0 -109
  35. package/src/services/navMenuService.ts +0 -21
  36. package/src/style/componentes.scss +0 -20
  37. package/src/style/src/_functions.scss +0 -19
  38. package/src/style/src/_mixins.scss +0 -193
  39. package/src/style/src/_variables.scss +0 -12
  40. package/src/style/src/components/_button.scss +0 -104
  41. package/src/style/src/components/_content.scss +0 -57
  42. package/src/style/src/components/_drawer.scss +0 -89
  43. package/src/style/src/components/_headerAvatar.scss +0 -22
  44. package/src/style/src/components/_icon.scss +0 -119
  45. package/src/style/src/components/_layout.scss +0 -160
  46. package/src/style/src/components/_loading-circle.scss +0 -24
  47. package/src/style/src/components/_mask.scss +0 -35
  48. package/src/style/src/components/_message.scss +0 -47
  49. package/src/style/src/components/_navmenulink.scss +0 -31
  50. package/src/style/src/components/_scrollToTop.scss +0 -28
  51. package/src/style/src/components/_svg_icon.scss +0 -5
  52. package/src/style/src/components/_tab-navigation.scss +0 -93
  53. package/src/style/src/components/_themetoggle.scss +0 -52
  54. package/src/style/src/components/_tooltip.scss +0 -53
  55. package/src/style/src/sweetalert/_sweetalert.scss +0 -9
  56. package/src/style/src/sweetalert/scss/_animations.scss +0 -197
  57. package/src/style/src/sweetalert/scss/_body.scss +0 -45
  58. package/src/style/src/sweetalert/scss/_core.scss +0 -862
  59. package/src/style/src/sweetalert/scss/_mixins.scss +0 -16
  60. package/src/style/src/sweetalert/scss/_theming.scss +0 -8
  61. package/src/style/src/sweetalert/scss/_toasts-animations.scss +0 -83
  62. package/src/style/src/sweetalert/scss/_toasts-body.scss +0 -85
  63. package/src/style/src/sweetalert/scss/_toasts.scss +0 -203
  64. package/src/style/src/sweetalert/scss/_variables.scss +0 -271
  65. package/src/ts-helpers.d.ts +0 -44
  66. package/src/types/index.ts +0 -59
  67. package/src/vite-env.d.ts +0 -1
  68. package/tsconfig.json +0 -22
  69. package/vite.config.js +0 -29
  70. /package/dist/{src/axios → axios}/axiosClient.d.ts +0 -0
  71. /package/dist/{src/common → common}/appResult.d.ts +0 -0
  72. /package/dist/{src/components → components}/button/Button.d.ts +0 -0
  73. /package/dist/{src/components → components}/content/Content.d.ts +0 -0
  74. /package/dist/{src/components → components}/drawer/Drawer.d.ts +0 -0
  75. /package/dist/{src/components → components}/icon/Icon.d.ts +0 -0
  76. /package/dist/{src/components → components}/internal/HeaderAvatar.d.ts +0 -0
  77. /package/dist/{src/components → components}/internal/LoadingCircle.d.ts +0 -0
  78. /package/dist/{src/components → components}/internal/MenuIcon.d.ts +0 -0
  79. /package/dist/{src/components → components}/internal/ScrollToTop.d.ts +0 -0
  80. /package/dist/{src/components → components}/internal/ThemeToggle.d.ts +0 -0
  81. /package/dist/{src/components → components}/internal/cssClassBuilder.d.ts +0 -0
  82. /package/dist/{src/components → components}/internal/getMaxZindex.d.ts +0 -0
  83. /package/dist/{src/components → components}/layout/Layout.d.ts +0 -0
  84. /package/dist/{src/components → components}/message/Message.d.ts +0 -0
  85. /package/dist/{src/components → components}/tabnavigation/TabNavigation.d.ts +0 -0
  86. /package/dist/{src/components → components}/tooltip/Tooltip.d.ts +0 -0
  87. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  88. /package/dist/{src/keycloak.d.ts → keycloak.d.ts} +0 -0
  89. /package/dist/{src/services → services}/authService.d.ts +0 -0
  90. /package/dist/{src/services → services}/dialogService.d.ts +0 -0
  91. /package/dist/{src/services → services}/navMenuService.d.ts +0 -0
  92. /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
- }