@design-factory/angular 21.1.0 → 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 +64 -62
  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 +652 -401
  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 +29 -19
  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 +589 -589
  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 +10 -16
  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 +98 -14
  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 +35 -47
  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, linkedSignal, viewChild, contentChildren, booleanAttribute, ElementRef, PLATFORM_ID, signal, 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,41 +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 */ []));
433
411
  /**
434
412
  * Explicitly sets the active state of the link. When provided, the link behaves
435
413
  * as an external link (plain `<a href>`) and the Angular Router is not used.
436
414
  * When `undefined` (default), the active state is determined by the Angular Router.
437
415
  */
438
- this.active = input(...(ngDevMode ? [undefined, { debugName: "active" }] : []));
416
+ this.active = input(/* @ts-ignore */
417
+ ...(ngDevMode ? [undefined, { debugName: "active" }] : /* istanbul ignore next */ []));
439
418
  /**
440
419
  * Reflects the current active state of the link.
441
420
  * Driven by the `active` input when provided, otherwise updated by the router via `(isActiveChange)`.
442
421
  */
443
- this.isActiveLink = linkedSignal(() => this.active() ?? false, ...(ngDevMode ? [{ debugName: "isActiveLink" }] : []));
422
+ this.isActiveLink = linkedSignal(() => this.active() ?? false, /* @ts-ignore */
423
+ ...(ngDevMode ? [{ debugName: "isActiveLink" }] : /* istanbul ignore next */ []));
444
424
  /**
445
425
  * Options to determine when the router link is considered active
446
426
  */
447
- this.routerLinkActiveOptions = input({ exact: false }, ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : []));
427
+ this.routerLinkActiveOptions = input({ exact: false }, /* @ts-ignore */
428
+ ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : /* istanbul ignore next */ []));
448
429
  this.sidenav = inject(DfSidenavComponent);
449
430
  this.parentItem = inject(DfSidenavItemComponent, {
450
431
  optional: true,
451
432
  skipSelf: true
452
433
  });
453
434
  this.isFirstLevel = this.parentItem === null;
454
- this.iconContent = contentChild('dfSidenavIcon', ...(ngDevMode ? [{ debugName: "iconContent" }] : []));
435
+ this.iconContent = contentChild('dfSidenavIcon', /* @ts-ignore */
436
+ ...(ngDevMode ? [{ debugName: "iconContent" }] : /* istanbul ignore next */ []));
455
437
  /**
456
438
  * Computed signal indicating if the link is visible based on search term
457
439
  */
@@ -461,7 +443,8 @@ class DfSidenavLinkBaseComponent {
461
443
  return true;
462
444
  }
463
445
  return this.label().toLowerCase().includes(search);
464
- }, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
446
+ }, /* @ts-ignore */
447
+ ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
465
448
  }
466
449
  toggleSidenavOnSmallScreen() {
467
450
  if (this.sidenav['isSmallScreen']()) {
@@ -469,10 +452,10 @@ class DfSidenavLinkBaseComponent {
469
452
  }
470
453
  return true;
471
454
  }
472
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
473
- 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 }, 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 }); }
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 }); }
474
457
  }
475
- 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: [{
476
459
  type: Directive
477
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 }] }] } });
478
461
 
@@ -485,14 +468,12 @@ class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {
485
468
  super(...arguments);
486
469
  this.anchor = viewChild.required('anchor');
487
470
  }
488
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkDesktopComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
489
- 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: `
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: `
490
473
  @if (active() !== undefined) {
491
474
  <a
492
- class="btn df-sidenav-button d-flex gap-3"
493
- [class.w-100]="!sidenav.isMinimized()"
475
+ class="df-sidenav-button"
494
476
  [class.df-sidenav-active-level]="active()"
495
- [class.justify-content-start]="!sidenav.isMinimized()"
496
477
  [href]="linkPath()"
497
478
  target="_blank"
498
479
  [attr.aria-label]="label()"
@@ -504,13 +485,11 @@ class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {
504
485
  </a>
505
486
  } @else {
506
487
  <a
507
- class="btn df-sidenav-button d-flex gap-3"
508
- [class.w-100]="!sidenav.isMinimized()"
488
+ class="df-sidenav-button"
509
489
  routerLinkActive="df-sidenav-active-level"
510
490
  ariaCurrentWhenActive="page"
511
491
  (isActiveChange)="isActiveLink.set($event)"
512
492
  [routerLink]="linkPath()"
513
- [class.justify-content-start]="!sidenav.isMinimized()"
514
493
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
515
494
  [attr.aria-label]="label()"
516
495
  (click)="toggleSidenavOnSmallScreen()"
@@ -522,26 +501,23 @@ class DfSidenavLinkDesktopComponent extends DfSidenavLinkBaseComponent {
522
501
  <ng-template #content>
523
502
  <ng-content select="[dfSidenavIcon]" />
524
503
  @if (icon()) {
525
- <span class="{{ icon() }}"></span>
504
+ <df-icon class="{{ icon() }}" />
526
505
  }
527
506
  @if (!sidenav.isMinimized()) {
528
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
507
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
529
508
  }
530
509
  </ng-template>
531
- `, 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" }] }); }
532
511
  }
533
- 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: [{
534
513
  type: Component,
535
514
  args: [{
536
- changeDetection: ChangeDetectionStrategy.OnPush,
537
515
  selector: 'df-sidenav-link-desktop',
538
516
  template: `
539
517
  @if (active() !== undefined) {
540
518
  <a
541
- class="btn df-sidenav-button d-flex gap-3"
542
- [class.w-100]="!sidenav.isMinimized()"
519
+ class="df-sidenav-button"
543
520
  [class.df-sidenav-active-level]="active()"
544
- [class.justify-content-start]="!sidenav.isMinimized()"
545
521
  [href]="linkPath()"
546
522
  target="_blank"
547
523
  [attr.aria-label]="label()"
@@ -553,13 +529,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
553
529
  </a>
554
530
  } @else {
555
531
  <a
556
- class="btn df-sidenav-button d-flex gap-3"
557
- [class.w-100]="!sidenav.isMinimized()"
532
+ class="df-sidenav-button"
558
533
  routerLinkActive="df-sidenav-active-level"
559
534
  ariaCurrentWhenActive="page"
560
535
  (isActiveChange)="isActiveLink.set($event)"
561
536
  [routerLink]="linkPath()"
562
- [class.justify-content-start]="!sidenav.isMinimized()"
563
537
  [routerLinkActiveOptions]="routerLinkActiveOptions()"
564
538
  [attr.aria-label]="label()"
565
539
  (click)="toggleSidenavOnSmallScreen()"
@@ -571,18 +545,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
571
545
  <ng-template #content>
572
546
  <ng-content select="[dfSidenavIcon]" />
573
547
  @if (icon()) {
574
- <span class="{{ icon() }}"></span>
548
+ <df-icon class="{{ icon() }}" />
575
549
  }
576
550
  @if (!sidenav.isMinimized()) {
577
- <span class="sidenav-label" [title]="label()">{{ label() }}</span>
551
+ <span class="df-sidenav-label" [title]="label()">{{ label() }}</span>
578
552
  }
579
553
  </ng-template>
580
554
  `,
581
555
  host: {
582
- '[class.d-none]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
583
- class: 'd-flex'
556
+ '[class.df-hidden]': '!isVisible() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))'
584
557
  },
585
- imports: [RouterLink, RouterLinkActive, NgTemplateOutlet]
558
+ imports: [RouterLink, RouterLinkActive, NgTemplateOutlet, DfIcon]
586
559
  }]
587
560
  }], propDecorators: { anchor: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }] } });
588
561
 
@@ -595,8 +568,10 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
595
568
  super(...arguments);
596
569
  // Inject link wrapper to get parent wrapper reference
597
570
  this.linkWrapper = inject(DfSidenavLinkComponent);
598
- this.currentMobilePanel = computed(() => this.sidenav['currentMobilePanel']() ?? null, ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : []));
599
- 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 */ []));
600
575
  this.isVisibleInList = computed(() => {
601
576
  const currentPanel = this.currentMobilePanel();
602
577
  const parentWrapper = this.linkWrapper['parentWrapper'];
@@ -613,7 +588,8 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
613
588
  // Show links whose parent item wrapper matches the current panel
614
589
  return parentWrapper === currentPanel && this.isVisible();
615
590
  }
616
- }, ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : []));
591
+ }, /* @ts-ignore */
592
+ ...(ngDevMode ? [{ debugName: "isVisibleInList" }] : /* istanbul ignore next */ []));
617
593
  // Build breadcrumb path for mobile search view
618
594
  this.breadcrumbPath = computed(() => {
619
595
  const path = [];
@@ -625,13 +601,14 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
625
601
  currentItem = grandParent || null;
626
602
  }
627
603
  return path;
628
- }, ...(ngDevMode ? [{ debugName: "breadcrumbPath" }] : []));
604
+ }, /* @ts-ignore */
605
+ ...(ngDevMode ? [{ debugName: "breadcrumbPath" }] : /* istanbul ignore next */ []));
629
606
  }
630
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkMobileComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
631
- 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: `
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: `
632
609
  @if (active() !== undefined) {
633
610
  <a
634
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
611
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
635
612
  [class.df-sidenav-active-level]="active()"
636
613
  [href]="linkPath()"
637
614
  target="_blank"
@@ -642,7 +619,7 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
642
619
  </a>
643
620
  } @else {
644
621
  <a
645
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
622
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
646
623
  routerLinkActive="df-sidenav-active-level"
647
624
  ariaCurrentWhenActive="page"
648
625
  (isActiveChange)="isActiveLink.set($event)"
@@ -654,37 +631,36 @@ class DfSidenavLinkMobileComponent extends DfSidenavLinkBaseComponent {
654
631
  </a>
655
632
  }
656
633
  <ng-template #content>
657
- <div class="d-flex gap-3 w-100">
658
- <ng-content select="[dfSidenavIcon]" />
659
- @if (icon()) {
660
- <span class="{{ icon() }}"></span>
661
- }
662
- <div class="d-flex flex-column align-items-start">
663
- <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>
664
641
  @if (isSearching() && breadcrumbPath().length > 0) {
665
- <small class="d-flex align-items-center gap-1" [class.text-muted]="!active()">
642
+ <small class="df-sidenav-breadcrumb">
666
643
  @for (item of breadcrumbPath(); track $index) {
667
644
  <span>{{ item }}</span>
668
645
  @if (!$last) {
669
- <span class="fa-arrow-right"></span>
646
+ <df-icon class="fa-arrow-right" />
670
647
  }
671
648
  }
672
649
  </small>
673
650
  }
674
651
  </div>
675
- </div>
652
+ }
676
653
  </ng-template>
677
- `, 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" }] }); }
678
655
  }
679
- 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: [{
680
657
  type: Component,
681
658
  args: [{
682
- changeDetection: ChangeDetectionStrategy.OnPush,
683
659
  selector: 'df-sidenav-link-mobile',
684
660
  template: `
685
661
  @if (active() !== undefined) {
686
662
  <a
687
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
663
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
688
664
  [class.df-sidenav-active-level]="active()"
689
665
  [href]="linkPath()"
690
666
  target="_blank"
@@ -695,7 +671,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
695
671
  </a>
696
672
  } @else {
697
673
  <a
698
- class="btn df-sidenav-button d-flex gap-3 justify-content-start w-100 df-sidenav-breadcrumb-button"
674
+ class="df-sidenav-button df-sidenav-breadcrumb-button"
699
675
  routerLinkActive="df-sidenav-active-level"
700
676
  ariaCurrentWhenActive="page"
701
677
  (isActiveChange)="isActiveLink.set($event)"
@@ -707,32 +683,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
707
683
  </a>
708
684
  }
709
685
  <ng-template #content>
710
- <div class="d-flex gap-3 w-100">
711
- <ng-content select="[dfSidenavIcon]" />
712
- @if (icon()) {
713
- <span class="{{ icon() }}"></span>
714
- }
715
- <div class="d-flex flex-column align-items-start">
716
- <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>
717
693
  @if (isSearching() && breadcrumbPath().length > 0) {
718
- <small class="d-flex align-items-center gap-1" [class.text-muted]="!active()">
694
+ <small class="df-sidenav-breadcrumb">
719
695
  @for (item of breadcrumbPath(); track $index) {
720
696
  <span>{{ item }}</span>
721
697
  @if (!$last) {
722
- <span class="fa-arrow-right"></span>
698
+ <df-icon class="fa-arrow-right" />
723
699
  }
724
700
  }
725
701
  </small>
726
702
  }
727
703
  </div>
728
- </div>
704
+ }
729
705
  </ng-template>
730
706
  `,
731
707
  host: {
732
- '[class.d-none]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
733
- class: 'd-flex'
708
+ '[class.df-hidden]': '!isVisibleInList() || (sidenav.isMinimized() && (!isFirstLevel || !wrapperHasIconContent()))',
709
+ style: 'display: flex;'
734
710
  },
735
- imports: [RouterLink, RouterLinkActive, NgTemplateOutlet]
711
+ imports: [RouterLink, RouterLinkActive, NgTemplateOutlet, DfIcon]
736
712
  }]
737
713
  }] });
738
714
 
@@ -743,10 +719,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
743
719
  * @since 21.0.0
744
720
  */
745
721
  class DfSidenavIconDirective {
746
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
747
- 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 }); }
748
724
  }
749
- 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: [{
750
726
  type: Directive,
751
727
  args: [{
752
728
  selector: '[dfSidenavIcon]'
@@ -762,25 +738,30 @@ class DfSidenavLinkComponent {
762
738
  /**
763
739
  * The router link path for to the link
764
740
  */
765
- this.linkPath = input.required(...(ngDevMode ? [{ debugName: "linkPath" }] : []));
741
+ this.linkPath = input.required(/* @ts-ignore */
742
+ ...(ngDevMode ? [{ debugName: "linkPath" }] : /* istanbul ignore next */ []));
766
743
  /**
767
744
  * The label of the link
768
745
  */
769
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
746
+ this.label = input.required(/* @ts-ignore */
747
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
770
748
  /**
771
749
  * The icon class name or inline content (e.g., font awesome class)
772
750
  */
773
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
751
+ this.icon = input('', /* @ts-ignore */
752
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
774
753
  /**
775
754
  * Options to determine when the router link is considered active
776
755
  */
777
- this.routerLinkActiveOptions = input({ exact: false }, ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : []));
756
+ this.routerLinkActiveOptions = input({ exact: false }, /* @ts-ignore */
757
+ ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : /* istanbul ignore next */ []));
778
758
  /**
779
759
  * Explicitly sets the active state of the link. When provided, the link renders as
780
760
  * a plain `<a href>` (no Angular Router). When `undefined` (default), the Angular Router determines
781
761
  * the active state.
782
762
  */
783
- this.active = input(...(ngDevMode ? [undefined, { debugName: "active" }] : []));
763
+ this.active = input(/* @ts-ignore */
764
+ ...(ngDevMode ? [undefined, { debugName: "active" }] : /* istanbul ignore next */ []));
784
765
  /**
785
766
  * The parent wrapper item component (if any)
786
767
  */
@@ -791,17 +772,21 @@ class DfSidenavLinkComponent {
791
772
  /**
792
773
  * Reference to the desktop link component instance
793
774
  */
794
- this.desktopInstance = viewChild(DfSidenavLinkDesktopComponent, ...(ngDevMode ? [{ debugName: "desktopInstance" }] : []));
775
+ this.desktopInstance = viewChild(DfSidenavLinkDesktopComponent, /* @ts-ignore */
776
+ ...(ngDevMode ? [{ debugName: "desktopInstance" }] : /* istanbul ignore next */ []));
795
777
  /**
796
778
  * Reference to the mobile link component instance
797
779
  */
798
- this.mobileInstance = viewChild(DfSidenavLinkMobileComponent, ...(ngDevMode ? [{ debugName: "mobileInstance" }] : []));
799
- this.iconContentQuery = contentChild(DfSidenavIconDirective, ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : []));
800
- 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 */ []));
801
786
  this.sidenav = inject(DfSidenavComponent);
802
787
  }
803
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
804
- 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 }, active: { classPropertyName: "active", publicName: "active", 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: `
805
790
  <ng-template #iconSlot>
806
791
  <ng-content select="[dfSidenavIcon]" />
807
792
  </ng-template>
@@ -834,13 +819,12 @@ class DfSidenavLinkComponent {
834
819
  <ng-container [ngTemplateOutlet]="defaultContent" />
835
820
  </df-sidenav-link-desktop>
836
821
  }
837
- `, 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"] }] }); }
838
823
  }
839
- 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: [{
840
825
  type: Component,
841
826
  args: [{
842
827
  selector: 'df-sidenav-link',
843
- changeDetection: ChangeDetectionStrategy.OnPush,
844
828
  template: `
845
829
  <ng-template #iconSlot>
846
830
  <ng-content select="[dfSidenavIcon]" />
@@ -878,8 +862,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
878
862
  imports: [DfSidenavLinkDesktopComponent, DfSidenavLinkMobileComponent, NgTemplateOutlet],
879
863
  host: {
880
864
  role: 'listitem',
881
- class: 'd-block',
882
- '[class.mobile]': "sidenav['isMobileDevice']()"
865
+ style: 'display: block;',
866
+ '[class.df-sidenav-mobile]': "sidenav['isMobileDevice']()"
883
867
  }
884
868
  }]
885
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 }] }] } });
@@ -893,16 +877,19 @@ class DfSidenavItemComponent {
893
877
  /**
894
878
  * Label of the sidenav item
895
879
  */
896
- this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
880
+ this.label = input.required(/* @ts-ignore */
881
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
897
882
  /**
898
883
  * Flag whether the sidenav item is collapsed
899
- * @default false
884
+ * @defaultValue `false`
900
885
  */
901
- this.collapsed = model(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : []));
886
+ this.collapsed = model(false, /* @ts-ignore */
887
+ ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
902
888
  /**
903
889
  * Optional icon class for the sidenav item
904
890
  */
905
- this.icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
891
+ this.icon = input('', /* @ts-ignore */
892
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
906
893
  /**
907
894
  * Reference to the parent element containing this item
908
895
  */
@@ -913,25 +900,29 @@ class DfSidenavItemComponent {
913
900
  /**
914
901
  * Child sidenav items nested inside this item
915
902
  */
916
- this.childrenItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "childrenItems" } : {}), descendants: true });
903
+ this.childrenItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "childrenItems" } : /* istanbul ignore next */ {}), descendants: true });
917
904
  /**
918
905
  * Child sidenav links nested inside this item
919
906
  */
920
- this.childrenLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "childrenLinks" } : {}), descendants: true });
907
+ this.childrenLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "childrenLinks" } : /* istanbul ignore next */ {}), descendants: true });
921
908
  /**
922
909
  * Reference to the desktop instance of the sidenav item
923
910
  */
924
- this.desktopInstance = viewChild(DfSidenavItemDesktopComponent, ...(ngDevMode ? [{ debugName: "desktopInstance" }] : []));
911
+ this.desktopInstance = viewChild(DfSidenavItemDesktopComponent, /* @ts-ignore */
912
+ ...(ngDevMode ? [{ debugName: "desktopInstance" }] : /* istanbul ignore next */ []));
925
913
  /**
926
914
  * Reference to the mobile instance of the sidenav item
927
915
  */
928
- this.mobileInstance = viewChild(DfSidenavItemMobileComponent, ...(ngDevMode ? [{ debugName: "mobileInstance" }] : []));
929
- this.iconContentQuery = contentChild(DfSidenavIconDirective, ...(ngDevMode ? [{ debugName: "iconContentQuery" }] : []));
930
- 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 */ []));
931
922
  this.sidenav = inject(DfSidenavComponent);
932
923
  }
933
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
934
- 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: `
935
926
  <ng-template #iconSlot>
936
927
  <ng-content select="[dfSidenavIcon]" />
937
928
  </ng-template>
@@ -960,13 +951,12 @@ class DfSidenavItemComponent {
960
951
  <ng-container [ngTemplateOutlet]="content" />
961
952
  </df-sidenav-item-desktop>
962
953
  }
963
- `, 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"] }] }); }
964
955
  }
965
- 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: [{
966
957
  type: Component,
967
958
  args: [{
968
959
  selector: 'df-sidenav-item',
969
- changeDetection: ChangeDetectionStrategy.OnPush,
970
960
  template: `
971
961
  <ng-template #iconSlot>
972
962
  <ng-content select="[dfSidenavIcon]" />
@@ -1000,8 +990,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1000
990
  imports: [DfSidenavItemDesktopComponent, DfSidenavItemMobileComponent, NgTemplateOutlet],
1001
991
  host: {
1002
992
  role: 'listitem',
1003
- class: 'd-block',
1004
- '[class.mobile]': "sidenav['isMobileDevice']()"
993
+ style: 'display: block;',
994
+ '[class.df-sidenav-mobile]': "sidenav['isMobileDevice']()"
1005
995
  }
1006
996
  }]
1007
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 }] }] } });
@@ -1023,30 +1013,30 @@ class DfSidenavComponent {
1023
1013
  constructor() {
1024
1014
  /**
1025
1015
  * Flag whether the sidenav includes a search input
1026
- * @default true
1016
+ * @defaultValue `true`
1027
1017
  */
1028
- this.searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : {}), transform: booleanAttribute });
1018
+ this.searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1029
1019
  /**
1030
1020
  * Flag whether the sidenav should be resizable
1031
- * @default true
1021
+ * @defaultValue `true`
1032
1022
  */
1033
- this.resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : {}), transform: booleanAttribute });
1023
+ this.resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1034
1024
  /**
1035
1025
  * Flag whether the sidenav should have the collapse button
1036
- * @default true
1026
+ * @defaultValue `true`
1037
1027
  */
1038
- this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : {}), transform: booleanAttribute });
1028
+ this.collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1039
1029
  /**
1040
1030
  * Flag to enable the mobile sidenav display of the items.
1041
- * @default true
1031
+ * @defaultValue `true`
1042
1032
  */
1043
- this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : {}), transform: booleanAttribute });
1033
+ this.enableMobile = input(true, { ...(ngDevMode ? { debugName: "enableMobile" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1044
1034
  /**
1045
- * @since 21.1.0
1046
- *
1047
1035
  * Flag to disable the automatic scroll to active link on desktop when the sidenav is initialized.
1036
+ *
1037
+ * @since 21.1.0
1048
1038
  */
1049
- this.disableInitialDesktopAutoScroll = input(false, { ...(ngDevMode ? { debugName: "disableInitialDesktopAutoScroll" } : {}), transform: booleanAttribute });
1039
+ this.disableInitialDesktopAutoScroll = input(false, { ...(ngDevMode ? { debugName: "disableInitialDesktopAutoScroll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1050
1040
  this._isMinimized = linkedSignal(() => {
1051
1041
  // in mobile devices, the default value is true (hiding the drawer) and does not track changes to the screen size
1052
1042
  if (this.isMobileDevice()) {
@@ -1054,12 +1044,14 @@ class DfSidenavComponent {
1054
1044
  }
1055
1045
  // in desktop, we track the large screen signal in order to reset the minimized state
1056
1046
  // it allows resizing the window and have a more user-friendly behavior
1057
- return !this.isLargeUpScreen();
1058
- }, ...(ngDevMode ? [{ debugName: "_isMinimized" }] : []));
1047
+ return !this.isLargeUpScreen() && this.collapsible();
1048
+ }, /* @ts-ignore */
1049
+ ...(ngDevMode ? [{ debugName: "_isMinimized" }] : /* istanbul ignore next */ []));
1059
1050
  /**
1060
1051
  * Flag to indicate if the sidenav is minimized
1061
1052
  */
1062
- this.isMinimized = computed(() => this._isMinimized(), ...(ngDevMode ? [{ debugName: "isMinimized" }] : []));
1053
+ this.isMinimized = computed(() => this._isMinimized(), /* @ts-ignore */
1054
+ ...(ngDevMode ? [{ debugName: "isMinimized" }] : /* istanbul ignore next */ []));
1063
1055
  this.hostRef = inject((ElementRef));
1064
1056
  this.scrollableContainer = viewChild.required('scrollableContainer');
1065
1057
  this.isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
@@ -1081,28 +1073,38 @@ class DfSidenavComponent {
1081
1073
  }
1082
1074
  return false;
1083
1075
  }
1084
- }, ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : []));
1085
- 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 */ []));
1086
1080
  // Query all links to find active ones
1087
- this.allLinks = contentChildren(DfSidenavLinkComponent, { ...(ngDevMode ? { debugName: "allLinks" } : {}), descendants: true });
1088
- this.allItems = contentChildren(DfSidenavItemComponent, { ...(ngDevMode ? { debugName: "allItems" } : {}), descendants: true });
1089
- 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 */ []));
1090
1085
  this.savedWidth = null;
1091
- 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);
1092
1089
  // Mobile navigation stack - tracks which item's children are currently displayed
1093
1090
  // Using component references instead of labels for uniqueness
1094
- this.mobileNavigationStack = signal([], ...(ngDevMode ? [{ debugName: "mobileNavigationStack" }] : []));
1091
+ this.mobileNavigationStack = signal([], /* @ts-ignore */
1092
+ ...(ngDevMode ? [{ debugName: "mobileNavigationStack" }] : /* istanbul ignore next */ []));
1095
1093
  this.currentMobilePanel = computed(() => {
1096
1094
  const stack = this.mobileNavigationStack();
1097
1095
  return stack.length > 0 ? stack[stack.length - 1] : null;
1098
- }, ...(ngDevMode ? [{ debugName: "currentMobilePanel" }] : []));
1099
- this.isMd = toAngularSignal(md$);
1100
- this.isLg = toAngularSignal(lg$);
1101
- this.isSmallScreen = computed(() => !this.isMd(), ...(ngDevMode ? [{ debugName: "isSmallScreen" }] : []));
1102
- this.isMediumScreen = computed(() => this.isMd() && !this.isLg(), ...(ngDevMode ? [{ debugName: "isMediumScreen" }] : []));
1103
- this.isLargeUpScreen = computed(() => this.isLg(), ...(ngDevMode ? [{ debugName: "isLargeUpScreen" }] : []));
1104
- this.isMobileOrSmallScreen = computed(() => this.isSmallScreen() || this.isMediumScreen(), ...(ngDevMode ? [{ debugName: "isMobileOrSmallScreen" }] : []));
1105
- 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 */ []));
1106
1108
  this.navManager = createNavManager();
1107
1109
  this.navManagerConfig = {
1108
1110
  selector: (node) => node.querySelectorAll('input, button, a'),
@@ -1112,12 +1114,19 @@ class DfSidenavComponent {
1112
1114
  }
1113
1115
  };
1114
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 */ []));
1115
1123
  this.contentHasIcons = computed(() => this.allItems().some((item) => item['wrapperHasIconContent']()) ||
1116
- 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 */ []));
1117
1126
  useDirectiveForHost(this.navManager.directive, this.navManagerConfig);
1118
1127
  afterRenderEffect(() => {
1119
1128
  if (this.isBrowser) {
1120
- if (this.isMobileDevice() && !this._isMinimized()) {
1129
+ if (this.isMobileDevice() && !this._isMinimized() && !this.skipActiveItemNavigation()) {
1121
1130
  // Delay to ensure DOM and contentChildren queries are ready
1122
1131
  this.navigateToActiveItem();
1123
1132
  }
@@ -1168,7 +1177,7 @@ class DfSidenavComponent {
1168
1177
  }, { injector: this.injector });
1169
1178
  });
1170
1179
  }
1171
- }, { ...(ngDevMode ? { debugName: "effectRef" } : {}), injector: this.injector });
1180
+ }, { ...(ngDevMode ? { debugName: "effectRef" } : /* istanbul ignore next */ {}), injector: this.injector });
1172
1181
  }
1173
1182
  /**
1174
1183
  * Toggles the minimized state of the sidenav
@@ -1180,6 +1189,8 @@ class DfSidenavComponent {
1180
1189
  if (minimized) {
1181
1190
  this.savedWidth = this.width();
1182
1191
  this.width.set(0);
1192
+ // reset mobile navigation stack to show root level icons (if any)
1193
+ this.mobileNavigationStack.set([]);
1183
1194
  }
1184
1195
  else {
1185
1196
  this.width.set(this.savedWidth);
@@ -1193,6 +1204,8 @@ class DfSidenavComponent {
1193
1204
  */
1194
1205
  visibleChangeHandler(isVisible) {
1195
1206
  if (!isVisible) {
1207
+ // reset mobile navigation stack to show root level icons (if any)
1208
+ this.mobileNavigationStack.set([]);
1196
1209
  this.width.set(0);
1197
1210
  }
1198
1211
  this._isMinimized.set(!isVisible);
@@ -1215,6 +1228,12 @@ class DfSidenavComponent {
1215
1228
  }
1216
1229
  }
1217
1230
  }
1231
+ onMinimizedChange(isMinimized) {
1232
+ if (isMinimized) {
1233
+ this.mobileNavigationStack.set([]);
1234
+ }
1235
+ this._isMinimized.set(isMinimized);
1236
+ }
1218
1237
  // utility to transfer focus from the button when minimized to the search input when uncollapsed
1219
1238
  focusSearch() {
1220
1239
  this.toggleMinimize(false);
@@ -1227,6 +1246,10 @@ class DfSidenavComponent {
1227
1246
  * @param itemRef item to be added to the navigation stack
1228
1247
  */
1229
1248
  navigateToChildren(itemRef) {
1249
+ if (this.isMinimized()) {
1250
+ this.toggleMinimize(false);
1251
+ this.skipActiveItemNavigation.set(true);
1252
+ }
1230
1253
  const stack = this.mobileNavigationStack();
1231
1254
  this.mobileNavigationStack.set([...stack, itemRef]);
1232
1255
  }
@@ -1265,15 +1288,15 @@ class DfSidenavComponent {
1265
1288
  this.mobileNavigationStack.set([]);
1266
1289
  }
1267
1290
  }
1268
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DfSidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1269
- 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: `
1270
1293
  <df-drawer
1271
1294
  #drawer
1272
1295
  position="inline-start"
1273
1296
  [className]="isSmallScreen() ? 'df-sidenav-mobile-drawer' : ''"
1274
1297
  [visible]="!_isMinimized()"
1275
1298
  (visibleChange)="visibleChangeHandler($event)"
1276
- (minimizedChange)="_isMinimized.set($event)"
1299
+ (minimizedChange)="onMinimizedChange($event)"
1277
1300
  (resizingChange)="resizingChangeHandler($event)"
1278
1301
  [bodyScroll]="true"
1279
1302
  [backdrop]="backdrop()"
@@ -1282,84 +1305,82 @@ class DfSidenavComponent {
1282
1305
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1283
1306
  [resizable]="resizable() && !isSmallScreen()"
1284
1307
  [focusOnInit]="false"
1285
- [configuration]="isLargeUpScreen() ? 'inline' : 'overlay'"
1308
+ [configuration]="isLargeUpScreen() || (isMediumScreen() && !collapsible()) ? 'inline' : 'overlay'"
1286
1309
  >
1287
- <div class="h-100 w-100">
1288
- <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1289
- <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
1290
- @if (searchable()) {
1291
- @if (_isMinimized()) {
1292
- <button
1293
- class="btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search"
1294
- [class.df-sidenav-search-minimized]="!contentHasIcons()"
1295
- type="button"
1296
- (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"
1297
1334
  i18n-aria-label="@@df.sidenav.search.ariaLabel"
1298
1335
  aria-label="Search"
1299
- ></button>
1300
- } @else {
1301
- <div class="input-group mb-3">
1302
- <div class="input-group-prepend">
1303
- <span class="input-group-text fa-light fa-search"></span>
1304
- </div>
1305
- <input
1306
- type="search"
1307
- class="form-control df-input-withicon"
1308
- i18n-placeholder="@@df.sidenav.search.placeholder"
1309
- placeholder="Search"
1310
- i18n-aria-label="@@df.sidenav.search.ariaLabel"
1311
- aria-label="Search"
1312
- [(ngModel)]="searchTerm"
1313
- #textInput
1314
- />
1315
- <div class="input-group-append">
1316
- <button
1317
- class="input-group-text fa-light fa-times"
1318
- [class.df-sidenav-search-empty]="searchTerm() === ''"
1319
- (click)="searchTerm.set(''); textInput.focus()"
1320
- >
1321
- <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1322
- </button>
1323
- </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>
1324
1347
  </div>
1325
- }
1348
+ </div>
1326
1349
  }
1327
1350
  </div>
1351
+ }
1328
1352
 
1329
- <div role="list" class="sidenav-body flex-grow-1 overflow-y-auto" #scrollableContainer>
1330
- <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>
1331
1368
  </div>
1332
- @if (collapsible() && !isSmallScreen()) {
1333
- <div class="d-flex sidenav-footer flex-shrink-0 py-3">
1334
- <button
1335
- class="btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized"
1336
- (click)="toggleMinimize()"
1337
- i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1338
- aria-label="Toggle minimized sidenav"
1339
- >
1340
- @if (isMinimized()) {
1341
- <span class="fa-arrow-right-to-line"></span>
1342
- } @else {
1343
- <span class="fa-arrow-left-to-line"></span>
1344
- }
1345
- </button>
1346
- </div>
1347
- }
1348
- </nav>
1349
- </div>
1369
+ }
1370
+ </nav>
1350
1371
  </df-drawer>
1351
- `, 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 }); }
1352
1373
  }
1353
- 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: [{
1354
1375
  type: Component,
1355
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'df-sidenav', template: `
1376
+ args: [{ selector: 'df-sidenav', template: `
1356
1377
  <df-drawer
1357
1378
  #drawer
1358
1379
  position="inline-start"
1359
1380
  [className]="isSmallScreen() ? 'df-sidenav-mobile-drawer' : ''"
1360
1381
  [visible]="!_isMinimized()"
1361
1382
  (visibleChange)="visibleChangeHandler($event)"
1362
- (minimizedChange)="_isMinimized.set($event)"
1383
+ (minimizedChange)="onMinimizedChange($event)"
1363
1384
  (resizingChange)="resizingChangeHandler($event)"
1364
1385
  [bodyScroll]="true"
1365
1386
  [backdrop]="backdrop()"
@@ -1368,84 +1389,314 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1368
1389
  [container]="isSmallScreen() ? null : hostRef.nativeElement"
1369
1390
  [resizable]="resizable() && !isSmallScreen()"
1370
1391
  [focusOnInit]="false"
1371
- [configuration]="isLargeUpScreen() ? 'inline' : 'overlay'"
1392
+ [configuration]="isLargeUpScreen() || (isMediumScreen() && !collapsible()) ? 'inline' : 'overlay'"
1372
1393
  >
1373
- <div class="h-100 w-100">
1374
- <nav class="d-flex flex-column w-100 h-100 p-5 pb-3">
1375
- <div class="df-sidenav-header flex-shrink-0" [class.df-sidenav-header-minimized]="_isMinimized()">
1376
- @if (searchable()) {
1377
- @if (_isMinimized()) {
1378
- <button
1379
- class="btn btn-outline-neutral df-btn-icononly mb-3 w-100 fa-search"
1380
- [class.df-sidenav-search-minimized]="!contentHasIcons()"
1381
- type="button"
1382
- (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"
1383
1418
  i18n-aria-label="@@df.sidenav.search.ariaLabel"
1384
1419
  aria-label="Search"
1385
- ></button>
1386
- } @else {
1387
- <div class="input-group mb-3">
1388
- <div class="input-group-prepend">
1389
- <span class="input-group-text fa-light fa-search"></span>
1390
- </div>
1391
- <input
1392
- type="search"
1393
- class="form-control df-input-withicon"
1394
- i18n-placeholder="@@df.sidenav.search.placeholder"
1395
- placeholder="Search"
1396
- i18n-aria-label="@@df.sidenav.search.ariaLabel"
1397
- aria-label="Search"
1398
- [(ngModel)]="searchTerm"
1399
- #textInput
1400
- />
1401
- <div class="input-group-append">
1402
- <button
1403
- class="input-group-text fa-light fa-times"
1404
- [class.df-sidenav-search-empty]="searchTerm() === ''"
1405
- (click)="searchTerm.set(''); textInput.focus()"
1406
- >
1407
- <span class="visually-hidden" i18n="@@df.sidenav.search.clearText">Clear text</span>
1408
- </button>
1409
- </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>
1410
1431
  </div>
1411
- }
1432
+ </div>
1412
1433
  }
1413
1434
  </div>
1435
+ }
1414
1436
 
1415
- <div role="list" class="sidenav-body flex-grow-1 overflow-y-auto" #scrollableContainer>
1416
- <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>
1417
1452
  </div>
1418
- @if (collapsible() && !isSmallScreen()) {
1419
- <div class="d-flex sidenav-footer flex-shrink-0 py-3">
1420
- <button
1421
- class="btn btn-outline-primary df-btn-icononly df-sidenav-toggle-minimized"
1422
- (click)="toggleMinimize()"
1423
- i18n-aria-label="@@df.sidenav.toggleMinimize.ariaLabel"
1424
- aria-label="Toggle minimized sidenav"
1425
- >
1426
- @if (isMinimized()) {
1427
- <span class="fa-arrow-right-to-line"></span>
1428
- } @else {
1429
- <span class="fa-arrow-left-to-line"></span>
1430
- }
1431
- </button>
1432
- </div>
1433
- }
1434
- </nav>
1435
- </div>
1453
+ }
1454
+ </nav>
1436
1455
  </df-drawer>
1437
- `, imports: [FormsModule, DfDrawer], encapsulation: ViewEncapsulation.None, host: {
1456
+ `, imports: [FormField, DfDrawer, DfIcon, DfIconButton], encapsulation: ViewEncapsulation.None, host: {
1438
1457
  class: 'df-sidenav',
1439
1458
  '[class.df-sidenav-lg]': 'isLargeUpScreen()',
1440
1459
  '[class.df-sidenav-withicon]': 'contentHasIcons()',
1441
- '[class.d-none]': 'isSmallScreen() && _isMinimized()',
1442
- '[class.df-sidenav-drawer]': 'isMediumScreen() && !_isMinimized()'
1443
- }, 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"] }]
1444
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 }] }] } });
1445
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
+
1446
1697
  /**
1447
1698
  * Generated bundle index. Do not edit.
1448
1699
  */
1449
1700
 
1450
- export { DfSidenavComponent, DfSidenavIconDirective, DfSidenavItemComponent, DfSidenavLinkComponent };
1701
+ export { DfSidenavComponent, DfSidenavIconDirective, DfSidenavInput, DfSidenavItemComponent, DfSidenavLinkComponent };
1451
1702
  //# sourceMappingURL=design-factory-angular-sidenav.mjs.map