@simplysm/angular 14.0.42 → 14.0.43

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 (241) 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.d.ts +1 -1
  5. package/dist/controls/button/sd-modal-select-button.d.ts.map +1 -1
  6. package/dist/controls/button/sd-modal-select-button.js +8 -6
  7. package/dist/controls/checkbox/sd-checkbox-group-item.js +1 -1
  8. package/dist/controls/checkbox/sd-checkbox-group.js +1 -1
  9. package/dist/controls/checkbox/sd-checkbox.js +1 -1
  10. package/dist/controls/checkbox/sd-switch.js +1 -1
  11. package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
  12. package/dist/controls/collapse/sd-collapse-icon.js +3 -3
  13. package/dist/controls/collapse/sd-collapse.d.ts +1 -1
  14. package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
  15. package/dist/controls/collapse/sd-collapse.js +8 -7
  16. package/dist/controls/dropdown/sd-dropdown-popup.d.ts +2 -0
  17. package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
  18. package/dist/controls/dropdown/sd-dropdown-popup.js +21 -8
  19. package/dist/controls/dropdown/sd-dropdown.d.ts.map +1 -1
  20. package/dist/controls/dropdown/sd-dropdown.js +5 -16
  21. package/dist/controls/form/sd-form.js +1 -1
  22. package/dist/controls/gap/sd-gap.js +5 -5
  23. package/dist/controls/input/sd-date-range-picker.d.ts +1 -0
  24. package/dist/controls/input/sd-date-range-picker.d.ts.map +1 -1
  25. package/dist/controls/input/sd-date-range-picker.js +14 -19
  26. package/dist/controls/input/sd-numpad.js +3 -3
  27. package/dist/controls/input/sd-range.js +1 -1
  28. package/dist/controls/input/sd-textarea.js +2 -2
  29. package/dist/controls/input/sd-textfield-type-handlers.js +2 -2
  30. package/dist/controls/input/sd-textfield.js +9 -9
  31. package/dist/controls/list/sd-list-item.d.ts +0 -1
  32. package/dist/controls/list/sd-list-item.d.ts.map +1 -1
  33. package/dist/controls/list/sd-list-item.js +38 -38
  34. package/dist/controls/list/sd-list.d.ts.map +1 -1
  35. package/dist/controls/list/sd-list.js +3 -3
  36. package/dist/controls/pagination/sd-pagination.js +1 -1
  37. package/dist/controls/select/sd-select-button.d.ts.map +1 -1
  38. package/dist/controls/select/sd-select-button.js +4 -8
  39. package/dist/controls/select/sd-select-item.d.ts +3 -3
  40. package/dist/controls/select/sd-select-item.d.ts.map +1 -1
  41. package/dist/controls/select/sd-select-item.js +27 -20
  42. package/dist/controls/select/sd-select.d.ts +5 -4
  43. package/dist/controls/select/sd-select.d.ts.map +1 -1
  44. package/dist/controls/select/sd-select.js +20 -17
  45. package/dist/controls/tab/sd-tab-item.js +1 -1
  46. package/dist/controls/tab/sd-tab.js +1 -1
  47. package/dist/core/app-structure/sd-app-structure.utils.js +1 -1
  48. package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
  49. package/dist/core/busy/sd-busy-container.js +62 -68
  50. package/dist/core/busy/sd-busy.provider.js +1 -1
  51. package/dist/core/commands/sd-command.d.ts +13 -0
  52. package/dist/core/commands/sd-command.d.ts.map +1 -0
  53. package/dist/core/commands/sd-command.js +52 -0
  54. package/dist/core/error-handler/sd-global-error-handler.plugin.js +1 -1
  55. package/dist/core/events/sd-events.d.ts +1 -6
  56. package/dist/core/events/sd-events.d.ts.map +1 -1
  57. package/dist/core/events/sd-events.js +3 -11
  58. package/dist/core/events/sd-intersection.d.ts +13 -0
  59. package/dist/core/events/sd-intersection.d.ts.map +1 -0
  60. package/dist/core/events/sd-intersection.js +27 -0
  61. package/dist/core/events/sd-resize.d.ts +16 -0
  62. package/dist/core/events/sd-resize.d.ts.map +1 -0
  63. package/dist/core/events/{sd-resize-event.plugin.js → sd-resize.js} +18 -20
  64. package/dist/core/file-dialog/sd-file-dialog.provider.js +1 -1
  65. package/dist/core/modal/injectDragResize.js +9 -9
  66. package/dist/core/modal/injectFocusTrap.js +1 -1
  67. package/dist/core/modal/sd-confirm-modal.js +1 -1
  68. package/dist/core/modal/sd-modal.d.ts +8 -1
  69. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  70. package/dist/core/modal/sd-modal.js +135 -39
  71. package/dist/core/modal/sd-modal.provider.js +5 -5
  72. package/dist/core/modal/sd-prompt-modal.js +1 -1
  73. package/dist/core/provideSdAngular.d.ts.map +1 -1
  74. package/dist/core/provideSdAngular.js +0 -10
  75. package/dist/core/ripple/setupRipple.js +5 -5
  76. package/dist/core/routing/menu-utils.js +1 -1
  77. package/dist/core/routing/sd-navigate-window.provider.js +1 -1
  78. package/dist/core/routing/sd-router-link.js +1 -1
  79. package/dist/core/selection/setupCumulateSelectedKeys.js +3 -3
  80. package/dist/core/setupModelHook.js +1 -1
  81. package/dist/core/toast/sd-toast-container.d.ts +1 -1
  82. package/dist/core/toast/sd-toast-container.js +3 -7
  83. package/dist/core/toast/sd-toast.d.ts.map +1 -1
  84. package/dist/core/toast/sd-toast.js +27 -24
  85. package/dist/core/toast/sd-toast.provider.js +6 -6
  86. package/dist/core/validation/setupInvalid.js +2 -1
  87. package/dist/data/data-detail/sd-data-detail.d.ts +2 -1
  88. package/dist/data/data-detail/sd-data-detail.d.ts.map +1 -1
  89. package/dist/data/data-detail/sd-data-detail.js +37 -33
  90. package/dist/data/data-select-button/sd-data-select-button.js +1 -1
  91. package/dist/data/data-sheet/sd-data-sheet.d.ts +2 -1
  92. package/dist/data/data-sheet/sd-data-sheet.d.ts.map +1 -1
  93. package/dist/data/data-sheet/sd-data-sheet.js +30 -22
  94. package/dist/data/kanban/sd-kanban-board.js +1 -1
  95. package/dist/data/kanban/sd-kanban-lane.js +1 -1
  96. package/dist/data/kanban/sd-kanban.d.ts +1 -1
  97. package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
  98. package/dist/data/kanban/sd-kanban.js +4 -4
  99. package/dist/data/permission-table/sd-permission-table.js +6 -6
  100. package/dist/data/shared-data/sd-shared-data-select-button.js +1 -1
  101. package/dist/data/shared-data/sd-shared-data-select-list.js +3 -3
  102. package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -1
  103. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  104. package/dist/data/shared-data/sd-shared-data-select.js +29 -54
  105. package/dist/data/sheet/injectSheetDomAccessor.d.ts +6 -2
  106. package/dist/data/sheet/injectSheetDomAccessor.d.ts.map +1 -1
  107. package/dist/data/sheet/injectSheetDomAccessor.js +27 -22
  108. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts +10 -0
  109. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts.map +1 -0
  110. package/dist/data/sheet/injectSheetSelectRowIndicator.js +55 -0
  111. package/dist/data/sheet/sd-sheet-config.modal.d.ts +18 -19
  112. package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  113. package/dist/data/sheet/sd-sheet-config.modal.js +357 -217
  114. package/dist/data/sheet/sd-sheet.d.ts +27 -13
  115. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  116. package/dist/data/sheet/sd-sheet.js +609 -291
  117. package/dist/data/sheet/useSheetCellAgent.js +6 -6
  118. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  119. package/dist/data/sheet/useSheetCellStyling.js +4 -4
  120. package/dist/data/sheet/useSheetFocusIndicator.d.ts +7 -0
  121. package/dist/data/sheet/useSheetFocusIndicator.d.ts.map +1 -0
  122. package/dist/data/sheet/useSheetFocusIndicator.js +53 -0
  123. package/dist/data/sheet/useSheetLayoutEngine.js +1 -1
  124. package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
  125. package/dist/data/state-preset/sd-state-preset.js +14 -14
  126. package/dist/features/address/sd-address-search.modal.js +3 -3
  127. package/dist/features/editor/sd-tiptap-editor.js +6 -6
  128. package/dist/features/editor/useTiptapToolbar.js +2 -2
  129. package/dist/features/theme/sd-theme-selector.js +1 -1
  130. package/dist/features/visual/sd-barcode.js +1 -1
  131. package/dist/features/visual/sd-calendar.js +2 -2
  132. package/dist/features/visual/sd-echarts.d.ts +2 -1
  133. package/dist/features/visual/sd-echarts.d.ts.map +1 -1
  134. package/dist/features/visual/sd-echarts.js +5 -3
  135. package/dist/features/visual/sd-label.js +1 -1
  136. package/dist/features/visual/sd-note.js +1 -1
  137. package/dist/features/visual/sd-progress.js +1 -1
  138. package/dist/index.d.ts +3 -5
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +3 -5
  141. package/dist/layout/base-container/sd-base-container.js +3 -3
  142. package/dist/layout/dock/sd-dock-container.js +1 -1
  143. package/dist/layout/dock/sd-dock.d.ts +3 -2
  144. package/dist/layout/dock/sd-dock.d.ts.map +1 -1
  145. package/dist/layout/dock/sd-dock.js +6 -4
  146. package/dist/layout/sidebar/sd-sidebar-container.js +5 -5
  147. package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
  148. package/dist/layout/sidebar/sd-sidebar-menu.js +7 -6
  149. package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
  150. package/dist/layout/sidebar/sd-sidebar.js +1 -1
  151. package/dist/layout/topbar/sd-topbar-container.js +1 -1
  152. package/dist/layout/topbar/sd-topbar-menu.d.ts.map +1 -1
  153. package/dist/layout/topbar/sd-topbar-menu.js +7 -7
  154. package/dist/layout/topbar/sd-topbar-user.js +1 -1
  155. package/dist/layout/topbar/sd-topbar.js +3 -3
  156. package/package.json +5 -5
  157. package/src/controls/button/sd-modal-select-button.ts +7 -2
  158. package/src/controls/collapse/sd-collapse-icon.ts +2 -2
  159. package/src/controls/collapse/sd-collapse.ts +4 -5
  160. package/src/controls/dropdown/sd-dropdown-popup.ts +15 -2
  161. package/src/controls/dropdown/sd-dropdown.ts +4 -16
  162. package/src/controls/gap/sd-gap.ts +4 -4
  163. package/src/controls/input/sd-date-range-picker.ts +13 -16
  164. package/src/controls/input/sd-numpad.ts +1 -1
  165. package/src/controls/input/sd-textarea.ts +1 -1
  166. package/src/controls/input/sd-textfield-type-handlers.ts +2 -2
  167. package/src/controls/input/sd-textfield.ts +6 -6
  168. package/src/controls/list/sd-list-item.ts +40 -26
  169. package/src/controls/list/sd-list.ts +2 -1
  170. package/src/controls/select/sd-select-button.ts +8 -11
  171. package/src/controls/select/sd-select-item.ts +35 -27
  172. package/src/controls/select/sd-select.ts +111 -41
  173. package/src/core/app-structure/sd-app-structure.utils.ts +1 -1
  174. package/src/core/busy/sd-busy-container.ts +235 -123
  175. package/src/core/busy/sd-busy.provider.ts +1 -1
  176. package/src/core/commands/sd-command.ts +46 -0
  177. package/src/core/error-handler/sd-global-error-handler.plugin.ts +1 -1
  178. package/src/core/events/sd-events.ts +1 -12
  179. package/src/core/events/sd-intersection.ts +29 -0
  180. package/src/core/events/{sd-resize-event.plugin.ts → sd-resize.ts} +17 -24
  181. package/src/core/file-dialog/sd-file-dialog.provider.ts +1 -1
  182. package/src/core/modal/injectDragResize.ts +9 -9
  183. package/src/core/modal/injectFocusTrap.ts +1 -1
  184. package/src/core/modal/sd-modal.provider.ts +5 -5
  185. package/src/core/modal/sd-modal.ts +119 -41
  186. package/src/core/provideSdAngular.ts +0 -10
  187. package/src/core/ripple/setupRipple.ts +5 -5
  188. package/src/core/routing/menu-utils.ts +1 -1
  189. package/src/core/routing/sd-navigate-window.provider.ts +1 -1
  190. package/src/core/routing/sd-router-link.ts +1 -1
  191. package/src/core/selection/setupCumulateSelectedKeys.ts +3 -3
  192. package/src/core/setupModelHook.ts +1 -1
  193. package/src/core/toast/sd-toast-container.ts +1 -1
  194. package/src/core/toast/sd-toast.provider.ts +6 -6
  195. package/src/core/toast/sd-toast.ts +25 -22
  196. package/src/core/validation/setupInvalid.ts +2 -1
  197. package/src/data/data-detail/sd-data-detail.ts +15 -11
  198. package/src/data/data-sheet/sd-data-sheet.ts +13 -15
  199. package/src/data/kanban/sd-kanban.ts +4 -5
  200. package/src/data/permission-table/sd-permission-table.ts +4 -4
  201. package/src/data/shared-data/sd-shared-data-select-list.ts +1 -1
  202. package/src/data/shared-data/sd-shared-data-select.ts +8 -27
  203. package/src/data/sheet/injectSheetDomAccessor.ts +37 -25
  204. package/src/data/sheet/injectSheetSelectRowIndicator.ts +69 -0
  205. package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
  206. package/src/data/sheet/sd-sheet.ts +529 -209
  207. package/src/data/sheet/useSheetCellAgent.ts +8 -8
  208. package/src/data/sheet/useSheetCellStyling.ts +4 -8
  209. package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
  210. package/src/data/sheet/useSheetLayoutEngine.ts +1 -1
  211. package/src/data/state-preset/sd-state-preset.ts +26 -13
  212. package/src/features/address/sd-address-search.modal.ts +1 -1
  213. package/src/features/editor/sd-tiptap-editor.ts +4 -4
  214. package/src/features/editor/useTiptapToolbar.ts +2 -2
  215. package/src/features/visual/sd-calendar.ts +1 -1
  216. package/src/features/visual/sd-echarts.ts +2 -0
  217. package/src/index.ts +4 -6
  218. package/src/layout/base-container/sd-base-container.ts +1 -1
  219. package/src/layout/dock/sd-dock.ts +3 -2
  220. package/src/layout/sidebar/sd-sidebar-container.ts +2 -2
  221. package/src/layout/sidebar/sd-sidebar-menu.ts +1 -3
  222. package/src/layout/topbar/sd-topbar-menu.ts +11 -15
  223. package/src/layout/topbar/sd-topbar.ts +1 -1
  224. package/dist/core/commands/sd-insert-command-event.plugin.d.ts +0 -11
  225. package/dist/core/commands/sd-insert-command-event.plugin.d.ts.map +0 -1
  226. package/dist/core/commands/sd-insert-command-event.plugin.js +0 -35
  227. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts +0 -11
  228. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts.map +0 -1
  229. package/dist/core/commands/sd-refresh-command-event.plugin.js +0 -38
  230. package/dist/core/commands/sd-save-command-event.plugin.d.ts +0 -11
  231. package/dist/core/commands/sd-save-command-event.plugin.d.ts.map +0 -1
  232. package/dist/core/commands/sd-save-command-event.plugin.js +0 -38
  233. package/dist/core/events/sd-intersection-event.plugin.d.ts +0 -13
  234. package/dist/core/events/sd-intersection-event.plugin.d.ts.map +0 -1
  235. package/dist/core/events/sd-intersection-event.plugin.js +0 -29
  236. package/dist/core/events/sd-resize-event.plugin.d.ts +0 -16
  237. package/dist/core/events/sd-resize-event.plugin.d.ts.map +0 -1
  238. package/src/core/commands/sd-insert-command-event.plugin.ts +0 -39
  239. package/src/core/commands/sd-refresh-command-event.plugin.ts +0 -44
  240. package/src/core/commands/sd-save-command-event.plugin.ts +0 -44
  241. package/src/core/events/sd-intersection-event.plugin.ts +0 -35
@@ -20,38 +20,39 @@ import { SdBusyProvider, type SdBusyType } from "./sd-busy.provider";
20
20
  "[attr.data-sd-type]": "currType()",
21
21
  },
22
22
  template: `
23
- @if (busy()) {
24
- <div class="_screen">
25
- <div class="_rect">
26
- <div class="_indicator">
27
- @switch (currType()) {
28
- @case ("spinner") {
29
- <div class="_spinner"></div>
30
- }
31
- @case ("bar") {
32
- <div class="_bar"></div>
33
- }
34
- @case ("cube") {
35
- <div class="_cube">
36
- <div class="_cube-face _cube-face-1"></div>
37
- <div class="_cube-face _cube-face-2"></div>
38
- <div class="_cube-face _cube-face-3"></div>
39
- <div class="_cube-face _cube-face-4"></div>
40
- </div>
41
- }
23
+ <div class="_screen">
24
+ <div class="_rect">
25
+ <div class="_indicator">
26
+ @switch (currType()) {
27
+ @case ("spinner") {
28
+ <div class="_spinner"></div>
29
+ }
30
+ @case ("bar") {
31
+ <div class="_bar"></div>
32
+ }
33
+ @case ("cube") {
34
+ <div class="_cube1"></div>
35
+ <div class="_cube2"></div>
36
+ <div class="_cube4"></div>
37
+ <div class="_cube3"></div>
42
38
  }
43
- </div>
44
- @if (message() !== undefined) {
45
- <div class="_message">{{ message() }}</div>
46
- }
47
- @if (progressPercent() !== undefined) {
48
- <div class="_progress">
49
- <div class="_progress-bar" [style.width.%]="progressPercent()"></div>
50
- </div>
51
39
  }
52
40
  </div>
41
+ @if (message() != undefined) {
42
+ <div class="_message">
43
+ <pre>{{ message() }}</pre>
44
+ </div>
45
+ }
53
46
  </div>
54
- }
47
+ @if (progressPercent() != null) {
48
+ <div class="_progress">
49
+ <div
50
+ class="_progress-bar"
51
+ [style.transform]="'scaleX(' + progressPercent()! / 100 + ')'"
52
+ ></div>
53
+ </div>
54
+ }
55
+ </div>
55
56
  <ng-content></ng-content>
56
57
  `,
57
58
  styles: [
@@ -62,156 +63,267 @@ import { SdBusyProvider, type SdBusyType } from "./sd-busy.provider";
62
63
  sd-busy-container {
63
64
  display: block;
64
65
  position: relative;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ height: 100%;
70
+ min-width: 70px;
71
+ min-height: 70px;
72
+ overflow: auto;
65
73
 
66
74
  > ._screen {
67
75
  position: absolute;
68
76
  top: 0;
69
77
  left: 0;
70
- right: 0;
71
- bottom: 0;
78
+ width: 100%;
79
+ height: 100%;
72
80
  z-index: map.get(variables.$vars, z-index, busy);
73
- display: flex;
74
- align-items: center;
75
- justify-content: center;
76
- background: var(--busy-overlay-bg);
77
81
 
78
- > ._rect {
79
- display: flex;
80
- flex-direction: column;
81
- align-items: center;
82
- gap: var(--gap-default);
82
+ visibility: hidden;
83
+ pointer-events: none;
84
+
85
+ opacity: 0;
86
+ transition: opacity var(--animation-duration);
87
+ transition-timing-function: linear;
88
+
89
+ > ._progress {
90
+ display: block;
91
+ position: absolute;
92
+ top: 0;
93
+ left: 0;
94
+ height: 4px;
95
+ width: 100%;
96
+ background-color: var(--background-color);
97
+
98
+ > ._progress-bar {
99
+ position: absolute;
100
+ top: 0;
101
+ left: 0;
102
+ display: inline-block;
103
+ content: "";
104
+ height: 4px;
105
+ width: 100%;
106
+ transition: 0.1s ease-in;
107
+ transition-property: transform;
108
+ transform-origin: left;
109
+ transform: scaleX(0);
110
+ background-color: var(--theme-primary-default);
111
+ }
112
+ }
113
+ }
114
+
115
+ &[data-sd-busy="true"] {
116
+ > ._screen {
117
+ visibility: visible;
118
+ pointer-events: auto;
119
+
120
+ opacity: 1;
121
+ }
122
+ }
123
+
124
+ &[data-sd-type="spinner"] {
125
+ > ._screen > ._rect {
126
+ transform: translateY(-100%);
127
+ transition: 0.1s ease-in;
128
+ transition-property: transform;
83
129
 
84
130
  > ._indicator {
85
- > ._spinner {
86
- width: 2rem;
87
- height: 2rem;
88
- border: 0.1667rem solid var(--theme-primary-lighter);
89
- border-top-color: var(--theme-primary-default);
90
- border-radius: 50%;
91
- animation: sd-busy-spin 0.8s linear infinite;
131
+ top: 0;
132
+ width: 30px;
133
+ height: 30px;
134
+ margin: 20px auto 0 auto;
135
+ border: 6px solid var(--background-color);
136
+ border-radius: 100%;
137
+ border-bottom-color: var(--theme-primary-default);
138
+ animation: sd-busy-spin 1s linear infinite;
139
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
140
+
141
+ > div {
142
+ display: none;
143
+ }
144
+ }
145
+
146
+ > ._message {
147
+ position: absolute;
148
+ top: 55px;
149
+ width: 100%;
150
+ color: var(--background-color);
151
+ font-weight: bold;
152
+ text-align: center;
153
+ text-shadow: 0 0 2px var(--background-rev-color);
154
+ }
155
+ }
156
+
157
+ &[data-sd-busy="true"] {
158
+ > ._screen > ._rect {
159
+ transform: none;
160
+ transition: 0.1s ease-out;
161
+ }
162
+ }
163
+ }
164
+
165
+ &[data-sd-type="bar"] {
166
+ min-height: 4px;
167
+
168
+ &[data-sd-busy="true"] {
169
+ > ._screen > ._rect {
170
+ > ._indicator {
171
+ position: absolute;
172
+ top: 0;
173
+ left: 0;
174
+ height: 4px;
175
+ width: 100%;
176
+ background-color: var(--background-color);
177
+
178
+ &:before,
179
+ &:after {
180
+ position: absolute;
181
+ top: 0;
182
+ left: 0;
183
+ display: inline-block;
184
+ content: "";
185
+ height: 4px;
186
+ width: 100%;
187
+
188
+ transform-origin: left;
189
+ }
190
+
191
+ &:before {
192
+ background-color: var(--theme-primary-default);
193
+ animation: sd-busy-bar-indicator-before 2s infinite ease-in;
194
+ }
195
+
196
+ &:after {
197
+ background-color: var(--background-color);
198
+ animation: sd-busy-bar-indicator-after 2s infinite ease-out;
199
+ }
200
+
201
+ > div {
202
+ display: none;
203
+ }
92
204
  }
93
205
 
94
- > ._bar {
95
- width: 6rem;
96
- height: 0.25rem;
97
- background: var(--theme-primary-lighter);
98
- border-radius: var(--border-radius-default);
99
- overflow: hidden;
206
+ > ._message {
207
+ position: absolute;
208
+ top: 4px;
209
+ right: 0;
210
+ display: inline-block;
211
+ }
212
+ }
213
+ }
214
+ }
215
+
216
+ &[data-sd-type="cube"] {
217
+ > ._screen > ._rect {
218
+ > ._indicator {
219
+ position: absolute;
220
+ top: calc(50% - 20px);
221
+ left: calc(50% - 20px);
222
+ width: 40px;
223
+ height: 40px;
224
+ transform: rotateZ(45deg);
225
+
226
+ ._cube1,
227
+ ._cube2,
228
+ ._cube3,
229
+ ._cube4 {
230
+ float: left;
231
+ width: 50%;
232
+ height: 50%;
100
233
  position: relative;
101
234
 
102
- &::after {
235
+ &:before {
103
236
  content: "";
104
237
  position: absolute;
105
238
  top: 0;
106
239
  left: 0;
240
+ width: 100%;
107
241
  height: 100%;
108
- width: 40%;
109
- background: var(--theme-primary-default);
110
- border-radius: var(--border-radius-default);
111
- animation: sd-busy-bar 1.5s ease-in-out infinite;
242
+ background-color: var(--trans-light);
243
+ animation: sd-busy-cube 2.4s infinite linear both;
244
+ transform-origin: 100% 100%;
112
245
  }
113
246
  }
114
247
 
115
- > ._cube {
116
- width: 2rem;
117
- height: 2rem;
118
- position: relative;
119
- animation: sd-busy-cube-rotate 1.8s infinite ease-in-out;
248
+ ._cube2 {
249
+ transform: rotateZ(90deg);
120
250
 
121
- > ._cube-face {
122
- position: absolute;
123
- width: 50%;
124
- height: 50%;
125
- background: var(--theme-primary-default);
126
- animation: sd-busy-cube-fold 1.8s infinite ease-in-out;
127
-
128
- &._cube-face-1 {
129
- top: 0;
130
- left: 0;
131
- }
132
-
133
- &._cube-face-2 {
134
- top: 0;
135
- right: 0;
136
- animation-delay: 0.45s;
137
- }
138
-
139
- &._cube-face-3 {
140
- bottom: 0;
141
- right: 0;
142
- animation-delay: 0.9s;
143
- }
144
-
145
- &._cube-face-4 {
146
- bottom: 0;
147
- left: 0;
148
- animation-delay: 1.35s;
149
- }
251
+ &:before {
252
+ animation-delay: 0.3s;
150
253
  }
151
254
  }
152
- }
153
255
 
154
- > ._message {
155
- font-size: var(--font-size-sm);
156
- color: var(--text-trans-light);
157
- text-align: center;
158
- }
256
+ ._cube3 {
257
+ transform: rotateZ(180deg);
258
+
259
+ &:before {
260
+ animation-delay: 0.6s;
261
+ }
262
+ }
159
263
 
160
- > ._progress {
161
- width: 10rem;
162
- height: 0.25rem;
163
- background: var(--theme-primary-lighter);
164
- border-radius: var(--border-radius-default);
165
- overflow: hidden;
166
-
167
- > ._progress-bar {
168
- height: 100%;
169
- background: var(--theme-primary-default);
170
- transition: width 0.3s ease;
264
+ ._cube4 {
265
+ transform: rotateZ(270deg);
266
+
267
+ &:before {
268
+ animation-delay: 0.9s;
269
+ }
171
270
  }
172
271
  }
272
+
273
+ > ._message {
274
+ position: absolute;
275
+ top: 4px;
276
+ right: 0;
277
+ display: inline-block;
278
+ }
173
279
  }
174
280
  }
175
281
  }
176
282
 
177
283
  @keyframes sd-busy-spin {
284
+ from {
285
+ transform: rotate(0deg);
286
+ }
178
287
  to {
179
288
  transform: rotate(360deg);
180
289
  }
181
290
  }
182
291
 
183
- @keyframes sd-busy-bar {
292
+ @keyframes sd-busy-bar-indicator-before {
184
293
  0% {
185
- left: -40%;
294
+ transform: scaleX(0);
186
295
  }
296
+ 60%,
187
297
  100% {
188
- left: 100%;
298
+ transform: scaleX(1);
189
299
  }
190
300
  }
191
301
 
192
- @keyframes sd-busy-cube-rotate {
193
- 0% {
194
- transform: perspective(6.25rem) rotateX(0deg) rotateY(0deg);
195
- }
302
+ @keyframes sd-busy-bar-indicator-after {
303
+ 0%,
196
304
  50% {
197
- transform: perspective(6.25rem) rotateX(-180deg) rotateY(0deg);
305
+ transform: scaleX(0);
198
306
  }
199
307
  100% {
200
- transform: perspective(6.25rem) rotateX(-180deg) rotateY(-180deg);
308
+ transform: scaleX(1);
201
309
  }
202
310
  }
203
311
 
204
- @keyframes sd-busy-cube-fold {
312
+ @keyframes sd-busy-cube {
205
313
  0%,
206
314
  10% {
207
- transform: scale(1);
315
+ transform: perspective(140px) rotateX(-180deg);
316
+ opacity: 0;
208
317
  }
209
- 25% {
210
- transform: scale(0.5);
318
+ 25%,
319
+ 75% {
320
+ transform: perspective(140px) rotateX(0deg);
321
+ opacity: 1;
211
322
  }
212
- 50%,
323
+ 90%,
213
324
  100% {
214
- transform: scale(1);
325
+ transform: perspective(140px) rotateY(180deg);
326
+ opacity: 0;
215
327
  }
216
328
  }
217
329
  `,
@@ -23,7 +23,7 @@ export class SdBusyProvider {
23
23
  private _containerRef: ComponentRef<SdBusyContainer> | undefined;
24
24
 
25
25
  get containerRef(): ComponentRef<SdBusyContainer> {
26
- if (this._containerRef === undefined) {
26
+ if (this._containerRef == null) {
27
27
  this._containerRef = createComponent(SdBusyContainer, {
28
28
  environmentInjector: this._envInjector,
29
29
  });
@@ -0,0 +1,46 @@
1
+ import { DestroyRef, Directive, ElementRef, inject, output } from "@angular/core";
2
+ import { DOCUMENT } from "@angular/common";
3
+ import { shouldProcessCommandEvent } from "./findTopOpenModalEl";
4
+
5
+ @Directive({
6
+ selector: "[sdRefreshCommand],[sdSaveCommand],[sdInsertCommand]",
7
+ standalone: true,
8
+ })
9
+ export class SdCommandDirective {
10
+ private readonly _elRef = inject(ElementRef);
11
+ private readonly _destroyRef = inject(DestroyRef);
12
+ private readonly _document = inject(DOCUMENT);
13
+
14
+ sdRefreshCommand = output<KeyboardEvent>();
15
+ sdSaveCommand = output<KeyboardEvent>();
16
+ sdInsertCommand = output<KeyboardEvent>();
17
+
18
+ constructor() {
19
+ const listener = (event: KeyboardEvent): void => {
20
+ if (!event.ctrlKey || event.shiftKey) return;
21
+
22
+ if ((event.key === "l" || event.key === "L") && event.altKey) {
23
+ if (!shouldProcessCommandEvent(this._document, this._elRef.nativeElement)) return;
24
+ event.preventDefault();
25
+ event.stopPropagation();
26
+ this.sdRefreshCommand.emit(event);
27
+ } else if ((event.key === "s" || event.key === "S") && !event.altKey) {
28
+ if (!shouldProcessCommandEvent(this._document, this._elRef.nativeElement)) return;
29
+ event.preventDefault();
30
+ event.stopPropagation();
31
+ this.sdSaveCommand.emit(event);
32
+ } else if (event.key === "Insert" && !event.altKey) {
33
+ if (!shouldProcessCommandEvent(this._document, this._elRef.nativeElement)) return;
34
+ event.preventDefault();
35
+ event.stopPropagation();
36
+ this.sdInsertCommand.emit(event);
37
+ }
38
+ };
39
+
40
+ this._document.addEventListener("keydown", listener);
41
+
42
+ this._destroyRef.onDestroy(() => {
43
+ this._document.removeEventListener("keydown", listener);
44
+ });
45
+ }
46
+ }
@@ -24,7 +24,7 @@ export class SdGlobalErrorHandlerPlugin implements ErrorHandler {
24
24
  Message: reason.message,
25
25
  Stack: reason.stack ?? "(스택 없음)",
26
26
  });
27
- } else if (typeof reason === "object" && reason !== null) {
27
+ } else if (typeof reason === "object" && reason != null) {
28
28
  this._displayErrorMessage("처리되지 않은 Promise 거부", {
29
29
  Reason: JSON.stringify(reason, null, 2),
30
30
  });
@@ -1,5 +1,4 @@
1
1
  import { Directive, output } from "@angular/core";
2
- import type { SdResizeEvent } from "./sd-resize-event.plugin";
3
2
 
4
3
  @Directive({
5
4
  selector: `
@@ -14,9 +13,7 @@ import type { SdResizeEvent } from "./sd-resize-event.plugin";
14
13
  [touchmove.passive], [touchmove.capture.passive],
15
14
  [touchend.passive],
16
15
  [dragover.capture], [dragenter.capture], [dragleave.capture], [drop.capture],
17
- [transitionend.once], [animationend.once],
18
- [sdResize],
19
- [sdRefreshCommand], [sdSaveCommand], [sdInsertCommand]
16
+ [transitionend.once], [animationend.once]
20
17
  `,
21
18
  standalone: true,
22
19
  })
@@ -68,12 +65,4 @@ export class SdEvents {
68
65
  // Animation/Transition (once로 한 번만)
69
66
  "transitionend.once" = output<TransitionEvent>();
70
67
  "animationend.once" = output<AnimationEvent>();
71
-
72
- // 커스텀 이벤트
73
- "sdResize" = output<SdResizeEvent>();
74
-
75
- // 커맨드 이벤트
76
- "sdRefreshCommand" = output<KeyboardEvent>();
77
- "sdSaveCommand" = output<KeyboardEvent>();
78
- "sdInsertCommand" = output<KeyboardEvent>();
79
68
  }
@@ -0,0 +1,29 @@
1
+ import { DestroyRef, Directive, ElementRef, inject, output } from "@angular/core";
2
+
3
+ @Directive({
4
+ selector: "[sdIntersection]",
5
+ standalone: true,
6
+ })
7
+ export class SdIntersectionDirective {
8
+ private readonly _elRef = inject(ElementRef);
9
+ private readonly _destroyRef = inject(DestroyRef);
10
+
11
+ sdIntersection = output<SdIntersectionEvent>();
12
+
13
+ constructor() {
14
+ const observer = new IntersectionObserver((entries) => {
15
+ if (entries.length === 0) return;
16
+
17
+ this.sdIntersection.emit({ entry: entries[entries.length - 1] });
18
+ });
19
+ observer.observe(this._elRef.nativeElement);
20
+
21
+ this._destroyRef.onDestroy(() => {
22
+ observer.disconnect();
23
+ });
24
+ }
25
+ }
26
+
27
+ export interface SdIntersectionEvent {
28
+ entry: IntersectionObserverEntry;
29
+ }
@@ -1,61 +1,54 @@
1
- import { inject, Injectable } from "@angular/core";
2
- import { EventManagerPlugin } from "@angular/platform-browser";
3
- import { DOCUMENT } from "@angular/common";
1
+ import { DestroyRef, Directive, ElementRef, inject, output } from "@angular/core";
4
2
 
5
- @Injectable({ providedIn: null })
6
- export class SdResizeEventPlugin extends EventManagerPlugin {
7
- constructor() {
8
- super(inject(DOCUMENT));
9
- }
3
+ @Directive({
4
+ selector: "[sdResize]",
5
+ standalone: true,
6
+ })
7
+ export class SdResizeDirective {
8
+ private readonly _elRef = inject(ElementRef);
9
+ private readonly _destroyRef = inject(DestroyRef);
10
10
 
11
- override supports(eventName: string): boolean {
12
- return eventName === "sdResize";
13
- }
11
+ sdResize = output<SdResizeEvent>();
14
12
 
15
- override addEventListener(
16
- element: HTMLElement,
17
- eventName: string,
18
- handler: (entry: SdResizeEvent) => void,
19
- ): () => void {
13
+ constructor() {
20
14
  let prevWidth = 0;
21
15
  let prevHeight = 0;
22
-
23
16
  let animationFrameId: number | undefined;
17
+
24
18
  const resizeObserver = new ResizeObserver(([entry]) => {
25
19
  if (animationFrameId != null) {
26
20
  cancelAnimationFrame(animationFrameId);
27
21
  }
28
22
  animationFrameId = requestAnimationFrame(() => {
29
23
  const contentRect = entry.contentRect;
30
-
31
24
  const heightChanged = contentRect.height !== prevHeight;
32
25
  const widthChanged = contentRect.width !== prevWidth;
33
26
  prevHeight = contentRect.height;
34
27
  prevWidth = contentRect.width;
35
28
 
36
- handler({
29
+ this.sdResize.emit({
37
30
  heightChanged,
38
31
  widthChanged,
39
- target: entry.target,
32
+ target: entry.target as HTMLElement,
40
33
  contentRect: entry.contentRect,
41
34
  });
42
35
  });
43
36
  });
44
37
 
45
- resizeObserver.observe(element);
38
+ resizeObserver.observe(this._elRef.nativeElement);
46
39
 
47
- return (): void => {
40
+ this._destroyRef.onDestroy(() => {
48
41
  if (animationFrameId != null) {
49
42
  cancelAnimationFrame(animationFrameId);
50
43
  }
51
44
  resizeObserver.disconnect();
52
- };
45
+ });
53
46
  }
54
47
  }
55
48
 
56
49
  export interface SdResizeEvent {
57
50
  heightChanged: boolean;
58
51
  widthChanged: boolean;
59
- target: Element;
52
+ target: HTMLElement;
60
53
  contentRect: DOMRectReadOnly;
61
54
  }
@@ -18,7 +18,7 @@ export class SdFileDialogProvider {
18
18
 
19
19
  inputEl.type = "file";
20
20
  inputEl.multiple = multiple ?? false;
21
- if (accept !== undefined) {
21
+ if (accept != null) {
22
22
  inputEl.accept = accept;
23
23
  }
24
24
  inputEl.onchange = (event: Event): void => {