@nova-design-system/nova-webcomponents 3.2.0 → 3.4.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 (431) hide show
  1. package/dist/cjs/{index-108ddff0.js → index-c56424e5.js} +18 -186
  2. package/dist/cjs/index-c56424e5.js.map +1 -0
  3. package/dist/cjs/loader.cjs.js +2 -2
  4. package/dist/cjs/native.cjs.js +2 -23
  5. package/dist/cjs/native.cjs.js.map +1 -1
  6. package/dist/cjs/nv-alert.cjs.entry.js +1 -1
  7. package/dist/cjs/nv-avatar.cjs.entry.js +1 -1
  8. package/dist/cjs/nv-badge_2.cjs.entry.js +1 -1
  9. package/dist/cjs/nv-breadcrumb.cjs.entry.js +1 -1
  10. package/dist/cjs/nv-breadcrumbs.cjs.entry.js +1 -1
  11. package/dist/cjs/nv-button.cjs.entry.js +1 -1
  12. package/dist/cjs/nv-calendar.cjs.entry.js +391 -142
  13. package/dist/cjs/nv-calendar.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nv-col.cjs.entry.js +1 -1
  15. package/dist/cjs/nv-datagrid.cjs.entry.js +45 -12
  16. package/dist/cjs/nv-datagrid.cjs.entry.js.map +1 -1
  17. package/dist/cjs/nv-datagridcolumn.cjs.entry.js +1 -1
  18. package/dist/cjs/nv-dialog.cjs.entry.js +1 -1
  19. package/dist/cjs/nv-dialogfooter_2.cjs.entry.js +1 -1
  20. package/dist/cjs/nv-fieldcheckbox.cjs.entry.js +1 -1
  21. package/dist/cjs/nv-fielddate.cjs.entry.js +45 -11
  22. package/dist/cjs/nv-fielddate.cjs.entry.js.map +1 -1
  23. package/dist/cjs/nv-fielddaterange.cjs.entry.js +98 -44
  24. package/dist/cjs/nv-fielddaterange.cjs.entry.js.map +1 -1
  25. package/dist/cjs/nv-fielddropdown.cjs.entry.js +2 -2
  26. package/dist/cjs/nv-fielddropdown.cjs.entry.js.map +1 -1
  27. package/dist/cjs/nv-fielddropdownitem.cjs.entry.js +1 -1
  28. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js +2 -2
  29. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js.map +1 -1
  30. package/dist/cjs/nv-fieldnumber.cjs.entry.js +5 -5
  31. package/dist/cjs/nv-fieldnumber.cjs.entry.js.map +1 -1
  32. package/dist/cjs/nv-fieldpassword.cjs.entry.js +5 -5
  33. package/dist/cjs/nv-fieldpassword.cjs.entry.js.map +1 -1
  34. package/dist/cjs/nv-fieldradio.cjs.entry.js +4 -4
  35. package/dist/cjs/nv-fieldselect.cjs.entry.js +7 -7
  36. package/dist/cjs/nv-fieldselect.cjs.entry.js.map +1 -1
  37. package/dist/cjs/nv-fieldslider.cjs.entry.js +28 -23
  38. package/dist/cjs/nv-fieldslider.cjs.entry.js.map +1 -1
  39. package/dist/cjs/nv-fieldtext.cjs.entry.js +5 -5
  40. package/dist/cjs/nv-fieldtext.cjs.entry.js.map +1 -1
  41. package/dist/cjs/nv-fieldtextarea.cjs.entry.js +5 -5
  42. package/dist/cjs/nv-fieldtextarea.cjs.entry.js.map +1 -1
  43. package/dist/cjs/nv-fieldtime.cjs.entry.js +11 -11
  44. package/dist/cjs/nv-fieldtime.cjs.entry.js.map +1 -1
  45. package/dist/cjs/nv-icon.cjs.entry.js +2 -2
  46. package/dist/cjs/nv-iconbutton_2.cjs.entry.js +3 -3
  47. package/dist/cjs/nv-menu.cjs.entry.js +2 -2
  48. package/dist/cjs/nv-menuitem.cjs.entry.js +2 -2
  49. package/dist/cjs/nv-popover.cjs.entry.js +3 -3
  50. package/dist/cjs/nv-popover.cjs.entry.js.map +1 -1
  51. package/dist/cjs/nv-row.cjs.entry.js +2 -2
  52. package/dist/cjs/nv-stack.cjs.entry.js +2 -2
  53. package/dist/cjs/nv-table.cjs.entry.js +3 -3
  54. package/dist/cjs/nv-tablecolumn.cjs.entry.js +1 -1
  55. package/dist/cjs/nv-toggle.cjs.entry.js +3 -3
  56. package/dist/cjs/nv-tooltip.cjs.entry.js +2 -2
  57. package/dist/collection/components/nv-calendar/nv-calendar.js +235 -136
  58. package/dist/collection/components/nv-calendar/nv-calendar.js.map +1 -1
  59. package/dist/collection/components/nv-calendar/nv-calendar.utils.js +32 -7
  60. package/dist/collection/components/nv-calendar/nv-calendar.utils.js.map +1 -1
  61. package/dist/collection/components/nv-calendar/partials/calendar-actions.js +11 -0
  62. package/dist/collection/components/nv-calendar/partials/calendar-actions.js.map +1 -0
  63. package/dist/collection/components/nv-calendar/partials/calendar-grid.js +24 -0
  64. package/dist/collection/components/nv-calendar/partials/calendar-grid.js.map +1 -0
  65. package/dist/collection/components/nv-calendar/partials/calendar-header.js +38 -0
  66. package/dist/collection/components/nv-calendar/partials/calendar-header.js.map +1 -0
  67. package/dist/collection/components/nv-calendar/partials/calendar-shortcuts.js +22 -0
  68. package/dist/collection/components/nv-calendar/partials/calendar-shortcuts.js.map +1 -0
  69. package/dist/collection/components/nv-calendar/partials/day-cell.js +31 -0
  70. package/dist/collection/components/nv-calendar/partials/day-cell.js.map +1 -0
  71. package/dist/collection/components/nv-calendar/partials/index.js +7 -0
  72. package/dist/collection/components/nv-calendar/partials/index.js.map +1 -0
  73. package/dist/collection/components/nv-calendar/partials/week-numbers.js +36 -0
  74. package/dist/collection/components/nv-calendar/partials/week-numbers.js.map +1 -0
  75. package/dist/collection/components/nv-calendar/test/nv-calendar.utils.test.js +692 -651
  76. package/dist/collection/components/nv-calendar/test/nv-calendar.utils.test.js.map +1 -1
  77. package/dist/collection/components/nv-calendar/test/partials/calendar-actions.logic.test.js +169 -0
  78. package/dist/collection/components/nv-calendar/test/partials/calendar-actions.logic.test.js.map +1 -0
  79. package/dist/collection/components/nv-calendar/test/partials/calendar-grid.logic.test.js +262 -0
  80. package/dist/collection/components/nv-calendar/test/partials/calendar-grid.logic.test.js.map +1 -0
  81. package/dist/collection/components/nv-calendar/test/partials/calendar-header.logic.test.js +208 -0
  82. package/dist/collection/components/nv-calendar/test/partials/calendar-header.logic.test.js.map +1 -0
  83. package/dist/collection/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.js +355 -0
  84. package/dist/collection/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.js.map +1 -0
  85. package/dist/collection/components/nv-calendar/test/partials/day-cell.logic.test.js +250 -0
  86. package/dist/collection/components/nv-calendar/test/partials/day-cell.logic.test.js.map +1 -0
  87. package/dist/collection/components/nv-calendar/test/partials/week-numbers.logic.test.js +217 -0
  88. package/dist/collection/components/nv-calendar/test/partials/week-numbers.logic.test.js.map +1 -0
  89. package/dist/collection/components/nv-datagrid/nv-datagrid.docs.js +88 -2
  90. package/dist/collection/components/nv-datagrid/nv-datagrid.docs.js.map +1 -1
  91. package/dist/collection/components/nv-datagrid/nv-datagrid.js +89 -10
  92. package/dist/collection/components/nv-datagrid/nv-datagrid.js.map +1 -1
  93. package/dist/collection/components/nv-fielddate/nv-fielddate.js +56 -16
  94. package/dist/collection/components/nv-fielddate/nv-fielddate.js.map +1 -1
  95. package/dist/collection/components/nv-fielddate/styles/nv-fielddate.css +44 -0
  96. package/dist/collection/components/nv-fielddate/test/nv-fielddate.logic.test.js +196 -0
  97. package/dist/collection/components/nv-fielddate/test/nv-fielddate.logic.test.js.map +1 -0
  98. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.docs.js +0 -1
  99. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.docs.js.map +1 -1
  100. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js +125 -42
  101. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js.map +1 -1
  102. package/dist/collection/components/nv-fielddaterange/styles/nv-fielddaterange.css +44 -0
  103. package/dist/collection/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.js +137 -0
  104. package/dist/collection/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.js.map +1 -0
  105. package/dist/collection/components/nv-fielddropdown/styles/nv-fielddropdown.css +46 -0
  106. package/dist/collection/components/nv-fieldmultiselect/styles/nv-fieldmultiselect.css +46 -0
  107. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.css +44 -0
  108. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.docs.js +8 -0
  109. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.docs.js.map +1 -1
  110. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js +4 -3
  111. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js.map +1 -1
  112. package/dist/collection/components/nv-fieldpassword/nv-fieldpassword.css +44 -0
  113. package/dist/collection/components/nv-fieldpassword/nv-fieldpassword.js +3 -3
  114. package/dist/collection/components/nv-fieldradio/nv-fieldradio.js +3 -3
  115. package/dist/collection/components/nv-fieldselect/nv-fieldselect.css +44 -0
  116. package/dist/collection/components/nv-fieldselect/nv-fieldselect.js +5 -5
  117. package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js +22 -22
  118. package/dist/collection/components/nv-fieldslider/nv-fieldslider.docs.js.map +1 -1
  119. package/dist/collection/components/nv-fieldslider/nv-fieldslider.js +30 -29
  120. package/dist/collection/components/nv-fieldslider/nv-fieldslider.js.map +1 -1
  121. package/dist/collection/components/nv-fieldslider/partials/field-input.js +1 -1
  122. package/dist/collection/components/nv-fieldslider/partials/field-input.js.map +1 -1
  123. package/dist/collection/components/nv-fieldslider/styles/nv-fieldslider.css +99 -20
  124. package/dist/collection/components/nv-fieldtext/nv-fieldtext.css +44 -0
  125. package/dist/collection/components/nv-fieldtext/nv-fieldtext.js +3 -3
  126. package/dist/collection/components/nv-fieldtextarea/nv-fieldtextarea.css +38 -0
  127. package/dist/collection/components/nv-fieldtextarea/nv-fieldtextarea.js +3 -3
  128. package/dist/collection/components/nv-fieldtime/nv-fieldtime.js +9 -9
  129. package/dist/collection/components/nv-fieldtime/styles/nv-fieldtime.css +44 -0
  130. package/dist/collection/components/nv-icon/nv-icon.js +1 -1
  131. package/dist/collection/components/nv-iconbutton/nv-iconbutton.js +1 -1
  132. package/dist/collection/components/nv-loader/nv-loader.js +1 -1
  133. package/dist/collection/components/nv-menu/nv-menu.js +1 -1
  134. package/dist/collection/components/nv-menuitem/nv-menuitem.js +1 -1
  135. package/dist/collection/components/nv-popover/nv-popover.js +3 -3
  136. package/dist/collection/components/nv-popover/nv-popover.js.map +1 -1
  137. package/dist/collection/components/nv-row/nv-row.js +1 -1
  138. package/dist/collection/components/nv-stack/nv-stack.js +1 -1
  139. package/dist/collection/components/nv-table/nv-table.js +2 -2
  140. package/dist/collection/components/nv-toggle/nv-toggle.js +2 -2
  141. package/dist/collection/components/nv-tooltip/nv-tooltip.js +1 -1
  142. package/dist/collection/templates/navigation.docs.js +1 -1
  143. package/dist/collection/templates/navigation.docs.js.map +1 -1
  144. package/dist/components/index.js +1 -1
  145. package/dist/components/nv-alert.js +2 -2
  146. package/dist/components/nv-avatar.js +2 -2
  147. package/dist/components/nv-badge.js +1 -1
  148. package/dist/components/nv-breadcrumb.js +3 -3
  149. package/dist/components/nv-breadcrumbs.js +1 -1
  150. package/dist/components/nv-button.js +1 -1
  151. package/dist/components/nv-calendar.js +1 -1
  152. package/dist/components/nv-col.js +1 -1
  153. package/dist/components/nv-datagrid.js +54 -19
  154. package/dist/components/nv-datagrid.js.map +1 -1
  155. package/dist/components/nv-datagridcolumn.js +1 -1
  156. package/dist/components/nv-dialog.js +6 -6
  157. package/dist/components/nv-dialogfooter.js +1 -1
  158. package/dist/components/nv-dialogheader.js +1 -1
  159. package/dist/components/nv-fieldcheckbox.js +1 -1
  160. package/dist/components/nv-fielddate.js +53 -25
  161. package/dist/components/nv-fielddate.js.map +1 -1
  162. package/dist/components/nv-fielddaterange.js +110 -62
  163. package/dist/components/nv-fielddaterange.js.map +1 -1
  164. package/dist/components/nv-fielddropdown.js +7 -7
  165. package/dist/components/nv-fielddropdown.js.map +1 -1
  166. package/dist/components/nv-fielddropdownitem.js +1 -1
  167. package/dist/components/nv-fielddropdownitemcheck.js +1 -1
  168. package/dist/components/nv-fieldmultiselect.js +9 -9
  169. package/dist/components/nv-fieldmultiselect.js.map +1 -1
  170. package/dist/components/nv-fieldnumber.js +1 -180
  171. package/dist/components/nv-fieldnumber.js.map +1 -1
  172. package/dist/components/nv-fieldpassword.js +8 -8
  173. package/dist/components/nv-fieldpassword.js.map +1 -1
  174. package/dist/components/nv-fieldradio.js +4 -4
  175. package/dist/components/nv-fieldselect.js +10 -10
  176. package/dist/components/nv-fieldselect.js.map +1 -1
  177. package/dist/components/nv-fieldslider.js +49 -26
  178. package/dist/components/nv-fieldslider.js.map +1 -1
  179. package/dist/components/nv-fieldtext.js +1 -1
  180. package/dist/components/nv-fieldtextarea.js +5 -5
  181. package/dist/components/nv-fieldtextarea.js.map +1 -1
  182. package/dist/components/nv-fieldtime.js +15 -15
  183. package/dist/components/nv-fieldtime.js.map +1 -1
  184. package/dist/components/nv-icon.js +1 -1
  185. package/dist/components/nv-iconbutton.js +1 -1
  186. package/dist/components/nv-loader.js +1 -1
  187. package/dist/components/nv-menu.js +5 -5
  188. package/dist/components/nv-menuitem.js +1 -1
  189. package/dist/components/nv-popover.js +1 -1
  190. package/dist/components/nv-row.js +2 -2
  191. package/dist/components/nv-stack.js +2 -2
  192. package/dist/components/nv-table.js +3 -3
  193. package/dist/components/nv-tablecolumn.js +1 -1
  194. package/dist/components/nv-toggle.js +3 -3
  195. package/dist/components/nv-tooltip.js +1 -1
  196. package/dist/components/{p-0ab80d95.js → p-131e5140.js} +4 -4
  197. package/dist/components/{p-0ab80d95.js.map → p-131e5140.js.map} +1 -1
  198. package/dist/components/{p-cbdc2c8b.js → p-3f567fde.js} +5 -5
  199. package/dist/components/{p-cbdc2c8b.js.map → p-3f567fde.js.map} +1 -1
  200. package/dist/components/p-3f58525b.js +167 -0
  201. package/dist/components/{p-f0a5e7e4.js.map → p-3f58525b.js.map} +1 -1
  202. package/dist/components/{p-33e231f4.js → p-6277f746.js} +2 -2
  203. package/dist/components/{p-33e231f4.js.map → p-6277f746.js.map} +1 -1
  204. package/dist/components/{p-07a89754.js → p-953d8b4d.js} +3 -3
  205. package/dist/components/{p-07a89754.js.map → p-953d8b4d.js.map} +1 -1
  206. package/dist/components/{p-dd2273a3.js → p-9e6e26cb.js} +2 -2
  207. package/dist/components/{p-dd2273a3.js.map → p-9e6e26cb.js.map} +1 -1
  208. package/dist/components/{p-d19b41d2.js → p-9f1e8ef3.js} +2 -2
  209. package/dist/components/{p-d19b41d2.js.map → p-9f1e8ef3.js.map} +1 -1
  210. package/dist/components/{p-4656efae.js → p-a0d7e0cd.js} +396 -169
  211. package/dist/components/p-a0d7e0cd.js.map +1 -0
  212. package/dist/components/{p-f1859ddc.js → p-a1438b39.js} +4 -4
  213. package/dist/components/{p-f1859ddc.js.map → p-a1438b39.js.map} +1 -1
  214. package/dist/components/{p-04cb3a6f.js → p-a189d074.js} +5 -5
  215. package/dist/components/{p-04cb3a6f.js.map → p-a189d074.js.map} +1 -1
  216. package/dist/components/p-a29a9396.js +184 -0
  217. package/dist/components/p-a29a9396.js.map +1 -0
  218. package/dist/components/{p-679e0fa9.js → p-aff3ed68.js} +10 -175
  219. package/dist/components/p-aff3ed68.js.map +1 -0
  220. package/dist/components/{p-76a30bf1.js → p-b207be02.js} +3 -3
  221. package/dist/components/{p-76a30bf1.js.map → p-b207be02.js.map} +1 -1
  222. package/dist/components/{p-581e67cc.js → p-c07c32d2.js} +3 -3
  223. package/dist/components/{p-581e67cc.js.map → p-c07c32d2.js.map} +1 -1
  224. package/dist/components/{p-cbe9521f.js → p-dcaf9010.js} +3 -3
  225. package/dist/components/{p-cbe9521f.js.map → p-dcaf9010.js.map} +1 -1
  226. package/dist/components/{p-83c8873a.js → p-dec6fc68.js} +3 -3
  227. package/dist/components/{p-83c8873a.js.map → p-dec6fc68.js.map} +1 -1
  228. package/dist/components/{p-d63f1cbe.js → p-df465ef2.js} +3 -3
  229. package/dist/components/{p-d63f1cbe.js.map → p-df465ef2.js.map} +1 -1
  230. package/dist/components/{p-c0a91091.js → p-f7c7a406.js} +4 -4
  231. package/dist/components/{p-c0a91091.js.map → p-f7c7a406.js.map} +1 -1
  232. package/dist/esm/{constants-b97e736d.js → constants-4faa1fae.js} +2 -2
  233. package/dist/esm/{constants-b97e736d.js.map → constants-4faa1fae.js.map} +1 -1
  234. package/dist/esm/{index-8f0e5f19.js → index-a1936cd0.js} +19 -186
  235. package/dist/esm/index-a1936cd0.js.map +1 -0
  236. package/dist/esm/index.js +1 -1
  237. package/dist/esm/loader.js +3 -3
  238. package/dist/esm/native.js +3 -24
  239. package/dist/esm/native.js.map +1 -1
  240. package/dist/esm/nv-alert.entry.js +2 -2
  241. package/dist/esm/nv-avatar.entry.js +2 -2
  242. package/dist/esm/nv-badge_2.entry.js +1 -1
  243. package/dist/esm/nv-breadcrumb.entry.js +1 -1
  244. package/dist/esm/nv-breadcrumbs.entry.js +1 -1
  245. package/dist/esm/nv-button.entry.js +2 -2
  246. package/dist/esm/nv-calendar.entry.js +392 -143
  247. package/dist/esm/nv-calendar.entry.js.map +1 -1
  248. package/dist/esm/nv-col.entry.js +1 -1
  249. package/dist/esm/nv-datagrid.entry.js +46 -13
  250. package/dist/esm/nv-datagrid.entry.js.map +1 -1
  251. package/dist/esm/nv-datagridcolumn.entry.js +1 -1
  252. package/dist/esm/nv-dialog.entry.js +2 -2
  253. package/dist/esm/nv-dialogfooter_2.entry.js +2 -2
  254. package/dist/esm/nv-fieldcheckbox.entry.js +1 -1
  255. package/dist/esm/nv-fielddate.entry.js +45 -11
  256. package/dist/esm/nv-fielddate.entry.js.map +1 -1
  257. package/dist/esm/nv-fielddaterange.entry.js +98 -44
  258. package/dist/esm/nv-fielddaterange.entry.js.map +1 -1
  259. package/dist/esm/nv-fielddropdown.entry.js +2 -2
  260. package/dist/esm/nv-fielddropdown.entry.js.map +1 -1
  261. package/dist/esm/nv-fielddropdownitem.entry.js +1 -1
  262. package/dist/esm/nv-fieldmultiselect.entry.js +2 -2
  263. package/dist/esm/nv-fieldmultiselect.entry.js.map +1 -1
  264. package/dist/esm/nv-fieldnumber.entry.js +5 -5
  265. package/dist/esm/nv-fieldnumber.entry.js.map +1 -1
  266. package/dist/esm/nv-fieldpassword.entry.js +5 -5
  267. package/dist/esm/nv-fieldpassword.entry.js.map +1 -1
  268. package/dist/esm/nv-fieldradio.entry.js +4 -4
  269. package/dist/esm/nv-fieldselect.entry.js +7 -7
  270. package/dist/esm/nv-fieldselect.entry.js.map +1 -1
  271. package/dist/esm/nv-fieldslider.entry.js +28 -23
  272. package/dist/esm/nv-fieldslider.entry.js.map +1 -1
  273. package/dist/esm/nv-fieldtext.entry.js +5 -5
  274. package/dist/esm/nv-fieldtext.entry.js.map +1 -1
  275. package/dist/esm/nv-fieldtextarea.entry.js +5 -5
  276. package/dist/esm/nv-fieldtextarea.entry.js.map +1 -1
  277. package/dist/esm/nv-fieldtime.entry.js +12 -12
  278. package/dist/esm/nv-fieldtime.entry.js.map +1 -1
  279. package/dist/esm/nv-icon.entry.js +3 -3
  280. package/dist/esm/nv-iconbutton_2.entry.js +3 -3
  281. package/dist/esm/nv-menu.entry.js +2 -2
  282. package/dist/esm/nv-menuitem.entry.js +2 -2
  283. package/dist/esm/nv-popover.entry.js +3 -3
  284. package/dist/esm/nv-popover.entry.js.map +1 -1
  285. package/dist/esm/nv-row.entry.js +2 -2
  286. package/dist/esm/nv-stack.entry.js +2 -2
  287. package/dist/esm/nv-table.entry.js +3 -3
  288. package/dist/esm/nv-tablecolumn.entry.js +1 -1
  289. package/dist/esm/nv-toggle.entry.js +3 -3
  290. package/dist/esm/nv-tooltip.entry.js +2 -2
  291. package/dist/native/index.esm.js +1 -1
  292. package/dist/native/native.css +1 -1
  293. package/dist/native/native.esm.js +1 -1
  294. package/dist/native/native.esm.js.map +1 -1
  295. package/dist/native/p-01164e86.entry.js +2 -0
  296. package/dist/native/{p-5382eab2.entry.js.map → p-01164e86.entry.js.map} +1 -1
  297. package/dist/native/p-0410facd.entry.js +2 -0
  298. package/dist/native/p-0410facd.entry.js.map +1 -0
  299. package/dist/native/{p-519b4819.entry.js → p-08ca678c.entry.js} +2 -2
  300. package/dist/native/{p-cfe0a6c6.entry.js → p-0ec2d430.entry.js} +2 -2
  301. package/dist/native/{p-cfe0a6c6.entry.js.map → p-0ec2d430.entry.js.map} +1 -1
  302. package/dist/native/p-14895e84.entry.js +2 -0
  303. package/dist/native/p-14895e84.entry.js.map +1 -0
  304. package/dist/native/p-1a5d3b87.entry.js +2 -0
  305. package/dist/native/{p-7c676f2c.entry.js.map → p-1a5d3b87.entry.js.map} +1 -1
  306. package/dist/native/{p-0323daf6.entry.js → p-1c1ecd38.entry.js} +2 -2
  307. package/dist/native/{p-16a4cdf3.entry.js → p-1d98477d.entry.js} +2 -2
  308. package/dist/native/{p-19fb0fd0.entry.js → p-2006f5d4.entry.js} +2 -2
  309. package/dist/native/p-24659a85.entry.js +2 -0
  310. package/dist/native/{p-ef76178b.entry.js.map → p-24659a85.entry.js.map} +1 -1
  311. package/dist/native/p-2b1e7675.entry.js +2 -0
  312. package/dist/native/{p-b0fc08e7.entry.js.map → p-2b1e7675.entry.js.map} +1 -1
  313. package/dist/native/{p-9fba8663.entry.js → p-2bc7d66a.entry.js} +2 -2
  314. package/dist/native/p-2c3fb8cc.entry.js +2 -0
  315. package/dist/native/p-2c3fb8cc.entry.js.map +1 -0
  316. package/dist/native/p-45cbe6e4.entry.js +2 -0
  317. package/dist/native/p-46428304.entry.js +2 -0
  318. package/dist/native/p-46428304.entry.js.map +1 -0
  319. package/dist/native/{p-c930adb7.entry.js → p-55df8bf9.entry.js} +2 -2
  320. package/dist/native/p-59b07b36.entry.js +2 -0
  321. package/dist/native/{p-987c79d8.entry.js.map → p-59b07b36.entry.js.map} +1 -1
  322. package/dist/native/p-6029e51b.entry.js +2 -0
  323. package/dist/native/{p-fc3bea07.entry.js.map → p-6029e51b.entry.js.map} +1 -1
  324. package/dist/native/{p-4c0d81b0.entry.js → p-7ba03c5d.entry.js} +2 -2
  325. package/dist/native/p-82c4bf56.entry.js +2 -0
  326. package/dist/native/p-82c4bf56.entry.js.map +1 -0
  327. package/dist/native/{p-407fc32d.entry.js → p-86ab23ea.entry.js} +2 -2
  328. package/dist/native/p-87784622.entry.js +2 -0
  329. package/dist/native/{p-05d95d4d.entry.js → p-914da1e1.entry.js} +2 -2
  330. package/dist/native/p-9850c1d7.entry.js +2 -0
  331. package/dist/native/{p-5ba3fc3c.entry.js.map → p-9850c1d7.entry.js.map} +1 -1
  332. package/dist/native/{p-de2c07a6.entry.js → p-a0505695.entry.js} +3 -3
  333. package/dist/native/p-a0505695.entry.js.map +1 -0
  334. package/dist/native/p-a30206c1.entry.js +2 -0
  335. package/dist/native/{p-aa86af25.entry.js.map → p-a30206c1.entry.js.map} +1 -1
  336. package/dist/native/p-abbe5d69.entry.js +2 -0
  337. package/dist/native/{p-7c6edd1c.entry.js.map → p-abbe5d69.entry.js.map} +1 -1
  338. package/dist/native/{p-221b8f72.entry.js → p-ad128108.entry.js} +2 -2
  339. package/dist/native/{p-f0ddf60b.entry.js → p-b5b9190a.entry.js} +2 -2
  340. package/dist/native/p-c7b8b7ba.entry.js +2 -0
  341. package/dist/native/{p-fb897f7d.entry.js.map → p-c7b8b7ba.entry.js.map} +1 -1
  342. package/dist/native/p-c92d55f9.entry.js +2 -0
  343. package/dist/native/{p-3f2b6a22.entry.js → p-c9d3de9c.entry.js} +2 -2
  344. package/dist/native/p-cbca9326.entry.js +2 -0
  345. package/dist/native/{p-60b204ac.entry.js.map → p-cbca9326.entry.js.map} +1 -1
  346. package/dist/native/p-d0a33e64.js +3 -0
  347. package/dist/native/p-d0a33e64.js.map +1 -0
  348. package/dist/native/{p-ed488498.entry.js → p-d21b2da2.entry.js} +3 -3
  349. package/dist/native/{p-f85c08f1.js → p-e2d0a77d.js} +2 -2
  350. package/dist/native/{p-a2c0f1a7.entry.js → p-ec87200a.entry.js} +2 -2
  351. package/dist/native/{p-0ec1e2e3.entry.js → p-f377b285.entry.js} +2 -2
  352. package/dist/native/p-ff0f3794.entry.js +2 -0
  353. package/dist/native/{p-adc96c3a.entry.js.map → p-ff0f3794.entry.js.map} +1 -1
  354. package/dist/types/components/nv-calendar/nv-calendar.d.ts +25 -45
  355. package/dist/types/components/nv-calendar/partials/calendar-actions.d.ts +19 -0
  356. package/dist/types/components/nv-calendar/partials/calendar-grid.d.ts +46 -0
  357. package/dist/types/components/nv-calendar/partials/calendar-header.d.ts +38 -0
  358. package/dist/types/components/nv-calendar/partials/calendar-shortcuts.d.ts +35 -0
  359. package/dist/types/components/nv-calendar/partials/day-cell.d.ts +35 -0
  360. package/dist/types/components/nv-calendar/partials/index.d.ts +6 -0
  361. package/dist/types/components/nv-calendar/partials/week-numbers.d.ts +30 -0
  362. package/dist/types/components/nv-calendar/test/partials/calendar-actions.logic.test.d.ts +1 -0
  363. package/dist/types/components/nv-calendar/test/partials/calendar-grid.logic.test.d.ts +1 -0
  364. package/dist/types/components/nv-calendar/test/partials/calendar-header.logic.test.d.ts +1 -0
  365. package/dist/types/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.d.ts +1 -0
  366. package/dist/types/components/nv-calendar/test/partials/day-cell.logic.test.d.ts +1 -0
  367. package/dist/types/components/nv-calendar/test/partials/week-numbers.logic.test.d.ts +1 -0
  368. package/dist/types/components/nv-datagrid/nv-datagrid.d.ts +106 -2
  369. package/dist/types/components/nv-fielddate/nv-fielddate.d.ts +21 -9
  370. package/dist/types/components/nv-fielddate/test/nv-fielddate.logic.test.d.ts +1 -0
  371. package/dist/types/components/nv-fielddaterange/nv-fielddaterange.d.ts +19 -6
  372. package/dist/types/components/nv-fielddaterange/test/nv-fielddaterange.logic.test.d.ts +1 -0
  373. package/dist/types/components/nv-fieldnumber/nv-fieldnumber.d.ts +1 -0
  374. package/dist/types/components/nv-fieldslider/nv-fieldslider.d.ts +5 -6
  375. package/dist/types/components.d.ts +175 -38
  376. package/dist/vscode-data.json +4 -4
  377. package/hydrate/index.js +666 -291
  378. package/hydrate/index.mjs +666 -291
  379. package/package.json +10 -2
  380. package/dist/cjs/index-108ddff0.js.map +0 -1
  381. package/dist/components/p-4656efae.js.map +0 -1
  382. package/dist/components/p-679e0fa9.js.map +0 -1
  383. package/dist/components/p-f0a5e7e4.js +0 -167
  384. package/dist/esm/index-8f0e5f19.js.map +0 -1
  385. package/dist/native/p-1e3d3374.entry.js +0 -2
  386. package/dist/native/p-21e7132f.entry.js +0 -2
  387. package/dist/native/p-21e7132f.entry.js.map +0 -1
  388. package/dist/native/p-2805f9f2.entry.js +0 -2
  389. package/dist/native/p-2805f9f2.entry.js.map +0 -1
  390. package/dist/native/p-5382eab2.entry.js +0 -2
  391. package/dist/native/p-5ba3fc3c.entry.js +0 -2
  392. package/dist/native/p-60b204ac.entry.js +0 -2
  393. package/dist/native/p-7092a675.entry.js +0 -2
  394. package/dist/native/p-711a7778.js +0 -3
  395. package/dist/native/p-711a7778.js.map +0 -1
  396. package/dist/native/p-759c9ce4.entry.js +0 -2
  397. package/dist/native/p-759c9ce4.entry.js.map +0 -1
  398. package/dist/native/p-7c676f2c.entry.js +0 -2
  399. package/dist/native/p-7c6edd1c.entry.js +0 -2
  400. package/dist/native/p-987c79d8.entry.js +0 -2
  401. package/dist/native/p-aa86af25.entry.js +0 -2
  402. package/dist/native/p-adc96c3a.entry.js +0 -2
  403. package/dist/native/p-b0fc08e7.entry.js +0 -2
  404. package/dist/native/p-d07ab618.entry.js +0 -2
  405. package/dist/native/p-dac0089b.entry.js +0 -2
  406. package/dist/native/p-dac0089b.entry.js.map +0 -1
  407. package/dist/native/p-de2c07a6.entry.js.map +0 -1
  408. package/dist/native/p-ef76178b.entry.js +0 -2
  409. package/dist/native/p-f39803d9.entry.js +0 -2
  410. package/dist/native/p-f39803d9.entry.js.map +0 -1
  411. package/dist/native/p-fb897f7d.entry.js +0 -2
  412. package/dist/native/p-fc3bea07.entry.js +0 -2
  413. /package/dist/native/{p-519b4819.entry.js.map → p-08ca678c.entry.js.map} +0 -0
  414. /package/dist/native/{p-0323daf6.entry.js.map → p-1c1ecd38.entry.js.map} +0 -0
  415. /package/dist/native/{p-16a4cdf3.entry.js.map → p-1d98477d.entry.js.map} +0 -0
  416. /package/dist/native/{p-19fb0fd0.entry.js.map → p-2006f5d4.entry.js.map} +0 -0
  417. /package/dist/native/{p-9fba8663.entry.js.map → p-2bc7d66a.entry.js.map} +0 -0
  418. /package/dist/native/{p-1e3d3374.entry.js.map → p-45cbe6e4.entry.js.map} +0 -0
  419. /package/dist/native/{p-c930adb7.entry.js.map → p-55df8bf9.entry.js.map} +0 -0
  420. /package/dist/native/{p-4c0d81b0.entry.js.map → p-7ba03c5d.entry.js.map} +0 -0
  421. /package/dist/native/{p-407fc32d.entry.js.map → p-86ab23ea.entry.js.map} +0 -0
  422. /package/dist/native/{p-d07ab618.entry.js.map → p-87784622.entry.js.map} +0 -0
  423. /package/dist/native/{p-05d95d4d.entry.js.map → p-914da1e1.entry.js.map} +0 -0
  424. /package/dist/native/{p-221b8f72.entry.js.map → p-ad128108.entry.js.map} +0 -0
  425. /package/dist/native/{p-f0ddf60b.entry.js.map → p-b5b9190a.entry.js.map} +0 -0
  426. /package/dist/native/{p-7092a675.entry.js.map → p-c92d55f9.entry.js.map} +0 -0
  427. /package/dist/native/{p-3f2b6a22.entry.js.map → p-c9d3de9c.entry.js.map} +0 -0
  428. /package/dist/native/{p-ed488498.entry.js.map → p-d21b2da2.entry.js.map} +0 -0
  429. /package/dist/native/{p-f85c08f1.js.map → p-e2d0a77d.js.map} +0 -0
  430. /package/dist/native/{p-a2c0f1a7.entry.js.map → p-ec87200a.entry.js.map} +0 -0
  431. /package/dist/native/{p-0ec1e2e3.entry.js.map → p-f377b285.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["nvFieldtimeCss","NvFieldtimeStyle0","NvFieldtime","constructor","hostRef","this","inputElements","inputZeroAdded","typeFocused","TimeType","Hours","hours","minutes","seconds","inputId","uuidv4","readonly","disabled","required","success","error","format","open","step","autofocus","handleOpenChanged","event","stopPropagation","detail","handleKeyDown","key","preventDefault","popoverElement","console","warn","stringSelector","items","Array","from","el","querySelectorAll","length","currentIndex","findIndex","item","classList","contains","updateHighlightedItem","click","_a","Minutes","focus","_b","select","Seconds","_c","_d","blur","handleValueChange","newValue","valueChanged","emit","handleInputChange","e","type","inputElement","target","inputValue","value","replace","handleHoursChange","handleMinutesChange","handleSecondsChange","currentValue","reconstructTime","isHHFormat","startsWith","maxHours","reputedToZero","maxHour","parseHour","max","minHour","min","newInputValue","padStart","parseInt","slice","parsedNewInputValue","toString","maxMinutes","minMinute","parseMinute","maxMinute","_e","_f","maxSeconds","minSecond","parseSecond","maxSecond","parseTime","timeString","cleanedTime","hour","minute","second","handleFocus","HandleDropdownIconClick","index","forEach","i","add","setAttribute","scrollIntoView","block","remove","handleTimeOptionClick","option","textContent","handleInputBlur","setTimeout","document","activeElement","handleClickOutside","Object","values","some","input","handleScroll","scrollTop","containerHeight","clientHeight","scrollHeight","itemHeight","options","generateTimeOptions","singleSetHeight","stepInSeconds","generateHourOptions","generateMinuteOptions","generateSecondOptions","hourStep","Math","floor","maxHourValue","minHourValue","push","hourStr","split","isNaN","minuteStep","parts","secondStep","generateInfiniteTimeOptions","totalOptions","repetitions","ceil","fill","flat","getCurrentTime","currentTime","Date","toLocaleTimeString","updateColumnHighlight","selector","x","handleHostClick","targetElement","closest","componentWillLoad","addEventListener","bind","connectedCallback","disconnectedCallback","removeEventListener","componentDidLoad","secondAmPm","amPm","includes","parsedHour","hourSelector","minuteSelector","secondSelector","RenderTimeOptionsColumn","h","class","onScroll","map","selected","onClick","render","Host","onclick","label","querySelector","htmlFor","name","ref","triggerMode","placement","slot","startsWithIgnoreCase","pattern","maxlength","onInput","placeholder","inputMode","onFocus","id","onKeyDown","onBlur","size","emphasis","description","errorDescription","hidden"],"sources":["src/components/nv-fieldtime/styles/nv-fieldtime.scss?tag=nv-fieldtime","src/components/nv-fieldtime/nv-fieldtime.tsx"],"sourcesContent":["@use './mixins' as *;\n@import '../../../styles/form-field';\n\nnv-fieldtime {\n @include form-field-variables();\n @include form-field-root();\n\n &[readonly]:not([readonly='false']) {\n @include form-field-readonly-variables();\n }\n\n &[error]:not([error='false']) {\n @include form-field-error-variables();\n }\n\n &[success]:not([success='false']) {\n @include form-field-success-variables();\n }\n\n &[required]:not([required='false']) label {\n @include form-field-label-required();\n }\n\n label {\n @include form-field-label();\n }\n\n nv-popover {\n @include apply-popover-style;\n }\n\n .input-wrapper {\n @include form-field-input-wrapper();\n width: 100%;\n }\n\n .input-container {\n @include form-field-input-container();\n @include flex-container(flex-start);\n position: relative;\n width: 100%;\n min-height: 40px;\n gap: 0;\n padding-left: var(--form-field-padding-x);\n\n input.time-input {\n @include form-field-input();\n @include apply-input-styles();\n }\n\n span {\n width: 100%;\n text-align: center;\n min-width: 24px;\n flex: 0 0 24px;\n padding: 0 4px;\n color: var(--components-form-field-content-text);\n }\n\n > nv-iconbutton {\n @include form-field-action();\n margin-left: auto;\n }\n\n nv-icon.validation {\n @include form-field-icon();\n @include icon-position(50px);\n }\n\n &:focus,\n &:focus-within {\n @include apply-focus-styles;\n }\n }\n\n .description {\n @include form-field-description();\n }\n\n .error-description {\n @include form-field-error-description();\n }\n\n hr {\n border: none;\n border-top: 1px solid var(--dropdown-divider-color, #ccc);\n margin: 0.5rem 0;\n }\n\n .time-dropdown {\n width: 100%;\n\n .time-columns {\n @include flex-container;\n\n .time-column {\n flex: 1;\n text-align: center;\n padding-right: 2px;\n @include scrollable(200px);\n\n &:last-child {\n border-right: none;\n }\n\n .time-option {\n padding: var(--list-dropdown-item-padding-y)\n var(--list-dropdown-item-padding-x);\n text-align: center;\n cursor: pointer;\n transition: background-color 0.2s;\n height: 40px;\n border-radius: var(--list-dropdown-item-radius);\n @include flex-container(center);\n\n &:hover {\n background-color: var(\n --components-list-dropdown-item-background-hover\n );\n color: var(--components-list-dropdown-item-label-hover);\n }\n\n @include state-focus(\n var(--components-list-dropdown-item-background-hover),\n var(--components-list-dropdown-item-label-hover)\n );\n\n &.selected {\n background-color: var(\n --components-list-dropdown-item-background-active\n );\n color: var(--components-list-dropdown-item-label-active);\n @include bordered-element(\n 1px,\n var(--components-list-dropdown-item-border-active)\n );\n }\n\n &.highlighted {\n background-color: var(\n --components-list-dropdown-item-background-hover\n );\n color: var(--components-menu-contextual-item-content-hover);\n }\n }\n }\n }\n }\n}\n","/* eslint-disable react/jsx-no-bind */\nimport {\n Component,\n Host,\n h,\n State,\n Element,\n Event,\n EventEmitter,\n Prop,\n Watch,\n Listen,\n} from '@stencil/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport { startsWithIgnoreCase } from '../../utils/string.utils';\nimport { TimeType } from '../../utils/constants';\n\n/**\n * @slot label - Content to be placed as the label, will override the label prop.\n * @slot before-input - Content to be placed before the input text, outside the input container.\n * @slot after-input - Content to be placed after the input text, outside the input container.\n * @slot leading-input - Content to be placed before the input text, within the input container.\n * @slot error-description - Content to be placed as the error description, will override the errorDescription prop.\n * @slot description - Content to be placed as the description, will override the description prop.\n */\n@Component({\n tag: 'nv-fieldtime',\n styleUrl: 'styles/nv-fieldtime.scss',\n shadow: false,\n formAssociated: true,\n})\nexport class NvFieldtime {\n @Element() el: HTMLNvFieldtimeElement;\n\n // Input elements for hours, minutes, and seconds\n private inputElements: { [key: string]: HTMLInputElement } = {};\n\n private inputZeroAdded: { [key: string]: boolean } = {};\n\n private popoverElement!: HTMLNvPopoverElement;\n\n private typeFocused: TimeType = TimeType.Hours;\n\n /****************************************************************************/\n //#region STATES\n\n @State()\n hours: string = '00';\n @State()\n minutes: string = '00';\n @State()\n seconds: string = '00';\n\n //#endregion STATES\n /****************************************************************************/\n //#region PROPERTIES\n\n /**\n * The current value of the time input in the specified format.\n */\n @Prop({ reflect: true, mutable: true })\n value: string;\n\n /**\n * Lets you define the text that explains what users should enter in the time\n * input field. It's a crucial element for making forms clear and\n * user-friendly.\n */\n @Prop({ reflect: true })\n readonly label: string;\n\n /**\n * Sets the ID for the input element and the for attribute of the associated\n * label. If no ID is provided, a random one will be automatically generated\n * to ensure unique identification, facilitating proper label association and\n * accessibility.\n */\n @Prop({ reflect: true })\n readonly inputId: string = uuidv4();\n\n /**\n * Display the input field's content without allowing users to change it.\n * Users can still click on it, select, and copy the text, but they won't be\n * able to type or delete anything.\n */\n @Prop({ reflect: true })\n readonly readonly: boolean = false;\n\n /**\n * The disabled prop lets you turn off the input field so that users can't\n * interact with it. When disabled, the field is grayed out and won't respond to\n * clicks or touches.\n */\n @Prop({ reflect: true })\n readonly disabled: boolean = false;\n\n /**\n * Marks the input field as required, ensuring that the user must fill it out\n * before submitting the form.\n */\n @Prop({ reflect: true })\n readonly required: boolean = false;\n\n /**\n * Defines the name attribute of the input field, which is crucial for form\n * submission. This value is used as the key in the key-value pair sent to\n * the server, representing the input's data in form submissions.\n */\n @Prop({ reflect: true })\n readonly name: string;\n\n /**\n * Changes the input field’s appearance to indicate successful input or\n * validation.\n */\n @Prop({ reflect: true })\n readonly success: boolean = false;\n\n /**\n * Alters the input field's appearance to indicate an error, helping users\n * identify fields that need correction.\n * @validator error\n */\n @Prop({ reflect: true })\n readonly error: boolean = false;\n\n /**\n * A description that appears when there is an error related to the time\n * field.\n * @validator message\n */\n @Prop({ reflect: true })\n readonly errorDescription: string;\n\n /**\n * Specifies the time format to be used.\n * Available formats:\n * - HH: 24-hour format (00-23)\n * - HH:mm: 24-hour format with minutes (00:00-23:59)\n * - HH:mm:ss: 24-hour format with minutes and seconds (00:00:00-23:59:59)\n * - hh: 12-hour format (01-12)\n * - hh:mm: 12-hour format with minutes (01:00-12:59)\n * - hh:mm:ss: 12-hour format with minutes and seconds (01:00:00-12:59:59)\n */\n @Prop({ reflect: true })\n readonly format: 'HH' | 'HH:mm' | 'HH:mm:ss' | 'hh' | 'hh:mm' | 'hh:mm:ss' =\n 'HH:mm:ss';\n\n /**\n * Add helpful hints or extra information under the time input field. This is\n * where you can clarify what users should enter or provide additional\n * instructions.\n */\n @Prop({ reflect: true })\n readonly description: string;\n\n /**\n * State of the time picker popover.\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean = false;\n\n /**\n * The step interval in milliseconds for time increments/decrements.\n * This affects how the time changes when using arrow keys or spinners.\n */\n @Prop({ reflect: true })\n readonly step: number = 60000; // In secondes\n\n /**\n * The maximum time value that can be selected.\n */\n @Prop({ reflect: true })\n readonly max: string;\n\n /**\n * The minimum time value that can be selected.\n */\n @Prop({ reflect: true })\n readonly min: string;\n\n /**\n * Applies focus to the input field as soon as the component is mounted. This\n * is equivalent to setting the native autofocus attribute on an <input>\n * element.\n */\n @Prop({ reflect: true })\n // eslint-disable-next-line @stencil-community/reserved-member-names\n readonly autofocus: boolean = false;\n\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region EVENTS\n\n /**\n * Emit an event when the time value changes.\n * The event detail contains the new time value (HH, HH:mm or HH:mm:ss).\n */\n @Event()\n valueChanged: EventEmitter<string>;\n\n //#endregion EVENTS\n /****************************************************************************/\n //#region LISTENERS\n\n @Listen('openChanged')\n handleOpenChanged(event: CustomEvent<boolean>) {\n // Stop propagation to prevent the event from affecting parent components like dialogs\n event.stopPropagation();\n\n // Update `open` based on the popover state\n this.open = event.detail;\n }\n\n @Listen('keydown', { passive: false })\n handleKeyDown(event: KeyboardEvent) {\n if (!this.open) {\n if (event.key === 'ArrowDown') {\n this.open = true;\n\n event.preventDefault();\n return;\n }\n return;\n }\n\n // Verify if the popover element is defined\n if (!this.popoverElement) {\n console.warn('nv-fieldtime -> Popover element is not defined');\n return;\n }\n\n const stringSelector = `.time-column.time-column-${this.typeFocused} div`;\n const items = Array.from(\n this.el.querySelectorAll<HTMLElement>(stringSelector),\n );\n\n // Verify if there are items to navigate\n if (items.length === 0) {\n console.warn('nv-fieldtime -> No dropdown items found to navigate');\n return;\n }\n\n let currentIndex = items.findIndex(item =>\n item.classList.contains('highlighted'),\n );\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n currentIndex = (currentIndex + 1) % items.length;\n this.updateHighlightedItem(items, currentIndex);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n currentIndex = (currentIndex - 1 + items.length) % items.length;\n this.updateHighlightedItem(items, currentIndex);\n } else if (event.key === 'Enter' && currentIndex >= 0) {\n event.preventDefault();\n items[currentIndex].click();\n\n if (this.typeFocused === TimeType.Hours) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n } else if (\n this.typeFocused === TimeType.Minutes ||\n this.typeFocused === TimeType.Seconds\n ) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n\n if (this.inputElements[TimeType.Hours]) {\n this.inputElements[TimeType.Hours].blur();\n }\n }\n }\n\n //#endregion LISTENERS\n /****************************************************************************/\n //#region WATCHERS\n\n @Watch('value')\n handleValueChange(newValue: string) {\n this.valueChanged.emit(newValue);\n }\n\n //#endregion WATCHERS\n /****************************************************************************/\n //#region METHODS\n\n private handleInputChange(e: InputEvent, type: TimeType): void {\n const inputElement = e.target as HTMLInputElement;\n const inputValue = inputElement.value.replace(/[^0-9]/g, ''); // Only keep numeric input\n\n // Update the time value based on the type\n switch (type) {\n case TimeType.Hours:\n this.handleHoursChange(inputValue, type);\n break;\n case TimeType.Minutes:\n this.handleMinutesChange(inputValue, type);\n break;\n case TimeType.Seconds:\n this.handleSecondsChange(inputValue, type);\n break;\n }\n\n // Reconstruct time from inputs\n const currentValue = this.reconstructTime();\n\n this.value = currentValue;\n }\n\n private handleHoursChange(inputValue: string, type: TimeType): void {\n const isHHFormat = this.format.startsWith('HH');\n const maxHours = isHHFormat ? 24 : 12;\n let reputedToZero = false;\n const maxHour =\n this.parseHour(this.max, this.format) ||\n (this.format.startsWith('hh') ? '12' : '24');\n const minHour = this.parseHour(this.min, this.format) || '00';\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n if (inputValue.startsWith('00')) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n } else {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n reputedToZero = true;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parsedNewInputValue > parseInt(maxHour, 10)) {\n if (\n minHour &&\n parseInt(newInputValue, 10) < parseInt(minHour, 10)\n ) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parsedNewInputValue < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = parsedNewInputValue.toString();\n }\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parsedNewInputValue > parseInt(maxHour, 10)) {\n this.hours = '00';\n reputedToZero = true;\n } else {\n if (minHour && parsedNewInputValue < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (\n this.hours.length === 2 &&\n !this.inputZeroAdded[type] &&\n !reputedToZero\n ) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n } else if (reputedToZero) {\n this.inputElements[TimeType.Hours]?.focus();\n this.inputElements[TimeType.Hours]?.select();\n }\n }\n\n private handleMinutesChange(inputValue: string, type: TimeType): void {\n const maxMinutes = 60;\n let reputedToZero = false;\n const minMinute = this.parseMinute(this.min) ?? 0;\n const maxMinute = this.parseMinute(this.max) ?? 59;\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxMinute && parseInt(newInputValue, 10) > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n if (inputValue.startsWith('00')) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n\n if (maxMinute && parseInt(newInputValue, 10) > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n } else {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = parsedNewInputValue.toString();\n }\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (\n this.minutes.length === 2 &&\n !this.inputZeroAdded[type] &&\n !reputedToZero\n ) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n } else if (reputedToZero) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n }\n }\n\n private handleSecondsChange(inputValue: string, type: TimeType): void {\n const maxSeconds = 60;\n let reputedToZero = false;\n const minSecond = this.parseSecond(this.min) ?? 0;\n const maxSecond = this.parseSecond(this.max) ?? 59;\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxSecond && parseInt(newInputValue, 10) > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = parsedNewInputValue.toString();\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (reputedToZero) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n }\n }\n\n // Parse a continuous time string (e.g., \"123456\") into hours, minutes, and seconds\n private parseTime(timeString: string): void {\n if (!timeString) {\n return;\n }\n\n const cleanedTime = timeString.replace(/[^0-9]/g, '').padStart(6, '0');\n const hour = cleanedTime.slice(0, 2);\n const minute = cleanedTime.slice(2, 4);\n const second = cleanedTime.slice(4, 6);\n\n const minHour = this.parseHour(this.min, this.format) || hour;\n const minMinute = this.parseMinute(this.min) || minute;\n const minSecond = this.parseSecond(this.min) || second;\n\n this.hours = minHour.padStart(2, '0');\n this.minutes = minMinute.toString().padStart(2, '0');\n this.seconds = minSecond.toString().padStart(2, '0');\n }\n\n private reconstructTime(): string {\n if (this.format === 'HH' || this.format === 'hh') {\n return this.hours;\n } else if (this.format === 'HH:mm' || this.format === 'hh:mm') {\n return `${this.hours}:${this.minutes}`;\n } else if (this.format === 'HH:mm:ss' || this.format === 'hh:mm:ss') {\n return `${this.hours}:${this.minutes}:${this.seconds}`;\n } else {\n return `${this.hours}:${this.minutes}:${this.seconds}`;\n }\n }\n\n private handleFocus(type: TimeType): void {\n if (this.readonly || this.disabled) {\n return;\n }\n\n if (!this.open) {\n this.open = true; // Force the popover to open\n }\n\n // Refocus on the input if it loses focus and is empty\n if (\n this.inputElements[type]?.value.length === 0 ||\n this.inputElements[type]?.value === '00'\n ) {\n this.inputElements[type]?.focus();\n this.inputElements[type]?.select();\n }\n\n this.typeFocused = type;\n }\n\n private HandleDropdownIconClick(): void {\n if (this.disabled || this.readonly) {\n return; // Do not toggle if disabled or read-only\n }\n\n if (this.open && this.inputElements[TimeType.Hours]) {\n this.open = false; // Close the popover if it is open\n } else if (this.open && this.inputElements[TimeType.Minutes]) {\n this.open = false; // Close the popover if it is open\n } else if (this.open && this.inputElements[TimeType.Seconds]) {\n this.open = false; // Close the popover if it is open\n } else if (!this.open && this.inputElements[TimeType.Hours]) {\n this.inputElements[TimeType.Hours]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Hours]?.select();\n } else if (!this.open && this.inputElements[TimeType.Minutes]) {\n this.inputElements[TimeType.Minutes]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Minutes]?.select();\n } else if (!this.open && this.inputElements[TimeType.Seconds]) {\n this.inputElements[TimeType.Seconds]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Seconds]?.select();\n } else {\n console.warn(\n 'nv-fieldtime -> No input elements found to focus or to blur',\n );\n }\n }\n\n private updateHighlightedItem(items: HTMLElement[], index: number) {\n items.forEach((item, i) => {\n if (i === index) {\n item.classList.add('highlighted');\n item.setAttribute('tabindex', '0');\n item.focus(); // Forcer le focus ici\n item.scrollIntoView({ block: 'nearest' });\n } else {\n item.classList.remove('highlighted');\n item.setAttribute('tabindex', '-1');\n }\n });\n }\n\n private handleTimeOptionClick(event: MouseEvent, type: TimeType): void {\n const option = parseInt(\n (event.target as HTMLElement).textContent || '0',\n 10,\n );\n\n if (type === TimeType.Hours) {\n this.hours = option.toString().padStart(2, '0');\n } else if (type === TimeType.Minutes) {\n this.minutes = option.toString().padStart(2, '0');\n } else if (type === TimeType.Seconds) {\n this.seconds = option.toString().padStart(2, '0');\n }\n\n const reconstructTime = this.reconstructTime();\n this.value = reconstructTime;\n }\n\n private handleInputBlur(): void {\n // Use a delay to check if the focus is still within the popover\n setTimeout(() => {\n if (!this.el.contains(document.activeElement)) {\n if (this.open) {\n this.open = false; // Close the popover if the focus is outside the component\n }\n }\n }, 150);\n }\n\n private handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n\n // Check if the click is inside the component or any of the input elements\n if (\n this.el.contains(target) ||\n Object.values(this.inputElements).some(input => input.contains(target))\n ) {\n return;\n }\n\n if (this.open) {\n this.open = false; // Close the popover if the click is outside\n }\n }\n\n private handleScroll(e: Event, type: TimeType): void {\n const target = e.target as HTMLElement;\n const scrollTop = target.scrollTop;\n const containerHeight = target.clientHeight;\n const scrollHeight = target.scrollHeight;\n\n // Define the height of each item, this could be dynamic if the height varies\n const itemHeight = 40; // Consider making this configurable or dynamic\n const options = this.generateTimeOptions(type); // Generates the list of time options\n const singleSetHeight = options.length * itemHeight;\n\n // Check if the scroll is near the bottom or top and reset to the first set\n if (\n scrollTop + containerHeight >= scrollHeight - itemHeight ||\n scrollTop <= 0\n ) {\n target.scrollTop = singleSetHeight; // Reset to the first set from the bottom\n }\n }\n\n private generateTimeOptions(type: TimeType) {\n // Convert the step in seconds\n const stepInSeconds = this.step / 1000;\n\n // Handle edge case for zero step\n if (stepInSeconds === 0) {\n return ['00']; // Just return the default value\n }\n\n // Generate the time options based on the type\n switch (type) {\n case TimeType.Hours:\n return this.generateHourOptions(stepInSeconds);\n\n case TimeType.Minutes:\n return this.generateMinuteOptions(stepInSeconds);\n\n case TimeType.Seconds:\n return this.generateSecondOptions(stepInSeconds);\n\n default:\n return [];\n }\n }\n\n private generateHourOptions(stepInSeconds: number): string[] {\n const hourStep = Math.max(1, Math.floor(stepInSeconds / 3600)); // Prevent step < 1\n const maxHour =\n this.parseHour(this.max, this.format) ||\n (this.format.startsWith('hh') ? '12' : '24');\n const minHour = this.parseHour(this.min, this.format) || '00';\n\n const maxHourValue = parseInt(maxHour, 10);\n const minHourValue = parseInt(minHour, 10);\n const values: string[] = [];\n\n for (let i = minHourValue; i < maxHourValue; i += hourStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseHour(value: string | null, format: string): string | null {\n if (!value) return null;\n const [hourStr] = value.split(':');\n const hour = parseInt(hourStr, 10);\n if (isNaN(hour)) return null;\n if (format.startsWith('hh'))\n return hour > 0 && hour <= 12 ? hourStr.padStart(2, '0') : null;\n return hour >= 0 && hour <= 24 ? hourStr.padStart(2, '0') : null;\n }\n\n private generateMinuteOptions(stepInSeconds: number): string[] {\n const minuteStep = Math.max(1, Math.floor((stepInSeconds % 3600) / 60)); // Ensure step >= 1\n const minMinute = this.parseMinute(this.min) ?? 0;\n const maxMinute = this.parseMinute(this.max) ?? 59;\n\n if (minMinute === 0 && maxMinute === 0) return ['00']; // Handle edge case for zero seconds\n\n const values: string[] = [];\n\n for (let i = minMinute; i <= maxMinute; i += minuteStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseMinute(value: string | null): number | null {\n if (!value) return null;\n const parts = value.split(':');\n if (parts.length < 2) return null; // Expect at least \"hh:mm\"\n const minute = parseInt(parts[1], 10);\n return isNaN(minute) || minute < 0 || minute >= 60 ? null : minute;\n }\n\n private generateSecondOptions(stepInSeconds: number): string[] {\n const secondStep = Math.max(1, stepInSeconds % 60); // Ensure step >= 1\n const minSecond = this.parseSecond(this.min) ?? 0;\n const maxSecond = this.parseSecond(this.max) ?? 59;\n\n if (minSecond === 0 && maxSecond === 0) return ['00']; // Handle edge case for zero seconds\n\n const values: string[] = [];\n\n for (let i = minSecond; i <= maxSecond; i += secondStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseSecond(value: string | null): number | null {\n if (!value) return null;\n const parts = value.split(':');\n if (parts.length < 3) return null; // Expect \"hh:mm:ss\" or \"HH:mm:ss\"\n const second = parseInt(parts[2], 10);\n return isNaN(second) || second < 0 || second >= 60 ? null : second;\n }\n\n private generateInfiniteTimeOptions(type: TimeType): string[] {\n const options = this.generateTimeOptions(type);\n const totalOptions = options.length;\n\n // Dynamically calculate repetitions based on a target number of items (e.g., 300 items)\n const repetitions = Math.ceil(300 / totalOptions);\n return Array(repetitions).fill(options).flat();\n }\n\n private getCurrentTime(): string {\n const currentTime = new Date();\n return currentTime.toLocaleTimeString(); // Returns the time in the locale's format\n }\n\n private updateColumnHighlight(selector, value): void {\n const items = Array.from(this.el.querySelectorAll<HTMLElement>(selector));\n\n const index = items.findIndex(x => x.textContent === value);\n this.updateHighlightedItem(items, index);\n }\n\n private handleHostClick(event: MouseEvent): void {\n if (this.disabled || this.readonly) {\n return;\n }\n\n const targetElement = event.target as HTMLElement;\n\n // Check if the click target or its ancestors are inside an nv-iconbutton element\n if (targetElement.closest('nv-iconbutton')) {\n return; // Handle icon button click separately\n }\n\n if (!this.open) {\n if (this.inputElements) {\n this.inputElements[TimeType.Hours]?.focus();\n this.inputElements[TimeType.Hours]?.select();\n }\n\n event.preventDefault();\n }\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region LIFECYCLE\n\n componentWillLoad() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n\n // If an initial value is passed, parse it\n if (this.value) {\n this.parseTime(this.value);\n } else {\n const minHour = this.parseHour(this.min, this.format) || '00';\n const minMinute = this.parseMinute(this.min) || 0;\n const minSecond = this.parseSecond(this.min) || 0;\n\n this.hours = minHour.padStart(2, '0');\n this.minutes = minMinute.toString().padStart(2, '0');\n this.seconds = minSecond.toString().padStart(2, '0');\n }\n }\n\n connectedCallback() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleClickOutside.bind(this));\n }\n\n componentDidLoad() {\n if (!this.value) {\n const currentTime = this.getCurrentTime();\n\n // Split time into components\n // eslint-disable-next-line prefer-const\n let [hour, minute, secondAmPm] = currentTime.split(':');\n let second, amPm;\n\n // Check if AM/PM is present and split accordingly\n if (secondAmPm.includes(' ')) {\n [second, amPm] = secondAmPm.split(' ');\n } else {\n second = secondAmPm;\n }\n\n // Parse hour as integer for calculations\n let parsedHour = parseInt(hour, 10);\n\n // Convert hour to 24-hour format based on AM/PM (if present)\n if (amPm) {\n if (amPm === 'PM' && parsedHour < 12) {\n parsedHour += 12; // Convert PM to 24-hour\n } else if (amPm === 'AM' && parsedHour === 12) {\n parsedHour = 0; // Midnight in 24-hour format\n }\n }\n\n // Adjust for 12-hour format if necessary\n if (this.format.startsWith('hh')) {\n if (parsedHour === 0) {\n hour = '12'; // Midnight in 12-hour format\n } else if (parsedHour > 12) {\n hour = (parsedHour - 12).toString(); // Convert 24-hour to 12-hour\n } else {\n hour = parsedHour.toString();\n }\n } else {\n hour = parsedHour.toString(); // Use 24-hour format directly\n }\n\n // Pad hour, minute, and second to ensure two digits\n hour = hour.padStart(2, '0');\n minute = minute.padStart(2, '0');\n second = second.padStart(2, '0');\n\n // Update highlighted items for hours\n const hourSelector = `.time-column.time-column-hours div`;\n this.updateColumnHighlight(hourSelector, hour);\n\n // Update highlighted items for minutes\n const minuteSelector = `.time-column.time-column-minutes div`;\n this.updateColumnHighlight(minuteSelector, minute);\n\n // Update highlighted items for seconds\n const secondSelector = `.time-column.time-column-seconds div`;\n this.updateColumnHighlight(secondSelector, second);\n }\n }\n\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region RENDER\n\n private RenderTimeOptionsColumn(type: TimeType): HTMLElement {\n return (\n <div\n class={`time-column time-column-${type}`}\n onScroll={e => this.handleScroll(e, type)}\n >\n {/* Hours */}\n {this.generateInfiniteTimeOptions(type).map((option, index) => (\n <div\n class={{\n 'time-option': true,\n 'selected':\n (type === TimeType.Hours && option === this.hours) ||\n (type === TimeType.Minutes && option === this.minutes) ||\n (type === TimeType.Seconds && option === this.seconds),\n }}\n key={`${option}-${index}`}\n onClick={e => this.handleTimeOptionClick(e, type)}\n >\n {option}\n </div>\n ))}\n </div>\n );\n }\n\n render() {\n return (\n <Host onclick={e => this.handleHostClick(e)}>\n {(this.label || this.el.querySelector('[slot=\"label\"]')) && (\n <label htmlFor={this.inputId}>\n <slot name=\"label\">{this.label}</slot>\n </label>\n )}\n\n <nv-popover\n ref={el => (this.popoverElement = el as HTMLNvPopoverElement)}\n triggerMode=\"controlled\"\n placement=\"bottom-start\"\n open={this.open}\n >\n <div class=\"input-wrapper\" slot=\"trigger\">\n <slot name=\"before-input\"></slot>\n\n <div class=\"input-container\">\n <slot name=\"leading-input\"></slot>\n {/* Input fields for hours, minutes, and seconds */}\n {/* Hours */}\n {startsWithIgnoreCase(this.format, 'HH') && [\n <input\n ref={el => (this.inputElements[TimeType.Hours] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.hours}\n onInput={e => this.handleInputChange(e, TimeType.Hours)}\n placeholder={this.format.includes('hh') ? 'hh' : 'HH'}\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Hours)}\n name={\n this.name\n ? `${TimeType.Hours}-${this.name}`\n : TimeType.Hours\n }\n id={this.inputId}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n {/* Minutes */}\n {this.format.includes('mm') && [\n <span>:</span>,\n <input\n ref={el => (this.inputElements[TimeType.Minutes] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.minutes}\n onInput={e => this.handleInputChange(e, TimeType.Minutes)}\n placeholder=\"mm\"\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Minutes)}\n name={\n this.name\n ? `${TimeType.Minutes}-${this.name}`\n : TimeType.Minutes\n }\n id={`${this.inputId}-minutes`}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n {/* Seconds */}\n {this.format.includes('ss') && [\n <span>:</span>,\n\n <input\n ref={el => (this.inputElements[TimeType.Seconds] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.seconds}\n onInput={e => this.handleInputChange(e, TimeType.Seconds)}\n placeholder=\"ss\"\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Seconds)}\n name={\n this.name\n ? `${TimeType.Seconds}-${this.name}`\n : TimeType.Seconds\n }\n id={`${this.inputId}-seconds`}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n\n <nv-iconbutton\n name={this.open ? 'chevron-top' : 'chevron-down'}\n size=\"md\"\n emphasis=\"lower\"\n aria-label={this.open ? 'Hide time picker' : 'Show time picker'}\n aria-pressed={this.open.toString()}\n onClick={() => this.HandleDropdownIconClick()}\n />\n\n {this.error && (\n <nv-icon name=\"alert-circle\" class=\"validation\" size=\"sm\" />\n )}\n {this.success && (\n <nv-icon name=\"circle-check\" class=\"validation\" size=\"sm\" />\n )}\n </div>\n\n <slot name=\"after-input\"></slot>\n </div>\n\n <div class=\"time-dropdown\" slot=\"content\">\n <div class=\"time-columns\">\n {startsWithIgnoreCase(this.format, 'HH') &&\n this.RenderTimeOptionsColumn(TimeType.Hours)}\n {this.format.includes('mm') &&\n this.RenderTimeOptionsColumn(TimeType.Minutes)}\n {this.format.includes('ss') &&\n this.RenderTimeOptionsColumn(TimeType.Seconds)}\n </div>\n </div>\n </nv-popover>\n\n {(this.description ||\n this.el.querySelector('[slot=\"description\"]')) && (\n <div class=\"description\">\n <slot name=\"description\">{this.description}</slot>\n </div>\n )}\n\n {(this.errorDescription ||\n this.el.querySelector('[slot=\"error-description\"]')) && (\n <div hidden={!this.error} class=\"error-description\">\n <slot name=\"error-description\">{this.errorDescription}</slot>\n </div>\n )}\n </Host>\n );\n }\n\n //#endregion RENDER\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["nvFieldtimeCss","NvFieldtimeStyle0","NvFieldtime","constructor","hostRef","this","inputElements","inputZeroAdded","typeFocused","TimeType","Hours","hours","minutes","seconds","inputId","uuidv4","readonly","disabled","required","success","error","format","open","step","autofocus","handleOpenChanged","event","stopPropagation","detail","handleKeyDown","key","preventDefault","popoverElement","console","warn","stringSelector","items","Array","from","el","querySelectorAll","length","currentIndex","findIndex","item","classList","contains","updateHighlightedItem","click","_a","Minutes","focus","_b","select","Seconds","_c","_d","blur","handleValueChange","newValue","valueChanged","emit","handleInputChange","e","type","inputElement","target","inputValue","value","replace","handleHoursChange","handleMinutesChange","handleSecondsChange","currentValue","reconstructTime","isHHFormat","startsWith","maxHours","reputedToZero","maxHour","parseHour","max","minHour","min","newInputValue","padStart","parseInt","slice","parsedNewInputValue","toString","maxMinutes","minMinute","parseMinute","maxMinute","_e","_f","maxSeconds","minSecond","parseSecond","maxSecond","parseTime","timeString","cleanedTime","hour","minute","second","handleFocus","HandleDropdownIconClick","index","forEach","i","add","setAttribute","scrollIntoView","block","remove","handleTimeOptionClick","option","textContent","handleInputBlur","setTimeout","document","activeElement","handleClickOutside","Object","values","some","input","handleScroll","scrollTop","containerHeight","clientHeight","scrollHeight","itemHeight","options","generateTimeOptions","singleSetHeight","stepInSeconds","generateHourOptions","generateMinuteOptions","generateSecondOptions","hourStep","Math","floor","maxHourValue","minHourValue","push","hourStr","split","isNaN","minuteStep","parts","secondStep","generateInfiniteTimeOptions","totalOptions","repetitions","ceil","fill","flat","getCurrentTime","currentTime","Date","toLocaleTimeString","updateColumnHighlight","selector","x","handleHostClick","targetElement","closest","componentWillLoad","addEventListener","bind","connectedCallback","disconnectedCallback","removeEventListener","componentDidLoad","secondAmPm","amPm","includes","parsedHour","hourSelector","minuteSelector","secondSelector","RenderTimeOptionsColumn","h","class","onScroll","map","selected","onClick","render","Host","onclick","label","querySelector","htmlFor","name","ref","triggerMode","placement","slot","startsWithIgnoreCase","pattern","maxlength","onInput","placeholder","inputMode","onFocus","id","onKeyDown","onBlur","size","emphasis","description","errorDescription","hidden"],"sources":["src/components/nv-fieldtime/styles/nv-fieldtime.scss?tag=nv-fieldtime","src/components/nv-fieldtime/nv-fieldtime.tsx"],"sourcesContent":["@use './mixins' as *;\n@import '../../../styles/form-field';\n\nnv-fieldtime {\n @include form-field-variables();\n @include form-field-root();\n\n &[readonly]:not([readonly='false']) {\n @include form-field-readonly-variables();\n }\n\n &[error]:not([error='false']) {\n @include form-field-error-variables();\n }\n\n &[success]:not([success='false']) {\n @include form-field-success-variables();\n }\n\n &[required]:not([required='false']) label {\n @include form-field-label-required();\n }\n\n label {\n @include form-field-label();\n }\n\n nv-popover {\n @include apply-popover-style;\n }\n\n .input-wrapper {\n @include form-field-input-wrapper();\n width: 100%;\n }\n\n .input-container {\n @include form-field-input-container();\n @include flex-container(flex-start);\n position: relative;\n width: 100%;\n min-height: 40px;\n gap: 0;\n padding-left: var(--form-field-padding-x);\n\n input.time-input {\n @include form-field-input();\n @include apply-input-styles();\n }\n\n span {\n width: 100%;\n text-align: center;\n min-width: 24px;\n flex: 0 0 24px;\n padding: 0 4px;\n color: var(--components-form-field-content-text);\n }\n\n > nv-iconbutton {\n @include form-field-action();\n margin-left: auto;\n }\n\n nv-icon.validation {\n @include form-field-icon();\n @include icon-position(50px);\n }\n\n &:focus,\n &:focus-within {\n @include apply-focus-styles;\n }\n }\n\n .description {\n @include form-field-description();\n }\n\n .error-description {\n @include form-field-error-description();\n }\n\n hr {\n border: none;\n border-top: 1px solid var(--dropdown-divider-color, #ccc);\n margin: 0.5rem 0;\n }\n\n .time-dropdown {\n width: 100%;\n\n .time-columns {\n @include flex-container;\n\n .time-column {\n flex: 1;\n text-align: center;\n padding-right: 2px;\n @include scrollable(200px);\n\n &:last-child {\n border-right: none;\n }\n\n .time-option {\n padding: var(--list-dropdown-item-padding-y)\n var(--list-dropdown-item-padding-x);\n text-align: center;\n cursor: pointer;\n transition: background-color 0.2s;\n height: 40px;\n border-radius: var(--list-dropdown-item-radius);\n @include flex-container(center);\n\n &:hover {\n background-color: var(\n --components-list-dropdown-item-background-hover\n );\n color: var(--components-list-dropdown-item-label-hover);\n }\n\n @include state-focus(\n var(--components-list-dropdown-item-background-hover),\n var(--components-list-dropdown-item-label-hover)\n );\n\n &.selected {\n background-color: var(\n --components-list-dropdown-item-background-active\n );\n color: var(--components-list-dropdown-item-label-active);\n @include bordered-element(\n 1px,\n var(--components-list-dropdown-item-border-active)\n );\n }\n\n &.highlighted {\n background-color: var(\n --components-list-dropdown-item-background-hover\n );\n color: var(--components-menu-contextual-item-content-hover);\n }\n }\n }\n }\n }\n}\n","/* eslint-disable react/jsx-no-bind */\nimport {\n Component,\n Host,\n h,\n State,\n Element,\n Event,\n EventEmitter,\n Prop,\n Watch,\n Listen,\n} from '@stencil/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport { startsWithIgnoreCase } from '../../utils/string.utils';\nimport { TimeType } from '../../utils/constants';\n\n/**\n * @slot label - Content to be placed as the label, will override the label prop.\n * @slot before-input - Content to be placed before the input text, outside the input container.\n * @slot after-input - Content to be placed after the input text, outside the input container.\n * @slot leading-input - Content to be placed before the input text, within the input container.\n * @slot error-description - Content to be placed as the error description, will override the errorDescription prop.\n * @slot description - Content to be placed as the description, will override the description prop.\n */\n@Component({\n tag: 'nv-fieldtime',\n styleUrl: 'styles/nv-fieldtime.scss',\n shadow: false,\n formAssociated: true,\n})\nexport class NvFieldtime {\n @Element() el: HTMLNvFieldtimeElement;\n\n // Input elements for hours, minutes, and seconds\n private inputElements: { [key: string]: HTMLInputElement } = {};\n\n private inputZeroAdded: { [key: string]: boolean } = {};\n\n private popoverElement!: HTMLNvPopoverElement;\n\n private typeFocused: TimeType = TimeType.Hours;\n\n /****************************************************************************/\n //#region STATES\n\n @State()\n hours: string = '00';\n @State()\n minutes: string = '00';\n @State()\n seconds: string = '00';\n\n //#endregion STATES\n /****************************************************************************/\n //#region PROPERTIES\n\n /**\n * The current value of the time input in the specified format.\n */\n @Prop({ reflect: true, mutable: true })\n value: string;\n\n /**\n * Lets you define the text that explains what users should enter in the time\n * input field. It's a crucial element for making forms clear and\n * user-friendly.\n */\n @Prop({ reflect: true })\n readonly label: string;\n\n /**\n * Sets the ID for the input element and the for attribute of the associated\n * label. If no ID is provided, a random one will be automatically generated\n * to ensure unique identification, facilitating proper label association and\n * accessibility.\n */\n @Prop({ reflect: true })\n readonly inputId: string = uuidv4();\n\n /**\n * Display the input field's content without allowing users to change it.\n * Users can still click on it, select, and copy the text, but they won't be\n * able to type or delete anything.\n */\n @Prop({ reflect: true })\n readonly readonly: boolean = false;\n\n /**\n * The disabled prop lets you turn off the input field so that users can't\n * interact with it. When disabled, the field is grayed out and won't respond to\n * clicks or touches.\n */\n @Prop({ reflect: true })\n readonly disabled: boolean = false;\n\n /**\n * Marks the input field as required, ensuring that the user must fill it out\n * before submitting the form.\n */\n @Prop({ reflect: true })\n readonly required: boolean = false;\n\n /**\n * Defines the name attribute of the input field, which is crucial for form\n * submission. This value is used as the key in the key-value pair sent to\n * the server, representing the input's data in form submissions.\n */\n @Prop({ reflect: true })\n readonly name: string;\n\n /**\n * Changes the input field’s appearance to indicate successful input or\n * validation.\n */\n @Prop({ reflect: true })\n readonly success: boolean = false;\n\n /**\n * Alters the input field's appearance to indicate an error, helping users\n * identify fields that need correction.\n * @validator error\n */\n @Prop({ reflect: true })\n readonly error: boolean = false;\n\n /**\n * A description that appears when there is an error related to the time\n * field.\n * @validator message\n */\n @Prop({ reflect: true })\n readonly errorDescription: string;\n\n /**\n * Specifies the time format to be used.\n * Available formats:\n * - HH: 24-hour format (00-23)\n * - HH:mm: 24-hour format with minutes (00:00-23:59)\n * - HH:mm:ss: 24-hour format with minutes and seconds (00:00:00-23:59:59)\n * - hh: 12-hour format (01-12)\n * - hh:mm: 12-hour format with minutes (01:00-12:59)\n * - hh:mm:ss: 12-hour format with minutes and seconds (01:00:00-12:59:59)\n */\n @Prop({ reflect: true })\n readonly format: 'HH' | 'HH:mm' | 'HH:mm:ss' | 'hh' | 'hh:mm' | 'hh:mm:ss' =\n 'HH:mm:ss';\n\n /**\n * Add helpful hints or extra information under the time input field. This is\n * where you can clarify what users should enter or provide additional\n * instructions.\n */\n @Prop({ reflect: true })\n readonly description: string;\n\n /**\n * State of the time picker popover.\n */\n @Prop({ reflect: true, mutable: true })\n open: boolean = false;\n\n /**\n * The step interval in milliseconds for time increments/decrements.\n * This affects how the time changes when using arrow keys or spinners.\n */\n @Prop({ reflect: true })\n readonly step: number = 60000; // In secondes\n\n /**\n * The maximum time value that can be selected.\n */\n @Prop({ reflect: true })\n readonly max: string;\n\n /**\n * The minimum time value that can be selected.\n */\n @Prop({ reflect: true })\n readonly min: string;\n\n /**\n * Applies focus to the input field as soon as the component is mounted. This\n * is equivalent to setting the native autofocus attribute on an <input>\n * element.\n */\n @Prop({ reflect: true })\n // eslint-disable-next-line @stencil-community/reserved-member-names\n readonly autofocus: boolean = false;\n\n //#endregion PROPERTIES\n /****************************************************************************/\n //#region EVENTS\n\n /**\n * Emit an event when the time value changes.\n * The event detail contains the new time value (HH, HH:mm or HH:mm:ss).\n */\n @Event()\n valueChanged: EventEmitter<string>;\n\n //#endregion EVENTS\n /****************************************************************************/\n //#region LISTENERS\n\n @Listen('openChanged')\n handleOpenChanged(event: CustomEvent<boolean>) {\n // Stop propagation to prevent the event from affecting parent components like dialogs\n event.stopPropagation();\n\n // Update `open` based on the popover state\n this.open = event.detail;\n }\n\n @Listen('keydown', { passive: false })\n handleKeyDown(event: KeyboardEvent) {\n if (!this.open) {\n if (event.key === 'ArrowDown') {\n this.open = true;\n\n event.preventDefault();\n return;\n }\n return;\n }\n\n // Verify if the popover element is defined\n if (!this.popoverElement) {\n console.warn('nv-fieldtime -> Popover element is not defined');\n return;\n }\n\n const stringSelector = `.time-column.time-column-${this.typeFocused} div`;\n const items = Array.from(\n this.el.querySelectorAll<HTMLElement>(stringSelector),\n );\n\n // Verify if there are items to navigate\n if (items.length === 0) {\n console.warn('nv-fieldtime -> No dropdown items found to navigate');\n return;\n }\n\n let currentIndex = items.findIndex(item =>\n item.classList.contains('highlighted'),\n );\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n currentIndex = (currentIndex + 1) % items.length;\n this.updateHighlightedItem(items, currentIndex);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n currentIndex = (currentIndex - 1 + items.length) % items.length;\n this.updateHighlightedItem(items, currentIndex);\n } else if (event.key === 'Enter' && currentIndex >= 0) {\n event.preventDefault();\n items[currentIndex].click();\n\n if (this.typeFocused === TimeType.Hours) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n } else if (\n this.typeFocused === TimeType.Minutes ||\n this.typeFocused === TimeType.Seconds\n ) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n\n if (this.inputElements[TimeType.Hours]) {\n this.inputElements[TimeType.Hours].blur();\n }\n }\n }\n\n //#endregion LISTENERS\n /****************************************************************************/\n //#region WATCHERS\n\n @Watch('value')\n handleValueChange(newValue: string) {\n this.valueChanged.emit(newValue);\n }\n\n //#endregion WATCHERS\n /****************************************************************************/\n //#region METHODS\n\n private handleInputChange(e: InputEvent, type: TimeType): void {\n const inputElement = e.target as HTMLInputElement;\n const inputValue = inputElement.value.replace(/[^0-9]/g, ''); // Only keep numeric input\n\n // Update the time value based on the type\n switch (type) {\n case TimeType.Hours:\n this.handleHoursChange(inputValue, type);\n break;\n case TimeType.Minutes:\n this.handleMinutesChange(inputValue, type);\n break;\n case TimeType.Seconds:\n this.handleSecondsChange(inputValue, type);\n break;\n }\n\n // Reconstruct time from inputs\n const currentValue = this.reconstructTime();\n\n this.value = currentValue;\n }\n\n private handleHoursChange(inputValue: string, type: TimeType): void {\n const isHHFormat = this.format.startsWith('HH');\n const maxHours = isHHFormat ? 24 : 12;\n let reputedToZero = false;\n const maxHour =\n this.parseHour(this.max, this.format) ||\n (this.format.startsWith('hh') ? '12' : '24');\n const minHour = this.parseHour(this.min, this.format) || '00';\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n if (inputValue.startsWith('00')) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n\n if (maxHour && parseInt(newInputValue, 10) > parseInt(maxHour, 10)) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = newInputValue;\n }\n }\n } else {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n reputedToZero = true;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parsedNewInputValue > parseInt(maxHour, 10)) {\n if (\n minHour &&\n parseInt(newInputValue, 10) < parseInt(minHour, 10)\n ) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (minHour && parsedNewInputValue < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = parsedNewInputValue.toString();\n }\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxHours) {\n if (minHour && parseInt(newInputValue, 10) < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = '00';\n reputedToZero = true;\n }\n } else {\n if (maxHour && parsedNewInputValue > parseInt(maxHour, 10)) {\n this.hours = '00';\n reputedToZero = true;\n } else {\n if (minHour && parsedNewInputValue < parseInt(minHour, 10)) {\n this.hours = minHour;\n } else {\n this.hours = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (\n this.hours.length === 2 &&\n !this.inputZeroAdded[type] &&\n !reputedToZero\n ) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n } else if (reputedToZero) {\n this.inputElements[TimeType.Hours]?.focus();\n this.inputElements[TimeType.Hours]?.select();\n }\n }\n\n private handleMinutesChange(inputValue: string, type: TimeType): void {\n const maxMinutes = 60;\n let reputedToZero = false;\n const minMinute = this.parseMinute(this.min) ?? 0;\n const maxMinute = this.parseMinute(this.max) ?? 59;\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxMinute && parseInt(newInputValue, 10) > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n if (inputValue.startsWith('00')) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n\n if (maxMinute && parseInt(newInputValue, 10) > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = newInputValue;\n }\n }\n } else {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = parsedNewInputValue.toString();\n }\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxMinutes) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (maxMinute && parsedNewInputValue > maxMinute) {\n if (minMinute && parseInt(newInputValue, 10) < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = '00';\n reputedToZero = true;\n }\n } else {\n if (minMinute && parsedNewInputValue < minMinute) {\n this.minutes = minMinute.toString().padStart(2, '0');\n } else {\n this.minutes = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (\n this.minutes.length === 2 &&\n !this.inputZeroAdded[type] &&\n !reputedToZero\n ) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n } else if (reputedToZero) {\n this.inputElements[TimeType.Minutes]?.focus();\n this.inputElements[TimeType.Minutes]?.select();\n }\n }\n\n private handleSecondsChange(inputValue: string, type: TimeType): void {\n const maxSeconds = 60;\n let reputedToZero = false;\n const minSecond = this.parseSecond(this.min) ?? 0;\n const maxSecond = this.parseSecond(this.max) ?? 59;\n\n if (inputValue.length === 1) {\n this.inputZeroAdded[type] = true;\n const newInputValue = inputValue.padStart(2, '0');\n\n if (maxSecond && parseInt(newInputValue, 10) > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = newInputValue;\n }\n }\n } else if (this.inputZeroAdded[type]) {\n this.inputZeroAdded[type] = false;\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = newInputValue;\n }\n }\n }\n } else if (inputValue.length > 2) {\n const newInputValue = inputValue.slice(1, 3).padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = parsedNewInputValue.toString();\n }\n }\n }\n } else {\n const newInputValue = inputValue.padStart(2, '0');\n const parsedNewInputValue = parseInt(newInputValue, 10) || 0;\n\n if (parsedNewInputValue >= maxSeconds) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (maxSecond && parsedNewInputValue > maxSecond) {\n if (minSecond && parseInt(newInputValue, 10) < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = '00';\n reputedToZero = true;\n }\n } else {\n if (minSecond && parsedNewInputValue < minSecond) {\n this.seconds = minSecond.toString().padStart(2, '0');\n } else {\n this.seconds = parsedNewInputValue.toString();\n }\n }\n }\n }\n\n if (reputedToZero) {\n this.inputElements[TimeType.Seconds]?.focus();\n this.inputElements[TimeType.Seconds]?.select();\n }\n }\n\n // Parse a continuous time string (e.g., \"123456\") into hours, minutes, and seconds\n private parseTime(timeString: string): void {\n if (!timeString) {\n return;\n }\n\n const cleanedTime = timeString.replace(/[^0-9]/g, '').padStart(6, '0');\n const hour = cleanedTime.slice(0, 2);\n const minute = cleanedTime.slice(2, 4);\n const second = cleanedTime.slice(4, 6);\n\n const minHour = this.parseHour(this.min, this.format) || hour;\n const minMinute = this.parseMinute(this.min) || minute;\n const minSecond = this.parseSecond(this.min) || second;\n\n this.hours = minHour.padStart(2, '0');\n this.minutes = minMinute.toString().padStart(2, '0');\n this.seconds = minSecond.toString().padStart(2, '0');\n }\n\n private reconstructTime(): string {\n if (this.format === 'HH' || this.format === 'hh') {\n return this.hours;\n } else if (this.format === 'HH:mm' || this.format === 'hh:mm') {\n return `${this.hours}:${this.minutes}`;\n } else if (this.format === 'HH:mm:ss' || this.format === 'hh:mm:ss') {\n return `${this.hours}:${this.minutes}:${this.seconds}`;\n } else {\n return `${this.hours}:${this.minutes}:${this.seconds}`;\n }\n }\n\n private handleFocus(type: TimeType): void {\n if (this.readonly || this.disabled) {\n return;\n }\n\n if (!this.open) {\n this.open = true; // Force the popover to open\n }\n\n // Refocus on the input if it loses focus and is empty\n if (\n this.inputElements[type]?.value.length === 0 ||\n this.inputElements[type]?.value === '00'\n ) {\n this.inputElements[type]?.focus();\n this.inputElements[type]?.select();\n }\n\n this.typeFocused = type;\n }\n\n private HandleDropdownIconClick(): void {\n if (this.disabled || this.readonly) {\n return; // Do not toggle if disabled or read-only\n }\n\n if (this.open && this.inputElements[TimeType.Hours]) {\n this.open = false; // Close the popover if it is open\n } else if (this.open && this.inputElements[TimeType.Minutes]) {\n this.open = false; // Close the popover if it is open\n } else if (this.open && this.inputElements[TimeType.Seconds]) {\n this.open = false; // Close the popover if it is open\n } else if (!this.open && this.inputElements[TimeType.Hours]) {\n this.inputElements[TimeType.Hours]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Hours]?.select();\n } else if (!this.open && this.inputElements[TimeType.Minutes]) {\n this.inputElements[TimeType.Minutes]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Minutes]?.select();\n } else if (!this.open && this.inputElements[TimeType.Seconds]) {\n this.inputElements[TimeType.Seconds]?.focus(); // Focus will open the popover\n this.inputElements[TimeType.Seconds]?.select();\n } else {\n console.warn(\n 'nv-fieldtime -> No input elements found to focus or to blur',\n );\n }\n }\n\n private updateHighlightedItem(items: HTMLElement[], index: number) {\n items.forEach((item, i) => {\n if (i === index) {\n item.classList.add('highlighted');\n item.setAttribute('tabindex', '0');\n item.focus(); // Forcer le focus ici\n item.scrollIntoView({ block: 'nearest' });\n } else {\n item.classList.remove('highlighted');\n item.setAttribute('tabindex', '-1');\n }\n });\n }\n\n private handleTimeOptionClick(event: MouseEvent, type: TimeType): void {\n const option = parseInt(\n (event.target as HTMLElement).textContent || '0',\n 10,\n );\n\n if (type === TimeType.Hours) {\n this.hours = option.toString().padStart(2, '0');\n } else if (type === TimeType.Minutes) {\n this.minutes = option.toString().padStart(2, '0');\n } else if (type === TimeType.Seconds) {\n this.seconds = option.toString().padStart(2, '0');\n }\n\n const reconstructTime = this.reconstructTime();\n this.value = reconstructTime;\n }\n\n private handleInputBlur(): void {\n // Use a delay to check if the focus is still within the popover\n setTimeout(() => {\n if (!this.el.contains(document.activeElement)) {\n if (this.open) {\n this.open = false; // Close the popover if the focus is outside the component\n }\n }\n }, 150);\n }\n\n private handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n\n // Check if the click is inside the component or any of the input elements\n if (\n this.el.contains(target) ||\n Object.values(this.inputElements).some(input => input.contains(target))\n ) {\n return;\n }\n\n if (this.open) {\n this.open = false; // Close the popover if the click is outside\n }\n }\n\n private handleScroll(e: Event, type: TimeType): void {\n const target = e.target as HTMLElement;\n const scrollTop = target.scrollTop;\n const containerHeight = target.clientHeight;\n const scrollHeight = target.scrollHeight;\n\n // Define the height of each item, this could be dynamic if the height varies\n const itemHeight = 40; // Consider making this configurable or dynamic\n const options = this.generateTimeOptions(type); // Generates the list of time options\n const singleSetHeight = options.length * itemHeight;\n\n // Check if the scroll is near the bottom or top and reset to the first set\n if (\n scrollTop + containerHeight >= scrollHeight - itemHeight ||\n scrollTop <= 0\n ) {\n target.scrollTop = singleSetHeight; // Reset to the first set from the bottom\n }\n }\n\n private generateTimeOptions(type: TimeType) {\n // Convert the step in seconds\n const stepInSeconds = this.step / 1000;\n\n // Handle edge case for zero step\n if (stepInSeconds === 0) {\n return ['00']; // Just return the default value\n }\n\n // Generate the time options based on the type\n switch (type) {\n case TimeType.Hours:\n return this.generateHourOptions(stepInSeconds);\n\n case TimeType.Minutes:\n return this.generateMinuteOptions(stepInSeconds);\n\n case TimeType.Seconds:\n return this.generateSecondOptions(stepInSeconds);\n\n default:\n return [];\n }\n }\n\n private generateHourOptions(stepInSeconds: number): string[] {\n const hourStep = Math.max(1, Math.floor(stepInSeconds / 3600)); // Prevent step < 1\n const maxHour =\n this.parseHour(this.max, this.format) ||\n (this.format.startsWith('hh') ? '12' : '24');\n const minHour = this.parseHour(this.min, this.format) || '00';\n\n const maxHourValue = parseInt(maxHour, 10);\n const minHourValue = parseInt(minHour, 10);\n const values: string[] = [];\n\n for (let i = minHourValue; i < maxHourValue; i += hourStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseHour(value: string | null, format: string): string | null {\n if (!value) return null;\n const [hourStr] = value.split(':');\n const hour = parseInt(hourStr, 10);\n if (isNaN(hour)) return null;\n if (format.startsWith('hh'))\n return hour > 0 && hour <= 12 ? hourStr.padStart(2, '0') : null;\n return hour >= 0 && hour <= 24 ? hourStr.padStart(2, '0') : null;\n }\n\n private generateMinuteOptions(stepInSeconds: number): string[] {\n const minuteStep = Math.max(1, Math.floor((stepInSeconds % 3600) / 60)); // Ensure step >= 1\n const minMinute = this.parseMinute(this.min) ?? 0;\n const maxMinute = this.parseMinute(this.max) ?? 59;\n\n if (minMinute === 0 && maxMinute === 0) return ['00']; // Handle edge case for zero seconds\n\n const values: string[] = [];\n\n for (let i = minMinute; i <= maxMinute; i += minuteStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseMinute(value: string | null): number | null {\n if (!value) return null;\n const parts = value.split(':');\n if (parts.length < 2) return null; // Expect at least \"hh:mm\"\n const minute = parseInt(parts[1], 10);\n return isNaN(minute) || minute < 0 || minute >= 60 ? null : minute;\n }\n\n private generateSecondOptions(stepInSeconds: number): string[] {\n const secondStep = Math.max(1, stepInSeconds % 60); // Ensure step >= 1\n const minSecond = this.parseSecond(this.min) ?? 0;\n const maxSecond = this.parseSecond(this.max) ?? 59;\n\n if (minSecond === 0 && maxSecond === 0) return ['00']; // Handle edge case for zero seconds\n\n const values: string[] = [];\n\n for (let i = minSecond; i <= maxSecond; i += secondStep) {\n values.push(i.toString().padStart(2, '0'));\n }\n\n return values;\n }\n\n private parseSecond(value: string | null): number | null {\n if (!value) return null;\n const parts = value.split(':');\n if (parts.length < 3) return null; // Expect \"hh:mm:ss\" or \"HH:mm:ss\"\n const second = parseInt(parts[2], 10);\n return isNaN(second) || second < 0 || second >= 60 ? null : second;\n }\n\n private generateInfiniteTimeOptions(type: TimeType): string[] {\n const options = this.generateTimeOptions(type);\n const totalOptions = options.length;\n\n // Dynamically calculate repetitions based on a target number of items (e.g., 300 items)\n const repetitions = Math.ceil(300 / totalOptions);\n return Array(repetitions).fill(options).flat();\n }\n\n private getCurrentTime(): string {\n const currentTime = new Date();\n return currentTime.toLocaleTimeString(); // Returns the time in the locale's format\n }\n\n private updateColumnHighlight(selector, value): void {\n const items = Array.from(this.el.querySelectorAll<HTMLElement>(selector));\n\n const index = items.findIndex(x => x.textContent === value);\n this.updateHighlightedItem(items, index);\n }\n\n private handleHostClick(event: MouseEvent): void {\n if (this.disabled || this.readonly) {\n return;\n }\n\n const targetElement = event.target as HTMLElement;\n\n // Check if the click target or its ancestors are inside an nv-iconbutton element\n if (targetElement.closest('nv-iconbutton')) {\n return; // Handle icon button click separately\n }\n\n if (!this.open) {\n if (this.inputElements) {\n this.inputElements[TimeType.Hours]?.focus();\n this.inputElements[TimeType.Hours]?.select();\n }\n\n event.preventDefault();\n }\n }\n\n //#endregion METHODS\n /****************************************************************************/\n //#region LIFECYCLE\n\n componentWillLoad() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n\n // If an initial value is passed, parse it\n if (this.value) {\n this.parseTime(this.value);\n } else {\n const minHour = this.parseHour(this.min, this.format) || '00';\n const minMinute = this.parseMinute(this.min) || 0;\n const minSecond = this.parseSecond(this.min) || 0;\n\n this.hours = minHour.padStart(2, '0');\n this.minutes = minMinute.toString().padStart(2, '0');\n this.seconds = minSecond.toString().padStart(2, '0');\n }\n }\n\n connectedCallback() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleClickOutside.bind(this));\n }\n\n componentDidLoad() {\n if (!this.value) {\n const currentTime = this.getCurrentTime();\n\n // Split time into components\n // eslint-disable-next-line prefer-const\n let [hour, minute, secondAmPm] = currentTime.split(':');\n let second, amPm;\n\n // Check if AM/PM is present and split accordingly\n if (secondAmPm.includes(' ')) {\n [second, amPm] = secondAmPm.split(' ');\n } else {\n second = secondAmPm;\n }\n\n // Parse hour as integer for calculations\n let parsedHour = parseInt(hour, 10);\n\n // Convert hour to 24-hour format based on AM/PM (if present)\n if (amPm) {\n if (amPm === 'PM' && parsedHour < 12) {\n parsedHour += 12; // Convert PM to 24-hour\n } else if (amPm === 'AM' && parsedHour === 12) {\n parsedHour = 0; // Midnight in 24-hour format\n }\n }\n\n // Adjust for 12-hour format if necessary\n if (this.format.startsWith('hh')) {\n if (parsedHour === 0) {\n hour = '12'; // Midnight in 12-hour format\n } else if (parsedHour > 12) {\n hour = (parsedHour - 12).toString(); // Convert 24-hour to 12-hour\n } else {\n hour = parsedHour.toString();\n }\n } else {\n hour = parsedHour.toString(); // Use 24-hour format directly\n }\n\n // Pad hour, minute, and second to ensure two digits\n hour = hour.padStart(2, '0');\n minute = minute.padStart(2, '0');\n second = second.padStart(2, '0');\n\n // Update highlighted items for hours\n const hourSelector = `.time-column.time-column-hours div`;\n this.updateColumnHighlight(hourSelector, hour);\n\n // Update highlighted items for minutes\n const minuteSelector = `.time-column.time-column-minutes div`;\n this.updateColumnHighlight(minuteSelector, minute);\n\n // Update highlighted items for seconds\n const secondSelector = `.time-column.time-column-seconds div`;\n this.updateColumnHighlight(secondSelector, second);\n }\n }\n\n //#endregion LIFECYCLE\n /****************************************************************************/\n //#region RENDER\n\n private RenderTimeOptionsColumn(type: TimeType): HTMLElement {\n return (\n <div\n class={`time-column time-column-${type}`}\n onScroll={e => this.handleScroll(e, type)}\n >\n {/* Hours */}\n {this.generateInfiniteTimeOptions(type).map((option, index) => (\n <div\n class={{\n 'time-option': true,\n 'selected':\n (type === TimeType.Hours && option === this.hours) ||\n (type === TimeType.Minutes && option === this.minutes) ||\n (type === TimeType.Seconds && option === this.seconds),\n }}\n key={`${option}-${index}`}\n onClick={e => this.handleTimeOptionClick(e, type)}\n >\n {option}\n </div>\n ))}\n </div>\n );\n }\n\n render() {\n return (\n <Host onclick={e => this.handleHostClick(e)}>\n {(this.label || this.el.querySelector('[slot=\"label\"]')) && (\n <label htmlFor={this.inputId}>\n <slot name=\"label\">{this.label}</slot>\n </label>\n )}\n\n <nv-popover\n ref={el => (this.popoverElement = el as HTMLNvPopoverElement)}\n triggerMode=\"controlled\"\n placement=\"bottom-start\"\n open={this.open}\n >\n <div class=\"input-wrapper\" slot=\"trigger\">\n <slot name=\"before-input\"></slot>\n\n <div class=\"input-container\">\n <slot name=\"leading-input\"></slot>\n {/* Input fields for hours, minutes, and seconds */}\n {/* Hours */}\n {startsWithIgnoreCase(this.format, 'HH') && [\n <input\n ref={el => (this.inputElements[TimeType.Hours] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.hours}\n onInput={e => this.handleInputChange(e, TimeType.Hours)}\n placeholder={this.format.includes('hh') ? 'hh' : 'HH'}\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Hours)}\n name={\n this.name\n ? `${TimeType.Hours}-${this.name}`\n : TimeType.Hours\n }\n id={this.inputId}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n {/* Minutes */}\n {this.format.includes('mm') && [\n <span>:</span>,\n <input\n ref={el => (this.inputElements[TimeType.Minutes] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.minutes}\n onInput={e => this.handleInputChange(e, TimeType.Minutes)}\n placeholder=\"mm\"\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Minutes)}\n name={\n this.name\n ? `${TimeType.Minutes}-${this.name}`\n : TimeType.Minutes\n }\n id={`${this.inputId}-minutes`}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n {/* Seconds */}\n {this.format.includes('ss') && [\n <span>:</span>,\n\n <input\n ref={el => (this.inputElements[TimeType.Seconds] = el)}\n type=\"number\"\n autofocus={this.autofocus}\n class=\"time-input\"\n pattern=\"[0-9]*\"\n maxlength=\"3\"\n value={this.seconds}\n onInput={e => this.handleInputChange(e, TimeType.Seconds)}\n placeholder=\"ss\"\n inputMode=\"numeric\"\n onFocus={() => this.handleFocus(TimeType.Seconds)}\n name={\n this.name\n ? `${TimeType.Seconds}-${this.name}`\n : TimeType.Seconds\n }\n id={`${this.inputId}-seconds`}\n readonly={this.readonly}\n disabled={this.disabled}\n required={this.required}\n onKeyDown={e => this.handleKeyDown(e)} // Handle arrow keys\n onBlur={() => this.handleInputBlur()}\n />,\n ]}\n\n <nv-iconbutton\n name={this.open ? 'chevron-top' : 'chevron-down'}\n size=\"md\"\n emphasis=\"lower\"\n aria-label={this.open ? 'Hide time picker' : 'Show time picker'}\n aria-pressed={this.open.toString()}\n onClick={() => this.HandleDropdownIconClick()}\n />\n\n {this.error && (\n <nv-icon name=\"alert-circle\" class=\"validation\" size=\"sm\" />\n )}\n {this.success && (\n <nv-icon name=\"circle-check\" class=\"validation\" size=\"sm\" />\n )}\n </div>\n\n <slot name=\"after-input\"></slot>\n </div>\n\n <div class=\"time-dropdown\" slot=\"content\">\n <div class=\"time-columns\">\n {startsWithIgnoreCase(this.format, 'HH') &&\n this.RenderTimeOptionsColumn(TimeType.Hours)}\n {this.format.includes('mm') &&\n this.RenderTimeOptionsColumn(TimeType.Minutes)}\n {this.format.includes('ss') &&\n this.RenderTimeOptionsColumn(TimeType.Seconds)}\n </div>\n </div>\n </nv-popover>\n\n {(this.description ||\n this.el.querySelector('[slot=\"description\"]')) && (\n <div class=\"description\">\n <slot name=\"description\">{this.description}</slot>\n </div>\n )}\n\n {(this.errorDescription ||\n this.el.querySelector('[slot=\"error-description\"]')) && (\n <div hidden={!this.error} class=\"error-description\">\n <slot name=\"error-description\">{this.errorDescription}</slot>\n </div>\n )}\n </Host>\n );\n }\n\n //#endregion RENDER\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ export declare class NvCalendar {
8
8
  /****************************************************************************/
9
9
  /**
10
10
  * First day of the week (0 = Sunday, 1 = Monday, etc.)
11
- * @default 0
11
+ * @default 1
12
12
  */
13
13
  readonly firstDayOfWeek: number;
14
14
  /**
@@ -16,6 +16,14 @@ export declare class NvCalendar {
16
16
  * @default 1
17
17
  */
18
18
  numberOfCalendars: number;
19
+ /**
20
+ * Selected date value. For single mode: ISO date string. For range mode: comma-separated ISO date strings.
21
+ * Examples:
22
+ * - Single: "2025-03-15"
23
+ * - Range: "2025-03-15,2025-03-20"
24
+ * @default ""
25
+ */
26
+ value: string;
19
27
  /**
20
28
  * Selected date (ISO string format)
21
29
  * ex: "2025-03-15"
@@ -103,6 +111,11 @@ export declare class NvCalendar {
103
111
  * Emitted when a date range is selected
104
112
  */
105
113
  rangeDateChange: EventEmitter<HTMLNvCalendarElement['rangeValue']>;
114
+ /**
115
+ * Emitted when the unified value changes
116
+ * @bind value
117
+ */
118
+ valueChanged: EventEmitter<string>;
106
119
  /****************************************************************************/
107
120
  /**
108
121
  * Watches the changes of the number of calendars
@@ -127,6 +140,12 @@ export declare class NvCalendar {
127
140
  * @param {string} oldValue - Old single value
128
141
  */
129
142
  onSingleValueChange(newValue: string, oldValue: string): void;
143
+ /**
144
+ * Watches the changes of the unified value prop
145
+ * @param {string} newValue - New value
146
+ * @param {string} oldValue - Old value
147
+ */
148
+ onValueChange(newValue: string, oldValue: string): void;
130
149
  /****************************************************************************/
131
150
  componentWillLoad(): void;
132
151
  /****************************************************************************/
@@ -145,6 +164,11 @@ export declare class NvCalendar {
145
164
  * @returns {boolean} true if the date format is in UTC mode
146
165
  */
147
166
  private get isUTCMode();
167
+ /**
168
+ * Parses the unified value prop and synchronizes with internal state
169
+ * @param {string} value - Value to parse
170
+ */
171
+ private parseUnifiedValue;
148
172
  /**
149
173
  * Validates and processes a date range, warning if start is after end
150
174
  * @param {string} startDateStr - Start date in ISO string format
@@ -251,49 +275,6 @@ export declare class NvCalendar {
251
275
  * @param {Date} newDate - Date to force
252
276
  */
253
277
  private forceCalendarUpdate;
254
- /**
255
- * Handles month change with an offset
256
- * @param {number} direction - Direction (-1 for previous, 1 for next)
257
- * @returns {Function} Change month handler
258
- */
259
- private getChangeMonthHandler;
260
- /**
261
- * Handles month change from an event (ex: dropdown)
262
- * @param {number} offset - Month offset (0 by default)
263
- * @returns {Function} Change month handler
264
- */
265
- private getHandleMonthChange;
266
- /**
267
- * Handles year change from an event (ex: dropdown)
268
- * @param {number} offset - Year offset (0 by default)
269
- * @returns {Function} Change year handler
270
- */
271
- private getHandleYearChange;
272
- /**
273
- * Handles day click
274
- * @param {Date} date - Date to handle
275
- * @param {boolean} isDisabled - Whether the date is disabled
276
- * @returns {Function} Day click handler
277
- */
278
- private getDayClickHandler;
279
- /**
280
- * Handles shortcut selection
281
- * @param {Object} shortcut - Shortcut to handle
282
- * @param {string | Date} shortcut.singleValue - Selected date value
283
- * @param {Object} shortcut.rangeValue - Start and end date values
284
- * @param {string | Date} shortcut.rangeValue.start - Start date value
285
- * @param {string | Date} shortcut.rangeValue.end - End date value
286
- * @param {string} shortcut.label - Label
287
- * @returns {Function} Shortcut selection handler
288
- */
289
- private getShortcutHandler;
290
- /**
291
- * Handles week selection
292
- * @param {Date[]} dates - Dates to handle
293
- * @param {number} index - Calendar index
294
- * @returns {Function} Week selection handler
295
- */
296
- private getWeekSelectionHandler;
297
278
  /**
298
279
  * Resets the current selection
299
280
  */
@@ -319,7 +300,6 @@ export declare class NvCalendar {
319
300
  * @description Renders the week numbers of the calendar
320
301
  */
321
302
  private renderWeekNumbers;
322
- private renderDaysGrid;
323
303
  /**
324
304
  * Renders the calendar
325
305
  * @param {number} index - Calendar index
@@ -0,0 +1,19 @@
1
+ import { FunctionalComponent } from '../../../stencil-public-runtime';
2
+ /**
3
+ * Props for the CalendarActions component
4
+ */
5
+ interface CalendarActionsProps {
6
+ /** Handler for cancel/reset action */
7
+ onReset: () => void;
8
+ /** Handler for confirm/OK action */
9
+ onConfirm: () => void;
10
+ /** Whether to show the default actions or use slot content */
11
+ useSlot?: boolean;
12
+ }
13
+ /**
14
+ * Renders the action buttons for the calendar (Cancel/OK)
15
+ * @param {CalendarActionsProps} props - Component properties
16
+ * @returns {JSX.Element} JSX element representing the action buttons
17
+ */
18
+ export declare const CalendarActions: FunctionalComponent<CalendarActionsProps>;
19
+ export {};
@@ -0,0 +1,46 @@
1
+ import { FunctionalComponent } from '../../../stencil-public-runtime';
2
+ /**
3
+ * Day data structure
4
+ */
5
+ interface DayData {
6
+ /** Day of the month (1-31) */
7
+ dayOfMonth: number;
8
+ /** Complete date */
9
+ date: Date;
10
+ /** If the day belongs to the current month */
11
+ isCurrentMonth: boolean;
12
+ /** If the day is disabled */
13
+ isDisabled: boolean;
14
+ }
15
+ /**
16
+ * Props for the CalendarGrid component
17
+ */
18
+ interface CalendarGridProps {
19
+ /** Array of day data for the month */
20
+ days: DayData[];
21
+ /** Array of localized day names */
22
+ dayNames: string[];
23
+ /** Current selection type */
24
+ selectionType: 'single' | 'range';
25
+ /** Selected date in single mode */
26
+ selectedDate: Date | null;
27
+ /** Start date in range mode */
28
+ startDate: Date | null;
29
+ /** End date in range mode */
30
+ endDate: Date | null;
31
+ /** Whether date format is in UTC mode */
32
+ isUTCMode: boolean;
33
+ /** Handler for day selection */
34
+ onDayClick: (date: Date) => void;
35
+ /** Function to check if date is in range */
36
+ isDateInRange: (date: Date) => boolean;
37
+ /** Function to check if date is today */
38
+ isToday: (date: Date) => boolean;
39
+ }
40
+ /**
41
+ * Renders the calendar grid with day headers and day cells
42
+ * @param {CalendarGridProps} props - Component properties
43
+ * @returns {JSX.Element} JSX element representing the calendar grid
44
+ */
45
+ export declare const CalendarGrid: FunctionalComponent<CalendarGridProps>;
46
+ export {};
@@ -0,0 +1,38 @@
1
+ import { FunctionalComponent } from '../../../stencil-public-runtime';
2
+ /**
3
+ * Month data structure
4
+ */
5
+ interface MonthData {
6
+ /** Month value (0-11) */
7
+ value: number;
8
+ /** Month label */
9
+ label: string;
10
+ }
11
+ /**
12
+ * Props for the CalendarHeader component
13
+ */
14
+ interface CalendarHeaderProps {
15
+ /** Current displayed date */
16
+ currentDate: Date;
17
+ /** Array of localized months */
18
+ months: MonthData[];
19
+ /** Total number of calendars being displayed */
20
+ numberOfCalendars: number;
21
+ /** Index of this calendar (0-based) */
22
+ calendarIndex: number;
23
+ /** Month offset for this calendar */
24
+ monthOffset: number;
25
+ /** Handler for month navigation */
26
+ onMonthChange: (direction: number) => void;
27
+ /** Handler for month selection from dropdown */
28
+ onMonthSelect: (event: Event, offset: number) => void;
29
+ /** Handler for year input change */
30
+ onYearChange: (event: Event, offset: number) => void;
31
+ }
32
+ /**
33
+ * Renders the calendar header with navigation and date controls
34
+ * @param {CalendarHeaderProps} props - Component properties
35
+ * @returns {JSX.Element} JSX element representing the calendar header
36
+ */
37
+ export declare const CalendarHeader: FunctionalComponent<CalendarHeaderProps>;
38
+ export {};
@@ -0,0 +1,35 @@
1
+ import { FunctionalComponent } from '../../../stencil-public-runtime';
2
+ /**
3
+ * Shortcut data structure
4
+ */
5
+ interface ShortcutData {
6
+ /** Label of the shortcut */
7
+ label: string;
8
+ /** Selected date value for single selection mode */
9
+ singleValue?: string;
10
+ /** Date range values for range selection mode */
11
+ rangeValue?: {
12
+ /** ISO string for start date */
13
+ start: string;
14
+ /** ISO string for end date */
15
+ end: string;
16
+ };
17
+ }
18
+ /**
19
+ * Props for the CalendarShortcuts component
20
+ */
21
+ interface CalendarShortcutsProps {
22
+ /** Array of shortcut configurations */
23
+ shortcuts: ShortcutData[];
24
+ /** Placement of shortcuts in the calendar */
25
+ placement: 'bottom' | 'left' | 'right';
26
+ /** Handler for shortcut selection */
27
+ onShortcutClick: (shortcut: ShortcutData) => void;
28
+ }
29
+ /**
30
+ * Renders the shortcuts for quick date selection
31
+ * @param {CalendarShortcutsProps} props - Component properties
32
+ * @returns {JSX.Element | null} JSX element representing the shortcuts or null if no shortcuts
33
+ */
34
+ export declare const CalendarShortcuts: FunctionalComponent<CalendarShortcutsProps>;
35
+ export {};