@sdcorejs/angular 21.1.3 → 21.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 (168) hide show
  1. package/README.md +17 -14
  2. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  3. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  4. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  5. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  6. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  7. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  8. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  9. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  10. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  11. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  12. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  13. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  14. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  15. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  16. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +495 -838
  17. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +24 -34
  19. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  21. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  22. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  23. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  25. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  27. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  29. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  31. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  33. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  35. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  37. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-table.mjs +96 -63
  39. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-tree.mjs +186 -17
  41. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +15 -22
  43. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  45. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  47. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  49. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -71
  51. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  53. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  55. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  57. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  59. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  61. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  63. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  64. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  65. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  67. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-input.mjs +290 -56
  69. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  71. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -66
  73. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  75. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -64
  77. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  79. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +277 -0
  81. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-time.mjs +307 -0
  83. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  84. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  85. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  86. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  87. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  89. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  91. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  93. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  95. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  97. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  99. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  101. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  103. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  105. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  107. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  109. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  110. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  111. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  113. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  114. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  115. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  116. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  117. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  118. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  119. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  120. package/package.json +49 -1
  121. package/types/sdcorejs-angular-components-audit-diff.d.ts +74 -0
  122. package/types/sdcorejs-angular-components-badge.d.ts +1 -1
  123. package/types/sdcorejs-angular-components-breadcrumb.d.ts +53 -0
  124. package/types/sdcorejs-angular-components-data-state.d.ts +44 -0
  125. package/types/sdcorejs-angular-components-document-builder.d.ts +5 -5
  126. package/types/sdcorejs-angular-components-form-generic.d.ts +67 -104
  127. package/types/sdcorejs-angular-components-import-excel.d.ts +4 -14
  128. package/types/sdcorejs-angular-components-job-progress.d.ts +38 -0
  129. package/types/sdcorejs-angular-components-mini-editor.d.ts +9 -9
  130. package/types/sdcorejs-angular-components-modal.d.ts +7 -1
  131. package/types/sdcorejs-angular-components-preview.d.ts +181 -28
  132. package/types/sdcorejs-angular-components-side-drawer.d.ts +7 -1
  133. package/types/sdcorejs-angular-components-tab.d.ts +9 -2
  134. package/types/sdcorejs-angular-components-table.d.ts +8 -7
  135. package/types/sdcorejs-angular-components-tree.d.ts +24 -2
  136. package/types/sdcorejs-angular-components-upload-file.d.ts +5 -4
  137. package/types/sdcorejs-angular-components.d.ts +4 -0
  138. package/types/sdcorejs-angular-directives.d.ts +10 -8
  139. package/types/sdcorejs-angular-forms-autocomplete.d.ts +3 -4
  140. package/types/sdcorejs-angular-forms-checkbox.d.ts +4 -8
  141. package/types/sdcorejs-angular-forms-date-range.d.ts +6 -7
  142. package/types/sdcorejs-angular-forms-date.d.ts +2 -2
  143. package/types/sdcorejs-angular-forms-datetime.d.ts +2 -2
  144. package/types/sdcorejs-angular-forms-entity-picker.d.ts +128 -0
  145. package/types/sdcorejs-angular-forms-input-number.d.ts +1 -1
  146. package/types/sdcorejs-angular-forms-input.d.ts +74 -11
  147. package/types/sdcorejs-angular-forms-models.d.ts +86 -3
  148. package/types/sdcorejs-angular-forms-radio.d.ts +12 -8
  149. package/types/sdcorejs-angular-forms-switch.d.ts +4 -7
  150. package/types/sdcorejs-angular-forms-time-range.d.ts +98 -0
  151. package/types/sdcorejs-angular-forms-time.d.ts +117 -0
  152. package/types/sdcorejs-angular-forms-tree-select.d.ts +76 -0
  153. package/types/sdcorejs-angular-forms.d.ts +15 -5
  154. package/types/sdcorejs-angular-i18n.d.ts +68 -2
  155. package/types/sdcorejs-angular-interceptors.d.ts +5 -6
  156. package/types/sdcorejs-angular-modules-layout.d.ts +288 -15
  157. package/types/sdcorejs-angular-pipes.d.ts +2 -2
  158. package/types/sdcorejs-angular-services-api.d.ts +68 -24
  159. package/types/sdcorejs-angular-services-cache.d.ts +52 -16
  160. package/types/sdcorejs-angular-services-confirm.d.ts +3 -2
  161. package/types/sdcorejs-angular-services-docx.d.ts +2 -3
  162. package/types/sdcorejs-angular-services-loading.d.ts +16 -8
  163. package/types/sdcorejs-angular-services-persistence.d.ts +159 -0
  164. package/types/sdcorejs-angular-services-storage.d.ts +26 -8
  165. package/types/sdcorejs-angular-services-task.d.ts +104 -0
  166. package/types/sdcorejs-angular-services-unsaved-changes.d.ts +83 -0
  167. package/types/sdcorejs-angular-services-viewport.d.ts +42 -0
  168. package/types/sdcorejs-angular-services.d.ts +4 -0
@@ -161,17 +161,18 @@ type PdfSource = string | File | Blob | ArrayBuffer | Uint8Array | {
161
161
  * page change.
162
162
  */
163
163
  type PdfZoomMode = number | 'page-fit' | 'page-width' | 'page-actual';
164
- /**
165
- * Which tab the sidebar shows. `'none'` collapses the sidebar entirely.
166
- * NOTE: outline + search tabs are deferred — selecting them shows a placeholder.
167
- */
164
+ /** Which tab the sidebar shows. `'none'` collapses the sidebar entirely. */
168
165
  type PdfSidebarMode = 'thumbnails' | 'outline' | 'search' | 'none';
169
- /**
170
- * Page layout mode. `'continuous'` is deferred — the input is kept on the
171
- * public API so consumer code compiles, but the component falls back to
172
- * single-page behavior with a warning.
173
- */
166
+ /** Page layout mode. */
174
167
  type PdfScrollMode = 'page' | 'continuous';
168
+ /** Consumer-facing, recursively resolved PDF document-outline item. */
169
+ interface PdfOutlineItem {
170
+ readonly id: string;
171
+ readonly title: string;
172
+ readonly page: number | null;
173
+ readonly url?: string;
174
+ readonly children: readonly PdfOutlineItem[];
175
+ }
175
176
  /**
176
177
  * Document-level metadata extracted from `pdfDoc.getMetadata()`.
177
178
  */
@@ -224,35 +225,115 @@ interface PdfSearchState {
224
225
  wholeWord: boolean;
225
226
  results: PdfSearchResult[];
226
227
  activeIndex: number;
228
+ truncated: boolean;
227
229
  }
228
230
 
229
- /**
230
- * Minimal pdfjs surface the component depends on. We wrap pdfjs in a DI token
231
- * so unit tests can supply a hand-rolled mock without going through
232
- * jasmine.createSpyObj on the real module (which is harder with ESM).
233
- */
231
+ interface SdPdfRenderTask {
232
+ readonly promise: Promise<void>;
233
+ cancel(): void;
234
+ }
235
+ interface SdPdfViewport {
236
+ readonly width: number;
237
+ readonly height: number;
238
+ }
239
+ interface SdPdfTextItem {
240
+ readonly str: string;
241
+ }
242
+ interface SdPdfTextContent {
243
+ readonly items: readonly unknown[];
244
+ }
245
+ interface SdPdfPageProxy {
246
+ getViewport(parameters: {
247
+ scale: number;
248
+ rotation?: number;
249
+ }): SdPdfViewport;
250
+ render(parameters: {
251
+ canvasContext: CanvasRenderingContext2D;
252
+ viewport: SdPdfViewport;
253
+ }): SdPdfRenderTask;
254
+ getTextContent(): Promise<SdPdfTextContent | unknown>;
255
+ cleanup(): void;
256
+ }
257
+ interface SdPdfReference {
258
+ readonly num: number;
259
+ readonly gen: number;
260
+ }
261
+ type SdPdfDestination = string | readonly unknown[] | null;
262
+ interface SdPdfRawOutlineItem {
263
+ readonly title?: string;
264
+ readonly dest?: SdPdfDestination;
265
+ readonly url?: string | null;
266
+ readonly items?: readonly SdPdfRawOutlineItem[];
267
+ }
268
+ interface SdPdfDocumentProxy {
269
+ readonly numPages: number;
270
+ getPage(pageNumber: number): Promise<SdPdfPageProxy>;
271
+ getMetadata(): Promise<{
272
+ readonly info?: {
273
+ readonly Title?: string;
274
+ readonly Author?: string;
275
+ readonly Subject?: string;
276
+ };
277
+ }>;
278
+ getOutline(): Promise<readonly SdPdfRawOutlineItem[] | null>;
279
+ getDestination(name: string): Promise<readonly unknown[] | null>;
280
+ getPageIndex(reference: SdPdfReference): Promise<number>;
281
+ cachedPageNumber(reference: SdPdfReference): number | null;
282
+ getData(): Promise<Uint8Array>;
283
+ destroy(): Promise<void>;
284
+ }
285
+ interface SdPdfLoadingTask {
286
+ readonly promise: Promise<SdPdfDocumentProxy>;
287
+ onProgress?: (progress: {
288
+ loaded: number;
289
+ total: number;
290
+ }) => void;
291
+ destroy?(): Promise<void> | void;
292
+ }
293
+ interface SdPdfDocumentSpec {
294
+ url?: string;
295
+ data?: Uint8Array;
296
+ httpHeaders?: Record<string, string>;
297
+ withCredentials?: boolean;
298
+ password?: string;
299
+ }
234
300
  interface SdPdfJsLib {
235
- getDocument: (spec: unknown) => {
236
- promise: Promise<unknown>;
237
- onProgress?: (p: {
238
- loaded: number;
239
- total: number;
240
- }) => void;
241
- };
242
- GlobalWorkerOptions: {
301
+ getDocument(spec: SdPdfDocumentSpec): SdPdfLoadingTask;
302
+ readonly GlobalWorkerOptions: {
243
303
  workerSrc: string;
244
304
  };
245
305
  }
246
306
  declare const SD_PDFJS_LIB: InjectionToken<SdPdfJsLib>;
247
- declare class SdPreviewPdf implements OnDestroy {
307
+
308
+ interface PdfOutlineRow {
309
+ readonly item: PdfOutlineItem;
310
+ readonly level: number;
311
+ readonly parentId: string | null;
312
+ }
313
+ type PdfSidebarTabMode = Exclude<PdfSidebarMode, 'none'>;
314
+ declare class SdPreviewPdf {
248
315
  #private;
249
316
  static readonly MIN_ZOOM = 0.25;
250
317
  static readonly MAX_ZOOM = 4;
251
318
  static readonly ZOOM_STEP = 0.1;
319
+ static readonly OUTLINE_MAX_DEPTH = 64;
320
+ static readonly OUTLINE_MAX_NODES = 10000;
321
+ static readonly MAX_SEARCH_RESULTS = 1000;
322
+ static readonly MAX_PAGE_TEXT_CACHE_PAGES = 128;
323
+ static readonly THUMBNAIL_WINDOW_SIZE = 48;
324
+ static readonly THUMBNAIL_ITEM_HEIGHT = 220;
325
+ static readonly MAX_THUMBNAIL_CACHE_ENTRIES = 96;
326
+ private static readonly MAX_CONCURRENT_THUMBNAIL_WORK;
327
+ static readonly MAX_CANVAS_DIMENSION = 8192;
328
+ static readonly MAX_CANVAS_PIXELS = 16777216;
252
329
  protected readonly pageCanvasRef: _angular_core.Signal<ElementRef<HTMLCanvasElement> | undefined>;
253
330
  protected readonly stageEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
254
331
  protected readonly pageInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
255
332
  protected readonly searchInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
333
+ protected readonly sidebarContentRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
334
+ protected readonly outlineItemRefs: _angular_core.Signal<readonly ElementRef<HTMLElement>[]>;
335
+ protected readonly sidebarTabRefs: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
336
+ protected readonly continuousCanvases: _angular_core.Signal<readonly ElementRef<HTMLCanvasElement>[]>;
256
337
  protected readonly thumbCanvases: _angular_core.Signal<readonly ElementRef<HTMLCanvasElement>[]>;
257
338
  readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
258
339
  readonly autoId: _angular_core.Signal<string | undefined>;
@@ -276,6 +357,13 @@ declare class SdPreviewPdf implements OnDestroy {
276
357
  readonly autoIdTabThumbnails: _angular_core.Signal<string | undefined>;
277
358
  readonly autoIdTabOutline: _angular_core.Signal<string | undefined>;
278
359
  readonly autoIdTabSearch: _angular_core.Signal<string | undefined>;
360
+ readonly sidebarPanelId: _angular_core.Signal<string>;
361
+ readonly sidebarRegionId: _angular_core.Signal<string>;
362
+ readonly searchBarId: _angular_core.Signal<string>;
363
+ readonly tabThumbnailsId: _angular_core.Signal<string>;
364
+ readonly tabOutlineId: _angular_core.Signal<string>;
365
+ readonly tabSearchId: _angular_core.Signal<string>;
366
+ readonly sidebarActiveTabId: _angular_core.Signal<string>;
279
367
  readonly autoIdSearchInput: _angular_core.Signal<string | undefined>;
280
368
  readonly autoIdSearchNext: _angular_core.Signal<string | undefined>;
281
369
  readonly autoIdSearchPrev: _angular_core.Signal<string | undefined>;
@@ -309,6 +397,7 @@ declare class SdPreviewPdf implements OnDestroy {
309
397
  term: string;
310
398
  total: number;
311
399
  current: number;
400
+ truncated: boolean;
312
401
  }>;
313
402
  readonly stage: _angular_core.Signal<PdfStage>;
314
403
  readonly activePage: _angular_core.Signal<number>;
@@ -323,14 +412,28 @@ declare class SdPreviewPdf implements OnDestroy {
323
412
  readonly fileSize: _angular_core.Signal<number>;
324
413
  readonly loadError$: _angular_core.Signal<PdfErrorEvent | null>;
325
414
  readonly thumbCache: _angular_core.Signal<Record<number, string>>;
415
+ readonly thumbnailWorkCount: _angular_core.Signal<number>;
416
+ readonly pageTextCacheSize: _angular_core.Signal<number>;
417
+ readonly continuousPages: _angular_core.Signal<number[]>;
418
+ readonly continuousTopSpacer: _angular_core.Signal<number>;
419
+ readonly continuousBottomSpacer: _angular_core.Signal<number>;
420
+ readonly continuousPageHeights: _angular_core.Signal<Record<number, number>>;
421
+ readonly outline: _angular_core.Signal<readonly PdfOutlineItem[]>;
422
+ readonly outlineFocusId: _angular_core.Signal<string | null>;
423
+ readonly visibleOutline: _angular_core.Signal<readonly PdfOutlineRow[]>;
326
424
  readonly numPages: _angular_core.Signal<number>;
327
425
  readonly canPrev: _angular_core.Signal<boolean>;
328
426
  readonly canNext: _angular_core.Signal<boolean>;
329
427
  readonly zoomPercent: _angular_core.Signal<number>;
330
428
  readonly loadPercent: _angular_core.Signal<number>;
331
429
  readonly isSidebarOpen: _angular_core.Signal<boolean>;
430
+ readonly canDownload: _angular_core.Signal<boolean>;
431
+ readonly canFullscreen: _angular_core.Signal<boolean>;
432
+ readonly canPrint: _angular_core.Signal<boolean>;
332
433
  readonly pageList: _angular_core.Signal<number[]>;
333
434
  readonly pageNumbers: _angular_core.Signal<number[]>;
435
+ readonly thumbnailTopSpacer: _angular_core.Signal<number>;
436
+ readonly thumbnailBottomSpacer: _angular_core.Signal<number>;
334
437
  readonly searchBarOpen: _angular_core.Signal<boolean>;
335
438
  readonly searchTerm: _angular_core.Signal<string>;
336
439
  readonly searchResults: _angular_core.Signal<PdfSearchResult[]>;
@@ -338,11 +441,11 @@ declare class SdPreviewPdf implements OnDestroy {
338
441
  readonly searchCaseSensitive: _angular_core.Signal<boolean>;
339
442
  readonly searchWholeWord: _angular_core.Signal<boolean>;
340
443
  readonly searchTotal: _angular_core.Signal<number>;
444
+ readonly searchTruncated: _angular_core.Signal<boolean>;
341
445
  readonly searchCurrent: _angular_core.Signal<number>;
342
446
  readonly searchActiveResult: _angular_core.Signal<PdfSearchResult | null>;
343
447
  readonly searchState: _angular_core.Signal<PdfSearchState>;
344
448
  constructor();
345
- ngOnDestroy(): void;
346
449
  goToPage(page: number): void;
347
450
  nextPage(): void;
348
451
  prevPage(): void;
@@ -354,14 +457,23 @@ declare class SdPreviewPdf implements OnDestroy {
354
457
  rotate(direction: 'left' | 'right'): void;
355
458
  toggleSidebar(): void;
356
459
  setSidebarMode(mode: PdfSidebarMode): void;
460
+ onSidebarTabKeyDown(event: KeyboardEvent, currentMode: PdfSidebarTabMode): void;
461
+ onThumbnailSidebarScroll(event: Event): void;
357
462
  setScrollMode(mode: PdfScrollMode): void;
358
463
  downloadFile(): void;
464
+ downloadFileAsync(): Promise<boolean>;
359
465
  toggleFullscreen(): void;
360
466
  /** Programmatic equivalent of clicking the X — emits the close output. */
361
467
  requestClose(): void;
362
468
  /** Retry the active load attempt (called from the error state retry button). */
363
469
  retryLoad(): void;
364
470
  printFile(): void;
471
+ print(): Promise<void>;
472
+ isOutlineExpanded(id: string): boolean;
473
+ toggleOutlineItem(id: string, event?: Event): void;
474
+ focusOutlineItem(id: string): void;
475
+ activateOutlineItem(id: string): void;
476
+ onOutlineKeyDown(event: KeyboardEvent, id: string): void;
365
477
  /**
366
478
  * Run a full-document search for `term`. Returns the result count.
367
479
  *
@@ -384,6 +496,7 @@ declare class SdPreviewPdf implements OnDestroy {
384
496
  }): Promise<number>;
385
497
  searchNext(): void;
386
498
  searchPrev(): void;
499
+ activateSearchResult(index: number): void;
387
500
  clearSearch(): void;
388
501
  /** Open the search bar and focus its input. Idempotent. */
389
502
  openSearch(): void;
@@ -392,15 +505,17 @@ declare class SdPreviewPdf implements OnDestroy {
392
505
  toggleSearchCaseSensitive(): void;
393
506
  toggleSearchWholeWord(): void;
394
507
  /** Live binding from the search bar's `(input)` event. */
395
- onSearchInput(value: string): void;
508
+ onSearchInput(event: Event): void;
396
509
  onKeyDown(event: KeyboardEvent): void;
397
510
  onPageInputEnter(event: Event): void;
398
511
  onPageInputBlur(event: Event): void;
399
512
  onWheel(event: WheelEvent): void;
400
513
  trackByPage(_i: number, page: number): number;
514
+ onStageScroll(): void;
401
515
  /**
402
516
  * Render a single page into a sidebar thumbnail canvas at ~140px width.
403
- * Cached via `#thumbsRendering` so rapid scroll bounces don't double-render.
517
+ * Reserved in `#thumbnailWork` before getPage() so rapid scroll bounces
518
+ * cannot start duplicate work for the same mounted page.
404
519
  *
405
520
  * Visible for testing — tests can stub `getPage()` on the fake doc to
406
521
  * assert this method calls `render(...)` with the right page argument.
@@ -410,5 +525,43 @@ declare class SdPreviewPdf implements OnDestroy {
410
525
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPreviewPdf, "sd-preview-pdf", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "source": { "alias": "source"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "startPage": { "alias": "startPage"; "required": false; "isSignal": true; }; "initialZoom": { "alias": "initialZoom"; "required": false; "isSignal": true; }; "sidebar": { "alias": "sidebar"; "required": false; "isSignal": true; }; "sidebarOpen": { "alias": "sidebarOpen"; "required": false; "isSignal": true; }; "scrollMode": { "alias": "scrollMode"; "required": false; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "downloadable": { "alias": "downloadable"; "required": false; "isSignal": true; }; "password": { "alias": "password"; "required": false; "isSignal": true; }; "httpHeaders": { "alias": "httpHeaders"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; }, { "close": "close"; "loaded": "loaded"; "pageChange": "pageChange"; "zoomChange": "zoomChange"; "download": "download"; "loadError": "loadError"; "searchChange": "searchChange"; }, never, never, true, never>;
411
526
  }
412
527
 
413
- export { SD_PDFJS_LIB, SdPreviewImage, SdPreviewPdf };
414
- export type { NormalizedImage, PdfErrorEvent, PdfErrorReason, PdfLoadEvent, PdfMeta, PdfScrollMode, PdfSearchResult, PdfSearchState, PdfSidebarMode, PdfSource, PdfStage, PdfZoomMode, PreviewItem, PreviewStage, PreviewTheme, SdPdfJsLib, ThumbnailPosition };
528
+ interface SdPdfIntersectionEntry {
529
+ readonly target: Element;
530
+ readonly isIntersecting: boolean;
531
+ }
532
+ interface SdPdfBrowserAdapter {
533
+ readonly isBrowser: boolean;
534
+ /** The platform can trigger an anchor download for an existing URL. */
535
+ readonly canDownloadUrl: boolean;
536
+ /** The platform can create/revoke an object URL and then download it. */
537
+ readonly canDownloadBlob: boolean;
538
+ readonly canFullscreen: boolean;
539
+ isFile(value: unknown): value is File;
540
+ isBlob(value: unknown): value is Blob;
541
+ createPdfBlob(data: Uint8Array): Blob | null;
542
+ createObjectUrl(blob: Blob): string | null;
543
+ revokeObjectUrl(url: string): void;
544
+ download(href: string, filename: string): boolean;
545
+ createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null;
546
+ createImage(): HTMLImageElement | null;
547
+ listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void;
548
+ toggleFullscreen(host: HTMLElement): Promise<void>;
549
+ observeResize(element: Element, listener: () => void): () => void;
550
+ observeIntersections(elements: readonly Element[], listener: (entries: readonly SdPdfIntersectionEntry[]) => void, options?: IntersectionObserverInit): () => void;
551
+ scheduleFrame(callback: FrameRequestCallback): number | null;
552
+ cancelFrame(handle: number | null): void;
553
+ }
554
+ declare const SD_PDF_BROWSER_ADAPTER: InjectionToken<SdPdfBrowserAdapter>;
555
+
556
+ interface SdPdfPrintJob {
557
+ readonly finished: Promise<void>;
558
+ cancel(): void;
559
+ }
560
+ interface SdPdfPrintAdapter {
561
+ readonly isSupported: boolean;
562
+ start(data: Uint8Array, filename: string): SdPdfPrintJob | null;
563
+ }
564
+ declare const SD_PDF_PRINT_ADAPTER: InjectionToken<SdPdfPrintAdapter>;
565
+
566
+ export { SD_PDFJS_LIB, SD_PDF_BROWSER_ADAPTER, SD_PDF_PRINT_ADAPTER, SdPreviewImage, SdPreviewPdf };
567
+ export type { NormalizedImage, PdfErrorEvent, PdfErrorReason, PdfLoadEvent, PdfMeta, PdfOutlineItem, PdfScrollMode, PdfSearchResult, PdfSearchState, PdfSidebarMode, PdfSource, PdfStage, PdfZoomMode, PreviewItem, PreviewStage, PreviewTheme, SdPdfBrowserAdapter, SdPdfDestination, SdPdfDocumentProxy, SdPdfDocumentSpec, SdPdfIntersectionEntry, SdPdfJsLib, SdPdfLoadingTask, SdPdfPageProxy, SdPdfPrintAdapter, SdPdfPrintJob, SdPdfRawOutlineItem, SdPdfReference, SdPdfRenderTask, SdPdfTextContent, SdPdfTextItem, SdPdfViewport, ThumbnailPosition };
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { CdkPortal } from '@angular/cdk/portal';
3
3
  import { Observable } from 'rxjs';
4
4
 
5
+ type SdSideDrawerBeforeClose = () => boolean | Promise<boolean>;
5
6
  declare class SdSideDrawer {
6
7
  #private;
7
8
  id: string;
@@ -10,10 +11,12 @@ declare class SdSideDrawer {
10
11
  width: _angular_core.InputSignal<string>;
11
12
  hideClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
12
13
  disableBackdropClose: _angular_core.InputSignalWithTransform<boolean, boolean | "">;
14
+ beforeClose: _angular_core.InputSignal<SdSideDrawerBeforeClose | undefined>;
13
15
  drawerClass: _angular_core.InputSignal<any>;
14
16
  readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
15
17
  readonly autoId: _angular_core.Signal<string | undefined>;
16
18
  sdClosed: _angular_core.OutputEmitterRef<void>;
19
+ sdCloseError: _angular_core.OutputEmitterRef<unknown>;
17
20
  readonly isOpened: _angular_core.Signal<boolean>;
18
21
  readonly isLoading: _angular_core.Signal<boolean>;
19
22
  readonly dataOpened: _angular_core.Signal<"true" | "false">;
@@ -22,11 +25,14 @@ declare class SdSideDrawer {
22
25
  constructor();
23
26
  open: () => void;
24
27
  close: () => void;
28
+ requestClose: () => Promise<boolean>;
29
+ forceClose: () => void;
25
30
  startLoading: () => void;
26
31
  stopLoading: () => void;
27
32
  preventScroll: (event: Event) => void;
28
33
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdSideDrawer, never>;
29
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSideDrawer, "sd-side-drawer", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; "drawerClass": { "alias": "drawerClass"; "required": false; "isSignal": true; }; "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
34
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdSideDrawer, "sd-side-drawer", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "disableBackdropClose": { "alias": "disableBackdropClose"; "required": false; "isSignal": true; }; "beforeClose": { "alias": "beforeClose"; "required": false; "isSignal": true; }; "drawerClass": { "alias": "drawerClass"; "required": false; "isSignal": true; }; "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; }, { "sdClosed": "sdClosed"; "sdCloseError": "sdCloseError"; }, never, ["[sdHeaderLeft]", "[sdHeaderRight]", "*", "[sdFooterLeft]", "[sdFooterRight]"], true, never>;
30
35
  }
31
36
 
32
37
  export { SdSideDrawer };
38
+ export type { SdSideDrawerBeforeClose };
@@ -3,16 +3,22 @@ import { TemplateRef } from '@angular/core';
3
3
  import { MatTabGroup } from '@angular/material/tabs';
4
4
  import { Color } from '@sdcorejs/utils/models';
5
5
 
6
+ type SdTabBeforeClose = () => boolean | Promise<boolean>;
6
7
  declare class SdTab {
8
+ #private;
7
9
  label: _angular_core.InputSignal<string>;
8
10
  icon: _angular_core.InputSignal<string | null | undefined>;
9
11
  badge: _angular_core.InputSignal<string | number | null | undefined>;
10
12
  disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
11
13
  closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
14
+ beforeClose: _angular_core.InputSignal<SdTabBeforeClose | undefined>;
12
15
  close: _angular_core.OutputEmitterRef<void>;
16
+ closeError: _angular_core.OutputEmitterRef<unknown>;
17
+ requestClose: () => Promise<boolean>;
18
+ forceClose: () => void;
13
19
  bodyTpl: _angular_core.Signal<TemplateRef<unknown>>;
14
20
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdTab, never>;
15
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTab, "sd-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["*"], true, never>;
21
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTab, "sd-tab", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "beforeClose": { "alias": "beforeClose"; "required": false; "isSignal": true; }; }, { "close": "close"; "closeError": "closeError"; }, never, ["*"], true, never>;
16
22
  }
17
23
 
18
24
  interface SdTabClosedEvent {
@@ -20,6 +26,7 @@ interface SdTabClosedEvent {
20
26
  tab: SdTab;
21
27
  }
22
28
  declare class SdTabGroup {
29
+ #private;
23
30
  tabs: _angular_core.Signal<readonly SdTab[]>;
24
31
  selectedIndex: _angular_core.ModelSignal<number>;
25
32
  variant: _angular_core.InputSignal<"line" | "pills" | "segmented">;
@@ -49,4 +56,4 @@ declare class SdTabGroup {
49
56
  }
50
57
 
51
58
  export { SdTab, SdTabGroup };
52
- export type { SdTabClosedEvent };
59
+ export type { SdTabBeforeClose, SdTabClosedEvent };
@@ -1,13 +1,13 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, Signal, EventEmitter, ChangeDetectorRef, InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { TemplateRef, Signal, InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
3
3
  import { SdBadge } from '@sdcorejs/angular/components/badge';
4
- import { SdSearch } from '@sdcorejs/angular/forms';
4
+ import { SdSearch } from '@sdcorejs/angular/forms/models';
5
5
  import { Operator, NestedKeyOf, Order, PagingReq, Color } from '@sdcorejs/utils/models';
6
6
  import { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';
7
7
  import { MatPaginatorIntl, MatPaginator } from '@angular/material/paginator';
8
8
  import { MatSort } from '@angular/material/sort';
9
9
  import { MatTable } from '@angular/material/table';
10
- import { SdExcelColumn, SdLoadingService, SdExcelService, SdNotifyService, SdConfirmService } from '@sdcorejs/angular/services';
10
+ import { SdExcelColumn } from '@sdcorejs/angular/services';
11
11
  import { Observable } from 'rxjs';
12
12
  import { SdIconSet } from '@sdcorejs/angular/modules/icon';
13
13
  import { SdButton } from '@sdcorejs/angular/components/button';
@@ -1077,7 +1077,7 @@ declare class SdPopupExport {
1077
1077
  listGroups?: MatSelectionList;
1078
1078
  selected: Record<string, boolean>;
1079
1079
  files: any[];
1080
- export: EventEmitter<{
1080
+ readonly export: _angular_core.OutputEmitterRef<{
1081
1081
  file: any | null;
1082
1082
  columns: SdExcelColumn[];
1083
1083
  isCSV?: boolean;
@@ -1085,11 +1085,12 @@ declare class SdPopupExport {
1085
1085
  form: FormGroup<{}>;
1086
1086
  exportOption?: SdTableOptionExportDefault;
1087
1087
  set _tableOption(option: SdTableOption);
1088
- configuration?: ConfiguredTableResult;
1088
+ readonly configuration: _angular_core.InputSignal<ConfiguredTableResult | undefined>;
1089
1089
  private get key();
1090
1090
  private get tableColumns();
1091
1091
  private get additionalColumns();
1092
- constructor(ref: ChangeDetectorRef, loadingService: SdLoadingService, excelService: SdExcelService, notifyService: SdNotifyService, confirmService: SdConfirmService);
1092
+ /** Inserted by Angular inject() migration for backwards compatibility */
1093
+ constructor(...args: unknown[]);
1093
1094
  open: () => Promise<void>;
1094
1095
  exportDefault: () => void;
1095
1096
  exportCSV: () => void;
@@ -1102,7 +1103,7 @@ declare class SdPopupExport {
1102
1103
  createTemplate: () => Promise<void>;
1103
1104
  templateNameValidator: (val: string) => string;
1104
1105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdPopupExport, never>;
1105
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPopupExport, "sd-popup-export", never, { "_tableOption": { "alias": "tableOption"; "required": false; }; "configuration": { "alias": "configuration"; "required": false; }; }, { "export": "export"; }, never, never, true, never>;
1106
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdPopupExport, "sd-popup-export", never, { "_tableOption": { "alias": "tableOption"; "required": false; }; "configuration": { "alias": "configuration"; "required": false; "isSignal": true; }; }, { "export": "export"; }, never, never, true, never>;
1106
1107
  }
1107
1108
 
1108
1109
  interface ISdTableConfiguration {
@@ -68,6 +68,10 @@ interface SdTreeCommand<T = any> {
68
68
  }
69
69
  interface SdTreeSelectorOption<T = any> {
70
70
  visible?: boolean;
71
+ /** Keep at most one loaded node selected. Takes precedence over cascade. */
72
+ single?: boolean;
73
+ /** Select nodes independently or cascade selection through loaded descendants. */
74
+ cascade?: 'independent' | 'descendants';
71
75
  actions?: SdTreeSelectionAction<T>[];
72
76
  message?: string | ((selectedItems: T[]) => string);
73
77
  disabled?: (item: T, selectedItems: T[]) => boolean;
@@ -117,6 +121,7 @@ interface SdTreeNode<T = any> {
117
121
  hasChildren: boolean;
118
122
  isExpanded: boolean;
119
123
  isLoading: boolean;
124
+ loadError?: unknown;
120
125
  }
121
126
  interface SdTreeItemContext<T = any> {
122
127
  $implicit: T;
@@ -127,10 +132,12 @@ interface SdTreeItemContext<T = any> {
127
132
  expanded: boolean;
128
133
  selected: boolean;
129
134
  loading: boolean;
135
+ loadError?: unknown;
130
136
  hasChildren: boolean;
131
137
  isLeaf: boolean;
132
138
  toggle: () => void;
133
139
  select: () => void;
140
+ retry: () => void;
134
141
  }
135
142
  type SdTreeItemTemplate<T = any> = TemplateRef<SdTreeItemContext<T>>;
136
143
  interface SdTreeSelectionEvent<T = any> {
@@ -143,6 +150,10 @@ interface SdTreeToggleEvent<T = any> {
143
150
  expanded: boolean;
144
151
  node: SdTreeNode<T>;
145
152
  }
153
+ interface SdTreeLoadErrorEvent<T = any> {
154
+ item?: T;
155
+ error: unknown;
156
+ }
146
157
 
147
158
  declare class SdTreeItemDefDirective<T = any> {
148
159
  static ngTemplateContextGuard<T>(_dir: SdTreeItemDefDirective<T>, ctx: unknown): ctx is SdTreeItemContext<T>;
@@ -175,12 +186,14 @@ interface SdTreeViewNode<T = any> extends SdTreeNode<T> {
175
186
  icon?: string;
176
187
  selected: boolean;
177
188
  selectionDisabled: boolean;
189
+ selectionIndeterminate: boolean;
178
190
  toggleDisabled: boolean;
179
191
  toggleLabel: string;
180
192
  ariaExpanded: boolean | null;
181
193
  autoIds: SdTreeNodeAutoIds;
182
194
  commands: SdTreeViewCommand<T>[];
183
195
  context: SdTreeItemContext<T>;
196
+ tabIndex: 0 | -1;
184
197
  }
185
198
  interface SdTreeSelectionActionView<T = any> {
186
199
  action: SdTreeSelectionAction<T>;
@@ -203,6 +216,7 @@ declare class SdTree<T = any> {
203
216
  readonly selectChange: _angular_core.OutputEmitterRef<SdTreeSelectionEvent<T>>;
204
217
  readonly expandChange: _angular_core.OutputEmitterRef<SdTreeToggleEvent<T>>;
205
218
  readonly collapseChange: _angular_core.OutputEmitterRef<SdTreeToggleEvent<T>>;
219
+ readonly loadError: _angular_core.OutputEmitterRef<SdTreeLoadErrorEvent<T>>;
206
220
  readonly itemDef: _angular_core.Signal<SdTreeItemDefDirective<any> | undefined>;
207
221
  readonly resolvedItemsSource: _angular_core.Signal<SdTreeDataSource<SdTreeItem<T>>>;
208
222
  readonly resolvedTree: _angular_core.Signal<SdTreeOption<T>>;
@@ -212,6 +226,9 @@ declare class SdTree<T = any> {
212
226
  readonly autoId: _angular_core.Signal<string | undefined>;
213
227
  readonly resolvedItemTemplate: _angular_core.Signal<TemplateRef<SdTreeItemContext<T>> | undefined>;
214
228
  readonly indentSize: _angular_core.Signal<number>;
229
+ readonly rootLoading: _angular_core.WritableSignal<boolean>;
230
+ readonly rootError: _angular_core.WritableSignal<unknown>;
231
+ readonly activeNodeId: _angular_core.WritableSignal<string | null>;
215
232
  readonly normalizedFilterText: _angular_core.Signal<string>;
216
233
  readonly selectionVisible: _angular_core.Signal<boolean>;
217
234
  readonly selectedIdSet: _angular_core.Signal<Set<string>>;
@@ -243,12 +260,17 @@ declare class SdTree<T = any> {
243
260
  toggleSelection(node: SdTreeNode<T>, event?: Event): void;
244
261
  clearSelection(): void;
245
262
  onSelectionAction(action: SdTreeSelectionAction<T>): void;
263
+ retry(): void;
264
+ retryNode(node: SdTreeNode<T>, event?: Event): void;
265
+ errorMessage(error: unknown): string;
266
+ onRowFocus(node: SdTreeNode<T>): void;
267
+ onRowKeydown(node: SdTreeNode<T>, event: KeyboardEvent): void;
246
268
  createContext(node: SdTreeNode<T>): SdTreeItemContext<T>;
247
269
  nodeAutoId(node: SdTreeNode<T>, part: SdTreeAutoIdPart): string | undefined;
248
270
  commandAutoId(node: SdTreeNode<T>, command: SdTreeCommand<T>): string | undefined;
249
271
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdTree<any>, never>;
250
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTree<any>, "sd-tree", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "option": { "alias": "option"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "selectedItemsInput": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "commands": { "alias": "commands"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selector": { "alias": "selector"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; }, { "selectedItemsChange": "selectedItemsChange"; "selectChange": "selectChange"; "expandChange": "expandChange"; "collapseChange": "collapseChange"; }, ["itemDef"], never, true, never>;
272
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdTree<any>, "sd-tree", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "option": { "alias": "option"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "selectedItemsInput": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "commands": { "alias": "commands"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selector": { "alias": "selector"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; }, { "selectedItemsChange": "selectedItemsChange"; "selectChange": "selectChange"; "expandChange": "expandChange"; "collapseChange": "collapseChange"; "loadError": "loadError"; }, ["itemDef"], never, true, never>;
251
273
  }
252
274
 
253
275
  export { SdTree, SdTreeItemDefDirective };
254
- export type { SdTreeAutoIdPart, SdTreeBaseOption, SdTreeCommand, SdTreeComponentOption, SdTreeComponentOptionBase, SdTreeDataSource, SdTreeItem, SdTreeItemBase, SdTreeItemByLoadType, SdTreeItemContext, SdTreeItemLazy, SdTreeItemStatic, SdTreeItemTemplate, SdTreeLazyComponentOption, SdTreeLazyOption, SdTreeLoadType, SdTreeNode, SdTreeNodeAutoIds, SdTreeOption, SdTreeSelectionAction, SdTreeSelectionActionView, SdTreeSelectionEvent, SdTreeSelectorOption, SdTreeStaticComponentOption, SdTreeStaticOption, SdTreeToggleEvent, SdTreeViewCommand, SdTreeViewNode };
276
+ export type { SdTreeAutoIdPart, SdTreeBaseOption, SdTreeCommand, SdTreeComponentOption, SdTreeComponentOptionBase, SdTreeDataSource, SdTreeItem, SdTreeItemBase, SdTreeItemByLoadType, SdTreeItemContext, SdTreeItemLazy, SdTreeItemStatic, SdTreeItemTemplate, SdTreeLazyComponentOption, SdTreeLazyOption, SdTreeLoadErrorEvent, SdTreeLoadType, SdTreeNode, SdTreeNodeAutoIds, SdTreeOption, SdTreeSelectionAction, SdTreeSelectionActionView, SdTreeSelectionEvent, SdTreeSelectorOption, SdTreeStaticComponentOption, SdTreeStaticOption, SdTreeToggleEvent, SdTreeViewCommand, SdTreeViewNode };
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EventEmitter, ChangeDetectorRef, ElementRef } from '@angular/core';
2
+ import { InjectionToken, ElementRef } from '@angular/core';
3
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
4
  import { FormGroup } from '@angular/forms';
5
5
  import { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
@@ -72,13 +72,14 @@ declare class PreviewComponent {
72
72
  #private;
73
73
  private cd;
74
74
  modal: SdModal;
75
- download: EventEmitter<PreviewFile>;
76
- close: EventEmitter<void>;
75
+ readonly download: _angular_core.OutputEmitterRef<PreviewFile>;
76
+ readonly close: _angular_core.OutputEmitterRef<void>;
77
77
  title: string;
78
78
  thumbnailPosition: 'right' | 'left' | 'bottom' | 'top';
79
79
  activeIndex: number;
80
80
  previewFiles: PreviewFile[];
81
- constructor(cd: ChangeDetectorRef);
81
+ /** Inserted by Angular inject() migration for backwards compatibility */
82
+ constructor(...args: unknown[]);
82
83
  open: (previewFiles: PreviewFile[] | undefined | null, index?: number) => Promise<void>;
83
84
  onClickThumbnailImage: (index: number) => void;
84
85
  updateCurrentImage: (direction: 1 | -1) => void;
@@ -25,3 +25,7 @@ export * from '@sdcorejs/angular/components/editor';
25
25
  export * from '@sdcorejs/angular/components/splitter';
26
26
  export * from '@sdcorejs/angular/components/preview';
27
27
  export * from '@sdcorejs/angular/components/autoid-inspector';
28
+ export * from '@sdcorejs/angular/components/breadcrumb';
29
+ export * from '@sdcorejs/angular/components/data-state';
30
+ export * from '@sdcorejs/angular/components/job-progress';
31
+ export * from '@sdcorejs/angular/components/audit-diff';
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, ElementRef, Renderer2, OnChanges, SimpleChanges, TemplateRef } from '@angular/core';
2
+ import { OnInit, OnChanges, SimpleChanges, TemplateRef } from '@angular/core';
3
3
 
4
4
  declare class SdScrollDirective implements OnInit {
5
5
  #private;
@@ -7,7 +7,8 @@ declare class SdScrollDirective implements OnInit {
7
7
  private renderer;
8
8
  onMouseOver(): void;
9
9
  onMouseOut(): void;
10
- constructor(elementRef: ElementRef, renderer: Renderer2);
10
+ /** Inserted by Angular inject() migration for backwards compatibility */
11
+ constructor(...args: unknown[]);
11
12
  ngOnInit(): void;
12
13
  scrollTop: () => void;
13
14
  static ɵfac: i0.ɵɵFactoryDeclaration<SdScrollDirective, never>;
@@ -32,24 +33,25 @@ declare class SdHoverCopyDirective implements OnInit, OnChanges {
32
33
  #private;
33
34
  private el;
34
35
  private renderer;
35
- copyText: string;
36
- sdHoverCopyDisabled: boolean;
37
- constructor(el: ElementRef, renderer: Renderer2);
36
+ readonly copyText: i0.InputSignal<string>;
37
+ readonly sdHoverCopyDisabled: i0.InputSignal<boolean>;
38
+ /** Inserted by Angular inject() migration for backwards compatibility */
39
+ constructor(...args: unknown[]);
38
40
  ngOnInit(): void;
39
41
  ngOnChanges(changes: SimpleChanges): void;
40
42
  onMouseEnter(): void;
41
43
  onMouseLeave(): void;
42
44
  static ɵfac: i0.ɵɵFactoryDeclaration<SdHoverCopyDirective, never>;
43
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdHoverCopyDirective, "[sdHoverCopy]", never, { "copyText": { "alias": "sdHoverCopy"; "required": true; }; "sdHoverCopyDisabled": { "alias": "sdHoverCopyDisabled"; "required": false; }; }, {}, never, never, true, never>;
45
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdHoverCopyDirective, "[sdHoverCopy]", never, { "copyText": { "alias": "sdHoverCopy"; "required": true; "isSignal": true; }; "sdHoverCopyDisabled": { "alias": "sdHoverCopyDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
44
46
  }
45
47
 
46
48
  declare class SdHrefDirective {
47
49
  #private;
48
- url: string;
50
+ readonly url: i0.InputSignal<string>;
49
51
  get href(): string;
50
52
  onClick(event: Event): void;
51
53
  static ɵfac: i0.ɵɵFactoryDeclaration<SdHrefDirective, never>;
52
- static ɵdir: i0.ɵɵDirectiveDeclaration<SdHrefDirective, "a[sdHref]", never, { "url": { "alias": "sdHref"; "required": false; }; }, {}, never, never, true, never>;
54
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SdHrefDirective, "a[sdHref]", never, { "url": { "alias": "sdHref"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
53
55
  }
54
56
 
55
57
  type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';