@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.
Files changed (52) hide show
  1. package/dist/controls/button/sd-additional-button.js +1 -1
  2. package/dist/controls/button/sd-anchor.js +1 -1
  3. package/dist/controls/button/sd-button.js +1 -1
  4. package/dist/controls/button/sd-modal-select-button.js +1 -1
  5. package/dist/controls/checkbox/sd-checkbox.js +1 -1
  6. package/dist/controls/checkbox/sd-switch.js +1 -1
  7. package/dist/controls/dropdown/sd-dropdown-popup.js +1 -1
  8. package/dist/controls/gap/sd-gap.js +1 -1
  9. package/dist/controls/input/sd-date-range-picker.js +1 -1
  10. package/dist/controls/input/sd-numpad.js +1 -1
  11. package/dist/controls/input/sd-range.js +1 -1
  12. package/dist/controls/input/sd-textarea.js +1 -1
  13. package/dist/controls/input/sd-textfield.js +1 -1
  14. package/dist/controls/list/sd-list-item.js +2 -2
  15. package/dist/controls/list/sd-list.js +1 -1
  16. package/dist/controls/pagination/sd-pagination.js +1 -1
  17. package/dist/controls/select/sd-select-button.js +1 -1
  18. package/dist/controls/select/sd-select-item.js +1 -1
  19. package/dist/controls/select/sd-select.js +1 -1
  20. package/dist/controls/tab/sd-tab-item.js +1 -1
  21. package/dist/controls/tab/sd-tab.js +1 -1
  22. package/dist/core/busy/sd-busy-container.js +1 -1
  23. package/dist/core/modal/injectDragResize.d.ts +10 -0
  24. package/dist/core/modal/injectDragResize.d.ts.map +1 -1
  25. package/dist/core/modal/injectDragResize.js +61 -16
  26. package/dist/core/modal/sd-modal.d.ts +6 -0
  27. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  28. package/dist/core/modal/sd-modal.js +69 -21
  29. package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
  30. package/dist/core/toast/sd-toast-container.js +1 -1
  31. package/dist/core/toast/sd-toast.js +1 -1
  32. package/dist/data/kanban/sd-kanban-board.js +1 -1
  33. package/dist/data/kanban/sd-kanban-lane.js +1 -1
  34. package/dist/data/kanban/sd-kanban.js +1 -1
  35. package/dist/data/permission-table/sd-permission-table.js +1 -1
  36. package/dist/data/sheet/sd-sheet.js +1 -1
  37. package/dist/data/state-preset/sd-state-preset.js +1 -1
  38. package/dist/features/editor/sd-markdown-editor.js +1 -1
  39. package/dist/features/editor/sd-tiptap-editor.js +1 -1
  40. package/dist/features/visual/sd-calendar.js +1 -1
  41. package/dist/features/visual/sd-label.js +1 -1
  42. package/dist/features/visual/sd-note.js +1 -1
  43. package/dist/features/visual/sd-progress.js +1 -1
  44. package/dist/layout/sidebar/sd-sidebar-container.js +1 -1
  45. package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
  46. package/dist/layout/sidebar/sd-sidebar.js +1 -1
  47. package/dist/layout/topbar/sd-topbar-menu.js +1 -1
  48. package/dist/layout/topbar/sd-topbar.js +1 -1
  49. package/package.json +24 -24
  50. package/src/core/modal/injectDragResize.ts +76 -17
  51. package/src/core/modal/sd-modal.provider.ts +1 -4
  52. 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(--sd-bd-field);\n border-radius: var(--sd-radius-default);\n background-color: var(--sd-bg-field);\n}\nsd-tiptap-editor > ._toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--sd-gap-xs);\n padding: var(--sd-gap-xs);\n border-bottom: 1px solid var(--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(--sd-gap-xs) var(--sd-gap-sm);\n border: 1px solid var(--sd-bd-hairline);\n border-radius: var(--sd-radius-default);\n background-color: transparent;\n cursor: pointer;\n font-size: var(--sd-font-size-default);\n line-height: 1;\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button._active {\n background-color: var(--sd-bg-primary-solid);\n color: var(--sd-tx-primary-solid);\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button:hover {\n background-color: var(--sd-bg-state-hover);\n}\nsd-tiptap-editor > ._toolbar > ._btn-group > button._active:hover {\n background-color: var(--sd-bg-primary-solid);\n}\nsd-tiptap-editor > ._color-picker {\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n padding: var(--sd-gap-xs);\n border-bottom: 1px solid var(--sd-bd-hairline);\n}\nsd-tiptap-editor > ._color-picker > ._color-swatch {\n width: 1.25rem;\n height: 1.25rem;\n border: 1px solid var(--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(--sd-bg-content);\n font-size: 0.625rem;\n}\nsd-tiptap-editor > ._editor-container {\n padding: var(--sd-gap-sm);\n min-height: 6.25rem;\n font-family: var(--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(--sd-bg-disabled);\n color: var(--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 });
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(--sd-radius-default);\n overflow: hidden;\n}\nsd-calendar > table > * > tr > * {\n padding: var(--sd-gap-sm) var(--sd-gap-default);\n border: 1px solid var(--sd-bd-default);\n width: 14.2857142857%;\n}\nsd-calendar > table > thead > tr > th {\n background-color: var(--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(--sd-gap-sm);\n}\nsd-calendar > table > tbody > tr > td.not-current {\n background-color: var(--sd-bg-canvas);\n}\nsd-calendar > table > tbody > tr > td.not-current > .day {\n color: var(--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(--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(--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(--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(--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(--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(--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(--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(--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(--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(--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(--sd-gap-auto);\n }\n}"], encapsulation: 2 });
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(--sd-bg-gray-solid);\n color: var(--sd-tx-gray-solid);\n padding: 0 var(--sd-gap-sm);\n border-radius: var(--sd-radius-default);\n text-indent: 0;\n}\nsd-label[data-sd-theme=gray] {\n background-color: var(--sd-bg-gray-solid);\n color: var(--sd-tx-gray-solid);\n}\nsd-label[data-sd-theme=blue-gray] {\n background-color: var(--sd-bg-blue-gray-solid);\n color: var(--sd-tx-blue-gray-solid);\n}\nsd-label[data-sd-theme=primary] {\n background-color: var(--sd-bg-primary-solid);\n color: var(--sd-tx-primary-solid);\n}\nsd-label[data-sd-theme=info] {\n background-color: var(--sd-bg-info-solid);\n color: var(--sd-tx-info-solid);\n}\nsd-label[data-sd-theme=success] {\n background-color: var(--sd-bg-success-solid);\n color: var(--sd-tx-success-solid);\n}\nsd-label[data-sd-theme=warning] {\n background-color: var(--sd-bg-warning-solid);\n color: var(--sd-tx-warning-solid);\n}\nsd-label[data-sd-theme=danger] {\n background-color: var(--sd-bg-danger-solid);\n color: var(--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(--sd-bg-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=gray] {\n background-color: var(--sd-bg-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=blue-gray] {\n background-color: var(--sd-bg-blue-gray-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=primary] {\n background-color: var(--sd-bg-primary-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=info] {\n background-color: var(--sd-bg-info-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=success] {\n background-color: var(--sd-bg-success-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=warning] {\n background-color: var(--sd-bg-warning-solid-hover);\n}\nsd-label[data-sd-clickable=true]:hover[data-sd-theme=danger] {\n background-color: var(--sd-bg-danger-solid-hover);\n}"], encapsulation: 2 });
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(--sd-gap-sm) var(--sd-gap-default);\n background-color: var(--sd-bg-gray-subtle);\n border: none;\n border-radius: var(--sd-radius-default);\n}\nsd-note[data-sd-theme=gray] {\n background-color: var(--sd-bg-gray-subtle);\n border: 1px solid var(--sd-bg-gray-subtle);\n}\nsd-note[data-sd-theme=blue-gray] {\n background-color: var(--sd-bg-blue-gray-subtle);\n border: 1px solid var(--sd-bg-blue-gray-subtle);\n}\nsd-note[data-sd-theme=primary] {\n background-color: var(--sd-bg-primary-subtle);\n border: 1px solid var(--sd-bg-primary-subtle);\n}\nsd-note[data-sd-theme=info] {\n background-color: var(--sd-bg-info-subtle);\n border: 1px solid var(--sd-bg-info-subtle);\n}\nsd-note[data-sd-theme=success] {\n background-color: var(--sd-bg-success-subtle);\n border: 1px solid var(--sd-bg-success-subtle);\n}\nsd-note[data-sd-theme=warning] {\n background-color: var(--sd-bg-warning-subtle);\n border: 1px solid var(--sd-bg-warning-subtle);\n}\nsd-note[data-sd-theme=danger] {\n background-color: var(--sd-bg-danger-subtle);\n border: 1px solid var(--sd-bg-danger-subtle);\n}\nsd-note[data-sd-size=sm] {\n font-size: var(--sd-font-size-sm);\n padding: var(--sd-gap-xs) var(--sd-gap-sm);\n}\nsd-note[data-sd-size=lg] {\n padding: var(--sd-gap-default) var(--sd-gap-lg);\n}\nsd-note[data-sd-inset=true] {\n border-radius: 0;\n}"], encapsulation: 2 });
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(--sd-bg-gray-subtle);\n border: 1px solid var(--sd-bd-hairline);\n border-radius: var(--sd-radius-default);\n overflow: hidden;\n}\nsd-progress > ._content {\n position: relative;\n z-index: 2;\n padding: var(--sd-gap-lg) var(--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(--sd-bg-gray-solid);\n}\nsd-progress[data-sd-theme=blue-gray] > ._progress {\n background-color: var(--sd-bg-blue-gray-solid);\n}\nsd-progress[data-sd-theme=primary] > ._progress {\n background-color: var(--sd-bg-primary-solid);\n}\nsd-progress[data-sd-theme=info] > ._progress {\n background-color: var(--sd-bg-info-solid);\n}\nsd-progress[data-sd-theme=success] > ._progress {\n background-color: var(--sd-bg-success-solid);\n}\nsd-progress[data-sd-theme=warning] > ._progress {\n background-color: var(--sd-bg-warning-solid);\n}\nsd-progress[data-sd-theme=danger] > ._progress {\n background-color: var(--sd-bg-danger-solid);\n}\nsd-progress[data-sd-size=sm] > ._content {\n padding: var(--sd-gap-xs) var(--sd-gap-default);\n}\nsd-progress[data-sd-size=lg] > ._content {\n padding: var(--sd-gap-default) var(--sd-gap-xl);\n}\nsd-progress[data-sd-inset=true] {\n border-radius: 0;\n border: none;\n background-color: var(--sd-bg-track);\n}"], encapsulation: 2 });
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(--sd-sidebar-width);\n transition: padding-left var(--sd-animation-duration) ease-out;\n}\nsd-sidebar-container[data-sd-toggle=true] {\n padding-left: 0;\n transition: padding-left var(--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(--sd-z-sidebar) - 1);\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: var(--sd-bg-inverse);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--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 });
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(--sd-tx-muted);\n padding: var(--sd-gap-sm) var(--sd-gap-default);\n border-radius: var(--sd-radius-default);\n margin: 0 var(--sd-gap-sm);\n}\nsd-sidebar-user > ._menu-button:hover {\n background-color: var(--sd-bg-state-hover);\n}\nsd-sidebar-user > sd-collapse > ._content > sd-list {\n background-color: var(--sd-bg-gray-subtle);\n padding: var(--sd-gap-xs) 0;\n margin: 0 var(--sd-gap-sm);\n}"], encapsulation: 2 });
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(--sd-z-sidebar);\n top: 0;\n left: 0;\n width: var(--sd-sidebar-width);\n height: 100%;\n background-color: var(--sd-bg-canvas);\n border-right: 1px solid var(--sd-bd-soft);\n}\n@media not all and (max-width: 520px) {\n sd-sidebar {\n transition: transform var(--sd-animation-duration) ease-out;\n }\n sd-sidebar[data-sd-toggle=true] {\n transform: translateX(-100%);\n transition: transform var(--sd-animation-duration) ease-in;\n }\n}\n@media all and (max-width: 520px) {\n sd-sidebar {\n transition: transform var(--sd-animation-duration) ease-in;\n transform: translateX(-100%);\n }\n sd-sidebar[data-sd-toggle=true] {\n transform: none;\n transition: transform var(--sd-animation-duration) ease-out;\n box-shadow: 0 calc(16 * var(--sd-shadow-size)) calc(16 * 4 * var(--sd-shadow-size) * var(--sd-shadow-blur-mult)) var(--sd-shadow-color), 0 var(--sd-shadow-size) calc(var(--sd-shadow-size) * var(--sd-shadow-blur-mult)) var(--sd-shadow-color);\n }\n}"], encapsulation: 2 });
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(--sd-bg-gray-subtle);\n}"], encapsulation: 2 });
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(--sd-topbar-height);\n overflow-x: auto;\n overflow-y: hidden;\n user-select: none;\n background-color: var(--sd-bg-canvas);\n color: var(--sd-tx-default);\n border-bottom: 1px solid var(--sd-bd-soft);\n padding-left: var(--sd-gap-xs);\n}\nsd-topbar > h1 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar > h2 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar > h3 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar > h4 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar > h5 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar > h6 {\n padding-right: var(--sd-gap-xl);\n}\nsd-topbar::-webkit-scrollbar-track {\n background-color: var(--sd-scrollbar-track);\n}\nsd-topbar::-webkit-scrollbar-corner {\n background-color: var(--sd-scrollbar-track);\n}\nsd-topbar::-webkit-scrollbar {\n width: var(--sd-gap-sm);\n height: var(--sd-gap-sm);\n background-color: transparent;\n}\nsd-topbar::-webkit-scrollbar-thumb {\n background-color: var(--sd-scrollbar-thumb-hover);\n}"], encapsulation: 2 });
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.7",
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.8",
36
- "@angular/core": "^22.0.8",
37
- "@angular/platform-browser": "^22.0.8",
38
- "@angular/router": "^22.0.8",
39
- "@angular/service-worker": "^22.0.8",
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.0",
43
- "@tiptap/extension-color": "^3.29.0",
44
- "@tiptap/extension-document": "^3.29.0",
45
- "@tiptap/extension-highlight": "^3.29.0",
46
- "@tiptap/extension-image": "^3.29.0",
47
- "@tiptap/extension-paragraph": "^3.29.0",
48
- "@tiptap/extension-placeholder": "^3.29.0",
49
- "@tiptap/extension-text": "^3.29.0",
50
- "@tiptap/extension-text-align": "^3.29.0",
51
- "@tiptap/extension-text-style": "^3.29.0",
52
- "@tiptap/extension-underline": "^3.29.0",
53
- "@tiptap/markdown": "^3.29.0",
54
- "@tiptap/starter-kit": "^3.29.0",
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/service-client": "14.2.7",
62
- "@simplysm/core-browser": "14.2.7",
63
- "@simplysm/core-common": "14.2.7",
64
- "@simplysm/service-common": "14.2.7"
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.8"
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 = opt.minWidthPx() ?? 0;
54
- const minH = opt.minHeightPx() ?? 0;
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 dialogRect = dialogEl.getBoundingClientRect();
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: dialogRect.left - parentRect.left,
126
- startTop: dialogRect.top - parentRect.top,
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 dialogRect = dialogEl.getBoundingClientRect();
137
- const parentRect = getParentRect(dialogEl);
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: dialogRect.left - parentRect.left,
146
- startTop: dialogRect.top - parentRect.top,
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
- if (dialogEl.offsetLeft > hostEl.offsetWidth - 100) {
454
- dialogEl.style.left = hostEl.offsetWidth - 100 + "px";
471
+ const maxLeft = Math.max(0, hostEl.offsetWidth - 100);
472
+ if (dialogEl.offsetLeft > maxLeft) {
473
+ dialogEl.style.left = `${maxLeft}px`;
455
474
  }
456
- if (dialogEl.offsetTop > hostEl.offsetHeight - 100) {
457
- dialogEl.style.top = hostEl.offsetHeight - 100 + "px";
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
- const style = getComputedStyle(this._elRef.nativeElement);
489
- const paddingTop = style.paddingTop === "" ? 0 : parseInt(style.paddingTop, 10) || 0;
490
- if (dialogEl.offsetHeight > this._elRef.nativeElement.offsetHeight - paddingTop) {
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
- if (dialogEl.offsetWidth > this._elRef.nativeElement.offsetWidth) {
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 (dialogEl.style.width !== "") config["width"] = dialogEl.style.width;
518
- if (dialogEl.style.height !== "") config["height"] = dialogEl.style.height;
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> | 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
- if (config["left"] != null) dialogEl.style.left = config["left"];
538
- if (config["top"] != null) dialogEl.style.top = config["top"];
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
  }