@rt-tools/ui-kit-v2 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +4 -3
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
  5. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
  9. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
  13. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
  15. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
  17. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  18. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
  19. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +113 -2
  21. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
  23. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
  25. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
  27. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  29. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
  37. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
  39. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
  41. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
  43. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
  47. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
  49. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
  51. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
  53. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
  55. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  56. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
  59. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
  61. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
  63. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
  67. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
  71. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
  73. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
  77. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
  83. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
  85. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  86. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
  87. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
  88. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
  89. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  90. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
  91. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  92. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +609 -33
  93. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  94. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  96. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
  97. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  98. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
  99. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  100. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
  101. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  102. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
  103. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  104. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
  105. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  106. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
  107. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  108. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
  109. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
  110. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
  111. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
  112. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
  113. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  114. package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
  115. package/package.json +17 -1
  116. package/src/assets/icons/volume-off.svg +2 -1
  117. package/src/lib/components/autocomplete/CONTEXT.md +25 -14
  118. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
  119. package/src/lib/components/badge/CONTEXT.md +33 -0
  120. package/src/lib/components/badge/rt-badge.directive.scss +104 -0
  121. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
  122. package/src/lib/components/button/CONTEXT.md +5 -0
  123. package/src/lib/components/button/rt-button.directive.scss +3 -1
  124. package/src/lib/components/checkbox/CONTEXT.md +15 -8
  125. package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
  126. package/src/lib/components/container/CONTEXT.md +23 -6
  127. package/src/lib/components/container/rt-container.component.scss +90 -1
  128. package/src/lib/components/copy-value/CONTEXT.md +6 -5
  129. package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
  130. package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
  131. package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
  132. package/src/lib/components/divider/CONTEXT.md +21 -0
  133. package/src/lib/components/divider/rt-divider.component.scss +34 -0
  134. package/src/lib/components/drawer/CONTEXT.md +73 -0
  135. package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
  136. package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
  137. package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
  138. package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
  139. package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
  140. package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
  141. package/src/lib/components/field/CONTEXT.md +43 -0
  142. package/src/lib/components/field/rt-field-label-inside.scss +179 -0
  143. package/src/lib/components/field/rt-field.component.scss +51 -2
  144. package/src/lib/components/icon-button/CONTEXT.md +17 -15
  145. package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
  146. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
  147. package/src/lib/components/input/CONTEXT.md +45 -11
  148. package/src/lib/components/input/rt-input-floating-label.scss +192 -0
  149. package/src/lib/components/input/rt-input-icons.scss +105 -0
  150. package/src/lib/components/input/rt-input.component.scss +91 -13
  151. package/src/lib/components/input-number/CONTEXT.md +7 -0
  152. package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
  153. package/src/lib/components/menu/CONTEXT.md +1 -0
  154. package/src/lib/components/multiselect/CONTEXT.md +2 -1
  155. package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
  156. package/src/lib/components/pagination/CONTEXT.md +3 -0
  157. package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
  158. package/src/lib/components/progress-bar/CONTEXT.md +22 -0
  159. package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
  160. package/src/lib/components/radio-button/CONTEXT.md +9 -0
  161. package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
  162. package/src/lib/components/select/CONTEXT.md +28 -0
  163. package/src/lib/components/select/rt-select-clear.scss +88 -0
  164. package/src/lib/components/select/rt-select-floating-label.scss +155 -0
  165. package/src/lib/components/select/rt-select-material.scss +54 -0
  166. package/src/lib/components/select/rt-select.component.scss +54 -16
  167. package/src/lib/components/side-menu/CONTEXT.md +5 -0
  168. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
  169. package/src/lib/components/stepper/CONTEXT.md +13 -5
  170. package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
  171. package/src/lib/components/tabs/CONTEXT.md +57 -9
  172. package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
  173. package/src/lib/components/textarea/CONTEXT.md +12 -1
  174. package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
  175. package/src/lib/components/toast/CONTEXT.md +23 -0
  176. package/src/lib/components/toast/rt-toast.component.scss +37 -0
  177. package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
  178. package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
  179. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
  180. package/src/lib/components/tooltip/CONTEXT.md +7 -1
  181. package/src/lib/components/tree/rt-tree.component.scss +2 -2
  182. package/src/styles/_color-scheme.scss +1 -1
  183. package/src/styles/_density.scss +48 -0
  184. package/src/styles/_index.scss +8 -0
  185. package/src/styles/_preset-material.scss +160 -70
  186. package/src/styles/_primitives.scss +1 -0
  187. package/src/styles/_semantic-navigation.scss +117 -0
  188. package/src/styles/_semantic.scss +29 -98
  189. package/src/styles/_theme-dark.scss +8 -0
  190. package/styles/tokens.css +2066 -1134
  191. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
  192. package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
  193. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
  194. package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
  195. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
  196. package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
  197. package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
  198. package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
  199. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
  200. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
  201. package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
  202. package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
  203. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
  204. package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
  205. package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
  206. package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
  207. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
  208. package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
  209. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
  210. package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
  211. package/types/rt-tools-ui-kit-v2-tabs.d.ts +291 -6
  212. package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
  213. package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
  214. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
  215. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
  216. package/types/rt-tools-ui-kit-v2.d.ts +4 -0
  217. package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","names":["BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.model.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.html","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.html"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport { INotification } from '@rt-tools/ui-kit-v2/core';\n\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\nexport const RT_TOASTER_GAP_PX: number = 14;\n\n/**\n * Значки severity у тоста. Приложение подменяет карту целиком — например, на имена\n * Material, — а тост со своим `icon` берёт свой значок мимо карты.\n */\nexport const RT_TOAST_SEVERITY_ICONS: InjectionToken<Readonly<Record<INotification.Severity, IRtIcon.Name>>> = new InjectionToken<\n Readonly<Record<INotification.Severity, IRtIcon.Name>>\n>('RT_TOAST_SEVERITY_ICONS', {\n providedIn: 'root',\n factory: (): Readonly<Record<INotification.Severity, IRtIcon.Name>> => ({\n info: 'info-circle',\n success: 'check-circle',\n warning: 'exclamation-circle',\n danger: 'times-circle',\n }),\n});\n\nexport namespace IRtToaster {\n export type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\n export type PositionY = 'top' | 'bottom';\n\n export type PositionX = 'left' | 'center' | 'right';\n\n /** `stack` копит тосты стопкой; `replace` — новый тост уводит прежние. */\n export type Mode = 'stack' | 'replace';\n\n export interface Toast {\n readonly id: number;\n readonly severity: INotification.Severity;\n readonly message: string;\n readonly description?: string;\n readonly meta?: string;\n readonly action?: INotification.Action;\n readonly secondaryAction?: INotification.Action;\n readonly filled?: boolean;\n readonly duration?: number | null;\n readonly progress?: boolean;\n readonly icon?: IRtIcon.Name | null;\n readonly onDismiss?: (reason: INotification.DismissReason) => void;\n /** Тост вытеснен новым в режиме `replace` и уходит своей анимацией. */\n readonly replaced?: boolean;\n }\n\n export interface Height {\n readonly toastId: number;\n readonly height: number;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { INotification } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RT_TOAST_SEVERITY_ICONS, RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toast';\n\nconst UNMOUNT_DELAY_MS: number = 200;\n\n@Component({\n selector: 'rt-toast',\n templateUrl: './rt-toast.component.html',\n styleUrl: './rt-toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtButtonDirective, RtIconComponent, RtIconButtonComponent, BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-atomic': 'true',\n },\n})\nexport class RtToastComponent implements AfterViewInit, OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #severityIcons: Readonly<Record<INotification.Severity, IRtIcon.Name>> = inject(RT_TOAST_SEVERITY_ICONS);\n\n readonly #mounted: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #removed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #offsetBeforeRemove: WritableSignal<number> = signal<number>(0);\n\n readonly #initialHeight: WritableSignal<number> = signal<number>(0);\n\n readonly #heightIndex: Signal<number> = computed((): number =>\n this.heights().findIndex((item: IRtToaster.Height): boolean => item.toastId === this.toast().id)\n );\n\n readonly #heightBefore: Signal<number> = computed((): number =>\n this.heights().reduce(\n (total: number, item: IRtToaster.Height, itemIndex: number): number =>\n itemIndex >= this.#heightIndex() ? total : total + item.height,\n 0\n )\n );\n\n readonly #offset: Signal<number> = computed((): number => Math.round(this.#heightIndex() * RT_TOASTER_GAP_PX + this.#heightBefore()));\n\n readonly #positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n #timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #unmountTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #remainingTimeMs: number = 0;\n\n #closeTimerStartedAt: number = 0;\n\n #closeTimerPausedAt: number = 0;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n /** Свой значок тоста важнее карты severity; `null` у тоста значок снимает. */\n protected readonly icon: Signal<IRtIcon.Name | null> = computed((): IRtIcon.Name | null => {\n const icon: IRtIcon.Name | null | undefined = this.toast().icon;\n return icon === undefined ? this.#severityIcons[this.toast().severity] : icon;\n });\n\n /** Срок жизни тоста: свой, если задан, иначе тостера; `null` — таймера нет. */\n protected readonly lifetime: Signal<number | null> = computed((): number | null => {\n const duration: number | null | undefined = this.toast().duration;\n return duration === undefined ? this.duration() : duration;\n });\n\n protected readonly showProgress: Signal<boolean> = computed((): boolean => this.toast().progress === true && this.lifetime() !== null);\n\n /** Таймер и полоса срока встают от одного признака, чтобы не разойтись. */\n protected readonly paused: Signal<boolean> = computed((): boolean => this.expanded() || this.interacting());\n\n public readonly toast: InputSignal<IRtToaster.Toast> = input.required<IRtToaster.Toast>();\n\n public readonly index: InputSignal<number> = input.required<number>();\n\n public readonly totalToasts: InputSignal<number> = input.required<number>();\n\n public readonly heights: InputSignal<IRtToaster.Height[]> = input.required<IRtToaster.Height[]>();\n\n public readonly expanded: InputSignalWithTransform<boolean, BooleanInput> = input.required<boolean, BooleanInput>({\n transform: booleanAttribute,\n });\n\n public readonly expandByDefault: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly interacting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly visibleToasts: InputSignal<number> = input<number>(3);\n\n public readonly duration: InputSignal<number> = input<number>(4000);\n\n public readonly heightAdded: OutputEmitterRef<IRtToaster.Height> = output<IRtToaster.Height>();\n\n public readonly heightRemoved: OutputEmitterRef<number> = output<number>();\n\n public readonly dismissed: OutputEmitterRef<number> = output<number>();\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--severity--${this.toast().severity}`]: true,\n [`${BEM_BLOCK}--filled`]: this.toast().filled === true,\n [`${BEM_BLOCK}--y--${this.#positionY()}`]: true,\n [`${BEM_BLOCK}--mounted`]: this.#mounted(),\n [`${BEM_BLOCK}--removed`]: this.#removed(),\n [`${BEM_BLOCK}--front`]: this.index() === 0,\n [`${BEM_BLOCK}--hidden`]: this.index() + 1 > this.visibleToasts(),\n [`${BEM_BLOCK}--expanded`]: this.expanded() || (this.expandByDefault() && this.#mounted()),\n [`${BEM_BLOCK}--paused`]: this.paused(),\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--index': `${this.index()}`,\n '--toasts-before': `${this.index()}`,\n '--z-index': `${this.totalToasts() - this.index()}`,\n '--offset': `${this.#removed() ? this.#offsetBeforeRemove() : this.#offset()}px`,\n '--initial-height': this.expandByDefault() ? 'auto' : `${this.#initialHeight()}px`,\n '--lifetime': `${this.lifetime() ?? 0}ms`,\n };\n }\n\n constructor() {\n effect((onCleanup: (cleanup: () => void) => void): void => {\n if (!this.#mounted() || this.#removed() || this.lifetime() === null) {\n return;\n }\n\n if (this.paused()) {\n this.#pauseTimer();\n } else {\n this.#startTimer();\n }\n\n onCleanup((): void => clearTimeout(this.#timeoutId));\n });\n\n // Вытесненный в режиме `replace` уходит тем же путём, что и закрытый крестиком.\n effect((): void => {\n if (this.#mounted() && this.toast().replaced === true) {\n this.#deleteToast('replaced');\n }\n });\n }\n\n public ngAfterViewInit(): void {\n this.#remainingTimeMs = this.lifetime() ?? 0;\n\n const height: number = this.#host.nativeElement.getBoundingClientRect().height;\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n\n this.#mounted.set(true);\n }\n\n public ngOnDestroy(): void {\n clearTimeout(this.#timeoutId);\n clearTimeout(this.#unmountTimeoutId);\n }\n\n protected onAction(): void {\n this.toast().action?.handler();\n this.#deleteToast(null);\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast(null);\n }\n\n protected onClose(): void {\n this.#deleteToast('close');\n }\n\n /** Уход тоста. Причина — для колбэка приложения; ушедший по действию её не сообщает: `null`. */\n #deleteToast(reason: INotification.DismissReason | null): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\n\n if (reason !== null) {\n this.toast().onDismiss?.(reason);\n }\n\n this.#offsetBeforeRemove.set(this.#offset());\n this.heightRemoved.emit(this.toast().id);\n\n this.#unmountTimeoutId = setTimeout((): void => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);\n }\n\n #startTimer(): void {\n this.#closeTimerStartedAt = Date.now();\n this.#timeoutId = setTimeout((): void => this.#deleteToast('timeout'), this.#remainingTimeMs);\n }\n\n #pauseTimer(): void {\n if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {\n const elapsedMs: number = Date.now() - this.#closeTimerStartedAt;\n this.#remainingTimeMs = this.#remainingTimeMs - elapsedMs;\n }\n\n this.#closeTimerPausedAt = Date.now();\n }\n}\n","<ng-container rtBlock=\"rt-toast\">\n @if (icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationBus } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtToastComponent } from './rt-toast.component';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toaster';\n\nconst DEFAULT_DURATION_MS: number = 4000;\n\nconst DEFAULT_VISIBLE_TOASTS: number = 3;\n\n@Component({\n selector: 'rt-toaster',\n templateUrl: './rt-toaster.component.html',\n styleUrl: './rt-toaster.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtToastComponent],\n host: {\n class: BEM_BLOCK,\n role: 'region',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'onStackEnter()',\n '(mousemove)': 'onStackEnter()',\n '(mouseleave)': 'onStackLeave()',\n '(pointerdown)': 'onStackPointerDown()',\n '(pointerup)': 'onStackPointerUp()',\n },\n})\nexport class RtToasterComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n protected readonly ariaLabel: Signal<string> = rtKitLabel('uiNotifications');\n\n #toastCounter: number = 0;\n\n protected readonly toasts: WritableSignal<IRtToaster.Toast[]> = signal<IRtToaster.Toast[]>([]);\n\n protected readonly heights: WritableSignal<IRtToaster.Height[]> = signal<IRtToaster.Height[]>([]);\n\n protected readonly expanded: WritableSignal<boolean> = linkedSignal<IRtToaster.Toast[], boolean>({\n source: this.toasts,\n computation: (toasts: IRtToaster.Toast[]): boolean => toasts.length < 1,\n });\n\n protected readonly interacting: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n protected readonly positionX: Signal<IRtToaster.PositionX> = computed((): IRtToaster.PositionX => {\n if (this.position().endsWith('left')) {\n return 'left';\n }\n return this.position().endsWith('center') ? 'center' : 'right';\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly duration: InputSignalWithTransform<number, number | string> = input<number, number | string>(DEFAULT_DURATION_MS, {\n transform: numberAttribute,\n });\n\n public readonly visibleToasts: InputSignalWithTransform<number, number | string> = input<number, number | string>(\n DEFAULT_VISIBLE_TOASTS,\n { transform: numberAttribute }\n );\n\n /** `replace` — новый тост уводит прежние их же анимацией ухода, а не копится стопкой. */\n public readonly mode: InputSignal<IRtToaster.Mode> = input<IRtToaster.Mode>('stack');\n\n public readonly expand: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--y--${this.positionY()}`]: true,\n [`${BEM_BLOCK}--x--${this.positionX()}`]: true,\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--front-toast-height': `${this.heights()[0]?.height ?? 0}px`,\n '--gap': `${RT_TOASTER_GAP_PX}px`,\n };\n }\n\n constructor() {\n this.#notificationBus\n .onEmit()\n .pipe(takeUntilDestroyed())\n .subscribe((event: INotification.Event): void => this.#addToast(event));\n }\n\n protected onStackEnter(): void {\n if (this.toasts().length > 0) {\n this.expanded.set(true);\n }\n }\n\n protected onStackLeave(): void {\n if (!this.interacting()) {\n this.expanded.set(false);\n }\n }\n\n protected onStackPointerDown(): void {\n this.interacting.set(true);\n }\n\n protected onStackPointerUp(): void {\n this.interacting.set(false);\n }\n\n protected onHeightAdded(height: IRtToaster.Height): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n this.#sortHeights([height, ...items.filter((item: IRtToaster.Height): boolean => item.toastId !== height.toastId)])\n );\n }\n\n protected onHeightRemoved(toastId: number): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n items.filter((item: IRtToaster.Height): boolean => item.toastId !== toastId)\n );\n }\n\n protected onDismissed(toastId: number): void {\n this.onHeightRemoved(toastId);\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.filter((item: IRtToaster.Toast): boolean => item.id !== toastId)\n );\n }\n\n #addToast(event: INotification.Event): void {\n this.#toastCounter += 1;\n const toast: IRtToaster.Toast = {\n id: this.#toastCounter,\n severity: event.payload.severity,\n message: event.payload.message,\n description: event.payload.description,\n meta: event.payload.meta,\n action: event.payload.action,\n secondaryAction: event.payload.secondaryAction,\n filled: event.payload.filled,\n duration: event.payload.duration,\n progress: event.payload.progress,\n icon: event.payload.icon,\n onDismiss: event.payload.onDismiss,\n };\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] => [\n toast,\n ...(this.mode() === 'replace' ? items.map((item: IRtToaster.Toast): IRtToaster.Toast => this.#replaced(item)) : items),\n ]);\n }\n\n #replaced(toast: IRtToaster.Toast): IRtToaster.Toast {\n return toast.replaced ? toast : { ...toast, replaced: true };\n }\n\n #sortHeights(items: IRtToaster.Height[]): IRtToaster.Height[] {\n const order: number[] = this.toasts().map((toast: IRtToaster.Toast): number => toast.id);\n return [...items].sort(\n (left: IRtToaster.Height, right: IRtToaster.Height): number => order.indexOf(left.toastId) - order.indexOf(right.toastId)\n );\n }\n}\n","@for (item of toasts(); track item.id) {\n <rt-toast\n qa-dataid=\"toast\"\n [toast]=\"item\"\n [index]=\"$index\"\n [totalToasts]=\"toasts().length\"\n [heights]=\"heights()\"\n [expanded]=\"expanded()\"\n [expandByDefault]=\"expand()\"\n [interacting]=\"interacting()\"\n [position]=\"position()\"\n [visibleToasts]=\"visibleToasts()\"\n [duration]=\"duration()\"\n (heightAdded)=\"onHeightAdded($event)\"\n (heightRemoved)=\"onHeightRemoved($event)\"\n (dismissed)=\"onDismissed($event)\" />\n}\n"],"mappings":";;;;;;;;AAMA,MAAa,oBAA4B;AAMzC,MAAa,0BAAkG,IAAI,eAEjH,2BAA2B;CACzB,YAAY;CACZ,gBAAwE;EACpE,MAAM;EACN,SAAS;EACT,SAAS;EACT,QAAQ;CACX;AACJ,CAAA;ACYD,MAAMA,cAAoB;AAE1B,MAAM,mBAA2B;AAejC,IAAa,mBAAb,MAAa,iBAAgB;CAChB;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAIA;CAQA;CAEA;CAIT;CAEA;CAEA;CAEA;CAEA;CAqDA,IACW,sBAAmB;EAC1B,OAAO;IACF,GAAGA,YAAS,cAAe,KAAK,MAAK,CAAE,CAAC,aAAa;IACrD,GAAGA,YAAS,YAAa,KAAK,MAAK,CAAE,CAAC,WAAW;IACjD,GAAGA,YAAS,OAAQ,KAAK,WAAU,MAAO;IAC1C,GAAGA,YAAS,aAAc,KAAK,SAAQ;IACvC,GAAGA,YAAS,aAAc,KAAK,SAAQ;IACvC,GAAGA,YAAS,WAAY,KAAK,MAAK,MAAO;IACzC,GAAGA,YAAS,YAAa,KAAK,MAAK,IAAK,IAAI,KAAK,cAAa;IAC9D,GAAGA,YAAS,cAAe,KAAK,SAAQ,KAAO,KAAK,gBAAe,KAAM,KAAK,SAAQ;IACtF,GAAGA,YAAS,YAAa,KAAK,OAAM;EACxC;CACL;CAEA,IACW,kBAAe;EACtB,OAAO;GACH,WAAW,GAAG,KAAK,MAAK;GACxB,mBAAmB,GAAG,KAAK,MAAK;GAChC,aAAa,GAAG,KAAK,YAAW,IAAK,KAAK,MAAK;GAC/C,YAAY,GAAG,KAAK,SAAQ,IAAK,KAAK,oBAAmB,IAAK,KAAK,QAAO,EAAE;GAC5E,oBAAoB,KAAK,gBAAe,IAAK,SAAS,GAAG,KAAK,eAAc,EAAE;GAC9E,cAAc,GAAG,KAAK,SAAQ,KAAM,EAAC;EACxC;CACL;CAEA,cAAA;EAtHS,KAAA,QAAiC,OAAO,UAAU;EAElD,KAAA,iBAAyE,OAAO,uBAAuB;EAEvG,KAAA,WAAoC,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAE1D,KAAA,WAAoC,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAE1D,KAAA,sBAA8C,OAAe,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,sBAAA,CAAA,+BAAA,CAAA,CAAA;EAE/D,KAAA,iBAAyC,OAAe,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;EAE1D,KAAA,eAA+B,eACpC,KAAK,QAAO,CAAE,CAAC,WAAW,SAAqC,KAAK,YAAY,KAAK,MAAK,CAAE,CAAC,EAAE,GAClG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;EAEQ,KAAA,gBAAgC,eACrC,KAAK,QAAO,CAAE,CAAC,QACV,OAAe,MAAyB,cACrC,aAAa,KAAK,aAAY,IAAK,QAAQ,QAAQ,KAAK,QAC5D,CAAC,GAER,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;EAEQ,KAAA,UAA0B,eAAuB,KAAK,MAAM,KAAK,aAAY,IAAA,KAAyB,KAAK,cAAa,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAE5H,KAAA,aAA2C,eAChD,KAAK,SAAQ,CAAE,CAAC,WAAW,KAAK,IAAI,QAAQ,UAC/C,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;EAMD,KAAA,mBAA2B;EAE3B,KAAA,uBAA+B;EAE/B,KAAA,sBAA8B;EAEX,KAAA,IAA4B,OAAO,aAAa;EAGhD,KAAA,OAAoC,eAAmC;GACtF,MAAM,OAAwC,KAAK,MAAK,CAAE,CAAC;GAC3D,OAAO,SAAS,SAAY,KAAK,eAAe,KAAK,MAAK,CAAE,CAAC,YAAY;EAC7E,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EAGiB,KAAA,WAAkC,eAA6B;GAC9E,MAAM,WAAsC,KAAK,MAAK,CAAE,CAAC;GACzD,OAAO,aAAa,SAAY,KAAK,SAAQ,IAAK;EACtD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEiB,KAAA,eAAgC,eAAwB,KAAK,MAAK,CAAE,CAAC,aAAa,QAAQ,KAAK,SAAQ,MAAO,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;EAGnH,KAAA,SAA0B,eAAwB,KAAK,SAAQ,KAAM,KAAK,YAAW,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;EAE3F,KAAA,QAAuC,MAAM,SAA4B,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAEzE,KAAA,QAA6B,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAErD,KAAA,cAAmC,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EAE3D,KAAA,UAA4C,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAEjF,KAAA,WAA4D,MAAM,SAAQ;GAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;GACtF,WAAW;EAAgB,CAAA;EAGf,KAAA,kBAAmE,MAA6B,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,kBAAA,+BAAA,CAAA;GACjH,WAAW;EAAgB,CAAA;EAGf,KAAA,cAA+D,MAA6B,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,cAAA,+BAAA,CAAA;GAC7G,WAAW;EAAgB,CAAA;EAGf,KAAA,WAA6C,MAA2B,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEvF,KAAA,gBAAqC,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;EAErD,KAAA,WAAgC,MAAc,KAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEnD,KAAA,cAAmD,OAAM;EAEzD,KAAA,gBAA0C,OAAM;EAEhD,KAAA,YAAsC,OAAM;EA8BxD,QAAQ,cAAkD;GACtD,IAAI,CAAC,KAAK,SAAQ,KAAM,KAAK,SAAQ,KAAM,KAAK,SAAQ,MAAO,MAC3D;GAGJ,IAAI,KAAK,OAAM,GACX,KAAK,YAAW;QAEhB,KAAK,YAAW;GAGpB,gBAAsB,aAAa,KAAK,UAAU,CAAC;EACvD,CAAC;EAGD,aAAkB;GACd,IAAI,KAAK,SAAQ,KAAM,KAAK,MAAK,CAAE,CAAC,aAAa,MAC7C,KAAK,aAAa,UAAU;EAEpC,CAAC;CACL;CAEO,kBAAe;EAClB,KAAK,mBAAmB,KAAK,SAAQ,KAAM;EAE3C,MAAM,SAAiB,KAAK,MAAM,cAAc,sBAAqB,CAAE,CAAC;EACxE,KAAK,eAAe,IAAI,MAAM;EAC9B,KAAK,YAAY,KAAK;GAAE,SAAS,KAAK,MAAK,CAAE,CAAC;GAAI;EAAM,CAAE;EAE1D,KAAK,SAAS,IAAI,IAAI;CAC1B;CAEO,cAAW;EACd,aAAa,KAAK,UAAU;EAC5B,aAAa,KAAK,iBAAiB;CACvC;CAEU,WAAQ;EACd,KAAK,MAAK,CAAE,CAAC,QAAQ,QAAO;EAC5B,KAAK,aAAa,IAAI;CAC1B;CAEU,oBAAiB;EACvB,KAAK,MAAK,CAAE,CAAC,iBAAiB,QAAO;EACrC,KAAK,aAAa,IAAI;CAC1B;CAEU,UAAO;EACb,KAAK,aAAa,OAAO;CAC7B;CAGA,aAAa,QAA0C;EACnD,IAAI,KAAK,SAAQ,GACb;EAGJ,KAAK,SAAS,IAAI,IAAI;EAEtB,IAAI,WAAW,MACX,KAAK,MAAK,CAAE,CAAC,YAAY,MAAM;EAGnC,KAAK,oBAAoB,IAAI,KAAK,QAAO,CAAE;EAC3C,KAAK,cAAc,KAAK,KAAK,MAAK,CAAE,CAAC,EAAE;EAEvC,KAAK,oBAAoB,iBAAuB,KAAK,UAAU,KAAK,KAAK,MAAK,CAAE,CAAC,EAAE,GAAG,gBAAgB;CAC1G;CAEA,cAAW;EACP,KAAK,uBAAuB,KAAK,IAAG;EACpC,KAAK,aAAa,iBAAuB,KAAK,aAAa,SAAS,GAAG,KAAK,gBAAgB;CAChG;CAEA,cAAW;EACP,IAAI,KAAK,sBAAsB,KAAK,sBAAsB;GACtD,MAAM,YAAoB,KAAK,IAAG,IAAK,KAAK;GAC5C,KAAK,mBAAmB,KAAK,mBAAmB;EACpD;EAEA,KAAK,sBAAsB,KAAK,IAAG;CACvC;CAzMS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAhB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAgB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,OAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,OAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,aAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,SAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,UAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,iBAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,aAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,UAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,eAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,UAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,SAAA;IAAA,aAAA;IAAA,eAAA;IAAA,WAAA;GAAA;GAAA,MAAA;IAAA,YAAA;KAAA,QAAA;KAAA,eAAA;IAAA;IAAA,YAAA;KAAA,SAAA;KAAA,SAAA;IAAA;IAAA,gBAAA;GAAA;GAAA,UAAA;GAAA,UCnD7B;GA+CA,QAAA,CAAA,0uLAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDHc;KAAiB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAc,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAa,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AAOzF,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAb5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,iBAGH,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B;IAAC;IAAmB;IAAiB;IAAuB;IAAgB;GAAa;GAAC,MAC7F;IACF,OAAOA;IACP,MAAM;IACN,eAAe;GAClB;GAAA,UAAA;GAAA,QAAA,CAAA,0uLAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8FA,MAAA;GAAY,MAAA,CAAA,OAAO;;;GAenB,MAAA;GAAY,MAAA,CAAA,OAAO;;;;AErIxB,MAAM,YAAoB;AAE1B,MAAM,sBAA8B;AAEpC,MAAM,yBAAiC;AAoBvC,IAAa,qBAAb,MAAa,mBAAkB;CAClB;CAIT;CA0CA,IACW,sBAAmB;EAC1B,OAAO;IACF,GAAG,UAAS,OAAQ,KAAK,UAAS,MAAO;IACzC,GAAG,UAAS,OAAQ,KAAK,UAAS,MAAO;EAC7C;CACL;CAEA,IACW,kBAAe;EACtB,OAAO;GACH,wBAAwB,GAAG,KAAK,QAAO,CAAE,CAAC,EAAE,EAAE,UAAU,EAAC;GACzD,SAAS;EACZ;CACL;CAEA,cAAA;EA9DS,KAAA,mBAAoC,OAAO,eAAe;EAEhD,KAAA,YAA4B,WAAW,iBAAiB;EAE3E,KAAA,gBAAwB;EAEL,KAAA,SAA6C,OAA2B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;EAE3E,KAAA,UAA+C,OAA4B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAE9E,KAAA,WAAoC,aAAY;GAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;GAC/D,QAAQ,KAAK;GACb,cAAc,WAAwC,OAAO,SAAS;EAAC,CAAA;EAGxD,KAAA,cAAuC,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EAE7D,KAAA,YAA0C,eACzD,KAAK,SAAQ,CAAE,CAAC,WAAW,KAAK,IAAI,QAAQ,UAC/C,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAEkB,KAAA,YAA0C,eAAoC;GAC7F,IAAI,KAAK,SAAQ,CAAE,CAAC,SAAS,MAAM,GAC/B,OAAO;GAEX,OAAO,KAAK,SAAQ,CAAE,CAAC,SAAS,QAAQ,IAAI,WAAW;EAC3D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAEc,KAAA,WAA6C,MAA2B,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEvF,KAAA,WAA8D,MAA+B,qBAAmB;GAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;GAC5H,WAAW;EAAe,CAAA;EAGd,KAAA,gBAAmE,MAC/E,wBAAsB;GAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;GACpB,WAAW;EAAe,CAAA;EAIhB,KAAA,OAAqC,MAAuB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EAEpE,KAAA,SAA8D,MAAiC,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;GAChH,WAAW;EAAgB,CAAA;EAoB3B,KAAK,iBACA,OAAM,CAAE,CACR,KAAK,mBAAkB,CAAE,CAAC,CAC1B,WAAW,UAAqC,KAAK,UAAU,KAAK,CAAC;CAC9E;CAEU,eAAY;EAClB,IAAI,KAAK,OAAM,CAAE,CAAC,SAAS,GACvB,KAAK,SAAS,IAAI,IAAI;CAE9B;CAEU,eAAY;EAClB,IAAI,CAAC,KAAK,YAAW,GACjB,KAAK,SAAS,IAAI,KAAK;CAE/B;CAEU,qBAAkB;EACxB,KAAK,YAAY,IAAI,IAAI;CAC7B;CAEU,mBAAgB;EACtB,KAAK,YAAY,IAAI,KAAK;CAC9B;CAEU,cAAc,QAAyB;EAC7C,KAAK,QAAQ,QAAQ,UACjB,KAAK,aAAa,CAAC,QAAQ,GAAG,MAAM,QAAQ,SAAqC,KAAK,YAAY,OAAO,OAAO,CAAC,CAAC,CAAC;CAE3H;CAEU,gBAAgB,SAAe;EACrC,KAAK,QAAQ,QAAQ,UACjB,MAAM,QAAQ,SAAqC,KAAK,YAAY,OAAO,CAAC;CAEpF;CAEU,YAAY,SAAe;EACjC,KAAK,gBAAgB,OAAO;EAC5B,KAAK,OAAO,QAAQ,UAChB,MAAM,QAAQ,SAAoC,KAAK,OAAO,OAAO,CAAC;CAE9E;CAEA,UAAU,OAA0B;EAChC,KAAK,iBAAiB;EACtB,MAAM,QAA0B;GAC5B,IAAI,KAAK;GACT,UAAU,MAAM,QAAQ;GACxB,SAAS,MAAM,QAAQ;GACvB,aAAa,MAAM,QAAQ;GAC3B,MAAM,MAAM,QAAQ;GACpB,QAAQ,MAAM,QAAQ;GACtB,iBAAiB,MAAM,QAAQ;GAC/B,QAAQ,MAAM,QAAQ;GACtB,UAAU,MAAM,QAAQ;GACxB,UAAU,MAAM,QAAQ;GACxB,MAAM,MAAM,QAAQ;GACpB,WAAW,MAAM,QAAQ;EAC5B;EACD,KAAK,OAAO,QAAQ,UAAkD,CAClE,OACA,GAAI,KAAK,KAAI,MAAO,YAAY,MAAM,KAAK,SAA6C,KAAK,UAAU,IAAI,CAAC,IAAI,KACnH,CAAA;CACL;CAEA,UAAU,OAAuB;EAC7B,OAAO,MAAM,WAAW,QAAQ;GAAE,GAAG;GAAO,UAAU;EAAI;CAC9D;CAEA,aAAa,OAA0B;EACnC,MAAM,QAAkB,KAAK,OAAM,CAAE,CAAC,KAAK,UAAoC,MAAM,EAAE;EACvF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,MACb,MAAyB,UAAqC,MAAM,QAAQ,KAAK,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;CAEjI;CA5IS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAkB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAlB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAkB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,UAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,UAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,eAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,MAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,QAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,MAAA;IAAA,YAAA,EAAA,QAAA,SAAA;IAAA,WAAA;KAAA,cAAA;KAAA,aAAA;KAAA,cAAA;KAAA,eAAA;KAAA,aAAA;IAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,SAAA;KAAA,SAAA;IAAA;IAAA,gBAAA;GAAA;GAAA,UAAA;GAAA,UCjD/B;GAiBA,QAAA,CAAA,myBAAA;GAAA,cAAA,CAAA;IAAA,MAAA;IAAA,MDoBc;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;IAAA;GAAA,CAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AAYjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAlB9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,iBAGL,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B,CAAC,gBAAgB;GAAC,MACrB;IACF,OAAO;IACP,MAAM;IACN,qBAAqB;IACrB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;GAClB;GAAA,UAAA;GAAA,QAAA,CAAA,myBAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDA,MAAA;GAAY,MAAA,CAAA,OAAO;;;GAQnB,MAAA;GAAY,MAAA,CAAA,OAAO"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","names":["BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.model.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.html","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.html"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\n\nimport { INotification, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\nexport const RT_TOASTER_GAP_PX: number = 14;\n\n/**\n * Значки severity у тоста. Приложение подменяет карту целиком — например, на имена\n * Material, — а тост со своим `icon` берёт свой значок мимо карты.\n */\nexport const RT_TOAST_SEVERITY_ICONS: InjectionToken<Readonly<Record<INotification.Severity, IRtIcon.Name>>> = new InjectionToken<\n Readonly<Record<INotification.Severity, IRtIcon.Name>>\n>('RT_TOAST_SEVERITY_ICONS', {\n providedIn: 'root',\n factory: (): Readonly<Record<INotification.Severity, IRtIcon.Name>> => ({\n info: 'info-circle',\n success: 'check-circle',\n warning: 'exclamation-circle',\n danger: 'times-circle',\n }),\n});\n\n/** Данные своего компонента тоста — то, что приложение передало в `openFromComponent`. */\nexport const RT_TOAST_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_TOAST_DATA');\n\nexport namespace IRtToaster {\n export type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\n export type PositionY = 'top' | 'bottom';\n\n export type PositionX = 'left' | 'center' | 'right';\n\n /** `stack` копит тосты стопкой; `replace` — новый тост уводит прежние. */\n export type Mode = 'stack' | 'replace';\n\n export interface Toast {\n readonly id: number;\n readonly severity: INotification.Severity;\n readonly message: string;\n readonly description?: string;\n readonly meta?: string;\n readonly action?: INotification.Action;\n readonly secondaryAction?: INotification.Action;\n readonly filled?: boolean;\n readonly duration?: number | null;\n readonly progress?: boolean;\n readonly icon?: IRtIcon.Name | null;\n readonly onDismiss?: (reason: INotification.DismissReason) => void;\n /** Тост вытеснен новым в режиме `replace` и уходит своей анимацией. */\n readonly replaced?: boolean;\n readonly progressValue?: number | null;\n readonly details?: string;\n readonly component?: Type<unknown>;\n readonly data?: unknown;\n /** Голый тост: оболочки нет, свой компонент рисует карточку сам. */\n readonly bare?: boolean;\n /** Ручка тоста: тост сообщает ей, почему ушёл. */\n readonly ref?: NotificationRef;\n /** Приложение закрыло тост ручкой: он уходит своей анимацией, как вытесненный. */\n readonly dismissRequested?: boolean;\n }\n\n /** Изменение показанного тоста от его ручки. */\n export interface Change {\n readonly toastId: number;\n readonly patch: INotification.Update & Pick<Toast, 'dismissRequested'>;\n }\n\n export interface Height {\n readonly toastId: number;\n readonly height: number;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgComponentOutlet } from '@angular/common';\nimport {\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostBinding,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCopyValueComponent } from '@rt-tools/ui-kit-v2/copy-value';\nimport { RtProgressBarComponent } from '@rt-tools/ui-kit-v2/progress-bar';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RT_TOAST_DATA, RT_TOAST_SEVERITY_ICONS, RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\n/** Что нужно своему компоненту тоста: данные и ручка. Меняются они реже прочих полей тоста. */\ninterface IToastComponentInputs {\n readonly data: unknown;\n readonly ref: NotificationRef | undefined;\n}\n\nconst BEM_BLOCK: string = 'rt-toast';\n\nconst UNMOUNT_DELAY_MS: number = 200;\n\n@Component({\n selector: 'rt-toast',\n templateUrl: './rt-toast.component.html',\n styleUrl: './rt-toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgComponentOutlet,\n RtButtonDirective,\n RtCopyValueComponent,\n RtIconComponent,\n RtIconButtonComponent,\n RtProgressBarComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-atomic': 'true',\n },\n})\nexport class RtToastComponent implements AfterViewInit, OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #injector: Injector = inject(Injector);\n\n /**\n * Данные и ручка своего компонента — отдельным сигналом с равенством по ним: живая доля\n * меняет тост на каждом тике, и без этого компонент создавался бы заново вместе с инжектором.\n */\n readonly #componentInputs: Signal<IToastComponentInputs> = computed(\n (): IToastComponentInputs => ({ data: this.toast().data, ref: this.toast().ref }),\n {\n equal: (left: IToastComponentInputs, right: IToastComponentInputs): boolean =>\n left.data === right.data && left.ref === right.ref,\n }\n );\n\n readonly #severityIcons: Readonly<Record<INotification.Severity, IRtIcon.Name>> = inject(RT_TOAST_SEVERITY_ICONS);\n\n readonly #mounted: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #removed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #offsetBeforeRemove: WritableSignal<number> = signal<number>(0);\n\n readonly #initialHeight: WritableSignal<number> = signal<number>(0);\n\n readonly #heightIndex: Signal<number> = computed((): number =>\n this.heights().findIndex((item: IRtToaster.Height): boolean => item.toastId === this.toast().id)\n );\n\n readonly #heightBefore: Signal<number> = computed((): number =>\n this.heights().reduce(\n (total: number, item: IRtToaster.Height, itemIndex: number): number =>\n itemIndex >= this.#heightIndex() ? total : total + item.height,\n 0\n )\n );\n\n readonly #offset: Signal<number> = computed((): number => Math.round(this.#heightIndex() * RT_TOASTER_GAP_PX + this.#heightBefore()));\n\n readonly #positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n #timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #unmountTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #remainingTimeMs: number = 0;\n\n #closeTimerStartedAt: number = 0;\n\n #closeTimerPausedAt: number = 0;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n /** Свой значок тоста важнее карты severity; `null` у тоста значок снимает. */\n protected readonly icon: Signal<IRtIcon.Name | null> = computed((): IRtIcon.Name | null => {\n const icon: IRtIcon.Name | null | undefined = this.toast().icon;\n return icon === undefined ? this.#severityIcons[this.toast().severity] : icon;\n });\n\n /** Срок жизни тоста: свой, если задан, иначе тостера; `null` — таймера нет. */\n protected readonly lifetime: Signal<number | null> = computed((): number | null => {\n const duration: number | null | undefined = this.toast().duration;\n return duration === undefined ? this.duration() : duration;\n });\n\n /** Инжектор своего компонента: данные токеном `RT_TOAST_DATA` и ручка `NotificationRef`. */\n protected readonly componentInjector: Signal<Injector> = computed((): Injector => {\n const inputs: IToastComponentInputs = this.#componentInputs();\n\n return Injector.create({\n providers: [\n { provide: RT_TOAST_DATA, useValue: inputs.data },\n { provide: NotificationRef, useValue: inputs.ref ?? null },\n ],\n parent: this.#injector,\n });\n });\n\n /** Живая доля задачи: число 0–100 — полоса стоит, `null` и пусто — её нет. */\n protected readonly progressValue: Signal<number | null> = computed((): number | null => this.toast().progressValue ?? null);\n\n /** Подробности раскрыты. */\n protected readonly detailsOpen: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Голый тост: значка, крестика и полосы срока нет, оболочку снимает модификатор. */\n protected readonly bare: Signal<boolean> = computed((): boolean => this.toast().bare === true);\n\n protected readonly showProgress: Signal<boolean> = computed(\n (): boolean => !this.bare() && this.toast().progress === true && this.lifetime() !== null\n );\n\n /** Таймер и полоса срока встают от одного признака, чтобы не разойтись. */\n protected readonly paused: Signal<boolean> = computed((): boolean => this.expanded() || this.interacting());\n\n public readonly toast: InputSignal<IRtToaster.Toast> = input.required<IRtToaster.Toast>();\n\n public readonly index: InputSignal<number> = input.required<number>();\n\n public readonly totalToasts: InputSignal<number> = input.required<number>();\n\n public readonly heights: InputSignal<IRtToaster.Height[]> = input.required<IRtToaster.Height[]>();\n\n public readonly expanded: InputSignalWithTransform<boolean, BooleanInput> = input.required<boolean, BooleanInput>({\n transform: booleanAttribute,\n });\n\n public readonly expandByDefault: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly interacting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly visibleToasts: InputSignal<number> = input<number>(3);\n\n public readonly duration: InputSignal<number> = input<number>(4000);\n\n public readonly heightAdded: OutputEmitterRef<IRtToaster.Height> = output<IRtToaster.Height>();\n\n public readonly heightRemoved: OutputEmitterRef<number> = output<number>();\n\n public readonly dismissed: OutputEmitterRef<number> = output<number>();\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--severity--${this.toast().severity}`]: true,\n [`${BEM_BLOCK}--filled`]: this.toast().filled === true,\n [`${BEM_BLOCK}--bare`]: this.bare(),\n [`${BEM_BLOCK}--y--${this.#positionY()}`]: true,\n [`${BEM_BLOCK}--mounted`]: this.#mounted(),\n [`${BEM_BLOCK}--removed`]: this.#removed(),\n [`${BEM_BLOCK}--front`]: this.index() === 0,\n [`${BEM_BLOCK}--hidden`]: this.index() + 1 > this.visibleToasts(),\n [`${BEM_BLOCK}--expanded`]: this.expanded() || (this.expandByDefault() && this.#mounted()),\n [`${BEM_BLOCK}--paused`]: this.paused(),\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--index': `${this.index()}`,\n '--toasts-before': `${this.index()}`,\n '--z-index': `${this.totalToasts() - this.index()}`,\n '--offset': `${this.#removed() ? this.#offsetBeforeRemove() : this.#offset()}px`,\n '--initial-height': this.expandByDefault() ? 'auto' : `${this.#initialHeight()}px`,\n '--lifetime': `${this.lifetime() ?? 0}ms`,\n };\n }\n\n constructor() {\n effect((onCleanup: (cleanup: () => void) => void): void => {\n if (!this.#mounted() || this.#removed() || this.lifetime() === null) {\n return;\n }\n\n if (this.paused()) {\n this.#pauseTimer();\n } else {\n this.#startTimer();\n }\n\n onCleanup((): void => clearTimeout(this.#timeoutId));\n });\n\n // Вытесненный в режиме `replace` уходит тем же путём, что и закрытый крестиком.\n effect((): void => {\n if (this.#mounted() && this.toast().replaced === true) {\n this.#deleteToast('replaced');\n }\n });\n\n // Закрытый ручкой приложения — тоже.\n effect((): void => {\n if (this.#mounted() && this.toast().dismissRequested === true) {\n this.#deleteToast('dismiss');\n }\n });\n\n // Новый текст, доля или раскрытые подробности меняют высоту: стопка пересчитывает сдвиги.\n effect((): void => {\n const toast: IRtToaster.Toast = this.toast();\n this.detailsOpen();\n if (!this.#mounted() || toast.replaced === true) {\n return;\n }\n afterNextRender((): void => this.#remeasure(), { injector: this.#injector });\n });\n }\n\n public ngAfterViewInit(): void {\n this.#remainingTimeMs = this.lifetime() ?? 0;\n\n const height: number = this.#host.nativeElement.getBoundingClientRect().height;\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n\n this.#mounted.set(true);\n }\n\n public ngOnDestroy(): void {\n clearTimeout(this.#timeoutId);\n clearTimeout(this.#unmountTimeoutId);\n // Тост ушёл не своим путём — вместе с тостером. Ушедший своим путём ручку уже закрыл, и\n // повторная отметка ничего не делает.\n this.toast().ref?.markClosed('destroyed');\n }\n\n protected onAction(): void {\n this.toast().action?.handler();\n this.#deleteToast(null);\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast(null);\n }\n\n protected onClose(): void {\n this.#deleteToast('close');\n }\n\n protected toggleDetails(): void {\n this.detailsOpen.update((open: boolean): boolean => !open);\n }\n\n /**\n * Уход тоста. Причину получает ручка; колбэк приложения — только уход без действия и без\n * `dismiss()`: действие уже вызвало свой обработчик, а закрыло тост само приложение.\n */\n #deleteToast(reason: INotification.CloseReason | null): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\n\n if (reason !== null && reason !== 'action' && reason !== 'dismiss' && reason !== 'destroyed') {\n this.toast().onDismiss?.(reason);\n }\n\n this.toast().ref?.markClosed(reason ?? 'action');\n\n this.#offsetBeforeRemove.set(this.#offset());\n this.heightRemoved.emit(this.toast().id);\n\n this.#unmountTimeoutId = setTimeout((): void => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);\n }\n\n /** Высота по содержимому: своя высота стопки на время замера снимается. */\n #remeasure(): void {\n if (this.#removed()) {\n return;\n }\n\n const host: HTMLElement = this.#host.nativeElement;\n host.style.height = 'auto';\n const height: number = host.offsetHeight;\n host.style.height = '';\n\n if (height !== this.#initialHeight()) {\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n }\n }\n\n #startTimer(): void {\n this.#closeTimerStartedAt = Date.now();\n this.#timeoutId = setTimeout((): void => this.#deleteToast('timeout'), this.#remainingTimeMs);\n }\n\n #pauseTimer(): void {\n if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {\n const elapsedMs: number = Date.now() - this.#closeTimerStartedAt;\n this.#remainingTimeMs = this.#remainingTimeMs - elapsedMs;\n }\n\n this.#closeTimerPausedAt = Date.now();\n }\n}\n","<ng-container rtBlock=\"rt-toast\">\n @if (!bare() && icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n @if (toast().component; as component) {\n <!-- Свой компонент встаёт на место сообщения; сообщение остаётся именем для чтения с экрана. -->\n @if (toast().message) {\n <span rtElem=\"sr-message\">{{ toast().message }}</span>\n }\n <div rtElem=\"custom\" qa-dataid=\"toast-custom\">\n <ng-container [ngComponentOutlet]=\"component\" [ngComponentOutletInjector]=\"componentInjector()\" />\n </div>\n } @else {\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n }\n @if (progressValue() !== null) {\n <rt-progress-bar rtElem=\"value\" qa-dataid=\"toast-progress-value\" [value]=\"progressValue() ?? 0\" [ariaLabel]=\"toast().message\" />\n }\n @if (toast().details; as details) {\n <button\n rtButton\n rtElem=\"details-toggle\"\n qa-dataid=\"toast-details-toggle\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n [attr.aria-expanded]=\"detailsOpen()\"\n (click)=\"toggleDetails()\">\n {{ detailsOpen() ? t().uiHide : t().uiDetails }}\n </button>\n @if (detailsOpen()) {\n <rt-copy-value rtElem=\"details\" qa-dataid=\"toast-details\" wrap [value]=\"details\" />\n }\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (!bare()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, filter, map, merge, mergeMap, Observable } from 'rxjs';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationBus, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtToastComponent } from './rt-toast.component';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toaster';\n\nconst DEFAULT_DURATION_MS: number = 4000;\n\nconst DEFAULT_VISIBLE_TOASTS: number = 3;\n\n/** Канал события без своего `channel` и тостера без входа: один тостер по-прежнему получает всё. */\nconst DEFAULT_CHANNEL: string = 'default';\n\n@Component({\n selector: 'rt-toaster',\n templateUrl: './rt-toaster.component.html',\n styleUrl: './rt-toaster.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtToastComponent],\n host: {\n class: BEM_BLOCK,\n role: 'region',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'onStackEnter()',\n '(mousemove)': 'onStackEnter()',\n '(mouseleave)': 'onStackLeave()',\n '(pointerdown)': 'onStackPointerDown()',\n '(pointerup)': 'onStackPointerUp()',\n },\n})\nexport class RtToasterComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n protected readonly ariaLabel: Signal<string> = rtKitLabel('uiNotifications');\n\n #toastCounter: number = 0;\n\n protected readonly toasts: WritableSignal<IRtToaster.Toast[]> = signal<IRtToaster.Toast[]>([]);\n\n protected readonly heights: WritableSignal<IRtToaster.Height[]> = signal<IRtToaster.Height[]>([]);\n\n protected readonly expanded: WritableSignal<boolean> = linkedSignal<IRtToaster.Toast[], boolean>({\n source: this.toasts,\n computation: (toasts: IRtToaster.Toast[]): boolean => toasts.length < 1,\n });\n\n protected readonly interacting: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n protected readonly positionX: Signal<IRtToaster.PositionX> = computed((): IRtToaster.PositionX => {\n if (this.position().endsWith('left')) {\n return 'left';\n }\n return this.position().endsWith('center') ? 'center' : 'right';\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly duration: InputSignalWithTransform<number, number | string> = input<number, number | string>(DEFAULT_DURATION_MS, {\n transform: numberAttribute,\n });\n\n public readonly visibleToasts: InputSignalWithTransform<number, number | string> = input<number, number | string>(\n DEFAULT_VISIBLE_TOASTS,\n { transform: numberAttribute }\n );\n\n /** `replace` — новый тост уводит прежние их же анимацией ухода, а не копится стопкой. */\n public readonly mode: InputSignal<IRtToaster.Mode> = input<IRtToaster.Mode>('stack');\n\n public readonly expand: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Канал тостера: он показывает только события с этим `channel`. Второй тостер со своим каналом\n * держит закреплённые тосты в своём углу и своей стопке.\n */\n public readonly channel: InputSignal<string> = input<string>(DEFAULT_CHANNEL);\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--y--${this.positionY()}`]: true,\n [`${BEM_BLOCK}--x--${this.positionX()}`]: true,\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--front-toast-height': `${this.heights()[0]?.height ?? 0}px`,\n '--gap': `${RT_TOASTER_GAP_PX}px`,\n };\n }\n\n constructor() {\n // Ручка тоста слушается до его ухода: `markClosed` завершает её потоки, и подписка уходит сама.\n this.#notificationBus\n .onEmit()\n .pipe(\n filter((event: INotification.Event): boolean => (event.payload.channel ?? DEFAULT_CHANNEL) === this.channel()),\n map((event: INotification.Event): IRtToaster.Toast => this.#addToast(event)),\n mergeMap((toast: IRtToaster.Toast): Observable<IRtToaster.Change> => this.#changesOf(toast)),\n takeUntilDestroyed()\n )\n .subscribe((change: IRtToaster.Change): void => this.#applyChange(change));\n }\n\n protected onStackEnter(): void {\n if (this.toasts().length > 0) {\n this.expanded.set(true);\n }\n }\n\n protected onStackLeave(): void {\n if (!this.interacting()) {\n this.expanded.set(false);\n }\n }\n\n protected onStackPointerDown(): void {\n this.interacting.set(true);\n }\n\n protected onStackPointerUp(): void {\n this.interacting.set(false);\n }\n\n protected onHeightAdded(height: IRtToaster.Height): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n this.#sortHeights([height, ...items.filter((item: IRtToaster.Height): boolean => item.toastId !== height.toastId)])\n );\n }\n\n protected onHeightRemoved(toastId: number): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n items.filter((item: IRtToaster.Height): boolean => item.toastId !== toastId)\n );\n }\n\n protected onDismissed(toastId: number): void {\n this.onHeightRemoved(toastId);\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.filter((item: IRtToaster.Toast): boolean => item.id !== toastId)\n );\n }\n\n #addToast(event: INotification.Event): IRtToaster.Toast {\n this.#toastCounter += 1;\n const toast: IRtToaster.Toast = {\n id: this.#toastCounter,\n severity: event.payload.severity,\n message: event.payload.message,\n description: event.payload.description,\n meta: event.payload.meta,\n action: event.payload.action,\n secondaryAction: event.payload.secondaryAction,\n filled: event.payload.filled,\n duration: event.payload.duration,\n progress: event.payload.progress,\n icon: event.payload.icon,\n onDismiss: event.payload.onDismiss,\n progressValue: event.payload.progressValue,\n details: event.payload.details,\n component: event.payload.component,\n data: event.payload.data,\n bare: event.payload.bare,\n ref: event.ref instanceof NotificationRef ? event.ref : undefined,\n };\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] => [\n toast,\n ...(this.mode() === 'replace' ? items.map((item: IRtToaster.Toast): IRtToaster.Toast => this.#replaced(item)) : items),\n ]);\n\n return toast;\n }\n\n /** Изменения тоста от его ручки: обновление полей и просьба закрыть. Без ручки — ничего. */\n #changesOf(toast: IRtToaster.Toast): Observable<IRtToaster.Change> {\n const ref: NotificationRef | undefined = toast.ref;\n\n if (ref === undefined) {\n return EMPTY;\n }\n\n return merge(\n ref.onUpdate().pipe(map((patch: INotification.Update): IRtToaster.Change => ({ toastId: toast.id, patch }))),\n ref.onDismissRequest().pipe(map((): IRtToaster.Change => ({ toastId: toast.id, patch: { dismissRequested: true } })))\n );\n }\n\n #applyChange(change: IRtToaster.Change): void {\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.map((item: IRtToaster.Toast): IRtToaster.Toast => (item.id === change.toastId ? { ...item, ...change.patch } : item))\n );\n }\n\n #replaced(toast: IRtToaster.Toast): IRtToaster.Toast {\n return toast.replaced ? toast : { ...toast, replaced: true };\n }\n\n #sortHeights(items: IRtToaster.Height[]): IRtToaster.Height[] {\n const order: number[] = this.toasts().map((toast: IRtToaster.Toast): number => toast.id);\n return [...items].sort(\n (left: IRtToaster.Height, right: IRtToaster.Height): number => order.indexOf(left.toastId) - order.indexOf(right.toastId)\n );\n }\n}\n","@for (item of toasts(); track item.id) {\n <rt-toast\n qa-dataid=\"toast\"\n [toast]=\"item\"\n [index]=\"$index\"\n [totalToasts]=\"toasts().length\"\n [heights]=\"heights()\"\n [expanded]=\"expanded()\"\n [expandByDefault]=\"expand()\"\n [interacting]=\"interacting()\"\n [position]=\"position()\"\n [visibleToasts]=\"visibleToasts()\"\n [duration]=\"duration()\"\n (heightAdded)=\"onHeightAdded($event)\"\n (heightRemoved)=\"onHeightRemoved($event)\"\n (dismissed)=\"onDismissed($event)\" />\n}\n"],"mappings":"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"}
@@ -1,29 +1,93 @@
1
+ import { NgTemplateOutlet } from "@angular/common";
1
2
  import * as i0 from "@angular/core";
2
- import { ChangeDetectionStrategy, Component, ViewEncapsulation, booleanAttribute, computed, input, output } from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, Directive, TemplateRef, ViewEncapsulation, booleanAttribute, computed, contentChild, forwardRef, inject, input, output, signal } from "@angular/core";
4
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
5
  import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
4
6
  import { RtIconComponent } from "@rt-tools/ui-kit-v2/icon";
5
7
  import * as i1 from "@rt-tools/ui-kit-v2/radius";
6
8
  import { RtRadiusDirective } from "@rt-tools/ui-kit-v2/radius";
7
9
  import { RtTooltipDirective } from "@rt-tools/ui-kit-v2/tooltip";
10
+ var RtToggleButtonOptionDirective = class RtToggleButtonOptionDirective {
11
+ constructor() {
12
+ this.templateRef = inject(TemplateRef);
13
+ }
14
+ static {
15
+ this.ɵfac = i0.ɵɵngDeclareFactory({
16
+ minVersion: "12.0.0",
17
+ version: "22.2.2",
18
+ ngImport: i0,
19
+ type: RtToggleButtonOptionDirective,
20
+ deps: [],
21
+ target: i0.ɵɵFactoryTarget.Directive
22
+ });
23
+ }
24
+ static {
25
+ this.ɵdir = i0.ɵɵngDeclareDirective({
26
+ minVersion: "14.0.0",
27
+ version: "22.2.2",
28
+ type: RtToggleButtonOptionDirective,
29
+ isStandalone: true,
30
+ selector: "[rtToggleButtonOption]",
31
+ ngImport: i0
32
+ });
33
+ }
34
+ };
35
+ i0.ɵɵngDeclareClassMetadata({
36
+ minVersion: "12.0.0",
37
+ version: "22.2.2",
38
+ ngImport: i0,
39
+ type: RtToggleButtonOptionDirective,
40
+ decorators: [{
41
+ type: Directive,
42
+ args: [{ selector: "[rtToggleButtonOption]" }]
43
+ }]
44
+ });
8
45
  const BEM_BLOCK = "rt-toggle-button-group";
9
46
  const ICON_SIZE_BY_SIZE = Object.freeze({
10
47
  sm: "xs",
11
48
  md: "sm",
12
49
  lg: "sm"
13
50
  });
51
+ function isMany(value) {
52
+ return Array.isArray(value);
53
+ }
14
54
  var RtToggleButtonGroupComponent = class RtToggleButtonGroupComponent {
15
55
  constructor() {
56
+ this.#onChange = () => void 0;
57
+ this.#onTouched = () => void 0;
58
+ this.#bound = false;
59
+ this.#formValue = signal(void 0, ...ngDevMode ? [{ debugName: "#formValue" }] : /* istanbul ignore next */ []);
60
+ this.#disabledByForm = signal(false, ...ngDevMode ? [{ debugName: "#disabledByForm" }] : /* istanbul ignore next */ []);
61
+ this.#single = computed(() => {
62
+ const written = this.#formValue();
63
+ if (written === void 0) return this.value();
64
+ return isMany(written.value) ? void 0 : written.value ?? void 0;
65
+ }, ...ngDevMode ? [{ debugName: "#single" }] : /* istanbul ignore next */ []);
66
+ this.#many = computed(() => {
67
+ const written = this.#formValue();
68
+ if (written === void 0) return this.values();
69
+ return isMany(written.value) ? written.value : [];
70
+ }, ...ngDevMode ? [{ debugName: "#many" }] : /* istanbul ignore next */ []);
71
+ this.isDisabled = computed(() => this.disabled() || this.#disabledByForm(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
72
+ this.optionTpl = contentChild(RtToggleButtonOptionDirective, ...ngDevMode ? [{ debugName: "optionTpl" }] : /* istanbul ignore next */ []);
16
73
  this.iconSize = computed(() => ICON_SIZE_BY_SIZE[this.size()], ...ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []);
17
74
  this.items = computed(() => {
18
75
  const multiple = this.multiple();
19
- const chosen = this.values();
20
- const single = this.value();
21
- const groupDisabled = this.disabled();
22
- return this.options().map((option) => ({
23
- option,
24
- active: multiple ? chosen.includes(option.value) : single === option.value,
25
- disabled: groupDisabled || !!option.disabled
26
- }));
76
+ const chosen = this.#many();
77
+ const single = this.#single();
78
+ const groupDisabled = this.isDisabled();
79
+ return this.options().map((option) => {
80
+ const active = multiple ? chosen.includes(option.value) : single === option.value;
81
+ return {
82
+ option,
83
+ active,
84
+ disabled: groupDisabled || !!option.disabled,
85
+ context: {
86
+ $implicit: option,
87
+ active
88
+ }
89
+ };
90
+ });
27
91
  }, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
28
92
  this.options = input.required(...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
29
93
  this.value = input(void 0, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
@@ -42,20 +106,54 @@ var RtToggleButtonGroupComponent = class RtToggleButtonGroupComponent {
42
106
  ...ngDevMode ? { debugName: "fullWidth" } : /* istanbul ignore next */ {},
43
107
  transform: booleanAttribute
44
108
  });
109
+ this.layout = input("row", ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
110
+ this.appearance = input("segmented", ...ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []);
111
+ this.checkmark = input(false, {
112
+ ...ngDevMode ? { debugName: "checkmark" } : /* istanbul ignore next */ {},
113
+ transform: booleanAttribute
114
+ });
45
115
  this.valueChange = output();
46
116
  this.valuesChange = output();
47
117
  }
118
+ #onChange;
119
+ #onTouched;
120
+ #bound;
121
+ #formValue;
122
+ #disabledByForm;
123
+ #single;
124
+ #many;
125
+ writeValue(value) {
126
+ this.#formValue.set({ value });
127
+ }
128
+ registerOnChange(fn) {
129
+ this.#bound = true;
130
+ this.#onChange = fn;
131
+ }
132
+ registerOnTouched(fn) {
133
+ this.#onTouched = fn;
134
+ }
135
+ setDisabledState(disabled) {
136
+ this.#disabledByForm.set(disabled);
137
+ }
48
138
  onOptionClick(item) {
49
139
  if (item.disabled) return;
50
140
  const option = item.option;
51
141
  if (!this.multiple()) {
142
+ this.#commit(option.value);
52
143
  this.valueChange.emit(option.value);
53
144
  return;
54
145
  }
55
- const chosen = this.values();
146
+ const chosen = this.#many();
56
147
  const next = chosen.includes(option.value) ? chosen.filter((one) => one !== option.value) : [...chosen, option.value];
148
+ this.#commit(next);
57
149
  this.valuesChange.emit(next);
58
150
  }
151
+ #commit(value) {
152
+ if (!this.#bound) return;
153
+ this.#formValue.set({ value });
154
+ this.#onChange(value);
155
+ this.#onTouched();
156
+ }
59
157
  static {
60
158
  this.ɵfac = i0.ɵɵngDeclareFactory({
61
159
  minVersion: "12.0.0",
@@ -129,6 +227,27 @@ var RtToggleButtonGroupComponent = class RtToggleButtonGroupComponent {
129
227
  isSignal: true,
130
228
  isRequired: false,
131
229
  transformFunction: null
230
+ },
231
+ layout: {
232
+ classPropertyName: "layout",
233
+ publicName: "layout",
234
+ isSignal: true,
235
+ isRequired: false,
236
+ transformFunction: null
237
+ },
238
+ appearance: {
239
+ classPropertyName: "appearance",
240
+ publicName: "appearance",
241
+ isSignal: true,
242
+ isRequired: false,
243
+ transformFunction: null
244
+ },
245
+ checkmark: {
246
+ classPropertyName: "checkmark",
247
+ publicName: "checkmark",
248
+ isSignal: true,
249
+ isRequired: false,
250
+ transformFunction: null
132
251
  }
133
252
  },
134
253
  outputs: {
@@ -138,19 +257,44 @@ var RtToggleButtonGroupComponent = class RtToggleButtonGroupComponent {
138
257
  host: {
139
258
  properties: {
140
259
  "class.rt-toggle-button-group--full-width": "fullWidth()",
260
+ "class.rt-toggle-button-group--wrap": "layout() === 'wrap'",
261
+ "class.rt-toggle-button-group--column": "layout() === 'column'",
141
262
  "class.rt-toggle-button-group--md": "size() === 'md'",
142
- "class.rt-toggle-button-group--lg": "size() === 'lg'"
263
+ "class.rt-toggle-button-group--lg": "size() === 'lg'",
264
+ "class.rt-toggle-button-group--chips": "appearance() === 'chips'"
143
265
  },
144
266
  classAttribute: "rt-toggle-button-group"
145
267
  },
268
+ providers: [{
269
+ provide: NG_VALUE_ACCESSOR,
270
+ useExisting: forwardRef(() => RtToggleButtonGroupComponent),
271
+ multi: true
272
+ }],
273
+ queries: [{
274
+ propertyName: "optionTpl",
275
+ first: true,
276
+ predicate: RtToggleButtonOptionDirective,
277
+ descendants: true,
278
+ isSignal: true
279
+ }],
146
280
  hostDirectives: [{
147
281
  directive: i1.RtRadiusDirective,
148
282
  inputs: ["radius", "radius"]
149
283
  }],
150
284
  ngImport: i0,
151
- template: "<div\n rtBlock=\"rt-toggle-button-group\"\n role=\"group\"\n [rtMod]=\"{\n sm: size() === 'sm',\n md: size() === 'md',\n lg: size() === 'lg',\n disabled: disabled(),\n }\"\n [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.option.value) {\n <button\n type=\"button\"\n rtElem=\"button\"\n qa-dataid=\"toggle-button-group-option\"\n [attr.data-value]=\"item.option.value\"\n [rtMod]=\"{\n active: item.active,\n first: $first,\n last: $last,\n }\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.active ? 'true' : 'false'\"\n [rtTooltip]=\"item.option.title ?? ''\"\n (click)=\"onOptionClick(item)\">\n @if (item.option.icon || item.option.glyph) {\n <rt-icon\n rtElem=\"icon\"\n color=\"current\"\n [name]=\"item.option.icon ?? null\"\n [glyph]=\"item.option.glyph ?? null\"\n [size]=\"iconSize()\" />\n }\n <span rtElem=\"label\">{{ item.option.label }}</span>\n </button>\n }\n</div>\n",
152
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);--rt-toggle-button-group-height: 30px;--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);--rt-toggle-button-group-track-padding: 4px;--rt-toggle-button-group-track-radius: var(--rt-radius-md);--rt-toggle-button-group-btn-padding: 0 8px;--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);--rt-toggle-button-group-btn-gap: 4px;--rt-toggle-button-group-btn-font-size: 12px;--rt-toggle-button-group-btn-line-height: 14px;display:inline-flex}rt-toggle-button-group.rt-toggle-button-group--md{--rt-toggle-button-group-height: 40px;--rt-toggle-button-group-btn-padding: 0 14px;--rt-toggle-button-group-btn-gap: 6px;--rt-toggle-button-group-btn-font-size: 14px;--rt-toggle-button-group-btn-line-height: 16px}rt-toggle-button-group.rt-toggle-button-group--lg{--rt-toggle-button-group-height: 50px;--rt-toggle-button-group-btn-padding: 0 20px;--rt-toggle-button-group-btn-gap: 8px;--rt-toggle-button-group-btn-font-size: 16px;--rt-toggle-button-group-btn-line-height: 18px}rt-toggle-button-group .rt-toggle-button-group{display:inline-flex;height:var(--rt-toggle-button-group-height);box-sizing:border-box;align-items:stretch;padding:var(--rt-toggle-button-group-track-padding);border-radius:var(--rt-toggle-button-group-track-radius);background-color:var(--rt-toggle-button-group-track-bg);gap:0}rt-toggle-button-group .rt-toggle-button-group__button{display:inline-flex;align-items:center;justify-content:center;padding:var(--rt-toggle-button-group-btn-padding);border:0;border-radius:var(--rt-toggle-button-group-btn-radius);background-color:transparent;color:var(--rt-color-text-muted);cursor:pointer;font-family:inherit;font-size:var(--rt-toggle-button-group-btn-font-size);font-weight:var(--rt-font-weight-semibold);gap:var(--rt-toggle-button-group-btn-gap);line-height:var(--rt-toggle-button-group-btn-line-height);transition:background-color var(--rt-toggle-button-group-transition-duration) ease,color var(--rt-toggle-button-group-transition-duration) ease}rt-toggle-button-group .rt-toggle-button-group__button:hover:not(:disabled,rt-toggle-button-group .rt-toggle-button-group__button--active){color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button--active{background-color:var(--rt-toggle-button-group-active-bg);color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button:focus-visible{position:relative;z-index:1;box-shadow:var(--rt-toggle-button-group-focus-shadow);outline:2px solid transparent;outline-offset:1px}rt-toggle-button-group .rt-toggle-button-group__button:disabled{cursor:not-allowed}rt-toggle-button-group .rt-toggle-button-group__label{display:inline-block;white-space:nowrap}rt-toggle-button-group .rt-toggle-button-group__icon{flex-shrink:0}rt-toggle-button-group .rt-toggle-button-group--disabled{opacity:.5}rt-toggle-button-group[data-rt-radius=none]{--rt-toggle-button-group-track-radius: var(--rt-radius-none)}rt-toggle-button-group[data-rt-radius=xs]{--rt-toggle-button-group-track-radius: var(--rt-radius-xs)}rt-toggle-button-group[data-rt-radius=sm]{--rt-toggle-button-group-track-radius: var(--rt-radius-sm)}rt-toggle-button-group[data-rt-radius=ms]{--rt-toggle-button-group-track-radius: var(--rt-radius-ms)}rt-toggle-button-group[data-rt-radius=md]{--rt-toggle-button-group-track-radius: var(--rt-radius-md)}rt-toggle-button-group[data-rt-radius=lg]{--rt-toggle-button-group-track-radius: var(--rt-radius-lg)}rt-toggle-button-group[data-rt-radius=xl]{--rt-toggle-button-group-track-radius: var(--rt-radius-xl)}rt-toggle-button-group[data-rt-radius=\"2xl\"]{--rt-toggle-button-group-track-radius: var(--rt-radius-2xl)}rt-toggle-button-group[data-rt-radius=full]{--rt-toggle-button-group-track-radius: var(--rt-radius-full)}rt-toggle-button-group.rt-toggle-button-group--full-width{display:flex;width:100%}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group{display:flex;width:100%;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group .rt-toggle-button-group__button{flex:1 1 0}:root[data-theme=dark] rt-toggle-button-group,html.rt-theme-dark rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-neutral-900)}}\n"],
285
+ template: "<div\n rtBlock=\"rt-toggle-button-group\"\n role=\"group\"\n [rtMod]=\"{\n sm: size() === 'sm',\n md: size() === 'md',\n lg: size() === 'lg',\n disabled: isDisabled(),\n wrap: layout() === 'wrap',\n column: layout() === 'column',\n chips: appearance() === 'chips',\n }\"\n [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.option.value) {\n <button\n type=\"button\"\n rtElem=\"button\"\n qa-dataid=\"toggle-button-group-option\"\n [attr.data-value]=\"item.option.value\"\n [rtMod]=\"{\n active: item.active,\n first: $first,\n last: $last,\n checked: checkmark() && item.active,\n }\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.active ? 'true' : 'false'\"\n [rtTooltip]=\"item.option.title ?? ''\"\n (click)=\"onOptionClick(item)\">\n @if (checkmark() && item.active) {\n <span rtElem=\"check\" aria-hidden=\"true\">\n <svg rtElem=\"check-svg\" viewBox=\"-2 -3 30 30\" focusable=\"false\">\n <path fill=\"none\" stroke=\"currentColor\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\" />\n </svg>\n </span>\n }\n @if (optionTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"item.context\" />\n } @else {\n @if (item.option.icon || item.option.glyph) {\n <rt-icon\n rtElem=\"icon\"\n color=\"current\"\n [name]=\"item.option.icon ?? null\"\n [glyph]=\"item.option.glyph ?? null\"\n [size]=\"iconSize()\" />\n }\n <span rtElem=\"label\">{{ item.option.label }}</span>\n }\n </button>\n }\n</div>\n",
286
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);--rt-toggle-button-group-height: 30px;--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);--rt-toggle-button-group-track-padding: 4px;--rt-toggle-button-group-track-radius: var(--rt-radius-md);--rt-toggle-button-group-btn-padding: 0 8px;--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);--rt-toggle-button-group-btn-gap: 4px;--rt-toggle-button-group-btn-font-size: 12px;--rt-toggle-button-group-btn-line-height: 14px;display:inline-flex}rt-toggle-button-group.rt-toggle-button-group--md{--rt-toggle-button-group-height: 40px;--rt-toggle-button-group-btn-padding: 0 14px;--rt-toggle-button-group-btn-gap: 6px;--rt-toggle-button-group-btn-font-size: 14px;--rt-toggle-button-group-btn-line-height: 16px}rt-toggle-button-group.rt-toggle-button-group--lg{--rt-toggle-button-group-height: 50px;--rt-toggle-button-group-btn-padding: 0 20px;--rt-toggle-button-group-btn-gap: 8px;--rt-toggle-button-group-btn-font-size: 16px;--rt-toggle-button-group-btn-line-height: 18px}rt-toggle-button-group .rt-toggle-button-group{display:inline-flex;height:var(--rt-toggle-button-group-height);box-sizing:border-box;align-items:stretch;padding:var(--rt-toggle-button-group-track-padding);border-radius:var(--rt-toggle-button-group-track-radius);background-color:var(--rt-toggle-button-group-track-bg);gap:0}rt-toggle-button-group .rt-toggle-button-group__button{display:inline-flex;align-items:center;justify-content:center;padding:var(--rt-toggle-button-group-btn-padding);border:0;border-radius:var(--rt-toggle-button-group-btn-radius);background-color:transparent;color:var(--rt-color-text-muted);cursor:pointer;font-family:inherit;font-size:var(--rt-toggle-button-group-btn-font-size);font-weight:var(--rt-font-weight-semibold);gap:var(--rt-toggle-button-group-btn-gap);line-height:var(--rt-toggle-button-group-btn-line-height);transition:background-color var(--rt-toggle-button-group-transition-duration) ease,color var(--rt-toggle-button-group-transition-duration) ease}rt-toggle-button-group .rt-toggle-button-group__button:hover:not(:disabled,rt-toggle-button-group .rt-toggle-button-group__button--active){color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button--active{background-color:var(--rt-toggle-button-group-active-bg);color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button:focus-visible{position:relative;z-index:1;box-shadow:var(--rt-toggle-button-group-focus-shadow);outline:2px solid transparent;outline-offset:1px}rt-toggle-button-group .rt-toggle-button-group__button:disabled{cursor:not-allowed}rt-toggle-button-group .rt-toggle-button-group__label{display:inline-block;white-space:nowrap}rt-toggle-button-group .rt-toggle-button-group__icon{flex-shrink:0}rt-toggle-button-group .rt-toggle-button-group--disabled{opacity:.5}rt-toggle-button-group .rt-toggle-button-group--wrap,rt-toggle-button-group .rt-toggle-button-group--column{height:auto;gap:var(--rt-toggle-button-group-track-padding)}rt-toggle-button-group .rt-toggle-button-group--wrap .rt-toggle-button-group__button,rt-toggle-button-group .rt-toggle-button-group--column .rt-toggle-button-group__button{min-height:calc(var(--rt-toggle-button-group-height) - 2 * var(--rt-toggle-button-group-track-padding))}rt-toggle-button-group .rt-toggle-button-group--wrap{flex-wrap:wrap}rt-toggle-button-group .rt-toggle-button-group--column{flex-direction:column}rt-toggle-button-group .rt-toggle-button-group--column .rt-toggle-button-group__button{justify-content:flex-start}rt-toggle-button-group[data-rt-radius=none]{--rt-toggle-button-group-track-radius: var(--rt-radius-none)}rt-toggle-button-group[data-rt-radius=xs]{--rt-toggle-button-group-track-radius: var(--rt-radius-xs)}rt-toggle-button-group[data-rt-radius=sm]{--rt-toggle-button-group-track-radius: var(--rt-radius-sm)}rt-toggle-button-group[data-rt-radius=ms]{--rt-toggle-button-group-track-radius: var(--rt-radius-ms)}rt-toggle-button-group[data-rt-radius=md]{--rt-toggle-button-group-track-radius: var(--rt-radius-md)}rt-toggle-button-group[data-rt-radius=lg]{--rt-toggle-button-group-track-radius: var(--rt-radius-lg)}rt-toggle-button-group[data-rt-radius=xl]{--rt-toggle-button-group-track-radius: var(--rt-radius-xl)}rt-toggle-button-group[data-rt-radius=\"2xl\"]{--rt-toggle-button-group-track-radius: var(--rt-radius-2xl)}rt-toggle-button-group[data-rt-radius=full]{--rt-toggle-button-group-track-radius: var(--rt-radius-full)}rt-toggle-button-group.rt-toggle-button-group--wrap{display:flex}rt-toggle-button-group.rt-toggle-button-group--wrap .rt-toggle-button-group{min-width:0;flex:0 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width{display:flex;width:100%}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group{display:flex;width:100%;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group .rt-toggle-button-group__button{flex:1 1 0}:root[data-theme=dark] rt-toggle-button-group,html.rt-theme-dark rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-neutral-900)}}\n", "@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group .rt-toggle-button-group__check{display:inline-flex;flex:none;align-items:center;justify-content:center;block-size:var(--rt-size-4);inline-size:var(--rt-size-4)}rt-toggle-button-group .rt-toggle-button-group__check-svg{display:block;block-size:100%;inline-size:100%;stroke-width:2px}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group{height:auto;padding:0;border-radius:0;background-color:transparent;gap:var(--rt-space-2);opacity:1}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column{display:flex;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column .rt-toggle-button-group{flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column .rt-toggle-button-group__button{flex:none}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button{--rt-toggle-chip-edge: var(--rt-toggle-chip-color-border);--rt-toggle-chip-outline: inset 0 0 0 var(--rt-border-width-thin) var(--rt-toggle-chip-edge);height:var(--rt-toggle-button-group-height);min-height:0;box-sizing:border-box;border-radius:var(--rt-toggle-button-group-track-radius);background-color:transparent;box-shadow:var(--rt-toggle-chip-outline);color:var(--rt-toggle-chip-color-text)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:hover:not(:disabled){--rt-toggle-chip-hover: color-mix(in srgb, currentcolor 8%, transparent);background-image:linear-gradient(var(--rt-toggle-chip-hover),var(--rt-toggle-chip-hover))}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:hover:not(:disabled,.rt-toggle-button-group__button--active){color:var(--rt-toggle-chip-color-text)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button.rt-toggle-button-group__button--active{background-color:var(--rt-toggle-chip-color-bg-selected);color:var(--rt-color-action-primary-on-surface)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:focus-visible{--rt-toggle-chip-focus: var(--rt-toggle-chip-outline), var(--rt-toggle-button-group-focus-shadow);box-shadow:var(--rt-toggle-chip-focus)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:disabled{--rt-toggle-chip-edge: color-mix(in srgb, currentcolor 32%, transparent);color:var(--rt-color-text-disabled)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group{padding-block:var(--rt-space-2);row-gap:var(--rt-space-4)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__button{height:28px;padding:0 calc(3 * var(--rt-space-1));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);letter-spacing:.1px;line-height:var(--rt-size-5)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__button--active:not(:disabled){--rt-toggle-chip-edge: transparent;color:var(--rt-sys-on-secondary-container, var(--rt-color-text-primary))}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__check{block-size:var(--rt-size-6);inline-size:var(--rt-size-6);margin-inline:calc(-1.5 * var(--rt-space-1)) calc(1.5 * var(--rt-space-1) - var(--rt-toggle-button-group-btn-gap))}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__check-svg{block-size:var(--rt-size-5);inline-size:var(--rt-size-5)}rt-toggle-button-group:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]):not(.rt-toggle-button-group--chips) .rt-toggle-button-group:not(.rt-toggle-button-group--disabled) .rt-toggle-button-group__button:disabled{color:var(--rt-color-text-disabled)}}\n"],
153
287
  dependencies: [
288
+ {
289
+ kind: "directive",
290
+ type: NgTemplateOutlet,
291
+ selector: "[ngTemplateOutlet]",
292
+ inputs: [
293
+ "ngTemplateOutletContext",
294
+ "ngTemplateOutlet",
295
+ "ngTemplateOutletInjector"
296
+ ]
297
+ },
154
298
  {
155
299
  kind: "component",
156
300
  type: RtIconComponent,
@@ -173,6 +317,7 @@ var RtToggleButtonGroupComponent = class RtToggleButtonGroupComponent {
173
317
  inputs: [
174
318
  "rtTooltip",
175
319
  "rtTooltipPlacement",
320
+ "rtTooltipShowDelay",
176
321
  "rtTooltipWhenTruncated",
177
322
  "rtTooltipHideOnClick"
178
323
  ],
@@ -213,12 +358,18 @@ i0.ɵɵngDeclareClassMetadata({
213
358
  changeDetection: ChangeDetectionStrategy.OnPush,
214
359
  encapsulation: ViewEncapsulation.None,
215
360
  imports: [
361
+ NgTemplateOutlet,
216
362
  RtIconComponent,
217
363
  RtTooltipDirective,
218
364
  BlockDirective,
219
365
  ElemDirective,
220
366
  ModDirective
221
367
  ],
368
+ providers: [{
369
+ provide: NG_VALUE_ACCESSOR,
370
+ useExisting: forwardRef(() => RtToggleButtonGroupComponent),
371
+ multi: true
372
+ }],
222
373
  hostDirectives: [{
223
374
  directive: RtRadiusDirective,
224
375
  inputs: ["radius"]
@@ -226,14 +377,21 @@ i0.ɵɵngDeclareClassMetadata({
226
377
  host: {
227
378
  class: BEM_BLOCK,
228
379
  "[class.rt-toggle-button-group--full-width]": "fullWidth()",
380
+ "[class.rt-toggle-button-group--wrap]": "layout() === 'wrap'",
381
+ "[class.rt-toggle-button-group--column]": "layout() === 'column'",
229
382
  "[class.rt-toggle-button-group--md]": "size() === 'md'",
230
- "[class.rt-toggle-button-group--lg]": "size() === 'lg'"
383
+ "[class.rt-toggle-button-group--lg]": "size() === 'lg'",
384
+ "[class.rt-toggle-button-group--chips]": "appearance() === 'chips'"
231
385
  },
232
- template: "<div\n rtBlock=\"rt-toggle-button-group\"\n role=\"group\"\n [rtMod]=\"{\n sm: size() === 'sm',\n md: size() === 'md',\n lg: size() === 'lg',\n disabled: disabled(),\n }\"\n [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.option.value) {\n <button\n type=\"button\"\n rtElem=\"button\"\n qa-dataid=\"toggle-button-group-option\"\n [attr.data-value]=\"item.option.value\"\n [rtMod]=\"{\n active: item.active,\n first: $first,\n last: $last,\n }\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.active ? 'true' : 'false'\"\n [rtTooltip]=\"item.option.title ?? ''\"\n (click)=\"onOptionClick(item)\">\n @if (item.option.icon || item.option.glyph) {\n <rt-icon\n rtElem=\"icon\"\n color=\"current\"\n [name]=\"item.option.icon ?? null\"\n [glyph]=\"item.option.glyph ?? null\"\n [size]=\"iconSize()\" />\n }\n <span rtElem=\"label\">{{ item.option.label }}</span>\n </button>\n }\n</div>\n",
233
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);--rt-toggle-button-group-height: 30px;--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);--rt-toggle-button-group-track-padding: 4px;--rt-toggle-button-group-track-radius: var(--rt-radius-md);--rt-toggle-button-group-btn-padding: 0 8px;--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);--rt-toggle-button-group-btn-gap: 4px;--rt-toggle-button-group-btn-font-size: 12px;--rt-toggle-button-group-btn-line-height: 14px;display:inline-flex}rt-toggle-button-group.rt-toggle-button-group--md{--rt-toggle-button-group-height: 40px;--rt-toggle-button-group-btn-padding: 0 14px;--rt-toggle-button-group-btn-gap: 6px;--rt-toggle-button-group-btn-font-size: 14px;--rt-toggle-button-group-btn-line-height: 16px}rt-toggle-button-group.rt-toggle-button-group--lg{--rt-toggle-button-group-height: 50px;--rt-toggle-button-group-btn-padding: 0 20px;--rt-toggle-button-group-btn-gap: 8px;--rt-toggle-button-group-btn-font-size: 16px;--rt-toggle-button-group-btn-line-height: 18px}rt-toggle-button-group .rt-toggle-button-group{display:inline-flex;height:var(--rt-toggle-button-group-height);box-sizing:border-box;align-items:stretch;padding:var(--rt-toggle-button-group-track-padding);border-radius:var(--rt-toggle-button-group-track-radius);background-color:var(--rt-toggle-button-group-track-bg);gap:0}rt-toggle-button-group .rt-toggle-button-group__button{display:inline-flex;align-items:center;justify-content:center;padding:var(--rt-toggle-button-group-btn-padding);border:0;border-radius:var(--rt-toggle-button-group-btn-radius);background-color:transparent;color:var(--rt-color-text-muted);cursor:pointer;font-family:inherit;font-size:var(--rt-toggle-button-group-btn-font-size);font-weight:var(--rt-font-weight-semibold);gap:var(--rt-toggle-button-group-btn-gap);line-height:var(--rt-toggle-button-group-btn-line-height);transition:background-color var(--rt-toggle-button-group-transition-duration) ease,color var(--rt-toggle-button-group-transition-duration) ease}rt-toggle-button-group .rt-toggle-button-group__button:hover:not(:disabled,rt-toggle-button-group .rt-toggle-button-group__button--active){color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button--active{background-color:var(--rt-toggle-button-group-active-bg);color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button:focus-visible{position:relative;z-index:1;box-shadow:var(--rt-toggle-button-group-focus-shadow);outline:2px solid transparent;outline-offset:1px}rt-toggle-button-group .rt-toggle-button-group__button:disabled{cursor:not-allowed}rt-toggle-button-group .rt-toggle-button-group__label{display:inline-block;white-space:nowrap}rt-toggle-button-group .rt-toggle-button-group__icon{flex-shrink:0}rt-toggle-button-group .rt-toggle-button-group--disabled{opacity:.5}rt-toggle-button-group[data-rt-radius=none]{--rt-toggle-button-group-track-radius: var(--rt-radius-none)}rt-toggle-button-group[data-rt-radius=xs]{--rt-toggle-button-group-track-radius: var(--rt-radius-xs)}rt-toggle-button-group[data-rt-radius=sm]{--rt-toggle-button-group-track-radius: var(--rt-radius-sm)}rt-toggle-button-group[data-rt-radius=ms]{--rt-toggle-button-group-track-radius: var(--rt-radius-ms)}rt-toggle-button-group[data-rt-radius=md]{--rt-toggle-button-group-track-radius: var(--rt-radius-md)}rt-toggle-button-group[data-rt-radius=lg]{--rt-toggle-button-group-track-radius: var(--rt-radius-lg)}rt-toggle-button-group[data-rt-radius=xl]{--rt-toggle-button-group-track-radius: var(--rt-radius-xl)}rt-toggle-button-group[data-rt-radius=\"2xl\"]{--rt-toggle-button-group-track-radius: var(--rt-radius-2xl)}rt-toggle-button-group[data-rt-radius=full]{--rt-toggle-button-group-track-radius: var(--rt-radius-full)}rt-toggle-button-group.rt-toggle-button-group--full-width{display:flex;width:100%}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group{display:flex;width:100%;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group .rt-toggle-button-group__button{flex:1 1 0}:root[data-theme=dark] rt-toggle-button-group,html.rt-theme-dark rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-neutral-900)}}\n"]
386
+ template: "<div\n rtBlock=\"rt-toggle-button-group\"\n role=\"group\"\n [rtMod]=\"{\n sm: size() === 'sm',\n md: size() === 'md',\n lg: size() === 'lg',\n disabled: isDisabled(),\n wrap: layout() === 'wrap',\n column: layout() === 'column',\n chips: appearance() === 'chips',\n }\"\n [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.option.value) {\n <button\n type=\"button\"\n rtElem=\"button\"\n qa-dataid=\"toggle-button-group-option\"\n [attr.data-value]=\"item.option.value\"\n [rtMod]=\"{\n active: item.active,\n first: $first,\n last: $last,\n checked: checkmark() && item.active,\n }\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.active ? 'true' : 'false'\"\n [rtTooltip]=\"item.option.title ?? ''\"\n (click)=\"onOptionClick(item)\">\n @if (checkmark() && item.active) {\n <span rtElem=\"check\" aria-hidden=\"true\">\n <svg rtElem=\"check-svg\" viewBox=\"-2 -3 30 30\" focusable=\"false\">\n <path fill=\"none\" stroke=\"currentColor\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\" />\n </svg>\n </span>\n }\n @if (optionTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"item.context\" />\n } @else {\n @if (item.option.icon || item.option.glyph) {\n <rt-icon\n rtElem=\"icon\"\n color=\"current\"\n [name]=\"item.option.icon ?? null\"\n [glyph]=\"item.option.glyph ?? null\"\n [size]=\"iconSize()\" />\n }\n <span rtElem=\"label\">{{ item.option.label }}</span>\n }\n </button>\n }\n</div>\n",
387
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);--rt-toggle-button-group-height: 30px;--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);--rt-toggle-button-group-track-padding: 4px;--rt-toggle-button-group-track-radius: var(--rt-radius-md);--rt-toggle-button-group-btn-padding: 0 8px;--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);--rt-toggle-button-group-btn-gap: 4px;--rt-toggle-button-group-btn-font-size: 12px;--rt-toggle-button-group-btn-line-height: 14px;display:inline-flex}rt-toggle-button-group.rt-toggle-button-group--md{--rt-toggle-button-group-height: 40px;--rt-toggle-button-group-btn-padding: 0 14px;--rt-toggle-button-group-btn-gap: 6px;--rt-toggle-button-group-btn-font-size: 14px;--rt-toggle-button-group-btn-line-height: 16px}rt-toggle-button-group.rt-toggle-button-group--lg{--rt-toggle-button-group-height: 50px;--rt-toggle-button-group-btn-padding: 0 20px;--rt-toggle-button-group-btn-gap: 8px;--rt-toggle-button-group-btn-font-size: 16px;--rt-toggle-button-group-btn-line-height: 18px}rt-toggle-button-group .rt-toggle-button-group{display:inline-flex;height:var(--rt-toggle-button-group-height);box-sizing:border-box;align-items:stretch;padding:var(--rt-toggle-button-group-track-padding);border-radius:var(--rt-toggle-button-group-track-radius);background-color:var(--rt-toggle-button-group-track-bg);gap:0}rt-toggle-button-group .rt-toggle-button-group__button{display:inline-flex;align-items:center;justify-content:center;padding:var(--rt-toggle-button-group-btn-padding);border:0;border-radius:var(--rt-toggle-button-group-btn-radius);background-color:transparent;color:var(--rt-color-text-muted);cursor:pointer;font-family:inherit;font-size:var(--rt-toggle-button-group-btn-font-size);font-weight:var(--rt-font-weight-semibold);gap:var(--rt-toggle-button-group-btn-gap);line-height:var(--rt-toggle-button-group-btn-line-height);transition:background-color var(--rt-toggle-button-group-transition-duration) ease,color var(--rt-toggle-button-group-transition-duration) ease}rt-toggle-button-group .rt-toggle-button-group__button:hover:not(:disabled,rt-toggle-button-group .rt-toggle-button-group__button--active){color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button--active{background-color:var(--rt-toggle-button-group-active-bg);color:var(--rt-color-text-primary)}rt-toggle-button-group .rt-toggle-button-group__button:focus-visible{position:relative;z-index:1;box-shadow:var(--rt-toggle-button-group-focus-shadow);outline:2px solid transparent;outline-offset:1px}rt-toggle-button-group .rt-toggle-button-group__button:disabled{cursor:not-allowed}rt-toggle-button-group .rt-toggle-button-group__label{display:inline-block;white-space:nowrap}rt-toggle-button-group .rt-toggle-button-group__icon{flex-shrink:0}rt-toggle-button-group .rt-toggle-button-group--disabled{opacity:.5}rt-toggle-button-group .rt-toggle-button-group--wrap,rt-toggle-button-group .rt-toggle-button-group--column{height:auto;gap:var(--rt-toggle-button-group-track-padding)}rt-toggle-button-group .rt-toggle-button-group--wrap .rt-toggle-button-group__button,rt-toggle-button-group .rt-toggle-button-group--column .rt-toggle-button-group__button{min-height:calc(var(--rt-toggle-button-group-height) - 2 * var(--rt-toggle-button-group-track-padding))}rt-toggle-button-group .rt-toggle-button-group--wrap{flex-wrap:wrap}rt-toggle-button-group .rt-toggle-button-group--column{flex-direction:column}rt-toggle-button-group .rt-toggle-button-group--column .rt-toggle-button-group__button{justify-content:flex-start}rt-toggle-button-group[data-rt-radius=none]{--rt-toggle-button-group-track-radius: var(--rt-radius-none)}rt-toggle-button-group[data-rt-radius=xs]{--rt-toggle-button-group-track-radius: var(--rt-radius-xs)}rt-toggle-button-group[data-rt-radius=sm]{--rt-toggle-button-group-track-radius: var(--rt-radius-sm)}rt-toggle-button-group[data-rt-radius=ms]{--rt-toggle-button-group-track-radius: var(--rt-radius-ms)}rt-toggle-button-group[data-rt-radius=md]{--rt-toggle-button-group-track-radius: var(--rt-radius-md)}rt-toggle-button-group[data-rt-radius=lg]{--rt-toggle-button-group-track-radius: var(--rt-radius-lg)}rt-toggle-button-group[data-rt-radius=xl]{--rt-toggle-button-group-track-radius: var(--rt-radius-xl)}rt-toggle-button-group[data-rt-radius=\"2xl\"]{--rt-toggle-button-group-track-radius: var(--rt-radius-2xl)}rt-toggle-button-group[data-rt-radius=full]{--rt-toggle-button-group-track-radius: var(--rt-radius-full)}rt-toggle-button-group.rt-toggle-button-group--wrap{display:flex}rt-toggle-button-group.rt-toggle-button-group--wrap .rt-toggle-button-group{min-width:0;flex:0 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width{display:flex;width:100%}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group{display:flex;width:100%;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--full-width .rt-toggle-button-group .rt-toggle-button-group__button{flex:1 1 0}:root[data-theme=dark] rt-toggle-button-group,html.rt-theme-dark rt-toggle-button-group{--rt-toggle-button-group-track-bg: var(--rt-neutral-900)}}\n", "@charset \"UTF-8\";@layer rt-kit.components{rt-toggle-button-group .rt-toggle-button-group__check{display:inline-flex;flex:none;align-items:center;justify-content:center;block-size:var(--rt-size-4);inline-size:var(--rt-size-4)}rt-toggle-button-group .rt-toggle-button-group__check-svg{display:block;block-size:100%;inline-size:100%;stroke-width:2px}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group{height:auto;padding:0;border-radius:0;background-color:transparent;gap:var(--rt-space-2);opacity:1}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column{display:flex;flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column .rt-toggle-button-group{flex:1 1 auto}rt-toggle-button-group.rt-toggle-button-group--chips.rt-toggle-button-group--column .rt-toggle-button-group__button{flex:none}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button{--rt-toggle-chip-edge: var(--rt-toggle-chip-color-border);--rt-toggle-chip-outline: inset 0 0 0 var(--rt-border-width-thin) var(--rt-toggle-chip-edge);height:var(--rt-toggle-button-group-height);min-height:0;box-sizing:border-box;border-radius:var(--rt-toggle-button-group-track-radius);background-color:transparent;box-shadow:var(--rt-toggle-chip-outline);color:var(--rt-toggle-chip-color-text)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:hover:not(:disabled){--rt-toggle-chip-hover: color-mix(in srgb, currentcolor 8%, transparent);background-image:linear-gradient(var(--rt-toggle-chip-hover),var(--rt-toggle-chip-hover))}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:hover:not(:disabled,.rt-toggle-button-group__button--active){color:var(--rt-toggle-chip-color-text)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button.rt-toggle-button-group__button--active{background-color:var(--rt-toggle-chip-color-bg-selected);color:var(--rt-color-action-primary-on-surface)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:focus-visible{--rt-toggle-chip-focus: var(--rt-toggle-chip-outline), var(--rt-toggle-button-group-focus-shadow);box-shadow:var(--rt-toggle-chip-focus)}rt-toggle-button-group.rt-toggle-button-group--chips .rt-toggle-button-group__button:disabled{--rt-toggle-chip-edge: color-mix(in srgb, currentcolor 32%, transparent);color:var(--rt-color-text-disabled)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group{padding-block:var(--rt-space-2);row-gap:var(--rt-space-4)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__button{height:28px;padding:0 calc(3 * var(--rt-space-1));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);letter-spacing:.1px;line-height:var(--rt-size-5)}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__button--active:not(:disabled){--rt-toggle-chip-edge: transparent;color:var(--rt-sys-on-secondary-container, var(--rt-color-text-primary))}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__check{block-size:var(--rt-size-6);inline-size:var(--rt-size-6);margin-inline:calc(-1.5 * var(--rt-space-1)) calc(1.5 * var(--rt-space-1) - var(--rt-toggle-button-group-btn-gap))}rt-toggle-button-group.rt-toggle-button-group--chips:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]) .rt-toggle-button-group__check-svg{block-size:var(--rt-size-5);inline-size:var(--rt-size-5)}rt-toggle-button-group:is(.rt-preset-material *,[data-preset=material] *,.rt-preset-material,[data-preset=material]):not(.rt-toggle-button-group--chips) .rt-toggle-button-group:not(.rt-toggle-button-group--disabled) .rt-toggle-button-group__button:disabled{color:var(--rt-color-text-disabled)}}\n"]
234
388
  }]
235
389
  }],
236
390
  propDecorators: {
391
+ optionTpl: [{
392
+ type: i0.ContentChild,
393
+ args: [i0.forwardRef(() => RtToggleButtonOptionDirective), { isSignal: true }]
394
+ }],
237
395
  options: [{
238
396
  type: i0.Input,
239
397
  args: [{
@@ -298,6 +456,30 @@ i0.ɵɵngDeclareClassMetadata({
298
456
  required: false
299
457
  }]
300
458
  }],
459
+ layout: [{
460
+ type: i0.Input,
461
+ args: [{
462
+ isSignal: true,
463
+ alias: "layout",
464
+ required: false
465
+ }]
466
+ }],
467
+ appearance: [{
468
+ type: i0.Input,
469
+ args: [{
470
+ isSignal: true,
471
+ alias: "appearance",
472
+ required: false
473
+ }]
474
+ }],
475
+ checkmark: [{
476
+ type: i0.Input,
477
+ args: [{
478
+ isSignal: true,
479
+ alias: "checkmark",
480
+ required: false
481
+ }]
482
+ }],
301
483
  valueChange: [{
302
484
  type: i0.Output,
303
485
  args: ["valueChange"]
@@ -308,6 +490,6 @@ i0.ɵɵngDeclareClassMetadata({
308
490
  }]
309
491
  }
310
492
  });
311
- export { RtToggleButtonGroupComponent };
493
+ export { RtToggleButtonGroupComponent, RtToggleButtonOptionDirective };
312
494
 
313
495
  //# sourceMappingURL=rt-tools-ui-kit-v2-toggle-button-group.mjs.map