@sdcorejs/angular 19.1.2 → 19.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 (343) hide show
  1. package/README.md +127 -807
  2. package/components/anchor/src/index.d.ts +1 -1
  3. package/components/anchor/src/models/index.d.ts +1 -1
  4. package/components/audit-diff/index.d.ts +2 -0
  5. package/components/audit-diff/src/audit-diff.component.d.ts +30 -0
  6. package/components/audit-diff/src/audit-diff.engine.d.ts +40 -0
  7. package/components/badge/src/badge.component.d.ts +1 -1
  8. package/components/breadcrumb/index.d.ts +1 -0
  9. package/components/breadcrumb/src/breadcrumb.component.d.ts +50 -0
  10. package/components/data-state/index.d.ts +1 -0
  11. package/components/data-state/src/data-state.component.d.ts +40 -0
  12. package/components/document-builder/index.d.ts +2 -2
  13. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +1 -2
  14. package/components/document-builder/src/document-builder.component.d.ts +4 -4
  15. package/components/document-builder/src/plugins/index.d.ts +1 -1
  16. package/components/editor/index.d.ts +1 -1
  17. package/components/editor/src/models/index.d.ts +2 -2
  18. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +7 -8
  19. package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +4 -5
  20. package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +1 -2
  21. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +6 -5
  22. package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +4 -5
  23. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +9 -9
  24. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +8 -7
  25. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +8 -7
  26. package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +3 -4
  27. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +5 -6
  28. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +1 -2
  29. package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +4 -5
  30. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +6 -6
  31. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +6 -6
  32. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +3 -3
  33. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +6 -6
  34. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +3 -3
  35. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
  36. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +6 -6
  37. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +3 -3
  38. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +6 -5
  39. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +7 -6
  40. package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +7 -8
  41. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +3 -4
  42. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +6 -6
  43. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +3 -3
  44. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +6 -6
  45. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +3 -3
  46. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +6 -6
  47. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +3 -3
  48. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +6 -6
  49. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -3
  50. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +6 -6
  51. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +3 -3
  52. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +6 -6
  53. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +3 -3
  54. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +6 -6
  55. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +3 -3
  56. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +25 -2
  57. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +7 -6
  58. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +7 -6
  59. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +7 -7
  60. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +6 -6
  61. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +7 -6
  62. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +6 -7
  63. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +6 -7
  64. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +8 -8
  65. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +7 -6
  66. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +7 -6
  67. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +7 -6
  68. package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +4 -4
  69. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +8 -9
  70. package/components/form-generic/src/configurations/index.d.ts +1 -1
  71. package/components/form-generic/src/models/form-render/index.d.ts +2 -2
  72. package/components/form-generic/src/models/index.d.ts +6 -6
  73. package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +2 -3
  74. package/components/form-generic/src/pipes/html.pipe.d.ts +2 -2
  75. package/components/form-generic/src/services/form-render.service.d.ts +2 -2
  76. package/components/import-excel/index.d.ts +1 -1
  77. package/components/import-excel/src/import-excel.component.d.ts +4 -7
  78. package/components/import-excel/src/pipes/column-transform.pipe.d.ts +3 -2
  79. package/components/index.d.ts +4 -0
  80. package/components/job-progress/index.d.ts +1 -0
  81. package/components/job-progress/src/job-progress.component.d.ts +34 -0
  82. package/components/mini-editor/index.d.ts +1 -1
  83. package/components/mini-editor/src/mini-editor.component.d.ts +7 -7
  84. package/components/modal/src/modal.component.d.ts +6 -1
  85. package/components/org-chart/index.d.ts +1 -1
  86. package/components/preview/index.d.ts +5 -2
  87. package/components/preview/src/preview-pdf/preview-pdf.browser.d.ts +28 -0
  88. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +61 -23
  89. package/components/preview/src/preview-pdf/preview-pdf.pdfjs.d.ts +77 -0
  90. package/components/preview/src/preview-pdf/preview-pdf.print.d.ts +10 -0
  91. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +11 -9
  92. package/components/side-drawer/src/side-drawer.component.d.ts +6 -1
  93. package/components/tab/src/tab-group.component.d.ts +1 -0
  94. package/components/tab/src/tab.component.d.ts +7 -1
  95. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +3 -4
  96. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  97. package/components/tab-router/src/services/tab-decorator.service.d.ts +2 -1
  98. package/components/table/index.d.ts +1 -1
  99. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
  100. package/components/table/src/components/popup-export/popup-export.component.d.ts +6 -6
  101. package/components/table/src/models/index.d.ts +4 -4
  102. package/components/table/src/models/table-column.model.d.ts +1 -1
  103. package/components/table/src/services/config.service.d.ts +3 -2
  104. package/components/table/src/services/table-filter/table-filter.model.d.ts +1 -1
  105. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  106. package/components/tree/index.d.ts +1 -1
  107. package/components/tree/src/tree.component.d.ts +13 -2
  108. package/components/tree/src/tree.model.d.ts +11 -0
  109. package/components/upload-file/src/components/preview/preview.component.d.ts +4 -4
  110. package/directives/src/sd-hover-copy.directive.d.ts +6 -5
  111. package/directives/src/sd-href.directive.d.ts +2 -2
  112. package/directives/src/sd-scroll.directive.d.ts +3 -2
  113. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  114. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  116. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  117. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  118. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  120. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  121. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  122. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  123. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +16 -21
  124. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  126. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +600 -853
  128. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +25 -40
  130. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  132. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  133. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +9 -19
  134. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-components-modal.mjs +60 -3
  136. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-components-preview.mjs +1437 -217
  138. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +9 -17
  140. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  142. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +38 -1
  144. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +76 -52
  146. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-components-tab.mjs +47 -3
  148. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-components-table.mjs +121 -87
  150. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-components-tree.mjs +187 -17
  152. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +16 -22
  154. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  156. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  158. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -8
  160. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -73
  162. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +8 -4
  164. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-chip.mjs +8 -4
  166. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +18 -14
  168. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-date.mjs +48 -70
  170. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +63 -529
  172. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  174. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  175. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +4 -2
  176. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +15 -10
  178. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-forms-input.mjs +296 -58
  180. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  182. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -68
  184. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-forms-select.mjs +8 -21
  186. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -66
  188. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +8 -6
  190. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +279 -0
  192. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  193. package/fesm2022/sdcorejs-angular-forms-time.mjs +309 -0
  194. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  195. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  196. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  197. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  198. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  200. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  202. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  204. package/fesm2022/sdcorejs-angular-modules-layout.mjs +859 -78
  205. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  206. package/fesm2022/sdcorejs-angular-modules.mjs +0 -1
  207. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
  208. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  209. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  210. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  211. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  212. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  213. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  214. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  215. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  216. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  217. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  218. package/fesm2022/sdcorejs-angular-services-loading.mjs +340 -66
  219. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  220. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  221. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  222. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  223. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  224. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  225. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  226. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  227. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  228. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  229. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  230. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  231. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  232. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  233. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  234. package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
  235. package/forms/checkbox/src/checkbox.component.d.ts +4 -8
  236. package/forms/date/src/date.component.d.ts +4 -3
  237. package/forms/date-range/src/date-range.component.d.ts +5 -8
  238. package/forms/datetime/src/datetime.component.d.ts +4 -3
  239. package/forms/entity-picker/index.d.ts +1 -0
  240. package/forms/entity-picker/src/entity-picker.component.d.ts +123 -0
  241. package/forms/index.d.ts +6 -0
  242. package/forms/input/index.d.ts +1 -0
  243. package/forms/input/src/input-mask.d.ts +43 -0
  244. package/forms/input/src/input.component.d.ts +28 -9
  245. package/forms/input-color/src/input-color.component.d.ts +3 -1
  246. package/forms/input-number/src/input-number.component.d.ts +4 -2
  247. package/forms/models/index.d.ts +3 -2
  248. package/forms/models/src/sd-form-control-connector.d.ts +86 -0
  249. package/forms/radio/src/radio.component.d.ts +12 -8
  250. package/forms/src/forms.module.d.ts +9 -5
  251. package/forms/switch/src/switch.component.d.ts +4 -7
  252. package/forms/time/index.d.ts +3 -0
  253. package/forms/time/src/time-picker.adapter.d.ts +13 -0
  254. package/forms/time/src/time-value.d.ts +19 -0
  255. package/forms/time/src/time.component.d.ts +78 -0
  256. package/forms/time-range/index.d.ts +2 -0
  257. package/forms/time-range/src/time-range-value.d.ts +14 -0
  258. package/forms/time-range/src/time-range.component.d.ts +80 -0
  259. package/forms/tree-select/index.d.ts +1 -0
  260. package/forms/tree-select/src/tree-select.component.d.ts +71 -0
  261. package/i18n/src/en.d.ts +68 -2
  262. package/interceptors/no-internet/no-internet.interceptor.d.ts +2 -3
  263. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +2 -2
  264. package/modules/auth/services/index.d.ts +1 -1
  265. package/modules/icon/src/icon.model.d.ts +1 -2
  266. package/modules/icon/src/icon.provider.d.ts +1 -1
  267. package/modules/index.d.ts +0 -1
  268. package/modules/layout/components/index.d.ts +6 -0
  269. package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -2
  270. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +28 -0
  271. package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +25 -0
  272. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +27 -0
  273. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +28 -0
  274. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +3 -4
  275. package/modules/layout/components/sidebar-v1/main.component.d.ts +2 -2
  276. package/modules/layout/components/sidebar-v2/main.component.d.ts +36 -0
  277. package/modules/layout/components/sidebar-v3/main.component.d.ts +29 -0
  278. package/modules/layout/configurations/layout.configuration.d.ts +36 -2
  279. package/modules/layout/index.d.ts +1 -0
  280. package/modules/layout/pipes/menu.pipe.d.ts +2 -2
  281. package/modules/layout/services/index.d.ts +4 -1
  282. package/modules/layout/services/layout.service.d.ts +2 -2
  283. package/modules/layout/services/menu/menu.utils.d.ts +6 -0
  284. package/modules/layout/services/navigation-state/navigation-state.service.d.ts +18 -0
  285. package/modules/layout/services/responsive/responsive.service.d.ts +12 -0
  286. package/modules/layout/services/storage/storage.service.d.ts +21 -8
  287. package/package.json +50 -5
  288. package/pipes/src/safe-html.pipe.d.ts +2 -2
  289. package/services/api/src/api.model.d.ts +54 -15
  290. package/services/api/src/api.service.d.ts +13 -8
  291. package/services/api/src/interceptors/api.interceptor.d.ts +1 -1
  292. package/services/cache/src/cache.model.d.ts +46 -13
  293. package/services/cache/src/cache.service.d.ts +5 -2
  294. package/services/confirm/src/lib/confirm.service.d.ts +2 -2
  295. package/services/docx/src/lib/docx.service.d.ts +2 -3
  296. package/services/excel/src/public-api.d.ts +1 -1
  297. package/services/index.d.ts +4 -0
  298. package/services/loading/src/loading.service.d.ts +15 -8
  299. package/services/notify/src/components/toast/toast.component.d.ts +2 -3
  300. package/services/persistence/index.d.ts +5 -0
  301. package/services/persistence/src/graph-serializer.d.ts +16 -0
  302. package/services/persistence/src/persistence-envelope.d.ts +28 -0
  303. package/services/persistence/src/persistence-key.d.ts +17 -0
  304. package/services/persistence/src/persistence.model.d.ts +63 -0
  305. package/services/persistence/src/storage-adapter.d.ts +29 -0
  306. package/services/storage/src/storage.model.d.ts +20 -5
  307. package/services/storage/src/storage.service.d.ts +6 -3
  308. package/services/task/index.d.ts +3 -0
  309. package/services/task/src/task.model.d.ts +75 -0
  310. package/services/task/src/task.service.d.ts +14 -0
  311. package/services/task/src/task.tokens.d.ts +12 -0
  312. package/services/unsaved-changes/index.d.ts +4 -0
  313. package/services/unsaved-changes/src/unsaved-changes.adapters.d.ts +15 -0
  314. package/services/unsaved-changes/src/unsaved-changes.model.d.ts +41 -0
  315. package/services/unsaved-changes/src/unsaved-changes.service.d.ts +16 -0
  316. package/services/unsaved-changes/src/unsaved-changes.tokens.d.ts +9 -0
  317. package/services/viewport/index.d.ts +3 -0
  318. package/services/viewport/src/viewport.model.d.ts +12 -0
  319. package/services/viewport/src/viewport.service.d.ts +18 -0
  320. package/services/viewport/src/viewport.tokens.d.ts +6 -0
  321. package/utilities/models/index.d.ts +7 -7
  322. package/fesm2022/sdcorejs-angular-modules-authom.mjs +0 -360
  323. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +0 -1
  324. package/forms/datetime/src/material-datetime/index.d.ts +0 -14
  325. package/forms/datetime/src/material-datetime/lib/core/date-adapter.d.ts +0 -10
  326. package/forms/datetime/src/material-datetime/lib/core/date-formats.d.ts +0 -18
  327. package/forms/datetime/src/material-datetime/lib/core/default-options.d.ts +0 -13
  328. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-actions.component.d.ts +0 -5
  329. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-apply.directive.d.ts +0 -7
  330. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-cancel.directive.d.ts +0 -7
  331. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-input.directive.d.ts +0 -24
  332. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-now.directive.d.ts +0 -7
  333. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker-toggle.directive.d.ts +0 -8
  334. package/forms/datetime/src/material-datetime/lib/datetime-picker/datetime-picker.component.d.ts +0 -39
  335. package/forms/datetime/src/material-datetime/lib/native/native-date-adapter.d.ts +0 -15
  336. package/forms/datetime/src/material-datetime/lib/native/native-date-formats.d.ts +0 -2
  337. package/forms/datetime/src/material-datetime/lib/native/provide-native.d.ts +0 -3
  338. package/forms/datetime/src/material-datetime/lib/time-spinner/time-spinner.component.d.ts +0 -31
  339. package/modules/authom/authom.configuration.d.ts +0 -17
  340. package/modules/authom/authom.interceptor.d.ts +0 -3
  341. package/modules/authom/authom.module.d.ts +0 -16
  342. package/modules/authom/authom.service.d.ts +0 -32
  343. package/modules/authom/index.d.ts +0 -35
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-preview.mjs","sources":["../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.html","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.html","../../../projects/sdcorejs-angular/components/preview/sdcorejs-angular-components-preview.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n OnDestroy,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { NormalizedImage, PreviewItem, PreviewStage, PreviewTheme, ThumbnailPosition } from './preview-image.types';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-preview-image',\n standalone: true,\n imports: [SdIcon, CommonModule, TranslatePipe],\n templateUrl: './preview-image.component.html',\n styleUrl: './preview-image.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n // mà không cần bind document. Consumer (modal/drawer/page) chỉ cần thả component\n // vào DOM — keyboard shortcut tự hoạt động khi component hoặc descendant đang focus.\n host: {\n tabindex: '0',\n class: 'sd-preview-image-host',\n // WHY data-theme attribute (not class): SCSS uses :host([data-theme=\"light\"])\n // to swap CSS custom properties — keeps the theme variant declarative and\n // visible in devtools without polluting the class list.\n '[attr.data-theme]': 'theme()',\n '[class.sd-preview-image-host--fullscreen]': 'isFullscreen()',\n },\n})\nexport class SdPreviewImage implements OnDestroy {\n // ==========================================\n // CONSTANTS\n // ==========================================\n // Zoom giới hạn theo handoff: stage hiển thị từ 25% → 400% là dải hữu dụng.\n // Ngoài dải này ảnh hoặc quá nhỏ để thao tác hoặc đã pixelated nặng.\n static readonly MIN_ZOOM = 0.25;\n static readonly MAX_ZOOM = 4;\n static readonly ZOOM_STEP = 0.1;\n static readonly SWIPE_THRESHOLD = 40;\n\n // ==========================================\n // DI\n // ==========================================\n readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #destroyRef = inject(DestroyRef);\n\n // ==========================================\n // INPUTS (signal-based, Angular 19 style)\n // ==========================================\n // Declarative items input — consumer drives state. Mỗi lần items() đổi,\n // effect() bên dưới sẽ normalize + load lại danh sách.\n // autoId prefix `preview-image-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-image-${this.autoIdInput()}` : undefined));\n\n readonly #childAutoId = (suffix: string): string | undefined => {\n return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n };\n\n readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n readonly autoIdNext = computed(() => this.#childAutoId('next'));\n readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n readonly autoIdFit = computed(() => this.#childAutoId('fit'));\n readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n readonly autoIdDot = (i: number): string | undefined => this.#childAutoId(`dot-${i}`);\n\n readonly items = input<PreviewItem[]>([]);\n readonly title = input<string | undefined>(undefined);\n readonly thumbnailPosition = input<ThumbnailPosition>('bottom');\n readonly showToolbar = input(true);\n readonly downloadable = input(true);\n readonly zoomable = input(true);\n readonly loop = input(true);\n readonly startIndex = input(0);\n // Theme variant — drives [data-theme] host attribute. Default 'dark' preserves\n // pre-existing visual contract; consumers opt-in to 'light' explicitly.\n readonly theme = input<PreviewTheme>('dark');\n\n // ==========================================\n // OUTPUTS\n // ==========================================\n // `close`: user requested dismissal (X button hoặc Esc). Consumer tự quyết\n // định đóng modal / điều hướng / hide section.\n readonly close = output<void>();\n readonly activeIndexChange = output<number>();\n readonly download = output<{ index: number; item: NormalizedImage }>();\n readonly imageError = output<{ index: number; reason: string }>();\n\n // ==========================================\n // STATE (signals)\n // ==========================================\n readonly #activeIndex = signal(0);\n readonly #images = signal<NormalizedImage[]>([]);\n readonly #zoom = signal(1);\n readonly #rotation = signal(0);\n readonly #pan = signal({ x: 0, y: 0 });\n readonly #stage = signal<PreviewStage>('empty');\n readonly #isFullscreen = signal(false);\n readonly #isDragging = signal(false);\n\n // Track every blob URL we created so we can revoke on destroy / re-normalize.\n // CDN strings hoá ra File→blob URL nội bộ — bắt buộc phải revoke để không leak.\n readonly #ownedBlobUrls = new Set<string>();\n\n // Token chống race: nếu items() đổi liên tiếp (user click rất nhanh) thì\n // promise normalize của lần trước phải bị bỏ qua khi resolve.\n #loadToken = 0;\n\n // Pointer state for drag/pinch — không cần signal vì không drive template.\n #dragStart: { x: number; y: number; panX: number; panY: number } | null = null;\n #swipeStart: { x: number; y: number; t: number } | null = null;\n readonly #activePointers = new Map<number, { x: number; y: number }>();\n #pinchStartDistance = 0;\n #pinchStartZoom = 1;\n\n // ==========================================\n // COMPUTED (template-readable)\n // ==========================================\n readonly activeIndex = this.#activeIndex.asReadonly();\n readonly images = this.#images.asReadonly();\n readonly zoom = this.#zoom.asReadonly();\n readonly rotation = this.#rotation.asReadonly();\n readonly pan = this.#pan.asReadonly();\n readonly stage = this.#stage.asReadonly();\n readonly isFullscreen = this.#isFullscreen.asReadonly();\n\n readonly activeImage = computed<NormalizedImage | undefined>(() => this.#images()[this.#activeIndex()]);\n readonly hasPrev = computed(() => {\n const len = this.#images().length;\n return len > 1 && (this.loop() || this.#activeIndex() > 0);\n });\n readonly hasNext = computed(() => {\n const len = this.#images().length;\n return len > 1 && (this.loop() || this.#activeIndex() < len - 1);\n });\n readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n\n // Transform style cho ảnh stage. WHY: gom translate/scale/rotate vào 1 string\n // duy nhất để OnPush phát hiện thay đổi qua signal kéo theo computed.\n readonly imageTransform = computed(() => {\n const p = this.#pan();\n const z = this.#zoom();\n const r = this.#rotation();\n return `translate(${p.x}px, ${p.y}px) scale(${z}) rotate(${r}deg)`;\n });\n\n readonly shellClass = computed(() => {\n const pos = this.thumbnailPosition();\n return {\n 'sd-preview-shell': true,\n [`sd-preview-shell--pos-${pos}`]: true,\n 'sd-preview-shell--fullscreen': this.#isFullscreen(),\n };\n });\n\n // ==========================================\n // CONSTRUCTOR — declarative wiring\n // ==========================================\n constructor() {\n // Đồng bộ #isFullscreen với trạng thái thực của browser (sự kiện 'fullscreenchange' fire\n // bất kể user thoát fullscreen bằng cách nào: nút Thoát, Esc, F11, programmatic).\n const onFullscreenChange = () => {\n this.#isFullscreen.set(document.fullscreenElement === this.#hostEl.nativeElement);\n };\n document.addEventListener('fullscreenchange', onFullscreenChange);\n this.#destroyRef.onDestroy(() => {\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n\n // Reactive normalize: mỗi lần items() đổi → revoke blob cũ → load mới.\n // WHY effect không async: effect() callback không hỗ trợ async cleanup,\n // dùng token-based race guard trong #normalizeAndLoad để bỏ qua kết quả cũ.\n effect(() => {\n const list = this.items();\n const start = this.startIndex();\n this.#normalizeAndLoad(list, start);\n });\n\n // Auto-focus host sau lần render đầu để keyboard hoạt động ngay.\n // WHY: nếu consumer KHÔNG bọc trong modal, không có ai focus giúp.\n // Consumer bọc modal sẽ tự focus trap riêng — focus() này vô hại (no-op\n // nếu element không visible).\n afterNextRender(() => {\n try {\n this.#hostEl.nativeElement.focus({ preventScroll: true });\n } catch {\n // ignore — focus() can throw on detached/hidden elements.\n }\n });\n\n // Cleanup khi component bị destroy.\n this.#destroyRef.onDestroy(() => {\n this.#revokeAllBlobs();\n if (document.fullscreenElement === this.#hostEl.nativeElement) {\n // Tránh để fullscreen \"treo\" khi component bị huỷ giữa chừng.\n document.exitFullscreen?.().catch(() => undefined);\n }\n });\n }\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n ngOnDestroy(): void {\n // Giữ ngOnDestroy để vẫn tương thích với khai báo `implements OnDestroy`.\n // Logic dọn dẹp đã được dời sang DestroyRef.onDestroy ở constructor để có\n // thể chia sẻ với effect() teardown nếu cần sau này.\n }\n\n // ==========================================\n // PUBLIC API\n // ==========================================\n\n onClickThumbnailImage(index: number): void {\n if (index < 0 || index >= this.#images().length) return;\n if (index === this.#activeIndex()) return;\n this.#setActive(index);\n }\n\n updateCurrentImage(direction: 1 | -1): void {\n const len = this.#images().length;\n if (len <= 1) return;\n const next = this.#activeIndex() + direction;\n let target: number;\n if (this.loop()) {\n target = (next + len) % len;\n } else {\n if (next < 0 || next >= len) return;\n target = next;\n }\n this.#setActive(target);\n }\n\n zoomIn(): void {\n if (!this.zoomable()) return;\n this.#setZoom(this.#zoom() + SdPreviewImage.ZOOM_STEP);\n }\n\n zoomOut(): void {\n if (!this.zoomable()) return;\n this.#setZoom(this.#zoom() - SdPreviewImage.ZOOM_STEP);\n }\n\n fitToScreen(): void {\n this.#resetTransform();\n }\n\n rotate(direction: 'left' | 'right'): void {\n const delta = direction === 'right' ? 90 : -90;\n // Wrap về [0, 360) cho gọn — không strictly cần thiết về mặt visual.\n this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n }\n\n downloadCurrent(): void {\n if (!this.downloadable()) return;\n const img = this.activeImage();\n if (!img || img.error) return;\n // Ưu tiên CDN URL nếu có để tận dụng Content-Disposition của server,\n // fallback về blob URL khi user upload File trực tiếp.\n const href = img.url || img.blobUrl;\n const a = document.createElement('a');\n a.href = href;\n a.download = img.name || 'image';\n document.body.appendChild(a);\n a.click();\n a.remove();\n this.download.emit({ index: this.#activeIndex(), item: img });\n }\n\n toggleFullscreen(): void {\n // WHY: trạng thái #isFullscreen được sync qua sự kiện 'fullscreenchange' (xem constructor)\n // — single source of truth. Không cần .then(set(true/false)) ở đây nữa.\n if (!document.fullscreenElement) {\n this.#hostEl.nativeElement.requestFullscreen?.().catch(() => undefined);\n } else {\n document.exitFullscreen?.().catch(() => undefined);\n }\n }\n\n /** Retry just the active image (Artboard G action). */\n async retryActive(): Promise<void> {\n const idx = this.#activeIndex();\n const img = this.#images()[idx];\n if (!img || !img.url) return;\n // Per-image loading: chỉ đánh dấu record này loading, KHÔNG đụng stage().\n // Nhờ vậy nav arrows + thumbnails vẫn render trong lúc retry, không flicker.\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...arr[idx], loading: true, error: false };\n return next;\n });\n const refreshed = await this.#normalize(img.url, { name: img.name, caption: img.caption, alt: img.alt });\n if (refreshed) {\n // Trao đổi nguyên record để giữ id thumbnail (avoid track-by reset).\n this.#images.update(arr => {\n const next = [...arr];\n // Revoke blob cũ TRƯỚC khi thay để không leak record vừa fail tải.\n if (this.#ownedBlobUrls.has(arr[idx].blobUrl)) {\n URL.revokeObjectURL(arr[idx].blobUrl);\n this.#ownedBlobUrls.delete(arr[idx].blobUrl);\n }\n next[idx] = { ...refreshed, id: img.id, loading: false };\n return next;\n });\n } else {\n // Normalize trả null → giữ record cũ nhưng tắt loading + mark error\n // để inline placeholder hiển thị (không lật cả stage).\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...arr[idx], loading: false, error: true };\n return next;\n });\n }\n }\n\n /** User clicked the X button — emit close intent for the consumer to react. */\n requestClose(): void {\n this.close.emit();\n }\n\n // ==========================================\n // KEYBOARD — bound to HOST (not document)\n // ==========================================\n // WHY @HostListener('keydown') on host: component có tabindex=0 nên nhận được\n // keyboard event khi nó hoặc descendant đang focused. Không bind document để\n // tránh \"cướp\" phím tắt của các phần khác trong app khi component không hoạt động.\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n // Bỏ qua khi user đang gõ trong input — toolbar / overlay có thể chứa\n // input ẩn (search), không muốn ← → cướp event của họ.\n const target = event.target as HTMLElement | null;\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n this.updateCurrentImage(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.updateCurrentImage(1);\n break;\n case '+':\n case '=':\n if (this.zoomable()) {\n event.preventDefault();\n this.zoomIn();\n }\n break;\n case '-':\n if (this.zoomable()) {\n event.preventDefault();\n this.zoomOut();\n }\n break;\n case '0':\n event.preventDefault();\n this.fitToScreen();\n break;\n case 'r':\n event.preventDefault();\n this.rotate('right');\n break;\n case 'R':\n event.preventDefault();\n this.rotate('left');\n break;\n case 'f':\n event.preventDefault();\n this.toggleFullscreen();\n break;\n case 'd':\n if (this.downloadable()) {\n event.preventDefault();\n this.downloadCurrent();\n }\n break;\n }\n }\n\n // ==========================================\n // MOUSE / POINTER HANDLERS (template-bound)\n // ==========================================\n onWheel(event: WheelEvent): void {\n if (!this.zoomable()) return;\n event.preventDefault();\n // deltaY < 0 nghĩa là cuộn lên = zoom in (giống Google Photos / macOS Preview).\n const factor = event.deltaY < 0 ? 1 + SdPreviewImage.ZOOM_STEP : 1 - SdPreviewImage.ZOOM_STEP;\n this.#setZoom(this.#zoom() * factor);\n }\n\n onPointerDown(event: PointerEvent): void {\n if (event.button !== 0 && event.pointerType === 'mouse') return;\n // Bỏ qua nếu pointer xuất phát trên control tương tác (toolbar / nav / dots / retry button).\n // WHY: stage chứa các button con; setPointerCapture đi cùng drag/swipe logic sẽ\n // \"ăn\" click event của những button đó (như nút Thoát fullscreen / zoom / rotate).\n if ((event.target as HTMLElement).closest('button, [role=\"button\"]')) return;\n (event.target as Element).setPointerCapture?.(event.pointerId);\n this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.#activePointers.size === 2) {\n // Bắt đầu pinch — khoá zoom hiện tại làm anchor.\n const pts = [...this.#activePointers.values()];\n this.#pinchStartDistance = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n this.#pinchStartZoom = this.#zoom();\n this.#dragStart = null;\n this.#swipeStart = null;\n return;\n }\n\n if (this.#zoom() > 1) {\n // Đã zoom → pointer drag = pan, không phải swipe.\n this.#isDragging.set(true);\n this.#dragStart = {\n x: event.clientX,\n y: event.clientY,\n panX: this.#pan().x,\n panY: this.#pan().y,\n };\n } else {\n // Ở mức 100% → pointer drag được coi là swipe sang ảnh kế.\n this.#swipeStart = { x: event.clientX, y: event.clientY, t: performance.now() };\n }\n }\n\n onPointerMove(event: PointerEvent): void {\n if (!this.#activePointers.has(event.pointerId)) return;\n this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.#activePointers.size === 2 && this.zoomable() && this.#pinchStartDistance > 0) {\n const pts = [...this.#activePointers.values()];\n const dist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n const ratio = dist / this.#pinchStartDistance;\n this.#setZoom(this.#pinchStartZoom * ratio);\n return;\n }\n\n if (this.#dragStart && this.#zoom() > 1) {\n const dx = event.clientX - this.#dragStart.x;\n const dy = event.clientY - this.#dragStart.y;\n this.#pan.set({ x: this.#dragStart.panX + dx, y: this.#dragStart.panY + dy });\n }\n }\n\n onPointerUp(event: PointerEvent): void {\n const start = this.#swipeStart;\n this.#activePointers.delete(event.pointerId);\n\n if (this.#activePointers.size < 2) {\n this.#pinchStartDistance = 0;\n }\n\n if (this.#dragStart) {\n this.#dragStart = null;\n this.#isDragging.set(false);\n }\n\n // Detect swipe — chỉ khi đang ở fit/100% và di chuyển ngang đủ xa.\n if (start && this.#zoom() <= 1) {\n const dx = event.clientX - start.x;\n const dy = event.clientY - start.y;\n if (Math.abs(dx) >= SdPreviewImage.SWIPE_THRESHOLD && Math.abs(dx) > Math.abs(dy) * 1.5) {\n this.updateCurrentImage(dx < 0 ? 1 : -1);\n }\n }\n this.#swipeStart = null;\n }\n\n onPointerCancel(event: PointerEvent): void {\n this.#activePointers.delete(event.pointerId);\n this.#dragStart = null;\n this.#swipeStart = null;\n this.#isDragging.set(false);\n if (this.#activePointers.size < 2) {\n this.#pinchStartDistance = 0;\n }\n }\n\n onImageDblClick(): void {\n if (!this.zoomable()) return;\n if (this.#zoom() === 1) {\n this.#setZoom(2);\n } else {\n this.#resetTransform();\n }\n }\n\n onImageError(): void {\n const idx = this.#activeIndex();\n const img = this.#images()[idx];\n if (!img) return;\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...img, error: true, loading: false };\n return next;\n });\n // WHY không set stage='error': lỗi từng ảnh không nên ẩn nav/dots/thumb của\n // cả viewer. Template render placeholder inline ngay trong khung ảnh khi\n // activeImage().error === true — user vẫn có thể chuyển sang ảnh khác.\n this.imageError.emit({ index: idx, reason: 'render-failed' });\n }\n\n trackByImage(_i: number, item: NormalizedImage): string {\n return item.id;\n }\n\n formatBytes(bytes: number): string {\n if (!bytes || bytes < 0) return '';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n }\n\n // ==========================================\n // INTERNALS\n // ==========================================\n async #normalizeAndLoad(items: PreviewItem[] | null | undefined, startIndex: number): Promise<void> {\n const token = ++this.#loadToken;\n\n // Revoke trước khi map mới — items() đổi liên tiếp sẽ leak nếu không.\n this.#revokeAllBlobs();\n this.#resetTransform();\n\n if (!Array.isArray(items) || items.length === 0) {\n this.#images.set([]);\n this.#activeIndex.set(0);\n this.#stage.set('empty');\n return;\n }\n\n this.#activeIndex.set(Math.max(0, Math.min(startIndex ?? 0, items.length - 1)));\n this.#stage.set('loading');\n\n const normalized = await Promise.all(items.map(item => this.#normalize(item)));\n\n // Race guard: nếu items() đã đổi trong lúc await thì kết quả này là stale.\n // Lưu ý: blob URL của batch này đã add vào #ownedBlobUrls — batch mới sẽ\n // revoke chúng khi nó cũng vào #normalizeAndLoad.\n if (token !== this.#loadToken) {\n return;\n }\n\n const valid = normalized.filter((img): img is NormalizedImage => img !== null);\n this.#images.set(valid);\n if (valid.length === 0) {\n this.#stage.set('empty');\n } else {\n const idx = Math.min(this.#activeIndex(), valid.length - 1);\n this.#activeIndex.set(idx);\n // WHY luôn 'ready' kể cả khi ảnh đầu bị error: per-image error render\n // inline để giữ nav + thumb interactive. User vẫn điều hướng được sang\n // ảnh khác.\n this.#stage.set('ready');\n }\n }\n\n #setActive(index: number): void {\n this.#activeIndex.set(index);\n this.#resetTransform();\n // WHY luôn set 'ready' (không phụ thuộc img.error): per-image error giờ\n // render inline trong stage thay vì lật cả stage sang 'error'. Giữ stage\n // 'ready' để nav/dots/thumbnail/toolbar không bị ẩn.\n this.#stage.set('ready');\n this.activeIndexChange.emit(index);\n // Auto-scroll thumbnail strip — đợi 1 microtask để DOM rendered xong.\n // WHY scoped query: thumbnail id là global ('sd-preview-thumb-N'); nếu có\n // > 1 instance trên page sẽ collide. Query trong nativeElement để isolate.\n queueMicrotask(() => {\n const el = this.#hostEl.nativeElement.querySelector(`#sd-preview-thumb-${index}`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n });\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(SdPreviewImage.MAX_ZOOM, Math.max(SdPreviewImage.MIN_ZOOM, value));\n this.#zoom.set(clamped);\n if (clamped <= 1) {\n // Khi về fit/100% — pan không còn ý nghĩa, reset để không bị \"lệch\" khi\n // zoom lại lần sau.\n this.#pan.set({ x: 0, y: 0 });\n }\n }\n\n #resetTransform(): void {\n this.#zoom.set(1);\n this.#rotation.set(0);\n this.#pan.set({ x: 0, y: 0 });\n }\n\n #revokeAllBlobs(): void {\n for (const url of this.#ownedBlobUrls) {\n URL.revokeObjectURL(url);\n }\n this.#ownedBlobUrls.clear();\n }\n\n async #normalize(item: PreviewItem, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage | null> {\n try {\n if (typeof item === 'string') {\n return await this.#fromUrl(item, override);\n }\n if (item instanceof File) {\n return this.#fromFile(item, override);\n }\n if (item && typeof item === 'object') {\n // Object form: chấp nhận file hoặc url, ưu tiên file vì không cần network.\n if (item.file) {\n return this.#fromFile(item.file, { name: item.name, caption: item.caption, alt: item.alt });\n }\n if (item.url) {\n return await this.#fromUrl(item.url, {\n name: item.name,\n caption: item.caption,\n alt: item.alt,\n });\n }\n }\n return null;\n } catch (err) {\n console.error('[sd-preview-image] normalize failed', err);\n return null;\n }\n }\n\n async #fromUrl(url: string, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage> {\n const id = Utilities.generateUuid();\n // Lấy filename từ phần path cuối — bỏ query string.\n const baseSrc = url.split('?')[0];\n const inferredName = override?.name || baseSrc.substring(baseSrc.lastIndexOf('/') + 1) || 'image';\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const blob = await res.blob();\n const file = new File([blob], inferredName, { type: blob.type });\n const blobUrl = URL.createObjectURL(file);\n this.#ownedBlobUrls.add(blobUrl);\n return {\n id,\n url,\n blobUrl,\n name: inferredName,\n size: file.size,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: false,\n };\n } catch {\n // Vẫn trả về record để Artboard G có thể hiển thị Retry — error=true sẽ\n // được stage signal chuyển sang trạng thái lỗi khi đây là active image.\n return {\n id,\n url,\n blobUrl: '',\n name: inferredName,\n size: 0,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: true,\n };\n }\n }\n\n #fromFile(file: File, override?: { name?: string; caption?: string; alt?: string }): NormalizedImage | null {\n if (!file.type.startsWith('image/')) {\n // Silently filter — handoff yêu cầu non-image File bị drop yên lặng để\n // tương thích với upload form nơi user trộn lẫn ảnh và tài liệu.\n return null;\n }\n const blobUrl = URL.createObjectURL(file);\n this.#ownedBlobUrls.add(blobUrl);\n return {\n id: Utilities.generateUuid(),\n blobUrl,\n name: override?.name || file.name,\n size: file.size,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: false,\n };\n }\n}\n","<!--\n Self-contained viewer shell. Component sizes to its parent (width:100%;\n height:100%) — consumer decides whether to wrap in <sd-modal>,\n <sd-side-drawer>, a page section, or use inline.\n-->\n<div [ngClass]=\"shellClass()\" role=\"region\">\n @let _stage = stage();\n @let _images = images();\n @let _thumbnailPosition = thumbnailPosition();\n @let _activeIndex = activeIndex();\n @let _activeImage = activeImage();\n\n <!-- ============================================\n HEADER BAR\n ============================================ -->\n @if (_stage !== 'empty' && _activeImage; as img) {\n <div class=\"sd-preview-header\">\n <div class=\"sd-preview-header__left\">\n <sd-icon class=\"sd-preview-header__icon\" fontIcon=\"image\"></sd-icon>\n <div class=\"sd-preview-header__meta\">\n <div class=\"sd-preview-header__name T14M\" [title]=\"img.name\">{{ img.name }}</div>\n @if (img.size) {\n <div class=\"sd-preview-header__sub\">\n {{ formatBytes(img.size) }}\n </div>\n }\n </div>\n </div>\n\n @if (_images.length > 1) {\n <div class=\"sd-preview-header__counter\" aria-live=\"polite\">\n {{ _activeIndex + 1 }} / {{ _images.length }}\n </div>\n }\n </div>\n } @else if (title()) {\n <!-- Optional override title even on empty state -->\n <div class=\"sd-preview-header sd-preview-header--simple\">\n <div class=\"sd-preview-header__name T14M\">{{ title() }}</div>\n </div>\n }\n\n <!-- ============================================\n BODY (stage + thumbnails per layout)\n ============================================ -->\n <div class=\"sd-preview-body\">\n\n <!-- STAGE ............................................................... -->\n <div\n class=\"sd-preview-stage\"\n [class.sd-preview-stage--dragging]=\"zoom() > 1\"\n (wheel)=\"onWheel($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel($event)\"\n (dblclick)=\"onImageDblClick()\">\n\n @switch (_stage) {\n @case ('empty') {\n <div class=\"sd-preview-status\">\n <div class=\"sd-preview-status__tile sd-preview-status__tile--muted\">\n <sd-icon fontIcon=\"image_not_supported\"></sd-icon>\n </div>\n <div class=\"sd-preview-status__title\">\n {{ 'core.component.preview-image.no-image' | translate }}\n </div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.no-image-hint' | translate }}\n </div>\n </div>\n }\n @case ('loading') {\n <div class=\"sd-preview-status\">\n <div class=\"sd-preview-spinner\" role=\"progressbar\"></div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.loading' | translate }}\n </div>\n </div>\n }\n @default {\n @if (_activeImage; as img) {\n @if (img.loading) {\n <!-- Per-image loading (retry inline) — giữ nav/dots/thumbs visible -->\n <div class=\"sd-preview-image-loading\" role=\"status\"\n [attr.aria-label]=\"'core.component.preview-image.loading' | translate\">\n <div class=\"sd-preview-spinner\"></div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.loading' | translate }}\n </div>\n </div>\n } @else if (img.error) {\n <!-- Inline broken-image placeholder — giữ nav/dots/thumbs visible -->\n <div class=\"sd-preview-image-broken\" role=\"img\"\n [attr.aria-label]=\"'core.component.preview-image.load-error' | translate\">\n <div class=\"sd-preview-status__tile sd-preview-status__tile--danger\">\n <sd-icon fontIcon=\"broken_image\"></sd-icon>\n </div>\n <div class=\"sd-preview-status__title\">\n {{ 'core.component.preview-image.load-error' | translate }}\n </div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.load-error-hint' | translate }}\n </div>\n <button type=\"button\" class=\"sd-preview-btn-primary\" (click)=\"retryActive()\" [attr.data-autoId]=\"autoIdRetry()\">\n <sd-icon fontIcon=\"refresh\"></sd-icon>\n <span>{{ 'core.component.preview-image.retry' | translate }}</span>\n </button>\n </div>\n } @else {\n <img\n class=\"sd-preview-image\"\n [src]=\"img.blobUrl || img.url\"\n [alt]=\"img.alt || img.name\"\n [style.transform]=\"imageTransform()\"\n (error)=\"onImageError()\"\n draggable=\"false\" />\n\n @if (img.caption) {\n <div class=\"sd-preview-caption\">{{ img.caption }}</div>\n }\n }\n }\n }\n }\n\n <!-- KEYBOARD HINT ............................................. -->\n @if (_stage === 'ready' && _images.length > 1) {\n <div class=\"sd-preview-kbd-hint\" aria-hidden=\"true\">\n <span class=\"sd-preview-kbd\">←</span>\n <span class=\"sd-preview-kbd\">→</span>\n <span class=\"sd-preview-kbd-text\">{{ 'core.component.preview-image.kbd-hint-nav' | translate }}</span>\n </div>\n }\n\n <!-- NAV ARROWS ............................................. -->\n @if (_stage === 'ready' && _images.length > 1) {\n <button\n type=\"button\"\n class=\"sd-preview-nav sd-preview-nav--prev\"\n [disabled]=\"!hasPrev()\"\n [attr.aria-label]=\"'core.component.preview-image.prev' | translate\"\n [attr.data-autoId]=\"autoIdPrev()\"\n (click)=\"updateCurrentImage(-1)\">\n <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-nav sd-preview-nav--next\"\n [disabled]=\"!hasNext()\"\n [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n [attr.data-autoId]=\"autoIdNext()\"\n (click)=\"updateCurrentImage(1)\">\n <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n </button>\n }\n\n <!-- DOTS INDICATOR ......................................... -->\n @if (_thumbnailPosition === 'dots' && _stage === 'ready' && _images.length > 1) {\n <div class=\"sd-preview-dots\" role=\"tablist\">\n @for (img of _images; track img.id; let i = $index) {\n <button\n type=\"button\"\n class=\"sd-preview-dot\"\n [class.sd-preview-dot--active]=\"i === _activeIndex\"\n [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n [attr.data-autoId]=\"autoIdDot(i)\"\n (click)=\"onClickThumbnailImage(i)\"></button>\n }\n </div>\n }\n\n <!-- FLOATING TOOLBAR ....................................... -->\n @if (showToolbar() && _stage === 'ready') {\n <div class=\"sd-preview-toolbar\" role=\"toolbar\">\n @if (zoomable()) {\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.zoom-out' | translate\"\n [attr.title]=\"'core.component.preview-image.zoom-out' | translate\"\n [attr.data-autoId]=\"autoIdZoomOut()\"\n (click)=\"zoomOut()\">\n <sd-icon fontIcon=\"zoom_out\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__readout\">{{ zoomPercent() }}%</span>\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.zoom-in' | translate\"\n [attr.title]=\"'core.component.preview-image.zoom-in' | translate\"\n [attr.data-autoId]=\"autoIdZoomIn()\"\n (click)=\"zoomIn()\">\n <sd-icon fontIcon=\"zoom_in\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__divider\"></span>\n }\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn sd-preview-toolbar__btn--with-label\"\n [attr.aria-label]=\"'core.component.preview-image.fit' | translate\"\n [attr.data-autoId]=\"autoIdFit()\"\n (click)=\"fitToScreen()\">\n <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n <span class=\"sd-preview-toolbar__btn-label\">{{ 'core.component.preview-image.fit' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.rotate' | translate\"\n [attr.title]=\"'core.component.preview-image.rotate' | translate\"\n [attr.data-autoId]=\"autoIdRotate()\"\n (click)=\"rotate('right')\">\n <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__divider\"></span>\n @if (downloadable()) {\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.download' | translate\"\n [attr.title]=\"'core.component.preview-image.download' | translate\"\n [attr.data-autoId]=\"autoIdDownload()\"\n (click)=\"downloadCurrent()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n </button>\n }\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.fullscreen' | translate\"\n [attr.title]=\"'core.component.preview-image.fullscreen' | translate\"\n [attr.data-autoId]=\"autoIdFullscreen()\"\n (click)=\"toggleFullscreen()\">\n <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n </button>\n </div>\n }\n </div>\n\n <!-- THUMBNAIL STRIP .................................................... -->\n @if (\n _stage === 'ready' &&\n _images.length > 1 &&\n _thumbnailPosition !== 'none' &&\n _thumbnailPosition !== 'dots'\n ) {\n <div\n class=\"sd-preview-thumbs\"\n [class.sd-preview-thumbs--vertical]=\"_thumbnailPosition === 'left' || _thumbnailPosition === 'right'\">\n @for (img of _images; track trackByImage($index, img); let i = $index) {\n <button\n type=\"button\"\n class=\"sd-preview-thumb\"\n [class.sd-preview-thumb--active]=\"i === _activeIndex\"\n [id]=\"'sd-preview-thumb-' + i\"\n [attr.aria-label]=\"img.name\"\n [attr.aria-current]=\"i === _activeIndex ? 'true' : null\"\n [attr.data-autoId]=\"autoIdThumb(i)\"\n (click)=\"onClickThumbnailImage(i)\">\n @if (img.error) {\n <div class=\"sd-preview-thumb__broken\">\n <sd-icon fontIcon=\"broken_image\"></sd-icon>\n </div>\n } @else {\n <img class=\"sd-preview-thumb__img\" [src]=\"img.blobUrl || img.url\" [alt]=\"img.alt || img.name\" />\n }\n <span class=\"sd-preview-thumb__badge\">{{ i + 1 }}</span>\n @if (_thumbnailPosition === 'right' || _thumbnailPosition === 'left') {\n <span class=\"sd-preview-thumb__name\" [title]=\"img.name\">{{ img.name }}</span>\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n InjectionToken,\n OnDestroy,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport {\n PdfErrorEvent,\n PdfErrorReason,\n PdfLoadEvent,\n PdfMeta,\n PdfScrollMode,\n PdfSearchResult,\n PdfSearchState,\n PdfSidebarMode,\n PdfSource,\n PdfStage,\n PdfZoomMode,\n PreviewTheme,\n} from './preview-pdf.types';\n\n// pdfjs-dist 4.x ESM build. We import the whole namespace so we can both call\n// getDocument() and assign GlobalWorkerOptions.workerSrc once at module load.\n//\n// WHY this concrete import (and the .mjs worker URL strategy): pdfjs ships an\n// ESM build that ng-packagr understands as a regular dependency. Worker\n// registration uses `new URL(..., import.meta.url)` so bundlers (esbuild /\n// webpack / vite) emit and rewrite the asset automatically. If a downstream\n// app's bundler can't resolve the worker via import.meta.url, the consumer\n// must point pdfjsLib.GlobalWorkerOptions.workerSrc to their own copy.\n\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Minimal pdfjs surface the component depends on. We wrap pdfjs in a DI token\n * so unit tests can supply a hand-rolled mock without going through\n * jasmine.createSpyObj on the real module (which is harder with ESM).\n */\nexport interface SdPdfJsLib {\n getDocument: (spec: unknown) => {\n promise: Promise<unknown>;\n onProgress?: (p: { loaded: number; total: number }) => void;\n };\n GlobalWorkerOptions: { workerSrc: string };\n}\n\nexport const SD_PDFJS_LIB = new InjectionToken<SdPdfJsLib>('SD_PDFJS_LIB', {\n providedIn: 'root',\n factory: (): SdPdfJsLib => {\n // Try the worker URL one time at first-injection. Guarded so the\n // component still imports cleanly in environments (tests, SSR) where\n // import.meta.url can't be resolved or the worker bundle isn't shipped.\n try {\n if (pdfjsLib?.GlobalWorkerOptions && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs' as any, import.meta.url).toString();\n }\n } catch {\n // Consumer app must set workerSrc manually (documented in sd-preview.md).\n }\n return pdfjsLib as unknown as SdPdfJsLib;\n },\n});\n\n// Minimal local typing to avoid leaking pdfjs types from our public surface.\n// We only use a small subset of PDFDocumentProxy / PDFPageProxy / RenderTask.\ninterface PdfRenderTask {\n promise: Promise<void>;\n cancel: () => void;\n}\ninterface PdfViewport {\n width: number;\n height: number;\n}\n// pdfjs TextContent.items is heterogeneous (text + marked-content markers);\n// we narrow to the text-bearing entries we actually use for search.\ninterface PdfTextItem {\n str: string;\n}\ninterface PdfTextContent {\n items: (PdfTextItem | unknown)[];\n}\ninterface PdfPageProxy {\n getViewport(p: { scale: number; rotation?: number }): PdfViewport;\n render(p: { canvasContext: CanvasRenderingContext2D; viewport: PdfViewport }): PdfRenderTask;\n getTextContent(): Promise<PdfTextContent | unknown>;\n cleanup(): void;\n}\ninterface PdfDocumentProxy {\n numPages: number;\n getPage(n: number): Promise<PdfPageProxy>;\n getMetadata(): Promise<{\n info?: { Title?: string; Author?: string; Subject?: string };\n }>;\n destroy(): Promise<void>;\n}\n\n@Component({\n selector: 'sd-preview-pdf',\n standalone: true,\n imports: [SdIcon, CommonModule, FormsModule, TranslatePipe],\n templateUrl: './preview-pdf.component.html',\n styleUrl: './preview-pdf.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n // mà không cần bind document. Mirror the preview-image pattern — consumer\n // (modal/drawer/page) chỉ cần thả component vào DOM.\n host: {\n tabindex: '0',\n class: 'sd-preview-pdf-host',\n // WHY data-theme attribute: SCSS uses :host([data-theme=\"light\"]) to swap\n // CSS custom properties — declarative, devtools-visible, no class-name\n // collision with consumer styling.\n '[attr.data-theme]': 'theme()',\n '[class.sd-preview-pdf-host--fullscreen]': 'isFullscreen()',\n },\n})\nexport class SdPreviewPdf implements OnDestroy {\n // ==========================================\n // CONSTANTS\n // ==========================================\n // Dải zoom hữu dụng cho viewer PDF. Dưới 25% chữ thành chấm, trên 400% là\n // raster bị pixelated nặng (canvas + DPR vẫn có giới hạn). Trùng dải của\n // preview-image để consumer làm quen với 1 spec duy nhất.\n static readonly MIN_ZOOM = 0.25;\n static readonly MAX_ZOOM = 4;\n static readonly ZOOM_STEP = 0.1;\n\n // ==========================================\n // DI\n // ==========================================\n readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #destroyRef = inject(DestroyRef);\n readonly #pdfjs = inject(SD_PDFJS_LIB);\n\n // ==========================================\n // VIEW CHILDREN\n // WHY `protected readonly` (not `#private`): Angular's `viewChild()` query\n // function emits a decorator-equivalent metadata that the compiler can't\n // see through ES private fields (NG1053). `protected` keeps them invisible\n // to consumers but accessible to the template.\n // ==========================================\n protected readonly pageCanvasRef = viewChild<ElementRef<HTMLCanvasElement>>('pageCanvas');\n protected readonly stageEl = viewChild<ElementRef<HTMLElement>>('stageRef');\n protected readonly pageInputRef = viewChild<ElementRef<HTMLInputElement>>('pageInput');\n protected readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n // Every thumbnail <canvas> in the sidebar — populated when sidebar is open +\n // mode==='thumbnails'. We feed these to the IntersectionObserver below so a\n // thumb only renders when it scrolls into the viewport (lazy fill).\n protected readonly thumbCanvases = viewChildren<ElementRef<HTMLCanvasElement>>('thumbCanvas');\n\n // ==========================================\n // INPUTS (signal-based, Angular 19 style)\n // ==========================================\n // autoId prefix `preview-pdf-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-pdf-${this.autoIdInput()}` : undefined));\n\n readonly #childAutoId = (suffix: string): string | undefined => {\n return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n };\n\n // Page navigation\n readonly autoIdFirst = computed(() => this.#childAutoId('first'));\n readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n readonly autoIdNext = computed(() => this.#childAutoId('next'));\n readonly autoIdLast = computed(() => this.#childAutoId('last'));\n readonly autoIdPageInput = computed(() => this.#childAutoId('page-input'));\n // Zoom\n readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n readonly autoIdZoomReadout = computed(() => this.#childAutoId('zoom-readout'));\n // Modes\n readonly autoIdFitPage = computed(() => this.#childAutoId('fit-page'));\n readonly autoIdFitWidth = computed(() => this.#childAutoId('fit-width'));\n readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n readonly autoIdScrollMode = computed(() => this.#childAutoId('scroll-mode'));\n // Header actions\n readonly autoIdSearchToggle = computed(() => this.#childAutoId('search'));\n readonly autoIdPrint = computed(() => this.#childAutoId('print'));\n readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n readonly autoIdSidebarToggle = computed(() => this.#childAutoId('sidebar-toggle'));\n // Sidebar tabs\n readonly autoIdTabThumbnails = computed(() => this.#childAutoId('tab-thumbnails'));\n readonly autoIdTabOutline = computed(() => this.#childAutoId('tab-outline'));\n readonly autoIdTabSearch = computed(() => this.#childAutoId('tab-search'));\n // Search bar\n readonly autoIdSearchInput = computed(() => this.#childAutoId('search-input'));\n readonly autoIdSearchNext = computed(() => this.#childAutoId('search-next'));\n readonly autoIdSearchPrev = computed(() => this.#childAutoId('search-prev'));\n readonly autoIdSearchCase = computed(() => this.#childAutoId('search-case'));\n readonly autoIdSearchWhole = computed(() => this.#childAutoId('search-whole'));\n readonly autoIdSearchClose = computed(() => this.#childAutoId('search-close'));\n // Retry (error state)\n readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n // Per-index helpers (thumb + search result)\n readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n readonly autoIdResult = (i: number): string | undefined => this.#childAutoId(`result-${i}`);\n\n readonly source = input<PdfSource | null>(null);\n readonly title = input<string | undefined>(undefined);\n readonly startPage = input(1);\n readonly initialZoom = input<PdfZoomMode>('page-fit');\n readonly sidebar = input<PdfSidebarMode>('thumbnails');\n readonly sidebarOpen = input(true);\n readonly scrollMode = input<PdfScrollMode>('page');\n readonly showToolbar = input(true);\n readonly downloadable = input(true);\n readonly password = input<string | undefined>(undefined);\n readonly httpHeaders = input<Record<string, string> | undefined>(undefined);\n // Theme variant — drives [data-theme] host attribute. Default 'dark'\n // preserves the original visual contract; 'light' flips token set via SCSS.\n readonly theme = input<PreviewTheme>('dark');\n\n // ==========================================\n // OUTPUTS\n // ==========================================\n readonly close = output<void>();\n readonly loaded = output<PdfLoadEvent>();\n readonly pageChange = output<number>();\n readonly zoomChange = output<number>();\n readonly download = output<{ filename: string }>();\n readonly loadError = output<PdfErrorEvent>();\n // Fired whenever the search term, results, or active index changes — gives\n // the consumer a stable hook for analytics / sticky highlight bars without\n // poking at the internal state signal.\n readonly searchChange = output<{ term: string; total: number; current: number }>();\n\n // ==========================================\n // STATE (signals)\n // ==========================================\n readonly #stage = signal<PdfStage>('empty');\n readonly #pdfDoc = signal<PdfDocumentProxy | null>(null);\n readonly #meta = signal<PdfMeta | null>(null);\n readonly #activePage = signal(1);\n readonly #zoom = signal(1);\n readonly #zoomMode = signal<PdfZoomMode>('page-fit');\n readonly #rotation = signal(0);\n readonly #sidebarOpenInternal = signal(true);\n readonly #sidebarModeInternal = signal<PdfSidebarMode>('thumbnails');\n readonly #scrollModeInternal = signal<PdfScrollMode>('page');\n readonly #loadProgress = signal({ loaded: 0, total: 0 });\n readonly #loadError = signal<PdfErrorEvent | null>(null);\n readonly #isFullscreen = signal(false);\n readonly #filename = signal('document.pdf');\n readonly #fileSize = signal(0);\n\n // Thumbnail cache: page number → data URL of mini-render. Lazy-populated as\n // the user opens the sidebar / scrolls thumbnails into view.\n readonly #thumbCache = signal<Record<number, string>>({});\n\n // ==========================================\n // SEARCH STATE\n // ==========================================\n // Whether the search bar (between header + body) is visible. Toggled via\n // Ctrl+F, the sidebar tab, or `openSearch()` / `closeSearch()`. Independent\n // from the sidebar's `'search'` tab — the bar can stay open with the\n // sidebar closed (Ctrl+F flow), and the tab can be open without the bar.\n readonly #searchBarOpen = signal(false);\n // Persisted across `clearSearch()` so user toggles don't reset on each new\n // term — mirrors Acrobat / Chrome's \"Find in page\" behaviour.\n readonly #searchCaseSensitive = signal(false);\n readonly #searchWholeWord = signal(false);\n readonly #searchTerm = signal('');\n readonly #searchResults = signal<PdfSearchResult[]>([]);\n // -1 sentinel means \"no result focused yet\" (e.g. right after clearSearch\n // or before the first searchNext). Highlight rendering uses this to skip\n // the `--active` class altogether.\n readonly #searchActiveIndex = signal(-1);\n // Page-text cache: pageNum → fully-joined plain text. We pay the\n // `getTextContent()` cost once per page per document, then reuse across\n // re-runs (e.g. toggling case-sensitive). Cleared on every source change.\n readonly #pageTextCache = new Map<number, string>();\n // Token to abort an in-flight `search()` call when a newer one supersedes it\n // — same pattern as #loadToken / #renderToken upstream.\n #searchToken = 0;\n // The IntersectionObserver instance that drives lazy thumb rendering. Lives\n // for the component's lifetime; we just rebind to the latest canvas refs\n // when the sidebar tab switches.\n #thumbObserver: IntersectionObserver | null = null;\n // Pages currently being rendered as thumbs — guards against double work\n // when a thumb scrolls in/out/in rapidly.\n readonly #thumbsRendering = new Set<number>();\n\n // Cached resolved source object that getDocument actually consumed — used\n // for download fallback when caller passed a non-URL source.\n #lastBlobUrl: string | null = null;\n // Track ALL blob URLs we created so we can revoke on source change + destroy.\n readonly #ownedBlobUrls = new Set<string>();\n\n // Race guards mirror preview-image's #loadToken pattern.\n #loadToken = 0;\n #currentRenderTask: PdfRenderTask | null = null;\n #renderToken = 0;\n\n // ==========================================\n // COMPUTED (template-readable)\n // ==========================================\n readonly stage = this.#stage.asReadonly();\n readonly activePage = this.#activePage.asReadonly();\n readonly zoom = this.#zoom.asReadonly();\n readonly zoomMode = this.#zoomMode.asReadonly();\n readonly rotation = this.#rotation.asReadonly();\n readonly sidebarMode = this.#sidebarModeInternal.asReadonly();\n readonly scrollModeCurrent = this.#scrollModeInternal.asReadonly();\n readonly isFullscreen = this.#isFullscreen.asReadonly();\n readonly meta = this.#meta.asReadonly();\n readonly filename = this.#filename.asReadonly();\n readonly fileSize = this.#fileSize.asReadonly();\n readonly loadError$ = this.#loadError.asReadonly();\n readonly thumbCache = this.#thumbCache.asReadonly();\n\n readonly numPages = computed(() => this.#meta()?.numPages ?? 0);\n readonly canPrev = computed(() => this.#activePage() > 1);\n readonly canNext = computed(() => {\n const n = this.numPages();\n return n > 0 && this.#activePage() < n;\n });\n readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n readonly loadPercent = computed(() => {\n const p = this.#loadProgress();\n if (p.total <= 0) return 0;\n return Math.min(100, Math.round((p.loaded / p.total) * 100));\n });\n readonly isSidebarOpen = computed(() => this.#sidebarOpenInternal() && this.#sidebarModeInternal() !== 'none');\n readonly pageList = computed(() => {\n const n = this.numPages();\n return n > 0 ? Array.from({ length: n }, (_, i) => i + 1) : [];\n });\n // Alias used by the template's thumbnail @for — keeps the JSX-y `pageNumbers`\n // name from the design handoff while reusing the same computed.\n readonly pageNumbers = this.pageList;\n\n // Search readonly accessors for the template + tests. Read-only by design;\n // mutations go through `search()` / `searchNext()` etc.\n readonly searchBarOpen = this.#searchBarOpen.asReadonly();\n readonly searchTerm = this.#searchTerm.asReadonly();\n readonly searchResults = this.#searchResults.asReadonly();\n readonly searchActiveIndex = this.#searchActiveIndex.asReadonly();\n readonly searchCaseSensitive = this.#searchCaseSensitive.asReadonly();\n readonly searchWholeWord = this.#searchWholeWord.asReadonly();\n readonly searchTotal = computed(() => this.#searchResults().length);\n // 1-based \"X of N\" indicator for the search bar counter. Reads 0 when\n // there are no results so the template can hide / dim the counter.\n readonly searchCurrent = computed(() => {\n const idx = this.#searchActiveIndex();\n return idx < 0 ? 0 : idx + 1;\n });\n // Currently-active hit (or null when nothing is focused) — drives the\n // in-page `<mark class=\"--active\">` highlight + auto-scroll effect below.\n readonly searchActiveResult = computed<PdfSearchResult | null>(() => {\n const idx = this.#searchActiveIndex();\n const results = this.#searchResults();\n return idx >= 0 && idx < results.length ? results[idx] : null;\n });\n // Snapshot of the full search state — handed to consumer via\n // `getSearchState()` for parity with `searchChange` event shape.\n readonly searchState = computed<PdfSearchState>(() => ({\n term: this.#searchTerm(),\n caseSensitive: this.#searchCaseSensitive(),\n wholeWord: this.#searchWholeWord(),\n results: this.#searchResults(),\n activeIndex: this.#searchActiveIndex(),\n }));\n\n // ==========================================\n // CONSTRUCTOR — declarative wiring\n // ==========================================\n constructor() {\n // Initialize internal mirrors from inputs once. WHY mirrors: user actions\n // (toggleSidebar / setSidebarMode / setZoom) must modify state that the\n // template reads; signal inputs are read-only.\n effect(() => {\n this.#sidebarOpenInternal.set(this.sidebarOpen());\n });\n effect(() => {\n const m = this.sidebar();\n // 'outline' + 'search' are deferred — selecting them through the input\n // is allowed (we still toggle the tab UI) but the body shows the deferred\n // placeholder. Don't force-fallback to 'thumbnails' so the input value\n // is honored visibly.\n this.#sidebarModeInternal.set(m);\n });\n effect(() => {\n const m = this.scrollMode();\n // Continuous scroll is deferred — warn once if requested but keep the\n // input value so consumer code is forward-compatible.\n if (m === 'continuous') {\n console.warn(\n '[sd-preview-pdf] scrollMode=\"continuous\" is deferred; falling back to single-page rendering.' // @i18n-ignore\n );\n }\n this.#scrollModeInternal.set(m);\n });\n effect(() => {\n // Reset zoom mode when initialZoom input changes — only fires when the\n // input itself updates (not when user clicks zoom +/-).\n this.#zoomMode.set(this.initialZoom());\n });\n\n // Sync fullscreen state from the browser (works with Esc, F11, programmatic exit).\n const onFullscreenChange = () => {\n this.#isFullscreen.set(document.fullscreenElement === this.#hostEl.nativeElement);\n };\n document.addEventListener('fullscreenchange', onFullscreenChange);\n this.#destroyRef.onDestroy(() => {\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n\n // React to source changes — destroy previous doc, load new one.\n // WHY untracked-via-queueMicrotask: `effect()` tracks every signal READ\n // sync-ly inside the callback. `#loadDocument` reads internal signals\n // (#pdfDoc via #destroyDoc, plus #zoom on the cleanup path). Letting the\n // effect track those would re-fire whenever we updated them inside the\n // load flow → infinite loop. Reading only `source()` here and deferring\n // the actual load to a microtask scopes the tracking to ONLY `source()`.\n effect(() => {\n const src = this.source();\n queueMicrotask(() => this.#loadDocument(src));\n });\n\n // Auto-focus host after first render so keyboard works immediately.\n afterNextRender(() => {\n try {\n this.#hostEl.nativeElement.focus({ preventScroll: true });\n } catch {\n // ignore — focus() can throw on detached elements.\n }\n });\n\n // Drive lazy thumbnail rendering — every time the list of thumbnail\n // <canvas> refs changes (sidebar opens, mode flips, doc reloads) we\n // disconnect any prior observer and start watching the new set.\n // WHY effect (not afterNextRender): viewChildren() emits a signal that\n // updates whenever the template's @for collection mutates.\n effect(() => {\n const refs = this.thumbCanvases();\n this.#syncThumbObserver(refs.map(r => r.nativeElement));\n });\n\n // Re-apply highlights when the rendered page changes OR when the search\n // term / active hit changes. WHY a separate effect: text-layer overlay\n // doesn't exist in this commit, so we hook the page canvas wrapper and\n // sprinkle `<mark>` siblings via DOM. Effect re-runs are cheap; the\n // helper is a no-op when there's nothing to highlight.\n effect(() => {\n // Track these signals so the effect re-fires:\n this.#searchTerm();\n this.#searchActiveIndex();\n this.activePage();\n // Defer to a microtask so the canvas render finished writing — keeps\n // us out of the page render's await chain.\n queueMicrotask(() => this.#applyHighlightsForActivePage());\n });\n\n // Cleanup on destroy.\n this.#destroyRef.onDestroy(() => {\n this.#cancelRender();\n this.#destroyDoc();\n this.#revokeAllBlobs();\n this.#thumbObserver?.disconnect();\n this.#thumbObserver = null;\n this.#thumbsRendering.clear();\n this.#pageTextCache.clear();\n if (document.fullscreenElement === this.#hostEl.nativeElement) {\n document.exitFullscreen?.().catch(() => undefined);\n }\n });\n }\n\n ngOnDestroy(): void {\n // Cleanup logic dời vào DestroyRef.onDestroy ở constructor — giữ hook để\n // tương thích với `implements OnDestroy` (giúp test code `spyOn(comp, 'ngOnDestroy')`).\n }\n\n // ==========================================\n // PUBLIC API\n // ==========================================\n\n goToPage(page: number): void {\n const n = this.numPages();\n if (n <= 0) return;\n const target = Math.max(1, Math.min(page, n));\n if (target === this.#activePage()) return;\n this.#activePage.set(target);\n this.pageChange.emit(target);\n this.#renderActivePage();\n }\n\n nextPage(): void {\n this.goToPage(this.#activePage() + 1);\n }\n prevPage(): void {\n this.goToPage(this.#activePage() - 1);\n }\n firstPage(): void {\n this.goToPage(1);\n }\n lastPage(): void {\n this.goToPage(this.numPages());\n }\n\n zoomIn(): void {\n this.#zoomMode.set(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n this.#setZoom(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n }\n\n zoomOut(): void {\n this.#zoomMode.set(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n this.#setZoom(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n }\n\n setZoom(mode: PdfZoomMode): void {\n this.#zoomMode.set(mode);\n if (typeof mode === 'number') {\n this.#setZoom(mode);\n } else {\n // Fit modes recompute against stage size + page natural size — done in\n // #renderActivePage which reads zoomMode().\n this.#renderActivePage();\n }\n }\n\n rotate(direction: 'left' | 'right'): void {\n const delta = direction === 'right' ? 90 : -90;\n this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n this.#renderActivePage();\n }\n\n toggleSidebar(): void {\n this.#sidebarOpenInternal.update(v => !v);\n }\n\n setSidebarMode(mode: PdfSidebarMode): void {\n this.#sidebarModeInternal.set(mode);\n if (mode !== 'none' && !this.#sidebarOpenInternal()) {\n this.#sidebarOpenInternal.set(true);\n }\n // Selecting the 'search' tab implicitly opens the search bar so the user\n // can start typing right away — matches Acrobat's flyout behaviour.\n if (mode === 'search') {\n this.openSearch();\n }\n }\n\n // TODO(preview-pdf): setScrollMode is signature-only; continuous + horizontal\n // layout deferred. Currently this just updates internal state + emits a\n // warning when consumer asks for the deferred 'continuous' mode.\n setScrollMode(mode: PdfScrollMode): void {\n if (mode === 'continuous') {\n console.warn(\n '[sd-preview-pdf] setScrollMode(\"continuous\") is deferred; staying in single-page mode.' // @i18n-ignore\n );\n }\n this.#scrollModeInternal.set(mode);\n }\n\n downloadFile(): void {\n if (!this.downloadable()) return;\n const src = this.source();\n const filename = this.#filename();\n\n // Strategy: if caller passed a URL, anchor download honors server's\n // Content-Disposition; for File/Blob/buffer sources we re-emit the blob.\n let href: string | null = null;\n if (typeof src === 'string') {\n href = src;\n } else if (src instanceof File || src instanceof Blob) {\n href = URL.createObjectURL(src);\n this.#ownedBlobUrls.add(href);\n } else if (this.#lastBlobUrl) {\n href = this.#lastBlobUrl;\n } else if (src && typeof src === 'object' && 'url' in src && typeof src.url === 'string') {\n href = src.url;\n } else if (src instanceof ArrayBuffer || src instanceof Uint8Array) {\n const blob = new Blob([src as BlobPart], { type: 'application/pdf' });\n href = URL.createObjectURL(blob);\n this.#ownedBlobUrls.add(href);\n }\n\n if (!href) return;\n const a = document.createElement('a');\n a.href = href;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n this.download.emit({ filename });\n }\n\n toggleFullscreen(): void {\n if (!document.fullscreenElement) {\n this.#hostEl.nativeElement.requestFullscreen?.().catch(() => undefined);\n } else {\n document.exitFullscreen?.().catch(() => undefined);\n }\n }\n\n /** Programmatic equivalent of clicking the X — emits the close output. */\n requestClose(): void {\n this.close.emit();\n }\n\n /** Retry the active load attempt (called from the error state retry button). */\n retryLoad(): void {\n this.#loadDocument(this.source());\n }\n\n // TODO(preview-pdf): printFile + scroll-mode continuous remain deferred.\n // Search is now implemented below.\n printFile(): void {\n console.warn(\n '[sd-preview-pdf] printFile() is deferred to a follow-up commit.' // @i18n-ignore\n );\n }\n\n /**\n * Run a full-document search for `term`. Returns the result count.\n *\n * Options:\n * - `caseSensitive`: default off; matches independent of capitalisation.\n * - `wholeWord`: default off; requires Unicode word-boundary on both sides\n * so `cat` does NOT match `category` (uses `/\\b...\\b/u` so Vietnamese\n * diacritic-bearing letters still participate as word characters).\n *\n * Implementation: iterate every page once (cached), build a flat plain-text\n * string per page (joining textItem.str), and slice ~30 chars of context\n * around each match. We deliberately use plain JS regex rather than\n * pdf.js's `pdfFindController` — it's <40 lines, fully testable, and\n * sidesteps the find-controller's dependency on a real text layer (which\n * we don't render).\n */\n async search(term: string, options?: { caseSensitive?: boolean; wholeWord?: boolean }): Promise<number> {\n const token = ++this.#searchToken;\n const cleanTerm = (term ?? '').trim();\n if (options?.caseSensitive !== undefined) {\n this.#searchCaseSensitive.set(options.caseSensitive);\n }\n if (options?.wholeWord !== undefined) {\n this.#searchWholeWord.set(options.wholeWord);\n }\n this.#searchTerm.set(cleanTerm);\n\n if (!cleanTerm) {\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n const doc = this.#pdfDoc();\n if (!doc) {\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n const re = this.#buildSearchRegex(cleanTerm, this.#searchCaseSensitive(), this.#searchWholeWord());\n if (!re) {\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n const results: PdfSearchResult[] = [];\n for (let p = 1; p <= doc.numPages; p++) {\n if (token !== this.#searchToken) return 0; // newer search superseded us\n const text = await this.#getPageText(doc, p);\n if (token !== this.#searchToken) return 0;\n // re is /g — must be re-created or `lastIndex` reset between pages.\n re.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n const start = m.index;\n const matched = m[0];\n const end = start + matched.length;\n const before = text.slice(Math.max(0, start - 30), start);\n const after = text.slice(end, end + 30);\n results.push({ page: p, before, term: matched, after });\n // Defensive: zero-length match would loop forever.\n if (matched.length === 0) re.lastIndex++;\n }\n }\n\n if (token !== this.#searchToken) return 0;\n this.#searchResults.set(results);\n // Activate the first result so the user sees something immediately;\n // tests can assert this via `searchActiveIndex()`. Skip when empty.\n this.#searchActiveIndex.set(results.length > 0 ? 0 : -1);\n if (results.length > 0) {\n // Auto-jump to the first hit's page.\n this.goToPage(results[0].page);\n }\n this.#emitSearchChange();\n return results.length;\n }\n\n searchNext(): void {\n const results = this.#searchResults();\n if (results.length === 0) return;\n const next = (this.#searchActiveIndex() + 1) % results.length;\n this.#searchActiveIndex.set(next);\n this.goToPage(results[next].page);\n this.#emitSearchChange();\n }\n\n searchPrev(): void {\n const results = this.#searchResults();\n if (results.length === 0) return;\n const cur = this.#searchActiveIndex();\n const prev = cur <= 0 ? results.length - 1 : cur - 1;\n this.#searchActiveIndex.set(prev);\n this.goToPage(results[prev].page);\n this.#emitSearchChange();\n }\n\n clearSearch(): void {\n this.#searchToken++;\n this.#searchTerm.set('');\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n }\n\n /** Open the search bar and focus its input. Idempotent. */\n openSearch(): void {\n this.#searchBarOpen.set(true);\n // Defer focus a tick so the *ngIf-rendered input exists in the DOM.\n queueMicrotask(() => {\n this.searchInputRef()?.nativeElement?.focus();\n this.searchInputRef()?.nativeElement?.select();\n });\n }\n\n /** Close the search bar AND clear results (mirrors Acrobat behaviour). */\n closeSearch(): void {\n this.#searchBarOpen.set(false);\n this.clearSearch();\n }\n\n toggleSearchCaseSensitive(): void {\n this.#searchCaseSensitive.update(v => !v);\n // Re-run with the persisted term so the result set reflects the new flag.\n if (this.#searchTerm()) {\n void this.search(this.#searchTerm());\n }\n }\n\n toggleSearchWholeWord(): void {\n this.#searchWholeWord.update(v => !v);\n if (this.#searchTerm()) {\n void this.search(this.#searchTerm());\n }\n }\n\n /** Live binding from the search bar's `(input)` event. */\n onSearchInput(value: string): void {\n void this.search(value);\n }\n\n // ==========================================\n // KEYBOARD — bound to HOST (not document)\n // ==========================================\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const isSearchInput = !!target && target === this.searchInputRef()?.nativeElement;\n const isOtherEditable =\n !!target && !isSearchInput && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable);\n\n // Ctrl/Cmd+F: open the search bar from anywhere (even when input has\n // focus, e.g. re-focus the search bar from the page input). Handled\n // before the input-target guard so it always works.\n if ((event.ctrlKey || event.metaKey) && (event.key === 'f' || event.key === 'F')) {\n event.preventDefault();\n this.openSearch();\n return;\n }\n\n // Keys while the search input is focused: Enter / Shift+Enter, F3 / Shift+F3\n // cycle results; Esc closes the bar. Everything else (typing) passes through.\n if (isSearchInput) {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeSearch();\n // Re-focus the host so subsequent shortcuts work without a click.\n this.#hostEl.nativeElement.focus();\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n if (event.key === 'F3') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n return; // typing → let it pass through\n }\n\n // Other editable targets (page-number input etc.) shouldn't trigger\n // viewer shortcuts — but Esc should still close an open search bar.\n if (isOtherEditable) {\n if (event.key === 'Escape' && this.#searchBarOpen()) {\n event.preventDefault();\n this.closeSearch();\n }\n return;\n }\n\n // F3 outside the search input still cycles results (matches browser\n // Find-in-page convention). Only meaningful when the bar is open OR\n // there are stale results — we keep it ungated for parity.\n if (event.key === 'F3') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'PageUp':\n event.preventDefault();\n this.prevPage();\n break;\n case 'ArrowRight':\n case 'PageDown':\n event.preventDefault();\n this.nextPage();\n break;\n case 'Home':\n event.preventDefault();\n this.firstPage();\n break;\n case 'End':\n event.preventDefault();\n this.lastPage();\n break;\n case '+':\n case '=':\n event.preventDefault();\n this.zoomIn();\n break;\n case '-':\n event.preventDefault();\n this.zoomOut();\n break;\n case '0':\n event.preventDefault();\n this.setZoom('page-fit');\n break;\n case 'r':\n event.preventDefault();\n this.rotate('right');\n break;\n case 'R':\n event.preventDefault();\n this.rotate('left');\n break;\n case 'f':\n event.preventDefault();\n this.toggleFullscreen();\n break;\n case 'Escape':\n // Esc closes the search bar (when open). NEVER emits `close` on the\n // component — that remains the consumer's responsibility per the\n // standalone-embed pattern.\n if (this.#searchBarOpen()) {\n event.preventDefault();\n this.closeSearch();\n }\n break;\n default:\n break;\n }\n }\n\n // ==========================================\n // TEMPLATE HANDLERS\n // ==========================================\n\n onPageInputEnter(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n if (Number.isFinite(value)) {\n this.goToPage(value);\n }\n // Snap input back to the actual current page after clamping.\n input.value = String(this.#activePage());\n }\n\n onPageInputBlur(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = String(this.#activePage());\n }\n\n onWheel(event: WheelEvent): void {\n // Ctrl/Cmd + wheel = zoom (mirrors PDF readers + most image viewers).\n // Plain wheel = let browser scroll the stage (especially when zoomed in).\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const factor = event.deltaY < 0 ? 1 + SdPreviewPdf.ZOOM_STEP : 1 - SdPreviewPdf.ZOOM_STEP;\n this.#zoomMode.set(this.#zoom() * factor);\n this.#setZoom(this.#zoom() * factor);\n }\n }\n\n trackByPage(_i: number, page: number): number {\n return page;\n }\n\n // ==========================================\n // INTERNALS\n // ==========================================\n\n async #loadDocument(src: PdfSource | null | undefined): Promise<void> {\n const token = ++this.#loadToken;\n this.#cancelRender();\n await this.#destroyDoc();\n this.#revokeAllBlobs();\n this.#thumbCache.set({});\n this.#pageTextCache.clear();\n this.#thumbsRendering.clear();\n // Reset search state — results are per-document, but keep the term so a\n // newly-loaded source with the same term gets re-indexed automatically\n // on the next user keystroke. Active index resets unconditionally.\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#loadError.set(null);\n this.#loadProgress.set({ loaded: 0, total: 0 });\n\n if (!src) {\n this.#stage.set('empty');\n this.#pdfDoc.set(null);\n this.#meta.set(null);\n this.#activePage.set(1);\n return;\n }\n\n this.#stage.set('loading');\n\n let spec: Record<string, unknown>;\n try {\n spec = await this.#normalizeSource(src);\n } catch (err) {\n if (token !== this.#loadToken) return;\n this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n if (this.password()) {\n spec['password'] = this.password();\n }\n\n let task: { promise: Promise<unknown>; onProgress?: (p: { loaded: number; total: number }) => void };\n try {\n task = this.#pdfjs.getDocument(spec) as unknown as typeof task;\n // pdfjs's loadingTask exposes onProgress as an assignable property.\n task.onProgress = (p: { loaded: number; total: number }) => {\n if (token !== this.#loadToken) return;\n this.#loadProgress.set({ loaded: p.loaded ?? 0, total: p.total ?? 0 });\n };\n } catch (err) {\n this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n\n let pdfDoc: PdfDocumentProxy;\n try {\n pdfDoc = (await task.promise) as PdfDocumentProxy;\n } catch (err) {\n if (token !== this.#loadToken) return;\n this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n if (token !== this.#loadToken) {\n // A newer source replaced us mid-load. Cleanup this stale doc.\n try {\n await pdfDoc.destroy();\n } catch {\n /* ignore */\n }\n return;\n }\n\n let meta: PdfMeta;\n try {\n const m = await pdfDoc.getMetadata();\n const info = m?.info ?? {};\n meta = {\n title: info.Title,\n author: info.Author,\n subject: info.Subject,\n numPages: pdfDoc.numPages,\n };\n } catch {\n meta = { numPages: pdfDoc.numPages };\n }\n\n this.#pdfDoc.set(pdfDoc);\n this.#meta.set(meta);\n this.#activePage.set(Math.max(1, Math.min(this.startPage(), pdfDoc.numPages)));\n this.#stage.set('ready');\n this.#zoom.set(1);\n this.#rotation.set(0);\n this.#zoomMode.set(this.initialZoom());\n\n this.loaded.emit({ totalPages: pdfDoc.numPages, meta });\n this.pageChange.emit(this.#activePage());\n\n await this.#renderActivePage();\n }\n\n async #renderActivePage(): Promise<void> {\n const pdfDoc = this.#pdfDoc();\n if (!pdfDoc) return;\n const token = ++this.#renderToken;\n const pageNum = this.#activePage();\n let page: PdfPageProxy;\n try {\n page = await pdfDoc.getPage(pageNum);\n } catch {\n return;\n }\n if (token !== this.#renderToken) return;\n\n const canvas = this.pageCanvasRef()?.nativeElement;\n if (!canvas) return;\n\n // Resolve scale from current zoom mode.\n const rotation = this.#rotation();\n const baseViewport = page.getViewport({ scale: 1, rotation });\n const scale = this.#resolveScale(baseViewport);\n this.#zoom.set(scale);\n const viewport = page.getViewport({ scale, rotation });\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n this.#cancelRender();\n const renderTask = page.render({ canvasContext: ctx, viewport });\n this.#currentRenderTask = renderTask;\n try {\n await renderTask.promise;\n } catch {\n // Cancelled mid-flight when user navigated to a new page — fine.\n return;\n } finally {\n if (this.#currentRenderTask === renderTask) {\n this.#currentRenderTask = null;\n }\n }\n\n page.cleanup();\n this.zoomChange.emit(scale);\n }\n\n #resolveScale(baseViewport: PdfViewport): number {\n const mode = this.#zoomMode();\n if (typeof mode === 'number') {\n return Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, mode));\n }\n if (mode === 'page-actual') return 1;\n const stage = this.stageEl()?.nativeElement;\n if (!stage) return 1;\n const stageRect = stage.getBoundingClientRect();\n // 32px horizontal + 96px bottom padding lives in the SCSS — subtract it so\n // the page fits without overlapping the floating toolbar.\n const availW = Math.max(80, stageRect.width - 48);\n const availH = Math.max(80, stageRect.height - 120);\n if (mode === 'page-width') {\n return availW / baseViewport.width;\n }\n // page-fit\n return Math.min(availW / baseViewport.width, availH / baseViewport.height);\n }\n\n #cancelRender(): void {\n if (this.#currentRenderTask) {\n try {\n this.#currentRenderTask.cancel();\n } catch {\n /* ignore */\n }\n this.#currentRenderTask = null;\n }\n }\n\n async #destroyDoc(): Promise<void> {\n const doc = this.#pdfDoc();\n if (!doc) return;\n this.#pdfDoc.set(null);\n try {\n await doc.destroy();\n } catch {\n /* ignore */\n }\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, value));\n this.#zoom.set(clamped);\n this.#renderActivePage();\n }\n\n async #normalizeSource(src: PdfSource): Promise<Record<string, unknown>> {\n if (typeof src === 'string') {\n this.#filename.set(this.#guessName(src));\n const headers = this.httpHeaders();\n const spec: Record<string, unknown> = { url: src };\n if (headers) spec['httpHeaders'] = headers;\n return spec;\n }\n if (src instanceof File) {\n this.#filename.set(src.name);\n this.#fileSize.set(src.size);\n const buf = await src.arrayBuffer();\n return { data: new Uint8Array(buf) };\n }\n if (src instanceof Blob) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.size);\n const buf = await src.arrayBuffer();\n return { data: new Uint8Array(buf) };\n }\n if (src instanceof ArrayBuffer) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.byteLength);\n return { data: new Uint8Array(src) };\n }\n if (src instanceof Uint8Array) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.byteLength);\n return { data: src };\n }\n if (src && typeof src === 'object') {\n if ('url' in src && typeof src.url === 'string') {\n this.#filename.set(this.#guessName(src.url));\n const spec: Record<string, unknown> = { url: src.url };\n // Caller-provided headers win over the [httpHeaders] input.\n const headers = src.httpHeaders ?? this.httpHeaders();\n if (headers) spec['httpHeaders'] = headers;\n if (src.withCredentials) spec['withCredentials'] = true;\n return spec;\n }\n if ('data' in src && (src.data instanceof ArrayBuffer || src.data instanceof Uint8Array)) {\n this.#filename.set('document.pdf');\n const data = src.data instanceof ArrayBuffer ? new Uint8Array(src.data) : src.data;\n this.#fileSize.set(data.byteLength);\n return { data };\n }\n }\n throw new Error('Unsupported PDF source');\n }\n\n #guessName(url: string): string {\n const path = url.split('?')[0];\n const last = path.substring(path.lastIndexOf('/') + 1);\n return last || 'document.pdf';\n }\n\n /** Map any thrown value into a {reason} we can render. */\n #classifyError(err: unknown): PdfErrorReason {\n if (!err) return 'unknown';\n // pdfjs throws named exception classes — we sniff by name to avoid\n // importing the constructors (keeps the bundle smaller).\n const name = (err as { name?: string }).name;\n if (name === 'PasswordException') return 'password';\n if (name === 'InvalidPDFException') return 'invalid';\n if (name === 'MissingPDFException' || name === 'UnexpectedResponseException') {\n return 'network';\n }\n if (err instanceof Error && /network|fetch|cors/i.test(err.message)) {\n return 'network';\n }\n return 'unknown';\n }\n\n #errorMessage(err: unknown): string | undefined {\n if (err instanceof Error) return err.message;\n return undefined;\n }\n\n #emitError(reason: PdfErrorReason, message?: string): void {\n const ev: PdfErrorEvent = { reason, message };\n this.#loadError.set(ev);\n this.#stage.set('error');\n this.loadError.emit(ev);\n }\n\n #revokeAllBlobs(): void {\n for (const url of this.#ownedBlobUrls) {\n URL.revokeObjectURL(url);\n }\n this.#ownedBlobUrls.clear();\n this.#lastBlobUrl = null;\n }\n\n // ==========================================\n // SEARCH HELPERS\n // ==========================================\n\n /**\n * Build the search regex. We escape every metachar so the term is matched\n * literally (so `foo.bar` doesn't treat `.` as \"any char\"). Unicode flag\n * `u` makes `\\b` understand Vietnamese diacritic-bearing letters as word\n * characters — without it `\\b` would split `đ` at the d, breaking\n * whole-word matches on Vietnamese terms.\n */\n #buildSearchRegex(term: string, caseSensitive: boolean, wholeWord: boolean): RegExp | null {\n if (!term) return null;\n const escaped = term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const flags = (caseSensitive ? 'g' : 'gi') + 'u';\n const pattern = wholeWord ? `\\\\b${escaped}\\\\b` : escaped;\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch (and cache) the plain text of a single page. We normalize to NFC\n * so the same Vietnamese letter encoded as composed vs decomposed sequences\n * (NFD) matches the same search term — pdfjs has been seen to return NFD\n * in some PDFs.\n */\n async #getPageText(doc: PdfDocumentProxy, pageNum: number): Promise<string> {\n const cached = this.#pageTextCache.get(pageNum);\n if (cached !== undefined) return cached;\n let page: PdfPageProxy;\n try {\n page = await doc.getPage(pageNum);\n } catch {\n return '';\n }\n let text = '';\n try {\n const tc = (await page.getTextContent()) as PdfTextContent;\n const items = Array.isArray(tc?.items) ? tc.items : [];\n const parts: string[] = [];\n for (const it of items) {\n const str = (it as PdfTextItem)?.str;\n if (typeof str === 'string') parts.push(str);\n }\n // Space-join so multi-word matches across textItem boundaries work.\n text = parts.join(' ').normalize('NFC');\n } catch {\n text = '';\n }\n this.#pageTextCache.set(pageNum, text);\n return text;\n }\n\n #emitSearchChange(): void {\n this.searchChange.emit({\n term: this.#searchTerm(),\n total: this.#searchResults().length,\n current: this.#searchActiveIndex() + 1, // 1-based; 0 when no active\n });\n }\n\n /**\n * Paint highlight marks over the current page's canvas wrapper. WHY DOM\n * append (not text layer): rendering the proper pdf.js text layer is a\n * larger change — out-of-scope here. Instead we drop floating `<mark>`\n * pills near the top of the page; they're a visual cue that the page\n * contains a hit + which one is active, even when we can't place them\n * pixel-accurately. The result-list cards still drive precise navigation.\n *\n * Tradeoff documented in sd-preview.md.\n */\n #applyHighlightsForActivePage(): void {\n const wrap = this.#hostEl.nativeElement.querySelector('.sd-preview-pdf-page-wrap');\n if (!wrap) return;\n // Clear prior overlay.\n const prior = wrap.querySelector('.sd-pdf-search-overlay');\n if (prior) prior.remove();\n\n const term = this.#searchTerm();\n const results = this.#searchResults();\n const activeIdx = this.#searchActiveIndex();\n const activePage = this.activePage();\n if (!term || results.length === 0) return;\n\n const pageHits = results.map((r, i) => ({ r, i })).filter(({ r }) => r.page === activePage);\n if (pageHits.length === 0) return;\n\n const overlay = document.createElement('div');\n overlay.className = 'sd-pdf-search-overlay';\n for (const { r, i } of pageHits) {\n const m = document.createElement('mark');\n m.className = i === activeIdx ? 'sd-pdf-search-hi sd-pdf-search-hi--active' : 'sd-pdf-search-hi';\n m.textContent = r.term;\n overlay.appendChild(m);\n }\n wrap.appendChild(overlay);\n\n // Scroll the active mark into view if it lives on this page.\n if (activeIdx >= 0 && results[activeIdx]?.page === activePage) {\n const activeMark = overlay.querySelector('.sd-pdf-search-hi--active') as HTMLElement | null;\n try {\n activeMark?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n } catch {\n // older Safari throws on smooth — fall back silently\n }\n }\n }\n\n // ==========================================\n // THUMBNAIL HELPERS\n // ==========================================\n\n /**\n * Rebind the IntersectionObserver to whatever set of thumbnail canvases is\n * currently mounted. Called from an effect that tracks `thumbCanvases()`.\n */\n #syncThumbObserver(canvases: HTMLCanvasElement[]): void {\n // Disconnect prior observer — refs are stale once the @for re-renders.\n this.#thumbObserver?.disconnect();\n if (canvases.length === 0) {\n this.#thumbObserver = null;\n return;\n }\n // Lazily create an IntersectionObserver scoped to the sidebar scroll\n // container so we only render thumbs the user can actually see. Falls\n // back to \"render everything\" when IntersectionObserver isn't available\n // (very old runtime / SSR shim).\n if (typeof IntersectionObserver !== 'function') {\n for (const c of canvases) {\n const n = Number(c.getAttribute('data-page'));\n if (Number.isFinite(n)) void this.#renderThumbnail(n, c);\n }\n return;\n }\n this.#thumbObserver = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const c = entry.target as HTMLCanvasElement;\n const n = Number(c.getAttribute('data-page'));\n if (!Number.isFinite(n)) continue;\n this.#thumbObserver?.unobserve(c); // one-shot — cached after first paint\n void this.#renderThumbnail(n, c);\n }\n },\n { rootMargin: '120px 0px 120px 0px', threshold: 0.01 }\n );\n for (const c of canvases) this.#thumbObserver.observe(c);\n }\n\n /**\n * Render a single page into a sidebar thumbnail canvas at ~140px width.\n * Cached via `#thumbsRendering` so rapid scroll bounces don't double-render.\n *\n * Visible for testing — tests can stub `getPage()` on the fake doc to\n * assert this method calls `render(...)` with the right page argument.\n */\n async renderThumbnailForPage(pageNum: number): Promise<void> {\n const canvas = this.thumbCanvases()\n .map(r => r.nativeElement)\n .find(c => Number(c.getAttribute('data-page')) === pageNum);\n if (!canvas) return;\n return this.#renderThumbnail(pageNum, canvas);\n }\n\n async #renderThumbnail(pageNum: number, canvas: HTMLCanvasElement): Promise<void> {\n const doc = this.#pdfDoc();\n if (!doc) return;\n if (this.#thumbsRendering.has(pageNum)) return;\n if (this.#thumbCache()[pageNum]) {\n // Already cached → just blit the dataURL onto the canvas.\n this.#paintCachedThumb(canvas, this.#thumbCache()[pageNum]);\n return;\n }\n this.#thumbsRendering.add(pageNum);\n try {\n const page = await doc.getPage(pageNum);\n // Target ~140px wide for sidebar thumbs (handoff says 152px, leave a\n // small margin so the canvas itself can fit inside the page wrapper's\n // outline). PDF page viewport at scale=1 ≈ 612 wide; pick scale so the\n // result lands near 140px.\n const baseViewport = page.getViewport({ scale: 1 });\n const scale = 140 / Math.max(1, baseViewport.width);\n const viewport = page.getViewport({ scale });\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const renderTask = page.render({ canvasContext: ctx, viewport });\n try {\n await renderTask.promise;\n } catch {\n return; // cancelled / failed silently — keep the blank thumb\n }\n try {\n const dataUrl = canvas.toDataURL('image/png');\n this.#thumbCache.update(prev => ({ ...prev, [pageNum]: dataUrl }));\n } catch {\n // Tainted canvas (e.g. dev mock) — just skip caching, keep visual.\n }\n page.cleanup();\n } catch {\n // Page load failed — leave the thumb blank rather than throwing.\n } finally {\n this.#thumbsRendering.delete(pageNum);\n }\n }\n\n /**\n * Paint a previously-rendered dataURL onto a freshly-mounted canvas so the\n * mini-page reappears without re-rasterizing.\n */\n #paintCachedThumb(canvas: HTMLCanvasElement, dataUrl: string): void {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n canvas.style.width = `${img.naturalWidth}px`;\n canvas.style.height = `${img.naturalHeight}px`;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n}\n","<!--\n sd-preview-pdf shell. Self-contained — sizes to its parent. Consumer wraps\n in <sd-modal>/<sd-side-drawer>/page section. Header + sidebar + stage +\n floating toolbar mirror Artboards A / C / E from the design handoff.\n-->\n<div class=\"sd-preview-pdf-shell\" role=\"region\">\n @let _stage = stage();\n @let _numPages = numPages();\n @let _activePage = activePage();\n @let _isSidebarOpen = isSidebarOpen();\n @let _searchBarOpen = searchBarOpen();\n @let _searchTerm = searchTerm();\n @let _searchTotal = searchTotal();\n\n <!-- ============================================\n HEADER BAR — hidden in empty + loading per design\n ============================================ -->\n @if (_stage === 'ready') {\n <div class=\"sd-preview-pdf-header\">\n <div class=\"sd-preview-pdf-header__left\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"_isSidebarOpen\"\n [attr.aria-label]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n [attr.title]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n [attr.data-autoId]=\"autoIdSidebarToggle()\"\n (click)=\"toggleSidebar()\">\n <sd-icon fontIcon=\"menu\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-header__divider\"></span>\n <div class=\"sd-preview-pdf-fileicon\" aria-hidden=\"true\">PDF</div>\n <div class=\"sd-preview-pdf-header__meta\">\n <div class=\"sd-preview-pdf-header__name\" [title]=\"title() || filename()\">\n {{ title() || filename() }}\n </div>\n <div class=\"sd-preview-pdf-header__sub\">\n {{ 'core.component.preview-pdf.pages-count' | translate: { count: _numPages } }}\n </div>\n </div>\n </div>\n\n <div class=\"sd-preview-pdf-header__right\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"_searchBarOpen\"\n [attr.aria-label]=\"'core.component.preview-pdf.search' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search' | translate\"\n [attr.data-autoId]=\"autoIdSearchToggle()\"\n (click)=\"searchBarOpen() ? closeSearch() : openSearch()\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n </button>\n @if (downloadable()) {\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.download' | translate\"\n [attr.title]=\"'core.component.preview-pdf.download' | translate\"\n [attr.data-autoId]=\"autoIdDownload()\"\n (click)=\"downloadFile()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n </button>\n }\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.fullscreen' | translate\"\n [attr.title]=\"'core.component.preview-pdf.fullscreen' | translate\"\n [attr.data-autoId]=\"autoIdFullscreen()\"\n (click)=\"toggleFullscreen()\">\n <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n </button>\n </div>\n </div>\n\n <!-- ============================================\n SEARCH BAR — between header + body, only when bar is open\n ============================================ -->\n @if (_searchBarOpen) {\n <div class=\"sd-preview-pdf-searchbar\" role=\"search\">\n <sd-icon class=\"sd-preview-pdf-searchbar__icon\" fontIcon=\"search\"></sd-icon>\n <input\n #searchInput\n type=\"text\"\n class=\"sd-preview-pdf-searchbar__input\"\n [attr.placeholder]=\"'core.component.preview-pdf.search-placeholder' | translate\"\n [value]=\"_searchTerm\"\n [attr.data-autoId]=\"autoIdSearchInput()\"\n (input)=\"onSearchInput($any($event.target).value)\" />\n <span class=\"sd-preview-pdf-searchbar__counter\" aria-live=\"polite\"> {{ searchCurrent() }} / {{ _searchTotal }} </span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [disabled]=\"_searchTotal === 0\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-prev' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-prev' | translate\"\n [attr.data-autoId]=\"autoIdSearchPrev()\"\n (click)=\"searchPrev()\">\n <sd-icon fontIcon=\"keyboard_arrow_up\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [disabled]=\"_searchTotal === 0\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-next' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-next' | translate\"\n [attr.data-autoId]=\"autoIdSearchNext()\"\n (click)=\"searchNext()\">\n <sd-icon fontIcon=\"keyboard_arrow_down\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-searchbar__divider\"></span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"searchCaseSensitive()\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-case' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-case' | translate\"\n [attr.data-autoId]=\"autoIdSearchCase()\"\n (click)=\"toggleSearchCaseSensitive()\">\n <sd-icon fontIcon=\"match_case\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"searchWholeWord()\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-whole' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-whole' | translate\"\n [attr.data-autoId]=\"autoIdSearchWhole()\"\n (click)=\"toggleSearchWholeWord()\">\n <sd-icon fontIcon=\"text_fields\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-searchbar__spacer\"></span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-close' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-close' | translate\"\n [attr.data-autoId]=\"autoIdSearchClose()\"\n (click)=\"closeSearch()\">\n <sd-icon fontIcon=\"close\"></sd-icon>\n </button>\n </div>\n }\n }\n\n <!-- ============================================\n BODY — sidebar + stage\n ============================================ -->\n <div class=\"sd-preview-pdf-body\">\n <!-- SIDEBAR ............................................................. -->\n @if (_stage === 'ready' && _isSidebarOpen) {\n <aside class=\"sd-preview-pdf-sidebar\" role=\"complementary\">\n @let _sidebarMode = sidebarMode();\n <div class=\"sd-preview-pdf-sidebar__tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'thumbnails'\"\n [attr.data-autoId]=\"autoIdTabThumbnails()\"\n (click)=\"setSidebarMode('thumbnails')\">\n <sd-icon fontIcon=\"view_carousel\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.thumbnails' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'outline'\"\n [attr.data-autoId]=\"autoIdTabOutline()\"\n (click)=\"setSidebarMode('outline')\">\n <sd-icon fontIcon=\"list\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.outline' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'search'\"\n [attr.data-autoId]=\"autoIdTabSearch()\"\n (click)=\"setSidebarMode('search')\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.search' | translate }}</span>\n </button>\n </div>\n\n <div class=\"sd-preview-pdf-sidebar__content\">\n @switch (_sidebarMode) {\n @case ('thumbnails') {\n <ul class=\"sd-preview-pdf-thumb-list\">\n @for (p of pageNumbers(); track trackByPage($index, p); let pi = $index) {\n <li>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-thumb\"\n [class.sd-preview-pdf-thumb--active]=\"p === _activePage\"\n [attr.aria-current]=\"p === _activePage ? 'page' : null\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: p, total: _numPages }\"\n [attr.data-autoId]=\"autoIdThumb(pi)\"\n (click)=\"goToPage(p)\">\n <div class=\"sd-preview-pdf-thumb__page\">\n <canvas #thumbCanvas class=\"sd-preview-pdf-thumb__canvas\" [attr.data-page]=\"p\" aria-hidden=\"true\"></canvas>\n </div>\n <span class=\"sd-preview-pdf-thumb__label\">{{ p }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @case ('outline') {\n <!-- TODO(preview-pdf): outline tree (pdfDoc.getOutline()) deferred to follow-up commit. -->\n <div class=\"sd-preview-pdf-sidebar__deferred\">\n <sd-icon fontIcon=\"list\"></sd-icon>\n <p>{{ 'core.component.preview-pdf.deferred.outline' | translate }}</p>\n </div>\n }\n @case ('search') {\n @if (!_searchTerm) {\n <div class=\"sd-preview-pdf-sidebar__deferred\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n <p>{{ 'core.component.preview-pdf.search-placeholder' | translate }}</p>\n </div>\n } @else if (_searchTotal === 0) {\n <div class=\"sd-preview-pdf-sidebar__deferred\">\n <sd-icon fontIcon=\"search_off\"></sd-icon>\n <p>{{ 'core.component.preview-pdf.search-no-results' | translate }}</p>\n </div>\n } @else {\n <ul class=\"sd-preview-pdf-search-list\">\n @for (r of searchResults(); track $index; let i = $index) {\n <li>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-search-result\"\n [class.sd-preview-pdf-search-result--active]=\"i === searchActiveIndex()\"\n [attr.data-autoId]=\"autoIdResult(i)\"\n (click)=\"goToPage(r.page)\">\n <span class=\"sd-preview-pdf-search-result__snippet\">\n {{ r.before }}<mark>{{ r.term }}</mark\n >{{ r.after }}\n </span>\n <span class=\"sd-preview-pdf-search-result__page\">{{ r.page }}</span>\n </button>\n </li>\n }\n </ul>\n }\n }\n @default {\n <div class=\"sd-preview-pdf-sidebar__deferred\"></div>\n }\n }\n </div>\n </aside>\n }\n\n <!-- STAGE ............................................................... -->\n <div class=\"sd-preview-pdf-stage\" #stageRef (wheel)=\"onWheel($event)\">\n @switch (_stage) {\n @case ('empty') {\n <div class=\"sd-preview-pdf-status\">\n <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--muted\">\n <sd-icon fontIcon=\"picture_as_pdf\"></sd-icon>\n </div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.empty.title' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__hint\">\n {{ 'core.component.preview-pdf.empty.subtitle' | translate }}\n </div>\n </div>\n }\n @case ('loading') {\n @let _loadPercent = loadPercent();\n <div class=\"sd-preview-pdf-status\">\n <div class=\"sd-preview-pdf-spinner\" role=\"progressbar\"></div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.loading' | translate }}\n @if (_loadPercent > 0) {\n <span class=\"sd-preview-pdf-progress-pct\">&nbsp;{{ _loadPercent }}%</span>\n }\n </div>\n <div class=\"sd-preview-pdf-progress\">\n <div class=\"sd-preview-pdf-progress__fill\" [style.width.%]=\"_loadPercent\"></div>\n </div>\n </div>\n }\n @case ('error') {\n @if (loadError$(); as err) {\n <div class=\"sd-preview-pdf-status\">\n <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--danger\">\n <sd-icon fontIcon=\"error\"></sd-icon>\n </div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.error.' + err.reason + '.title' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__hint\">\n {{ 'core.component.preview-pdf.error.' + err.reason + '.body' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__actions\">\n <button type=\"button\" class=\"sd-preview-pdf-btn-primary\" (click)=\"retryLoad()\" [attr.data-autoId]=\"autoIdRetry()\">\n <sd-icon fontIcon=\"refresh\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.error.retry' | translate }}</span>\n </button>\n @if (downloadable()) {\n <button type=\"button\" class=\"sd-preview-pdf-btn-secondary\" (click)=\"downloadFile()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.error.download-raw' | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n }\n @default {\n <div class=\"sd-preview-pdf-page-wrap\">\n <canvas\n #pageCanvas\n class=\"sd-preview-pdf-page\"\n role=\"img\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\">\n </canvas>\n </div>\n }\n }\n\n <!-- FLOATING TOOLBAR ........................................ -->\n @if (showToolbar() && _stage === 'ready') {\n @let _canPrev = canPrev();\n @let _canNext = canNext();\n @let _zoomMode = zoomMode();\n @let _scrollModeCurrent = scrollModeCurrent();\n <div class=\"sd-preview-pdf-toolbar\" role=\"toolbar\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canPrev\"\n [attr.aria-label]=\"'core.component.preview-pdf.first-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.first-page' | translate\"\n [attr.data-autoId]=\"autoIdFirst()\"\n (click)=\"firstPage()\">\n <sd-icon fontIcon=\"first_page\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canPrev\"\n [attr.aria-label]=\"'core.component.preview-pdf.prev-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.prev-page' | translate\"\n [attr.data-autoId]=\"autoIdPrev()\"\n (click)=\"prevPage()\">\n <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-toolbar__page\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n class=\"sd-preview-pdf-toolbar__page-input\"\n [value]=\"_activePage\"\n #pageInput\n (keydown.enter)=\"onPageInputEnter($event)\"\n (blur)=\"onPageInputBlur($event)\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\"\n [attr.data-autoId]=\"autoIdPageInput()\" />\n <span class=\"sd-preview-pdf-toolbar__page-total\">/ {{ _numPages }}</span>\n </span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canNext\"\n [attr.aria-label]=\"'core.component.preview-pdf.next-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.next-page' | translate\"\n [attr.data-autoId]=\"autoIdNext()\"\n (click)=\"nextPage()\">\n <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canNext\"\n [attr.aria-label]=\"'core.component.preview-pdf.last-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.last-page' | translate\"\n [attr.data-autoId]=\"autoIdLast()\"\n (click)=\"lastPage()\">\n <sd-icon fontIcon=\"last_page\"></sd-icon>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.zoom-out' | translate\"\n [attr.title]=\"'core.component.preview-pdf.zoom-out' | translate\"\n [attr.data-autoId]=\"autoIdZoomOut()\"\n (click)=\"zoomOut()\">\n <sd-icon fontIcon=\"remove\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-toolbar__zoom\" aria-live=\"polite\" [attr.data-autoId]=\"autoIdZoomReadout()\">{{ zoomPercent() }}%</span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.zoom-in' | translate\"\n [attr.title]=\"'core.component.preview-pdf.zoom-in' | translate\"\n [attr.data-autoId]=\"autoIdZoomIn()\"\n (click)=\"zoomIn()\">\n <sd-icon fontIcon=\"add\"></sd-icon>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-fit'\"\n [attr.data-autoId]=\"autoIdFitPage()\"\n (click)=\"setZoom('page-fit')\">\n <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.fit-page' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-width'\"\n [attr.data-autoId]=\"autoIdFitWidth()\"\n (click)=\"setZoom('page-width')\">\n <sd-icon fontIcon=\"swap_horiz\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.fit-width' | translate }}</span>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.rotate' | translate\"\n [attr.title]=\"'core.component.preview-pdf.rotate' | translate\"\n [attr.data-autoId]=\"autoIdRotate()\"\n (click)=\"rotate('right')\">\n <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n </button>\n\n <!-- TODO(preview-pdf): scroll mode toggle is signature-only;\n clicking switches the state but rendering stays single-page\n until the continuous scroll feature lands. -->\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [attr.data-autoId]=\"autoIdScrollMode()\"\n (click)=\"setScrollMode(_scrollModeCurrent === 'page' ? 'continuous' : 'page')\">\n <sd-icon [fontIcon]=\"_scrollModeCurrent === 'page' ? 'description' : 'view_day'\"></sd-icon>\n <span>\n {{\n (_scrollModeCurrent === 'page' ? 'core.component.preview-pdf.scroll-page' : 'core.component.preview-pdf.scroll-continuous')\n | translate\n }}\n </span>\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-preview.mjs","sources":["../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.html","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.browser.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.print.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.pdfjs.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.html","../../../projects/sdcorejs-angular/components/preview/sdcorejs-angular-components-preview.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n OnDestroy,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { NormalizedImage, PreviewItem, PreviewStage, PreviewTheme, ThumbnailPosition } from './preview-image.types';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-preview-image',\n standalone: true,\n imports: [SdIcon, CommonModule, TranslatePipe],\n templateUrl: './preview-image.component.html',\n styleUrl: './preview-image.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n // mà không cần bind document. Consumer (modal/drawer/page) chỉ cần thả component\n // vào DOM — keyboard shortcut tự hoạt động khi component hoặc descendant đang focus.\n host: {\n tabindex: '0',\n class: 'sd-preview-image-host',\n // WHY data-theme attribute (not class): SCSS uses :host([data-theme=\"light\"])\n // to swap CSS custom properties — keeps the theme variant declarative and\n // visible in devtools without polluting the class list.\n '[attr.data-theme]': 'theme()',\n '[class.sd-preview-image-host--fullscreen]': 'isFullscreen()',\n },\n})\nexport class SdPreviewImage implements OnDestroy {\n // ==========================================\n // CONSTANTS\n // ==========================================\n // Zoom giới hạn theo handoff: stage hiển thị từ 25% → 400% là dải hữu dụng.\n // Ngoài dải này ảnh hoặc quá nhỏ để thao tác hoặc đã pixelated nặng.\n static readonly MIN_ZOOM = 0.25;\n static readonly MAX_ZOOM = 4;\n static readonly ZOOM_STEP = 0.1;\n static readonly SWIPE_THRESHOLD = 40;\n\n // ==========================================\n // DI\n // ==========================================\n readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #destroyRef = inject(DestroyRef);\n\n // ==========================================\n // INPUTS (signal-based, Angular 19 style)\n // ==========================================\n // Declarative items input — consumer drives state. Mỗi lần items() đổi,\n // effect() bên dưới sẽ normalize + load lại danh sách.\n // autoId prefix `preview-image-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-image-${this.autoIdInput()}` : undefined));\n\n readonly #childAutoId = (suffix: string): string | undefined => {\n return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n };\n\n readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n readonly autoIdNext = computed(() => this.#childAutoId('next'));\n readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n readonly autoIdFit = computed(() => this.#childAutoId('fit'));\n readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n readonly autoIdDot = (i: number): string | undefined => this.#childAutoId(`dot-${i}`);\n\n readonly items = input<PreviewItem[]>([]);\n readonly title = input<string | undefined>(undefined);\n readonly thumbnailPosition = input<ThumbnailPosition>('bottom');\n readonly showToolbar = input(true);\n readonly downloadable = input(true);\n readonly zoomable = input(true);\n readonly loop = input(true);\n readonly startIndex = input(0);\n // Theme variant — drives [data-theme] host attribute. Default 'dark' preserves\n // pre-existing visual contract; consumers opt-in to 'light' explicitly.\n readonly theme = input<PreviewTheme>('dark');\n\n // ==========================================\n // OUTPUTS\n // ==========================================\n // `close`: user requested dismissal (X button hoặc Esc). Consumer tự quyết\n // định đóng modal / điều hướng / hide section.\n readonly close = output<void>();\n readonly activeIndexChange = output<number>();\n readonly download = output<{ index: number; item: NormalizedImage }>();\n readonly imageError = output<{ index: number; reason: string }>();\n\n // ==========================================\n // STATE (signals)\n // ==========================================\n readonly #activeIndex = signal(0);\n readonly #images = signal<NormalizedImage[]>([]);\n readonly #zoom = signal(1);\n readonly #rotation = signal(0);\n readonly #pan = signal({ x: 0, y: 0 });\n readonly #stage = signal<PreviewStage>('empty');\n readonly #isFullscreen = signal(false);\n readonly #isDragging = signal(false);\n\n // Track every blob URL we created so we can revoke on destroy / re-normalize.\n // CDN strings hoá ra File→blob URL nội bộ — bắt buộc phải revoke để không leak.\n readonly #ownedBlobUrls = new Set<string>();\n\n // Token chống race: nếu items() đổi liên tiếp (user click rất nhanh) thì\n // promise normalize của lần trước phải bị bỏ qua khi resolve.\n #loadToken = 0;\n\n // Pointer state for drag/pinch — không cần signal vì không drive template.\n #dragStart: { x: number; y: number; panX: number; panY: number } | null = null;\n #swipeStart: { x: number; y: number; t: number } | null = null;\n readonly #activePointers = new Map<number, { x: number; y: number }>();\n #pinchStartDistance = 0;\n #pinchStartZoom = 1;\n\n // ==========================================\n // COMPUTED (template-readable)\n // ==========================================\n readonly activeIndex = this.#activeIndex.asReadonly();\n readonly images = this.#images.asReadonly();\n readonly zoom = this.#zoom.asReadonly();\n readonly rotation = this.#rotation.asReadonly();\n readonly pan = this.#pan.asReadonly();\n readonly stage = this.#stage.asReadonly();\n readonly isFullscreen = this.#isFullscreen.asReadonly();\n\n readonly activeImage = computed<NormalizedImage | undefined>(() => this.#images()[this.#activeIndex()]);\n readonly hasPrev = computed(() => {\n const len = this.#images().length;\n return len > 1 && (this.loop() || this.#activeIndex() > 0);\n });\n readonly hasNext = computed(() => {\n const len = this.#images().length;\n return len > 1 && (this.loop() || this.#activeIndex() < len - 1);\n });\n readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n\n // Transform style cho ảnh stage. WHY: gom translate/scale/rotate vào 1 string\n // duy nhất để OnPush phát hiện thay đổi qua signal kéo theo computed.\n readonly imageTransform = computed(() => {\n const p = this.#pan();\n const z = this.#zoom();\n const r = this.#rotation();\n return `translate(${p.x}px, ${p.y}px) scale(${z}) rotate(${r}deg)`;\n });\n\n readonly shellClass = computed(() => {\n const pos = this.thumbnailPosition();\n return {\n 'sd-preview-shell': true,\n [`sd-preview-shell--pos-${pos}`]: true,\n 'sd-preview-shell--fullscreen': this.#isFullscreen(),\n };\n });\n\n // ==========================================\n // CONSTRUCTOR — declarative wiring\n // ==========================================\n constructor() {\n // Đồng bộ #isFullscreen với trạng thái thực của browser (sự kiện 'fullscreenchange' fire\n // bất kể user thoát fullscreen bằng cách nào: nút Thoát, Esc, F11, programmatic).\n const onFullscreenChange = () => {\n this.#isFullscreen.set(document.fullscreenElement === this.#hostEl.nativeElement);\n };\n document.addEventListener('fullscreenchange', onFullscreenChange);\n this.#destroyRef.onDestroy(() => {\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n\n // Reactive normalize: mỗi lần items() đổi → revoke blob cũ → load mới.\n // WHY effect không async: effect() callback không hỗ trợ async cleanup,\n // dùng token-based race guard trong #normalizeAndLoad để bỏ qua kết quả cũ.\n effect(() => {\n const list = this.items();\n const start = this.startIndex();\n this.#normalizeAndLoad(list, start);\n });\n\n // Auto-focus host sau lần render đầu để keyboard hoạt động ngay.\n // WHY: nếu consumer KHÔNG bọc trong modal, không có ai focus giúp.\n // Consumer bọc modal sẽ tự focus trap riêng — focus() này vô hại (no-op\n // nếu element không visible).\n afterNextRender(() => {\n try {\n this.#hostEl.nativeElement.focus({ preventScroll: true });\n } catch {\n // ignore — focus() can throw on detached/hidden elements.\n }\n });\n\n // Cleanup khi component bị destroy.\n this.#destroyRef.onDestroy(() => {\n this.#revokeAllBlobs();\n if (document.fullscreenElement === this.#hostEl.nativeElement) {\n // Tránh để fullscreen \"treo\" khi component bị huỷ giữa chừng.\n document.exitFullscreen?.().catch(() => undefined);\n }\n });\n }\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n ngOnDestroy(): void {\n // Giữ ngOnDestroy để vẫn tương thích với khai báo `implements OnDestroy`.\n // Logic dọn dẹp đã được dời sang DestroyRef.onDestroy ở constructor để có\n // thể chia sẻ với effect() teardown nếu cần sau này.\n }\n\n // ==========================================\n // PUBLIC API\n // ==========================================\n\n onClickThumbnailImage(index: number): void {\n if (index < 0 || index >= this.#images().length) return;\n if (index === this.#activeIndex()) return;\n this.#setActive(index);\n }\n\n updateCurrentImage(direction: 1 | -1): void {\n const len = this.#images().length;\n if (len <= 1) return;\n const next = this.#activeIndex() + direction;\n let target: number;\n if (this.loop()) {\n target = (next + len) % len;\n } else {\n if (next < 0 || next >= len) return;\n target = next;\n }\n this.#setActive(target);\n }\n\n zoomIn(): void {\n if (!this.zoomable()) return;\n this.#setZoom(this.#zoom() + SdPreviewImage.ZOOM_STEP);\n }\n\n zoomOut(): void {\n if (!this.zoomable()) return;\n this.#setZoom(this.#zoom() - SdPreviewImage.ZOOM_STEP);\n }\n\n fitToScreen(): void {\n this.#resetTransform();\n }\n\n rotate(direction: 'left' | 'right'): void {\n const delta = direction === 'right' ? 90 : -90;\n // Wrap về [0, 360) cho gọn — không strictly cần thiết về mặt visual.\n this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n }\n\n downloadCurrent(): void {\n if (!this.downloadable()) return;\n const img = this.activeImage();\n if (!img || img.error) return;\n // Ưu tiên CDN URL nếu có để tận dụng Content-Disposition của server,\n // fallback về blob URL khi user upload File trực tiếp.\n const href = img.url || img.blobUrl;\n const a = document.createElement('a');\n a.href = href;\n a.download = img.name || 'image';\n document.body.appendChild(a);\n a.click();\n a.remove();\n this.download.emit({ index: this.#activeIndex(), item: img });\n }\n\n toggleFullscreen(): void {\n // WHY: trạng thái #isFullscreen được sync qua sự kiện 'fullscreenchange' (xem constructor)\n // — single source of truth. Không cần .then(set(true/false)) ở đây nữa.\n if (!document.fullscreenElement) {\n this.#hostEl.nativeElement.requestFullscreen?.().catch(() => undefined);\n } else {\n document.exitFullscreen?.().catch(() => undefined);\n }\n }\n\n /** Retry just the active image (Artboard G action). */\n async retryActive(): Promise<void> {\n const idx = this.#activeIndex();\n const img = this.#images()[idx];\n if (!img || !img.url) return;\n // Per-image loading: chỉ đánh dấu record này loading, KHÔNG đụng stage().\n // Nhờ vậy nav arrows + thumbnails vẫn render trong lúc retry, không flicker.\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...arr[idx], loading: true, error: false };\n return next;\n });\n const refreshed = await this.#normalize(img.url, { name: img.name, caption: img.caption, alt: img.alt });\n if (refreshed) {\n // Trao đổi nguyên record để giữ id thumbnail (avoid track-by reset).\n this.#images.update(arr => {\n const next = [...arr];\n // Revoke blob cũ TRƯỚC khi thay để không leak record vừa fail tải.\n if (this.#ownedBlobUrls.has(arr[idx].blobUrl)) {\n URL.revokeObjectURL(arr[idx].blobUrl);\n this.#ownedBlobUrls.delete(arr[idx].blobUrl);\n }\n next[idx] = { ...refreshed, id: img.id, loading: false };\n return next;\n });\n } else {\n // Normalize trả null → giữ record cũ nhưng tắt loading + mark error\n // để inline placeholder hiển thị (không lật cả stage).\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...arr[idx], loading: false, error: true };\n return next;\n });\n }\n }\n\n /** User clicked the X button — emit close intent for the consumer to react. */\n requestClose(): void {\n this.close.emit();\n }\n\n // ==========================================\n // KEYBOARD — bound to HOST (not document)\n // ==========================================\n // WHY @HostListener('keydown') on host: component có tabindex=0 nên nhận được\n // keyboard event khi nó hoặc descendant đang focused. Không bind document để\n // tránh \"cướp\" phím tắt của các phần khác trong app khi component không hoạt động.\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n // Bỏ qua khi user đang gõ trong input — toolbar / overlay có thể chứa\n // input ẩn (search), không muốn ← → cướp event của họ.\n const target = event.target as HTMLElement | null;\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n this.updateCurrentImage(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.updateCurrentImage(1);\n break;\n case '+':\n case '=':\n if (this.zoomable()) {\n event.preventDefault();\n this.zoomIn();\n }\n break;\n case '-':\n if (this.zoomable()) {\n event.preventDefault();\n this.zoomOut();\n }\n break;\n case '0':\n event.preventDefault();\n this.fitToScreen();\n break;\n case 'r':\n event.preventDefault();\n this.rotate('right');\n break;\n case 'R':\n event.preventDefault();\n this.rotate('left');\n break;\n case 'f':\n event.preventDefault();\n this.toggleFullscreen();\n break;\n case 'd':\n if (this.downloadable()) {\n event.preventDefault();\n this.downloadCurrent();\n }\n break;\n }\n }\n\n // ==========================================\n // MOUSE / POINTER HANDLERS (template-bound)\n // ==========================================\n onWheel(event: WheelEvent): void {\n if (!this.zoomable()) return;\n event.preventDefault();\n // deltaY < 0 nghĩa là cuộn lên = zoom in (giống Google Photos / macOS Preview).\n const factor = event.deltaY < 0 ? 1 + SdPreviewImage.ZOOM_STEP : 1 - SdPreviewImage.ZOOM_STEP;\n this.#setZoom(this.#zoom() * factor);\n }\n\n onPointerDown(event: PointerEvent): void {\n if (event.button !== 0 && event.pointerType === 'mouse') return;\n // Bỏ qua nếu pointer xuất phát trên control tương tác (toolbar / nav / dots / retry button).\n // WHY: stage chứa các button con; setPointerCapture đi cùng drag/swipe logic sẽ\n // \"ăn\" click event của những button đó (như nút Thoát fullscreen / zoom / rotate).\n if ((event.target as HTMLElement).closest('button, [role=\"button\"]')) return;\n (event.target as Element).setPointerCapture?.(event.pointerId);\n this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.#activePointers.size === 2) {\n // Bắt đầu pinch — khoá zoom hiện tại làm anchor.\n const pts = [...this.#activePointers.values()];\n this.#pinchStartDistance = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n this.#pinchStartZoom = this.#zoom();\n this.#dragStart = null;\n this.#swipeStart = null;\n return;\n }\n\n if (this.#zoom() > 1) {\n // Đã zoom → pointer drag = pan, không phải swipe.\n this.#isDragging.set(true);\n this.#dragStart = {\n x: event.clientX,\n y: event.clientY,\n panX: this.#pan().x,\n panY: this.#pan().y,\n };\n } else {\n // Ở mức 100% → pointer drag được coi là swipe sang ảnh kế.\n this.#swipeStart = { x: event.clientX, y: event.clientY, t: performance.now() };\n }\n }\n\n onPointerMove(event: PointerEvent): void {\n if (!this.#activePointers.has(event.pointerId)) return;\n this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (this.#activePointers.size === 2 && this.zoomable() && this.#pinchStartDistance > 0) {\n const pts = [...this.#activePointers.values()];\n const dist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n const ratio = dist / this.#pinchStartDistance;\n this.#setZoom(this.#pinchStartZoom * ratio);\n return;\n }\n\n if (this.#dragStart && this.#zoom() > 1) {\n const dx = event.clientX - this.#dragStart.x;\n const dy = event.clientY - this.#dragStart.y;\n this.#pan.set({ x: this.#dragStart.panX + dx, y: this.#dragStart.panY + dy });\n }\n }\n\n onPointerUp(event: PointerEvent): void {\n const start = this.#swipeStart;\n this.#activePointers.delete(event.pointerId);\n\n if (this.#activePointers.size < 2) {\n this.#pinchStartDistance = 0;\n }\n\n if (this.#dragStart) {\n this.#dragStart = null;\n this.#isDragging.set(false);\n }\n\n // Detect swipe — chỉ khi đang ở fit/100% và di chuyển ngang đủ xa.\n if (start && this.#zoom() <= 1) {\n const dx = event.clientX - start.x;\n const dy = event.clientY - start.y;\n if (Math.abs(dx) >= SdPreviewImage.SWIPE_THRESHOLD && Math.abs(dx) > Math.abs(dy) * 1.5) {\n this.updateCurrentImage(dx < 0 ? 1 : -1);\n }\n }\n this.#swipeStart = null;\n }\n\n onPointerCancel(event: PointerEvent): void {\n this.#activePointers.delete(event.pointerId);\n this.#dragStart = null;\n this.#swipeStart = null;\n this.#isDragging.set(false);\n if (this.#activePointers.size < 2) {\n this.#pinchStartDistance = 0;\n }\n }\n\n onImageDblClick(): void {\n if (!this.zoomable()) return;\n if (this.#zoom() === 1) {\n this.#setZoom(2);\n } else {\n this.#resetTransform();\n }\n }\n\n onImageError(): void {\n const idx = this.#activeIndex();\n const img = this.#images()[idx];\n if (!img) return;\n this.#images.update(arr => {\n const next = [...arr];\n next[idx] = { ...img, error: true, loading: false };\n return next;\n });\n // WHY không set stage='error': lỗi từng ảnh không nên ẩn nav/dots/thumb của\n // cả viewer. Template render placeholder inline ngay trong khung ảnh khi\n // activeImage().error === true — user vẫn có thể chuyển sang ảnh khác.\n this.imageError.emit({ index: idx, reason: 'render-failed' });\n }\n\n trackByImage(_i: number, item: NormalizedImage): string {\n return item.id;\n }\n\n formatBytes(bytes: number): string {\n if (!bytes || bytes < 0) return '';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n }\n\n // ==========================================\n // INTERNALS\n // ==========================================\n async #normalizeAndLoad(items: PreviewItem[] | null | undefined, startIndex: number): Promise<void> {\n const token = ++this.#loadToken;\n\n // Revoke trước khi map mới — items() đổi liên tiếp sẽ leak nếu không.\n this.#revokeAllBlobs();\n this.#resetTransform();\n\n if (!Array.isArray(items) || items.length === 0) {\n this.#images.set([]);\n this.#activeIndex.set(0);\n this.#stage.set('empty');\n return;\n }\n\n this.#activeIndex.set(Math.max(0, Math.min(startIndex ?? 0, items.length - 1)));\n this.#stage.set('loading');\n\n const normalized = await Promise.all(items.map(item => this.#normalize(item)));\n\n // Race guard: nếu items() đã đổi trong lúc await thì kết quả này là stale.\n // Lưu ý: blob URL của batch này đã add vào #ownedBlobUrls — batch mới sẽ\n // revoke chúng khi nó cũng vào #normalizeAndLoad.\n if (token !== this.#loadToken) {\n return;\n }\n\n const valid = normalized.filter((img): img is NormalizedImage => img !== null);\n this.#images.set(valid);\n if (valid.length === 0) {\n this.#stage.set('empty');\n } else {\n const idx = Math.min(this.#activeIndex(), valid.length - 1);\n this.#activeIndex.set(idx);\n // WHY luôn 'ready' kể cả khi ảnh đầu bị error: per-image error render\n // inline để giữ nav + thumb interactive. User vẫn điều hướng được sang\n // ảnh khác.\n this.#stage.set('ready');\n }\n }\n\n #setActive(index: number): void {\n this.#activeIndex.set(index);\n this.#resetTransform();\n // WHY luôn set 'ready' (không phụ thuộc img.error): per-image error giờ\n // render inline trong stage thay vì lật cả stage sang 'error'. Giữ stage\n // 'ready' để nav/dots/thumbnail/toolbar không bị ẩn.\n this.#stage.set('ready');\n this.activeIndexChange.emit(index);\n // Auto-scroll thumbnail strip — đợi 1 microtask để DOM rendered xong.\n // WHY scoped query: thumbnail id là global ('sd-preview-thumb-N'); nếu có\n // > 1 instance trên page sẽ collide. Query trong nativeElement để isolate.\n queueMicrotask(() => {\n const el = this.#hostEl.nativeElement.querySelector(`#sd-preview-thumb-${index}`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n });\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(SdPreviewImage.MAX_ZOOM, Math.max(SdPreviewImage.MIN_ZOOM, value));\n this.#zoom.set(clamped);\n if (clamped <= 1) {\n // Khi về fit/100% — pan không còn ý nghĩa, reset để không bị \"lệch\" khi\n // zoom lại lần sau.\n this.#pan.set({ x: 0, y: 0 });\n }\n }\n\n #resetTransform(): void {\n this.#zoom.set(1);\n this.#rotation.set(0);\n this.#pan.set({ x: 0, y: 0 });\n }\n\n #revokeAllBlobs(): void {\n for (const url of this.#ownedBlobUrls) {\n URL.revokeObjectURL(url);\n }\n this.#ownedBlobUrls.clear();\n }\n\n async #normalize(item: PreviewItem, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage | null> {\n try {\n if (typeof item === 'string') {\n return await this.#fromUrl(item, override);\n }\n if (item instanceof File) {\n return this.#fromFile(item, override);\n }\n if (item && typeof item === 'object') {\n // Object form: chấp nhận file hoặc url, ưu tiên file vì không cần network.\n if (item.file) {\n return this.#fromFile(item.file, { name: item.name, caption: item.caption, alt: item.alt });\n }\n if (item.url) {\n return await this.#fromUrl(item.url, {\n name: item.name,\n caption: item.caption,\n alt: item.alt,\n });\n }\n }\n return null;\n } catch (err) {\n console.error('[sd-preview-image] normalize failed', err);\n return null;\n }\n }\n\n async #fromUrl(url: string, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage> {\n const id = Utilities.generateUuid();\n // Lấy filename từ phần path cuối — bỏ query string.\n const baseSrc = url.split('?')[0];\n const inferredName = override?.name || baseSrc.substring(baseSrc.lastIndexOf('/') + 1) || 'image';\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const blob = await res.blob();\n const file = new File([blob], inferredName, { type: blob.type });\n const blobUrl = URL.createObjectURL(file);\n this.#ownedBlobUrls.add(blobUrl);\n return {\n id,\n url,\n blobUrl,\n name: inferredName,\n size: file.size,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: false,\n };\n } catch {\n // Vẫn trả về record để Artboard G có thể hiển thị Retry — error=true sẽ\n // được stage signal chuyển sang trạng thái lỗi khi đây là active image.\n return {\n id,\n url,\n blobUrl: '',\n name: inferredName,\n size: 0,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: true,\n };\n }\n }\n\n #fromFile(file: File, override?: { name?: string; caption?: string; alt?: string }): NormalizedImage | null {\n if (!file.type.startsWith('image/')) {\n // Silently filter — handoff yêu cầu non-image File bị drop yên lặng để\n // tương thích với upload form nơi user trộn lẫn ảnh và tài liệu.\n return null;\n }\n const blobUrl = URL.createObjectURL(file);\n this.#ownedBlobUrls.add(blobUrl);\n return {\n id: Utilities.generateUuid(),\n blobUrl,\n name: override?.name || file.name,\n size: file.size,\n caption: override?.caption,\n alt: override?.alt,\n loading: false,\n error: false,\n };\n }\n}\n","<!--\n Self-contained viewer shell. Component sizes to its parent (width:100%;\n height:100%) — consumer decides whether to wrap in <sd-modal>,\n <sd-side-drawer>, a page section, or use inline.\n-->\n<div [ngClass]=\"shellClass()\" role=\"region\">\n @let _stage = stage();\n @let _images = images();\n @let _thumbnailPosition = thumbnailPosition();\n @let _activeIndex = activeIndex();\n @let _activeImage = activeImage();\n\n <!-- ============================================\n HEADER BAR\n ============================================ -->\n @if (_stage !== 'empty' && _activeImage; as img) {\n <div class=\"sd-preview-header\">\n <div class=\"sd-preview-header__left\">\n <sd-icon class=\"sd-preview-header__icon\" fontIcon=\"image\"></sd-icon>\n <div class=\"sd-preview-header__meta\">\n <div class=\"sd-preview-header__name T14M\" [title]=\"img.name\">{{ img.name }}</div>\n @if (img.size) {\n <div class=\"sd-preview-header__sub\">\n {{ formatBytes(img.size) }}\n </div>\n }\n </div>\n </div>\n\n @if (_images.length > 1) {\n <div class=\"sd-preview-header__counter\" aria-live=\"polite\">\n {{ _activeIndex + 1 }} / {{ _images.length }}\n </div>\n }\n </div>\n } @else if (title()) {\n <!-- Optional override title even on empty state -->\n <div class=\"sd-preview-header sd-preview-header--simple\">\n <div class=\"sd-preview-header__name T14M\">{{ title() }}</div>\n </div>\n }\n\n <!-- ============================================\n BODY (stage + thumbnails per layout)\n ============================================ -->\n <div class=\"sd-preview-body\">\n\n <!-- STAGE ............................................................... -->\n <div\n class=\"sd-preview-stage\"\n [class.sd-preview-stage--dragging]=\"zoom() > 1\"\n (wheel)=\"onWheel($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel($event)\"\n (dblclick)=\"onImageDblClick()\">\n\n @switch (_stage) {\n @case ('empty') {\n <div class=\"sd-preview-status\">\n <div class=\"sd-preview-status__tile sd-preview-status__tile--muted\">\n <sd-icon fontIcon=\"image_not_supported\"></sd-icon>\n </div>\n <div class=\"sd-preview-status__title\">\n {{ 'core.component.preview-image.no-image' | translate }}\n </div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.no-image-hint' | translate }}\n </div>\n </div>\n }\n @case ('loading') {\n <div class=\"sd-preview-status\">\n <div class=\"sd-preview-spinner\" role=\"progressbar\"></div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.loading' | translate }}\n </div>\n </div>\n }\n @default {\n @if (_activeImage; as img) {\n @if (img.loading) {\n <!-- Per-image loading (retry inline) — giữ nav/dots/thumbs visible -->\n <div class=\"sd-preview-image-loading\" role=\"status\"\n [attr.aria-label]=\"'core.component.preview-image.loading' | translate\">\n <div class=\"sd-preview-spinner\"></div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.loading' | translate }}\n </div>\n </div>\n } @else if (img.error) {\n <!-- Inline broken-image placeholder — giữ nav/dots/thumbs visible -->\n <div class=\"sd-preview-image-broken\" role=\"img\"\n [attr.aria-label]=\"'core.component.preview-image.load-error' | translate\">\n <div class=\"sd-preview-status__tile sd-preview-status__tile--danger\">\n <sd-icon fontIcon=\"broken_image\"></sd-icon>\n </div>\n <div class=\"sd-preview-status__title\">\n {{ 'core.component.preview-image.load-error' | translate }}\n </div>\n <div class=\"sd-preview-status__hint\">\n {{ 'core.component.preview-image.load-error-hint' | translate }}\n </div>\n <button type=\"button\" class=\"sd-preview-btn-primary\" (click)=\"retryActive()\" [attr.data-autoId]=\"autoIdRetry()\">\n <sd-icon fontIcon=\"refresh\"></sd-icon>\n <span>{{ 'core.component.preview-image.retry' | translate }}</span>\n </button>\n </div>\n } @else {\n <img\n class=\"sd-preview-image\"\n [src]=\"img.blobUrl || img.url\"\n [alt]=\"img.alt || img.name\"\n [style.transform]=\"imageTransform()\"\n (error)=\"onImageError()\"\n draggable=\"false\" />\n\n @if (img.caption) {\n <div class=\"sd-preview-caption\">{{ img.caption }}</div>\n }\n }\n }\n }\n }\n\n <!-- KEYBOARD HINT ............................................. -->\n @if (_stage === 'ready' && _images.length > 1) {\n <div class=\"sd-preview-kbd-hint\" aria-hidden=\"true\">\n <span class=\"sd-preview-kbd\">←</span>\n <span class=\"sd-preview-kbd\">→</span>\n <span class=\"sd-preview-kbd-text\">{{ 'core.component.preview-image.kbd-hint-nav' | translate }}</span>\n </div>\n }\n\n <!-- NAV ARROWS ............................................. -->\n @if (_stage === 'ready' && _images.length > 1) {\n <button\n type=\"button\"\n class=\"sd-preview-nav sd-preview-nav--prev\"\n [disabled]=\"!hasPrev()\"\n [attr.aria-label]=\"'core.component.preview-image.prev' | translate\"\n [attr.data-autoId]=\"autoIdPrev()\"\n (click)=\"updateCurrentImage(-1)\">\n <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-nav sd-preview-nav--next\"\n [disabled]=\"!hasNext()\"\n [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n [attr.data-autoId]=\"autoIdNext()\"\n (click)=\"updateCurrentImage(1)\">\n <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n </button>\n }\n\n <!-- DOTS INDICATOR ......................................... -->\n @if (_thumbnailPosition === 'dots' && _stage === 'ready' && _images.length > 1) {\n <div class=\"sd-preview-dots\" role=\"tablist\">\n @for (img of _images; track img.id; let i = $index) {\n <button\n type=\"button\"\n class=\"sd-preview-dot\"\n [class.sd-preview-dot--active]=\"i === _activeIndex\"\n [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n [attr.data-autoId]=\"autoIdDot(i)\"\n (click)=\"onClickThumbnailImage(i)\"></button>\n }\n </div>\n }\n\n <!-- FLOATING TOOLBAR ....................................... -->\n @if (showToolbar() && _stage === 'ready') {\n <div class=\"sd-preview-toolbar\" role=\"toolbar\">\n @if (zoomable()) {\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.zoom-out' | translate\"\n [attr.title]=\"'core.component.preview-image.zoom-out' | translate\"\n [attr.data-autoId]=\"autoIdZoomOut()\"\n (click)=\"zoomOut()\">\n <sd-icon fontIcon=\"zoom_out\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__readout\">{{ zoomPercent() }}%</span>\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.zoom-in' | translate\"\n [attr.title]=\"'core.component.preview-image.zoom-in' | translate\"\n [attr.data-autoId]=\"autoIdZoomIn()\"\n (click)=\"zoomIn()\">\n <sd-icon fontIcon=\"zoom_in\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__divider\"></span>\n }\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn sd-preview-toolbar__btn--with-label\"\n [attr.aria-label]=\"'core.component.preview-image.fit' | translate\"\n [attr.data-autoId]=\"autoIdFit()\"\n (click)=\"fitToScreen()\">\n <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n <span class=\"sd-preview-toolbar__btn-label\">{{ 'core.component.preview-image.fit' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.rotate' | translate\"\n [attr.title]=\"'core.component.preview-image.rotate' | translate\"\n [attr.data-autoId]=\"autoIdRotate()\"\n (click)=\"rotate('right')\">\n <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n </button>\n <span class=\"sd-preview-toolbar__divider\"></span>\n @if (downloadable()) {\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.download' | translate\"\n [attr.title]=\"'core.component.preview-image.download' | translate\"\n [attr.data-autoId]=\"autoIdDownload()\"\n (click)=\"downloadCurrent()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n </button>\n }\n <button\n type=\"button\"\n class=\"sd-preview-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-image.fullscreen' | translate\"\n [attr.title]=\"'core.component.preview-image.fullscreen' | translate\"\n [attr.data-autoId]=\"autoIdFullscreen()\"\n (click)=\"toggleFullscreen()\">\n <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n </button>\n </div>\n }\n </div>\n\n <!-- THUMBNAIL STRIP .................................................... -->\n @if (\n _stage === 'ready' &&\n _images.length > 1 &&\n _thumbnailPosition !== 'none' &&\n _thumbnailPosition !== 'dots'\n ) {\n <div\n class=\"sd-preview-thumbs\"\n [class.sd-preview-thumbs--vertical]=\"_thumbnailPosition === 'left' || _thumbnailPosition === 'right'\">\n @for (img of _images; track trackByImage($index, img); let i = $index) {\n <button\n type=\"button\"\n class=\"sd-preview-thumb\"\n [class.sd-preview-thumb--active]=\"i === _activeIndex\"\n [id]=\"'sd-preview-thumb-' + i\"\n [attr.aria-label]=\"img.name\"\n [attr.aria-current]=\"i === _activeIndex ? 'true' : null\"\n [attr.data-autoId]=\"autoIdThumb(i)\"\n (click)=\"onClickThumbnailImage(i)\">\n @if (img.error) {\n <div class=\"sd-preview-thumb__broken\">\n <sd-icon fontIcon=\"broken_image\"></sd-icon>\n </div>\n } @else {\n <img class=\"sd-preview-thumb__img\" [src]=\"img.blobUrl || img.url\" [alt]=\"img.alt || img.name\" />\n }\n <span class=\"sd-preview-thumb__badge\">{{ i + 1 }}</span>\n @if (_thumbnailPosition === 'right' || _thumbnailPosition === 'left') {\n <span class=\"sd-preview-thumb__name\" [title]=\"img.name\">{{ img.name }}</span>\n }\n </button>\n }\n </div>\n }\n </div>\n</div>\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\n\nexport interface SdPdfIntersectionEntry {\n readonly target: Element;\n readonly isIntersecting: boolean;\n}\n\nexport interface SdPdfBrowserAdapter {\n readonly isBrowser: boolean;\n /** The platform can trigger an anchor download for an existing URL. */\n readonly canDownloadUrl: boolean;\n /** The platform can create/revoke an object URL and then download it. */\n readonly canDownloadBlob: boolean;\n readonly canFullscreen: boolean;\n isFile(value: unknown): value is File;\n isBlob(value: unknown): value is Blob;\n createPdfBlob(data: Uint8Array): Blob | null;\n createObjectUrl(blob: Blob): string | null;\n revokeObjectUrl(url: string): void;\n download(href: string, filename: string): boolean;\n createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null;\n createImage(): HTMLImageElement | null;\n listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void;\n toggleFullscreen(host: HTMLElement): Promise<void>;\n observeResize(element: Element, listener: () => void): () => void;\n observeIntersections(\n elements: readonly Element[],\n listener: (entries: readonly SdPdfIntersectionEntry[]) => void,\n options?: IntersectionObserverInit\n ): () => void;\n scheduleFrame(callback: FrameRequestCallback): number | null;\n cancelFrame(handle: number | null): void;\n}\n\nclass SdPdfDocumentBrowserAdapter implements SdPdfBrowserAdapter {\n readonly isBrowser: boolean;\n readonly canDownloadUrl: boolean;\n readonly canDownloadBlob: boolean;\n readonly canFullscreen: boolean;\n\n constructor(\n private readonly document: Document,\n platformId: object\n ) {\n this.isBrowser = isPlatformBrowser(platformId) && !!document.defaultView;\n this.canDownloadUrl = this.isBrowser && !!document.body && 'download' in document.createElement('a');\n const view = document.defaultView;\n this.canDownloadBlob =\n this.canDownloadUrl &&\n typeof view?.Blob === 'function' &&\n typeof view.URL?.createObjectURL === 'function' &&\n typeof view.URL?.revokeObjectURL === 'function';\n this.canFullscreen =\n this.isBrowser && typeof document.documentElement?.requestFullscreen === 'function' && typeof document.exitFullscreen === 'function';\n }\n\n isFile(value: unknown): value is File {\n const FileCtor = this.document.defaultView?.File;\n return this.isBrowser && !!FileCtor && value instanceof FileCtor;\n }\n\n isBlob(value: unknown): value is Blob {\n const BlobCtor = this.document.defaultView?.Blob;\n return this.isBrowser && !!BlobCtor && value instanceof BlobCtor;\n }\n\n createPdfBlob(data: Uint8Array): Blob | null {\n const BlobCtor = this.document.defaultView?.Blob;\n if (!this.isBrowser || !BlobCtor) return null;\n return new BlobCtor([new Uint8Array(data)], { type: 'application/pdf' });\n }\n\n createObjectUrl(blob: Blob): string | null {\n const urlApi = this.document.defaultView?.URL;\n return this.isBrowser && urlApi?.createObjectURL ? urlApi.createObjectURL(blob) : null;\n }\n\n revokeObjectUrl(url: string): void {\n if (!this.isBrowser) return;\n this.document.defaultView?.URL?.revokeObjectURL?.(url);\n }\n\n download(href: string, filename: string): boolean {\n if (!this.canDownloadUrl || !this.document.body) return false;\n const anchor = this.document.createElement('a');\n anchor.href = href;\n anchor.download = filename;\n anchor.hidden = true;\n this.document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n return true;\n }\n\n createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null {\n return this.isBrowser ? this.document.createElement(tagName) : null;\n }\n\n createImage(): HTMLImageElement | null {\n return this.createElement('img');\n }\n\n listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void {\n if (!this.isBrowser) return () => undefined;\n const onChange = (): void => listener(this.document.fullscreenElement === host);\n this.document.addEventListener('fullscreenchange', onChange);\n onChange();\n return () => this.document.removeEventListener('fullscreenchange', onChange);\n }\n\n async toggleFullscreen(host: HTMLElement): Promise<void> {\n if (!this.canFullscreen) return;\n if (this.document.fullscreenElement) {\n await this.document.exitFullscreen?.();\n return;\n }\n await host.requestFullscreen?.();\n }\n\n observeResize(element: Element, listener: () => void): () => void {\n const ResizeObserverCtor = this.document.defaultView?.ResizeObserver;\n if (!this.isBrowser || !ResizeObserverCtor) return () => undefined;\n const observer = new ResizeObserverCtor(() => listener());\n observer.observe(element);\n return () => observer.disconnect();\n }\n\n observeIntersections(\n elements: readonly Element[],\n listener: (entries: readonly SdPdfIntersectionEntry[]) => void,\n options?: IntersectionObserverInit\n ): () => void {\n const IntersectionObserverCtor = this.document.defaultView?.IntersectionObserver;\n if (!this.isBrowser || elements.length === 0) return () => undefined;\n if (!IntersectionObserverCtor) {\n listener(elements.map(target => ({ target, isIntersecting: true })));\n return () => undefined;\n }\n const observer = new IntersectionObserverCtor(entries => listener(entries), options);\n for (const element of elements) observer.observe(element);\n return () => observer.disconnect();\n }\n\n scheduleFrame(callback: FrameRequestCallback): number | null {\n const view = this.document.defaultView;\n if (!this.isBrowser || !view) return null;\n return view.requestAnimationFrame ? view.requestAnimationFrame(callback) : view.setTimeout(() => callback(view.performance.now()), 0);\n }\n\n cancelFrame(handle: number | null): void {\n if (handle === null || !this.isBrowser) return;\n this.document.defaultView?.cancelAnimationFrame?.(handle);\n this.document.defaultView?.clearTimeout(handle);\n }\n}\n\nexport const SD_PDF_BROWSER_ADAPTER = new InjectionToken<SdPdfBrowserAdapter>('SD_PDF_BROWSER_ADAPTER', {\n providedIn: 'root',\n factory: () => new SdPdfDocumentBrowserAdapter(inject(DOCUMENT), inject(PLATFORM_ID)),\n});\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\n\nexport interface SdPdfPrintJob {\n readonly finished: Promise<void>;\n cancel(): void;\n}\n\nexport interface SdPdfPrintAdapter {\n readonly isSupported: boolean;\n start(data: Uint8Array, filename: string): SdPdfPrintJob | null;\n}\n\nclass SdPdfIframePrintAdapter implements SdPdfPrintAdapter {\n readonly #isBrowser: boolean;\n readonly isSupported: boolean;\n\n constructor(\n private readonly document: Document,\n platformId: object\n ) {\n this.#isBrowser = isPlatformBrowser(platformId) && !!document.defaultView;\n const view = document.defaultView;\n this.isSupported =\n this.#isBrowser &&\n !!view?.Blob &&\n typeof view.URL?.createObjectURL === 'function' &&\n typeof view.URL?.revokeObjectURL === 'function' &&\n !!document.body;\n }\n\n start(data: Uint8Array, filename: string): SdPdfPrintJob | null {\n const view = this.document.defaultView;\n const BlobCtor = view?.Blob;\n const urlApi = view?.URL;\n if (\n !this.isSupported ||\n !view ||\n !BlobCtor ||\n typeof urlApi?.createObjectURL !== 'function' ||\n typeof urlApi.revokeObjectURL !== 'function' ||\n !this.document.body\n ) {\n return null;\n }\n\n const blob = new BlobCtor([new Uint8Array(data)], { type: 'application/pdf' });\n const objectUrl = urlApi.createObjectURL(blob);\n const frame = this.document.createElement('iframe');\n frame.hidden = true;\n frame.title = filename;\n\n let settled = false;\n let timeoutHandle: number | null = null;\n let resolveFinished: () => void = () => undefined;\n let rejectFinished: (reason: Error) => void = () => undefined;\n const finished = new Promise<void>((resolve, reject) => {\n resolveFinished = resolve;\n rejectFinished = reject;\n });\n\n const attemptCleanup = (operation: () => void): void => {\n try {\n operation();\n } catch {\n // Cleanup is best-effort; every remaining step and promise settlement must still run.\n }\n };\n const cleanup = (): void => {\n if (timeoutHandle !== null) attemptCleanup(() => view.clearTimeout(timeoutHandle!));\n attemptCleanup(() => frame.contentWindow?.removeEventListener('afterprint', complete));\n attemptCleanup(() => frame.removeEventListener('load', onLoad));\n attemptCleanup(() => frame.removeEventListener('error', onError));\n attemptCleanup(() => frame.remove());\n attemptCleanup(() => urlApi.revokeObjectURL(objectUrl));\n };\n const complete = (): void => {\n if (settled) return;\n settled = true;\n cleanup();\n resolveFinished();\n };\n const fail = (message: string): void => {\n if (settled) return;\n settled = true;\n cleanup();\n rejectFinished(new Error(message));\n };\n const onError = (): void => fail('Unable to load the PDF print frame.');\n const onLoad = (): void => {\n const printWindow = frame.contentWindow;\n if (!printWindow?.print) {\n fail('Printing is unavailable in this browser.');\n return;\n }\n printWindow.addEventListener('afterprint', complete, { once: true });\n timeoutHandle = view.setTimeout(complete, 30_000);\n try {\n printWindow.focus();\n printWindow.print();\n } catch {\n fail('The browser blocked the PDF print dialog.');\n }\n };\n\n frame.addEventListener('load', onLoad, { once: true });\n frame.addEventListener('error', onError, { once: true });\n frame.src = objectUrl;\n this.document.body.appendChild(frame);\n\n return {\n finished,\n cancel: complete,\n };\n }\n}\n\nexport const SD_PDF_PRINT_ADAPTER = new InjectionToken<SdPdfPrintAdapter>('SD_PDF_PRINT_ADAPTER', {\n providedIn: 'root',\n factory: () => new SdPdfIframePrintAdapter(inject(DOCUMENT), inject(PLATFORM_ID)),\n});\n","import { InjectionToken } from '@angular/core';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport interface SdPdfRenderTask {\n readonly promise: Promise<void>;\n cancel(): void;\n}\n\nexport interface SdPdfViewport {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface SdPdfTextItem {\n readonly str: string;\n}\n\nexport interface SdPdfTextContent {\n readonly items: readonly unknown[];\n}\n\nexport interface SdPdfPageProxy {\n getViewport(parameters: { scale: number; rotation?: number }): SdPdfViewport;\n render(parameters: { canvasContext: CanvasRenderingContext2D; viewport: SdPdfViewport }): SdPdfRenderTask;\n getTextContent(): Promise<SdPdfTextContent | unknown>;\n cleanup(): void;\n}\n\nexport interface SdPdfReference {\n readonly num: number;\n readonly gen: number;\n}\n\nexport type SdPdfDestination = string | readonly unknown[] | null;\n\nexport interface SdPdfRawOutlineItem {\n readonly title?: string;\n readonly dest?: SdPdfDestination;\n readonly url?: string | null;\n readonly items?: readonly SdPdfRawOutlineItem[];\n}\n\nexport interface SdPdfDocumentProxy {\n readonly numPages: number;\n getPage(pageNumber: number): Promise<SdPdfPageProxy>;\n getMetadata(): Promise<{\n readonly info?: { readonly Title?: string; readonly Author?: string; readonly Subject?: string };\n }>;\n getOutline(): Promise<readonly SdPdfRawOutlineItem[] | null>;\n getDestination(name: string): Promise<readonly unknown[] | null>;\n getPageIndex(reference: SdPdfReference): Promise<number>;\n cachedPageNumber(reference: SdPdfReference): number | null;\n getData(): Promise<Uint8Array>;\n destroy(): Promise<void>;\n}\n\nexport interface SdPdfLoadingTask {\n readonly promise: Promise<SdPdfDocumentProxy>;\n onProgress?: (progress: { loaded: number; total: number }) => void;\n destroy?(): Promise<void> | void;\n}\n\nexport interface SdPdfDocumentSpec {\n url?: string;\n data?: Uint8Array;\n httpHeaders?: Record<string, string>;\n withCredentials?: boolean;\n password?: string;\n}\n\nexport interface SdPdfJsLib {\n getDocument(spec: SdPdfDocumentSpec): SdPdfLoadingTask;\n readonly GlobalWorkerOptions: { workerSrc: string };\n}\n\nfunction isSdPdfJsLib(value: unknown): value is SdPdfJsLib {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as { getDocument?: unknown; GlobalWorkerOptions?: { workerSrc?: unknown } };\n return typeof candidate.getDocument === 'function' && typeof candidate.GlobalWorkerOptions?.workerSrc === 'string';\n}\n\nexport const SD_PDFJS_LIB = new InjectionToken<SdPdfJsLib>('SD_PDFJS_LIB', {\n providedIn: 'root',\n factory: (): SdPdfJsLib => {\n if (!pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();\n }\n const candidate: unknown = pdfjsLib;\n if (!isSdPdfJsLib(candidate)) {\n throw new Error('The installed pdfjs-dist build does not expose getDocument().');\n }\n return candidate;\n },\n});\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport {\n PdfErrorEvent,\n PdfErrorReason,\n PdfLoadEvent,\n PdfMeta,\n PdfOutlineItem,\n PdfScrollMode,\n PdfSearchResult,\n PdfSearchState,\n PdfSidebarMode,\n PdfSource,\n PdfStage,\n PdfZoomMode,\n PreviewTheme,\n} from './preview-pdf.types';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SD_PDF_BROWSER_ADAPTER } from './preview-pdf.browser';\nimport { SD_PDF_PRINT_ADAPTER, SdPdfPrintJob } from './preview-pdf.print';\nimport {\n SD_PDFJS_LIB,\n SdPdfDocumentProxy,\n SdPdfDocumentSpec,\n SdPdfLoadingTask,\n SdPdfPageProxy,\n SdPdfRawOutlineItem,\n SdPdfReference,\n SdPdfRenderTask,\n SdPdfViewport,\n} from './preview-pdf.pdfjs';\n\nexport { SD_PDFJS_LIB } from './preview-pdf.pdfjs';\nexport type { SdPdfJsLib } from './preview-pdf.pdfjs';\n\nlet nextPdfPreviewInstanceId = 0;\n\ninterface PdfOutlineRow {\n readonly item: PdfOutlineItem;\n readonly level: number;\n readonly parentId: string | null;\n}\n\ninterface PdfOutlineTraversal {\n nodes: number;\n}\n\ninterface PdfPageTextScan {\n readonly snapshot: ReadonlyMap<number, string>;\n readonly staged: Map<number, string>;\n}\n\ninterface PdfSearchRequest {\n readonly token: number;\n readonly doc: SdPdfDocumentProxy;\n readonly expression: RegExp;\n readonly resolve: (resultCount: number) => void;\n}\n\ntype PdfThumbnailSlotState = 'new' | 'queued' | 'active' | 'released';\n\ninterface PdfThumbnailWork {\n readonly loadToken: number;\n cancelled: boolean;\n renderTask: SdPdfRenderTask | null;\n slotState: PdfThumbnailSlotState;\n resumeSlot: ((acquired: boolean) => void) | null;\n}\n\nclass PdfHeightIndex {\n readonly #gap: number;\n #tree: number[] = [0];\n #values: number[] = [];\n\n constructor(gap: number) {\n this.#gap = gap;\n }\n\n reset(heights: readonly number[]): void {\n this.#values = heights.map((height, index) => height + (index < heights.length - 1 ? this.#gap : 0));\n this.#tree = Array.from({ length: this.#values.length + 1 }, () => 0);\n for (let index = 1; index < this.#tree.length; index++) {\n this.#tree[index] += this.#values[index - 1];\n const parent = index + (index & -index);\n if (parent < this.#tree.length) this.#tree[parent] += this.#tree[index];\n }\n }\n\n updateHeight(index: number, height: number): void {\n if (index < 0 || index >= this.#values.length) return;\n const next = height + (index < this.#values.length - 1 ? this.#gap : 0);\n const delta = next - this.#values[index];\n this.#values[index] = next;\n for (let cursor = index + 1; cursor < this.#tree.length; cursor += cursor & -cursor) this.#tree[cursor] += delta;\n }\n\n offsetAt(index: number): number {\n let sum = 0;\n for (let cursor = Math.max(0, Math.min(index, this.#values.length)); cursor > 0; cursor -= cursor & -cursor) {\n sum += this.#tree[cursor];\n }\n return sum;\n }\n\n total(): number {\n return this.offsetAt(this.#values.length);\n }\n\n indexAt(offset: number): number {\n if (this.#values.length === 0) return 0;\n const bounded = Math.max(0, Math.min(offset, this.total()));\n let index = 0;\n let prefix = 0;\n let bit = 1;\n while (bit * 2 < this.#tree.length) bit *= 2;\n for (; bit > 0; bit >>= 1) {\n const next = index + bit;\n if (next < this.#tree.length && prefix + this.#tree[next] <= bounded) {\n index = next;\n prefix += this.#tree[next];\n }\n }\n return Math.min(index, this.#values.length - 1);\n }\n}\n\ntype PdfSidebarTabMode = Exclude<PdfSidebarMode, 'none'>;\n\n@Component({\n selector: 'sd-preview-pdf',\n standalone: true,\n imports: [SdIcon, CommonModule, FormsModule, TranslatePipe],\n templateUrl: './preview-pdf.component.html',\n styleUrl: './preview-pdf.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n // mà không cần bind document. Mirror the preview-image pattern — consumer\n // (modal/drawer/page) chỉ cần thả component vào DOM.\n host: {\n tabindex: '0',\n class: 'sd-preview-pdf-host',\n // WHY data-theme attribute: SCSS uses :host([data-theme=\"light\"]) to swap\n // CSS custom properties — declarative, devtools-visible, no class-name\n // collision with consumer styling.\n '[attr.data-theme]': 'theme()',\n '[class.sd-preview-pdf-host--fullscreen]': 'isFullscreen()',\n },\n})\nexport class SdPreviewPdf {\n // ==========================================\n // CONSTANTS\n // ==========================================\n // Dải zoom hữu dụng cho viewer PDF. Dưới 25% chữ thành chấm, trên 400% là\n // raster bị pixelated nặng (canvas + DPR vẫn có giới hạn). Trùng dải của\n // preview-image để consumer làm quen với 1 spec duy nhất.\n static readonly MIN_ZOOM = 0.25;\n static readonly MAX_ZOOM = 4;\n static readonly ZOOM_STEP = 0.1;\n static readonly OUTLINE_MAX_DEPTH = 64;\n static readonly OUTLINE_MAX_NODES = 10_000;\n static readonly MAX_SEARCH_RESULTS = 1000;\n static readonly MAX_PAGE_TEXT_CACHE_PAGES = 128;\n static readonly THUMBNAIL_WINDOW_SIZE = 48;\n static readonly THUMBNAIL_ITEM_HEIGHT = 220;\n static readonly MAX_THUMBNAIL_CACHE_ENTRIES = 96;\n private static readonly MAX_CONCURRENT_THUMBNAIL_WORK = 4;\n static readonly MAX_CANVAS_DIMENSION = 8192;\n static readonly MAX_CANVAS_PIXELS = 16_777_216;\n\n // ==========================================\n // DI\n // ==========================================\n readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #destroyRef = inject(DestroyRef);\n readonly #pdfjs = inject(SD_PDFJS_LIB);\n readonly #browser = inject(SD_PDF_BROWSER_ADAPTER);\n readonly #printAdapter = inject(SD_PDF_PRINT_ADAPTER);\n readonly #instanceId = `sd-preview-pdf-${++nextPdfPreviewInstanceId}`;\n\n // ==========================================\n // VIEW CHILDREN\n // WHY `protected readonly` (not `#private`): Angular's `viewChild()` query\n // function emits a decorator-equivalent metadata that the compiler can't\n // see through ES private fields (NG1053). `protected` keeps them invisible\n // to consumers but accessible to the template.\n // ==========================================\n protected readonly pageCanvasRef = viewChild<ElementRef<HTMLCanvasElement>>('pageCanvas');\n protected readonly stageEl = viewChild<ElementRef<HTMLElement>>('stageRef');\n protected readonly pageInputRef = viewChild<ElementRef<HTMLInputElement>>('pageInput');\n protected readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n protected readonly sidebarContentRef = viewChild<ElementRef<HTMLElement>>('sidebarContent');\n protected readonly outlineItemRefs = viewChildren<ElementRef<HTMLElement>>('outlineItem');\n protected readonly sidebarTabRefs = viewChildren<ElementRef<HTMLButtonElement>>('sidebarTab');\n protected readonly continuousCanvases = viewChildren<ElementRef<HTMLCanvasElement>>('continuousCanvas');\n // Every thumbnail <canvas> in the sidebar — populated when sidebar is open +\n // mode==='thumbnails'. We feed these to the IntersectionObserver below so a\n // thumb only renders when it scrolls into the viewport (lazy fill).\n protected readonly thumbCanvases = viewChildren<ElementRef<HTMLCanvasElement>>('thumbCanvas');\n\n // ==========================================\n // INPUTS (signal-based, Angular 19 style)\n // ==========================================\n // autoId prefix `preview-pdf-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-pdf-${this.autoIdInput()}` : undefined));\n\n readonly #childAutoId = (suffix: string): string | undefined => {\n return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n };\n\n // Page navigation\n readonly autoIdFirst = computed(() => this.#childAutoId('first'));\n readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n readonly autoIdNext = computed(() => this.#childAutoId('next'));\n readonly autoIdLast = computed(() => this.#childAutoId('last'));\n readonly autoIdPageInput = computed(() => this.#childAutoId('page-input'));\n // Zoom\n readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n readonly autoIdZoomReadout = computed(() => this.#childAutoId('zoom-readout'));\n // Modes\n readonly autoIdFitPage = computed(() => this.#childAutoId('fit-page'));\n readonly autoIdFitWidth = computed(() => this.#childAutoId('fit-width'));\n readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n readonly autoIdScrollMode = computed(() => this.#childAutoId('scroll-mode'));\n // Header actions\n readonly autoIdSearchToggle = computed(() => this.#childAutoId('search'));\n readonly autoIdPrint = computed(() => this.#childAutoId('print'));\n readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n readonly autoIdSidebarToggle = computed(() => this.#childAutoId('sidebar-toggle'));\n // Sidebar tabs\n readonly autoIdTabThumbnails = computed(() => this.#childAutoId('tab-thumbnails'));\n readonly autoIdTabOutline = computed(() => this.#childAutoId('tab-outline'));\n readonly autoIdTabSearch = computed(() => this.#childAutoId('tab-search'));\n readonly sidebarPanelId = computed(() => this.#childAutoId('sidebar-panel') ?? `${this.#instanceId}-sidebar-panel`);\n readonly sidebarRegionId = computed(() => this.#childAutoId('sidebar') ?? `${this.#instanceId}-sidebar`);\n readonly searchBarId = computed(() => this.#childAutoId('searchbar') ?? `${this.#instanceId}-searchbar`);\n readonly tabThumbnailsId = computed(() => this.#childAutoId('tab-thumbnails') ?? `${this.#instanceId}-tab-thumbnails`);\n readonly tabOutlineId = computed(() => this.#childAutoId('tab-outline') ?? `${this.#instanceId}-tab-outline`);\n readonly tabSearchId = computed(() => this.#childAutoId('tab-search') ?? `${this.#instanceId}-tab-search`);\n readonly sidebarActiveTabId = computed(() => {\n switch (this.#sidebarModeInternal()) {\n case 'outline':\n return this.tabOutlineId();\n case 'search':\n return this.tabSearchId();\n default:\n return this.tabThumbnailsId();\n }\n });\n // Search bar\n readonly autoIdSearchInput = computed(() => this.#childAutoId('search-input'));\n readonly autoIdSearchNext = computed(() => this.#childAutoId('search-next'));\n readonly autoIdSearchPrev = computed(() => this.#childAutoId('search-prev'));\n readonly autoIdSearchCase = computed(() => this.#childAutoId('search-case'));\n readonly autoIdSearchWhole = computed(() => this.#childAutoId('search-whole'));\n readonly autoIdSearchClose = computed(() => this.#childAutoId('search-close'));\n // Retry (error state)\n readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n // Per-index helpers (thumb + search result)\n readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n readonly autoIdResult = (i: number): string | undefined => this.#childAutoId(`result-${i}`);\n\n readonly source = input<PdfSource | null>(null);\n readonly title = input<string | undefined>(undefined);\n readonly startPage = input(1);\n readonly initialZoom = input<PdfZoomMode>('page-fit');\n readonly sidebar = input<PdfSidebarMode>('thumbnails');\n readonly sidebarOpen = input(true);\n readonly scrollMode = input<PdfScrollMode>('page');\n readonly showToolbar = input(true);\n readonly downloadable = input(true);\n readonly password = input<string | undefined>(undefined);\n readonly httpHeaders = input<Record<string, string> | undefined>(undefined);\n // Theme variant — drives [data-theme] host attribute. Default 'dark'\n // preserves the original visual contract; 'light' flips token set via SCSS.\n readonly theme = input<PreviewTheme>('dark');\n\n // ==========================================\n // OUTPUTS\n // ==========================================\n readonly close = output<void>();\n readonly loaded = output<PdfLoadEvent>();\n readonly pageChange = output<number>();\n readonly zoomChange = output<number>();\n readonly download = output<{ filename: string }>();\n readonly loadError = output<PdfErrorEvent>();\n // Fired whenever the search term, results, or active index changes — gives\n // the consumer a stable hook for analytics / sticky highlight bars without\n // poking at the internal state signal.\n readonly searchChange = output<{ term: string; total: number; current: number; truncated: boolean }>();\n\n // ==========================================\n // STATE (signals)\n // ==========================================\n readonly #stage = signal<PdfStage>('empty');\n readonly #pdfDoc = signal<SdPdfDocumentProxy | null>(null);\n readonly #meta = signal<PdfMeta | null>(null);\n readonly #activePage = signal(1);\n readonly #zoom = signal(1);\n readonly #zoomMode = signal<PdfZoomMode>('page-fit');\n readonly #rotation = signal(0);\n readonly #sidebarOpenInternal = signal(true);\n readonly #sidebarModeInternal = signal<PdfSidebarMode>('thumbnails');\n readonly #scrollModeInternal = signal<PdfScrollMode>('page');\n readonly #loadProgress = signal({ loaded: 0, total: 0 });\n readonly #loadError = signal<PdfErrorEvent | null>(null);\n readonly #isFullscreen = signal(false);\n readonly #filename = signal('document.pdf');\n readonly #fileSize = signal(0);\n readonly #continuousPages = signal<number[]>([]);\n readonly #continuousTopSpacer = signal(0);\n readonly #continuousBottomSpacer = signal(0);\n readonly #continuousHeightVersion = signal(0);\n readonly #thumbnailWindowStart = signal(0);\n readonly #outline = signal<readonly PdfOutlineItem[]>([]);\n readonly #outlineExpanded = signal<ReadonlySet<string>>(new Set<string>());\n readonly #outlineFocusId = signal<string | null>(null);\n\n // Thumbnail cache: page number → data URL of mini-render. Lazy-populated as\n // the user opens the sidebar / scrolls thumbnails into view.\n readonly #thumbCache = signal<Record<number, string>>({});\n readonly #thumbnailCacheLru = new Map<number, string>();\n\n // ==========================================\n // SEARCH STATE\n // ==========================================\n // Whether the search bar (between header + body) is visible. Toggled via\n // Ctrl+F, the sidebar tab, or `openSearch()` / `closeSearch()`. Independent\n // from the sidebar's `'search'` tab — the bar can stay open with the\n // sidebar closed (Ctrl+F flow), and the tab can be open without the bar.\n readonly #searchBarOpen = signal(false);\n // Persisted across `clearSearch()` so user toggles don't reset on each new\n // term — mirrors Acrobat / Chrome's \"Find in page\" behaviour.\n readonly #searchCaseSensitive = signal(false);\n readonly #searchWholeWord = signal(false);\n readonly #searchTerm = signal('');\n readonly #searchResults = signal<PdfSearchResult[]>([]);\n readonly #searchTruncated = signal(false);\n // -1 sentinel means \"no result focused yet\" (e.g. right after clearSearch\n // or before the first searchNext). Highlight rendering uses this to skip\n // the `--active` class altogether.\n readonly #searchActiveIndex = signal(-1);\n // Page-text cache: pageNum → fully-joined plain text. We pay the\n // `getTextContent()` cost once per page per document, then reuse across\n // re-runs (e.g. toggling case-sensitive). Cleared on every source change.\n readonly #pageTextCache = new Map<number, string>();\n readonly #pageTextCacheSize = signal(0);\n // Token to abort an in-flight `search()` call when a newer one supersedes it\n // — same pattern as #loadToken / #renderToken upstream.\n #searchToken = 0;\n #searchWorkerActive = false;\n #queuedSearchRequest: PdfSearchRequest | null = null;\n // The IntersectionObserver instance that drives lazy thumb rendering. Lives\n // for the component's lifetime; we just rebind to the latest canvas refs\n // when the sidebar tab switches.\n #thumbObserverCleanup: (() => void) | null = null;\n // Pages currently being rendered as thumbs — guards against double work\n // when a thumb scrolls in/out/in rapidly.\n readonly #thumbnailWork = new Map<number, PdfThumbnailWork>();\n readonly #thumbnailWorkCount = signal(0);\n readonly #thumbnailSlotQueue: PdfThumbnailWork[] = [];\n #activeThumbnailSlots = 0;\n readonly #continuousTasks = new Map<number, SdPdfRenderTask>();\n readonly #continuousReservations = new Map<number, { readonly generation: number }>();\n #continuousFrame: number | null = null;\n #layoutGeneration = 0;\n #pageHeights: number[] = [];\n readonly #heightIndex = new PdfHeightIndex(24);\n\n // Cached resolved source object that getDocument actually consumed — used\n // for download fallback when caller passed a non-URL source.\n // Track ALL blob URLs we created so we can revoke on source change + destroy.\n readonly #ownedBlobUrls = new Set<string>();\n\n // Race guards mirror preview-image's #loadToken pattern.\n #loadToken = 0;\n #currentLoadingTask: SdPdfLoadingTask | null = null;\n #currentRenderTask: SdPdfRenderTask | null = null;\n #currentPrintJob: SdPdfPrintJob | null = null;\n #printGeneration = 0;\n #downloadGeneration = 0;\n #renderToken = 0;\n #destroyed = false;\n\n // ==========================================\n // COMPUTED (template-readable)\n // ==========================================\n readonly stage = this.#stage.asReadonly();\n readonly activePage = this.#activePage.asReadonly();\n readonly zoom = this.#zoom.asReadonly();\n readonly zoomMode = this.#zoomMode.asReadonly();\n readonly rotation = this.#rotation.asReadonly();\n readonly sidebarMode = this.#sidebarModeInternal.asReadonly();\n readonly scrollModeCurrent = this.#scrollModeInternal.asReadonly();\n readonly isFullscreen = this.#isFullscreen.asReadonly();\n readonly meta = this.#meta.asReadonly();\n readonly filename = this.#filename.asReadonly();\n readonly fileSize = this.#fileSize.asReadonly();\n readonly loadError$ = this.#loadError.asReadonly();\n readonly thumbCache = this.#thumbCache.asReadonly();\n readonly thumbnailWorkCount = this.#thumbnailWorkCount.asReadonly();\n readonly pageTextCacheSize = this.#pageTextCacheSize.asReadonly();\n readonly continuousPages = this.#continuousPages.asReadonly();\n readonly continuousTopSpacer = this.#continuousTopSpacer.asReadonly();\n readonly continuousBottomSpacer = this.#continuousBottomSpacer.asReadonly();\n readonly continuousPageHeights = computed<Record<number, number>>(() => {\n this.#continuousHeightVersion();\n return Object.fromEntries(this.#continuousPages().map(page => [page, this.#pageHeights[page - 1] ?? 1]));\n });\n readonly outline = this.#outline.asReadonly();\n readonly outlineFocusId = this.#outlineFocusId.asReadonly();\n readonly visibleOutline = computed<readonly PdfOutlineRow[]>(() => {\n const rows: PdfOutlineRow[] = [];\n const expanded = this.#outlineExpanded();\n const visit = (items: readonly PdfOutlineItem[], level: number, parentId: string | null): void => {\n for (const item of items) {\n rows.push({ item, level, parentId });\n if (item.children.length > 0 && expanded.has(item.id)) visit(item.children, level + 1, item.id);\n }\n };\n visit(this.#outline(), 1, null);\n return rows;\n });\n\n readonly numPages = computed(() => this.#meta()?.numPages ?? 0);\n readonly canPrev = computed(() => this.#activePage() > 1);\n readonly canNext = computed(() => {\n const n = this.numPages();\n return n > 0 && this.#activePage() < n;\n });\n readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n readonly loadPercent = computed(() => {\n const p = this.#loadProgress();\n if (p.total <= 0) return 0;\n return Math.min(100, Math.round((p.loaded / p.total) * 100));\n });\n readonly isSidebarOpen = computed(() => this.#sidebarOpenInternal() && this.#sidebarModeInternal() !== 'none');\n readonly canDownload = computed(() => {\n const source = this.source();\n if (!this.downloadable() || !source) return false;\n if (this.#requiresLoadedDocumentBytes(source)) {\n return this.#browser.canDownloadBlob && this.#stage() === 'ready' && this.#pdfDoc() !== null;\n }\n if (typeof source === 'string' || ('url' in source && typeof source.url === 'string')) {\n return this.#browser.canDownloadUrl;\n }\n return this.#browser.canDownloadBlob;\n });\n readonly canFullscreen = computed(() => this.#browser.canFullscreen);\n readonly canPrint = computed(() => this.#printAdapter.isSupported && this.#stage() === 'ready' && this.#pdfDoc() !== null);\n readonly pageList = computed(() => {\n const n = this.numPages();\n return n > 0 ? Array.from({ length: n }, (_, i) => i + 1) : [];\n });\n // Alias used by the template's thumbnail @for — keeps the JSX-y `pageNumbers`\n // name from the design handoff while reusing the same computed.\n readonly pageNumbers = computed(() => {\n const count = this.numPages();\n const start = Math.max(0, Math.min(this.#thumbnailWindowStart(), Math.max(0, count - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n const length = Math.min(SdPreviewPdf.THUMBNAIL_WINDOW_SIZE, count - start);\n return Array.from({ length }, (_, index) => start + index + 1);\n });\n readonly thumbnailTopSpacer = computed(() => this.#thumbnailWindowStart() * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT);\n readonly thumbnailBottomSpacer = computed(() => {\n const renderedEnd = this.#thumbnailWindowStart() + this.pageNumbers().length;\n return Math.max(0, this.numPages() - renderedEnd) * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT;\n });\n\n // Search readonly accessors for the template + tests. Read-only by design;\n // mutations go through `search()` / `searchNext()` etc.\n readonly searchBarOpen = this.#searchBarOpen.asReadonly();\n readonly searchTerm = this.#searchTerm.asReadonly();\n readonly searchResults = this.#searchResults.asReadonly();\n readonly searchActiveIndex = this.#searchActiveIndex.asReadonly();\n readonly searchCaseSensitive = this.#searchCaseSensitive.asReadonly();\n readonly searchWholeWord = this.#searchWholeWord.asReadonly();\n readonly searchTotal = computed(() => this.#searchResults().length);\n readonly searchTruncated = this.#searchTruncated.asReadonly();\n // 1-based \"X of N\" indicator for the search bar counter. Reads 0 when\n // there are no results so the template can hide / dim the counter.\n readonly searchCurrent = computed(() => {\n const idx = this.#searchActiveIndex();\n return idx < 0 ? 0 : idx + 1;\n });\n // Currently-active hit (or null when nothing is focused) — drives the\n // in-page `<mark class=\"--active\">` highlight + auto-scroll effect below.\n readonly searchActiveResult = computed<PdfSearchResult | null>(() => {\n const idx = this.#searchActiveIndex();\n const results = this.#searchResults();\n return idx >= 0 && idx < results.length ? results[idx] : null;\n });\n // Snapshot of the full search state — handed to consumer via\n // `getSearchState()` for parity with `searchChange` event shape.\n readonly searchState = computed<PdfSearchState>(() => ({\n term: this.#searchTerm(),\n caseSensitive: this.#searchCaseSensitive(),\n wholeWord: this.#searchWholeWord(),\n results: this.#searchResults(),\n activeIndex: this.#searchActiveIndex(),\n truncated: this.#searchTruncated(),\n }));\n\n // ==========================================\n // CONSTRUCTOR — declarative wiring\n // ==========================================\n constructor() {\n // Initialize internal mirrors from inputs once. WHY mirrors: user actions\n // (toggleSidebar / setSidebarMode / setZoom) must modify state that the\n // template reads; signal inputs are read-only.\n effect(() => {\n this.#sidebarOpenInternal.set(this.sidebarOpen());\n });\n effect(() => {\n const m = this.sidebar();\n this.#sidebarModeInternal.set(m);\n });\n let previousScrollModeInput: PdfScrollMode | undefined;\n effect(() => {\n const m = this.scrollMode();\n if (m === previousScrollModeInput) return;\n previousScrollModeInput = m;\n this.#scrollModeInternal.set(m);\n queueMicrotask(() => this.#onScrollModeChanged());\n });\n effect(() => {\n // Reset zoom mode when initialZoom input changes — only fires when the\n // input itself updates (not when user clicks zoom +/-).\n this.#zoomMode.set(this.initialZoom());\n });\n\n const removeFullscreenListener = this.#browser.listenFullscreen(this.#hostEl.nativeElement, active => {\n if (!this.#destroyed) this.#isFullscreen.set(active);\n });\n\n // React to source changes — destroy previous doc, load new one.\n // WHY untracked-via-queueMicrotask: `effect()` tracks every signal READ\n // sync-ly inside the callback. `#loadDocument` reads internal signals\n // (#pdfDoc via #destroyDoc, plus #zoom on the cleanup path). Letting the\n // effect track those would re-fire whenever we updated them inside the\n // load flow → infinite loop. Reading only `source()` here and deferring\n // the actual load to a microtask scopes the tracking to ONLY `source()`.\n effect(() => {\n const src = this.source();\n queueMicrotask(() => this.#loadDocument(src));\n });\n\n // Auto-focus host after first render so keyboard works immediately.\n afterNextRender(() => {\n if (!this.#browser.isBrowser || this.#destroyed) return;\n try {\n this.#hostEl.nativeElement.focus({ preventScroll: true });\n } catch {\n // ignore — focus() can throw on detached elements.\n }\n });\n\n // Drive lazy thumbnail rendering — every time the list of thumbnail\n // <canvas> refs changes (sidebar opens, mode flips, doc reloads) we\n // disconnect any prior observer and start watching the new set.\n // WHY effect (not afterNextRender): viewChildren() emits a signal that\n // updates whenever the template's @for collection mutates.\n effect(() => {\n const refs = this.thumbCanvases();\n this.#syncThumbObserver(refs.map(r => r.nativeElement));\n });\n\n effect(() => {\n const refs = this.continuousCanvases();\n this.#scheduleContinuousRenders(refs.map(ref => ref.nativeElement));\n });\n\n effect(onCleanup => {\n const stage = this.stageEl()?.nativeElement;\n if (!stage) return;\n const cleanup = this.#browser.observeResize(stage, () => {\n if (this.#destroyed || this.#stage() !== 'ready') return;\n if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n else void this.#renderActivePage();\n });\n onCleanup(cleanup);\n });\n\n // Re-apply highlights when the rendered page changes OR when the search\n // term / active hit changes. WHY a separate effect: text-layer overlay\n // doesn't exist in this commit, so we hook the page canvas wrapper and\n // sprinkle `<mark>` siblings via DOM. Effect re-runs are cheap; the\n // helper is a no-op when there's nothing to highlight.\n effect(() => {\n // Track these signals so the effect re-fires:\n this.#searchTerm();\n this.#searchActiveIndex();\n this.activePage();\n // Defer to a microtask so the canvas render finished writing — keeps\n // us out of the page render's await chain.\n queueMicrotask(() => this.#applyHighlightsForActivePage());\n });\n\n // Cleanup on destroy.\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n this.#loadToken++;\n this.#searchToken++;\n this.#cancelQueuedSearch();\n this.#downloadGeneration++;\n this.#renderToken++;\n this.#cancelLoadingTask();\n this.#cancelRender();\n this.#cancelContinuousRenders();\n this.#cancelThumbnailRenders();\n this.#cancelPrint();\n this.#destroyDoc();\n this.#revokeAllBlobs();\n this.#thumbObserverCleanup?.();\n this.#thumbObserverCleanup = null;\n this.#thumbnailCacheLru.clear();\n this.#clearPageTextCache();\n removeFullscreenListener();\n });\n }\n\n // ==========================================\n // PUBLIC API\n // ==========================================\n\n goToPage(page: number): void {\n const n = this.numPages();\n if (n <= 0) return;\n const target = Math.max(1, Math.min(page, n));\n const changed = target !== this.#activePage();\n if (changed) {\n this.#activePage.set(target);\n this.pageChange.emit(target);\n }\n this.#ensureThumbnailPageVisible(target);\n if (this.#scrollModeInternal() === 'continuous') {\n this.#positionContinuousPage(target);\n } else if (changed) {\n void this.#renderActivePage();\n }\n }\n\n nextPage(): void {\n this.goToPage(this.#activePage() + 1);\n }\n prevPage(): void {\n this.goToPage(this.#activePage() - 1);\n }\n firstPage(): void {\n this.goToPage(1);\n }\n lastPage(): void {\n this.goToPage(this.numPages());\n }\n\n zoomIn(): void {\n this.#zoomMode.set(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n this.#setZoom(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n }\n\n zoomOut(): void {\n this.#zoomMode.set(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n this.#setZoom(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n }\n\n setZoom(mode: PdfZoomMode): void {\n this.#zoomMode.set(mode);\n if (typeof mode === 'number') {\n this.#setZoom(mode);\n } else {\n if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n else void this.#renderActivePage();\n }\n }\n\n rotate(direction: 'left' | 'right'): void {\n const delta = direction === 'right' ? 90 : -90;\n this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n else void this.#renderActivePage();\n }\n\n toggleSidebar(): void {\n this.#sidebarOpenInternal.update(v => !v);\n }\n\n setSidebarMode(mode: PdfSidebarMode): void {\n this.#sidebarModeInternal.set(mode);\n if (mode !== 'none' && !this.#sidebarOpenInternal()) {\n this.#sidebarOpenInternal.set(true);\n }\n // Selecting the 'search' tab implicitly opens the search bar so the user\n // can start typing right away — matches Acrobat's flyout behaviour.\n if (mode === 'search') {\n this.openSearch();\n }\n }\n\n onSidebarTabKeyDown(event: KeyboardEvent, currentMode: PdfSidebarTabMode): void {\n const modes: readonly PdfSidebarTabMode[] = ['thumbnails', 'outline', 'search'];\n const currentIndex = modes.indexOf(currentMode);\n let targetIndex: number;\n switch (event.key) {\n case 'ArrowRight':\n targetIndex = (currentIndex + 1) % modes.length;\n break;\n case 'ArrowLeft':\n targetIndex = (currentIndex - 1 + modes.length) % modes.length;\n break;\n case 'Home':\n targetIndex = 0;\n break;\n case 'End':\n targetIndex = modes.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const target = modes[targetIndex];\n this.setSidebarMode(target);\n queueMicrotask(() => {\n const tab = this.sidebarTabRefs().find(ref => ref.nativeElement.dataset['sidebarMode'] === target);\n tab?.nativeElement.focus();\n });\n }\n\n onThumbnailSidebarScroll(event: Event): void {\n if (this.#sidebarModeInternal() !== 'thumbnails') return;\n const element = event.currentTarget as HTMLElement | null;\n if (!element) return;\n const firstVisible = Math.floor(element.scrollTop / SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT);\n const start = Math.max(0, Math.min(firstVisible - 8, Math.max(0, this.numPages() - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n this.#thumbnailWindowStart.set(start);\n }\n\n setScrollMode(mode: PdfScrollMode): void {\n if (this.#scrollModeInternal() === mode) return;\n this.#scrollModeInternal.set(mode);\n this.#onScrollModeChanged();\n }\n\n downloadFile(): void {\n void this.downloadFileAsync();\n }\n\n async downloadFileAsync(): Promise<boolean> {\n const generation = ++this.#downloadGeneration;\n if (!this.canDownload() || this.#destroyed) return false;\n const src = this.source();\n if (!src) return false;\n const filename = this.#filename();\n const doc = this.#pdfDoc();\n\n let href: string | null = null;\n let temporaryHref: string | null = null;\n if (this.#requiresLoadedDocumentBytes(src)) {\n if (!doc) return false;\n let data: Uint8Array;\n try {\n data = new Uint8Array(await doc.getData());\n } catch {\n return false;\n }\n if (!this.#isCurrentDownload(generation, src, doc)) return false;\n const blob = this.#browser.createPdfBlob(data);\n href = blob ? this.#browser.createObjectUrl(blob) : null;\n temporaryHref = this.#trackTemporaryDownloadUrl(href);\n } else if (typeof src === 'string') {\n href = src;\n } else if (this.#browser.isFile(src) || this.#browser.isBlob(src)) {\n href = this.#browser.createObjectUrl(src);\n temporaryHref = this.#trackTemporaryDownloadUrl(href);\n } else if (src && typeof src === 'object' && 'url' in src && typeof src.url === 'string') {\n href = src.url;\n } else if (src instanceof ArrayBuffer || src instanceof Uint8Array || (src && typeof src === 'object' && 'data' in src)) {\n const raw = src instanceof ArrayBuffer || src instanceof Uint8Array ? src : src.data;\n const data = raw instanceof Uint8Array ? new Uint8Array(raw) : new Uint8Array(raw.slice(0));\n const blob = this.#browser.createPdfBlob(data);\n href = blob ? this.#browser.createObjectUrl(blob) : null;\n temporaryHref = this.#trackTemporaryDownloadUrl(href);\n }\n\n if (!href || !this.#isCurrentDownload(generation, src, doc)) {\n if (temporaryHref) this.#scheduleTemporaryDownloadUrlRelease(temporaryHref);\n return false;\n }\n const downloaded = this.#browser.download(href, filename);\n if (temporaryHref) this.#scheduleTemporaryDownloadUrlRelease(temporaryHref);\n if (downloaded && !this.#destroyed) this.download.emit({ filename });\n return downloaded;\n }\n\n toggleFullscreen(): void {\n if (!this.canFullscreen()) return;\n void this.#browser.toggleFullscreen(this.#hostEl.nativeElement).catch(() => undefined);\n }\n\n /** Programmatic equivalent of clicking the X — emits the close output. */\n requestClose(): void {\n this.close.emit();\n }\n\n /** Retry the active load attempt (called from the error state retry button). */\n retryLoad(): void {\n this.#loadDocument(this.source());\n }\n\n printFile(): void {\n void this.print();\n }\n\n async print(): Promise<void> {\n const generation = ++this.#printGeneration;\n this.#cancelPrintJob();\n const doc = this.#pdfDoc();\n if (!doc || this.#destroyed || !this.canPrint()) return;\n const loadToken = this.#loadToken;\n let data: Uint8Array;\n try {\n data = new Uint8Array(await doc.getData());\n } catch {\n return;\n }\n if (generation !== this.#printGeneration || !this.#isActiveLoad(loadToken) || this.#pdfDoc() !== doc) return;\n const job = this.#printAdapter.start(data, this.#filename());\n if (!job) return;\n this.#currentPrintJob = job;\n try {\n await job.finished;\n } catch {\n job.cancel();\n } finally {\n if (this.#currentPrintJob === job) this.#currentPrintJob = null;\n }\n }\n\n isOutlineExpanded(id: string): boolean {\n return this.#outlineExpanded().has(id);\n }\n\n toggleOutlineItem(id: string, event?: Event): void {\n event?.stopPropagation();\n const item = this.#findOutlineItem(id);\n if (!item || item.children.length === 0) {\n this.#outlineFocusId.set(id);\n return;\n }\n this.#outlineExpanded.update(current => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n this.#outlineFocusId.set(id);\n }\n\n focusOutlineItem(id: string): void {\n this.#outlineFocusId.set(id);\n }\n\n activateOutlineItem(id: string): void {\n const item = this.#findOutlineItem(id);\n if (!item) return;\n this.#outlineFocusId.set(id);\n if (item.page !== null) {\n this.goToPage(item.page);\n return;\n }\n if (item.children.length > 0) this.toggleOutlineItem(id);\n }\n\n onOutlineKeyDown(event: KeyboardEvent, id: string): void {\n const rows = this.visibleOutline();\n const index = rows.findIndex(row => row.item.id === id);\n if (index < 0) return;\n const row = rows[index];\n const item = row.item;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#focusOutlineRow(rows[Math.min(rows.length - 1, index + 1)].item.id);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#focusOutlineRow(rows[Math.max(0, index - 1)].item.id);\n break;\n case 'ArrowRight':\n event.preventDefault();\n if (item.children.length === 0) break;\n if (!this.isOutlineExpanded(id)) this.toggleOutlineItem(id);\n else this.#focusOutlineRow(item.children[0].id);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n if (item.children.length > 0 && this.isOutlineExpanded(id)) this.toggleOutlineItem(id);\n else if (row.parentId) this.#focusOutlineRow(row.parentId);\n break;\n case 'Home':\n event.preventDefault();\n this.#focusOutlineRow(rows[0].item.id);\n break;\n case 'End':\n event.preventDefault();\n this.#focusOutlineRow(rows[rows.length - 1].item.id);\n break;\n case 'Enter':\n case ' ':\n if (item.url && item.page === null) break;\n event.preventDefault();\n this.activateOutlineItem(id);\n break;\n default:\n break;\n }\n }\n\n /**\n * Run a full-document search for `term`. Returns the result count.\n *\n * Options:\n * - `caseSensitive`: default off; matches independent of capitalisation.\n * - `wholeWord`: default off; requires Unicode word-boundary on both sides\n * so `cat` does NOT match `category` (uses `/\\b...\\b/u` so Vietnamese\n * diacritic-bearing letters still participate as word characters).\n *\n * Implementation: iterate every page once (cached), build a flat plain-text\n * string per page (joining textItem.str), and slice ~30 chars of context\n * around each match. We deliberately use plain JS regex rather than\n * pdf.js's `pdfFindController` — it's <40 lines, fully testable, and\n * sidesteps the find-controller's dependency on a real text layer (which\n * we don't render).\n */\n async search(term: string, options?: { caseSensitive?: boolean; wholeWord?: boolean }): Promise<number> {\n const token = ++this.#searchToken;\n const cleanTerm = (term ?? '').trim().normalize('NFC');\n if (options?.caseSensitive !== undefined) {\n this.#searchCaseSensitive.set(options.caseSensitive);\n }\n if (options?.wholeWord !== undefined) {\n this.#searchWholeWord.set(options.wholeWord);\n }\n this.#searchTerm.set(cleanTerm);\n this.#searchTruncated.set(false);\n\n if (!cleanTerm) {\n this.#cancelQueuedSearch();\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n const doc = this.#pdfDoc();\n if (!doc) {\n this.#cancelQueuedSearch();\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n const re = this.#buildSearchRegex(cleanTerm, this.#searchCaseSensitive(), this.#searchWholeWord());\n if (!re) {\n this.#cancelQueuedSearch();\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#emitSearchChange();\n return 0;\n }\n\n return new Promise<number>(resolve => {\n this.#enqueueSearchRequest({ token, doc, expression: re, resolve });\n });\n }\n\n async #executeSearchRequest(request: PdfSearchRequest): Promise<number> {\n const { token, doc, expression } = request;\n const results: PdfSearchResult[] = [];\n const textScan: PdfPageTextScan = {\n snapshot: new Map(this.#pageTextCache),\n staged: new Map<number, string>(),\n };\n pageLoop: for (let p = 1; p <= doc.numPages; p++) {\n if (token !== this.#searchToken) return 0; // newer search superseded us\n const text = await this.#getPageText(doc, p, token, textScan);\n if (token !== this.#searchToken) return 0;\n // re is /g — must be re-created or `lastIndex` reset between pages.\n expression.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = expression.exec(text)) !== null) {\n const start = m.index;\n const matched = m[0];\n const end = start + matched.length;\n const before = text.slice(Math.max(0, start - 30), start);\n const after = text.slice(end, end + 30);\n if (results.length >= SdPreviewPdf.MAX_SEARCH_RESULTS) {\n this.#searchTruncated.set(true);\n break pageLoop;\n }\n results.push({ page: p, before, term: matched, after });\n // Defensive: zero-length match would loop forever.\n if (matched.length === 0) expression.lastIndex++;\n }\n }\n\n if (token !== this.#searchToken) return 0;\n this.#commitPageTextScan(textScan);\n this.#searchResults.set(results);\n // Activate the first result so the user sees something immediately;\n // tests can assert this via `searchActiveIndex()`. Skip when empty.\n this.#searchActiveIndex.set(results.length > 0 ? 0 : -1);\n if (results.length > 0) {\n // Auto-jump to the first hit's page.\n this.goToPage(results[0].page);\n }\n this.#emitSearchChange();\n return results.length;\n }\n\n #enqueueSearchRequest(request: PdfSearchRequest): void {\n if (this.#searchWorkerActive) {\n this.#queuedSearchRequest?.resolve(0);\n this.#queuedSearchRequest = request;\n return;\n }\n this.#searchWorkerActive = true;\n void this.#drainSearchRequests(request);\n }\n\n async #drainSearchRequests(initial: PdfSearchRequest): Promise<void> {\n let request: PdfSearchRequest | null = initial;\n while (request) {\n let resultCount = 0;\n try {\n resultCount = await this.#executeSearchRequest(request);\n } catch {\n resultCount = 0;\n }\n request.resolve(resultCount);\n request = this.#queuedSearchRequest;\n this.#queuedSearchRequest = null;\n }\n this.#searchWorkerActive = false;\n }\n\n #cancelQueuedSearch(): void {\n this.#queuedSearchRequest?.resolve(0);\n this.#queuedSearchRequest = null;\n }\n\n searchNext(): void {\n const results = this.#searchResults();\n if (results.length === 0) return;\n const next = (this.#searchActiveIndex() + 1) % results.length;\n this.#searchActiveIndex.set(next);\n this.goToPage(results[next].page);\n this.#emitSearchChange();\n }\n\n searchPrev(): void {\n const results = this.#searchResults();\n if (results.length === 0) return;\n const cur = this.#searchActiveIndex();\n const prev = cur <= 0 ? results.length - 1 : cur - 1;\n this.#searchActiveIndex.set(prev);\n this.goToPage(results[prev].page);\n this.#emitSearchChange();\n }\n\n activateSearchResult(index: number): void {\n const result = this.#searchResults()[index];\n if (!result) return;\n this.#searchActiveIndex.set(index);\n this.goToPage(result.page);\n this.#emitSearchChange();\n }\n\n clearSearch(): void {\n this.#searchToken++;\n this.#cancelQueuedSearch();\n this.#searchTerm.set('');\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#searchTruncated.set(false);\n this.#emitSearchChange();\n }\n\n /** Open the search bar and focus its input. Idempotent. */\n openSearch(): void {\n this.#searchBarOpen.set(true);\n // Defer focus a tick so the *ngIf-rendered input exists in the DOM.\n queueMicrotask(() => {\n this.searchInputRef()?.nativeElement?.focus();\n this.searchInputRef()?.nativeElement?.select();\n });\n }\n\n /** Close the search bar AND clear results (mirrors Acrobat behaviour). */\n closeSearch(): void {\n this.#searchBarOpen.set(false);\n this.clearSearch();\n }\n\n toggleSearchCaseSensitive(): void {\n this.#searchCaseSensitive.update(v => !v);\n // Re-run with the persisted term so the result set reflects the new flag.\n if (this.#searchTerm()) {\n void this.search(this.#searchTerm());\n }\n }\n\n toggleSearchWholeWord(): void {\n this.#searchWholeWord.update(v => !v);\n if (this.#searchTerm()) {\n void this.search(this.#searchTerm());\n }\n }\n\n /** Live binding from the search bar's `(input)` event. */\n onSearchInput(event: Event): void {\n const target = event.target;\n if (!target || typeof target !== 'object' || !('value' in target) || typeof target.value !== 'string') return;\n void this.search(target.value);\n }\n\n // ==========================================\n // KEYBOARD — bound to HOST (not document)\n // ==========================================\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const isSearchInput = !!target && target === this.searchInputRef()?.nativeElement;\n const isOtherEditable =\n !!target && !isSearchInput && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable);\n\n // Ctrl/Cmd+F: open the search bar from anywhere (even when input has\n // focus, e.g. re-focus the search bar from the page input). Handled\n // before the input-target guard so it always works.\n if ((event.ctrlKey || event.metaKey) && (event.key === 'f' || event.key === 'F')) {\n event.preventDefault();\n this.openSearch();\n return;\n }\n\n if ((event.ctrlKey || event.metaKey) && (event.key === 'p' || event.key === 'P') && this.canPrint()) {\n event.preventDefault();\n this.printFile();\n return;\n }\n\n // Keys while the search input is focused: Enter / Shift+Enter, F3 / Shift+F3\n // cycle results; Esc closes the bar. Everything else (typing) passes through.\n if (isSearchInput) {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeSearch();\n // Re-focus the host so subsequent shortcuts work without a click.\n this.#hostEl.nativeElement.focus();\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n if (event.key === 'F3') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n return; // typing → let it pass through\n }\n\n // Other editable targets (page-number input etc.) shouldn't trigger\n // viewer shortcuts — but Esc should still close an open search bar.\n if (isOtherEditable) {\n if (event.key === 'Escape' && this.#searchBarOpen()) {\n event.preventDefault();\n this.closeSearch();\n }\n return;\n }\n\n // F3 outside the search input still cycles results (matches browser\n // Find-in-page convention). Only meaningful when the bar is open OR\n // there are stale results — we keep it ungated for parity.\n if (event.key === 'F3') {\n event.preventDefault();\n if (event.shiftKey) {\n this.searchPrev();\n } else {\n this.searchNext();\n }\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'PageUp':\n event.preventDefault();\n this.prevPage();\n break;\n case 'ArrowRight':\n case 'PageDown':\n event.preventDefault();\n this.nextPage();\n break;\n case 'Home':\n event.preventDefault();\n this.firstPage();\n break;\n case 'End':\n event.preventDefault();\n this.lastPage();\n break;\n case '+':\n case '=':\n event.preventDefault();\n this.zoomIn();\n break;\n case '-':\n event.preventDefault();\n this.zoomOut();\n break;\n case '0':\n event.preventDefault();\n this.setZoom('page-fit');\n break;\n case 'r':\n event.preventDefault();\n this.rotate('right');\n break;\n case 'R':\n event.preventDefault();\n this.rotate('left');\n break;\n case 'f':\n event.preventDefault();\n this.toggleFullscreen();\n break;\n case 'Escape':\n // Esc closes the search bar (when open). NEVER emits `close` on the\n // component — that remains the consumer's responsibility per the\n // standalone-embed pattern.\n if (this.#searchBarOpen()) {\n event.preventDefault();\n this.closeSearch();\n }\n break;\n default:\n break;\n }\n }\n\n // ==========================================\n // TEMPLATE HANDLERS\n // ==========================================\n\n onPageInputEnter(event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n if (Number.isFinite(value)) {\n this.goToPage(value);\n }\n // Snap input back to the actual current page after clamping.\n input.value = String(this.#activePage());\n }\n\n onPageInputBlur(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = String(this.#activePage());\n }\n\n onWheel(event: WheelEvent): void {\n // Ctrl/Cmd + wheel = zoom (mirrors PDF readers + most image viewers).\n // Plain wheel = let browser scroll the stage (especially when zoomed in).\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const factor = event.deltaY < 0 ? 1 + SdPreviewPdf.ZOOM_STEP : 1 - SdPreviewPdf.ZOOM_STEP;\n this.#zoomMode.set(this.#zoom() * factor);\n this.#setZoom(this.#zoom() * factor);\n }\n }\n\n trackByPage(_i: number, page: number): number {\n return page;\n }\n\n // ==========================================\n // INTERNALS\n // ==========================================\n\n #findOutlineItem(id: string, items: readonly PdfOutlineItem[] = this.#outline()): PdfOutlineItem | null {\n for (const item of items) {\n if (item.id === id) return item;\n const nested = this.#findOutlineItem(id, item.children);\n if (nested) return nested;\n }\n return null;\n }\n\n #focusOutlineRow(id: string): void {\n this.#outlineFocusId.set(id);\n queueMicrotask(() => {\n if (this.#destroyed) return;\n const ref = this.outlineItemRefs().find(candidate => candidate.nativeElement.dataset['outlineId'] === id);\n ref?.nativeElement.focus();\n });\n }\n\n #setOutline(items: readonly PdfOutlineItem[]): void {\n const expanded = new Set<string>();\n const collect = (nodes: readonly PdfOutlineItem[]): void => {\n for (const item of nodes) {\n if (item.children.length > 0) expanded.add(item.id);\n collect(item.children);\n }\n };\n collect(items);\n this.#outline.set(items);\n this.#outlineExpanded.set(expanded);\n this.#outlineFocusId.set(items[0]?.id ?? null);\n }\n\n async #loadOutline(doc: SdPdfDocumentProxy, token: number): Promise<readonly PdfOutlineItem[] | null> {\n let rawItems: readonly SdPdfRawOutlineItem[] | null;\n try {\n rawItems = await doc.getOutline();\n } catch {\n return this.#isActiveLoad(token) ? [] : null;\n }\n if (!this.#isActiveLoad(token)) return null;\n return this.#resolveOutlineItems(doc, rawItems ?? [], token, [], 0, { nodes: 0 }, new Set<object>());\n }\n\n async #resolveOutlineItems(\n doc: SdPdfDocumentProxy,\n rawItems: readonly SdPdfRawOutlineItem[],\n token: number,\n parentPath: readonly number[],\n depth: number,\n traversal: PdfOutlineTraversal,\n ancestors: ReadonlySet<object>\n ): Promise<readonly PdfOutlineItem[] | null> {\n const items: PdfOutlineItem[] = [];\n if (depth >= SdPreviewPdf.OUTLINE_MAX_DEPTH) return items;\n for (let index = 0; index < rawItems.length; index++) {\n if (!this.#isActiveLoad(token)) return null;\n const raw = rawItems[index];\n if (!raw || typeof raw !== 'object' || ancestors.has(raw)) continue;\n if (traversal.nodes >= SdPreviewPdf.OUTLINE_MAX_NODES) break;\n traversal.nodes++;\n const path = [...parentPath, index];\n const page = await this.#resolveOutlinePage(doc, raw, token);\n if (!this.#isActiveLoad(token)) return null;\n const rawChildren = Array.isArray(raw.items) ? raw.items : [];\n const childAncestors = new Set(ancestors);\n childAncestors.add(raw);\n const children = await this.#resolveOutlineItems(doc, rawChildren, token, path, depth + 1, traversal, childAncestors);\n if (!children || !this.#isActiveLoad(token)) return null;\n const safeUrl = this.#safeOutlineUrl(raw.url);\n items.push({\n id: `outline-${path.join('-')}`,\n title: raw.title?.trim() || `Page ${page ?? ''}`.trim(),\n page,\n ...(safeUrl ? { url: safeUrl } : {}),\n children,\n });\n }\n return items;\n }\n\n async #resolveOutlinePage(doc: SdPdfDocumentProxy, item: SdPdfRawOutlineItem, token: number): Promise<number | null> {\n let destination = item.dest;\n if (typeof destination === 'string') {\n try {\n destination = await doc.getDestination(destination);\n } catch {\n return null;\n }\n }\n if (!this.#isActiveLoad(token) || !Array.isArray(destination) || destination.length === 0) return null;\n const target: unknown = destination[0];\n if (typeof target === 'number') return this.#validOutlinePage(Math.floor(target) + 1, doc.numPages);\n if (!this.#isPdfReference(target)) return null;\n const cached = doc.cachedPageNumber(target);\n if (cached !== null) return this.#validOutlinePage(cached, doc.numPages);\n try {\n const index = await doc.getPageIndex(target);\n return this.#isActiveLoad(token) ? this.#validOutlinePage(index + 1, doc.numPages) : null;\n } catch {\n return null;\n }\n }\n\n #isPdfReference(value: unknown): value is SdPdfReference {\n return (\n !!value &&\n typeof value === 'object' &&\n 'num' in value &&\n 'gen' in value &&\n typeof value.num === 'number' &&\n typeof value.gen === 'number'\n );\n }\n\n #validOutlinePage(page: number, pageCount: number): number | null {\n return Number.isInteger(page) && page >= 1 && page <= pageCount ? page : null;\n }\n\n #safeOutlineUrl(url: string | null | undefined): string | undefined {\n const value = url?.trim();\n return value && /^(?:https?:\\/\\/|mailto:)/i.test(value) ? value : undefined;\n }\n\n async #loadDocument(src: PdfSource | null | undefined): Promise<void> {\n const token = ++this.#loadToken;\n this.#searchToken++;\n this.#cancelQueuedSearch();\n this.#downloadGeneration++;\n this.#cancelLoadingTask();\n this.#cancelRender();\n this.#cancelContinuousRenders();\n this.#cancelThumbnailRenders();\n this.#cancelPrint();\n await this.#destroyDoc();\n if (!this.#isActiveLoad(token)) return;\n this.#revokeAllBlobs();\n this.#thumbnailCacheLru.clear();\n this.#thumbCache.set({});\n this.#setOutline([]);\n this.#clearPageTextCache();\n // Reset search state — results are per-document, but keep the term so a\n // newly-loaded source with the same term gets re-indexed automatically\n // on the next user keystroke. Active index resets unconditionally.\n this.#searchResults.set([]);\n this.#searchActiveIndex.set(-1);\n this.#searchTruncated.set(false);\n this.#loadError.set(null);\n this.#loadProgress.set({ loaded: 0, total: 0 });\n\n if (!src || !this.#browser.isBrowser) {\n this.#stage.set('empty');\n this.#pdfDoc.set(null);\n this.#meta.set(null);\n this.#activePage.set(1);\n return;\n }\n\n this.#stage.set('loading');\n\n let spec: SdPdfDocumentSpec;\n try {\n spec = await this.#normalizeSource(src);\n } catch (err) {\n if (!this.#isActiveLoad(token)) return;\n this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n if (!this.#isActiveLoad(token)) return;\n if (this.password()) {\n spec.password = this.password();\n }\n\n let task: SdPdfLoadingTask;\n try {\n task = this.#pdfjs.getDocument(spec);\n this.#currentLoadingTask = task;\n task.onProgress = (p: { loaded: number; total: number }) => {\n if (!this.#isActiveLoad(token) || this.#currentLoadingTask !== task) return;\n this.#loadProgress.set({ loaded: p.loaded ?? 0, total: p.total ?? 0 });\n };\n } catch (err) {\n if (this.#isActiveLoad(token)) this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n\n let pdfDoc: SdPdfDocumentProxy;\n try {\n pdfDoc = await task.promise;\n } catch (err) {\n if (this.#currentLoadingTask === task) this.#currentLoadingTask = null;\n if (!this.#isActiveLoad(token)) return;\n this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n return;\n }\n if (this.#currentLoadingTask === task) this.#currentLoadingTask = null;\n if (!this.#isActiveLoad(token)) {\n await this.#destroyDocument(pdfDoc);\n return;\n }\n\n let meta: PdfMeta;\n try {\n const m = await pdfDoc.getMetadata();\n const info = m?.info ?? {};\n meta = {\n title: info.Title,\n author: info.Author,\n subject: info.Subject,\n numPages: pdfDoc.numPages,\n };\n } catch {\n meta = { numPages: pdfDoc.numPages };\n }\n if (!this.#isActiveLoad(token)) {\n await this.#destroyDocument(pdfDoc);\n return;\n }\n\n const outline = await this.#loadOutline(pdfDoc, token);\n if (!outline || !this.#isActiveLoad(token)) {\n await this.#destroyDocument(pdfDoc);\n return;\n }\n\n this.#pdfDoc.set(pdfDoc);\n this.#meta.set(meta);\n this.#setOutline(outline);\n this.#activePage.set(Math.max(1, Math.min(this.startPage(), pdfDoc.numPages)));\n this.#ensureThumbnailPageVisible(this.#activePage());\n this.#stage.set('ready');\n this.#zoom.set(1);\n this.#rotation.set(0);\n this.#zoomMode.set(this.initialZoom());\n this.#resetContinuousLayout(pdfDoc.numPages);\n\n if (!this.#destroyed) {\n this.loaded.emit({ totalPages: pdfDoc.numPages, meta });\n this.pageChange.emit(this.#activePage());\n }\n\n if (this.#scrollModeInternal() === 'continuous') {\n this.#positionContinuousPage(this.#activePage());\n } else {\n await this.#renderActivePage();\n }\n }\n\n async #renderActivePage(): Promise<void> {\n const pdfDoc = this.#pdfDoc();\n if (!pdfDoc) return;\n const token = ++this.#renderToken;\n const pageNum = this.#activePage();\n let page: SdPdfPageProxy;\n try {\n page = await pdfDoc.getPage(pageNum);\n } catch {\n return;\n }\n if (token !== this.#renderToken || this.#destroyed || this.#pdfDoc() !== pdfDoc) {\n page.cleanup();\n return;\n }\n\n const canvas = this.pageCanvasRef()?.nativeElement;\n if (!canvas) {\n page.cleanup();\n return;\n }\n\n const rotation = this.#rotation();\n const baseViewport = page.getViewport({ scale: 1, rotation });\n const scale = this.#resolveScale(baseViewport);\n this.#zoom.set(scale);\n const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale, rotation);\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n page.cleanup();\n return;\n }\n\n canvas.width = Math.floor(renderViewport.width);\n canvas.height = Math.floor(renderViewport.height);\n canvas.style.width = `${logicalViewport.width}px`;\n canvas.style.height = `${logicalViewport.height}px`;\n\n this.#cancelRender();\n const renderTask = page.render({ canvasContext: ctx, viewport: renderViewport });\n this.#currentRenderTask = renderTask;\n let completed = false;\n try {\n await renderTask.promise;\n completed = token === this.#renderToken && !this.#destroyed && this.#pdfDoc() === pdfDoc;\n } catch {\n completed = false;\n } finally {\n if (this.#currentRenderTask === renderTask) {\n this.#currentRenderTask = null;\n }\n page.cleanup();\n }\n\n if (completed) this.zoomChange.emit(scale);\n }\n\n #resolveScale(baseViewport: SdPdfViewport): number {\n const mode = this.#zoomMode();\n if (typeof mode === 'number') {\n return Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, mode));\n }\n if (mode === 'page-actual') return 1;\n const stage = this.stageEl()?.nativeElement;\n if (!stage) return 1;\n const stageRect = stage.getBoundingClientRect();\n // 32px horizontal + 96px bottom padding lives in the SCSS — subtract it so\n // the page fits without overlapping the floating toolbar.\n const availW = Math.max(80, stageRect.width - 48);\n const availH = Math.max(80, stageRect.height - 120);\n if (mode === 'page-width') {\n return availW / baseViewport.width;\n }\n // page-fit\n return Math.min(availW / baseViewport.width, availH / baseViewport.height);\n }\n\n #canvasViewports(\n page: SdPdfPageProxy,\n scale: number,\n rotation?: number\n ): { logicalViewport: SdPdfViewport; renderViewport: SdPdfViewport } {\n const logicalViewport = page.getViewport({ scale, rotation });\n const width = Math.max(1, logicalViewport.width);\n const height = Math.max(1, logicalViewport.height);\n const factor = Math.min(\n 1,\n SdPreviewPdf.MAX_CANVAS_DIMENSION / width,\n SdPreviewPdf.MAX_CANVAS_DIMENSION / height,\n Math.sqrt(SdPreviewPdf.MAX_CANVAS_PIXELS / (width * height))\n );\n return {\n logicalViewport,\n renderViewport: factor < 1 ? page.getViewport({ scale: scale * factor, rotation }) : logicalViewport,\n };\n }\n\n #cancelRender(): void {\n if (this.#currentRenderTask) {\n try {\n this.#currentRenderTask.cancel();\n } catch {\n /* ignore */\n }\n this.#currentRenderTask = null;\n }\n }\n\n onStageScroll(): void {\n if (this.#scrollModeInternal() === 'continuous') this.#updateContinuousWindow(true);\n }\n\n #cancelLoadingTask(): void {\n const task = this.#currentLoadingTask;\n this.#currentLoadingTask = null;\n if (!task?.destroy) return;\n try {\n void Promise.resolve(task.destroy()).catch(() => undefined);\n } catch {\n return;\n }\n }\n\n #cancelPrint(): void {\n this.#printGeneration++;\n this.#cancelPrintJob();\n }\n\n #cancelPrintJob(): void {\n const job = this.#currentPrintJob;\n this.#currentPrintJob = null;\n job?.cancel();\n }\n\n #isActiveLoad(token: number): boolean {\n return !this.#destroyed && token === this.#loadToken;\n }\n\n #isCurrentDownload(generation: number, source: PdfSource | null, doc: SdPdfDocumentProxy | null): boolean {\n return !this.#destroyed && generation === this.#downloadGeneration && this.source() === source && this.#pdfDoc() === doc;\n }\n\n async #destroyDocument(doc: SdPdfDocumentProxy): Promise<void> {\n try {\n await doc.destroy();\n } catch {\n return;\n }\n }\n\n async #destroyDoc(): Promise<void> {\n const doc = this.#pdfDoc();\n if (!doc) return;\n this.#pdfDoc.set(null);\n await this.#destroyDocument(doc);\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, value));\n this.#zoom.set(clamped);\n if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n else void this.#renderActivePage();\n }\n\n async #normalizeSource(src: PdfSource): Promise<SdPdfDocumentSpec> {\n if (typeof src === 'string') {\n this.#filename.set(this.#guessName(src));\n const headers = this.httpHeaders();\n const spec: SdPdfDocumentSpec = { url: src };\n if (headers) spec.httpHeaders = headers;\n return spec;\n }\n if (this.#browser.isFile(src)) {\n this.#filename.set(src.name);\n this.#fileSize.set(src.size);\n const buf = await src.arrayBuffer();\n return { data: new Uint8Array(buf) };\n }\n if (this.#browser.isBlob(src)) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.size);\n const buf = await src.arrayBuffer();\n return { data: new Uint8Array(buf) };\n }\n if (src instanceof ArrayBuffer) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.byteLength);\n return { data: new Uint8Array(src.slice(0)) };\n }\n if (src instanceof Uint8Array) {\n this.#filename.set('document.pdf');\n this.#fileSize.set(src.byteLength);\n return { data: new Uint8Array(src) };\n }\n if (src && typeof src === 'object') {\n if ('url' in src && typeof src.url === 'string') {\n this.#filename.set(this.#guessName(src.url));\n const spec: SdPdfDocumentSpec = { url: src.url };\n // Caller-provided headers win over the [httpHeaders] input.\n const headers = src.httpHeaders ?? this.httpHeaders();\n if (headers) spec.httpHeaders = headers;\n if (src.withCredentials) spec.withCredentials = true;\n return spec;\n }\n if ('data' in src && (src.data instanceof ArrayBuffer || src.data instanceof Uint8Array)) {\n this.#filename.set('document.pdf');\n const data = src.data instanceof ArrayBuffer ? new Uint8Array(src.data.slice(0)) : new Uint8Array(src.data);\n this.#fileSize.set(data.byteLength);\n return { data };\n }\n }\n throw new Error('Unsupported PDF source');\n }\n\n #guessName(url: string): string {\n const path = url.split('?')[0];\n const last = path.substring(path.lastIndexOf('/') + 1);\n return last || 'document.pdf';\n }\n\n /** Map any thrown value into a {reason} we can render. */\n #classifyError(err: unknown): PdfErrorReason {\n if (!err) return 'unknown';\n // pdfjs throws named exception classes — we sniff by name to avoid\n // importing the constructors (keeps the bundle smaller).\n const name = (err as { name?: string }).name;\n if (name === 'PasswordException') return 'password';\n if (name === 'InvalidPDFException') return 'invalid';\n if (name === 'MissingPDFException' || name === 'UnexpectedResponseException') {\n return 'network';\n }\n if (err instanceof Error && /network|fetch|cors/i.test(err.message)) {\n return 'network';\n }\n return 'unknown';\n }\n\n #errorMessage(err: unknown): string | undefined {\n if (err instanceof Error) return err.message;\n return undefined;\n }\n\n #emitError(reason: PdfErrorReason, message?: string): void {\n const ev: PdfErrorEvent = { reason, message };\n this.#loadError.set(ev);\n this.#stage.set('error');\n this.loadError.emit(ev);\n }\n\n #revokeAllBlobs(): void {\n for (const url of this.#ownedBlobUrls) {\n this.#browser.revokeObjectUrl(url);\n }\n this.#ownedBlobUrls.clear();\n }\n\n #requiresLoadedDocumentBytes(source: PdfSource): boolean {\n if (typeof source === 'string') return !!this.httpHeaders();\n if (!('url' in source) || typeof source.url !== 'string') return false;\n return !!source.httpHeaders || !!source.withCredentials || !!this.httpHeaders();\n }\n\n #trackTemporaryDownloadUrl(url: string | null): string | null {\n if (url) this.#ownedBlobUrls.add(url);\n return url;\n }\n\n #scheduleTemporaryDownloadUrlRelease(url: string): void {\n const release = (): void => {\n if (!this.#ownedBlobUrls.delete(url)) return;\n this.#browser.revokeObjectUrl(url);\n };\n if (this.#browser.scheduleFrame(() => release()) === null) queueMicrotask(release);\n }\n\n // ==========================================\n // SEARCH HELPERS\n // ==========================================\n\n /**\n * Build the search regex. We escape every metachar so the term is matched\n * literally (so `foo.bar` doesn't treat `.` as \"any char\"). Unicode flag\n * `u` makes `\\b` understand Vietnamese diacritic-bearing letters as word\n * characters — without it `\\b` would split `đ` at the d, breaking\n * whole-word matches on Vietnamese terms.\n */\n #buildSearchRegex(term: string, caseSensitive: boolean, wholeWord: boolean): RegExp | null {\n if (!term) return null;\n const escaped = term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const flags = (caseSensitive ? 'g' : 'gi') + 'u';\n const wordCharacter = '[\\\\p{L}\\\\p{M}\\\\p{N}\\\\p{Pc}]';\n const pattern = wholeWord ? '(?<!' + wordCharacter + ')' + escaped + '(?!' + wordCharacter + ')' : escaped;\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch (and cache) the plain text of a single page. We normalize to NFC\n * so the same Vietnamese letter encoded as composed vs decomposed sequences\n * (NFD) matches the same search term — pdfjs has been seen to return NFD\n * in some PDFs.\n */\n async #getPageText(doc: SdPdfDocumentProxy, pageNum: number, searchToken: number, scan: PdfPageTextScan): Promise<string> {\n const cached = scan.staged.get(pageNum) ?? scan.snapshot.get(pageNum);\n if (cached !== undefined) {\n this.#stagePageText(scan, pageNum, cached);\n return cached;\n }\n let page: SdPdfPageProxy;\n try {\n page = await doc.getPage(pageNum);\n } catch {\n return '';\n }\n let text = '';\n try {\n const content = await page.getTextContent();\n const items = content && typeof content === 'object' && 'items' in content && Array.isArray(content.items) ? content.items : [];\n const parts: string[] = [];\n for (const it of items) {\n if (it && typeof it === 'object' && 'str' in it && typeof it.str === 'string') parts.push(it.str);\n }\n // Space-join so multi-word matches across textItem boundaries work.\n text = parts.join(' ').normalize('NFC');\n } catch {\n text = '';\n } finally {\n page.cleanup();\n }\n if (searchToken === this.#searchToken && this.#pdfDoc() === doc && !this.#destroyed) {\n this.#stagePageText(scan, pageNum, text);\n }\n return text;\n }\n\n #stagePageText(scan: PdfPageTextScan, pageNum: number, text: string): void {\n scan.staged.delete(pageNum);\n scan.staged.set(pageNum, text);\n while (scan.staged.size > SdPreviewPdf.MAX_PAGE_TEXT_CACHE_PAGES) {\n const oldestPage = scan.staged.keys().next().value as number | undefined;\n if (oldestPage === undefined) break;\n scan.staged.delete(oldestPage);\n }\n }\n\n #commitPageTextScan(scan: PdfPageTextScan): void {\n for (const [pageNum, text] of scan.staged) this.#cachePageText(pageNum, text);\n }\n\n #cachePageText(pageNum: number, text: string): void {\n this.#pageTextCache.delete(pageNum);\n this.#pageTextCache.set(pageNum, text);\n while (this.#pageTextCache.size > SdPreviewPdf.MAX_PAGE_TEXT_CACHE_PAGES) {\n const oldestPage = this.#pageTextCache.keys().next().value as number | undefined;\n if (oldestPage === undefined) break;\n this.#pageTextCache.delete(oldestPage);\n }\n this.#pageTextCacheSize.set(this.#pageTextCache.size);\n }\n\n #clearPageTextCache(): void {\n this.#pageTextCache.clear();\n this.#pageTextCacheSize.set(0);\n }\n\n #emitSearchChange(): void {\n this.searchChange.emit({\n term: this.#searchTerm(),\n total: this.#searchResults().length,\n current: this.#searchActiveIndex() + 1, // 1-based; 0 when no active\n truncated: this.#searchTruncated(),\n });\n }\n\n /**\n * Paint highlight marks over the current page's canvas wrapper. WHY DOM\n * append (not text layer): rendering the proper pdf.js text layer is a\n * larger change — out-of-scope here. Instead we drop floating `<mark>`\n * pills near the top of the page; they're a visual cue that the page\n * contains a hit + which one is active, even when we can't place them\n * pixel-accurately. The result-list cards still drive precise navigation.\n *\n * Tradeoff documented in sd-preview.md.\n */\n #applyHighlightsForActivePage(): void {\n const wrap = this.#hostEl.nativeElement.querySelector('.sd-preview-pdf-page-wrap');\n if (!wrap) return;\n // Clear prior overlay.\n const prior = wrap.querySelector('.sd-pdf-search-overlay');\n if (prior) prior.remove();\n\n const term = this.#searchTerm();\n const results = this.#searchResults();\n const activeIdx = this.#searchActiveIndex();\n const activePage = this.activePage();\n if (!term || results.length === 0) return;\n\n const pageHits = results.map((r, i) => ({ r, i })).filter(({ r }) => r.page === activePage);\n if (pageHits.length === 0) return;\n\n const overlay = this.#browser.createElement('div');\n if (!overlay) return;\n overlay.className = 'sd-pdf-search-overlay';\n for (const { r, i } of pageHits) {\n const m = this.#browser.createElement('mark');\n if (!m) continue;\n m.className = i === activeIdx ? 'sd-pdf-search-hi sd-pdf-search-hi--active' : 'sd-pdf-search-hi';\n m.textContent = r.term;\n overlay.appendChild(m);\n }\n wrap.appendChild(overlay);\n\n // Scroll the active mark into view if it lives on this page.\n if (activeIdx >= 0 && results[activeIdx]?.page === activePage) {\n const activeMark = overlay.querySelector('.sd-pdf-search-hi--active') as HTMLElement | null;\n try {\n activeMark?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n } catch {\n // older Safari throws on smooth — fall back silently\n }\n }\n }\n\n #onScrollModeChanged(): void {\n if (this.#destroyed || this.#stage() !== 'ready') return;\n if (this.#scrollModeInternal() === 'continuous') {\n this.#cancelRender();\n this.#resetContinuousLayout(this.numPages());\n this.#positionContinuousPage(this.#activePage());\n return;\n }\n this.#cancelContinuousRenders();\n this.#continuousPages.set([]);\n this.#continuousTopSpacer.set(0);\n this.#continuousBottomSpacer.set(0);\n void this.#renderActivePage();\n }\n\n #estimatedContinuousHeight(): number {\n const rotated = this.#rotation() % 180 !== 0;\n const baseViewport: SdPdfViewport = rotated ? { width: 792, height: 612 } : { width: 612, height: 792 };\n return Math.max(1, baseViewport.height * this.#resolveScale(baseViewport));\n }\n\n #resetContinuousLayout(pageCount: number): void {\n const estimatedHeight = this.#estimatedContinuousHeight();\n this.#pageHeights = Array.from({ length: pageCount }, () => estimatedHeight);\n this.#heightIndex.reset(this.#pageHeights);\n this.#continuousHeightVersion.update(version => version + 1);\n }\n\n #continuousPageIndexAt(offset: number): number {\n return this.#heightIndex.indexAt(offset);\n }\n\n #updateContinuousWindow(updateActivePage: boolean): void {\n const stage = this.stageEl()?.nativeElement;\n const pageCount = this.#pageHeights.length;\n if (!stage || pageCount === 0 || this.#scrollModeInternal() !== 'continuous') return;\n const viewportHeight = Math.max(1, stage.clientHeight || stage.getBoundingClientRect().height || 1);\n const firstVisible = this.#continuousPageIndexAt(stage.scrollTop);\n const lastVisible = this.#continuousPageIndexAt(stage.scrollTop + viewportHeight - 1);\n const first = Math.max(0, firstVisible - 1);\n const last = Math.min(pageCount - 1, lastVisible + 1);\n const pages = Array.from({ length: last - first + 1 }, (_, index) => first + index + 1);\n this.#continuousPages.set(pages);\n this.#continuousTopSpacer.set(this.#heightIndex.offsetAt(first));\n const renderedEnd = this.#heightIndex.offsetAt(last) + this.#pageHeights[last];\n this.#continuousBottomSpacer.set(Math.max(0, this.#heightIndex.total() - renderedEnd));\n\n const retained = new Set(pages);\n for (const [pageNumber, task] of this.#continuousTasks) {\n if (retained.has(pageNumber)) continue;\n task.cancel();\n this.#continuousTasks.delete(pageNumber);\n }\n\n if (!updateActivePage) return;\n const midpointPage = this.#continuousPageIndexAt(stage.scrollTop + viewportHeight / 2) + 1;\n if (midpointPage === this.#activePage()) return;\n this.#activePage.set(midpointPage);\n if (!this.#destroyed) this.pageChange.emit(midpointPage);\n }\n\n #positionContinuousPage(pageNumber: number): void {\n const stage = this.stageEl()?.nativeElement;\n if (stage) stage.scrollTop = this.#heightIndex.offsetAt(pageNumber - 1);\n this.#updateContinuousWindow(false);\n this.#rescheduleContinuousRenders();\n }\n\n #invalidateContinuousLayout(): void {\n const stage = this.stageEl()?.nativeElement;\n const anchorIndex = stage ? this.#continuousPageIndexAt(stage.scrollTop) : 0;\n const oldHeight = this.#pageHeights[anchorIndex] || 1;\n const oldOffset = this.#heightIndex.offsetAt(anchorIndex);\n const anchorRatio = stage ? Math.max(0, Math.min(1, (stage.scrollTop - oldOffset) / oldHeight)) : 0;\n this.#cancelContinuousRenders();\n this.#resetContinuousLayout(this.numPages());\n if (stage) stage.scrollTop = this.#heightIndex.offsetAt(anchorIndex) + this.#pageHeights[anchorIndex] * anchorRatio;\n this.#updateContinuousWindow(false);\n this.#rescheduleContinuousRenders();\n }\n\n #rescheduleContinuousRenders(): void {\n queueMicrotask(() => {\n if (this.#destroyed || this.#scrollModeInternal() !== 'continuous') return;\n this.#scheduleContinuousRenders(this.continuousCanvases().map(ref => ref.nativeElement));\n });\n }\n\n #scheduleContinuousRenders(canvases: HTMLCanvasElement[]): void {\n if (this.#continuousFrame !== null) this.#browser.cancelFrame(this.#continuousFrame);\n if (canvases.length === 0 || this.#scrollModeInternal() !== 'continuous') {\n this.#continuousFrame = null;\n return;\n }\n this.#continuousFrame = this.#browser.scheduleFrame(() => {\n this.#continuousFrame = null;\n for (const canvas of canvases) void this.#renderContinuousCanvas(canvas);\n });\n }\n\n async #renderContinuousCanvas(canvas: HTMLCanvasElement): Promise<void> {\n const pageNumber = Number(canvas.getAttribute('data-page'));\n const doc = this.#pdfDoc();\n const generation = this.#layoutGeneration;\n if (\n !doc ||\n !Number.isInteger(pageNumber) ||\n pageNumber < 1 ||\n this.#continuousTasks.has(pageNumber) ||\n this.#continuousReservations.has(pageNumber)\n )\n return;\n const reservation = { generation };\n this.#continuousReservations.set(pageNumber, reservation);\n let page: SdPdfPageProxy | null = null;\n try {\n page = await doc.getPage(pageNumber);\n if (!this.#isCurrentContinuousPage(doc, generation, pageNumber)) return;\n const rotation = this.#rotation();\n const baseViewport = page.getViewport({ scale: 1, rotation });\n const scale = this.#resolveScale(baseViewport);\n const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale, rotation);\n const context = canvas.getContext('2d');\n if (!context) return;\n canvas.width = Math.floor(renderViewport.width);\n canvas.height = Math.floor(renderViewport.height);\n canvas.style.width = `${logicalViewport.width}px`;\n canvas.style.height = `${logicalViewport.height}px`;\n const task = page.render({ canvasContext: context, viewport: renderViewport });\n this.#continuousTasks.set(pageNumber, task);\n try {\n await task.promise;\n } catch {\n return;\n } finally {\n if (this.#continuousTasks.get(pageNumber) === task) this.#continuousTasks.delete(pageNumber);\n }\n if (!this.#isCurrentContinuousPage(doc, generation, pageNumber)) return;\n this.#updateContinuousMeasurement(pageNumber, logicalViewport.height);\n this.#zoom.set(scale);\n this.zoomChange.emit(scale);\n } finally {\n if (this.#continuousReservations.get(pageNumber) === reservation) this.#continuousReservations.delete(pageNumber);\n page?.cleanup();\n }\n }\n\n #isCurrentContinuousPage(doc: SdPdfDocumentProxy, generation: number, pageNumber: number): boolean {\n return (\n !this.#destroyed && this.#pdfDoc() === doc && this.#layoutGeneration === generation && this.#continuousPages().includes(pageNumber)\n );\n }\n\n #updateContinuousMeasurement(pageNumber: number, height: number): void {\n const index = pageNumber - 1;\n if (!Number.isFinite(height) || height <= 0 || Math.abs((this.#pageHeights[index] ?? 0) - height) < 0.5) return;\n const stage = this.stageEl()?.nativeElement;\n const anchorIndex = stage ? this.#continuousPageIndexAt(stage.scrollTop) : 0;\n const anchorDelta = stage ? stage.scrollTop - this.#heightIndex.offsetAt(anchorIndex) : 0;\n this.#pageHeights[index] = height;\n this.#heightIndex.updateHeight(index, height);\n this.#continuousHeightVersion.update(version => version + 1);\n if (stage) stage.scrollTop = this.#heightIndex.offsetAt(anchorIndex) + anchorDelta;\n this.#updateContinuousWindow(false);\n }\n\n #cancelContinuousRenders(): void {\n this.#layoutGeneration++;\n if (this.#continuousFrame !== null) {\n this.#browser.cancelFrame(this.#continuousFrame);\n this.#continuousFrame = null;\n }\n for (const task of this.#continuousTasks.values()) task.cancel();\n this.#continuousTasks.clear();\n this.#continuousReservations.clear();\n }\n\n // ==========================================\n // THUMBNAIL HELPERS\n // ==========================================\n\n /**\n * Rebind the IntersectionObserver to whatever set of thumbnail canvases is\n * currently mounted. Called from an effect that tracks `thumbCanvases()`.\n */\n #syncThumbObserver(canvases: HTMLCanvasElement[]): void {\n this.#thumbObserverCleanup?.();\n this.#thumbObserverCleanup = null;\n const currentPages = new Set(canvases.map(canvas => Number(canvas.getAttribute('data-page'))).filter(page => Number.isFinite(page)));\n this.#cancelThumbnailWorkOutside(currentPages);\n if (canvases.length === 0) {\n return;\n }\n this.#thumbObserverCleanup = this.#browser.observeIntersections(\n canvases,\n entries => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const canvas = canvases.find(candidate => candidate === entry.target);\n if (!canvas) continue;\n const n = Number(canvas.getAttribute('data-page'));\n if (!Number.isFinite(n)) continue;\n void this.#renderThumbnail(n, canvas);\n }\n },\n { rootMargin: '120px 0px 120px 0px', threshold: 0.01 }\n );\n }\n\n #ensureThumbnailPageVisible(pageNumber: number): void {\n const start = this.#thumbnailWindowStart();\n const end = start + SdPreviewPdf.THUMBNAIL_WINDOW_SIZE;\n if (pageNumber > start && pageNumber <= end) return;\n const centered = pageNumber - 1 - Math.floor(SdPreviewPdf.THUMBNAIL_WINDOW_SIZE / 2);\n const next = Math.max(0, Math.min(centered, Math.max(0, this.numPages() - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n this.#thumbnailWindowStart.set(next);\n queueMicrotask(() => {\n const content = this.sidebarContentRef()?.nativeElement;\n if (content && this.#sidebarModeInternal() === 'thumbnails') {\n content.scrollTop = next * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT;\n }\n });\n }\n\n /**\n * Render a single page into a sidebar thumbnail canvas at ~140px width.\n * Reserved in `#thumbnailWork` before getPage() so rapid scroll bounces\n * cannot start duplicate work for the same mounted page.\n *\n * Visible for testing — tests can stub `getPage()` on the fake doc to\n * assert this method calls `render(...)` with the right page argument.\n */\n async renderThumbnailForPage(pageNum: number): Promise<void> {\n const canvas = this.thumbCanvases()\n .map(r => r.nativeElement)\n .find(c => Number(c.getAttribute('data-page')) === pageNum);\n if (!canvas) return;\n return this.#renderThumbnail(pageNum, canvas);\n }\n\n async #renderThumbnail(pageNum: number, canvas: HTMLCanvasElement): Promise<void> {\n const doc = this.#pdfDoc();\n if (!doc) return;\n if (this.#thumbnailWork.has(pageNum)) return;\n const cachedThumbnail = this.#getCachedThumbnail(pageNum);\n if (cachedThumbnail) {\n this.#paintCachedThumb(canvas, cachedThumbnail, this.#loadToken);\n return;\n }\n const loadToken = this.#loadToken;\n const work: PdfThumbnailWork = {\n loadToken,\n cancelled: false,\n renderTask: null,\n slotState: 'new',\n resumeSlot: null,\n };\n this.#thumbnailWork.set(pageNum, work);\n this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n let page: SdPdfPageProxy | null = null;\n let acquiredSlot = false;\n try {\n acquiredSlot = await this.#acquireThumbnailSlot(work);\n if (!acquiredSlot || !this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n page = await doc.getPage(pageNum);\n if (!this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n const baseViewport = page.getViewport({ scale: 1 });\n const scale = 140 / Math.max(1, baseViewport.width);\n const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale);\n canvas.width = Math.floor(renderViewport.width);\n canvas.height = Math.floor(renderViewport.height);\n canvas.style.width = `${logicalViewport.width}px`;\n canvas.style.height = `${logicalViewport.height}px`;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const renderTask = page.render({ canvasContext: ctx, viewport: renderViewport });\n work.renderTask = renderTask;\n try {\n await renderTask.promise;\n } catch {\n return;\n }\n if (!this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n try {\n const dataUrl = canvas.toDataURL('image/png');\n this.#cacheThumbnail(pageNum, dataUrl);\n } catch {\n return;\n }\n } catch {\n return;\n } finally {\n if (acquiredSlot) this.#releaseThumbnailSlot(work);\n if (this.#thumbnailWork.get(pageNum) === work) {\n this.#thumbnailWork.delete(pageNum);\n this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n }\n page?.cleanup();\n }\n }\n\n #isThumbnailWorkActive(pageNum: number, work: PdfThumbnailWork, doc: SdPdfDocumentProxy): boolean {\n return (\n !work.cancelled &&\n work.loadToken === this.#loadToken &&\n this.#isActiveLoad(work.loadToken) &&\n this.#pdfDoc() === doc &&\n this.#thumbnailWork.get(pageNum) === work &&\n this.pageNumbers().includes(pageNum)\n );\n }\n\n #getCachedThumbnail(pageNum: number): string | undefined {\n const cached = this.#thumbnailCacheLru.get(pageNum);\n if (cached === undefined) return undefined;\n this.#thumbnailCacheLru.delete(pageNum);\n this.#thumbnailCacheLru.set(pageNum, cached);\n return cached;\n }\n\n #cacheThumbnail(pageNum: number, dataUrl: string): void {\n this.#thumbnailCacheLru.delete(pageNum);\n this.#thumbnailCacheLru.set(pageNum, dataUrl);\n while (this.#thumbnailCacheLru.size > SdPreviewPdf.MAX_THUMBNAIL_CACHE_ENTRIES) {\n const oldestPage = this.#thumbnailCacheLru.keys().next().value as number | undefined;\n if (oldestPage === undefined) break;\n this.#thumbnailCacheLru.delete(oldestPage);\n }\n this.#thumbCache.set(Object.fromEntries(this.#thumbnailCacheLru));\n }\n\n #cancelThumbnailRenders(): void {\n for (const work of this.#thumbnailWork.values()) this.#cancelThumbnailWork(work);\n this.#thumbnailWork.clear();\n this.#thumbnailWorkCount.set(0);\n }\n\n #cancelThumbnailWorkOutside(currentPages: ReadonlySet<number>): void {\n for (const [pageNumber, work] of this.#thumbnailWork) {\n if (currentPages.has(pageNumber)) continue;\n this.#cancelThumbnailWork(work);\n this.#thumbnailWork.delete(pageNumber);\n }\n this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n }\n\n #cancelThumbnailWork(work: PdfThumbnailWork): void {\n work.cancelled = true;\n if (work.slotState === 'queued') {\n const queueIndex = this.#thumbnailSlotQueue.indexOf(work);\n if (queueIndex >= 0) this.#thumbnailSlotQueue.splice(queueIndex, 1);\n work.slotState = 'released';\n const resume = work.resumeSlot;\n work.resumeSlot = null;\n resume?.(false);\n }\n try {\n work.renderTask?.cancel();\n } catch {\n // Cancellation is best-effort; the identity guard still blocks late cache writes.\n }\n }\n\n #acquireThumbnailSlot(work: PdfThumbnailWork): Promise<boolean> {\n if (work.cancelled || this.#destroyed) return Promise.resolve(false);\n if (this.#activeThumbnailSlots < SdPreviewPdf.MAX_CONCURRENT_THUMBNAIL_WORK) {\n this.#activeThumbnailSlots++;\n work.slotState = 'active';\n return Promise.resolve(true);\n }\n work.slotState = 'queued';\n return new Promise<boolean>(resolve => {\n work.resumeSlot = resolve;\n this.#thumbnailSlotQueue.push(work);\n });\n }\n\n #releaseThumbnailSlot(work: PdfThumbnailWork): void {\n if (work.slotState !== 'active') return;\n work.slotState = 'released';\n this.#activeThumbnailSlots = Math.max(0, this.#activeThumbnailSlots - 1);\n while (this.#thumbnailSlotQueue.length > 0) {\n const next = this.#thumbnailSlotQueue.shift()!;\n if (next.cancelled || next.slotState !== 'queued') {\n const resumeCancelled = next.resumeSlot;\n next.resumeSlot = null;\n next.slotState = 'released';\n resumeCancelled?.(false);\n continue;\n }\n this.#activeThumbnailSlots++;\n next.slotState = 'active';\n const resume = next.resumeSlot;\n next.resumeSlot = null;\n resume?.(true);\n break;\n }\n }\n\n /**\n * Paint a previously-rendered dataURL onto a freshly-mounted canvas so the\n * mini-page reappears without re-rasterizing.\n */\n #paintCachedThumb(canvas: HTMLCanvasElement, dataUrl: string, loadToken: number): void {\n const img = this.#browser.createImage();\n if (!img) return;\n img.onload = () => {\n if (!this.#isActiveLoad(loadToken)) return;\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n canvas.style.width = `${img.naturalWidth}px`;\n canvas.style.height = `${img.naturalHeight}px`;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n}\n","<!--\n sd-preview-pdf shell. Self-contained — sizes to its parent. Consumer wraps\n in <sd-modal>/<sd-side-drawer>/page section. Header + sidebar + stage +\n floating toolbar mirror Artboards A / C / E from the design handoff.\n-->\n<div class=\"sd-preview-pdf-shell\" role=\"region\">\n @let _stage = stage();\n @let _numPages = numPages();\n @let _activePage = activePage();\n @let _isSidebarOpen = isSidebarOpen();\n @let _searchBarOpen = searchBarOpen();\n @let _searchTerm = searchTerm();\n @let _searchTotal = searchTotal();\n\n <!-- ============================================\n HEADER BAR — hidden in empty + loading per design\n ============================================ -->\n @if (_stage === 'ready') {\n <div class=\"sd-preview-pdf-header\">\n <div class=\"sd-preview-pdf-header__left\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"_isSidebarOpen\"\n [attr.aria-expanded]=\"_isSidebarOpen\"\n [attr.aria-controls]=\"sidebarRegionId()\"\n [attr.aria-label]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n [attr.title]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n [attr.data-autoId]=\"autoIdSidebarToggle()\"\n (click)=\"toggleSidebar()\">\n <sd-icon fontIcon=\"menu\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-header__divider\"></span>\n <div class=\"sd-preview-pdf-fileicon\" aria-hidden=\"true\">PDF</div>\n <div class=\"sd-preview-pdf-header__meta\">\n <div class=\"sd-preview-pdf-header__name\" [title]=\"title() || filename()\">\n {{ title() || filename() }}\n </div>\n <div class=\"sd-preview-pdf-header__sub\">\n {{ 'core.component.preview-pdf.pages-count' | translate: { count: _numPages } }}\n </div>\n </div>\n </div>\n\n <div class=\"sd-preview-pdf-header__right\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"_searchBarOpen\"\n [attr.aria-expanded]=\"_searchBarOpen\"\n [attr.aria-controls]=\"searchBarId()\"\n [attr.aria-label]=\"'core.component.preview-pdf.search' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search' | translate\"\n [attr.data-autoId]=\"autoIdSearchToggle()\"\n (click)=\"searchBarOpen() ? closeSearch() : openSearch()\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n </button>\n @if (canPrint()) {\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.print' | translate\"\n [attr.title]=\"'core.component.preview-pdf.print' | translate\"\n [attr.data-autoId]=\"autoIdPrint()\"\n (click)=\"printFile()\">\n <sd-icon fontIcon=\"print\"></sd-icon>\n </button>\n }\n @if (canDownload()) {\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.download' | translate\"\n [attr.title]=\"'core.component.preview-pdf.download' | translate\"\n [attr.data-autoId]=\"autoIdDownload()\"\n (click)=\"downloadFile()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n </button>\n }\n @if (canFullscreen()) {\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.fullscreen' | translate\"\n [attr.title]=\"'core.component.preview-pdf.fullscreen' | translate\"\n [attr.data-autoId]=\"autoIdFullscreen()\"\n (click)=\"toggleFullscreen()\">\n <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n </button>\n }\n </div>\n </div>\n\n <!-- ============================================\n SEARCH BAR — between header + body, only when bar is open\n ============================================ -->\n <div\n class=\"sd-preview-pdf-searchbar\"\n role=\"search\"\n [id]=\"searchBarId()\"\n [hidden]=\"!_searchBarOpen\"\n [style.display]=\"_searchBarOpen ? null : 'none'\">\n @if (_searchBarOpen) {\n <sd-icon class=\"sd-preview-pdf-searchbar__icon\" fontIcon=\"search\"></sd-icon>\n <input\n #searchInput\n type=\"text\"\n class=\"sd-preview-pdf-searchbar__input\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-placeholder' | translate\"\n [attr.placeholder]=\"'core.component.preview-pdf.search-placeholder' | translate\"\n [value]=\"_searchTerm\"\n [attr.data-autoId]=\"autoIdSearchInput()\"\n (input)=\"onSearchInput($event)\" />\n <span class=\"sd-preview-pdf-searchbar__counter\" aria-live=\"polite\">\n {{ searchCurrent() }} / {{ _searchTotal }}{{ searchTruncated() ? '+' : '' }}\n </span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [disabled]=\"_searchTotal === 0\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-prev' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-prev' | translate\"\n [attr.data-autoId]=\"autoIdSearchPrev()\"\n (click)=\"searchPrev()\">\n <sd-icon fontIcon=\"keyboard_arrow_up\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [disabled]=\"_searchTotal === 0\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-next' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-next' | translate\"\n [attr.data-autoId]=\"autoIdSearchNext()\"\n (click)=\"searchNext()\">\n <sd-icon fontIcon=\"keyboard_arrow_down\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-searchbar__divider\"></span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"searchCaseSensitive()\"\n [attr.aria-pressed]=\"searchCaseSensitive()\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-case' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-case' | translate\"\n [attr.data-autoId]=\"autoIdSearchCase()\"\n (click)=\"toggleSearchCaseSensitive()\">\n <sd-icon fontIcon=\"match_case\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [class.sd-preview-pdf-iconbtn--active]=\"searchWholeWord()\"\n [attr.aria-pressed]=\"searchWholeWord()\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-whole' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-whole' | translate\"\n [attr.data-autoId]=\"autoIdSearchWhole()\"\n (click)=\"toggleSearchWholeWord()\">\n <sd-icon fontIcon=\"text_fields\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-searchbar__spacer\"></span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-iconbtn\"\n [attr.aria-label]=\"'core.component.preview-pdf.search-close' | translate\"\n [attr.title]=\"'core.component.preview-pdf.search-close' | translate\"\n [attr.data-autoId]=\"autoIdSearchClose()\"\n (click)=\"closeSearch()\">\n <sd-icon fontIcon=\"close\"></sd-icon>\n </button>\n }\n </div>\n }\n\n <!-- ============================================\n BODY — sidebar + stage\n ============================================ -->\n <div class=\"sd-preview-pdf-body\">\n <!-- SIDEBAR ............................................................. -->\n @if (_stage === 'ready') {\n <aside\n class=\"sd-preview-pdf-sidebar\"\n role=\"complementary\"\n [id]=\"sidebarRegionId()\"\n [hidden]=\"!_isSidebarOpen\"\n [style.display]=\"_isSidebarOpen ? null : 'none'\">\n @if (_isSidebarOpen) {\n @let _sidebarMode = sidebarMode();\n <div class=\"sd-preview-pdf-sidebar__tabs\" role=\"tablist\">\n <button\n #sidebarTab\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [id]=\"tabThumbnailsId()\"\n [attr.aria-selected]=\"_sidebarMode === 'thumbnails'\"\n [attr.aria-controls]=\"sidebarPanelId()\"\n [attr.tabindex]=\"_sidebarMode === 'thumbnails' ? 0 : -1\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'thumbnails'\"\n data-sidebar-mode=\"thumbnails\"\n [attr.data-autoId]=\"autoIdTabThumbnails()\"\n (keydown)=\"onSidebarTabKeyDown($event, 'thumbnails')\"\n (click)=\"setSidebarMode('thumbnails')\">\n <sd-icon fontIcon=\"view_carousel\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.thumbnails' | translate }}</span>\n </button>\n <button\n #sidebarTab\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [id]=\"tabOutlineId()\"\n [attr.aria-selected]=\"_sidebarMode === 'outline'\"\n [attr.aria-controls]=\"sidebarPanelId()\"\n [attr.tabindex]=\"_sidebarMode === 'outline' ? 0 : -1\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'outline'\"\n data-sidebar-mode=\"outline\"\n [attr.data-autoId]=\"autoIdTabOutline()\"\n (keydown)=\"onSidebarTabKeyDown($event, 'outline')\"\n (click)=\"setSidebarMode('outline')\">\n <sd-icon fontIcon=\"list\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.outline' | translate }}</span>\n </button>\n <button\n #sidebarTab\n type=\"button\"\n class=\"sd-preview-pdf-sidebar__tab\"\n role=\"tab\"\n [id]=\"tabSearchId()\"\n [attr.aria-selected]=\"_sidebarMode === 'search'\"\n [attr.aria-controls]=\"sidebarPanelId()\"\n [attr.tabindex]=\"_sidebarMode === 'search' ? 0 : -1\"\n [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'search'\"\n data-sidebar-mode=\"search\"\n [attr.data-autoId]=\"autoIdTabSearch()\"\n (keydown)=\"onSidebarTabKeyDown($event, 'search')\"\n (click)=\"setSidebarMode('search')\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.tab.search' | translate }}</span>\n </button>\n </div>\n\n <div\n #sidebarContent\n class=\"sd-preview-pdf-sidebar__content\"\n role=\"tabpanel\"\n [id]=\"sidebarPanelId()\"\n [attr.aria-labelledby]=\"sidebarActiveTabId()\"\n (scroll)=\"onThumbnailSidebarScroll($event)\">\n @switch (_sidebarMode) {\n @case ('thumbnails') {\n <ul class=\"sd-preview-pdf-thumb-list\">\n <li class=\"sd-preview-pdf-thumb-list__spacer\" aria-hidden=\"true\" [style.height.px]=\"thumbnailTopSpacer()\"></li>\n @for (p of pageNumbers(); track trackByPage($index, p)) {\n <li>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-thumb\"\n [class.sd-preview-pdf-thumb--active]=\"p === _activePage\"\n [attr.aria-current]=\"p === _activePage ? 'page' : null\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: p, total: _numPages }\"\n [attr.data-autoId]=\"autoIdThumb(p - 1)\"\n (click)=\"goToPage(p)\">\n <div class=\"sd-preview-pdf-thumb__page\">\n <canvas #thumbCanvas class=\"sd-preview-pdf-thumb__canvas\" [attr.data-page]=\"p\" aria-hidden=\"true\"></canvas>\n </div>\n <span class=\"sd-preview-pdf-thumb__label\">{{ p }}</span>\n </button>\n </li>\n }\n <li class=\"sd-preview-pdf-thumb-list__spacer\" aria-hidden=\"true\" [style.height.px]=\"thumbnailBottomSpacer()\"></li>\n </ul>\n }\n @case ('outline') {\n <ul\n class=\"sd-preview-pdf-outline-tree\"\n role=\"tree\"\n [attr.aria-label]=\"'core.component.preview-pdf.tab.outline' | translate\">\n @for (row of visibleOutline(); track row.item.id) {\n <li class=\"sd-preview-pdf-outline-tree__node\" role=\"none\">\n <div class=\"sd-preview-pdf-outline-tree__row\" [style.padding-left.px]=\"(row.level - 1) * 16\">\n @if (row.item.children.length > 0) {\n <button\n type=\"button\"\n class=\"sd-preview-pdf-outline-tree__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"row.item.title\"\n [attr.aria-expanded]=\"isOutlineExpanded(row.item.id)\"\n (click)=\"toggleOutlineItem(row.item.id, $event)\">\n <sd-icon [fontIcon]=\"isOutlineExpanded(row.item.id) ? 'expand_more' : 'chevron_right'\"></sd-icon>\n </button>\n } @else {\n <span class=\"sd-preview-pdf-outline-tree__toggle-placeholder\" aria-hidden=\"true\"></span>\n }\n\n @if (row.item.url && row.item.page === null) {\n <a\n #outlineItem\n class=\"sd-preview-pdf-outline-tree__item\"\n role=\"treeitem\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [href]=\"row.item.url\"\n [attr.data-outline-id]=\"row.item.id\"\n [attr.aria-level]=\"row.level\"\n [attr.aria-expanded]=\"row.item.children.length > 0 ? isOutlineExpanded(row.item.id) : null\"\n [attr.aria-current]=\"row.item.page === _activePage ? 'page' : null\"\n [attr.tabindex]=\"outlineFocusId() === row.item.id ? 0 : -1\"\n (focus)=\"focusOutlineItem(row.item.id)\"\n (keydown)=\"onOutlineKeyDown($event, row.item.id)\">\n {{ row.item.title }}\n </a>\n } @else {\n <button\n #outlineItem\n type=\"button\"\n class=\"sd-preview-pdf-outline-tree__item\"\n role=\"treeitem\"\n [attr.data-outline-id]=\"row.item.id\"\n [attr.aria-level]=\"row.level\"\n [attr.aria-expanded]=\"row.item.children.length > 0 ? isOutlineExpanded(row.item.id) : null\"\n [attr.aria-current]=\"row.item.page === _activePage ? 'page' : null\"\n [attr.tabindex]=\"outlineFocusId() === row.item.id ? 0 : -1\"\n (focus)=\"focusOutlineItem(row.item.id)\"\n (click)=\"activateOutlineItem(row.item.id)\"\n (keydown)=\"onOutlineKeyDown($event, row.item.id)\">\n {{ row.item.title }}\n </button>\n }\n </div>\n </li>\n }\n </ul>\n }\n @case ('search') {\n @if (!_searchTerm) {\n <div class=\"sd-preview-pdf-sidebar__message\">\n <sd-icon fontIcon=\"search\"></sd-icon>\n <p>{{ 'core.component.preview-pdf.search-placeholder' | translate }}</p>\n </div>\n } @else if (_searchTotal === 0) {\n <div class=\"sd-preview-pdf-sidebar__message\">\n <sd-icon fontIcon=\"search_off\"></sd-icon>\n <p>{{ 'core.component.preview-pdf.search-no-results' | translate }}</p>\n </div>\n } @else {\n @if (searchTruncated()) {\n <p class=\"sd-preview-pdf-search-limit\" role=\"status\">\n {{ 'core.component.preview-pdf.search-truncated' | translate: { count: _searchTotal } }}\n </p>\n }\n <ul class=\"sd-preview-pdf-search-list\">\n @for (r of searchResults(); track $index; let i = $index) {\n <li>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-search-result\"\n [class.sd-preview-pdf-search-result--active]=\"i === searchActiveIndex()\"\n [attr.data-autoId]=\"autoIdResult(i)\"\n (click)=\"activateSearchResult(i)\">\n <span class=\"sd-preview-pdf-search-result__snippet\">\n {{ r.before }}<mark>{{ r.term }}</mark\n >{{ r.after }}\n </span>\n <span class=\"sd-preview-pdf-search-result__page\">{{ r.page }}</span>\n </button>\n </li>\n }\n </ul>\n }\n }\n }\n </div>\n }\n </aside>\n }\n\n <!-- STAGE ............................................................... -->\n <div class=\"sd-preview-pdf-stage\" #stageRef (wheel)=\"onWheel($event)\" (scroll)=\"onStageScroll()\">\n @switch (_stage) {\n @case ('empty') {\n <div class=\"sd-preview-pdf-status\">\n <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--muted\">\n <sd-icon fontIcon=\"picture_as_pdf\"></sd-icon>\n </div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.empty.title' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__hint\">\n {{ 'core.component.preview-pdf.empty.subtitle' | translate }}\n </div>\n </div>\n }\n @case ('loading') {\n @let _loadPercent = loadPercent();\n <div class=\"sd-preview-pdf-status\">\n <div\n class=\"sd-preview-pdf-spinner\"\n role=\"progressbar\"\n [attr.aria-label]=\"'core.component.preview-pdf.loading' | translate\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"_loadPercent\"></div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.loading' | translate }}\n @if (_loadPercent > 0) {\n <span class=\"sd-preview-pdf-progress-pct\">&nbsp;{{ _loadPercent }}%</span>\n }\n </div>\n <div class=\"sd-preview-pdf-progress\">\n <div class=\"sd-preview-pdf-progress__fill\" [style.width.%]=\"_loadPercent\"></div>\n </div>\n </div>\n }\n @case ('error') {\n @if (loadError$(); as err) {\n <div class=\"sd-preview-pdf-status\" role=\"alert\" aria-live=\"assertive\">\n <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--danger\">\n <sd-icon fontIcon=\"error\"></sd-icon>\n </div>\n <div class=\"sd-preview-pdf-status__title\">\n {{ 'core.component.preview-pdf.error.' + err.reason + '.title' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__hint\">\n {{ 'core.component.preview-pdf.error.' + err.reason + '.body' | translate }}\n </div>\n <div class=\"sd-preview-pdf-status__actions\">\n <button type=\"button\" class=\"sd-preview-pdf-btn-primary\" (click)=\"retryLoad()\" [attr.data-autoId]=\"autoIdRetry()\">\n <sd-icon fontIcon=\"refresh\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.error.retry' | translate }}</span>\n </button>\n @if (canDownload()) {\n <button type=\"button\" class=\"sd-preview-pdf-btn-secondary\" (click)=\"downloadFile()\">\n <sd-icon fontIcon=\"download\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.error.download-raw' | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n }\n @default {\n @if (scrollModeCurrent() === 'continuous') {\n <div class=\"sd-preview-pdf-continuous-content\">\n <div class=\"sd-preview-pdf-continuous-spacer\" [style.height.px]=\"continuousTopSpacer()\"></div>\n @for (pageNumber of continuousPages(); track pageNumber) {\n <div class=\"sd-preview-pdf-continuous-slot\" [style.min-height.px]=\"continuousPageHeights()[pageNumber]\">\n <canvas\n #continuousCanvas\n class=\"sd-preview-pdf-continuous-page\"\n role=\"img\"\n [attr.data-page]=\"pageNumber\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: pageNumber, total: _numPages }\">\n </canvas>\n </div>\n }\n <div class=\"sd-preview-pdf-continuous-spacer\" [style.height.px]=\"continuousBottomSpacer()\"></div>\n </div>\n } @else {\n <div class=\"sd-preview-pdf-page-wrap\">\n <canvas\n #pageCanvas\n class=\"sd-preview-pdf-page\"\n role=\"img\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\">\n </canvas>\n </div>\n }\n }\n }\n\n <!-- FLOATING TOOLBAR ........................................ -->\n @if (showToolbar() && _stage === 'ready') {\n @let _canPrev = canPrev();\n @let _canNext = canNext();\n @let _zoomMode = zoomMode();\n @let _scrollModeCurrent = scrollModeCurrent();\n <div class=\"sd-preview-pdf-toolbar\" role=\"toolbar\">\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canPrev\"\n [attr.aria-label]=\"'core.component.preview-pdf.first-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.first-page' | translate\"\n [attr.data-autoId]=\"autoIdFirst()\"\n (click)=\"firstPage()\">\n <sd-icon fontIcon=\"first_page\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canPrev\"\n [attr.aria-label]=\"'core.component.preview-pdf.prev-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.prev-page' | translate\"\n [attr.data-autoId]=\"autoIdPrev()\"\n (click)=\"prevPage()\">\n <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-toolbar__page\">\n <input\n type=\"text\"\n inputmode=\"numeric\"\n class=\"sd-preview-pdf-toolbar__page-input\"\n [value]=\"_activePage\"\n #pageInput\n (keydown.enter)=\"onPageInputEnter($event)\"\n (blur)=\"onPageInputBlur($event)\"\n [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\"\n [attr.data-autoId]=\"autoIdPageInput()\" />\n <span class=\"sd-preview-pdf-toolbar__page-total\">/ {{ _numPages }}</span>\n </span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canNext\"\n [attr.aria-label]=\"'core.component.preview-pdf.next-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.next-page' | translate\"\n [attr.data-autoId]=\"autoIdNext()\"\n (click)=\"nextPage()\">\n <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [disabled]=\"!_canNext\"\n [attr.aria-label]=\"'core.component.preview-pdf.last-page' | translate\"\n [attr.title]=\"'core.component.preview-pdf.last-page' | translate\"\n [attr.data-autoId]=\"autoIdLast()\"\n (click)=\"lastPage()\">\n <sd-icon fontIcon=\"last_page\"></sd-icon>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.zoom-out' | translate\"\n [attr.title]=\"'core.component.preview-pdf.zoom-out' | translate\"\n [attr.data-autoId]=\"autoIdZoomOut()\"\n (click)=\"zoomOut()\">\n <sd-icon fontIcon=\"remove\"></sd-icon>\n </button>\n <span class=\"sd-preview-pdf-toolbar__zoom\" aria-live=\"polite\" [attr.data-autoId]=\"autoIdZoomReadout()\">{{ zoomPercent() }}%</span>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.zoom-in' | translate\"\n [attr.title]=\"'core.component.preview-pdf.zoom-in' | translate\"\n [attr.data-autoId]=\"autoIdZoomIn()\"\n (click)=\"zoomIn()\">\n <sd-icon fontIcon=\"add\"></sd-icon>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-fit'\"\n [attr.data-autoId]=\"autoIdFitPage()\"\n (click)=\"setZoom('page-fit')\">\n <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.fit-page' | translate }}</span>\n </button>\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-width'\"\n [attr.data-autoId]=\"autoIdFitWidth()\"\n (click)=\"setZoom('page-width')\">\n <sd-icon fontIcon=\"swap_horiz\"></sd-icon>\n <span>{{ 'core.component.preview-pdf.fit-width' | translate }}</span>\n </button>\n\n <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn\"\n [attr.aria-label]=\"'core.component.preview-pdf.rotate' | translate\"\n [attr.title]=\"'core.component.preview-pdf.rotate' | translate\"\n [attr.data-autoId]=\"autoIdRotate()\"\n (click)=\"rotate('right')\">\n <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n </button>\n\n <button\n type=\"button\"\n class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n [attr.data-autoId]=\"autoIdScrollMode()\"\n (click)=\"setScrollMode(_scrollModeCurrent === 'page' ? 'continuous' : 'page')\">\n <sd-icon [fontIcon]=\"_scrollModeCurrent === 'page' ? 'description' : 'view_day'\"></sd-icon>\n <span>\n {{\n (_scrollModeCurrent === 'page' ? 'core.component.preview-pdf.scroll-page' : 'core.component.preview-pdf.scroll-continuous')\n | translate\n }}\n </span>\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_a"],"mappings":"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"}