@simplysm/angular 14.0.23 → 14.0.24

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.
@@ -1,330 +0,0 @@
1
- # UI Overlay
2
-
3
- Overlay components: dropdowns, modals, toasts, and busy indicators.
4
-
5
- ## `SdDropdownControl`
6
-
7
- Toggleable dropdown trigger that manages popup positioning, mobile bottom-sheet, and focus lifecycle.
8
-
9
- ```typescript
10
- @Component({ selector: "sd-dropdown" })
11
- class SdDropdownControl {
12
- open = model(false);
13
- disabled = input(false, { transform: booleanAttribute });
14
- }
15
- ```
16
-
17
- | Input | Type | Default | Description |
18
- |-------|------|---------|-------------|
19
- | `open` | `boolean` | `false` | Two-way open state |
20
- | `disabled` | `boolean` | `false` | Disables toggle |
21
-
22
- Keyboard: ArrowDown opens, ArrowUp/Escape closes, Space toggles.
23
-
24
- ## `SdDropdownPopupControl`
25
-
26
- Container for dropdown popup content. Auto-caps height at 300px.
27
-
28
- ```typescript
29
- @Component({ selector: "sd-dropdown-popup" })
30
- class SdDropdownPopupControl { }
31
- ```
32
-
33
- ## `SdModalControl`
34
-
35
- Modal dialog shell with drag, resize, focus-trap, z-index management, and config persistence.
36
-
37
- ```typescript
38
- @Component({ selector: "sd-modal" })
39
- class SdModalControl {
40
- open = model(false);
41
- key = input<string>();
42
- title = input("");
43
- hideHeader = input(false, { transform: booleanAttribute });
44
- hideCloseButton = input(false, { transform: booleanAttribute });
45
- useCloseByBackdrop = input(true, { transform: booleanAttribute });
46
- useCloseByEscapeKey = input(true, { transform: booleanAttribute });
47
- float = input(false, { transform: booleanAttribute });
48
- fill = input(false, { transform: booleanAttribute });
49
- resizable = input(false, { transform: booleanAttribute });
50
- movable = input(false, { transform: booleanAttribute });
51
- position = input<"bottom-right" | "top-right">();
52
- minHeightPx = input<number>();
53
- minWidthPx = input<number>();
54
- heightPx = input<number>();
55
- widthPx = input<number>();
56
- headerStyle = input<string>();
57
- noFirstControlFocusing = input(false, { transform: booleanAttribute });
58
- actionTplRef = input<TemplateRef<any>>();
59
- closeRequest = output<void>();
60
- }
61
- ```
62
-
63
- | Input | Type | Default | Description |
64
- |-------|------|---------|-------------|
65
- | `open` | `boolean` | `false` | Two-way open state |
66
- | `key` | `string \| undefined` | — | Persistence key for size/position |
67
- | `title` | `string` | `""` | Modal title |
68
- | `hideHeader` | `boolean` | `false` | Hides the header bar |
69
- | `hideCloseButton` | `boolean` | `false` | Hides the X button |
70
- | `useCloseByBackdrop` | `boolean` | `true` | Close on backdrop click |
71
- | `useCloseByEscapeKey` | `boolean` | `true` | Close on Escape key |
72
- | `float` | `boolean` | `false` | Floating (non-centered) modal |
73
- | `fill` | `boolean` | `false` | Full-screen modal |
74
- | `resizable` | `boolean` | `false` | Enable resize handles |
75
- | `movable` | `boolean` | `false` | Enable header drag-to-move |
76
- | `position` | `"bottom-right" \| "top-right" \| undefined` | — | Fixed position variant |
77
- | `minHeightPx` | `number \| undefined` | — | Minimum height |
78
- | `minWidthPx` | `number \| undefined` | — | Minimum width |
79
- | `heightPx` | `number \| undefined` | — | Initial height |
80
- | `widthPx` | `number \| undefined` | — | Initial width |
81
- | `headerStyle` | `string \| undefined` | — | Inline style for header |
82
- | `noFirstControlFocusing` | `boolean` | `false` | Skip auto-focus on first control |
83
-
84
- ## `SdModalProvider`
85
-
86
- Programmatically creates and displays modals.
87
-
88
- ```typescript
89
- @Injectable({ providedIn: "root" })
90
- class SdModalProvider {
91
- modalCount: WritableSignal<number>;
92
- async showAsync<T extends ISdModal<any>>(modal: ISdModalInfo<T>, options?: ISdModalOptions): Promise</* output type */>;
93
- }
94
- ```
95
-
96
- ## `SdActivatedModalProvider`
97
-
98
- Injected inside a modal component tree to access the modal shell and content.
99
-
100
- ```typescript
101
- @Injectable()
102
- class SdActivatedModalProvider<T> {
103
- modalComponent: WritableSignal<any>;
104
- contentComponent: WritableSignal<T | undefined>;
105
- canDeactiveFn: () => boolean;
106
- }
107
- ```
108
-
109
- ## `ISdModal`
110
-
111
- Contract that modal content components must implement.
112
-
113
- ```typescript
114
- interface ISdModal<O> {
115
- initialized: Signal<boolean>;
116
- close: OutputEmitterRef<O | undefined>;
117
- actionTplRef?: TemplateRef<any>;
118
- }
119
- ```
120
-
121
- | Field | Type | Description |
122
- |-------|------|-------------|
123
- | `initialized` | `Signal<boolean>` | Signals when component is ready |
124
- | `close` | `OutputEmitterRef<O \| undefined>` | Emits result on close |
125
- | `actionTplRef` | `TemplateRef<any> \| undefined` | Optional action bar template |
126
-
127
- ## `ISdModalInfo`
128
-
129
- Input descriptor for `SdModalProvider.showAsync`.
130
-
131
- ```typescript
132
- interface ISdModalInfo<T> {
133
- title: string;
134
- type: Type<T>;
135
- inputs: Omit<TDirectiveInputSignals<T>, "initialized" | "close" | "actionTplRef">;
136
- }
137
- ```
138
-
139
- | Field | Type | Description |
140
- |-------|------|-------------|
141
- | `title` | `string` | Modal title |
142
- | `type` | `Type<T>` | Component class |
143
- | `inputs` | `Omit<TDirectiveInputSignals<T>, ...>` | Input values (excluding modal internals) |
144
-
145
- ## `ISdModalOptions`
146
-
147
- Display and behavior options for `showAsync`.
148
-
149
- ```typescript
150
- interface ISdModalOptions {
151
- key?: string;
152
- hideHeader?: boolean;
153
- hideCloseButton?: boolean;
154
- useCloseByBackdrop?: boolean;
155
- useCloseByEscapeKey?: boolean;
156
- float?: boolean;
157
- fill?: boolean;
158
- resizable?: boolean;
159
- movable?: boolean;
160
- position?: "bottom-right" | "top-right";
161
- minHeightPx?: number;
162
- minWidthPx?: number;
163
- heightPx?: number;
164
- widthPx?: number;
165
- headerStyle?: string;
166
- noFirstControlFocusing?: boolean;
167
- }
168
- ```
169
-
170
- ## `SdPromptModalControl`
171
-
172
- Built-in modal with a text input. Implements `ISdModal<string>`.
173
-
174
- ```typescript
175
- @Component({ selector: "sd-prompt-modal" })
176
- class SdPromptModalControl implements ISdModal<string> {
177
- message = input.required<string>();
178
- close = output<string | undefined>();
179
- initialized = signal(true);
180
- }
181
- ```
182
-
183
- Confirm emits the entered string; cancel emits `undefined`.
184
-
185
- ## `SdConfirmModalControl`
186
-
187
- Built-in confirm/cancel modal. Implements `ISdModal<boolean>`.
188
-
189
- ```typescript
190
- @Component({ selector: "sd-confirm-modal" })
191
- class SdConfirmModalControl implements ISdModal<boolean> {
192
- message = input.required<string>();
193
- close = output<boolean | undefined>();
194
- initialized = signal(true);
195
- }
196
- ```
197
-
198
- Confirm emits `true`; cancel emits `undefined`.
199
-
200
- ## `SdToastControl`
201
-
202
- Single toast notification with optional progress bar and slide/fade animation.
203
-
204
- ```typescript
205
- @Component({ selector: "sd-toast" })
206
- class SdToastControl {
207
- open = model(false);
208
- progress = model(0);
209
- message = model<string>();
210
- useProgress = input(false, { transform: booleanAttribute });
211
- theme = input<TSdToastTheme>("info");
212
- }
213
- ```
214
-
215
- ## `SdToastContainerControl`
216
-
217
- Fixed-position container for `sd-toast` elements. Stacks vertically at top of viewport.
218
-
219
- ```typescript
220
- @Component({ selector: "sd-toast-container" })
221
- class SdToastContainerControl {
222
- overlap = input(false, { transform: booleanAttribute });
223
- }
224
- ```
225
-
226
- | Input | Type | Default | Description |
227
- |-------|------|---------|-------------|
228
- | `overlap` | `boolean` | `false` | Single toast as full-bottom overlay |
229
-
230
- ## `SdToastProvider`
231
-
232
- Programmatic toast creation and display.
233
-
234
- ```typescript
235
- @Injectable({ providedIn: "root" })
236
- class SdToastProvider {
237
- alertThemes: WritableSignal<TSdToastSeverity[]>;
238
- overlap: WritableSignal<boolean>;
239
- beforeShowFn?: (theme: TSdToastSeverity) => void;
240
-
241
- info(message: string, useProgress?: boolean): void | WritableSignal<number>;
242
- success(message: string, useProgress?: boolean): void | WritableSignal<number>;
243
- warning(message: string, useProgress?: boolean): void | WritableSignal<number>;
244
- danger(message: string, useProgress?: boolean): void | WritableSignal<number>;
245
- async notify<T>(input: ISdToastInput<T>): Promise<any>;
246
- async try<R>(fn: () => Promise<R>, messageFn?: (err: Error) => string): Promise<R | undefined>;
247
- }
248
- ```
249
-
250
- - When `useProgress` is `true`, returns a `WritableSignal<number>` to update progress (0–100).
251
- - `try`: runs async function; shows `danger` toast on error and logs via `SdSystemLogProvider`.
252
-
253
- ## `TSdToastSeverity`
254
-
255
- ```typescript
256
- type TSdToastSeverity = "info" | "success" | "warning" | "danger";
257
- ```
258
-
259
- ## `TSdToastTheme`
260
-
261
- ```typescript
262
- type TSdToastTheme = "primary" | "secondary" | TSdToastSeverity | "gray" | "blue-gray";
263
- ```
264
-
265
- ## `ISdToast`
266
-
267
- Contract for custom toast content components.
268
-
269
- ```typescript
270
- interface ISdToast<O> {
271
- close: OutputEmitterRef<O | undefined>;
272
- }
273
- ```
274
-
275
- ## `ISdToastInput`
276
-
277
- Input for `SdToastProvider.notify`.
278
-
279
- ```typescript
280
- interface ISdToastInput<T> {
281
- type: Type<T>;
282
- inputs: Omit<TDirectiveInputSignals<T>, "close">;
283
- }
284
- ```
285
-
286
- | Field | Type | Description |
287
- |-------|------|-------------|
288
- | `type` | `Type<T>` | Toast component class |
289
- | `inputs` | `Omit<TDirectiveInputSignals<T>, "close">` | Input values |
290
-
291
- ## `SdBusyContainerControl`
292
-
293
- Overlay that blocks interaction and shows an animated indicator while busy.
294
-
295
- ```typescript
296
- @Component({ selector: "sd-busy-container" })
297
- class SdBusyContainerControl {
298
- busy = input(false, { transform: booleanAttribute });
299
- message = input<string>();
300
- type = input<TSdBusyType>();
301
- progressPercent = input<number>();
302
- }
303
- ```
304
-
305
- | Input | Type | Default | Description |
306
- |-------|------|---------|-------------|
307
- | `busy` | `boolean` | `false` | Shows overlay when true |
308
- | `message` | `string \| undefined` | — | Message shown during busy |
309
- | `type` | `TSdBusyType \| undefined` | provider default | Animation type |
310
- | `progressPercent` | `number \| undefined` | — | Shows progress bar when set |
311
-
312
- ## `SdBusyProvider`
313
-
314
- Global busy state manager. Creates a full-screen overlay on `document.body`.
315
-
316
- ```typescript
317
- @Injectable({ providedIn: "root" })
318
- class SdBusyProvider {
319
- type: WritableSignal<TSdBusyType>; // default: "bar"
320
- globalBusyCount: WritableSignal<number>;
321
- }
322
- ```
323
-
324
- Increment `globalBusyCount` to show the overlay; decrement to hide.
325
-
326
- ## `TSdBusyType`
327
-
328
- ```typescript
329
- type TSdBusyType = "spinner" | "bar" | "cube";
330
- ```
package/docs/ui-visual.md DELETED
@@ -1,131 +0,0 @@
1
- # UI Visual
2
-
3
- Visual display components: labels, notes, progress bars, calendars, barcodes, and charts.
4
-
5
- ## `SdLabelControl`
6
-
7
- Inline badge/tag label.
8
-
9
- ```typescript
10
- @Component({ selector: "sd-label" })
11
- class SdLabelControl {
12
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">();
13
- color = input<string>();
14
- clickable = input(false, { transform: booleanAttribute });
15
- }
16
- ```
17
-
18
- | Input | Type | Default | Description |
19
- |-------|------|---------|-------------|
20
- | `theme` | theme token \| undefined | — | Predefined color theme |
21
- | `color` | `string \| undefined` | — | Custom CSS background color |
22
- | `clickable` | `boolean` | `false` | Adds hover/cursor styles |
23
-
24
- ## `SdNoteControl`
25
-
26
- Block-level note/callout box.
27
-
28
- ```typescript
29
- @Component({ selector: "sd-note" })
30
- class SdNoteControl {
31
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">();
32
- size = input<"sm" | "lg">();
33
- inset = input(false, { transform: booleanAttribute });
34
- }
35
- ```
36
-
37
- | Input | Type | Default | Description |
38
- |-------|------|---------|-------------|
39
- | `theme` | theme token \| undefined | — | Color theme |
40
- | `size` | `"sm" \| "lg" \| undefined` | — | Size variant |
41
- | `inset` | `boolean` | `false` | Removes border-radius |
42
-
43
- ## `SdProgressControl`
44
-
45
- Progress bar with percentage label.
46
-
47
- ```typescript
48
- @Component({ selector: "sd-progress" })
49
- class SdProgressControl {
50
- theme = input.required<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">();
51
- value = input.required<number>();
52
- inset = input(false, { transform: booleanAttribute });
53
- size = input<"sm" | "lg">();
54
- }
55
- ```
56
-
57
- | Input | Type | Description |
58
- |-------|------|-------------|
59
- | `theme` | theme token | Color theme (required) |
60
- | `value` | `number` | Progress from `0.0` to `1.0` (required) |
61
- | `inset` | `boolean` | Removes border-radius |
62
- | `size` | `"sm" \| "lg" \| undefined` | Size variant |
63
-
64
- ## `SdCalendarControl`
65
-
66
- Month calendar grid that distributes typed items by date.
67
-
68
- ```typescript
69
- @Component({ selector: "sd-calendar" })
70
- class SdCalendarControl<T> {
71
- items = input.required<T[]>();
72
- getItemDateFn = input.required<(item: T, index: number) => DateOnly>();
73
- yearMonth = input<DateOnly>(/* first day of current month */);
74
- weekStartDay = input(0);
75
- minDaysInFirstWeek = input(1);
76
- }
77
- ```
78
-
79
- | Input | Type | Default | Description |
80
- |-------|------|---------|-------------|
81
- | `items` | `T[]` | — | Data items (required) |
82
- | `getItemDateFn` | `(item, index) => DateOnly` | — | Maps item to date (required) |
83
- | `yearMonth` | `DateOnly` | current month | Month to display |
84
- | `weekStartDay` | `number` | `0` (Sunday) | First day of week |
85
- | `minDaysInFirstWeek` | `number` | `1` | Min days in first week |
86
-
87
- Content template: `SdItemOfTemplateDirective` — template for rendering each item cell.
88
-
89
- ## `SdBarcodeControl`
90
-
91
- Renders a barcode as inline SVG using bwip-js.
92
-
93
- ```typescript
94
- @Component({ selector: "sd-barcode" })
95
- class SdBarcodeControl {
96
- type = input.required<TBarcodeType>();
97
- value = input<string>();
98
- }
99
- ```
100
-
101
- | Input | Type | Description |
102
- |-------|------|-------------|
103
- | `type` | `TBarcodeType` | Barcode format (required) |
104
- | `value` | `string \| undefined` | Barcode content; empty clears display |
105
-
106
- ## `TBarcodeType`
107
-
108
- Union of ~100 barcode format strings supported by bwip-js.
109
-
110
- ```typescript
111
- type TBarcodeType = "qrcode" | "code128" | "ean13" | "pdf417" | "datamatrix" | /* ... ~100 more */;
112
- ```
113
-
114
- ## `SdEchartsControl`
115
-
116
- Apache ECharts wrapper with auto-resize and SVG renderer.
117
-
118
- ```typescript
119
- @Component({ selector: "sd-echarts" })
120
- class SdEchartsControl {
121
- option = input.required<echarts.EChartsOption>();
122
- notMerge = input(false);
123
- loading = input(false);
124
- }
125
- ```
126
-
127
- | Input | Type | Default | Description |
128
- |-------|------|---------|-------------|
129
- | `option` | `echarts.EChartsOption` | — | ECharts configuration (required) |
130
- | `notMerge` | `boolean` | `false` | Whether to replace options instead of merge |
131
- | `loading` | `boolean` | `false` | Shows/hides ECharts loading overlay |