@sd-angular/core 19.0.0-beta.89 → 19.0.0-beta.91

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 (275) hide show
  1. package/assets/scss/README.md +524 -0
  2. package/assets/scss/core/bootstrap.scss +0 -125
  3. package/assets/scss/core/utilities/_base.scss +333 -0
  4. package/assets/scss/core/utilities/_border.scss +22 -0
  5. package/assets/scss/core/utilities/_display.scss +10 -0
  6. package/assets/scss/core/utilities/_elevation.scss +80 -0
  7. package/assets/scss/core/utilities/_flexbox.scss +54 -0
  8. package/assets/scss/core/utilities/_gap.scss +9 -0
  9. package/assets/scss/core/utilities/_grid.scss +142 -0
  10. package/assets/scss/core/utilities/_index.scss +17 -0
  11. package/assets/scss/core/utilities/_misc.scss +20 -0
  12. package/assets/scss/core/utilities/_overflow.scss +9 -0
  13. package/assets/scss/core/utilities/_position.scss +8 -0
  14. package/assets/scss/core/utilities/_sizing.scss +28 -0
  15. package/assets/scss/core/utilities/_spacing.scss +31 -0
  16. package/assets/scss/core/utilities/_typography.scss +99 -0
  17. package/assets/scss/sd-core.scss +4 -6
  18. package/components/anchor/index.d.ts +1 -2
  19. package/components/anchor/src/components/anchor-vertical/{anchor-list/anchor-list.component.d.ts → anchor-vertical-list.component.d.ts} +4 -4
  20. package/components/anchor/src/components/index.d.ts +1 -1
  21. package/components/anchor/src/index.d.ts +2 -0
  22. package/components/anchor/src/models/index.d.ts +1 -1
  23. package/components/anchor/src/models/{anchor.model.d.ts → sd-anchor.model.d.ts} +0 -5
  24. package/fesm2022/sd-angular-core-components-anchor.mjs +9 -9
  25. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  26. package/fesm2022/sd-angular-core-components-import-excel.mjs +2 -2
  27. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  28. package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
  29. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  30. package/fesm2022/sd-angular-core-components-table.mjs +4 -4
  31. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  32. package/fesm2022/sd-angular-core-components-upload-file.mjs +4 -4
  33. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  34. package/fesm2022/sd-angular-core-components-workflow.mjs +9 -9
  35. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  36. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -2
  37. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  38. package/fesm2022/sd-angular-core-forms-date-range.mjs +2 -2
  39. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  40. package/fesm2022/sd-angular-core-forms-date.mjs +2 -2
  41. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  42. package/fesm2022/sd-angular-core-forms-datetime.mjs +428 -70
  43. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  44. package/fesm2022/sd-angular-core-forms-input-number.mjs +13 -5
  45. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  46. package/fesm2022/sd-angular-core-forms-select.mjs +2 -2
  47. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  48. package/fesm2022/sd-angular-core-modules-layout.mjs +2 -2
  49. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  50. package/fesm2022/sd-angular-core-pipes.mjs +3 -4
  51. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  52. package/fesm2022/sd-angular-core-services-api.mjs +2 -1
  53. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  54. package/forms/datetime/src/datetime.component.d.ts +16 -6
  55. package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +38 -0
  56. package/forms/datetime/src/popup/sd-time-spinner.component.d.ts +41 -0
  57. package/forms/input-number/src/input-number.component.d.ts +2 -1
  58. package/package.json +52 -52
  59. package/pipes/src/format-number.pipe.d.ts +1 -1
  60. package/sd-angular-core-19.0.0-beta.91.tgz +0 -0
  61. package/services/api/src/api.model.d.ts +1 -0
  62. package/assets/img/1D UX System.zip +0 -0
  63. package/assets/img/Popup/Vector.png +0 -0
  64. package/assets/img/empty.png +0 -0
  65. package/assets/img/empty.svg +0 -27
  66. package/assets/img/file-types/eps/001-file.eps +0 -143
  67. package/assets/img/file-types/eps/002-file-1.eps +0 -136
  68. package/assets/img/file-types/eps/003-file-2.eps +0 -130
  69. package/assets/img/file-types/eps/004-file-3.eps +0 -127
  70. package/assets/img/file-types/eps/005-file-4.eps +0 -120
  71. package/assets/img/file-types/eps/006-file-5.eps +0 -133
  72. package/assets/img/file-types/eps/007-file-6.eps +0 -133
  73. package/assets/img/file-types/eps/008-file-7.eps +0 -144
  74. package/assets/img/file-types/eps/009-file-8.eps +0 -150
  75. package/assets/img/file-types/eps/010-file-9.eps +0 -155
  76. package/assets/img/file-types/eps/011-file-10.eps +0 -124
  77. package/assets/img/file-types/eps/012-file-11.eps +0 -147
  78. package/assets/img/file-types/eps/013-file-12.eps +0 -125
  79. package/assets/img/file-types/eps/014-file-13.eps +0 -129
  80. package/assets/img/file-types/eps/015-file-14.eps +0 -143
  81. package/assets/img/file-types/eps/016-file-15.eps +0 -130
  82. package/assets/img/file-types/eps/017-file-16.eps +0 -197
  83. package/assets/img/file-types/eps/018-file-17.eps +0 -146
  84. package/assets/img/file-types/eps/019-file-18.eps +0 -131
  85. package/assets/img/file-types/eps/020-file-19.eps +0 -137
  86. package/assets/img/file-types/eps/021-file-20.eps +0 -134
  87. package/assets/img/file-types/eps/022-file-21.eps +0 -130
  88. package/assets/img/file-types/eps/023-file-22.eps +0 -161
  89. package/assets/img/file-types/eps/024-file-23.eps +0 -144
  90. package/assets/img/file-types/eps/025-file-24.eps +0 -164
  91. package/assets/img/file-types/eps/026-file-25.eps +0 -135
  92. package/assets/img/file-types/eps/027-file-26.eps +0 -124
  93. package/assets/img/file-types/eps/028-file-27.eps +0 -120
  94. package/assets/img/file-types/eps/029-file-28.eps +0 -141
  95. package/assets/img/file-types/eps/030-file-29.eps +0 -130
  96. package/assets/img/file-types/eps/031-file-30.eps +0 -157
  97. package/assets/img/file-types/eps/032-file-31.eps +0 -139
  98. package/assets/img/file-types/eps/033-file-32.eps +0 -139
  99. package/assets/img/file-types/eps/034-file-33.eps +0 -189
  100. package/assets/img/file-types/eps/035-file-34.eps +0 -162
  101. package/assets/img/file-types/eps/036-file-35.eps +0 -142
  102. package/assets/img/file-types/eps/037-file-36.eps +0 -123
  103. package/assets/img/file-types/eps/038-file-37.eps +0 -127
  104. package/assets/img/file-types/eps/039-file-38.eps +0 -146
  105. package/assets/img/file-types/eps/040-file-39.eps +0 -126
  106. package/assets/img/file-types/eps/041-file-40.eps +0 -117
  107. package/assets/img/file-types/eps/042-file-41.eps +0 -156
  108. package/assets/img/file-types/eps/043-file-42.eps +0 -118
  109. package/assets/img/file-types/eps/044-file-43.eps +0 -172
  110. package/assets/img/file-types/eps/045-file-44.eps +0 -201
  111. package/assets/img/file-types/eps/046-file-45.eps +0 -94
  112. package/assets/img/file-types/eps/047-file-46.eps +0 -176
  113. package/assets/img/file-types/eps/048-file-47.eps +0 -238
  114. package/assets/img/file-types/eps/049-file-48.eps +0 -187
  115. package/assets/img/file-types/eps/050-file-49.eps +0 -137
  116. package/assets/img/file-types/license/license.pdf +0 -0
  117. package/assets/img/file-types/png/3ds.png +0 -0
  118. package/assets/img/file-types/png/ai.png +0 -0
  119. package/assets/img/file-types/png/asp.png +0 -0
  120. package/assets/img/file-types/png/avi.png +0 -0
  121. package/assets/img/file-types/png/bin.png +0 -0
  122. package/assets/img/file-types/png/com.png +0 -0
  123. package/assets/img/file-types/png/css.png +0 -0
  124. package/assets/img/file-types/png/csv.png +0 -0
  125. package/assets/img/file-types/png/dbf.png +0 -0
  126. package/assets/img/file-types/png/dll.png +0 -0
  127. package/assets/img/file-types/png/doc.png +0 -0
  128. package/assets/img/file-types/png/docx.png +0 -0
  129. package/assets/img/file-types/png/dwg.png +0 -0
  130. package/assets/img/file-types/png/eml.png +0 -0
  131. package/assets/img/file-types/png/eps.png +0 -0
  132. package/assets/img/file-types/png/exe.png +0 -0
  133. package/assets/img/file-types/png/file.png +0 -0
  134. package/assets/img/file-types/png/fla.png +0 -0
  135. package/assets/img/file-types/png/gif.png +0 -0
  136. package/assets/img/file-types/png/htm.png +0 -0
  137. package/assets/img/file-types/png/ico.png +0 -0
  138. package/assets/img/file-types/png/ini.png +0 -0
  139. package/assets/img/file-types/png/iso.png +0 -0
  140. package/assets/img/file-types/png/jar.png +0 -0
  141. package/assets/img/file-types/png/jpg.png +0 -0
  142. package/assets/img/file-types/png/js.png +0 -0
  143. package/assets/img/file-types/png/mkv.png +0 -0
  144. package/assets/img/file-types/png/mov.png +0 -0
  145. package/assets/img/file-types/png/mp3.png +0 -0
  146. package/assets/img/file-types/png/mp4.png +0 -0
  147. package/assets/img/file-types/png/nfo.png +0 -0
  148. package/assets/img/file-types/png/obj.png +0 -0
  149. package/assets/img/file-types/png/otf.png +0 -0
  150. package/assets/img/file-types/png/pdf.png +0 -0
  151. package/assets/img/file-types/png/pkg.png +0 -0
  152. package/assets/img/file-types/png/png.png +0 -0
  153. package/assets/img/file-types/png/ppt.png +0 -0
  154. package/assets/img/file-types/png/pptx.png +0 -0
  155. package/assets/img/file-types/png/psd.png +0 -0
  156. package/assets/img/file-types/png/rtf.png +0 -0
  157. package/assets/img/file-types/png/svg.png +0 -0
  158. package/assets/img/file-types/png/tiff.png +0 -0
  159. package/assets/img/file-types/png/ttf.png +0 -0
  160. package/assets/img/file-types/png/txt.png +0 -0
  161. package/assets/img/file-types/png/vcf.png +0 -0
  162. package/assets/img/file-types/png/wav.png +0 -0
  163. package/assets/img/file-types/png/wmv.png +0 -0
  164. package/assets/img/file-types/png/xls.png +0 -0
  165. package/assets/img/file-types/png/xlsx.png +0 -0
  166. package/assets/img/file-types/png/xml.png +0 -0
  167. package/assets/img/file-types/png/zip.png +0 -0
  168. package/assets/img/file-types/psd/001-file.psd +0 -0
  169. package/assets/img/file-types/psd/002-file-1.psd +0 -0
  170. package/assets/img/file-types/psd/003-file-2.psd +0 -0
  171. package/assets/img/file-types/psd/004-file-3.psd +0 -0
  172. package/assets/img/file-types/psd/005-file-4.psd +0 -0
  173. package/assets/img/file-types/psd/006-file-5.psd +0 -0
  174. package/assets/img/file-types/psd/007-file-6.psd +0 -0
  175. package/assets/img/file-types/psd/008-file-7.psd +0 -0
  176. package/assets/img/file-types/psd/009-file-8.psd +0 -0
  177. package/assets/img/file-types/psd/010-file-9.psd +0 -0
  178. package/assets/img/file-types/psd/011-file-10.psd +0 -0
  179. package/assets/img/file-types/psd/012-file-11.psd +0 -0
  180. package/assets/img/file-types/psd/013-file-12.psd +0 -0
  181. package/assets/img/file-types/psd/014-file-13.psd +0 -0
  182. package/assets/img/file-types/psd/015-file-14.psd +0 -0
  183. package/assets/img/file-types/psd/016-file-15.psd +0 -0
  184. package/assets/img/file-types/psd/017-file-16.psd +0 -0
  185. package/assets/img/file-types/psd/018-file-17.psd +0 -0
  186. package/assets/img/file-types/psd/019-file-18.psd +0 -0
  187. package/assets/img/file-types/psd/020-file-19.psd +0 -0
  188. package/assets/img/file-types/psd/021-file-20.psd +0 -0
  189. package/assets/img/file-types/psd/022-file-21.psd +0 -0
  190. package/assets/img/file-types/psd/023-file-22.psd +0 -0
  191. package/assets/img/file-types/psd/024-file-23.psd +0 -0
  192. package/assets/img/file-types/psd/025-file-24.psd +0 -0
  193. package/assets/img/file-types/psd/026-file-25.psd +0 -0
  194. package/assets/img/file-types/psd/027-file-26.psd +0 -0
  195. package/assets/img/file-types/psd/028-file-27.psd +0 -0
  196. package/assets/img/file-types/psd/029-file-28.psd +0 -0
  197. package/assets/img/file-types/psd/030-file-29.psd +0 -0
  198. package/assets/img/file-types/psd/031-file-30.psd +0 -0
  199. package/assets/img/file-types/psd/032-file-31.psd +0 -0
  200. package/assets/img/file-types/psd/033-file-32.psd +0 -0
  201. package/assets/img/file-types/psd/034-file-33.psd +0 -0
  202. package/assets/img/file-types/psd/035-file-34.psd +0 -0
  203. package/assets/img/file-types/psd/036-file-35.psd +0 -0
  204. package/assets/img/file-types/psd/037-file-36.psd +0 -0
  205. package/assets/img/file-types/psd/038-file-37.psd +0 -0
  206. package/assets/img/file-types/psd/039-file-38.psd +0 -0
  207. package/assets/img/file-types/psd/040-file-39.psd +0 -0
  208. package/assets/img/file-types/psd/041-file-40.psd +0 -0
  209. package/assets/img/file-types/psd/042-file-41.psd +0 -0
  210. package/assets/img/file-types/psd/043-file-42.psd +0 -0
  211. package/assets/img/file-types/psd/044-file-43.psd +0 -0
  212. package/assets/img/file-types/psd/045-file-44.psd +0 -0
  213. package/assets/img/file-types/psd/046-file-45.psd +0 -0
  214. package/assets/img/file-types/psd/047-file-46.psd +0 -0
  215. package/assets/img/file-types/psd/048-file-47.psd +0 -0
  216. package/assets/img/file-types/psd/049-file-48.psd +0 -0
  217. package/assets/img/file-types/psd/050-file-49.psd +0 -0
  218. package/assets/img/file-types/svg/001-file.svg +0 -1
  219. package/assets/img/file-types/svg/002-file-1.svg +0 -1
  220. package/assets/img/file-types/svg/003-file-2.svg +0 -1
  221. package/assets/img/file-types/svg/004-file-3.svg +0 -1
  222. package/assets/img/file-types/svg/005-file-4.svg +0 -1
  223. package/assets/img/file-types/svg/006-file-5.svg +0 -1
  224. package/assets/img/file-types/svg/007-file-6.svg +0 -1
  225. package/assets/img/file-types/svg/008-file-7.svg +0 -1
  226. package/assets/img/file-types/svg/009-file-8.svg +0 -1
  227. package/assets/img/file-types/svg/010-file-9.svg +0 -1
  228. package/assets/img/file-types/svg/011-file-10.svg +0 -1
  229. package/assets/img/file-types/svg/012-file-11.svg +0 -1
  230. package/assets/img/file-types/svg/013-file-12.svg +0 -1
  231. package/assets/img/file-types/svg/014-file-13.svg +0 -1
  232. package/assets/img/file-types/svg/015-file-14.svg +0 -1
  233. package/assets/img/file-types/svg/016-file-15.svg +0 -1
  234. package/assets/img/file-types/svg/017-file-16.svg +0 -1
  235. package/assets/img/file-types/svg/018-file-17.svg +0 -1
  236. package/assets/img/file-types/svg/019-file-18.svg +0 -1
  237. package/assets/img/file-types/svg/020-file-19.svg +0 -1
  238. package/assets/img/file-types/svg/021-file-20.svg +0 -1
  239. package/assets/img/file-types/svg/022-file-21.svg +0 -1
  240. package/assets/img/file-types/svg/023-file-22.svg +0 -1
  241. package/assets/img/file-types/svg/024-file-23.svg +0 -1
  242. package/assets/img/file-types/svg/025-file-24.svg +0 -1
  243. package/assets/img/file-types/svg/026-file-25.svg +0 -1
  244. package/assets/img/file-types/svg/027-file-26.svg +0 -1
  245. package/assets/img/file-types/svg/028-file-27.svg +0 -1
  246. package/assets/img/file-types/svg/029-file-28.svg +0 -1
  247. package/assets/img/file-types/svg/030-file-29.svg +0 -1
  248. package/assets/img/file-types/svg/031-file-30.svg +0 -1
  249. package/assets/img/file-types/svg/032-file-31.svg +0 -1
  250. package/assets/img/file-types/svg/033-file-32.svg +0 -1
  251. package/assets/img/file-types/svg/034-file-33.svg +0 -1
  252. package/assets/img/file-types/svg/035-file-34.svg +0 -1
  253. package/assets/img/file-types/svg/036-file-35.svg +0 -1
  254. package/assets/img/file-types/svg/037-file-36.svg +0 -1
  255. package/assets/img/file-types/svg/038-file-37.svg +0 -1
  256. package/assets/img/file-types/svg/039-file-38.svg +0 -1
  257. package/assets/img/file-types/svg/040-file-39.svg +0 -1
  258. package/assets/img/file-types/svg/041-file-40.svg +0 -1
  259. package/assets/img/file-types/svg/042-file-41.svg +0 -1
  260. package/assets/img/file-types/svg/043-file-42.svg +0 -1
  261. package/assets/img/file-types/svg/044-file-43.svg +0 -1
  262. package/assets/img/file-types/svg/045-file-44.svg +0 -1
  263. package/assets/img/file-types/svg/046-file-45.svg +0 -1
  264. package/assets/img/file-types/svg/047-file-46.svg +0 -1
  265. package/assets/img/file-types/svg/048-file-47.svg +0 -1
  266. package/assets/img/file-types/svg/049-file-48.svg +0 -1
  267. package/assets/img/file-types/svg/050-file-49.svg +0 -1
  268. package/assets/img/plus-search-zoom-white.png +0 -0
  269. package/assets/scss/core/cursor.scss +0 -3
  270. package/assets/scss/core/elevation.scss +0 -57
  271. package/assets/scss/core/grid.scss +0 -40
  272. package/assets/scss/core/print.scss +0 -47
  273. package/assets/scss/core/typography.scss +0 -121
  274. package/sd-angular-core-19.0.0-beta.89.tgz +0 -0
  275. /package/components/anchor/src/components/{main/main.component.d.ts → anchor/anchor.component.d.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ // --------------------------------------------------------------------------
2
+ // Position
3
+ // --------------------------------------------------------------------------
4
+ .position-relative { position: relative !important; }
5
+ .position-absolute { position: absolute !important; }
6
+ .position-fixed { position: fixed !important; }
7
+ .position-sticky { position: sticky !important; }
8
+ .position-static { position: static !important; }
@@ -0,0 +1,28 @@
1
+ // --------------------------------------------------------------------------
2
+ // Sizing – Width & Height (px-based, 0–200)
3
+ // w-0 … w-200 | h-0 … h-200
4
+ // --------------------------------------------------------------------------
5
+ @for $i from 0 through 200 {
6
+ .w-#{$i} { width: #{$i}px !important; }
7
+ .h-#{$i} { height: #{$i}px !important; }
8
+ }
9
+
10
+ // Percentage / keyword shorthands
11
+ .w-full { width: 100% !important; }
12
+ .w-100 { width: 100% !important; } // Bootstrap compat alias
13
+ .w-auto { width: auto !important; }
14
+ .w-screen { width: 100vw !important; }
15
+ .w-fit { width: fit-content !important; }
16
+
17
+ .h-full { height: 100% !important; }
18
+ .h-100 { height: 100% !important; } // Bootstrap compat alias
19
+ .h-auto { height: auto !important; }
20
+ .h-screen { height: 100vh !important; }
21
+ .h-fit { height: fit-content !important; }
22
+
23
+ .min-h-full { min-height: 100% !important; }
24
+ .min-h-screen { min-height: 100vh !important; }
25
+ .min-w-full { min-width: 100% !important; }
26
+
27
+ .max-h-full { max-height: 100% !important; }
28
+ .max-w-full { max-width: 100% !important; }
@@ -0,0 +1,31 @@
1
+ // --------------------------------------------------------------------------
2
+ // Spacing – Margin & Padding (px-based, 0–200)
3
+ // m-0 … m-200 | mt-* | mr-* | mb-* | ml-* | mx-* | my-*
4
+ // p-0 … p-200 | pt-* | pr-* | pb-* | pl-* | px-* | py-*
5
+ // --------------------------------------------------------------------------
6
+ @for $i from 0 through 200 {
7
+ .m-#{$i} { margin: #{$i}px !important; }
8
+ .mt-#{$i} { margin-top: #{$i}px !important; }
9
+ .mr-#{$i} { margin-right: #{$i}px !important; }
10
+ .mb-#{$i} { margin-bottom: #{$i}px !important; }
11
+ .ml-#{$i} { margin-left: #{$i}px !important; }
12
+ .mx-#{$i} { margin-left: #{$i}px !important; margin-right: #{$i}px !important; }
13
+ .my-#{$i} { margin-top: #{$i}px !important; margin-bottom: #{$i}px !important; }
14
+
15
+ .p-#{$i} { padding: #{$i}px !important; }
16
+ .pt-#{$i} { padding-top: #{$i}px !important; }
17
+ .pr-#{$i} { padding-right: #{$i}px !important; }
18
+ .pb-#{$i} { padding-bottom: #{$i}px !important; }
19
+ .pl-#{$i} { padding-left: #{$i}px !important; }
20
+ .px-#{$i} { padding-left: #{$i}px !important; padding-right: #{$i}px !important; }
21
+ .py-#{$i} { padding-top: #{$i}px !important; padding-bottom: #{$i}px !important; }
22
+ }
23
+
24
+ // Auto margin helpers
25
+ .m-auto { margin: auto !important; }
26
+ .mt-auto { margin-top: auto !important; }
27
+ .mr-auto { margin-right: auto !important; }
28
+ .mb-auto { margin-bottom: auto !important; }
29
+ .ml-auto { margin-left: auto !important; }
30
+ .mx-auto { margin-left: auto !important; margin-right: auto !important; }
31
+ .my-auto { margin-top: auto !important; margin-bottom: auto !important; }
@@ -0,0 +1,99 @@
1
+ // --------------------------------------------------------------------------
2
+ // SCSS variables — dùng nội bộ trong scss, không output CSS
3
+ // Đặt tên theo thang đọc được: fw = font-weight, fs = font-size
4
+ // --------------------------------------------------------------------------
5
+ $fw-lighter: 400;
6
+ $fw-normal: 500;
7
+ $fw-bold: 600;
8
+
9
+ $fs-xs: 11.2px;
10
+ $fs-small: 14px;
11
+ $fs-normal: 16px;
12
+ $fs-regular: 18px;
13
+ $fs-medium: 21px;
14
+ $fs-large: 24px;
15
+ $fs-xl: 28px;
16
+ $fs-xxl: 38px;
17
+ $fs-xxxl: 42px;
18
+
19
+ // --------------------------------------------------------------------------
20
+ // Design token classes — hệ thống typography của SD Angular
21
+ // Quy ước: T{size}{weight} | M = Medium (500), R = Regular (400)
22
+ // Mỗi class bao gồm font-size + font-weight + line-height chuẩn hóa
23
+ // --------------------------------------------------------------------------
24
+ .T48M { font-size: 48px; font-weight: 500; line-height: 56px; }
25
+ .T48R { font-size: 48px; font-weight: 400; line-height: 56px; }
26
+
27
+ .T32M { font-size: 32px; font-weight: 500; line-height: 48px; }
28
+ .T32R { font-size: 32px; font-weight: 400; line-height: 48px; }
29
+
30
+ .T24M { font-size: 24px; font-weight: 500; line-height: 28px; }
31
+ .T24R { font-size: 20px; font-weight: 400; line-height: 28px; }
32
+
33
+ .T20M { font-size: 20px; font-weight: 500; line-height: 28px; }
34
+ .T20R { font-size: 20px; font-weight: 400; line-height: 28px; }
35
+
36
+ .T18M { font-size: 18px; font-weight: 500; line-height: 28px; }
37
+ .T18R { font-size: 18px; font-weight: 400; line-height: 28px; }
38
+
39
+ .T16M { font-size: 16px; font-weight: 500; line-height: 24px; }
40
+ .T16R { font-size: 16px; font-weight: 400; line-height: 24px; }
41
+
42
+ .T14M { font-size: 14px; font-weight: 500; line-height: 20px; }
43
+ .T14R { font-size: 14px; font-weight: 400; line-height: 20px; }
44
+
45
+ .T12M { font-size: 12px; font-weight: 500; line-height: 16px; }
46
+ // !important vì T12R thường bị override bởi material components
47
+ .T12R { font-size: 12px !important; font-weight: 400; line-height: 16px; }
48
+
49
+ .T10M { font-size: 10px; font-weight: 500; line-height: 12px; }
50
+ .T10R { font-size: 10px; font-weight: 400; line-height: 12px; }
51
+
52
+ // --------------------------------------------------------------------------
53
+ // Font-size utilities (px-based, 0–200)
54
+ // fs-0 … fs-200 — dùng khi cần ghi đè nhanh, không dùng thay token
55
+ // --------------------------------------------------------------------------
56
+ @for $i from 0 through 200 {
57
+ .fs-#{$i} { font-size: #{$i}px !important; }
58
+ }
59
+
60
+ // --------------------------------------------------------------------------
61
+ // Font-weight utilities
62
+ // --------------------------------------------------------------------------
63
+ .font-weight-light { font-weight: 300 !important; }
64
+ .font-weight-normal { font-weight: 400 !important; }
65
+ .font-weight-medium { font-weight: 500 !important; }
66
+ .font-weight-bold { font-weight: 600 !important; }
67
+ .font-weight-bolder { font-weight: 700 !important; }
68
+
69
+ // --------------------------------------------------------------------------
70
+ // Text alignment
71
+ // --------------------------------------------------------------------------
72
+ .text-left { text-align: left !important; }
73
+ .text-center { text-align: center !important; }
74
+ .text-right { text-align: right !important; }
75
+ .text-justify { text-align: justify !important; }
76
+
77
+ // --------------------------------------------------------------------------
78
+ // Text wrapping & overflow
79
+ // --------------------------------------------------------------------------
80
+ .text-wrap { white-space: normal !important; }
81
+ .text-nowrap { white-space: nowrap !important; }
82
+ .text-ellipsis {
83
+ // Hiển thị "..." khi text tràn — cần container có width cố định
84
+ white-space: nowrap !important;
85
+ overflow: hidden !important;
86
+ text-overflow: ellipsis !important;
87
+ }
88
+ .text-break {
89
+ // Xuống dòng từng ký tự khi tràn — dùng cho URL, hash, code dài
90
+ overflow-wrap: break-word !important;
91
+ word-break: break-word !important;
92
+ }
93
+
94
+ // --------------------------------------------------------------------------
95
+ // Text transform
96
+ // --------------------------------------------------------------------------
97
+ .text-uppercase { text-transform: uppercase !important; }
98
+ .text-lowercase { text-transform: lowercase !important; }
99
+ .text-capitalize { text-transform: capitalize !important; }
@@ -1,13 +1,11 @@
1
1
  @use '../fonts/fonts.scss';
2
- @use './core/bootstrap.scss';
3
- @use './core/cursor.scss';
2
+ // Tạm thời giữ bootstrap.scss để so sánh — xóa sau khi confirm _base.scss OK
3
+ // @use './core/bootstrap.scss';
4
+ @use './core/utilities/base'; // Reset / Reboot — phải load trước tất cả
5
+ @use './core/utilities';
4
6
  @use './core/color.scss';
5
7
  @use './core/form.scss';
6
8
  @use './core/scrollbar.scss';
7
- @use './core/typography.scss';
8
- @use './core/print.scss';
9
- @use './core/elevation.scss';
10
- @use './core/grid.scss';
11
9
  @use './themes/default.scss';
12
10
  @use './themes/material-theme.scss';
13
11
 
@@ -1,2 +1 @@
1
- export * from './src/components';
2
- export * from './src/models';
1
+ export * from './src';
@@ -1,7 +1,7 @@
1
1
  import { OnDestroy } from '@angular/core';
2
- import { SdAnchorItem } from '../../anchor-item/anchor-item.component';
2
+ import { SdAnchorItem } from '../anchor-item/anchor-item.component';
3
3
  import * as i0 from "@angular/core";
4
- export declare class SdVerticalAnchorList implements OnDestroy {
4
+ export declare class SdAnchorVerticalList implements OnDestroy {
5
5
  #private;
6
6
  sections: import("@angular/core").InputSignal<readonly SdAnchorItem[]>;
7
7
  activeSectionId: import("@angular/core").InputSignal<string>;
@@ -11,6 +11,6 @@ export declare class SdVerticalAnchorList implements OnDestroy {
11
11
  constructor();
12
12
  onClickSection: (id: string) => void;
13
13
  ngOnDestroy(): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<SdVerticalAnchorList, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<SdVerticalAnchorList, "sd-vertical-anchor-list", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeSectionId": { "alias": "activeSectionId"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "sidebarWidth": { "alias": "sidebarWidth"; "required": false; "isSignal": true; }; }, { "sdClickSection": "sdClickSection"; }, never, never, true, never>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdAnchorVerticalList, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdAnchorVerticalList, "sd-anchor-vertical-list", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeSectionId": { "alias": "activeSectionId"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "sidebarWidth": { "alias": "sidebarWidth"; "required": false; "isSignal": true; }; }, { "sdClickSection": "sdClickSection"; }, never, never, true, never>;
16
16
  }
@@ -1,2 +1,2 @@
1
1
  export * from './anchor-item/anchor-item.component';
2
- export * from './main/main.component';
2
+ export * from './anchor/anchor.component';
@@ -0,0 +1,2 @@
1
+ export * from './components';
2
+ export * from './models';
@@ -1 +1 @@
1
- export * from './anchor.model';
1
+ export * from './sd-anchor.model';
@@ -1,8 +1,3 @@
1
- export interface AnchorSection {
2
- id: string;
3
- element: HTMLElement;
4
- title: string;
5
- }
6
1
  import { ElementRef, InputSignal } from "@angular/core";
7
2
  export interface IAnchorItem {
8
3
  id: string;
@@ -20,14 +20,14 @@ class SdAnchorItem {
20
20
  });
21
21
  }
22
22
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", type: SdAnchorItem, isStandalone: true, selector: "sd-anchor-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
23
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", type: SdAnchorItem, isStandalone: true, selector: "sd-anchor-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<section>\r\n <ng-content></ng-content>\r\n</section>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
24
24
  }
25
25
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorItem, decorators: [{
26
26
  type: Component,
27
- args: [{ selector: 'sd-anchor-item', imports: [CommonModule], standalone: true, template: "<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n" }]
27
+ args: [{ selector: 'sd-anchor-item', imports: [CommonModule], standalone: true, template: "<section>\r\n <ng-content></ng-content>\r\n</section>\r\n" }]
28
28
  }], ctorParameters: () => [] });
29
29
 
30
- class SdVerticalAnchorList {
30
+ class SdAnchorVerticalList {
31
31
  sections = input.required();
32
32
  activeSectionId = input('');
33
33
  ellipsis = input(false);
@@ -47,12 +47,12 @@ class SdVerticalAnchorList {
47
47
  ngOnDestroy() {
48
48
  this.#subscription.unsubscribe();
49
49
  }
50
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdVerticalAnchorList, deps: [], target: i0.ɵɵFactoryTarget.Component });
51
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdVerticalAnchorList, isStandalone: true, selector: "sd-vertical-anchor-list", inputs: { sections: { classPropertyName: "sections", publicName: "sections", isSignal: true, isRequired: true, transformFunction: null }, activeSectionId: { classPropertyName: "activeSectionId", publicName: "activeSectionId", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sdClickSection: "sdClickSection" }, ngImport: i0, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorVerticalList, deps: [], target: i0.ɵɵFactoryTarget.Component });
51
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchorVerticalList, isStandalone: true, selector: "sd-anchor-vertical-list", inputs: { sections: { classPropertyName: "sections", publicName: "sections", isSignal: true, isRequired: true, transformFunction: null }, activeSectionId: { classPropertyName: "activeSectionId", publicName: "activeSectionId", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sdClickSection: "sdClickSection" }, ngImport: i0, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
52
52
  }
53
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdVerticalAnchorList, decorators: [{
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorVerticalList, decorators: [{
54
54
  type: Component,
55
- args: [{ selector: 'sd-vertical-anchor-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, MatIconModule], standalone: true, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"] }]
55
+ args: [{ selector: 'sd-anchor-vertical-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, MatIconModule], standalone: true, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"] }]
56
56
  }], ctorParameters: () => [] });
57
57
 
58
58
  class SdAnchor {
@@ -136,11 +136,11 @@ class SdAnchor {
136
136
  this.#disposeResources();
137
137
  }
138
138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchor, deps: [], target: i0.ɵɵFactoryTarget.Component });
139
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchor, isStandalone: true, selector: "sd-anchor", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, isOverscroll: { classPropertyName: "isOverscroll", publicName: "isOverscroll", isSignal: true, isRequired: false, transformFunction: null }, isHiddenAnchorList: { classPropertyName: "isHiddenAnchorList", publicName: "isHiddenAnchorList", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "sections", predicate: SdAnchorItem, isSignal: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SdVerticalAnchorList, selector: "sd-vertical-anchor-list", inputs: ["sections", "activeSectionId", "ellipsis", "sidebarWidth"], outputs: ["sdClickSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchor, isStandalone: true, selector: "sd-anchor", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, isOverscroll: { classPropertyName: "isOverscroll", publicName: "isOverscroll", isSignal: true, isRequired: false, transformFunction: null }, isHiddenAnchorList: { classPropertyName: "isHiddenAnchorList", publicName: "isHiddenAnchorList", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "sections", predicate: SdAnchorItem, isSignal: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SdAnchorVerticalList, selector: "sd-anchor-vertical-list", inputs: ["sections", "activeSectionId", "ellipsis", "sidebarWidth"], outputs: ["sdClickSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
140
140
  }
141
141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchor, decorators: [{
142
142
  type: Component,
143
- args: [{ selector: 'sd-anchor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, SdVerticalAnchorList], standalone: true, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"] }]
143
+ args: [{ selector: 'sd-anchor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, SdAnchorVerticalList], standalone: true, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"] }]
144
144
  }], ctorParameters: () => [] });
145
145
 
146
146
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.html","../../../projects/sd-angular/components/anchor/src/components/main/main.component.ts","../../../projects/sd-angular/components/anchor/src/components/main/main.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { IAnchorItem } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrls: ['./anchor-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n id: string = uuidv4();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Subject, Subscription, debounceTime } from 'rxjs';\r\nimport { SdAnchorItem } from '../../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-vertical-anchor-list',\r\n templateUrl: './anchor-list.component.html',\r\n styleUrls: ['./anchor-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, MatIconModule],\r\n standalone: true,\r\n})\r\nexport class SdVerticalAnchorList implements OnDestroy {\r\n sections = input.required<readonly SdAnchorItem[]>();\r\n activeSectionId = input<string>('');\r\n ellipsis = input<boolean>(false);\r\n sidebarWidth = input<string>('');\r\n\r\n sdClickSection = output<string>();\r\n\r\n #delay = 200;\r\n #clickSectionSubject = new Subject<string>();\r\n #subscription = new Subscription();\r\n\r\n constructor() {\r\n this.#subscription.add(\r\n this.#clickSectionSubject\r\n .pipe(debounceTime(this.#delay))\r\n .subscribe((id: string) => this.sdClickSection.emit(id))\r\n );\r\n }\r\n\r\n onClickSection = (id: string): void => {\r\n this.#clickSectionSubject.next(id);\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#subscription.unsubscribe();\r\n }\r\n}\r\n","<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n afterNextRender,\r\n booleanAttribute,\r\n contentChildren,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Subscription, auditTime, debounceTime, filter, fromEvent, map, take } from 'rxjs';\r\nimport { SdVerticalAnchorList } from '../anchor-vertical/anchor-list/anchor-list.component';\r\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor',\r\n templateUrl: './main.component.html',\r\n styleUrls: ['./main.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, SdVerticalAnchorList],\r\n standalone: true,\r\n})\r\nexport class SdAnchor implements OnDestroy {\r\n wrapper = viewChild.required<ElementRef>('wrapper');\r\n sections = contentChildren(SdAnchorItem);\r\n\r\n type = input<'vertical' | 'horizontal'>('vertical');\r\n sidebarWidth = input<string>('200px');\r\n ellipsis = input(false, { transform: booleanAttribute });\r\n isOverscroll = input(false, { transform: booleanAttribute });\r\n isHiddenAnchorList = input(false, { transform: booleanAttribute });\r\n\r\n activeSectionId = signal<string>('');\r\n\r\n #scrollSubscription = new Subscription();\r\n #clickScrollSubscription = new Subscription();\r\n #delay = 100;\r\n #currentScrollTop = 0;\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!this.isHiddenAnchorList()) {\r\n this.activeSectionId.set(this.sections()[0]?.id ?? '');\r\n this.#registerScrollSubscription();\r\n }\r\n });\r\n }\r\n\r\n #registerScrollSubscription = (): void => {\r\n this.#disposeResources();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n this.#scrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\r\n .pipe(auditTime(50))\r\n .subscribe((event: UIEvent) => {\r\n const el = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(el);\r\n for (const section of this.sections()) {\r\n const rect = section.elementRef.nativeElement;\r\n const rectTop = rect.offsetTop;\r\n const rectBottom = rectTop + rect.offsetHeight;\r\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\r\n this.activeSectionId.set(section.id);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n this.activeSectionId.set(idSectionTarget);\r\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\r\n if (!targetSection) return;\r\n\r\n this.#disposeResources();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n const prevScrollTop = this.#currentScrollTop;\r\n\r\n this.#clickScrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\r\n .pipe(\r\n auditTime(this.#delay),\r\n map((event: UIEvent) => {\r\n const el = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(el);\r\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\r\n const targetRect = targetElement.getBoundingClientRect();\r\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight;\r\n return Math.abs(targetRect.top - wrapperTop) < 1 || isVisible;\r\n }),\r\n filter(Boolean),\r\n debounceTime(this.#delay + 100),\r\n take(1)\r\n )\r\n .subscribe(() => this.#registerScrollSubscription());\r\n\r\n this.#timeoutId = setTimeout(() => {\r\n if (prevScrollTop === this.#currentScrollTop) {\r\n this.#registerScrollSubscription();\r\n }\r\n }, this.#delay + 100);\r\n\r\n wrapperEl.scrollTo({ top: targetElement.offsetTop, behavior: 'smooth' });\r\n }\r\n\r\n #updateCurrentScroll(el: HTMLElement): number {\r\n const style = getComputedStyle(el);\r\n return el.scrollTop + parseFloat(style.paddingTop) + parseFloat(style.borderTopWidth);\r\n }\r\n\r\n #disposeResources = (): void => {\r\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\r\n this.#scrollSubscription?.unsubscribe();\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#disposeResources();\r\n }\r\n}\r\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { IAnchorItem } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrls: ['./anchor-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n id: string = uuidv4();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section>\r\n <ng-content></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Subject, Subscription, debounceTime } from 'rxjs';\n\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\n\n@Component({\n selector: 'sd-anchor-vertical-list',\n templateUrl: './anchor-vertical-list.component.html',\n styleUrl: './anchor-vertical-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, MatIconModule],\n standalone: true,\n})\nexport class SdAnchorVerticalList implements OnDestroy {\n sections = input.required<readonly SdAnchorItem[]>();\n activeSectionId = input<string>('');\n ellipsis = input<boolean>(false);\n sidebarWidth = input<string>('');\n\n sdClickSection = output<string>();\n\n #delay = 200;\n #clickSectionSubject = new Subject<string>();\n #subscription = new Subscription();\n\n constructor() {\n this.#subscription.add(\n this.#clickSectionSubject\n .pipe(debounceTime(this.#delay))\n .subscribe((id: string) => this.sdClickSection.emit(id))\n );\n }\n\n onClickSection = (id: string): void => {\n this.#clickSectionSubject.next(id);\n };\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n}\n","<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n afterNextRender,\n booleanAttribute,\n contentChildren,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription, auditTime, debounceTime, filter, fromEvent, map, take } from 'rxjs';\n\nimport { SdAnchorVerticalList } from '../anchor-vertical/anchor-vertical-list.component';\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\n\n@Component({\n selector: 'sd-anchor',\n templateUrl: './anchor.component.html',\n styleUrls: ['./anchor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, SdAnchorVerticalList],\n standalone: true,\n})\nexport class SdAnchor implements OnDestroy {\n wrapper = viewChild.required<ElementRef>('wrapper');\n sections = contentChildren(SdAnchorItem);\n\n type = input<'vertical' | 'horizontal'>('vertical');\n sidebarWidth = input<string>('200px');\n ellipsis = input(false, { transform: booleanAttribute });\n isOverscroll = input(false, { transform: booleanAttribute });\n isHiddenAnchorList = input(false, { transform: booleanAttribute });\n\n activeSectionId = signal<string>('');\n\n #scrollSubscription = new Subscription();\n #clickScrollSubscription = new Subscription();\n #delay = 100;\n #currentScrollTop = 0;\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isHiddenAnchorList()) {\n this.activeSectionId.set(this.sections()[0]?.id ?? '');\n this.#registerScrollSubscription();\n }\n });\n }\n\n #registerScrollSubscription = (): void => {\n this.#disposeResources();\n const wrapperEl = this.wrapper().nativeElement;\n this.#scrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\n .pipe(auditTime(50))\n .subscribe((event: UIEvent) => {\n const el = event.target as HTMLElement;\n this.#currentScrollTop = this.#updateCurrentScroll(el);\n for (const section of this.sections()) {\n const rect = section.elementRef.nativeElement;\n const rectTop = rect.offsetTop;\n const rectBottom = rectTop + rect.offsetHeight;\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\n this.activeSectionId.set(section.id);\n break;\n }\n }\n });\n };\n\n scrollSectionByClick(idSectionTarget: string): void {\n this.activeSectionId.set(idSectionTarget);\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\n if (!targetSection) return;\n\n this.#disposeResources();\n const wrapperEl = this.wrapper().nativeElement;\n const targetElement = targetSection.nativeElement;\n const prevScrollTop = this.#currentScrollTop;\n\n this.#clickScrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\n .pipe(\n auditTime(this.#delay),\n map((event: UIEvent) => {\n const el = event.target as HTMLElement;\n this.#currentScrollTop = this.#updateCurrentScroll(el);\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\n const targetRect = targetElement.getBoundingClientRect();\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight;\n return Math.abs(targetRect.top - wrapperTop) < 1 || isVisible;\n }),\n filter(Boolean),\n debounceTime(this.#delay + 100),\n take(1)\n )\n .subscribe(() => this.#registerScrollSubscription());\n\n this.#timeoutId = setTimeout(() => {\n if (prevScrollTop === this.#currentScrollTop) {\n this.#registerScrollSubscription();\n }\n }, this.#delay + 100);\n\n wrapperEl.scrollTo({ top: targetElement.offsetTop, behavior: 'smooth' });\n }\n\n #updateCurrentScroll(el: HTMLElement): number {\n const style = getComputedStyle(el);\n return el.scrollTop + parseFloat(style.paddingTop) + parseFloat(style.borderTopWidth);\n }\n\n #disposeResources = (): void => {\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n this.#scrollSubscription?.unsubscribe();\n this.#clickScrollSubscription?.unsubscribe();\n };\n\n ngOnDestroy(): void {\n this.#disposeResources();\n }\n}\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":";;;;;;;;;MAYa,YAAY,CAAA;AACvB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAU;IAChC,IAAI,GAAG,KAAK,EAAsB;IAClC,EAAE,GAAWA,EAAM,EAAE;AACrB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;gBAChB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC;YACxD;AACF,QAAA,CAAC,CAAC;IACJ;wGAZW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZzB,4DAGA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMY,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAGX,YAAY,EAAA,UAAA,EAAA,CAAA;kBAPxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EAGjB,CAAC,YAAY,CAAC,cACX,IAAI,EAAA,QAAA,EAAA,4DAAA,EAAA;;;MEKL,oBAAoB,CAAA;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAA2B;AACpD,IAAA,eAAe,GAAG,KAAK,CAAS,EAAE,CAAC;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;AAChC,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,CAAC;IAEhC,cAAc,GAAG,MAAM,EAAU;IAEjC,MAAM,GAAG,GAAG;AACZ,IAAA,oBAAoB,GAAG,IAAI,OAAO,EAAU;AAC5C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;AAElC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC;AACF,aAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,EAAU,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC3D;IACH;AAEA,IAAA,cAAc,GAAG,CAAC,EAAU,KAAU;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC,IAAA,CAAC;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;IAClC;wGA1BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfjC,2mBAiBA,EAAA,MAAA,EAAA,CAAA,8kKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDLY,YAAY,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAG1B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,UAAA,EAC1B,IAAI,EAAA,QAAA,EAAA,2mBAAA,EAAA,MAAA,EAAA,CAAA,8kKAAA,CAAA,EAAA;;;MEaL,QAAQ,CAAA;AACnB,IAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAa,SAAS,CAAC;AACnD,IAAA,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC;AAExC,IAAA,IAAI,GAAG,KAAK,CAA4B,UAAU,CAAC;AACnD,IAAA,YAAY,GAAG,KAAK,CAAS,OAAO,CAAC;IACrC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC5D,kBAAkB,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAElE,IAAA,eAAe,GAAG,MAAM,CAAS,EAAE,CAAC;AAEpC,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAE;AACxC,IAAA,wBAAwB,GAAG,IAAI,YAAY,EAAE;IAC7C,MAAM,GAAG,GAAG;IACZ,iBAAiB,GAAG,CAAC;IACrB,UAAU,GAAyC,IAAI;AAEvD,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtD,IAAI,CAAC,2BAA2B,EAAE;YACpC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,2BAA2B,GAAG,MAAW;QACvC,IAAI,CAAC,iBAAiB,EAAE;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;QAC9C,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAU,SAAS,EAAE,QAAQ;AAC9D,aAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClB,aAAA,SAAS,CAAC,CAAC,KAAc,KAAI;AAC5B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAAqB;YACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa;AAC7C,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;AAC9B,gBAAA,MAAM,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY;AAC9C,gBAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,IAAI,IAAI,CAAC,iBAAiB,GAAG,UAAU,EAAE;oBAC5E,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;AAED,IAAA,oBAAoB,CAAC,eAAuB,EAAA;AAC1C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,UAAU;AACrF,QAAA,IAAI,CAAC,aAAa;YAAE;QAEpB,IAAI,CAAC,iBAAiB,EAAE;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;AAC9C,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa;AACjD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB;QAE5C,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAU,SAAS,EAAE,QAAQ;AACnE,aAAA,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EACtB,GAAG,CAAC,CAAC,KAAc,KAAI;AACrB,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAAqB;YACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC,GAAG;AACxD,YAAA,MAAM,UAAU,GAAG,aAAa,CAAC,qBAAqB,EAAE;AACxD,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW;AAChF,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS;QAC/D,CAAC,CAAC,EACF,MAAM,CAAC,OAAO,CAAC,EACf,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EAC/B,IAAI,CAAC,CAAC,CAAC;aAER,SAAS,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;AAEtD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,aAAa,KAAK,IAAI,CAAC,iBAAiB,EAAE;gBAC5C,IAAI,CAAC,2BAA2B,EAAE;YACpC;AACF,QAAA,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;AAErB,QAAA,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC1E;AAEA,IAAA,oBAAoB,CAAC,EAAe,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;AAClC,QAAA,OAAO,EAAE,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC;IACvF;IAEA,iBAAiB,GAAG,MAAW;QAC7B,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;AACvC,QAAA,IAAI,CAAC,wBAAwB,EAAE,WAAW,EAAE;AAC9C,IAAA,CAAC;IAED,WAAW,GAAA;QACT,IAAI,CAAC,iBAAiB,EAAE;IAC1B;wGAhGW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,yxBAEQ,YAAY,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BzC,ypBAiBA,EAAA,MAAA,EAAA,CAAA,oTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMY,YAAY,+HAAE,oBAAoB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGjC,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;+BACE,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,UAAA,EACjC,IAAI,EAAA,QAAA,EAAA,ypBAAA,EAAA,MAAA,EAAA,CAAA,oTAAA,CAAA,EAAA;;;AExBlB;;AAEG;;;;"}