@sdcorejs/angular 19.0.1 → 20.0.0

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 (655) hide show
  1. package/README.md +15 -14
  2. package/components/anchor/index.d.ts +43 -1
  3. package/components/autoid-inspector/index.d.ts +199 -8
  4. package/components/avatar/index.d.ts +22 -1
  5. package/components/badge/index.d.ts +102 -1
  6. package/components/base/index.d.ts +11 -1
  7. package/components/button/index.d.ts +46 -1
  8. package/components/chart/index.d.ts +65 -4
  9. package/components/ckeditor-styles/index.d.ts +28 -1
  10. package/components/code-editor/index.d.ts +24 -1
  11. package/components/document-builder/index.d.ts +252 -4
  12. package/components/editor/index.d.ts +128 -3
  13. package/components/form-generic/index.d.ts +895 -4
  14. package/components/history/index.d.ts +23 -1
  15. package/components/import-excel/index.d.ts +160 -2
  16. package/components/inform/index.d.ts +70 -2
  17. package/components/mini-editor/index.d.ts +138 -2
  18. package/components/modal/index.d.ts +33 -1
  19. package/components/operator/index.d.ts +36 -1
  20. package/components/preview/index.d.ts +414 -4
  21. package/components/query-bar/index.d.ts +375 -2
  22. package/components/query-builder/index.d.ts +30 -1
  23. package/components/quick-action/index.d.ts +12 -1
  24. package/components/section/index.d.ts +28 -2
  25. package/components/side-drawer/index.d.ts +33 -1
  26. package/components/splitter/index.d.ts +58 -3
  27. package/components/stepper/index.d.ts +53 -2
  28. package/components/tab/index.d.ts +53 -2
  29. package/components/tab-router/index.d.ts +104 -4
  30. package/components/table/index.d.ts +1161 -11
  31. package/components/upload-file/index.d.ts +169 -2
  32. package/components/view/index.d.ts +20 -1
  33. package/configurations/index.d.ts +14 -1
  34. package/directives/index.d.ts +80 -6
  35. package/fesm2022/sdcorejs-angular-components-anchor.mjs +31 -31
  36. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +36 -36
  38. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-avatar.mjs +10 -10
  40. package/fesm2022/sdcorejs-angular-components-avatar.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-badge.mjs +34 -34
  42. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-base.mjs +3 -3
  44. package/fesm2022/sdcorejs-angular-components-button.mjs +30 -30
  45. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-chart.mjs +32 -32
  47. package/fesm2022/sdcorejs-angular-components-chart.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +4 -4
  49. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +12 -12
  51. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +6 -6
  53. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-editor.mjs +49 -39
  55. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +214 -214
  57. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-history.mjs +7 -7
  59. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +11 -11
  61. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components-inform.mjs +40 -40
  63. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +3 -3
  65. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-components-modal.mjs +21 -21
  67. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-components-operator.mjs +12 -12
  69. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-components-preview.mjs +121 -121
  71. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +150 -149
  73. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +3 -3
  75. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-components-quick-action.mjs +5 -5
  77. package/fesm2022/sdcorejs-angular-components-quick-action.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-components-section.mjs +24 -22
  79. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +16 -16
  81. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-components-splitter.mjs +41 -41
  83. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-components-stepper.mjs +26 -26
  85. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +25 -25
  87. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-components-tab.mjs +25 -25
  89. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-components-table.mjs +247 -247
  91. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +107 -87
  93. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-components-view.mjs +15 -15
  95. package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-directives.mjs +32 -32
  97. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +77 -64
  99. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +50 -39
  101. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +84 -73
  103. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-forms-chip.mjs +83 -72
  105. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +62 -49
  107. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-forms-date.mjs +70 -57
  109. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +93 -80
  111. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-forms-directives.mjs +12 -12
  113. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +20 -20
  114. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +72 -59
  116. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-forms-input.mjs +74 -61
  118. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-forms-label.mjs +3 -3
  120. package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-forms-models.mjs +2 -2
  122. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-forms-radio.mjs +71 -60
  124. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-forms-select.mjs +86 -73
  126. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-forms-switch.mjs +50 -39
  128. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +78 -65
  130. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-forms.mjs +4 -4
  132. package/fesm2022/sdcorejs-angular-handlers.mjs +3 -3
  133. package/fesm2022/sdcorejs-angular-i18n.mjs +9 -9
  134. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-interceptors.mjs +6 -6
  136. package/fesm2022/sdcorejs-angular-modules-auth.mjs +10 -10
  137. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-modules-authom.mjs +10 -10
  139. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +7 -7
  141. package/fesm2022/sdcorejs-angular-modules-layout.mjs +139 -139
  142. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-modules-permission.mjs +12 -12
  144. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-pipes.mjs +14 -14
  146. package/fesm2022/sdcorejs-angular-services-api.mjs +10 -10
  147. package/fesm2022/sdcorejs-angular-services-cache.mjs +3 -3
  148. package/fesm2022/sdcorejs-angular-services-confirm.mjs +6 -6
  149. package/fesm2022/sdcorejs-angular-services-docx.mjs +3 -3
  150. package/fesm2022/sdcorejs-angular-services-excel.mjs +3 -3
  151. package/fesm2022/sdcorejs-angular-services-license.mjs +3 -3
  152. package/fesm2022/sdcorejs-angular-services-loading.mjs +3 -3
  153. package/fesm2022/sdcorejs-angular-services-notify.mjs +12 -12
  154. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-services-storage.mjs +3 -3
  156. package/forms/autocomplete/index.d.ts +95 -1
  157. package/forms/checkbox/index.d.ts +31 -1
  158. package/forms/chip/index.d.ts +80 -1
  159. package/forms/chip-calendar/index.d.ts +73 -1
  160. package/forms/date/index.d.ts +82 -1
  161. package/forms/date-range/index.d.ts +83 -1
  162. package/forms/datetime/index.d.ts +92 -1
  163. package/forms/directives/index.d.ts +41 -4
  164. package/forms/index.d.ts +17 -1
  165. package/forms/input/index.d.ts +87 -1
  166. package/forms/input-color/index.d.ts +35 -1
  167. package/forms/input-number/index.d.ts +97 -1
  168. package/forms/label/index.d.ts +16 -1
  169. package/forms/models/index.d.ts +85 -6
  170. package/forms/radio/index.d.ts +52 -1
  171. package/forms/select/index.d.ts +95 -1
  172. package/forms/switch/index.d.ts +35 -1
  173. package/forms/textarea/index.d.ts +68 -1
  174. package/handlers/index.d.ts +12 -1
  175. package/i18n/index.d.ts +508 -5
  176. package/index.d.ts +2 -5
  177. package/interceptors/index.d.ts +27 -2
  178. package/models/index.d.ts +2 -1
  179. package/modules/auth/index.d.ts +64 -3
  180. package/modules/authom/index.d.ts +70 -35
  181. package/modules/keycloak/index.d.ts +48 -4
  182. package/modules/layout/index.d.ts +223 -5
  183. package/modules/permission/index.d.ts +101 -4
  184. package/package.json +45 -46
  185. package/pipes/index.d.ts +43 -4
  186. package/services/api/index.d.ts +71 -4
  187. package/services/cache/index.d.ts +43 -2
  188. package/services/confirm/index.d.ts +103 -1
  189. package/services/docx/index.d.ts +28 -1
  190. package/services/excel/index.d.ts +54 -1
  191. package/services/license/index.d.ts +13 -1
  192. package/services/loading/index.d.ts +17 -1
  193. package/services/notify/index.d.ts +40 -2
  194. package/services/storage/index.d.ts +34 -2
  195. package/utilities/data-state/index.d.ts +13 -1
  196. package/utilities/extensions/index.d.ts +87 -6
  197. package/utilities/models/index.d.ts +87 -12
  198. package/components/anchor/src/components/anchor/anchor.component.d.ts +0 -22
  199. package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +0 -13
  200. package/components/anchor/src/components/anchor-nav/anchor-nav.component.d.ts +0 -21
  201. package/components/anchor/src/components/index.d.ts +0 -2
  202. package/components/anchor/src/index.d.ts +0 -2
  203. package/components/anchor/src/models/index.d.ts +0 -1
  204. package/components/anchor/src/models/sd-anchor.model.d.ts +0 -7
  205. package/components/autoid-inspector/src/autoid-inspector.component.d.ts +0 -55
  206. package/components/autoid-inspector/src/models/autoid-element.model.d.ts +0 -55
  207. package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +0 -6
  208. package/components/autoid-inspector/src/models/autoid-inspector-config.model.d.ts +0 -8
  209. package/components/autoid-inspector/src/services/autoid-audit.service.d.ts +0 -19
  210. package/components/autoid-inspector/src/services/autoid-export.service.d.ts +0 -21
  211. package/components/autoid-inspector/src/services/autoid-highlight.service.d.ts +0 -12
  212. package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +0 -23
  213. package/components/avatar/src/avatar.component.d.ts +0 -19
  214. package/components/badge/src/badge.component.d.ts +0 -98
  215. package/components/base/src/base-secure.component.d.ts +0 -8
  216. package/components/button/src/button.component.d.ts +0 -42
  217. package/components/chart/src/bar-chart.component.d.ts +0 -18
  218. package/components/chart/src/doughnut-chart.component.d.ts +0 -16
  219. package/components/chart/src/line-chart.component.d.ts +0 -18
  220. package/components/chart/src/pie-chart.component.d.ts +0 -16
  221. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +0 -25
  222. package/components/code-editor/src/code-editor.component.d.ts +0 -25
  223. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -16
  224. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
  225. package/components/document-builder/src/components/index.d.ts +0 -1
  226. package/components/document-builder/src/document-builder.component.d.ts +0 -53
  227. package/components/document-builder/src/document-builder.config.d.ts +0 -21
  228. package/components/document-builder/src/document-builder.model.d.ts +0 -41
  229. package/components/document-builder/src/document-builder.utils.d.ts +0 -10
  230. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
  231. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
  232. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
  233. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
  234. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
  235. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
  236. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
  237. package/components/document-builder/src/plugins/index.d.ts +0 -11
  238. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
  239. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
  240. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
  241. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
  242. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
  243. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
  244. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
  245. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
  246. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
  247. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
  248. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
  249. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
  250. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
  251. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +0 -24
  252. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
  253. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
  254. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
  255. package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
  256. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
  257. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
  258. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
  259. package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
  260. package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
  261. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
  262. package/components/editor/src/configurations/editor.configuration.d.ts +0 -12
  263. package/components/editor/src/configurations/index.d.ts +0 -1
  264. package/components/editor/src/editor.component.d.ts +0 -52
  265. package/components/editor/src/models/editor.model.d.ts +0 -10
  266. package/components/editor/src/models/image-upload.plugin.model.d.ts +0 -51
  267. package/components/editor/src/models/index.d.ts +0 -2
  268. package/components/editor/src/plugins/image-upload/image-upload.plugin.d.ts +0 -22
  269. package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +0 -14
  270. package/components/editor/src/plugins/image-upload/utils/index.d.ts +0 -3
  271. package/components/editor/src/plugins/image-upload/utils/style.utils.d.ts +0 -3
  272. package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +0 -4
  273. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +0 -23
  274. package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +0 -17
  275. package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +0 -14
  276. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +0 -33
  277. package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +0 -26
  278. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +0 -27
  279. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +0 -35
  280. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +0 -41
  281. package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +0 -14
  282. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +0 -36
  283. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +0 -15
  284. package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +0 -17
  285. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +0 -21
  286. package/components/form-generic/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +0 -8
  287. package/components/form-generic/src/components/form-builder/components/checkbox/index.d.ts +0 -2
  288. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +0 -22
  289. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +0 -16
  290. package/components/form-generic/src/components/form-builder/components/chip-calendar/index.d.ts +0 -2
  291. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +0 -22
  292. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +0 -16
  293. package/components/form-generic/src/components/form-builder/components/chip-string/index.d.ts +0 -2
  294. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +0 -31
  295. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +0 -21
  296. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +0 -18
  297. package/components/form-generic/src/components/form-builder/components/datetime/index.d.ts +0 -2
  298. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +0 -47
  299. package/components/form-generic/src/components/form-builder/components/group/attribute/group-attribute.component.d.ts +0 -23
  300. package/components/form-generic/src/components/form-builder/components/group/index.d.ts +0 -1
  301. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +0 -35
  302. package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +0 -30
  303. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +0 -20
  304. package/components/form-generic/src/components/form-builder/components/html/index.d.ts +0 -2
  305. package/components/form-generic/src/components/form-builder/components/index.d.ts +0 -13
  306. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +0 -22
  307. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +0 -17
  308. package/components/form-generic/src/components/form-builder/components/number/index.d.ts +0 -2
  309. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +0 -22
  310. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +0 -16
  311. package/components/form-generic/src/components/form-builder/components/radio/index.d.ts +0 -2
  312. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +0 -22
  313. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +0 -16
  314. package/components/form-generic/src/components/form-builder/components/select/index.d.ts +0 -2
  315. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +0 -22
  316. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +0 -19
  317. package/components/form-generic/src/components/form-builder/components/table/index.d.ts +0 -2
  318. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +0 -21
  319. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +0 -16
  320. package/components/form-generic/src/components/form-builder/components/textarea/index.d.ts +0 -2
  321. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +0 -21
  322. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +0 -16
  323. package/components/form-generic/src/components/form-builder/components/textfield/index.d.ts +0 -2
  324. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +0 -27
  325. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +0 -16
  326. package/components/form-generic/src/components/form-builder/components/upload/index.d.ts +0 -2
  327. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +0 -120
  328. package/components/form-generic/src/components/form-builder/services/builder.service.d.ts +0 -11
  329. package/components/form-generic/src/components/form-builder/services/index.d.ts +0 -1
  330. package/components/form-generic/src/components/form-render/components/index.d.ts +0 -2
  331. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +0 -30
  332. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +0 -30
  333. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +0 -34
  334. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +0 -32
  335. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +0 -11
  336. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +0 -30
  337. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +0 -38
  338. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +0 -43
  339. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +0 -51
  340. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +0 -30
  341. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +0 -33
  342. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +0 -36
  343. package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +0 -32
  344. package/components/form-generic/src/components/form-render/components/variable/variable.component.d.ts +0 -22
  345. package/components/form-generic/src/components/form-render/form-render.component.d.ts +0 -39
  346. package/components/form-generic/src/components/index.d.ts +0 -3
  347. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +0 -43
  348. package/components/form-generic/src/configurations/form-generic.configuration.d.ts +0 -6
  349. package/components/form-generic/src/configurations/form.configuration.d.ts +0 -12
  350. package/components/form-generic/src/configurations/index.d.ts +0 -2
  351. package/components/form-generic/src/models/form-generic-component.model.d.ts +0 -318
  352. package/components/form-generic/src/models/form-generic-definition-html.model.d.ts +0 -28
  353. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +0 -49
  354. package/components/form-generic/src/models/form-generic-definition-table.model.d.ts +0 -6
  355. package/components/form-generic/src/models/form-generic-expression.model.d.ts +0 -74
  356. package/components/form-generic/src/models/form-generic-template.model.d.ts +0 -6
  357. package/components/form-generic/src/models/form-generic-validation.model.d.ts +0 -30
  358. package/components/form-generic/src/models/form-generic.model.d.ts +0 -7
  359. package/components/form-generic/src/models/form-render/form-render-args.model.d.ts +0 -7
  360. package/components/form-generic/src/models/form-render/form-render-entity.model.d.ts +0 -3
  361. package/components/form-generic/src/models/form-render/index.d.ts +0 -2
  362. package/components/form-generic/src/models/index.d.ts +0 -8
  363. package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +0 -14
  364. package/components/form-generic/src/pipes/expression-feel.pipe.d.ts +0 -10
  365. package/components/form-generic/src/pipes/expression-query.pipe.d.ts +0 -10
  366. package/components/form-generic/src/pipes/expression-view.pipe.d.ts +0 -8
  367. package/components/form-generic/src/pipes/html.pipe.d.ts +0 -11
  368. package/components/form-generic/src/pipes/hyperlink.pipe.d.ts +0 -8
  369. package/components/form-generic/src/pipes/index.d.ts +0 -7
  370. package/components/form-generic/src/pipes/when-expression.pipe.d.ts +0 -13
  371. package/components/form-generic/src/services/form-generic.service.d.ts +0 -26
  372. package/components/form-generic/src/services/form-render.service.d.ts +0 -10
  373. package/components/form-generic/src/services/index.d.ts +0 -2
  374. package/components/history/models/history.model.d.ts +0 -13
  375. package/components/history/pipes/view-date.pipe.d.ts +0 -8
  376. package/components/history/src/history.component.d.ts +0 -7
  377. package/components/import-excel/src/import-excel.component.d.ts +0 -47
  378. package/components/import-excel/src/import-excel.model.d.ts +0 -102
  379. package/components/import-excel/src/pipes/columm-hidden.pipe.d.ts +0 -10
  380. package/components/import-excel/src/pipes/column-transform.pipe.d.ts +0 -11
  381. package/components/inform/src/inform-action.directive.d.ts +0 -9
  382. package/components/inform/src/inform.component.d.ts +0 -59
  383. package/components/mini-editor/src/mini-editor.component.d.ts +0 -91
  384. package/components/mini-editor/src/mini-editor.model.d.ts +0 -44
  385. package/components/modal/src/modal.component.d.ts +0 -30
  386. package/components/operator/src/operator.component.d.ts +0 -34
  387. package/components/preview/src/preview-image/preview-image.component.d.ts +0 -88
  388. package/components/preview/src/preview-image/preview-image.types.d.ts +0 -53
  389. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +0 -186
  390. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +0 -84
  391. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +0 -28
  392. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +0 -67
  393. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +0 -73
  394. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +0 -37
  395. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +0 -87
  396. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +0 -71
  397. package/components/query-bar/src/components/popover-chip/popover-chip.component.d.ts +0 -35
  398. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +0 -39
  399. package/components/query-bar/src/query-bar.component.d.ts +0 -137
  400. package/components/query-bar/src/query-bar.model.d.ts +0 -136
  401. package/components/query-builder/src/query-builder.component.d.ts +0 -26
  402. package/components/quick-action/src/quick-action.component.d.ts +0 -9
  403. package/components/section/src/section-item/section-item.component.d.ts +0 -7
  404. package/components/section/src/section.component.d.ts +0 -18
  405. package/components/side-drawer/src/side-drawer.component.d.ts +0 -30
  406. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +0 -24
  407. package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +0 -16
  408. package/components/splitter/src/splitter-state.service.d.ts +0 -26
  409. package/components/splitter/src/splitter.component.d.ts +0 -28
  410. package/components/splitter/src/splitter.models.d.ts +0 -23
  411. package/components/stepper/src/step.component.d.ts +0 -17
  412. package/components/stepper/src/stepper.component.d.ts +0 -33
  413. package/components/tab/src/tab-group.component.d.ts +0 -37
  414. package/components/tab/src/tab.component.d.ts +0 -13
  415. package/components/tab-router/src/actions/tab-router.action.d.ts +0 -5
  416. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +0 -22
  417. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +0 -16
  418. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +0 -15
  419. package/components/tab-router/src/decorators/tab.decorator.d.ts +0 -16
  420. package/components/tab-router/src/events/tab-router.event.d.ts +0 -11
  421. package/components/tab-router/src/models/index.d.ts +0 -1
  422. package/components/tab-router/src/models/tab-router.model.d.ts +0 -21
  423. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +0 -11
  424. package/components/tab-router/src/services/tab-decorator.service.d.ts +0 -9
  425. package/components/tab-router/src/services/tab-router.service.d.ts +0 -27
  426. package/components/table/src/components/column-title/column-title.component.d.ts +0 -10
  427. package/components/table/src/components/command/desktop-command.component.d.ts +0 -14
  428. package/components/table/src/components/command/pipes/command.pipe.d.ts +0 -30
  429. package/components/table/src/components/command/pipes/filter.pipe.d.ts +0 -35
  430. package/components/table/src/components/config/config.component.d.ts +0 -25
  431. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +0 -24
  432. package/components/table/src/components/desktop-cell/view/view.component.d.ts +0 -24
  433. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +0 -32
  434. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +0 -27
  435. package/components/table/src/components/filter/index.d.ts +0 -3
  436. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +0 -42
  437. package/components/table/src/components/index.d.ts +0 -3
  438. package/components/table/src/components/popup-export/popup-export.component.d.ts +0 -51
  439. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +0 -34
  440. package/components/table/src/components/selector-action/selector-action.component.d.ts +0 -16
  441. package/components/table/src/configurations/index.d.ts +0 -1
  442. package/components/table/src/configurations/table.configuration.d.ts +0 -35
  443. package/components/table/src/directives/index.d.ts +0 -6
  444. package/components/table/src/directives/sd-column-resize.directive.d.ts +0 -13
  445. package/components/table/src/directives/sd-table-cell-def.directive.d.ts +0 -16
  446. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +0 -16
  447. package/components/table/src/directives/sd-table-expand-def.directive.d.ts +0 -13
  448. package/components/table/src/directives/sd-table-filter-def.directive.d.ts +0 -14
  449. package/components/table/src/directives/sd-table-footer-def.directive.d.ts +0 -16
  450. package/components/table/src/directives/sd-table-group-def.directive.d.ts +0 -44
  451. package/components/table/src/directives/sd-table-title-def.directive.d.ts +0 -14
  452. package/components/table/src/directives/sticky-shadow.directive.d.ts +0 -17
  453. package/components/table/src/models/index.d.ts +0 -5
  454. package/components/table/src/models/table-column.model.d.ts +0 -119
  455. package/components/table/src/models/table-command.model.d.ts +0 -25
  456. package/components/table/src/models/table-item.model.d.ts +0 -65
  457. package/components/table/src/models/table-option-config.model.d.ts +0 -42
  458. package/components/table/src/models/table-option-expand.model.d.ts +0 -6
  459. package/components/table/src/models/table-option-export.model.d.ts +0 -42
  460. package/components/table/src/models/table-option-group.model.d.ts +0 -21
  461. package/components/table/src/models/table-option-paginate.model.d.ts +0 -7
  462. package/components/table/src/models/table-option-reload.model.d.ts +0 -7
  463. package/components/table/src/models/table-option-selector.model.d.ts +0 -105
  464. package/components/table/src/models/table-option-sort.model.d.ts +0 -3
  465. package/components/table/src/models/table-option-style.model.d.ts +0 -11
  466. package/components/table/src/models/table-option-tree.model.d.ts +0 -12
  467. package/components/table/src/models/table-option.model.d.ts +0 -181
  468. package/components/table/src/pipes/filter-values.pipe.d.ts +0 -8
  469. package/components/table/src/pipes/index.d.ts +0 -2
  470. package/components/table/src/pipes/sd-group.pipe.d.ts +0 -23
  471. package/components/table/src/pipes/sd-tree.pipe.d.ts +0 -9
  472. package/components/table/src/pipes/selection-disabled.pipe.d.ts +0 -9
  473. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
  474. package/components/table/src/pipes/selection-visible.pipe.d.ts +0 -9
  475. package/components/table/src/services/column-width.util.d.ts +0 -7
  476. package/components/table/src/services/config.service.d.ts +0 -21
  477. package/components/table/src/services/index.d.ts +0 -3
  478. package/components/table/src/services/table-export/table-export.service.d.ts +0 -26
  479. package/components/table/src/services/table-filter/table-filter.model.d.ts +0 -150
  480. package/components/table/src/services/table-filter/table-filter.service.d.ts +0 -20
  481. package/components/table/src/services/table-format/table-format.service.d.ts +0 -16
  482. package/components/table/src/services/tree/tree.util.d.ts +0 -14
  483. package/components/table/src/table.component.d.ts +0 -137
  484. package/components/upload-file/src/components/preview/preview.component.d.ts +0 -23
  485. package/components/upload-file/src/configurations/index.d.ts +0 -1
  486. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +0 -50
  487. package/components/upload-file/src/pipes/document.pipe.d.ts +0 -8
  488. package/components/upload-file/src/pipes/image.pipe.d.ts +0 -8
  489. package/components/upload-file/src/pipes/index.d.ts +0 -2
  490. package/components/upload-file/src/services/index.d.ts +0 -2
  491. package/components/upload-file/src/services/upload-file.model.d.ts +0 -12
  492. package/components/upload-file/src/services/upload-file.service.d.ts +0 -10
  493. package/components/upload-file/src/upload-file.component.d.ts +0 -85
  494. package/components/view/src/view.component.d.ts +0 -17
  495. package/configurations/src/sd-core.configuration.d.ts +0 -10
  496. package/directives/src/sd-desktop.directive.d.ts +0 -7
  497. package/directives/src/sd-hover-copy.directive.d.ts +0 -16
  498. package/directives/src/sd-href.directive.d.ts +0 -9
  499. package/directives/src/sd-mobile.directive.d.ts +0 -7
  500. package/directives/src/sd-scroll.directive.d.ts +0 -14
  501. package/directives/src/sd-tooltip.directive.d.ts +0 -26
  502. package/forms/autocomplete/src/autocomplete.component.d.ts +0 -93
  503. package/forms/checkbox/src/checkbox.component.d.ts +0 -28
  504. package/forms/chip/src/chip.component.d.ts +0 -71
  505. package/forms/chip/src/index.d.ts +0 -2
  506. package/forms/chip/src/pipes/index.d.ts +0 -1
  507. package/forms/chip/src/pipes/removable-chip.pipe.d.ts +0 -8
  508. package/forms/chip-calendar/src/chip-calendar.component.d.ts +0 -71
  509. package/forms/chip-calendar/src/pipes/index.d.ts +0 -1
  510. package/forms/chip-calendar/src/pipes/removable-chip.pipe.d.ts +0 -8
  511. package/forms/date/src/date.component.d.ts +0 -79
  512. package/forms/date-range/src/date-range.component.d.ts +0 -81
  513. package/forms/datetime/src/datetime.component.d.ts +0 -89
  514. package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +0 -37
  515. package/forms/datetime/src/popup/sd-time-spinner.component.d.ts +0 -41
  516. package/forms/directives/src/item-def.directive.d.ts +0 -13
  517. package/forms/directives/src/label-def.directive.d.ts +0 -9
  518. package/forms/directives/src/suffix-def.directive.d.ts +0 -9
  519. package/forms/directives/src/view-def.directive.d.ts +0 -14
  520. package/forms/input/src/input.component.d.ts +0 -84
  521. package/forms/input-color/src/input-color.component.d.ts +0 -32
  522. package/forms/input-number/src/input-number.component.d.ts +0 -95
  523. package/forms/label/src/label.component.d.ts +0 -13
  524. package/forms/models/src/form-control-state.d.ts +0 -23
  525. package/forms/models/src/sd-custom-validator.model.d.ts +0 -15
  526. package/forms/models/src/sd-form-control.model.d.ts +0 -21
  527. package/forms/models/src/sd-form.configuration.d.ts +0 -6
  528. package/forms/models/src/sd-search.model.d.ts +0 -7
  529. package/forms/models/src/sd-selection-data.model.d.ts +0 -7
  530. package/forms/radio/src/radio.component.d.ts +0 -49
  531. package/forms/select/src/select.component.d.ts +0 -93
  532. package/forms/src/forms.module.d.ts +0 -14
  533. package/forms/switch/src/switch.component.d.ts +0 -32
  534. package/forms/textarea/src/textarea.component.d.ts +0 -65
  535. package/handlers/global-error.handler.d.ts +0 -9
  536. package/i18n/src/en.d.ts +0 -449
  537. package/i18n/src/i18n.messages.d.ts +0 -2
  538. package/i18n/src/i18n.pipe.d.ts +0 -9
  539. package/i18n/src/i18n.service.d.ts +0 -14
  540. package/i18n/src/i18n.token.d.ts +0 -1
  541. package/i18n/src/i18n.types.d.ts +0 -31
  542. package/i18n/src/ja.d.ts +0 -2
  543. package/i18n/src/ko.d.ts +0 -2
  544. package/i18n/src/vi.d.ts +0 -2
  545. package/i18n/src/zh.d.ts +0 -2
  546. package/interceptors/no-internet/no-internet.interceptor.d.ts +0 -14
  547. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +0 -12
  548. package/models/src/language.model.d.ts +0 -2
  549. package/modules/auth/configurations/auth.configuration.d.ts +0 -19
  550. package/modules/auth/configurations/index.d.ts +0 -1
  551. package/modules/auth/guards/auth.guard.d.ts +0 -11
  552. package/modules/auth/guards/index.d.ts +0 -2
  553. package/modules/auth/guards/portal.guard.d.ts +0 -11
  554. package/modules/auth/services/auth.model.d.ts +0 -8
  555. package/modules/auth/services/auth.service.d.ts +0 -17
  556. package/modules/auth/services/index.d.ts +0 -2
  557. package/modules/authom/authom.configuration.d.ts +0 -17
  558. package/modules/authom/authom.interceptor.d.ts +0 -3
  559. package/modules/authom/authom.module.d.ts +0 -16
  560. package/modules/authom/authom.service.d.ts +0 -32
  561. package/modules/keycloak/keycloak.configuration.d.ts +0 -11
  562. package/modules/keycloak/keycloak.interceptor.d.ts +0 -2
  563. package/modules/keycloak/keycloak.module.d.ts +0 -18
  564. package/modules/keycloak/keycloak.service.d.ts +0 -14
  565. package/modules/layout/components/index.d.ts +0 -4
  566. package/modules/layout/components/layout-main/layout-main.component.d.ts +0 -12
  567. package/modules/layout/components/page/page.component.d.ts +0 -10
  568. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +0 -35
  569. package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +0 -24
  570. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +0 -21
  571. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +0 -55
  572. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +0 -22
  573. package/modules/layout/components/sidebar-v1/main.component.d.ts +0 -24
  574. package/modules/layout/configurations/index.d.ts +0 -1
  575. package/modules/layout/configurations/layout.configuration.d.ts +0 -67
  576. package/modules/layout/layout.module.d.ts +0 -7
  577. package/modules/layout/layout.routing.d.ts +0 -2
  578. package/modules/layout/modules/forbidden/forbidden.module.d.ts +0 -8
  579. package/modules/layout/modules/forbidden/forbidden.routing.d.ts +0 -2
  580. package/modules/layout/modules/forbidden/index.d.ts +0 -1
  581. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +0 -10
  582. package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +0 -33
  583. package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +0 -11
  584. package/modules/layout/modules/home/home.module.d.ts +0 -8
  585. package/modules/layout/modules/home/home.routing.d.ts +0 -7
  586. package/modules/layout/modules/home/index.d.ts +0 -1
  587. package/modules/layout/modules/index.d.ts +0 -3
  588. package/modules/layout/modules/not-found/index.d.ts +0 -1
  589. package/modules/layout/modules/not-found/not-found.module.d.ts +0 -8
  590. package/modules/layout/modules/not-found/not-found.routing.d.ts +0 -2
  591. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +0 -10
  592. package/modules/layout/pipes/high-light-search.pipe.d.ts +0 -10
  593. package/modules/layout/pipes/index.d.ts +0 -3
  594. package/modules/layout/pipes/menu-focus.pipe.d.ts +0 -10
  595. package/modules/layout/pipes/menu.pipe.d.ts +0 -13
  596. package/modules/layout/services/index.d.ts +0 -3
  597. package/modules/layout/services/layout.service.d.ts +0 -10
  598. package/modules/layout/services/menu/menu.model.d.ts +0 -24
  599. package/modules/layout/services/storage/storage.service.d.ts +0 -13
  600. package/modules/permission/src/configurations/index.d.ts +0 -1
  601. package/modules/permission/src/configurations/permission.configuration.d.ts +0 -63
  602. package/modules/permission/src/directives/index.d.ts +0 -1
  603. package/modules/permission/src/directives/permission.directive.d.ts +0 -9
  604. package/modules/permission/src/guards/index.d.ts +0 -1
  605. package/modules/permission/src/guards/permission.guard.d.ts +0 -14
  606. package/modules/permission/src/services/index.d.ts +0 -1
  607. package/modules/permission/src/services/permission.service.d.ts +0 -12
  608. package/pipes/src/empty.pipe.d.ts +0 -7
  609. package/pipes/src/format-number.pipe.d.ts +0 -11
  610. package/pipes/src/safe-html.pipe.d.ts +0 -11
  611. package/pipes/src/time-different.pipe.d.ts +0 -13
  612. package/public-api.d.ts +0 -10
  613. package/services/api/src/api.model.d.ts +0 -36
  614. package/services/api/src/api.module.d.ts +0 -6
  615. package/services/api/src/api.service.d.ts +0 -19
  616. package/services/api/src/interceptors/api.interceptor.d.ts +0 -9
  617. package/services/cache/src/cache.model.d.ts +0 -30
  618. package/services/cache/src/cache.service.d.ts +0 -9
  619. package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +0 -46
  620. package/services/confirm/src/lib/confirm.service.d.ts +0 -55
  621. package/services/confirm/src/public-api.d.ts +0 -2
  622. package/services/docx/src/lib/docx.model.d.ts +0 -9
  623. package/services/docx/src/lib/docx.service.d.ts +0 -15
  624. package/services/docx/src/lib/pandoc-core.d.ts +0 -11
  625. package/services/docx/src/public-api.d.ts +0 -2
  626. package/services/excel/src/lib/excel.model.d.ts +0 -31
  627. package/services/excel/src/lib/excel.service.d.ts +0 -19
  628. package/services/excel/src/public-api.d.ts +0 -2
  629. package/services/license/src/license.service.d.ts +0 -10
  630. package/services/loading/src/loading.service.d.ts +0 -14
  631. package/services/notify/src/components/toast/toast.component.d.ts +0 -28
  632. package/services/notify/src/components/toast-container.component.d.ts +0 -8
  633. package/services/notify/src/notify.model.d.ts +0 -16
  634. package/services/notify/src/notify.service.d.ts +0 -20
  635. package/services/storage/src/storage.model.d.ts +0 -20
  636. package/services/storage/src/storage.service.d.ts +0 -10
  637. package/utilities/data-state/src/data-state.d.ts +0 -11
  638. package/utilities/extensions/src/array.extension.d.ts +0 -1
  639. package/utilities/extensions/src/color.extension.d.ts +0 -5
  640. package/utilities/extensions/src/date.extension.d.ts +0 -1
  641. package/utilities/extensions/src/number.extension.d.ts +0 -1
  642. package/utilities/extensions/src/string.extension.d.ts +0 -50
  643. package/utilities/extensions/src/utility.extension.d.ts +0 -31
  644. package/utilities/models/src/color.model.d.ts +0 -4
  645. package/utilities/models/src/empty.model.d.ts +0 -4
  646. package/utilities/models/src/filter.model.d.ts +0 -12
  647. package/utilities/models/src/icon.model.d.ts +0 -2
  648. package/utilities/models/src/maybe-async.model.d.ts +0 -10
  649. package/utilities/models/src/nested-key-of.model.d.ts +0 -4
  650. package/utilities/models/src/operator.model.d.ts +0 -13
  651. package/utilities/models/src/order.model.d.ts +0 -4
  652. package/utilities/models/src/paging.model.d.ts +0 -8
  653. package/utilities/models/src/pattern.model.d.ts +0 -21
  654. package/utilities/models/src/size.model.d.ts +0 -4
  655. package/utilities/models/src/unwrap-signal.model.d.ts +0 -6
@@ -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 { MatIconModule } from '@angular/material/icon';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport * as uuid from 'uuid';\nimport {\n NormalizedImage,\n PreviewItem,\n PreviewStage,\n PreviewTheme,\n ThumbnailPosition,\n} from './preview-image.types';\n\n@Component({\n selector: 'sd-preview-image',\n standalone: true,\n imports: [CommonModule, MatIconModule, 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>(\n () => this.#images()[this.#activeIndex()],\n );\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(\n item: PreviewItem,\n override?: { name?: string; caption?: string; alt?: string },\n ): 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(\n url: string,\n override?: { name?: string; caption?: string; alt?: string },\n ): Promise<NormalizedImage> {\n const id = uuid.v4();\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(\n file: File,\n override?: { name?: string; caption?: string; alt?: string },\n ): 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: uuid.v4(),\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\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 <mat-icon class=\"sd-preview-header__icon\" fontIcon=\"image\"></mat-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 <mat-icon fontIcon=\"image_not_supported\"></mat-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 <mat-icon fontIcon=\"broken_image\"></mat-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 <mat-icon fontIcon=\"refresh\"></mat-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 <mat-icon fontIcon=\"chevron_left\"></mat-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 <mat-icon fontIcon=\"chevron_right\"></mat-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 <mat-icon fontIcon=\"zoom_out\"></mat-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 <mat-icon fontIcon=\"zoom_in\"></mat-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 <mat-icon fontIcon=\"fit_screen\"></mat-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 <mat-icon fontIcon=\"rotate_right\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <mat-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></mat-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 <mat-icon fontIcon=\"broken_image\"></mat-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 { MatIconModule } from '@angular/material/icon';\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// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport * as pdfjsLib from 'pdfjs-dist';\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(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n 'pdfjs-dist/build/pdf.worker.min.mjs' as any,\n import.meta.url,\n ).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 { str: string; }\ninterface PdfTextContent { items: Array<PdfTextItem | unknown> }\ninterface PdfPageProxy {\n getViewport(p: { scale: number; rotation?: number }): PdfViewport;\n render(p: {\n canvasContext: CanvasRenderingContext2D;\n viewport: PdfViewport;\n }): 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: [CommonModule, FormsModule, MatIconModule, 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 =\n 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(\n () => this.#sidebarOpenInternal() && this.#sidebarModeInternal() !== 'none',\n );\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 // eslint-disable-next-line max-len\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 { this.goToPage(this.#activePage() + 1); }\n prevPage(): void { this.goToPage(this.#activePage() - 1); }\n firstPage(): void { this.goToPage(1); }\n lastPage(): void { this.goToPage(this.numPages()); }\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 // eslint-disable-next-line max-len\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(\n term: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean },\n ): 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(\n cleanTerm,\n this.#searchCaseSensitive(),\n this.#searchWholeWord(),\n );\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 =\n !!target && target === this.searchInputRef()?.nativeElement;\n const isOtherEditable =\n !!target &&\n !isSearchInput &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n 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 { await pdfDoc.destroy(); } catch { /* ignore */ }\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(\n SdPreviewPdf.MAX_ZOOM,\n Math.max(SdPreviewPdf.MIN_ZOOM, mode),\n );\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 { this.#currentRenderTask.cancel(); } catch { /* ignore */ }\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 { await doc.destroy(); } catch { /* ignore */ }\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(\n SdPreviewPdf.MAX_ZOOM,\n Math.max(SdPreviewPdf.MIN_ZOOM, value),\n );\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 =\n 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\n .map((r, i) => ({ r, i }))\n .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 =\n 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\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 <mat-icon fontIcon=\"menu\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <mat-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></mat-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 <mat-icon class=\"sd-preview-pdf-searchbar__icon\" fontIcon=\"search\"></mat-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\">\n {{ searchCurrent() }} / {{ searchTotal() }}\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 <mat-icon fontIcon=\"keyboard_arrow_up\"></mat-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 <mat-icon fontIcon=\"keyboard_arrow_down\"></mat-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 <mat-icon fontIcon=\"match_case\"></mat-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 <mat-icon fontIcon=\"text_fields\"></mat-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 <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </div>\n }\n }\n\n <!-- ============================================\n BODY — sidebar + stage\n ============================================ -->\n <div class=\"sd-preview-pdf-body\">\n\n <!-- SIDEBAR ............................................................. -->\n @if (stage() === 'ready' && isSidebarOpen()) {\n <aside class=\"sd-preview-pdf-sidebar\" role=\"complementary\">\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 <mat-icon fontIcon=\"view_carousel\"></mat-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 <mat-icon fontIcon=\"list\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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\n #thumbCanvas\n class=\"sd-preview-pdf-thumb__canvas\"\n [attr.data-page]=\"p\"\n 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 <mat-icon fontIcon=\"list\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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 <mat-icon fontIcon=\"search_off\"></mat-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>{{ 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 <mat-icon fontIcon=\"picture_as_pdf\"></mat-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 <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 <mat-icon fontIcon=\"error_outline\"></mat-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 <mat-icon fontIcon=\"refresh\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <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 <mat-icon fontIcon=\"first_page\"></mat-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 <mat-icon fontIcon=\"chevron_left\"></mat-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 <mat-icon fontIcon=\"chevron_right\"></mat-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 <mat-icon fontIcon=\"last_page\"></mat-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 <mat-icon fontIcon=\"remove\"></mat-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 <mat-icon fontIcon=\"add\"></mat-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 <mat-icon fontIcon=\"fit_screen\"></mat-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 <mat-icon fontIcon=\"swap_horiz\"></mat-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 <mat-icon fontIcon=\"rotate_right\"></mat-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 <mat-icon [fontIcon]=\"scrollModeCurrent() === 'page' ? 'description' : 'view_day'\"></mat-icon>\n <span>\n {{ (scrollModeCurrent() === 'page'\n ? 'core.component.preview-pdf.scroll-page'\n : 'core.component.preview-pdf.scroll-continuous') | translate }}\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","i1"],"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.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 { MatIconModule } from '@angular/material/icon';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport * as uuid from 'uuid';\nimport {\n NormalizedImage,\n PreviewItem,\n PreviewStage,\n PreviewTheme,\n ThumbnailPosition,\n} from './preview-image.types';\n\n@Component({\n selector: 'sd-preview-image',\n standalone: true,\n imports: [CommonModule, MatIconModule, 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>(\n () => this.#images()[this.#activeIndex()],\n );\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(\n item: PreviewItem,\n override?: { name?: string; caption?: string; alt?: string },\n ): 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(\n url: string,\n override?: { name?: string; caption?: string; alt?: string },\n ): Promise<NormalizedImage> {\n const id = uuid.v4();\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(\n file: File,\n override?: { name?: string; caption?: string; alt?: string },\n ): 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: uuid.v4(),\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\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 <mat-icon class=\"sd-preview-header__icon\" fontIcon=\"image\"></mat-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 <mat-icon fontIcon=\"image_not_supported\"></mat-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 <mat-icon fontIcon=\"broken_image\"></mat-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 <mat-icon fontIcon=\"refresh\"></mat-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 <mat-icon fontIcon=\"chevron_left\"></mat-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 <mat-icon fontIcon=\"chevron_right\"></mat-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 <mat-icon fontIcon=\"zoom_out\"></mat-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 <mat-icon fontIcon=\"zoom_in\"></mat-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 <mat-icon fontIcon=\"fit_screen\"></mat-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 <mat-icon fontIcon=\"rotate_right\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <mat-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></mat-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 <mat-icon fontIcon=\"broken_image\"></mat-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 { MatIconModule } from '@angular/material/icon';\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// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport * as pdfjsLib from 'pdfjs-dist';\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(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n 'pdfjs-dist/build/pdf.worker.min.mjs' as any,\n import.meta.url,\n ).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 { str: string; }\ninterface PdfTextContent { items: Array<PdfTextItem | unknown> }\ninterface PdfPageProxy {\n getViewport(p: { scale: number; rotation?: number }): PdfViewport;\n render(p: {\n canvasContext: CanvasRenderingContext2D;\n viewport: PdfViewport;\n }): 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: [CommonModule, FormsModule, MatIconModule, 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 =\n 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(\n () => this.#sidebarOpenInternal() && this.#sidebarModeInternal() !== 'none',\n );\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 // eslint-disable-next-line max-len\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 { this.goToPage(this.#activePage() + 1); }\n prevPage(): void { this.goToPage(this.#activePage() - 1); }\n firstPage(): void { this.goToPage(1); }\n lastPage(): void { this.goToPage(this.numPages()); }\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 // eslint-disable-next-line max-len\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(\n term: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean },\n ): 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(\n cleanTerm,\n this.#searchCaseSensitive(),\n this.#searchWholeWord(),\n );\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 =\n !!target && target === this.searchInputRef()?.nativeElement;\n const isOtherEditable =\n !!target &&\n !isSearchInput &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n 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 { await pdfDoc.destroy(); } catch { /* ignore */ }\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(\n SdPreviewPdf.MAX_ZOOM,\n Math.max(SdPreviewPdf.MIN_ZOOM, mode),\n );\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 { this.#currentRenderTask.cancel(); } catch { /* ignore */ }\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 { await doc.destroy(); } catch { /* ignore */ }\n }\n\n #setZoom(value: number): void {\n const clamped = Math.min(\n SdPreviewPdf.MAX_ZOOM,\n Math.max(SdPreviewPdf.MIN_ZOOM, value),\n );\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 =\n 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\n .map((r, i) => ({ r, i }))\n .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 =\n 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\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 <mat-icon fontIcon=\"menu\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <mat-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></mat-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 <mat-icon class=\"sd-preview-pdf-searchbar__icon\" fontIcon=\"search\"></mat-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\">\n {{ searchCurrent() }} / {{ searchTotal() }}\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 <mat-icon fontIcon=\"keyboard_arrow_up\"></mat-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 <mat-icon fontIcon=\"keyboard_arrow_down\"></mat-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 <mat-icon fontIcon=\"match_case\"></mat-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 <mat-icon fontIcon=\"text_fields\"></mat-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 <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </div>\n }\n }\n\n <!-- ============================================\n BODY — sidebar + stage\n ============================================ -->\n <div class=\"sd-preview-pdf-body\">\n\n <!-- SIDEBAR ............................................................. -->\n @if (stage() === 'ready' && isSidebarOpen()) {\n <aside class=\"sd-preview-pdf-sidebar\" role=\"complementary\">\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 <mat-icon fontIcon=\"view_carousel\"></mat-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 <mat-icon fontIcon=\"list\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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\n #thumbCanvas\n class=\"sd-preview-pdf-thumb__canvas\"\n [attr.data-page]=\"p\"\n 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 <mat-icon fontIcon=\"list\"></mat-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 <mat-icon fontIcon=\"search\"></mat-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 <mat-icon fontIcon=\"search_off\"></mat-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>{{ 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 <mat-icon fontIcon=\"picture_as_pdf\"></mat-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 <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 <mat-icon fontIcon=\"error_outline\"></mat-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 <mat-icon fontIcon=\"refresh\"></mat-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 <mat-icon fontIcon=\"download\"></mat-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 <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 <mat-icon fontIcon=\"first_page\"></mat-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 <mat-icon fontIcon=\"chevron_left\"></mat-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 <mat-icon fontIcon=\"chevron_right\"></mat-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 <mat-icon fontIcon=\"last_page\"></mat-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 <mat-icon fontIcon=\"remove\"></mat-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 <mat-icon fontIcon=\"add\"></mat-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 <mat-icon fontIcon=\"fit_screen\"></mat-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 <mat-icon fontIcon=\"swap_horiz\"></mat-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 <mat-icon fontIcon=\"rotate_right\"></mat-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 <mat-icon [fontIcon]=\"scrollModeCurrent() === 'page' ? 'description' : 'view_day'\"></mat-icon>\n <span>\n {{ (scrollModeCurrent() === 'page'\n ? 'core.component.preview-pdf.scroll-page'\n : 'core.component.preview-pdf.scroll-continuous') | translate }}\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","i1"],"mappings":"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"}