@northlight/ui 2.41.0 → 2.41.1

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 (500) hide show
  1. package/lib/components/accordion/accordion-button.tsx +23 -0
  2. package/lib/components/accordion/accordion-item.tsx +9 -0
  3. package/lib/components/accordion/accordion-panel.tsx +13 -0
  4. package/lib/components/accordion/accordion.tsx +49 -0
  5. package/lib/components/accordion/index.ts +13 -0
  6. package/lib/components/alert/alert.tsx +64 -0
  7. package/lib/components/alert/index.ts +7 -0
  8. package/lib/components/alert/types.ts +7 -0
  9. package/lib/components/alert-dialog/index.ts +9 -0
  10. package/lib/components/aspect-ratio/aspect-ratio.tsx +17 -0
  11. package/lib/components/aspect-ratio/index.ts +2 -0
  12. package/lib/components/async-error/async-error.tsx +33 -0
  13. package/lib/components/async-error/index.ts +2 -0
  14. package/lib/components/async-error/types.ts +5 -0
  15. package/lib/components/avatar/avatar-badge.tsx +26 -0
  16. package/lib/components/avatar/avatar-group.tsx +56 -0
  17. package/lib/components/avatar/avatar.tsx +77 -0
  18. package/lib/components/avatar/index.ts +3 -0
  19. package/lib/components/avatar/types.ts +34 -0
  20. package/lib/components/badge/badge.tsx +69 -0
  21. package/lib/components/badge/index.ts +2 -0
  22. package/lib/components/badge/types.ts +15 -0
  23. package/lib/components/blinker/blinker.tsx +26 -0
  24. package/lib/components/blinker/index.ts +2 -0
  25. package/lib/components/blinker/types.ts +5 -0
  26. package/lib/components/box/index.ts +2 -0
  27. package/lib/components/breadcrumb/index.ts +6 -0
  28. package/lib/components/button/button.tsx +111 -0
  29. package/lib/components/button/index.ts +5 -0
  30. package/lib/components/button/types.ts +20 -0
  31. package/lib/components/card/index.ts +6 -0
  32. package/lib/components/carousel/carousel-arrow.tsx +27 -0
  33. package/lib/components/carousel/carousel-item.tsx +23 -0
  34. package/lib/components/carousel/carousel.tsx +223 -0
  35. package/lib/components/carousel/constants.ts +2 -0
  36. package/lib/components/carousel/index.ts +1 -0
  37. package/lib/components/carousel/types.ts +32 -0
  38. package/lib/components/center/index.ts +4 -0
  39. package/lib/components/checkbox/checkbox-field.tsx +75 -0
  40. package/lib/components/checkbox/checkbox-group-field.tsx +49 -0
  41. package/lib/components/checkbox/checkbox.tsx +54 -0
  42. package/lib/components/checkbox/index.ts +7 -0
  43. package/lib/components/checkbox/types.ts +31 -0
  44. package/lib/components/circle/index.ts +3 -0
  45. package/lib/components/circular-progress/index.ts +4 -0
  46. package/lib/components/clickable/clickable.tsx +56 -0
  47. package/lib/components/clickable/index.ts +2 -0
  48. package/lib/components/clickable/types.ts +7 -0
  49. package/lib/components/clipboard-input/clipboard-input.tsx +65 -0
  50. package/lib/components/clipboard-input/index.ts +2 -0
  51. package/lib/components/clipboard-input/types.ts +6 -0
  52. package/lib/components/close-button/index.ts +3 -0
  53. package/lib/components/code/index.ts +3 -0
  54. package/lib/components/color-picker/color-button.tsx +51 -0
  55. package/lib/components/color-picker/color-picker-field.tsx +37 -0
  56. package/lib/components/color-picker/color-picker.tsx +205 -0
  57. package/lib/components/color-picker/colors-expand-button.tsx +47 -0
  58. package/lib/components/color-picker/constants.ts +5 -0
  59. package/lib/components/color-picker/index.ts +3 -0
  60. package/lib/components/color-picker/types.ts +44 -0
  61. package/lib/components/combo-picker/combo-picker-field.tsx +99 -0
  62. package/lib/components/combo-picker/combo-picker.tsx +165 -0
  63. package/lib/components/combo-picker/index.ts +3 -0
  64. package/lib/components/combo-picker/types.ts +35 -0
  65. package/lib/components/container/index.ts +5 -0
  66. package/lib/components/createable-select-dropdown/createable-select-dropdown.tsx +282 -0
  67. package/lib/components/createable-select-dropdown/custom-components.tsx +44 -0
  68. package/lib/components/createable-select-dropdown/index.ts +1 -0
  69. package/lib/components/createable-select-dropdown/types.ts +76 -0
  70. package/lib/components/date-picker/components/calendar/calendar.tsx +56 -0
  71. package/lib/components/date-picker/components/calendar/components/calendar-cell.tsx +41 -0
  72. package/lib/components/date-picker/components/calendar/components/calendar-grid.tsx +52 -0
  73. package/lib/components/date-picker/components/calendar/components/day-labels.tsx +18 -0
  74. package/lib/components/date-picker/components/calendar/components/get-week-number-start-of-month.ts +68 -0
  75. package/lib/components/date-picker/components/calendar/components/index.ts +3 -0
  76. package/lib/components/date-picker/components/calendar/components/month-button.tsx +21 -0
  77. package/lib/components/date-picker/components/calendar/components/range-cell.tsx +75 -0
  78. package/lib/components/date-picker/components/calendar/components/standalone-calendar-grid.tsx +108 -0
  79. package/lib/components/date-picker/components/calendar/components/types.ts +43 -0
  80. package/lib/components/date-picker/components/calendar/components/utils.ts +5 -0
  81. package/lib/components/date-picker/components/calendar/constants.ts +14 -0
  82. package/lib/components/date-picker/components/calendar/date-select/index.ts +4 -0
  83. package/lib/components/date-picker/components/calendar/date-select/month-select.tsx +36 -0
  84. package/lib/components/date-picker/components/calendar/date-select/types.ts +29 -0
  85. package/lib/components/date-picker/components/calendar/date-select/utils.ts +33 -0
  86. package/lib/components/date-picker/components/calendar/date-select/year-select-calendar.tsx +17 -0
  87. package/lib/components/date-picker/components/calendar/date-select/year-select-range-calendar.tsx +19 -0
  88. package/lib/components/date-picker/components/calendar/date-select/year-select.tsx +31 -0
  89. package/lib/components/date-picker/components/calendar/index.ts +1 -0
  90. package/lib/components/date-picker/components/calendar/quick-navigation/adjust-range.tsx +227 -0
  91. package/lib/components/date-picker/components/calendar/quick-navigation/button-row.tsx +31 -0
  92. package/lib/components/date-picker/components/calendar/quick-navigation/date-button.tsx +32 -0
  93. package/lib/components/date-picker/components/calendar/quick-navigation/get-quick-select-options.ts +319 -0
  94. package/lib/components/date-picker/components/calendar/quick-navigation/index.ts +1 -0
  95. package/lib/components/date-picker/components/calendar/quick-navigation/move-button.tsx +23 -0
  96. package/lib/components/date-picker/components/calendar/quick-navigation/quick-select.tsx +113 -0
  97. package/lib/components/date-picker/components/calendar/quick-navigation/types.ts +59 -0
  98. package/lib/components/date-picker/components/calendar/quick-navigation/utils.ts +8 -0
  99. package/lib/components/date-picker/components/calendar/range-calendar.tsx +153 -0
  100. package/lib/components/date-picker/components/calendar/types.ts +19 -0
  101. package/lib/components/date-picker/components/date-field/date-field.tsx +51 -0
  102. package/lib/components/date-picker/components/date-field/date-segment.tsx +34 -0
  103. package/lib/components/date-picker/components/date-field/index.ts +4 -0
  104. package/lib/components/date-picker/components/date-field/styled-field.tsx +27 -0
  105. package/lib/components/date-picker/components/date-field/trigger.tsx +27 -0
  106. package/lib/components/date-picker/components/date-field/types.ts +25 -0
  107. package/lib/components/date-picker/components/date-field/utils.ts +15 -0
  108. package/lib/components/date-picker/components/index.ts +2 -0
  109. package/lib/components/date-picker/date-picker/date-picker-locale-wrapper.tsx +16 -0
  110. package/lib/components/date-picker/date-picker/date-picker.tsx +145 -0
  111. package/lib/components/date-picker/date-picker/date-range-picker.tsx +325 -0
  112. package/lib/components/date-picker/date-picker/index.ts +3 -0
  113. package/lib/components/date-picker/date-picker-field/date-picker-field.tsx +97 -0
  114. package/lib/components/date-picker/date-picker-field/date-range-picker-field.tsx +81 -0
  115. package/lib/components/date-picker/date-picker-field/index.ts +2 -0
  116. package/lib/components/date-picker/date-picker-field/utils.ts +9 -0
  117. package/lib/components/date-picker/index.ts +3 -0
  118. package/lib/components/date-picker/types.ts +108 -0
  119. package/lib/components/divider/index.ts +3 -0
  120. package/lib/components/drag-and-drop/drag-and-drop.tsx +15 -0
  121. package/lib/components/drag-and-drop/drag-handle.tsx +23 -0
  122. package/lib/components/drag-and-drop/drag-item.tsx +42 -0
  123. package/lib/components/drag-and-drop/draggable.tsx +94 -0
  124. package/lib/components/drag-and-drop/drop-zone.tsx +32 -0
  125. package/lib/components/drag-and-drop/droppable.tsx +58 -0
  126. package/lib/components/drag-and-drop/index.ts +17 -0
  127. package/lib/components/drag-and-drop/multi-sort.tsx +198 -0
  128. package/lib/components/drag-and-drop/sortable-container.tsx +26 -0
  129. package/lib/components/drag-and-drop/sortable-item.tsx +96 -0
  130. package/lib/components/drag-and-drop/sortable-list.tsx +163 -0
  131. package/lib/components/drag-and-drop/sortable.tsx +16 -0
  132. package/lib/components/drag-and-drop/types.ts +105 -0
  133. package/lib/components/drawer/index.ts +9 -0
  134. package/lib/components/editable/index.ts +8 -0
  135. package/lib/components/editable-text/editable-controls.tsx +72 -0
  136. package/lib/components/editable-text/editable-text.tsx +83 -0
  137. package/lib/components/editable-text/index.ts +2 -0
  138. package/lib/components/editable-text/types.ts +17 -0
  139. package/lib/components/fast-grid/fast-grid.tsx +123 -0
  140. package/lib/components/fast-grid/index.ts +2 -0
  141. package/lib/components/fast-grid/types.ts +26 -0
  142. package/lib/components/fast-list/fast-list.tsx +53 -0
  143. package/lib/components/fast-list/index.ts +2 -0
  144. package/lib/components/fast-list/types.ts +17 -0
  145. package/lib/components/file-picker/confirm-delete-modal.tsx +45 -0
  146. package/lib/components/file-picker/constants.ts +7 -0
  147. package/lib/components/file-picker/file-editor-modal.tsx +105 -0
  148. package/lib/components/file-picker/file-icon-button.tsx +14 -0
  149. package/lib/components/file-picker/file-item.tsx +207 -0
  150. package/lib/components/file-picker/file-picker-field.tsx +73 -0
  151. package/lib/components/file-picker/file-picker.tsx +365 -0
  152. package/lib/components/file-picker/index.ts +7 -0
  153. package/lib/components/file-picker/multi-file-list.tsx +88 -0
  154. package/lib/components/file-picker/multi-file-picker-field.tsx +95 -0
  155. package/lib/components/file-picker/multi-file-picker.tsx +95 -0
  156. package/lib/components/file-picker/multi-file-uploader.tsx +189 -0
  157. package/lib/components/file-picker/types.ts +132 -0
  158. package/lib/components/file-picker/utils.ts +283 -0
  159. package/lib/components/flex/index.ts +4 -0
  160. package/lib/components/flip-button/flip-button-group-field.tsx +58 -0
  161. package/lib/components/flip-button/flip-button-group.tsx +70 -0
  162. package/lib/components/flip-button/flip-button.tsx +185 -0
  163. package/lib/components/flip-button/index.ts +4 -0
  164. package/lib/components/flip-button/types.ts +100 -0
  165. package/lib/components/flip-button/utils.ts +45 -0
  166. package/lib/components/form/field.tsx +147 -0
  167. package/lib/components/form/form.tsx +210 -0
  168. package/lib/components/form/index.ts +5 -0
  169. package/lib/components/form/trim-form-values.ts +20 -0
  170. package/lib/components/form/types.ts +99 -0
  171. package/lib/components/form/use-set-value-refreshed.ts +12 -0
  172. package/lib/components/form-control/form-label.tsx +29 -0
  173. package/lib/components/form-control/index.ts +7 -0
  174. package/lib/components/form-control/types.ts +5 -0
  175. package/lib/components/grid/index.ts +4 -0
  176. package/lib/components/heading/index.ts +3 -0
  177. package/lib/components/highlight/index.ts +1 -0
  178. package/lib/components/icon/icon.tsx +38 -0
  179. package/lib/components/icon/index.ts +2 -0
  180. package/lib/components/icon/types.ts +7 -0
  181. package/lib/components/icon-button/icon-button.tsx +45 -0
  182. package/lib/components/icon-button/index.ts +2 -0
  183. package/lib/components/icon-button/types.ts +6 -0
  184. package/lib/components/image/index.ts +5 -0
  185. package/lib/components/index.ts +94 -0
  186. package/lib/components/input/index.ts +19 -0
  187. package/lib/components/intent-button/index.ts +1 -0
  188. package/lib/components/intent-button/intent-button.tsx +118 -0
  189. package/lib/components/intent-button/timeout-progress-circle.tsx +48 -0
  190. package/lib/components/intent-button/types.ts +16 -0
  191. package/lib/components/kbd/index.ts +3 -0
  192. package/lib/components/keyframes/index.ts +3 -0
  193. package/lib/components/link/index.ts +3 -0
  194. package/lib/components/link-overlay/index.ts +4 -0
  195. package/lib/components/list/index.ts +7 -0
  196. package/lib/components/mark/index.ts +1 -0
  197. package/lib/components/mediatool-theme-provider/index.ts +2 -0
  198. package/lib/components/mediatool-theme-provider/mediatool-theme-provider.tsx +28 -0
  199. package/lib/components/mediatool-theme-provider/types.ts +8 -0
  200. package/lib/components/menu/index.ts +13 -0
  201. package/lib/components/menu/menu.tsx +103 -0
  202. package/lib/components/menu/types.ts +7 -0
  203. package/lib/components/modal/index.ts +12 -0
  204. package/lib/components/modal/modal-base.tsx +22 -0
  205. package/lib/components/modal/modal-body.tsx +6 -0
  206. package/lib/components/modal/modal.tsx +18 -0
  207. package/lib/components/modal/types.ts +9 -0
  208. package/lib/components/notification-icon-button/index.ts +2 -0
  209. package/lib/components/notification-icon-button/notification-icon-button.tsx +57 -0
  210. package/lib/components/notification-icon-button/types.ts +8 -0
  211. package/lib/components/number-input/advanced-parse-float.ts +30 -0
  212. package/lib/components/number-input/index.ts +9 -0
  213. package/lib/components/number-input/number-input-field.tsx +74 -0
  214. package/lib/components/number-input/number-input-stepper.tsx +47 -0
  215. package/lib/components/number-input/number-input.tsx +67 -0
  216. package/lib/components/number-input/types.ts +37 -0
  217. package/lib/components/organization-logo/index.ts +2 -0
  218. package/lib/components/organization-logo/organization-logo.tsx +46 -0
  219. package/lib/components/organization-logo/types.ts +8 -0
  220. package/lib/components/overflow-group/index.ts +3 -0
  221. package/lib/components/overflow-group/overflow-group.tsx +189 -0
  222. package/lib/components/overflow-group/types.ts +10 -0
  223. package/lib/components/overflow-group/use-overflow-group.ts +12 -0
  224. package/lib/components/pin-input/index.ts +5 -0
  225. package/lib/components/pin-input/pin-input.tsx +31 -0
  226. package/lib/components/pin-input/types.ts +10 -0
  227. package/lib/components/popover/index.ts +11 -0
  228. package/lib/components/popover/popover.tsx +6 -0
  229. package/lib/components/portal/index.ts +3 -0
  230. package/lib/components/portal/render-in-portal.tsx +17 -0
  231. package/lib/components/progress/constants.ts +2 -0
  232. package/lib/components/progress/index.ts +2 -0
  233. package/lib/components/progress/loading-bar.tsx +93 -0
  234. package/lib/components/progress/progress-bar.tsx +36 -0
  235. package/lib/components/progress/types.ts +8 -0
  236. package/lib/components/progress/utils.ts +17 -0
  237. package/lib/components/radio/index.ts +8 -0
  238. package/lib/components/radio/radio-group-field.tsx +49 -0
  239. package/lib/components/radio/radio-group.tsx +30 -0
  240. package/lib/components/radio/radio.tsx +23 -0
  241. package/lib/components/radio/types.ts +33 -0
  242. package/lib/components/range-slider/index.ts +7 -0
  243. package/lib/components/resize-handle/index.ts +1 -0
  244. package/lib/components/resize-handle/resize-handle.tsx +26 -0
  245. package/lib/components/search-bar/get-components.tsx +76 -0
  246. package/lib/components/search-bar/index.ts +3 -0
  247. package/lib/components/search-bar/search-bar-field.tsx +70 -0
  248. package/lib/components/search-bar/search-bar.tsx +127 -0
  249. package/lib/components/search-bar/styles.ts +49 -0
  250. package/lib/components/search-bar/types.ts +53 -0
  251. package/lib/components/select/get-matching-value.ts +23 -0
  252. package/lib/components/select/index.ts +13 -0
  253. package/lib/components/select/select-field.tsx +89 -0
  254. package/lib/components/select/select.tsx +209 -0
  255. package/lib/components/select/sortable-select-values.tsx +49 -0
  256. package/lib/components/select/sortable-select.tsx +428 -0
  257. package/lib/components/select/types.ts +67 -0
  258. package/lib/components/show/index.ts +4 -0
  259. package/lib/components/simple-grid/index.ts +3 -0
  260. package/lib/components/skeleton/index.ts +5 -0
  261. package/lib/components/slider/index.ts +7 -0
  262. package/lib/components/spinner/index.ts +2 -0
  263. package/lib/components/spinner/spinner.tsx +15 -0
  264. package/lib/components/spinner/types.ts +3 -0
  265. package/lib/components/split-pane/index.ts +4 -0
  266. package/lib/components/split-pane/pane-divider.tsx +25 -0
  267. package/lib/components/split-pane/pane-item.tsx +14 -0
  268. package/lib/components/split-pane/split-pane.tsx +75 -0
  269. package/lib/components/split-pane/types.ts +10 -0
  270. package/lib/components/stack/index.ts +7 -0
  271. package/lib/components/stat/index.ts +8 -0
  272. package/lib/components/status-pin/index.ts +2 -0
  273. package/lib/components/status-pin/pin-size-map.ts +7 -0
  274. package/lib/components/status-pin/pin-variant-map.ts +12 -0
  275. package/lib/components/status-pin/status-pin.tsx +55 -0
  276. package/lib/components/status-pin/types.ts +7 -0
  277. package/lib/components/step-stack/index.ts +1 -0
  278. package/lib/components/step-stack/step-stack.tsx +113 -0
  279. package/lib/components/step-stack/types.ts +17 -0
  280. package/lib/components/steps/index.ts +10 -0
  281. package/lib/components/steps/step-list.tsx +30 -0
  282. package/lib/components/steps/step-panel.tsx +15 -0
  283. package/lib/components/steps/step.tsx +52 -0
  284. package/lib/components/steps/steps.tsx +34 -0
  285. package/lib/components/steps/types.ts +12 -0
  286. package/lib/components/switch/index.ts +3 -0
  287. package/lib/components/switch/switch-field.tsx +74 -0
  288. package/lib/components/switch/switch.tsx +41 -0
  289. package/lib/components/switch/types.ts +18 -0
  290. package/lib/components/table/index.ts +22 -0
  291. package/lib/components/table/table.tsx +31 -0
  292. package/lib/components/table/types.ts +5 -0
  293. package/lib/components/tabs/index.ts +12 -0
  294. package/lib/components/tabs/tab-panel.tsx +14 -0
  295. package/lib/components/tabs/tab.tsx +31 -0
  296. package/lib/components/tabs/tabs.tsx +76 -0
  297. package/lib/components/tabs/types.ts +12 -0
  298. package/lib/components/tag/index.ts +9 -0
  299. package/lib/components/tag/overflow-indicator.tsx +11 -0
  300. package/lib/components/tag/tag-group.tsx +57 -0
  301. package/lib/components/tag/tag.tsx +97 -0
  302. package/lib/components/tag/types.ts +15 -0
  303. package/lib/components/tags-input/index.ts +2 -0
  304. package/lib/components/tags-input/tags-input-styles.ts +35 -0
  305. package/lib/components/tags-input/tags-input.tsx +147 -0
  306. package/lib/components/tags-input/types.ts +20 -0
  307. package/lib/components/text/index.ts +3 -0
  308. package/lib/components/text-field/formatted-number-input-field.tsx +54 -0
  309. package/lib/components/text-field/formatted-number-input.tsx +167 -0
  310. package/lib/components/text-field/index.ts +5 -0
  311. package/lib/components/text-field/masked-text-input.tsx +37 -0
  312. package/lib/components/text-field/round-to-precision.ts +4 -0
  313. package/lib/components/text-field/text-field.tsx +61 -0
  314. package/lib/components/text-field/types.ts +60 -0
  315. package/lib/components/textarea/index.ts +3 -0
  316. package/lib/components/textarea/textarea-field.tsx +34 -0
  317. package/lib/components/textarea/textarea.tsx +27 -0
  318. package/lib/components/textarea/types.ts +22 -0
  319. package/lib/components/toast/index.ts +3 -0
  320. package/lib/components/toast/toast.tsx +75 -0
  321. package/lib/components/toast/types.ts +16 -0
  322. package/lib/components/toast/use-toast.tsx +57 -0
  323. package/lib/components/toolbox/index.ts +5 -0
  324. package/lib/components/toolbox/toolbox-content.tsx +23 -0
  325. package/lib/components/toolbox/toolbox-footer.tsx +18 -0
  326. package/lib/components/toolbox/toolbox-header.tsx +31 -0
  327. package/lib/components/toolbox/toolbox.tsx +132 -0
  328. package/lib/components/toolbox/types.ts +34 -0
  329. package/lib/components/tooltip/index.ts +1 -0
  330. package/lib/components/tooltip/tooltip.tsx +207 -0
  331. package/lib/components/tooltip/types.ts +9 -0
  332. package/lib/components/transitions/collapse.tsx +78 -0
  333. package/lib/components/transitions/constants.ts +2 -0
  334. package/lib/components/transitions/fade.tsx +72 -0
  335. package/lib/components/transitions/index.ts +6 -0
  336. package/lib/components/transitions/scale-fade.tsx +70 -0
  337. package/lib/components/transitions/slide-fade.tsx +43 -0
  338. package/lib/components/transitions/slide.tsx +37 -0
  339. package/lib/components/transitions/types.ts +37 -0
  340. package/lib/components/transitions/utils.ts +103 -0
  341. package/lib/components/types/color/index.ts +24 -0
  342. package/lib/components/types/index.ts +2 -0
  343. package/lib/components/types/toastIconMap/index.ts +20 -0
  344. package/lib/components/types/tooltipIconMap/index.ts +21 -0
  345. package/lib/components/typography/body/index.ts +2 -0
  346. package/lib/components/typography/body/p.tsx +31 -0
  347. package/lib/components/typography/body/types.ts +5 -0
  348. package/lib/components/typography/headings/h1.tsx +29 -0
  349. package/lib/components/typography/headings/h2.tsx +30 -0
  350. package/lib/components/typography/headings/h3.tsx +29 -0
  351. package/lib/components/typography/headings/h4.tsx +29 -0
  352. package/lib/components/typography/headings/h5.tsx +29 -0
  353. package/lib/components/typography/headings/h6.tsx +29 -0
  354. package/lib/components/typography/headings/index.ts +7 -0
  355. package/lib/components/typography/headings/types.ts +3 -0
  356. package/lib/components/typography/index.ts +6 -0
  357. package/lib/components/typography/labels/index.ts +2 -0
  358. package/lib/components/typography/labels/label.tsx +39 -0
  359. package/lib/components/typography/labels/types.ts +6 -0
  360. package/lib/components/typography/numvals/index.ts +1 -0
  361. package/lib/components/typography/numvals/numval.tsx +33 -0
  362. package/lib/components/typography/stylized/blockquote.tsx +32 -0
  363. package/lib/components/typography/stylized/capitalized.tsx +37 -0
  364. package/lib/components/typography/stylized/index.ts +5 -0
  365. package/lib/components/typography/stylized/lead.tsx +37 -0
  366. package/lib/components/typography/stylized/small.tsx +37 -0
  367. package/lib/components/typography/stylized/tiny.tsx +37 -0
  368. package/lib/components/typography/types.ts +11 -0
  369. package/lib/components/visually-hidden/index.ts +4 -0
  370. package/lib/components/wrap/index.ts +4 -0
  371. package/lib/general.d.ts +27 -0
  372. package/lib/hooks/index.ts +26 -0
  373. package/lib/hooks/use-arrow-focus/index.ts +76 -0
  374. package/lib/hooks/use-boolean/index.ts +3 -0
  375. package/lib/hooks/use-breakpoint-value/index.ts +4 -0
  376. package/lib/hooks/use-clipboard/index.ts +3 -0
  377. package/lib/hooks/use-controllable/index.ts +4 -0
  378. package/lib/hooks/use-controller/index.ts +3 -0
  379. package/lib/hooks/use-debounce/index.ts +16 -0
  380. package/lib/hooks/use-did-update-effect/index.ts +12 -0
  381. package/lib/hooks/use-disclosure/index.ts +3 -0
  382. package/lib/hooks/use-field-array/index.ts +3 -0
  383. package/lib/hooks/use-form/index.ts +3 -0
  384. package/lib/hooks/use-form-context/index.ts +3 -0
  385. package/lib/hooks/use-form-state/index.ts +3 -0
  386. package/lib/hooks/use-interval/index.ts +3 -0
  387. package/lib/hooks/use-loading-message/index.ts +15 -0
  388. package/lib/hooks/use-media-query/index.ts +3 -0
  389. package/lib/hooks/use-merge-refs/index.ts +3 -0
  390. package/lib/hooks/use-outside-click/index.ts +3 -0
  391. package/lib/hooks/use-outside-rect-click/index.ts +98 -0
  392. package/lib/hooks/use-prefers-reduced-motion/index.ts +3 -0
  393. package/lib/hooks/use-resize-width/index.ts +44 -0
  394. package/lib/hooks/use-screen-size/index.ts +12 -0
  395. package/lib/hooks/use-scroll-to-bottom/index.ts +18 -0
  396. package/lib/hooks/use-scroll-to-bottom/utils/smooth-scroll-to-bottom.ts +17 -0
  397. package/lib/hooks/use-select-callbacks/index.ts +2 -0
  398. package/lib/hooks/use-select-callbacks/types.ts +25 -0
  399. package/lib/hooks/use-select-callbacks/use-select-callbacks.ts +43 -0
  400. package/lib/hooks/use-theme/index.ts +3 -0
  401. package/lib/hooks/use-token/index.ts +3 -0
  402. package/lib/hooks/use-watch/index.ts +3 -0
  403. package/lib/index.ts +6 -0
  404. package/lib/internal-components/index.ts +1 -0
  405. package/lib/internal-components/input-group-wrapper/index.ts +2 -0
  406. package/lib/internal-components/input-group-wrapper/input-group-wrapper.tsx +24 -0
  407. package/lib/internal-components/input-group-wrapper/types.ts +4 -0
  408. package/lib/theme/components/alert/index.ts +94 -0
  409. package/lib/theme/components/avatar/get-avatar-bg-color.ts +11 -0
  410. package/lib/theme/components/avatar/index.ts +158 -0
  411. package/lib/theme/components/badge/index.ts +80 -0
  412. package/lib/theme/components/blinker/index.ts +67 -0
  413. package/lib/theme/components/breadcrumb/index.ts +22 -0
  414. package/lib/theme/components/button/index.ts +205 -0
  415. package/lib/theme/components/calendar/index.ts +47 -0
  416. package/lib/theme/components/carousel/index.ts +30 -0
  417. package/lib/theme/components/checkbox/index.ts +90 -0
  418. package/lib/theme/components/clipboard-input/index.ts +38 -0
  419. package/lib/theme/components/close-button/index.ts +25 -0
  420. package/lib/theme/components/color-picker/index.ts +58 -0
  421. package/lib/theme/components/date-picker/index.ts +70 -0
  422. package/lib/theme/components/drag-and-drop/index.ts +23 -0
  423. package/lib/theme/components/editable-text/index.ts +82 -0
  424. package/lib/theme/components/file-picker/index.ts +111 -0
  425. package/lib/theme/components/flip-button/index.ts +167 -0
  426. package/lib/theme/components/icon/index.ts +22 -0
  427. package/lib/theme/components/index.ts +40 -0
  428. package/lib/theme/components/input/index.ts +223 -0
  429. package/lib/theme/components/link/index.ts +16 -0
  430. package/lib/theme/components/menu/index.ts +50 -0
  431. package/lib/theme/components/modal/index.ts +49 -0
  432. package/lib/theme/components/notification-icon-button/index.ts +52 -0
  433. package/lib/theme/components/number-input/index.ts +118 -0
  434. package/lib/theme/components/pin-input/index.ts +52 -0
  435. package/lib/theme/components/popover/index.ts +10 -0
  436. package/lib/theme/components/progress-bar/index.ts +12 -0
  437. package/lib/theme/components/radio/index.ts +73 -0
  438. package/lib/theme/components/select/custom-select.ts +44 -0
  439. package/lib/theme/components/select/index.ts +65 -0
  440. package/lib/theme/components/spinner/index.ts +12 -0
  441. package/lib/theme/components/split-pane/index.ts +33 -0
  442. package/lib/theme/components/steps/index.ts +2 -0
  443. package/lib/theme/components/steps/step/index.ts +63 -0
  444. package/lib/theme/components/steps/step-list/index.ts +13 -0
  445. package/lib/theme/components/switch/index.ts +23 -0
  446. package/lib/theme/components/table/index.ts +81 -0
  447. package/lib/theme/components/tabs/index.ts +115 -0
  448. package/lib/theme/components/tag/index.ts +81 -0
  449. package/lib/theme/components/textarea/index.ts +62 -0
  450. package/lib/theme/components/toolbox/index.ts +64 -0
  451. package/lib/theme/components/tooltip/index.ts +68 -0
  452. package/lib/theme/components/typography/body/index.ts +1 -0
  453. package/lib/theme/components/typography/body/p.ts +32 -0
  454. package/lib/theme/components/typography/headings/h1.ts +20 -0
  455. package/lib/theme/components/typography/headings/h2.ts +20 -0
  456. package/lib/theme/components/typography/headings/h3.ts +20 -0
  457. package/lib/theme/components/typography/headings/h4.ts +20 -0
  458. package/lib/theme/components/typography/headings/h5.ts +20 -0
  459. package/lib/theme/components/typography/headings/h6.ts +20 -0
  460. package/lib/theme/components/typography/headings/index.ts +6 -0
  461. package/lib/theme/components/typography/index.ts +5 -0
  462. package/lib/theme/components/typography/labels/index.ts +1 -0
  463. package/lib/theme/components/typography/labels/label.ts +71 -0
  464. package/lib/theme/components/typography/numvals/index.ts +1 -0
  465. package/lib/theme/components/typography/numvals/numval.ts +95 -0
  466. package/lib/theme/components/typography/stylized/blockquote.ts +17 -0
  467. package/lib/theme/components/typography/stylized/capitalized.ts +17 -0
  468. package/lib/theme/components/typography/stylized/index.ts +5 -0
  469. package/lib/theme/components/typography/stylized/lead.ts +17 -0
  470. package/lib/theme/components/typography/stylized/small.ts +17 -0
  471. package/lib/theme/components/typography/stylized/tiny.ts +17 -0
  472. package/lib/theme/global/scrollbar.ts +23 -0
  473. package/lib/theme/index.ts +67 -0
  474. package/lib/theme/process-color-scheme-based-on-theme.ts +24 -0
  475. package/lib/theme/skins/camphouse-light/index.ts +34 -0
  476. package/lib/theme/skins/index.ts +3 -0
  477. package/lib/theme/skins/tott/index.ts +30 -0
  478. package/lib/theme/skins/webapp/index.ts +34 -0
  479. package/lib/types/color/color.ts +24 -0
  480. package/lib/types/color/index.ts +1 -0
  481. package/lib/types/index.ts +2 -0
  482. package/lib/types/input-field/index.ts +1 -0
  483. package/lib/types/input-field/input-field.ts +4 -0
  484. package/lib/utils/add-alpha/index.ts +10 -0
  485. package/lib/utils/clamp/index.ts +2 -0
  486. package/lib/utils/debounce/create-debounce-function-instance.ts +18 -0
  487. package/lib/utils/debounce/index.ts +1 -0
  488. package/lib/utils/get-children-with-props/index.ts +17 -0
  489. package/lib/utils/get-children-with-props/pass-props-to-child.ts +10 -0
  490. package/lib/utils/get-consistent-random-color-from-string/index.ts +26 -0
  491. package/lib/utils/get-contrast-color/index.ts +34 -0
  492. package/lib/utils/get-field-error/index.ts +12 -0
  493. package/lib/utils/get-initials/index.ts +6 -0
  494. package/lib/utils/get-shades/index.ts +31 -0
  495. package/lib/utils/highlight/index.ts +9 -0
  496. package/lib/utils/index.ts +13 -0
  497. package/lib/utils/luminosity/index.ts +21 -0
  498. package/lib/utils/ring/index.ts +10 -0
  499. package/lib/utils/use-current-theme/index.ts +10 -0
  500. package/package.json +3 -2
@@ -0,0 +1,108 @@
1
+ import {
2
+ InputProps as ChakraInputProps,
3
+ StackDirection,
4
+ } from '@chakra-ui/react'
5
+ import { DateValue } from '@internationalized/date'
6
+ import {
7
+ AriaDatePickerProps,
8
+ AriaDateRangePickerProps,
9
+ } from '@react-aria/datepicker'
10
+ import { RegisterOptions } from 'react-hook-form'
11
+ import { InputFieldProps } from '../../types'
12
+
13
+ export interface DateRange {
14
+ startDate: string
15
+ endDate: string
16
+ }
17
+
18
+ interface DatePickerSettings {
19
+ firstDayOfWeek: 'sunday' | 'monday'
20
+ resetDate: () => void
21
+ isInvalid?: boolean
22
+ /** The dateFormat is a string,
23
+ * which acts as a template on how to display the date for the user, ex:
24
+ * dateFormat="mm.dd.yyyy" */
25
+ dateFormat?: string
26
+ isClearable?: boolean
27
+ variant?: 'outline' | 'filled'
28
+ }
29
+
30
+ export interface DatePickerProps
31
+ extends Omit<AriaDatePickerProps<DateValue>, 'firstDayOfWeek'>,
32
+ DatePickerSettings {}
33
+
34
+ export interface DateRangePickerProps
35
+ extends Omit<AriaDateRangePickerProps<DateValue>, 'firstDayOfWeek' | 'onChange' | 'value' | 'minValue' | 'maxValue'>,
36
+ DatePickerSettings {
37
+ /**
38
+ * Function to be called when the user changes the date, both in
39
+ * the modal and the input field.
40
+ */
41
+ onChange?: (date: null | DateRange) => void
42
+ /**
43
+ * Function to be called when the user saves the date change.
44
+ */
45
+ onSave?: () => void
46
+ value: DateRange | null
47
+ minValue?: string | undefined
48
+ maxValue?: string | undefined
49
+ fiscalStartMonth?: number
50
+ fiscalStartDay?: number
51
+ renderInPortal?: boolean
52
+ /**
53
+ * Label for the save button in the date range picker modal
54
+ */
55
+ buttonLabel?: string
56
+ /**
57
+ * The previously saved date range used for save/cancel functionality.
58
+ * When provided along with defaultDateRange, enables save and cancel buttons that appear
59
+ * when the current value differs from the saved value. The component will revert to this
60
+ * value when the popover is closed without saving or when cancel is clicked.
61
+ */
62
+ savedDateRange?: DateRange | null
63
+ /**
64
+ * The default date range to set when the input is cleared.
65
+ * When provided, the clear button will be shown next to the input field when
66
+ * modal is closed if the current value differs from the default value.
67
+ * If not provided, the clear button will always be shown when modal is closed.
68
+ */
69
+ defaultDateRange?: DateRange | null
70
+ /**
71
+ * Custom reset button to be shown next to the input field when modal is closed.
72
+ * If not provided, the default clear button will be shown.
73
+ */
74
+ CustomResetButton?: React.ReactNode
75
+ /**
76
+ * Custom label for the clear button in the date range picker modal
77
+ */
78
+ clearButtonLabel?: string
79
+ /**
80
+ * Function to be called when the user cancels the date change
81
+ */
82
+ onCancelChanges?: () => void
83
+ 'data-testid'?: string
84
+ }
85
+
86
+ export interface DatePickerFieldProps
87
+ extends Omit<ChakraInputProps, 'onChange'>, InputFieldProps {
88
+ name: string
89
+ label: string
90
+ minValue?: string
91
+ maxValue?: string
92
+ validate?: RegisterOptions
93
+ firstDayOfWeek?: 'sunday' | 'monday'
94
+ direction?: StackDirection
95
+ dateFormat?: string
96
+ onChange?: (date: DateValue) => void
97
+ onSave?: () => void
98
+ isClearable?: boolean
99
+ fiscalStartMonth?: number
100
+ fiscalStartDay?: number
101
+ }
102
+
103
+ export interface DateRangePickerFieldProps extends Omit<DatePickerFieldProps, 'onChange'> {
104
+ onChange?: (date: null | DateRange) => void
105
+ buttonLabel?: string
106
+ }
107
+
108
+ export type FormBody = Record<string, DateRange>
@@ -0,0 +1,3 @@
1
+ export {
2
+ Divider,
3
+ } from '@chakra-ui/react'
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import { DndContext, DndContextProps } from '@dnd-kit/core'
3
+
4
+ /**
5
+ * Context used for all drag and drop components
6
+ * (Based on dnd-kit)
7
+ * @see Draggable
8
+ * @see Droppable
9
+ * @see {@link https://northlight.dev}
10
+ * @see {@link https://dndkit.com/}
11
+ *
12
+ */
13
+ export const DragAndDrop = (props: DndContextProps) => (
14
+ <DndContext { ...props } />
15
+ )
@@ -0,0 +1,23 @@
1
+ import React from 'react'
2
+ import { DragDuo } from '@northlight/icons'
3
+ import { Icon } from '../icon'
4
+ import { DragHandleProps } from './types'
5
+
6
+ /**
7
+ * Util component to display drag handle icon
8
+ * for draggable react components under DragAndDrop context
9
+ * @see DragAndDrop
10
+ * @see {@link https://northlight.dev/reference/drag-handle}
11
+ *
12
+ * @example (Example)
13
+ * (?
14
+ * <DragHandle />
15
+ * ?)
16
+ */
17
+ export const DragHandle = ({ icon, isDragging, ...rest }: DragHandleProps) => (
18
+ <Icon
19
+ as={ icon || DragDuo }
20
+ cursor={ isDragging ? 'grabbing' : 'grab' }
21
+ { ...rest }
22
+ />
23
+ )
@@ -0,0 +1,42 @@
1
+ import React, { forwardRef } from 'react'
2
+ import { DotsMatrixSolid } from '@northlight/icons'
3
+ import { Tag, TagLabel, TagRightIcon } from '../tag'
4
+ import { Icon } from '../icon'
5
+ import { DragItemProps } from './types'
6
+
7
+ /**
8
+ * Default draggable item none other provided in SortableList and MultiSort.
9
+ * Renders a tag which can be used under the DragAndDrop context
10
+ * @see DragAndDrop
11
+ * @see SortableList
12
+ * @see MultiSort
13
+ * @see {@link https://northlight.dev/reference/drag-item}
14
+ *
15
+ * @example (Example)
16
+ * (?
17
+ * <DragItem itemLabel="Option 1" bgColor="bg.filled" />
18
+ * ?)
19
+ *
20
+ */
21
+ export const DragItem = forwardRef<HTMLSpanElement, DragItemProps>(({
22
+ size = 'md',
23
+ isDragging,
24
+ itemLabel = 'Drag Me',
25
+ bgColor,
26
+ ...rest
27
+ }, ref) => (
28
+ <Tag
29
+ ref={ ref }
30
+ cursor={ isDragging ? 'grabbing' : 'grab' }
31
+ bgColor={ bgColor || (isDragging ? 'blue.200' : undefined) }
32
+ size={ size }
33
+ minW="max-content"
34
+ { ...rest }
35
+ >
36
+ <TagLabel>{ itemLabel }</TagLabel>
37
+ <TagRightIcon>
38
+ <Icon as={ DotsMatrixSolid } />
39
+ </TagRightIcon>
40
+ </Tag>
41
+ )
42
+ )
@@ -0,0 +1,94 @@
1
+ import React, { cloneElement, isValidElement } from 'react'
2
+ import { useDraggable } from '@dnd-kit/core'
3
+ import { CSS } from '@dnd-kit/utilities'
4
+ import { Box } from '../box'
5
+ import { DraggableProps } from './types'
6
+ import { DragItem } from './drag-item'
7
+ import { ring } from '../../utils'
8
+
9
+ /**
10
+ * Will turn it's childen into a draggable component when under DragAndDrop context
11
+ * @see {@link https://northlight.dev/reference/draggable}
12
+ *
13
+ * @example (Example)
14
+ * ##Basic exapmle
15
+ * (?
16
+ * <DragAndDrop>
17
+ * <HStack>
18
+ * <Draggable id="random-id" />
19
+ * <Draggable />
20
+ * </HStack>
21
+ * </DragAndDrop>
22
+ * ?)
23
+ * <br />
24
+ * (Notice that the id prop is required)
25
+ *
26
+ * @example (Example)
27
+ * ## With custom children
28
+ *
29
+ * (?
30
+ * <DragAndDrop>
31
+ * <Box p="4">
32
+ * <Draggable id="random-id">
33
+ * <Center
34
+ * boxSize="3xs"
35
+ * boxShadow="xl"
36
+ * borderRadius="lg"
37
+ * bgColor="bg.overlayer"
38
+ * >I am draggable</Center>
39
+ * </Draggable>
40
+ * </Box>
41
+ *
42
+ * </DragAndDrop>
43
+ * ?)
44
+ *
45
+ *
46
+ */
47
+ export const Draggable = ({
48
+ itemLabel,
49
+ children,
50
+ disableDrag = false,
51
+ 'data-testid': dataTestId,
52
+ ...rest
53
+ }: DraggableProps) => {
54
+ const {
55
+ attributes,
56
+ listeners,
57
+ setNodeRef,
58
+ transform,
59
+ isDragging,
60
+ ...props
61
+ } = useDraggable({ ...rest })
62
+ if (!listeners) {
63
+ return (
64
+ <DragItem itemLabel={ itemLabel } />
65
+ )
66
+ }
67
+
68
+ const childrenWithDragCursor = isValidElement(children)
69
+ ? cloneElement(children as JSX.Element, {
70
+ cursor: isDragging ? 'grabbing' : 'grab',
71
+ })
72
+ : children
73
+
74
+ const dragEventListeners = !disableDrag && listeners
75
+
76
+ return (
77
+ <Box
78
+ ref={ setNodeRef }
79
+ { ...attributes }
80
+ transform={ CSS.Translate.toString(transform) }
81
+ _focusVisible={ ring }
82
+ tabIndex={ disableDrag ? -1 : 0 }
83
+ w="max-content"
84
+ data-testid={ dataTestId }
85
+ { ...dragEventListeners }
86
+ >
87
+ { typeof childrenWithDragCursor === 'function'
88
+ ? childrenWithDragCursor(listeners, props)
89
+ : childrenWithDragCursor || (
90
+ <DragItem isDragging={ isDragging } itemLabel={ itemLabel } />
91
+ ) }
92
+ </Box>
93
+ )
94
+ }
@@ -0,0 +1,32 @@
1
+ import React from 'react'
2
+ import { useMultiStyleConfig } from '@chakra-ui/react'
3
+ import { Stack } from '../stack'
4
+ import { Droppable } from './droppable'
5
+ import { DropZoneProps } from './types'
6
+
7
+ /**
8
+ * Prestyled droppable area to drop draggable components,
9
+ * you can override the styles of dropzone with sx prop
10
+ * @see Draggable
11
+ * @see Droppable
12
+ * @see DragAndDrop
13
+ * @see {@link https://northlight.dev/reference/drop-zone}
14
+ *
15
+ * @example (Example)
16
+ * ## You can drop draggable components
17
+ * (?
18
+ * <DragAndDrop>
19
+ * <DropZone name="random-id-2"><Draggable id="test"/></DropZone>
20
+ * </DragAndDrop>
21
+ * ?)
22
+ */
23
+ export const DropZone = ({ sx = {}, name, children, ...rest }: DropZoneProps) => {
24
+ const { dropZone } = useMultiStyleConfig('DragAndDrop', { sx })
25
+ return (
26
+ <Droppable id={ name }>
27
+ <Stack sx={ dropZone } { ...rest }>
28
+ { children }
29
+ </Stack>
30
+ </Droppable>
31
+ )
32
+ }
@@ -0,0 +1,58 @@
1
+ import React from 'react'
2
+ import { useDroppable } from '@dnd-kit/core'
3
+ import { Box } from '../box'
4
+ import { Center } from '../center'
5
+ import { DroppableProps } from './types'
6
+
7
+ /**
8
+ * Wrapper where you can style a container to place draggable elements
9
+ * @see DropZone
10
+ * @see Draggable
11
+ * @see DragAndDrop
12
+ * @see {@link https://northlight.dev/reference/droppable}
13
+ *
14
+ * @example (Example)
15
+ * ## Move the item into the container
16
+ * (?
17
+ * () => {
18
+ * const [ isDropped, setIsDropped ] = useState(false)
19
+ * const handleDragEnd = (e) => {
20
+ * setIsDropped(e.over && e.over.id === 'droppable')
21
+ * }
22
+ *
23
+ * return (
24
+ * <DragAndDrop onDragEnd={handleDragEnd}>
25
+ * <HStack>
26
+ * {!isDropped && <Draggable id="draggable" />}
27
+ * <Droppable id="droppable">
28
+ * <Center bgColor="bg.filled" boxSize="3xs">
29
+ * {isDropped ? <Draggable id="draggable"/> : <P>Drop here!</P>}
30
+ * </Center>
31
+ * </Droppable>
32
+ * </HStack>
33
+ *
34
+ * </DragAndDrop>
35
+ *
36
+ * )
37
+ *
38
+ *
39
+ * }
40
+ * ?)
41
+ *
42
+ */
43
+ export const Droppable = ({
44
+ children,
45
+ 'data-testid': testId,
46
+ ...rest
47
+ }: DroppableProps) => {
48
+ const { setNodeRef, ...props } = useDroppable({
49
+ ...rest,
50
+ })
51
+ return (
52
+ <Box ref={ setNodeRef } data-testid={ testId }>
53
+ { typeof children === 'function'
54
+ ? children(props)
55
+ : children || <Center>Drop here</Center> }
56
+ </Box>
57
+ )
58
+ }
@@ -0,0 +1,17 @@
1
+ export * from './drag-and-drop'
2
+ export * from './draggable'
3
+ export * from './droppable'
4
+ export * from './sortable'
5
+ export * from './sortable-item'
6
+ export * from './drag-item'
7
+ export * from './drag-handle'
8
+ export * from './drop-zone'
9
+ export * from './multi-sort'
10
+ export * from './sortable-list'
11
+ export * from './sortable-container'
12
+ export * from '@dnd-kit/core'
13
+ export * from '@dnd-kit/utilities'
14
+ export { useInterval as dndUseInterval } from '@dnd-kit/utilities'
15
+ export * from '@dnd-kit/modifiers'
16
+ export * from '@dnd-kit/sortable'
17
+ export * from './types'
@@ -0,0 +1,198 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ DragOverEvent,
4
+ KeyboardSensor,
5
+ PointerSensor,
6
+ UniqueIdentifier,
7
+ rectIntersection,
8
+ useSensor,
9
+ useSensors,
10
+ } from '@dnd-kit/core'
11
+ import { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable'
12
+ import { indexOf, insert, keys, remove } from 'ramda'
13
+ import { DragAndDrop } from './drag-and-drop'
14
+ import { MultiSortProps } from './types'
15
+
16
+ /**
17
+ * Util component for sorting items in two dimensions(container and order in container)
18
+ * @see SortableList
19
+ * @see DragAndDrop
20
+ * @see {@link https://northlight.dev/reference/multi-sort}
21
+ *
22
+ * @example
23
+ * (?
24
+ * () => {
25
+ const [ multiItems, setMultiItems ] = useState({
26
+ container1: [
27
+ 'JavaScript',
28
+ 'Python',
29
+ 'Front end',
30
+ 'Back end',
31
+ ],
32
+ container2: [ 'HTML', 'CSS' ],
33
+ container3: [ 'Chakra UI', 'Next.js', 'Tailwind UI' ],
34
+ })
35
+ return (
36
+ <Stack>
37
+ <MultiSort
38
+ items={ multiItems }
39
+ onChange={ (items) => setMultiItems(items) }
40
+ >
41
+ { (items, activeId) => (
42
+ <HStack alignItems="start">
43
+ <VStack>
44
+ <Heading size="sm">I like</Heading>
45
+ <DropZone name="container1">
46
+ <SortableContainer items={ items.container1 } />
47
+ </DropZone>
48
+ </VStack>
49
+ <VStack>
50
+ <Heading size="sm">I don't like</Heading>
51
+ <DropZone name="container2">
52
+ <SortableContainer items={ items.container2 } />
53
+ </DropZone>
54
+ </VStack>
55
+ <VStack>
56
+ <Heading size="sm">Neutral</Heading>
57
+ <DropZone name="container3">
58
+ <SortableContainer items={ items.container3 } />
59
+ </DropZone>
60
+ </VStack>
61
+ <DragOverlay>
62
+ { activeId ? (
63
+ <DragItem
64
+ itemLabel={ activeId }
65
+ isDragging={ true }
66
+ bgColor="background.tag.default"
67
+ />
68
+ ) : null }
69
+ </DragOverlay>
70
+ </HStack>
71
+ ) }
72
+ </MultiSort>
73
+ <Text>Controlled output: </Text>
74
+ <Code p={ 2 } borderRadius={ 4 }>
75
+ <pre>{ JSON.stringify(multiItems, null, 2) }</pre>
76
+ </Code>
77
+ </Stack>
78
+ )
79
+ * }
80
+ * ?)
81
+ * <br />
82
+ * Multisort abstracts logic away for setting up sortable items between multiple containers,
83
+ * you can then separate, or create and style this containers as you want,
84
+ * by putting them under <Droppable /> or a prestyled <Dropzone />
85
+
86
+ SortableContainer is a wrapper for a <Sortable /> with a sortable item
87
+ * */
88
+ export function MultiSort<itemKeys extends string | number | symbol> ({
89
+ items,
90
+ onChange = () => {},
91
+ children,
92
+ collisionDetection,
93
+ sensors,
94
+ }: MultiSortProps<itemKeys>) {
95
+ const [ activeItem, setActiveItem ] = useState<UniqueIdentifier | null>(null)
96
+
97
+ const moveBetweenContainers = (
98
+ activeContainerName: itemKeys,
99
+ activeIndex: number,
100
+ overContainerName: itemKeys,
101
+ overIndex: number,
102
+ item: string
103
+ ) => ({
104
+ ...items,
105
+ [activeContainerName]: remove(activeIndex, 1, items[activeContainerName]),
106
+ [overContainerName]: insert(overIndex, item, items[overContainerName]),
107
+ })
108
+
109
+ const customSensors = useSensors(
110
+ useSensor(PointerSensor),
111
+ useSensor(KeyboardSensor, {
112
+ coordinateGetter: sortableKeyboardCoordinates,
113
+ })
114
+ )
115
+
116
+ const findContainer = (id: string) =>
117
+ (id in items ? id : keys(items).find((key) => items[key].includes(id)))
118
+
119
+ const getContainers = (e: DragOverEvent) => {
120
+ const { active, over } = e
121
+ if (!over) return {}
122
+ const { id } = active
123
+ const { id: overId } = over
124
+
125
+ const activeContainerName = findContainer(id as string) as itemKeys
126
+ const overContainerName = findContainer(overId as string) as itemKeys
127
+ return { activeContainerName, overContainerName, id, overId, active }
128
+ }
129
+
130
+ const handleDragStart = (e: DragOverEvent) => {
131
+ const {
132
+ active: { id },
133
+ } = e
134
+ setActiveItem(id)
135
+ }
136
+
137
+ const handleDragOver = (e: DragOverEvent) => {
138
+ const { activeContainerName, overContainerName, id, overId } = getContainers(e)
139
+
140
+ if (
141
+ !(
142
+ !activeContainerName ||
143
+ !overContainerName ||
144
+ activeContainerName === overContainerName
145
+ )
146
+ ) {
147
+ const activeIndex = indexOf(id, items[activeContainerName])
148
+ const overIndex = indexOf(overId, items[overContainerName])
149
+ onChange(moveBetweenContainers(
150
+ activeContainerName,
151
+ activeIndex,
152
+ overContainerName,
153
+ overIndex,
154
+ id as string
155
+ ))
156
+ }
157
+ }
158
+
159
+ const handleDragEnd = (e: DragOverEvent) => {
160
+ const { activeContainerName, overContainerName, id, overId, active } = getContainers(e)
161
+
162
+ if (!activeContainerName || !overContainerName) return
163
+
164
+ const activeIndex = indexOf(id, items[activeContainerName])
165
+ const overIndex = indexOf(overId, items[overContainerName])
166
+
167
+ if (activeContainerName === overContainerName) {
168
+ onChange({
169
+ ...items,
170
+ [overContainerName]: arrayMove(
171
+ items[overContainerName],
172
+ activeIndex,
173
+ overIndex
174
+ ),
175
+ })
176
+ } else {
177
+ onChange(moveBetweenContainers(
178
+ activeContainerName,
179
+ activeIndex,
180
+ overContainerName,
181
+ overIndex,
182
+ active?.id as string
183
+ ))
184
+ }
185
+ }
186
+
187
+ return (
188
+ <DragAndDrop
189
+ sensors={ sensors || customSensors }
190
+ onDragStart={ handleDragStart }
191
+ onDragOver={ handleDragOver }
192
+ onDragEnd={ handleDragEnd }
193
+ collisionDetection={ collisionDetection || rectIntersection }
194
+ >
195
+ { typeof children === 'function' ? children(items, activeItem) : children }
196
+ </DragAndDrop>
197
+ )
198
+ }
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { rectSortingStrategy } from '@dnd-kit/sortable'
3
+ import { Sortable } from './sortable'
4
+ import { SortableItem } from './sortable-item'
5
+ import { SortableContainerProps } from './types'
6
+
7
+ /**
8
+ * Used with multi sort to render a sortable list inside a droppable
9
+ * @see MultiSort
10
+ * @see {@link https://northlight.dev/reference/sortable-container}
11
+ *
12
+ * @example
13
+ * (?
14
+ * <SortableContainer items={['item 1', 'item 2', 'item 3']} />
15
+ * ?)
16
+ *
17
+ */
18
+ export const SortableContainer = ({ children, items, strategy }: SortableContainerProps) => (
19
+ <Sortable items={ items } strategy={ strategy || rectSortingStrategy }>
20
+ { items.map((id) => (
21
+ <SortableItem key={ id } id={ id } itemLabel={ id }>
22
+ { typeof children === 'function' ? children(id) : children }
23
+ </SortableItem>
24
+ )) }
25
+ </Sortable>
26
+ )