@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
@@ -0,0 +1,355 @@
1
+ /* eslint-disable jsdoc/require-jsdoc */
2
+ import { describe, it, expect, vi } from "vitest";
3
+ function generateDefaultShortcuts() {
4
+ const today = new Date();
5
+ const tomorrow = new Date(today);
6
+ tomorrow.setDate(today.getDate() + 1);
7
+ const yesterday = new Date(today);
8
+ yesterday.setDate(today.getDate() - 1);
9
+ const thisWeekStart = new Date(today);
10
+ const dayOfWeek = today.getDay();
11
+ const diff = today.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1);
12
+ thisWeekStart.setDate(diff);
13
+ const thisWeekEnd = new Date(thisWeekStart);
14
+ thisWeekEnd.setDate(thisWeekStart.getDate() + 6);
15
+ const thisMonthStart = new Date(today.getFullYear(), today.getMonth(), 1);
16
+ const thisMonthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);
17
+ return [
18
+ { label: 'Today', dates: new Date(today) },
19
+ { label: 'Tomorrow', dates: new Date(tomorrow) },
20
+ { label: 'Yesterday', dates: new Date(yesterday) },
21
+ {
22
+ label: 'This Week',
23
+ dates: { start: new Date(thisWeekStart), end: new Date(thisWeekEnd) },
24
+ },
25
+ {
26
+ label: 'This Month',
27
+ dates: { start: new Date(thisMonthStart), end: new Date(thisMonthEnd) },
28
+ },
29
+ ];
30
+ }
31
+ function isShortcutDisabled(shortcut, minDate, maxDate) {
32
+ if (shortcut.disabled)
33
+ return true;
34
+ if (shortcut.dates instanceof Date) {
35
+ // Single date shortcut
36
+ if (minDate && shortcut.dates < minDate)
37
+ return true;
38
+ if (maxDate && shortcut.dates > maxDate)
39
+ return true;
40
+ }
41
+ else {
42
+ // Range shortcut
43
+ const { start, end } = shortcut.dates;
44
+ if (minDate && end < minDate)
45
+ return true;
46
+ if (maxDate && start > maxDate)
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ function shouldShowShortcuts(shortcuts, showShortcuts) {
52
+ return showShortcuts && shortcuts.length > 0;
53
+ }
54
+ function isValidShortcut(shortcut) {
55
+ if (!shortcut || typeof shortcut !== 'object')
56
+ return false;
57
+ const candidate = shortcut;
58
+ if (typeof candidate.label !== 'string' || !candidate.label.trim())
59
+ return false;
60
+ if (candidate.dates instanceof Date) {
61
+ return !isNaN(candidate.dates.getTime());
62
+ }
63
+ if (candidate.dates &&
64
+ typeof candidate.dates === 'object' &&
65
+ candidate.dates !== null) {
66
+ const range = candidate.dates;
67
+ if (range.start instanceof Date && range.end instanceof Date) {
68
+ return (!isNaN(range.start.getTime()) &&
69
+ !isNaN(range.end.getTime()) &&
70
+ range.start <= range.end);
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ function simulateShortcutClick(shortcut, onShortcutClick, isDisabled = false) {
76
+ if (!isDisabled && onShortcutClick) {
77
+ onShortcutClick(shortcut);
78
+ }
79
+ }
80
+ function formatShortcutLabel(label) {
81
+ return label.trim();
82
+ }
83
+ describe('CalendarShortcuts - Logic Tests', () => {
84
+ describe('Default Shortcuts Generation', () => {
85
+ it('should generate standard shortcuts', () => {
86
+ const shortcuts = generateDefaultShortcuts();
87
+ expect(shortcuts.length).toBe(5);
88
+ expect(shortcuts.map(s => s.label)).toEqual([
89
+ 'Today',
90
+ 'Tomorrow',
91
+ 'Yesterday',
92
+ 'This Week',
93
+ 'This Month',
94
+ ]);
95
+ });
96
+ it('should generate single date shortcuts correctly', () => {
97
+ const shortcuts = generateDefaultShortcuts();
98
+ const singleDateShortcuts = shortcuts.filter(s => s.dates instanceof Date);
99
+ expect(singleDateShortcuts.length).toBe(3); // Today, Tomorrow, Yesterday
100
+ singleDateShortcuts.forEach(shortcut => {
101
+ expect(shortcut.dates).toBeInstanceOf(Date);
102
+ expect(shortcut.dates.getTime()).not.toBeNaN();
103
+ });
104
+ });
105
+ it('should generate range shortcuts correctly', () => {
106
+ const shortcuts = generateDefaultShortcuts();
107
+ const rangeShortcuts = shortcuts.filter(s => !(s.dates instanceof Date));
108
+ expect(rangeShortcuts.length).toBe(2); // This Week, This Month
109
+ rangeShortcuts.forEach(shortcut => {
110
+ const range = shortcut.dates;
111
+ expect(range.start).toBeInstanceOf(Date);
112
+ expect(range.end).toBeInstanceOf(Date);
113
+ expect(range.start.getTime()).not.toBeNaN();
114
+ expect(range.end.getTime()).not.toBeNaN();
115
+ expect(range.start.getTime()).toBeLessThanOrEqual(range.end.getTime());
116
+ });
117
+ });
118
+ it('should generate chronologically correct shortcuts', () => {
119
+ var _a, _b, _c;
120
+ const shortcuts = generateDefaultShortcuts();
121
+ const today = (_a = shortcuts.find(s => s.label === 'Today')) === null || _a === void 0 ? void 0 : _a.dates;
122
+ const tomorrow = (_b = shortcuts.find(s => s.label === 'Tomorrow')) === null || _b === void 0 ? void 0 : _b.dates;
123
+ const yesterday = (_c = shortcuts.find(s => s.label === 'Yesterday')) === null || _c === void 0 ? void 0 : _c.dates;
124
+ expect(yesterday.getTime()).toBeLessThan(today.getTime());
125
+ expect(today.getTime()).toBeLessThan(tomorrow.getTime());
126
+ });
127
+ });
128
+ describe('Shortcut Validation', () => {
129
+ it('should validate correct single date shortcuts', () => {
130
+ const validShortcut = {
131
+ label: 'Test Date',
132
+ dates: new Date('2024-06-15'),
133
+ };
134
+ expect(isValidShortcut(validShortcut)).toBe(true);
135
+ });
136
+ it('should validate correct range shortcuts', () => {
137
+ const validRangeShortcut = {
138
+ label: 'Test Range',
139
+ dates: {
140
+ start: new Date('2024-06-01'),
141
+ end: new Date('2024-06-30'),
142
+ },
143
+ };
144
+ expect(isValidShortcut(validRangeShortcut)).toBe(true);
145
+ });
146
+ it('should reject invalid shortcuts', () => {
147
+ const invalidShortcuts = [
148
+ null,
149
+ undefined,
150
+ {},
151
+ { label: '' },
152
+ { label: 'Test' }, // Missing dates
153
+ { label: 'Test', dates: 'invalid' },
154
+ { label: 'Test', dates: new Date('invalid') },
155
+ {
156
+ label: 'Test',
157
+ dates: { start: new Date('2024-06-30'), end: new Date('2024-06-01') },
158
+ }, // End before start
159
+ {
160
+ label: 'Test',
161
+ dates: { start: 'invalid', end: new Date('2024-06-01') },
162
+ },
163
+ ];
164
+ invalidShortcuts.forEach(shortcut => {
165
+ expect(isValidShortcut(shortcut)).toBe(false);
166
+ });
167
+ });
168
+ it('should handle edge cases in validation', () => {
169
+ const edgeCases = [
170
+ { label: ' Valid ', dates: new Date() }, // Whitespace in label
171
+ {
172
+ label: 'Same Day Range',
173
+ dates: { start: new Date('2024-06-15'), end: new Date('2024-06-15') },
174
+ }, // Same start and end
175
+ ];
176
+ edgeCases.forEach(shortcut => {
177
+ expect(isValidShortcut(shortcut)).toBe(true);
178
+ });
179
+ });
180
+ });
181
+ describe('Shortcut Disabled State Logic', () => {
182
+ const testDate = new Date('2024-06-15');
183
+ const rangeShortcut = {
184
+ label: 'Test Range',
185
+ dates: { start: new Date('2024-06-10'), end: new Date('2024-06-20') },
186
+ };
187
+ const singleShortcut = { label: 'Test Single', dates: testDate };
188
+ it('should disable shortcuts explicitly marked as disabled', () => {
189
+ const disabledShortcut = Object.assign(Object.assign({}, singleShortcut), { disabled: true });
190
+ expect(isShortcutDisabled(disabledShortcut)).toBe(true);
191
+ });
192
+ it('should disable single date shortcuts outside date range', () => {
193
+ const minDate = new Date('2024-06-20');
194
+ const maxDate = new Date('2024-06-10');
195
+ expect(isShortcutDisabled(singleShortcut, minDate, maxDate)).toBe(true);
196
+ expect(isShortcutDisabled(singleShortcut, undefined, maxDate)).toBe(true);
197
+ });
198
+ it('should disable range shortcuts outside date range', () => {
199
+ const minDate = new Date('2024-06-25');
200
+ const maxDate = new Date('2024-06-05');
201
+ expect(isShortcutDisabled(rangeShortcut, minDate)).toBe(true);
202
+ expect(isShortcutDisabled(rangeShortcut, undefined, maxDate)).toBe(true);
203
+ });
204
+ it('should enable shortcuts within date range', () => {
205
+ const minDate = new Date('2024-06-01');
206
+ const maxDate = new Date('2024-06-30');
207
+ expect(isShortcutDisabled(singleShortcut, minDate, maxDate)).toBe(false);
208
+ expect(isShortcutDisabled(rangeShortcut, minDate, maxDate)).toBe(false);
209
+ });
210
+ it('should handle partial range overlaps', () => {
211
+ const minDate = new Date('2024-06-15');
212
+ const maxDate = new Date('2024-06-30');
213
+ // Range starts before min but ends after min
214
+ expect(isShortcutDisabled(rangeShortcut, minDate, maxDate)).toBe(false);
215
+ });
216
+ });
217
+ describe('Visibility Logic', () => {
218
+ const shortcuts = generateDefaultShortcuts();
219
+ it('should show shortcuts when enabled and shortcuts exist', () => {
220
+ expect(shouldShowShortcuts(shortcuts, true)).toBe(true);
221
+ });
222
+ it('should hide shortcuts when disabled', () => {
223
+ expect(shouldShowShortcuts(shortcuts, false)).toBe(false);
224
+ });
225
+ it('should hide shortcuts when no shortcuts provided', () => {
226
+ expect(shouldShowShortcuts([], true)).toBe(false);
227
+ });
228
+ });
229
+ describe('Click Handling Logic', () => {
230
+ const testShortcut = {
231
+ label: 'Test',
232
+ dates: new Date('2024-06-15'),
233
+ };
234
+ it('should call onClick when shortcut is clicked and enabled', () => {
235
+ const mockOnClick = vi.fn();
236
+ simulateShortcutClick(testShortcut, mockOnClick, false);
237
+ expect(mockOnClick).toHaveBeenCalledWith(testShortcut);
238
+ expect(mockOnClick).toHaveBeenCalledTimes(1);
239
+ });
240
+ it('should not call onClick when shortcut is disabled', () => {
241
+ const mockOnClick = vi.fn();
242
+ simulateShortcutClick(testShortcut, mockOnClick, true);
243
+ expect(mockOnClick).not.toHaveBeenCalled();
244
+ });
245
+ it('should handle undefined onClick gracefully', () => {
246
+ expect(() => {
247
+ simulateShortcutClick(testShortcut, undefined, false);
248
+ }).not.toThrow();
249
+ });
250
+ it('should handle multiple clicks correctly', () => {
251
+ const mockOnClick = vi.fn();
252
+ simulateShortcutClick(testShortcut, mockOnClick, false);
253
+ simulateShortcutClick(testShortcut, mockOnClick, false);
254
+ expect(mockOnClick).toHaveBeenCalledTimes(2);
255
+ });
256
+ });
257
+ describe('Label Formatting Logic', () => {
258
+ it('should format labels correctly', () => {
259
+ expect(formatShortcutLabel('Today')).toBe('Today');
260
+ expect(formatShortcutLabel(' Spaced ')).toBe('Spaced');
261
+ expect(formatShortcutLabel('This Week')).toBe('This Week');
262
+ });
263
+ it('should handle empty and whitespace labels', () => {
264
+ expect(formatShortcutLabel('')).toBe('');
265
+ expect(formatShortcutLabel(' ')).toBe('');
266
+ expect(formatShortcutLabel('\t\n')).toBe('');
267
+ });
268
+ });
269
+ describe('Integration Scenarios', () => {
270
+ it('should handle complete shortcut workflow', () => {
271
+ // Use fixed shortcuts instead of dynamic ones to avoid timing issues
272
+ const fixedShortcuts = [
273
+ { label: 'Fixed Date 1', dates: new Date('2024-06-01') },
274
+ { label: 'Fixed Date 2', dates: new Date('2024-06-15') },
275
+ {
276
+ label: 'Fixed Range',
277
+ dates: {
278
+ start: new Date('2024-06-10'),
279
+ end: new Date('2024-06-20'),
280
+ },
281
+ },
282
+ ];
283
+ const minDate = new Date('2024-01-01');
284
+ const maxDate = new Date('2024-12-31');
285
+ const mockOnClick = vi.fn();
286
+ fixedShortcuts.forEach(shortcut => {
287
+ const isValid = isValidShortcut(shortcut);
288
+ const isDisabled = isShortcutDisabled(shortcut, minDate, maxDate);
289
+ const shouldShow = shouldShowShortcuts(fixedShortcuts, true);
290
+ expect(isValid).toBe(true);
291
+ expect(shouldShow).toBe(true);
292
+ if (!isDisabled) {
293
+ simulateShortcutClick(shortcut, mockOnClick, isDisabled);
294
+ }
295
+ });
296
+ expect(mockOnClick).toHaveBeenCalled();
297
+ });
298
+ it('should handle custom shortcuts with mixed types', () => {
299
+ const customShortcuts = [
300
+ { label: 'Custom Single', dates: new Date('2024-07-01') },
301
+ {
302
+ label: 'Custom Range',
303
+ dates: { start: new Date('2024-07-01'), end: new Date('2024-07-07') },
304
+ },
305
+ { label: 'Disabled Custom', dates: new Date(), disabled: true },
306
+ ];
307
+ customShortcuts.forEach(shortcut => {
308
+ expect(isValidShortcut(shortcut)).toBe(true);
309
+ });
310
+ const enabledShortcuts = customShortcuts.filter(s => !isShortcutDisabled(s));
311
+ expect(enabledShortcuts.length).toBe(2);
312
+ });
313
+ });
314
+ describe('Edge Cases', () => {
315
+ it('should handle shortcuts around date boundaries', () => {
316
+ const yearEndShortcuts = [
317
+ { label: 'New Year', dates: new Date('2024-01-01') },
318
+ { label: 'Year End', dates: new Date('2024-12-31') },
319
+ {
320
+ label: 'Year Transition',
321
+ dates: {
322
+ start: new Date('2024-12-30'),
323
+ end: new Date('2025-01-02'),
324
+ },
325
+ },
326
+ ];
327
+ yearEndShortcuts.forEach(shortcut => {
328
+ expect(isValidShortcut(shortcut)).toBe(true);
329
+ });
330
+ });
331
+ it('should handle leap year dates correctly', () => {
332
+ const leapYearShortcut = {
333
+ label: 'Leap Day',
334
+ dates: new Date('2024-02-29'),
335
+ };
336
+ expect(isValidShortcut(leapYearShortcut)).toBe(true);
337
+ });
338
+ it('should handle very long shortcut labels', () => {
339
+ const longLabelShortcut = {
340
+ label: 'A'.repeat(100),
341
+ dates: new Date(),
342
+ };
343
+ expect(isValidShortcut(longLabelShortcut)).toBe(true);
344
+ expect(formatShortcutLabel(longLabelShortcut.label)).toBe('A'.repeat(100));
345
+ });
346
+ it('should handle timezone edge cases', () => {
347
+ const timezoneShortcut = {
348
+ label: 'Timezone Test',
349
+ dates: new Date('2024-06-15T23:59:59.999Z'),
350
+ };
351
+ expect(isValidShortcut(timezoneShortcut)).toBe(true);
352
+ });
353
+ });
354
+ });
355
+ //# sourceMappingURL=calendar-shortcuts.logic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-shortcuts.logic.test.js","sourceRoot":"","sources":["../../../../../src/components/nv-calendar/test/partials/calendar-shortcuts.logic.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { describe, it, expect, vi } from 'vitest';\n\n/**\n * Logic tests for the CalendarShortcuts partial\n *\n * These tests validate the calendar shortcuts logic:\n * - Date shortcuts generation\n * - Custom shortcuts validation\n * - Click handling and selections\n * - Conditional display logic\n */\n\ninterface Shortcut {\n label: string;\n dates: Date | { start: Date; end: Date };\n disabled?: boolean;\n}\n\nfunction generateDefaultShortcuts(): Shortcut[] {\n const today = new Date();\n const tomorrow = new Date(today);\n tomorrow.setDate(today.getDate() + 1);\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n\n const thisWeekStart = new Date(today);\n const dayOfWeek = today.getDay();\n const diff = today.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1);\n thisWeekStart.setDate(diff);\n\n const thisWeekEnd = new Date(thisWeekStart);\n thisWeekEnd.setDate(thisWeekStart.getDate() + 6);\n\n const thisMonthStart = new Date(today.getFullYear(), today.getMonth(), 1);\n const thisMonthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);\n\n return [\n { label: 'Today', dates: new Date(today) },\n { label: 'Tomorrow', dates: new Date(tomorrow) },\n { label: 'Yesterday', dates: new Date(yesterday) },\n {\n label: 'This Week',\n dates: { start: new Date(thisWeekStart), end: new Date(thisWeekEnd) },\n },\n {\n label: 'This Month',\n dates: { start: new Date(thisMonthStart), end: new Date(thisMonthEnd) },\n },\n ];\n}\n\nfunction isShortcutDisabled(\n shortcut: Shortcut,\n minDate?: Date,\n maxDate?: Date,\n): boolean {\n if (shortcut.disabled) return true;\n\n if (shortcut.dates instanceof Date) {\n // Single date shortcut\n if (minDate && shortcut.dates < minDate) return true;\n if (maxDate && shortcut.dates > maxDate) return true;\n } else {\n // Range shortcut\n const { start, end } = shortcut.dates;\n if (minDate && end < minDate) return true;\n if (maxDate && start > maxDate) return true;\n }\n\n return false;\n}\n\nfunction shouldShowShortcuts(\n shortcuts: Shortcut[],\n showShortcuts: boolean,\n): boolean {\n return showShortcuts && shortcuts.length > 0;\n}\n\nfunction isValidShortcut(shortcut: unknown): shortcut is Shortcut {\n if (!shortcut || typeof shortcut !== 'object') return false;\n\n const candidate = shortcut as Record<string, unknown>;\n\n if (typeof candidate.label !== 'string' || !candidate.label.trim())\n return false;\n\n if (candidate.dates instanceof Date) {\n return !isNaN(candidate.dates.getTime());\n }\n\n if (\n candidate.dates &&\n typeof candidate.dates === 'object' &&\n candidate.dates !== null\n ) {\n const range = candidate.dates as Record<string, unknown>;\n if (range.start instanceof Date && range.end instanceof Date) {\n return (\n !isNaN(range.start.getTime()) &&\n !isNaN(range.end.getTime()) &&\n range.start <= range.end\n );\n }\n }\n\n return false;\n}\n\nfunction simulateShortcutClick(\n shortcut: Shortcut,\n onShortcutClick?: (shortcut: Shortcut) => void,\n isDisabled = false,\n) {\n if (!isDisabled && onShortcutClick) {\n onShortcutClick(shortcut);\n }\n}\n\nfunction formatShortcutLabel(label: string): string {\n return label.trim();\n}\n\ndescribe('CalendarShortcuts - Logic Tests', () => {\n describe('Default Shortcuts Generation', () => {\n it('should generate standard shortcuts', () => {\n const shortcuts = generateDefaultShortcuts();\n\n expect(shortcuts.length).toBe(5);\n expect(shortcuts.map(s => s.label)).toEqual([\n 'Today',\n 'Tomorrow',\n 'Yesterday',\n 'This Week',\n 'This Month',\n ]);\n });\n\n it('should generate single date shortcuts correctly', () => {\n const shortcuts = generateDefaultShortcuts();\n const singleDateShortcuts = shortcuts.filter(\n s => s.dates instanceof Date,\n );\n\n expect(singleDateShortcuts.length).toBe(3); // Today, Tomorrow, Yesterday\n singleDateShortcuts.forEach(shortcut => {\n expect(shortcut.dates).toBeInstanceOf(Date);\n expect((shortcut.dates as Date).getTime()).not.toBeNaN();\n });\n });\n\n it('should generate range shortcuts correctly', () => {\n const shortcuts = generateDefaultShortcuts();\n const rangeShortcuts = shortcuts.filter(s => !(s.dates instanceof Date));\n\n expect(rangeShortcuts.length).toBe(2); // This Week, This Month\n rangeShortcuts.forEach(shortcut => {\n const range = shortcut.dates as { start: Date; end: Date };\n expect(range.start).toBeInstanceOf(Date);\n expect(range.end).toBeInstanceOf(Date);\n expect(range.start.getTime()).not.toBeNaN();\n expect(range.end.getTime()).not.toBeNaN();\n expect(range.start.getTime()).toBeLessThanOrEqual(range.end.getTime());\n });\n });\n\n it('should generate chronologically correct shortcuts', () => {\n const shortcuts = generateDefaultShortcuts();\n const today = shortcuts.find(s => s.label === 'Today')?.dates as Date;\n const tomorrow = shortcuts.find(s => s.label === 'Tomorrow')\n ?.dates as Date;\n const yesterday = shortcuts.find(s => s.label === 'Yesterday')\n ?.dates as Date;\n\n expect(yesterday.getTime()).toBeLessThan(today.getTime());\n expect(today.getTime()).toBeLessThan(tomorrow.getTime());\n });\n });\n\n describe('Shortcut Validation', () => {\n it('should validate correct single date shortcuts', () => {\n const validShortcut = {\n label: 'Test Date',\n dates: new Date('2024-06-15'),\n };\n\n expect(isValidShortcut(validShortcut)).toBe(true);\n });\n\n it('should validate correct range shortcuts', () => {\n const validRangeShortcut = {\n label: 'Test Range',\n dates: {\n start: new Date('2024-06-01'),\n end: new Date('2024-06-30'),\n },\n };\n\n expect(isValidShortcut(validRangeShortcut)).toBe(true);\n });\n\n it('should reject invalid shortcuts', () => {\n const invalidShortcuts = [\n null,\n undefined,\n {},\n { label: '' },\n { label: 'Test' }, // Missing dates\n { label: 'Test', dates: 'invalid' },\n { label: 'Test', dates: new Date('invalid') },\n {\n label: 'Test',\n dates: { start: new Date('2024-06-30'), end: new Date('2024-06-01') },\n }, // End before start\n {\n label: 'Test',\n dates: { start: 'invalid', end: new Date('2024-06-01') },\n },\n ];\n\n invalidShortcuts.forEach(shortcut => {\n expect(isValidShortcut(shortcut)).toBe(false);\n });\n });\n\n it('should handle edge cases in validation', () => {\n const edgeCases = [\n { label: ' Valid ', dates: new Date() }, // Whitespace in label\n {\n label: 'Same Day Range',\n dates: { start: new Date('2024-06-15'), end: new Date('2024-06-15') },\n }, // Same start and end\n ];\n\n edgeCases.forEach(shortcut => {\n expect(isValidShortcut(shortcut)).toBe(true);\n });\n });\n });\n\n describe('Shortcut Disabled State Logic', () => {\n const testDate = new Date('2024-06-15');\n const rangeShortcut: Shortcut = {\n label: 'Test Range',\n dates: { start: new Date('2024-06-10'), end: new Date('2024-06-20') },\n };\n const singleShortcut: Shortcut = { label: 'Test Single', dates: testDate };\n\n it('should disable shortcuts explicitly marked as disabled', () => {\n const disabledShortcut = { ...singleShortcut, disabled: true };\n expect(isShortcutDisabled(disabledShortcut)).toBe(true);\n });\n\n it('should disable single date shortcuts outside date range', () => {\n const minDate = new Date('2024-06-20');\n const maxDate = new Date('2024-06-10');\n\n expect(isShortcutDisabled(singleShortcut, minDate, maxDate)).toBe(true);\n expect(isShortcutDisabled(singleShortcut, undefined, maxDate)).toBe(true);\n });\n\n it('should disable range shortcuts outside date range', () => {\n const minDate = new Date('2024-06-25');\n const maxDate = new Date('2024-06-05');\n\n expect(isShortcutDisabled(rangeShortcut, minDate)).toBe(true);\n expect(isShortcutDisabled(rangeShortcut, undefined, maxDate)).toBe(true);\n });\n\n it('should enable shortcuts within date range', () => {\n const minDate = new Date('2024-06-01');\n const maxDate = new Date('2024-06-30');\n\n expect(isShortcutDisabled(singleShortcut, minDate, maxDate)).toBe(false);\n expect(isShortcutDisabled(rangeShortcut, minDate, maxDate)).toBe(false);\n });\n\n it('should handle partial range overlaps', () => {\n const minDate = new Date('2024-06-15');\n const maxDate = new Date('2024-06-30');\n\n // Range starts before min but ends after min\n expect(isShortcutDisabled(rangeShortcut, minDate, maxDate)).toBe(false);\n });\n });\n\n describe('Visibility Logic', () => {\n const shortcuts = generateDefaultShortcuts();\n\n it('should show shortcuts when enabled and shortcuts exist', () => {\n expect(shouldShowShortcuts(shortcuts, true)).toBe(true);\n });\n\n it('should hide shortcuts when disabled', () => {\n expect(shouldShowShortcuts(shortcuts, false)).toBe(false);\n });\n\n it('should hide shortcuts when no shortcuts provided', () => {\n expect(shouldShowShortcuts([], true)).toBe(false);\n });\n });\n\n describe('Click Handling Logic', () => {\n const testShortcut: Shortcut = {\n label: 'Test',\n dates: new Date('2024-06-15'),\n };\n\n it('should call onClick when shortcut is clicked and enabled', () => {\n const mockOnClick = vi.fn();\n\n simulateShortcutClick(testShortcut, mockOnClick, false);\n\n expect(mockOnClick).toHaveBeenCalledWith(testShortcut);\n expect(mockOnClick).toHaveBeenCalledTimes(1);\n });\n\n it('should not call onClick when shortcut is disabled', () => {\n const mockOnClick = vi.fn();\n\n simulateShortcutClick(testShortcut, mockOnClick, true);\n\n expect(mockOnClick).not.toHaveBeenCalled();\n });\n\n it('should handle undefined onClick gracefully', () => {\n expect(() => {\n simulateShortcutClick(testShortcut, undefined, false);\n }).not.toThrow();\n });\n\n it('should handle multiple clicks correctly', () => {\n const mockOnClick = vi.fn();\n\n simulateShortcutClick(testShortcut, mockOnClick, false);\n simulateShortcutClick(testShortcut, mockOnClick, false);\n\n expect(mockOnClick).toHaveBeenCalledTimes(2);\n });\n });\n\n describe('Label Formatting Logic', () => {\n it('should format labels correctly', () => {\n expect(formatShortcutLabel('Today')).toBe('Today');\n expect(formatShortcutLabel(' Spaced ')).toBe('Spaced');\n expect(formatShortcutLabel('This Week')).toBe('This Week');\n });\n\n it('should handle empty and whitespace labels', () => {\n expect(formatShortcutLabel('')).toBe('');\n expect(formatShortcutLabel(' ')).toBe('');\n expect(formatShortcutLabel('\\t\\n')).toBe('');\n });\n });\n\n describe('Integration Scenarios', () => {\n it('should handle complete shortcut workflow', () => {\n // Use fixed shortcuts instead of dynamic ones to avoid timing issues\n const fixedShortcuts: Shortcut[] = [\n { label: 'Fixed Date 1', dates: new Date('2024-06-01') },\n { label: 'Fixed Date 2', dates: new Date('2024-06-15') },\n {\n label: 'Fixed Range',\n dates: {\n start: new Date('2024-06-10'),\n end: new Date('2024-06-20'),\n },\n },\n ];\n\n const minDate = new Date('2024-01-01');\n const maxDate = new Date('2024-12-31');\n const mockOnClick = vi.fn();\n\n fixedShortcuts.forEach(shortcut => {\n const isValid = isValidShortcut(shortcut);\n const isDisabled = isShortcutDisabled(shortcut, minDate, maxDate);\n const shouldShow = shouldShowShortcuts(fixedShortcuts, true);\n\n expect(isValid).toBe(true);\n expect(shouldShow).toBe(true);\n\n if (!isDisabled) {\n simulateShortcutClick(shortcut, mockOnClick, isDisabled);\n }\n });\n\n expect(mockOnClick).toHaveBeenCalled();\n });\n\n it('should handle custom shortcuts with mixed types', () => {\n const customShortcuts: Shortcut[] = [\n { label: 'Custom Single', dates: new Date('2024-07-01') },\n {\n label: 'Custom Range',\n dates: { start: new Date('2024-07-01'), end: new Date('2024-07-07') },\n },\n { label: 'Disabled Custom', dates: new Date(), disabled: true },\n ];\n\n customShortcuts.forEach(shortcut => {\n expect(isValidShortcut(shortcut)).toBe(true);\n });\n\n const enabledShortcuts = customShortcuts.filter(\n s => !isShortcutDisabled(s),\n );\n expect(enabledShortcuts.length).toBe(2);\n });\n });\n\n describe('Edge Cases', () => {\n it('should handle shortcuts around date boundaries', () => {\n const yearEndShortcuts: Shortcut[] = [\n { label: 'New Year', dates: new Date('2024-01-01') },\n { label: 'Year End', dates: new Date('2024-12-31') },\n {\n label: 'Year Transition',\n dates: {\n start: new Date('2024-12-30'),\n end: new Date('2025-01-02'),\n },\n },\n ];\n\n yearEndShortcuts.forEach(shortcut => {\n expect(isValidShortcut(shortcut)).toBe(true);\n });\n });\n\n it('should handle leap year dates correctly', () => {\n const leapYearShortcut: Shortcut = {\n label: 'Leap Day',\n dates: new Date('2024-02-29'),\n };\n\n expect(isValidShortcut(leapYearShortcut)).toBe(true);\n });\n\n it('should handle very long shortcut labels', () => {\n const longLabelShortcut: Shortcut = {\n label: 'A'.repeat(100),\n dates: new Date(),\n };\n\n expect(isValidShortcut(longLabelShortcut)).toBe(true);\n expect(formatShortcutLabel(longLabelShortcut.label)).toBe(\n 'A'.repeat(100),\n );\n });\n\n it('should handle timezone edge cases', () => {\n const timezoneShortcut: Shortcut = {\n label: 'Timezone Test',\n dates: new Date('2024-06-15T23:59:59.999Z'),\n };\n\n expect(isValidShortcut(timezoneShortcut)).toBe(true);\n });\n });\n});\n"]}
@@ -0,0 +1,250 @@
1
+ /* eslint-disable jsdoc/require-jsdoc */
2
+ import { describe, it, expect, vi } from "vitest";
3
+ /**
4
+ * Logic tests for the DayCell partial
5
+ *
6
+ * These tests validate business logic without directly testing JSX.
7
+ * They focus on testable aspects: class generation,
8
+ * conditional logic, and event handling.
9
+ */
10
+ /**
11
+ * Utility function that replicates the class generation logic
12
+ * of the DayCell partial to allow unit testing
13
+ * @param {object} props - DayCell state configuration
14
+ * @param {boolean} props.isSelected - If the day is selected
15
+ * @param {boolean} props.isStart - If the day is the start of a range
16
+ * @param {boolean} props.isEnd - If the day is the end of a range
17
+ * @param {boolean} props.isInRange - If the day is in a selected range
18
+ * @param {boolean} props.isDisabled - If the day is disabled
19
+ * @param {boolean} props.isCurrentMonth - If the day belongs to the current month
20
+ * @param {boolean} props.isToday - If the day is today
21
+ * @returns {string} String containing generated CSS classes
22
+ */
23
+ function generateDayCellClasses(props) {
24
+ const { isSelected, isStart, isEnd, isInRange, isDisabled, isCurrentMonth, isToday, } = props;
25
+ return [
26
+ 'day',
27
+ isSelected ? 'selected' : '',
28
+ isStart ? 'range-start' : '',
29
+ isEnd ? 'range-end' : '',
30
+ isInRange ? 'in-range' : '',
31
+ isDisabled ? 'disabled' : '',
32
+ !isCurrentMonth ? 'outside-month' : '',
33
+ isToday ? 'is-today' : '',
34
+ ]
35
+ .filter(Boolean)
36
+ .join(' ');
37
+ }
38
+ /**
39
+ * Utility function that replicates the click handling logic
40
+ * of the DayCell partial
41
+ * @param {boolean} isDisabled - If the day is disabled
42
+ * @param {((date: Date) => void) | undefined} onClick - Callback function to call on click
43
+ * @param {Date} date - Date to pass to the callback
44
+ */
45
+ function simulateHandleClick(isDisabled, onClick, date) {
46
+ if (!isDisabled && onClick) {
47
+ onClick(date);
48
+ }
49
+ }
50
+ describe('DayCell - Logic Tests', () => {
51
+ describe('CSS Classes Generation Logic', () => {
52
+ it('should generate basic day class', () => {
53
+ const classes = generateDayCellClasses({
54
+ isSelected: false,
55
+ isStart: false,
56
+ isEnd: false,
57
+ isInRange: false,
58
+ isDisabled: false,
59
+ isCurrentMonth: true,
60
+ isToday: false,
61
+ });
62
+ expect(classes).toBe('day');
63
+ });
64
+ it('should include selected class when isSelected is true', () => {
65
+ const classes = generateDayCellClasses({
66
+ isSelected: true,
67
+ isStart: false,
68
+ isEnd: false,
69
+ isInRange: false,
70
+ isDisabled: false,
71
+ isCurrentMonth: true,
72
+ isToday: false,
73
+ });
74
+ expect(classes).toContain('selected');
75
+ expect(classes).toContain('day');
76
+ });
77
+ it('should include range classes for range selection', () => {
78
+ const startClasses = generateDayCellClasses({
79
+ isSelected: false,
80
+ isStart: true,
81
+ isEnd: false,
82
+ isInRange: true,
83
+ isDisabled: false,
84
+ isCurrentMonth: true,
85
+ isToday: false,
86
+ });
87
+ expect(startClasses).toContain('range-start');
88
+ expect(startClasses).toContain('in-range');
89
+ expect(startClasses).not.toContain('range-end');
90
+ const endClasses = generateDayCellClasses({
91
+ isSelected: false,
92
+ isStart: false,
93
+ isEnd: true,
94
+ isInRange: true,
95
+ isDisabled: false,
96
+ isCurrentMonth: true,
97
+ isToday: false,
98
+ });
99
+ expect(endClasses).toContain('range-end');
100
+ expect(endClasses).toContain('in-range');
101
+ expect(endClasses).not.toContain('range-start');
102
+ });
103
+ it('should include disabled class when isDisabled is true', () => {
104
+ const classes = generateDayCellClasses({
105
+ isSelected: false,
106
+ isStart: false,
107
+ isEnd: false,
108
+ isInRange: false,
109
+ isDisabled: true,
110
+ isCurrentMonth: true,
111
+ isToday: false,
112
+ });
113
+ expect(classes).toContain('disabled');
114
+ });
115
+ it('should include outside-month class when not current month', () => {
116
+ const classes = generateDayCellClasses({
117
+ isSelected: false,
118
+ isStart: false,
119
+ isEnd: false,
120
+ isInRange: false,
121
+ isDisabled: false,
122
+ isCurrentMonth: false,
123
+ isToday: false,
124
+ });
125
+ expect(classes).toContain('outside-month');
126
+ });
127
+ it('should include is-today class when isToday is true', () => {
128
+ const classes = generateDayCellClasses({
129
+ isSelected: false,
130
+ isStart: false,
131
+ isEnd: false,
132
+ isInRange: false,
133
+ isDisabled: false,
134
+ isCurrentMonth: true,
135
+ isToday: true,
136
+ });
137
+ expect(classes).toContain('is-today');
138
+ });
139
+ it('should combine multiple classes correctly', () => {
140
+ const classes = generateDayCellClasses({
141
+ isSelected: true,
142
+ isStart: false,
143
+ isEnd: false,
144
+ isInRange: false,
145
+ isDisabled: false,
146
+ isCurrentMonth: true,
147
+ isToday: true,
148
+ });
149
+ const classList = classes.split(' ');
150
+ expect(classList).toContain('day');
151
+ expect(classList).toContain('selected');
152
+ expect(classList).toContain('is-today');
153
+ expect(classList).not.toContain('disabled');
154
+ expect(classList).not.toContain('outside-month');
155
+ });
156
+ it('should handle all states enabled simultaneously', () => {
157
+ const classes = generateDayCellClasses({
158
+ isSelected: true,
159
+ isStart: true,
160
+ isEnd: true,
161
+ isInRange: true,
162
+ isDisabled: true,
163
+ isCurrentMonth: false,
164
+ isToday: true,
165
+ });
166
+ const classList = classes.split(' ');
167
+ expect(classList).toContain('day');
168
+ expect(classList).toContain('selected');
169
+ expect(classList).toContain('range-start');
170
+ expect(classList).toContain('range-end');
171
+ expect(classList).toContain('in-range');
172
+ expect(classList).toContain('disabled');
173
+ expect(classList).toContain('outside-month');
174
+ expect(classList).toContain('is-today');
175
+ });
176
+ });
177
+ describe('Click Handler Logic', () => {
178
+ it('should call onClick when not disabled and onClick is provided', () => {
179
+ const mockOnClick = vi.fn();
180
+ const testDate = new Date('2024-01-15');
181
+ simulateHandleClick(false, mockOnClick, testDate);
182
+ expect(mockOnClick).toHaveBeenCalledWith(testDate);
183
+ expect(mockOnClick).toHaveBeenCalledTimes(1);
184
+ });
185
+ it('should not call onClick when disabled', () => {
186
+ const mockOnClick = vi.fn();
187
+ const testDate = new Date('2024-01-15');
188
+ simulateHandleClick(true, mockOnClick, testDate);
189
+ expect(mockOnClick).not.toHaveBeenCalled();
190
+ });
191
+ it('should not call onClick when onClick is undefined', () => {
192
+ const testDate = new Date('2024-01-15');
193
+ // Should not throw error
194
+ expect(() => {
195
+ simulateHandleClick(false, undefined, testDate);
196
+ }).not.toThrow();
197
+ });
198
+ it('should handle multiple clicks correctly', () => {
199
+ const mockOnClick = vi.fn();
200
+ const testDate = new Date('2024-01-15');
201
+ simulateHandleClick(false, mockOnClick, testDate);
202
+ simulateHandleClick(false, mockOnClick, testDate);
203
+ simulateHandleClick(false, mockOnClick, testDate);
204
+ expect(mockOnClick).toHaveBeenCalledTimes(3);
205
+ expect(mockOnClick).toHaveBeenCalledWith(testDate);
206
+ });
207
+ });
208
+ describe('Edge Cases and Validation', () => {
209
+ it('should handle all boolean combinations without errors', () => {
210
+ // Test all possible combinations of boolean flags
211
+ const booleanCombinations = [
212
+ [false, false, false, false, false, false, false],
213
+ [true, false, false, false, false, false, false],
214
+ [false, true, false, false, false, false, false],
215
+ [false, false, true, false, false, false, false],
216
+ [false, false, false, true, false, false, false],
217
+ [false, false, false, false, true, false, false],
218
+ [false, false, false, false, false, true, false],
219
+ [false, false, false, false, false, false, true],
220
+ [true, true, true, true, true, true, true],
221
+ ];
222
+ booleanCombinations.forEach(([isSelected, isStart, isEnd, isInRange, isDisabled, isCurrentMonth, isToday,]) => {
223
+ expect(() => {
224
+ generateDayCellClasses({
225
+ isSelected,
226
+ isStart,
227
+ isEnd,
228
+ isInRange,
229
+ isDisabled,
230
+ isCurrentMonth,
231
+ isToday,
232
+ });
233
+ }).not.toThrow();
234
+ });
235
+ });
236
+ it('should always include base day class', () => {
237
+ // Test with different combinations that the 'day' class is always present
238
+ const testCases = [
239
+ { isSelected: true, isToday: true, isDisabled: false },
240
+ { isSelected: false, isToday: false, isDisabled: true },
241
+ { isInRange: true, isStart: true, isCurrentMonth: false },
242
+ ];
243
+ testCases.forEach(testCase => {
244
+ const classes = generateDayCellClasses(Object.assign({ isSelected: false, isStart: false, isEnd: false, isInRange: false, isDisabled: false, isCurrentMonth: true, isToday: false }, testCase));
245
+ expect(classes).toContain('day');
246
+ });
247
+ });
248
+ });
249
+ });
250
+ //# sourceMappingURL=day-cell.logic.test.js.map