@sdcorejs/angular 20.1.2 → 20.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +127 -807
  2. package/components/audit-diff/index.d.ts +74 -0
  3. package/components/badge/index.d.ts +1 -1
  4. package/components/breadcrumb/index.d.ts +53 -0
  5. package/components/data-state/index.d.ts +44 -0
  6. package/components/document-builder/index.d.ts +5 -5
  7. package/components/form-generic/index.d.ts +89 -103
  8. package/components/import-excel/index.d.ts +4 -14
  9. package/components/index.d.ts +4 -0
  10. package/components/job-progress/index.d.ts +38 -0
  11. package/components/mini-editor/index.d.ts +9 -9
  12. package/components/modal/index.d.ts +7 -1
  13. package/components/preview/index.d.ts +181 -28
  14. package/components/side-drawer/index.d.ts +7 -1
  15. package/components/tab/index.d.ts +9 -2
  16. package/components/table/index.d.ts +8 -7
  17. package/components/tree/index.d.ts +24 -2
  18. package/components/upload-file/index.d.ts +5 -4
  19. package/directives/index.d.ts +10 -8
  20. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  21. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  23. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  24. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  25. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  27. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  28. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  29. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  30. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  31. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  33. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +633 -886
  35. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +26 -41
  37. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  39. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  40. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  41. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  43. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  45. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +9 -17
  47. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  49. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  51. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +76 -52
  53. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  55. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-table.mjs +123 -89
  57. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-tree.mjs +188 -18
  59. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +17 -23
  61. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  63. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  65. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -8
  67. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -83
  69. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +8 -4
  71. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-chip.mjs +8 -4
  73. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +18 -14
  75. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-date.mjs +48 -70
  77. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +62 -528
  79. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  81. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +5 -3
  83. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +16 -11
  85. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-input.mjs +297 -59
  87. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  89. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -78
  91. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-select.mjs +8 -21
  93. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -76
  95. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +8 -6
  97. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +280 -0
  99. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  100. package/fesm2022/sdcorejs-angular-forms-time.mjs +310 -0
  101. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  102. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  103. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  104. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  105. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  112. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-modules.mjs +0 -1
  114. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  116. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  118. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  120. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  122. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  124. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-services-loading.mjs +340 -66
  126. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  128. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  130. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  131. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  132. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  134. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  135. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  136. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  137. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  138. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  139. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  140. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  141. package/forms/autocomplete/index.d.ts +3 -4
  142. package/forms/checkbox/index.d.ts +4 -8
  143. package/forms/date/index.d.ts +3 -3
  144. package/forms/date-range/index.d.ts +6 -7
  145. package/forms/datetime/index.d.ts +3 -3
  146. package/forms/entity-picker/index.d.ts +128 -0
  147. package/forms/index.d.ts +15 -5
  148. package/forms/input/index.d.ts +76 -11
  149. package/forms/input-color/index.d.ts +3 -1
  150. package/forms/input-number/index.d.ts +4 -2
  151. package/forms/models/index.d.ts +86 -3
  152. package/forms/radio/index.d.ts +12 -8
  153. package/forms/switch/index.d.ts +4 -7
  154. package/forms/time/index.d.ts +117 -0
  155. package/forms/time-range/index.d.ts +98 -0
  156. package/forms/tree-select/index.d.ts +76 -0
  157. package/i18n/index.d.ts +68 -2
  158. package/interceptors/index.d.ts +5 -6
  159. package/modules/icon/index.d.ts +2 -3
  160. package/modules/index.d.ts +0 -1
  161. package/modules/layout/index.d.ts +288 -15
  162. package/package.json +50 -5
  163. package/pipes/index.d.ts +2 -2
  164. package/services/api/index.d.ts +68 -24
  165. package/services/cache/index.d.ts +52 -16
  166. package/services/confirm/index.d.ts +3 -2
  167. package/services/docx/index.d.ts +2 -3
  168. package/services/index.d.ts +4 -0
  169. package/services/loading/index.d.ts +16 -8
  170. package/services/persistence/index.d.ts +159 -0
  171. package/services/storage/index.d.ts +26 -8
  172. package/services/task/index.d.ts +104 -0
  173. package/services/unsaved-changes/index.d.ts +83 -0
  174. package/services/viewport/index.d.ts +42 -0
  175. package/fesm2022/sdcorejs-angular-modules-authom.mjs +0 -360
  176. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +0 -1
  177. package/modules/authom/index.d.ts +0 -70
@@ -1,43 +1,79 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken } from '@angular/core';
3
+ import { SdPersistenceSerializer, SdPersistenceIdentityCanonicalizer } from '@sdcorejs/angular/services/persistence';
3
4
  import { Observable } from 'rxjs';
4
5
 
5
- interface SdCacheOption<T = any> {
6
+ interface SdCacheOption<T = unknown> {
6
7
  type?: 'memory' | 'session' | 'local';
7
8
  hours?: number;
9
+ ttlMs?: number;
8
10
  default?: T;
9
- args?: Record<string, any>;
11
+ args?: Readonly<Record<string, unknown>>;
12
+ namespace?: string;
13
+ version?: string | number;
14
+ serializer?: SdPersistenceSerializer;
15
+ identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;
10
16
  }
11
- interface SdCache<T = any> {
12
- get: () => T;
17
+ interface SdCache<T = unknown> {
18
+ get: () => T | undefined;
19
+ snapshot: () => SdCacheSnapshot<T>;
13
20
  set: (data: T) => void;
14
21
  has: () => boolean;
15
22
  remove: () => void;
23
+ /** Releases only this facade while preserving its backing cache entry. */
24
+ release: () => void;
16
25
  destroy: () => void;
17
26
  observer: Observable<T | undefined>;
18
27
  load: (callback: () => Promise<T>) => Promise<T>;
19
28
  }
29
+ type SdCacheSnapshot<T> = {
30
+ present: false;
31
+ } | {
32
+ present: true;
33
+ value: T;
34
+ };
35
+ interface SdCacheWithDefault<T> extends Omit<SdCache<T>, 'get' | 'observer'> {
36
+ get: () => T;
37
+ observer: Observable<T>;
38
+ }
39
+ interface SdCacheStoredValue<T = unknown> {
40
+ data: T;
41
+ createdOn: Date;
42
+ }
43
+ type SdCacheSetCallback = (key: string, value: SdCacheStoredValue<unknown>, option?: SdCacheOption<unknown>) => Promise<void> | void;
44
+ type SdCacheGetCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<unknown> | undefined>;
45
+ type SdCacheRemoveCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;
20
46
  interface ISdCacheConfiguration {
21
47
  convertKey?: (key: string) => string;
22
- set?: (key: string, value: {
23
- data: any;
24
- createdOn: Date;
25
- }, option?: SdCacheOption) => Promise<void>;
26
- get?: (key: string, option?: SdCacheOption) => Promise<{
27
- data: any;
28
- createdOn: Date;
29
- }>;
30
- remove?: (key: string, option?: SdCacheOption) => Promise<void>;
48
+ namespace?: string;
49
+ version?: string | number;
50
+ serializer?: SdPersistenceSerializer;
51
+ identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;
52
+ set?: SdCacheSetCallback;
53
+ get?: SdCacheGetCallback;
54
+ remove?: SdCacheRemoveCallback;
31
55
  }
32
56
  declare const SD_CACHE_CONFIG: InjectionToken<ISdCacheConfiguration>;
57
+ interface SdLegacyCacheCallbacks<T> {
58
+ matches: (key: string, option?: SdCacheOption<unknown>) => boolean;
59
+ isValue: (value: unknown) => value is T;
60
+ set?: (key: string, value: SdCacheStoredValue<T>, option?: SdCacheOption<unknown>) => Promise<void> | void;
61
+ get?: (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<T> | undefined>;
62
+ remove?: (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;
63
+ }
64
+ /** @deprecated Prefer globally safe unknown callbacks on `ISdCacheConfiguration`. */
65
+ declare function adaptLegacySdCacheCallbacks<T>(callbacks: SdLegacyCacheCallbacks<T>): ISdCacheConfiguration;
33
66
 
34
67
  declare class SdCacheService {
35
68
  #private;
36
69
  constructor();
37
- create<T = any>(key: string | object, option?: SdCacheOption<T>): SdCache<T>;
70
+ create<T>(key: string | object, option: SdCacheOption<T> & {
71
+ default: T;
72
+ }): SdCacheWithDefault<T>;
73
+ create<T = unknown>(key: string | object, option?: SdCacheOption<unknown>): SdCache<T>;
38
74
  static ɵfac: i0.ɵɵFactoryDeclaration<SdCacheService, never>;
39
75
  static ɵprov: i0.ɵɵInjectableDeclaration<SdCacheService>;
40
76
  }
41
77
 
42
- export { SD_CACHE_CONFIG, SdCacheService };
43
- export type { ISdCacheConfiguration, SdCache, SdCacheOption };
78
+ export { SD_CACHE_CONFIG, SdCacheService, adaptLegacySdCacheCallbacks };
79
+ export type { ISdCacheConfiguration, SdCache, SdCacheGetCallback, SdCacheOption, SdCacheRemoveCallback, SdCacheSetCallback, SdCacheSnapshot, SdCacheStoredValue, SdCacheWithDefault, SdLegacyCacheCallbacks };
@@ -1,4 +1,4 @@
1
- import { MatDialogRef, MatDialog } from '@angular/material/dialog';
1
+ import { MatDialogRef } from '@angular/material/dialog';
2
2
  import { Color } from '@sdcorejs/utils/models';
3
3
  import * as i0 from '@angular/core';
4
4
 
@@ -66,7 +66,8 @@ declare class DialogConfirmComponent {
66
66
  declare class SdConfirmService {
67
67
  #private;
68
68
  private dialog;
69
- constructor(dialog: MatDialog);
69
+ /** Inserted by Angular inject() migration for backwards compatibility */
70
+ constructor(...args: unknown[]);
70
71
  confirm: (message: string, option?: {
71
72
  title?: string;
72
73
  yesTitle?: string;
@@ -1,5 +1,3 @@
1
- import { SdNotifyService } from '@sdcorejs/angular/services/notify';
2
- import { SdLoadingService } from '@sdcorejs/angular/services/loading';
3
1
  import * as i0 from '@angular/core';
4
2
 
5
3
  interface SdDocxConvertOptions {
@@ -16,7 +14,8 @@ declare class SdDocxService {
16
14
  #private;
17
15
  private notifyService;
18
16
  private loadingService;
19
- constructor(notifyService: SdNotifyService, loadingService: SdLoadingService);
17
+ /** Inserted by Angular inject() migration for backwards compatibility */
18
+ constructor(...args: unknown[]);
20
19
  open(options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null>;
21
20
  convertToHtml(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null>;
22
21
  convertToHtmlString(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<string | null>;
@@ -1,8 +1,12 @@
1
1
  export * from '@sdcorejs/angular/services/cache';
2
2
  export * from '@sdcorejs/angular/services/storage';
3
+ export * from '@sdcorejs/angular/services/persistence';
3
4
  export * from '@sdcorejs/angular/services/notify';
4
5
  export * from '@sdcorejs/angular/services/confirm';
5
6
  export * from '@sdcorejs/angular/services/api';
6
7
  export * from '@sdcorejs/angular/services/loading';
7
8
  export * from '@sdcorejs/angular/services/excel';
8
9
  export * from '@sdcorejs/angular/services/docx';
10
+ export * from '@sdcorejs/angular/services/viewport';
11
+ export * from '@sdcorejs/angular/services/unsaved-changes';
12
+ export * from '@sdcorejs/angular/services/task';
@@ -1,17 +1,25 @@
1
1
  import * as i0 from '@angular/core';
2
- import { RendererFactory2 } from '@angular/core';
3
2
 
3
+ interface SdLoadingRef {
4
+ readonly closed: boolean;
5
+ close(): void;
6
+ }
4
7
  declare class SdLoadingService {
5
8
  #private;
6
- private loadingId;
7
- private renderer;
8
- private loadingMap;
9
- constructor(rendererFactory: RendererFactory2);
10
- start: (element?: string) => void;
11
- isLoading: (element?: string) => boolean | null;
12
- stop: (element?: string) => void;
9
+ private static readonly documentRecords;
10
+ /** Inserted by Angular inject() migration for backwards compatibility. */
11
+ constructor(...args: unknown[]);
12
+ /** Starts loading for every current selector match and returns ownership of those exact hosts. */
13
+ start: (selector?: string) => SdLoadingRef;
14
+ /** Returns the first matched globally loading host, `false` for idle matches, or `null` when unavailable. */
15
+ isLoading: (selector?: string) => Element | false | null;
16
+ /** Releases the oldest exact-selector start, with a current-host fallback for legacy cross-selector calls. */
17
+ stop: (selector?: string) => void;
18
+ run<T>(task: () => T | PromiseLike<T>, selector?: string): Promise<T>;
19
+ run<T>(task: PromiseLike<T>, selector?: string): Promise<T>;
13
20
  static ɵfac: i0.ɵɵFactoryDeclaration<SdLoadingService, never>;
14
21
  static ɵprov: i0.ɵɵInjectableDeclaration<SdLoadingService>;
15
22
  }
16
23
 
17
24
  export { SdLoadingService };
25
+ export type { SdLoadingRef };
@@ -0,0 +1,159 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+
4
+ declare const SD_GRAPH_FORMAT = "sdcorejs.graph";
5
+ declare const SD_GRAPH_VERSION = 1;
6
+ type SdPersistenceErrorCode = 'INVALID_DOCUMENT' | 'UNKNOWN_FORMAT' | 'UNKNOWN_VERSION' | 'INVALID_NODE' | 'INVALID_REFERENCE' | 'UNSUPPORTED_VALUE' | 'LIMIT_EXCEEDED';
7
+ interface SdGraphSerializerLimits {
8
+ maxDocumentCharacters: number;
9
+ maxDepth: number;
10
+ maxNodes: number;
11
+ maxEntries: number;
12
+ maxStringCharacters: number;
13
+ maxKeyCharacters: number;
14
+ maxBigIntDigits: number;
15
+ }
16
+ interface SdPersistenceSerializer {
17
+ readonly format: string;
18
+ stringify<T>(value: T): string;
19
+ parse<T = unknown>(serialized: string): T;
20
+ clone<T>(value: T): T;
21
+ }
22
+ /** Deterministic, versioned canonicalization used only for persistence identity. */
23
+ interface SdPersistenceIdentityCanonicalizer {
24
+ readonly format: string;
25
+ canonicalize(value: unknown): string;
26
+ }
27
+ type SdGraphSpecialNumber = 'NaN' | 'Infinity' | '-Infinity' | '-0';
28
+ type SdGraphValue = null | boolean | string | number | {
29
+ $ref: number;
30
+ } | {
31
+ $type: 'undefined';
32
+ } | {
33
+ $type: 'number';
34
+ value: SdGraphSpecialNumber;
35
+ } | {
36
+ $type: 'bigint';
37
+ value: string;
38
+ };
39
+ interface SdGraphArrayNode {
40
+ type: 'array';
41
+ values: SdGraphValue[];
42
+ }
43
+ interface SdGraphObjectNode {
44
+ type: 'object';
45
+ prototype: 'object' | 'null';
46
+ entries: [string, SdGraphValue][];
47
+ }
48
+ interface SdGraphDateNode {
49
+ type: 'date';
50
+ value: string;
51
+ }
52
+ interface SdGraphMapNode {
53
+ type: 'map';
54
+ entries: [SdGraphValue, SdGraphValue][];
55
+ }
56
+ interface SdGraphSetNode {
57
+ type: 'set';
58
+ values: SdGraphValue[];
59
+ }
60
+ type SdGraphNode = SdGraphArrayNode | SdGraphObjectNode | SdGraphDateNode | SdGraphMapNode | SdGraphSetNode;
61
+ interface SdGraphEnvelope {
62
+ format: typeof SD_GRAPH_FORMAT;
63
+ version: typeof SD_GRAPH_VERSION;
64
+ root: SdGraphValue;
65
+ nodes: SdGraphNode[];
66
+ }
67
+
68
+ declare const SD_GRAPH_HARD_LIMITS: Readonly<SdGraphSerializerLimits>;
69
+ declare class SdPersistenceError extends Error {
70
+ readonly code: SdPersistenceErrorCode;
71
+ readonly name = "SdPersistenceError";
72
+ constructor(code: SdPersistenceErrorCode, message: string);
73
+ }
74
+ declare class SdGraphSerializer implements SdPersistenceSerializer {
75
+ #private;
76
+ readonly format = "sdcorejs.graph@1";
77
+ readonly limits: Readonly<SdGraphSerializerLimits>;
78
+ constructor(limits?: Partial<SdGraphSerializerLimits>);
79
+ stringify<T>(value: T): string;
80
+ parse<T = unknown>(serialized: string): T;
81
+ clone<T>(value: T): T;
82
+ }
83
+
84
+ type SdPersistenceStorageArea = 'local' | 'session';
85
+ type SdPersistenceStorageRead = {
86
+ status: 'found';
87
+ value: string;
88
+ } | {
89
+ status: 'absent';
90
+ } | {
91
+ status: 'unavailable';
92
+ };
93
+ interface SdPersistenceStorageAdapter {
94
+ /** Optional tri-state read. Legacy adapters may continue to implement only `getItem`. */
95
+ readItem?(area: SdPersistenceStorageArea, key: string): SdPersistenceStorageRead;
96
+ getItem(area: SdPersistenceStorageArea, key: string): string | null;
97
+ setItem(area: SdPersistenceStorageArea, key: string, value: string): boolean;
98
+ removeItem(area: SdPersistenceStorageArea, key: string): boolean;
99
+ }
100
+ declare class SdBrowserStorageAdapter implements SdPersistenceStorageAdapter {
101
+ #private;
102
+ readItem(area: SdPersistenceStorageArea, key: string): SdPersistenceStorageRead;
103
+ getItem(area: SdPersistenceStorageArea, key: string): string | null;
104
+ setItem(area: SdPersistenceStorageArea, key: string, value: string): boolean;
105
+ removeItem(area: SdPersistenceStorageArea, key: string): boolean;
106
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdBrowserStorageAdapter, never>;
107
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdBrowserStorageAdapter>;
108
+ }
109
+ declare function readSdPersistenceStorageItem(adapter: SdPersistenceStorageAdapter, area: SdPersistenceStorageArea, key: string): SdPersistenceStorageRead;
110
+ declare const SD_PERSISTENCE_STORAGE_ADAPTER: InjectionToken<SdPersistenceStorageAdapter>;
111
+
112
+ interface SdPersistenceKeyField {
113
+ tag: string;
114
+ value: string;
115
+ }
116
+ declare class SdPersistenceIdentityError extends Error {
117
+ readonly name = "SdPersistenceIdentityError";
118
+ constructor(message: string);
119
+ }
120
+ declare function buildSdPersistenceKey(baseKey: string, fields: readonly SdPersistenceKeyField[]): string;
121
+ declare class SdGraphIdentityCanonicalizer implements SdPersistenceIdentityCanonicalizer {
122
+ #private;
123
+ readonly format = "sdcorejs.graph-identity@1";
124
+ canonicalize(value: unknown): string;
125
+ }
126
+ declare function canonicalizeSdPersistenceValue(canonicalizer: SdPersistenceIdentityCanonicalizer, value: unknown, label: string): string;
127
+ declare function digestSdPersistenceKey(value: string): string;
128
+
129
+ declare const SD_PERSISTENCE_ENVELOPE_FORMAT = "sdcorejs.persistence-envelope";
130
+ declare const SD_PERSISTENCE_ENVELOPE_VERSION = 1;
131
+ interface SdPersistenceEnvelopeLimits {
132
+ maxDocumentCharacters: number;
133
+ maxPayloadCharacters: number;
134
+ maxSerializerCharacters: number;
135
+ maxIdentityCharacters: number;
136
+ }
137
+ declare const SD_PERSISTENCE_ENVELOPE_HARD_LIMITS: Readonly<SdPersistenceEnvelopeLimits>;
138
+ interface SdPersistenceValueEnvelope {
139
+ format: typeof SD_PERSISTENCE_ENVELOPE_FORMAT;
140
+ version: typeof SD_PERSISTENCE_ENVELOPE_VERSION;
141
+ kind: 'value';
142
+ identity: string;
143
+ serializer: string;
144
+ payload: string;
145
+ }
146
+ interface SdPersistenceTombstoneEnvelope {
147
+ format: typeof SD_PERSISTENCE_ENVELOPE_FORMAT;
148
+ version: typeof SD_PERSISTENCE_ENVELOPE_VERSION;
149
+ kind: 'tombstone';
150
+ identity: string;
151
+ serializer: string;
152
+ }
153
+ type SdPersistenceEnvelope = SdPersistenceValueEnvelope | SdPersistenceTombstoneEnvelope;
154
+ declare function stringifySdPersistenceValueEnvelope(identity: string, serializer: string, payload: string, limits?: Partial<SdPersistenceEnvelopeLimits>): string;
155
+ declare function stringifySdPersistenceTombstoneEnvelope(identity: string, serializer: string, limits?: Partial<SdPersistenceEnvelopeLimits>): string;
156
+ declare function parseSdPersistenceEnvelope(serialized: string, expectedIdentity: string, expectedSerializer: string, limits?: Partial<SdPersistenceEnvelopeLimits>): SdPersistenceEnvelope | undefined;
157
+
158
+ export { SD_GRAPH_FORMAT, SD_GRAPH_HARD_LIMITS, SD_GRAPH_VERSION, SD_PERSISTENCE_ENVELOPE_FORMAT, SD_PERSISTENCE_ENVELOPE_HARD_LIMITS, SD_PERSISTENCE_ENVELOPE_VERSION, SD_PERSISTENCE_STORAGE_ADAPTER, SdBrowserStorageAdapter, SdGraphIdentityCanonicalizer, SdGraphSerializer, SdPersistenceError, SdPersistenceIdentityError, buildSdPersistenceKey, canonicalizeSdPersistenceValue, digestSdPersistenceKey, parseSdPersistenceEnvelope, readSdPersistenceStorageItem, stringifySdPersistenceTombstoneEnvelope, stringifySdPersistenceValueEnvelope };
159
+ export type { SdGraphArrayNode, SdGraphDateNode, SdGraphEnvelope, SdGraphMapNode, SdGraphNode, SdGraphObjectNode, SdGraphSerializerLimits, SdGraphSetNode, SdGraphSpecialNumber, SdGraphValue, SdPersistenceEnvelope, SdPersistenceEnvelopeLimits, SdPersistenceErrorCode, SdPersistenceIdentityCanonicalizer, SdPersistenceKeyField, SdPersistenceSerializer, SdPersistenceStorageAdapter, SdPersistenceStorageArea, SdPersistenceStorageRead, SdPersistenceTombstoneEnvelope, SdPersistenceValueEnvelope };
@@ -1,33 +1,51 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken } from '@angular/core';
3
+ import { SdPersistenceSerializer, SdPersistenceIdentityCanonicalizer } from '@sdcorejs/angular/services/persistence';
3
4
  import { BehaviorSubject, Observable } from 'rxjs';
4
5
 
5
- interface SdStorageOption<T = any> {
6
- type?: 'session';
6
+ interface SdStorageOption<T = unknown> {
7
+ type?: 'local' | 'session';
7
8
  default?: T;
8
- args?: Record<string, any>;
9
+ args?: Readonly<Record<string, unknown>>;
10
+ namespace?: string;
11
+ version?: string | number;
12
+ serializer?: SdPersistenceSerializer;
13
+ identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;
9
14
  }
10
- interface SdStorage<T = any> {
11
- get: () => T;
15
+ interface SdStorage<T = unknown> {
16
+ get: () => T | undefined;
12
17
  set: (data: T) => void;
13
18
  setSilent: (data: T) => void;
14
19
  has: () => boolean;
15
20
  remove: () => void;
21
+ destroy: () => void;
22
+ subject: BehaviorSubject<T | undefined>;
23
+ observer: Observable<T | undefined>;
24
+ }
25
+ interface SdStorageWithDefault<T> extends Omit<SdStorage<T>, 'get' | 'subject' | 'observer'> {
26
+ get: () => T;
16
27
  subject: BehaviorSubject<T>;
17
28
  observer: Observable<T>;
18
29
  }
19
30
  interface ISdStorageConfiguration {
20
31
  key?: (key: string) => string;
32
+ namespace?: string;
33
+ version?: string | number;
34
+ serializer?: SdPersistenceSerializer;
35
+ identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;
21
36
  }
22
37
  declare const SD_STORAGE_CONFIG: InjectionToken<ISdStorageConfiguration>;
23
38
 
24
39
  declare class SdStorageService {
25
40
  #private;
26
- private readonly configuration;
27
- create<T = any>(key: string | object, option?: SdStorageOption<T>): SdStorage<T>;
41
+ constructor();
42
+ create<T>(key: string | object, option: SdStorageOption<T> & {
43
+ default: T;
44
+ }): SdStorageWithDefault<T>;
45
+ create<T = unknown>(key: string | object, option?: SdStorageOption<unknown>): SdStorage<T>;
28
46
  static ɵfac: i0.ɵɵFactoryDeclaration<SdStorageService, never>;
29
47
  static ɵprov: i0.ɵɵInjectableDeclaration<SdStorageService>;
30
48
  }
31
49
 
32
50
  export { SD_STORAGE_CONFIG, SdStorageService };
33
- export type { ISdStorageConfiguration, SdStorage, SdStorageOption };
51
+ export type { ISdStorageConfiguration, SdStorage, SdStorageOption, SdStorageWithDefault };
@@ -0,0 +1,104 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Signal, InjectionToken } from '@angular/core';
3
+
4
+ type SdTaskMaybeAsync<T> = T | PromiseLike<T>;
5
+ type SdTaskStatus = 'idle' | 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';
6
+ type SdTaskConnectionState = 'idle' | 'connecting' | 'open' | 'reconnecting' | 'closed' | 'error';
7
+ interface SdTaskState<TResult = unknown> {
8
+ readonly id: string;
9
+ readonly status: SdTaskStatus;
10
+ readonly progress?: number;
11
+ readonly title?: string;
12
+ readonly message?: string;
13
+ readonly error?: unknown;
14
+ readonly result?: TResult;
15
+ readonly updatedAt?: number | Date;
16
+ }
17
+ interface SdTaskRetryPolicy {
18
+ readonly maxAttempts?: number;
19
+ readonly initialDelayMs?: number;
20
+ readonly backoff?: number;
21
+ readonly maxDelayMs?: number;
22
+ readonly jitter?: number;
23
+ }
24
+ interface SdTaskLoadContext<TResult = unknown> {
25
+ readonly id: string;
26
+ readonly signal: AbortSignal;
27
+ readonly attempt: number;
28
+ readonly state: SdTaskState<TResult>;
29
+ }
30
+ interface SdTaskActionContext<TResult = unknown> {
31
+ readonly id: string;
32
+ readonly state: SdTaskState<TResult>;
33
+ }
34
+ type SdTaskCancelResult<TResult = unknown> = void | boolean | SdTaskState<TResult>;
35
+ type SdTaskCancelHandler<TResult = unknown> = (context: SdTaskActionContext<TResult>) => SdTaskMaybeAsync<SdTaskCancelResult<TResult>>;
36
+ interface SdTaskSourceBase<TResult> {
37
+ readonly cancel?: SdTaskCancelHandler<TResult>;
38
+ }
39
+ interface SdTaskManualSource<TResult = unknown> extends SdTaskSourceBase<TResult> {
40
+ readonly mode: 'manual';
41
+ }
42
+ interface SdTaskPollingSource<TResult = unknown> extends SdTaskSourceBase<TResult> {
43
+ readonly mode: 'poll';
44
+ readonly load: (context: SdTaskLoadContext<TResult>) => SdTaskMaybeAsync<SdTaskState<TResult>>;
45
+ readonly intervalMs?: number;
46
+ readonly retry?: SdTaskRetryPolicy;
47
+ }
48
+ interface SdTaskSseSource<TResult = unknown> extends SdTaskSourceBase<TResult> {
49
+ readonly mode: 'sse';
50
+ readonly url: string | (() => string);
51
+ readonly eventSourceInit?: EventSourceInit;
52
+ readonly parse?: (event: MessageEvent<string>) => SdTaskMaybeAsync<SdTaskState<TResult>>;
53
+ readonly retry?: SdTaskRetryPolicy;
54
+ }
55
+ type SdTaskSource<TResult = unknown> = SdTaskManualSource<TResult> | SdTaskPollingSource<TResult> | SdTaskSseSource<TResult>;
56
+ interface SdTaskWatchOptions<TResult = unknown> {
57
+ readonly id: string;
58
+ readonly initialState?: SdTaskState<TResult>;
59
+ readonly source: SdTaskSource<TResult>;
60
+ }
61
+ interface SdTaskView<TResult = unknown> {
62
+ readonly id: string;
63
+ readonly state: Signal<SdTaskState<TResult>>;
64
+ readonly connection: Signal<SdTaskConnectionState>;
65
+ readonly error: Signal<unknown | null>;
66
+ readonly subscriberCount: Signal<number>;
67
+ readonly canCancel: Signal<boolean>;
68
+ readonly canRetry: Signal<boolean>;
69
+ cancel(): Promise<boolean>;
70
+ retry(): void;
71
+ }
72
+ interface SdTaskSubscription<TResult = unknown> extends SdTaskView<TResult> {
73
+ readonly destroyed: Signal<boolean>;
74
+ destroy(): void;
75
+ }
76
+ declare function isSdTaskTerminal(status: SdTaskStatus): boolean;
77
+
78
+ interface SdTaskEventSource {
79
+ onopen: ((event: Event) => void) | null;
80
+ onmessage: ((event: MessageEvent<string>) => void) | null;
81
+ onerror: ((event: Event) => void) | null;
82
+ close(): void;
83
+ }
84
+ interface SdTaskEventSourceFactory {
85
+ create(url: string, init?: EventSourceInit): SdTaskEventSource;
86
+ }
87
+ declare const SD_TASK_EVENT_SOURCE_FACTORY: InjectionToken<SdTaskEventSourceFactory | null>;
88
+ declare const SD_TASK_RANDOM: InjectionToken<() => number>;
89
+
90
+ declare class SdTaskService {
91
+ #private;
92
+ readonly tasks: i0.Signal<SdTaskView<unknown>[]>;
93
+ constructor();
94
+ watch<TResult = unknown>(options: SdTaskWatchOptions<TResult>): SdTaskSubscription<TResult>;
95
+ get<TResult = unknown>(id: string): SdTaskView<TResult> | undefined;
96
+ update<TResult = unknown>(id: string, patch: Partial<Omit<SdTaskState<TResult>, 'id'>>): boolean;
97
+ cancel(id: string): Promise<boolean>;
98
+ retry(id: string): boolean;
99
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdTaskService, never>;
100
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdTaskService>;
101
+ }
102
+
103
+ export { SD_TASK_EVENT_SOURCE_FACTORY, SD_TASK_RANDOM, SdTaskService, isSdTaskTerminal };
104
+ export type { SdTaskActionContext, SdTaskCancelHandler, SdTaskCancelResult, SdTaskConnectionState, SdTaskEventSource, SdTaskEventSourceFactory, SdTaskLoadContext, SdTaskManualSource, SdTaskMaybeAsync, SdTaskPollingSource, SdTaskRetryPolicy, SdTaskSource, SdTaskSseSource, SdTaskState, SdTaskStatus, SdTaskSubscription, SdTaskView, SdTaskWatchOptions };
@@ -0,0 +1,83 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { Signal, InjectionToken } from '@angular/core';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { CanDeactivateFn } from '@angular/router';
5
+
6
+ type SdUnsavedChangesMaybeAsync<T> = T | PromiseLike<T>;
7
+ type SdUnsavedChangesDirtySource = boolean | Signal<boolean> | (() => boolean);
8
+ type SdUnsavedChangesDecision = 'save' | 'discard' | 'cancel';
9
+ type SdUnsavedChangesReason = 'navigation' | 'close' | 'manual';
10
+ interface SdUnsavedChangesWatcher {
11
+ readonly id: string;
12
+ readonly scope?: unknown;
13
+ readonly isDirty: SdUnsavedChangesDirtySource;
14
+ readonly message?: string;
15
+ readonly save?: () => SdUnsavedChangesMaybeAsync<void | boolean>;
16
+ readonly reset?: () => SdUnsavedChangesMaybeAsync<void | boolean>;
17
+ readonly discard?: () => SdUnsavedChangesMaybeAsync<void | boolean>;
18
+ readonly cleanup?: () => void;
19
+ }
20
+ interface SdUnsavedChangesPromptContext {
21
+ readonly reason: SdUnsavedChangesReason;
22
+ readonly scope?: unknown;
23
+ readonly message: string;
24
+ readonly watchers: readonly SdUnsavedChangesRegistration[];
25
+ }
26
+ interface SdUnsavedChangesConfirmationAdapter {
27
+ confirm(context: SdUnsavedChangesPromptContext): SdUnsavedChangesMaybeAsync<SdUnsavedChangesDecision | boolean>;
28
+ }
29
+ interface SdUnsavedChangesRegistration {
30
+ readonly id: string;
31
+ readonly scope?: unknown;
32
+ readonly message?: string;
33
+ readonly destroyed: Signal<boolean>;
34
+ readonly dirty: Signal<boolean>;
35
+ markDirty(): void;
36
+ markPristine(): void;
37
+ save(): Promise<boolean>;
38
+ reset(): Promise<boolean>;
39
+ discard(): Promise<boolean>;
40
+ destroy(): void;
41
+ }
42
+ interface SdUnsavedChangesConfirmOptions {
43
+ readonly scope?: unknown;
44
+ readonly reason?: SdUnsavedChangesReason;
45
+ }
46
+
47
+ interface SdUnsavedChangesWindow {
48
+ addEventListener(type: 'beforeunload', listener: (event: BeforeUnloadEvent) => void): void;
49
+ removeEventListener(type: 'beforeunload', listener: (event: BeforeUnloadEvent) => void): void;
50
+ confirm?(message?: string): boolean;
51
+ }
52
+ declare const SD_UNSAVED_CHANGES_WINDOW: InjectionToken<SdUnsavedChangesWindow | null>;
53
+ declare const SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER: InjectionToken<SdUnsavedChangesConfirmationAdapter>;
54
+
55
+ declare class SdUnsavedChangesService {
56
+ #private;
57
+ readonly registrations: _angular_core.Signal<SdUnsavedChangesRegistration[]>;
58
+ readonly dirty: _angular_core.Signal<boolean>;
59
+ constructor();
60
+ register(watcher: SdUnsavedChangesWatcher): SdUnsavedChangesRegistration;
61
+ hasChanges(scope?: unknown): boolean;
62
+ confirmLeave(options?: SdUnsavedChangesConfirmOptions): Promise<boolean>;
63
+ saveAll(scope?: unknown): Promise<boolean>;
64
+ resetAll(scope?: unknown): Promise<boolean>;
65
+ discardAll(scope?: unknown): Promise<boolean>;
66
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdUnsavedChangesService, never>;
67
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SdUnsavedChangesService>;
68
+ }
69
+
70
+ interface SdUnsavedChangesFormOptions<TValue> {
71
+ readonly id: string;
72
+ readonly scope?: unknown;
73
+ readonly message?: string;
74
+ readonly save?: (value: TValue) => SdUnsavedChangesMaybeAsync<void | boolean>;
75
+ readonly reset?: (form: FormGroup) => SdUnsavedChangesMaybeAsync<void | boolean>;
76
+ readonly discard?: (form: FormGroup) => SdUnsavedChangesMaybeAsync<void | boolean>;
77
+ }
78
+ declare function registerSdUnsavedChangesForm<TValue extends Record<string, unknown>>(service: SdUnsavedChangesService, form: FormGroup, options: SdUnsavedChangesFormOptions<TValue>): SdUnsavedChangesRegistration;
79
+ declare function createSdUnsavedChangesCloseGuard(service: SdUnsavedChangesService, options?: Omit<SdUnsavedChangesConfirmOptions, 'reason'>): () => Promise<boolean>;
80
+ declare const sdUnsavedChangesGuard: CanDeactivateFn<unknown>;
81
+
82
+ export { SD_UNSAVED_CHANGES_CONFIRMATION_ADAPTER, SD_UNSAVED_CHANGES_WINDOW, SdUnsavedChangesService, createSdUnsavedChangesCloseGuard, registerSdUnsavedChangesForm, sdUnsavedChangesGuard };
83
+ export type { SdUnsavedChangesConfirmOptions, SdUnsavedChangesConfirmationAdapter, SdUnsavedChangesDecision, SdUnsavedChangesDirtySource, SdUnsavedChangesFormOptions, SdUnsavedChangesMaybeAsync, SdUnsavedChangesPromptContext, SdUnsavedChangesReason, SdUnsavedChangesRegistration, SdUnsavedChangesWatcher, SdUnsavedChangesWindow };
@@ -0,0 +1,42 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+ import * as _sdcorejs_angular_services_viewport from '@sdcorejs/angular/services/viewport';
4
+
5
+ interface SdViewportBreakpoints {
6
+ mobile: number;
7
+ tablet: number;
8
+ desktop: number;
9
+ }
10
+ type SdViewportBreakpoint = keyof SdViewportBreakpoints;
11
+ interface SdViewport {
12
+ innerWidth: number;
13
+ innerHeight?: number;
14
+ addEventListener(type: 'resize', listener: EventListenerOrEventListenerObject): void;
15
+ removeEventListener(type: 'resize', listener: EventListenerOrEventListenerObject): void;
16
+ }
17
+
18
+ declare const SD_VIEWPORT_DEFAULT_BREAKPOINTS: Readonly<SdViewportBreakpoints>;
19
+ declare const SD_VIEWPORT: InjectionToken<SdViewport | null>;
20
+ declare const SD_VIEWPORT_BREAKPOINTS: InjectionToken<Readonly<SdViewportBreakpoints>>;
21
+ declare function sdNormalizeViewportBreakpoints(value: Readonly<SdViewportBreakpoints>): Readonly<SdViewportBreakpoints>;
22
+
23
+ /**
24
+ * Exposes one SSR-safe, signal-based viewport state for the application.
25
+ * Breakpoints use min-width semantics and can be configured through `SD_VIEWPORT_BREAKPOINTS`.
26
+ */
27
+ declare class SdViewportService {
28
+ #private;
29
+ readonly breakpoints: Readonly<_sdcorejs_angular_services_viewport.SdViewportBreakpoints>;
30
+ readonly width: _angular_core.Signal<number>;
31
+ readonly height: _angular_core.Signal<number>;
32
+ readonly currentBreakpoint: _angular_core.Signal<keyof _sdcorejs_angular_services_viewport.SdViewportBreakpoints>;
33
+ readonly isMobile: _angular_core.Signal<boolean>;
34
+ readonly isTablet: _angular_core.Signal<boolean>;
35
+ readonly isDesktop: _angular_core.Signal<boolean>;
36
+ constructor();
37
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdViewportService, never>;
38
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SdViewportService>;
39
+ }
40
+
41
+ export { SD_VIEWPORT, SD_VIEWPORT_BREAKPOINTS, SD_VIEWPORT_DEFAULT_BREAKPOINTS, SdViewportService, sdNormalizeViewportBreakpoints };
42
+ export type { SdViewport, SdViewportBreakpoint, SdViewportBreakpoints };