@daffodil/design 0.90.0 → 0.92.3-rc.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 (277) hide show
  1. package/accordion/README.md +26 -38
  2. package/accordion/index.d.ts +9 -6
  3. package/article/README.md +66 -46
  4. package/article/index.d.ts +41 -0
  5. package/article/src/article-theme.scss +22 -0
  6. package/breadcrumb/README.md +6 -1
  7. package/breadcrumb/index.d.ts +65 -11
  8. package/breadcrumb/src/breadcrumb-theme.scss +1 -1
  9. package/button/README.md +36 -33
  10. package/button/index.d.ts +27 -6
  11. package/button/src/button/basic/button-theme.scss +4 -2
  12. package/button/src/button/button-base.scss +29 -6
  13. package/button/src/button/icon/icon-theme.scss +10 -6
  14. package/button/src/button/raised/raised-theme.scss +6 -4
  15. package/callout/README.md +15 -27
  16. package/card/README.md +36 -69
  17. package/card/index.d.ts +7 -41
  18. package/card/src/card-base-theme.scss +2 -5
  19. package/card/src/card-base.scss +2 -2
  20. package/checkbox/README.md +0 -0
  21. package/checkbox/index.d.ts +177 -0
  22. package/container/README.md +18 -23
  23. package/fesm2022/daffodil-design-accordion.mjs +34 -25
  24. package/fesm2022/daffodil-design-accordion.mjs.map +1 -1
  25. package/fesm2022/daffodil-design-article.mjs +283 -17
  26. package/fesm2022/daffodil-design-article.mjs.map +1 -1
  27. package/fesm2022/daffodil-design-breadcrumb.mjs +180 -28
  28. package/fesm2022/daffodil-design-breadcrumb.mjs.map +1 -1
  29. package/fesm2022/daffodil-design-button.mjs +90 -45
  30. package/fesm2022/daffodil-design-button.mjs.map +1 -1
  31. package/fesm2022/daffodil-design-callout.mjs +23 -23
  32. package/fesm2022/daffodil-design-callout.mjs.map +1 -1
  33. package/fesm2022/daffodil-design-card.mjs +43 -90
  34. package/fesm2022/daffodil-design-card.mjs.map +1 -1
  35. package/fesm2022/daffodil-design-checkbox.mjs +317 -0
  36. package/fesm2022/daffodil-design-checkbox.mjs.map +1 -0
  37. package/fesm2022/daffodil-design-container.mjs +8 -8
  38. package/fesm2022/daffodil-design-container.mjs.map +1 -1
  39. package/fesm2022/daffodil-design-form-field.mjs +56 -86
  40. package/fesm2022/daffodil-design-form-field.mjs.map +1 -1
  41. package/fesm2022/daffodil-design-form.mjs +62 -0
  42. package/fesm2022/daffodil-design-form.mjs.map +1 -0
  43. package/fesm2022/daffodil-design-hero.mjs +23 -23
  44. package/fesm2022/daffodil-design-hero.mjs.map +1 -1
  45. package/fesm2022/daffodil-design-image.mjs +19 -11
  46. package/fesm2022/daffodil-design-image.mjs.map +1 -1
  47. package/fesm2022/daffodil-design-input.mjs +18 -14
  48. package/fesm2022/daffodil-design-input.mjs.map +1 -1
  49. package/fesm2022/daffodil-design-link-set.mjs +25 -17
  50. package/fesm2022/daffodil-design-link-set.mjs.map +1 -1
  51. package/fesm2022/daffodil-design-list.mjs +16 -16
  52. package/fesm2022/daffodil-design-list.mjs.map +1 -1
  53. package/fesm2022/daffodil-design-loading-icon.mjs +8 -8
  54. package/fesm2022/daffodil-design-loading-icon.mjs.map +1 -1
  55. package/fesm2022/daffodil-design-media-gallery.mjs +13 -13
  56. package/fesm2022/daffodil-design-media-gallery.mjs.map +1 -1
  57. package/fesm2022/daffodil-design-menu.mjs +223 -60
  58. package/fesm2022/daffodil-design-menu.mjs.map +1 -1
  59. package/fesm2022/daffodil-design-modal.mjs +86 -83
  60. package/fesm2022/daffodil-design-modal.mjs.map +1 -1
  61. package/fesm2022/daffodil-design-native-select.mjs +47 -41
  62. package/fesm2022/daffodil-design-native-select.mjs.map +1 -1
  63. package/fesm2022/daffodil-design-navbar.mjs +25 -21
  64. package/fesm2022/daffodil-design-navbar.mjs.map +1 -1
  65. package/fesm2022/daffodil-design-notification.mjs +28 -64
  66. package/fesm2022/daffodil-design-notification.mjs.map +1 -1
  67. package/fesm2022/daffodil-design-paginator.mjs +11 -16
  68. package/fesm2022/daffodil-design-paginator.mjs.map +1 -1
  69. package/fesm2022/daffodil-design-progress-bar.mjs +10 -10
  70. package/fesm2022/daffodil-design-progress-bar.mjs.map +1 -1
  71. package/fesm2022/daffodil-design-quantity-field.mjs +19 -18
  72. package/fesm2022/daffodil-design-quantity-field.mjs.map +1 -1
  73. package/fesm2022/daffodil-design-radio.mjs +27 -56
  74. package/fesm2022/daffodil-design-radio.mjs.map +1 -1
  75. package/fesm2022/daffodil-design-select.mjs +6 -6
  76. package/fesm2022/daffodil-design-select.mjs.map +1 -1
  77. package/fesm2022/daffodil-design-sidebar.mjs +30 -60
  78. package/fesm2022/daffodil-design-sidebar.mjs.map +1 -1
  79. package/fesm2022/daffodil-design-spinner.mjs +99 -0
  80. package/fesm2022/daffodil-design-spinner.mjs.map +1 -0
  81. package/fesm2022/daffodil-design-switch.mjs +49 -106
  82. package/fesm2022/daffodil-design-switch.mjs.map +1 -1
  83. package/fesm2022/daffodil-design-tabs.mjs +35 -27
  84. package/fesm2022/daffodil-design-tabs.mjs.map +1 -1
  85. package/fesm2022/daffodil-design-tag.mjs +7 -7
  86. package/fesm2022/daffodil-design-tag.mjs.map +1 -1
  87. package/fesm2022/daffodil-design-text-snippet.mjs +6 -8
  88. package/fesm2022/daffodil-design-text-snippet.mjs.map +1 -1
  89. package/fesm2022/daffodil-design-textarea.mjs +6 -3
  90. package/fesm2022/daffodil-design-textarea.mjs.map +1 -1
  91. package/fesm2022/daffodil-design-toast.mjs +79 -80
  92. package/fesm2022/daffodil-design-toast.mjs.map +1 -1
  93. package/fesm2022/daffodil-design-tree.mjs +152 -112
  94. package/fesm2022/daffodil-design-tree.mjs.map +1 -1
  95. package/fesm2022/daffodil-design-youtube-player.mjs +6 -6
  96. package/fesm2022/daffodil-design-youtube-player.mjs.map +1 -1
  97. package/fesm2022/daffodil-design.mjs +559 -711
  98. package/fesm2022/daffodil-design.mjs.map +1 -1
  99. package/form/README.md +75 -0
  100. package/form/index.d.ts +27 -0
  101. package/form-field/README.md +74 -99
  102. package/form-field/index.d.ts +64 -42
  103. package/hero/README.md +5 -5
  104. package/image/README.md +27 -19
  105. package/image/index.d.ts +6 -1
  106. package/index.d.ts +282 -447
  107. package/input/README.md +36 -16
  108. package/input/index.d.ts +4 -3
  109. package/link-set/index.d.ts +9 -1
  110. package/list/README.md +2 -2
  111. package/loading-icon/README.md +1 -1
  112. package/loading-icon/index.d.ts +1 -1
  113. package/media-gallery/README.md +3 -3
  114. package/menu/README.md +107 -10
  115. package/menu/index.d.ts +143 -11
  116. package/modal/README.md +107 -17
  117. package/modal/index.d.ts +72 -35
  118. package/native-select/README.md +52 -15
  119. package/native-select/index.d.ts +8 -7
  120. package/navbar/README.md +23 -17
  121. package/navbar/index.d.ts +12 -2
  122. package/navbar/src/navbar-theme.scss +4 -46
  123. package/notification/README.md +4 -4
  124. package/notification/index.d.ts +7 -38
  125. package/package.json +1 -1
  126. package/paginator/README.md +42 -6
  127. package/paginator/index.d.ts +5 -9
  128. package/progress-bar/README.md +3 -3
  129. package/quantity-field/README.md +4 -4
  130. package/quantity-field/index.d.ts +4 -1
  131. package/radio/README.md +1 -1
  132. package/radio/index.d.ts +0 -16
  133. package/scss/layout/_breakpoint.scss +1 -1
  134. package/scss/theme.scss +9 -5
  135. package/scss/theming/_color-palettes.scss +19 -11
  136. package/scss/theming/_configure-theme.scss +11 -10
  137. package/scss/theming/_daff-theme.scss +5 -14
  138. package/scss/theming/_get-base-color.scss +2 -2
  139. package/scss/theming/_get-palette.scss +2 -2
  140. package/scss/theming/_get-theme-mode.scss +3 -3
  141. package/scss/theming/_index.scss +2 -1
  142. package/scss/theming/contrast/max-contrast/max-contrast.scss +3 -3
  143. package/scss/theming/contrast/text-contrast/text-contrast.scss +22 -16
  144. package/scss/theming/contrast/text-contrast/text-contrast.spec.scss +57 -0
  145. package/scss/theming/create-theme/_create-theme.scss +330 -0
  146. package/scss/theming/create-theme/_create-theme.spec.scss +122 -0
  147. package/scss/theming/create-theme/_index.scss +1 -0
  148. package/scss/theming/get-font-colors/_get-font-colors.scss +36 -0
  149. package/scss/theming/get-font-colors/_get-font-colors.spec.scss +72 -0
  150. package/scss/typography/mixins/_font-weight.scss +8 -14
  151. package/select/README.md +107 -4
  152. package/sidebar/README.md +6 -14
  153. package/sidebar/index.d.ts +3 -15
  154. package/spinner/README.md +57 -0
  155. package/spinner/index.d.ts +53 -0
  156. package/spinner/src/spinner-theme.scss +62 -0
  157. package/switch/README.md +21 -29
  158. package/switch/index.d.ts +18 -48
  159. package/switch/src/switch-theme.scss +26 -18
  160. package/tabs/README.md +1 -1
  161. package/tabs/index.d.ts +8 -5
  162. package/tag/README.md +24 -30
  163. package/tag/index.d.ts +1 -1
  164. package/tag/src/tag-theme.scss +11 -9
  165. package/text-snippet/README.md +1 -1
  166. package/text-snippet/src/text-snippet-theme.scss +12 -0
  167. package/textarea/README.md +36 -6
  168. package/textarea/index.d.ts +4 -4
  169. package/toast/README.md +4 -4
  170. package/tree/README.md +39 -22
  171. package/tree/index.d.ts +57 -96
  172. package/tree/src/tree-theme.scss +0 -4
  173. package/accordion/examples/index.d.ts +0 -20
  174. package/article/examples/index.d.ts +0 -50
  175. package/breadcrumb/examples/index.d.ts +0 -10
  176. package/button/examples/index.d.ts +0 -67
  177. package/callout/examples/index.d.ts +0 -41
  178. package/card/examples/index.d.ts +0 -62
  179. package/card/src/card/raised/raised-theme.scss +0 -28
  180. package/checkbox/examples/index.d.ts +0 -32
  181. package/container/examples/index.d.ts +0 -16
  182. package/fesm2022/daffodil-design-accordion-examples.mjs +0 -50
  183. package/fesm2022/daffodil-design-accordion-examples.mjs.map +0 -1
  184. package/fesm2022/daffodil-design-article-examples.mjs +0 -134
  185. package/fesm2022/daffodil-design-article-examples.mjs.map +0 -1
  186. package/fesm2022/daffodil-design-breadcrumb-examples.mjs +0 -46
  187. package/fesm2022/daffodil-design-breadcrumb-examples.mjs.map +0 -1
  188. package/fesm2022/daffodil-design-button-examples.mjs +0 -178
  189. package/fesm2022/daffodil-design-button-examples.mjs.map +0 -1
  190. package/fesm2022/daffodil-design-callout-examples.mjs +0 -116
  191. package/fesm2022/daffodil-design-callout-examples.mjs.map +0 -1
  192. package/fesm2022/daffodil-design-card-examples.mjs +0 -168
  193. package/fesm2022/daffodil-design-card-examples.mjs.map +0 -1
  194. package/fesm2022/daffodil-design-checkbox-examples.mjs +0 -76
  195. package/fesm2022/daffodil-design-checkbox-examples.mjs.map +0 -1
  196. package/fesm2022/daffodil-design-container-examples.mjs +0 -41
  197. package/fesm2022/daffodil-design-container-examples.mjs.map +0 -1
  198. package/fesm2022/daffodil-design-form-field-examples.mjs +0 -96
  199. package/fesm2022/daffodil-design-form-field-examples.mjs.map +0 -1
  200. package/fesm2022/daffodil-design-hero-examples.mjs +0 -121
  201. package/fesm2022/daffodil-design-hero-examples.mjs.map +0 -1
  202. package/fesm2022/daffodil-design-image-examples.mjs +0 -58
  203. package/fesm2022/daffodil-design-image-examples.mjs.map +0 -1
  204. package/fesm2022/daffodil-design-input-examples.mjs +0 -108
  205. package/fesm2022/daffodil-design-input-examples.mjs.map +0 -1
  206. package/fesm2022/daffodil-design-list-examples.mjs +0 -77
  207. package/fesm2022/daffodil-design-list-examples.mjs.map +0 -1
  208. package/fesm2022/daffodil-design-loading-icon-examples.mjs +0 -44
  209. package/fesm2022/daffodil-design-loading-icon-examples.mjs.map +0 -1
  210. package/fesm2022/daffodil-design-media-gallery-examples.mjs +0 -104
  211. package/fesm2022/daffodil-design-media-gallery-examples.mjs.map +0 -1
  212. package/fesm2022/daffodil-design-menu-examples.mjs +0 -50
  213. package/fesm2022/daffodil-design-menu-examples.mjs.map +0 -1
  214. package/fesm2022/daffodil-design-modal-examples.mjs +0 -51
  215. package/fesm2022/daffodil-design-modal-examples.mjs.map +0 -1
  216. package/fesm2022/daffodil-design-native-select-examples.mjs +0 -71
  217. package/fesm2022/daffodil-design-native-select-examples.mjs.map +0 -1
  218. package/fesm2022/daffodil-design-navbar-examples.mjs +0 -88
  219. package/fesm2022/daffodil-design-navbar-examples.mjs.map +0 -1
  220. package/fesm2022/daffodil-design-notification-examples.mjs +0 -102
  221. package/fesm2022/daffodil-design-notification-examples.mjs.map +0 -1
  222. package/fesm2022/daffodil-design-paginator-examples.mjs +0 -59
  223. package/fesm2022/daffodil-design-paginator-examples.mjs.map +0 -1
  224. package/fesm2022/daffodil-design-progress-bar-examples.mjs +0 -57
  225. package/fesm2022/daffodil-design-progress-bar-examples.mjs.map +0 -1
  226. package/fesm2022/daffodil-design-quantity-field-examples.mjs +0 -85
  227. package/fesm2022/daffodil-design-quantity-field-examples.mjs.map +0 -1
  228. package/fesm2022/daffodil-design-radio-examples.mjs +0 -34
  229. package/fesm2022/daffodil-design-radio-examples.mjs.map +0 -1
  230. package/fesm2022/daffodil-design-select-examples.mjs +0 -117
  231. package/fesm2022/daffodil-design-select-examples.mjs.map +0 -1
  232. package/fesm2022/daffodil-design-sidebar-examples.mjs +0 -109
  233. package/fesm2022/daffodil-design-sidebar-examples.mjs.map +0 -1
  234. package/fesm2022/daffodil-design-sticky-examples.mjs +0 -25
  235. package/fesm2022/daffodil-design-sticky-examples.mjs.map +0 -1
  236. package/fesm2022/daffodil-design-switch-examples.mjs +0 -110
  237. package/fesm2022/daffodil-design-switch-examples.mjs.map +0 -1
  238. package/fesm2022/daffodil-design-tabs-examples.mjs +0 -115
  239. package/fesm2022/daffodil-design-tabs-examples.mjs.map +0 -1
  240. package/fesm2022/daffodil-design-tag-examples.mjs +0 -125
  241. package/fesm2022/daffodil-design-tag-examples.mjs.map +0 -1
  242. package/fesm2022/daffodil-design-text-snippet-examples.mjs +0 -25
  243. package/fesm2022/daffodil-design-text-snippet-examples.mjs.map +0 -1
  244. package/fesm2022/daffodil-design-textarea-examples.mjs +0 -66
  245. package/fesm2022/daffodil-design-textarea-examples.mjs.map +0 -1
  246. package/fesm2022/daffodil-design-toast-examples.mjs +0 -147
  247. package/fesm2022/daffodil-design-toast-examples.mjs.map +0 -1
  248. package/fesm2022/daffodil-design-tree-examples.mjs +0 -104
  249. package/fesm2022/daffodil-design-tree-examples.mjs.map +0 -1
  250. package/form-field/examples/index.d.ts +0 -18
  251. package/hero/examples/index.d.ts +0 -45
  252. package/image/examples/index.d.ts +0 -10
  253. package/input/examples/index.d.ts +0 -10
  254. package/list/examples/index.d.ts +0 -29
  255. package/loading-icon/examples/index.d.ts +0 -16
  256. package/media-gallery/examples/index.d.ts +0 -38
  257. package/menu/examples/index.d.ts +0 -20
  258. package/modal/examples/index.d.ts +0 -15
  259. package/native-select/examples/index.d.ts +0 -10
  260. package/navbar/examples/index.d.ts +0 -31
  261. package/notification/examples/index.d.ts +0 -12
  262. package/paginator/examples/index.d.ts +0 -26
  263. package/progress-bar/examples/index.d.ts +0 -10
  264. package/quantity-field/examples/index.d.ts +0 -30
  265. package/radio/examples/index.d.ts +0 -13
  266. package/select/examples/index.d.ts +0 -28
  267. package/sidebar/examples/index.d.ts +0 -10
  268. package/sticky/examples/index.d.ts +0 -10
  269. package/switch/examples/index.d.ts +0 -46
  270. package/tabs/examples/index.d.ts +0 -12
  271. package/tag/examples/index.d.ts +0 -50
  272. package/text-snippet/examples/index.d.ts +0 -10
  273. package/textarea/examples/index.d.ts +0 -10
  274. package/toast/examples/index.d.ts +0 -56
  275. package/tree/examples/index.d.ts +0 -18
  276. /package/{form-field → form}/src/error-message/error-message-theme.scss +0 -0
  277. /package/{form-field → form}/src/hint/hint-theme.scss +0 -0
@@ -1,7 +1,7 @@
1
- import { NgFor, NgTemplateOutlet, CommonModule } from '@angular/common';
1
+ import { NgTemplateOutlet, DOCUMENT, CommonModule } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { Inject, ContentChild, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, DOCUMENT, Directive, NgModule } from '@angular/core';
4
- import * as i2 from '@daffodil/design';
3
+ import { Inject, inject, input, computed, signal, contentChild, ChangeDetectionStrategy, ViewEncapsulation, Component, effect, untracked, Directive, NgModule } from '@angular/core';
4
+ import * as i1 from '@daffodil/design';
5
5
  import { DaffArticleEncapsulatedDirective } from '@daffodil/design';
6
6
  import { __decorate } from 'tslib';
7
7
  import { BehaviorSubject } from 'rxjs';
@@ -132,7 +132,7 @@ const traverse = (tree, visit, key) => {
132
132
  };
133
133
 
134
134
  const daffDataTreeToUiTree = (data, parent, open = false) => ({
135
- id: data.id ?? data.title,
135
+ id: parent ? `${parent.id}.${data.id ?? data.title}` : (data.id ?? data.title),
136
136
  title: data.title,
137
137
  url: data.url,
138
138
  data: data.data,
@@ -144,10 +144,18 @@ const daffDataTreeToUiTree = (data, parent, open = false) => ({
144
144
  * This function translates the original data given to us by the client
145
145
  * to the internal representation of the tree used by the {@link DaffTreeComponent}
146
146
  */
147
- const hydrateTree = (data) => {
148
- const tree = daffDataTreeToUiTree(data, undefined, true);
147
+ const hydrateTree = (data, treeId) => {
148
+ const root = {
149
+ id: treeId ?? (data.id ?? data.title),
150
+ title: data.title,
151
+ url: data.url,
152
+ data: data.data,
153
+ open: true,
154
+ parent: undefined,
155
+ items: [],
156
+ };
149
157
  let treeStack = [
150
- tree,
158
+ root,
151
159
  ];
152
160
  traverse(data, (el) => {
153
161
  const treeEl = treeStack.pop();
@@ -158,10 +166,11 @@ const hydrateTree = (data) => {
158
166
  ];
159
167
  return el;
160
168
  }, 'items');
161
- return tree;
169
+ return root;
162
170
  };
163
171
 
164
172
  /* eslint-disable quote-props */
173
+ let daffTreeId = 0;
165
174
  /**
166
175
  * The `DaffTreeComponent` allows you to render tree structures as interactable UI.
167
176
  *
@@ -182,62 +191,73 @@ const hydrateTree = (data) => {
182
191
  *
183
192
  */
184
193
  class DaffTreeComponent {
185
- /**
186
- * @docs-private
187
- */
188
- constructor(notifier) {
189
- this.notifier = notifier;
194
+ constructor() {
195
+ this.notifier = inject(DaffTreeNotifierService);
196
+ /**
197
+ * The rendering mode for nodes in the tree.
198
+ *
199
+ * Default value is `in-dom`, which means nodes are present in the DOM.
200
+ *
201
+ * Generally, `not-in-dom` is faster as there are less DOM elements to render,
202
+ * but there may be use-cases (like SEO) where having the tree in the DOM
203
+ * is relevant.
204
+ */
205
+ this.renderMode = input(...(ngDevMode ? [undefined, { debugName: "renderMode" }] : []));
206
+ /**
207
+ * A unique identifier for the tree instance.
208
+ * Used as a prefix for all node IDs in the tree.
209
+ * If not provided, an auto-incrementing number is used.
210
+ */
211
+ this.id = input(`${daffTreeId++}`, ...(ngDevMode ? [{ debugName: "id" }] : []));
212
+ /**
213
+ * The tree data you would like to render.
214
+ */
215
+ this.tree = input(...(ngDevMode ? [undefined, { debugName: "tree" }] : []));
190
216
  /**
191
217
  * The internal tree element.
192
218
  */
193
- this._tree = undefined;
219
+ this._tree = computed(() => {
220
+ const tree = this.tree();
221
+ return tree ? hydrateTree(tree, this.id()) : undefined;
222
+ }, ...(ngDevMode ? [{ debugName: "_tree" }] : []));
223
+ /**
224
+ * A revision counter incremented by notifications from tree items.
225
+ * Used to trigger re-flattening when tree item state changes.
226
+ */
227
+ this._revision = signal(0, ...(ngDevMode ? [{ debugName: "_revision" }] : []));
194
228
  /**
195
229
  * @docs-private
196
230
  *
197
231
  * The flattened tree data. For debugging purposes, you can iterate through this if you want to inspect
198
232
  * the resulting array structure we computed to render the tree.
199
233
  */
200
- this.flatTree = [];
201
- }
202
- /**
203
- * @docs-private
204
- */
205
- ngOnChanges(changes) {
206
- if (!changes.tree.currentValue) {
207
- this._tree = undefined;
208
- this.flatTree = [];
209
- return;
210
- }
211
- if (changes.renderMode && !changes.tree) {
212
- this.flatTree = flattenTree(this._tree, changes.renderMode.currentValue === 'not-in-dom');
213
- }
214
- else if (changes.renderMode || changes.tree) {
215
- this._tree = hydrateTree(changes.tree?.currentValue ?? this.tree);
216
- this.flatTree = flattenTree(this._tree, (changes.renderMode?.currentValue ?? this.renderMode) === 'not-in-dom');
217
- }
218
- }
219
- /**
220
- * @docs-private
221
- *
222
- * The track-by function used to reduce tree-item re-renders
223
- */
224
- trackByTreeElement(index, el) {
225
- return el.title;
226
- }
227
- /**
228
- * @docs-private
229
- */
230
- ngOnInit() {
234
+ this.flatTree = computed(() => {
235
+ this._revision();
236
+ const tree = this._tree();
237
+ return tree ? flattenTree(tree, this.renderMode() === 'not-in-dom') : [];
238
+ }, ...(ngDevMode ? [{ debugName: "flatTree" }] : []));
239
+ /**
240
+ * The template used to render tree-nodes that themselves have children.
241
+ *
242
+ * @docs-private
243
+ */
244
+ this.withChildrenTemplate = contentChild('daffTreeItemWithChildrenTpl', ...(ngDevMode ? [{ debugName: "withChildrenTemplate" }] : []));
245
+ /**
246
+ * The template used to render tree-nodes that have no children.
247
+ *
248
+ * @docs-private
249
+ */
250
+ this.treeItemTemplate = contentChild('daffTreeItemTpl', ...(ngDevMode ? [{ debugName: "treeItemTemplate" }] : []));
231
251
  this.notifier.notice$.subscribe(() => {
232
- this.flatTree = flattenTree(this._tree, this.renderMode === 'not-in-dom');
252
+ this._revision.update((r) => r + 1);
233
253
  });
234
254
  }
235
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeComponent, deps: [{ token: DaffTreeNotifierService }], target: i0.ɵɵFactoryTarget.Component }); }
236
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", type: DaffTreeComponent, isStandalone: true, selector: "ul[daff-tree]", inputs: { renderMode: "renderMode", tree: "tree" }, host: { classAttribute: "daff-tree" }, providers: [
255
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
256
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: DaffTreeComponent, isStandalone: true, selector: "ul[daff-tree]", inputs: { renderMode: { classPropertyName: "renderMode", publicName: "renderMode", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, tree: { classPropertyName: "tree", publicName: "tree", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "daff-tree" }, providers: [
237
257
  DaffTreeNotifierService,
238
- ], queries: [{ propertyName: "withChildrenTemplate", first: true, predicate: ["daffTreeItemWithChildrenTpl"], descendants: true, static: true }, { propertyName: "treeItemTemplate", first: true, predicate: ["daffTreeItemTpl"], descendants: true, static: true }], usesOnChanges: true, hostDirectives: [{ directive: i2.DaffArticleEncapsulatedDirective }], ngImport: i0, template: "<ng-container *ngFor=\"let node of flatTree; trackBy: trackByTreeElement\">\n\t<ng-container>\n\t\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate : treeItemTemplate; context: { $implicit: node }\">\n\t\t\t</ng-container>\n\t\t</li>\n\t</ng-container>\n</ng-container>", styles: [".daff-tree{margin:0;padding:0;list-style:none;--tree-padding: 1rem}.daff-tree li.hidden{display:none}.daff-tree-item{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;position:relative;background:none;border:0;padding:.5rem 1rem .5rem 0;line-height:1.5rem;font-weight:400;text-align:left;text-decoration:none;width:100%;padding-left:calc(var(--tree-padding) * (var(--depth)))}.daff-tree-item:before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:.25rem}.daff-tree-item:focus,.daff-tree-item:focus-visible{z-index:1}.daff-tree-item.selected{font-weight:500}.daff-tree-item.parent{position:relative;padding-right:2.5rem}.daff-tree-item.parent:after{content:\"\";position:absolute;top:48%;right:1rem;display:inline-block;border-right:2px solid currentColor;border-bottom:2px solid currentColor;width:.5rem;height:.5rem;transform:translateY(-50%) rotate(45deg);transition:transform .15s}.daff-tree-item.parent.open:after{top:56%;transform:translateY(-50%) rotate(225deg)}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
258
+ ], queries: [{ propertyName: "withChildrenTemplate", first: true, predicate: ["daffTreeItemWithChildrenTpl"], descendants: true, isSignal: true }, { propertyName: "treeItemTemplate", first: true, predicate: ["daffTreeItemTpl"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.DaffArticleEncapsulatedDirective }], ngImport: i0, template: "@for (node of flatTree(); track node.id) {\n\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t<ng-container\n\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate() : treeItemTemplate(); context: { $implicit: node }\">\n\t\t</ng-container>\n\t</li>\n}", styles: [".daff-tree{margin:0;padding:0;list-style:none;--tree-padding: 1rem}.daff-tree li.hidden{display:none}.daff-tree-item{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;position:relative;background:none;border:0;padding:.5rem 1rem .5rem 0;line-height:1.5rem;font-weight:400;text-align:left;text-decoration:none;width:100%;padding-left:calc(var(--tree-padding) * (var(--depth)))}.daff-tree-item:before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:.25rem}.daff-tree-item:focus,.daff-tree-item:focus-visible{z-index:1}.daff-tree-item.selected{font-weight:500}.daff-tree-item.parent{position:relative;padding-right:2.5rem}.daff-tree-item.parent:after{content:\"\";position:absolute;top:48%;right:1rem;display:inline-block;border-right:2px solid currentColor;border-bottom:2px solid currentColor;width:.5rem;height:.5rem;transform:translateY(-50%) rotate(45deg);transition:transform .15s}.daff-tree-item.parent.open:after{top:56%;transform:translateY(-50%) rotate(225deg)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
239
259
  }
240
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeComponent, decorators: [{
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeComponent, decorators: [{
241
261
  type: Component,
242
262
  args: [{ selector: 'ul[daff-tree]', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
243
263
  DaffTreeNotifierService,
@@ -246,20 +266,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
246
266
  }], host: {
247
267
  'class': 'daff-tree',
248
268
  }, imports: [
249
- NgFor,
250
269
  NgTemplateOutlet,
251
- ], template: "<ng-container *ngFor=\"let node of flatTree; trackBy: trackByTreeElement\">\n\t<ng-container>\n\t\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate : treeItemTemplate; context: { $implicit: node }\">\n\t\t\t</ng-container>\n\t\t</li>\n\t</ng-container>\n</ng-container>", styles: [".daff-tree{margin:0;padding:0;list-style:none;--tree-padding: 1rem}.daff-tree li.hidden{display:none}.daff-tree-item{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;position:relative;background:none;border:0;padding:.5rem 1rem .5rem 0;line-height:1.5rem;font-weight:400;text-align:left;text-decoration:none;width:100%;padding-left:calc(var(--tree-padding) * (var(--depth)))}.daff-tree-item:before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:.25rem}.daff-tree-item:focus,.daff-tree-item:focus-visible{z-index:1}.daff-tree-item.selected{font-weight:500}.daff-tree-item.parent{position:relative;padding-right:2.5rem}.daff-tree-item.parent:after{content:\"\";position:absolute;top:48%;right:1rem;display:inline-block;border-right:2px solid currentColor;border-bottom:2px solid currentColor;width:.5rem;height:.5rem;transform:translateY(-50%) rotate(45deg);transition:transform .15s}.daff-tree-item.parent.open:after{top:56%;transform:translateY(-50%) rotate(225deg)}\n"] }]
252
- }], ctorParameters: () => [{ type: DaffTreeNotifierService }], propDecorators: { renderMode: [{
253
- type: Input
254
- }], tree: [{
255
- type: Input
256
- }], withChildrenTemplate: [{
257
- type: ContentChild,
258
- args: ['daffTreeItemWithChildrenTpl', { static: true }]
259
- }], treeItemTemplate: [{
260
- type: ContentChild,
261
- args: ['daffTreeItemTpl', { static: true }]
262
- }] } });
270
+ ], template: "@for (node of flatTree(); track node.id) {\n\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t<ng-container\n\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate() : treeItemTemplate(); context: { $implicit: node }\">\n\t\t</ng-container>\n\t</li>\n}", styles: [".daff-tree{margin:0;padding:0;list-style:none;--tree-padding: 1rem}.daff-tree li.hidden{display:none}.daff-tree-item{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;position:relative;background:none;border:0;padding:.5rem 1rem .5rem 0;line-height:1.5rem;font-weight:400;text-align:left;text-decoration:none;width:100%;padding-left:calc(var(--tree-padding) * (var(--depth)))}.daff-tree-item:before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:.25rem}.daff-tree-item:focus,.daff-tree-item:focus-visible{z-index:1}.daff-tree-item.selected{font-weight:500}.daff-tree-item.parent{position:relative;padding-right:2.5rem}.daff-tree-item.parent:after{content:\"\";position:absolute;top:48%;right:1rem;display:inline-block;border-right:2px solid currentColor;border-bottom:2px solid currentColor;width:.5rem;height:.5rem;transform:translateY(-50%) rotate(45deg);transition:transform .15s}.daff-tree-item.parent.open:after{top:56%;transform:translateY(-50%) rotate(225deg)}\n"] }]
271
+ }], ctorParameters: () => [], propDecorators: { renderMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderMode", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], tree: [{ type: i0.Input, args: [{ isSignal: true, alias: "tree", required: false }] }], withChildrenTemplate: [{ type: i0.ContentChild, args: ['daffTreeItemWithChildrenTpl', { isSignal: true }] }], treeItemTemplate: [{ type: i0.ContentChild, args: ['daffTreeItemTpl', { isSignal: true }] }] } });
272
+
273
+ /**
274
+ * Walk up the tree from a leaf to the root applying the
275
+ * visit function at each node along the way.
276
+ */
277
+ const walkUp = (tree, visit) => {
278
+ while (tree.parent) {
279
+ visit(tree);
280
+ tree = tree.parent;
281
+ }
282
+ return tree;
283
+ };
284
+
285
+ /**
286
+ * Open all ancestor nodes of the given node so that it becomes visible in the tree.
287
+ */
288
+ const daffTreeOpenAncestors = (node) => {
289
+ walkUp(node, (ancestor) => {
290
+ ancestor.open = true;
291
+ return ancestor;
292
+ });
293
+ };
263
294
 
264
295
  /* eslint-disable quote-props */
265
296
  /**
@@ -283,49 +314,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
283
314
  *
284
315
  */
285
316
  class DaffTreeItemDirective {
286
- /**
287
- * The {@link DaffTreeFlatNode} associated with this specific tree item.
288
- */
289
- get node() {
290
- return this._node;
291
- }
292
- ;
293
- set node(val) {
294
- this._node = val;
295
- this.id = 'tree-' + this._node.id;
296
- this.depth = this._node.level;
297
- this.isParent = this._node.hasChildren;
298
- this.open = this._node._treeRef.open;
299
- if (this._node.hasChildren) {
300
- this.ariaExpanded = this._node._treeRef.open ? 'true' : 'false';
301
- }
302
- }
303
- constructor(document, treeNotifier) {
304
- this.document = document;
305
- this.treeNotifier = treeNotifier;
306
- this.isParent = false;
317
+ constructor() {
318
+ this.document = inject(DOCUMENT);
319
+ this.treeNotifier = inject(DaffTreeNotifierService);
307
320
  /**
308
- * Indicates whether or not the tree is `open`.
321
+ * The {@link DaffTreeFlatNode} associated with this specific tree item.
309
322
  */
310
- this.open = false;
323
+ this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : []));
311
324
  /**
312
325
  * Whether or not the tree item is the currently active item.
313
- * Note that there is no requirement there there only be one active item at a time.
326
+ * Note that there is no requirement that there only be one active item at a time.
327
+ *
328
+ * When a tree item becomes selected, all of its ancestor nodes
329
+ * will be automatically opened so that the selected item is visible.
330
+ */
331
+ this.selected = input(false, ...(ngDevMode ? [{ debugName: "selected" }] : []));
332
+ /**
333
+ * The html `id` of the tree item. This is derived from the {@link DaffTreeData}.
334
+ */
335
+ this.id = computed(() => 'tree-' + this.node().id, ...(ngDevMode ? [{ debugName: "id" }] : []));
336
+ /**
337
+ * A property indicating the depth of the tree.
314
338
  */
315
- this.selected = false;
339
+ this.depth = computed(() => this.node().level, ...(ngDevMode ? [{ debugName: "depth" }] : []));
340
+ /**
341
+ * Whether or not this node has children.
342
+ */
343
+ this.isParent = computed(() => this.node().hasChildren, ...(ngDevMode ? [{ debugName: "isParent" }] : []));
344
+ /**
345
+ * Indicates whether or not the tree is `open`.
346
+ */
347
+ this.open = computed(() => this.node()._treeRef.open, ...(ngDevMode ? [{ debugName: "open" }] : []));
348
+ /**
349
+ * Accessibility property, notifying users about whether
350
+ * or not the tree item is open.
351
+ */
352
+ this.ariaExpanded = computed(() => {
353
+ const node = this.node();
354
+ return node.hasChildren ? (node._treeRef.open ? 'true' : 'false') : undefined;
355
+ }, ...(ngDevMode ? [{ debugName: "ariaExpanded" }] : []));
356
+ effect(() => {
357
+ if (this.selected()) {
358
+ const node = untracked(this.node);
359
+ daffTreeOpenAncestors(node._treeRef);
360
+ this.treeNotifier.notify();
361
+ }
362
+ });
316
363
  }
317
364
  /**
318
365
  * @docs-private
319
366
  */
320
367
  onEscape() {
321
- this.toggleParent(this.node);
368
+ this.toggleParent(this.node());
322
369
  }
323
370
  /**
324
371
  * @docs-private
325
372
  */
326
373
  onClick() {
327
- if (this.node.hasChildren) {
328
- this.toggleTree(this.node);
374
+ if (this.node().hasChildren) {
375
+ this.toggleTree(this.node());
329
376
  }
330
377
  this.treeNotifier.notify();
331
378
  }
@@ -350,46 +397,39 @@ class DaffTreeItemDirective {
350
397
  node._treeRef.open = false;
351
398
  }
352
399
  }
353
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeItemDirective, deps: [{ token: DOCUMENT }, { token: DaffTreeNotifierService }], target: i0.ɵɵFactoryTarget.Directive }); }
354
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.1", type: DaffTreeItemDirective, isStandalone: true, selector: "[daffTreeItem]", inputs: { node: "node", selected: "selected" }, host: { listeners: { "keydown.escape": "onEscape()", "click": "onClick()" }, properties: { "class.selected": "selected", "class.parent": "isParent", "class.open": "open", "attr.id": "id", "attr.aria-expanded": "ariaExpanded", "style.--depth": "depth" }, classAttribute: "daff-tree-item" }, ngImport: i0 }); }
400
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
401
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.18", type: DaffTreeItemDirective, isStandalone: true, selector: "[daffTreeItem]", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown.escape": "onEscape()", "click": "onClick()" }, properties: { "class.selected": "selected()", "class.parent": "isParent()", "class.open": "open()", "attr.id": "id()", "attr.aria-expanded": "ariaExpanded()", "style.--depth": "depth()" }, classAttribute: "daff-tree-item" }, ngImport: i0 }); }
355
402
  }
356
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeItemDirective, decorators: [{
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeItemDirective, decorators: [{
357
404
  type: Directive,
358
405
  args: [{
359
406
  selector: '[daffTreeItem]',
360
407
  host: {
361
408
  'class': 'daff-tree-item',
362
- '[class.selected]': 'selected',
363
- '[class.parent]': 'isParent',
364
- '[class.open]': 'open',
365
- '[attr.id]': 'id',
366
- '[attr.aria-expanded]': 'ariaExpanded',
367
- '[style.--depth]': 'depth',
409
+ '[class.selected]': 'selected()',
410
+ '[class.parent]': 'isParent()',
411
+ '[class.open]': 'open()',
412
+ '[attr.id]': 'id()',
413
+ '[attr.aria-expanded]': 'ariaExpanded()',
414
+ '[style.--depth]': 'depth()',
368
415
  '(keydown.escape)': 'onEscape()',
369
416
  '(click)': 'onClick()',
370
417
  },
371
418
  }]
372
- }], ctorParameters: () => [{ type: undefined, decorators: [{
373
- type: Inject,
374
- args: [DOCUMENT]
375
- }] }, { type: DaffTreeNotifierService }], propDecorators: { node: [{
376
- type: Input
377
- }], selected: [{
378
- type: Input
379
- }] } });
419
+ }], ctorParameters: () => [], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }] } });
380
420
 
381
421
  /**
382
422
  * @deprecated in favor of {@link DAFF_TREE_COMPONENTS}. Deprecated in version 0.78.0. Will be removed in version 1.0.0.
383
423
  */
384
424
  class DaffTreeModule {
385
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
386
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeModule, imports: [CommonModule,
425
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
426
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeModule, imports: [CommonModule,
387
427
  DaffTreeComponent,
388
428
  DaffTreeItemDirective], exports: [DaffTreeComponent,
389
429
  DaffTreeItemDirective] }); }
390
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeModule, imports: [CommonModule] }); }
430
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeModule, imports: [CommonModule] }); }
391
431
  }
392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffTreeModule, decorators: [{
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffTreeModule, decorators: [{
393
433
  type: NgModule,
394
434
  args: [{
395
435
  imports: [
@@ -1 +1 @@
1
- {"version":3,"file":"daffodil-design-tree.mjs","sources":["../../../libs/design/tree/src/tree/tree-notifier.service.ts","../../../libs/design/tree/src/utils/flatten-tree.ts","../../../libs/design/tree/src/utils/traverse-tree.ts","../../../libs/design/tree/src/utils/hydrate-tree.ts","../../../libs/design/tree/src/tree/tree.component.ts","../../../libs/design/tree/src/tree/tree.component.html","../../../libs/design/tree/src/tree-item/tree-item.directive.ts","../../../libs/design/tree/src/tree.module.ts","../../../libs/design/tree/src/utils/transform.ts","../../../libs/design/tree/src/tree.ts","../../../libs/design/tree/src/daffodil-design-tree.ts"],"sourcesContent":["import {\n Inject,\n OnDestroy,\n} from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * This service is used by tree items to notify their parent\n * that the tree has to be recomputed.\n *\n * This service is a multiton associated with each tree instance.\n * It follows the same lifecycle as the tree it is associated with.\n */\n@Inject({})\nexport class DaffTreeNotifierService implements OnDestroy {\n\n /**\n * @docs-private\n */\n private _notice: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\n\n /**\n * An observable that emits when the tree needs to be re-computed.\n */\n notice$ = this._notice.asObservable();\n\n /**\n * `notify` can be called to trigger a re-computation of the tree\n * if data has changed unexpectedly and a re-render did not occur.\n *\n * This should be used sparingly. Instead, prefer updating `data` on the tree\n * itself for performance reasons.\n */\n notify() {\n this._notice.next(true);\n }\n\n /**\n * Cleanup when the tree is destroyed.\n *\n * @docs-private\n */\n ngOnDestroy(): void {\n this._notice.complete();\n }\n}\n","import { collect } from '@daffodil/core';\n\nimport { DaffTreeUi } from '../interfaces/tree-ui';\n\n/**\n * A flattened node of a tree. This is used when translating the tree data\n * structure into an array.\n */\nexport interface DaffTreeFlatNode {\n id: number | string;\n title: string;\n url: string;\n level: number;\n hasChildren: boolean;\n data: unknown;\n visible: boolean;\n _treeRef: DaffTreeUi<unknown>;\n}\n\n/**\n * Flatten a DaffTreeUi<unknown> into an array, removing elements from the array\n * below nodes in the tree that are not open.\n */\nexport const flattenTree = (daffUiTree: DaffTreeUi<unknown>, removeNodes: boolean = false): DaffTreeFlatNode[] => {\n const tree: DaffTreeFlatNode[] = [];\n if(!daffUiTree) {\n return [];\n }\n\n let items = [\n {\n ...daffUiTree,\n level: 0,\n data: undefined,\n open: true,\n _treeRef: daffUiTree,\n },\n ];\n\n\n while(items) {\n const el = items.pop();\n if(!el) {\n break;\n }\n\n items = [\n ...items,\n ...el.items.map((i) => ({\n ...i,\n level:\n el.level + 1,\n _treeRef: i,\n })).reverse(),\n ];\n\n const hasClosedAncestor = el._treeRef.parent\n ? collect(el._treeRef.parent, (node) => node.parent ? [node.parent] : [], el.level).reduce(\n (acc, parent) => acc || !parent.open,\n false,\n )\n : false;\n\n if(!removeNodes && el._treeRef.parent) {\n tree.push({\n id: el.id,\n title: el.title,\n level: el.level,\n url : el.url,\n visible: !hasClosedAncestor,\n hasChildren: el.items.length > 0,\n data: undefined,\n _treeRef: el._treeRef,\n });\n } else if(removeNodes && el._treeRef.parent?.open) {\n tree.push({\n id: el.id,\n title: el.title,\n level: el.level,\n url : el.url,\n visible: !hasClosedAncestor,\n hasChildren: el.items.length > 0,\n data: undefined,\n _treeRef: el._treeRef,\n });\n }\n }\n\n return tree;\n};\n","import { RecursiveTreeKeyOfType } from '../interfaces/recursive-key';\n\n/**\n * Traverse the tree, pre-order, right-to-left\n */\nexport const traverse = <T extends Record<any, any>, V extends Record<any, any> = T>(\n tree: T,\n visit: (tree: T) => V,\n key: RecursiveTreeKeyOfType<T>,\n): V => {\n let stack = [\n tree,\n ];\n\n while(stack) {\n const el = stack.pop();\n if(!el) {\n break;\n }\n\n visit(el);\n\n stack = [\n ...stack,\n ...<T[]><unknown>el[key],\n ];\n }\n\n return tree;\n};\n","import { traverse } from './traverse-tree';\nimport { DaffTreeData } from '../interfaces/tree-data';\nimport { DaffTreeUi } from '../interfaces/tree-ui';\n\nexport const daffDataTreeToUiTree = <T>(data: DaffTreeData<T>, parent: DaffTreeUi<T>, open: boolean = false): DaffTreeUi<T> => ({\n id: data.id ?? data.title,\n title: data.title,\n url: data.url,\n data: data.data,\n open,\n parent,\n items: [],\n});\n\n/**\n * This function translates the original data given to us by the client\n * to the internal representation of the tree used by the {@link DaffTreeComponent}\n */\nexport const hydrateTree = <T>(data: DaffTreeData<T>): DaffTreeUi<T> => {\n const tree = daffDataTreeToUiTree(data, undefined, true);\n\n let treeStack = [\n tree,\n ];\n\n traverse(data, (el) => {\n const treeEl = treeStack.pop();\n treeEl.items = el.items.map((i) => daffDataTreeToUiTree(i, treeEl, false));\n treeStack = [\n ...treeStack,\n ...treeEl.items,\n ];\n return el;\n }, 'items');\n\n return tree;\n};\n","/* eslint-disable quote-props */\nimport {\n NgFor,\n NgTemplateOutlet,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { DaffArticleEncapsulatedDirective } from '@daffodil/design';\n\nimport { DaffTreeNotifierService } from './tree-notifier.service';\nimport { DaffTreeData } from '../interfaces/tree-data';\nimport { DaffTreeRenderMode } from '../interfaces/tree-render-mode';\nimport { DaffTreeUi } from '../interfaces/tree-ui';\nimport {\n DaffTreeFlatNode,\n flattenTree,\n} from '../utils/flatten-tree';\nimport { hydrateTree } from '../utils/hydrate-tree';\n\n/**\n * The `DaffTreeComponent` allows you to render tree structures as interactable UI.\n *\n * @example Basic use of the tree component\n * ```html\n * <ul daff-tree [tree]=\"tree\">\n * <ng-template #daffTreeItemWithChildrenTpl let-node>\n * <button daffTreeItem [node]=\"node\">{{ node.title }} </button>\n * </ng-template>\n *\n * <ng-template #daffTreeItemTpl let-node>\n * <a daffTreeItem [node]=\"node\" [routerLink]=\"node.url\">{{ node.title }}</a>\n * </ng-template>\n * </ul>\n * ```\n *\n * where `tree` is a {@link DaffTreeData}.\n *\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'ul[daff-tree]',\n templateUrl: './tree.component.html',\n styleUrls: ['./tree.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n DaffTreeNotifierService,\n ],\n hostDirectives: [{\n directive: DaffArticleEncapsulatedDirective,\n }],\n host: {\n 'class': 'daff-tree',\n },\n imports: [\n NgFor,\n NgTemplateOutlet,\n ],\n})\nexport class DaffTreeComponent implements OnInit, OnChanges {\n /**\n * The rendering mode for nodes in the tree.\n *\n * Default value is `in-dom`, which means nodes are present in the DOM.\n *\n * Generally, `not-in-dom` is faster as there are less DOM elements to render,\n * but there may be use-cases (like SEO) where having the tree in the DOM\n * is relevant.\n */\n @Input() renderMode: DaffTreeRenderMode;\n\n /**\n * The internal tree element.\n */\n private _tree: DaffTreeUi<unknown> = undefined;\n\n /**\n * @docs-private\n *\n * The flattened tree data. For debugging purposes, you can iterate through this if you want to inspect\n * the resulting array structure we computed to render the tree.\n */\n public flatTree: DaffTreeFlatNode[] = [];\n\n /**\n * The tree data you would like to render.\n */\n @Input() tree: DaffTreeData<unknown>;\n\n /**\n * The template used to render tree-nodes that themselves have children.\n *\n * @docs-private\n */\n @ContentChild('daffTreeItemWithChildrenTpl', { static: true })\n withChildrenTemplate: TemplateRef<any>;\n\n /**\n * The template used to render tree-nodes that have no children.\n *\n * @docs-private\n */\n @ContentChild('daffTreeItemTpl', { static: true }) treeItemTemplate: TemplateRef<any>;\n\n /**\n * @docs-private\n */\n constructor(private notifier: DaffTreeNotifierService) {}\n\n /**\n * @docs-private\n */\n ngOnChanges(changes: SimpleChanges): void {\n if(!changes.tree.currentValue) {\n this._tree = undefined;\n this.flatTree = [];\n return;\n }\n\n if(changes.renderMode && !changes.tree) {\n this.flatTree = flattenTree(this._tree, changes.renderMode.currentValue === 'not-in-dom');\n } else if(changes.renderMode || changes.tree) {\n this._tree = hydrateTree(changes.tree?.currentValue ?? this.tree);\n this.flatTree = flattenTree(this._tree, (changes.renderMode?.currentValue ?? this.renderMode) === 'not-in-dom');\n }\n }\n\n /**\n * @docs-private\n *\n * The track-by function used to reduce tree-item re-renders\n */\n trackByTreeElement(index: number, el: any): any {\n return el.title;\n }\n\n /**\n * @docs-private\n */\n ngOnInit(): void {\n this.notifier.notice$.subscribe(() => {\n this.flatTree = flattenTree(this._tree, this.renderMode === 'not-in-dom');\n });\n }\n}\n","<ng-container *ngFor=\"let node of flatTree; trackBy: trackByTreeElement\">\n\t<ng-container>\n\t\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate : treeItemTemplate; context: { $implicit: node }\">\n\t\t\t</ng-container>\n\t\t</li>\n\t</ng-container>\n</ng-container>","/* eslint-disable quote-props */\n\nimport {\n Directive,\n Inject,\n Input,\n DOCUMENT,\n} from '@angular/core';\n\nimport { DaffTreeNotifierService } from '../tree/tree-notifier.service';\nimport { DaffTreeFlatNode } from '../utils/flatten-tree';\n\n/**\n * The `DaffTreeItemDirective` marks elements as tree child nodes that interact with the parent tree structure.\n *\n * @example Using a `[daffTreeItem]`\n *\n * `[tree]` is a {@link DaffTreeData} and `[daff-tree]` is a {@link DaffTreeComponent}.\n *\n * ```html\n * <ul daff-tree [tree]=\"tree\">\n * <ng-template #daffTreeItemWithChildrenTpl let-node>\n * <button daffTreeItem [node]=\"node\">{{ node.title }} </button>\n * </ng-template>\n *\n * <ng-template #daffTreeItemTpl let-node>\n * <a daffTreeItem [node]=\"node\" [routerLink]=\"node.url\">{{ node.title }}</a>\n * </ng-template>\n * </ul>\n * ```\n *\n */\n@Directive({\n selector: '[daffTreeItem]',\n host: {\n 'class': 'daff-tree-item',\n '[class.selected]': 'selected',\n '[class.parent]': 'isParent',\n '[class.open]': 'open',\n '[attr.id]': 'id',\n '[attr.aria-expanded]': 'ariaExpanded',\n '[style.--depth]': 'depth',\n '(keydown.escape)': 'onEscape()',\n '(click)': 'onClick()',\n },\n})\nexport class DaffTreeItemDirective {\n private isParent = false;\n\n /**\n * The html `id` of the tree item. This is derived from the {@link DaffTreeData}.\n *\n */\n private id: string;\n\n /**\n * Accessibility property, notifying users about whether\n * or not the tree item is open.\n */\n private ariaExpanded: string;\n\n /**\n * A property indicating the depth of the tree.\n */\n private depth: number;\n\n /**\n * Indicates whether or not the tree is `open`.\n */\n private open = false;\n\n /**\n * The {@link DaffTreeFlatNode} associated with this specific tree item.\n */\n private _node: DaffTreeFlatNode;\n\n /**\n * The {@link DaffTreeFlatNode} associated with this specific tree item.\n */\n @Input()\n get node() {\n return this._node;\n };\n set node(val: DaffTreeFlatNode) {\n this._node = val;\n this.id = 'tree-' + this._node.id;\n this.depth = this._node.level;\n this.isParent = this._node.hasChildren;\n this.open = this._node._treeRef.open;\n\n if(this._node.hasChildren) {\n this.ariaExpanded = this._node._treeRef.open ? 'true' : 'false';\n }\n }\n\n /**\n * Whether or not the tree item is the currently active item.\n * Note that there is no requirement there there only be one active item at a time.\n */\n @Input() selected = false;\n\n constructor(\n @Inject(DOCUMENT) private document: any,\n private treeNotifier: DaffTreeNotifierService,\n ) {}\n\n /**\n * @docs-private\n */\n onEscape() {\n this.toggleParent(this.node);\n }\n\n /**\n * @docs-private\n */\n onClick() {\n if(this.node.hasChildren) {\n this.toggleTree(this.node);\n }\n this.treeNotifier.notify();\n }\n\n /**\n * Toggle the open state of the tree's parent.\n */\n toggleParent(node: DaffTreeFlatNode) {\n if(node._treeRef?.parent.parent === undefined) {\n return;\n }\n node._treeRef.parent.open = !node._treeRef.parent.open;\n (<Document>this.document).getElementById('tree-' + node._treeRef.parent.id).focus();\n }\n\n /**\n * Toggle the open state of this specific subtree tree.\n */\n toggleTree(node: DaffTreeFlatNode) {\n if(node._treeRef.open === false) {\n node._treeRef.open = true;\n } else {\n node._treeRef.open = false;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { DaffTreeComponent } from './tree/tree.component';\nimport { DaffTreeItemDirective } from './tree-item/tree-item.directive';\n\n/**\n * @deprecated in favor of {@link DAFF_TREE_COMPONENTS}. Deprecated in version 0.78.0. Will be removed in version 1.0.0.\n */\n@NgModule({\n imports: [\n CommonModule,\n DaffTreeComponent,\n DaffTreeItemDirective,\n ],\n exports: [\n DaffTreeComponent,\n DaffTreeItemDirective,\n ],\n})\nexport class DaffTreeModule { }\n","import { RecursiveTreeKeyOfType } from '../interfaces/recursive-key';\nimport { DaffTreeData } from '../interfaces/tree-data';\n\n/**\n * Transform a tree-like structure into a {@link DaffTreeData}.\n *\n * @param tree - The data structure representing tree-like data.\n * @param transformFn - A user-supplied function that will transform the user\n * type into a {@link DaffTreeData}\n * @param key - The property of the your tree that indicates which\n * key contains the \"children\" of your tree structure.\n *\n */\nexport const daffTransformTree = <\n\n T extends Record<any,any>,\n V\n>(\n tree: T,\n transformFn: (type: T) => DaffTreeData<V>,\n key: RecursiveTreeKeyOfType<T>,\n): DaffTreeData<V> => {\n\n const transformedTree: DaffTreeData<V> = transformFn(tree);\n\n const queue: { node: T; parent: DaffTreeData<V> }[] = [{ node: tree, parent: transformedTree }];\n\n while (queue.length > 0) {\n const { node, parent } = queue.shift();\n\n const childItems = node[key];\n for (const child of <T[]>childItems) {\n const transformedChild: DaffTreeData<V> = transformFn(child);\n parent.items.push(transformedChild);\n queue.push({ node: child, parent: transformedChild });\n }\n }\n\n return transformedTree;\n};\n","import { DaffTreeComponent } from './tree/tree.component';\nimport { DaffTreeItemDirective } from './tree-item/tree-item.directive';\n\n/**\n * @docs-private\n */\nexport const DAFF_TREE_COMPONENTS = <const> [\n DaffTreeComponent,\n DaffTreeItemDirective,\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DaffTreeNotifierService"],"mappings":"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"}
1
+ {"version":3,"file":"daffodil-design-tree.mjs","sources":["../../../libs/design/tree/src/tree/tree-notifier.service.ts","../../../libs/design/tree/src/utils/flatten-tree.ts","../../../libs/design/tree/src/utils/traverse-tree.ts","../../../libs/design/tree/src/utils/hydrate-tree.ts","../../../libs/design/tree/src/tree/tree.component.ts","../../../libs/design/tree/src/tree/tree.component.html","../../../libs/design/tree/src/utils/walk-up.ts","../../../libs/design/tree/src/utils/open-ancestors.ts","../../../libs/design/tree/src/tree-item/tree-item.directive.ts","../../../libs/design/tree/src/tree.module.ts","../../../libs/design/tree/src/utils/transform.ts","../../../libs/design/tree/src/tree.ts","../../../libs/design/tree/src/daffodil-design-tree.ts"],"sourcesContent":["import {\n Inject,\n OnDestroy,\n} from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * This service is used by tree items to notify their parent\n * that the tree has to be recomputed.\n *\n * This service is a multiton associated with each tree instance.\n * It follows the same lifecycle as the tree it is associated with.\n */\n@Inject({})\nexport class DaffTreeNotifierService implements OnDestroy {\n\n /**\n * @docs-private\n */\n private _notice: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\n\n /**\n * An observable that emits when the tree needs to be re-computed.\n */\n notice$ = this._notice.asObservable();\n\n /**\n * `notify` can be called to trigger a re-computation of the tree\n * if data has changed unexpectedly and a re-render did not occur.\n *\n * This should be used sparingly. Instead, prefer updating `data` on the tree\n * itself for performance reasons.\n */\n notify() {\n this._notice.next(true);\n }\n\n /**\n * Cleanup when the tree is destroyed.\n *\n * @docs-private\n */\n ngOnDestroy(): void {\n this._notice.complete();\n }\n}\n","import { collect } from '@daffodil/core';\n\nimport { DaffTreeUi } from '../interfaces/tree-ui';\n\n/**\n * A flattened node of a tree. This is used when translating the tree data\n * structure into an array.\n */\nexport interface DaffTreeFlatNode {\n id: number | string;\n title: string;\n url: string;\n level: number;\n hasChildren: boolean;\n data: unknown;\n visible: boolean;\n _treeRef: DaffTreeUi<unknown>;\n}\n\n/**\n * Flatten a DaffTreeUi<unknown> into an array, removing elements from the array\n * below nodes in the tree that are not open.\n */\nexport const flattenTree = (daffUiTree: DaffTreeUi<unknown>, removeNodes: boolean = false): DaffTreeFlatNode[] => {\n const tree: DaffTreeFlatNode[] = [];\n if(!daffUiTree) {\n return [];\n }\n\n let items = [\n {\n ...daffUiTree,\n level: 0,\n data: undefined,\n open: true,\n _treeRef: daffUiTree,\n },\n ];\n\n\n while(items) {\n const el = items.pop();\n if(!el) {\n break;\n }\n\n items = [\n ...items,\n ...el.items.map((i) => ({\n ...i,\n level:\n el.level + 1,\n _treeRef: i,\n })).reverse(),\n ];\n\n const hasClosedAncestor = el._treeRef.parent\n ? collect(el._treeRef.parent, (node) => node.parent ? [node.parent] : [], el.level).reduce(\n (acc, parent) => acc || !parent.open,\n false,\n )\n : false;\n\n if(!removeNodes && el._treeRef.parent) {\n tree.push({\n id: el.id,\n title: el.title,\n level: el.level,\n url : el.url,\n visible: !hasClosedAncestor,\n hasChildren: el.items.length > 0,\n data: undefined,\n _treeRef: el._treeRef,\n });\n } else if(removeNodes && el._treeRef.parent?.open) {\n tree.push({\n id: el.id,\n title: el.title,\n level: el.level,\n url : el.url,\n visible: !hasClosedAncestor,\n hasChildren: el.items.length > 0,\n data: undefined,\n _treeRef: el._treeRef,\n });\n }\n }\n\n return tree;\n};\n","import { RecursiveTreeKeyOfType } from '../interfaces/recursive-key';\n\n/**\n * Traverse the tree, pre-order, right-to-left\n */\nexport const traverse = <T extends Record<any, any>, V extends Record<any, any> = T>(\n tree: T,\n visit: (tree: T) => V,\n key: RecursiveTreeKeyOfType<T>,\n): V => {\n let stack = [\n tree,\n ];\n\n while(stack) {\n const el = stack.pop();\n if(!el) {\n break;\n }\n\n visit(el);\n\n stack = [\n ...stack,\n ...<T[]><unknown>el[key],\n ];\n }\n\n return tree;\n};\n","import { traverse } from './traverse-tree';\nimport { DaffTreeData } from '../interfaces/tree-data';\nimport { DaffTreeUi } from '../interfaces/tree-ui';\n\nexport const daffDataTreeToUiTree = <T>(data: DaffTreeData<T>, parent: DaffTreeUi<T>, open: boolean = false): DaffTreeUi<T> => ({\n id: parent ? `${parent.id}.${data.id ?? data.title}` : (data.id ?? data.title),\n title: data.title,\n url: data.url,\n data: data.data,\n open,\n parent,\n items: [],\n});\n\n/**\n * This function translates the original data given to us by the client\n * to the internal representation of the tree used by the {@link DaffTreeComponent}\n */\nexport const hydrateTree = <T>(data: DaffTreeData<T>, treeId?: string): DaffTreeUi<T> => {\n const root: DaffTreeUi<T> = {\n id: treeId ?? (data.id ?? data.title),\n title: data.title,\n url: data.url,\n data: data.data,\n open: true,\n parent: undefined,\n items: [],\n };\n\n let treeStack = [\n root,\n ];\n\n traverse(data, (el) => {\n const treeEl = treeStack.pop();\n treeEl.items = el.items.map((i) => daffDataTreeToUiTree(i, treeEl, false));\n treeStack = [\n ...treeStack,\n ...treeEl.items,\n ];\n return el;\n }, 'items');\n\n return root;\n};\n","/* eslint-disable quote-props */\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { DaffArticleEncapsulatedDirective } from '@daffodil/design';\n\nimport { DaffTreeNotifierService } from './tree-notifier.service';\nimport { DaffTreeData } from '../interfaces/tree-data';\nimport { DaffTreeRenderMode } from '../interfaces/tree-render-mode';\nimport { flattenTree } from '../utils/flatten-tree';\nimport { hydrateTree } from '../utils/hydrate-tree';\n\nlet daffTreeId = 0;\n\n/**\n * The `DaffTreeComponent` allows you to render tree structures as interactable UI.\n *\n * @example Basic use of the tree component\n * ```html\n * <ul daff-tree [tree]=\"tree\">\n * <ng-template #daffTreeItemWithChildrenTpl let-node>\n * <button daffTreeItem [node]=\"node\">{{ node.title }} </button>\n * </ng-template>\n *\n * <ng-template #daffTreeItemTpl let-node>\n * <a daffTreeItem [node]=\"node\" [routerLink]=\"node.url\">{{ node.title }}</a>\n * </ng-template>\n * </ul>\n * ```\n *\n * where `tree` is a {@link DaffTreeData}.\n *\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'ul[daff-tree]',\n templateUrl: './tree.component.html',\n styleUrls: ['./tree.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n DaffTreeNotifierService,\n ],\n hostDirectives: [{\n directive: DaffArticleEncapsulatedDirective,\n }],\n host: {\n 'class': 'daff-tree',\n },\n imports: [\n NgTemplateOutlet,\n ],\n})\nexport class DaffTreeComponent {\n private notifier = inject(DaffTreeNotifierService);\n\n /**\n * The rendering mode for nodes in the tree.\n *\n * Default value is `in-dom`, which means nodes are present in the DOM.\n *\n * Generally, `not-in-dom` is faster as there are less DOM elements to render,\n * but there may be use-cases (like SEO) where having the tree in the DOM\n * is relevant.\n */\n readonly renderMode = input<DaffTreeRenderMode>();\n\n /**\n * A unique identifier for the tree instance.\n * Used as a prefix for all node IDs in the tree.\n * If not provided, an auto-incrementing number is used.\n */\n readonly id = input<string>(`${daffTreeId++}`);\n\n /**\n * The tree data you would like to render.\n */\n readonly tree = input<DaffTreeData<unknown>>();\n\n /**\n * The internal tree element.\n */\n private _tree = computed(() => {\n const tree = this.tree();\n return tree ? hydrateTree(tree, this.id()) : undefined;\n });\n\n /**\n * A revision counter incremented by notifications from tree items.\n * Used to trigger re-flattening when tree item state changes.\n */\n readonly _revision = signal(0);\n\n /**\n * @docs-private\n *\n * The flattened tree data. For debugging purposes, you can iterate through this if you want to inspect\n * the resulting array structure we computed to render the tree.\n */\n readonly flatTree = computed(() => {\n this._revision();\n const tree = this._tree();\n return tree ? flattenTree(tree, this.renderMode() === 'not-in-dom') : [];\n });\n\n /**\n * The template used to render tree-nodes that themselves have children.\n *\n * @docs-private\n */\n readonly withChildrenTemplate = contentChild<TemplateRef<any>>('daffTreeItemWithChildrenTpl');\n\n /**\n * The template used to render tree-nodes that have no children.\n *\n * @docs-private\n */\n readonly treeItemTemplate = contentChild<TemplateRef<any>>('daffTreeItemTpl');\n\n constructor() {\n this.notifier.notice$.subscribe(() => {\n this._revision.update((r) => r + 1);\n });\n }\n}\n","@for (node of flatTree(); track node.id) {\n\t<li [attr.aria-level]=\"node.level\" [class.hidden]=\"!node.visible\">\n\t\t<ng-container\n\t\t\t*ngTemplateOutlet=\"node.hasChildren ? withChildrenTemplate() : treeItemTemplate(); context: { $implicit: node }\">\n\t\t</ng-container>\n\t</li>\n}","import { DaffTreeUi } from '../interfaces/tree-ui';\n\n/**\n * Walk up the tree from a leaf to the root applying the\n * visit function at each node along the way.\n */\nexport const walkUp = <T>(\n tree: DaffTreeUi<T>,\n visit: (tree: DaffTreeUi<T>) => DaffTreeUi<T>,\n): DaffTreeUi<T> => {\n while(tree.parent) {\n visit(tree);\n tree = tree.parent;\n }\n\n return tree;\n};\n","import { walkUp } from './walk-up';\nimport { DaffTreeUi } from '../interfaces/tree-ui';\n\n/**\n * Open all ancestor nodes of the given node so that it becomes visible in the tree.\n */\nexport const daffTreeOpenAncestors = <T>(node: DaffTreeUi<T>): void => {\n walkUp(node, (ancestor) => {\n ancestor.open = true;\n return ancestor;\n });\n};\n","/* eslint-disable quote-props */\n\nimport { DOCUMENT } from '@angular/common';\nimport {\n computed,\n Directive,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\n\nimport { DaffTreeNotifierService } from '../tree/tree-notifier.service';\nimport { DaffTreeFlatNode } from '../utils/flatten-tree';\nimport { daffTreeOpenAncestors } from '../utils/open-ancestors';\n\n/**\n * The `DaffTreeItemDirective` marks elements as tree child nodes that interact with the parent tree structure.\n *\n * @example Using a `[daffTreeItem]`\n *\n * `[tree]` is a {@link DaffTreeData} and `[daff-tree]` is a {@link DaffTreeComponent}.\n *\n * ```html\n * <ul daff-tree [tree]=\"tree\">\n * <ng-template #daffTreeItemWithChildrenTpl let-node>\n * <button daffTreeItem [node]=\"node\">{{ node.title }} </button>\n * </ng-template>\n *\n * <ng-template #daffTreeItemTpl let-node>\n * <a daffTreeItem [node]=\"node\" [routerLink]=\"node.url\">{{ node.title }}</a>\n * </ng-template>\n * </ul>\n * ```\n *\n */\n@Directive({\n selector: '[daffTreeItem]',\n host: {\n 'class': 'daff-tree-item',\n '[class.selected]': 'selected()',\n '[class.parent]': 'isParent()',\n '[class.open]': 'open()',\n '[attr.id]': 'id()',\n '[attr.aria-expanded]': 'ariaExpanded()',\n '[style.--depth]': 'depth()',\n '(keydown.escape)': 'onEscape()',\n '(click)': 'onClick()',\n },\n})\nexport class DaffTreeItemDirective {\n private document = inject(DOCUMENT);\n private treeNotifier = inject(DaffTreeNotifierService);\n\n /**\n * The {@link DaffTreeFlatNode} associated with this specific tree item.\n */\n readonly node = input.required<DaffTreeFlatNode>();\n\n /**\n * Whether or not the tree item is the currently active item.\n * Note that there is no requirement that there only be one active item at a time.\n *\n * When a tree item becomes selected, all of its ancestor nodes\n * will be automatically opened so that the selected item is visible.\n */\n readonly selected = input(false);\n\n /**\n * The html `id` of the tree item. This is derived from the {@link DaffTreeData}.\n */\n protected readonly id = computed(() => 'tree-' + this.node().id);\n\n /**\n * A property indicating the depth of the tree.\n */\n protected readonly depth = computed(() => this.node().level);\n\n /**\n * Whether or not this node has children.\n */\n protected readonly isParent = computed(() => this.node().hasChildren);\n\n /**\n * Indicates whether or not the tree is `open`.\n */\n protected readonly open = computed(() => this.node()._treeRef.open);\n\n /**\n * Accessibility property, notifying users about whether\n * or not the tree item is open.\n */\n protected readonly ariaExpanded = computed(() => {\n const node = this.node();\n return node.hasChildren ? (node._treeRef.open ? 'true' : 'false') : undefined;\n });\n\n constructor() {\n effect(() => {\n if(this.selected()) {\n const node = untracked(this.node);\n daffTreeOpenAncestors(node._treeRef);\n this.treeNotifier.notify();\n }\n });\n }\n\n /**\n * @docs-private\n */\n onEscape() {\n this.toggleParent(this.node());\n }\n\n /**\n * @docs-private\n */\n onClick() {\n if(this.node().hasChildren) {\n this.toggleTree(this.node());\n }\n this.treeNotifier.notify();\n }\n\n /**\n * Toggle the open state of the tree's parent.\n */\n toggleParent(node: DaffTreeFlatNode) {\n if(node._treeRef?.parent.parent === undefined) {\n return;\n }\n node._treeRef.parent.open = !node._treeRef.parent.open;\n (<Document>this.document).getElementById('tree-' + node._treeRef.parent.id).focus();\n }\n\n /**\n * Toggle the open state of this specific subtree tree.\n */\n toggleTree(node: DaffTreeFlatNode) {\n if(node._treeRef.open === false) {\n node._treeRef.open = true;\n } else {\n node._treeRef.open = false;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { DaffTreeComponent } from './tree/tree.component';\nimport { DaffTreeItemDirective } from './tree-item/tree-item.directive';\n\n/**\n * @deprecated in favor of {@link DAFF_TREE_COMPONENTS}. Deprecated in version 0.78.0. Will be removed in version 1.0.0.\n */\n@NgModule({\n imports: [\n CommonModule,\n DaffTreeComponent,\n DaffTreeItemDirective,\n ],\n exports: [\n DaffTreeComponent,\n DaffTreeItemDirective,\n ],\n})\nexport class DaffTreeModule { }\n","import { RecursiveTreeKeyOfType } from '../interfaces/recursive-key';\nimport { DaffTreeData } from '../interfaces/tree-data';\n\n/**\n * Transform a tree-like structure into a {@link DaffTreeData}.\n *\n * @param tree - The data structure representing tree-like data.\n * @param transformFn - A user-supplied function that will transform the user\n * type into a {@link DaffTreeData}\n * @param key - The property of the your tree that indicates which\n * key contains the \"children\" of your tree structure.\n *\n */\nexport const daffTransformTree = <\n\n T extends Record<any,any>,\n V\n>(\n tree: T,\n transformFn: (type: T) => DaffTreeData<V>,\n key: RecursiveTreeKeyOfType<T>,\n): DaffTreeData<V> => {\n\n const transformedTree: DaffTreeData<V> = transformFn(tree);\n\n const queue: { node: T; parent: DaffTreeData<V> }[] = [{ node: tree, parent: transformedTree }];\n\n while (queue.length > 0) {\n const { node, parent } = queue.shift();\n\n const childItems = node[key];\n for (const child of <T[]>childItems) {\n const transformedChild: DaffTreeData<V> = transformFn(child);\n parent.items.push(transformedChild);\n queue.push({ node: child, parent: transformedChild });\n }\n }\n\n return transformedTree;\n};\n","import { DaffTreeComponent } from './tree/tree.component';\nimport { DaffTreeItemDirective } from './tree-item/tree-item.directive';\n\n/**\n * @docs-private\n */\nexport const DAFF_TREE_COMPONENTS = <const> [\n DaffTreeComponent,\n DaffTreeItemDirective,\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -55,10 +55,10 @@ class DaffYoutubePlayerComponent {
55
55
  get maxWidth() {
56
56
  return this.width + 'px';
57
57
  }
58
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffYoutubePlayerComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
59
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: DaffYoutubePlayerComponent, isStandalone: true, selector: "daff-youtube-player", inputs: { src: "src", title: "title", width: "width", height: "height" }, host: { properties: { "style.max-width": "this.maxWidth" } }, ngImport: i0, template: "@if (src) {\n <iframe class=\"daff-youtube-player\"\n [style.aspectRatio]=\"_aspectRatio\"\n [src]=\"src\"\n [title]=\"title\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n}", styles: [":host{display:block;border-radius:inherit;position:relative;width:100%}:host .daff-youtube-player{display:block;object-fit:cover;max-width:100%;max-height:100%;width:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
58
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffYoutubePlayerComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
59
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: DaffYoutubePlayerComponent, isStandalone: true, selector: "daff-youtube-player", inputs: { src: "src", title: "title", width: "width", height: "height" }, host: { properties: { "style.max-width": "this.maxWidth" } }, ngImport: i0, template: "@if (src) {\n <iframe class=\"daff-youtube-player\"\n [style.aspectRatio]=\"_aspectRatio\"\n [src]=\"src\"\n [title]=\"title\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n}", styles: [":host{display:block;border-radius:inherit;position:relative;width:100%}:host .daff-youtube-player{display:block;object-fit:cover;max-width:100%;max-height:100%;width:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
60
60
  }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffYoutubePlayerComponent, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffYoutubePlayerComponent, decorators: [{
62
62
  type: Component,
63
63
  args: [{ selector: 'daff-youtube-player', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (src) {\n <iframe class=\"daff-youtube-player\"\n [style.aspectRatio]=\"_aspectRatio\"\n [src]=\"src\"\n [title]=\"title\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n}", styles: [":host{display:block;border-radius:inherit;position:relative;width:100%}:host .daff-youtube-player{display:block;object-fit:cover;max-width:100%;max-height:100%;width:100%}\n"] }]
64
64
  }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { src: [{
@@ -81,10 +81,10 @@ class DaffYoutubeSafePipe {
81
81
  transform(url) {
82
82
  return this.domSanitizer.bypassSecurityTrustResourceUrl(url);
83
83
  }
84
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffYoutubeSafePipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); }
85
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.1", ngImport: i0, type: DaffYoutubeSafePipe, isStandalone: true, name: "daffYoutubeSafe" }); }
84
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffYoutubeSafePipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe }); }
85
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: DaffYoutubeSafePipe, isStandalone: true, name: "daffYoutubeSafe" }); }
86
86
  }
87
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DaffYoutubeSafePipe, decorators: [{
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DaffYoutubeSafePipe, decorators: [{
88
88
  type: Pipe,
89
89
  args: [{
90
90
  name: 'daffYoutubeSafe',
@@ -1 +1 @@
1
- {"version":3,"file":"daffodil-design-youtube-player.mjs","sources":["../../../libs/design/youtube-player/src/youtube-player.component.ts","../../../libs/design/youtube-player/src/youtube-player.component.html","../../../libs/design/youtube-player/src/safe-url.pipe.ts","../../../libs/design/youtube-player/src/youtube-player.ts","../../../libs/design/youtube-player/src/daffodil-design-youtube-player.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\n\nconst validateProperty = (object: Record<string, any>, prop: string) => {\n if (object[prop] === null || object[prop] === undefined || object[prop] === '') {\n throw new Error(`DaffYoutubePlayerComponent must have a defined ${prop} attribute.`);\n }\n};\n\nconst validateProperties = (object: Record<string, any>, props: string[]) => {\n const invalidProps = props.filter(prop => {\n try {\n validateProperty(object, prop);\n } catch(e) {\n return true;\n }\n return false;\n });\n\n if (invalidProps.length) {\n throw new Error(`DaffYoutubePlayerComponent must have the ${invalidProps.join(',')} attributes defined.`);\n }\n};\n\n@Component({\n selector: 'daff-youtube-player',\n templateUrl: './youtube-player.component.html',\n styleUrl: './youtube-player.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DaffYoutubePlayerComponent implements OnInit {\n @Input() src: SafeUrl;\n @Input() title = '';\n\n private _width: number;\n\n @Input()\n get width(): number {\n return this._width;\n }\n set width(value: number) {\n this._width = value;\n validateProperty(this, 'width');\n }\n\n private _height: number;\n\n @Input()\n get height(): number {\n return this._height;\n }\n set height(value: number) {\n this._height = value;\n validateProperty(this, 'height');\n }\n\n constructor(private sanitizer: DomSanitizer) {}\n\n /**\n * @docs-private\n */\n ngOnInit(): void {\n validateProperties(this, ['width', 'height']);\n }\n\n get _aspectRatio(): SafeStyle {\n return this.sanitizer.bypassSecurityTrustStyle(this.width + ' / ' + this.height);\n }\n\n /**\n * @docs-private\n */\n @HostBinding('style.max-width') get maxWidth(): string {\n return this.width + 'px';\n }\n}\n","@if (src) {\n <iframe class=\"daff-youtube-player\"\n [style.aspectRatio]=\"_aspectRatio\"\n [src]=\"src\"\n [title]=\"title\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n}","import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeUrl,\n} from '@angular/platform-browser';\n\n@Pipe({\n name: 'daffYoutubeSafe',\n})\nexport class DaffYoutubeSafePipe implements PipeTransform {\n constructor(private domSanitizer: DomSanitizer) {}\n transform(url: string): SafeUrl {\n return this.domSanitizer.bypassSecurityTrustResourceUrl(url);\n }\n}\n","import { DaffYoutubeSafePipe } from './safe-url.pipe';\nimport { DaffYoutubePlayerComponent } from './youtube-player.component';\n\n/**\n * @docs-private\n */\nexport const DAFF_YOUTUBE_PLAYER_COMPONENTS = <const> [\n DaffYoutubePlayerComponent,\n DaffYoutubeSafePipe,\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daffodil-design-youtube-player.mjs","sources":["../../../libs/design/youtube-player/src/youtube-player.component.ts","../../../libs/design/youtube-player/src/youtube-player.component.html","../../../libs/design/youtube-player/src/safe-url.pipe.ts","../../../libs/design/youtube-player/src/youtube-player.ts","../../../libs/design/youtube-player/src/daffodil-design-youtube-player.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\n\nconst validateProperty = (object: Record<string, any>, prop: string) => {\n if (object[prop] === null || object[prop] === undefined || object[prop] === '') {\n throw new Error(`DaffYoutubePlayerComponent must have a defined ${prop} attribute.`);\n }\n};\n\nconst validateProperties = (object: Record<string, any>, props: string[]) => {\n const invalidProps = props.filter(prop => {\n try {\n validateProperty(object, prop);\n } catch(e) {\n return true;\n }\n return false;\n });\n\n if (invalidProps.length) {\n throw new Error(`DaffYoutubePlayerComponent must have the ${invalidProps.join(',')} attributes defined.`);\n }\n};\n\n@Component({\n selector: 'daff-youtube-player',\n templateUrl: './youtube-player.component.html',\n styleUrl: './youtube-player.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DaffYoutubePlayerComponent implements OnInit {\n @Input() src: SafeUrl;\n @Input() title = '';\n\n private _width: number;\n\n @Input()\n get width(): number {\n return this._width;\n }\n set width(value: number) {\n this._width = value;\n validateProperty(this, 'width');\n }\n\n private _height: number;\n\n @Input()\n get height(): number {\n return this._height;\n }\n set height(value: number) {\n this._height = value;\n validateProperty(this, 'height');\n }\n\n constructor(private sanitizer: DomSanitizer) {}\n\n /**\n * @docs-private\n */\n ngOnInit(): void {\n validateProperties(this, ['width', 'height']);\n }\n\n get _aspectRatio(): SafeStyle {\n return this.sanitizer.bypassSecurityTrustStyle(this.width + ' / ' + this.height);\n }\n\n /**\n * @docs-private\n */\n @HostBinding('style.max-width') get maxWidth(): string {\n return this.width + 'px';\n }\n}\n","@if (src) {\n <iframe class=\"daff-youtube-player\"\n [style.aspectRatio]=\"_aspectRatio\"\n [src]=\"src\"\n [title]=\"title\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n}","import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeUrl,\n} from '@angular/platform-browser';\n\n@Pipe({\n name: 'daffYoutubeSafe',\n})\nexport class DaffYoutubeSafePipe implements PipeTransform {\n constructor(private domSanitizer: DomSanitizer) {}\n transform(url: string): SafeUrl {\n return this.domSanitizer.bypassSecurityTrustResourceUrl(url);\n }\n}\n","import { DaffYoutubeSafePipe } from './safe-url.pipe';\nimport { DaffYoutubePlayerComponent } from './youtube-player.component';\n\n/**\n * @docs-private\n */\nexport const DAFF_YOUTUBE_PLAYER_COMPONENTS = <const> [\n DaffYoutubePlayerComponent,\n DaffYoutubeSafePipe,\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}