@loomui-ng/ui 0.0.0-stage → 0.1.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 (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -2
  3. package/accordion/README.md +38 -0
  4. package/alert/README.md +32 -0
  5. package/alert-dialog/README.md +37 -0
  6. package/aspect-ratio/README.md +24 -0
  7. package/attachment/README.md +40 -0
  8. package/avatar/README.md +34 -0
  9. package/badge/README.md +29 -0
  10. package/breadcrumb/README.md +33 -0
  11. package/bubble/README.md +32 -0
  12. package/button/README.md +31 -0
  13. package/button-group/README.md +30 -0
  14. package/calendar/README.md +35 -0
  15. package/card/README.md +41 -0
  16. package/carousel/README.md +41 -0
  17. package/chart/README.md +25 -0
  18. package/checkbox/README.md +31 -0
  19. package/collapsible/README.md +31 -0
  20. package/combobox/README.md +47 -0
  21. package/command/README.md +44 -0
  22. package/context-menu/README.md +36 -0
  23. package/data-table/README.md +39 -0
  24. package/date-picker/README.md +23 -0
  25. package/dialog/README.md +52 -0
  26. package/direction/README.md +19 -0
  27. package/drawer/README.md +37 -0
  28. package/dropdown-menu/README.md +46 -0
  29. package/empty/README.md +38 -0
  30. package/fesm2022/loomui-ng-ui-accordion.mjs +555 -0
  31. package/fesm2022/loomui-ng-ui-accordion.mjs.map +1 -0
  32. package/fesm2022/loomui-ng-ui-alert-dialog.mjs +652 -0
  33. package/fesm2022/loomui-ng-ui-alert-dialog.mjs.map +1 -0
  34. package/fesm2022/loomui-ng-ui-alert.mjs +286 -0
  35. package/fesm2022/loomui-ng-ui-alert.mjs.map +1 -0
  36. package/fesm2022/loomui-ng-ui-aspect-ratio.mjs +97 -0
  37. package/fesm2022/loomui-ng-ui-aspect-ratio.mjs.map +1 -0
  38. package/fesm2022/loomui-ng-ui-attachment.mjs +713 -0
  39. package/fesm2022/loomui-ng-ui-attachment.mjs.map +1 -0
  40. package/fesm2022/loomui-ng-ui-avatar.mjs +561 -0
  41. package/fesm2022/loomui-ng-ui-avatar.mjs.map +1 -0
  42. package/fesm2022/loomui-ng-ui-badge.mjs +102 -0
  43. package/fesm2022/loomui-ng-ui-badge.mjs.map +1 -0
  44. package/fesm2022/loomui-ng-ui-breadcrumb.mjs +520 -0
  45. package/fesm2022/loomui-ng-ui-breadcrumb.mjs.map +1 -0
  46. package/fesm2022/loomui-ng-ui-bubble.mjs +386 -0
  47. package/fesm2022/loomui-ng-ui-bubble.mjs.map +1 -0
  48. package/fesm2022/loomui-ng-ui-button-group.mjs +193 -0
  49. package/fesm2022/loomui-ng-ui-button-group.mjs.map +1 -0
  50. package/fesm2022/loomui-ng-ui-button.mjs +162 -0
  51. package/fesm2022/loomui-ng-ui-button.mjs.map +1 -0
  52. package/fesm2022/loomui-ng-ui-calendar.mjs +681 -0
  53. package/fesm2022/loomui-ng-ui-calendar.mjs.map +1 -0
  54. package/fesm2022/loomui-ng-ui-card.mjs +461 -0
  55. package/fesm2022/loomui-ng-ui-card.mjs.map +1 -0
  56. package/fesm2022/loomui-ng-ui-carousel.mjs +532 -0
  57. package/fesm2022/loomui-ng-ui-carousel.mjs.map +1 -0
  58. package/fesm2022/loomui-ng-ui-chart.mjs +373 -0
  59. package/fesm2022/loomui-ng-ui-chart.mjs.map +1 -0
  60. package/fesm2022/loomui-ng-ui-checkbox.mjs +265 -0
  61. package/fesm2022/loomui-ng-ui-checkbox.mjs.map +1 -0
  62. package/fesm2022/loomui-ng-ui-collapsible.mjs +274 -0
  63. package/fesm2022/loomui-ng-ui-collapsible.mjs.map +1 -0
  64. package/fesm2022/loomui-ng-ui-combobox.mjs +971 -0
  65. package/fesm2022/loomui-ng-ui-combobox.mjs.map +1 -0
  66. package/fesm2022/loomui-ng-ui-command.mjs +982 -0
  67. package/fesm2022/loomui-ng-ui-command.mjs.map +1 -0
  68. package/fesm2022/loomui-ng-ui-context-menu.mjs +1359 -0
  69. package/fesm2022/loomui-ng-ui-context-menu.mjs.map +1 -0
  70. package/fesm2022/loomui-ng-ui-data-table.mjs +535 -0
  71. package/fesm2022/loomui-ng-ui-data-table.mjs.map +1 -0
  72. package/fesm2022/loomui-ng-ui-date-picker.mjs +312 -0
  73. package/fesm2022/loomui-ng-ui-date-picker.mjs.map +1 -0
  74. package/fesm2022/loomui-ng-ui-dialog.mjs +508 -0
  75. package/fesm2022/loomui-ng-ui-dialog.mjs.map +1 -0
  76. package/fesm2022/loomui-ng-ui-direction.mjs +112 -0
  77. package/fesm2022/loomui-ng-ui-direction.mjs.map +1 -0
  78. package/fesm2022/loomui-ng-ui-drawer.mjs +590 -0
  79. package/fesm2022/loomui-ng-ui-drawer.mjs.map +1 -0
  80. package/fesm2022/loomui-ng-ui-dropdown-menu.mjs +1322 -0
  81. package/fesm2022/loomui-ng-ui-dropdown-menu.mjs.map +1 -0
  82. package/fesm2022/loomui-ng-ui-empty.mjs +408 -0
  83. package/fesm2022/loomui-ng-ui-empty.mjs.map +1 -0
  84. package/fesm2022/loomui-ng-ui-field.mjs +630 -0
  85. package/fesm2022/loomui-ng-ui-field.mjs.map +1 -0
  86. package/fesm2022/loomui-ng-ui-hover-card.mjs +230 -0
  87. package/fesm2022/loomui-ng-ui-hover-card.mjs.map +1 -0
  88. package/fesm2022/loomui-ng-ui-icon.mjs +498 -0
  89. package/fesm2022/loomui-ng-ui-icon.mjs.map +1 -0
  90. package/fesm2022/loomui-ng-ui-input-group.mjs +463 -0
  91. package/fesm2022/loomui-ng-ui-input-group.mjs.map +1 -0
  92. package/fesm2022/loomui-ng-ui-input-otp.mjs +586 -0
  93. package/fesm2022/loomui-ng-ui-input-otp.mjs.map +1 -0
  94. package/fesm2022/loomui-ng-ui-input.mjs +289 -0
  95. package/fesm2022/loomui-ng-ui-input.mjs.map +1 -0
  96. package/fesm2022/loomui-ng-ui-item.mjs +598 -0
  97. package/fesm2022/loomui-ng-ui-item.mjs.map +1 -0
  98. package/fesm2022/loomui-ng-ui-kbd.mjs +129 -0
  99. package/fesm2022/loomui-ng-ui-kbd.mjs.map +1 -0
  100. package/fesm2022/loomui-ng-ui-label.mjs +68 -0
  101. package/fesm2022/loomui-ng-ui-label.mjs.map +1 -0
  102. package/fesm2022/loomui-ng-ui-marker.mjs +234 -0
  103. package/fesm2022/loomui-ng-ui-marker.mjs.map +1 -0
  104. package/fesm2022/loomui-ng-ui-menubar.mjs +1523 -0
  105. package/fesm2022/loomui-ng-ui-menubar.mjs.map +1 -0
  106. package/fesm2022/loomui-ng-ui-message-scroller.mjs +519 -0
  107. package/fesm2022/loomui-ng-ui-message-scroller.mjs.map +1 -0
  108. package/fesm2022/loomui-ng-ui-message.mjs +408 -0
  109. package/fesm2022/loomui-ng-ui-message.mjs.map +1 -0
  110. package/fesm2022/loomui-ng-ui-native-select.mjs +389 -0
  111. package/fesm2022/loomui-ng-ui-native-select.mjs.map +1 -0
  112. package/fesm2022/loomui-ng-ui-navigation-menu.mjs +609 -0
  113. package/fesm2022/loomui-ng-ui-navigation-menu.mjs.map +1 -0
  114. package/fesm2022/loomui-ng-ui-pagination.mjs +611 -0
  115. package/fesm2022/loomui-ng-ui-pagination.mjs.map +1 -0
  116. package/fesm2022/loomui-ng-ui-popover.mjs +358 -0
  117. package/fesm2022/loomui-ng-ui-popover.mjs.map +1 -0
  118. package/fesm2022/loomui-ng-ui-progress.mjs +159 -0
  119. package/fesm2022/loomui-ng-ui-progress.mjs.map +1 -0
  120. package/fesm2022/loomui-ng-ui-questionnaire.mjs +1012 -0
  121. package/fesm2022/loomui-ng-ui-questionnaire.mjs.map +1 -0
  122. package/fesm2022/loomui-ng-ui-radio-group.mjs +399 -0
  123. package/fesm2022/loomui-ng-ui-radio-group.mjs.map +1 -0
  124. package/fesm2022/loomui-ng-ui-resizable.mjs +518 -0
  125. package/fesm2022/loomui-ng-ui-resizable.mjs.map +1 -0
  126. package/fesm2022/loomui-ng-ui-scroll-area.mjs +135 -0
  127. package/fesm2022/loomui-ng-ui-scroll-area.mjs.map +1 -0
  128. package/fesm2022/loomui-ng-ui-select.mjs +863 -0
  129. package/fesm2022/loomui-ng-ui-select.mjs.map +1 -0
  130. package/fesm2022/loomui-ng-ui-separator.mjs +114 -0
  131. package/fesm2022/loomui-ng-ui-separator.mjs.map +1 -0
  132. package/fesm2022/loomui-ng-ui-sheet.mjs +530 -0
  133. package/fesm2022/loomui-ng-ui-sheet.mjs.map +1 -0
  134. package/fesm2022/loomui-ng-ui-sidebar.mjs +1918 -0
  135. package/fesm2022/loomui-ng-ui-sidebar.mjs.map +1 -0
  136. package/fesm2022/loomui-ng-ui-skeleton.mjs +69 -0
  137. package/fesm2022/loomui-ng-ui-skeleton.mjs.map +1 -0
  138. package/fesm2022/loomui-ng-ui-slider.mjs +390 -0
  139. package/fesm2022/loomui-ng-ui-slider.mjs.map +1 -0
  140. package/fesm2022/loomui-ng-ui-spinner.mjs +85 -0
  141. package/fesm2022/loomui-ng-ui-spinner.mjs.map +1 -0
  142. package/fesm2022/loomui-ng-ui-switch.mjs +212 -0
  143. package/fesm2022/loomui-ng-ui-switch.mjs.map +1 -0
  144. package/fesm2022/loomui-ng-ui-table.mjs +559 -0
  145. package/fesm2022/loomui-ng-ui-table.mjs.map +1 -0
  146. package/fesm2022/loomui-ng-ui-tabs.mjs +544 -0
  147. package/fesm2022/loomui-ng-ui-tabs.mjs.map +1 -0
  148. package/fesm2022/loomui-ng-ui-textarea.mjs +206 -0
  149. package/fesm2022/loomui-ng-ui-textarea.mjs.map +1 -0
  150. package/fesm2022/loomui-ng-ui-toast.mjs +432 -0
  151. package/fesm2022/loomui-ng-ui-toast.mjs.map +1 -0
  152. package/fesm2022/loomui-ng-ui-toggle-group.mjs +477 -0
  153. package/fesm2022/loomui-ng-ui-toggle-group.mjs.map +1 -0
  154. package/fesm2022/loomui-ng-ui-toggle.mjs +219 -0
  155. package/fesm2022/loomui-ng-ui-toggle.mjs.map +1 -0
  156. package/fesm2022/loomui-ng-ui-tooltip.mjs +240 -0
  157. package/fesm2022/loomui-ng-ui-tooltip.mjs.map +1 -0
  158. package/fesm2022/loomui-ng-ui-typography.mjs +129 -0
  159. package/fesm2022/loomui-ng-ui-typography.mjs.map +1 -0
  160. package/fesm2022/loomui-ng-ui-utils.mjs +1533 -0
  161. package/fesm2022/loomui-ng-ui-utils.mjs.map +1 -0
  162. package/fesm2022/loomui-ng-ui.mjs +4 -0
  163. package/fesm2022/loomui-ng-ui.mjs.map +1 -0
  164. package/field/README.md +43 -0
  165. package/hover-card/README.md +31 -0
  166. package/icon/README.md +42 -0
  167. package/input/README.md +26 -0
  168. package/input-group/README.md +40 -0
  169. package/input-otp/README.md +35 -0
  170. package/item/README.md +33 -0
  171. package/kbd/README.md +21 -0
  172. package/label/README.md +24 -0
  173. package/marker/README.md +24 -0
  174. package/menubar/README.md +40 -0
  175. package/message/README.md +32 -0
  176. package/message-scroller/README.md +40 -0
  177. package/native-select/README.md +26 -0
  178. package/navigation-menu/README.md +39 -0
  179. package/package.json +325 -3
  180. package/pagination/README.md +37 -0
  181. package/popover/README.md +37 -0
  182. package/progress/README.md +25 -0
  183. package/questionnaire/README.md +52 -0
  184. package/radio-group/README.md +33 -0
  185. package/resizable/README.md +37 -0
  186. package/scroll-area/README.md +25 -0
  187. package/select/README.md +45 -0
  188. package/separator/README.md +28 -0
  189. package/sheet/README.md +38 -0
  190. package/sidebar/README.md +60 -0
  191. package/skeleton/README.md +21 -0
  192. package/slider/README.md +29 -0
  193. package/spinner/README.md +15 -0
  194. package/styles/loomui.css +330 -0
  195. package/switch/README.md +29 -0
  196. package/table/README.md +31 -0
  197. package/tabs/README.md +42 -0
  198. package/textarea/README.md +28 -0
  199. package/toast/README.md +27 -0
  200. package/toggle/README.md +27 -0
  201. package/toggle-group/README.md +37 -0
  202. package/tooltip/README.md +31 -0
  203. package/types/loomui-ng-ui-accordion.d.ts +141 -0
  204. package/types/loomui-ng-ui-alert-dialog.d.ts +175 -0
  205. package/types/loomui-ng-ui-alert.d.ts +77 -0
  206. package/types/loomui-ng-ui-aspect-ratio.d.ts +31 -0
  207. package/types/loomui-ng-ui-attachment.d.ts +192 -0
  208. package/types/loomui-ng-ui-avatar.d.ts +147 -0
  209. package/types/loomui-ng-ui-badge.d.ts +32 -0
  210. package/types/loomui-ng-ui-breadcrumb.d.ts +118 -0
  211. package/types/loomui-ng-ui-bubble.d.ts +100 -0
  212. package/types/loomui-ng-ui-button-group.d.ts +51 -0
  213. package/types/loomui-ng-ui-button.d.ts +57 -0
  214. package/types/loomui-ng-ui-calendar.d.ts +171 -0
  215. package/types/loomui-ng-ui-card.d.ts +123 -0
  216. package/types/loomui-ng-ui-carousel.d.ts +140 -0
  217. package/types/loomui-ng-ui-chart.d.ts +95 -0
  218. package/types/loomui-ng-ui-checkbox.d.ts +62 -0
  219. package/types/loomui-ng-ui-collapsible.d.ts +74 -0
  220. package/types/loomui-ng-ui-combobox.d.ts +229 -0
  221. package/types/loomui-ng-ui-command.d.ts +231 -0
  222. package/types/loomui-ng-ui-context-menu.d.ts +288 -0
  223. package/types/loomui-ng-ui-data-table.d.ts +111 -0
  224. package/types/loomui-ng-ui-date-picker.d.ts +63 -0
  225. package/types/loomui-ng-ui-dialog.d.ts +127 -0
  226. package/types/loomui-ng-ui-direction.d.ts +42 -0
  227. package/types/loomui-ng-ui-drawer.d.ts +149 -0
  228. package/types/loomui-ng-ui-dropdown-menu.d.ts +258 -0
  229. package/types/loomui-ng-ui-empty.d.ts +109 -0
  230. package/types/loomui-ng-ui-field.d.ts +169 -0
  231. package/types/loomui-ng-ui-hover-card.d.ts +62 -0
  232. package/types/loomui-ng-ui-icon.d.ts +156 -0
  233. package/types/loomui-ng-ui-input-group.d.ts +130 -0
  234. package/types/loomui-ng-ui-input-otp.d.ts +149 -0
  235. package/types/loomui-ng-ui-input.d.ts +89 -0
  236. package/types/loomui-ng-ui-item.d.ts +157 -0
  237. package/types/loomui-ng-ui-kbd.d.ts +36 -0
  238. package/types/loomui-ng-ui-label.d.ts +19 -0
  239. package/types/loomui-ng-ui-marker.d.ts +61 -0
  240. package/types/loomui-ng-ui-menubar.d.ts +321 -0
  241. package/types/loomui-ng-ui-message-scroller.d.ts +138 -0
  242. package/types/loomui-ng-ui-message.d.ts +109 -0
  243. package/types/loomui-ng-ui-native-select.d.ts +84 -0
  244. package/types/loomui-ng-ui-navigation-menu.d.ts +160 -0
  245. package/types/loomui-ng-ui-pagination.d.ts +130 -0
  246. package/types/loomui-ng-ui-popover.d.ts +90 -0
  247. package/types/loomui-ng-ui-progress.d.ts +39 -0
  248. package/types/loomui-ng-ui-questionnaire.d.ts +274 -0
  249. package/types/loomui-ng-ui-radio-group.d.ts +109 -0
  250. package/types/loomui-ng-ui-resizable.d.ts +121 -0
  251. package/types/loomui-ng-ui-scroll-area.d.ts +44 -0
  252. package/types/loomui-ng-ui-select.d.ts +204 -0
  253. package/types/loomui-ng-ui-separator.d.ts +35 -0
  254. package/types/loomui-ng-ui-sheet.d.ts +124 -0
  255. package/types/loomui-ng-ui-sidebar.d.ts +485 -0
  256. package/types/loomui-ng-ui-skeleton.d.ts +20 -0
  257. package/types/loomui-ng-ui-slider.d.ts +103 -0
  258. package/types/loomui-ng-ui-spinner.d.ts +19 -0
  259. package/types/loomui-ng-ui-switch.d.ts +56 -0
  260. package/types/loomui-ng-ui-table.d.ts +148 -0
  261. package/types/loomui-ng-ui-tabs.d.ts +148 -0
  262. package/types/loomui-ng-ui-textarea.d.ts +52 -0
  263. package/types/loomui-ng-ui-toast.d.ts +97 -0
  264. package/types/loomui-ng-ui-toggle-group.d.ts +138 -0
  265. package/types/loomui-ng-ui-toggle.d.ts +63 -0
  266. package/types/loomui-ng-ui-tooltip.d.ts +63 -0
  267. package/types/loomui-ng-ui-typography.d.ts +42 -0
  268. package/types/loomui-ng-ui-utils.d.ts +392 -0
  269. package/types/loomui-ng-ui.d.ts +5 -0
  270. package/typography/README.md +29 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loomui-ng-ui-menubar.mjs","names":[],"sources":["../../../libs/ui/menubar/menubar.ts","../../../libs/ui/menubar/menubar.shared.ts","../../../libs/ui/menubar/menubar.manual.ts"],"sourcesContent":["// GENERATED by tools/gen-ui.mjs from docs/evidence/slots/menubar.json.\n// Change tools/ui-specs.mjs and regenerate; hand-written parts live in ./menubar.manual.ts.\nimport { Directive, computed, input } from '@angular/core';\nimport { cn } from '@loomui-ng/ui/utils';\n\nexport const menubarClass =\n 'flex h-8 items-center gap-0.5 rounded-lg border p-[3px]';\n\nexport const menubarTriggerClass =\n 'flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted';\n\nexport const menubarContentClass =\n 'z-50 min-w-36 origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95';\n\nexport const menubarItemClass =\n 'group/menubar-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\\'size-\\'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!';\n\nexport const menubarSubTriggerClass =\n 'flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*=\\'size-\\'])]:size-4';\n\nexport const menubarSeparatorClass =\n '-mx-1 my-1 h-px bg-border';\n\nexport const menubarShortcutClass =\n 'ms-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground';\n\nexport const UI_MENUBAR_GENERATED = [] as const;\n","// GENERATED by tools/clone-menu.mjs from dropdown-menu.ts — hand-edit only the root/trigger/content in ./menubar.ts.\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n forwardRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { cn } from '@loomui-ng/ui/utils';\nimport {\n UI_MENU_CTX,\n UI_MENU_ITEM,\n UI_MENU_SUB,\n UiMenuItemBase,\n UiMenuSubBase,\n UiMenuSubTriggerBase,\n UiMenuContentBase,\n UiMenuSelectEvent,\n} from '@loomui-ng/ui/utils';\nimport { type Align } from '@loomui-ng/ui/utils';\nimport { contentChildren } from '@angular/core';\nimport { UiIconSvg } from '@loomui-ng/ui/icon';\nimport { contextMenuCheckboxItemClass, contextMenuLabelClass, contextMenuRadioItemClass, contextMenuContentClass } from '@loomui-ng/ui/context-menu';\nimport { menubarItemClass, menubarSubTriggerClass, menubarSeparatorClass, menubarShortcutClass, menubarContentClass } from './menubar';\nimport { UiElementHost } from '@loomui-ng/ui/utils';\n\nexport { UiMenuSelectEvent };\n\nconst ITEM_CLASS = menubarItemClass;\nconst SUB_TRIGGER_CLASS = menubarSubTriggerClass;\nconst CHECKBOX_CLASS = contextMenuCheckboxItemClass.replace(/context-menu/g, 'menubar');\nconst RADIO_CLASS = contextMenuRadioItemClass.replace(/context-menu/g, 'menubar');\nconst LABEL_CLASS = contextMenuLabelClass.replace(/context-menu/g, 'menubar');\nconst SEPARATOR_CLASS = menubarSeparatorClass;\nconst SHORTCUT_CLASS = menubarShortcutClass;\nconst CONTENT_CLASS = menubarContentClass;\n\n@Directive({\n selector: '[uiMenubarItem], ui-menubar-item', hostDirectives: [UiElementHost],\n providers: [{ provide: UI_MENU_ITEM, useExisting: forwardRef(() => UiMenubarItem) }],\n host: {\n tabindex: '-1',\n '[attr.data-disabled]': 'disabled ? \"\" : null',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-highlighted]': 'highlighted() ? \"\" : null',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(pointermove)': 'onPointerMove()',\n '(pointerleave)': 'onPointerLeave()',\n '(click)': 'activate()',\n 'data-slot': 'menubar-item',\n role: 'menuitem',\n '[attr.data-variant]': 'variant()',\n '[attr.data-inset]': 'inset() ? \"\" : null',\n '[attr.class]': 'classes()',\n },\n})\nexport class UiMenubarItem extends UiMenuItemBase {\n readonly variant = input<'default' | 'destructive'>('default');\n readonly inset = input(false, { transform: booleanAttribute });\n protected readonly classes = computed(() => cn(ITEM_CLASS, this.userClass()));\n}\n\nconst CHECK =\n '<svg uiIcon=\"check\" class=\"size-4\"></svg>';\n\n@Component({\n selector: '[uiMenubarCheckboxItem], ui-menubar-checkbox-item', hostDirectives: [UiElementHost],\n imports: [UiIconSvg],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: UI_MENU_ITEM, useExisting: forwardRef(() => UiMenubarCheckboxItem) }],\n host: {\n tabindex: '-1',\n '[attr.data-disabled]': 'disabled ? \"\" : null',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-highlighted]': 'highlighted() ? \"\" : null',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(pointermove)': 'onPointerMove()',\n '(pointerleave)': 'onPointerLeave()',\n '(click)': 'activate()',\n 'data-slot': 'menubar-checkbox-item',\n role: 'menuitemcheckbox',\n '[attr.aria-checked]': 'checked()',\n '[attr.data-state]': 'checked() ? \"checked\" : \"unchecked\"',\n '[attr.data-inset]': 'inset() ? \"\" : null',\n '[attr.class]': 'classes()',\n },\n template: `\n <ng-content />\n <span class=\"pointer-events-none absolute end-2 flex items-center justify-center\" data-slot=\"menubar-checkbox-item-indicator\">\n @if (checked()) { ${CHECK} }\n </span>\n `,\n})\nexport class UiMenubarCheckboxItem extends UiMenuItemBase {\n readonly checked = model(false);\n readonly inset = input(false, { transform: booleanAttribute });\n protected readonly classes = computed(() => cn(CHECKBOX_CLASS, this.userClass()));\n protected override beforeSelect(): void {\n this.checked.update((v) => !v);\n }\n}\n\n@Directive({\n selector: '[uiMenubarRadioGroup], ui-menubar-radio-group', hostDirectives: [UiElementHost],\n host: { role: 'group', 'data-slot': 'menubar-radio-group' },\n})\nexport class UiMenubarRadioGroup {\n readonly value = model<string | undefined>(undefined);\n}\n\n@Component({\n selector: '[uiMenubarRadioItem], ui-menubar-radio-item', hostDirectives: [UiElementHost],\n imports: [UiIconSvg],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: UI_MENU_ITEM, useExisting: forwardRef(() => UiMenubarRadioItem) }],\n host: {\n tabindex: '-1',\n '[attr.data-disabled]': 'disabled ? \"\" : null',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-highlighted]': 'highlighted() ? \"\" : null',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(pointermove)': 'onPointerMove()',\n '(pointerleave)': 'onPointerLeave()',\n '(click)': 'activate()',\n 'data-slot': 'menubar-radio-item',\n role: 'menuitemradio',\n '[attr.aria-checked]': 'checked()',\n '[attr.data-state]': 'checked() ? \"checked\" : \"unchecked\"',\n '[attr.data-inset]': 'inset() ? \"\" : null',\n '[attr.class]': 'classes()',\n },\n template: `\n <ng-content />\n <span class=\"pointer-events-none absolute end-2 flex items-center justify-center\" data-slot=\"menubar-radio-item-indicator\">\n @if (checked()) { ${CHECK} }\n </span>\n `,\n})\nexport class UiMenubarRadioItem extends UiMenuItemBase {\n private readonly group = inject(UiMenubarRadioGroup);\n readonly value = input<string>('');\n readonly inset = input(false, { transform: booleanAttribute });\n protected readonly checked = computed(() => this.group.value() === this.value());\n protected readonly classes = computed(() => cn(RADIO_CLASS, this.userClass()));\n protected override beforeSelect(): void {\n this.group.value.set(this.value());\n }\n}\n\n/** Sub-menu: <div uiMenubarSub><div uiMenubarSubTrigger>More</div><div uiMenubarSubContent>…</div></div> */\n@Directive({\n selector: '[uiMenubarSub], ui-menubar-sub', hostDirectives: [UiElementHost],\n providers: [\n { provide: UI_MENU_CTX, useExisting: forwardRef(() => UiMenubarSub) },\n { provide: UI_MENU_SUB, useExisting: forwardRef(() => UiMenubarSub) },\n ],\n})\nexport class UiMenubarSub extends UiMenuSubBase {}\n\n@Component({\n selector: '[uiMenubarSubTrigger], ui-menubar-sub-trigger', hostDirectives: [UiElementHost],\n imports: [UiIconSvg],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: UI_MENU_ITEM, useExisting: forwardRef(() => UiMenubarSubTrigger) }],\n host: {\n tabindex: '-1',\n '[attr.data-disabled]': 'disabled ? \"\" : null',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-highlighted]': 'highlighted() ? \"\" : null',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(pointermove)': 'onPointerMove()',\n '(pointerleave)': 'onPointerLeave()',\n '(click)': 'activate()',\n 'data-slot': 'menubar-sub-trigger',\n role: 'menuitem',\n 'aria-haspopup': 'menu',\n '[attr.aria-expanded]': 'sub.open()',\n '[attr.data-state]': 'sub.open() ? \"open\" : \"closed\"',\n '[attr.data-inset]': 'inset() ? \"\" : null',\n '[attr.class]': 'classes()',\n },\n template: `\n <ng-content />\n <svg uiIcon=\"chevron-right\" class=\"ms-auto rtl:rotate-180\"></svg>\n `,\n})\nexport class UiMenubarSubTrigger extends UiMenuSubTriggerBase {\n readonly inset = input(false, { transform: booleanAttribute });\n protected readonly classes = computed(() => cn(SUB_TRIGGER_CLASS, this.userClass()));\n}\n\n@Directive({\n selector: '[uiMenubarSubContent], ui-menubar-sub-content', hostDirectives: [UiElementHost],\n host: {\n role: 'menu',\n 'aria-orientation': 'vertical',\n 'data-slot': 'menubar-sub-content',\n tabindex: '-1',\n '[attr.data-state]': 'root.state()',\n '[attr.dir]': 'dir.value',\n '[attr.class]': 'classes()',\n '(keydown)': 'onMenuKeydown($event)',\n },\n})\nexport class UiMenubarSubContent extends UiMenuContentBase {\n protected readonly root = inject(UiMenubarSub);\n protected readonly menu = this.root;\n protected readonly varPrefix = '--radix-menubar';\n override readonly side = input<'top' | 'right' | 'bottom' | 'left'>('right');\n override readonly align = input<Align>('start');\n override readonly sideOffset = input(0);\n private readonly items = contentChildren<UiMenuItemBase>(UI_MENU_ITEM, { descendants: true });\n protected readonly classes = computed(() => cn(CONTENT_CLASS, 'w-auto', this.userClass()));\n protected menuItems(): readonly UiMenuItemBase[] {\n return this.items();\n }\n constructor() {\n super();\n this.isSub = true;\n this.init();\n }\n}\n\n@Directive({\n selector: '[uiMenubarLabel], ui-menubar-label', hostDirectives: [UiElementHost],\n host: { 'data-slot': 'menubar-label', '[attr.data-inset]': 'inset() ? \"\" : null', '[attr.class]': 'classes()' },\n})\nexport class UiMenubarLabel {\n readonly inset = input(false, { transform: booleanAttribute });\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(LABEL_CLASS, this.userClass()));\n}\n\n@Directive({\n selector: '[uiMenubarSeparator], ui-menubar-separator', hostDirectives: [UiElementHost],\n host: { role: 'separator', 'aria-orientation': 'horizontal', 'data-slot': 'menubar-separator', '[attr.class]': 'classes()' },\n})\nexport class UiMenubarSeparator {\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(SEPARATOR_CLASS, this.userClass()));\n}\n\n@Directive({\n selector: '[uiMenubarShortcut], ui-menubar-shortcut', hostDirectives: [UiElementHost],\n host: { 'data-slot': 'menubar-shortcut', '[attr.class]': 'classes()' },\n})\nexport class UiMenubarShortcut {\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(SHORTCUT_CLASS, this.userClass()));\n}\n\n@Directive({\n selector: '[uiMenubarGroup], ui-menubar-group', hostDirectives: [UiElementHost],\n host: { role: 'group', 'data-slot': 'menubar-group' },\n})\nexport class UiMenubarGroup {}\n\n\nexport const MENUBAR_SHARED = [\n UiMenubarItem,\n UiMenubarCheckboxItem,\n UiMenubarRadioGroup,\n UiMenubarRadioItem,\n UiMenubarSub,\n UiMenubarSubTrigger,\n UiMenubarSubContent,\n UiMenubarLabel,\n UiMenubarSeparator,\n UiMenubarShortcut,\n UiMenubarGroup,\n] as const;\n","import {\n computed,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { cn } from '@loomui-ng/ui/utils';\nimport { UI_MENU_CTX, UI_MENU_ITEM, UiMenuContentBase, UiMenuItemBase, UiMenuRootBase } from '@loomui-ng/ui/utils';\nimport { type Align } from '@loomui-ng/ui/utils';\nimport { menubarClass, menubarContentClass, menubarTriggerClass } from './menubar';\nimport { MENUBAR_SHARED } from './menubar.shared';\nimport { UiElementHost } from '@loomui-ng/ui/utils';\n\n/**\n * <div uiMenubar class=\"w-72\">\n * <div uiMenubarMenu>\n * <button uiMenubarTrigger>File</button>\n * <div uiMenubarContent> <div uiMenubarItem>New</div> … </div>\n * </div>\n * </div>\n * Observed: role=\"menubar\", triggers role=\"menuitem\" with roving tabindex (0/-1), content `data-radix-menubar-content`.\n * Behavior: ArrowLeft/Right move between triggers; while one menu is open, ArrowLeft/Right (outside sub-menus) and hovering\n * another trigger switch menus. The root tabindex=0 seen on the live page is omitted (it would add a second tab stop).\n */\n@Directive({\n selector: '[uiMenubar], ui-menubar', hostDirectives: [UiElementHost],\n exportAs: 'uiMenubar',\n host: {\n role: 'menubar',\n 'data-slot': 'menubar',\n 'data-orientation': 'horizontal',\n '[attr.class]': 'classes()',\n },\n})\nexport class UiMenubar {\n readonly userClass = input<string>('', { alias: 'class' });\n readonly menus = contentChildren(forwardRef(() => UiMenubarMenu), { descendants: true });\n readonly active = signal<UiMenubarMenu | null>(null);\n /** Last trigger that had focus/was open: it stays the roving tab stop after the menu closes. */\n readonly lastActive = signal<UiMenubarMenu | null>(null);\n protected readonly classes = computed(() => cn(menubarClass, this.userClass()));\n\n activate(menu: UiMenubarMenu | null): void {\n this.active.set(menu);\n if (menu) this.lastActive.set(menu);\n for (const m of this.menus()) if (m !== menu && m.open()) m.open.set(false);\n }\n\n /** Move to the neighbouring menu (wraps); open it when `open` is true. */\n step(from: UiMenubarMenu, dir: 'prev' | 'next', open: boolean): void {\n const menus = this.menus();\n const i = menus.indexOf(from);\n const target = menus[(i + (dir === 'next' ? 1 : -1) + menus.length) % menus.length];\n if (!target) return;\n target.keyboardOpen = open ? 'first' : null;\n target.triggerEl()?.focus();\n if (open) {\n this.activate(target);\n target.open.set(true);\n }\n }\n\n /** Roving tabindex: the first trigger is the tab stop (or the open menu's). */\n tabStop = computed(() => this.active() ?? this.lastActive() ?? this.menus()[0] ?? null);\n}\n\n@Directive({\n selector: '[uiMenubarMenu], ui-menubar-menu', hostDirectives: [UiElementHost],\n exportAs: 'uiMenubarMenu',\n providers: [{ provide: UI_MENU_CTX, useExisting: forwardRef(() => UiMenubarMenu) }],\n})\nexport class UiMenubarMenu extends UiMenuRootBase {\n readonly bar = inject(UiMenubar);\n readonly triggerEl = this.trigger;\n\n constructor() {\n super();\n effect(() => {\n const open = this.open();\n untracked(() => {\n if (open) this.bar.activate(this);\n else if (this.bar.active() === this) this.bar.active.set(null);\n });\n });\n }\n\n horizontal(dir: 'prev' | 'next'): void {\n this.bar.step(this, dir, true);\n }\n}\n\n@Directive({\n selector: '[uiMenubarTrigger], ui-menubar-trigger', hostDirectives: [UiElementHost],\n host: {\n role: 'menuitem',\n 'aria-haspopup': 'menu',\n 'data-slot': 'menubar-trigger',\n 'data-orientation': 'horizontal',\n '[attr.id]': 'menu.triggerId()',\n '[attr.aria-expanded]': 'menu.open()',\n '[attr.aria-controls]': 'menu.open() ? menu.id : null',\n '[attr.data-state]': 'menu.open() ? \"open\" : \"closed\"',\n '[attr.tabindex]': 'menu.bar.tabStop() === menu ? 0 : -1',\n '[attr.class]': 'classes()',\n '(click)': 'onClick()',\n '(focus)': 'menu.bar.lastActive.set(menu)',\n '(pointerenter)': 'onEnter()',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class UiMenubarTrigger {\n protected readonly menu = inject(UiMenubarMenu);\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(menubarTriggerClass, this.userClass()));\n\n constructor() {\n const el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n this.menu.trigger.set(el);\n this.menu.triggerId.set(el.id || `${this.menu.id}-trigger`);\n }\n\n protected onClick(): void {\n this.menu.keyboardOpen = null;\n this.menu.toggle();\n }\n protected onEnter(): void {\n const active = this.menu.bar.active();\n if (active && active !== this.menu) {\n this.menu.keyboardOpen = null;\n this.menu.open.set(true);\n }\n }\n protected onKeydown(e: KeyboardEvent): void {\n const rtl = this.menu.dirIsRtl();\n const next = rtl ? 'ArrowLeft' : 'ArrowRight';\n const prev = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault();\n this.menu.keyboardOpen = 'first';\n this.menu.open.set(true);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.menu.keyboardOpen = 'last';\n this.menu.open.set(true);\n } else if (e.key === next) {\n e.preventDefault();\n this.menu.bar.step(this.menu, 'next', false);\n } else if (e.key === prev) {\n e.preventDefault();\n this.menu.bar.step(this.menu, 'prev', false);\n }\n }\n}\n\n@Directive({\n selector: '[uiMenubarContent], ui-menubar-content', hostDirectives: [UiElementHost],\n host: {\n role: 'menu',\n 'aria-orientation': 'vertical',\n 'data-slot': 'menubar-content',\n 'data-orientation': 'vertical',\n 'data-radix-menubar-content': '',\n tabindex: '-1',\n '[id]': 'root.id',\n '[attr.aria-labelledby]': 'root.triggerId()',\n '[attr.data-state]': 'root.state()',\n '[attr.dir]': 'dir.value',\n '[attr.class]': 'classes()',\n '(keydown)': 'onMenuKeydown($event)',\n },\n})\nexport class UiMenubarContent extends UiMenuContentBase {\n protected readonly root = inject(UiMenubarMenu);\n protected readonly menu = this.root;\n protected readonly varPrefix = '--radix-menubar';\n override readonly align = input<Align>('start');\n override readonly sideOffset = input(8);\n private readonly items = contentChildren<UiMenuItemBase>(UI_MENU_ITEM, { descendants: true });\n protected readonly classes = computed(() => cn(menubarContentClass, this.userClass()));\n protected menuItems(): readonly UiMenuItemBase[] {\n return this.items();\n }\n constructor() {\n super();\n this.init();\n }\n}\n\nexport const UI_MENUBAR = [UiMenubar, UiMenubarMenu, UiMenubarTrigger, UiMenubarContent, ...MENUBAR_SHARED] as const;\n"],"mappings":"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"}
@@ -0,0 +1,519 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, booleanAttribute, computed, inject, input, signal } from "@angular/core";
3
+ import * as i1 from "@loomui-ng/ui/utils";
4
+ import { UiElementHost, cn } from "@loomui-ng/ui/utils";
5
+ import { UiIconSvg } from "@loomui-ng/ui/icon";
6
+ const messageScrollerClass = "group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden";
7
+ const messageScrollerViewportClass = "size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent data-pending-scroll:invisible";
8
+ const messageScrollerContentClass = "flex h-max min-h-full flex-col gap-8 p-(--card-spacing) gap-4";
9
+ const messageScrollerItemClass = "min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]";
10
+ const messageScrollerButtonClass = "group/button inline-flex shrink-0 items-center justify-center rounded-2xl border bg-clip-padding text-sm font-medium whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-7 absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180";
11
+ const UI_MESSAGE_SCROLLER_GENERATED = [];
12
+ var UiMessageScroller = class UiMessageScroller {
13
+ userClass = input("", {
14
+ ...ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {},
15
+ alias: "class"
16
+ });
17
+ scrollable = signal("", ...ngDevMode ? [{ debugName: "scrollable" }] : /* istanbul ignore next */ []);
18
+ atEnd = signal(true, ...ngDevMode ? [{ debugName: "atEnd" }] : /* istanbul ignore next */ []);
19
+ viewport = null;
20
+ classes = computed(() => cn(messageScrollerClass, this.userClass()), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
21
+ scrollToEnd(smooth = true) {
22
+ const v = this.viewport;
23
+ if (v) v.scrollTo({
24
+ top: v.scrollHeight,
25
+ behavior: smooth ? "smooth" : "auto"
26
+ });
27
+ }
28
+ update() {
29
+ const v = this.viewport;
30
+ if (!v) return;
31
+ const start = v.scrollTop > 1;
32
+ const end = v.scrollHeight - v.clientHeight - v.scrollTop > 1;
33
+ this.atEnd.set(!end);
34
+ this.scrollable.set([start ? "start" : "", end ? "end" : ""].filter(Boolean).join(" "));
35
+ }
36
+ static ɵfac = i0.ɵɵngDeclareFactory({
37
+ minVersion: "12.0.0",
38
+ version: "22.2.2",
39
+ ngImport: i0,
40
+ type: UiMessageScroller,
41
+ deps: [],
42
+ target: i0.ɵɵFactoryTarget.Component
43
+ });
44
+ static ɵcmp = i0.ɵɵngDeclareComponent({
45
+ minVersion: "17.1.0",
46
+ version: "22.2.2",
47
+ type: UiMessageScroller,
48
+ isStandalone: true,
49
+ selector: "div[uiMessageScroller], ui-message-scroller",
50
+ inputs: { userClass: {
51
+ classPropertyName: "userClass",
52
+ publicName: "class",
53
+ isSignal: true,
54
+ isRequired: false,
55
+ transformFunction: null
56
+ } },
57
+ host: {
58
+ attributes: { "data-slot": "message-scroller" },
59
+ properties: {
60
+ "attr.data-scrollable": "scrollable() || null",
61
+ "attr.class": "classes()"
62
+ }
63
+ },
64
+ hostDirectives: [{ directive: i1.UiElementHost }],
65
+ ngImport: i0,
66
+ template: `<ng-content />`,
67
+ isInline: true,
68
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
69
+ });
70
+ };
71
+ i0.ɵɵngDeclareClassMetadata({
72
+ minVersion: "12.0.0",
73
+ version: "22.2.2",
74
+ ngImport: i0,
75
+ type: UiMessageScroller,
76
+ decorators: [{
77
+ type: Component,
78
+ args: [{
79
+ selector: "div[uiMessageScroller], ui-message-scroller",
80
+ hostDirectives: [UiElementHost],
81
+ changeDetection: ChangeDetectionStrategy.OnPush,
82
+ host: {
83
+ "data-slot": "message-scroller",
84
+ "[attr.data-scrollable]": "scrollable() || null",
85
+ "[attr.class]": "classes()"
86
+ },
87
+ template: `<ng-content />`
88
+ }]
89
+ }],
90
+ propDecorators: { userClass: [{
91
+ type: i0.Input,
92
+ args: [{
93
+ isSignal: true,
94
+ alias: "class",
95
+ required: false
96
+ }]
97
+ }] }
98
+ });
99
+ var UiMessageScrollerViewport = class UiMessageScrollerViewport {
100
+ root = inject(UiMessageScroller);
101
+ userClass = input("", {
102
+ ...ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {},
103
+ alias: "class"
104
+ });
105
+ classes = computed(() => cn(messageScrollerViewportClass, this.userClass()), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
106
+ constructor() {
107
+ this.root.viewport = inject(ElementRef).nativeElement;
108
+ queueMicrotask(() => {
109
+ this.root.scrollToEnd(false);
110
+ this.root.update();
111
+ });
112
+ }
113
+ static ɵfac = i0.ɵɵngDeclareFactory({
114
+ minVersion: "12.0.0",
115
+ version: "22.2.2",
116
+ ngImport: i0,
117
+ type: UiMessageScrollerViewport,
118
+ deps: [],
119
+ target: i0.ɵɵFactoryTarget.Directive
120
+ });
121
+ static ɵdir = i0.ɵɵngDeclareDirective({
122
+ minVersion: "17.1.0",
123
+ version: "22.2.2",
124
+ type: UiMessageScrollerViewport,
125
+ isStandalone: true,
126
+ selector: "[uiMessageScrollerViewport], ui-message-scroller-viewport",
127
+ inputs: { userClass: {
128
+ classPropertyName: "userClass",
129
+ publicName: "class",
130
+ isSignal: true,
131
+ isRequired: false,
132
+ transformFunction: null
133
+ } },
134
+ host: {
135
+ attributes: {
136
+ "role": "region",
137
+ "aria-label": "Messages",
138
+ "tabindex": "0",
139
+ "data-slot": "message-scroller-viewport"
140
+ },
141
+ listeners: { "scroll": "root.update()" },
142
+ properties: {
143
+ "attr.data-scrollable": "root.scrollable() || null",
144
+ "attr.class": "classes()"
145
+ }
146
+ },
147
+ hostDirectives: [{ directive: i1.UiElementHost }],
148
+ ngImport: i0
149
+ });
150
+ };
151
+ i0.ɵɵngDeclareClassMetadata({
152
+ minVersion: "12.0.0",
153
+ version: "22.2.2",
154
+ ngImport: i0,
155
+ type: UiMessageScrollerViewport,
156
+ decorators: [{
157
+ type: Directive,
158
+ args: [{
159
+ selector: "[uiMessageScrollerViewport], ui-message-scroller-viewport",
160
+ hostDirectives: [UiElementHost],
161
+ host: {
162
+ role: "region",
163
+ "aria-label": "Messages",
164
+ tabindex: "0",
165
+ "data-slot": "message-scroller-viewport",
166
+ "[attr.data-scrollable]": "root.scrollable() || null",
167
+ "[attr.class]": "classes()",
168
+ "(scroll)": "root.update()"
169
+ }
170
+ }]
171
+ }],
172
+ ctorParameters: () => [],
173
+ propDecorators: { userClass: [{
174
+ type: i0.Input,
175
+ args: [{
176
+ isSignal: true,
177
+ alias: "class",
178
+ required: false
179
+ }]
180
+ }] }
181
+ });
182
+ var UiMessageScrollerContent = class UiMessageScrollerContent {
183
+ root = inject(UiMessageScroller);
184
+ el = inject(ElementRef).nativeElement;
185
+ busy = input(false, {
186
+ ...ngDevMode ? { debugName: "busy" } : /* istanbul ignore next */ {},
187
+ transform: booleanAttribute
188
+ });
189
+ userClass = input("", {
190
+ ...ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {},
191
+ alias: "class"
192
+ });
193
+ classes = computed(() => cn(messageScrollerContentClass, this.userClass()), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
194
+ constructor() {
195
+ if (typeof ResizeObserver === "undefined") return;
196
+ let stick = true;
197
+ const ro = new ResizeObserver(() => {
198
+ if (stick) this.root.scrollToEnd(false);
199
+ this.root.update();
200
+ });
201
+ ro.observe(this.el);
202
+ const onScroll = () => stick = this.root.atEnd();
203
+ queueMicrotask(() => this.root.viewport?.addEventListener("scroll", onScroll, { passive: true }));
204
+ inject(DestroyRef).onDestroy(() => {
205
+ ro.disconnect();
206
+ this.root.viewport?.removeEventListener("scroll", onScroll);
207
+ });
208
+ }
209
+ static ɵfac = i0.ɵɵngDeclareFactory({
210
+ minVersion: "12.0.0",
211
+ version: "22.2.2",
212
+ ngImport: i0,
213
+ type: UiMessageScrollerContent,
214
+ deps: [],
215
+ target: i0.ɵɵFactoryTarget.Directive
216
+ });
217
+ static ɵdir = i0.ɵɵngDeclareDirective({
218
+ minVersion: "17.1.0",
219
+ version: "22.2.2",
220
+ type: UiMessageScrollerContent,
221
+ isStandalone: true,
222
+ selector: "[uiMessageScrollerContent], ui-message-scroller-content",
223
+ inputs: {
224
+ busy: {
225
+ classPropertyName: "busy",
226
+ publicName: "busy",
227
+ isSignal: true,
228
+ isRequired: false,
229
+ transformFunction: null
230
+ },
231
+ userClass: {
232
+ classPropertyName: "userClass",
233
+ publicName: "class",
234
+ isSignal: true,
235
+ isRequired: false,
236
+ transformFunction: null
237
+ }
238
+ },
239
+ host: {
240
+ attributes: {
241
+ "role": "log",
242
+ "aria-relevant": "additions",
243
+ "data-slot": "message-scroller-content"
244
+ },
245
+ properties: {
246
+ "attr.aria-busy": "busy()",
247
+ "attr.class": "classes()"
248
+ }
249
+ },
250
+ hostDirectives: [{ directive: i1.UiElementHost }],
251
+ ngImport: i0
252
+ });
253
+ };
254
+ i0.ɵɵngDeclareClassMetadata({
255
+ minVersion: "12.0.0",
256
+ version: "22.2.2",
257
+ ngImport: i0,
258
+ type: UiMessageScrollerContent,
259
+ decorators: [{
260
+ type: Directive,
261
+ args: [{
262
+ selector: "[uiMessageScrollerContent], ui-message-scroller-content",
263
+ hostDirectives: [UiElementHost],
264
+ host: {
265
+ role: "log",
266
+ "aria-relevant": "additions",
267
+ "[attr.aria-busy]": "busy()",
268
+ "data-slot": "message-scroller-content",
269
+ "[attr.class]": "classes()"
270
+ }
271
+ }]
272
+ }],
273
+ ctorParameters: () => [],
274
+ propDecorators: {
275
+ busy: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "busy",
280
+ required: false
281
+ }]
282
+ }],
283
+ userClass: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "class",
288
+ required: false
289
+ }]
290
+ }]
291
+ }
292
+ });
293
+ var UiMessageScrollerItem = class UiMessageScrollerItem {
294
+ el = inject(ElementRef).nativeElement;
295
+ messageId = input("", ...ngDevMode ? [{ debugName: "messageId" }] : /* istanbul ignore next */ []);
296
+ scrollAnchor = input(false, {
297
+ ...ngDevMode ? { debugName: "scrollAnchor" } : /* istanbul ignore next */ {},
298
+ transform: booleanAttribute
299
+ });
300
+ userClass = input("", {
301
+ ...ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {},
302
+ alias: "class"
303
+ });
304
+ classes = computed(() => cn(messageScrollerItemClass, this.userClass()), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
305
+ constructor() {
306
+ queueMicrotask(() => {
307
+ if (this.scrollAnchor()) this.el.scrollIntoView({
308
+ block: "start",
309
+ behavior: "smooth"
310
+ });
311
+ });
312
+ }
313
+ static ɵfac = i0.ɵɵngDeclareFactory({
314
+ minVersion: "12.0.0",
315
+ version: "22.2.2",
316
+ ngImport: i0,
317
+ type: UiMessageScrollerItem,
318
+ deps: [],
319
+ target: i0.ɵɵFactoryTarget.Directive
320
+ });
321
+ static ɵdir = i0.ɵɵngDeclareDirective({
322
+ minVersion: "17.1.0",
323
+ version: "22.2.2",
324
+ type: UiMessageScrollerItem,
325
+ isStandalone: true,
326
+ selector: "[uiMessageScrollerItem], ui-message-scroller-item",
327
+ inputs: {
328
+ messageId: {
329
+ classPropertyName: "messageId",
330
+ publicName: "messageId",
331
+ isSignal: true,
332
+ isRequired: false,
333
+ transformFunction: null
334
+ },
335
+ scrollAnchor: {
336
+ classPropertyName: "scrollAnchor",
337
+ publicName: "scrollAnchor",
338
+ isSignal: true,
339
+ isRequired: false,
340
+ transformFunction: null
341
+ },
342
+ userClass: {
343
+ classPropertyName: "userClass",
344
+ publicName: "class",
345
+ isSignal: true,
346
+ isRequired: false,
347
+ transformFunction: null
348
+ }
349
+ },
350
+ host: {
351
+ attributes: { "data-slot": "message-scroller-item" },
352
+ properties: {
353
+ "attr.data-message-id": "messageId() || null",
354
+ "attr.data-scroll-anchor": "scrollAnchor()",
355
+ "attr.class": "classes()"
356
+ }
357
+ },
358
+ hostDirectives: [{ directive: i1.UiElementHost }],
359
+ ngImport: i0
360
+ });
361
+ };
362
+ i0.ɵɵngDeclareClassMetadata({
363
+ minVersion: "12.0.0",
364
+ version: "22.2.2",
365
+ ngImport: i0,
366
+ type: UiMessageScrollerItem,
367
+ decorators: [{
368
+ type: Directive,
369
+ args: [{
370
+ selector: "[uiMessageScrollerItem], ui-message-scroller-item",
371
+ hostDirectives: [UiElementHost],
372
+ host: {
373
+ "data-slot": "message-scroller-item",
374
+ "[attr.data-message-id]": "messageId() || null",
375
+ "[attr.data-scroll-anchor]": "scrollAnchor()",
376
+ "[attr.class]": "classes()"
377
+ }
378
+ }]
379
+ }],
380
+ ctorParameters: () => [],
381
+ propDecorators: {
382
+ messageId: [{
383
+ type: i0.Input,
384
+ args: [{
385
+ isSignal: true,
386
+ alias: "messageId",
387
+ required: false
388
+ }]
389
+ }],
390
+ scrollAnchor: [{
391
+ type: i0.Input,
392
+ args: [{
393
+ isSignal: true,
394
+ alias: "scrollAnchor",
395
+ required: false
396
+ }]
397
+ }],
398
+ userClass: [{
399
+ type: i0.Input,
400
+ args: [{
401
+ isSignal: true,
402
+ alias: "class",
403
+ required: false
404
+ }]
405
+ }]
406
+ }
407
+ });
408
+ var UiMessageScrollerButton = class UiMessageScrollerButton {
409
+ root = inject(UiMessageScroller);
410
+ userClass = input("", {
411
+ ...ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {},
412
+ alias: "class"
413
+ });
414
+ classes = computed(() => cn(messageScrollerButtonClass, this.userClass()), ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
415
+ static ɵfac = i0.ɵɵngDeclareFactory({
416
+ minVersion: "12.0.0",
417
+ version: "22.2.2",
418
+ ngImport: i0,
419
+ type: UiMessageScrollerButton,
420
+ deps: [],
421
+ target: i0.ɵɵFactoryTarget.Component
422
+ });
423
+ static ɵcmp = i0.ɵɵngDeclareComponent({
424
+ minVersion: "17.1.0",
425
+ version: "22.2.2",
426
+ type: UiMessageScrollerButton,
427
+ isStandalone: true,
428
+ selector: "button[uiMessageScrollerButton], ui-message-scroller-button",
429
+ inputs: { userClass: {
430
+ classPropertyName: "userClass",
431
+ publicName: "class",
432
+ isSignal: true,
433
+ isRequired: false,
434
+ transformFunction: null
435
+ } },
436
+ host: {
437
+ attributes: {
438
+ "type": "button",
439
+ "data-slot": "message-scroller-button",
440
+ "data-variant": "secondary",
441
+ "data-size": "icon-sm",
442
+ "data-direction": "end"
443
+ },
444
+ listeners: { "click": "root.scrollToEnd()" },
445
+ properties: {
446
+ "attr.data-active": "!root.atEnd()",
447
+ "attr.inert": "root.atEnd() ? \"\" : null",
448
+ "attr.tabindex": "root.atEnd() ? -1 : null",
449
+ "attr.class": "classes()"
450
+ }
451
+ },
452
+ hostDirectives: [{ directive: i1.UiElementHost }],
453
+ ngImport: i0,
454
+ template: `<svg uiIcon="arrow-down" class="size-4"></svg>`,
455
+ isInline: true,
456
+ dependencies: [{
457
+ kind: "directive",
458
+ type: UiIconSvg,
459
+ selector: "svg[uiIcon]",
460
+ inputs: [
461
+ "uiIcon",
462
+ "icon",
463
+ "size",
464
+ "strokeWidth",
465
+ "absoluteStrokeWidth",
466
+ "color",
467
+ "label",
468
+ "class"
469
+ ]
470
+ }],
471
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
472
+ });
473
+ };
474
+ i0.ɵɵngDeclareClassMetadata({
475
+ minVersion: "12.0.0",
476
+ version: "22.2.2",
477
+ ngImport: i0,
478
+ type: UiMessageScrollerButton,
479
+ decorators: [{
480
+ type: Component,
481
+ args: [{
482
+ selector: "button[uiMessageScrollerButton], ui-message-scroller-button",
483
+ hostDirectives: [UiElementHost],
484
+ imports: [UiIconSvg],
485
+ changeDetection: ChangeDetectionStrategy.OnPush,
486
+ host: {
487
+ type: "button",
488
+ "data-slot": "message-scroller-button",
489
+ "data-variant": "secondary",
490
+ "data-size": "icon-sm",
491
+ "data-direction": "end",
492
+ "[attr.data-active]": "!root.atEnd()",
493
+ "[attr.inert]": "root.atEnd() ? \"\" : null",
494
+ "[attr.tabindex]": "root.atEnd() ? -1 : null",
495
+ "[attr.class]": "classes()",
496
+ "(click)": "root.scrollToEnd()"
497
+ },
498
+ template: `<svg uiIcon="arrow-down" class="size-4"></svg>`
499
+ }]
500
+ }],
501
+ propDecorators: { userClass: [{
502
+ type: i0.Input,
503
+ args: [{
504
+ isSignal: true,
505
+ alias: "class",
506
+ required: false
507
+ }]
508
+ }] }
509
+ });
510
+ const UI_MESSAGE_SCROLLER = [
511
+ UiMessageScroller,
512
+ UiMessageScrollerViewport,
513
+ UiMessageScrollerContent,
514
+ UiMessageScrollerItem,
515
+ UiMessageScrollerButton
516
+ ];
517
+ export { UI_MESSAGE_SCROLLER, UI_MESSAGE_SCROLLER_GENERATED, UiMessageScroller, UiMessageScrollerButton, UiMessageScrollerContent, UiMessageScrollerItem, UiMessageScrollerViewport, messageScrollerButtonClass, messageScrollerClass, messageScrollerContentClass, messageScrollerItemClass, messageScrollerViewportClass };
518
+
519
+ //# sourceMappingURL=loomui-ng-ui-message-scroller.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loomui-ng-ui-message-scroller.mjs","names":[],"sources":["../../../libs/ui/message-scroller/message-scroller.ts","../../../libs/ui/message-scroller/message-scroller.manual.ts"],"sourcesContent":["// GENERATED by tools/gen-ui.mjs from docs/evidence/slots/message-scroller.json.\n// Change tools/ui-specs.mjs and regenerate; hand-written parts live in ./message-scroller.manual.ts.\nimport { Directive, computed, input } from '@angular/core';\nimport { cn } from '@loomui-ng/ui/utils';\n\nexport const messageScrollerClass =\n 'group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden';\n\nexport const messageScrollerViewportClass =\n 'size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent data-pending-scroll:invisible';\n\nexport const messageScrollerContentClass =\n 'flex h-max min-h-full flex-col gap-8 p-(--card-spacing) gap-4';\n\nexport const messageScrollerItemClass =\n 'min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]';\n\nexport const messageScrollerButtonClass =\n 'group/button inline-flex shrink-0 items-center justify-center rounded-2xl border bg-clip-padding text-sm font-medium whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\\'size-\\'])]:size-4 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-7 absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180';\n\nexport const UI_MESSAGE_SCROLLER_GENERATED = [] as const;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { cn } from '@loomui-ng/ui/utils';\nimport {\n messageScrollerButtonClass,\n messageScrollerClass,\n messageScrollerContentClass,\n messageScrollerItemClass,\n messageScrollerViewportClass,\n} from './message-scroller';\nimport { UiIconSvg } from '@loomui-ng/ui/icon';\nimport { UiElementHost } from '@loomui-ng/ui/utils';\n\n/**\n * Chat viewport that sticks to the newest message.\n * <div uiMessageScroller class=\"h-96\">\n * <div uiMessageScrollerViewport>\n * <div uiMessageScrollerContent>\n * <div uiMessageScrollerItem messageId=\"m1\">…</div>\n * </div>\n * </div>\n * <button uiMessageScrollerButton aria-label=\"Scroll to latest\"></button>\n * </div>\n * Observed: viewport role=\"region\" aria-label=\"Messages\" tabindex=0, content role=\"log\" aria-relevant=\"additions\" aria-busy,\n * items data-message-id / data-scroll-anchor, root+viewport data-scrollable=\"start|end|start end\" (edges that have more\n * content), button data-direction=\"end\" data-active toggled with inert/tabindex=-1 while inactive.\n * Own reconstruction of the behavior: while the user is at the end, new content keeps the view at the end; scrolling up\n * releases it; the button (visible when more content is below) scrolls back. `scrollAnchor` items scroll their top into view\n * when they are added.\n */\n@Component({\n selector: 'div[uiMessageScroller], ui-message-scroller', hostDirectives: [UiElementHost],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'data-slot': 'message-scroller',\n '[attr.data-scrollable]': 'scrollable() || null',\n '[attr.class]': 'classes()',\n },\n template: `<ng-content />`,\n})\nexport class UiMessageScroller {\n readonly userClass = input<string>('', { alias: 'class' });\n readonly scrollable = signal<string>('');\n readonly atEnd = signal(true);\n viewport: HTMLElement | null = null;\n protected readonly classes = computed(() => cn(messageScrollerClass, this.userClass()));\n\n scrollToEnd(smooth = true): void {\n const v = this.viewport;\n if (v) v.scrollTo({ top: v.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });\n }\n\n update(): void {\n const v = this.viewport;\n if (!v) return;\n const start = v.scrollTop > 1;\n const end = v.scrollHeight - v.clientHeight - v.scrollTop > 1;\n this.atEnd.set(!end);\n this.scrollable.set([start ? 'start' : '', end ? 'end' : ''].filter(Boolean).join(' '));\n }\n}\n\n@Directive({\n selector: '[uiMessageScrollerViewport], ui-message-scroller-viewport', hostDirectives: [UiElementHost],\n host: {\n role: 'region',\n 'aria-label': 'Messages',\n tabindex: '0',\n 'data-slot': 'message-scroller-viewport',\n '[attr.data-scrollable]': 'root.scrollable() || null',\n '[attr.class]': 'classes()',\n '(scroll)': 'root.update()',\n },\n})\nexport class UiMessageScrollerViewport {\n protected readonly root = inject(UiMessageScroller);\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(messageScrollerViewportClass, this.userClass()));\n constructor() {\n this.root.viewport = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n queueMicrotask(() => {\n this.root.scrollToEnd(false);\n this.root.update();\n });\n }\n}\n\n@Directive({\n selector: '[uiMessageScrollerContent], ui-message-scroller-content', hostDirectives: [UiElementHost],\n host: {\n role: 'log',\n 'aria-relevant': 'additions',\n '[attr.aria-busy]': 'busy()',\n 'data-slot': 'message-scroller-content',\n '[attr.class]': 'classes()',\n },\n})\nexport class UiMessageScrollerContent {\n private readonly root = inject(UiMessageScroller);\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n readonly busy = input(false, { transform: booleanAttribute });\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(messageScrollerContentClass, this.userClass()));\n constructor() {\n if (typeof ResizeObserver === 'undefined') return;\n let stick = true;\n const ro = new ResizeObserver(() => {\n if (stick) this.root.scrollToEnd(false);\n this.root.update();\n });\n ro.observe(this.el);\n // remember whether the user was at the end before the content grows\n const onScroll = () => (stick = this.root.atEnd());\n queueMicrotask(() => this.root.viewport?.addEventListener('scroll', onScroll, { passive: true }));\n inject(DestroyRef).onDestroy(() => {\n ro.disconnect();\n this.root.viewport?.removeEventListener('scroll', onScroll);\n });\n }\n}\n\n@Directive({\n selector: '[uiMessageScrollerItem], ui-message-scroller-item', hostDirectives: [UiElementHost],\n host: {\n 'data-slot': 'message-scroller-item',\n '[attr.data-message-id]': 'messageId() || null',\n '[attr.data-scroll-anchor]': 'scrollAnchor()',\n '[attr.class]': 'classes()',\n },\n})\nexport class UiMessageScrollerItem {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n readonly messageId = input<string>('');\n readonly scrollAnchor = input(false, { transform: booleanAttribute });\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(messageScrollerItemClass, this.userClass()));\n constructor() {\n queueMicrotask(() => {\n if (this.scrollAnchor()) this.el.scrollIntoView({ block: 'start', behavior: 'smooth' });\n });\n }\n}\n\n/** \"Scroll to latest\" button; inert while the viewport is already at the end. */\n@Component({\n selector: 'button[uiMessageScrollerButton], ui-message-scroller-button', hostDirectives: [UiElementHost],\n imports: [UiIconSvg],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n type: 'button',\n 'data-slot': 'message-scroller-button',\n 'data-variant': 'secondary',\n 'data-size': 'icon-sm',\n 'data-direction': 'end',\n '[attr.data-active]': '!root.atEnd()',\n '[attr.inert]': 'root.atEnd() ? \"\" : null',\n '[attr.tabindex]': 'root.atEnd() ? -1 : null',\n '[attr.class]': 'classes()',\n '(click)': 'root.scrollToEnd()',\n },\n template: `<svg uiIcon=\"arrow-down\" class=\"size-4\"></svg>`,\n})\nexport class UiMessageScrollerButton {\n protected readonly root = inject(UiMessageScroller);\n readonly userClass = input<string>('', { alias: 'class' });\n protected readonly classes = computed(() => cn(messageScrollerButtonClass, this.userClass()));\n}\n\nexport const UI_MESSAGE_SCROLLER = [\n UiMessageScroller,\n UiMessageScrollerViewport,\n UiMessageScrollerContent,\n UiMessageScrollerItem,\n UiMessageScrollerButton,\n] as const;\n"],"mappings":"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"}