@tolle_/tolle-ui 18.2.29 → 18.3.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 (294) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +12 -12
  4. package/esm2022/lib/alert-dialog.component.mjs +82 -64
  5. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  6. package/esm2022/lib/alert.component.mjs +5 -11
  7. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  8. package/esm2022/lib/attachment.component.mjs +334 -0
  9. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  10. package/esm2022/lib/avatar.component.mjs +4 -9
  11. package/esm2022/lib/badge.component.mjs +4 -9
  12. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  15. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  16. package/esm2022/lib/bubble.component.mjs +301 -0
  17. package/esm2022/lib/button.component.mjs +5 -11
  18. package/esm2022/lib/calendar.component.mjs +5 -11
  19. package/esm2022/lib/card.component.mjs +14 -43
  20. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  21. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  22. package/esm2022/lib/chart-pie.component.mjs +386 -0
  23. package/esm2022/lib/chart.component.mjs +1146 -0
  24. package/esm2022/lib/chart.service.mjs +555 -0
  25. package/esm2022/lib/checkbox.component.mjs +5 -11
  26. package/esm2022/lib/checkpoint.component.mjs +134 -0
  27. package/esm2022/lib/collapsible.component.mjs +4 -11
  28. package/esm2022/lib/combobox.component.mjs +372 -0
  29. package/esm2022/lib/command-dialog.component.mjs +164 -0
  30. package/esm2022/lib/command.component.mjs +514 -0
  31. package/esm2022/lib/command.service.mjs +130 -0
  32. package/esm2022/lib/confirmation.component.mjs +219 -0
  33. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  34. package/esm2022/lib/context-menu.component.mjs +460 -0
  35. package/esm2022/lib/context-menu.service.mjs +125 -0
  36. package/esm2022/lib/context.component.mjs +377 -0
  37. package/esm2022/lib/conversation.component.mjs +442 -0
  38. package/esm2022/lib/country-selector.component.mjs +5 -11
  39. package/esm2022/lib/data-table.component.mjs +59 -12
  40. package/esm2022/lib/date-picker.component.mjs +251 -198
  41. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  42. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  43. package/esm2022/lib/direction.component.mjs +79 -0
  44. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  48. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  49. package/esm2022/lib/empty-state.component.mjs +4 -9
  50. package/esm2022/lib/field.component.mjs +394 -0
  51. package/esm2022/lib/hover-card.component.mjs +6 -16
  52. package/esm2022/lib/inline-citation.component.mjs +263 -0
  53. package/esm2022/lib/input-group.component.mjs +418 -0
  54. package/esm2022/lib/input.component.mjs +5 -11
  55. package/esm2022/lib/item.component.mjs +243 -0
  56. package/esm2022/lib/kbd.component.mjs +82 -0
  57. package/esm2022/lib/label.component.mjs +4 -9
  58. package/esm2022/lib/marker.component.mjs +135 -0
  59. package/esm2022/lib/masked-input.component.mjs +5 -11
  60. package/esm2022/lib/menubar.component.mjs +683 -0
  61. package/esm2022/lib/message-scroller.component.mjs +353 -0
  62. package/esm2022/lib/message-scroller.service.mjs +157 -0
  63. package/esm2022/lib/message.component.mjs +228 -0
  64. package/esm2022/lib/modal-ref.mjs +36 -7
  65. package/esm2022/lib/modal.component.mjs +42 -28
  66. package/esm2022/lib/modal.mjs +2 -29
  67. package/esm2022/lib/modal.service.mjs +26 -4
  68. package/esm2022/lib/model-selector.component.mjs +310 -0
  69. package/esm2022/lib/multi-select.component.mjs +155 -72
  70. package/esm2022/lib/native-select.component.mjs +201 -0
  71. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  72. package/esm2022/lib/otp-group.component.mjs +3 -3
  73. package/esm2022/lib/otp-slot.component.mjs +4 -9
  74. package/esm2022/lib/otp.component.mjs +5 -11
  75. package/esm2022/lib/pagination.component.mjs +7 -10
  76. package/esm2022/lib/plan.component.mjs +335 -0
  77. package/esm2022/lib/popover-content.component.mjs +4 -9
  78. package/esm2022/lib/popover.component.mjs +15 -13
  79. package/esm2022/lib/progress.component.mjs +4 -9
  80. package/esm2022/lib/prompt-input.component.mjs +526 -0
  81. package/esm2022/lib/queue.component.mjs +280 -0
  82. package/esm2022/lib/radio-group.component.mjs +6 -13
  83. package/esm2022/lib/radio-item.component.mjs +4 -9
  84. package/esm2022/lib/range-calendar.component.mjs +5 -11
  85. package/esm2022/lib/reasoning.component.mjs +335 -0
  86. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  87. package/esm2022/lib/resizable.component.mjs +219 -0
  88. package/esm2022/lib/segment.component.mjs +19 -9
  89. package/esm2022/lib/select-group.component.mjs +4 -8
  90. package/esm2022/lib/select-item.component.mjs +4 -9
  91. package/esm2022/lib/select-separator.component.mjs +4 -8
  92. package/esm2022/lib/select.component.mjs +133 -49
  93. package/esm2022/lib/separator.component.mjs +4 -9
  94. package/esm2022/lib/sheet.component.mjs +38 -56
  95. package/esm2022/lib/shimmer.component.mjs +84 -0
  96. package/esm2022/lib/sidebar.component.mjs +11 -1
  97. package/esm2022/lib/skeleton.component.mjs +4 -9
  98. package/esm2022/lib/sources.component.mjs +452 -0
  99. package/esm2022/lib/spinner.component.mjs +68 -0
  100. package/esm2022/lib/suggestion.component.mjs +207 -0
  101. package/esm2022/lib/switch.component.mjs +5 -11
  102. package/esm2022/lib/table.component.mjs +213 -0
  103. package/esm2022/lib/tabs.component.mjs +4 -11
  104. package/esm2022/lib/tag-input.component.mjs +5 -11
  105. package/esm2022/lib/task.component.mjs +359 -0
  106. package/esm2022/lib/textarea.component.mjs +5 -11
  107. package/esm2022/lib/theme.service.mjs +17 -6
  108. package/esm2022/lib/time-picker.component.mjs +923 -0
  109. package/esm2022/lib/toast.service.mjs +3 -2
  110. package/esm2022/lib/toaster.component.mjs +76 -39
  111. package/esm2022/lib/toggle-group.component.mjs +4 -9
  112. package/esm2022/lib/toggle.component.mjs +5 -11
  113. package/esm2022/lib/tool.component.mjs +462 -0
  114. package/esm2022/lib/typography.component.mjs +83 -0
  115. package/esm2022/lib/utils/color.mjs +140 -19
  116. package/esm2022/public-api.mjs +61 -1
  117. package/fesm2022/tolle-ui.mjs +16642 -1105
  118. package/fesm2022/tolle-ui.mjs.map +1 -1
  119. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  120. package/lib/alert-dialog.component.d.ts +23 -2
  121. package/lib/aspect-ratio.component.d.ts +20 -0
  122. package/lib/attachment.component.d.ts +101 -0
  123. package/lib/bubble.component.d.ts +112 -0
  124. package/lib/chain-of-thought.component.d.ts +166 -0
  125. package/lib/chart-pie.component.d.ts +108 -0
  126. package/lib/chart.component.d.ts +369 -0
  127. package/lib/chart.service.d.ts +222 -0
  128. package/lib/checkpoint.component.d.ts +51 -0
  129. package/lib/combobox.component.d.ts +90 -0
  130. package/lib/command-dialog.component.d.ts +53 -0
  131. package/lib/command.component.d.ts +189 -0
  132. package/lib/command.service.d.ts +67 -0
  133. package/lib/confirmation.component.d.ts +70 -0
  134. package/lib/context-menu-trigger.directive.d.ts +12 -0
  135. package/lib/context-menu.component.d.ts +41 -0
  136. package/lib/context-menu.service.d.ts +38 -0
  137. package/lib/context.component.d.ts +134 -0
  138. package/lib/conversation.component.d.ts +165 -0
  139. package/lib/data-table.component.d.ts +26 -1
  140. package/lib/date-picker.component.d.ts +72 -11
  141. package/lib/date-range-picker.component.d.ts +63 -6
  142. package/lib/date-time-picker.component.d.ts +119 -0
  143. package/lib/direction.component.d.ts +45 -0
  144. package/lib/field.component.d.ts +201 -0
  145. package/lib/inline-citation.component.d.ts +103 -0
  146. package/lib/input-group.component.d.ts +150 -0
  147. package/lib/item.component.d.ts +154 -0
  148. package/lib/kbd.component.d.ts +50 -0
  149. package/lib/marker.component.d.ts +58 -0
  150. package/lib/menubar.component.d.ts +247 -0
  151. package/lib/message-scroller.component.d.ts +159 -0
  152. package/lib/message-scroller.service.d.ts +73 -0
  153. package/lib/message.component.d.ts +128 -0
  154. package/lib/modal-ref.d.ts +6 -1
  155. package/lib/modal.component.d.ts +7 -4
  156. package/lib/modal.d.ts +9 -3
  157. package/lib/model-selector.component.d.ts +103 -0
  158. package/lib/multi-select.component.d.ts +66 -14
  159. package/lib/native-select.component.d.ts +57 -0
  160. package/lib/navigation-menu.component.d.ts +230 -0
  161. package/lib/plan.component.d.ts +120 -0
  162. package/lib/popover.component.d.ts +1 -0
  163. package/lib/prompt-input.component.d.ts +194 -0
  164. package/lib/queue.component.d.ts +106 -0
  165. package/lib/reasoning.component.d.ts +127 -0
  166. package/lib/resizable.component.d.ts +43 -0
  167. package/lib/segment.component.d.ts +13 -3
  168. package/lib/select.component.d.ts +37 -5
  169. package/lib/sheet.component.d.ts +3 -0
  170. package/lib/shimmer.component.d.ts +38 -0
  171. package/lib/sidebar.component.d.ts +2 -0
  172. package/lib/sources.component.d.ts +156 -0
  173. package/lib/spinner.component.d.ts +29 -0
  174. package/lib/suggestion.component.d.ts +96 -0
  175. package/lib/table.component.d.ts +106 -0
  176. package/lib/task.component.d.ts +151 -0
  177. package/lib/theme.service.d.ts +9 -0
  178. package/lib/time-picker.component.d.ts +243 -0
  179. package/lib/toast.service.d.ts +3 -1
  180. package/lib/toaster.component.d.ts +26 -9
  181. package/lib/tool.component.d.ts +158 -0
  182. package/lib/typography.component.d.ts +32 -0
  183. package/lib/utils/color.d.ts +19 -5
  184. package/package.json +3 -2
  185. package/preset.js +7 -1
  186. package/public-api.d.ts +50 -0
  187. package/registry/docs-content.json +8480 -1542
  188. package/registry/llms-full.txt +2679 -319
  189. package/registry/llms.txt +43 -4
  190. package/registry/manifest.json +9090 -1742
  191. package/registry/r/accordion-item.json +1 -1
  192. package/registry/r/accordion.json +1 -1
  193. package/registry/r/alert-dialog-dynamic.json +1 -1
  194. package/registry/r/alert-dialog.json +1 -1
  195. package/registry/r/alert.json +1 -1
  196. package/registry/r/attachment.json +23 -0
  197. package/registry/r/avatar-fallback.json +1 -1
  198. package/registry/r/avatar.json +1 -1
  199. package/registry/r/badge.json +1 -1
  200. package/registry/r/breadcrumb-item.json +1 -1
  201. package/registry/r/breadcrumb-link.json +1 -1
  202. package/registry/r/breadcrumb-separator.json +1 -1
  203. package/registry/r/breadcrumb.json +1 -1
  204. package/registry/r/bubble.json +23 -0
  205. package/registry/r/button.json +1 -1
  206. package/registry/r/calendar.json +1 -1
  207. package/registry/r/card.json +1 -1
  208. package/registry/r/carousel.json +1 -1
  209. package/registry/r/chain-of-thought.json +23 -0
  210. package/registry/r/chart-pie.json +30 -0
  211. package/registry/r/chart.json +28 -0
  212. package/registry/r/checkbox.json +1 -1
  213. package/registry/r/checkpoint.json +23 -0
  214. package/registry/r/collapsible.json +1 -1
  215. package/registry/r/combobox.json +31 -0
  216. package/registry/r/command-dialog.json +21 -0
  217. package/registry/r/command.json +26 -0
  218. package/registry/r/confirmation.json +23 -0
  219. package/registry/r/context-menu-trigger.json +1 -1
  220. package/registry/r/context-menu.json +1 -1
  221. package/registry/r/context.json +26 -0
  222. package/registry/r/conversation.json +23 -0
  223. package/registry/r/country-selector.json +1 -1
  224. package/registry/r/data-table.json +1 -1
  225. package/registry/r/date-picker.json +4 -4
  226. package/registry/r/date-range-picker.json +3 -3
  227. package/registry/r/date-time-picker.json +28 -0
  228. package/registry/r/direction.json +16 -0
  229. package/registry/r/dropdown-item.json +1 -1
  230. package/registry/r/dropdown-label.json +1 -1
  231. package/registry/r/dropdown-menu.json +1 -1
  232. package/registry/r/dropdown-separator.json +1 -1
  233. package/registry/r/dropdown-trigger.json +1 -1
  234. package/registry/r/empty-state.json +1 -1
  235. package/registry/r/field.json +23 -0
  236. package/registry/r/hover-card.json +1 -1
  237. package/registry/r/inline-citation.json +26 -0
  238. package/registry/r/input-group.json +23 -0
  239. package/registry/r/input.json +1 -1
  240. package/registry/r/item.json +23 -0
  241. package/registry/r/kbd.json +23 -0
  242. package/registry/r/label.json +1 -1
  243. package/registry/r/marker.json +23 -0
  244. package/registry/r/masked-input.json +1 -1
  245. package/registry/r/menubar.json +24 -0
  246. package/registry/r/message-scroller.json +26 -0
  247. package/registry/r/message.json +23 -0
  248. package/registry/r/modal.json +3 -3
  249. package/registry/r/model-selector.json +32 -0
  250. package/registry/r/multi-select.json +2 -2
  251. package/registry/r/native-select.json +23 -0
  252. package/registry/r/navigation-menu.json +24 -0
  253. package/registry/r/otp-group.json +1 -1
  254. package/registry/r/otp-slot.json +1 -1
  255. package/registry/r/otp.json +1 -1
  256. package/registry/r/pagination.json +3 -2
  257. package/registry/r/plan.json +23 -0
  258. package/registry/r/popover-content.json +1 -1
  259. package/registry/r/popover.json +1 -1
  260. package/registry/r/progress.json +1 -1
  261. package/registry/r/prompt-input.json +23 -0
  262. package/registry/r/queue.json +23 -0
  263. package/registry/r/radio-group.json +1 -1
  264. package/registry/r/radio-item.json +1 -1
  265. package/registry/r/range-calendar.json +1 -1
  266. package/registry/r/reasoning.json +23 -0
  267. package/registry/r/resizable-panel.json +1 -1
  268. package/registry/r/segment.json +1 -1
  269. package/registry/r/select-group.json +1 -1
  270. package/registry/r/select-item.json +1 -1
  271. package/registry/r/select-separator.json +1 -1
  272. package/registry/r/select.json +4 -3
  273. package/registry/r/separator.json +1 -1
  274. package/registry/r/sheet.json +1 -1
  275. package/registry/r/shimmer.json +23 -0
  276. package/registry/r/sidebar.json +1 -1
  277. package/registry/r/skeleton.json +1 -1
  278. package/registry/r/sources.json +23 -0
  279. package/registry/r/spinner.json +23 -0
  280. package/registry/r/suggestion.json +23 -0
  281. package/registry/r/switch.json +1 -1
  282. package/registry/r/table.json +21 -0
  283. package/registry/r/tabs.json +1 -1
  284. package/registry/r/tag-input.json +1 -1
  285. package/registry/r/task.json +23 -0
  286. package/registry/r/textarea.json +1 -1
  287. package/registry/r/time-picker.json +24 -0
  288. package/registry/r/toaster.json +2 -2
  289. package/registry/r/toggle-group.json +1 -1
  290. package/registry/r/toggle.json +1 -1
  291. package/registry/r/tool.json +23 -0
  292. package/registry/r/typography.json +23 -0
  293. package/registry/registry.json +915 -22
  294. package/theme.css +121 -8
@@ -0,0 +1,243 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ const itemVariants = cva('group/item flex items-center gap-4 rounded-md border text-sm transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', {
7
+ variants: {
8
+ variant: {
9
+ default: 'border-transparent bg-transparent',
10
+ outline: 'border-border bg-transparent',
11
+ muted: 'border-transparent bg-muted/50',
12
+ },
13
+ size: {
14
+ xs: 'px-2 py-1.5 gap-2',
15
+ sm: 'px-3 py-2 gap-3',
16
+ default: 'px-4 py-3',
17
+ },
18
+ },
19
+ defaultVariants: { variant: 'default', size: 'default' },
20
+ });
21
+ /**
22
+ * A flex container for content rows built from media, title, description and
23
+ * actions — profiles, notifications, settings rows, list entries. Use
24
+ * `tolle-field` instead when wrapping a form control.
25
+ * @new
26
+ */
27
+ export class ItemComponent {
28
+ cdr = inject(ChangeDetectorRef);
29
+ /**
30
+ * Angular writes a bound `class` input through its styling path, which does
31
+ * not mark an OnPush component dirty — without this hook the component keeps
32
+ * rendering the class it was born with.
33
+ */
34
+ ngOnChanges() {
35
+ this.cdr.markForCheck();
36
+ }
37
+ /** Visual style of the row. @default 'default' */
38
+ variant = 'default';
39
+ /** Padding and gap density of the row. @default 'default' */
40
+ size = 'default';
41
+ /** Extra Tailwind classes merged onto the row via `cn()` (last-wins). */
42
+ class = '';
43
+ get computedClass() {
44
+ return cn(itemVariants({ variant: this.variant, size: this.size }), this.class);
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "tolle-item", inputs: { variant: "variant", size: "size", class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, decorators: [{
50
+ type: Component,
51
+ args: [{ selector: 'tolle-item', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="computedClass"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
52
+ }], propDecorators: { variant: [{
53
+ type: Input
54
+ }], size: [{
55
+ type: Input
56
+ }], class: [{
57
+ type: Input
58
+ }] } });
59
+ /** Stacks several `tolle-item` rows as a single list. */
60
+ export class ItemGroupComponent {
61
+ cdr = inject(ChangeDetectorRef);
62
+ /**
63
+ * Angular writes a bound `class` input through its styling path, which does
64
+ * not mark an OnPush component dirty — without this hook the component keeps
65
+ * rendering the class it was born with.
66
+ */
67
+ ngOnChanges() {
68
+ this.cdr.markForCheck();
69
+ }
70
+ /** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
71
+ class = '';
72
+ cn = cn;
73
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
74
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemGroupComponent, isStandalone: true, selector: "tolle-item-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div role="list" [class]="cn('flex flex-col', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
75
+ }
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemGroupComponent, decorators: [{
77
+ type: Component,
78
+ args: [{ selector: 'tolle-item-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div role="list" [class]="cn('flex flex-col', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
79
+ }], propDecorators: { class: [{
80
+ type: Input
81
+ }] } });
82
+ /** Leading media slot — avatar, icon, or thumbnail. */
83
+ export class ItemMediaComponent {
84
+ cdr = inject(ChangeDetectorRef);
85
+ /**
86
+ * Angular writes a bound `class` input through its styling path, which does
87
+ * not mark an OnPush component dirty — without this hook the component keeps
88
+ * rendering the class it was born with.
89
+ */
90
+ ngOnChanges() {
91
+ this.cdr.markForCheck();
92
+ }
93
+ /** Extra Tailwind classes merged onto the media slot via `cn()` (last-wins). */
94
+ class = '';
95
+ cn = cn;
96
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
97
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemMediaComponent, isStandalone: true, selector: "tolle-item-media", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex shrink-0 items-center justify-center text-muted-foreground', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
98
+ }
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemMediaComponent, decorators: [{
100
+ type: Component,
101
+ args: [{ selector: 'tolle-item-media', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex shrink-0 items-center justify-center text-muted-foreground', class)"><ng-content></ng-content></div>`, styles: [":host{display:inline-flex}\n"] }]
102
+ }], propDecorators: { class: [{
103
+ type: Input
104
+ }] } });
105
+ /** Grows to fill the row; wraps the title and description. */
106
+ export class ItemContentComponent {
107
+ cdr = inject(ChangeDetectorRef);
108
+ /**
109
+ * Angular writes a bound `class` input through its styling path, which does
110
+ * not mark an OnPush component dirty — without this hook the component keeps
111
+ * rendering the class it was born with.
112
+ */
113
+ ngOnChanges() {
114
+ this.cdr.markForCheck();
115
+ }
116
+ /** Extra Tailwind classes merged onto the content column via `cn()` (last-wins). */
117
+ class = '';
118
+ cn = cn;
119
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemContentComponent, isStandalone: true, selector: "tolle-item-content", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex min-w-0 flex-1 flex-col gap-0.5', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
121
+ }
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemContentComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'tolle-item-content', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex min-w-0 flex-1 flex-col gap-0.5', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
125
+ }], propDecorators: { class: [{
126
+ type: Input
127
+ }] } });
128
+ /** Primary line of the row. */
129
+ export class ItemTitleComponent {
130
+ cdr = inject(ChangeDetectorRef);
131
+ /**
132
+ * Angular writes a bound `class` input through its styling path, which does
133
+ * not mark an OnPush component dirty — without this hook the component keeps
134
+ * rendering the class it was born with.
135
+ */
136
+ ngOnChanges() {
137
+ this.cdr.markForCheck();
138
+ }
139
+ /** Extra Tailwind classes merged onto the title via `cn()` (last-wins). */
140
+ class = '';
141
+ cn = cn;
142
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
143
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemTitleComponent, isStandalone: true, selector: "tolle-item-title", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<p [class]="cn('truncate font-medium leading-none text-foreground', class)"><ng-content></ng-content></p>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemTitleComponent, decorators: [{
146
+ type: Component,
147
+ args: [{ selector: 'tolle-item-title', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<p [class]="cn('truncate font-medium leading-none text-foreground', class)"><ng-content></ng-content></p>`, styles: [":host{display:block}\n"] }]
148
+ }], propDecorators: { class: [{
149
+ type: Input
150
+ }] } });
151
+ /** Secondary line of the row. */
152
+ export class ItemDescriptionComponent {
153
+ cdr = inject(ChangeDetectorRef);
154
+ /**
155
+ * Angular writes a bound `class` input through its styling path, which does
156
+ * not mark an OnPush component dirty — without this hook the component keeps
157
+ * rendering the class it was born with.
158
+ */
159
+ ngOnChanges() {
160
+ this.cdr.markForCheck();
161
+ }
162
+ /** Extra Tailwind classes merged onto the description via `cn()` (last-wins). */
163
+ class = '';
164
+ cn = cn;
165
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
166
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemDescriptionComponent, isStandalone: true, selector: "tolle-item-description", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<p [class]="cn('truncate text-sm text-muted-foreground', class)"><ng-content></ng-content></p>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
167
+ }
168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemDescriptionComponent, decorators: [{
169
+ type: Component,
170
+ args: [{ selector: 'tolle-item-description', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<p [class]="cn('truncate text-sm text-muted-foreground', class)"><ng-content></ng-content></p>`, styles: [":host{display:block}\n"] }]
171
+ }], propDecorators: { class: [{
172
+ type: Input
173
+ }] } });
174
+ /** Trailing slot for buttons, switches, or badges. */
175
+ export class ItemActionsComponent {
176
+ cdr = inject(ChangeDetectorRef);
177
+ /**
178
+ * Angular writes a bound `class` input through its styling path, which does
179
+ * not mark an OnPush component dirty — without this hook the component keeps
180
+ * rendering the class it was born with.
181
+ */
182
+ ngOnChanges() {
183
+ this.cdr.markForCheck();
184
+ }
185
+ /** Extra Tailwind classes merged onto the actions slot via `cn()` (last-wins). */
186
+ class = '';
187
+ cn = cn;
188
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemActionsComponent, isStandalone: true, selector: "tolle-item-actions", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex shrink-0 items-center gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemActionsComponent, decorators: [{
192
+ type: Component,
193
+ args: [{ selector: 'tolle-item-actions', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex shrink-0 items-center gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:inline-flex}\n"] }]
194
+ }], propDecorators: { class: [{
195
+ type: Input
196
+ }] } });
197
+ /** Optional full-width header above the row's main line. */
198
+ export class ItemHeaderComponent {
199
+ cdr = inject(ChangeDetectorRef);
200
+ /**
201
+ * Angular writes a bound `class` input through its styling path, which does
202
+ * not mark an OnPush component dirty — without this hook the component keeps
203
+ * rendering the class it was born with.
204
+ */
205
+ ngOnChanges() {
206
+ this.cdr.markForCheck();
207
+ }
208
+ /** Extra Tailwind classes merged onto the header via `cn()` (last-wins). */
209
+ class = '';
210
+ cn = cn;
211
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
212
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemHeaderComponent, isStandalone: true, selector: "tolle-item-header", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
213
+ }
214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemHeaderComponent, decorators: [{
215
+ type: Component,
216
+ args: [{ selector: 'tolle-item-header', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
217
+ }], propDecorators: { class: [{
218
+ type: Input
219
+ }] } });
220
+ /** Optional full-width footer below the row's main line. */
221
+ export class ItemFooterComponent {
222
+ cdr = inject(ChangeDetectorRef);
223
+ /**
224
+ * Angular writes a bound `class` input through its styling path, which does
225
+ * not mark an OnPush component dirty — without this hook the component keeps
226
+ * rendering the class it was born with.
227
+ */
228
+ ngOnChanges() {
229
+ this.cdr.markForCheck();
230
+ }
231
+ /** Extra Tailwind classes merged onto the footer via `cn()` (last-wins). */
232
+ class = '';
233
+ cn = cn;
234
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
235
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ItemFooterComponent, isStandalone: true, selector: "tolle-item-footer", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
236
+ }
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemFooterComponent, decorators: [{
238
+ type: Component,
239
+ args: [{ selector: 'tolle-item-footer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full items-center justify-between gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
240
+ }], propDecorators: { class: [{
241
+ type: Input
242
+ }] } });
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2l0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOztBQUVoQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQ3RCLHNLQUFzSyxFQUN0SztJQUNFLFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxtQ0FBbUM7WUFDNUMsT0FBTyxFQUFFLDhCQUE4QjtZQUN2QyxLQUFLLEVBQUUsZ0NBQWdDO1NBQ3hDO1FBQ0QsSUFBSSxFQUFFO1lBQ0osRUFBRSxFQUFFLG1CQUFtQjtZQUN2QixFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLE9BQU8sRUFBRSxXQUFXO1NBQ3JCO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Q0FDekQsQ0FDRixDQUFDO0FBSUY7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sYUFBYTtJQUNQLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtEQUFrRDtJQUN6QyxPQUFPLEdBQXlCLFNBQVMsQ0FBQztJQUNuRCw2REFBNkQ7SUFDcEQsSUFBSSxHQUFzQixTQUFT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QUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG5jb25zdCBpdGVtVmFyaWFudHMgPSBjdmEoXG4gICdncm91cC9pdGVtIGZsZXggaXRlbXMtY2VudGVyIGdhcC00IHJvdW5kZWQtbWQgYm9yZGVyIHRleHQtc20gdHJhbnNpdGlvbi1jb2xvcnMgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMicsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXRyYW5zcGFyZW50JyxcbiAgICAgICAgb3V0bGluZTogJ2JvcmRlci1ib3JkZXIgYmctdHJhbnNwYXJlbnQnLFxuICAgICAgICBtdXRlZDogJ2JvcmRlci10cmFuc3BhcmVudCBiZy1tdXRlZC81MCcsXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ3B4LTIgcHktMS41IGdhcC0yJyxcbiAgICAgICAgc206ICdweC0zIHB5LTIgZ2FwLTMnLFxuICAgICAgICBkZWZhdWx0OiAncHgtNCBweS0zJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHsgdmFyaWFudDogJ2RlZmF1bHQnLCBzaXplOiAnZGVmYXVsdCcgfSxcbiAgfVxuKTtcblxuZXhwb3J0IHR5cGUgSXRlbVByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBpdGVtVmFyaWFudHM+O1xuXG4vKipcbiAqIEEgZmxleCBjb250YWluZXIgZm9yIGNvbnRlbnQgcm93cyBidWlsdCBmcm9tIG1lZGlhLCB0aXRsZSwgZGVzY3JpcHRpb24gYW5kXG4gKiBhY3Rpb25zIOKAlCBwcm9maWxlcywgbm90aWZpY2F0aW9ucywgc2V0dGluZ3Mgcm93cywgbGlzdCBlbnRyaWVzLiBVc2VcbiAqIGB0b2xsZS1maWVsZGAgaW5zdGVhZCB3aGVuIHdyYXBwaW5nIGEgZm9ybSBjb250cm9sLlxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1pdGVtJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFZpc3VhbCBzdHlsZSBvZiB0aGUgcm93LiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgdmFyaWFudDogSXRlbVByb3BzWyd2YXJpYW50J10gPSAnZGVmYXVsdCc7XG4gIC8qKiBQYWRkaW5nIGFuZCBnYXAgZGVuc2l0eSBvZiB0aGUgcm93LiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogSXRlbVByb3BzWydzaXplJ10gPSAnZGVmYXVsdCc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSByb3cgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oaXRlbVZhcmlhbnRzKHsgdmFyaWFudDogdGhpcy52YXJpYW50LCBzaXplOiB0aGlzLnNpemUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBTdGFja3Mgc2V2ZXJhbCBgdG9sbGUtaXRlbWAgcm93cyBhcyBhIHNpbmdsZSBsaXN0LiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1ncm91cCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IHJvbGU9XCJsaXN0XCIgW2NsYXNzXT1cImNuKCdmbGV4IGZsZXgtY29sJywgY2xhc3MpXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1Hcm91cENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGdyb3VwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogTGVhZGluZyBtZWRpYSBzbG90IOKAlCBhdmF0YXIsIGljb24sIG9yIHRodW1ibmFpbC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tbWVkaWEnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGRpdiBbY2xhc3NdPVwiY24oJ2ZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtTWVkaWFDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBtZWRpYSBzbG90IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogR3Jvd3MgdG8gZmlsbCB0aGUgcm93OyB3cmFwcyB0aGUgdGl0bGUgYW5kIGRlc2NyaXB0aW9uLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1jb250ZW50JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IG1pbi13LTAgZmxleC0xIGZsZXgtY29sIGdhcC0wLjUnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUNvbnRlbnRDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBjb250ZW50IGNvbHVtbiB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cblxuLyoqIFByaW1hcnkgbGluZSBvZiB0aGUgcm93LiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS10aXRsZScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8cCBbY2xhc3NdPVwiY24oJ3RydW5jYXRlIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB0ZXh0LWZvcmVncm91bmQnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9wPmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1UaXRsZUNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHRpdGxlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogU2Vjb25kYXJ5IGxpbmUgb2YgdGhlIHJvdy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tZGVzY3JpcHRpb24nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPHAgW2NsYXNzXT1cImNuKCd0cnVuY2F0ZSB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L3A+YCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbURlc2NyaXB0aW9uQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgZGVzY3JpcHRpb24gdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG5cbi8qKiBUcmFpbGluZyBzbG90IGZvciBidXR0b25zLCBzd2l0Y2hlcywgb3IgYmFkZ2VzLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtaXRlbS1hY3Rpb25zJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogaW5saW5lLWZsZXg7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBnYXAtMicsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtQWN0aW9uc0NvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGFjdGlvbnMgc2xvdCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cblxuLyoqIE9wdGlvbmFsIGZ1bGwtd2lkdGggaGVhZGVyIGFib3ZlIHRoZSByb3cncyBtYWluIGxpbmUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1pdGVtLWhlYWRlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjbignZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMicsIGNsYXNzKVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBJdGVtSGVhZGVyQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgaGVhZGVyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKiogT3B0aW9uYWwgZnVsbC13aWR0aCBmb290ZXIgYmVsb3cgdGhlIHJvdydzIG1haW4gbGluZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWl0ZW0tZm9vdGVyJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYDxkaXYgW2NsYXNzXT1cImNuKCdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yJywgY2xhc3MpXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PmAsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1Gb290ZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBmb290ZXIgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
@@ -0,0 +1,82 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ const kbdVariants = cva('inline-flex select-none items-center justify-center gap-1 rounded border border-border font-mono font-medium text-muted-foreground', {
7
+ variants: {
8
+ size: {
9
+ sm: 'h-4 min-w-4 px-1 text-[10px]',
10
+ default: 'h-5 min-w-5 px-1.5 text-[11px]',
11
+ lg: 'h-6 min-w-6 px-2 text-xs',
12
+ },
13
+ variant: {
14
+ default: 'bg-muted',
15
+ outline: 'bg-transparent',
16
+ },
17
+ },
18
+ defaultVariants: { size: 'default', variant: 'default' },
19
+ });
20
+ /**
21
+ * Renders a keyboard key or shortcut, e.g. `<tolle-kbd>⌘</tolle-kbd>`.
22
+ * Pairs with `tolle-command-shortcut` inside command menus.
23
+ * @new
24
+ */
25
+ export class KbdComponent {
26
+ cdr = inject(ChangeDetectorRef);
27
+ /**
28
+ * Angular writes a bound `class` input through its styling path, which does
29
+ * not mark an OnPush component dirty — without this hook the component keeps
30
+ * rendering the class it was born with.
31
+ */
32
+ ngOnChanges() {
33
+ this.cdr.markForCheck();
34
+ }
35
+ /** Size of the key cap. @default 'default' */
36
+ size = 'default';
37
+ /** Visual style of the key cap. @default 'default' */
38
+ variant = 'default';
39
+ /** Extra Tailwind classes merged onto the key cap via `cn()` (last-wins). */
40
+ class = '';
41
+ get computedClass() {
42
+ return cn(kbdVariants({ size: this.size, variant: this.variant }), this.class);
43
+ }
44
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KbdComponent, isStandalone: true, selector: "tolle-kbd", inputs: { size: "size", variant: "variant", class: "class" }, usesOnChanges: true, ngImport: i0, template: `<kbd [class]="computedClass"><ng-content></ng-content></kbd>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdComponent, decorators: [{
48
+ type: Component,
49
+ args: [{ selector: 'tolle-kbd', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<kbd [class]="computedClass"><ng-content></ng-content></kbd>`, styles: [":host{display:inline-flex}\n"] }]
50
+ }], propDecorators: { size: [{
51
+ type: Input
52
+ }], variant: [{
53
+ type: Input
54
+ }], class: [{
55
+ type: Input
56
+ }] } });
57
+ /**
58
+ * Groups several `tolle-kbd` keys into one shortcut, e.g. ⌘ + K.
59
+ */
60
+ export class KbdGroupComponent {
61
+ cdr = inject(ChangeDetectorRef);
62
+ /**
63
+ * Angular writes a bound `class` input through its styling path, which does
64
+ * not mark an OnPush component dirty — without this hook the component keeps
65
+ * rendering the class it was born with.
66
+ */
67
+ ngOnChanges() {
68
+ this.cdr.markForCheck();
69
+ }
70
+ /** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
71
+ class = '';
72
+ cn = cn;
73
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
74
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KbdGroupComponent, isStandalone: true, selector: "tolle-kbd-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<span [class]="cn('inline-flex items-center gap-1', class)"><ng-content></ng-content></span>`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
75
+ }
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbdGroupComponent, decorators: [{
77
+ type: Component,
78
+ args: [{ selector: 'tolle-kbd-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<span [class]="cn('inline-flex items-center gap-1', class)"><ng-content></ng-content></span>`, styles: [":host{display:inline-flex}\n"] }]
79
+ }], propDecorators: { class: [{
80
+ type: Input
81
+ }] } });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIva2JkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFaEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUNyQixvSUFBb0ksRUFDcEk7SUFDRSxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsOEJBQThCO1lBQ2xDLE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsRUFBRSxFQUFFLDBCQUEwQjtTQUMvQjtRQUNELE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRSxnQkFBZ0I7U0FDMUI7S0FDRjtJQUNELGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtDQUN6RCxDQUNGLENBQUM7QUFJRjs7OztHQUlHO0FBU0gsTUFBTSxPQUFPLFlBQVk7SUFDTixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw4Q0FBOEM7SUFDckMsSUFBSSxHQUFxQixTQUFTLENBQUM7SUFDNUMsc0RBQXNEO0lBQzdDLE9BQU8sR0FBd0IsU0FBUyxDQUFDO0lBQ2xELDZFQUE2RTtJQUNwRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakYsQ0FBQzt3R0FyQlUsWUFBWTs0RkFBWixZQUFZLHdKQUZiLDhEQUE4RCxxR0FGOUQsWUFBWTs7NEZBSVgsWUFBWTtrQkFSeEIsU0FBUzsrQkFDRSxXQUFXLGNBRVQsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsOERBQThEOzhCQWUvRCxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSzs7QUFPUjs7R0FFRztBQVNILE1BQU0sT0FBTyxpQkFBaUI7SUFDWCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwyRUFBMkU7SUFDbEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNWLEVBQUUsR0FBRyxFQUFFLENBQUM7d0dBZFAsaUJBQWlCOzRGQUFqQixpQkFBaUIsNEhBRmxCLDhGQUE4RixxR0FGOUYsWUFBWTs7NEZBSVgsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGlCQUFpQixjQUVmLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLDhGQUE4Rjs4QkFlL0YsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3Qga2JkVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWJvcmRlciBmb250LW1vbm8gZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICBzaXplOiB7XG4gICAgICAgIHNtOiAnaC00IG1pbi13LTQgcHgtMSB0ZXh0LVsxMHB4XScsXG4gICAgICAgIGRlZmF1bHQ6ICdoLTUgbWluLXctNSBweC0xLjUgdGV4dC1bMTFweF0nLFxuICAgICAgICBsZzogJ2gtNiBtaW4tdy02IHB4LTIgdGV4dC14cycsXG4gICAgICB9LFxuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OiAnYmctbXV0ZWQnLFxuICAgICAgICBvdXRsaW5lOiAnYmctdHJhbnNwYXJlbnQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czogeyBzaXplOiAnZGVmYXVsdCcsIHZhcmlhbnQ6ICdkZWZhdWx0JyB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBLYmRQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2Yga2JkVmFyaWFudHM+O1xuXG4vKipcbiAqIFJlbmRlcnMgYSBrZXlib2FyZCBrZXkgb3Igc2hvcnRjdXQsIGUuZy4gYDx0b2xsZS1rYmQ+4oyYPC90b2xsZS1rYmQ+YC5cbiAqIFBhaXJzIHdpdGggYHRvbGxlLWNvbW1hbmQtc2hvcnRjdXRgIGluc2lkZSBjb21tYW5kIG1lbnVzLlxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1rYmQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPGtiZCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2tiZD5gLFxufSlcbmV4cG9ydCBjbGFzcyBLYmRDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBTaXplIG9mIHRoZSBrZXkgY2FwLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogS2JkUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFZpc3VhbCBzdHlsZSBvZiB0aGUga2V5IGNhcC4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEtiZFByb3BzWyd2YXJpYW50J10gPSAnZGVmYXVsdCc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBrZXkgY2FwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGtiZFZhcmlhbnRzKHsgc2l6ZTogdGhpcy5zaXplLCB2YXJpYW50OiB0aGlzLnZhcmlhbnQgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKlxuICogR3JvdXBzIHNldmVyYWwgYHRvbGxlLWtiZGAga2V5cyBpbnRvIG9uZSBzaG9ydGN1dCwgZS5nLiDijJggKyBLLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1rYmQtZ3JvdXAnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPHNwYW4gW2NsYXNzXT1cImNuKCdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEnLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPmAsXG59KVxuZXhwb3J0IGNsYXNzIEtiZEdyb3VwQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgZ3JvdXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
@@ -16,26 +16,21 @@ export class LabelComponent {
16
16
  >
17
17
  <ng-content></ng-content>
18
18
  </label>
19
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
19
+ `, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
20
20
  }
21
21
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LabelComponent, decorators: [{
22
22
  type: Component,
23
- args: [{
24
- selector: 'tolle-label',
25
- standalone: true,
26
- imports: [CommonModule],
27
- template: `
23
+ args: [{ selector: 'tolle-label', standalone: true, imports: [CommonModule], template: `
28
24
  <label
29
25
  [attr.for]="for"
30
26
  [class]="computedClass"
31
27
  >
32
28
  <ng-content></ng-content>
33
29
  </label>
34
- `
35
- }]
30
+ `, styles: [":host{display:inline-flex}\n"] }]
36
31
  }], propDecorators: { for: [{
37
32
  type: Input
38
33
  }], class: [{
39
34
  type: Input
40
35
  }] } });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBZWhDLE1BQU0sT0FBTyxjQUFjO0lBQ2QsR0FBRyxDQUFVO0lBQ2IsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUU1QixJQUFJLGFBQWE7UUFDYixPQUFPLEVBQUUsQ0FDTCx1SUFBdUksRUFDdkksSUFBSSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ04sQ0FBQzt3R0FUUSxjQUFjOzRGQUFkLGNBQWMsK0dBVGI7Ozs7Ozs7R0FPWCwyREFSVyxZQUFZOzs0RkFVYixjQUFjO2tCQWIxQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixRQUFRLEVBQUU7Ozs7Ozs7R0FPWDtpQkFDRjs4QkFFWSxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtbGFiZWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWxcbiAgICAgIFthdHRyLmZvcl09XCJmb3JcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2xhYmVsPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIExhYmVsQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBmb3I/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBjbihcbiAgICAgICAgICAgIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHNlbGVjdC1ub25lIHRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIHBlZXItZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHBlZXItZGlzYWJsZWQ6b3BhY2l0eS01MFwiLFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBZ0JoQyxNQUFNLE9BQU8sY0FBYztJQUNkLEdBQUcsQ0FBVTtJQUNiLEtBQUssR0FBVyxFQUFFLENBQUM7SUFFNUIsSUFBSSxhQUFhO1FBQ2IsT0FBTyxFQUFFLENBQ0wsdUlBQXVJLEVBQ3ZJLElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7d0dBVFEsY0FBYzs0RkFBZCxjQUFjLCtHQVRiOzs7Ozs7O0dBT1gscUdBUlcsWUFBWTs7NEZBVWIsY0FBYztrQkFkMUIsU0FBUzsrQkFDSSxhQUFhLGNBRVgsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7R0FPWDs4QkFHVSxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtbGFiZWwnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWxcbiAgICAgIFthdHRyLmZvcl09XCJmb3JcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2xhYmVsPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIExhYmVsQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBmb3I/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBjbihcbiAgICAgICAgICAgIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHNlbGVjdC1ub25lIHRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIHBlZXItZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIHBlZXItZGlzYWJsZWQ6b3BhY2l0eS01MFwiLFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,135 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const markerVariants = cva('flex w-full items-center gap-2 text-xs', {
8
+ variants: {
9
+ variant: {
10
+ // System notes and tool activity — centred, quiet.
11
+ default: 'justify-center py-1 text-muted-foreground',
12
+ // A labelled rule between two stretches of transcript.
13
+ separator: 'py-3 text-muted-foreground',
14
+ // Live status such as "Thinking…", aligned with the transcript's leading edge.
15
+ status: 'justify-start py-1 text-muted-foreground',
16
+ // A failed send or a tool error.
17
+ error: 'justify-center py-1 font-medium text-destructive',
18
+ },
19
+ },
20
+ defaultVariants: { variant: 'default' },
21
+ });
22
+ /**
23
+ * An inline row in a chat transcript that is not a message: a system note, a
24
+ * streaming status, tool activity, or a labelled date separator.
25
+ * @new
26
+ */
27
+ export class MarkerComponent {
28
+ cdr = inject(ChangeDetectorRef);
29
+ /**
30
+ * Angular writes a bound `class` input through its styling path, which does
31
+ * not mark an OnPush component dirty — without this hook the component keeps
32
+ * rendering the class it was born with.
33
+ */
34
+ ngOnChanges() {
35
+ this.cdr.markForCheck();
36
+ }
37
+ /** Kind of transcript marker this row represents. @default 'default' */
38
+ variant = 'default';
39
+ /** Text for the marker — the date on a separator, or the status wording. */
40
+ label = '';
41
+ /** Remixicon class for a leading icon, e.g. 'ri-tools-line'. */
42
+ icon = '';
43
+ /** Applies the shimmer text sweep, for live status such as "Thinking…". @default false */
44
+ shimmer = false;
45
+ /** Extra Tailwind classes merged onto the row via `cn()` (last-wins). */
46
+ class = '';
47
+ get computedClass() {
48
+ return cn(markerVariants({ variant: this.variant }), this.class);
49
+ }
50
+ /** Whether this marker announces a change to assistive technology. */
51
+ get isLive() {
52
+ return this.variant === 'status' || this.variant === 'error';
53
+ }
54
+ get iconClass() {
55
+ return cn('shrink-0', this.icon, this.shimmer && 'animate-pulse');
56
+ }
57
+ get labelClass() {
58
+ return cn('inline-flex items-center gap-1 whitespace-nowrap', this.variant === 'separator' && 'shrink-0 px-1 font-medium', this.shimmer && 'shimmer');
59
+ }
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MarkerComponent, isStandalone: true, selector: "tolle-marker", inputs: { variant: "variant", label: "label", icon: "icon", shimmer: "shimmer", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
62
+ <div
63
+ [class]="computedClass"
64
+ [attr.role]="variant === 'separator' ? 'separator' : isLive ? 'status' : null"
65
+ [attr.aria-live]="isLive ? 'polite' : null">
66
+ <span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
67
+
68
+ <i *ngIf="icon" [class]="iconClass" aria-hidden="true"></i>
69
+
70
+ <span [class]="labelClass">
71
+ <span *ngIf="label">{{ label }}</span>
72
+ <ng-content></ng-content>
73
+ </span>
74
+
75
+ <span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
76
+ </div>
77
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerComponent, decorators: [{
80
+ type: Component,
81
+ args: [{ selector: 'tolle-marker', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
82
+ <div
83
+ [class]="computedClass"
84
+ [attr.role]="variant === 'separator' ? 'separator' : isLive ? 'status' : null"
85
+ [attr.aria-live]="isLive ? 'polite' : null">
86
+ <span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
87
+
88
+ <i *ngIf="icon" [class]="iconClass" aria-hidden="true"></i>
89
+
90
+ <span [class]="labelClass">
91
+ <span *ngIf="label">{{ label }}</span>
92
+ <ng-content></ng-content>
93
+ </span>
94
+
95
+ <span *ngIf="variant === 'separator'" aria-hidden="true" class="h-px flex-1 bg-border"></span>
96
+ </div>
97
+ `, styles: [":host{display:block}\n"] }]
98
+ }], propDecorators: { variant: [{
99
+ type: Input
100
+ }], label: [{
101
+ type: Input
102
+ }], icon: [{
103
+ type: Input
104
+ }], shimmer: [{
105
+ type: Input
106
+ }], class: [{
107
+ type: Input
108
+ }] } });
109
+ /**
110
+ * Groups related markers — a run of tool calls, say — into one indented block so
111
+ * they read as a single step in the transcript.
112
+ */
113
+ export class MarkerGroupComponent {
114
+ cdr = inject(ChangeDetectorRef);
115
+ /**
116
+ * Angular writes a bound `class` input through its styling path, which does
117
+ * not mark an OnPush component dirty — without this hook the component keeps
118
+ * rendering the class it was born with.
119
+ */
120
+ ngOnChanges() {
121
+ this.cdr.markForCheck();
122
+ }
123
+ /** Extra Tailwind classes merged onto the group via `cn()` (last-wins). */
124
+ class = '';
125
+ cn = cn;
126
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
127
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MarkerGroupComponent, isStandalone: true, selector: "tolle-marker-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex w-full flex-col gap-0.5', class)" role="group"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkerGroupComponent, decorators: [{
130
+ type: Component,
131
+ args: [{ selector: 'tolle-marker-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex w-full flex-col gap-0.5', class)" role="group"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
132
+ }], propDecorators: { class: [{
133
+ type: Input
134
+ }] } });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbWFya2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBRWhDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRTtJQUNuRSxRQUFRLEVBQUU7UUFDUixPQUFPLEVBQUU7WUFDUCxtREFBbUQ7WUFDbkQsT0FBTyxFQUFFLDJDQUEyQztZQUNwRCx1REFBdUQ7WUFDdkQsU0FBUyxFQUFFLDRCQUE0QjtZQUN2QywrRUFBK0U7WUFDL0UsTUFBTSxFQUFFLDBDQUEwQztZQUNsRCxpQ0FBaUM7WUFDakMsS0FBSyxFQUFFLGtEQUFrRDtTQUMxRDtLQUNGO0lBQ0QsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtDQUN4QyxDQUFDLENBQUM7QUFJSDs7OztHQUlHO0FBeUJILE1BQU0sT0FBTyxlQUFlO0lBQ1QsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsd0VBQXdFO0lBQy9ELE9BQU8sR0FBMkIsU0FBUyxDQUFDO0lBQ3JELDRFQUE0RTtJQUNuRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGdFQUFnRTtJQUN2RCxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25CLDBGQUEwRjtJQUNqRixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLHlFQUF5RTtJQUNoRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLEVBQUUsQ0FDUCxrREFBa0QsRUFDbEQsSUFBSSxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksMkJBQTJCLEVBQzNELElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxDQUMxQixDQUFDO0lBQ0osQ0FBQzt3R0ExQ1UsZUFBZTs0RkFBZixlQUFlLCtMQWxCaEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQsK0ZBbEJTLFlBQVk7OzRGQW9CWCxlQUFlO2tCQXhCM0IsU0FBUzsrQkFDRSxjQUFjLGNBRVosSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQ7OEJBZVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSzs7QUF3QlI7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELDJFQUEyRTtJQUNsRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQzt3R0FkUCxvQkFBb0I7NEZBQXBCLG9CQUFvQiwrSEFGckIsdUdBQXVHLCtGQUZ2RyxZQUFZOzs0RkFJWCxvQkFBb0I7a0JBUmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBRWxCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLHVHQUF1Rzs4QkFleEcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuY29uc3QgbWFya2VyVmFyaWFudHMgPSBjdmEoJ2ZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXhzJywge1xuICB2YXJpYW50czoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIC8vIFN5c3RlbSBub3RlcyBhbmQgdG9vbCBhY3Rpdml0eSDigJQgY2VudHJlZCwgcXVpZXQuXG4gICAgICBkZWZhdWx0OiAnanVzdGlmeS1jZW50ZXIgcHktMSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gQSBsYWJlbGxlZCBydWxlIGJldHdlZW4gdHdvIHN0cmV0Y2hlcyBvZiB0cmFuc2NyaXB0LlxuICAgICAgc2VwYXJhdG9yOiAncHktMyB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gTGl2ZSBzdGF0dXMgc3VjaCBhcyBcIlRoaW5raW5n4oCmXCIsIGFsaWduZWQgd2l0aCB0aGUgdHJhbnNjcmlwdCdzIGxlYWRpbmcgZWRnZS5cbiAgICAgIHN0YXR1czogJ2p1c3RpZnktc3RhcnQgcHktMSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgLy8gQSBmYWlsZWQgc2VuZCBvciBhIHRvb2wgZXJyb3IuXG4gICAgICBlcnJvcjogJ2p1c3RpZnktY2VudGVyIHB5LTEgZm9udC1tZWRpdW0gdGV4dC1kZXN0cnVjdGl2ZScsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7IHZhcmlhbnQ6ICdkZWZhdWx0JyB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIE1hcmtlclByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBtYXJrZXJWYXJpYW50cz47XG5cbi8qKlxuICogQW4gaW5saW5lIHJvdyBpbiBhIGNoYXQgdHJhbnNjcmlwdCB0aGF0IGlzIG5vdCBhIG1lc3NhZ2U6IGEgc3lzdGVtIG5vdGUsIGFcbiAqIHN0cmVhbWluZyBzdGF0dXMsIHRvb2wgYWN0aXZpdHksIG9yIGEgbGFiZWxsZWQgZGF0ZSBzZXBhcmF0b3IuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1hcmtlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiXG4gICAgICBbYXR0ci5yb2xlXT1cInZhcmlhbnQgPT09ICdzZXBhcmF0b3InID8gJ3NlcGFyYXRvcicgOiBpc0xpdmUgPyAnc3RhdHVzJyA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1saXZlXT1cImlzTGl2ZSA/ICdwb2xpdGUnIDogbnVsbFwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50ID09PSAnc2VwYXJhdG9yJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaC1weCBmbGV4LTEgYmctYm9yZGVyXCI+PC9zcGFuPlxuXG4gICAgICA8aSAqbmdJZj1cImljb25cIiBbY2xhc3NdPVwiaWNvbkNsYXNzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICA8c3BhbiBbY2xhc3NdPVwibGFiZWxDbGFzc1wiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50ID09PSAnc2VwYXJhdG9yJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaC1weCBmbGV4LTEgYmctYm9yZGVyXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2Vze1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBLaW5kIG9mIHRyYW5zY3JpcHQgbWFya2VyIHRoaXMgcm93IHJlcHJlc2VudHMuIEBkZWZhdWx0ICdkZWZhdWx0JyAqL1xuICBASW5wdXQoKSB2YXJpYW50OiBNYXJrZXJQcm9wc1sndmFyaWFudCddID0gJ2RlZmF1bHQnO1xuICAvKiogVGV4dCBmb3IgdGhlIG1hcmtlciDigJQgdGhlIGRhdGUgb24gYSBzZXBhcmF0b3IsIG9yIHRoZSBzdGF0dXMgd29yZGluZy4gKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgLyoqIFJlbWl4aWNvbiBjbGFzcyBmb3IgYSBsZWFkaW5nIGljb24sIGUuZy4gJ3JpLXRvb2xzLWxpbmUnLiAqL1xuICBASW5wdXQoKSBpY29uID0gJyc7XG4gIC8qKiBBcHBsaWVzIHRoZSBzaGltbWVyIHRleHQgc3dlZXAsIGZvciBsaXZlIHN0YXR1cyBzdWNoIGFzIFwiVGhpbmtpbmfigKZcIi4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgc2hpbW1lciA9IGZhbHNlO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcm93IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24obWFya2VyVmFyaWFudHMoeyB2YXJpYW50OiB0aGlzLnZhcmlhbnQgfSksIHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBtYXJrZXIgYW5ub3VuY2VzIGEgY2hhbmdlIHRvIGFzc2lzdGl2ZSB0ZWNobm9sb2d5LiAqL1xuICBnZXQgaXNMaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09ICdzdGF0dXMnIHx8IHRoaXMudmFyaWFudCA9PT0gJ2Vycm9yJztcbiAgfVxuXG4gIGdldCBpY29uQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24oJ3Nocmluay0wJywgdGhpcy5pY29uLCB0aGlzLnNoaW1tZXIgJiYgJ2FuaW1hdGUtcHVsc2UnKTtcbiAgfVxuXG4gIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSB3aGl0ZXNwYWNlLW5vd3JhcCcsXG4gICAgICB0aGlzLnZhcmlhbnQgPT09ICdzZXBhcmF0b3InICYmICdzaHJpbmstMCBweC0xIGZvbnQtbWVkaXVtJyxcbiAgICAgIHRoaXMuc2hpbW1lciAmJiAnc2hpbW1lcidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogR3JvdXBzIHJlbGF0ZWQgbWFya2VycyDigJQgYSBydW4gb2YgdG9vbCBjYWxscywgc2F5IOKAlCBpbnRvIG9uZSBpbmRlbnRlZCBibG9jayBzb1xuICogdGhleSByZWFkIGFzIGEgc2luZ2xlIHN0ZXAgaW4gdGhlIHRyYW5zY3JpcHQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLW1hcmtlci1ncm91cCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjbignZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTAuNScsIGNsYXNzKVwiIHJvbGU9XCJncm91cFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5gLFxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZXJHcm91cENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkNoYW5nZXN7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGdyb3VwIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuIl19