@nova-design-system/nova-webcomponents 3.12.0 → 3.13.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 (395) hide show
  1. package/dist/cjs/collapse.animation-47397763.js +218 -0
  2. package/dist/cjs/collapse.animation-47397763.js.map +1 -0
  3. package/dist/cjs/{constants-aac59496.js → constants-52f6f8e9.js} +6 -1
  4. package/dist/cjs/constants-52f6f8e9.js.map +1 -0
  5. package/dist/cjs/fade.animation-cf6eba0d.js +726 -0
  6. package/dist/cjs/fade.animation-cf6eba0d.js.map +1 -0
  7. package/dist/cjs/{grow.animation-6d003803.js → grow.animation-9258ba63.js} +6 -5
  8. package/dist/cjs/grow.animation-9258ba63.js.map +1 -0
  9. package/dist/cjs/index-c56424e5.js +4 -0
  10. package/dist/cjs/index.cjs.js +16 -7
  11. package/dist/cjs/index.cjs.js.map +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/cjs/native.cjs.js +1 -1
  14. package/dist/cjs/nv-accordion-item.cjs.entry.js +72 -38
  15. package/dist/cjs/nv-accordion-item.cjs.entry.js.map +1 -1
  16. package/dist/cjs/nv-accordion.cjs.entry.js +79 -65
  17. package/dist/cjs/nv-accordion.cjs.entry.js.map +1 -1
  18. package/dist/cjs/nv-alert.cjs.entry.js +12 -12
  19. package/dist/cjs/nv-alert.cjs.entry.js.map +1 -1
  20. package/dist/cjs/nv-avatar.cjs.entry.js +1 -1
  21. package/dist/cjs/nv-badge_2.cjs.entry.js +4 -4
  22. package/dist/cjs/nv-button.cjs.entry.js +1 -1
  23. package/dist/cjs/nv-calendar.cjs.entry.js +14 -10
  24. package/dist/cjs/nv-calendar.cjs.entry.js.map +1 -1
  25. package/dist/cjs/nv-datagrid.cjs.entry.js +1 -1
  26. package/dist/cjs/nv-dialog.cjs.entry.js +1 -1
  27. package/dist/cjs/nv-dialogfooter_2.cjs.entry.js +9 -6
  28. package/dist/cjs/nv-dialogfooter_2.cjs.entry.js.map +1 -1
  29. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js +0 -30
  30. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js.map +1 -1
  31. package/dist/cjs/nv-fieldnumber.cjs.entry.js +1 -1
  32. package/dist/cjs/nv-fieldnumber.cjs.entry.js.map +1 -1
  33. package/dist/cjs/nv-fieldslider.cjs.entry.js +24 -16
  34. package/dist/cjs/nv-fieldslider.cjs.entry.js.map +1 -1
  35. package/dist/cjs/nv-fieldtime.cjs.entry.js +1 -1
  36. package/dist/cjs/nv-icon.cjs.entry.js +1 -1
  37. package/dist/cjs/nv-notification.cjs.entry.js +120 -0
  38. package/dist/cjs/nv-notification.cjs.entry.js.map +1 -0
  39. package/dist/cjs/nv-popover.cjs.entry.js +4 -4
  40. package/dist/cjs/nv-row.cjs.entry.js +1 -1
  41. package/dist/cjs/nv-stack.cjs.entry.js +1 -1
  42. package/dist/cjs/nv-table.cjs.entry.js +2 -2
  43. package/dist/cjs/nv-toggle.cjs.entry.js +2 -2
  44. package/dist/cjs/nv-togglebutton.cjs.entry.js +1 -1
  45. package/dist/cjs/nv-togglebuttongroup.cjs.entry.js +1 -1
  46. package/dist/cjs/nv-tooltip.cjs.entry.js +1 -1
  47. package/dist/cjs/slide.animation-bedfc827.js +70 -0
  48. package/dist/cjs/slide.animation-bedfc827.js.map +1 -0
  49. package/dist/cjs/{stylefire.es-717e022a.js → style-value-types.es-eea2f16f.js} +51 -696
  50. package/dist/cjs/style-value-types.es-eea2f16f.js.map +1 -0
  51. package/dist/cjs/{timeline.animation-155e8839.js → timeline.animation-2878afb6.js} +20 -1
  52. package/dist/cjs/timeline.animation-2878afb6.js.map +1 -0
  53. package/dist/collection/animations/collapse.animation.js +110 -50
  54. package/dist/collection/animations/collapse.animation.js.map +1 -1
  55. package/dist/collection/animations/index.js +1 -0
  56. package/dist/collection/animations/index.js.map +1 -1
  57. package/dist/collection/animations/slide.animation.js +65 -0
  58. package/dist/collection/animations/slide.animation.js.map +1 -0
  59. package/dist/collection/animations/timeline.animation.js +19 -1
  60. package/dist/collection/animations/timeline.animation.js.map +1 -1
  61. package/dist/collection/collection-manifest.json +1 -0
  62. package/dist/collection/components/nv-accordion/nv-accordion.docs.js +78 -20
  63. package/dist/collection/components/nv-accordion/nv-accordion.docs.js.map +1 -1
  64. package/dist/collection/components/nv-accordion/nv-accordion.js +88 -68
  65. package/dist/collection/components/nv-accordion/nv-accordion.js.map +1 -1
  66. package/dist/collection/components/nv-accordion-item/nv-accordion-item.js +70 -36
  67. package/dist/collection/components/nv-accordion-item/nv-accordion-item.js.map +1 -1
  68. package/dist/collection/components/nv-accordion-item/styles/nv-accordion-item.css +3 -0
  69. package/dist/collection/components/nv-alert/nv-alert.css +1 -1
  70. package/dist/collection/components/nv-alert/nv-alert.js +6 -6
  71. package/dist/collection/components/nv-alert/nv-alert.js.map +1 -1
  72. package/dist/collection/components/nv-calendar/nv-calendar.css +4 -0
  73. package/dist/collection/components/nv-calendar/nv-calendar.docs.js +14 -0
  74. package/dist/collection/components/nv-calendar/nv-calendar.docs.js.map +1 -1
  75. package/dist/collection/components/nv-calendar/nv-calendar.js +47 -3
  76. package/dist/collection/components/nv-calendar/nv-calendar.js.map +1 -1
  77. package/dist/collection/components/nv-calendar/partials/calendar-actions.js +2 -2
  78. package/dist/collection/components/nv-calendar/partials/calendar-actions.js.map +1 -1
  79. package/dist/collection/components/nv-dialog/nv-dialog.docs.js +8 -0
  80. package/dist/collection/components/nv-dialog/nv-dialog.docs.js.map +1 -1
  81. package/dist/collection/components/nv-dialogfooter/nv-dialogfooter.js +13 -11
  82. package/dist/collection/components/nv-dialogfooter/nv-dialogfooter.js.map +1 -1
  83. package/dist/collection/components/nv-fieldmultiselect/nv-fieldmultiselect.js +0 -30
  84. package/dist/collection/components/nv-fieldmultiselect/nv-fieldmultiselect.js.map +1 -1
  85. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js +1 -1
  86. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js.map +1 -1
  87. package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js +0 -1
  88. package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js.map +1 -1
  89. package/dist/collection/components/nv-fieldslider/nv-fieldslider.js +10 -10
  90. package/dist/collection/components/nv-fieldslider/nv-fieldslider.js.map +1 -1
  91. package/dist/collection/components/nv-fieldslider/partials/field-input.js +13 -5
  92. package/dist/collection/components/nv-fieldslider/partials/field-input.js.map +1 -1
  93. package/dist/collection/components/nv-fieldslider/styles/nv-fieldslider.css +27 -0
  94. package/dist/collection/components/nv-fieldtime/nv-fieldtime.docs.js +0 -1
  95. package/dist/collection/components/nv-fieldtime/nv-fieldtime.docs.js.map +1 -1
  96. package/dist/collection/components/nv-notification/nv-notification.docs.js +72 -0
  97. package/dist/collection/components/nv-notification/nv-notification.docs.js.map +1 -0
  98. package/dist/collection/components/nv-notification/nv-notification.js +333 -0
  99. package/dist/collection/components/nv-notification/nv-notification.js.map +1 -0
  100. package/dist/collection/components/nv-notification/styles/nv-notification.css +155 -0
  101. package/dist/collection/components/nv-popover/nv-popover.js +1 -1
  102. package/dist/collection/components/nv-row/nv-row.js +1 -1
  103. package/dist/collection/components/nv-stack/nv-stack.js +1 -1
  104. package/dist/collection/components/nv-table/nv-table.js +2 -2
  105. package/dist/collection/components/nv-toggle/nv-toggle.js +2 -2
  106. package/dist/collection/components/nv-togglebutton/nv-togglebutton.js +1 -1
  107. package/dist/collection/components/nv-togglebuttongroup/nv-togglebuttongroup.docs.js +0 -1
  108. package/dist/collection/components/nv-togglebuttongroup/nv-togglebuttongroup.docs.js.map +1 -1
  109. package/dist/collection/components/nv-togglebuttongroup/nv-togglebuttongroup.js +1 -1
  110. package/dist/collection/components/nv-tooltip/nv-tooltip.js +1 -1
  111. package/dist/collection/utils/constants.js +5 -0
  112. package/dist/collection/utils/constants.js.map +1 -1
  113. package/dist/components/index.js +9 -6
  114. package/dist/components/index.js.map +1 -1
  115. package/dist/components/nv-accordion-item.js +1 -1
  116. package/dist/components/nv-accordion.js +88 -71
  117. package/dist/components/nv-accordion.js.map +1 -1
  118. package/dist/components/nv-alert.js +13 -13
  119. package/dist/components/nv-alert.js.map +1 -1
  120. package/dist/components/nv-avatar.js +2 -2
  121. package/dist/components/nv-badge.js +1 -1
  122. package/dist/components/nv-breadcrumb.js +2 -2
  123. package/dist/components/nv-button.js +1 -1
  124. package/dist/components/nv-calendar.js +1 -1
  125. package/dist/components/nv-datagrid.js +3 -3
  126. package/dist/components/nv-dialog.js +4 -4
  127. package/dist/components/nv-dialogfooter.js +1 -1
  128. package/dist/components/nv-fielddate.js +5 -5
  129. package/dist/components/nv-fielddaterange.js +5 -5
  130. package/dist/components/nv-fielddropdown.js +4 -4
  131. package/dist/components/nv-fielddropdownitem.js +1 -1
  132. package/dist/components/nv-fieldmultiselect.js +4 -34
  133. package/dist/components/nv-fieldmultiselect.js.map +1 -1
  134. package/dist/components/nv-fieldnumber.js +1 -1
  135. package/dist/components/nv-fieldpassword.js +2 -2
  136. package/dist/components/nv-fieldselect.js +2 -2
  137. package/dist/components/nv-fieldslider.js +27 -19
  138. package/dist/components/nv-fieldslider.js.map +1 -1
  139. package/dist/components/nv-fieldtext.js +1 -1
  140. package/dist/components/nv-fieldtime.js +4 -4
  141. package/dist/components/nv-icon.js +1 -1
  142. package/dist/components/nv-iconbutton.js +1 -1
  143. package/dist/components/nv-menu.js +3 -3
  144. package/dist/components/nv-menuitem.js +1 -1
  145. package/dist/components/nv-notification.d.ts +11 -0
  146. package/dist/components/nv-notification.js +150 -0
  147. package/dist/components/nv-notification.js.map +1 -0
  148. package/dist/components/nv-popover.js +1 -1
  149. package/dist/components/nv-row.js +1 -1
  150. package/dist/components/nv-stack.js +1 -1
  151. package/dist/components/nv-table.js +2 -2
  152. package/dist/components/nv-toggle.js +2 -2
  153. package/dist/components/nv-togglebutton.js +1 -1
  154. package/dist/components/nv-togglebuttongroup.js +1 -1
  155. package/dist/components/nv-tooltip.js +1 -1
  156. package/dist/components/{p-2030d84d.js → p-0b5816f7.js} +2 -2
  157. package/dist/components/{p-2030d84d.js.map → p-0b5816f7.js.map} +1 -1
  158. package/dist/components/{p-5f594b35.js → p-2277cfc8.js} +7 -2
  159. package/dist/components/p-2277cfc8.js.map +1 -0
  160. package/dist/components/{p-57ae32bc.js → p-2854cf01.js} +2 -2
  161. package/dist/components/{p-57ae32bc.js.map → p-2854cf01.js.map} +1 -1
  162. package/dist/components/{p-095c8285.js → p-2de17259.js} +2 -2
  163. package/dist/components/{p-095c8285.js.map → p-2de17259.js.map} +1 -1
  164. package/dist/components/p-31591941.js +216 -0
  165. package/dist/components/p-31591941.js.map +1 -0
  166. package/dist/components/{p-09cdd71f.js → p-42ea6b74.js} +34 -688
  167. package/dist/components/p-42ea6b74.js.map +1 -0
  168. package/dist/components/{p-0b015832.js → p-5073bfd6.js} +2 -2
  169. package/dist/components/{p-0b015832.js.map → p-5073bfd6.js.map} +1 -1
  170. package/dist/components/{p-2ad58e41.js → p-60244646.js} +5 -5
  171. package/dist/components/{p-2ad58e41.js.map → p-60244646.js.map} +1 -1
  172. package/dist/components/{p-b2c31970.js → p-68fa3890.js} +17 -11
  173. package/dist/components/p-68fa3890.js.map +1 -0
  174. package/dist/components/{p-b7629769.js → p-89ac047e.js} +4 -4
  175. package/dist/components/p-89ac047e.js.map +1 -0
  176. package/dist/components/{p-7372258e.js → p-99a55bc4.js} +2 -2
  177. package/dist/components/{p-7372258e.js.map → p-99a55bc4.js.map} +1 -1
  178. package/dist/{esm/timeline.animation-adf35ecb.js → components/p-a52cd849.js} +20 -2
  179. package/dist/components/p-a52cd849.js.map +1 -0
  180. package/dist/components/{p-4c3dc7e4.js → p-a9dc0824.js} +13 -10
  181. package/dist/components/p-a9dc0824.js.map +1 -0
  182. package/dist/components/{p-b3035205.js → p-ca38a8a9.js} +2 -2
  183. package/dist/components/{p-b3035205.js.map → p-ca38a8a9.js.map} +1 -1
  184. package/dist/components/{p-84f4b071.js → p-ddd0a394.js} +75 -41
  185. package/dist/components/p-ddd0a394.js.map +1 -0
  186. package/dist/components/{p-ddb7aa4e.js → p-e4ac8333.js} +6 -6
  187. package/dist/components/{p-ddb7aa4e.js.map → p-e4ac8333.js.map} +1 -1
  188. package/dist/components/{p-dc5dad90.js → p-e6c04562.js} +2 -2
  189. package/dist/components/{p-dc5dad90.js.map → p-e6c04562.js.map} +1 -1
  190. package/dist/components/{p-87079346.js → p-eb443b26.js} +3 -3
  191. package/dist/components/{p-87079346.js.map → p-eb443b26.js.map} +1 -1
  192. package/dist/components/p-eda2f9f3.js +68 -0
  193. package/dist/components/p-eda2f9f3.js.map +1 -0
  194. package/dist/components/p-ee0df37f.js +723 -0
  195. package/dist/components/p-ee0df37f.js.map +1 -0
  196. package/dist/components/{p-8d45dbfe.js → p-fb560fa3.js} +3 -2
  197. package/dist/components/p-fb560fa3.js.map +1 -0
  198. package/dist/esm/collapse.animation-acda1bf5.js +216 -0
  199. package/dist/esm/collapse.animation-acda1bf5.js.map +1 -0
  200. package/dist/esm/{constants-a857c476.js → constants-d0f19e7b.js} +7 -2
  201. package/dist/esm/constants-d0f19e7b.js.map +1 -0
  202. package/dist/esm/fade.animation-eb454088.js +723 -0
  203. package/dist/esm/fade.animation-eb454088.js.map +1 -0
  204. package/dist/esm/{grow.animation-f7b26024.js → grow.animation-5b2abb3a.js} +3 -2
  205. package/dist/esm/grow.animation-5b2abb3a.js.map +1 -0
  206. package/dist/esm/index-a1936cd0.js +4 -0
  207. package/dist/esm/index.js +10 -7
  208. package/dist/esm/index.js.map +1 -1
  209. package/dist/esm/loader.js +1 -1
  210. package/dist/esm/native.js +1 -1
  211. package/dist/esm/nv-accordion-item.entry.js +72 -38
  212. package/dist/esm/nv-accordion-item.entry.js.map +1 -1
  213. package/dist/esm/nv-accordion.entry.js +80 -66
  214. package/dist/esm/nv-accordion.entry.js.map +1 -1
  215. package/dist/esm/nv-alert.entry.js +12 -12
  216. package/dist/esm/nv-alert.entry.js.map +1 -1
  217. package/dist/esm/nv-avatar.entry.js +1 -1
  218. package/dist/esm/nv-badge_2.entry.js +4 -4
  219. package/dist/esm/nv-button.entry.js +1 -1
  220. package/dist/esm/nv-calendar.entry.js +14 -10
  221. package/dist/esm/nv-calendar.entry.js.map +1 -1
  222. package/dist/esm/nv-datagrid.entry.js +1 -1
  223. package/dist/esm/nv-dialog.entry.js +1 -1
  224. package/dist/esm/nv-dialogfooter_2.entry.js +9 -6
  225. package/dist/esm/nv-dialogfooter_2.entry.js.map +1 -1
  226. package/dist/esm/nv-fieldmultiselect.entry.js +0 -30
  227. package/dist/esm/nv-fieldmultiselect.entry.js.map +1 -1
  228. package/dist/esm/nv-fieldnumber.entry.js +1 -1
  229. package/dist/esm/nv-fieldnumber.entry.js.map +1 -1
  230. package/dist/esm/nv-fieldslider.entry.js +24 -16
  231. package/dist/esm/nv-fieldslider.entry.js.map +1 -1
  232. package/dist/esm/nv-fieldtime.entry.js +1 -1
  233. package/dist/esm/nv-icon.entry.js +1 -1
  234. package/dist/esm/nv-notification.entry.js +116 -0
  235. package/dist/esm/nv-notification.entry.js.map +1 -0
  236. package/dist/esm/nv-popover.entry.js +4 -4
  237. package/dist/esm/nv-row.entry.js +1 -1
  238. package/dist/esm/nv-stack.entry.js +1 -1
  239. package/dist/esm/nv-table.entry.js +2 -2
  240. package/dist/esm/nv-toggle.entry.js +2 -2
  241. package/dist/esm/nv-togglebutton.entry.js +1 -1
  242. package/dist/esm/nv-togglebuttongroup.entry.js +1 -1
  243. package/dist/esm/nv-tooltip.entry.js +1 -1
  244. package/dist/esm/slide.animation-f444aa0b.js +68 -0
  245. package/dist/esm/slide.animation-f444aa0b.js.map +1 -0
  246. package/dist/esm/{stylefire.es-74da334a.js → style-value-types.es-f5d10b79.js} +34 -688
  247. package/dist/esm/style-value-types.es-f5d10b79.js.map +1 -0
  248. package/dist/esm/timeline.animation-79215cd4.js +41 -0
  249. package/dist/esm/timeline.animation-79215cd4.js.map +1 -0
  250. package/dist/native/index.esm.js +1 -1
  251. package/dist/native/index.esm.js.map +1 -1
  252. package/dist/native/native.css +1 -1
  253. package/dist/native/native.esm.js +1 -1
  254. package/dist/native/native.esm.js.map +1 -1
  255. package/dist/native/p-08582c21.entry.js +2 -0
  256. package/dist/native/p-08582c21.entry.js.map +1 -0
  257. package/dist/native/p-0a99c6fb.entry.js +2 -0
  258. package/dist/native/p-0a99c6fb.entry.js.map +1 -0
  259. package/dist/native/p-0e488b3d.entry.js +2 -0
  260. package/dist/native/p-0e488b3d.entry.js.map +1 -0
  261. package/dist/native/{p-3a8f65a9.entry.js → p-1f01fb64.entry.js} +2 -2
  262. package/dist/native/{p-c3ad7617.entry.js → p-225a05bf.entry.js} +2 -2
  263. package/dist/native/p-2277cfc8.js +2 -0
  264. package/dist/native/p-2277cfc8.js.map +1 -0
  265. package/dist/native/p-25f2ce81.entry.js +2 -0
  266. package/dist/native/{p-29ee7b1c.entry.js → p-29f68e07.entry.js} +2 -2
  267. package/dist/native/p-29f68e07.entry.js.map +1 -0
  268. package/dist/native/p-31591941.js +2 -0
  269. package/dist/native/p-31591941.js.map +1 -0
  270. package/dist/native/{p-63fea160.entry.js → p-33f503c5.entry.js} +2 -2
  271. package/dist/native/{p-43071c3b.entry.js → p-3784efdc.entry.js} +2 -2
  272. package/dist/native/{p-47901c83.entry.js → p-3f861ddc.entry.js} +2 -2
  273. package/dist/native/{p-ab1e1a96.entry.js → p-40c4a221.entry.js} +2 -2
  274. package/dist/native/p-42ea6b74.js +16 -0
  275. package/dist/native/p-42ea6b74.js.map +1 -0
  276. package/dist/native/{p-62aa0531.entry.js → p-52b8c872.entry.js} +2 -2
  277. package/dist/native/{p-e7a929e7.entry.js → p-5a43fe48.entry.js} +2 -2
  278. package/dist/native/{p-a63929db.entry.js → p-788e9ee5.entry.js} +3 -3
  279. package/dist/native/{p-f033c4ce.entry.js → p-7bbcf477.entry.js} +2 -2
  280. package/dist/native/p-8c823928.entry.js +2 -0
  281. package/dist/native/p-9a46baa9.entry.js +2 -0
  282. package/dist/native/p-9a46baa9.entry.js.map +1 -0
  283. package/dist/native/p-a52cd849.js +2 -0
  284. package/dist/native/p-a52cd849.js.map +1 -0
  285. package/dist/native/{p-48cf2457.entry.js → p-bb71a17f.entry.js} +2 -2
  286. package/dist/native/p-cfd5785e.entry.js +2 -0
  287. package/dist/native/p-cfd5785e.entry.js.map +1 -0
  288. package/dist/native/{p-bcff76ab.entry.js → p-d95ee31e.entry.js} +2 -2
  289. package/dist/native/p-da2c7d3c.entry.js +2 -0
  290. package/dist/native/p-da2c7d3c.entry.js.map +1 -0
  291. package/dist/native/p-eda2f9f3.js +2 -0
  292. package/dist/native/p-eda2f9f3.js.map +1 -0
  293. package/dist/native/p-ee0df37f.js +2 -0
  294. package/dist/native/p-ee0df37f.js.map +1 -0
  295. package/dist/native/p-ee516944.entry.js +2 -0
  296. package/dist/native/p-ee516944.entry.js.map +1 -0
  297. package/dist/native/p-f5120223.entry.js +2 -0
  298. package/dist/native/p-f5120223.entry.js.map +1 -0
  299. package/dist/native/{p-2d647761.entry.js → p-f5eb047e.entry.js} +2 -2
  300. package/dist/native/p-fb560fa3.js +2 -0
  301. package/dist/native/{p-8d45dbfe.js.map → p-fb560fa3.js.map} +1 -1
  302. package/dist/types/animations/collapse.animation.d.ts +10 -2
  303. package/dist/types/animations/index.d.ts +1 -0
  304. package/dist/types/animations/slide.animation.d.ts +11 -0
  305. package/dist/types/animations/timeline.animation.d.ts +17 -1
  306. package/dist/types/components/nv-accordion/nv-accordion.d.ts +5 -7
  307. package/dist/types/components/nv-accordion-item/nv-accordion-item.d.ts +23 -8
  308. package/dist/types/components/nv-alert/nv-alert.d.ts +1 -1
  309. package/dist/types/components/nv-calendar/nv-calendar.d.ts +4 -0
  310. package/dist/types/components/nv-calendar/partials/calendar-actions.d.ts +4 -0
  311. package/dist/types/components/nv-dialogfooter/nv-dialogfooter.d.ts +8 -4
  312. package/dist/types/components/nv-fieldslider/nv-fieldslider.d.ts +3 -2
  313. package/dist/types/components/nv-fieldslider/partials/field-input.d.ts +7 -3
  314. package/dist/types/components/nv-notification/nv-notification.d.ts +75 -0
  315. package/dist/types/components/nv-notification/nv-notification.docs.d.ts +4 -0
  316. package/dist/types/components.d.ts +142 -9
  317. package/dist/types/nova-docs.d.ts +6 -0
  318. package/dist/types/utils/constants.d.ts +4 -0
  319. package/dist/vscode-data.json +77 -3
  320. package/hydrate/index.js +642 -263
  321. package/hydrate/index.mjs +642 -263
  322. package/package.json +5 -1
  323. package/readme.md +169 -42
  324. package/dist/cjs/collapse.animation-a129dc3f.js +0 -86
  325. package/dist/cjs/collapse.animation-a129dc3f.js.map +0 -1
  326. package/dist/cjs/constants-aac59496.js.map +0 -1
  327. package/dist/cjs/fade.animation-644b5c4d.js +0 -70
  328. package/dist/cjs/fade.animation-644b5c4d.js.map +0 -1
  329. package/dist/cjs/grow.animation-6d003803.js.map +0 -1
  330. package/dist/cjs/stylefire.es-717e022a.js.map +0 -1
  331. package/dist/cjs/timeline.animation-155e8839.js.map +0 -1
  332. package/dist/components/p-09cdd71f.js.map +0 -1
  333. package/dist/components/p-15aeab4d.js +0 -23
  334. package/dist/components/p-15aeab4d.js.map +0 -1
  335. package/dist/components/p-1cbacdba.js +0 -68
  336. package/dist/components/p-1cbacdba.js.map +0 -1
  337. package/dist/components/p-4c3dc7e4.js.map +0 -1
  338. package/dist/components/p-5f594b35.js.map +0 -1
  339. package/dist/components/p-84f4b071.js.map +0 -1
  340. package/dist/components/p-8d45dbfe.js.map +0 -1
  341. package/dist/components/p-9a263d0e.js +0 -84
  342. package/dist/components/p-9a263d0e.js.map +0 -1
  343. package/dist/components/p-b2c31970.js.map +0 -1
  344. package/dist/components/p-b7629769.js.map +0 -1
  345. package/dist/esm/collapse.animation-16e3af45.js +0 -84
  346. package/dist/esm/collapse.animation-16e3af45.js.map +0 -1
  347. package/dist/esm/constants-a857c476.js.map +0 -1
  348. package/dist/esm/fade.animation-71e8e34c.js +0 -68
  349. package/dist/esm/fade.animation-71e8e34c.js.map +0 -1
  350. package/dist/esm/grow.animation-f7b26024.js.map +0 -1
  351. package/dist/esm/stylefire.es-74da334a.js.map +0 -1
  352. package/dist/esm/timeline.animation-adf35ecb.js.map +0 -1
  353. package/dist/native/p-09cdd71f.js +0 -16
  354. package/dist/native/p-09cdd71f.js.map +0 -1
  355. package/dist/native/p-0da8f0d1.entry.js +0 -2
  356. package/dist/native/p-0da8f0d1.entry.js.map +0 -1
  357. package/dist/native/p-15aeab4d.js +0 -2
  358. package/dist/native/p-15aeab4d.js.map +0 -1
  359. package/dist/native/p-1cbacdba.js +0 -2
  360. package/dist/native/p-1cbacdba.js.map +0 -1
  361. package/dist/native/p-29ee7b1c.entry.js.map +0 -1
  362. package/dist/native/p-38af3aaf.entry.js +0 -2
  363. package/dist/native/p-38af3aaf.entry.js.map +0 -1
  364. package/dist/native/p-3fcaac6d.entry.js +0 -2
  365. package/dist/native/p-3fcaac6d.entry.js.map +0 -1
  366. package/dist/native/p-5d352456.entry.js +0 -2
  367. package/dist/native/p-5f594b35.js +0 -2
  368. package/dist/native/p-5f594b35.js.map +0 -1
  369. package/dist/native/p-67d861e2.entry.js +0 -2
  370. package/dist/native/p-67d861e2.entry.js.map +0 -1
  371. package/dist/native/p-7703c736.entry.js +0 -2
  372. package/dist/native/p-7703c736.entry.js.map +0 -1
  373. package/dist/native/p-8d45dbfe.js +0 -2
  374. package/dist/native/p-9a263d0e.js +0 -2
  375. package/dist/native/p-9a263d0e.js.map +0 -1
  376. package/dist/native/p-9e0fe7e8.entry.js +0 -2
  377. package/dist/native/p-9e0fe7e8.entry.js.map +0 -1
  378. package/dist/native/p-ac5496e7.entry.js +0 -2
  379. package/dist/native/p-e603c6ed.entry.js +0 -2
  380. package/dist/native/p-e603c6ed.entry.js.map +0 -1
  381. /package/dist/native/{p-3a8f65a9.entry.js.map → p-1f01fb64.entry.js.map} +0 -0
  382. /package/dist/native/{p-c3ad7617.entry.js.map → p-225a05bf.entry.js.map} +0 -0
  383. /package/dist/native/{p-ac5496e7.entry.js.map → p-25f2ce81.entry.js.map} +0 -0
  384. /package/dist/native/{p-63fea160.entry.js.map → p-33f503c5.entry.js.map} +0 -0
  385. /package/dist/native/{p-43071c3b.entry.js.map → p-3784efdc.entry.js.map} +0 -0
  386. /package/dist/native/{p-47901c83.entry.js.map → p-3f861ddc.entry.js.map} +0 -0
  387. /package/dist/native/{p-ab1e1a96.entry.js.map → p-40c4a221.entry.js.map} +0 -0
  388. /package/dist/native/{p-62aa0531.entry.js.map → p-52b8c872.entry.js.map} +0 -0
  389. /package/dist/native/{p-e7a929e7.entry.js.map → p-5a43fe48.entry.js.map} +0 -0
  390. /package/dist/native/{p-a63929db.entry.js.map → p-788e9ee5.entry.js.map} +0 -0
  391. /package/dist/native/{p-f033c4ce.entry.js.map → p-7bbcf477.entry.js.map} +0 -0
  392. /package/dist/native/{p-5d352456.entry.js.map → p-8c823928.entry.js.map} +0 -0
  393. /package/dist/native/{p-48cf2457.entry.js.map → p-bb71a17f.entry.js.map} +0 -0
  394. /package/dist/native/{p-bcff76ab.entry.js.map → p-d95ee31e.entry.js.map} +0 -0
  395. /package/dist/native/{p-2d647761.entry.js.map → p-f5eb047e.entry.js.map} +0 -0
@@ -1,24 +1,33 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-a1936cd0.js';
2
- import { u as useCollapse } from './collapse.animation-16e3af45.js';
3
- import './stylefire.es-74da334a.js';
2
+ import { u as useCollapse } from './collapse.animation-acda1bf5.js';
3
+ import './style-value-types.es-f5d10b79.js';
4
4
 
5
- const nvAccordionItemCss = "nv-accordion-item{display:block;border-bottom:var(--spacing-px) solid var(--color-content-low-border)}nv-accordion-item:last-child{border-bottom:none}nv-accordion-item .nv-accordion-item__header{cursor:pointer;display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-4)}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__chevron{margin-left:var(--spacing-2);flex-shrink:0}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__header-content{display:flex;flex-direction:column;gap:var(--spacing-0-5);flex:1;min-width:0}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__title{color:var(--color-content-high-text);font-size:var(--font-size-lg);font-style:normal;font-weight:var(--font-weight-medium-emphasis);line-height:var(--line-height-lg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__subtitle{color:var(--color-content-low-text);font-size:var(--font-size-md);font-style:normal;font-weight:var(--font-weight-medium-emphasis);line-height:var(--line-height-base);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nv-accordion-item .nv-accordion-item__content{background:var(--color-level-10-background)}nv-accordion-item .nv-accordion-item__content .nv-accordion-item__content-inner{padding:var(--spacing-4);color:var(--color-content-low-text);font-size:var(--font-size-md);font-style:normal;font-weight:500;line-height:var(--line-height-base);}nv-accordion-item.is-disabled{opacity:var(--opacity-disabled);pointer-events:none}nv-accordion-item.is-open .nv-accordion-item__header{border-bottom:var(--spacing-px) solid var(--color-content-low-border)}";
5
+ const nvAccordionItemCss = "nv-accordion-item{display:block;border-bottom:var(--spacing-px) solid var(--color-content-low-border)}nv-accordion-item:last-child{border-bottom:none}nv-accordion-item .nv-accordion-item__header{cursor:pointer;display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-4)}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__chevron{margin-left:var(--spacing-2);flex-shrink:0}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__header-content{display:flex;flex-direction:column;gap:var(--spacing-0-5);flex:1;min-width:0}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__title{color:var(--color-content-high-text);font-size:var(--font-size-lg);font-style:normal;font-weight:var(--font-weight-medium-emphasis);line-height:var(--line-height-lg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nv-accordion-item .nv-accordion-item__header .nv-accordion-item__subtitle{color:var(--color-content-low-text);font-size:var(--font-size-md);font-style:normal;font-weight:var(--font-weight-medium-emphasis);line-height:var(--line-height-base);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nv-accordion-item .nv-accordion-item__content{background:var(--color-level-10-background)}nv-accordion-item .nv-accordion-item__content .nv-accordion-item__content-inner{padding:var(--spacing-4);color:var(--color-content-low-text);font-size:var(--font-size-md);font-style:normal;font-weight:500;line-height:var(--line-height-base);}nv-accordion-item.is-disabled{opacity:var(--opacity-disabled);pointer-events:none}nv-accordion-item.is-open .nv-accordion-item__header{border-bottom:var(--spacing-px) solid var(--color-content-low-border)}nv-accordion-item:last-child .nv-accordion-item__content{border-radius:0 0 calc(var(--radius-rounded-lg) - var(--spacing-px)) calc(var(--radius-rounded-lg) - var(--spacing-px))}";
6
6
  const NvAccordionItemStyle0 = nvAccordionItemCss;
7
7
 
8
8
  const NvAccordionItem = class {
9
9
  constructor(hostRef) {
10
10
  registerInstance(this, hostRef);
11
11
  this.itemToggle = createEvent(this, "itemToggle", 7);
12
- /** Open or closed */
12
+ this.isToggling = false;
13
+ /**
14
+ * Open or closed
15
+ */
13
16
  this.open = false;
14
- /** Disables the item */
17
+ /**
18
+ * Disables the item
19
+ */
15
20
  this.disabled = false;
16
- /** Parent expansion mode (accordion or multi) */
21
+ /**
22
+ * Parent expansion mode (accordion or multi)
23
+ */
17
24
  this.mode = 'accordion';
18
25
  //#endregion EVENTS
19
26
  /****************************************************************************/
20
27
  //#region STATE
21
- /** Internal state for open/close rendering */
28
+ /**
29
+ * Internal state for open/close rendering
30
+ */
22
31
  this.currentOpenState = false;
23
32
  /**
24
33
  * Controls if the panel has been initialized for animations
@@ -39,7 +48,7 @@ const NvAccordionItem = class {
39
48
  * @param {Event} e - Click event
40
49
  */
41
50
  this.handleIconClick = (e) => {
42
- e.stopPropagation(); // Prevent header click from triggering
51
+ e.stopPropagation();
43
52
  this.toggle();
44
53
  };
45
54
  /**
@@ -47,8 +56,10 @@ const NvAccordionItem = class {
47
56
  * @param {KeyboardEvent} e - Keyboard event
48
57
  */
49
58
  this.handleHeaderKeyDown = (e) => {
50
- if (this.disabled)
59
+ if (this.disabled) {
60
+ console.warn('[handleHeaderKeyDown] Ignored (disabled)');
51
61
  return;
62
+ }
52
63
  switch (e.key) {
53
64
  case 'Enter':
54
65
  case ' ':
@@ -58,17 +69,19 @@ const NvAccordionItem = class {
58
69
  case 'ArrowDown':
59
70
  e.preventDefault();
60
71
  if (!this.open) {
72
+ this.isToggling = true;
61
73
  this.open = true;
62
- this.itemToggle.emit(this.open);
63
- this.updateVisibility(this.open);
74
+ this.itemToggle.emit(true);
75
+ this.isToggling = false;
64
76
  }
65
77
  break;
66
78
  case 'ArrowUp':
67
79
  e.preventDefault();
68
80
  if (this.open) {
81
+ this.isToggling = true;
69
82
  this.open = false;
70
- this.itemToggle.emit(this.open);
71
- this.updateVisibility(this.open);
83
+ this.itemToggle.emit(false);
84
+ this.isToggling = false;
72
85
  }
73
86
  break;
74
87
  }
@@ -78,12 +91,23 @@ const NvAccordionItem = class {
78
91
  /****************************************************************************/
79
92
  //#region WATCHERS
80
93
  async onOpenChanged(newValue, oldValue) {
81
- this.currentOpenState = newValue; // Synchronize internal state
82
- // Skip initial render
83
- if (oldValue === undefined) {
94
+ if (this.disabled) {
95
+ console.warn('[onOpenChanged] Item is disabled, forcing closed state');
96
+ this.currentOpenState = false;
97
+ this.open = false;
84
98
  return;
85
99
  }
86
- await this.updateVisibility(newValue);
100
+ this.currentOpenState = newValue;
101
+ const isInitialRender = oldValue === undefined;
102
+ if (!isInitialRender) {
103
+ if (newValue === false && !this.isToggling) {
104
+ this.itemToggle.emit(newValue);
105
+ }
106
+ else if (newValue && !this.isToggling) {
107
+ this.itemToggle.emit(newValue);
108
+ }
109
+ await this.updateVisibility(newValue);
110
+ }
87
111
  }
88
112
  //#endregion WATCHERS
89
113
  /****************************************************************************/
@@ -93,18 +117,18 @@ const NvAccordionItem = class {
93
117
  * @param {boolean} open - Whether the accordion item should be open
94
118
  */
95
119
  async updateVisibility(open) {
96
- if (!this.contentRef)
120
+ if (!this.contentRef) {
121
+ console.error('[updateVisibility] No contentRef available');
97
122
  return;
123
+ }
98
124
  this.isAnimating = true;
99
125
  const { collapse, expand } = useCollapse(this.contentRef, {
100
126
  duration: 200,
101
127
  });
102
128
  if (open) {
103
- // Expand with animation
104
129
  await expand();
105
130
  }
106
131
  else {
107
- // Collapse with animation
108
132
  await collapse();
109
133
  }
110
134
  this.isAnimating = false;
@@ -113,19 +137,24 @@ const NvAccordionItem = class {
113
137
  /****************************************************************************/
114
138
  //#region LIFECYCLE
115
139
  componentWillLoad() {
116
- this.currentOpenState = this.open; // Initial synchronization
140
+ this.currentOpenState = this.open;
117
141
  }
118
142
  componentDidLoad() {
119
143
  if (this.contentRef) {
120
- const { setExpanded, setCollapsed } = useCollapse(this.contentRef);
121
- if (this.open) {
122
- // If open by default on initial load, set expanded state without animation
123
- setExpanded();
124
- }
125
- else {
126
- // If closed by default, set collapsed state without animation
127
- setCollapsed();
128
- }
144
+ setTimeout(() => {
145
+ const { setExpanded, setCollapsed } = useCollapse(this.contentRef, {
146
+ duration: 200,
147
+ });
148
+ if (this.open) {
149
+ setExpanded();
150
+ this.currentOpenState = true;
151
+ }
152
+ else {
153
+ setCollapsed();
154
+ this.currentOpenState = false;
155
+ }
156
+ this.isInitialized = true;
157
+ }, 0);
129
158
  }
130
159
  }
131
160
  disconnectedCallback() {
@@ -141,10 +170,14 @@ const NvAccordionItem = class {
141
170
  */
142
171
  async toggle() {
143
172
  if (!this.disabled && !this.isAnimating) {
144
- this.open = !this.open;
145
- this.itemToggle.emit(this.open);
146
- // Force animation update directly instead of relying on watcher
147
- await this.updateVisibility(this.open);
173
+ this.isToggling = true;
174
+ const newOpen = !this.open;
175
+ this.open = newOpen;
176
+ this.itemToggle.emit(newOpen);
177
+ this.isToggling = false;
178
+ }
179
+ else {
180
+ console.warn('[toggle] Ignored toggle (disabled or animating)');
148
181
  }
149
182
  }
150
183
  /**
@@ -152,18 +185,19 @@ const NvAccordionItem = class {
152
185
  * @returns {string} The icon name to display in the chevron button
153
186
  */
154
187
  get chevronIconName() {
155
- return this.open ? 'chevron-top' : 'chevron-down';
188
+ const name = this.open ? 'chevron-top' : 'chevron-down';
189
+ return name;
156
190
  }
157
191
  //#endregion METHODS
158
192
  /****************************************************************************/
159
193
  //#region RENDER
160
194
  render() {
161
- return (h(Host, { key: 'dfb8ca76f8ac40c938323be1ccba4353ea33a616', class: {
195
+ return (h(Host, { key: '4d5ae52ba3e8cac86316d790f95afd39f6c73019', class: {
162
196
  'nv-accordion-item': true,
163
- 'is-open': this.open,
197
+ 'is-open': this.currentOpenState,
164
198
  'is-disabled': this.disabled,
165
199
  'is-animating': this.isAnimating,
166
- }, role: "listitem", "aria-expanded": this.open ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false' }, h("div", { key: '258efe0502a39d963a9e75c16285ee9cbc65cb9f', class: "nv-accordion-item__header", onClick: this.handleHeaderClick, "aria-controls": "content" }, h("slot", { key: 'bb4dae743f06e3d41d1f7b8c17793b668df9347b', name: "header" }, h("div", { key: 'f3142a81c6be776d95ab9292101b889db6e35805', class: "nv-accordion-item__header-content" }, this.itemTitle && (h("span", { key: 'e897d8b4d414ba4e93b2853c152059579063335e', class: "nv-accordion-item__title" }, this.itemTitle)), this.subtitle && (h("span", { key: 'b8e03ceb1ca0e4c0b0fe24398f0e1c592ac077ab', class: "nv-accordion-item__subtitle" }, this.subtitle)))), h("nv-iconbutton", { key: '145718cd664f6b1015cf99ad3c72dbe80df1f54e', emphasis: "low", size: "sm", shape: "square", name: this.chevronIconName, tabindex: this.disabled ? -1 : 0, onClick: this.handleIconClick, onKeyDown: this.handleHeaderKeyDown, "aria-controls": "content", "aria-label": this.open ? 'Fermer la section' : 'Ouvrir la section' })), h("div", { key: '667967ca20edaa1fc738188f42cfa8bf47bb080f', id: "content", class: "nv-accordion-item__content", ref: el => (this.contentRef = el) }, h("div", { key: '1f66bac904a5992d5e6cd63852d5aec9bc602ed7', class: "nv-accordion-item__content-inner" }, h("slot", { key: 'd7b5cf5c69daab242e7696e7432769905b3d4c72', name: "content" })))));
200
+ }, role: "listitem", "aria-expanded": this.currentOpenState ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false' }, h("div", { key: '866562d2f3033189e6d5df8fa5576d2f1540959e', class: "nv-accordion-item__header", onClick: this.handleHeaderClick, "aria-controls": "content" }, h("slot", { key: '36d2b14528c6bd6665ccfc94707d62dc406262d0', name: "header" }, h("div", { key: 'c78c1e485d0128708db6fc5fb2b64c6c01e4ed0f', class: "nv-accordion-item__header-content" }, this.itemTitle && (h("span", { key: '524cf377a4c89752eeed1933dbb8fd2343cd8830', class: "nv-accordion-item__title" }, this.itemTitle)), this.subtitle && (h("span", { key: 'b8ee5edc3c798218348490fc43c458c45934ee83', class: "nv-accordion-item__subtitle" }, this.subtitle)))), h("nv-iconbutton", { key: 'aa474788bb5551ca7b94261dca1ccb2e5aced3d3', emphasis: "low", size: "sm", shape: "square", name: this.chevronIconName, tabindex: this.disabled ? -1 : 0, onClick: this.handleIconClick, onKeyDown: this.handleHeaderKeyDown, "aria-controls": "content", "aria-label": this.currentOpenState ? 'Close the section' : 'Open the section' })), h("div", { key: '3b49afd97cc797b165a8fa6753f564349735aad1', id: "content", class: "nv-accordion-item__content", ref: el => (this.contentRef = el) }, h("div", { key: '955b5c7cef3259a2531ecc14eafb806a9d28c9a6', class: "nv-accordion-item__content-inner" }, h("slot", { key: '56ff89e2041d425f520fe6e62975bbb7193653f2', name: "content" })))));
167
201
  }
168
202
  get el() { return getElement(this); }
169
203
  static get watchers() { return {
@@ -1 +1 @@
1
- {"file":"nv-accordion-item.entry.js","mappings":"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","names":[],"sources":["src/components/nv-accordion-item/styles/nv-accordion-item.scss?tag=nv-accordion-item","src/components/nv-accordion-item/nv-accordion-item.tsx"],"sourcesContent":["@use \"./mixins\" as *;\n\nnv-accordion-item {\n @include accordion-item-root();\n\n .nv-accordion-item__header {\n @include accordion-item-header();\n \n .nv-accordion-item__chevron {\n @include accordion-item-chevron();\n }\n\n .nv-accordion-item__header-content {\n @include accordion-item-header-content();\n }\n\n .nv-accordion-item__title {\n @include accordion-item-title();\n }\n\n .nv-accordion-item__subtitle {\n @include accordion-item-subtitle();\n }\n }\n\n .nv-accordion-item__content {\n @include accordion-item-content();\n \n .nv-accordion-item__content-inner {\n @include accordion-item-content-inner();\n }\n }\n\n // Styles for disabled items\n &.is-disabled {\n @include accordion-item-disabled();\n }\n\n // Border between header and content when item is open\n &.is-open .nv-accordion-item__header {\n border-bottom: var(--spacing-px) solid var(--color-content-low-border);\n }\n}","import {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Method,\n State,\n Element,\n Watch,\n} from '@stencil/core';\nimport { useCollapse } from '../../animations';\n\n/**\n * Accordion item element for nv-accordion.\n *\n * @slot header - Custom header (replaces itemTitle/subtitle)\n * @slot content - Main content (expandable area)\n */\n@Component({\n tag: 'nv-accordion-item',\n styleUrl: 'styles/nv-accordion-item.scss',\n shadow: false,\n})\nexport class NvAccordionItem {\n @Element() el!: HTMLNvAccordionItemElement;\n private contentRef?: HTMLDivElement;\n private mutationObserver?: MutationObserver;\n\n /****************************************************************************/\n //#region PROPERTIES\n\n /** Item title (displayed if header slot is absent) */\n @Prop({ reflect: true })\n readonly itemTitle?: string;\n\n /** Item subtitle (displayed if header slot is absent) */\n @Prop({ reflect: true })\n readonly subtitle?: string;\n\n /** Open or closed */\n @Prop({ reflect: true, mutable: true })\n open: boolean = false;\n\n /** Disables the item */\n @Prop({ reflect: true })\n readonly disabled: boolean = false;\n\n /** Maximum content height (in px, optional). If not defined, auto height. */\n @Prop({ reflect: true })\n readonly maxContentHeight?: number;\n\n /** Parent expansion mode (accordion or multi) */\n @Prop({ reflect: true })\n readonly mode?: 'accordion' | 'multi' = 'accordion';\n\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region EVENTS\n\n /**\n * Event emitted on toggle (header click)\n */\n @Event()\n itemToggle: EventEmitter<boolean>;\n\n //#endregion EVENTS\n /****************************************************************************/\n //#region STATE\n\n /** Internal state for open/close rendering */\n @State()\n currentOpenState: boolean = false;\n\n /**\n * Controls if the panel has been initialized for animations\n */\n @State()\n isInitialized: boolean = false;\n\n /**\n * Animation in progress\n */\n @State()\n isAnimating: boolean = false;\n\n //#endregion STATE\n /****************************************************************************/\n //#region WATCHERS\n\n @Watch('open')\n async onOpenChanged(newValue: boolean, oldValue: boolean) {\n this.currentOpenState = newValue; // Synchronize internal state\n\n // Skip initial render\n if (oldValue === undefined) {\n return;\n }\n\n await this.updateVisibility(newValue);\n }\n\n //#endregion WATCHERS\n /****************************************************************************/\n //#region ANIMATIONS\n\n /**\n * Updates the visibility state with Nova animation system\n * @param {boolean} open - Whether the accordion item should be open\n */\n private async updateVisibility(open: boolean) {\n if (!this.contentRef) return;\n\n this.isAnimating = true;\n\n const { collapse, expand } = useCollapse(this.contentRef, {\n duration: 200,\n });\n\n if (open) {\n // Expand with animation\n await expand();\n } else {\n // Collapse with animation\n await collapse();\n }\n\n this.isAnimating = false;\n }\n\n //#endregion ANIMATIONS\n /****************************************************************************/\n //#region LIFECYCLE\n\n componentWillLoad() {\n this.currentOpenState = this.open; // Initial synchronization\n }\n\n componentDidLoad() {\n if (this.contentRef) {\n const { setExpanded, setCollapsed } = useCollapse(this.contentRef);\n\n if (this.open) {\n // If open by default on initial load, set expanded state without animation\n setExpanded();\n } else {\n // If closed by default, set collapsed state without animation\n setCollapsed();\n }\n }\n }\n\n disconnectedCallback() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n }\n\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region METHODS\n\n /**\n * Toggle open/close (Public API)\n */\n @Method()\n async toggle() {\n if (!this.disabled && !this.isAnimating) {\n this.open = !this.open;\n this.itemToggle.emit(this.open);\n\n // Force animation update directly instead of relying on watcher\n await this.updateVisibility(this.open);\n }\n }\n\n /**\n * Handler for header click\n */\n private handleHeaderClick = () => {\n this.toggle();\n };\n\n /**\n * Handler for iconbutton click\n * @param {Event} e - Click event\n */\n private handleIconClick = (e: Event) => {\n e.stopPropagation(); // Prevent header click from triggering\n this.toggle();\n };\n\n /**\n * Handler for keyboard events on iconbutton\n * @param {KeyboardEvent} e - Keyboard event\n */\n private handleHeaderKeyDown = (e: KeyboardEvent) => {\n if (this.disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.toggle();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n this.open = true;\n this.itemToggle.emit(this.open);\n this.updateVisibility(this.open);\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.open) {\n this.open = false;\n this.itemToggle.emit(this.open);\n this.updateVisibility(this.open);\n }\n break;\n }\n };\n\n /**\n * Get the chevron icon name based on open state\n * @returns {string} The icon name to display in the chevron button\n */\n private get chevronIconName(): string {\n return this.open ? 'chevron-top' : 'chevron-down';\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region RENDER\n render() {\n return (\n <Host\n class={{\n 'nv-accordion-item': true,\n 'is-open': this.open,\n 'is-disabled': this.disabled,\n 'is-animating': this.isAnimating,\n }}\n role=\"listitem\"\n aria-expanded={this.open ? 'true' : 'false'}\n aria-disabled={this.disabled ? 'true' : 'false'}\n >\n <div\n class=\"nv-accordion-item__header\"\n onClick={this.handleHeaderClick}\n aria-controls=\"content\"\n >\n <slot name=\"header\">\n <div class=\"nv-accordion-item__header-content\">\n {this.itemTitle && (\n <span class=\"nv-accordion-item__title\">{this.itemTitle}</span>\n )}\n {this.subtitle && (\n <span class=\"nv-accordion-item__subtitle\">{this.subtitle}</span>\n )}\n </div>\n </slot>\n <nv-iconbutton\n emphasis=\"low\"\n size=\"sm\"\n shape=\"square\"\n name={this.chevronIconName}\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleIconClick}\n onKeyDown={this.handleHeaderKeyDown}\n aria-controls=\"content\"\n aria-label={this.open ? 'Fermer la section' : 'Ouvrir la section'}\n ></nv-iconbutton>\n </div>\n\n <div\n id=\"content\"\n class=\"nv-accordion-item__content\"\n ref={el => (this.contentRef = el as HTMLDivElement)}\n >\n <div class=\"nv-accordion-item__content-inner\">\n <slot name=\"content\" />\n </div>\n </div>\n </Host>\n );\n }\n // #endregion RENDER\n}\n"],"version":3}
1
+ {"file":"nv-accordion-item.entry.js","mappings":";;;;AAAA,MAAM,kBAAkB,GAAG,w1DAAw1D,CAAC;AACp3D,8BAAe,kBAAkB;;MCwBpB,eAAe;IAL5B;;;QASU,eAAU,GAAY,KAAK,CAAC;;;;QAqBpC,SAAI,GAAY,KAAK,CAAC;;;;QAMb,aAAQ,GAAY,KAAK,CAAC;;;;QAY1B,SAAI,GAA2B,WAAW,CAAC;;;;;;;QAoBpD,qBAAgB,GAAY,KAAK,CAAC;;;;QAMlC,kBAAa,GAAY,KAAK,CAAC;;;;QAM/B,gBAAW,GAAY,KAAK,CAAC;;;;QAmHrB,sBAAiB,GAAG;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;SACf,CAAC;;;;;QAMM,oBAAe,GAAG,CAAC,CAAQ;YACjC,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;SACf,CAAC;;;;;QAMM,wBAAmB,GAAG,CAAC,CAAgB;YAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBACzD,OAAO;aACR;YAED,QAAQ,CAAC,CAAC,GAAG;gBACX,KAAK,OAAO,CAAC;gBACb,KAAK,GAAG;oBACN,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM;gBACR,KAAK,WAAW;oBACd,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;wBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;qBACzB;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,IAAI,IAAI,CAAC,IAAI,EAAE;wBACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;wBAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;qBACzB;oBACD,MAAM;aACT;SACF,CAAC;KAwEH;;;;IApOC,MAAM,aAAa,CAAC,QAAiB,EAAE,QAAiB;QACtD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACvE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,OAAO;SACR;QAED,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QAEjC,MAAM,eAAe,GAAG,QAAQ,KAAK,SAAS,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE;YACpB,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAChC;iBAAM,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAChC;YACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;SACvC;KACF;;;;;;;;IAUO,MAAM,gBAAgB,CAAC,IAAa;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO;SACR;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE;YACxD,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,IAAI,IAAI,EAAE;YACR,MAAM,MAAM,EAAE,CAAC;SAChB;aAAM;YACL,MAAM,QAAQ,EAAE,CAAC;SAClB;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;KAC1B;;;;IAMD,iBAAiB;QACf,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC;KACnC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,UAAU,CAAC;gBACT,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,UAAW,EAAE;oBAClE,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,IAAI,EAAE;oBACb,WAAW,EAAE,CAAC;oBACd,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;iBAC9B;qBAAM;oBACL,YAAY,EAAE,CAAC;oBACf,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;iBAC/B;gBACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC3B,EAAE,CAAC,CAAC,CAAC;SACP;KACF;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC;SACpC;KACF;;;;;;;IAUD,MAAM,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAE3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;SACzB;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;SACjE;KACF;;;;;IA2DD,IAAY,eAAe;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,cAAc,CAAC;QACxD,OAAO,IAAI,CAAC;KACb;;;;IAMD,MAAM;QACJ,QACE,EAAC,IAAI,qDACH,KAAK,EAAE;gBACL,mBAAmB,EAAE,IAAI;gBACzB,SAAS,EAAE,IAAI,CAAC,gBAAgB;gBAChC,aAAa,EAAE,IAAI,CAAC,QAAQ;gBAC5B,cAAc,EAAE,IAAI,CAAC,WAAW;aACjC,EACD,IAAI,EAAC,UAAU,mBACA,IAAI,CAAC,gBAAgB,GAAG,MAAM,GAAG,OAAO,mBACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,OAAO,IAE/C,4DACE,KAAK,EAAC,2BAA2B,EACjC,OAAO,EAAE,IAAI,CAAC,iBAAiB,mBACjB,SAAS,IAEvB,6DAAM,IAAI,EAAC,QAAQ,IACjB,4DAAK,KAAK,EAAC,mCAAmC,IAC3C,IAAI,CAAC,SAAS,KACb,6DAAM,KAAK,EAAC,0BAA0B,IAAE,IAAI,CAAC,SAAS,CAAQ,CAC/D,EACA,IAAI,CAAC,QAAQ,KACZ,6DAAM,KAAK,EAAC,6BAA6B,IAAE,IAAI,CAAC,QAAQ,CAAQ,CACjE,CACG,CACD,EACP,sEACE,QAAQ,EAAC,KAAK,EACd,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,QAAQ,EACd,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAChC,OAAO,EAAE,IAAI,CAAC,eAAe,EAC7B,SAAS,EAAE,IAAI,CAAC,mBAAmB,mBACrB,SAAS,gBAErB,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,GAEnD,CACb,EAEN,4DACE,EAAE,EAAC,SAAS,EACZ,KAAK,EAAC,4BAA4B,EAClC,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,UAAU,GAAG,EAAoB,CAAC,IAEnD,4DAAK,KAAK,EAAC,kCAAkC,IAC3C,6DAAM,IAAI,EAAC,SAAS,GAAG,CACnB,CACF,CACD,EACP;KACH;;;;;;;;;;","names":[],"sources":["src/components/nv-accordion-item/styles/nv-accordion-item.scss?tag=nv-accordion-item","src/components/nv-accordion-item/nv-accordion-item.tsx"],"sourcesContent":["@use './mixins' as *;\n\nnv-accordion-item {\n @include accordion-item-root();\n\n .nv-accordion-item__header {\n @include accordion-item-header();\n\n .nv-accordion-item__chevron {\n @include accordion-item-chevron();\n }\n\n .nv-accordion-item__header-content {\n @include accordion-item-header-content();\n }\n\n .nv-accordion-item__title {\n @include accordion-item-title();\n }\n\n .nv-accordion-item__subtitle {\n @include accordion-item-subtitle();\n }\n }\n\n .nv-accordion-item__content {\n @include accordion-item-content();\n\n .nv-accordion-item__content-inner {\n @include accordion-item-content-inner();\n }\n }\n\n // Styles for disabled items\n &.is-disabled {\n @include accordion-item-disabled();\n }\n\n // Border between header and content when item is open\n &.is-open .nv-accordion-item__header {\n border-bottom: var(--spacing-px) solid var(--color-content-low-border);\n }\n\n // ✅ Add this\n &:last-child {\n .nv-accordion-item__content {\n border-radius: 0 0 calc(var(--radius-rounded-lg) - var(--spacing-px))\n calc(var(--radius-rounded-lg) - var(--spacing-px));\n }\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Method,\n State,\n Element,\n Watch,\n} from '@stencil/core';\nimport { useCollapse } from '../../animations';\n\n/**\n * Accordion item element for nv-accordion.\n *\n * @slot header - Custom header (replaces itemTitle/subtitle)\n * @slot content - Main content (expandable area)\n */\n@Component({\n tag: 'nv-accordion-item',\n styleUrl: 'styles/nv-accordion-item.scss',\n shadow: false,\n})\nexport class NvAccordionItem {\n @Element() el!: HTMLNvAccordionItemElement;\n private contentRef?: HTMLDivElement;\n private mutationObserver?: MutationObserver;\n private isToggling: boolean = false;\n\n /****************************************************************************/\n //#region PROPERTIES\n\n /**\n * Item title (displayed if header slot is absent)\n */\n @Prop({ reflect: true })\n readonly itemTitle?: string;\n\n /**\n * Item subtitle (displayed if header slot is absent)\n */\n @Prop({ reflect: true })\n readonly subtitle?: string;\n\n /**\n * Open or closed\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean = false;\n\n /**\n * Disables the item\n */\n @Prop({ reflect: true })\n readonly disabled: boolean = false;\n\n /**\n * Maximum content height (in px, optional). If not defined, auto height.\n */\n @Prop({ reflect: true })\n readonly maxContentHeight?: number;\n\n /**\n * Parent expansion mode (accordion or multi)\n */\n @Prop({ reflect: true })\n readonly mode?: 'accordion' | 'multi' = 'accordion';\n\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region EVENTS\n\n /**\n * Event emitted on toggle (header click or programmatic change)\n */\n @Event()\n itemToggle: EventEmitter<boolean>;\n\n //#endregion EVENTS\n /****************************************************************************/\n //#region STATE\n\n /**\n * Internal state for open/close rendering\n */\n @State()\n currentOpenState: boolean = false;\n\n /**\n * Controls if the panel has been initialized for animations\n */\n @State()\n isInitialized: boolean = false;\n\n /**\n * Animation in progress\n */\n @State()\n isAnimating: boolean = false;\n\n //#endregion STATE\n /****************************************************************************/\n //#region WATCHERS\n\n @Watch('open')\n async onOpenChanged(newValue: boolean, oldValue: boolean) {\n if (this.disabled) {\n console.warn('[onOpenChanged] Item is disabled, forcing closed state');\n this.currentOpenState = false;\n this.open = false;\n return;\n }\n\n this.currentOpenState = newValue;\n\n const isInitialRender = oldValue === undefined;\n if (!isInitialRender) {\n if (newValue === false && !this.isToggling) {\n this.itemToggle.emit(newValue);\n } else if (newValue && !this.isToggling) {\n this.itemToggle.emit(newValue);\n }\n await this.updateVisibility(newValue);\n }\n }\n\n //#endregion WATCHERS\n /****************************************************************************/\n //#region ANIMATIONS\n\n /**\n * Updates the visibility state with Nova animation system\n * @param {boolean} open - Whether the accordion item should be open\n */\n private async updateVisibility(open: boolean) {\n if (!this.contentRef) {\n console.error('[updateVisibility] No contentRef available');\n return;\n }\n\n this.isAnimating = true;\n\n const { collapse, expand } = useCollapse(this.contentRef, {\n duration: 200,\n });\n\n if (open) {\n await expand();\n } else {\n await collapse();\n }\n\n this.isAnimating = false;\n }\n\n //#endregion ANIMATIONS\n /****************************************************************************/\n //#region LIFECYCLE\n\n componentWillLoad() {\n this.currentOpenState = this.open;\n }\n\n componentDidLoad() {\n if (this.contentRef) {\n setTimeout(() => {\n const { setExpanded, setCollapsed } = useCollapse(this.contentRef!, {\n duration: 200,\n });\n\n if (this.open) {\n setExpanded();\n this.currentOpenState = true;\n } else {\n setCollapsed();\n this.currentOpenState = false;\n }\n this.isInitialized = true;\n }, 0);\n }\n }\n\n disconnectedCallback() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n }\n\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region METHODS\n\n /**\n * Toggle open/close (Public API)\n */\n @Method()\n async toggle() {\n if (!this.disabled && !this.isAnimating) {\n this.isToggling = true;\n const newOpen = !this.open;\n\n this.open = newOpen;\n this.itemToggle.emit(newOpen);\n\n this.isToggling = false;\n } else {\n console.warn('[toggle] Ignored toggle (disabled or animating)');\n }\n }\n\n /**\n * Handler for header click\n */\n private handleHeaderClick = () => {\n this.toggle();\n };\n\n /**\n * Handler for iconbutton click\n * @param {Event} e - Click event\n */\n private handleIconClick = (e: Event) => {\n e.stopPropagation();\n this.toggle();\n };\n\n /**\n * Handler for keyboard events on iconbutton\n * @param {KeyboardEvent} e - Keyboard event\n */\n private handleHeaderKeyDown = (e: KeyboardEvent) => {\n if (this.disabled) {\n console.warn('[handleHeaderKeyDown] Ignored (disabled)');\n return;\n }\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n this.toggle();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n this.isToggling = true;\n this.open = true;\n this.itemToggle.emit(true);\n this.isToggling = false;\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.open) {\n this.isToggling = true;\n this.open = false;\n this.itemToggle.emit(false);\n this.isToggling = false;\n }\n break;\n }\n };\n\n /**\n * Get the chevron icon name based on open state\n * @returns {string} The icon name to display in the chevron button\n */\n private get chevronIconName(): string {\n const name = this.open ? 'chevron-top' : 'chevron-down';\n return name;\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region RENDER\n\n render() {\n return (\n <Host\n class={{\n 'nv-accordion-item': true,\n 'is-open': this.currentOpenState,\n 'is-disabled': this.disabled,\n 'is-animating': this.isAnimating,\n }}\n role=\"listitem\"\n aria-expanded={this.currentOpenState ? 'true' : 'false'}\n aria-disabled={this.disabled ? 'true' : 'false'}\n >\n <div\n class=\"nv-accordion-item__header\"\n onClick={this.handleHeaderClick}\n aria-controls=\"content\"\n >\n <slot name=\"header\">\n <div class=\"nv-accordion-item__header-content\">\n {this.itemTitle && (\n <span class=\"nv-accordion-item__title\">{this.itemTitle}</span>\n )}\n {this.subtitle && (\n <span class=\"nv-accordion-item__subtitle\">{this.subtitle}</span>\n )}\n </div>\n </slot>\n <nv-iconbutton\n emphasis=\"low\"\n size=\"sm\"\n shape=\"square\"\n name={this.chevronIconName}\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleIconClick}\n onKeyDown={this.handleHeaderKeyDown}\n aria-controls=\"content\"\n aria-label={\n this.currentOpenState ? 'Close the section' : 'Open the section'\n }\n ></nv-iconbutton>\n </div>\n\n <div\n id=\"content\"\n class=\"nv-accordion-item__content\"\n ref={el => (this.contentRef = el as HTMLDivElement)}\n >\n <div class=\"nv-accordion-item__content-inner\">\n <slot name=\"content\" />\n </div>\n </div>\n </Host>\n );\n }\n\n // #endregion RENDER\n}\n"],"version":3}
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-a1936cd0.js';
1
+ import { r as registerInstance, c as createEvent, f as forceUpdate, h, H as Host, g as getElement } from './index-a1936cd0.js';
2
2
 
3
3
  const nvAccordionCss = "nv-accordion{display:block;border:var(--spacing-px) solid var(--color-content-low-border);border-radius:var(--radius-rounded-lg)}nv-accordion .nv-accordion__footer{padding:var(--spacing-3);background:var(--color-level-05-background);border-radius:0 0 var(--radius-rounded-lg) var(--radius-rounded-lg);margin-top:calc(var(--spacing-px) * -1);border-top:var(--spacing-px) solid var(--color-content-low-border)}nv-accordion .nv-accordion__footer:empty{display:none}";
4
4
  const NvAccordionStyle0 = nvAccordionCss;
@@ -17,13 +17,14 @@ const NvAccordion = class {
17
17
  * Expansion mode: 'accordion' (single open) or 'multi' (multiple open)
18
18
  */
19
19
  this.mode = 'accordion';
20
+ /**
21
+ * Index of open items (external control possible)
22
+ */
23
+ this.openIndexes = [];
20
24
  //#endregion PROPERTIES
21
25
  /****************************************************************************/
22
26
  //#region STATE
23
- /**
24
- * Internal index of open items (not exposed)
25
- */
26
- this.internalOpenIndexes = [];
27
+ this.updatingFromInternal = false;
27
28
  }
28
29
  //#endregion EVENTS
29
30
  /****************************************************************************/
@@ -48,113 +49,126 @@ const NvAccordion = class {
48
49
  * @param {boolean} [forceOpen] Force open (true) or close (false)
49
50
  */
50
51
  toggleItem(index, forceOpen) {
51
- let openIndexes = this.openIndexes !== undefined
52
- ? [...this.openIndexes]
53
- : [...(this.internalOpenIndexes || [])];
52
+ const items = Array.from(this.el.querySelectorAll('nv-accordion-item'));
53
+ const item = items[index];
54
+ if (!item || item.disabled) {
55
+ console.warn('[toggleItem] Item not found or disabled:', index);
56
+ this.openChanged.emit({ openIndexes: [...(this.openIndexes || [])] });
57
+ return;
58
+ }
59
+ let openIndexes = [...(this.openIndexes || [])];
54
60
  const isOpen = openIndexes.includes(index);
55
61
  if (this.mode === 'accordion') {
56
- openIndexes = forceOpen === false || isOpen ? [] : [index];
62
+ openIndexes =
63
+ forceOpen === false || (forceOpen === undefined && isOpen)
64
+ ? []
65
+ : [index];
57
66
  }
58
67
  else {
59
68
  if (forceOpen === false) {
60
69
  openIndexes = openIndexes.filter(i => i !== index);
61
70
  }
62
- else if (!isOpen) {
71
+ else if (forceOpen === true && !isOpen) {
63
72
  openIndexes.push(index);
64
73
  }
74
+ else if (forceOpen === undefined) {
75
+ openIndexes = isOpen
76
+ ? openIndexes.filter(i => i !== index)
77
+ : [...openIndexes, index];
78
+ }
65
79
  }
66
- this.internalOpenIndexes = openIndexes;
67
- this.openChanged.emit({ openIndexes });
68
- if (this.openIndexes !== undefined) {
69
- this.openIndexes =
70
- this.mode === 'accordion'
71
- ? [openIndexes[0]].filter(x => x !== undefined)
72
- : [...openIndexes];
73
- }
74
- // Update child elements state - for both data and slot usage
80
+ this.updatingFromInternal = true;
81
+ this.openIndexes = [...openIndexes];
75
82
  this.updateChildrenState();
83
+ this.updatingFromInternal = false;
84
+ this.openChanged.emit({ openIndexes: [...openIndexes] });
76
85
  }
77
86
  /**
78
- * Updates the open state of child elements based on internalOpenIndexes
87
+ * Updates the open state of child elements based on openIndexes
79
88
  */
80
89
  async updateChildrenState() {
81
- // Force a re-render by updating the state
82
- this.internalOpenIndexes = [...(this.internalOpenIndexes || [])];
90
+ const items = Array.from(this.el.querySelectorAll('nv-accordion-item'));
91
+ items.forEach((item, i) => {
92
+ const shouldBeOpen = (this.openIndexes || []).includes(i);
93
+ item.open = shouldBeOpen;
94
+ item.mode = this.mode;
95
+ item.setAttribute('aria-expanded', shouldBeOpen ? 'true' : 'false');
96
+ forceUpdate(item);
97
+ });
83
98
  }
84
99
  /**
85
100
  * Listens to itemToggle events from nv-accordion-item elements
86
101
  * @param {CustomEvent<boolean>} event Event emitted by nv-accordion-item
87
102
  */
88
103
  onItemToggle(event) {
89
- // Find the index of the item that emitted the event
104
+ if (this.updatingFromInternal) {
105
+ return;
106
+ }
90
107
  const items = Array.from(this.el.querySelectorAll('nv-accordion-item'));
91
108
  const targetItem = event.target;
92
109
  const index = items.indexOf(targetItem);
93
110
  if (index !== -1) {
94
- // If the event comes from an item that is opening, handle accordion mode
95
- if (event.detail === true) {
96
- if (this.mode === 'accordion') {
97
- // Close all other items
98
- items.forEach((item, i) => {
99
- if (i !== index && item.open) {
100
- item.open = false;
101
- }
102
- });
103
- this.internalOpenIndexes = [index];
104
- }
105
- else {
106
- // Add index to internalOpenIndexes if not already present
107
- if (!this.internalOpenIndexes.includes(index)) {
108
- this.internalOpenIndexes = [...this.internalOpenIndexes, index];
109
- }
110
- }
111
- }
112
- else {
113
- // If the item is closing, remove it from internalOpenIndexes
114
- this.internalOpenIndexes = this.internalOpenIndexes.filter(i => i !== index);
115
- }
116
- // Emit openChanged event
117
- this.openChanged.emit({ openIndexes: this.internalOpenIndexes });
118
- if (this.openIndexes !== undefined) {
119
- this.openIndexes =
120
- this.mode === 'accordion'
121
- ? [this.internalOpenIndexes[0]].filter(x => x !== undefined)
122
- : [...this.internalOpenIndexes];
123
- }
111
+ this.toggleItem(index, event.detail);
112
+ }
113
+ else {
114
+ console.warn('[onItemToggle] Target item not found in items list');
124
115
  }
125
116
  }
126
117
  //#endregion METHODS
127
118
  /****************************************************************************/
128
119
  //#region WATCHERS
120
+ onOpenIndexesChange(newValue, oldValue) {
121
+ if (!this.updatingFromInternal &&
122
+ newValue !== undefined &&
123
+ newValue !== oldValue) {
124
+ this.updateChildrenState();
125
+ }
126
+ }
127
+ onModeChange() {
128
+ this.updateChildrenState();
129
+ }
129
130
  //#endregion WATCHERS
130
131
  /****************************************************************************/
131
132
  //#region LIFECYCLE
132
133
  componentWillLoad() {
133
- if (this.openIndexes !== undefined) {
134
- this.internalOpenIndexes = [...this.openIndexes];
135
- }
136
- }
137
- componentDidLoad() {
138
- // If using direct child elements, initialize their state
139
- if (!this.data || this.data.length === 0) {
140
- this.updateChildrenState();
134
+ if (this.openIndexes === undefined) {
135
+ this.openIndexes = [];
141
136
  }
142
137
  }
143
- componentWillUpdate() {
144
- if (this.openIndexes !== undefined) {
145
- this.internalOpenIndexes = [...this.openIndexes];
138
+ async componentDidLoad() {
139
+ var _a;
140
+ const items = Array.from(this.el.querySelectorAll('nv-accordion-item'));
141
+ // Only initialize openIndexes from child items if no data is provided and openIndexes is not explicitly set
142
+ if (!((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) &&
143
+ (!this.openIndexes || this.openIndexes.length === 0)) {
144
+ const childOpenIndexes = items
145
+ .map((item, i) => (item.hasAttribute('open') || item.open ? i : -1))
146
+ .filter(i => i !== -1);
147
+ if (childOpenIndexes.length > 0) {
148
+ this.updatingFromInternal = true;
149
+ this.openIndexes = [...childOpenIndexes];
150
+ this.updatingFromInternal = false;
151
+ this.openChanged.emit({ openIndexes: [...this.openIndexes] });
152
+ }
146
153
  }
154
+ // Ensure children are in sync with current openIndexes state
155
+ await this.updateChildrenState();
147
156
  }
148
157
  //#endregion LIFECYCLE
149
158
  /****************************************************************************/
150
159
  //#region RENDER
151
160
  render() {
152
- return (h(Host, { key: 'a6cb21b274024a00e60e0d0db780f25fab6e5bc2', role: "list", class: "nv-accordion" }, this.data && this.data.length > 0 ? (this.data.map((item, i) => {
161
+ var _a;
162
+ return (h(Host, { key: 'b5c36f19bcbd0d06e9d924ae6f9630b8b6cae05a', role: "list", class: "nv-accordion" }, ((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) ? (this.data.map((item, i) => {
153
163
  var _a;
154
- return (h("nv-accordion-item", { key: (_a = item.id) !== null && _a !== void 0 ? _a : i, itemTitle: item.title, disabled: item.disabled, open: (this.internalOpenIndexes || []).includes(i) }, item.subtitle ? (h("div", { slot: "header" }, h("div", { class: "nv-accordion-item__header-content" }, h("span", { class: "nv-accordion-item__title" }, item.title), h("span", { class: "nv-accordion-item__subtitle" }, item.subtitle)))) : null, h("div", { slot: "content" }, item.content), item.footer && h("div", { slot: "footer" }, item.footer)));
164
+ return (h("nv-accordion-item", { key: (_a = item.id) !== null && _a !== void 0 ? _a : i, itemTitle: item.title, disabled: item.disabled, open: (this.openIndexes || []).includes(i), mode: this.mode }, item.subtitle ? (h("div", { slot: "header" }, h("div", { class: "nv-accordion-item__header-content" }, h("span", { class: "nv-accordion-item__title" }, item.title), h("span", { class: "nv-accordion-item__subtitle" }, item.subtitle)))) : null, h("div", { slot: "content" }, item.content), item.footer && h("div", { slot: "footer" }, item.footer)));
155
165
  })) : (h("slot", null))));
156
166
  }
157
167
  get el() { return getElement(this); }
168
+ static get watchers() { return {
169
+ "openIndexes": ["onOpenIndexesChange"],
170
+ "mode": ["onModeChange"]
171
+ }; }
158
172
  };
159
173
  NvAccordion.style = NvAccordionStyle0;
160
174
 
@@ -1 +1 @@
1
- {"file":"nv-accordion.entry.js","mappings":"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","names":[],"sources":["src/components/nv-accordion/styles/nv-accordion.scss?tag=nv-accordion","src/components/nv-accordion/nv-accordion.tsx"],"sourcesContent":["@use \"./mixins\" as *;\n\nnv-accordion {\n @include accordion-root();\n\n .nv-accordion__footer {\n @include accordion-footer();\n\n &:empty {\n @include accordion-footer-empty();\n }\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Method,\n Listen,\n Element,\n} from '@stencil/core';\n\n/**\n * @slot default - Slot for custom content (optional, ignored if data is provided)\n */\n@Component({\n tag: 'nv-accordion',\n styleUrl: 'styles/nv-accordion.scss',\n shadow: false,\n})\nexport class NvAccordion {\n /****************************************************************************/\n //#region PROPERTIES\n /**\n * Data to display as a list of items (title, subtitle, content).\n */\n @Prop({ reflect: false })\n readonly data: {\n /** Unique identifier of the item */\n id: string;\n /** Item title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Main content */\n content: string;\n /** Optional footer */\n footer?: string;\n /** Disabled state */\n disabled?: boolean;\n }[] = [];\n\n /**\n * Expansion mode: 'accordion' (single open) or 'multi' (multiple open)\n */\n @Prop({ reflect: true })\n readonly mode: 'accordion' | 'multi' = 'accordion';\n\n /**\n * Index of open items (external control possible)\n */\n @Prop({ reflect: false, mutable: true })\n openIndexes?: number[];\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region STATE\n /**\n * Internal index of open items (not exposed)\n */\n @State()\n internalOpenIndexes: number[] = [];\n\n /**\n * Reference to host element to access children\n */\n @Element() el!: HTMLNvAccordionElement;\n //#endregion STATE\n /****************************************************************************/\n //#region EVENTS\n /**\n * Event emitted when an item's open state changes\n */\n @Event()\n openChanged: EventEmitter<{\n /** Index of open items */\n openIndexes: number[];\n }>;\n //#endregion EVENTS\n /****************************************************************************/\n //#region METHODS\n /**\n * Opens an item by its index (Public API)\n * @param {number} index Index of the item to open\n */\n @Method()\n async open(index: number) {\n this.toggleItem(index, true);\n }\n /**\n * Closes an item by its index (Public API)\n * @param {number} index Index of the item to close\n */\n @Method()\n async close(index: number) {\n this.toggleItem(index, false);\n }\n /**\n * Toggles an item's state (internal)\n * @param {number} index Item index\n * @param {boolean} [forceOpen] Force open (true) or close (false)\n */\n private toggleItem(index: number, forceOpen?: boolean) {\n let openIndexes =\n this.openIndexes !== undefined\n ? [...this.openIndexes]\n : [...(this.internalOpenIndexes || [])];\n const isOpen = openIndexes.includes(index);\n if (this.mode === 'accordion') {\n openIndexes = forceOpen === false || isOpen ? [] : [index];\n } else {\n if (forceOpen === false) {\n openIndexes = openIndexes.filter(i => i !== index);\n } else if (!isOpen) {\n openIndexes.push(index);\n }\n }\n this.internalOpenIndexes = openIndexes;\n this.openChanged.emit({ openIndexes });\n if (this.openIndexes !== undefined) {\n this.openIndexes =\n this.mode === 'accordion'\n ? [openIndexes[0]].filter(x => x !== undefined)\n : [...openIndexes];\n }\n\n // Update child elements state - for both data and slot usage\n this.updateChildrenState();\n }\n\n /**\n * Updates the open state of child elements based on internalOpenIndexes\n */\n private async updateChildrenState() {\n // Force a re-render by updating the state\n this.internalOpenIndexes = [...(this.internalOpenIndexes || [])];\n }\n\n /**\n * Listens to itemToggle events from nv-accordion-item elements\n * @param {CustomEvent<boolean>} event Event emitted by nv-accordion-item\n */\n @Listen('itemToggle')\n onItemToggle(event: CustomEvent<boolean>) {\n // Find the index of the item that emitted the event\n const items = Array.from(\n this.el.querySelectorAll('nv-accordion-item'),\n ) as HTMLNvAccordionItemElement[];\n const targetItem = event.target as HTMLNvAccordionItemElement;\n const index = items.indexOf(targetItem);\n\n if (index !== -1) {\n // If the event comes from an item that is opening, handle accordion mode\n if (event.detail === true) {\n if (this.mode === 'accordion') {\n // Close all other items\n items.forEach((item, i) => {\n if (i !== index && item.open) {\n item.open = false;\n }\n });\n this.internalOpenIndexes = [index];\n } else {\n // Add index to internalOpenIndexes if not already present\n if (!this.internalOpenIndexes.includes(index)) {\n this.internalOpenIndexes = [...this.internalOpenIndexes, index];\n }\n }\n } else {\n // If the item is closing, remove it from internalOpenIndexes\n this.internalOpenIndexes = this.internalOpenIndexes.filter(\n i => i !== index,\n );\n }\n\n // Emit openChanged event\n this.openChanged.emit({ openIndexes: this.internalOpenIndexes });\n if (this.openIndexes !== undefined) {\n this.openIndexes =\n this.mode === 'accordion'\n ? [this.internalOpenIndexes[0]].filter(x => x !== undefined)\n : [...this.internalOpenIndexes];\n }\n }\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region WATCHERS\n //#endregion WATCHERS\n /****************************************************************************/\n //#region LIFECYCLE\n componentWillLoad() {\n if (this.openIndexes !== undefined) {\n this.internalOpenIndexes = [...this.openIndexes];\n }\n }\n\n componentDidLoad() {\n // If using direct child elements, initialize their state\n if (!this.data || this.data.length === 0) {\n this.updateChildrenState();\n }\n }\n\n componentWillUpdate() {\n if (this.openIndexes !== undefined) {\n this.internalOpenIndexes = [...this.openIndexes];\n }\n }\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region RENDER\n render() {\n return (\n <Host role=\"list\" class=\"nv-accordion\">\n {this.data && this.data.length > 0 ? (\n this.data.map((item, i) => (\n <nv-accordion-item\n key={item.id ?? i}\n itemTitle={item.title}\n disabled={item.disabled}\n open={(this.internalOpenIndexes || []).includes(i)}\n >\n {item.subtitle ? (\n <div slot=\"header\">\n <div class=\"nv-accordion-item__header-content\">\n <span class=\"nv-accordion-item__title\">{item.title}</span>\n <span class=\"nv-accordion-item__subtitle\">\n {item.subtitle}\n </span>\n </div>\n </div>\n ) : null}\n <div slot=\"content\">{item.content}</div>\n {item.footer && <div slot=\"footer\">{item.footer}</div>}\n </nv-accordion-item>\n ))\n ) : (\n <slot></slot>\n )}\n </Host>\n );\n }\n // #endregion RENDER\n}\n"],"version":3}
1
+ {"file":"nv-accordion.entry.js","mappings":"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","names":[],"sources":["src/components/nv-accordion/styles/nv-accordion.scss?tag=nv-accordion","src/components/nv-accordion/nv-accordion.tsx"],"sourcesContent":["@use \"./mixins\" as *;\n\nnv-accordion {\n @include accordion-root();\n\n .nv-accordion__footer {\n @include accordion-footer();\n\n &:empty {\n @include accordion-footer-empty();\n }\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Method,\n Listen,\n Element,\n forceUpdate,\n Watch,\n} from '@stencil/core';\n\n/**\n * @slot default - Slot for custom content (optional, ignored if data is provided)\n */\n@Component({\n tag: 'nv-accordion',\n styleUrl: 'styles/nv-accordion.scss',\n shadow: false,\n})\nexport class NvAccordion {\n /****************************************************************************/\n //#region PROPERTIES\n\n /**\n * Data to display as a list of items (title, subtitle, content).\n */\n @Prop({ reflect: false })\n readonly data: {\n /** Unique identifier of the item */\n id: string;\n /** Item title */\n title: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Main content */\n content: string;\n /** Optional footer */\n footer?: string;\n /** Disabled state */\n disabled?: boolean;\n }[] = [];\n\n /**\n * Expansion mode: 'accordion' (single open) or 'multi' (multiple open)\n */\n @Prop({ reflect: true })\n readonly mode: 'accordion' | 'multi' = 'accordion';\n\n /**\n * Index of open items (external control possible)\n */\n @Prop({ reflect: false, mutable: true })\n openIndexes?: number[] = [];\n\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region STATE\n\n @State()\n private updatingFromInternal: boolean = false;\n\n /**\n * Reference to host element to access children\n */\n @Element() el!: HTMLNvAccordionElement;\n\n //#endregion STATE\n /****************************************************************************/\n //#region EVENTS\n\n /**\n * Event emitted when an item's open state changes\n */\n @Event()\n openChanged: EventEmitter<{\n /** Index of open items */\n openIndexes: number[];\n }>;\n\n //#endregion EVENTS\n /****************************************************************************/\n //#region METHODS\n\n /**\n * Opens an item by its index (Public API)\n * @param {number} index Index of the item to open\n */\n @Method()\n async open(index: number) {\n this.toggleItem(index, true);\n }\n\n /**\n * Closes an item by its index (Public API)\n * @param {number} index Index of the item to close\n */\n @Method()\n async close(index: number) {\n this.toggleItem(index, false);\n }\n\n /**\n * Toggles an item's state (internal)\n * @param {number} index Item index\n * @param {boolean} [forceOpen] Force open (true) or close (false)\n */\n private toggleItem(index: number, forceOpen?: boolean) {\n const items = Array.from(\n this.el.querySelectorAll('nv-accordion-item'),\n ) as HTMLNvAccordionItemElement[];\n const item = items[index];\n\n if (!item || item.disabled) {\n console.warn('[toggleItem] Item not found or disabled:', index);\n this.openChanged.emit({ openIndexes: [...(this.openIndexes || [])] });\n return;\n }\n\n let openIndexes = [...(this.openIndexes || [])];\n const isOpen = openIndexes.includes(index);\n\n if (this.mode === 'accordion') {\n openIndexes =\n forceOpen === false || (forceOpen === undefined && isOpen)\n ? []\n : [index];\n } else {\n if (forceOpen === false) {\n openIndexes = openIndexes.filter(i => i !== index);\n } else if (forceOpen === true && !isOpen) {\n openIndexes.push(index);\n } else if (forceOpen === undefined) {\n openIndexes = isOpen\n ? openIndexes.filter(i => i !== index)\n : [...openIndexes, index];\n }\n }\n\n this.updatingFromInternal = true;\n this.openIndexes = [...openIndexes];\n this.updateChildrenState();\n this.updatingFromInternal = false;\n\n this.openChanged.emit({ openIndexes: [...openIndexes] });\n }\n\n /**\n * Updates the open state of child elements based on openIndexes\n */\n private async updateChildrenState() {\n const items = Array.from(\n this.el.querySelectorAll('nv-accordion-item'),\n ) as HTMLNvAccordionItemElement[];\n\n items.forEach((item, i) => {\n const shouldBeOpen = (this.openIndexes || []).includes(i);\n item.open = shouldBeOpen;\n item.mode = this.mode;\n item.setAttribute('aria-expanded', shouldBeOpen ? 'true' : 'false');\n forceUpdate(item);\n });\n }\n\n /**\n * Listens to itemToggle events from nv-accordion-item elements\n * @param {CustomEvent<boolean>} event Event emitted by nv-accordion-item\n */\n @Listen('itemToggle')\n onItemToggle(event: CustomEvent<boolean>) {\n if (this.updatingFromInternal) {\n return;\n }\n\n const items = Array.from(\n this.el.querySelectorAll('nv-accordion-item'),\n ) as HTMLNvAccordionItemElement[];\n const targetItem = event.target as HTMLNvAccordionItemElement;\n const index = items.indexOf(targetItem);\n\n if (index !== -1) {\n this.toggleItem(index, event.detail);\n } else {\n console.warn('[onItemToggle] Target item not found in items list');\n }\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region WATCHERS\n\n @Watch('openIndexes')\n onOpenIndexesChange(\n newValue: number[] | undefined,\n oldValue: number[] | undefined,\n ) {\n if (\n !this.updatingFromInternal &&\n newValue !== undefined &&\n newValue !== oldValue\n ) {\n this.updateChildrenState();\n }\n }\n\n @Watch('mode')\n onModeChange() {\n this.updateChildrenState();\n }\n\n //#endregion WATCHERS\n /****************************************************************************/\n //#region LIFECYCLE\n\n componentWillLoad() {\n if (this.openIndexes === undefined) {\n this.openIndexes = [];\n }\n }\n\n async componentDidLoad() {\n const items = Array.from(\n this.el.querySelectorAll('nv-accordion-item'),\n ) as HTMLNvAccordionItemElement[];\n\n // Only initialize openIndexes from child items if no data is provided and openIndexes is not explicitly set\n if (\n !this.data?.length &&\n (!this.openIndexes || this.openIndexes.length === 0)\n ) {\n const childOpenIndexes = items\n .map((item, i) => (item.hasAttribute('open') || item.open ? i : -1))\n .filter(i => i !== -1);\n\n if (childOpenIndexes.length > 0) {\n this.updatingFromInternal = true;\n this.openIndexes = [...childOpenIndexes];\n this.updatingFromInternal = false;\n\n this.openChanged.emit({ openIndexes: [...this.openIndexes] });\n }\n }\n\n // Ensure children are in sync with current openIndexes state\n await this.updateChildrenState();\n }\n\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region RENDER\n\n render() {\n return (\n <Host role=\"list\" class=\"nv-accordion\">\n {this.data?.length ? (\n this.data.map((item, i) => (\n <nv-accordion-item\n key={item.id ?? i}\n itemTitle={item.title}\n disabled={item.disabled}\n open={(this.openIndexes || []).includes(i)}\n mode={this.mode}\n >\n {item.subtitle ? (\n <div slot=\"header\">\n <div class=\"nv-accordion-item__header-content\">\n <span class=\"nv-accordion-item__title\">{item.title}</span>\n <span class=\"nv-accordion-item__subtitle\">\n {item.subtitle}\n </span>\n </div>\n </div>\n ) : null}\n <div slot=\"content\">{item.content}</div>\n {item.footer && <div slot=\"footer\">{item.footer}</div>}\n </nv-accordion-item>\n ))\n ) : (\n <slot></slot>\n )}\n </Host>\n );\n }\n\n // #endregion RENDER\n}\n"],"version":3}