@sd-angular/core 19.0.0-beta.7 → 19.0.0-beta.71

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 (237) hide show
  1. package/README.md +686 -33
  2. package/assets/scss/ckeditor5.scss +61 -4
  3. package/assets/scss/core/bootstrap.scss +17 -0
  4. package/assets/scss/core/form.scss +32 -6
  5. package/assets/scss/core/grid.scss +40 -0
  6. package/assets/scss/sd-core.scss +1 -0
  7. package/assets/scss/themes/material-theme.scss +82 -40
  8. package/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.d.ts +5 -5
  9. package/components/anchor-v2/src/models/sd-anchor-v2.model.d.ts +3 -3
  10. package/components/avatar/index.d.ts +1 -0
  11. package/components/avatar/src/avatar.component.d.ts +19 -0
  12. package/components/badge/src/badge.component.d.ts +77 -19
  13. package/components/button/src/button.component.d.ts +30 -28
  14. package/components/code-editor/index.d.ts +1 -0
  15. package/components/code-editor/src/code-editor.component.d.ts +25 -0
  16. package/components/document-builder/index.d.ts +1 -0
  17. package/components/document-builder/src/document-builder.component.d.ts +12 -41
  18. package/components/document-builder/src/document-builder.model.d.ts +14 -11
  19. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
  20. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +44 -0
  21. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +57 -0
  22. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +1 -0
  23. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
  24. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
  25. package/components/document-builder/src/plugins/index.d.ts +7 -2
  26. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +2 -2
  27. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
  28. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
  29. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
  30. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
  31. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
  32. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
  33. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
  34. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
  35. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
  36. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
  37. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
  38. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
  39. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
  40. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
  41. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
  42. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
  43. package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
  44. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
  45. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
  46. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
  47. package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
  48. package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
  49. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +39 -0
  50. package/components/index.d.ts +4 -0
  51. package/components/mini-editor/index.d.ts +2 -0
  52. package/components/mini-editor/src/mini-editor.component.d.ts +90 -0
  53. package/components/mini-editor/src/mini-editor.model.d.ts +44 -0
  54. package/components/modal/index.d.ts +1 -1
  55. package/components/modal/src/modal.component.d.ts +24 -0
  56. package/components/section/index.d.ts +1 -0
  57. package/components/section/src/section-item/section-item.component.d.ts +7 -0
  58. package/components/section/src/section.component.d.ts +11 -11
  59. package/components/side-drawer/src/side-drawer.component.d.ts +11 -24
  60. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +4 -1
  61. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -15
  62. package/components/table/src/components/column-filter/column-filter.component.d.ts +3 -3
  63. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +21 -9
  64. package/components/table/src/components/desktop-cell-view/desktop-cell-view.component.d.ts +21 -7
  65. package/components/table/src/components/external-filter/external-filter.component.d.ts +1 -1
  66. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +11 -10
  67. package/components/table/src/components/selector-action/selector-action.component.d.ts +5 -3
  68. package/components/table/src/directives/index.d.ts +2 -0
  69. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +9 -0
  70. package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
  71. package/components/table/src/models/table-column.model.d.ts +38 -34
  72. package/components/table/src/models/table-command.model.d.ts +7 -3
  73. package/components/table/src/models/table-item.model.d.ts +5 -4
  74. package/components/table/src/models/table-option-config.model.d.ts +5 -0
  75. package/components/table/src/models/table-option-export.model.d.ts +3 -2
  76. package/components/table/src/models/table-option-selector.model.d.ts +11 -10
  77. package/components/table/src/models/table-option.model.d.ts +9 -8
  78. package/components/table/src/services/index.d.ts +3 -0
  79. package/components/table/src/services/table-export/table-export.service.d.ts +26 -0
  80. package/components/table/src/services/table-filter/table-filter.model.d.ts +6 -5
  81. package/components/table/src/services/table-format/table-format.service.d.ts +16 -0
  82. package/components/table/src/table.component.d.ts +39 -53
  83. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +1 -1
  84. package/components/upload-file/src/services/upload-file.service.d.ts +0 -1
  85. package/components/upload-file/src/upload-file.component.d.ts +49 -54
  86. package/components/view/index.d.ts +1 -0
  87. package/components/view/src/view.component.d.ts +16 -0
  88. package/components/workflow/src/models/form-generic-component.model.d.ts +5 -4
  89. package/components/workflow/src/models/index.d.ts +1 -0
  90. package/directives/index.d.ts +2 -0
  91. package/directives/src/sd-href.directive.d.ts +9 -0
  92. package/directives/src/sd-tooltip.directive.d.ts +26 -0
  93. package/fesm2022/sd-angular-core-components-anchor-v2.mjs +15 -15
  94. package/fesm2022/sd-angular-core-components-anchor-v2.mjs.map +1 -1
  95. package/fesm2022/sd-angular-core-components-avatar.mjs +103 -0
  96. package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -0
  97. package/fesm2022/sd-angular-core-components-badge.mjs +101 -91
  98. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  99. package/fesm2022/sd-angular-core-components-button.mjs +70 -96
  100. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  101. package/fesm2022/sd-angular-core-components-code-editor.mjs +127 -0
  102. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -0
  103. package/fesm2022/sd-angular-core-components-document-builder.mjs +4006 -611
  104. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  105. package/fesm2022/sd-angular-core-components-history.mjs +1 -1
  106. package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
  107. package/fesm2022/sd-angular-core-components-import-excel.mjs +1 -1
  108. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  109. package/fesm2022/sd-angular-core-components-mini-editor.mjs +326 -0
  110. package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -0
  111. package/fesm2022/sd-angular-core-components-modal.mjs +57 -91
  112. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  113. package/fesm2022/sd-angular-core-components-preview.mjs +1 -1
  114. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  115. package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
  116. package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
  117. package/fesm2022/sd-angular-core-components-section.mjs +41 -43
  118. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  119. package/fesm2022/sd-angular-core-components-side-drawer.mjs +78 -84
  120. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  121. package/fesm2022/sd-angular-core-components-tab-router.mjs +152 -226
  122. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  123. package/fesm2022/sd-angular-core-components-table.mjs +1188 -1185
  124. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  125. package/fesm2022/sd-angular-core-components-upload-file.mjs +339 -444
  126. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  127. package/fesm2022/sd-angular-core-components-view.mjs +45 -0
  128. package/fesm2022/sd-angular-core-components-view.mjs.map +1 -0
  129. package/fesm2022/sd-angular-core-components-workflow.mjs +47 -57
  130. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  131. package/fesm2022/sd-angular-core-components.mjs +4 -0
  132. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  133. package/fesm2022/sd-angular-core-directives.mjs +286 -27
  134. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  135. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +289 -363
  136. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  137. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +170 -189
  138. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  139. package/fesm2022/sd-angular-core-forms-chip.mjs +184 -194
  140. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  141. package/fesm2022/sd-angular-core-forms-date-range.mjs +180 -242
  142. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  143. package/fesm2022/sd-angular-core-forms-date.mjs +178 -270
  144. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  145. package/fesm2022/sd-angular-core-forms-datetime.mjs +177 -285
  146. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  147. package/fesm2022/sd-angular-core-forms-input-number.mjs +210 -337
  148. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  149. package/fesm2022/sd-angular-core-forms-input.mjs +169 -286
  150. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  151. package/fesm2022/sd-angular-core-forms-radio.mjs +3 -2
  152. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  153. package/fesm2022/sd-angular-core-forms-select.mjs +390 -447
  154. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  155. package/fesm2022/sd-angular-core-forms-textarea.mjs +167 -226
  156. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  157. package/fesm2022/sd-angular-core-modules-keycloak.mjs +126 -0
  158. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -0
  159. package/fesm2022/sd-angular-core-modules-layout.mjs +454 -453
  160. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  161. package/fesm2022/sd-angular-core-modules.mjs +1 -1
  162. package/fesm2022/sd-angular-core-services-api.mjs +5 -10
  163. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  164. package/fesm2022/sd-angular-core-services-confirm.mjs +5 -7
  165. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  166. package/fesm2022/sd-angular-core-services-docx.mjs +173 -0
  167. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -0
  168. package/fesm2022/sd-angular-core-services-notify.mjs +2 -2
  169. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  170. package/fesm2022/sd-angular-core-services.mjs +1 -0
  171. package/fesm2022/sd-angular-core-services.mjs.map +1 -1
  172. package/fesm2022/sd-angular-core-utilities-extensions.mjs +21 -45
  173. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  174. package/fesm2022/sd-angular-core-utilities-models.mjs +15 -1
  175. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  176. package/forms/autocomplete/src/autocomplete.component.d.ts +55 -55
  177. package/forms/chip/src/chip.component.d.ts +37 -40
  178. package/forms/chip-calendar/src/chip-calendar.component.d.ts +37 -38
  179. package/forms/date/src/date.component.d.ts +48 -46
  180. package/forms/date-range/src/date-range.component.d.ts +35 -34
  181. package/forms/datetime/src/datetime.component.d.ts +48 -49
  182. package/forms/input/src/input.component.d.ts +54 -57
  183. package/forms/input-number/src/input-number.component.d.ts +53 -54
  184. package/forms/select/src/select.component.d.ts +67 -64
  185. package/forms/textarea/src/textarea.component.d.ts +40 -43
  186. package/modules/index.d.ts +1 -1
  187. package/modules/keycloak/index.d.ts +4 -0
  188. package/modules/keycloak/keycloak.configuration.d.ts +11 -0
  189. package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
  190. package/modules/keycloak/keycloak.module.d.ts +18 -0
  191. package/modules/keycloak/keycloak.service.d.ts +14 -0
  192. package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -12
  193. package/modules/layout/components/page/page.component.d.ts +5 -7
  194. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +22 -29
  195. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +11 -17
  196. package/modules/layout/components/sidebar-v1/main.component.d.ts +14 -14
  197. package/modules/layout/configurations/layout.configuration.d.ts +46 -3
  198. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +3 -8
  199. package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +2 -5
  200. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +3 -8
  201. package/modules/layout/pipes/high-light-search.pipe.d.ts +1 -1
  202. package/modules/layout/services/index.d.ts +1 -0
  203. package/modules/layout/services/layout.service.d.ts +10 -0
  204. package/modules/layout/services/menu/menu.model.d.ts +2 -0
  205. package/modules/layout/services/storage/storage.service.d.ts +0 -3
  206. package/package.json +87 -64
  207. package/sd-angular-core-19.0.0-beta.71.tgz +0 -0
  208. package/services/api/src/api.model.d.ts +6 -1
  209. package/services/confirm/src/lib/confirm.service.d.ts +1 -0
  210. package/services/docx/index.d.ts +1 -0
  211. package/services/docx/src/lib/docx.model.d.ts +9 -0
  212. package/services/docx/src/lib/docx.service.d.ts +13 -0
  213. package/services/docx/src/public-api.d.ts +2 -0
  214. package/services/index.d.ts +1 -0
  215. package/services/notify/index.d.ts +1 -0
  216. package/services/notify/src/notify.model.d.ts +1 -1
  217. package/services/notify/src/notify.service.d.ts +5 -5
  218. package/utilities/extensions/src/string.extension.d.ts +2 -0
  219. package/utilities/extensions/src/utility.extension.d.ts +1 -0
  220. package/utilities/models/index.d.ts +3 -0
  221. package/utilities/models/src/filter.model.d.ts +17 -4
  222. package/utilities/models/src/icon.model.d.ts +2 -0
  223. package/utilities/models/src/nested-key-of.model.d.ts +5 -0
  224. package/utilities/models/src/order.model.d.ts +2 -1
  225. package/utilities/models/src/paging.model.d.ts +2 -1
  226. package/utilities/models/src/pattern.model.d.ts +1 -1
  227. package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
  228. package/components/document-builder/src/plugins/comment/comment.plugin.d.ts +0 -4
  229. package/components/document-builder/src/plugins/table-fit/table-fit.plugin.d.ts +0 -4
  230. package/components/modal/src/modal/modal.component.d.ts +0 -31
  231. package/fesm2022/sd-angular-core-modules-oidc.mjs +0 -127
  232. package/fesm2022/sd-angular-core-modules-oidc.mjs.map +0 -1
  233. package/modules/oidc/dynamic-sts.loader.d.ts +0 -11
  234. package/modules/oidc/index.d.ts +0 -2
  235. package/modules/oidc/oidc.configuration.d.ts +0 -11
  236. package/modules/oidc/oidc.module.d.ts +0 -14
  237. package/sd-angular-core-19.0.0-beta.7.tgz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-anchor-v2.mjs","sources":["../../../projects/sd-angular/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.html","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.html","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.html","../../../projects/sd-angular/components/anchor-v2/sd-angular-core-components-anchor-v2.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, Input } from '@angular/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { IAnchorItemV2 } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item-v2',\r\n templateUrl: './anchor-item-v2.component.html',\r\n styleUrls: ['./anchor-item-v2.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItemV2 implements IAnchorItemV2 {\r\n @Input() title!: string;\r\n @Input() icon?: string;\r\n id: string = uuidv4();\r\n constructor(public elementRef: ElementRef) {}\r\n}\r\n","<section>\r\n <ng-content></ng-content>\r\n</section>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ContentChildren, EventEmitter, Input, OnInit, Output, QueryList } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { debounceTime, Subject, Subscription } from 'rxjs';\r\nimport { SdAnchorItemV2 } from '../anchor-item-v2/anchor-item-v2.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor-vertical-list-v2',\r\n templateUrl: './anchor-vertical-list-v2.component.html',\r\n styleUrl: './anchor-vertical-list-v2.component.scss',\r\n imports: [CommonModule, MatIconModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorVerticalListV2 implements OnInit {\r\n constructor() {}\r\n @Input() sections!: QueryList<SdAnchorItemV2>;\r\n @Input() activeSectionId: string = '';\r\n @Input() ellipsis!: boolean;\r\n @Input() sidebarWidth!: string;\r\n\r\n @Output() sdClickSection = new EventEmitter<string>();\r\n\r\n #delay: number = 200;\r\n #clickSectionSubject = new Subject<string>();\r\n #subscription = new Subscription();\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.#clickSectionSubject.pipe(debounceTime(this.#delay)).subscribe((idSectionTarget: string) => {\r\n this.sdClickSection.emit(idSectionTarget);\r\n })\r\n );\r\n }\r\n\r\n onClickSection = (idSectionTarget: string): void => {\r\n this.#clickSectionSubject.next(idSectionTarget);\r\n };\r\n \r\n ngOnDestroy() {\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\r\n class=\"c-anchor-list-item-text\"\r\n [ngClass]=\"{\r\n ellipsis\r\n }\">\r\n {{ section.title }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { AfterViewInit, Component, ContentChildren, ElementRef, Input, QueryList, Renderer2, ViewChild } from '@angular/core';\r\nimport { SdAnchorVerticalListV2 } from '../anchor-vertical-v2/anchor-vertical-list-v2.component';\r\nimport { SdAnchorItemV2 } from '../anchor-item-v2/anchor-item-v2.component';\r\nimport { auditTime, debounceTime, filter, fromEvent, map, Subscription, take } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'sd-anchor-v2',\r\n templateUrl: './anchor-v2.component.html',\r\n styleUrls: ['./anchor-v2.component.scss'],\r\n imports: [CommonModule, SdAnchorVerticalListV2],\r\n standalone: true,\r\n})\r\nexport class SdAnchorV2 implements AfterViewInit {\r\n constructor(private renderer: Renderer2) {}\r\n @ViewChild('wrapper', { static: false }) wrapper!: ElementRef;\r\n @ViewChild('anchorContent', { static: false }) anchorContent!: ElementRef;\r\n\r\n @ContentChildren(SdAnchorItemV2) sections!: QueryList<SdAnchorItemV2>; // Danh sách sd-anchor-v2 được khai báo\r\n\r\n @Input() type: 'vertical' | 'horizontal' = 'vertical';\r\n @Input() sidebarWidth: string = '200px'; // Độ rộng của danh sách tiêu đề\r\n\r\n ellipsis = false; // Có thu gọn tiêu đề bằng dấu 3 chấm?\r\n @Input('ellipsis') set _ellipsis(value: '' | boolean | undefined | null) {\r\n this.ellipsis = value === '' || !!value;\r\n }\r\n\r\n isOverscroll = false; // Có cho phép scroll vượt qua sd-anchor và scroll tiếp đến phần tử bên ngoài?\r\n @Input('isOverscroll') set _isOverscroll(value: '' | boolean | undefined | null) {\r\n this.isOverscroll = value === '' || !!value;\r\n }\r\n\r\n isHiddenAnchorList = false; // Có ẩn danh sách tiêu đề section hay không?\r\n @Input('isHiddenAnchorList') set _isHiddenAnchorList(value: '' | boolean | undefined | null) {\r\n this.isHiddenAnchorList = value === '' || !!value;\r\n }\r\n\r\n // RxJS\r\n // Note : Scroll bằng con lăn chuột hay scroll bằng click thì tại 1 thời điểm chỉ được lắng nghe 1 Rxjs\r\n #scrollSubscription = new Subscription(); // Scroll bằng con lăn chuột\r\n #clickScrollSubscription = new Subscription(); // Scroll bằng click\r\n // End\r\n\r\n // Variables Private\r\n #delay: number = 100;\r\n #currentScrollTop: number = 0;\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n // End\r\n\r\n // Variables Public\r\n activeSectionId: string = '';\r\n // End\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.isHiddenAnchorList) {\r\n this.activeSectionId = this.sections?.first?.id ?? ''; // Active section đầu tiên\r\n this.#registerScrollSubscription(); // Đăng ký Rxjs Scroll bằng con lăn chuột\r\n this.#setWidthAnchorContent()\r\n }\r\n }\r\n\r\n #registerScrollSubscription = (): void => {\r\n this.#disposeResources(); // Giải phóng tất cả subscription và timer cũ\r\n const wrapperEl = this.wrapper.nativeElement;\r\n const scroll$ = fromEvent<UIEvent>(wrapperEl, 'scroll').pipe(debounceTime(this.#delay));\r\n this.#scrollSubscription = scroll$.subscribe((event: UIEvent) => {\r\n const elementTarget = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(elementTarget); // Ví trí scroll hiện tại\r\n for (const section of this.sections) {\r\n // Vùng section chiếm diện tích\r\n const rect = section?.elementRef?.nativeElement;\r\n const rectTop = rect.offsetTop;\r\n const rectBottom = rectTop + rect.offsetHeight;\r\n // End\r\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\r\n this.activeSectionId = section?.id;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n // Khi scrollByClick sẽ có 2 case xảy ra:\r\n // Case 1 : Được scroll (ElementTarget không nằm trong vùng viewport và được scroll đến vị trí)\r\n // Case 2 : Không được scroll (ElementTarget đã được scroll trước đó hoặc đã nằm trong vùng viewport luôn)\r\n\r\n this.activeSectionId = idSectionTarget;\r\n const targetSection = this.sections.find(s => s?.id === this.activeSectionId)?.elementRef;\r\n if (!targetSection) {\r\n return;\r\n }\r\n\r\n this.#disposeResources(); // Giải phóng tất cả subscription và timer cũ\r\n const wrapperEl = this.wrapper.nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n const prevScrollTop = this.#currentScrollTop; // Lưu lại ví trí trước khi scroll bởi event click\r\n\r\n // Case 1: Nếu được Scroll check điều kiện để đăng ký lại Rxjs Scroll bằng con lăn chuột\r\n const clickScrollEnd$ = fromEvent<UIEvent>(wrapperEl, 'scroll');\r\n this.#clickScrollSubscription = clickScrollEnd$\r\n .pipe(\r\n auditTime(this.#delay),\r\n map((event: UIEvent) => {\r\n const elementTarget = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(elementTarget); // Cập nhật vị trí sau mỗi lần #delay\r\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\r\n const targetRect = targetElement.getBoundingClientRect();\r\n const targetTop = targetRect.top;\r\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight; // Nằm trong viewPort\r\n return Math.abs(targetTop - wrapperTop) < 1 || isVisible; // Đã được scroll tới hoặc element đã nằm trong vùng viewPort\r\n }),\r\n filter(Boolean),\r\n debounceTime(this.#delay + 100),\r\n take(1)\r\n )\r\n .subscribe(() => {\r\n this.#registerScrollSubscription(); // Đã xác nhận scroll xong thì mới đăng ký lại Rxjs Scroll bằng con lăn chuột\r\n });\r\n // // End\r\n\r\n // Case 2: Nếu không được scroll thì sau (#delay + 100) đăng ký lại Rxjs Scroll bằng con lăn chuột\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' }); // Action scroll\r\n // End\r\n }\r\n\r\n #updateCurrentScroll(elementTarget: HTMLElement): number {\r\n const style = getComputedStyle(elementTarget);\r\n const paddingTop = parseFloat(style.paddingTop);\r\n const borderTop = parseFloat(style.borderTopWidth);\r\n return elementTarget.scrollTop + paddingTop + borderTop; // Vị trí scroll thực tế nếu có padding, border\r\n }\r\n\r\n // Giải phóng tất cả subscription và timer đang hoạt động\r\n #disposeResources = (): void => {\r\n if (this.#timeoutId) {\r\n clearTimeout(this.#timeoutId);\r\n }\r\n this.#scrollSubscription?.unsubscribe();\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n // Thiết lập chiều rộng nội dung phụ thuộc vào chiều rộng danh sách tiêu đề section\r\n #setWidthAnchorContent = (): void => {\r\n const gap = '16px'; // Khoảng cách giữa nội dung và danh sách tiêu đề section\r\n this.renderer.setStyle(this.anchorContent.nativeElement, 'width', `calc(100% - ${this.sidebarWidth} - ${gap})`);\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 <!-- Nội dung -->\r\n <div class=\"c-anchor-content\" #anchorContent>\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Danh sách tiêu đề các sections-->\r\n @if(!isHiddenAnchorList){\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth\">\r\n <sd-anchor-vertical-list-v2\r\n [sections]=\"sections\"\r\n [ellipsis]=\"ellipsis\"\r\n [sidebarWidth]=\"sidebarWidth\"\r\n [activeSectionId]=\"activeSectionId\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-anchor-vertical-list-v2>\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-v2.mjs","sources":["../../../projects/sd-angular/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.html","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.html","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.ts","../../../projects/sd-angular/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.html","../../../projects/sd-angular/components/anchor-v2/sd-angular-core-components-anchor-v2.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 { IAnchorItemV2 } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item-v2',\r\n templateUrl: './anchor-item-v2.component.html',\r\n styleUrls: ['./anchor-item-v2.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItemV2 implements IAnchorItemV2 {\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 { CommonModule } from '@angular/common';\r\nimport { Component, ContentChildren, EventEmitter, Input, OnInit, Output, QueryList } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { debounceTime, Subject, Subscription } from 'rxjs';\r\nimport { SdAnchorItemV2 } from '../anchor-item-v2/anchor-item-v2.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor-vertical-list-v2',\r\n templateUrl: './anchor-vertical-list-v2.component.html',\r\n styleUrl: './anchor-vertical-list-v2.component.scss',\r\n imports: [CommonModule, MatIconModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorVerticalListV2 implements OnInit {\r\n constructor() {}\r\n @Input() sections!: QueryList<SdAnchorItemV2>;\r\n @Input() activeSectionId: string = '';\r\n @Input() ellipsis!: boolean;\r\n @Input() sidebarWidth!: string;\r\n\r\n @Output() sdClickSection = new EventEmitter<string>();\r\n\r\n #delay: number = 200;\r\n #clickSectionSubject = new Subject<string>();\r\n #subscription = new Subscription();\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.#clickSectionSubject.pipe(debounceTime(this.#delay)).subscribe((idSectionTarget: string) => {\r\n this.sdClickSection.emit(idSectionTarget);\r\n })\r\n );\r\n }\r\n\r\n onClickSection = (idSectionTarget: string): void => {\r\n this.#clickSectionSubject.next(idSectionTarget);\r\n };\r\n \r\n ngOnDestroy() {\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\r\n class=\"c-anchor-list-item-text\"\r\n [ngClass]=\"{\r\n ellipsis\r\n }\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { AfterViewInit, Component, ContentChildren, ElementRef, Input, QueryList, Renderer2, ViewChild } from '@angular/core';\r\nimport { SdAnchorVerticalListV2 } from '../anchor-vertical-v2/anchor-vertical-list-v2.component';\r\nimport { SdAnchorItemV2 } from '../anchor-item-v2/anchor-item-v2.component';\r\nimport { auditTime, debounceTime, filter, fromEvent, map, Subscription, take } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'sd-anchor-v2',\r\n templateUrl: './anchor-v2.component.html',\r\n styleUrls: ['./anchor-v2.component.scss'],\r\n imports: [CommonModule, SdAnchorVerticalListV2],\r\n standalone: true,\r\n})\r\nexport class SdAnchorV2 implements AfterViewInit {\r\n constructor(private renderer: Renderer2) {}\r\n @ViewChild('wrapper', { static: false }) wrapper!: ElementRef;\r\n @ViewChild('anchorContent', { static: false }) anchorContent!: ElementRef;\r\n\r\n @ContentChildren(SdAnchorItemV2) sections!: QueryList<SdAnchorItemV2>; // Danh sách sd-anchor-v2 được khai báo\r\n\r\n @Input() type: 'vertical' | 'horizontal' = 'vertical';\r\n @Input() sidebarWidth: string = '200px'; // Độ rộng của danh sách tiêu đề\r\n\r\n ellipsis = false; // Có thu gọn tiêu đề bằng dấu 3 chấm?\r\n @Input('ellipsis') set _ellipsis(value: '' | boolean | undefined | null) {\r\n this.ellipsis = value === '' || !!value;\r\n }\r\n\r\n isOverscroll = false; // Có cho phép scroll vượt qua sd-anchor và scroll tiếp đến phần tử bên ngoài?\r\n @Input('isOverscroll') set _isOverscroll(value: '' | boolean | undefined | null) {\r\n this.isOverscroll = value === '' || !!value;\r\n }\r\n\r\n isHiddenAnchorList = false; // Có ẩn danh sách tiêu đề section hay không?\r\n @Input('isHiddenAnchorList') set _isHiddenAnchorList(value: '' | boolean | undefined | null) {\r\n this.isHiddenAnchorList = value === '' || !!value;\r\n }\r\n\r\n // RxJS\r\n // Note : Scroll bằng con lăn chuột hay scroll bằng click thì tại 1 thời điểm chỉ được lắng nghe 1 Rxjs\r\n #scrollSubscription = new Subscription(); // Scroll bằng con lăn chuột\r\n #clickScrollSubscription = new Subscription(); // Scroll bằng click\r\n // End\r\n\r\n // Variables Private\r\n #delay: number = 100;\r\n #currentScrollTop: number = 0;\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n // End\r\n\r\n // Variables Public\r\n activeSectionId: string = '';\r\n // End\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.isHiddenAnchorList) {\r\n this.activeSectionId = this.sections?.first?.id ?? ''; // Active section đầu tiên\r\n this.#registerScrollSubscription(); // Đăng ký Rxjs Scroll bằng con lăn chuột\r\n this.#setWidthAnchorContent()\r\n }\r\n }\r\n\r\n #registerScrollSubscription = (): void => {\r\n this.#disposeResources(); // Giải phóng tất cả subscription và timer cũ\r\n const wrapperEl = this.wrapper.nativeElement;\r\n const scroll$ = fromEvent<UIEvent>(wrapperEl, 'scroll').pipe(debounceTime(this.#delay));\r\n this.#scrollSubscription = scroll$.subscribe((event: UIEvent) => {\r\n const elementTarget = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(elementTarget); // Ví trí scroll hiện tại\r\n for (const section of this.sections) {\r\n // Vùng section chiếm diện tích\r\n const rect = section?.elementRef?.nativeElement;\r\n const rectTop = rect.offsetTop;\r\n const rectBottom = rectTop + rect.offsetHeight;\r\n // End\r\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\r\n this.activeSectionId = section?.id;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n // Khi scrollByClick sẽ có 2 case xảy ra:\r\n // Case 1 : Được scroll (ElementTarget không nằm trong vùng viewport và được scroll đến vị trí)\r\n // Case 2 : Không được scroll (ElementTarget đã được scroll trước đó hoặc đã nằm trong vùng viewport luôn)\r\n\r\n this.activeSectionId = idSectionTarget;\r\n const targetSection = this.sections.find(s => s?.id === this.activeSectionId)?.elementRef;\r\n if (!targetSection) {\r\n return;\r\n }\r\n\r\n this.#disposeResources(); // Giải phóng tất cả subscription và timer cũ\r\n const wrapperEl = this.wrapper.nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n const prevScrollTop = this.#currentScrollTop; // Lưu lại ví trí trước khi scroll bởi event click\r\n\r\n // Case 1: Nếu được Scroll check điều kiện để đăng ký lại Rxjs Scroll bằng con lăn chuột\r\n const clickScrollEnd$ = fromEvent<UIEvent>(wrapperEl, 'scroll');\r\n this.#clickScrollSubscription = clickScrollEnd$\r\n .pipe(\r\n auditTime(this.#delay),\r\n map((event: UIEvent) => {\r\n const elementTarget = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(elementTarget); // Cập nhật vị trí sau mỗi lần #delay\r\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\r\n const targetRect = targetElement.getBoundingClientRect();\r\n const targetTop = targetRect.top;\r\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight; // Nằm trong viewPort\r\n return Math.abs(targetTop - wrapperTop) < 1 || isVisible; // Đã được scroll tới hoặc element đã nằm trong vùng viewPort\r\n }),\r\n filter(Boolean),\r\n debounceTime(this.#delay + 100),\r\n take(1)\r\n )\r\n .subscribe(() => {\r\n this.#registerScrollSubscription(); // Đã xác nhận scroll xong thì mới đăng ký lại Rxjs Scroll bằng con lăn chuột\r\n });\r\n // // End\r\n\r\n // Case 2: Nếu không được scroll thì sau (#delay + 100) đăng ký lại Rxjs Scroll bằng con lăn chuột\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' }); // Action scroll\r\n // End\r\n }\r\n\r\n #updateCurrentScroll(elementTarget: HTMLElement): number {\r\n const style = getComputedStyle(elementTarget);\r\n const paddingTop = parseFloat(style.paddingTop);\r\n const borderTop = parseFloat(style.borderTopWidth);\r\n return elementTarget.scrollTop + paddingTop + borderTop; // Vị trí scroll thực tế nếu có padding, border\r\n }\r\n\r\n // Giải phóng tất cả subscription và timer đang hoạt động\r\n #disposeResources = (): void => {\r\n if (this.#timeoutId) {\r\n clearTimeout(this.#timeoutId);\r\n }\r\n this.#scrollSubscription?.unsubscribe();\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n // Thiết lập chiều rộng nội dung phụ thuộc vào chiều rộng danh sách tiêu đề section\r\n #setWidthAnchorContent = (): void => {\r\n const gap = '16px'; // Khoảng cách giữa nội dung và danh sách tiêu đề section\r\n this.renderer.setStyle(this.anchorContent.nativeElement, 'width', `calc(100% - ${this.sidebarWidth} - ${gap})`);\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 <!-- Nội dung -->\r\n <div class=\"c-anchor-content\" #anchorContent>\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Danh sách tiêu đề các sections-->\r\n @if(!isHiddenAnchorList){\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth\">\r\n <sd-anchor-vertical-list-v2\r\n [sections]=\"sections\"\r\n [ellipsis]=\"ellipsis\"\r\n [sidebarWidth]=\"sidebarWidth\"\r\n [activeSectionId]=\"activeSectionId\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-anchor-vertical-list-v2>\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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"}
@@ -0,0 +1,103 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { input, signal, effect, computed, ChangeDetectionStrategy, Component } from '@angular/core';
4
+
5
+ class SdAvatar {
6
+ /**
7
+ * The source string to be used for the avatar.
8
+ * - If it matches a URL pattern, an image is displayed.
9
+ * - If it is a string representing a name, initials and a colored background are generated.
10
+ * - If undefined, it falls back to a neutral ? initial.
11
+ */
12
+ src = input.required();
13
+ size = input(32);
14
+ #imageError = signal(false);
15
+ constructor() {
16
+ // Reset image error state whenever src changes
17
+ effect(() => {
18
+ this.src();
19
+ this.#imageError.set(false);
20
+ });
21
+ }
22
+ isUrl = computed(() => {
23
+ // If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text
24
+ if (this.#imageError()) {
25
+ return false;
26
+ }
27
+ const val = this.src() || '';
28
+ const urlPattern = /^(http|https|data:image|\/)/;
29
+ return urlPattern.test(val);
30
+ });
31
+ bgColor = computed(() => {
32
+ if (this.isUrl()) {
33
+ return 'transparent';
34
+ }
35
+ const val = this.src() || '';
36
+ if (!val) {
37
+ return '#bdc3c7';
38
+ }
39
+ return this.#generateColor(val);
40
+ });
41
+ initials = computed(() => {
42
+ if (this.isUrl()) {
43
+ return '';
44
+ }
45
+ const val = this.src() || '';
46
+ if (!val) {
47
+ return '?';
48
+ }
49
+ return this.#getInitials(val);
50
+ });
51
+ handleError() {
52
+ this.#imageError.set(true);
53
+ }
54
+ #getInitials = (name) => {
55
+ const words = name.trim().split(' ').filter(Boolean);
56
+ if (!words.length)
57
+ return '';
58
+ if (words.length === 1)
59
+ return words[0][0].toUpperCase();
60
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
61
+ };
62
+ #generateColor = (name) => {
63
+ const colors = [
64
+ '#1abc9c',
65
+ '#2ecc71',
66
+ '#3498db',
67
+ '#9b59b6',
68
+ '#34495e',
69
+ '#16a085',
70
+ '#27ae60',
71
+ '#2980b9',
72
+ '#8e44ad',
73
+ '#2c3e50',
74
+ '#f1c40f',
75
+ '#e67e22',
76
+ '#e74c3c',
77
+ '#95a5a6',
78
+ '#f39c12',
79
+ '#d35400',
80
+ '#c0392b',
81
+ '#bdc3c7',
82
+ '#7f8c8d',
83
+ ];
84
+ let hash = 0;
85
+ for (let i = 0; i < name.length; i++) {
86
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
87
+ }
88
+ return colors[Math.abs(hash) % colors.length];
89
+ };
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdAvatar, isStandalone: true, selector: "sd-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdAvatar, decorators: [{
94
+ type: Component,
95
+ args: [{ selector: 'sd-avatar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"] }]
96
+ }], ctorParameters: () => [] });
97
+
98
+ /**
99
+ * Generated bundle index. Do not edit.
100
+ */
101
+
102
+ export { SdAvatar };
103
+ //# sourceMappingURL=sd-angular-core-components-avatar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-angular-core-components-avatar.mjs","sources":["../../../projects/sd-angular/components/avatar/src/avatar.component.ts","../../../projects/sd-angular/components/avatar/src/avatar.component.html","../../../projects/sd-angular/components/avatar/sd-angular-core-components-avatar.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, signal } from '@angular/core';\n\n@Component({\n selector: 'sd-avatar',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdAvatar {\n /**\n * The source string to be used for the avatar.\n * - If it matches a URL pattern, an image is displayed.\n * - If it is a string representing a name, initials and a colored background are generated.\n * - If undefined, it falls back to a neutral ? initial.\n */\n readonly src = input.required<string | undefined | null>();\n readonly size = input<number>(32);\n\n readonly #imageError = signal<boolean>(false);\n\n constructor() {\n // Reset image error state whenever src changes\n effect(() => {\n this.src();\n this.#imageError.set(false);\n });\n }\n\n readonly isUrl = computed(() => {\n // If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text\n if (this.#imageError()) {\n return false;\n }\n const val = this.src() || '';\n const urlPattern = /^(http|https|data:image|\\/)/;\n return urlPattern.test(val);\n });\n\n readonly bgColor = computed(() => {\n if (this.isUrl()) {\n return 'transparent';\n }\n const val = this.src() || '';\n if (!val) {\n return '#bdc3c7';\n }\n return this.#generateColor(val);\n });\n\n readonly initials = computed(() => {\n if (this.isUrl()) {\n return '';\n }\n const val = this.src() || '';\n if (!val) {\n return '?';\n }\n return this.#getInitials(val);\n });\n\n handleError() {\n this.#imageError.set(true);\n }\n\n #getInitials = (name: string): string => {\n const words = name.trim().split(' ').filter(Boolean);\n if (!words.length) return '';\n if (words.length === 1) return words[0][0].toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n };\n\n #generateColor = (name: string): string => {\n const colors = [\n '#1abc9c',\n '#2ecc71',\n '#3498db',\n '#9b59b6',\n '#34495e',\n '#16a085',\n '#27ae60',\n '#2980b9',\n '#8e44ad',\n '#2c3e50',\n '#f1c40f',\n '#e67e22',\n '#e74c3c',\n '#95a5a6',\n '#f39c12',\n '#d35400',\n '#c0392b',\n '#bdc3c7',\n '#7f8c8d',\n ];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n };\n}\n","<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,108 +1,118 @@
1
+ import * as i1 from '@angular/common';
1
2
  import { CommonModule } from '@angular/common';
2
3
  import * as i0 from '@angular/core';
3
- import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { input, booleanAttribute, EventEmitter, computed, Output, ChangeDetectionStrategy, Component } from '@angular/core';
4
5
  import { MatIconModule } from '@angular/material/icon';
5
- import * as i1 from '@angular/material/tooltip';
6
+ import * as i2 from '@angular/material/tooltip';
6
7
  import { MatTooltipModule } from '@angular/material/tooltip';
7
8
 
8
9
  /* eslint-disable @angular-eslint/no-input-rename */
9
10
  class SdBadge {
10
11
  defaultIcon = 'fiber_manual_record';
11
- type = 'icon';
12
- set _type(type) {
13
- this.type = type || 'icon';
14
- }
15
- color = 'secondary';
16
- set _color(color) {
17
- this.color = color || 'secondary';
18
- }
19
- // Hỗ trợ: <sd-button secondary> hoặc <sd-button [secondary]="condition">
20
- set primary(value) {
21
- if (value === '' || value) {
22
- this.color = 'primary';
23
- }
24
- }
25
- set secondary(value) {
26
- // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true
27
- if (value === '' || value) {
28
- this.color = 'secondary';
29
- }
30
- }
31
- set success(value) {
32
- // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true
33
- if (value === '' || value) {
34
- this.color = 'success';
35
- }
36
- }
37
- set info(value) {
38
- // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true
39
- if (value === '' || value) {
40
- this.color = 'info';
41
- }
42
- }
43
- set warning(value) {
44
- // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true
45
- if (value === '' || value) {
46
- this.color = 'warning';
47
- }
48
- }
49
- set error(value) {
50
- // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true
51
- if (value === '' || value) {
52
- this.color = 'error';
53
- }
54
- }
55
- fontSet = 'material-icons';
56
- set _fontSet(fontSet) {
57
- this.fontSet = fontSet || 'material-icons';
58
- }
59
- title;
60
- description;
61
- tooltip;
62
- icon;
63
- size = 'sm';
64
- sdClick = new EventEmitter();
12
+ // ==========================================
13
+ // 1. SIGNAL INPUTS
14
+ // ==========================================
15
+ type = input('icon', {
16
+ transform: value => value || 'icon',
17
+ });
18
+ color = input('secondary', {
19
+ transform: value => value || 'secondary',
20
+ });
21
+ primary = input(false, { transform: booleanAttribute });
22
+ secondary = input(false, { transform: booleanAttribute });
23
+ success = input(false, { transform: booleanAttribute });
24
+ info = input(false, { transform: booleanAttribute });
25
+ warning = input(false, { transform: booleanAttribute });
26
+ error = input(false, { transform: booleanAttribute });
27
+ fontSet = input('material-icons', {
28
+ transform: value => value || 'material-icons',
29
+ });
30
+ title = input();
31
+ description = input();
32
+ tooltip = input();
33
+ icon = input();
34
+ size = input('sm', {
35
+ transform: value => value || 'sm',
36
+ });
37
+ // ==========================================
38
+ // 2. OUTPUT
39
+ // ==========================================
40
+ click = new EventEmitter();
65
41
  onClick = (event) => {
66
- this.sdClick.emit(event);
42
+ event.stopPropagation();
43
+ this.click.emit(event);
67
44
  };
45
+ // ==========================================
46
+ // 3. COMPUTED STATE
47
+ // ==========================================
48
+ effectiveColor = computed(() => {
49
+ if (this.primary())
50
+ return 'primary';
51
+ if (this.secondary())
52
+ return 'secondary';
53
+ if (this.success())
54
+ return 'success';
55
+ if (this.info())
56
+ return 'info';
57
+ if (this.warning())
58
+ return 'warning';
59
+ if (this.error())
60
+ return 'error';
61
+ return this.color();
62
+ });
63
+ baseColorClasses = computed(() => {
64
+ const c = this.effectiveColor();
65
+ return {
66
+ 'c-primary': c === 'primary',
67
+ 'c-secondary': c === 'secondary',
68
+ 'c-info': c === 'info',
69
+ 'c-success': c === 'success',
70
+ 'c-warning': c === 'warning',
71
+ 'c-error': c === 'error',
72
+ };
73
+ });
74
+ iconColorClasses = computed(() => {
75
+ const c = this.effectiveColor();
76
+ return {
77
+ 'c-primary': c === 'primary',
78
+ 'c-black400': c === 'secondary',
79
+ 'c-info': c === 'info',
80
+ 'c-success': c === 'success',
81
+ 'c-warning': c === 'warning',
82
+ 'c-error': c === 'error',
83
+ };
84
+ });
85
+ iconSizeAndFontClasses = computed(() => {
86
+ const s = this.size();
87
+ const f = this.fontSet();
88
+ return {
89
+ 'c-xs': s === 'xs',
90
+ 'c-sm': s === 'sm',
91
+ 'c-md': s === 'md',
92
+ 'c-lg': s === 'lg',
93
+ 'material-icons': f === 'material-icons',
94
+ 'material-icons-outlined': f === 'material-icons-outlined',
95
+ 'material-icons-round': f === 'material-icons-round',
96
+ 'material-icons-sharp': f === 'material-icons-sharp',
97
+ };
98
+ });
99
+ // GỘP CLASS CHO BADGE TYPE = 'TAG'
100
+ tagIconCombinedClasses = computed(() => ({
101
+ ...this.iconSizeAndFontClasses(),
102
+ ...this.baseColorClasses(),
103
+ }));
104
+ // GỘP CLASS CHO BADGE TYPE = 'ICON'
105
+ iconCombinedClasses = computed(() => ({
106
+ ...this.iconSizeAndFontClasses(),
107
+ ...this.iconColorClasses(),
108
+ }));
68
109
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
69
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdBadge, isStandalone: true, selector: "sd-badge", inputs: { _type: ["type", "_type"], _color: ["color", "_color"], primary: "primary", secondary: "secondary", success: "success", info: "info", warning: "warning", error: "error", _fontSet: ["fontSet", "_fontSet"], title: "title", description: "description", tooltip: "tooltip", icon: "icon", size: "size" }, outputs: { sdClick: "sdClick" }, ngImport: i0, template: "@if (type === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ title }}\r\n </div>\r\n} @else if (type === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon) {\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"type === 'icon'\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\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-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag .c-material-icon{padding:0}.c-badge.c-badge--tag .c-material-icon.c-xs,.c-badge.c-badge--tag .c-material-icon.c-sm,.c-badge.c-badge--tag .c-material-icon.c-md,.c-badge.c-badge--tag .c-material-icon.c-lg{line-height:20px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-xs{width:18px;height:18px;font-size:14px}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-secondary)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdBadge, isStandalone: true, selector: "sd-badge", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, primary: { classPropertyName: "primary", publicName: "primary", isSignal: true, isRequired: false, transformFunction: null }, secondary: { classPropertyName: "secondary", publicName: "secondary", isSignal: true, isRequired: false, transformFunction: null }, success: { classPropertyName: "success", publicName: "success", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, fontSet: { classPropertyName: "fontSet", publicName: "fontSet", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click" }, ngImport: i0, template: "@let badgeType = type();\r\n@let tt = tooltip();\r\n@let titleText = title();\r\n@let descText = description();\r\n@let iconName = icon() || defaultIcon;\r\n@let isPointer = click.observed;\r\n\r\n@if (badgeType === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ titleText }}\r\n </div>\r\n} @else if (badgeType === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon()) {\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"badgeType === 'icon'\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\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-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag .c-material-icon{padding:0}.c-badge.c-badge--tag .c-material-icon.c-xs,.c-badge.c-badge--tag .c-material-icon.c-sm,.c-badge.c-badge--tag .c-material-icon.c-md,.c-badge.c-badge--tag .c-material-icon.c-lg{line-height:20px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-xs{width:18px;height:18px;font-size:14px}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-black400{color:var(--sd-black400)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-black400)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70
111
  }
71
112
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdBadge, decorators: [{
72
113
  type: Component,
73
- args: [{ selector: 'sd-badge', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule], template: "@if (type === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ title }}\r\n </div>\r\n} @else if (type === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon) {\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"type === 'icon'\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\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-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag .c-material-icon{padding:0}.c-badge.c-badge--tag .c-material-icon.c-xs,.c-badge.c-badge--tag .c-material-icon.c-sm,.c-badge.c-badge--tag .c-material-icon.c-md,.c-badge.c-badge--tag .c-material-icon.c-lg{line-height:20px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-xs{width:18px;height:18px;font-size:14px}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-secondary)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"] }]
74
- }], propDecorators: { _type: [{
75
- type: Input,
76
- args: ['type']
77
- }], _color: [{
78
- type: Input,
79
- args: ['color']
80
- }], primary: [{
81
- type: Input
82
- }], secondary: [{
83
- type: Input
84
- }], success: [{
85
- type: Input
86
- }], info: [{
87
- type: Input
88
- }], warning: [{
89
- type: Input
90
- }], error: [{
91
- type: Input
92
- }], _fontSet: [{
93
- type: Input,
94
- args: ['fontSet']
95
- }], title: [{
96
- type: Input
97
- }], description: [{
98
- type: Input
99
- }], tooltip: [{
100
- type: Input
101
- }], icon: [{
102
- type: Input
103
- }], size: [{
104
- type: Input
105
- }], sdClick: [{
114
+ args: [{ selector: 'sd-badge', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule], template: "@let badgeType = type();\r\n@let tt = tooltip();\r\n@let titleText = title();\r\n@let descText = description();\r\n@let iconName = icon() || defaultIcon;\r\n@let isPointer = click.observed;\r\n\r\n@if (badgeType === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ titleText }}\r\n </div>\r\n} @else if (badgeType === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon()) {\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"badgeType === 'icon'\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\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-badge{border-radius:20px;padding:2px 10px;display:inline-block;text-align:center;overflow-wrap:break-word}.c-badge.c-primary{background:var(--sd-primary-light);color:var(--sd-primary)}.c-badge.c-primary.c-badge--tag{border:1px solid var(--sd-primary)}.c-badge.c-secondary{background:var(--sd-secondary-light);color:var(--sd-secondary)}.c-badge.c-secondary.c-badge--tag{border:1px solid var(--sd-secondary)}.c-badge.c-info{background:var(--sd-info-light);color:var(--sd-info)}.c-badge.c-info.c-badge--tag{border:1px solid var(--sd-info)}.c-badge.c-warning{background:var(--sd-warning-light);color:var(--sd-warning)}.c-badge.c-warning.c-badge--tag{border:1px solid var(--sd-warning)}.c-badge.c-success{background:var(--sd-success-light);color:var(--sd-success)}.c-badge.c-success.c-badge--tag{border:1px solid var(--sd-success)}.c-badge.c-error{background:var(--sd-error-light);color:var(--sd-error)}.c-badge.c-error.c-badge--tag{border:1px solid var(--sd-error)}.c-badge.c-badge--tag{border-radius:4px;padding:1px 7px}.c-badge.c-badge--tag .c-material-icon{padding:0}.c-badge.c-badge--tag .c-material-icon.c-xs,.c-badge.c-badge--tag .c-material-icon.c-sm,.c-badge.c-badge--tag .c-material-icon.c-md,.c-badge.c-badge--tag .c-material-icon.c-lg{line-height:20px}.c-badge-icon{min-width:50px}.c-badge-icon .c-material-icon{border-radius:50%;padding:2px 2px 2px 0}.c-badge-icon .c-material-icon.c-xs{width:18px;height:18px;font-size:14px}.c-badge-icon .c-material-icon.c-sm{width:20px;height:20px;font-size:16px}.c-badge-icon .c-material-icon.c-md{width:22px;height:22px;font-size:18px}.c-badge-icon .c-material-icon.c-lg{width:28px;height:28px;font-size:24px}.c-badge-icon .c-material-icon.c-primary{color:var(--sd-primary)}.c-badge-icon .c-material-icon.c-secondary{color:var(--sd-secondary)}.c-badge-icon .c-material-icon.c-black400{color:var(--sd-black400)}.c-badge-icon .c-material-icon.c-info{color:var(--sd-info)}.c-badge-icon .c-material-icon.c-success{color:var(--sd-success)}.c-badge-icon .c-material-icon.c-error{color:var(--sd-error)}.c-badge-icon .c-material-icon.c-warning{color:var(--sd-warning)}.c-badge-description{color:var(--sd-black400)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}\n"] }]
115
+ }], propDecorators: { click: [{
106
116
  type: Output
107
117
  }] } });
108
118
 
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-badge.mjs","sources":["../../../projects/sd-angular/components/badge/src/badge.component.ts","../../../projects/sd-angular/components/badge/src/badge.component.html","../../../projects/sd-angular/components/badge/sd-angular-core-components-badge.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdColor, SdSize } from '@sd-angular/core/utilities/models';\r\n\r\n@Component({\r\n selector: 'sd-badge',\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class SdBadge {\r\n defaultIcon = 'fiber_manual_record';\r\n\r\n type: 'tag' | 'round' | 'icon' = 'icon';\r\n @Input('type') set _type(type: 'tag' | 'round' | 'icon' | undefined | null) {\r\n this.type = type || 'icon';\r\n }\r\n\r\n color: SdColor = 'secondary';\r\n @Input('color') set _color(color: SdColor | undefined | null) {\r\n this.color = color || 'secondary';\r\n }\r\n\r\n // Hỗ trợ: <sd-button secondary> hoặc <sd-button [secondary]=\"condition\">\r\n @Input() set primary(value: boolean | '') {\r\n if (value === '' || value) {\r\n this.color = 'primary';\r\n }\r\n }\r\n\r\n @Input() set secondary(value: boolean | '') {\r\n // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true\r\n if (value === '' || value) {\r\n this.color = 'secondary';\r\n }\r\n }\r\n\r\n @Input() set success(value: boolean | '' | undefined | null) {\r\n // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true\r\n if (value === '' || value) {\r\n this.color = 'success';\r\n }\r\n }\r\n\r\n @Input() set info(value: boolean | '' | undefined | null) {\r\n // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true\r\n if (value === '' || value) {\r\n this.color = 'info';\r\n }\r\n }\r\n\r\n @Input() set warning(value: boolean | '' | undefined | null) {\r\n // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true\r\n if (value === '' || value) {\r\n this.color = 'warning';\r\n }\r\n }\r\n\r\n @Input() set error(value: boolean | '' | undefined | null) {\r\n // Nếu value là '' (viết tắt <sd-button secondary>) hoặc true\r\n if (value === '' || value) {\r\n this.color = 'error';\r\n }\r\n }\r\n\r\n fontSet: 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' = 'material-icons';\r\n @Input('fontSet') set _fontSet(\r\n fontSet: 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | undefined | null\r\n ) {\r\n this.fontSet = fontSet || 'material-icons';\r\n }\r\n @Input() title: string | number | undefined | null;\r\n @Input() description: string | undefined | null;\r\n @Input() tooltip: string | undefined | null;\r\n @Input() icon: string | undefined | null;\r\n\r\n @Input() size: SdSize = 'sm';\r\n @Output() sdClick = new EventEmitter();\r\n onClick = (event: Event) => {\r\n this.sdClick.emit(event);\r\n };\r\n}\r\n","@if (type === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ title }}\r\n </div>\r\n} @else if (type === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon) {\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tooltip\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"type === 'icon'\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\"\r\n [class.pointer]=\"!!sdClick.observers.length\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span\r\n class=\"c-material-icon mr-4\"\r\n [class]=\"{\r\n 'c-xs': size === 'xs',\r\n 'c-sm': size === 'sm',\r\n 'c-md': size === 'md',\r\n 'c-lg': size === 'lg',\r\n 'material-icons': fontSet === 'material-icons',\r\n 'material-icons-outlined': fontSet === 'material-icons-outlined',\r\n 'material-icons-round': fontSet === 'material-icons-round',\r\n 'material-icons-sharp': fontSet === 'material-icons-sharp'\r\n }\"\r\n [class.c-primary]=\"color === 'primary'\"\r\n [class.c-secondary]=\"color === 'secondary'\"\r\n [class.c-info]=\"color === 'info'\"\r\n [class.c-success]=\"color === 'success'\"\r\n [class.c-warning]=\"color === 'warning'\"\r\n [class.c-error]=\"color === 'error'\">\r\n {{ icon || defaultIcon }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ title }}</span>\r\n @if (description) {\r\n <span class=\"T12R c-badge-description\">{{ description }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-components-badge.mjs","sources":["../../../projects/sd-angular/components/badge/src/badge.component.ts","../../../projects/sd-angular/components/badge/src/badge.component.html","../../../projects/sd-angular/components/badge/sd-angular-core-components-badge.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, booleanAttribute, computed, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdColor, SdSize } from '@sd-angular/core/utilities/models';\r\nimport { MaterialIconFontSet, DefaultMaterialIconFontSet } from '@sd-angular/core/utilities/models';\r\n\r\n// Export các Type để dùng chung\r\nexport type SdBadgeType = 'tag' | 'round' | 'icon';\r\n\r\n@Component({\r\n selector: 'sd-badge',\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class SdBadge {\r\n defaultIcon = 'fiber_manual_record';\r\n\r\n // ==========================================\r\n // 1. SIGNAL INPUTS\r\n // ==========================================\r\n type = input<SdBadgeType, SdBadgeType | undefined | null>('icon', {\r\n transform: value => value || 'icon',\r\n });\r\n\r\n color = input<SdColor, SdColor | undefined | null>('secondary', {\r\n transform: value => value || 'secondary',\r\n });\r\n\r\n primary = input(false, { transform: booleanAttribute });\r\n secondary = input(false, { transform: booleanAttribute });\r\n success = input(false, { transform: booleanAttribute });\r\n info = input(false, { transform: booleanAttribute });\r\n warning = input(false, { transform: booleanAttribute });\r\n error = input(false, { transform: booleanAttribute });\r\n\r\n fontSet = input<MaterialIconFontSet, MaterialIconFontSet | undefined | null>('material-icons', {\r\n transform: value => value || 'material-icons',\r\n });\r\n\r\n title = input<string | number | undefined | null>();\r\n description = input<string | undefined | null>();\r\n tooltip = input<string | undefined | null>();\r\n icon = input<string | undefined | null>();\r\n\r\n size = input<SdSize, SdSize | undefined | null>('sm', {\r\n transform: value => value || 'sm',\r\n });\r\n\r\n // ==========================================\r\n // 2. OUTPUT\r\n // ==========================================\r\n @Output() click = new EventEmitter<Event>();\r\n\r\n onClick = (event: Event) => {\r\n event.stopPropagation();\r\n this.click.emit(event);\r\n };\r\n\r\n // ==========================================\r\n // 3. COMPUTED STATE\r\n // ==========================================\r\n\r\n effectiveColor = computed(() => {\r\n if (this.primary()) return 'primary';\r\n if (this.secondary()) return 'secondary';\r\n if (this.success()) return 'success';\r\n if (this.info()) return 'info';\r\n if (this.warning()) return 'warning';\r\n if (this.error()) return 'error';\r\n return this.color();\r\n });\r\n\r\n baseColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-secondary': c === 'secondary',\r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconColorClasses = computed(() => {\r\n const c = this.effectiveColor();\r\n return {\r\n 'c-primary': c === 'primary',\r\n 'c-black400': c === 'secondary',\r\n 'c-info': c === 'info',\r\n 'c-success': c === 'success',\r\n 'c-warning': c === 'warning',\r\n 'c-error': c === 'error',\r\n };\r\n });\r\n\r\n iconSizeAndFontClasses = computed(() => {\r\n const s = this.size();\r\n const f = this.fontSet();\r\n return {\r\n 'c-xs': s === 'xs',\r\n 'c-sm': s === 'sm',\r\n 'c-md': s === 'md',\r\n 'c-lg': s === 'lg',\r\n 'material-icons': f === 'material-icons',\r\n 'material-icons-outlined': f === 'material-icons-outlined',\r\n 'material-icons-round': f === 'material-icons-round',\r\n 'material-icons-sharp': f === 'material-icons-sharp',\r\n };\r\n });\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'TAG'\r\n tagIconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.baseColorClasses(),\r\n }));\r\n\r\n // GỘP CLASS CHO BADGE TYPE = 'ICON'\r\n iconCombinedClasses = computed(() => ({\r\n ...this.iconSizeAndFontClasses(),\r\n ...this.iconColorClasses(),\r\n }));\r\n}\r\n","@let badgeType = type();\r\n@let tt = tooltip();\r\n@let titleText = title();\r\n@let descText = description();\r\n@let iconName = icon() || defaultIcon;\r\n@let isPointer = click.observed;\r\n\r\n@if (badgeType === 'round') {\r\n <div\r\n class=\"c-badge\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n {{ titleText }}\r\n </div>\r\n} @else if (badgeType === 'tag') {\r\n <div\r\n class=\"c-badge c-badge--tag\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [ngClass]=\"baseColorClasses()\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n @if (icon()) {\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"tagIconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n }\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T12R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div\r\n class=\"d-flex\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"tt || ''\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [class.c-badge-icon]=\"badgeType === 'icon'\"\r\n [class.pointer]=\"isPointer\"\r\n (click)=\"onClick($event)\"\r\n aria-hidden=\"true\">\r\n <div class=\"c-icon d-flex align-items-center\">\r\n <span class=\"c-material-icon mr-4\" [ngClass]=\"iconCombinedClasses()\">\r\n {{ iconName }}\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"T14R c-badge-title\">{{ titleText }}</span>\r\n @if (descText) {\r\n <span class=\"T10R c-badge-description\">{{ descText }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}