@design-factory/angular 21.1.0-next.1 → 22.0.0-next.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 (331) hide show
  1. package/.ai/docs/components/accordion/accessibility.md +45 -0
  2. package/.ai/docs/components/accordion/api.md +279 -0
  3. package/.ai/docs/components/accordion/developer.md +43 -0
  4. package/.ai/docs/components/accordion/guidelines.md +99 -0
  5. package/.ai/docs/components/accordion/overview.md +17 -0
  6. package/.ai/docs/components/alert/accessibility.md +24 -0
  7. package/.ai/docs/components/alert/api.md +65 -0
  8. package/.ai/docs/components/alert/developer.md +63 -0
  9. package/.ai/docs/components/alert/guidelines.md +62 -0
  10. package/.ai/docs/components/alert/overview.md +12 -0
  11. package/.ai/docs/components/button/accessibility.md +25 -0
  12. package/.ai/docs/components/button/api.md +71 -0
  13. package/.ai/docs/components/button/developer.md +52 -0
  14. package/.ai/docs/components/button/guidelines.md +75 -0
  15. package/.ai/docs/components/button/overview.md +15 -0
  16. package/.ai/docs/components/buttongroup/api.md +16 -0
  17. package/.ai/docs/components/buttongroup/developer.md +32 -0
  18. package/.ai/docs/components/drawer/accessibility.md +15 -0
  19. package/.ai/docs/components/drawer/api.md +56 -0
  20. package/.ai/docs/components/drawer/developer.md +36 -0
  21. package/.ai/docs/components/drawer/examples.md +9 -0
  22. package/.ai/docs/components/drawer/guidelines.md +58 -0
  23. package/.ai/docs/components/drawer/overview.md +19 -0
  24. package/.ai/docs/components/dropdown/accessibility.md +27 -0
  25. package/.ai/docs/components/dropdown/api.md +85 -0
  26. package/.ai/docs/components/dropdown/developer.md +59 -0
  27. package/.ai/docs/components/dropdown/guidelines.md +80 -0
  28. package/.ai/docs/components/dropdown/overview.md +16 -0
  29. package/.ai/docs/components/sidenav/accessibility.md +48 -0
  30. package/.ai/docs/components/sidenav/api.md +110 -0
  31. package/.ai/docs/components/sidenav/developer.md +14 -0
  32. package/.ai/docs/components/sidenav/guidelines.md +83 -0
  33. package/.ai/docs/components/sidenav/overview.md +16 -0
  34. package/.ai/docs/components/tooltip/accessibility.md +11 -0
  35. package/.ai/docs/components/tooltip/api.md +39 -0
  36. package/.ai/docs/components/tooltip/developer.md +16 -0
  37. package/.ai/docs/components/tooltip/guidelines.md +84 -0
  38. package/.ai/docs/components/tooltip/overview.md +23 -0
  39. package/.ai/docs/components/topnav/accessibility.md +51 -0
  40. package/.ai/docs/components/topnav/api.md +190 -0
  41. package/.ai/docs/components/topnav/developer.md +43 -0
  42. package/.ai/docs/components/topnav/guidelines.md +121 -0
  43. package/.ai/docs/components/topnav/overview.md +17 -0
  44. package/.ai/docs/demos/accordion/addons-subtitle/accordion-addons-subtitle.html +75 -0
  45. package/.ai/docs/demos/accordion/addons-subtitle/accordion-addons-subtitle.ts +27 -0
  46. package/.ai/docs/demos/accordion/basic/accordion-basic.html +16 -0
  47. package/.ai/docs/demos/accordion/basic/accordion-basic.ts +14 -0
  48. package/.ai/docs/demos/accordion/close-others/accordion-close-others.html +16 -0
  49. package/.ai/docs/demos/accordion/close-others/accordion-close-others.ts +14 -0
  50. package/.ai/docs/demos/accordion/interactive/accordion-interactive.html +84 -0
  51. package/.ai/docs/demos/accordion/interactive/accordion-interactive.ts +30 -0
  52. package/.ai/docs/demos/accordion/interactive-addons-subtitle/accordion-interactive-addons-subtitle.html +126 -0
  53. package/.ai/docs/demos/accordion/interactive-addons-subtitle/accordion-interactive-addons-subtitle.ts +33 -0
  54. package/.ai/docs/demos/accordion/programmatic-control/accordion-programmatic-control.html +36 -0
  55. package/.ai/docs/demos/accordion/programmatic-control/accordion-programmatic-control.ts +15 -0
  56. package/.ai/docs/demos/accordion/selectable/accordion-selectable.html +16 -0
  57. package/.ai/docs/demos/accordion/selectable/accordion-selectable.ts +14 -0
  58. package/.ai/docs/demos/accordion/selectable-extended/accordion-selectable-extended.html +28 -0
  59. package/.ai/docs/demos/accordion/selectable-extended/accordion-selectable-extended.ts +80 -0
  60. package/.ai/docs/demos/accordion/separator/accordion-separator.html +16 -0
  61. package/.ai/docs/demos/accordion/separator/accordion-separator.ts +14 -0
  62. package/.ai/docs/demos/alert/banner/alert-banner.html +15 -0
  63. package/.ai/docs/demos/alert/banner/alert-banner.ts +16 -0
  64. package/.ai/docs/demos/alert/basic/alert-basic.html +6 -0
  65. package/.ai/docs/demos/alert/basic/alert-basic.ts +9 -0
  66. package/.ai/docs/demos/alert/card/alert-card.html +15 -0
  67. package/.ai/docs/demos/alert/card/alert-card.ts +9 -0
  68. package/.ai/docs/demos/alert/dismissal/alert-dismissal.html +5 -0
  69. package/.ai/docs/demos/alert/dismissal/alert-dismissal.ts +27 -0
  70. package/.ai/docs/demos/alert/expandable/alert-expandable.html +9 -0
  71. package/.ai/docs/demos/alert/expandable/alert-expandable.ts +11 -0
  72. package/.ai/docs/demos/button/basic/button-basic.html +4 -0
  73. package/.ai/docs/demos/button/basic/button-basic.ts +9 -0
  74. package/.ai/docs/demos/button/disabled/button-disabled.html +18 -0
  75. package/.ai/docs/demos/button/disabled/button-disabled.ts +12 -0
  76. package/.ai/docs/demos/button/icons/button-icons.html +17 -0
  77. package/.ai/docs/demos/button/icons/button-icons.ts +10 -0
  78. package/.ai/docs/demos/button/surfaces/button-surfaces.html +13 -0
  79. package/.ai/docs/demos/button/surfaces/button-surfaces.ts +9 -0
  80. package/.ai/docs/demos/button/variants/button-variants.html +49 -0
  81. package/.ai/docs/demos/button/variants/button-variants.ts +9 -0
  82. package/.ai/docs/demos/buttongroup/basic/buttongroup-basic.html +6 -0
  83. package/.ai/docs/demos/buttongroup/basic/buttongroup-basic.ts +10 -0
  84. package/.ai/docs/demos/buttongroup/disabled/buttongroup-disabled.html +6 -0
  85. package/.ai/docs/demos/buttongroup/disabled/buttongroup-disabled.ts +10 -0
  86. package/.ai/docs/demos/buttongroup/mirror/buttongroup-mirror.html +8 -0
  87. package/.ai/docs/demos/buttongroup/mirror/buttongroup-mirror.ts +10 -0
  88. package/.ai/docs/demos/buttongroup/orientation/buttongroup-orientation.html +19 -0
  89. package/.ai/docs/demos/buttongroup/orientation/buttongroup-orientation.ts +10 -0
  90. package/.ai/docs/demos/buttongroup/sizing/buttongroup-sizing.html +19 -0
  91. package/.ai/docs/demos/buttongroup/sizing/buttongroup-sizing.ts +10 -0
  92. package/.ai/docs/demos/drawer/inline/drawer-inline-basic.html +46 -0
  93. package/.ai/docs/demos/drawer/inline/drawer-inline-basic.ts +33 -0
  94. package/.ai/docs/demos/drawer/overlay/drawer-overlay-basic.html +30 -0
  95. package/.ai/docs/demos/drawer/overlay/drawer-overlay-basic.ts +25 -0
  96. package/.ai/docs/demos/dropdown/basic/dropdown-basic.html +8 -0
  97. package/.ai/docs/demos/dropdown/basic/dropdown-basic.ts +15 -0
  98. package/.ai/docs/demos/dropdown/sizes/dropdown-sizes.html +9 -0
  99. package/.ai/docs/demos/dropdown/sizes/dropdown-sizes.ts +21 -0
  100. package/.ai/docs/demos/dropdown/split/dropdown-split.html +9 -0
  101. package/.ai/docs/demos/dropdown/split/dropdown-split.ts +11 -0
  102. package/.ai/docs/demos/dropdown/toggle/dropdown-toggle.html +22 -0
  103. package/.ai/docs/demos/dropdown/toggle/dropdown-toggle.ts +10 -0
  104. package/.ai/docs/demos/sidenav/sidenav-basic-no-icon/routes.ts +95 -0
  105. package/.ai/docs/demos/sidenav/sidenav-basic-no-icon/sidenav-basic-no-icon.html +42 -0
  106. package/.ai/docs/demos/sidenav/sidenav-basic-no-icon/sidenav-basic-no-icon.ts +12 -0
  107. package/.ai/docs/demos/sidenav/sidenav-basic-with-icon/routes.ts +41 -0
  108. package/.ai/docs/demos/sidenav/sidenav-basic-with-icon/sidenav-basic-with-icon.html +34 -0
  109. package/.ai/docs/demos/sidenav/sidenav-basic-with-icon/sidenav-basic-with-icon.ts +12 -0
  110. package/.ai/docs/demos/tooltip/basic/tooltip-basic.html +1 -0
  111. package/.ai/docs/demos/tooltip/basic/tooltip-basic.ts +10 -0
  112. package/.ai/docs/demos/tooltip/placements/tooltip-placements.html +35 -0
  113. package/.ai/docs/demos/tooltip/placements/tooltip-placements.ts +12 -0
  114. package/.ai/docs/demos/tooltip/sizes/tooltip-sizes.html +5 -0
  115. package/.ai/docs/demos/tooltip/sizes/tooltip-sizes.ts +10 -0
  116. package/.ai/docs/demos/topnav/brand/topnav-brand.ts +64 -0
  117. package/.ai/docs/demos/topnav/environment-banner/topnav-environment-banner.ts +20 -0
  118. package/.ai/docs/demos/topnav/navigation/routes.ts +35 -0
  119. package/.ai/docs/demos/topnav/navigation/topnav-navigation-flat.ts +67 -0
  120. package/.ai/docs/demos/topnav/navigation/topnav-navigation-tree.ts +82 -0
  121. package/.ai/docs/demos/topnav/quick-actions/notifications.ts +75 -0
  122. package/.ai/docs/demos/topnav/quick-actions/topnav-quick-actions.ts +108 -0
  123. package/.ai/docs/demos/topnav/quick-actions/user-account.ts +23 -0
  124. package/.ai/index.md +26 -0
  125. package/fesm2022/design-factory-angular-accordion.mjs +1153 -0
  126. package/fesm2022/design-factory-angular-accordion.mjs.map +1 -0
  127. package/fesm2022/design-factory-angular-alert.mjs +312 -0
  128. package/fesm2022/design-factory-angular-alert.mjs.map +1 -0
  129. package/fesm2022/design-factory-angular-breakpoints.mjs +53 -0
  130. package/fesm2022/design-factory-angular-breakpoints.mjs.map +1 -0
  131. package/fesm2022/design-factory-angular-button.mjs +240 -0
  132. package/fesm2022/design-factory-angular-button.mjs.map +1 -0
  133. package/fesm2022/design-factory-angular-buttongroup.mjs +75 -0
  134. package/fesm2022/design-factory-angular-buttongroup.mjs.map +1 -0
  135. package/fesm2022/design-factory-angular-drawer.mjs +76 -81
  136. package/fesm2022/design-factory-angular-drawer.mjs.map +1 -1
  137. package/fesm2022/design-factory-angular-dropdown.mjs +323 -0
  138. package/fesm2022/design-factory-angular-dropdown.mjs.map +1 -0
  139. package/fesm2022/design-factory-angular-form-field.mjs +287 -0
  140. package/fesm2022/design-factory-angular-form-field.mjs.map +1 -0
  141. package/fesm2022/design-factory-angular-icon.mjs +24 -0
  142. package/fesm2022/design-factory-angular-icon.mjs.map +1 -0
  143. package/fesm2022/design-factory-angular-input.mjs +34 -0
  144. package/fesm2022/design-factory-angular-input.mjs.map +1 -0
  145. package/fesm2022/design-factory-angular-internals.mjs +119 -39
  146. package/fesm2022/design-factory-angular-internals.mjs.map +1 -1
  147. package/fesm2022/design-factory-angular-separator.mjs +43 -0
  148. package/fesm2022/design-factory-angular-separator.mjs.map +1 -0
  149. package/fesm2022/design-factory-angular-sidenav.mjs +766 -438
  150. package/fesm2022/design-factory-angular-sidenav.mjs.map +1 -1
  151. package/fesm2022/design-factory-angular-slider.mjs +451 -0
  152. package/fesm2022/design-factory-angular-slider.mjs.map +1 -0
  153. package/fesm2022/design-factory-angular-theme.mjs +30 -20
  154. package/fesm2022/design-factory-angular-theme.mjs.map +1 -1
  155. package/fesm2022/design-factory-angular-toggle.mjs +172 -0
  156. package/fesm2022/design-factory-angular-toggle.mjs.map +1 -0
  157. package/fesm2022/design-factory-angular-tooltip.mjs +138 -0
  158. package/fesm2022/design-factory-angular-tooltip.mjs.map +1 -0
  159. package/fesm2022/design-factory-angular-topnav.mjs +635 -558
  160. package/fesm2022/design-factory-angular-topnav.mjs.map +1 -1
  161. package/package.json +61 -8
  162. package/schematics/collection.json +35 -0
  163. package/schematics/component-migration/accordion/constants.d.ts +10 -0
  164. package/schematics/component-migration/accordion/constants.js +46 -0
  165. package/schematics/component-migration/accordion/guide.md +257 -0
  166. package/schematics/component-migration/accordion/index.d.ts +2 -0
  167. package/schematics/component-migration/accordion/index.js +5 -0
  168. package/schematics/component-migration/accordion/migration.d.ts +2 -0
  169. package/schematics/component-migration/accordion/migration.js +13 -0
  170. package/schematics/component-migration/accordion/schema.json +25 -0
  171. package/schematics/component-migration/accordion/steps/accordion-imports.d.ts +3 -0
  172. package/schematics/component-migration/accordion/steps/accordion-imports.js +41 -0
  173. package/schematics/component-migration/accordion/steps/template-migration.d.ts +3 -0
  174. package/schematics/component-migration/accordion/steps/template-migration.js +554 -0
  175. package/schematics/component-migration/accordion/steps/title-content.d.ts +9 -0
  176. package/schematics/component-migration/accordion/steps/title-content.js +75 -0
  177. package/schematics/component-migration/ai/prompt.md +83 -0
  178. package/schematics/component-migration/alert/guide.md +246 -0
  179. package/schematics/component-migration/alert/index.d.ts +2 -0
  180. package/schematics/component-migration/alert/index.js +5 -0
  181. package/schematics/component-migration/alert/migration.d.ts +2 -0
  182. package/schematics/component-migration/alert/migration.js +50 -0
  183. package/schematics/component-migration/alert/schema.json +25 -0
  184. package/schematics/component-migration/alert/steps/alert-imports.d.ts +4 -0
  185. package/schematics/component-migration/alert/steps/alert-imports.js +97 -0
  186. package/schematics/component-migration/alert/steps/animation-input.d.ts +3 -0
  187. package/schematics/component-migration/alert/steps/animation-input.js +17 -0
  188. package/schematics/component-migration/alert/steps/close-output.d.ts +3 -0
  189. package/schematics/component-migration/alert/steps/close-output.js +17 -0
  190. package/schematics/component-migration/alert/steps/icon-directive-imports.d.ts +3 -0
  191. package/schematics/component-migration/alert/steps/icon-directive-imports.js +84 -0
  192. package/schematics/component-migration/alert/steps/icon-directive.d.ts +3 -0
  193. package/schematics/component-migration/alert/steps/icon-directive.js +10 -0
  194. package/schematics/component-migration/alert/steps/legacy-module-imports.d.ts +3 -0
  195. package/schematics/component-migration/alert/steps/legacy-module-imports.js +57 -0
  196. package/schematics/component-migration/alert/steps/programmatic-close.d.ts +3 -0
  197. package/schematics/component-migration/alert/steps/programmatic-close.js +44 -0
  198. package/schematics/component-migration/alert/steps/selector.d.ts +3 -0
  199. package/schematics/component-migration/alert/steps/selector.js +18 -0
  200. package/schematics/component-migration/alert/steps/static-classes.d.ts +3 -0
  201. package/schematics/component-migration/alert/steps/static-classes.js +97 -0
  202. package/schematics/component-migration/alert/steps/static-type.d.ts +3 -0
  203. package/schematics/component-migration/alert/steps/static-type.js +28 -0
  204. package/schematics/component-migration/alert/steps/template-reference.d.ts +3 -0
  205. package/schematics/component-migration/alert/steps/template-reference.js +15 -0
  206. package/schematics/component-migration/alert/steps/template-todos.d.ts +3 -0
  207. package/schematics/component-migration/alert/steps/template-todos.js +78 -0
  208. package/schematics/component-migration/button/guide.md +278 -0
  209. package/schematics/component-migration/button/index.d.ts +2 -0
  210. package/schematics/component-migration/button/index.js +5 -0
  211. package/schematics/component-migration/button/migration.d.ts +2 -0
  212. package/schematics/component-migration/button/migration.js +180 -0
  213. package/schematics/component-migration/button/schema.json +25 -0
  214. package/schematics/component-migration/button/steps/static-classes.d.ts +10 -0
  215. package/schematics/component-migration/button/steps/static-classes.js +128 -0
  216. package/schematics/component-migration/button/steps/template-todos.d.ts +19 -0
  217. package/schematics/component-migration/button/steps/template-todos.js +120 -0
  218. package/schematics/component-migration/button/types.d.ts +7 -0
  219. package/schematics/component-migration/button/types.js +2 -0
  220. package/schematics/component-migration/dropdown/guide.md +252 -0
  221. package/schematics/component-migration/dropdown/index.d.ts +2 -0
  222. package/schematics/component-migration/dropdown/index.js +5 -0
  223. package/schematics/component-migration/dropdown/migration.d.ts +2 -0
  224. package/schematics/component-migration/dropdown/migration.js +41 -0
  225. package/schematics/component-migration/dropdown/schema.json +25 -0
  226. package/schematics/component-migration/dropdown/steps/dropdown-imports.d.ts +3 -0
  227. package/schematics/component-migration/dropdown/steps/dropdown-imports.js +308 -0
  228. package/schematics/component-migration/dropdown/steps/template-attributes.d.ts +10 -0
  229. package/schematics/component-migration/dropdown/steps/template-attributes.js +57 -0
  230. package/schematics/component-migration/dropdown/steps/template-helpers.d.ts +20 -0
  231. package/schematics/component-migration/dropdown/steps/template-helpers.js +125 -0
  232. package/schematics/component-migration/dropdown/steps/template-imports.d.ts +22 -0
  233. package/schematics/component-migration/dropdown/steps/template-imports.js +12 -0
  234. package/schematics/component-migration/dropdown/steps/template-items.d.ts +7 -0
  235. package/schematics/component-migration/dropdown/steps/template-items.js +58 -0
  236. package/schematics/component-migration/dropdown/steps/template-menu.d.ts +14 -0
  237. package/schematics/component-migration/dropdown/steps/template-menu.js +107 -0
  238. package/schematics/component-migration/dropdown/steps/template-todos.d.ts +19 -0
  239. package/schematics/component-migration/dropdown/steps/template-todos.js +118 -0
  240. package/schematics/component-migration/dropdown/steps/template-toggle.d.ts +9 -0
  241. package/schematics/component-migration/dropdown/steps/template-toggle.js +70 -0
  242. package/schematics/component-migration/dropdown/steps/template-wrapper.d.ts +12 -0
  243. package/schematics/component-migration/dropdown/steps/template-wrapper.js +105 -0
  244. package/schematics/component-migration/index.d.ts +3 -0
  245. package/schematics/component-migration/index.js +26 -0
  246. package/schematics/component-migration/next-steps/index.d.ts +13 -0
  247. package/schematics/component-migration/next-steps/index.js +34 -0
  248. package/schematics/component-migration/registry.d.ts +1 -0
  249. package/schematics/component-migration/registry.js +15 -0
  250. package/schematics/component-migration/schema.json +20 -0
  251. package/schematics/component-migration/shared/ai-handoff.d.ts +2 -0
  252. package/schematics/component-migration/shared/ai-handoff.js +28 -0
  253. package/schematics/component-migration/shared/angular-component.d.ts +10 -0
  254. package/schematics/component-migration/shared/angular-component.js +125 -0
  255. package/schematics/component-migration/shared/button-visual-classes.d.ts +24 -0
  256. package/schematics/component-migration/shared/button-visual-classes.js +111 -0
  257. package/schematics/component-migration/shared/component-context.d.ts +7 -0
  258. package/schematics/component-migration/shared/component-context.js +24 -0
  259. package/schematics/component-migration/shared/component-imports.d.ts +45 -0
  260. package/schematics/component-migration/shared/component-imports.js +380 -0
  261. package/schematics/component-migration/shared/create-component-schematic.d.ts +3 -0
  262. package/schematics/component-migration/shared/create-component-schematic.js +55 -0
  263. package/schematics/component-migration/shared/import-edits.d.ts +11 -0
  264. package/schematics/component-migration/shared/import-edits.js +157 -0
  265. package/schematics/component-migration/shared/legacy-config-todos.d.ts +3 -0
  266. package/schematics/component-migration/shared/legacy-config-todos.js +90 -0
  267. package/schematics/component-migration/shared/migrate-project.d.ts +12 -0
  268. package/schematics/component-migration/shared/migrate-project.js +151 -0
  269. package/schematics/component-migration/shared/project-templates.d.ts +15 -0
  270. package/schematics/component-migration/shared/project-templates.js +43 -0
  271. package/schematics/component-migration/shared/scan-project.d.ts +3 -0
  272. package/schematics/component-migration/shared/scan-project.js +24 -0
  273. package/schematics/component-migration/shared/static-placement.d.ts +1 -0
  274. package/schematics/component-migration/shared/static-placement.js +45 -0
  275. package/schematics/component-migration/shared/template-edits.d.ts +28 -0
  276. package/schematics/component-migration/shared/template-edits.js +153 -0
  277. package/schematics/component-migration/shared/template-result.d.ts +3 -0
  278. package/schematics/component-migration/shared/template-result.js +11 -0
  279. package/schematics/component-migration/shared/testing.d.ts +13 -0
  280. package/schematics/component-migration/shared/testing.js +59 -0
  281. package/schematics/component-migration/shared/todo-comments.d.ts +10 -0
  282. package/schematics/component-migration/shared/todo-comments.js +81 -0
  283. package/schematics/component-migration/shared/types.d.ts +41 -0
  284. package/schematics/component-migration/shared/types.js +2 -0
  285. package/schematics/component-migration/tooltip/guide.md +196 -0
  286. package/schematics/component-migration/tooltip/index.d.ts +2 -0
  287. package/schematics/component-migration/tooltip/index.js +5 -0
  288. package/schematics/component-migration/tooltip/migration.d.ts +2 -0
  289. package/schematics/component-migration/tooltip/migration.js +50 -0
  290. package/schematics/component-migration/tooltip/schema.json +25 -0
  291. package/schematics/component-migration/tooltip/steps/template-attributes.d.ts +13 -0
  292. package/schematics/component-migration/tooltip/steps/template-attributes.js +266 -0
  293. package/schematics/component-migration/tooltip/steps/template-todos.d.ts +24 -0
  294. package/schematics/component-migration/tooltip/steps/template-todos.js +115 -0
  295. package/schematics/component-migration/tooltip/steps/tooltip-imports.d.ts +3 -0
  296. package/schematics/component-migration/tooltip/steps/tooltip-imports.js +79 -0
  297. package/schematics/component-migration/utils/component-resource-collector.d.ts +34 -0
  298. package/schematics/component-migration/utils/component-resource-collector.js +107 -0
  299. package/schematics/component-migration/utils/project_tsconfig_paths.d.ts +18 -0
  300. package/schematics/component-migration/utils/project_tsconfig_paths.js +105 -0
  301. package/schematics/component-migration/utils/typescript/compiler_host.d.ts +44 -0
  302. package/schematics/component-migration/utils/typescript/compiler_host.js +87 -0
  303. package/schematics/component-migration/utils/typescript/decorators.d.ts +22 -0
  304. package/schematics/component-migration/utils/typescript/decorators.js +41 -0
  305. package/schematics/component-migration/utils/typescript/functions.d.ts +14 -0
  306. package/schematics/component-migration/utils/typescript/functions.js +20 -0
  307. package/schematics/component-migration/utils/typescript/imports.d.ts +17 -0
  308. package/schematics/component-migration/utils/typescript/imports.js +110 -0
  309. package/schematics/component-migration/utils/typescript/parse_tsconfig.d.ts +9 -0
  310. package/schematics/component-migration/utils/typescript/parse_tsconfig.js +29 -0
  311. package/schematics/component-migration/utils/typescript/property-name.d.ts +13 -0
  312. package/schematics/component-migration/utils/typescript/property-name.js +22 -0
  313. package/schematics/package.json +3 -0
  314. package/types/design-factory-angular-accordion.d.ts +553 -0
  315. package/types/design-factory-angular-alert.d.ts +166 -0
  316. package/types/design-factory-angular-breakpoints.d.ts +13 -0
  317. package/types/design-factory-angular-button.d.ts +166 -0
  318. package/types/design-factory-angular-buttongroup.d.ts +45 -0
  319. package/types/design-factory-angular-drawer.d.ts +19 -26
  320. package/types/design-factory-angular-dropdown.d.ts +148 -0
  321. package/types/design-factory-angular-form-field.d.ts +122 -0
  322. package/types/design-factory-angular-icon.d.ts +11 -0
  323. package/types/design-factory-angular-input.d.ts +16 -0
  324. package/types/design-factory-angular-internals.d.ts +78 -19
  325. package/types/design-factory-angular-separator.d.ts +29 -0
  326. package/types/design-factory-angular-sidenav.d.ts +114 -17
  327. package/types/design-factory-angular-slider.d.ts +239 -0
  328. package/types/design-factory-angular-toggle.d.ts +93 -0
  329. package/types/design-factory-angular-tooltip.d.ts +113 -0
  330. package/types/design-factory-angular-topnav.d.ts +47 -52
  331. package/drawer/README.md +0 -54
@@ -1,12 +1,14 @@
1
1
  import { createNavManager } from '@design-factory/core/services/navManager';
2
- import { toAngularSignal, md$, lg$, useDirectiveForHost } from '@design-factory/angular/internals';
2
+ import { useDirectiveForHost } from '@design-factory/angular/internals';
3
+ import { trackWindow } from '@design-factory/angular/breakpoints';
3
4
  import { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';
4
5
  import * as i0 from '@angular/core';
5
- import { input, model, inject, contentChild, computed, Directive, effect, ChangeDetectionStrategy, Component, signal, viewChild, contentChildren, booleanAttribute, linkedSignal, ElementRef, PLATFORM_ID, Injector, afterRenderEffect, untracked, afterNextRender, ViewEncapsulation } from '@angular/core';
6
- import * as i1 from '@angular/forms';
7
- import { FormsModule } from '@angular/forms';
6
+ import { input, model, inject, contentChild, computed, Directive, effect, Component, linkedSignal, viewChild, contentChildren, booleanAttribute, ElementRef, PLATFORM_ID, signal, Injector, afterRenderEffect, untracked, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
7
+ import { form, FormField } from '@angular/forms/signals';
8
8
  import { DfDrawer } from '@design-factory/angular/drawer';
9
+ import { DfIcon } from '@design-factory/angular/icon';
9
10
  import { RouterLink, RouterLinkActive } from '@angular/router';
11
+ import { DfIconButton } from '@design-factory/angular/button';
10
12
 
11
13
  /**
12
14
  * Base item class that is extended by desktop and mobile item components
@@ -19,23 +21,27 @@ class DfSidenavItemBaseComponent {
19
21
  /**
20
22
  * The label of the item
21
23
  */
22
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
24
+ this.label = input.required(/* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
23
26
  /**
24
27
  * Collapsed state of the item
25
28
  * Only used for the desktop version
26
- * @default false
29
+ * @defaultValue `false`
27
30
  */
28
- this.collapsed = model(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : []));
31
+ this.collapsed = model(false, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
29
33
  /**
30
34
  * The icon class name or inline content (e.g., font awesome class)
31
- * @default ''
35
+ * @defaultValue `''`
32
36
  */
33
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
37
+ this.icon = input('', /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
34
39
  /**
35
40
  * Whether the wrapper component has icon content (internally used)
36
- * @default false
41
+ * @defaultValue `false`
37
42
  */
38
- this.wrapperHasIconContent = input(false, ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : []));
43
+ this.wrapperHasIconContent = input(false, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : /* istanbul ignore next */ []));
39
45
  this.sidenav = inject(DfSidenavComponent);
40
46
  this.wrapperInstance = inject(DfSidenavItemComponent);
41
47
  // check for the parent item to determine nesting level
@@ -44,14 +50,19 @@ class DfSidenavItemBaseComponent {
44
50
  skipSelf: true
45
51
  });
46
52
  this.isFirstLevel = this.parentItem?.['parentWrapper'] === null;
47
- this.iconContent = contentChild('dfSidenavIcon', ...(ngDevMode ? [{ debugName: "iconContent" }] : []));
48
- this.hasActiveLinks = computed(() => this.childLinks().some((link) => link?.isActiveLink()), ...(ngDevMode ? [{ debugName: "hasActiveLinks" }] : []));
49
- this.hasActiveItems = computed(() => this.childItems().some((item) => item?.hasActiveLinks()), ...(ngDevMode ? [{ debugName: "hasActiveItems" }] : []));
50
- this.hasActiveChildren = computed(() => this.hasActiveLinks() || this.hasActiveItems(), ...(ngDevMode ? [{ debugName: "hasActiveChildren" }] : []));
53
+ this.iconContent = contentChild('dfSidenavIcon', /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "iconContent" }] : /* istanbul ignore next */ []));
55
+ this.hasActiveLinks = computed(() => this.childLinks().some((link) => link?.isActiveLink()), /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "hasActiveLinks" }] : /* istanbul ignore next */ []));
57
+ this.hasActiveItems = computed(() => this.childItems().some((item) => item?.hasActiveLinks()), /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "hasActiveItems" }] : /* istanbul ignore next */ []));
59
+ this.hasActiveChildren = computed(() => this.hasActiveLinks() || this.hasActiveItems(), /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "hasActiveChildren" }] : /* istanbul ignore next */ []));
51
61
  /**
52
62
  * Computed signal indicating if the item has visible children
53
63
  */
54
- this.hasVisibleChildren = computed(() => this.childLinks().some((link) => link?.['isVisible']()), ...(ngDevMode ? [{ debugName: "hasVisibleChildren" }] : []));
64
+ this.hasVisibleChildren = computed(() => this.childLinks().some((link) => link?.['isVisible']()), /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "hasVisibleChildren" }] : /* istanbul ignore next */ []));
55
66
  }
56
67
  /**
57
68
  * Method to toggle the collapsed state of the item
@@ -66,10 +77,10 @@ class DfSidenavItemBaseComponent {
66
77
  this.collapsed.set(!this.collapsed());
67
78
  }
68
79
  }
69
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
70
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.0", type: DfSidenavItemBaseComponent, isStandalone: true, inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, wrapperHasIconContent: { classPropertyName: "wrapperHasIconContent", publicName: "wrapperHasIconContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, queries: [{ propertyName: "iconContent", first: true, predicate: ["dfSidenavIcon"], descendants: true, isSignal: true }], ngImport: i0 }); }
80
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
81
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.4", type: DfSidenavItemBaseComponent, isStandalone: true, inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, wrapperHasIconContent: { classPropertyName: "wrapperHasIconContent", publicName: "wrapperHasIconContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, queries: [{ propertyName: "iconContent", first: true, predicate: ["dfSidenavIcon"], descendants: true, isSignal: true }], ngImport: i0 }); }
71
82
  }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemBaseComponent, decorators: [{
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemBaseComponent, decorators: [{
73
84
  type: Directive
74
85
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], wrapperHasIconContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrapperHasIconContent", required: false }] }], iconContent: [{ type: i0.ContentChild, args: ['dfSidenavIcon', { isSignal: true }] }] } });
75
86
 
@@ -81,15 +92,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
81
92
  class DfSidenavItemDesktopComponent extends DfSidenavItemBaseComponent {
82
93
  constructor() {
83
94
  super();
84
- this.childLinks = computed(() => this.wrapperInstance['childrenLinks']().map((link) => link['desktopInstance']()), ...(ngDevMode ? [{ debugName: "childLinks" }] : []));
85
- this.childItems = computed(() => this.wrapperInstance['childrenItems']().map((item) => item['desktopInstance']()), ...(ngDevMode ? [{ debugName: "childItems" }] : []));
95
+ this.childLinks = computed(() => this.wrapperInstance['childrenLinks']().map((link) => link['desktopInstance']()), /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "childLinks" }] : /* istanbul ignore next */ []));
97
+ this.childItems = computed(() => this.wrapperInstance['childrenItems']().map((item) => item['desktopInstance']()), /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "childItems" }] : /* istanbul ignore next */ []));
86
99
  this.isVisible = computed(() => {
87
100
  const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';
88
101
  if (!search) {
89
102
  return true;
90
103
  }
91
104
  return this.childLinks().some((link) => link?.['isVisible']());
92
- }, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
105
+ }, /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
93
107
  // Automatically collapse when minimized
94
108
  effect(() => {
95
109
  if (this.sidenav.isMinimized()) {
@@ -109,28 +123,23 @@ class DfSidenavItemDesktopComponent extends DfSidenavItemBaseComponent {
109
123
  }
110
124
  });
111
125
  }
112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemDesktopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavItemDesktopComponent, isStandalone: true, selector: "df-sidenav-item-desktop", host: { properties: { "class.d-none": "!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" } }, usesInheritance: true, ngImport: i0, template: `
126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemDesktopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavItemDesktopComponent, isStandalone: true, selector: "df-sidenav-item-desktop", host: { properties: { "class.df-hidden": "!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" } }, usesInheritance: true, ngImport: i0, template: `
114
128
  <button
115
- class="btn df-sidenav-button d-flex gap-3"
129
+ class="df-sidenav-button"
116
130
  [class.df-sidenav-active-level]="sidenav.isMinimized() && hasActiveChildren() && isFirstLevel"
117
131
  [class.df-sidenav-active]="hasActiveChildren()"
118
- [class.w-100]="!sidenav.isMinimized()"
119
132
  (click)="toggleCollapse()"
120
133
  [attr.aria-expanded]="!collapsed()"
121
- [class.justify-content-start]="!sidenav.isMinimized()"
122
134
  [attr.aria-label]="label()"
123
135
  >
124
136
  <ng-content select="[dfSidenavIcon]" />
125
137
  @if (icon()) {
126
- <span class="{{ icon() }}"></span>
138
+ <df-icon class="{{ icon() }}" />
127
139
  }
128
140
  @if (!sidenav.isMinimized()) {
129
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
130
- <span
131
- [class.expanded]="!collapsed()"
132
- class="fa-light df-sidenav-collapse-toggle fa-chevron-down ms-auto"
133
- ></span>
141
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
142
+ <df-icon [class.expanded]="!collapsed()" class="fa-light df-sidenav-collapse-toggle fa-chevron-down" />
134
143
  }
135
144
  </button>
136
145
 
@@ -140,34 +149,28 @@ class DfSidenavItemDesktopComponent extends DfSidenavItemBaseComponent {
140
149
  <ng-template #content>
141
150
  <ng-content />
142
151
  </ng-template>
143
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
152
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DfIcon, selector: "df-icon" }] }); }
144
153
  }
145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemDesktopComponent, decorators: [{
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemDesktopComponent, decorators: [{
146
155
  type: Component,
147
156
  args: [{
148
- changeDetection: ChangeDetectionStrategy.OnPush,
149
157
  selector: 'df-sidenav-item-desktop',
150
158
  template: `
151
159
  <button
152
- class="btn df-sidenav-button d-flex gap-3"
160
+ class="df-sidenav-button"
153
161
  [class.df-sidenav-active-level]="sidenav.isMinimized() && hasActiveChildren() && isFirstLevel"
154
162
  [class.df-sidenav-active]="hasActiveChildren()"
155
- [class.w-100]="!sidenav.isMinimized()"
156
163
  (click)="toggleCollapse()"
157
164
  [attr.aria-expanded]="!collapsed()"
158
- [class.justify-content-start]="!sidenav.isMinimized()"
159
165
  [attr.aria-label]="label()"
160
166
  >
161
167
  <ng-content select="[dfSidenavIcon]" />
162
168
  @if (icon()) {
163
- <span class="{{ icon() }}"></span>
169
+ <df-icon class="{{ icon() }}" />
164
170
  }
165
171
  @if (!sidenav.isMinimized()) {
166
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
167
- <span
168
- [class.expanded]="!collapsed()"
169
- class="fa-light df-sidenav-collapse-toggle fa-chevron-down ms-auto"
170
- ></span>
172
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
173
+ <df-icon [class.expanded]="!collapsed()" class="fa-light df-sidenav-collapse-toggle fa-chevron-down" />
171
174
  }
172
175
  </button>
173
176
 
@@ -179,9 +182,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
179
182
  </ng-template>
180
183
  `,
181
184
  host: {
182
- '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
185
+ '[class.df-hidden]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
183
186
  },
184
- imports: [NgTemplateOutlet]
187
+ imports: [NgTemplateOutlet, DfIcon]
185
188
  }]
186
189
  }], ctorParameters: () => [] });
187
190
 
@@ -193,11 +196,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
193
196
  class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
194
197
  constructor() {
195
198
  super(...arguments);
196
- this.childLinks = computed(() => this.wrapperInstance['childrenLinks']().map((link) => link['mobileInstance']()), ...(ngDevMode ? [{ debugName: "childLinks" }] : []));
197
- this.childItems = computed(() => this.wrapperInstance['childrenItems']().map((item) => item['mobileInstance']()), ...(ngDevMode ? [{ debugName: "childItems" }] : []));
198
- this.isSearching = computed(() => !!this.sidenav['searchTerm']().trim(), ...(ngDevMode ? [{ debugName: "isSearching" }] : []));
199
+ this.childLinks = computed(() => this.wrapperInstance['childrenLinks']().map((link) => link['mobileInstance']()), /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "childLinks" }] : /* istanbul ignore next */ []));
201
+ this.childItems = computed(() => this.wrapperInstance['childrenItems']().map((item) => item['mobileInstance']()), /* @ts-ignore */
202
+ ...(ngDevMode ? [{ debugName: "childItems" }] : /* istanbul ignore next */ []));
203
+ this.isSearching = computed(() => !!this.sidenav['searchTerm']().trim(), /* @ts-ignore */
204
+ ...(ngDevMode ? [{ debugName: "isSearching" }] : /* istanbul ignore next */ []));
199
205
  // Check if this item is in the navigation path (is an ancestor of current panel)
200
- this.isInNavigationPath = computed(() => this.sidenav['mobileNavigationStack']().includes(this.wrapperInstance), ...(ngDevMode ? [{ debugName: "isInNavigationPath" }] : []));
206
+ this.isInNavigationPath = computed(() => this.sidenav['mobileNavigationStack']().includes(this.wrapperInstance), /* @ts-ignore */
207
+ ...(ngDevMode ? [{ debugName: "isInNavigationPath" }] : /* istanbul ignore next */ []));
201
208
  // Check if this item should show as mobile header
202
209
  this.shouldShowMobileHeader = computed(() => {
203
210
  // Don't show header when searching
@@ -205,7 +212,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
205
212
  return false;
206
213
  }
207
214
  return this.sidenav['currentMobilePanel']() === this.wrapperInstance;
208
- }, ...(ngDevMode ? [{ debugName: "shouldShowMobileHeader" }] : []));
215
+ }, /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "shouldShowMobileHeader" }] : /* istanbul ignore next */ []));
209
217
  // Determine if this item's children should be visible
210
218
  this.shouldShowChildren = computed(() => {
211
219
  // Mobile with search: show children to display matching links
@@ -214,7 +222,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
214
222
  }
215
223
  // Mobile without search: show if this item is in the navigation path
216
224
  return this.isInNavigationPath();
217
- }, ...(ngDevMode ? [{ debugName: "shouldShowChildren" }] : []));
225
+ }, /* @ts-ignore */
226
+ ...(ngDevMode ? [{ debugName: "shouldShowChildren" }] : /* istanbul ignore next */ []));
218
227
  // Determine if this item should be visible in the list
219
228
  this.isVisibleInList = computed(() => {
220
229
  // Mobile with search: don't show items, only links (items just provide structure)
@@ -236,7 +245,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
236
245
  const parentMobile = this.parentItem?.['parentWrapper'];
237
246
  return parentMobile === currentPanel && this.isVisible();
238
247
  }
239
- }, ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : []));
248
+ }, /* @ts-ignore */
249
+ ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : /* istanbul ignore next */ []));
240
250
  // Determine if the entire component should be hidden
241
251
  this.shouldHideComponent = computed(() => {
242
252
  // Don't hide if this is the current mobile panel showing its children
@@ -245,7 +255,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
245
255
  }
246
256
  // Otherwise, use the regular visibility logic
247
257
  return !this.isVisibleInList() && !this.shouldShowChildren();
248
- }, ...(ngDevMode ? [{ debugName: "shouldHideComponent" }] : []));
258
+ }, /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "shouldHideComponent" }] : /* istanbul ignore next */ []));
249
260
  this.isVisible = computed(() => {
250
261
  const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';
251
262
  if (!search) {
@@ -253,7 +264,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
253
264
  }
254
265
  // Check if this item's label matches
255
266
  return String(this.label()).toLowerCase().includes(search);
256
- }, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
267
+ }, /* @ts-ignore */
268
+ ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
257
269
  // Check if this item has any matching children (for showing the container)
258
270
  this.hasMatchingChildren = computed(() => {
259
271
  const search = this.sidenav['searchTerm']().toLowerCase().trim() || '';
@@ -261,7 +273,8 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
261
273
  return false;
262
274
  }
263
275
  return this.childLinks().some((link) => link?.['isVisible']());
264
- }, ...(ngDevMode ? [{ debugName: "hasMatchingChildren" }] : []));
276
+ }, /* @ts-ignore */
277
+ ...(ngDevMode ? [{ debugName: "hasMatchingChildren" }] : /* istanbul ignore next */ []));
265
278
  }
266
279
  /**
267
280
  * Handle click event on the item
@@ -275,58 +288,39 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
275
288
  handleBackClick() {
276
289
  this.sidenav.navigateBack();
277
290
  }
278
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemMobileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
279
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavItemMobileComponent, isStandalone: true, selector: "df-sidenav-item-mobile", host: { properties: { "class.d-none": "shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" }, classAttribute: "mobile" }, usesInheritance: true, ngImport: i0, template: `
291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemMobileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
292
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavItemMobileComponent, isStandalone: true, selector: "df-sidenav-item-mobile", host: { properties: { "class.df-hidden": "shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" }, classAttribute: "df-sidenav-mobile" }, usesInheritance: true, ngImport: i0, template: `
280
293
  @if (shouldShowMobileHeader()) {
281
- <div class="df-sidenav-mobile-header mobile mb-2" role="listitem">
282
- <button
283
- class="btn w-100 d-flex gap-0 align-items-center justify-content-start df-sidenav-button"
284
- (click)="handleBackClick()"
285
- [class.df-sidenav-active]="hasActiveChildren()"
286
- >
287
- <span class="fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left me-4"></span>
294
+ <div class="df-sidenav-mobile-header df-sidenav-mobile" role="listitem">
295
+ <button class="df-sidenav-button" (click)="handleBackClick()" [class.df-sidenav-active]="hasActiveChildren()">
296
+ <df-icon class="fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left" />
288
297
  <ng-content select="[dfSidenavIcon]" />
289
298
  @if (icon()) {
290
- <span class="{{ icon() }}"></span>
299
+ <df-icon class="{{ icon() }}" />
291
300
  }
292
- <span class="ms-3 sidenav-label">{{ label() }}</span>
301
+ <span class="df-sidenav-label">{{ label() }}</span>
293
302
  </button>
294
303
  </div>
295
304
  }
296
305
 
297
306
  <!-- Regular item button (hidden when it's the active mobile panel) -->
298
307
  @if (isVisibleInList()) {
299
- <!-- Mobile search: Show as breadcrumb/path (non-clickable) -->
300
- @if (isSearching()) {
301
- <div class="btn w-100 d-flex gap-3 justify-content-start text-muted disabled pe-none">
302
- <ng-content select="[dfSidenavIcon]" />
303
- @if (icon()) {
304
- <span class="{{ icon() }}"></span>
305
- }
306
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
307
- <span class="fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto"></span>
308
- </div>
309
- } @else {
310
- <!-- Regular clickable button -->
311
- <button
312
- class="btn w-100 d-flex gap-3 justify-content-start df-sidenav-button"
313
- (click)="handleItemClick()"
314
- [class.df-sidenav-active]="hasActiveChildren()"
315
- >
316
- <ng-content select="[dfSidenavIcon]" />
317
- @if (icon()) {
318
- <span class="{{ icon() }}"></span>
319
- }
320
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
308
+ <button class="df-sidenav-button" (click)="handleItemClick()" [class.df-sidenav-active]="hasActiveChildren()">
309
+ <ng-content select="[dfSidenavIcon]" />
310
+ @if (icon()) {
311
+ <df-icon class="{{ icon() }}" />
312
+ }
313
+ @if (!sidenav.isMinimized()) {
314
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
321
315
  <!-- Mobile: Show forward arrow for items with children -->
322
- <span class="fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto"></span>
323
- </button>
324
- }
316
+ <df-icon class="fa-light df-sidenav-collapse-toggle fa-chevron-right" />
317
+ }
318
+ </button>
325
319
  }
326
320
 
327
321
  <!-- Children container - rendered separately from the button -->
328
322
  @if (shouldShowChildren()) {
329
- <div role="list" class="mobile">
323
+ <div role="list" class="df-sidenav-mobile">
330
324
  <ng-container [ngTemplateOutlet]="content" />
331
325
  </div>
332
326
  }
@@ -334,64 +328,44 @@ class DfSidenavItemMobileComponent extends DfSidenavItemBaseComponent {
334
328
  <ng-template #content>
335
329
  <ng-content />
336
330
  </ng-template>
337
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
331
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DfIcon, selector: "df-icon" }] }); }
338
332
  }
339
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemMobileComponent, decorators: [{
333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemMobileComponent, decorators: [{
340
334
  type: Component,
341
335
  args: [{
342
- changeDetection: ChangeDetectionStrategy.OnPush,
343
336
  selector: 'df-sidenav-item-mobile',
344
337
  template: `
345
338
  @if (shouldShowMobileHeader()) {
346
- <div class="df-sidenav-mobile-header mobile mb-2" role="listitem">
347
- <button
348
- class="btn w-100 d-flex gap-0 align-items-center justify-content-start df-sidenav-button"
349
- (click)="handleBackClick()"
350
- [class.df-sidenav-active]="hasActiveChildren()"
351
- >
352
- <span class="fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left me-4"></span>
339
+ <div class="df-sidenav-mobile-header df-sidenav-mobile" role="listitem">
340
+ <button class="df-sidenav-button" (click)="handleBackClick()" [class.df-sidenav-active]="hasActiveChildren()">
341
+ <df-icon class="fa-light df-sidenav-mobile-header-back-arrow fa-arrow-left" />
353
342
  <ng-content select="[dfSidenavIcon]" />
354
343
  @if (icon()) {
355
- <span class="{{ icon() }}"></span>
344
+ <df-icon class="{{ icon() }}" />
356
345
  }
357
- <span class="ms-3 sidenav-label">{{ label() }}</span>
346
+ <span class="df-sidenav-label">{{ label() }}</span>
358
347
  </button>
359
348
  </div>
360
349
  }
361
350
 
362
351
  <!-- Regular item button (hidden when it's the active mobile panel) -->
363
352
  @if (isVisibleInList()) {
364
- <!-- Mobile search: Show as breadcrumb/path (non-clickable) -->
365
- @if (isSearching()) {
366
- <div class="btn w-100 d-flex gap-3 justify-content-start text-muted disabled pe-none">
367
- <ng-content select="[dfSidenavIcon]" />
368
- @if (icon()) {
369
- <span class="{{ icon() }}"></span>
370
- }
371
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
372
- <span class="fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto"></span>
373
- </div>
374
- } @else {
375
- <!-- Regular clickable button -->
376
- <button
377
- class="btn w-100 d-flex gap-3 justify-content-start df-sidenav-button"
378
- (click)="handleItemClick()"
379
- [class.df-sidenav-active]="hasActiveChildren()"
380
- >
381
- <ng-content select="[dfSidenavIcon]" />
382
- @if (icon()) {
383
- <span class="{{ icon() }}"></span>
384
- }
385
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
353
+ <button class="df-sidenav-button" (click)="handleItemClick()" [class.df-sidenav-active]="hasActiveChildren()">
354
+ <ng-content select="[dfSidenavIcon]" />
355
+ @if (icon()) {
356
+ <df-icon class="{{ icon() }}" />
357
+ }
358
+ @if (!sidenav.isMinimized()) {
359
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
386
360
  <!-- Mobile: Show forward arrow for items with children -->
387
- <span class="fa-light df-sidenav-collapse-toggle fa-chevron-right ms-auto"></span>
388
- </button>
389
- }
361
+ <df-icon class="fa-light df-sidenav-collapse-toggle fa-chevron-right" />
362
+ }
363
+ </button>
390
364
  }
391
365
 
392
366
  <!-- Children container - rendered separately from the button -->
393
367
  @if (shouldShowChildren()) {
394
- <div role="list" class="mobile">
368
+ <div role="list" class="df-sidenav-mobile">
395
369
  <ng-container [ngTemplateOutlet]="content" />
396
370
  </div>
397
371
  }
@@ -401,10 +375,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
401
375
  </ng-template>
402
376
  `,
403
377
  host: {
404
- class: 'mobile',
405
- '[class.d-none]': 'shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
378
+ class: 'df-sidenav-mobile',
379
+ '[class.df-hidden]': 'shouldHideComponent() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
406
380
  },
407
- imports: [NgTemplateOutlet]
381
+ imports: [NgTemplateOutlet, DfIcon]
408
382
  }]
409
383
  }] });
410
384
 
@@ -417,34 +391,49 @@ class DfSidenavLinkBaseComponent {
417
391
  /**
418
392
  * The router link path for to the link
419
393
  */
420
- this.linkPath = input.required(...(ngDevMode ? [{ debugName: "linkPath" }] : []));
394
+ this.linkPath = input.required(/* @ts-ignore */
395
+ ...(ngDevMode ? [{ debugName: "linkPath" }] : /* istanbul ignore next */ []));
421
396
  /**
422
397
  * The label of the link
423
398
  */
424
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
399
+ this.label = input.required(/* @ts-ignore */
400
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
425
401
  /**
426
402
  * The icon class name or inline content (e.g., font awesome class)
427
403
  */
428
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
404
+ this.icon = input('', /* @ts-ignore */
405
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
429
406
  /**
430
407
  * Whether the wrapper component has icon content (internally used)
431
408
  */
432
- this.wrapperHasIconContent = input(false, ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : []));
409
+ this.wrapperHasIconContent = input(false, /* @ts-ignore */
410
+ ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : /* istanbul ignore next */ []));
411
+ /**
412
+ * Explicitly sets the active state of the link. When provided, the link behaves
413
+ * as an external link (plain `<a href>`) and the Angular Router is not used.
414
+ * When `undefined` (default), the active state is determined by the Angular Router.
415
+ */
416
+ this.active = input(/* @ts-ignore */
417
+ ...(ngDevMode ? [undefined, { debugName: "active" }] : /* istanbul ignore next */ []));
433
418
  /**
434
- * Indicates if the link is currently active based on the Router state
419
+ * Reflects the current active state of the link.
420
+ * Driven by the `active` input when provided, otherwise updated by the router via `(isActiveChange)`.
435
421
  */
436
- this.isActiveLink = signal(false, ...(ngDevMode ? [{ debugName: "isActiveLink" }] : []));
422
+ this.isActiveLink = linkedSignal(() => this.active() ?? false, /* @ts-ignore */
423
+ ...(ngDevMode ? [{ debugName: "isActiveLink" }] : /* istanbul ignore next */ []));
437
424
  /**
438
425
  * Options to determine when the router link is considered active
439
426
  */
440
- this.routerLinkActiveOptions = input({ exact: false }, ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : []));
427
+ this.routerLinkActiveOptions = input({ exact: false }, /* @ts-ignore */
428
+ ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : /* istanbul ignore next */ []));
441
429
  this.sidenav = inject(DfSidenavComponent);
442
430
  this.parentItem = inject(DfSidenavItemComponent, {
443
431
  optional: true,
444
432
  skipSelf: true
445
433
  });
446
434
  this.isFirstLevel = this.parentItem === null;
447
- this.iconContent = contentChild('dfSidenavIcon', ...(ngDevMode ? [{ debugName: "iconContent" }] : []));
435
+ this.iconContent = contentChild('dfSidenavIcon', /* @ts-ignore */
436
+ ...(ngDevMode ? [{ debugName: "iconContent" }] : /* istanbul ignore next */ []));
448
437
  /**
449
438
  * Computed signal indicating if the link is visible based on search term
450
439
  */
@@ -454,7 +443,8 @@ class DfSidenavLinkBaseComponent {
454
443
  return true;
455
444
  }
456
445
  return this.label().toLowerCase().includes(search);
457
- }, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
446
+ }, /* @ts-ignore */
447
+ ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
458
448
  }
459
449
  toggleSidenavOnSmallScreen() {
460
450
  if (this.sidenav['isSmallScreen']()) {
@@ -462,12 +452,12 @@ class DfSidenavLinkBaseComponent {
462
452
  }
463
453
  return true;
464
454
  }
465
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
466
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.0", type: DfSidenavLinkBaseComponent, isStandalone: true, inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, wrapperHasIconContent: { classPropertyName: "wrapperHasIconContent", publicName: "wrapperHasIconContent", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "iconContent", first: true, predicate: ["dfSidenavIcon"], descendants: true, isSignal: true }], ngImport: i0 }); }
455
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
456
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.4", type: DfSidenavLinkBaseComponent, isStandalone: true, inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, wrapperHasIconContent: { classPropertyName: "wrapperHasIconContent", publicName: "wrapperHasIconContent", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "iconContent", first: true, predicate: ["dfSidenavIcon"], descendants: true, isSignal: true }], ngImport: i0 }); }
467
457
  }
468
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkBaseComponent, decorators: [{
458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkBaseComponent, decorators: [{
469
459
  type: Directive
470
- }], propDecorators: { linkPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPath", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], wrapperHasIconContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrapperHasIconContent", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], iconContent: [{ type: i0.ContentChild, args: ['dfSidenavIcon', { isSignal: true }] }] } });
460
+ }], propDecorators: { linkPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPath", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], wrapperHasIconContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrapperHasIconContent", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], iconContent: [{ type: i0.ContentChild, args: ['dfSidenavIcon', { isSignal: true }] }] } });
471
461
 
472
462
  /**
473
463
  * Component representing a leaf in the sidenav for desktop devices
@@ -478,70 +468,94 @@ class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {
478
468
  super(...arguments);
479
469
  this.anchor = viewChild.required('anchor');
480
470
  }
481
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkDesktopComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
482
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavLinkDesktopComponent, isStandalone: true, selector: "df-sidenav-link-desktop", host: { properties: { "class.d-none": "!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" }, classAttribute: "d-flex" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
483
- <a
484
- class="btn df-sidenav-button d-flex gap-3"
485
- [class.w-100]="!sidenav.isMinimized()"
486
- routerLinkActive="df-sidenav-active-level"
487
- ariaCurrentWhenActive="page"
488
- (isActiveChange)="isActiveLink.set($event)"
489
- [routerLink]="linkPath()"
490
- [class.justify-content-start]="!sidenav.isMinimized()"
491
- [routerLinkActiveOptions]="routerLinkActiveOptions()"
492
- [attr.aria-label]="label()"
493
- (click)="toggleSidenavOnSmallScreen()"
494
- #anchor
495
- >
496
- <ng-container [ngTemplateOutlet]="content" />
497
- </a>
471
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkDesktopComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
472
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavLinkDesktopComponent, isStandalone: true, selector: "df-sidenav-link-desktop", host: { properties: { "class.df-hidden": "!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" } }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
473
+ @if (active() !== undefined) {
474
+ <a
475
+ class="df-sidenav-button"
476
+ [class.df-sidenav-active-level]="active()"
477
+ [href]="linkPath()"
478
+ target="_blank"
479
+ [attr.aria-label]="label()"
480
+ [attr.aria-current]="active() ? 'page' : null"
481
+ (click)="toggleSidenavOnSmallScreen()"
482
+ #anchor
483
+ >
484
+ <ng-container [ngTemplateOutlet]="content" />
485
+ </a>
486
+ } @else {
487
+ <a
488
+ class="df-sidenav-button"
489
+ routerLinkActive="df-sidenav-active-level"
490
+ ariaCurrentWhenActive="page"
491
+ (isActiveChange)="isActiveLink.set($event)"
492
+ [routerLink]="linkPath()"
493
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
494
+ [attr.aria-label]="label()"
495
+ (click)="toggleSidenavOnSmallScreen()"
496
+ #anchor
497
+ >
498
+ <ng-container [ngTemplateOutlet]="content" />
499
+ </a>
500
+ }
498
501
  <ng-template #content>
499
502
  <ng-content select="[dfSidenavIcon]" />
500
503
  @if (icon()) {
501
- <span class="{{ icon() }}"></span>
504
+ <df-icon class="{{ icon() }}" />
502
505
  }
503
506
  @if (!sidenav.isMinimized()) {
504
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
507
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
505
508
  }
506
509
  </ng-template>
507
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
510
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DfIcon, selector: "df-icon" }] }); }
508
511
  }
509
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkDesktopComponent, decorators: [{
512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkDesktopComponent, decorators: [{
510
513
  type: Component,
511
514
  args: [{
512
- changeDetection: ChangeDetectionStrategy.OnPush,
513
515
  selector: 'df-sidenav-link-desktop',
514
516
  template: `
515
- <a
516
- class="btn df-sidenav-button d-flex gap-3"
517
- [class.w-100]="!sidenav.isMinimized()"
518
- routerLinkActive="df-sidenav-active-level"
519
- ariaCurrentWhenActive="page"
520
- (isActiveChange)="isActiveLink.set($event)"
521
- [routerLink]="linkPath()"
522
- [class.justify-content-start]="!sidenav.isMinimized()"
523
- [routerLinkActiveOptions]="routerLinkActiveOptions()"
524
- [attr.aria-label]="label()"
525
- (click)="toggleSidenavOnSmallScreen()"
526
- #anchor
527
- >
528
- <ng-container [ngTemplateOutlet]="content" />
529
- </a>
517
+ @if (active() !== undefined) {
518
+ <a
519
+ class="df-sidenav-button"
520
+ [class.df-sidenav-active-level]="active()"
521
+ [href]="linkPath()"
522
+ target="_blank"
523
+ [attr.aria-label]="label()"
524
+ [attr.aria-current]="active() ? 'page' : null"
525
+ (click)="toggleSidenavOnSmallScreen()"
526
+ #anchor
527
+ >
528
+ <ng-container [ngTemplateOutlet]="content" />
529
+ </a>
530
+ } @else {
531
+ <a
532
+ class="df-sidenav-button"
533
+ routerLinkActive="df-sidenav-active-level"
534
+ ariaCurrentWhenActive="page"
535
+ (isActiveChange)="isActiveLink.set($event)"
536
+ [routerLink]="linkPath()"
537
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
538
+ [attr.aria-label]="label()"
539
+ (click)="toggleSidenavOnSmallScreen()"
540
+ #anchor
541
+ >
542
+ <ng-container [ngTemplateOutlet]="content" />
543
+ </a>
544
+ }
530
545
  <ng-template #content>
531
546
  <ng-content select="[dfSidenavIcon]" />
532
547
  @if (icon()) {
533
- <span class="{{ icon() }}"></span>
548
+ <df-icon class="{{ icon() }}" />
534
549
  }
535
550
  @if (!sidenav.isMinimized()) {
536
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
551
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
537
552
  }
538
553
  </ng-template>
539
554
  `,
540
555
  host: {
541
- '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
542
- class: 'd-flex'
556
+ '[class.df-hidden]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
543
557
  },
544
- imports: [RouterLink, RouterLinkActive, NgTemplateOutlet]
558
+ imports: [RouterLink, RouterLinkActive, NgTemplateOutlet, DfIcon]
545
559
  }]
546
560
  }], propDecorators: { anchor: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }] } });
547
561
 
@@ -554,8 +568,10 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
554
568
  super(...arguments);
555
569
  // Inject link wrapper to get parent wrapper reference
556
570
  this.linkWrapper = inject(DfSidenavLinkComponent);
557
- this.currentMobilePanel = computed(() => this.sidenav['currentMobilePanel']() ?? null, ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : []));
558
- this.isSearching = computed(() => !!this.sidenav['searchTerm']().trim(), ...(ngDevMode ? [{ debugName: "isSearching" }] : []));
571
+ this.currentMobilePanel = computed(() => this.sidenav['currentMobilePanel']() ?? null, /* @ts-ignore */
572
+ ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : /* istanbul ignore next */ []));
573
+ this.isSearching = computed(() => !!this.sidenav['searchTerm']().trim(), /* @ts-ignore */
574
+ ...(ngDevMode ? [{ debugName: "isSearching" }] : /* istanbul ignore next */ []));
559
575
  this.isVisibleInList = computed(() => {
560
576
  const currentPanel = this.currentMobilePanel();
561
577
  const parentWrapper = this.linkWrapper['parentWrapper'];
@@ -572,7 +588,8 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
572
588
  // Show links whose parent item wrapper matches the current panel
573
589
  return parentWrapper === currentPanel && this.isVisible();
574
590
  }
575
- }, ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : []));
591
+ }, /* @ts-ignore */
592
+ ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : /* istanbul ignore next */ []));
576
593
  // Build breadcrumb path for mobile search view
577
594
  this.breadcrumbPath = computed(() => {
578
595
  const path = [];
@@ -584,88 +601,114 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
584
601
  currentItem = grandParent || null;
585
602
  }
586
603
  return path;
587
- }, ...(ngDevMode ? [{ debugName: "breadcrumbPath" }] : []));
604
+ }, /* @ts-ignore */
605
+ ...(ngDevMode ? [{ debugName: "breadcrumbPath" }] : /* istanbul ignore next */ []));
606
+ }
607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkMobileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
608
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavLinkMobileComponent, isStandalone: true, selector: "df-sidenav-link-mobile", host: { properties: { "class.df-hidden": "!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" }, styleAttribute: "display: flex;" }, usesInheritance: true, ngImport: i0, template: `
609
+ @if (active() !== undefined) {
610
+ <a
611
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
612
+ [class.df-sidenav-active-level]="active()"
613
+ [href]="linkPath()"
614
+ target="_blank"
615
+ [attr.aria-current]="active() ? 'page' : null"
616
+ (click)="toggleSidenavOnSmallScreen()"
617
+ >
618
+ <ng-container [ngTemplateOutlet]="content" />
619
+ </a>
620
+ } @else {
621
+ <a
622
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
623
+ routerLinkActive="df-sidenav-active-level"
624
+ ariaCurrentWhenActive="page"
625
+ (isActiveChange)="isActiveLink.set($event)"
626
+ [routerLink]="linkPath()"
627
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
628
+ (click)="toggleSidenavOnSmallScreen()"
629
+ >
630
+ <ng-container [ngTemplateOutlet]="content" />
631
+ </a>
588
632
  }
589
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkMobileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavLinkMobileComponent, isStandalone: true, selector: "df-sidenav-link-mobile", host: { properties: { "class.d-none": "!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))" }, classAttribute: "d-flex" }, usesInheritance: true, ngImport: i0, template: `
591
- <a
592
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
593
- routerLinkActive="df-sidenav-active-level"
594
- ariaCurrentWhenActive="page"
595
- (isActiveChange)="isActiveLink.set($event)"
596
- [routerLink]="linkPath()"
597
- [routerLinkActiveOptions]="routerLinkActiveOptions()"
598
- (click)="toggleSidenavOnSmallScreen()"
599
- >
600
- <ng-container [ngTemplateOutlet]="content" />
601
- </a>
602
633
  <ng-template #content>
603
- <div class="d-flex gap-3 w-100">
604
- <ng-content select="[dfSidenavIcon]" />
605
- @if (icon()) {
606
- <span class="{{ icon() }}"></span>
607
- }
608
- <div class="d-flex flex-column align-items-start">
609
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
634
+ <ng-content select="[dfSidenavIcon]" />
635
+ @if (icon()) {
636
+ <df-icon class="{{ icon() }}" />
637
+ }
638
+ @if (!sidenav.isMinimized()) {
639
+ <div class="df-sidenav-link-content-mobile">
640
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
610
641
  @if (isSearching() && breadcrumbPath().length > 0) {
611
- <small class="d-flex align-items-center gap-1" [class.text-muted]="!isActiveLink()">
642
+ <small class="df-sidenav-breadcrumb">
612
643
  @for (item of breadcrumbPath(); track $index) {
613
644
  <span>{{ item }}</span>
614
645
  @if (!$last) {
615
- <span class="fa-arrow-right"></span>
646
+ <df-icon class="fa-arrow-right" />
616
647
  }
617
648
  }
618
649
  </small>
619
650
  }
620
651
  </div>
621
- </div>
652
+ }
622
653
  </ng-template>
623
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
654
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DfIcon, selector: "df-icon" }] }); }
624
655
  }
625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkMobileComponent, decorators: [{
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkMobileComponent, decorators: [{
626
657
  type: Component,
627
658
  args: [{
628
- changeDetection: ChangeDetectionStrategy.OnPush,
629
659
  selector: 'df-sidenav-link-mobile',
630
660
  template: `
631
- <a
632
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
633
- routerLinkActive="df-sidenav-active-level"
634
- ariaCurrentWhenActive="page"
635
- (isActiveChange)="isActiveLink.set($event)"
636
- [routerLink]="linkPath()"
637
- [routerLinkActiveOptions]="routerLinkActiveOptions()"
638
- (click)="toggleSidenavOnSmallScreen()"
639
- >
640
- <ng-container [ngTemplateOutlet]="content" />
641
- </a>
661
+ @if (active() !== undefined) {
662
+ <a
663
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
664
+ [class.df-sidenav-active-level]="active()"
665
+ [href]="linkPath()"
666
+ target="_blank"
667
+ [attr.aria-current]="active() ? 'page' : null"
668
+ (click)="toggleSidenavOnSmallScreen()"
669
+ >
670
+ <ng-container [ngTemplateOutlet]="content" />
671
+ </a>
672
+ } @else {
673
+ <a
674
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
675
+ routerLinkActive="df-sidenav-active-level"
676
+ ariaCurrentWhenActive="page"
677
+ (isActiveChange)="isActiveLink.set($event)"
678
+ [routerLink]="linkPath()"
679
+ [routerLinkActiveOptions]="routerLinkActiveOptions()"
680
+ (click)="toggleSidenavOnSmallScreen()"
681
+ >
682
+ <ng-container [ngTemplateOutlet]="content" />
683
+ </a>
684
+ }
642
685
  <ng-template #content>
643
- <div class="d-flex gap-3 w-100">
644
- <ng-content select="[dfSidenavIcon]" />
645
- @if (icon()) {
646
- <span class="{{ icon() }}"></span>
647
- }
648
- <div class="d-flex flex-column align-items-start">
649
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
686
+ <ng-content select="[dfSidenavIcon]" />
687
+ @if (icon()) {
688
+ <df-icon class="{{ icon() }}" />
689
+ }
690
+ @if (!sidenav.isMinimized()) {
691
+ <div class="df-sidenav-link-content-mobile">
692
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
650
693
  @if (isSearching() && breadcrumbPath().length > 0) {
651
- <small class="d-flex align-items-center gap-1" [class.text-muted]="!isActiveLink()">
694
+ <small class="df-sidenav-breadcrumb">
652
695
  @for (item of breadcrumbPath(); track $index) {
653
696
  <span>{{ item }}</span>
654
697
  @if (!$last) {
655
- <span class="fa-arrow-right"></span>
698
+ <df-icon class="fa-arrow-right" />
656
699
  }
657
700
  }
658
701
  </small>
659
702
  }
660
703
  </div>
661
- </div>
704
+ }
662
705
  </ng-template>
663
706
  `,
664
707
  host: {
665
- '[class.d-none]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
666
- class: 'd-flex'
708
+ '[class.df-hidden]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
709
+ style: 'display: flex;'
667
710
  },
668
- imports: [RouterLink, RouterLinkActive, NgTemplateOutlet]
711
+ imports: [RouterLink, RouterLinkActive, NgTemplateOutlet, DfIcon]
669
712
  }]
670
713
  }] });
671
714
 
@@ -676,10 +719,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
676
719
  * @since 21.0.0
677
720
  */
678
721
  class DfSidenavIconDirective {
679
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
680
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: DfSidenavIconDirective, isStandalone: true, selector: "[dfSidenavIcon]", ngImport: i0 }); }
722
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
723
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: DfSidenavIconDirective, isStandalone: true, selector: "[dfSidenavIcon]", ngImport: i0 }); }
681
724
  }
682
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavIconDirective, decorators: [{
725
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavIconDirective, decorators: [{
683
726
  type: Directive,
684
727
  args: [{
685
728
  selector: '[dfSidenavIcon]'
@@ -695,19 +738,30 @@ class DfSidenavLinkComponent {
695
738
  /**
696
739
  * The router link path for to the link
697
740
  */
698
- this.linkPath = input.required(...(ngDevMode ? [{ debugName: "linkPath" }] : []));
741
+ this.linkPath = input.required(/* @ts-ignore */
742
+ ...(ngDevMode ? [{ debugName: "linkPath" }] : /* istanbul ignore next */ []));
699
743
  /**
700
744
  * The label of the link
701
745
  */
702
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
746
+ this.label = input.required(/* @ts-ignore */
747
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
703
748
  /**
704
749
  * The icon class name or inline content (e.g., font awesome class)
705
750
  */
706
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
751
+ this.icon = input('', /* @ts-ignore */
752
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
707
753
  /**
708
754
  * Options to determine when the router link is considered active
709
755
  */
710
- this.routerLinkActiveOptions = input({ exact: false }, ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : []));
756
+ this.routerLinkActiveOptions = input({ exact: false }, /* @ts-ignore */
757
+ ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : /* istanbul ignore next */ []));
758
+ /**
759
+ * Explicitly sets the active state of the link. When provided, the link renders as
760
+ * a plain `<a href>` (no Angular Router). When `undefined` (default), the Angular Router determines
761
+ * the active state.
762
+ */
763
+ this.active = input(/* @ts-ignore */
764
+ ...(ngDevMode ? [undefined, { debugName: "active" }] : /* istanbul ignore next */ []));
711
765
  /**
712
766
  * The parent wrapper item component (if any)
713
767
  */
@@ -718,17 +772,21 @@ class DfSidenavLinkComponent {
718
772
  /**
719
773
  * Reference to the desktop link component instance
720
774
  */
721
- this.desktopInstance = viewChild(DfSidenavLinkDesktopComponent, ...(ngDevMode ? [{ debugName: "desktopInstance" }] : []));
775
+ this.desktopInstance = viewChild(DfSidenavLinkDesktopComponent, /* @ts-ignore */
776
+ ...(ngDevMode ? [{ debugName: "desktopInstance" }] : /* istanbul ignore next */ []));
722
777
  /**
723
778
  * Reference to the mobile link component instance
724
779
  */
725
- this.mobileInstance = viewChild(DfSidenavLinkMobileComponent, ...(ngDevMode ? [{ debugName: "mobileInstance" }] : []));
726
- this.iconContentQuery = contentChild(DfSidenavIconDirective, ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : []));
727
- this.wrapperHasIconContent = computed(() => this.icon() !== '' || this.iconContentQuery() !== undefined, ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : []));
780
+ this.mobileInstance = viewChild(DfSidenavLinkMobileComponent, /* @ts-ignore */
781
+ ...(ngDevMode ? [{ debugName: "mobileInstance" }] : /* istanbul ignore next */ []));
782
+ this.iconContentQuery = contentChild(DfSidenavIconDirective, /* @ts-ignore */
783
+ ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : /* istanbul ignore next */ []));
784
+ this.wrapperHasIconContent = computed(() => this.icon() !== '' || this.iconContentQuery() !== undefined, /* @ts-ignore */
785
+ ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : /* istanbul ignore next */ []));
728
786
  this.sidenav = inject(DfSidenavComponent);
729
787
  }
730
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
731
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavLinkComponent, isStandalone: true, selector: "df-sidenav-link", inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']()" }, classAttribute: "d-block" }, queries: [{ propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavLinkDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavLinkMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
788
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
789
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavLinkComponent, isStandalone: true, selector: "df-sidenav-link", inputs: { linkPath: { classPropertyName: "linkPath", publicName: "linkPath", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, properties: { "class.df-sidenav-mobile": "sidenav['isMobileDevice']()" }, styleAttribute: "display: block;" }, queries: [{ propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavLinkDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavLinkMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
732
790
  <ng-template #iconSlot>
733
791
  <ng-content select="[dfSidenavIcon]" />
734
792
  </ng-template>
@@ -741,6 +799,7 @@ class DfSidenavLinkComponent {
741
799
  [linkPath]="linkPath()"
742
800
  [label]="label()"
743
801
  [icon]="icon()"
802
+ [active]="active()"
744
803
  [wrapperHasIconContent]="wrapperHasIconContent()"
745
804
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
746
805
  >
@@ -752,6 +811,7 @@ class DfSidenavLinkComponent {
752
811
  [linkPath]="linkPath()"
753
812
  [label]="label()"
754
813
  [icon]="icon()"
814
+ [active]="active()"
755
815
  [wrapperHasIconContent]="wrapperHasIconContent()"
756
816
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
757
817
  >
@@ -759,13 +819,12 @@ class DfSidenavLinkComponent {
759
819
  <ng-container [ngTemplateOutlet]="defaultContent" />
760
820
  </df-sidenav-link-desktop>
761
821
  }
762
- `, isInline: true, dependencies: [{ kind: "component", type: DfSidenavLinkDesktopComponent, selector: "df-sidenav-link-desktop" }, { kind: "component", type: DfSidenavLinkMobileComponent, selector: "df-sidenav-link-mobile" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
822
+ `, isInline: true, dependencies: [{ kind: "component", type: DfSidenavLinkDesktopComponent, selector: "df-sidenav-link-desktop" }, { kind: "component", type: DfSidenavLinkMobileComponent, selector: "df-sidenav-link-mobile" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
763
823
  }
764
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkComponent, decorators: [{
824
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavLinkComponent, decorators: [{
765
825
  type: Component,
766
826
  args: [{
767
827
  selector: 'df-sidenav-link',
768
- changeDetection: ChangeDetectionStrategy.OnPush,
769
828
  template: `
770
829
  <ng-template #iconSlot>
771
830
  <ng-content select="[dfSidenavIcon]" />
@@ -779,6 +838,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
779
838
  [linkPath]="linkPath()"
780
839
  [label]="label()"
781
840
  [icon]="icon()"
841
+ [active]="active()"
782
842
  [wrapperHasIconContent]="wrapperHasIconContent()"
783
843
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
784
844
  >
@@ -790,6 +850,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
790
850
  [linkPath]="linkPath()"
791
851
  [label]="label()"
792
852
  [icon]="icon()"
853
+ [active]="active()"
793
854
  [wrapperHasIconContent]="wrapperHasIconContent()"
794
855
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
795
856
  >
@@ -801,11 +862,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
801
862
  imports: [DfSidenavLinkDesktopComponent, DfSidenavLinkMobileComponent, NgTemplateOutlet],
802
863
  host: {
803
864
  role: 'listitem',
804
- class: 'd-block',
805
- '[class.mobile]': "sidenav['isMobileDevice']()"
865
+ style: 'display: block;',
866
+ '[class.df-sidenav-mobile]': "sidenav['isMobileDevice']()"
806
867
  }
807
868
  }]
808
- }], propDecorators: { linkPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPath", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], desktopInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkDesktopComponent), { isSignal: true }] }], mobileInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkMobileComponent), { isSignal: true }] }], iconContentQuery: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DfSidenavIconDirective), { isSignal: true }] }] } });
869
+ }], propDecorators: { linkPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPath", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], desktopInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkDesktopComponent), { isSignal: true }] }], mobileInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavLinkMobileComponent), { isSignal: true }] }], iconContentQuery: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DfSidenavIconDirective), { isSignal: true }] }] } });
809
870
 
810
871
  /**
811
872
  * Sidenav element that should be nested inside <df-sidenav> or <df-sidenav-item>
@@ -816,16 +877,19 @@ class DfSidenavItemComponent {
816
877
  /**
817
878
  * Label of the sidenav item
818
879
  */
819
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
880
+ this.label = input.required(/* @ts-ignore */
881
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
820
882
  /**
821
883
  * Flag whether the sidenav item is collapsed
822
- * @default false
884
+ * @defaultValue `false`
823
885
  */
824
- this.collapsed = model(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : []));
886
+ this.collapsed = model(false, /* @ts-ignore */
887
+ ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
825
888
  /**
826
889
  * Optional icon class for the sidenav item
827
890
  */
828
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
891
+ this.icon = input('', /* @ts-ignore */
892
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
829
893
  /**
830
894
  * Reference to the parent element containing this item
831
895
  */
@@ -836,25 +900,29 @@ class DfSidenavItemComponent {
836
900
  /**
837
901
  * Child sidenav items nested inside this item
838
902
  */
839
- this.childrenItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "childrenItems" } : {}), descendants: true });
903
+ this.childrenItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "childrenItems" } : /* istanbul ignore next */ {}), descendants: true });
840
904
  /**
841
905
  * Child sidenav links nested inside this item
842
906
  */
843
- this.childrenLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "childrenLinks" } : {}), descendants: true });
907
+ this.childrenLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "childrenLinks" } : /* istanbul ignore next */ {}), descendants: true });
844
908
  /**
845
909
  * Reference to the desktop instance of the sidenav item
846
910
  */
847
- this.desktopInstance = viewChild(DfSidenavItemDesktopComponent, ...(ngDevMode ? [{ debugName: "desktopInstance" }] : []));
911
+ this.desktopInstance = viewChild(DfSidenavItemDesktopComponent, /* @ts-ignore */
912
+ ...(ngDevMode ? [{ debugName: "desktopInstance" }] : /* istanbul ignore next */ []));
848
913
  /**
849
914
  * Reference to the mobile instance of the sidenav item
850
915
  */
851
- this.mobileInstance = viewChild(DfSidenavItemMobileComponent, ...(ngDevMode ? [{ debugName: "mobileInstance" }] : []));
852
- this.iconContentQuery = contentChild(DfSidenavIconDirective, ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : []));
853
- this.wrapperHasIconContent = computed(() => this.icon() !== '' || this.iconContentQuery() !== undefined, ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : []));
916
+ this.mobileInstance = viewChild(DfSidenavItemMobileComponent, /* @ts-ignore */
917
+ ...(ngDevMode ? [{ debugName: "mobileInstance" }] : /* istanbul ignore next */ []));
918
+ this.iconContentQuery = contentChild(DfSidenavIconDirective, /* @ts-ignore */
919
+ ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : /* istanbul ignore next */ []));
920
+ this.wrapperHasIconContent = computed(() => this.icon() !== '' || this.iconContentQuery() !== undefined, /* @ts-ignore */
921
+ ...(ngDevMode ? [{ debugName: "wrapperHasIconContent" }] : /* istanbul ignore next */ []));
854
922
  this.sidenav = inject(DfSidenavComponent);
855
923
  }
856
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
857
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavItemComponent, isStandalone: true, selector: "df-sidenav-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { attributes: { "role": "listitem" }, properties: { "class.mobile": "sidenav['isMobileDevice']()" }, classAttribute: "d-block" }, queries: [{ propertyName: "childrenItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }, { propertyName: "childrenLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavItemDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavItemMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
924
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
925
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavItemComponent, isStandalone: true, selector: "df-sidenav-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { attributes: { "role": "listitem" }, properties: { "class.df-sidenav-mobile": "sidenav['isMobileDevice']()" }, styleAttribute: "display: block;" }, queries: [{ propertyName: "childrenItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }, { propertyName: "childrenLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "iconContentQuery", first: true, predicate: DfSidenavIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "desktopInstance", first: true, predicate: DfSidenavItemDesktopComponent, descendants: true, isSignal: true }, { propertyName: "mobileInstance", first: true, predicate: DfSidenavItemMobileComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
858
926
  <ng-template #iconSlot>
859
927
  <ng-content select="[dfSidenavIcon]" />
860
928
  </ng-template>
@@ -883,13 +951,12 @@ class DfSidenavItemComponent {
883
951
  <ng-container [ngTemplateOutlet]="content" />
884
952
  </df-sidenav-item-desktop>
885
953
  }
886
- `, isInline: true, dependencies: [{ kind: "component", type: DfSidenavItemDesktopComponent, selector: "df-sidenav-item-desktop" }, { kind: "component", type: DfSidenavItemMobileComponent, selector: "df-sidenav-item-mobile" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
954
+ `, isInline: true, dependencies: [{ kind: "component", type: DfSidenavItemDesktopComponent, selector: "df-sidenav-item-desktop" }, { kind: "component", type: DfSidenavItemMobileComponent, selector: "df-sidenav-item-mobile" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
887
955
  }
888
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemComponent, decorators: [{
956
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavItemComponent, decorators: [{
889
957
  type: Component,
890
958
  args: [{
891
959
  selector: 'df-sidenav-item',
892
- changeDetection: ChangeDetectionStrategy.OnPush,
893
960
  template: `
894
961
  <ng-template #iconSlot>
895
962
  <ng-content select="[dfSidenavIcon]" />
@@ -923,8 +990,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
923
990
  imports: [DfSidenavItemDesktopComponent, DfSidenavItemMobileComponent, NgTemplateOutlet],
924
991
  host: {
925
992
  role: 'listitem',
926
- class: 'd-block',
927
- '[class.mobile]': "sidenav['isMobileDevice']()"
993
+ style: 'display: block;',
994
+ '[class.df-sidenav-mobile]': "sidenav['isMobileDevice']()"
928
995
  }
929
996
  }]
930
997
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], childrenItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavItemComponent), { ...{ descendants: true }, isSignal: true }] }], childrenLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavLinkComponent), { ...{ descendants: true }, isSignal: true }] }], desktopInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavItemDesktopComponent), { isSignal: true }] }], mobileInstance: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavItemMobileComponent), { isSignal: true }] }], iconContentQuery: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DfSidenavIconDirective), { isSignal: true }] }] } });
@@ -946,30 +1013,30 @@ class DfSidenavComponent {
946
1013
  constructor() {
947
1014
  /**
948
1015
  * Flag whether the sidenav includes a search input
949
- * @default true
1016
+ * @defaultValue `true`
950
1017
  */
951
- this.searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : {}), transform: booleanAttribute });
1018
+ this.searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
952
1019
  /**
953
1020
  * Flag whether the sidenav should be resizable
954
- * @default true
1021
+ * @defaultValue `true`
955
1022
  */
956
- this.resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : {}), transform: booleanAttribute });
1023
+ this.resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
957
1024
  /**
958
1025
  * Flag whether the sidenav should have the collapse button
959
- * @default true
1026
+ * @defaultValue `true`
960
1027
  */
961
- this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : {}), transform: booleanAttribute });
1028
+ this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
962
1029
  /**
963
1030
  * Flag to enable the mobile sidenav display of the items.
964
- * @default true
1031
+ * @defaultValue `true`
965
1032
  */
966
- this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : {}), transform: booleanAttribute });
1033
+ this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
967
1034
  /**
968
- * @since 21.1.0
969
- *
970
1035
  * Flag to disable the automatic scroll to active link on desktop when the sidenav is initialized.
1036
+ *
1037
+ * @since 21.1.0
971
1038
  */
972
- this.disableInitialDesktopAutoScroll = input(false, { ...(ngDevMode ? { debugName: "disableInitialDesktopAutoScroll" } : {}), transform: booleanAttribute });
1039
+ this.disableInitialDesktopAutoScroll = input(false, { ...(ngDevMode ? { debugName: "disableInitialDesktopAutoScroll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
973
1040
  this._isMinimized = linkedSignal(() => {
974
1041
  // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size
975
1042
  if (this.isMobileDevice()) {
@@ -977,12 +1044,14 @@ class DfSidenavComponent {
977
1044
  }
978
1045
  // in desktop, we track the large screen signal in order to reset the minimized state
979
1046
  // it allows resizing the window and have a more user-friendly behavior
980
- return !this.isLargeUpScreen();
981
- }, ...(ngDevMode ? [{ debugName: "_isMinimized" }] : []));
1047
+ return !this.isLargeUpScreen() && this.collapsible();
1048
+ }, /* @ts-ignore */
1049
+ ...(ngDevMode ? [{ debugName: "_isMinimized" }] : /* istanbul ignore next */ []));
982
1050
  /**
983
1051
  * Flag to indicate if the sidenav is minimized
984
1052
  */
985
- this.isMinimized = computed(() => this._isMinimized(), ...(ngDevMode ? [{ debugName: "isMinimized" }] : []));
1053
+ this.isMinimized = computed(() => this._isMinimized(), /* @ts-ignore */
1054
+ ...(ngDevMode ? [{ debugName: "isMinimized" }] : /* istanbul ignore next */ []));
986
1055
  this.hostRef = inject((ElementRef));
987
1056
  this.scrollableContainer = viewChild.required('scrollableContainer');
988
1057
  this.isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
@@ -1004,28 +1073,38 @@ class DfSidenavComponent {
1004
1073
  }
1005
1074
  return false;
1006
1075
  }
1007
- }, ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : []));
1008
- this.searchInput = viewChild('textInput', ...(ngDevMode ? [{ debugName: "searchInput" }] : []));
1076
+ }, /* @ts-ignore */
1077
+ ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : /* istanbul ignore next */ []));
1078
+ this.searchInput = viewChild('textInput', /* @ts-ignore */
1079
+ ...(ngDevMode ? [{ debugName: "searchInput" }] : /* istanbul ignore next */ []));
1009
1080
  // Query all links to find active ones
1010
- this.allLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "allLinks" } : {}), descendants: true });
1011
- this.allItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "allItems" } : {}), descendants: true });
1012
- this.width = signal(null, ...(ngDevMode ? [{ debugName: "width" }] : []));
1081
+ this.allLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "allLinks" } : /* istanbul ignore next */ {}), descendants: true });
1082
+ this.allItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "allItems" } : /* istanbul ignore next */ {}), descendants: true });
1083
+ this.width = signal(null, /* @ts-ignore */
1084
+ ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
1013
1085
  this.savedWidth = null;
1014
- this.searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
1086
+ this.searchTerm = signal('', /* @ts-ignore */
1087
+ ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
1088
+ this.searchTermFormField = form(this.searchTerm);
1015
1089
  // Mobile navigation stack - tracks which item's children are currently displayed
1016
1090
  // Using component references instead of labels for uniqueness
1017
- this.mobileNavigationStack = signal([], ...(ngDevMode ? [{ debugName: "mobileNavigationStack" }] : []));
1091
+ this.mobileNavigationStack = signal([], /* @ts-ignore */
1092
+ ...(ngDevMode ? [{ debugName: "mobileNavigationStack" }] : /* istanbul ignore next */ []));
1018
1093
  this.currentMobilePanel = computed(() => {
1019
1094
  const stack = this.mobileNavigationStack();
1020
1095
  return stack.length > 0 ? stack[stack.length - 1] : null;
1021
- }, ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : []));
1022
- this.isMd = toAngularSignal(md$);
1023
- this.isLg = toAngularSignal(lg$);
1024
- this.isSmallScreen = computed(() => !this.isMd(), ...(ngDevMode ? [{ debugName: "isSmallScreen" }] : []));
1025
- this.isMediumScreen = computed(() => this.isMd() && !this.isLg(), ...(ngDevMode ? [{ debugName: "isMediumScreen" }] : []));
1026
- this.isLargeUpScreen = computed(() => this.isLg(), ...(ngDevMode ? [{ debugName: "isLargeUpScreen" }] : []));
1027
- this.isMobileOrSmallScreen = computed(() => this.isSmallScreen() || this.isMediumScreen(), ...(ngDevMode ? [{ debugName: "isMobileOrSmallScreen" }] : []));
1028
- this.backdrop = computed(() => this.isMediumScreen(), ...(ngDevMode ? [{ debugName: "backdrop" }] : []));
1096
+ }, /* @ts-ignore */
1097
+ ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : /* istanbul ignore next */ []));
1098
+ this.isSm = trackWindow('sm');
1099
+ this.isLg = trackWindow('lg');
1100
+ this.isSmallScreen = computed(() => !this.isSm() && !this.isLg(), /* @ts-ignore */
1101
+ ...(ngDevMode ? [{ debugName: "isSmallScreen" }] : /* istanbul ignore next */ []));
1102
+ this.isMediumScreen = computed(() => this.isSm() && !this.isLg(), /* @ts-ignore */
1103
+ ...(ngDevMode ? [{ debugName: "isMediumScreen" }] : /* istanbul ignore next */ []));
1104
+ this.isLargeUpScreen = computed(() => this.isLg(), /* @ts-ignore */
1105
+ ...(ngDevMode ? [{ debugName: "isLargeUpScreen" }] : /* istanbul ignore next */ []));
1106
+ this.backdrop = computed(() => this.isMediumScreen(), /* @ts-ignore */
1107
+ ...(ngDevMode ? [{ debugName: "backdrop" }] : /* istanbul ignore next */ []));
1029
1108
  this.navManager = createNavManager();
1030
1109
  this.navManagerConfig = {
1031
1110
  selector: (node) => node.querySelectorAll('input, button, a'),
@@ -1035,12 +1114,19 @@ class DfSidenavComponent {
1035
1114
  }
1036
1115
  };
1037
1116
  this.injector = inject(Injector);
1117
+ // internal flag to allow mobile screen navigation to non-active item when minimized
1118
+ this.skipActiveItemNavigation = linkedSignal(() => {
1119
+ this.isMinimized();
1120
+ return false;
1121
+ }, /* @ts-ignore */
1122
+ ...(ngDevMode ? [{ debugName: "skipActiveItemNavigation" }] : /* istanbul ignore next */ []));
1038
1123
  this.contentHasIcons = computed(() => this.allItems().some((item) => item['wrapperHasIconContent']()) ||
1039
- this.allLinks().some((link) => link['wrapperHasIconContent']()), ...(ngDevMode ? [{ debugName: "contentHasIcons" }] : []));
1124
+ this.allLinks().some((link) => link['wrapperHasIconContent']()), /* @ts-ignore */
1125
+ ...(ngDevMode ? [{ debugName: "contentHasIcons" }] : /* istanbul ignore next */ []));
1040
1126
  useDirectiveForHost(this.navManager.directive, this.navManagerConfig);
1041
1127
  afterRenderEffect(() => {
1042
1128
  if (this.isBrowser) {
1043
- if (this.isMobileDevice() && !this._isMinimized()) {
1129
+ if (this.isMobileDevice() && !this._isMinimized() && !this.skipActiveItemNavigation()) {
1044
1130
  // Delay to ensure DOM and contentChildren queries are ready
1045
1131
  this.navigateToActiveItem();
1046
1132
  }
@@ -1091,7 +1177,7 @@ class DfSidenavComponent {
1091
1177
  }, { injector: this.injector });
1092
1178
  });
1093
1179
  }
1094
- }, { ...(ngDevMode ? { debugName: "effectRef" } : {}), injector: this.injector });
1180
+ }, { ...(ngDevMode ? { debugName: "effectRef" } : /* istanbul ignore next */ {}), injector: this.injector });
1095
1181
  }
1096
1182
  /**
1097
1183
  * Toggles the minimized state of the sidenav
@@ -1103,6 +1189,8 @@ class DfSidenavComponent {
1103
1189
  if (minimized) {
1104
1190
  this.savedWidth = this.width();
1105
1191
  this.width.set(0);
1192
+ // reset mobile navigation stack to show root level icons (if any)
1193
+ this.mobileNavigationStack.set([]);
1106
1194
  }
1107
1195
  else {
1108
1196
  this.width.set(this.savedWidth);
@@ -1116,6 +1204,8 @@ class DfSidenavComponent {
1116
1204
  */
1117
1205
  visibleChangeHandler(isVisible) {
1118
1206
  if (!isVisible) {
1207
+ // reset mobile navigation stack to show root level icons (if any)
1208
+ this.mobileNavigationStack.set([]);
1119
1209
  this.width.set(0);
1120
1210
  }
1121
1211
  this._isMinimized.set(!isVisible);
@@ -1138,6 +1228,12 @@ class DfSidenavComponent {
1138
1228
  }
1139
1229
  }
1140
1230
  }
1231
+ onMinimizedChange(isMinimized) {
1232
+ if (isMinimized) {
1233
+ this.mobileNavigationStack.set([]);
1234
+ }
1235
+ this._isMinimized.set(isMinimized);
1236
+ }
1141
1237
  // utility to transfer focus from the button when minimized to the search input when uncollapsed
1142
1238
  focusSearch() {
1143
1239
  this.toggleMinimize(false);
@@ -1150,6 +1246,10 @@ class DfSidenavComponent {
1150
1246
  * @param itemRef item to be added to the navigation stack
1151
1247
  */
1152
1248
  navigateToChildren(itemRef) {
1249
+ if (this.isMinimized()) {
1250
+ this.toggleMinimize(false);
1251
+ this.skipActiveItemNavigation.set(true);
1252
+ }
1153
1253
  const stack = this.mobileNavigationStack();
1154
1254
  this.mobileNavigationStack.set([...stack, itemRef]);
1155
1255
  }
@@ -1188,15 +1288,15 @@ class DfSidenavComponent {
1188
1288
  this.mobileNavigationStack.set([]);
1189
1289
  }
1190
1290
  }
1191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1192
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DfSidenavComponent, isStandalone: true, selector: "df-sidenav", inputs: { searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null }, disableInitialDesktopAutoScroll: { classPropertyName: "disableInitialDesktopAutoScroll", publicName: "disableInitialDesktopAutoScroll", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.df-sidenav-lg": "isLargeUpScreen()", "class.df-sidenav-withicon": "contentHasIcons()", "class.d-none": "isSmallScreen() && _isMinimized()", "class.df-sidenav-drawer": "isMediumScreen() && !_isMinimized()" }, classAttribute: "df-sidenav" }, queries: [{ propertyName: "allLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "allItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollableContainer", first: true, predicate: ["scrollableContainer"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["textInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1292
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavComponent, isStandalone: true, selector: "df-sidenav", inputs: { searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null }, disableInitialDesktopAutoScroll: { classPropertyName: "disableInitialDesktopAutoScroll", publicName: "disableInitialDesktopAutoScroll", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.df-sidenav-lg": "isLargeUpScreen()", "class.df-sidenav-withicon": "contentHasIcons()", "class.df-hidden": "!isLargeUpScreen() && _isMinimized()", "class.df-sidenav-drawer": "isMediumScreen() && !_isMinimized()", "class.df-sidenav-minimized": "isMinimized()" }, classAttribute: "df-sidenav" }, queries: [{ propertyName: "allLinks", predicate: DfSidenavLinkComponent, descendants: true, isSignal: true }, { propertyName: "allItems", predicate: DfSidenavItemComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollableContainer", first: true, predicate: ["scrollableContainer"], descendants: true, isSignal: true }, { propertyName: "searchInput", first: true, predicate: ["textInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1193
1293
  <df-drawer
1194
1294
  #drawer
1195
1295
  position="inline-start"
1196
1296
  [className]="isSmallScreen() ? 'df-sidenav-mobile-drawer' : ''"
1197
1297
  [visible]="!_isMinimized()"
1198
1298
  (visibleChange)="visibleChangeHandler($event)"
1199
- (minimizedChange)="_isMinimized.set($event)"
1299
+ (minimizedChange)="onMinimizedChange($event)"
1200
1300
  (resizingChange)="resizingChangeHandler($event)"
1201
1301
  [bodyScroll]="true"
1202
1302
  [backdrop]="backdrop()"
@@ -1205,84 +1305,82 @@ class DfSidenavComponent {
1205
1305
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1206
1306
  [resizable]="resizable() && !isSmallScreen()"
1207
1307
  [focusOnInit]="false"
1208
- [configuration]="isLargeUpScreen() ? 'inline' : 'overlay'"
1308
+ [configuration]="isLargeUpScreen() || (isMediumScreen() && !collapsible()) ? 'inline' : 'overlay'"
1209
1309
  >
1210
- <div class="h-100 w-100">
1211
- <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1212
- <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
1213
- @if (searchable()) {
1214
- @if (_isMinimized()) {
1215
- <button
1216
- class="btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search"
1217
- [class.df-sidenav-search-minimized]="!contentHasIcons()"
1218
- type="button"
1219
- (click)="focusSearch()"
1310
+ <nav class="df-sidenav-container">
1311
+ @if (searchable()) {
1312
+ <div class="df-sidenav-header" [class.df-sidenav-header-minimized]="_isMinimized()">
1313
+ @if (_isMinimized()) {
1314
+ <button
1315
+ dfIconButton
1316
+ appearance="outline"
1317
+ variant="neutral"
1318
+ class="df-sidenav-search-minimized fa-light fa-search"
1319
+ [class.df-sidenav-search-minimized-no-icons]="!contentHasIcons()"
1320
+ (click)="focusSearch()"
1321
+ i18n-aria-label="@@df.sidenav.search.ariaLabel"
1322
+ aria-label="Search"
1323
+ ></button>
1324
+ } @else {
1325
+ <div class="input-group">
1326
+ <div class="input-group-prepend">
1327
+ <df-icon class="input-group-text fa-light fa-search" />
1328
+ </div>
1329
+ <input
1330
+ type="search"
1331
+ class="form-control df-input-withicon"
1332
+ i18n-placeholder="@@df.sidenav.search.placeholder"
1333
+ placeholder="Search"
1220
1334
  i18n-aria-label="@@df.sidenav.search.ariaLabel"
1221
1335
  aria-label="Search"
1222
- ></button>
1223
- } @else {
1224
- <div class="input-group mb-3">
1225
- <div class="input-group-prepend">
1226
- <span class="input-group-text fa-light fa-search"></span>
1227
- </div>
1228
- <input
1229
- type="search"
1230
- class="form-control df-input-withicon"
1231
- i18n-placeholder="@@df.sidenav.search.placeholder"
1232
- placeholder="Search"
1233
- i18n-aria-label="@@df.sidenav.search.ariaLabel"
1234
- aria-label="Search"
1235
- [(ngModel)]="searchTerm"
1236
- #textInput
1237
- />
1238
- <div class="input-group-append">
1239
- <button
1240
- class="input-group-text fa-light fa-times"
1241
- [class.df-sidenav-search-empty]="searchTerm() === ''"
1242
- (click)="searchTerm.set(''); textInput.focus()"
1243
- >
1244
- <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1245
- </button>
1246
- </div>
1336
+ [formField]="searchTermFormField"
1337
+ #textInput
1338
+ />
1339
+ <div class="input-group-append">
1340
+ <button
1341
+ class="input-group-text fa-light fa-times"
1342
+ [class.df-sidenav-search-empty]="searchTerm() === ''"
1343
+ (click)="searchTerm.set(''); textInput.focus(); $event.preventDefault()"
1344
+ >
1345
+ <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1346
+ </button>
1247
1347
  </div>
1248
- }
1348
+ </div>
1249
1349
  }
1250
1350
  </div>
1351
+ }
1251
1352
 
1252
- <div role="list" class="sidenav-body flex-grow-1 overflow-y-auto" #scrollableContainer>
1253
- <ng-content />
1353
+ <div role="list" class="df-sidenav-body" #scrollableContainer>
1354
+ <ng-content />
1355
+ </div>
1356
+ @if (collapsible() && !isSmallScreen()) {
1357
+ <div class="df-sidenav-footer">
1358
+ <button
1359
+ dfIconButton
1360
+ class="df-sidenav-toggle-minimized"
1361
+ [class.fa-arrow-right-to-line]="isMinimized()"
1362
+ [class.fa-arrow-left-to-line]="!isMinimized()"
1363
+ appearance="outline"
1364
+ (click)="toggleMinimize()"
1365
+ i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1366
+ aria-label="Toggle minimized sidenav"
1367
+ ></button>
1254
1368
  </div>
1255
- @if (collapsible() && !isSmallScreen()) {
1256
- <div class="d-flex sidenav-footer flex-shrink-0 py-3">
1257
- <button
1258
- class="btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized"
1259
- (click)="toggleMinimize()"
1260
- i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1261
- aria-label="Toggle minimized sidenav"
1262
- >
1263
- @if (isMinimized()) {
1264
- <span class="fa-arrow-right-to-line"></span>
1265
- } @else {
1266
- <span class="fa-arrow-left-to-line"></span>
1267
- }
1268
- </button>
1269
- </div>
1270
- }
1271
- </nav>
1272
- </div>
1369
+ }
1370
+ </nav>
1273
1371
  </df-drawer>
1274
- `, isInline: true, styles: [".df-sidenav{position:relative;--sidenav-minWidth: 44px;width:var(--sidenav-minWidth)}.df-sidenav.df-sidenav-withicon{--sidenav-minWidth: 90px}.df-sidenav.df-sidenav-lg{width:auto}.df-sidenav.df-sidenav-lg .df-drawer{--df-drawer-size: max-content}.df-sidenav.df-sidenav-light-sky .sidenav-body{scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-primary-subtle-background)}.df-sidenav.df-sidenav-light-sky .df-drawer,.df-sidenav.df-sidenav-light-sky .df-sidenav-button{background-color:var(--df-color-primary-subtle-background)}.df-sidenav .df-sidenav-search-empty{visibility:hidden}.df-sidenav .df-sidenav-mobile-drawer{top:var(--df-navbar-height, 56px)!important;height:calc(100vh - var(--df-navbar-height, 56px))!important}.df-sidenav nav{border-inline-end:1px solid var(--df-color-inert-neutral-main-border)}.df-sidenav.df-sidenav-drawer .df-drawer{z-index:2010}.df-sidenav .df-drawer{background-color:var(--df-color-inert-neutral-main-background);height:100%;--df-drawer-size: 0;--df-drawer-min-size: var(--sidenav-minWidth);--df-drawer-max-size: max-content;z-index:10;transition:none}.df-sidenav .df-drawer.df-inline-start{border:none}.df-sidenav .df-drawer.df-collapse-show{--df-drawer-size: max-content}.df-sidenav .df-drawer.df-collapse-hide{display:block}.df-sidenav .df-drawer.df-collapse-collapsing.df-collapse-horizontal{transition:none}.df-sidenav .df-sidenav-active{font-weight:var(--df-typo-weight-bold)}.df-sidenav .sidenav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.df-sidenav .sidenav-label:before{content:attr(title);font-weight:var(--df-typo-weight-bold);visibility:hidden;height:0;overflow:hidden;display:block}.df-sidenav .df-sidenav-mobile-header{padding-block-end:var(--df-spacing-2);border-block-end:1px solid var(--df-color-neutral-alt-default-border);font-weight:var(--df-typo-weight-regular)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-active .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .sidenav-body{padding:var(--df-spacing-2);scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-inert-neutral-main-background)}.df-sidenav .df-sidenav-search-minimized,.df-sidenav .df-sidenav-toggle-minimized{min-width:36px;position:relative;z-index:1}.df-sidenav .df-sidenav-header{padding-inline:var(--df-spacing-2);overflow:visible;position:relative}.df-sidenav .df-sidenav-header.df-sidenav-header-minimized{padding-inline:0}.df-sidenav .sidenav-footer{overflow:visible;position:relative}.df-sidenav [role=list] [role=listitem]{padding-inline-start:0}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile){padding-inline-start:var(--df-spacing-6);position:relative}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile):before{content:\"\";position:absolute;left:var(--df-spacing-5);top:0;bottom:0;width:1px;background-color:var(--df-color-neutral-soft-default-background)}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile) [role=listitem]:not(.mobile){padding-inline-start:var(--df-spacing-6)}.df-sidenav .df-drawer-splitter{position:absolute;inset-block:0;inset-inline-end:-4px;width:1rem;cursor:ew-resize;background:transparent;display:flex;align-items:center;justify-content:center;touch-action:none}.df-sidenav .df-drawer-splitter .df-drawer-splitter-handle{--df-btn-bg: transparent;flex-shrink:0;transform:translate(40%);border:none;cursor:ew-resize}.df-sidenav .df-sidenav-button{--df-box-shadow-color: var(--df-color-focus-main-border);--df-btn-font-weight: var(--df-typo-weight-regular);background-color:var(--df-color-inert-neutral-main-background);padding-inline:var(--df-spacing-5);margin-block-end:1px;height:40px;border:none;position:relative}.df-sidenav .df-sidenav-button:focus-visible{z-index:1}.df-sidenav .df-sidenav-button.df-sidenav-breadcrumb-button{height:3rem}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:transform .3s;color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle.expanded{transform:rotate(180deg)}.df-sidenav .df-sidenav-button:hover{background-color:var(--df-color-primary-alt-hovered-background)}.df-sidenav .df-sidenav-button:hover .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:active{background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button:active .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-button.df-sidenav-active-level{font-weight:var(--df-typo-weight-bold);background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button.df-sidenav-active-level:hover{background-color:var(--df-color-primary-alt-activeHovered-background)}.df-sidenav .df-sidenav-item-hidden{visibility:hidden;height:0}.df-sidenav .input-group.df-input-prepend .input-group-prepend{padding-inline-start:15px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DfDrawer, selector: "df-drawer", inputs: ["className", "bodyScroll", "backdrop", "container", "size", "resizable", "visible", "keepInDom", "configuration", "position", "focusOnInit"], outputs: ["sizeChange", "visibleChange", "minimizedChange", "maximizedChange", "resizingChange", "minSize", "maxSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1372
+ `, isInline: true, styles: [".df-sidenav{position:relative;--sidenav-minWidth: 44px;width:var(--sidenav-minWidth)}.df-sidenav.df-sidenav-withicon{--sidenav-minWidth: 80px}.df-sidenav.df-sidenav-lg{width:auto}.df-sidenav.df-sidenav-lg .df-drawer{--df-drawer-size: max-content}.df-sidenav.df-sidenav-light-sky .df-sidenav-body{scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-primary-subtle-background)}.df-sidenav.df-sidenav-light-sky .df-drawer,.df-sidenav.df-sidenav-light-sky .df-sidenav-button{background-color:var(--df-color-primary-subtle-background)}.df-sidenav .df-sidenav-search-empty{visibility:hidden}.df-sidenav .df-sidenav-mobile-drawer{top:var(--df-navbar-height, 56px)!important;height:calc(100vh - var(--df-navbar-height, 56px))!important}.df-sidenav nav{border-inline-end:1px solid var(--df-color-inert-neutral-main-border)}.df-sidenav.df-sidenav-drawer .df-drawer{z-index:2010}.df-sidenav .df-sidenav-container{display:flex;flex-direction:column;height:100%;padding:var(--df-spacing-5);padding-block-end:var(--df-spacing-3)}.df-sidenav .df-sidenav-link-content-mobile{display:flex;flex-direction:column;align-items:flex-start}.df-sidenav .df-sidenav-link-content-mobile .df-sidenav-breadcrumb{color:var(--df-color-subtext-foreground);display:flex;gap:var(--df-spacing-1)}.df-sidenav .df-drawer{background-color:var(--df-color-inert-neutral-main-background);height:100%;--df-drawer-size: 0;--df-drawer-min-size: var(--sidenav-minWidth);--df-drawer-max-size: max-content;z-index:10;transition:none}.df-sidenav .df-drawer.df-inline-start{border:none}.df-sidenav .df-drawer.df-collapse-show{--df-drawer-size: max-content}.df-sidenav .df-drawer.df-collapse-hide{display:block}.df-sidenav .df-drawer.df-collapse-collapsing.df-collapse-horizontal{transition:none}.df-sidenav .df-sidenav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.df-sidenav .df-sidenav-label:before{content:attr(title);font-weight:var(--df-typo-weight-bold);visibility:hidden;height:0;overflow:hidden;display:block}.df-sidenav .df-sidenav-mobile-header{padding-block-end:var(--df-spacing-2);border-block-end:1px solid var(--df-color-neutral-alt-default-border);margin-block-end:var(--df-spacing-2);font-weight:var(--df-typo-weight-regular)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-button{gap:0}.df-sidenav .df-sidenav-mobile-header .df-sidenav-mobile-header-back-arrow{margin-inline-end:var(--df-spacing-4);color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-active .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-label{margin-inline-start:var(--df-spacing-3)}.df-sidenav.df-sidenav-minimized .df-sidenav-button{width:3rem}.df-sidenav.df-sidenav-minimized .df-sidenav-body{padding:0;overflow:visible}.df-sidenav .df-sidenav-body{padding:var(--df-spacing-2);scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-inert-neutral-main-background);flex-grow:1;overflow-y:auto}.df-sidenav .df-sidenav-search-minimized{width:100%}.df-sidenav .df-sidenav-search-minimized-no-icons,.df-sidenav .df-sidenav-toggle-minimized{min-width:36px;position:relative;z-index:1}.df-sidenav .df-sidenav-header{margin-block-end:var(--df-spacing-3);overflow:visible;padding-inline:var(--df-spacing-2);position:relative}.df-sidenav .df-sidenav-header .input-group{flex-wrap:nowrap}.df-sidenav .df-sidenav-header.df-sidenav-header-minimized{padding-inline:0}.df-sidenav .df-sidenav-footer{overflow:visible;position:relative;padding-block:var(--df-spacing-3)}.df-sidenav [role=list] [role=listitem]{padding-inline-start:0}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile){padding-inline-start:var(--df-spacing-6);position:relative}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile):before{content:\"\";position:absolute;inset-inline-start:var(--df-spacing-5);top:0;bottom:0;width:1px;background-color:var(--df-color-neutral-soft-default-background)}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile) [role=listitem]:not(.df-sidenav-mobile){padding-inline-start:var(--df-spacing-6)}.df-sidenav .df-sidenav-button{align-items:center;border-radius:var(--df-borderRadius-main-medium);background-color:var(--df-color-inert-neutral-main-background);box-shadow:none;border:none;cursor:pointer;color:var(--df-color-neutral-alt-default-foreground);display:flex;font-weight:var(--df-typo-weight-regular);gap:var(--df-spacing-3);height:2.5rem;justify-content:start;margin-block-end:1px;padding-inline:var(--df-spacing-5);position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;user-select:none;width:100%}.df-sidenav .df-sidenav-button.df-sidenav-active{font-weight:var(--df-typo-weight-bold)}.df-sidenav .df-sidenav-button:focus-visible{z-index:1;outline:2px solid var(--df-color-focus-main-border);outline-offset:2px}.df-sidenav .df-sidenav-button.df-sidenav-breadcrumb-button{height:3rem}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:transform .3s}@media(prefers-reduced-motion:reduce){.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:none}}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-default-foreground);margin-inline-start:auto}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle.expanded{transform:rotate(180deg)}.df-sidenav .df-sidenav-button:hover{background-color:var(--df-color-primary-alt-hovered-background);color:var(--df-color-neutral-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:hover .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:active{background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button:active .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-button.df-sidenav-active-level{font-weight:var(--df-typo-weight-bold);background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button.df-sidenav-active-level:hover{background-color:var(--df-color-primary-alt-activeHovered-background)}.df-sidenav .df-sidenav-item-hidden{visibility:hidden;height:0;overflow:hidden}.df-sidenav .input-group.df-input-prepend .input-group-prepend{padding-inline-start:15px}\n"], dependencies: [{ kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: DfDrawer, selector: "df-drawer", inputs: ["className", "bodyScroll", "backdrop", "closeOnBackdropClick", "container", "size", "resizable", "visible", "keepInDom", "configuration", "position", "focusOnInit"], outputs: ["sizeChange", "visibleChange", "minimizedChange", "maximizedChange", "resizingChange", "minSize", "maxSize"] }, { kind: "component", type: DfIcon, selector: "df-icon" }, { kind: "component", type: DfIconButton, selector: "button[dfIconButton], a[dfIconButton]" }], encapsulation: i0.ViewEncapsulation.None }); }
1275
1373
  }
1276
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavComponent, decorators: [{
1374
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavComponent, decorators: [{
1277
1375
  type: Component,
1278
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'df-sidenav', template: `
1376
+ args: [{ selector: 'df-sidenav', template: `
1279
1377
  <df-drawer
1280
1378
  #drawer
1281
1379
  position="inline-start"
1282
1380
  [className]="isSmallScreen() ? 'df-sidenav-mobile-drawer' : ''"
1283
1381
  [visible]="!_isMinimized()"
1284
1382
  (visibleChange)="visibleChangeHandler($event)"
1285
- (minimizedChange)="_isMinimized.set($event)"
1383
+ (minimizedChange)="onMinimizedChange($event)"
1286
1384
  (resizingChange)="resizingChangeHandler($event)"
1287
1385
  [bodyScroll]="true"
1288
1386
  [backdrop]="backdrop()"
@@ -1291,84 +1389,314 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1291
1389
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1292
1390
  [resizable]="resizable() && !isSmallScreen()"
1293
1391
  [focusOnInit]="false"
1294
- [configuration]="isLargeUpScreen() ? 'inline' : 'overlay'"
1392
+ [configuration]="isLargeUpScreen() || (isMediumScreen() && !collapsible()) ? 'inline' : 'overlay'"
1295
1393
  >
1296
- <div class="h-100 w-100">
1297
- <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1298
- <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
1299
- @if (searchable()) {
1300
- @if (_isMinimized()) {
1301
- <button
1302
- class="btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search"
1303
- [class.df-sidenav-search-minimized]="!contentHasIcons()"
1304
- type="button"
1305
- (click)="focusSearch()"
1394
+ <nav class="df-sidenav-container">
1395
+ @if (searchable()) {
1396
+ <div class="df-sidenav-header" [class.df-sidenav-header-minimized]="_isMinimized()">
1397
+ @if (_isMinimized()) {
1398
+ <button
1399
+ dfIconButton
1400
+ appearance="outline"
1401
+ variant="neutral"
1402
+ class="df-sidenav-search-minimized fa-light fa-search"
1403
+ [class.df-sidenav-search-minimized-no-icons]="!contentHasIcons()"
1404
+ (click)="focusSearch()"
1405
+ i18n-aria-label="@@df.sidenav.search.ariaLabel"
1406
+ aria-label="Search"
1407
+ ></button>
1408
+ } @else {
1409
+ <div class="input-group">
1410
+ <div class="input-group-prepend">
1411
+ <df-icon class="input-group-text fa-light fa-search" />
1412
+ </div>
1413
+ <input
1414
+ type="search"
1415
+ class="form-control df-input-withicon"
1416
+ i18n-placeholder="@@df.sidenav.search.placeholder"
1417
+ placeholder="Search"
1306
1418
  i18n-aria-label="@@df.sidenav.search.ariaLabel"
1307
1419
  aria-label="Search"
1308
- ></button>
1309
- } @else {
1310
- <div class="input-group mb-3">
1311
- <div class="input-group-prepend">
1312
- <span class="input-group-text fa-light fa-search"></span>
1313
- </div>
1314
- <input
1315
- type="search"
1316
- class="form-control df-input-withicon"
1317
- i18n-placeholder="@@df.sidenav.search.placeholder"
1318
- placeholder="Search"
1319
- i18n-aria-label="@@df.sidenav.search.ariaLabel"
1320
- aria-label="Search"
1321
- [(ngModel)]="searchTerm"
1322
- #textInput
1323
- />
1324
- <div class="input-group-append">
1325
- <button
1326
- class="input-group-text fa-light fa-times"
1327
- [class.df-sidenav-search-empty]="searchTerm() === ''"
1328
- (click)="searchTerm.set(''); textInput.focus()"
1329
- >
1330
- <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1331
- </button>
1332
- </div>
1420
+ [formField]="searchTermFormField"
1421
+ #textInput
1422
+ />
1423
+ <div class="input-group-append">
1424
+ <button
1425
+ class="input-group-text fa-light fa-times"
1426
+ [class.df-sidenav-search-empty]="searchTerm() === ''"
1427
+ (click)="searchTerm.set(''); textInput.focus(); $event.preventDefault()"
1428
+ >
1429
+ <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1430
+ </button>
1333
1431
  </div>
1334
- }
1432
+ </div>
1335
1433
  }
1336
1434
  </div>
1435
+ }
1337
1436
 
1338
- <div role="list" class="sidenav-body flex-grow-1 overflow-y-auto" #scrollableContainer>
1339
- <ng-content />
1437
+ <div role="list" class="df-sidenav-body" #scrollableContainer>
1438
+ <ng-content />
1439
+ </div>
1440
+ @if (collapsible() && !isSmallScreen()) {
1441
+ <div class="df-sidenav-footer">
1442
+ <button
1443
+ dfIconButton
1444
+ class="df-sidenav-toggle-minimized"
1445
+ [class.fa-arrow-right-to-line]="isMinimized()"
1446
+ [class.fa-arrow-left-to-line]="!isMinimized()"
1447
+ appearance="outline"
1448
+ (click)="toggleMinimize()"
1449
+ i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1450
+ aria-label="Toggle minimized sidenav"
1451
+ ></button>
1340
1452
  </div>
1341
- @if (collapsible() && !isSmallScreen()) {
1342
- <div class="d-flex sidenav-footer flex-shrink-0 py-3">
1343
- <button
1344
- class="btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized"
1345
- (click)="toggleMinimize()"
1346
- i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1347
- aria-label="Toggle minimized sidenav"
1348
- >
1349
- @if (isMinimized()) {
1350
- <span class="fa-arrow-right-to-line"></span>
1351
- } @else {
1352
- <span class="fa-arrow-left-to-line"></span>
1353
- }
1354
- </button>
1355
- </div>
1356
- }
1357
- </nav>
1358
- </div>
1453
+ }
1454
+ </nav>
1359
1455
  </df-drawer>
1360
- `, imports: [FormsModule, DfDrawer], encapsulation: ViewEncapsulation.None, host: {
1456
+ `, imports: [FormField, DfDrawer, DfIcon, DfIconButton], encapsulation: ViewEncapsulation.None, host: {
1361
1457
  class: 'df-sidenav',
1362
1458
  '[class.df-sidenav-lg]': 'isLargeUpScreen()',
1363
1459
  '[class.df-sidenav-withicon]': 'contentHasIcons()',
1364
- '[class.d-none]': 'isSmallScreen() && _isMinimized()',
1365
- '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()'
1366
- }, styles: [".df-sidenav{position:relative;--sidenav-minWidth: 44px;width:var(--sidenav-minWidth)}.df-sidenav.df-sidenav-withicon{--sidenav-minWidth: 90px}.df-sidenav.df-sidenav-lg{width:auto}.df-sidenav.df-sidenav-lg .df-drawer{--df-drawer-size: max-content}.df-sidenav.df-sidenav-light-sky .sidenav-body{scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-primary-subtle-background)}.df-sidenav.df-sidenav-light-sky .df-drawer,.df-sidenav.df-sidenav-light-sky .df-sidenav-button{background-color:var(--df-color-primary-subtle-background)}.df-sidenav .df-sidenav-search-empty{visibility:hidden}.df-sidenav .df-sidenav-mobile-drawer{top:var(--df-navbar-height, 56px)!important;height:calc(100vh - var(--df-navbar-height, 56px))!important}.df-sidenav nav{border-inline-end:1px solid var(--df-color-inert-neutral-main-border)}.df-sidenav.df-sidenav-drawer .df-drawer{z-index:2010}.df-sidenav .df-drawer{background-color:var(--df-color-inert-neutral-main-background);height:100%;--df-drawer-size: 0;--df-drawer-min-size: var(--sidenav-minWidth);--df-drawer-max-size: max-content;z-index:10;transition:none}.df-sidenav .df-drawer.df-inline-start{border:none}.df-sidenav .df-drawer.df-collapse-show{--df-drawer-size: max-content}.df-sidenav .df-drawer.df-collapse-hide{display:block}.df-sidenav .df-drawer.df-collapse-collapsing.df-collapse-horizontal{transition:none}.df-sidenav .df-sidenav-active{font-weight:var(--df-typo-weight-bold)}.df-sidenav .sidenav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.df-sidenav .sidenav-label:before{content:attr(title);font-weight:var(--df-typo-weight-bold);visibility:hidden;height:0;overflow:hidden;display:block}.df-sidenav .df-sidenav-mobile-header{padding-block-end:var(--df-spacing-2);border-block-end:1px solid var(--df-color-neutral-alt-default-border);font-weight:var(--df-typo-weight-regular)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-active .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .sidenav-body{padding:var(--df-spacing-2);scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-inert-neutral-main-background)}.df-sidenav .df-sidenav-search-minimized,.df-sidenav .df-sidenav-toggle-minimized{min-width:36px;position:relative;z-index:1}.df-sidenav .df-sidenav-header{padding-inline:var(--df-spacing-2);overflow:visible;position:relative}.df-sidenav .df-sidenav-header.df-sidenav-header-minimized{padding-inline:0}.df-sidenav .sidenav-footer{overflow:visible;position:relative}.df-sidenav [role=list] [role=listitem]{padding-inline-start:0}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile){padding-inline-start:var(--df-spacing-6);position:relative}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile):before{content:\"\";position:absolute;left:var(--df-spacing-5);top:0;bottom:0;width:1px;background-color:var(--df-color-neutral-soft-default-background)}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.mobile) [role=listitem]:not(.mobile){padding-inline-start:var(--df-spacing-6)}.df-sidenav .df-drawer-splitter{position:absolute;inset-block:0;inset-inline-end:-4px;width:1rem;cursor:ew-resize;background:transparent;display:flex;align-items:center;justify-content:center;touch-action:none}.df-sidenav .df-drawer-splitter .df-drawer-splitter-handle{--df-btn-bg: transparent;flex-shrink:0;transform:translate(40%);border:none;cursor:ew-resize}.df-sidenav .df-sidenav-button{--df-box-shadow-color: var(--df-color-focus-main-border);--df-btn-font-weight: var(--df-typo-weight-regular);background-color:var(--df-color-inert-neutral-main-background);padding-inline:var(--df-spacing-5);margin-block-end:1px;height:40px;border:none;position:relative}.df-sidenav .df-sidenav-button:focus-visible{z-index:1}.df-sidenav .df-sidenav-button.df-sidenav-breadcrumb-button{height:3rem}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:transform .3s;color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle.expanded{transform:rotate(180deg)}.df-sidenav .df-sidenav-button:hover{background-color:var(--df-color-primary-alt-hovered-background)}.df-sidenav .df-sidenav-button:hover .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:active{background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button:active .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-button.df-sidenav-active-level{font-weight:var(--df-typo-weight-bold);background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button.df-sidenav-active-level:hover{background-color:var(--df-color-primary-alt-activeHovered-background)}.df-sidenav .df-sidenav-item-hidden{visibility:hidden;height:0}.df-sidenav .input-group.df-input-prepend .input-group-prepend{padding-inline-start:15px}\n"] }]
1460
+ '[class.df-hidden]': '!isLargeUpScreen() && _isMinimized()',
1461
+ '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()',
1462
+ '[class.df-sidenav-minimized]': 'isMinimized()'
1463
+ }, styles: [".df-sidenav{position:relative;--sidenav-minWidth: 44px;width:var(--sidenav-minWidth)}.df-sidenav.df-sidenav-withicon{--sidenav-minWidth: 80px}.df-sidenav.df-sidenav-lg{width:auto}.df-sidenav.df-sidenav-lg .df-drawer{--df-drawer-size: max-content}.df-sidenav.df-sidenav-light-sky .df-sidenav-body{scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-primary-subtle-background)}.df-sidenav.df-sidenav-light-sky .df-drawer,.df-sidenav.df-sidenav-light-sky .df-sidenav-button{background-color:var(--df-color-primary-subtle-background)}.df-sidenav .df-sidenav-search-empty{visibility:hidden}.df-sidenav .df-sidenav-mobile-drawer{top:var(--df-navbar-height, 56px)!important;height:calc(100vh - var(--df-navbar-height, 56px))!important}.df-sidenav nav{border-inline-end:1px solid var(--df-color-inert-neutral-main-border)}.df-sidenav.df-sidenav-drawer .df-drawer{z-index:2010}.df-sidenav .df-sidenav-container{display:flex;flex-direction:column;height:100%;padding:var(--df-spacing-5);padding-block-end:var(--df-spacing-3)}.df-sidenav .df-sidenav-link-content-mobile{display:flex;flex-direction:column;align-items:flex-start}.df-sidenav .df-sidenav-link-content-mobile .df-sidenav-breadcrumb{color:var(--df-color-subtext-foreground);display:flex;gap:var(--df-spacing-1)}.df-sidenav .df-drawer{background-color:var(--df-color-inert-neutral-main-background);height:100%;--df-drawer-size: 0;--df-drawer-min-size: var(--sidenav-minWidth);--df-drawer-max-size: max-content;z-index:10;transition:none}.df-sidenav .df-drawer.df-inline-start{border:none}.df-sidenav .df-drawer.df-collapse-show{--df-drawer-size: max-content}.df-sidenav .df-drawer.df-collapse-hide{display:block}.df-sidenav .df-drawer.df-collapse-collapsing.df-collapse-horizontal{transition:none}.df-sidenav .df-sidenav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.df-sidenav .df-sidenav-label:before{content:attr(title);font-weight:var(--df-typo-weight-bold);visibility:hidden;height:0;overflow:hidden;display:block}.df-sidenav .df-sidenav-mobile-header{padding-block-end:var(--df-spacing-2);border-block-end:1px solid var(--df-color-neutral-alt-default-border);margin-block-end:var(--df-spacing-2);font-weight:var(--df-typo-weight-regular)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-button{gap:0}.df-sidenav .df-sidenav-mobile-header .df-sidenav-mobile-header-back-arrow{margin-inline-end:var(--df-spacing-4);color:var(--df-color-primary-alt-default-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-active .df-sidenav-mobile-header-back-arrow{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-mobile-header .df-sidenav-label{margin-inline-start:var(--df-spacing-3)}.df-sidenav.df-sidenav-minimized .df-sidenav-button{width:3rem}.df-sidenav.df-sidenav-minimized .df-sidenav-body{padding:0;overflow:visible}.df-sidenav .df-sidenav-body{padding:var(--df-spacing-2);scrollbar-color:var(--df-color-primary-soft-default-foreground) var(--df-color-inert-neutral-main-background);flex-grow:1;overflow-y:auto}.df-sidenav .df-sidenav-search-minimized{width:100%}.df-sidenav .df-sidenav-search-minimized-no-icons,.df-sidenav .df-sidenav-toggle-minimized{min-width:36px;position:relative;z-index:1}.df-sidenav .df-sidenav-header{margin-block-end:var(--df-spacing-3);overflow:visible;padding-inline:var(--df-spacing-2);position:relative}.df-sidenav .df-sidenav-header .input-group{flex-wrap:nowrap}.df-sidenav .df-sidenav-header.df-sidenav-header-minimized{padding-inline:0}.df-sidenav .df-sidenav-footer{overflow:visible;position:relative;padding-block:var(--df-spacing-3)}.df-sidenav [role=list] [role=listitem]{padding-inline-start:0}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile){padding-inline-start:var(--df-spacing-6);position:relative}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile):before{content:\"\";position:absolute;inset-inline-start:var(--df-spacing-5);top:0;bottom:0;width:1px;background-color:var(--df-color-neutral-soft-default-background)}.df-sidenav [role=list] [role=listitem] [role=listitem]:not(.df-sidenav-mobile) [role=listitem]:not(.df-sidenav-mobile){padding-inline-start:var(--df-spacing-6)}.df-sidenav .df-sidenav-button{align-items:center;border-radius:var(--df-borderRadius-main-medium);background-color:var(--df-color-inert-neutral-main-background);box-shadow:none;border:none;cursor:pointer;color:var(--df-color-neutral-alt-default-foreground);display:flex;font-weight:var(--df-typo-weight-regular);gap:var(--df-spacing-3);height:2.5rem;justify-content:start;margin-block-end:1px;padding-inline:var(--df-spacing-5);position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;user-select:none;width:100%}.df-sidenav .df-sidenav-button.df-sidenav-active{font-weight:var(--df-typo-weight-bold)}.df-sidenav .df-sidenav-button:focus-visible{z-index:1;outline:2px solid var(--df-color-focus-main-border);outline-offset:2px}.df-sidenav .df-sidenav-button.df-sidenav-breadcrumb-button{height:3rem}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:transform .3s}@media(prefers-reduced-motion:reduce){.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{transition:none}}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-default-foreground);margin-inline-start:auto}.df-sidenav .df-sidenav-button .df-sidenav-collapse-toggle.expanded{transform:rotate(180deg)}.df-sidenav .df-sidenav-button:hover{background-color:var(--df-color-primary-alt-hovered-background);color:var(--df-color-neutral-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:hover .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-hovered-foreground)}.df-sidenav .df-sidenav-button:active{background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button:active .df-sidenav-collapse-toggle{color:var(--df-color-primary-alt-active-foreground)}.df-sidenav .df-sidenav-button.df-sidenav-active-level{font-weight:var(--df-typo-weight-bold);background-color:var(--df-color-primary-alt-active-background)}.df-sidenav .df-sidenav-button.df-sidenav-active-level:hover{background-color:var(--df-color-primary-alt-activeHovered-background)}.df-sidenav .df-sidenav-item-hidden{visibility:hidden;height:0;overflow:hidden}.df-sidenav .input-group.df-input-prepend .input-group-prepend{padding-inline-start:15px}\n"] }]
1367
1464
  }], ctorParameters: () => [], propDecorators: { searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], enableMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableMobile", required: false }] }], disableInitialDesktopAutoScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableInitialDesktopAutoScroll", required: false }] }], scrollableContainer: [{ type: i0.ViewChild, args: ['scrollableContainer', { isSignal: true }] }], searchInput: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], allLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavLinkComponent), { ...{ descendants: true }, isSignal: true }] }], allItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DfSidenavItemComponent), { ...{ descendants: true }, isSignal: true }] }] } });
1368
1465
 
1466
+ // Warning: I am deeply sorry for the pyramid of doom that is the nested for loops in the template, but I could not find a better way to render the nested sidenav items and keep sidenav items contentChild queries working.
1467
+ /**
1468
+ * A wrapper of the {@link DfSidenavComponent} driven by a data array provided as an input.
1469
+ * All inputs are forwarded to the underlying {@link DfSidenavComponent}.
1470
+ *
1471
+ * @since 22.0
1472
+ */
1473
+ class DfSidenavInput {
1474
+ constructor() {
1475
+ /**
1476
+ * Navigation items to render in the sidenav.
1477
+ */
1478
+ this.items = input([], /* @ts-ignore */
1479
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1480
+ /**
1481
+ * Class name applied to the underlying {@link DfSidenavComponent} host element.
1482
+ * @default ''
1483
+ */
1484
+ this.className = input('', /* @ts-ignore */
1485
+ ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
1486
+ /**
1487
+ * Flag whether the sidenav includes a search input.
1488
+ * @default false
1489
+ */
1490
+ this.searchable = input(false, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1491
+ /**
1492
+ * Flag whether the sidenav should be resizable.
1493
+ * @default false
1494
+ */
1495
+ this.resizable = input(false, { ...(ngDevMode ? { debugName: "resizable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1496
+ /**
1497
+ * Flag whether the sidenav should have the collapse button.
1498
+ * @default true
1499
+ */
1500
+ this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1501
+ /**
1502
+ * Flag to enable the mobile sidenav display of the items.
1503
+ * @default true
1504
+ */
1505
+ this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1506
+ /**
1507
+ * Flag to disable the automatic scroll to active link on desktop when the sidenav is initialized.
1508
+ * @default false
1509
+ */
1510
+ this.disableInitialDesktopAutoScroll = input(false, { ...(ngDevMode ? { debugName: "disableInitialDesktopAutoScroll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1511
+ this._sidenav = viewChild.required(DfSidenavComponent);
1512
+ /**
1513
+ * Whether the sidenav is currently minimized.
1514
+ */
1515
+ this.isMinimized = computed(() => this._sidenav().isMinimized() ?? false, /* @ts-ignore */
1516
+ ...(ngDevMode ? [{ debugName: "isMinimized" }] : /* istanbul ignore next */ []));
1517
+ }
1518
+ /**
1519
+ * Toggle or set the minimized state of the sidenav.
1520
+ */
1521
+ toggleMinimize(minimized) {
1522
+ this._sidenav().toggleMinimize(minimized);
1523
+ }
1524
+ isSideItem(item) {
1525
+ return 'children' in item;
1526
+ }
1527
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavInput, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1528
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DfSidenavInput, isStandalone: true, selector: "df-sidenav-input", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, enableMobile: { classPropertyName: "enableMobile", publicName: "enableMobile", isSignal: true, isRequired: false, transformFunction: null }, disableInitialDesktopAutoScroll: { classPropertyName: "disableInitialDesktopAutoScroll", publicName: "disableInitialDesktopAutoScroll", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_sidenav", first: true, predicate: DfSidenavComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
1529
+ <df-sidenav
1530
+ [class]="className()"
1531
+ [searchable]="searchable()"
1532
+ [resizable]="resizable()"
1533
+ [collapsible]="collapsible()"
1534
+ [enableMobile]="enableMobile()"
1535
+ [disableInitialDesktopAutoScroll]="disableInitialDesktopAutoScroll()"
1536
+ >
1537
+ @for (element1 of items(); track element1.label) {
1538
+ @if (isSideItem(element1)) {
1539
+ <df-sidenav-item
1540
+ [label]="element1.label"
1541
+ [icon]="element1.icon || ''"
1542
+ [collapsed]="element1.collapsed ?? false"
1543
+ (collapsedChange)="element1.collapsed = $event"
1544
+ >
1545
+ @for (element2 of element1.children; track element2.label) {
1546
+ @if (isSideItem(element2)) {
1547
+ <df-sidenav-item
1548
+ [label]="element2.label"
1549
+ [icon]="element2.icon || ''"
1550
+ [collapsed]="element2.collapsed ?? false"
1551
+ (collapsedChange)="element2.collapsed = $event"
1552
+ >
1553
+ @for (element3 of element2.children; track element3.label) {
1554
+ @if (isSideItem(element3)) {
1555
+ <df-sidenav-item
1556
+ [label]="element3.label"
1557
+ [icon]="element3.icon || ''"
1558
+ [collapsed]="element3.collapsed ?? false"
1559
+ (collapsedChange)="element3.collapsed = $event"
1560
+ >
1561
+ @for (element4 of element3.children; track element4.label) {
1562
+ @if (!isSideItem(element4)) {
1563
+ <df-sidenav-link
1564
+ [label]="element4.label"
1565
+ [icon]="element4.icon || ''"
1566
+ [linkPath]="element4.linkPath"
1567
+ [active]="element4.active"
1568
+ [routerLinkActiveOptions]="element4.routerLinkActiveOptions || { exact: false }"
1569
+ />
1570
+ }
1571
+ }
1572
+ </df-sidenav-item>
1573
+ } @else {
1574
+ <df-sidenav-link
1575
+ [label]="element3.label"
1576
+ [icon]="element3.icon || ''"
1577
+ [linkPath]="element3.linkPath"
1578
+ [active]="element3.active"
1579
+ [routerLinkActiveOptions]="element3.routerLinkActiveOptions || { exact: false }"
1580
+ />
1581
+ }
1582
+ }
1583
+ </df-sidenav-item>
1584
+ } @else {
1585
+ <df-sidenav-link
1586
+ [label]="element2.label"
1587
+ [icon]="element2.icon || ''"
1588
+ [linkPath]="element2.linkPath"
1589
+ [active]="element2.active"
1590
+ [routerLinkActiveOptions]="element2.routerLinkActiveOptions || { exact: false }"
1591
+ />
1592
+ }
1593
+ }
1594
+ </df-sidenav-item>
1595
+ } @else {
1596
+ <df-sidenav-link
1597
+ [label]="element1.label"
1598
+ [icon]="element1.icon || ''"
1599
+ [linkPath]="element1.linkPath"
1600
+ [active]="element1.active"
1601
+ [routerLinkActiveOptions]="element1.routerLinkActiveOptions || { exact: false }"
1602
+ />
1603
+ }
1604
+ }
1605
+ </df-sidenav>
1606
+ `, isInline: true, dependencies: [{ kind: "component", type: DfSidenavComponent, selector: "df-sidenav", inputs: ["searchable", "resizable", "collapsible", "enableMobile", "disableInitialDesktopAutoScroll"] }, { kind: "component", type: DfSidenavItemComponent, selector: "df-sidenav-item", inputs: ["label", "collapsed", "icon"], outputs: ["collapsedChange"] }, { kind: "component", type: DfSidenavLinkComponent, selector: "df-sidenav-link", inputs: ["linkPath", "label", "icon", "routerLinkActiveOptions", "active"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1607
+ }
1608
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DfSidenavInput, decorators: [{
1609
+ type: Component,
1610
+ args: [{
1611
+ selector: 'df-sidenav-input',
1612
+ changeDetection: ChangeDetectionStrategy.OnPush,
1613
+ encapsulation: ViewEncapsulation.None,
1614
+ imports: [DfSidenavComponent, DfSidenavItemComponent, DfSidenavLinkComponent],
1615
+ template: `
1616
+ <df-sidenav
1617
+ [class]="className()"
1618
+ [searchable]="searchable()"
1619
+ [resizable]="resizable()"
1620
+ [collapsible]="collapsible()"
1621
+ [enableMobile]="enableMobile()"
1622
+ [disableInitialDesktopAutoScroll]="disableInitialDesktopAutoScroll()"
1623
+ >
1624
+ @for (element1 of items(); track element1.label) {
1625
+ @if (isSideItem(element1)) {
1626
+ <df-sidenav-item
1627
+ [label]="element1.label"
1628
+ [icon]="element1.icon || ''"
1629
+ [collapsed]="element1.collapsed ?? false"
1630
+ (collapsedChange)="element1.collapsed = $event"
1631
+ >
1632
+ @for (element2 of element1.children; track element2.label) {
1633
+ @if (isSideItem(element2)) {
1634
+ <df-sidenav-item
1635
+ [label]="element2.label"
1636
+ [icon]="element2.icon || ''"
1637
+ [collapsed]="element2.collapsed ?? false"
1638
+ (collapsedChange)="element2.collapsed = $event"
1639
+ >
1640
+ @for (element3 of element2.children; track element3.label) {
1641
+ @if (isSideItem(element3)) {
1642
+ <df-sidenav-item
1643
+ [label]="element3.label"
1644
+ [icon]="element3.icon || ''"
1645
+ [collapsed]="element3.collapsed ?? false"
1646
+ (collapsedChange)="element3.collapsed = $event"
1647
+ >
1648
+ @for (element4 of element3.children; track element4.label) {
1649
+ @if (!isSideItem(element4)) {
1650
+ <df-sidenav-link
1651
+ [label]="element4.label"
1652
+ [icon]="element4.icon || ''"
1653
+ [linkPath]="element4.linkPath"
1654
+ [active]="element4.active"
1655
+ [routerLinkActiveOptions]="element4.routerLinkActiveOptions || { exact: false }"
1656
+ />
1657
+ }
1658
+ }
1659
+ </df-sidenav-item>
1660
+ } @else {
1661
+ <df-sidenav-link
1662
+ [label]="element3.label"
1663
+ [icon]="element3.icon || ''"
1664
+ [linkPath]="element3.linkPath"
1665
+ [active]="element3.active"
1666
+ [routerLinkActiveOptions]="element3.routerLinkActiveOptions || { exact: false }"
1667
+ />
1668
+ }
1669
+ }
1670
+ </df-sidenav-item>
1671
+ } @else {
1672
+ <df-sidenav-link
1673
+ [label]="element2.label"
1674
+ [icon]="element2.icon || ''"
1675
+ [linkPath]="element2.linkPath"
1676
+ [active]="element2.active"
1677
+ [routerLinkActiveOptions]="element2.routerLinkActiveOptions || { exact: false }"
1678
+ />
1679
+ }
1680
+ }
1681
+ </df-sidenav-item>
1682
+ } @else {
1683
+ <df-sidenav-link
1684
+ [label]="element1.label"
1685
+ [icon]="element1.icon || ''"
1686
+ [linkPath]="element1.linkPath"
1687
+ [active]="element1.active"
1688
+ [routerLinkActiveOptions]="element1.routerLinkActiveOptions || { exact: false }"
1689
+ />
1690
+ }
1691
+ }
1692
+ </df-sidenav>
1693
+ `
1694
+ }]
1695
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], enableMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableMobile", required: false }] }], disableInitialDesktopAutoScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableInitialDesktopAutoScroll", required: false }] }], _sidenav: [{ type: i0.ViewChild, args: [i0.forwardRef(() => DfSidenavComponent), { isSignal: true }] }] } });
1696
+
1369
1697
  /**
1370
1698
  * Generated bundle index. Do not edit.
1371
1699
  */
1372
1700
 
1373
- export { DfSidenavComponent, DfSidenavIconDirective, DfSidenavItemComponent, DfSidenavLinkComponent };
1701
+ export { DfSidenavComponent, DfSidenavIconDirective, DfSidenavInput, DfSidenavItemComponent, DfSidenavLinkComponent };
1374
1702
  //# sourceMappingURL=design-factory-angular-sidenav.mjs.map