@nectary/components 2.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 (442) hide show
  1. package/accordion/index.d.ts +11 -0
  2. package/accordion/index.js +86 -0
  3. package/accordion/types.d.ts +21 -0
  4. package/accordion/types.js +1 -0
  5. package/accordion-item/index.d.ts +14 -0
  6. package/accordion-item/index.js +95 -0
  7. package/accordion-item/types.d.ts +36 -0
  8. package/accordion-item/types.js +1 -0
  9. package/accordion-item/utils.d.ts +2 -0
  10. package/accordion-item/utils.js +1 -0
  11. package/action-menu/index.d.ts +11 -0
  12. package/action-menu/index.js +195 -0
  13. package/action-menu/types.d.ts +13 -0
  14. package/action-menu/types.js +1 -0
  15. package/action-menu-option/index.d.ts +12 -0
  16. package/action-menu-option/index.js +82 -0
  17. package/action-menu-option/types.d.ts +23 -0
  18. package/action-menu-option/types.js +1 -0
  19. package/action-menu-option/utils.d.ts +2 -0
  20. package/action-menu-option/utils.js +3 -0
  21. package/alert/index.d.ts +14 -0
  22. package/alert/index.js +48 -0
  23. package/alert/types.d.ts +18 -0
  24. package/alert/types.js +1 -0
  25. package/alert/utils.d.ts +2 -0
  26. package/alert/utils.js +1 -0
  27. package/avatar/index.d.ts +11 -0
  28. package/avatar/index.js +94 -0
  29. package/avatar/types.d.ts +37 -0
  30. package/avatar/types.js +1 -0
  31. package/avatar/utils.d.ts +4 -0
  32. package/avatar/utils.js +7 -0
  33. package/badge/index.d.ts +11 -0
  34. package/badge/index.js +114 -0
  35. package/badge/types.d.ts +34 -0
  36. package/badge/types.js +1 -0
  37. package/badge/utils.d.ts +2 -0
  38. package/badge/utils.js +1 -0
  39. package/button/index.d.ts +11 -0
  40. package/button/index.js +168 -0
  41. package/button/types.d.ts +45 -0
  42. package/button/types.js +1 -0
  43. package/button/utils.d.ts +2 -0
  44. package/button/utils.js +1 -0
  45. package/card/index.d.ts +13 -0
  46. package/card/index.js +133 -0
  47. package/card/types.d.ts +28 -0
  48. package/card/types.js +1 -0
  49. package/card-container/index.d.ts +11 -0
  50. package/card-container/index.js +11 -0
  51. package/card-container/types.d.ts +3 -0
  52. package/card-container/types.js +1 -0
  53. package/chat/index.d.ts +11 -0
  54. package/chat/index.js +11 -0
  55. package/chat/types.d.ts +3 -0
  56. package/chat/types.js +1 -0
  57. package/chat-block/index.d.ts +11 -0
  58. package/chat-block/index.js +86 -0
  59. package/chat-block/types.d.ts +30 -0
  60. package/chat-block/types.js +1 -0
  61. package/chat-bubble/index.d.ts +11 -0
  62. package/chat-bubble/index.js +41 -0
  63. package/chat-bubble/types.d.ts +20 -0
  64. package/chat-bubble/types.js +1 -0
  65. package/chat-bubble/utils.d.ts +3 -0
  66. package/chat-bubble/utils.js +2 -0
  67. package/checkbox/index.d.ts +11 -0
  68. package/checkbox/index.js +126 -0
  69. package/checkbox/types.d.ts +49 -0
  70. package/checkbox/types.js +1 -0
  71. package/chip/index.d.ts +13 -0
  72. package/chip/index.js +144 -0
  73. package/chip/types.d.ts +37 -0
  74. package/chip/types.js +1 -0
  75. package/chip/utils.d.ts +2 -0
  76. package/chip/utils.js +6 -0
  77. package/code-tag/index.d.ts +11 -0
  78. package/code-tag/index.js +31 -0
  79. package/code-tag/types.d.ts +11 -0
  80. package/code-tag/types.js +1 -0
  81. package/color-menu/index.d.ts +11 -0
  82. package/color-menu/index.js +308 -0
  83. package/color-menu/types.d.ts +32 -0
  84. package/color-menu/types.js +1 -0
  85. package/color-menu/utils.d.ts +1 -0
  86. package/color-menu/utils.js +11 -0
  87. package/color-menu-option/index.d.ts +13 -0
  88. package/color-menu-option/index.js +48 -0
  89. package/color-menu-option/types.d.ts +11 -0
  90. package/color-menu-option/types.js +1 -0
  91. package/color-menu-option/utils.d.ts +1 -0
  92. package/color-menu-option/utils.js +11 -0
  93. package/color-swatch/index.d.ts +12 -0
  94. package/color-swatch/index.js +54 -0
  95. package/color-swatch/types.d.ts +11 -0
  96. package/color-swatch/types.js +1 -0
  97. package/color-swatch/utils.d.ts +2 -0
  98. package/color-swatch/utils.js +6 -0
  99. package/colors.json +88 -0
  100. package/date-picker/index.d.ts +14 -0
  101. package/date-picker/index.js +381 -0
  102. package/date-picker/types.d.ts +70 -0
  103. package/date-picker/types.js +1 -0
  104. package/date-picker/utils.d.ts +28 -0
  105. package/date-picker/utils.js +142 -0
  106. package/dialog/index.d.ts +15 -0
  107. package/dialog/index.js +144 -0
  108. package/dialog/types.d.ts +28 -0
  109. package/dialog/types.js +1 -0
  110. package/dialog/utils.d.ts +2 -0
  111. package/dialog/utils.js +18 -0
  112. package/emoji/index.d.ts +11 -0
  113. package/emoji/index.js +46 -0
  114. package/emoji/types.d.ts +11 -0
  115. package/emoji/types.js +1 -0
  116. package/emoji/utils.d.ts +1 -0
  117. package/emoji/utils.js +42 -0
  118. package/emoji-picker/data.json +1 -0
  119. package/emoji-picker/index.d.ts +22 -0
  120. package/emoji-picker/index.js +304 -0
  121. package/emoji-picker/types.d.ts +26 -0
  122. package/emoji-picker/types.js +1 -0
  123. package/field/index.d.ts +11 -0
  124. package/field/index.js +112 -0
  125. package/field/types.d.ts +35 -0
  126. package/field/types.js +1 -0
  127. package/file-drop/index.d.ts +13 -0
  128. package/file-drop/index.js +205 -0
  129. package/file-drop/types.d.ts +50 -0
  130. package/file-drop/types.js +1 -0
  131. package/file-drop/utils.d.ts +2 -0
  132. package/file-drop/utils.js +31 -0
  133. package/file-picker/index.d.ts +11 -0
  134. package/file-picker/index.js +103 -0
  135. package/file-picker/types.d.ts +32 -0
  136. package/file-picker/types.js +1 -0
  137. package/file-picker/utils.d.ts +1 -0
  138. package/file-picker/utils.js +8 -0
  139. package/file-status/index.d.ts +14 -0
  140. package/file-status/index.js +61 -0
  141. package/file-status/types.d.ts +18 -0
  142. package/file-status/types.js +1 -0
  143. package/file-status/utils.d.ts +2 -0
  144. package/file-status/utils.js +1 -0
  145. package/flag/index.d.ts +11 -0
  146. package/flag/index.js +46 -0
  147. package/flag/types.d.ts +11 -0
  148. package/flag/types.js +1 -0
  149. package/flag/utils.d.ts +1 -0
  150. package/flag/utils.js +17 -0
  151. package/grid/index.d.ts +11 -0
  152. package/grid/index.js +11 -0
  153. package/grid/types.d.ts +3 -0
  154. package/grid/types.js +1 -0
  155. package/grid-item/index.d.ts +11 -0
  156. package/grid-item/index.js +35 -0
  157. package/grid-item/types.d.ts +17 -0
  158. package/grid-item/types.js +1 -0
  159. package/help-tooltip/index.d.ts +13 -0
  160. package/help-tooltip/index.js +74 -0
  161. package/help-tooltip/types.d.ts +3 -0
  162. package/help-tooltip/types.js +1 -0
  163. package/horizontal-stepper/index.d.ts +11 -0
  164. package/horizontal-stepper/index.js +61 -0
  165. package/horizontal-stepper/types.d.ts +13 -0
  166. package/horizontal-stepper/types.js +1 -0
  167. package/horizontal-stepper-item/index.d.ts +14 -0
  168. package/horizontal-stepper-item/index.js +61 -0
  169. package/horizontal-stepper-item/types.d.ts +24 -0
  170. package/horizontal-stepper-item/types.js +1 -0
  171. package/horizontal-stepper-item/utils.d.ts +2 -0
  172. package/horizontal-stepper-item/utils.js +1 -0
  173. package/icon/index.d.ts +11 -0
  174. package/icon/index.js +32 -0
  175. package/icon/types.d.ts +11 -0
  176. package/icon/types.js +1 -0
  177. package/icon-button/index.d.ts +12 -0
  178. package/icon-button/index.js +173 -0
  179. package/icon-button/types.d.ts +44 -0
  180. package/icon-button/types.js +1 -0
  181. package/icon-button/utils.d.ts +2 -0
  182. package/icon-button/utils.js +1 -0
  183. package/inline-alert/index.d.ts +15 -0
  184. package/inline-alert/index.js +83 -0
  185. package/inline-alert/types.d.ts +15 -0
  186. package/inline-alert/types.js +1 -0
  187. package/inline-alert/utils.d.ts +2 -0
  188. package/inline-alert/utils.js +1 -0
  189. package/input/index.d.ts +11 -0
  190. package/input/index.js +620 -0
  191. package/input/types.d.ts +80 -0
  192. package/input/types.js +1 -0
  193. package/input/utils.d.ts +26 -0
  194. package/input/utils.js +302 -0
  195. package/link/index.d.ts +12 -0
  196. package/link/index.js +132 -0
  197. package/link/types.d.ts +55 -0
  198. package/link/types.js +1 -0
  199. package/list/index.d.ts +11 -0
  200. package/list/index.js +14 -0
  201. package/list/types.d.ts +3 -0
  202. package/list/types.js +1 -0
  203. package/list-item/index.d.ts +11 -0
  204. package/list-item/index.js +14 -0
  205. package/list-item/types.d.ts +3 -0
  206. package/list-item/types.js +1 -0
  207. package/package.json +30 -0
  208. package/pagination/index.d.ts +12 -0
  209. package/pagination/index.js +147 -0
  210. package/pagination/types.d.ts +16 -0
  211. package/pagination/types.js +1 -0
  212. package/pop/index.d.ts +11 -0
  213. package/pop/index.js +425 -0
  214. package/pop/types.d.ts +35 -0
  215. package/pop/types.js +1 -0
  216. package/pop/utils.d.ts +4 -0
  217. package/pop/utils.js +16 -0
  218. package/popover/index.d.ts +12 -0
  219. package/popover/index.js +140 -0
  220. package/popover/types.d.ts +40 -0
  221. package/popover/types.js +1 -0
  222. package/popover/utils.d.ts +4 -0
  223. package/popover/utils.js +10 -0
  224. package/progress/index.d.ts +12 -0
  225. package/progress/index.js +58 -0
  226. package/progress/types.d.ts +12 -0
  227. package/progress/types.js +1 -0
  228. package/progress-stepper/index.d.ts +11 -0
  229. package/progress-stepper/index.js +206 -0
  230. package/progress-stepper/types.d.ts +22 -0
  231. package/progress-stepper/types.js +1 -0
  232. package/progress-stepper-item/index.d.ts +12 -0
  233. package/progress-stepper-item/index.js +82 -0
  234. package/progress-stepper-item/types.d.ts +23 -0
  235. package/progress-stepper-item/types.js +1 -0
  236. package/progress-stepper-item/utils.d.ts +11 -0
  237. package/progress-stepper-item/utils.js +13 -0
  238. package/radio/index.d.ts +11 -0
  239. package/radio/index.js +154 -0
  240. package/radio/types.d.ts +14 -0
  241. package/radio/types.js +1 -0
  242. package/radio-option/index.d.ts +11 -0
  243. package/radio-option/index.js +79 -0
  244. package/radio-option/types.d.ts +17 -0
  245. package/radio-option/types.js +1 -0
  246. package/readme.md +179 -0
  247. package/rich-text/index.d.ts +11 -0
  248. package/rich-text/index.js +48 -0
  249. package/rich-text/types.d.ts +12 -0
  250. package/rich-text/types.js +1 -0
  251. package/rich-text/utils.d.ts +2 -0
  252. package/rich-text/utils.js +1 -0
  253. package/segment/index.d.ts +12 -0
  254. package/segment/index.js +109 -0
  255. package/segment/types.d.ts +16 -0
  256. package/segment/types.js +1 -0
  257. package/segment/utils.d.ts +3 -0
  258. package/segment/utils.js +16 -0
  259. package/segment-collapse/index.d.ts +13 -0
  260. package/segment-collapse/index.js +60 -0
  261. package/segment-collapse/types.d.ts +11 -0
  262. package/segment-collapse/types.js +1 -0
  263. package/segmented-control/index.d.ts +11 -0
  264. package/segmented-control/index.js +85 -0
  265. package/segmented-control/types.d.ts +11 -0
  266. package/segmented-control/types.js +1 -0
  267. package/segmented-control-option/index.d.ts +11 -0
  268. package/segmented-control-option/index.js +95 -0
  269. package/segmented-control-option/types.d.ts +19 -0
  270. package/segmented-control-option/types.js +1 -0
  271. package/segmented-icon-control/index.d.ts +11 -0
  272. package/segmented-icon-control/index.js +101 -0
  273. package/segmented-icon-control/types.d.ts +14 -0
  274. package/segmented-icon-control/types.js +1 -0
  275. package/segmented-icon-control-option/index.d.ts +11 -0
  276. package/segmented-icon-control-option/index.js +82 -0
  277. package/segmented-icon-control-option/types.d.ts +16 -0
  278. package/segmented-icon-control-option/types.js +1 -0
  279. package/select-button/index.d.ts +13 -0
  280. package/select-button/index.js +200 -0
  281. package/select-button/types.d.ts +50 -0
  282. package/select-button/types.js +1 -0
  283. package/select-menu/index.d.ts +15 -0
  284. package/select-menu/index.js +307 -0
  285. package/select-menu/types.d.ts +29 -0
  286. package/select-menu/types.js +1 -0
  287. package/select-menu-option/index.d.ts +28 -0
  288. package/select-menu-option/index.js +65 -0
  289. package/select-menu-option/types.d.ts +26 -0
  290. package/select-menu-option/types.js +1 -0
  291. package/skeleton/index.d.ts +11 -0
  292. package/skeleton/index.js +108 -0
  293. package/skeleton/types.d.ts +9 -0
  294. package/skeleton/types.js +1 -0
  295. package/skeleton-item/index.d.ts +11 -0
  296. package/skeleton-item/index.js +11 -0
  297. package/skeleton-item/types.d.ts +13 -0
  298. package/skeleton-item/types.js +1 -0
  299. package/spinner/index.d.ts +11 -0
  300. package/spinner/index.js +58 -0
  301. package/spinner/types.d.ts +12 -0
  302. package/spinner/types.js +1 -0
  303. package/stop-events/index.d.ts +1 -0
  304. package/stop-events/index.js +27 -0
  305. package/table/index.d.ts +11 -0
  306. package/table/index.js +14 -0
  307. package/table/types.d.ts +3 -0
  308. package/table/types.js +1 -0
  309. package/table-body/index.d.ts +11 -0
  310. package/table-body/index.js +14 -0
  311. package/table-body/types.d.ts +3 -0
  312. package/table-body/types.js +1 -0
  313. package/table-cell/index.d.ts +11 -0
  314. package/table-cell/index.js +21 -0
  315. package/table-cell/types.d.ts +9 -0
  316. package/table-cell/types.js +1 -0
  317. package/table-cell/utils.d.ts +2 -0
  318. package/table-cell/utils.js +1 -0
  319. package/table-head/index.d.ts +11 -0
  320. package/table-head/index.js +14 -0
  321. package/table-head/types.d.ts +3 -0
  322. package/table-head/types.js +1 -0
  323. package/table-head-cell/index.d.ts +12 -0
  324. package/table-head-cell/index.js +57 -0
  325. package/table-head-cell/types.d.ts +15 -0
  326. package/table-head-cell/types.js +1 -0
  327. package/table-row/index.d.ts +11 -0
  328. package/table-row/index.js +42 -0
  329. package/table-row/types.d.ts +11 -0
  330. package/table-row/types.js +1 -0
  331. package/tabs/index.d.ts +11 -0
  332. package/tabs/index.js +80 -0
  333. package/tabs/types.d.ts +18 -0
  334. package/tabs/types.js +1 -0
  335. package/tabs-icon-option/index.d.ts +11 -0
  336. package/tabs-icon-option/index.js +79 -0
  337. package/tabs-icon-option/types.d.ts +19 -0
  338. package/tabs-icon-option/types.js +1 -0
  339. package/tabs-option/index.d.ts +12 -0
  340. package/tabs-option/index.js +86 -0
  341. package/tabs-option/types.d.ts +25 -0
  342. package/tabs-option/types.js +1 -0
  343. package/tag/index.d.ts +12 -0
  344. package/tag/index.js +84 -0
  345. package/tag/types.d.ts +23 -0
  346. package/tag/types.js +1 -0
  347. package/tag/utils.d.ts +2 -0
  348. package/tag/utils.js +6 -0
  349. package/text/index.d.ts +11 -0
  350. package/text/index.js +64 -0
  351. package/text/types.d.ts +30 -0
  352. package/text/types.js +1 -0
  353. package/text/utils.d.ts +2 -0
  354. package/text/utils.js +1 -0
  355. package/textarea/index.d.ts +11 -0
  356. package/textarea/index.js +228 -0
  357. package/textarea/types.d.ts +57 -0
  358. package/textarea/types.js +1 -0
  359. package/tile-control/index.d.ts +11 -0
  360. package/tile-control/index.js +110 -0
  361. package/tile-control/types.d.ts +35 -0
  362. package/tile-control/types.js +1 -0
  363. package/tile-control-option/index.d.ts +11 -0
  364. package/tile-control-option/index.js +98 -0
  365. package/tile-control-option/types.d.ts +37 -0
  366. package/tile-control-option/types.js +1 -0
  367. package/time-picker/index.d.ts +15 -0
  368. package/time-picker/index.js +337 -0
  369. package/time-picker/types.d.ts +34 -0
  370. package/time-picker/types.js +1 -0
  371. package/time-picker/utils.d.ts +11 -0
  372. package/time-picker/utils.js +75 -0
  373. package/title/index.d.ts +11 -0
  374. package/title/index.js +60 -0
  375. package/title/types.d.ts +31 -0
  376. package/title/types.js +1 -0
  377. package/title/utils.d.ts +3 -0
  378. package/title/utils.js +17 -0
  379. package/toast/index.d.ts +14 -0
  380. package/toast/index.js +87 -0
  381. package/toast/types.d.ts +28 -0
  382. package/toast/types.js +1 -0
  383. package/toast/utils.d.ts +2 -0
  384. package/toast/utils.js +1 -0
  385. package/toast-manager/index.d.ts +13 -0
  386. package/toast-manager/index.js +163 -0
  387. package/toast-manager/types.d.ts +7 -0
  388. package/toast-manager/types.js +1 -0
  389. package/toggle/index.d.ts +11 -0
  390. package/toggle/index.js +126 -0
  391. package/toggle/types.d.ts +23 -0
  392. package/toggle/types.js +1 -0
  393. package/tooltip/index.d.ts +13 -0
  394. package/tooltip/index.js +258 -0
  395. package/tooltip/tooltip-state.d.ts +19 -0
  396. package/tooltip/tooltip-state.js +126 -0
  397. package/tooltip/types.d.ts +35 -0
  398. package/tooltip/types.js +1 -0
  399. package/tooltip/utils.d.ts +5 -0
  400. package/tooltip/utils.js +17 -0
  401. package/types.d.ts +14 -0
  402. package/utils/context.d.ts +20 -0
  403. package/utils/context.js +84 -0
  404. package/utils/countries.d.ts +6 -0
  405. package/utils/countries.js +2 -0
  406. package/utils/countries.json +1217 -0
  407. package/utils/csv.d.ts +5 -0
  408. package/utils/csv.js +22 -0
  409. package/utils/debounce.d.ts +8 -0
  410. package/utils/debounce.js +22 -0
  411. package/utils/dom.d.ts +34 -0
  412. package/utils/dom.js +154 -0
  413. package/utils/element.d.ts +16 -0
  414. package/utils/element.js +48 -0
  415. package/utils/event-target.d.ts +4 -0
  416. package/utils/event-target.js +26 -0
  417. package/utils/get-react-event-handler.d.ts +1 -0
  418. package/utils/get-react-event-handler.js +8 -0
  419. package/utils/index.d.ts +12 -0
  420. package/utils/index.js +12 -0
  421. package/utils/markdown.d.ts +1 -0
  422. package/utils/markdown.js +128 -0
  423. package/utils/rect.d.ts +4 -0
  424. package/utils/rect.js +28 -0
  425. package/utils/size.d.ts +5 -0
  426. package/utils/size.js +3 -0
  427. package/utils/slot.d.ts +4 -0
  428. package/utils/slot.js +38 -0
  429. package/utils/throttle.d.ts +4 -0
  430. package/utils/throttle.js +20 -0
  431. package/utils/uid.d.ts +1 -0
  432. package/utils/uid.js +13 -0
  433. package/vertical-stepper/index.d.ts +11 -0
  434. package/vertical-stepper/index.js +57 -0
  435. package/vertical-stepper/types.d.ts +13 -0
  436. package/vertical-stepper/types.js +1 -0
  437. package/vertical-stepper-item/index.d.ts +14 -0
  438. package/vertical-stepper-item/index.js +61 -0
  439. package/vertical-stepper-item/types.d.ts +24 -0
  440. package/vertical-stepper-item/types.js +1 -0
  441. package/vertical-stepper-item/utils.d.ts +2 -0
  442. package/vertical-stepper-item/utils.js +1 -0
@@ -0,0 +1,381 @@
1
+ import '../icon-button';
2
+ import '../icon';
3
+ import '../text';
4
+ import { defineCustomElement, getAttribute, getBooleanAttribute, getReactEventHandler, getRect, getTargetAttribute, isAttrTrue, NectaryElement, packCsv, setClass, unpackCsv, updateAttribute, updateBooleanAttribute } from '../utils';
5
+ const templateHTML = '<style>:host{display:block;outline:0}#content{width:fit-content;box-sizing:border-box;padding:16px;display:flex;flex-direction:column;gap:8px}#month{display:flex;flex-direction:column;row-gap:8px}.week{display:flex;flex-direction:row;column-gap:8px}.week.empty{display:none}.day{all:initial;font:var(--sinch-comp-date-picker-font-day);width:24px;height:24px;line-height:22px;color:var(--sinch-comp-date-picker-day-color-default-text-initial);background-color:var(--sinch-comp-date-picker-day-color-default-background-initial);border:1px solid var(--sinch-comp-date-picker-day-color-default-border-initial);border-radius:var(--sinch-comp-date-picker-day-shape-radius);text-align:center;box-sizing:border-box;user-select:none;cursor:pointer}.day:focus-visible{outline:1px solid var(--sinch-comp-date-picker-day-color-default-outline-focus);outline-offset:1px}.day:disabled{cursor:initial;color:var(--sinch-comp-date-picker-day-color-disabled-text-initial)}.day:enabled:hover{background-color:var(--sinch-comp-date-picker-day-color-default-background-hover)}.day:enabled.range{background-color:var(--sinch-comp-date-picker-day-color-default-range-background)}.day:enabled.selected{color:var(--sinch-comp-date-picker-day-color-checked-text-initial);background-color:var(--sinch-comp-date-picker-day-color-checked-background-initial);border-color:var(--sinch-comp-date-picker-day-color-checked-border-initial)}.day.today{font:var(--sinch-comp-date-picker-font-today);color:var(--sinch-comp-date-picker-today-color-default-text-initial);background-color:var(--sinch-comp-date-picker-today-color-default-background-initial);border-color:var(--sinch-comp-date-picker-today-color-default-border-initial)}.day.today:hover{background-color:var(--sinch-comp-date-picker-today-color-default-background-hover)}.day.today:disabled{color:var(--sinch-comp-date-picker-today-color-disabled-text-initial);border-color:var(--sinch-comp-date-picker-today-color-disabled-border-initial)}.day.today.selected{color:var(--sinch-comp-date-picker-today-color-checked-text-initial);background-color:var(--sinch-comp-date-picker-today-color-checked-background-initial);border-color:var(--sinch-comp-date-picker-today-color-checked-border-initial)}#week-day-names{display:flex;flex-direction:row;gap:8px;height:24px}.week-day-name{font:var(--sinch-comp-date-picker-font-weekday);color:var(--sinch-comp-date-picker-weekday-color-default-text-initial);text-align:center;width:24px;height:24px;line-height:24px;user-select:none;text-transform:uppercase}#content-header{display:flex;flex-direction:row;height:32px;align-items:center}#date{flex:1;text-align:center;text-transform:capitalize;--sinch-com-text-font:var(--sinch-comp-date-picker-font-header);--sinch-global-color-text:var(--sinch-comp-date-picker-header-color-default-text-initial)}#prev-year{margin-left:-4px}#next-year{margin-right:-4px}</style><div id="content"><div id="content-header"><sinch-icon-button id="prev-year" size="s"><sinch-icon id="icon-prev-year" slot="icon" name="keyboard_double_arrow_left"></sinch-icon></sinch-icon-button><sinch-icon-button id="prev-month" size="s"><sinch-icon id="icon-prev-month" slot="icon" name="keyboard_arrow_left"></sinch-icon></sinch-icon-button><sinch-text id="date" type="m" emphasized aria-live="polite"></sinch-text><sinch-icon-button id="next-month" size="s"><sinch-icon id="icon-next-month" slot="icon" name="keyboard_arrow_right"></sinch-icon></sinch-icon-button><sinch-icon-button id="next-year" size="s"><sinch-icon id="icon-next-year" slot="icon" name="keyboard_double_arrow_right"></sinch-icon></sinch-icon-button></div><div id="week-day-names"><div class="week-day-name"></div><div class="week-day-name"></div><div class="week-day-name"></div><div class="week-day-name"></div><div class="week-day-name"></div><div class="week-day-name"></div><div class="week-day-name"></div></div><div id="month"><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div><div class="week"><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button><button class="day"></button></div></div></div>';
6
+ import { areDatesEqual, canGoNextMonth, canGoNextYear, canGoPrevMonth, canGoPrevYear, clampMaxDate, clampMinDate, cloneDate, dateToIso, decMonth, decYear, getCalendarMonth, getDayNames, getMonthNames, incMonth, incYear, isDateBetween, isDateOnScreen, isoToDate, isValidDate, sortDates, today } from './utils';
7
+ const template = document.createElement('template');
8
+ template.innerHTML = templateHTML;
9
+ defineCustomElement('sinch-date-picker', class extends NectaryElement {
10
+ #$month;
11
+ #$weeks;
12
+ #$days;
13
+ #$weekDayNames;
14
+ #uiDate = null;
15
+ #date1 = null;
16
+ #date2 = null;
17
+ #minDate = null;
18
+ #maxDate = null;
19
+ #$prevMonth;
20
+ #$nextMonth;
21
+ #$prevYear;
22
+ #$nextYear;
23
+ #$date;
24
+ #monthNames;
25
+ #controller = null;
26
+ #isHoverSubscribed = false;
27
+ constructor() {
28
+ super();
29
+ const shadowRoot = this.attachShadow();
30
+ shadowRoot.appendChild(template.content.cloneNode(true));
31
+ this.#$prevMonth = shadowRoot.querySelector('#prev-month');
32
+ this.#$nextMonth = shadowRoot.querySelector('#next-month');
33
+ this.#$prevYear = shadowRoot.querySelector('#prev-year');
34
+ this.#$nextYear = shadowRoot.querySelector('#next-year');
35
+ this.#$date = shadowRoot.querySelector('#date');
36
+ this.#$month = shadowRoot.querySelector('#month');
37
+ this.#$days = [];
38
+ this.#$weeks = [];
39
+ this.#monthNames = [];
40
+ shadowRoot.querySelectorAll('.week').forEach((week, i) => {
41
+ this.#$weeks.push(week);
42
+ this.#$days[i] = [];
43
+ week.querySelectorAll('.day').forEach(day => {
44
+ this.#$days[i].push(day);
45
+ });
46
+ });
47
+ this.#$weekDayNames = Array.from(shadowRoot.querySelectorAll('#week-day-names > .week-day-name'));
48
+ }
49
+ connectedCallback() {
50
+ this.#controller = new AbortController();
51
+ const options = {
52
+ signal: this.#controller.signal
53
+ };
54
+ this.#$prevMonth.addEventListener('click', this.#onPrevMonthClick, options);
55
+ this.#$nextMonth.addEventListener('click', this.#onNextMonthClick, options);
56
+ this.#$prevYear.addEventListener('click', this.#onPrevYearClick, options);
57
+ this.#$nextYear.addEventListener('click', this.#onNextYearClick, options);
58
+ this.#$month.addEventListener('click', this.#onDateClick, options);
59
+ this.addEventListener('-change', this.#onChangeReactHandler, options);
60
+ }
61
+ disconnectedCallback() {
62
+ this.#unsubscribeRangeHover();
63
+ this.#controller.abort();
64
+ this.#controller = null;
65
+ }
66
+ static get observedAttributes() {
67
+ return ['value', 'min', 'max', 'locale', 'range', 'prev-year-aria-label', 'next-year-aria-label', 'prev-month-aria-label', 'next-month-aria-label'];
68
+ }
69
+ attributeChangedCallback(name, prevValue, newVal) {
70
+ switch (name) {
71
+ case 'value':
72
+ {
73
+ this.#onValueChange();
74
+ break;
75
+ }
76
+ case 'min':
77
+ {
78
+ this.#minDate = isoToDate(newVal);
79
+ if (this.#uiDate !== null) {
80
+ clampMinDate(this.#uiDate, this.#minDate);
81
+ }
82
+ this.#render();
83
+ break;
84
+ }
85
+ case 'max':
86
+ {
87
+ this.#maxDate = isoToDate(newVal);
88
+ if (this.#uiDate !== null) {
89
+ clampMaxDate(this.#uiDate, this.#maxDate);
90
+ }
91
+ this.#render();
92
+ break;
93
+ }
94
+ case 'locale':
95
+ {
96
+ const names = getDayNames(newVal);
97
+ this.#$weekDayNames.forEach(($day, i) => {
98
+ $day.textContent = names[i];
99
+ });
100
+ this.#monthNames = getMonthNames(newVal);
101
+ this.#render();
102
+ break;
103
+ }
104
+ case 'range':
105
+ {
106
+ const isRange = isAttrTrue(newVal);
107
+ if (isRange) {
108
+ this.#onValueChange();
109
+ } else {
110
+ this.#unsubscribeRangeHover();
111
+ }
112
+ break;
113
+ }
114
+ case 'prev-year-aria-label':
115
+ {
116
+ updateAttribute(this.#$prevYear, 'aria-label', newVal);
117
+ break;
118
+ }
119
+ case 'next-year-aria-label':
120
+ {
121
+ updateAttribute(this.#$nextYear, 'aria-label', newVal);
122
+ break;
123
+ }
124
+ case 'prev-month-aria-label':
125
+ {
126
+ updateAttribute(this.#$prevMonth, 'aria-label', newVal);
127
+ break;
128
+ }
129
+ case 'next-month-aria-label':
130
+ {
131
+ updateAttribute(this.#$nextMonth, 'aria-label', newVal);
132
+ break;
133
+ }
134
+ }
135
+ }
136
+ set locale(value) {
137
+ updateAttribute(this, 'locale', value);
138
+ }
139
+ get locale() {
140
+ return getAttribute(this, 'locale', '');
141
+ }
142
+ set value(value) {
143
+ updateAttribute(this, 'value', value);
144
+ }
145
+ get value() {
146
+ return getAttribute(this, 'value', '');
147
+ }
148
+ set min(value) {
149
+ updateAttribute(this, 'min', value);
150
+ }
151
+ get min() {
152
+ return getAttribute(this, 'min', '');
153
+ }
154
+ set max(value) {
155
+ updateAttribute(this, 'max', value);
156
+ }
157
+ get max() {
158
+ return getAttribute(this, 'max', '');
159
+ }
160
+ set range(isRanged) {
161
+ updateBooleanAttribute(this, 'range', isRanged);
162
+ }
163
+ get range() {
164
+ return getBooleanAttribute(this, 'range');
165
+ }
166
+ set prevMonthAriaLabel(value) {
167
+ updateAttribute(this, 'prev-month-aria-label', value);
168
+ }
169
+ get prevMonthAriaLabel() {
170
+ return getAttribute(this, 'prev-month-aria-label', '');
171
+ }
172
+ set nextMonthAriaLabel(value) {
173
+ updateAttribute(this, 'next-month-aria-label', value);
174
+ }
175
+ get nextMonthAriaLabel() {
176
+ return getAttribute(this, 'next-month-aria-label', '');
177
+ }
178
+ get prevYearButtonRect() {
179
+ return getRect(this.#$prevYear);
180
+ }
181
+ get nextYearButtonRect() {
182
+ return getRect(this.#$nextYear);
183
+ }
184
+ get prevMonthButtonRect() {
185
+ return getRect(this.#$prevMonth);
186
+ }
187
+ get nextMonthButtonRect() {
188
+ return getRect(this.#$nextMonth);
189
+ }
190
+ nthButtonRect(index) {
191
+ if (index < 0 || index > 30) {
192
+ return null;
193
+ }
194
+ const indexOffset = this.#$days[0].findIndex(el => el.getAttribute('data-date') !== null);
195
+ if (indexOffset < 0) {
196
+ return null;
197
+ }
198
+ const rowIndex = Math.floor((indexOffset + index) / 7);
199
+ const colIndex = (indexOffset + index) % 7;
200
+ const $el = this.#$days[rowIndex]?.[colIndex];
201
+ if ($el == null) {
202
+ return null;
203
+ }
204
+ return getRect($el);
205
+ }
206
+ #onPrevMonthClick = e => {
207
+ e.stopPropagation();
208
+ decMonth(this.#uiDate, this.#minDate);
209
+ this.#render();
210
+ };
211
+ #onNextMonthClick = e => {
212
+ e.stopPropagation();
213
+ incMonth(this.#uiDate, this.#maxDate);
214
+ this.#render();
215
+ };
216
+ #onPrevYearClick = e => {
217
+ e.stopPropagation();
218
+ decYear(this.#uiDate, this.#minDate);
219
+ this.#render();
220
+ };
221
+ #onNextYearClick = e => {
222
+ e.stopPropagation();
223
+ incYear(this.#uiDate, this.#maxDate);
224
+ this.#render();
225
+ };
226
+ #onDateMouseEnter = e => {
227
+ if (this.#date1 !== null && this.#date2 === null) {
228
+ const hoverDateIso = getTargetAttribute(e, 'data-date');
229
+ if (hoverDateIso === null) {
230
+ return;
231
+ }
232
+ const hoverDate = isoToDate(hoverDateIso);
233
+ const todayDate = today();
234
+ for (const week of this.#$days) {
235
+ for (const $day of week) {
236
+ if ($day.hasAttribute('disabled')) {
237
+ continue;
238
+ }
239
+ const dayDate = isoToDate($day.getAttribute('data-date'));
240
+ setClass($day, 'range', !areDatesEqual(todayDate, dayDate) && (isDateBetween(dayDate, this.#date1, hoverDate) || isDateBetween(dayDate, hoverDate, this.#date1)));
241
+ }
242
+ }
243
+ }
244
+ };
245
+ #onDateClick = e => {
246
+ e.stopPropagation();
247
+ const dateIso = getTargetAttribute(e, 'data-date');
248
+ if (dateIso === null || dateIso.length === 0) {
249
+ return;
250
+ }
251
+ if (this.range) {
252
+ if (this.#date1 !== null && this.#date2 === null) {
253
+ const date2 = isoToDate(dateIso);
254
+ const dateTuple = sortDates([this.#date1, date2]);
255
+ const value = packCsv(dateTuple.map(dateToIso));
256
+ this.#date1 = dateTuple[0];
257
+ this.#date2 = dateTuple[1];
258
+ this.#unsubscribeRangeHover();
259
+ this.#render();
260
+ this.dispatchEvent(new CustomEvent('-change', {
261
+ detail: value
262
+ }));
263
+ return;
264
+ }
265
+ this.#date1 = isoToDate(dateIso);
266
+ this.#date2 = null;
267
+ this.#subscribeRangeHover();
268
+ this.#render();
269
+ return;
270
+ }
271
+ this.dispatchEvent(new CustomEvent('-change', {
272
+ detail: dateIso
273
+ }));
274
+ };
275
+ #onValueChange() {
276
+ const value = this.value;
277
+ this.#date1 = null;
278
+ this.#date2 = null;
279
+ if (this.range) {
280
+ const isoDates = unpackCsv(value);
281
+ if (isoDates.length === 2) {
282
+ const date1 = isoToDate(isoDates[0]);
283
+ const date2 = isoToDate(isoDates[1]);
284
+ if (isValidDate(date1) && isValidDate(date2)) {
285
+ [this.#date1, this.#date2] = sortDates([date1, date2]);
286
+ if (this.#uiDate === null || !isDateOnScreen(this.#uiDate, date1) && !isDateOnScreen(this.#uiDate, date2)) {
287
+ this.#uiDate = cloneDate(this.#date1);
288
+ }
289
+ } else {
290
+ this.#uiDate = null;
291
+ }
292
+ } else if (isoDates.length === 1) {
293
+ const date1 = isoToDate(isoDates[0]);
294
+ if (isValidDate(date1)) {
295
+ this.#uiDate = date1;
296
+ }
297
+ }
298
+ } else {
299
+ const valueDate = isoToDate(value);
300
+ if (isValidDate(valueDate)) {
301
+ this.#date1 = valueDate;
302
+ this.#uiDate = cloneDate(this.#date1);
303
+ } else {
304
+ this.#uiDate = null;
305
+ }
306
+ }
307
+ if (this.#uiDate === null) {
308
+ this.#uiDate = today();
309
+ }
310
+ if (this.#minDate !== null) {
311
+ clampMinDate(this.#uiDate, this.#minDate);
312
+ }
313
+ if (this.#maxDate !== null) {
314
+ clampMaxDate(this.#uiDate, this.#maxDate);
315
+ }
316
+ this.#render();
317
+ }
318
+ #render() {
319
+ if (this.#uiDate === null || this.#minDate === null || this.#maxDate === null || this.locale === null) {
320
+ return;
321
+ }
322
+ const todayDate = today();
323
+ const month = getCalendarMonth(this.#uiDate);
324
+ updateBooleanAttribute(this.#$prevMonth, 'disabled', canGoPrevMonth(this.#uiDate, this.#minDate) === false);
325
+ updateBooleanAttribute(this.#$nextMonth, 'disabled', canGoNextMonth(this.#uiDate, this.#maxDate) === false);
326
+ updateBooleanAttribute(this.#$prevYear, 'disabled', canGoPrevYear(this.#uiDate, this.#minDate) === false);
327
+ updateBooleanAttribute(this.#$nextYear, 'disabled', canGoNextYear(this.#uiDate, this.#maxDate) === false);
328
+ this.#$date.textContent = `${this.#monthNames[this.#uiDate.getUTCMonth()]} ${this.#uiDate.getUTCFullYear()}`;
329
+ for (let wi = 0; wi < this.#$days.length; wi++) {
330
+ const $week = this.#$days[wi];
331
+ let isEmptyWeek = true;
332
+ for (let di = 0; di < $week.length; di++) {
333
+ const $day = $week[di];
334
+ const week = month[wi];
335
+ const day = week?.[di];
336
+ $day.classList.remove('selected', 'range', 'today');
337
+ if (day == null) {
338
+ $day.textContent = '';
339
+ $day.removeAttribute('data-date');
340
+ $day.setAttribute('disabled', '');
341
+ $day.setAttribute('aria-hidden', 'true');
342
+ } else {
343
+ const dayIso = dateToIso(day);
344
+ $day.textContent = day.getUTCDate().toString();
345
+ $day.setAttribute('data-date', dayIso);
346
+ if (isDateBetween(day, this.#minDate, this.#maxDate)) {
347
+ $day.removeAttribute('disabled');
348
+ $day.removeAttribute('aria-hidden');
349
+ } else {
350
+ $day.setAttribute('disabled', '');
351
+ $day.setAttribute('aria-hidden', 'true');
352
+ }
353
+ if (areDatesEqual(day, this.#date1) || areDatesEqual(day, this.#date2)) {
354
+ $day.classList.add('selected');
355
+ } else if (areDatesEqual(day, todayDate)) {
356
+ $day.classList.add('today');
357
+ } else if (isDateBetween(day, this.#date1, this.#date2)) {
358
+ $day.classList.add('range');
359
+ }
360
+ isEmptyWeek = false;
361
+ }
362
+ }
363
+ setClass(this.#$weeks[wi], 'empty', isEmptyWeek);
364
+ }
365
+ }
366
+ #subscribeRangeHover() {
367
+ if (!this.#isHoverSubscribed) {
368
+ this.#$month.addEventListener('mouseover', this.#onDateMouseEnter);
369
+ this.#isHoverSubscribed = true;
370
+ }
371
+ }
372
+ #unsubscribeRangeHover() {
373
+ if (this.#isHoverSubscribed) {
374
+ this.#$month.removeEventListener('mouseover', this.#onDateMouseEnter);
375
+ this.#isHoverSubscribed = false;
376
+ }
377
+ }
378
+ #onChangeReactHandler = e => {
379
+ getReactEventHandler(this, 'on-change')?.(e);
380
+ };
381
+ });
@@ -0,0 +1,70 @@
1
+ import type { TRect, TSinchElementReact } from '../types';
2
+ export type TSinchDatePickerElement = HTMLElement & {
3
+ /** Date value in ISO 8601 format */
4
+ value: string;
5
+ /** Date min limit in ISO 8601 format */
6
+ min: string;
7
+ /** Date max limit in ISO 8601 format */
8
+ max: string;
9
+ /** BCP 47 language tag (e.g. en-US), which changes day and month display names in the calendar */
10
+ locale: string;
11
+ /** Date range mode */
12
+ range: boolean;
13
+ /** Label that is used for a11y */
14
+ prevYearAriaLabel: string;
15
+ /** Label that is used for a11y */
16
+ nextYearAriaLabel: string;
17
+ /** Label that is used for a11y */
18
+ prevMonthAriaLabel: string;
19
+ /** Label that is used for a11y */
20
+ nextMonthAriaLabel: string;
21
+ readonly prevYearButtonRect: TRect;
22
+ readonly nextYearButtonRect: TRect;
23
+ readonly prevMonthButtonRect: TRect;
24
+ readonly nextMonthButtonRect: TRect;
25
+ nthButtonRect(index: number): TRect | null;
26
+ /** Change value handler, return date in ISO 8601 format */
27
+ addEventListener(type: '-change', listener: (e: CustomEvent<string>) => void): void;
28
+ /** Date value in ISO 8601 format */
29
+ setAttribute(name: 'value', value: string): void;
30
+ /** Date min limit in ISO 8601 format */
31
+ setAttribute(name: 'min', value: string): void;
32
+ /** Date max limit in ISO 8601 format */
33
+ setAttribute(name: 'max', value: string): void;
34
+ /** BCP 47 language tag (e.g. en-US), which changes day and month display names in the calendar */
35
+ setAttribute(name: 'locale', value: string): void;
36
+ /** Date range mode */
37
+ setAttribute(name: 'range', value: ''): void;
38
+ /** Label that is used for a11y */
39
+ setAttribute(name: 'prev-year-aria-label', value: string): void;
40
+ /** Label that is used for a11y */
41
+ setAttribute(name: 'next-year-aria-label', value: string): void;
42
+ /** Label that is used for a11y */
43
+ setAttribute(name: 'prev-month-aria-label', value: string): void;
44
+ /** Label that is used for a11y */
45
+ setAttribute(name: 'next-month-aria-label', value: string): void;
46
+ };
47
+ export type TSinchDatePickerReact = TSinchElementReact<TSinchDatePickerElement> & {
48
+ /** Date value in ISO 8601 format */
49
+ value: string;
50
+ /** Date min limit in ISO 8601 format */
51
+ min: string;
52
+ /** Date max limit in ISO 8601 format */
53
+ max: string;
54
+ /** BCP 47 language tag (e.g. en-US), which changes day and month display names in the calendar */
55
+ locale: string;
56
+ /** Date range mode */
57
+ range?: boolean;
58
+ /** Label that is used for a11y */
59
+ 'aria-label': string;
60
+ /** Label that is used for a11y */
61
+ 'prev-year-aria-label': string;
62
+ /** Label that is used for a11y */
63
+ 'next-year-aria-label': string;
64
+ /** Label that is used for a11y */
65
+ 'prev-month-aria-label': string;
66
+ /** Label that is used for a11y */
67
+ 'next-month-aria-label': string;
68
+ /** Change value handler, return date in ISO 8601 format */
69
+ 'on-change'?: (e: CustomEvent<string>) => void;
70
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ type TCalendarOptions = {
2
+ firstDayOfWeek: 0 | 1 | 2 | 3 | 4 | 5 | 6;
3
+ };
4
+ type TMaybeDate = Date | null;
5
+ export declare const getCalendarMonth: (date: Date, options?: TCalendarOptions) => TMaybeDate[][];
6
+ export declare const dateToIso: (date: Date) => string;
7
+ export declare const isoToDate: (value: string) => Date;
8
+ export declare const today: () => Date;
9
+ export declare const getDayNames: (locale: string) => string[];
10
+ export declare const getMonthNames: (locale: string) => string[];
11
+ export declare const isValidDate: (value: any) => value is Date;
12
+ export declare const compareDates: (a: Date, b: Date) => number;
13
+ export declare const clampMinDate: (date: Date, min: Date) => void;
14
+ export declare const clampMaxDate: (date: Date, max: Date) => void;
15
+ export declare const incMonth: (date: Date, max: Date) => void;
16
+ export declare const decMonth: (date: Date, min: Date) => void;
17
+ export declare const incYear: (date: Date, max: Date) => void;
18
+ export declare const decYear: (date: Date, min: Date) => void;
19
+ export declare const canGoPrevMonth: (date: Date, min: Date) => boolean;
20
+ export declare const canGoNextMonth: (date: Date, max: Date) => boolean;
21
+ export declare const canGoNextYear: (date: Date, max: Date) => boolean;
22
+ export declare const canGoPrevYear: (date: Date, min: Date) => boolean;
23
+ export declare const isDateBetween: (date: Date, min: Date | null, max: Date | null) => boolean;
24
+ export declare const areDatesEqual: (a: Date, b: Date | null) => boolean;
25
+ export declare const cloneDate: (date: Date) => Date;
26
+ export declare const sortDates: (dateTuple: [Date, Date]) => [Date, Date];
27
+ export declare const isDateOnScreen: (uiDate: Date | null, date: Date | null) => boolean;
28
+ export {};
@@ -0,0 +1,142 @@
1
+ const DAYS_IN_WEEK = 7;
2
+ const pad = value => {
3
+ return value.toString().padStart(2, '0');
4
+ };
5
+ export const getCalendarMonth = (date, options) => {
6
+ const {
7
+ firstDayOfWeek
8
+ } = {
9
+ firstDayOfWeek: 1,
10
+ ...options
11
+ };
12
+ const firstDateOfMonth = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
13
+ const lastDateOfMonth = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0));
14
+ const firstWeekdayOfMonth = firstDateOfMonth.getUTCDay();
15
+ const lastWeekdayOfMonth = lastDateOfMonth.getUTCDay();
16
+ const daysInMonth = lastDateOfMonth.getUTCDate();
17
+ const daysToPrepend = (firstWeekdayOfMonth - firstDayOfWeek + DAYS_IN_WEEK) % DAYS_IN_WEEK;
18
+ const daysToAppend = (DAYS_IN_WEEK - 1 - lastWeekdayOfMonth + firstDayOfWeek) % DAYS_IN_WEEK;
19
+ const month = [];
20
+ let week = [];
21
+ for (let i = 1 - daysToPrepend; i <= daysInMonth + daysToAppend + 1; i++) {
22
+ if (i <= 0 || i > daysInMonth) {
23
+ week.push(null);
24
+ } else {
25
+ const result = new Date(date);
26
+ result.setUTCDate(i);
27
+ week.push(result);
28
+ }
29
+ if (week.length === 7) {
30
+ month.push(week);
31
+ week = [];
32
+ }
33
+ }
34
+ return month;
35
+ };
36
+ export const dateToIso = date => {
37
+ return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
38
+ };
39
+ export const isoToDate = value => {
40
+ return new Date(`${value.substring(0, 10)}T00:00:00Z`);
41
+ };
42
+ export const today = () => {
43
+ const today = new Date();
44
+ return new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate()));
45
+ };
46
+ export const getDayNames = locale => {
47
+ const formatter = new Intl.DateTimeFormat(locale, {
48
+ weekday: 'narrow',
49
+ timeZone: 'UTC'
50
+ });
51
+ return [1, 2, 3, 4, 5, 6, 7].map(dd => {
52
+ const date = new Date(Date.UTC(2018, 0, dd));
53
+ return formatter.format(date);
54
+ });
55
+ };
56
+ export const getMonthNames = locale => {
57
+ const formatter = new Intl.DateTimeFormat(locale, {
58
+ month: 'short',
59
+ timeZone: 'UTC'
60
+ });
61
+ return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(mm => {
62
+ const date = new Date(Date.UTC(2018, mm, 1));
63
+ return formatter.format(date);
64
+ });
65
+ };
66
+ export const isValidDate = value => {
67
+ return value instanceof Date && !isNaN(value);
68
+ };
69
+ export const compareDates = (a, b) => {
70
+ return a.getTime() - b.getTime();
71
+ };
72
+ export const clampMinDate = (date, min) => {
73
+ if (compareDates(min, date) > 0) {
74
+ date.setTime(min.getTime());
75
+ }
76
+ };
77
+ export const clampMaxDate = (date, max) => {
78
+ if (compareDates(date, max) > 0) {
79
+ date.setTime(max.getTime());
80
+ }
81
+ };
82
+ export const incMonth = (date, max) => {
83
+ date.setUTCMonth(date.getUTCMonth() + 1);
84
+ clampMaxDate(date, max);
85
+ };
86
+ export const decMonth = (date, min) => {
87
+ date.setUTCMonth(date.getUTCMonth() - 1);
88
+ clampMinDate(date, min);
89
+ };
90
+ export const incYear = (date, max) => {
91
+ date.setUTCFullYear(date.getUTCFullYear() + 1);
92
+ clampMaxDate(date, max);
93
+ };
94
+ export const decYear = (date, min) => {
95
+ date.setUTCFullYear(date.getUTCFullYear() - 1);
96
+ clampMinDate(date, min);
97
+ };
98
+ export const canGoPrevMonth = (date, min) => {
99
+ const prevMonth = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 0));
100
+ return compareDates(prevMonth, min) >= 0;
101
+ };
102
+ export const canGoNextMonth = (date, max) => {
103
+ const nextMonth = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1));
104
+ return compareDates(max, nextMonth) >= 0;
105
+ };
106
+ export const canGoNextYear = (date, max) => {
107
+ const nextYear = new Date(Date.UTC(date.getUTCFullYear() + 1, 0, 1));
108
+ return compareDates(max, nextYear) >= 0;
109
+ };
110
+ export const canGoPrevYear = (date, min) => {
111
+ const prevYear = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));
112
+ return compareDates(prevYear, min) >= 0;
113
+ };
114
+ export const isDateBetween = (date, min, max) => {
115
+ if (min === null || max === null) {
116
+ return false;
117
+ }
118
+ return compareDates(date, min) >= 0 && compareDates(max, date) >= 0;
119
+ };
120
+ export const areDatesEqual = (a, b) => {
121
+ if (b === null) {
122
+ return false;
123
+ }
124
+ return compareDates(a, b) === 0;
125
+ };
126
+ export const cloneDate = date => {
127
+ return new Date(date.getTime());
128
+ };
129
+ export const sortDates = dateTuple => {
130
+ if (compareDates(dateTuple[0], dateTuple[1]) > 0) {
131
+ return [dateTuple[1], dateTuple[0]];
132
+ }
133
+ return dateTuple;
134
+ };
135
+ export const isDateOnScreen = (uiDate, date) => {
136
+ if (uiDate === null || date === null) {
137
+ return false;
138
+ }
139
+ const firstDateOfMonth = new Date(Date.UTC(uiDate.getUTCFullYear(), uiDate.getUTCMonth(), 1));
140
+ const lastDateOfMonth = new Date(Date.UTC(uiDate.getUTCFullYear(), uiDate.getUTCMonth() + 1, 0));
141
+ return isDateBetween(date, firstDateOfMonth, lastDateOfMonth);
142
+ };
@@ -0,0 +1,15 @@
1
+ import '../icon-button';
2
+ import '../icon';
3
+ import '../stop-events';
4
+ import '../title';
5
+ import type { TSinchDialogElement, TSinchDialogReact } from './types';
6
+ declare global {
7
+ namespace JSX {
8
+ interface IntrinsicElements {
9
+ 'sinch-dialog': TSinchDialogReact;
10
+ }
11
+ }
12
+ interface HTMLElementTagNameMap {
13
+ 'sinch-dialog': TSinchDialogElement;
14
+ }
15
+ }