@simplysm/angular 14.2.7 → 14.2.9
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.
- package/dist/controls/button/sd-additional-button.js +1 -1
- package/dist/controls/button/sd-anchor.js +1 -1
- package/dist/controls/button/sd-button.js +1 -1
- package/dist/controls/button/sd-modal-select-button.js +1 -1
- package/dist/controls/checkbox/sd-checkbox.js +1 -1
- package/dist/controls/checkbox/sd-switch.js +1 -1
- package/dist/controls/dropdown/sd-dropdown-popup.js +1 -1
- package/dist/controls/gap/sd-gap.js +1 -1
- package/dist/controls/input/sd-date-range-picker.js +1 -1
- package/dist/controls/input/sd-numpad.js +1 -1
- package/dist/controls/input/sd-range.js +1 -1
- package/dist/controls/input/sd-textarea.js +1 -1
- package/dist/controls/input/sd-textfield.js +1 -1
- package/dist/controls/list/sd-list-item.js +2 -2
- package/dist/controls/list/sd-list.js +1 -1
- package/dist/controls/pagination/sd-pagination.js +1 -1
- package/dist/controls/select/sd-select-button.js +1 -1
- package/dist/controls/select/sd-select-item.js +1 -1
- package/dist/controls/select/sd-select.js +1 -1
- package/dist/controls/tab/sd-tab-item.js +1 -1
- package/dist/controls/tab/sd-tab.js +1 -1
- package/dist/core/busy/sd-busy-container.js +1 -1
- package/dist/core/modal/injectDragResize.d.ts +10 -0
- package/dist/core/modal/injectDragResize.d.ts.map +1 -1
- package/dist/core/modal/injectDragResize.js +61 -16
- package/dist/core/modal/sd-modal.d.ts +6 -0
- package/dist/core/modal/sd-modal.d.ts.map +1 -1
- package/dist/core/modal/sd-modal.js +69 -21
- package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
- package/dist/core/toast/sd-toast-container.js +1 -1
- package/dist/core/toast/sd-toast.js +1 -1
- package/dist/data/kanban/sd-kanban-board.js +1 -1
- package/dist/data/kanban/sd-kanban-lane.js +1 -1
- package/dist/data/kanban/sd-kanban.js +1 -1
- package/dist/data/permission-table/sd-permission-table.js +1 -1
- package/dist/data/sheet/sd-sheet.js +1 -1
- package/dist/data/state-preset/sd-state-preset.js +1 -1
- package/dist/features/editor/sd-markdown-editor.js +1 -1
- package/dist/features/editor/sd-tiptap-editor.js +1 -1
- package/dist/features/visual/sd-calendar.js +1 -1
- package/dist/features/visual/sd-label.js +1 -1
- package/dist/features/visual/sd-note.js +1 -1
- package/dist/features/visual/sd-progress.js +1 -1
- package/dist/layout/sidebar/sd-sidebar-container.js +1 -1
- package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
- package/dist/layout/sidebar/sd-sidebar.js +1 -1
- package/dist/layout/topbar/sd-topbar-menu.js +1 -1
- package/dist/layout/topbar/sd-topbar.js +1 -1
- package/package.json +24 -24
- package/src/core/modal/injectDragResize.ts +76 -17
- package/src/core/modal/sd-modal.provider.ts +1 -4
- package/src/core/modal/sd-modal.ts +72 -14
|
@@ -336,7 +336,7 @@ export class SdTiptapEditor {
|
|
|
336
336
|
i0.ɵɵdomElement(1, "div", 0);
|
|
337
337
|
} if (rf & 2) {
|
|
338
338
|
i0.ɵɵconditional(!ctx.disabled() ? 0 : -1);
|
|
339
|
-
} }, styles: ["sd-tiptap-editor {\n display: block;\n position: relative;\n border: 1px solid var(
|
|
339
|
+
} }, styles: ["sd-tiptap-editor {\n display: block;\n position: relative;\n border: 1px solid var(--%NS%sd-bd-field);\n border-radius: var(--%NS%sd-radius-default);\n background-color: var(--%NS%sd-bg-field);\n}\nsd-tiptap-editor > ._toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--%NS%sd-gap-xs);\n padding: var(--%NS%sd-gap-xs);\n border-bottom: 1px solid var(--%NS%sd-bd-hairline);\n}\nsd-tiptap-editor > ._toolbar > ._btn-group {\n display: flex;\n gap: 1px;\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button {\n padding: var(--%NS%sd-gap-xs) var(--%NS%sd-gap-sm);\n border: 1px solid var(--%NS%sd-bd-hairline);\n border-radius: var(--%NS%sd-radius-default);\n background-color: transparent;\n cursor: pointer;\n font-size: var(--%NS%sd-font-size-default);\n line-height: 1;\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button._active {\n background-color: var(--%NS%sd-bg-primary-solid);\n color: var(--%NS%sd-tx-primary-solid);\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button:hover {\n background-color: var(--%NS%sd-bg-state-hover);\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button._active:hover {\n background-color: var(--%NS%sd-bg-primary-solid);\n}\nsd-tiptap-editor > ._color-picker {\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n padding: var(--%NS%sd-gap-xs);\n border-bottom: 1px solid var(--%NS%sd-bd-hairline);\n}\nsd-tiptap-editor > ._color-picker > ._color-swatch {\n width: 1.25rem;\n height: 1.25rem;\n border: 1px solid var(--%NS%sd-bd-hairline);\n border-radius: 2px;\n cursor: pointer;\n padding: 0;\n}\nsd-tiptap-editor > ._color-picker > ._color-swatch._no-color {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--%NS%sd-bg-content);\n font-size: 0.625rem;\n}\nsd-tiptap-editor > ._editor-container {\n padding: var(--%NS%sd-gap-sm);\n min-height: 6.25rem;\n font-family: var(--%NS%sd-font-family-field);\n}\nsd-tiptap-editor > ._editor-container > .tiptap {\n outline: none;\n}\nsd-tiptap-editor > ._editor-container > .tiptap:focus {\n outline: none;\n}\nsd-tiptap-editor[data-sd-disabled=true] {\n background-color: var(--%NS%sd-bg-disabled);\n color: var(--%NS%sd-tx-disabled);\n}\nsd-tiptap-editor[data-sd-disabled=true] > ._editor-container > .tiptap {\n cursor: not-allowed;\n}\nsd-tiptap-editor[data-sd-readonly=true] > ._editor-container > .tiptap {\n cursor: default;\n}\nsd-tiptap-editor ._color-btn {\n position: relative;\n}\nsd-tiptap-editor ._color-btn > ._color-indicator {\n display: block;\n height: 2px;\n width: 100%;\n position: absolute;\n bottom: 2px;\n left: 0;\n}"], encapsulation: 2 });
|
|
340
340
|
}
|
|
341
341
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdTiptapEditor, [{
|
|
342
342
|
type: Component,
|
|
@@ -132,7 +132,7 @@ export class SdCalendar {
|
|
|
132
132
|
i0.ɵɵtextInterpolate1(" ", ctx.weeks[(ctx.weekStartDay() + 6) % 7], " ");
|
|
133
133
|
i0.ɵɵadvance(2);
|
|
134
134
|
i0.ɵɵrepeater(ctx.dataTable());
|
|
135
|
-
} }, dependencies: [NgTemplateOutlet, FormatPipe], styles: ["sd-calendar > table {\n border-collapse: collapse;\n width: 100%;\n height: 100%;\n border-radius: var(
|
|
135
|
+
} }, dependencies: [NgTemplateOutlet, FormatPipe], styles: ["sd-calendar > table {\n border-collapse: collapse;\n width: 100%;\n height: 100%;\n border-radius: var(--%NS%sd-radius-default);\n overflow: hidden;\n}\nsd-calendar > table > * > tr > * {\n padding: var(--%NS%sd-gap-sm) var(--%NS%sd-gap-default);\n border: 1px solid var(--%NS%sd-bd-default);\n width: 14.2857142857%;\n}\nsd-calendar > table > thead > tr > th {\n background-color: var(--%NS%sd-bg-gray-subtle);\n height: 10%;\n}\nsd-calendar > table > tbody > tr > td {\n vertical-align: top;\n height: 15%;\n}\nsd-calendar > table > tbody > tr > td > .day {\n margin-bottom: var(--%NS%sd-gap-sm);\n}\nsd-calendar > table > tbody > tr > td.not-current {\n background-color: var(--%NS%sd-bg-canvas);\n}\nsd-calendar > table > tbody > tr > td.not-current > .day {\n color: var(--%NS%sd-tx-gray);\n}\nsd-calendar > table > tbody > tr > td > .content {\n display: flex;\n flex-wrap: nowrap;\n flex-direction: column;\n gap: var(--%NS%sd-gap-sm);\n}\n@supports not (appearance: auto) {\n sd-calendar > table > tbody > tr > td > .content {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content > * + * {\n margin-top: var(--%NS%sd-gap-sm);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xxs {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xxs > * + * {\n margin-top: var(--%NS%sd-gap-xxs);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xs {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xs > * + * {\n margin-top: var(--%NS%sd-gap-xs);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-sm {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-sm > * + * {\n margin-top: var(--%NS%sd-gap-sm);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-default {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-default > * + * {\n margin-top: var(--%NS%sd-gap-default);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-lg {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-lg > * + * {\n margin-top: var(--%NS%sd-gap-lg);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xl {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xl > * + * {\n margin-top: var(--%NS%sd-gap-xl);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xxl {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-xxl > * + * {\n margin-top: var(--%NS%sd-gap-xxl);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-0 {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-0 > * + * {\n margin-top: var(--%NS%sd-gap-0);\n }\n sd-calendar > table > tbody > tr > td > .content.gap-auto {\n gap: 0;\n }\n sd-calendar > table > tbody > tr > td > .content.gap-auto > * + * {\n margin-top: var(--%NS%sd-gap-auto);\n }\n}"], encapsulation: 2 });
|
|
136
136
|
}
|
|
137
137
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdCalendar, [{
|
|
138
138
|
type: Component,
|
|
@@ -14,7 +14,7 @@ export class SdLabel {
|
|
|
14
14
|
} }, inputs: { theme: [1, "theme"], color: [1, "color"], clickable: [1, "clickable"] }, ngContentSelectors: _c0, decls: 1, vars: 0, template: function SdLabel_Template(rf, ctx) { if (rf & 1) {
|
|
15
15
|
i0.ɵɵprojectionDef();
|
|
16
16
|
i0.ɵɵprojection(0);
|
|
17
|
-
} }, styles: ["sd-label {\n display: inline-block;\n background-color: var(
|
|
17
|
+
} }, styles: ["sd-label {\n display: inline-block;\n background-color: var(--%NS%sd-bg-gray-solid);\n color: var(--%NS%sd-tx-gray-solid);\n padding: 0 var(--%NS%sd-gap-sm);\n border-radius: var(--%NS%sd-radius-default);\n text-indent: 0;\n}\nsd-label[data-sd-theme=gray] {\n background-color: var(--%NS%sd-bg-gray-solid);\n color: var(--%NS%sd-tx-gray-solid);\n}\nsd-label[data-sd-theme=blue-gray] {\n background-color: var(--%NS%sd-bg-blue-gray-solid);\n color: var(--%NS%sd-tx-blue-gray-solid);\n}\nsd-label[data-sd-theme=primary] {\n background-color: var(--%NS%sd-bg-primary-solid);\n color: var(--%NS%sd-tx-primary-solid);\n}\nsd-label[data-sd-theme=info] {\n background-color: var(--%NS%sd-bg-info-solid);\n color: var(--%NS%sd-tx-info-solid);\n}\nsd-label[data-sd-theme=success] {\n background-color: var(--%NS%sd-bg-success-solid);\n color: var(--%NS%sd-tx-success-solid);\n}\nsd-label[data-sd-theme=warning] {\n background-color: var(--%NS%sd-bg-warning-solid);\n color: var(--%NS%sd-tx-warning-solid);\n}\nsd-label[data-sd-theme=danger] {\n background-color: var(--%NS%sd-bg-danger-solid);\n color: var(--%NS%sd-tx-danger-solid);\n}\nsd-label[data-sd-clickable=true] {\n cursor: pointer;\n}\nsd-label[data-sd-clickable=true]:hover {\n background-color: var(--%NS%sd-bg-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=gray] {\n background-color: var(--%NS%sd-bg-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=blue-gray] {\n background-color: var(--%NS%sd-bg-blue-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=primary] {\n background-color: var(--%NS%sd-bg-primary-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=info] {\n background-color: var(--%NS%sd-bg-info-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=success] {\n background-color: var(--%NS%sd-bg-success-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=warning] {\n background-color: var(--%NS%sd-bg-warning-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=danger] {\n background-color: var(--%NS%sd-bg-danger-solid-hover);\n}"], encapsulation: 2 });
|
|
18
18
|
}
|
|
19
19
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdLabel, [{
|
|
20
20
|
type: Component,
|
|
@@ -13,7 +13,7 @@ export class SdNote {
|
|
|
13
13
|
} }, inputs: { theme: [1, "theme"], size: [1, "size"], inset: [1, "inset"] }, ngContentSelectors: _c0, decls: 1, vars: 0, template: function SdNote_Template(rf, ctx) { if (rf & 1) {
|
|
14
14
|
i0.ɵɵprojectionDef();
|
|
15
15
|
i0.ɵɵprojection(0);
|
|
16
|
-
} }, styles: ["sd-note {\n display: block;\n padding: var(
|
|
16
|
+
} }, styles: ["sd-note {\n display: block;\n padding: var(--%NS%sd-gap-sm) var(--%NS%sd-gap-default);\n background-color: var(--%NS%sd-bg-gray-subtle);\n border: none;\n border-radius: var(--%NS%sd-radius-default);\n}\nsd-note[data-sd-theme=gray] {\n background-color: var(--%NS%sd-bg-gray-subtle);\n border: 1px solid var(--%NS%sd-bg-gray-subtle);\n}\nsd-note[data-sd-theme=blue-gray] {\n background-color: var(--%NS%sd-bg-blue-gray-subtle);\n border: 1px solid var(--%NS%sd-bg-blue-gray-subtle);\n}\nsd-note[data-sd-theme=primary] {\n background-color: var(--%NS%sd-bg-primary-subtle);\n border: 1px solid var(--%NS%sd-bg-primary-subtle);\n}\nsd-note[data-sd-theme=info] {\n background-color: var(--%NS%sd-bg-info-subtle);\n border: 1px solid var(--%NS%sd-bg-info-subtle);\n}\nsd-note[data-sd-theme=success] {\n background-color: var(--%NS%sd-bg-success-subtle);\n border: 1px solid var(--%NS%sd-bg-success-subtle);\n}\nsd-note[data-sd-theme=warning] {\n background-color: var(--%NS%sd-bg-warning-subtle);\n border: 1px solid var(--%NS%sd-bg-warning-subtle);\n}\nsd-note[data-sd-theme=danger] {\n background-color: var(--%NS%sd-bg-danger-subtle);\n border: 1px solid var(--%NS%sd-bg-danger-subtle);\n}\nsd-note[data-sd-size=sm] {\n font-size: var(--%NS%sd-font-size-sm);\n padding: var(--%NS%sd-gap-xs) var(--%NS%sd-gap-sm);\n}\nsd-note[data-sd-size=lg] {\n padding: var(--%NS%sd-gap-default) var(--%NS%sd-gap-lg);\n}\nsd-note[data-sd-inset=true] {\n border-radius: 0;\n}"], encapsulation: 2 });
|
|
17
17
|
}
|
|
18
18
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdNote, [{
|
|
19
19
|
type: Component,
|
|
@@ -25,7 +25,7 @@ export class SdProgress {
|
|
|
25
25
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 3, ctx.value(), "1.0-2"), " ");
|
|
26
26
|
i0.ɵɵadvance(2);
|
|
27
27
|
i0.ɵɵstyleProp("width", ctx._barWidth());
|
|
28
|
-
} }, dependencies: [PercentPipe], styles: ["sd-progress {\n position: relative;\n display: block;\n width: 100%;\n white-space: nowrap;\n background-color: var(
|
|
28
|
+
} }, dependencies: [PercentPipe], styles: ["sd-progress {\n position: relative;\n display: block;\n width: 100%;\n white-space: nowrap;\n background-color: var(--%NS%sd-bg-gray-subtle);\n border: 1px solid var(--%NS%sd-bd-hairline);\n border-radius: var(--%NS%sd-radius-default);\n overflow: hidden;\n}\nsd-progress > ._content {\n position: relative;\n z-index: 2;\n padding: var(--%NS%sd-gap-lg) var(--%NS%sd-gap-default);\n}\nsd-progress > ._progress {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n height: 100%;\n}\nsd-progress[data-sd-theme=gray] > ._progress {\n background-color: var(--%NS%sd-bg-gray-solid);\n}\nsd-progress[data-sd-theme=blue-gray] > ._progress {\n background-color: var(--%NS%sd-bg-blue-gray-solid);\n}\nsd-progress[data-sd-theme=primary] > ._progress {\n background-color: var(--%NS%sd-bg-primary-solid);\n}\nsd-progress[data-sd-theme=info] > ._progress {\n background-color: var(--%NS%sd-bg-info-solid);\n}\nsd-progress[data-sd-theme=success] > ._progress {\n background-color: var(--%NS%sd-bg-success-solid);\n}\nsd-progress[data-sd-theme=warning] > ._progress {\n background-color: var(--%NS%sd-bg-warning-solid);\n}\nsd-progress[data-sd-theme=danger] > ._progress {\n background-color: var(--%NS%sd-bg-danger-solid);\n}\nsd-progress[data-sd-size=sm] > ._content {\n padding: var(--%NS%sd-gap-xs) var(--%NS%sd-gap-default);\n}\nsd-progress[data-sd-size=lg] > ._content {\n padding: var(--%NS%sd-gap-default) var(--%NS%sd-gap-xl);\n}\nsd-progress[data-sd-inset=true] {\n border-radius: 0;\n border: none;\n background-color: var(--%NS%sd-bg-track);\n}"], encapsulation: 2 });
|
|
29
29
|
}
|
|
30
30
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdProgress, [{
|
|
31
31
|
type: Component,
|
|
@@ -33,7 +33,7 @@ export class SdSidebarContainer {
|
|
|
33
33
|
i0.ɵɵdomElementStart(1, "div", 0);
|
|
34
34
|
i0.ɵɵdomListener("click", function SdSidebarContainer_Template_div_click_1_listener() { return ctx.onBackdropClick(); })("keydown.enter", function SdSidebarContainer_Template_div_keydown_enter_1_listener() { return ctx.onBackdropClick(); });
|
|
35
35
|
i0.ɵɵdomElementEnd();
|
|
36
|
-
} }, styles: ["sd-sidebar-container {\n display: block;\n position: relative;\n height: 100%;\n padding-left: var(
|
|
36
|
+
} }, styles: ["sd-sidebar-container {\n display: block;\n position: relative;\n height: 100%;\n padding-left: var(--%NS%sd-sidebar-width);\n transition: padding-left var(--%NS%sd-animation-duration) ease-out;\n}\nsd-sidebar-container[data-sd-toggle=true] {\n padding-left: 0;\n transition: padding-left var(--%NS%sd-animation-duration) ease-in;\n}\nsd-sidebar-container > ._backdrop {\n display: none;\n}\n\n@media all and (max-width: 520px) {\n sd-sidebar-container {\n padding-left: 0;\n }\n sd-sidebar-container > ._backdrop {\n position: absolute;\n display: block;\n z-index: calc(var(--%NS%sd-z-sidebar) - 1);\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: var(--%NS%sd-bg-inverse);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--%NS%sd-animation-duration) ease-in-out;\n }\n sd-sidebar-container[data-sd-toggle=true] > ._backdrop {\n opacity: 0.6;\n pointer-events: auto;\n }\n}"], encapsulation: 2 });
|
|
37
37
|
}
|
|
38
38
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdSidebarContainer, [{
|
|
39
39
|
type: Component,
|
|
@@ -74,7 +74,7 @@ export class SdSidebarUser {
|
|
|
74
74
|
let tmp_0_0;
|
|
75
75
|
i0.ɵɵadvance(2);
|
|
76
76
|
i0.ɵɵconditional((tmp_0_0 = ctx.userMenu()) ? 2 : -1, tmp_0_0);
|
|
77
|
-
} }, dependencies: [SdCollapseIcon, SdCollapse, SdRipple, SdList, SdListItem, NgIcon], styles: ["sd-sidebar-user {\n display: block;\n}\nsd-sidebar-user > ._menu-button {\n display: block;\n cursor: pointer;\n user-select: none;\n color: var(
|
|
77
|
+
} }, dependencies: [SdCollapseIcon, SdCollapse, SdRipple, SdList, SdListItem, NgIcon], styles: ["sd-sidebar-user {\n display: block;\n}\nsd-sidebar-user > ._menu-button {\n display: block;\n cursor: pointer;\n user-select: none;\n color: var(--%NS%sd-tx-muted);\n padding: var(--%NS%sd-gap-sm) var(--%NS%sd-gap-default);\n border-radius: var(--%NS%sd-radius-default);\n margin: 0 var(--%NS%sd-gap-sm);\n}\nsd-sidebar-user > ._menu-button:hover {\n background-color: var(--%NS%sd-bg-state-hover);\n}\nsd-sidebar-user > sd-collapse > ._content > sd-list {\n background-color: var(--%NS%sd-bg-gray-subtle);\n padding: var(--%NS%sd-gap-xs) 0;\n margin: 0 var(--%NS%sd-gap-sm);\n}"], encapsulation: 2 });
|
|
78
78
|
}
|
|
79
79
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdSidebarUser, [{
|
|
80
80
|
type: Component,
|
|
@@ -12,7 +12,7 @@ export class SdSidebar {
|
|
|
12
12
|
} }, ngContentSelectors: _c0, decls: 1, vars: 0, template: function SdSidebar_Template(rf, ctx) { if (rf & 1) {
|
|
13
13
|
i0.ɵɵprojectionDef();
|
|
14
14
|
i0.ɵɵprojection(0);
|
|
15
|
-
} }, styles: ["sd-sidebar {\n position: absolute;\n z-index: var(
|
|
15
|
+
} }, styles: ["sd-sidebar {\n position: absolute;\n z-index: var(--%NS%sd-z-sidebar);\n top: 0;\n left: 0;\n width: var(--%NS%sd-sidebar-width);\n height: 100%;\n background-color: var(--%NS%sd-bg-canvas);\n border-right: 1px solid var(--%NS%sd-bd-soft);\n}\n@media not all and (max-width: 520px) {\n sd-sidebar {\n transition: transform var(--%NS%sd-animation-duration) ease-out;\n }\n sd-sidebar[data-sd-toggle=true] {\n transform: translateX(-100%);\n transition: transform var(--%NS%sd-animation-duration) ease-in;\n }\n}\n@media all and (max-width: 520px) {\n sd-sidebar {\n transition: transform var(--%NS%sd-animation-duration) ease-in;\n transform: translateX(-100%);\n }\n sd-sidebar[data-sd-toggle=true] {\n transform: none;\n transition: transform var(--%NS%sd-animation-duration) ease-out;\n box-shadow: 0 calc(16 * var(--%NS%sd-shadow-size)) calc(16 * 4 * var(--%NS%sd-shadow-size) * var(--%NS%sd-shadow-blur-mult)) var(--%NS%sd-shadow-color), 0 var(--%NS%sd-shadow-size) calc(var(--%NS%sd-shadow-size) * var(--%NS%sd-shadow-blur-mult)) var(--%NS%sd-shadow-color);\n }\n}"], encapsulation: 2 });
|
|
16
16
|
}
|
|
17
17
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdSidebar, [{
|
|
18
18
|
type: Component,
|
|
@@ -163,7 +163,7 @@ export class SdTopbarMenu {
|
|
|
163
163
|
SdList,
|
|
164
164
|
SdListItem,
|
|
165
165
|
SdButton,
|
|
166
|
-
NgIcon], styles: ["sd-topbar-menu sd-list sd-list {\n background-color: var(
|
|
166
|
+
NgIcon], styles: ["sd-topbar-menu sd-list sd-list {\n background-color: var(--%NS%sd-bg-gray-subtle);\n}"], encapsulation: 2 });
|
|
167
167
|
}
|
|
168
168
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdTopbarMenu, [{
|
|
169
169
|
type: Component,
|
|
@@ -39,7 +39,7 @@ export class SdTopbar {
|
|
|
39
39
|
i0.ɵɵprojection(1);
|
|
40
40
|
} if (rf & 2) {
|
|
41
41
|
i0.ɵɵconditional(ctx.hasSidebar() ? 0 : -1);
|
|
42
|
-
} }, dependencies: [SdButton, NgIcon], styles: ["sd-topbar {\n min-height: var(
|
|
42
|
+
} }, dependencies: [SdButton, NgIcon], styles: ["sd-topbar {\n min-height: var(--%NS%sd-topbar-height);\n overflow-x: auto;\n overflow-y: hidden;\n user-select: none;\n background-color: var(--%NS%sd-bg-canvas);\n color: var(--%NS%sd-tx-default);\n border-bottom: 1px solid var(--%NS%sd-bd-soft);\n padding-left: var(--%NS%sd-gap-xs);\n}\nsd-topbar > h1 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar > h2 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar > h3 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar > h4 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar > h5 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar > h6 {\n padding-right: var(--%NS%sd-gap-xl);\n}\nsd-topbar::-webkit-scrollbar-track {\n background-color: var(--%NS%sd-scrollbar-track);\n}\nsd-topbar::-webkit-scrollbar-corner {\n background-color: var(--%NS%sd-scrollbar-track);\n}\nsd-topbar::-webkit-scrollbar {\n width: var(--%NS%sd-gap-sm);\n height: var(--%NS%sd-gap-sm);\n background-color: transparent;\n}\nsd-topbar::-webkit-scrollbar-thumb {\n background-color: var(--%NS%sd-scrollbar-thumb-hover);\n}"], encapsulation: 2 });
|
|
43
43
|
}
|
|
44
44
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdTopbar, [{
|
|
45
45
|
type: Component,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/angular",
|
|
3
|
-
"version": "14.2.
|
|
3
|
+
"version": "14.2.9",
|
|
4
4
|
"description": "심플리즘 패키지 - Angular",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "심플리즘",
|
|
@@ -32,39 +32,39 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@angular/common": "^22.0
|
|
36
|
-
"@angular/core": "^22.0
|
|
37
|
-
"@angular/platform-browser": "^22.0
|
|
38
|
-
"@angular/router": "^22.0
|
|
39
|
-
"@angular/service-worker": "^22.0
|
|
35
|
+
"@angular/common": "^22.1.0",
|
|
36
|
+
"@angular/core": "^22.1.0",
|
|
37
|
+
"@angular/platform-browser": "^22.1.0",
|
|
38
|
+
"@angular/router": "^22.1.0",
|
|
39
|
+
"@angular/service-worker": "^22.1.0",
|
|
40
40
|
"@ng-icons/core": "^34.0.0",
|
|
41
41
|
"@ng-icons/tabler-icons": "^34.0.0",
|
|
42
|
-
"@tiptap/core": "^3.29.
|
|
43
|
-
"@tiptap/extension-color": "^3.29.
|
|
44
|
-
"@tiptap/extension-document": "^3.29.
|
|
45
|
-
"@tiptap/extension-highlight": "^3.29.
|
|
46
|
-
"@tiptap/extension-image": "^3.29.
|
|
47
|
-
"@tiptap/extension-paragraph": "^3.29.
|
|
48
|
-
"@tiptap/extension-placeholder": "^3.29.
|
|
49
|
-
"@tiptap/extension-text": "^3.29.
|
|
50
|
-
"@tiptap/extension-text-align": "^3.29.
|
|
51
|
-
"@tiptap/extension-text-style": "^3.29.
|
|
52
|
-
"@tiptap/extension-underline": "^3.29.
|
|
53
|
-
"@tiptap/markdown": "^3.29.
|
|
54
|
-
"@tiptap/starter-kit": "^3.29.
|
|
42
|
+
"@tiptap/core": "^3.29.2",
|
|
43
|
+
"@tiptap/extension-color": "^3.29.2",
|
|
44
|
+
"@tiptap/extension-document": "^3.29.2",
|
|
45
|
+
"@tiptap/extension-highlight": "^3.29.2",
|
|
46
|
+
"@tiptap/extension-image": "^3.29.2",
|
|
47
|
+
"@tiptap/extension-paragraph": "^3.29.2",
|
|
48
|
+
"@tiptap/extension-placeholder": "^3.29.2",
|
|
49
|
+
"@tiptap/extension-text": "^3.29.2",
|
|
50
|
+
"@tiptap/extension-text-align": "^3.29.2",
|
|
51
|
+
"@tiptap/extension-text-style": "^3.29.2",
|
|
52
|
+
"@tiptap/extension-underline": "^3.29.2",
|
|
53
|
+
"@tiptap/markdown": "^3.29.2",
|
|
54
|
+
"@tiptap/starter-kit": "^3.29.2",
|
|
55
55
|
"bwip-js": "^4.11.2",
|
|
56
56
|
"echarts": "^6.1.0",
|
|
57
57
|
"html-to-image": "^1.11.13",
|
|
58
58
|
"jspdf": "^4.2.1",
|
|
59
59
|
"rxjs": "^7.8.2",
|
|
60
60
|
"tabbable": "^6.5.0",
|
|
61
|
-
"@simplysm/
|
|
62
|
-
"@simplysm/
|
|
63
|
-
"@simplysm/core-common": "14.2.
|
|
64
|
-
"@simplysm/service-common": "14.2.
|
|
61
|
+
"@simplysm/core-browser": "14.2.9",
|
|
62
|
+
"@simplysm/service-client": "14.2.9",
|
|
63
|
+
"@simplysm/core-common": "14.2.9",
|
|
64
|
+
"@simplysm/service-common": "14.2.9"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@angular/compiler": "^22.0
|
|
67
|
+
"@angular/compiler": "^22.1.0"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {}
|
|
70
70
|
}
|
|
@@ -7,6 +7,68 @@ interface DragResizeOptions {
|
|
|
7
7
|
onEnd: () => void;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
type SizeStyleProp = "width" | "height" | "maxWidth" | "maxHeight";
|
|
11
|
+
|
|
12
|
+
/** `auto`, `none` 등 길이가 아닌 값은 하한 없음(0)으로 본다. */
|
|
13
|
+
function parseCssMinPx(value: string): number {
|
|
14
|
+
const parsed = parseFloat(value);
|
|
15
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function shiftPercentSize(
|
|
19
|
+
dialogStyle: CSSStyleDeclaration,
|
|
20
|
+
prop: SizeStyleProp,
|
|
21
|
+
padPx: number,
|
|
22
|
+
): void {
|
|
23
|
+
if (padPx === 0) return;
|
|
24
|
+
|
|
25
|
+
const value = dialogStyle[prop];
|
|
26
|
+
if (!value.includes("%")) return;
|
|
27
|
+
|
|
28
|
+
dialogStyle[prop] = `calc(${value} - ${padPx}px)`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `._dialog` 는 평소 CSS 로 중앙 정렬(`position: relative` + `margin: 0 auto`)되어 있어
|
|
33
|
+
* `left`/`top` 이 "정상 배치 위치 대비 상대 offset" 으로 해석된다.
|
|
34
|
+
* 드래그, 리사이즈는 절대 좌표로 계산하므로 시작 시점에 절대 좌표계로 전환한다.
|
|
35
|
+
* 전환만으로는 위치, 크기가 변하지 않으며, 이미 전환된 요소에 다시 적용해도 결과가 같다.
|
|
36
|
+
*/
|
|
37
|
+
export function pinDialogAbsolute(dialogEl: HTMLElement): { left: number; top: number } {
|
|
38
|
+
const wasRelative = getComputedStyle(dialogEl).position === "relative";
|
|
39
|
+
const parentEl = dialogEl.offsetParent as HTMLElement | null;
|
|
40
|
+
const beforeRect = dialogEl.getBoundingClientRect();
|
|
41
|
+
const roundedLeft = dialogEl.offsetLeft;
|
|
42
|
+
const roundedTop = dialogEl.offsetTop;
|
|
43
|
+
|
|
44
|
+
dialogEl.style.position = "absolute";
|
|
45
|
+
dialogEl.style.margin = "0";
|
|
46
|
+
dialogEl.style.right = "auto";
|
|
47
|
+
dialogEl.style.bottom = "auto";
|
|
48
|
+
dialogEl.style.left = `${roundedLeft}px`;
|
|
49
|
+
dialogEl.style.top = `${roundedTop}px`;
|
|
50
|
+
|
|
51
|
+
if (wasRelative && parentEl != null) {
|
|
52
|
+
// 백분율 크기의 기준 박스가 부모 content box 에서 offsetParent padding box 로 바뀐다.
|
|
53
|
+
const parentStyle = getComputedStyle(parentEl);
|
|
54
|
+
const padX = parseFloat(parentStyle.paddingLeft) + parseFloat(parentStyle.paddingRight);
|
|
55
|
+
const padY = parseFloat(parentStyle.paddingTop) + parseFloat(parentStyle.paddingBottom);
|
|
56
|
+
shiftPercentSize(dialogEl.style, "width", padX);
|
|
57
|
+
shiftPercentSize(dialogEl.style, "maxWidth", padX);
|
|
58
|
+
shiftPercentSize(dialogEl.style, "height", padY);
|
|
59
|
+
shiftPercentSize(dialogEl.style, "maxHeight", padY);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// offsetLeft/offsetTop 은 정수로 반올림되므로, 전환 전후 실제 위치 차이만큼 되돌린다.
|
|
63
|
+
const afterRect = dialogEl.getBoundingClientRect();
|
|
64
|
+
const pinnedLeft = roundedLeft - (afterRect.left - beforeRect.left);
|
|
65
|
+
const pinnedTop = roundedTop - (afterRect.top - beforeRect.top);
|
|
66
|
+
dialogEl.style.left = `${pinnedLeft}px`;
|
|
67
|
+
dialogEl.style.top = `${pinnedTop}px`;
|
|
68
|
+
|
|
69
|
+
return { left: pinnedLeft, top: pinnedTop };
|
|
70
|
+
}
|
|
71
|
+
|
|
10
72
|
export function injectDragResize(opt: DragResizeOptions): {
|
|
11
73
|
startDrag: (event: MouseEvent) => void;
|
|
12
74
|
startResize: (event: MouseEvent, dir: string) => void;
|
|
@@ -26,6 +88,8 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
26
88
|
startHeight: number;
|
|
27
89
|
startLeft: number;
|
|
28
90
|
startTop: number;
|
|
91
|
+
minWidth: number;
|
|
92
|
+
minHeight: number;
|
|
29
93
|
}
|
|
30
94
|
| undefined;
|
|
31
95
|
|
|
@@ -50,8 +114,8 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
50
114
|
|
|
51
115
|
const dx = event.clientX - resizeState.startX;
|
|
52
116
|
const dy = event.clientY - resizeState.startY;
|
|
53
|
-
const minW =
|
|
54
|
-
const minH =
|
|
117
|
+
const minW = resizeState.minWidth;
|
|
118
|
+
const minH = resizeState.minHeight;
|
|
55
119
|
|
|
56
120
|
let newWidth = resizeState.startWidth;
|
|
57
121
|
let newHeight = resizeState.startHeight;
|
|
@@ -105,25 +169,17 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
105
169
|
}
|
|
106
170
|
}
|
|
107
171
|
|
|
108
|
-
function getParentRect(dialogEl: HTMLElement): { left: number; top: number } {
|
|
109
|
-
return (dialogEl.offsetParent as HTMLElement | null)?.getBoundingClientRect() ?? {
|
|
110
|
-
left: 0,
|
|
111
|
-
top: 0,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
172
|
function startDrag(event: MouseEvent): void {
|
|
116
173
|
const dialogEl = opt.getDialogEl();
|
|
117
174
|
if (dialogEl == null) return;
|
|
118
175
|
|
|
119
|
-
const
|
|
120
|
-
const parentRect = getParentRect(dialogEl);
|
|
176
|
+
const pinned = pinDialogAbsolute(dialogEl);
|
|
121
177
|
|
|
122
178
|
dragState = {
|
|
123
179
|
startX: event.clientX,
|
|
124
180
|
startY: event.clientY,
|
|
125
|
-
startLeft:
|
|
126
|
-
startTop:
|
|
181
|
+
startLeft: pinned.left,
|
|
182
|
+
startTop: pinned.top,
|
|
127
183
|
};
|
|
128
184
|
document.addEventListener("mousemove", onDocumentMouseMove);
|
|
129
185
|
document.addEventListener("mouseup", onDocumentMouseUp);
|
|
@@ -133,8 +189,8 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
133
189
|
const dialogEl = opt.getDialogEl();
|
|
134
190
|
if (dialogEl == null) return;
|
|
135
191
|
|
|
136
|
-
const
|
|
137
|
-
const
|
|
192
|
+
const pinned = pinDialogAbsolute(dialogEl);
|
|
193
|
+
const dialogStyle = getComputedStyle(dialogEl);
|
|
138
194
|
|
|
139
195
|
resizeState = {
|
|
140
196
|
dir,
|
|
@@ -142,8 +198,11 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
142
198
|
startY: event.clientY,
|
|
143
199
|
startWidth: dialogEl.offsetWidth,
|
|
144
200
|
startHeight: dialogEl.offsetHeight,
|
|
145
|
-
startLeft:
|
|
146
|
-
startTop:
|
|
201
|
+
startLeft: pinned.left,
|
|
202
|
+
startTop: pinned.top,
|
|
203
|
+
// CSS 하한을 넘겨 줄이면 실제 크기는 안 줄고 반대쪽 변만 밀려나므로, 실제 제약을 하한으로 삼는다.
|
|
204
|
+
minWidth: Math.max(opt.minWidthPx() ?? 0, parseCssMinPx(dialogStyle.minWidth)),
|
|
205
|
+
minHeight: Math.max(opt.minHeightPx() ?? 0, parseCssMinPx(dialogStyle.minHeight)),
|
|
147
206
|
};
|
|
148
207
|
document.addEventListener("mousemove", onDocumentMouseMove);
|
|
149
208
|
document.addEventListener("mouseup", onDocumentMouseUp);
|
|
@@ -14,10 +14,7 @@ import {
|
|
|
14
14
|
} from "@angular/core";
|
|
15
15
|
import { outputToObservable } from "@angular/core/rxjs-interop";
|
|
16
16
|
import { Subscription } from "rxjs";
|
|
17
|
-
import type {
|
|
18
|
-
DirectiveInputSignals,
|
|
19
|
-
WithOptional,
|
|
20
|
-
} from "../directive-input-signals";
|
|
17
|
+
import type { DirectiveInputSignals, WithOptional } from "../directive-input-signals";
|
|
21
18
|
import { SdModal } from "./sd-modal";
|
|
22
19
|
import { SdActivatedModalProvider } from "./sd-activated-modal.provider";
|
|
23
20
|
import "@simplysm/core-browser";
|
|
@@ -18,7 +18,7 @@ import { tablerX } from "@ng-icons/tabler-icons";
|
|
|
18
18
|
import { SdActivatedModalProvider } from "./sd-activated-modal.provider";
|
|
19
19
|
import { SdSystemConfigProvider } from "../config/sd-system-config.provider";
|
|
20
20
|
import { injectFocusTrap } from "./injectFocusTrap";
|
|
21
|
-
import { injectDragResize } from "./injectDragResize";
|
|
21
|
+
import { injectDragResize, pinDialogAbsolute } from "./injectDragResize";
|
|
22
22
|
import { SdAnchor } from "../../controls/button/sd-anchor";
|
|
23
23
|
import { SdResizeDirective, type SdResizeEvent } from "../events/sd-resize";
|
|
24
24
|
import "@simplysm/core-browser";
|
|
@@ -49,6 +49,7 @@ import "@simplysm/core-browser";
|
|
|
49
49
|
<div
|
|
50
50
|
class="_dialog"
|
|
51
51
|
tabindex="-1"
|
|
52
|
+
(mousedown)="onDialogMouseDown()"
|
|
52
53
|
(keydown)="onDialogKeydown($event)"
|
|
53
54
|
(focus)="onDialogFocus()"
|
|
54
55
|
(sdResize)="onDialogResize($event)"
|
|
@@ -368,6 +369,10 @@ export class SdModal {
|
|
|
368
369
|
onEnd: () => void this._saveConfig().catch((err) => this._errorHandler.handleError(err)),
|
|
369
370
|
});
|
|
370
371
|
|
|
372
|
+
/** 화면 넘침 클램프로 덮기 직전의 크기. 클램프 중이 아니면 undefined. */
|
|
373
|
+
private _clampedWidth: string | undefined;
|
|
374
|
+
private _clampedHeight: string | undefined;
|
|
375
|
+
|
|
371
376
|
constructor() {
|
|
372
377
|
// data-sd-init: 첫 렌더 후 설정하여 CSS transition 트리거 허용
|
|
373
378
|
afterNextRender(() => {
|
|
@@ -391,6 +396,7 @@ export class SdModal {
|
|
|
391
396
|
} else {
|
|
392
397
|
dialogEl.style.height = "";
|
|
393
398
|
}
|
|
399
|
+
this._forgetClampedSize();
|
|
394
400
|
});
|
|
395
401
|
|
|
396
402
|
// key 기반 설정 복원
|
|
@@ -404,9 +410,15 @@ export class SdModal {
|
|
|
404
410
|
|
|
405
411
|
onResizeMouseDown(event: MouseEvent, dir: string): void {
|
|
406
412
|
event.preventDefault();
|
|
413
|
+
// 사용자가 직접 정하는 크기가 자동 클램프 이전 크기보다 우선한다.
|
|
414
|
+
this._forgetClampedSize();
|
|
407
415
|
this._dragResize.startResize(event, dir);
|
|
408
416
|
}
|
|
409
417
|
|
|
418
|
+
onDialogMouseDown(): void {
|
|
419
|
+
this._bringToFront();
|
|
420
|
+
}
|
|
421
|
+
|
|
410
422
|
onHeaderMouseDown(event: MouseEvent): void {
|
|
411
423
|
if (!this.movable()) return;
|
|
412
424
|
if ((event.target as HTMLElement).closest("button, sd-anchor") != null) return;
|
|
@@ -449,12 +461,20 @@ export class SdModal {
|
|
|
449
461
|
onWindowResize(): void {
|
|
450
462
|
const dialogEl = this._getDialogEl();
|
|
451
463
|
if (dialogEl == null) return;
|
|
464
|
+
// 위치를 잡지 않은 모달은 CSS 중앙 정렬이 창 크기를 따라가므로 보정 대상이 아니다.
|
|
465
|
+
if (dialogEl.style.left === "" && dialogEl.style.top === "") return;
|
|
466
|
+
this._clampIntoHost(dialogEl);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
private _clampIntoHost(dialogEl: HTMLElement): void {
|
|
452
470
|
const hostEl = this._elRef.nativeElement;
|
|
453
|
-
|
|
454
|
-
|
|
471
|
+
const maxLeft = Math.max(0, hostEl.offsetWidth - 100);
|
|
472
|
+
if (dialogEl.offsetLeft > maxLeft) {
|
|
473
|
+
dialogEl.style.left = `${maxLeft}px`;
|
|
455
474
|
}
|
|
456
|
-
|
|
457
|
-
|
|
475
|
+
const maxTop = Math.max(0, hostEl.offsetHeight - 100);
|
|
476
|
+
if (dialogEl.offsetTop > maxTop) {
|
|
477
|
+
dialogEl.style.top = `${maxTop}px`;
|
|
458
478
|
}
|
|
459
479
|
}
|
|
460
480
|
|
|
@@ -482,23 +502,50 @@ export class SdModal {
|
|
|
482
502
|
hostEl.style.zIndex = String(maxZ + 1);
|
|
483
503
|
}
|
|
484
504
|
|
|
505
|
+
private _forgetClampedSize(): void {
|
|
506
|
+
this._clampedWidth = undefined;
|
|
507
|
+
this._clampedHeight = undefined;
|
|
508
|
+
}
|
|
509
|
+
|
|
485
510
|
private _calcHeight(): void {
|
|
486
511
|
const dialogEl = this._getDialogEl();
|
|
487
512
|
if (dialogEl == null) return;
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
if (
|
|
513
|
+
|
|
514
|
+
// 클램프 중이면 dialog 높이가 호스트에 맞춰져 있어 실제 필요 높이를 알 수 없다. 먼저 되돌려 잰다.
|
|
515
|
+
if (this._clampedHeight != null) {
|
|
516
|
+
dialogEl.style.height = this._clampedHeight;
|
|
517
|
+
dialogEl.style.maxHeight = "";
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
const hostEl = this._elRef.nativeElement;
|
|
521
|
+
const paddingTop = parseFloat(getComputedStyle(hostEl).paddingTop) || 0;
|
|
522
|
+
|
|
523
|
+
if (dialogEl.offsetHeight > hostEl.offsetHeight - paddingTop) {
|
|
524
|
+
this._clampedHeight ??= dialogEl.style.height;
|
|
491
525
|
dialogEl.style.maxHeight = "100%";
|
|
492
526
|
dialogEl.style.height = "100%";
|
|
527
|
+
} else {
|
|
528
|
+
this._clampedHeight = undefined;
|
|
493
529
|
}
|
|
494
530
|
}
|
|
495
531
|
|
|
496
532
|
private _calcWidth(): void {
|
|
497
533
|
const dialogEl = this._getDialogEl();
|
|
498
534
|
if (dialogEl == null) return;
|
|
499
|
-
|
|
535
|
+
|
|
536
|
+
if (this._clampedWidth != null) {
|
|
537
|
+
dialogEl.style.width = this._clampedWidth;
|
|
538
|
+
dialogEl.style.maxWidth = "";
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const hostEl = this._elRef.nativeElement;
|
|
542
|
+
|
|
543
|
+
if (dialogEl.offsetWidth > hostEl.offsetWidth) {
|
|
544
|
+
this._clampedWidth ??= dialogEl.style.width;
|
|
500
545
|
dialogEl.style.maxWidth = "100%";
|
|
501
546
|
dialogEl.style.width = "100%";
|
|
547
|
+
} else {
|
|
548
|
+
this._clampedWidth = undefined;
|
|
502
549
|
}
|
|
503
550
|
}
|
|
504
551
|
|
|
@@ -513,9 +560,13 @@ export class SdModal {
|
|
|
513
560
|
const dialogEl = this._getDialogEl();
|
|
514
561
|
if (dialogEl == null) return;
|
|
515
562
|
|
|
563
|
+
// 클램프 중이면 화면에 맞춘 값이 아니라 그 직전 크기를 저장해야 다시 열 때 원래 크기로 뜬다.
|
|
564
|
+
const savedWidth = this._clampedWidth ?? dialogEl.style.width;
|
|
565
|
+
const savedHeight = this._clampedHeight ?? dialogEl.style.height;
|
|
566
|
+
|
|
516
567
|
const config: Record<string, string> = {};
|
|
517
|
-
if (
|
|
518
|
-
if (
|
|
568
|
+
if (savedWidth !== "") config["width"] = savedWidth;
|
|
569
|
+
if (savedHeight !== "") config["height"] = savedHeight;
|
|
519
570
|
if (dialogEl.style.left !== "") config["left"] = dialogEl.style.left;
|
|
520
571
|
if (dialogEl.style.top !== "") config["top"] = dialogEl.style.top;
|
|
521
572
|
|
|
@@ -526,7 +577,8 @@ export class SdModal {
|
|
|
526
577
|
if (this._sdSystemConfig == null) return;
|
|
527
578
|
|
|
528
579
|
const config = (await this._sdSystemConfig.getAsync(`sd-modal.${k}`)) as
|
|
529
|
-
Record<string, string | undefined>
|
|
580
|
+
| Record<string, string | undefined>
|
|
581
|
+
| undefined;
|
|
530
582
|
if (config == null) return;
|
|
531
583
|
|
|
532
584
|
const dialogEl = this._getDialogEl();
|
|
@@ -534,7 +586,13 @@ export class SdModal {
|
|
|
534
586
|
|
|
535
587
|
if (config["width"] != null) dialogEl.style.width = config["width"];
|
|
536
588
|
if (config["height"] != null) dialogEl.style.height = config["height"];
|
|
537
|
-
|
|
538
|
-
|
|
589
|
+
this._forgetClampedSize();
|
|
590
|
+
|
|
591
|
+
if (config["left"] != null || config["top"] != null) {
|
|
592
|
+
pinDialogAbsolute(dialogEl);
|
|
593
|
+
if (config["left"] != null) dialogEl.style.left = config["left"];
|
|
594
|
+
if (config["top"] != null) dialogEl.style.top = config["top"];
|
|
595
|
+
this._clampIntoHost(dialogEl);
|
|
596
|
+
}
|
|
539
597
|
}
|
|
540
598
|
}
|