erp-pro-ui 0.2.4 → 0.2.6

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 (413) hide show
  1. package/dist/accordion.cjs +1 -1
  2. package/dist/accordion.mjs +1 -1
  3. package/dist/alert.cjs +1 -1
  4. package/dist/alert.mjs +1 -1
  5. package/dist/animated-content.cjs +1 -1
  6. package/dist/animated-content.mjs +1 -1
  7. package/dist/ascii-text.cjs +1 -1
  8. package/dist/ascii-text.mjs +1 -1
  9. package/dist/background-gradient-animation.cjs +1 -1
  10. package/dist/background-gradient-animation.mjs +1 -1
  11. package/dist/button-hover-border-gradient.cjs +1 -1
  12. package/dist/button-hover-border-gradient.mjs +1 -1
  13. package/dist/button.cjs +1 -1
  14. package/dist/button.mjs +1 -1
  15. package/dist/calendar.cjs +1 -1
  16. package/dist/calendar.mjs +1 -1
  17. package/dist/card.cjs +1 -1
  18. package/dist/card.mjs +1 -1
  19. package/dist/carousel.cjs +1 -1
  20. package/dist/carousel.mjs +1 -1
  21. package/dist/catalog.cjs +14 -0
  22. package/dist/catalog.cjs.map +1 -1
  23. package/dist/catalog.d.ts +25 -1
  24. package/dist/catalog.d.ts.map +1 -1
  25. package/dist/catalog.mjs +14 -0
  26. package/dist/catalog.mjs.map +1 -1
  27. package/dist/charts.cjs +1 -1
  28. package/dist/charts.mjs +1 -1
  29. package/dist/checkbox.cjs +1 -1
  30. package/dist/checkbox.mjs +1 -1
  31. package/dist/chip.cjs +1 -1
  32. package/dist/chip.mjs +1 -1
  33. package/dist/chroma-grid.cjs +1 -1
  34. package/dist/chroma-grid.mjs +1 -1
  35. package/dist/chunks/{drawer-D07dGN6R.cjs → Drawer-D72Xi2Gq.cjs} +2 -2
  36. package/dist/chunks/{drawer-D07dGN6R.cjs.map → Drawer-D72Xi2Gq.cjs.map} +1 -1
  37. package/dist/chunks/{drawer-DaoAXL-w.mjs → Drawer-Y0_sJni5.mjs} +2 -2
  38. package/dist/chunks/{drawer-DaoAXL-w.mjs.map → Drawer-Y0_sJni5.mjs.map} +1 -1
  39. package/dist/chunks/{DropdownMenu-BtTOri-A.mjs → DropdownMenu-BQ4WlaGp.mjs} +1 -1
  40. package/dist/chunks/{DropdownMenu-BtTOri-A.mjs.map → DropdownMenu-BQ4WlaGp.mjs.map} +1 -1
  41. package/dist/chunks/{DropdownMenu-BDrNYO-D.cjs → DropdownMenu-yh04burS.cjs} +1 -1
  42. package/dist/chunks/{DropdownMenu-BDrNYO-D.cjs.map → DropdownMenu-yh04burS.cjs.map} +1 -1
  43. package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs +51 -0
  44. package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs.map +1 -0
  45. package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs +45 -0
  46. package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs.map +1 -0
  47. package/dist/chunks/{HoverBorderGradient-NbdXeLgC.mjs → HoverBorderGradient-DEtm3owk.mjs} +1 -1
  48. package/dist/chunks/{HoverBorderGradient-NbdXeLgC.mjs.map → HoverBorderGradient-DEtm3owk.mjs.map} +1 -1
  49. package/dist/chunks/{HoverBorderGradient-9pfvBoHR.cjs → HoverBorderGradient-DMMyr2L3.cjs} +1 -1
  50. package/dist/chunks/{HoverBorderGradient-9pfvBoHR.cjs.map → HoverBorderGradient-DMMyr2L3.cjs.map} +1 -1
  51. package/dist/chunks/{SunToMoonButton-BkEfkElJ.mjs → SunToMoonButton-BOKHzC1H.mjs} +1 -1
  52. package/dist/chunks/{SunToMoonButton-BkEfkElJ.mjs.map → SunToMoonButton-BOKHzC1H.mjs.map} +1 -1
  53. package/dist/chunks/{SunToMoonButton-jS4BJD9q.cjs → SunToMoonButton-gX4Kk_5B.cjs} +1 -1
  54. package/dist/chunks/{SunToMoonButton-jS4BJD9q.cjs.map → SunToMoonButton-gX4Kk_5B.cjs.map} +1 -1
  55. package/dist/chunks/{Tooltip-DK3B879v.mjs → Tooltip-LbOKP__2.mjs} +10 -7
  56. package/dist/chunks/Tooltip-LbOKP__2.mjs.map +1 -0
  57. package/dist/chunks/{Tooltip-DD30yj3A.cjs → Tooltip-nnaiqJTT.cjs} +10 -7
  58. package/dist/chunks/Tooltip-nnaiqJTT.cjs.map +1 -0
  59. package/dist/chunks/{accordion-CmB6EidC.cjs → accordion-Bj3Sj0mC.cjs} +2 -2
  60. package/dist/chunks/{accordion-CmB6EidC.cjs.map → accordion-Bj3Sj0mC.cjs.map} +1 -1
  61. package/dist/chunks/{accordion-6zxJUYXr.mjs → accordion-CLcjNX_X.mjs} +2 -2
  62. package/dist/chunks/{accordion-6zxJUYXr.mjs.map → accordion-CLcjNX_X.mjs.map} +1 -1
  63. package/dist/chunks/{alert-C5KEeQqh.cjs → alert-BBA4Sh4e.cjs} +2 -2
  64. package/dist/chunks/{alert-C5KEeQqh.cjs.map → alert-BBA4Sh4e.cjs.map} +1 -1
  65. package/dist/chunks/{alert-XVmYJgds.mjs → alert-oUz79MGc.mjs} +2 -2
  66. package/dist/chunks/{alert-XVmYJgds.mjs.map → alert-oUz79MGc.mjs.map} +1 -1
  67. package/dist/chunks/{animated-content-CLsFnjgr.cjs → animated-content-B3wbiWQI.cjs} +1 -1
  68. package/dist/chunks/{animated-content-CLsFnjgr.cjs.map → animated-content-B3wbiWQI.cjs.map} +1 -1
  69. package/dist/chunks/{animated-content-bK6xp-vc.mjs → animated-content-CiNJLgbq.mjs} +1 -1
  70. package/dist/chunks/{animated-content-bK6xp-vc.mjs.map → animated-content-CiNJLgbq.mjs.map} +1 -1
  71. package/dist/chunks/{ascii-text-Bdy4C5rU.mjs → ascii-text-C6JegLhP.mjs} +1 -1
  72. package/dist/chunks/{ascii-text-Bdy4C5rU.mjs.map → ascii-text-C6JegLhP.mjs.map} +1 -1
  73. package/dist/chunks/{ascii-text-BFnpVur6.cjs → ascii-text-KwVE41Hw.cjs} +1 -1
  74. package/dist/chunks/{ascii-text-BFnpVur6.cjs.map → ascii-text-KwVE41Hw.cjs.map} +1 -1
  75. package/dist/chunks/{background-gradient-animation-CiNdmA61.cjs → background-gradient-animation-1LZY3DYT.cjs} +1 -1
  76. package/dist/chunks/{background-gradient-animation-CiNdmA61.cjs.map → background-gradient-animation-1LZY3DYT.cjs.map} +1 -1
  77. package/dist/chunks/{background-gradient-animation-BR9wx6Z8.mjs → background-gradient-animation-CTc2ZR74.mjs} +1 -1
  78. package/dist/chunks/{background-gradient-animation-BR9wx6Z8.mjs.map → background-gradient-animation-CTc2ZR74.mjs.map} +1 -1
  79. package/dist/chunks/{button-A6UTvrOu.mjs → button-IDShmQqA.mjs} +3 -2
  80. package/dist/chunks/button-IDShmQqA.mjs.map +1 -0
  81. package/dist/chunks/{button-hover-border-gradient-DnFvjNNw.mjs → button-hover-border-gradient-B2ebbDek.mjs} +2 -2
  82. package/dist/chunks/{button-hover-border-gradient-DnFvjNNw.mjs.map → button-hover-border-gradient-B2ebbDek.mjs.map} +1 -1
  83. package/dist/chunks/{button-hover-border-gradient-ssmwU5-U.cjs → button-hover-border-gradient-DGZqd8je.cjs} +2 -2
  84. package/dist/chunks/{button-hover-border-gradient-ssmwU5-U.cjs.map → button-hover-border-gradient-DGZqd8je.cjs.map} +1 -1
  85. package/dist/chunks/{button-C4MXPxsC.cjs → button-uD87K76W.cjs} +3 -2
  86. package/dist/chunks/button-uD87K76W.cjs.map +1 -0
  87. package/dist/chunks/{calendar-CQJgQ5H_.cjs → calendar-DCkikZYb.cjs} +2 -2
  88. package/dist/chunks/{calendar-CQJgQ5H_.cjs.map → calendar-DCkikZYb.cjs.map} +1 -1
  89. package/dist/chunks/{calendar-5XzPqKbE.mjs → calendar-FxAmm_ao.mjs} +2 -2
  90. package/dist/chunks/{calendar-5XzPqKbE.mjs.map → calendar-FxAmm_ao.mjs.map} +1 -1
  91. package/dist/chunks/{card-RrT68nvu.cjs → card-Cuud0jIt.cjs} +1 -1
  92. package/dist/chunks/{card-RrT68nvu.cjs.map → card-Cuud0jIt.cjs.map} +1 -1
  93. package/dist/chunks/{card-BId1_zHw.mjs → card-DNeC6jqk.mjs} +1 -1
  94. package/dist/chunks/{card-BId1_zHw.mjs.map → card-DNeC6jqk.mjs.map} +1 -1
  95. package/dist/chunks/{carousel-Dd4rp-jr.mjs → carousel-Dpe5QLJK.mjs} +2 -2
  96. package/dist/chunks/{carousel-Dd4rp-jr.mjs.map → carousel-Dpe5QLJK.mjs.map} +1 -1
  97. package/dist/chunks/{carousel-Cv0m1Pp5.cjs → carousel-xHkrV_pt.cjs} +2 -2
  98. package/dist/chunks/{carousel-Cv0m1Pp5.cjs.map → carousel-xHkrV_pt.cjs.map} +1 -1
  99. package/dist/chunks/chartStyles-BADmRKZo.cjs +108 -0
  100. package/dist/chunks/chartStyles-BADmRKZo.cjs.map +1 -0
  101. package/dist/chunks/chartStyles-DPXgYmGn.mjs +55 -0
  102. package/dist/chunks/chartStyles-DPXgYmGn.mjs.map +1 -0
  103. package/dist/chunks/{charts-DkVu0rFc.mjs → charts-C-KQ3Nk5.mjs} +3 -54
  104. package/dist/chunks/charts-C-KQ3Nk5.mjs.map +1 -0
  105. package/dist/chunks/{charts-BmIV-mJy.cjs → charts-COx3IbI2.cjs} +42 -93
  106. package/dist/chunks/charts-COx3IbI2.cjs.map +1 -0
  107. package/dist/chunks/{checkbox-D8ivRZ1x.cjs → checkbox-CDknzh89.cjs} +1 -1
  108. package/dist/chunks/{checkbox-D8ivRZ1x.cjs.map → checkbox-CDknzh89.cjs.map} +1 -1
  109. package/dist/chunks/{checkbox-3aB7XC9_.mjs → checkbox-Y04NlzB8.mjs} +1 -1
  110. package/dist/chunks/{checkbox-3aB7XC9_.mjs.map → checkbox-Y04NlzB8.mjs.map} +1 -1
  111. package/dist/chunks/{chip-CqcdcSs2.mjs → chip-B3j6R6sO.mjs} +3 -3
  112. package/dist/chunks/{chip-CqcdcSs2.mjs.map → chip-B3j6R6sO.mjs.map} +1 -1
  113. package/dist/chunks/{chip-B0YzBwkz.cjs → chip-sfQlzrbo.cjs} +3 -3
  114. package/dist/chunks/{chip-B0YzBwkz.cjs.map → chip-sfQlzrbo.cjs.map} +1 -1
  115. package/dist/chunks/{chroma-grid-opB2DBtS.mjs → chroma-grid-BHS9qAn_.mjs} +1 -1
  116. package/dist/chunks/{chroma-grid-opB2DBtS.mjs.map → chroma-grid-BHS9qAn_.mjs.map} +1 -1
  117. package/dist/chunks/{chroma-grid-DcZ9f4Ui.cjs → chroma-grid-Bp55pKEm.cjs} +1 -1
  118. package/dist/chunks/{chroma-grid-DcZ9f4Ui.cjs.map → chroma-grid-Bp55pKEm.cjs.map} +1 -1
  119. package/dist/chunks/{color-palette-C3lesasJ.mjs → color-palette-D9Qlw2Cx.mjs} +1 -1
  120. package/dist/chunks/{color-palette-C3lesasJ.mjs.map → color-palette-D9Qlw2Cx.mjs.map} +1 -1
  121. package/dist/chunks/{color-palette-pLh6En3n.cjs → color-palette-Duud5Iqq.cjs} +1 -1
  122. package/dist/chunks/{color-palette-pLh6En3n.cjs.map → color-palette-Duud5Iqq.cjs.map} +1 -1
  123. package/dist/chunks/{combobox-CtNrGmuR.cjs → combobox-C3a2iogC.cjs} +4 -4
  124. package/dist/chunks/{combobox-CtNrGmuR.cjs.map → combobox-C3a2iogC.cjs.map} +1 -1
  125. package/dist/chunks/{combobox-B6yk5U82.mjs → combobox-neBItbtz.mjs} +4 -4
  126. package/dist/chunks/{combobox-B6yk5U82.mjs.map → combobox-neBItbtz.mjs.map} +1 -1
  127. package/dist/chunks/dashboard-cards-BnPt0gDW.mjs +2428 -0
  128. package/dist/chunks/dashboard-cards-BnPt0gDW.mjs.map +1 -0
  129. package/dist/chunks/dashboard-cards-DNWJPKRu.cjs +2524 -0
  130. package/dist/chunks/dashboard-cards-DNWJPKRu.cjs.map +1 -0
  131. package/dist/chunks/{data-table-fAEuevPn.cjs → data-table-BZEiSZI2.cjs} +48 -36
  132. package/dist/chunks/data-table-BZEiSZI2.cjs.map +1 -0
  133. package/dist/chunks/{data-table-Dtf6lKpp.mjs → data-table-EfGKkerd.mjs} +47 -35
  134. package/dist/chunks/data-table-EfGKkerd.mjs.map +1 -0
  135. package/dist/chunks/{date-picker-BmQ0rgwH.mjs → date-picker-3IDSmb9Z.mjs} +3 -3
  136. package/dist/chunks/{date-picker-BmQ0rgwH.mjs.map → date-picker-3IDSmb9Z.mjs.map} +1 -1
  137. package/dist/chunks/{date-picker-qpUZMtZC.cjs → date-picker-_EVYpGga.cjs} +3 -3
  138. package/dist/chunks/{date-picker-qpUZMtZC.cjs.map → date-picker-_EVYpGga.cjs.map} +1 -1
  139. package/dist/chunks/{dialog-DSyq6MS3.mjs → dialog-B60BjJz0.mjs} +3 -3
  140. package/dist/chunks/{dialog-DSyq6MS3.mjs.map → dialog-B60BjJz0.mjs.map} +1 -1
  141. package/dist/chunks/{dialog-J2ZTSTpL.cjs → dialog-i9LdkXmF.cjs} +3 -3
  142. package/dist/chunks/{dialog-J2ZTSTpL.cjs.map → dialog-i9LdkXmF.cjs.map} +1 -1
  143. package/dist/chunks/event-calendar-BbFOUDov.mjs +1191 -0
  144. package/dist/chunks/event-calendar-BbFOUDov.mjs.map +1 -0
  145. package/dist/chunks/event-calendar-Bljd_7PI.cjs +1209 -0
  146. package/dist/chunks/event-calendar-Bljd_7PI.cjs.map +1 -0
  147. package/dist/chunks/{form-CtZ6U-_B.mjs → form-CDc9UM3r.mjs} +1 -1
  148. package/dist/chunks/{form-CtZ6U-_B.mjs.map → form-CDc9UM3r.mjs.map} +1 -1
  149. package/dist/chunks/{form-X6Vyaavl.cjs → form-DGwdlSW2.cjs} +1 -1
  150. package/dist/chunks/{form-X6Vyaavl.cjs.map → form-DGwdlSW2.cjs.map} +1 -1
  151. package/dist/chunks/{gradual-blur-C6NOnjTw.cjs → gradual-blur-BNYVlqb1.cjs} +1 -1
  152. package/dist/chunks/{gradual-blur-C6NOnjTw.cjs.map → gradual-blur-BNYVlqb1.cjs.map} +1 -1
  153. package/dist/chunks/{gradual-blur-DXfxpCdB.mjs → gradual-blur-Bw2KNmXb.mjs} +1 -1
  154. package/dist/chunks/{gradual-blur-DXfxpCdB.mjs.map → gradual-blur-Bw2KNmXb.mjs.map} +1 -1
  155. package/dist/chunks/{hover-card--rplmsA_.cjs → hover-card-Dp6Y2h2J.cjs} +1 -1
  156. package/dist/chunks/{hover-card--rplmsA_.cjs.map → hover-card-Dp6Y2h2J.cjs.map} +1 -1
  157. package/dist/chunks/{hover-card-C88rU-nW.mjs → hover-card-G66SUyjq.mjs} +1 -1
  158. package/dist/chunks/{hover-card-C88rU-nW.mjs.map → hover-card-G66SUyjq.mjs.map} +1 -1
  159. package/dist/chunks/{icons-bx3nrxNv.mjs → icons-JzMKLygv.mjs} +2 -43
  160. package/dist/chunks/icons-JzMKLygv.mjs.map +1 -0
  161. package/dist/chunks/{icons-CRanVZB1.cjs → icons-ub9iu-JG.cjs} +1 -48
  162. package/dist/chunks/icons-ub9iu-JG.cjs.map +1 -0
  163. package/dist/chunks/{input-Bqo9Q5zF.mjs → input-CRc3MKb_.mjs} +3 -3
  164. package/dist/chunks/{input-Bqo9Q5zF.mjs.map → input-CRc3MKb_.mjs.map} +1 -1
  165. package/dist/chunks/{input-DkCPyWXi.cjs → input-DMTwz27q.cjs} +3 -3
  166. package/dist/chunks/{input-DkCPyWXi.cjs.map → input-DMTwz27q.cjs.map} +1 -1
  167. package/dist/chunks/{label-BKzqfAAq.cjs → label-B5Ugq0Nk.cjs} +1 -1
  168. package/dist/chunks/{label-BKzqfAAq.cjs.map → label-B5Ugq0Nk.cjs.map} +1 -1
  169. package/dist/chunks/{label-Drxg0cG2.mjs → label-Bc_r54NU.mjs} +1 -1
  170. package/dist/chunks/{label-Drxg0cG2.mjs.map → label-Bc_r54NU.mjs.map} +1 -1
  171. package/dist/chunks/{loading-BiM4mKh6.cjs → loading-DZKJc3e7.cjs} +2 -2
  172. package/dist/chunks/{loading-BiM4mKh6.cjs.map → loading-DZKJc3e7.cjs.map} +1 -1
  173. package/dist/chunks/{loading-Dtosnb4A.mjs → loading-ll2L6lc7.mjs} +2 -2
  174. package/dist/chunks/{loading-Dtosnb4A.mjs.map → loading-ll2L6lc7.mjs.map} +1 -1
  175. package/dist/chunks/{multi-select-combobox-C0DoDzxQ.cjs → multi-select-combobox-CFJGq1hn.cjs} +3 -3
  176. package/dist/chunks/{multi-select-combobox-C0DoDzxQ.cjs.map → multi-select-combobox-CFJGq1hn.cjs.map} +1 -1
  177. package/dist/chunks/{multi-select-combobox-Do23ZfOQ.mjs → multi-select-combobox-C_8sxaiL.mjs} +3 -3
  178. package/dist/chunks/{multi-select-combobox-Do23ZfOQ.mjs.map → multi-select-combobox-C_8sxaiL.mjs.map} +1 -1
  179. package/dist/chunks/{otp-input-CkhV-sGl.cjs → otp-input-B5-tuc0q.cjs} +1 -1
  180. package/dist/chunks/{otp-input-CkhV-sGl.cjs.map → otp-input-B5-tuc0q.cjs.map} +1 -1
  181. package/dist/chunks/{otp-input-JOysxKfD.mjs → otp-input-BpcTJOmU.mjs} +1 -1
  182. package/dist/chunks/{otp-input-JOysxKfD.mjs.map → otp-input-BpcTJOmU.mjs.map} +1 -1
  183. package/dist/chunks/{overlay-BzkUmjQ-.mjs → overlay-CG1dMYtO.mjs} +1 -1
  184. package/dist/chunks/{overlay-BzkUmjQ-.mjs.map → overlay-CG1dMYtO.mjs.map} +1 -1
  185. package/dist/chunks/{overlay-DNnZywyR.cjs → overlay-DzE_GyYf.cjs} +1 -1
  186. package/dist/chunks/{overlay-DNnZywyR.cjs.map → overlay-DzE_GyYf.cjs.map} +1 -1
  187. package/dist/chunks/{password-strength-meter-BsvqQBAg.mjs → password-strength-meter-CH6uQAuK.mjs} +2 -2
  188. package/dist/chunks/{password-strength-meter-BsvqQBAg.mjs.map → password-strength-meter-CH6uQAuK.mjs.map} +1 -1
  189. package/dist/chunks/{password-strength-meter-DCi_BP7e.cjs → password-strength-meter-_o1T1HLO.cjs} +2 -2
  190. package/dist/chunks/{password-strength-meter-DCi_BP7e.cjs.map → password-strength-meter-_o1T1HLO.cjs.map} +1 -1
  191. package/dist/chunks/{progress-bar-DQ5ZKk2Y.mjs → progress-bar-BAvRSW1b.mjs} +1 -1
  192. package/dist/chunks/{progress-bar-DQ5ZKk2Y.mjs.map → progress-bar-BAvRSW1b.mjs.map} +1 -1
  193. package/dist/chunks/{progress-bar-CYaBO_lS.cjs → progress-bar-FfdFVvTT.cjs} +1 -1
  194. package/dist/chunks/{progress-bar-CYaBO_lS.cjs.map → progress-bar-FfdFVvTT.cjs.map} +1 -1
  195. package/dist/chunks/{radio-CuiM_gDv.mjs → radio-BMOnxnUS.mjs} +1 -1
  196. package/dist/chunks/{radio-CuiM_gDv.mjs.map → radio-BMOnxnUS.mjs.map} +1 -1
  197. package/dist/chunks/{radio-zx9xEW_C.cjs → radio-wagafWwx.cjs} +1 -1
  198. package/dist/chunks/{radio-zx9xEW_C.cjs.map → radio-wagafWwx.cjs.map} +1 -1
  199. package/dist/chunks/{select-CUaSNR09.mjs → select--DeSgPdn.mjs} +4 -4
  200. package/dist/chunks/{select-CUaSNR09.mjs.map → select--DeSgPdn.mjs.map} +1 -1
  201. package/dist/chunks/{select-bZ9WqLOc.cjs → select-zFFyNmlY.cjs} +4 -4
  202. package/dist/chunks/{select-bZ9WqLOc.cjs.map → select-zFFyNmlY.cjs.map} +1 -1
  203. package/dist/chunks/{sidebar-Kkr45nuN.cjs → sidebar-Cq7UbKJT.cjs} +18 -21
  204. package/dist/chunks/sidebar-Cq7UbKJT.cjs.map +1 -0
  205. package/dist/chunks/{sidebar-DYEDFV2u.mjs → sidebar-oemmRzCL.mjs} +18 -21
  206. package/dist/chunks/sidebar-oemmRzCL.mjs.map +1 -0
  207. package/dist/chunks/{skeleton-nH1eAN96.mjs → skeleton-BsDMlWZG.mjs} +1 -1
  208. package/dist/chunks/{skeleton-nH1eAN96.mjs.map → skeleton-BsDMlWZG.mjs.map} +1 -1
  209. package/dist/chunks/{skeleton-DCBGLNAZ.cjs → skeleton-DWvVc17T.cjs} +1 -1
  210. package/dist/chunks/{skeleton-DCBGLNAZ.cjs.map → skeleton-DWvVc17T.cjs.map} +1 -1
  211. package/dist/chunks/{spinners-C9acUulz.cjs → spinners-DBAJliAj.cjs} +2 -2
  212. package/dist/chunks/{spinners-C9acUulz.cjs.map → spinners-DBAJliAj.cjs.map} +1 -1
  213. package/dist/chunks/{spinners-g6_Up5Rb.mjs → spinners-DlMcokJa.mjs} +2 -2
  214. package/dist/chunks/{spinners-g6_Up5Rb.mjs.map → spinners-DlMcokJa.mjs.map} +1 -1
  215. package/dist/chunks/{splash-cursor-N4FdnkOa.mjs → splash-cursor-Bb7LSzaO.mjs} +1 -1
  216. package/dist/chunks/{splash-cursor-N4FdnkOa.mjs.map → splash-cursor-Bb7LSzaO.mjs.map} +1 -1
  217. package/dist/chunks/{splash-cursor-BqG7ClsJ.cjs → splash-cursor-CQ6_HwHV.cjs} +1 -1
  218. package/dist/chunks/{splash-cursor-BqG7ClsJ.cjs.map → splash-cursor-CQ6_HwHV.cjs.map} +1 -1
  219. package/dist/chunks/{spotlight-card-D9Z3nTmb.mjs → spotlight-card-Bs0iiSLc.mjs} +1 -1
  220. package/dist/chunks/{spotlight-card-D9Z3nTmb.mjs.map → spotlight-card-Bs0iiSLc.mjs.map} +1 -1
  221. package/dist/chunks/{spotlight-card-BmsqC7wm.cjs → spotlight-card-COfSD7ns.cjs} +1 -1
  222. package/dist/chunks/{spotlight-card-BmsqC7wm.cjs.map → spotlight-card-COfSD7ns.cjs.map} +1 -1
  223. package/dist/chunks/{stepper-Jv5OS1nY.mjs → stepper-B9NdZ6ZV.mjs} +4 -4
  224. package/dist/chunks/{stepper-Jv5OS1nY.mjs.map → stepper-B9NdZ6ZV.mjs.map} +1 -1
  225. package/dist/chunks/{stepper-DepvEGfr.cjs → stepper-CTteR-Kj.cjs} +4 -4
  226. package/dist/chunks/{stepper-DepvEGfr.cjs.map → stepper-CTteR-Kj.cjs.map} +1 -1
  227. package/dist/chunks/{sun-to-moon-button-BJtBEaa3.mjs → sun-to-moon-button-DWHDpP5B.mjs} +2 -2
  228. package/dist/chunks/{sun-to-moon-button-BJtBEaa3.mjs.map → sun-to-moon-button-DWHDpP5B.mjs.map} +1 -1
  229. package/dist/chunks/{sun-to-moon-button-PwgTPsTW.cjs → sun-to-moon-button-lt-1vmWm.cjs} +2 -2
  230. package/dist/chunks/{sun-to-moon-button-PwgTPsTW.cjs.map → sun-to-moon-button-lt-1vmWm.cjs.map} +1 -1
  231. package/dist/chunks/{switch-iPsN1NS2.mjs → switch--68scepb.mjs} +1 -1
  232. package/dist/chunks/{switch-iPsN1NS2.mjs.map → switch--68scepb.mjs.map} +1 -1
  233. package/dist/chunks/{switch-X3l8xnle.cjs → switch-BbFl5b4t.cjs} +1 -1
  234. package/dist/chunks/{switch-X3l8xnle.cjs.map → switch-BbFl5b4t.cjs.map} +1 -1
  235. package/dist/chunks/{textarea-Bdo-Trvi.mjs → textarea-CEj9voUJ.mjs} +1 -1
  236. package/dist/chunks/{textarea-Bdo-Trvi.mjs.map → textarea-CEj9voUJ.mjs.map} +1 -1
  237. package/dist/chunks/{textarea-CGRl2hrM.cjs → textarea-U_JeSWI3.cjs} +1 -1
  238. package/dist/chunks/{textarea-CGRl2hrM.cjs.map → textarea-U_JeSWI3.cjs.map} +1 -1
  239. package/dist/chunks/{toast-DiFgv3IL.cjs → toast-2yq4Q7-q.cjs} +2 -2
  240. package/dist/chunks/{toast-DiFgv3IL.cjs.map → toast-2yq4Q7-q.cjs.map} +1 -1
  241. package/dist/chunks/{toast-BcBidy5n.mjs → toast-CyY8VZN7.mjs} +2 -2
  242. package/dist/chunks/{toast-BcBidy5n.mjs.map → toast-CyY8VZN7.mjs.map} +1 -1
  243. package/dist/chunks/{truncated-text-BIXqNfOL.cjs → truncated-text-CswjmrHZ.cjs} +1 -1
  244. package/dist/chunks/{truncated-text-BIXqNfOL.cjs.map → truncated-text-CswjmrHZ.cjs.map} +1 -1
  245. package/dist/chunks/{truncated-text-C9t9o9IA.mjs → truncated-text-DUYTW1KP.mjs} +1 -1
  246. package/dist/chunks/{truncated-text-C9t9o9IA.mjs.map → truncated-text-DUYTW1KP.mjs.map} +1 -1
  247. package/dist/chunks/{typography-LwwY_MOy.cjs → typography-CFIiYk1d.cjs} +1 -1
  248. package/dist/chunks/{typography-LwwY_MOy.cjs.map → typography-CFIiYk1d.cjs.map} +1 -1
  249. package/dist/chunks/{typography-Ct-jDJP3.mjs → typography-DHE9sUZ8.mjs} +1 -1
  250. package/dist/chunks/{typography-Ct-jDJP3.mjs.map → typography-DHE9sUZ8.mjs.map} +1 -1
  251. package/dist/color-palette.cjs +1 -1
  252. package/dist/color-palette.mjs +1 -1
  253. package/dist/combobox.cjs +1 -1
  254. package/dist/combobox.mjs +1 -1
  255. package/dist/components/data-display/charts/chartPalette.d.ts +1 -1
  256. package/dist/components/data-display/dashboard-cards/DeviceSalesCard.d.ts +25 -0
  257. package/dist/components/data-display/dashboard-cards/DeviceSalesCard.d.ts.map +1 -0
  258. package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts +34 -0
  259. package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts.map +1 -0
  260. package/dist/components/data-display/dashboard-cards/EarningsCard.d.ts +43 -0
  261. package/dist/components/data-display/dashboard-cards/EarningsCard.d.ts.map +1 -0
  262. package/dist/components/data-display/dashboard-cards/ExpensesCard.d.ts +26 -0
  263. package/dist/components/data-display/dashboard-cards/ExpensesCard.d.ts.map +1 -0
  264. package/dist/components/data-display/dashboard-cards/IncomeExpenseCard.d.ts +30 -0
  265. package/dist/components/data-display/dashboard-cards/IncomeExpenseCard.d.ts.map +1 -0
  266. package/dist/components/data-display/dashboard-cards/RevenueGrowthCard.d.ts +26 -0
  267. package/dist/components/data-display/dashboard-cards/RevenueGrowthCard.d.ts.map +1 -0
  268. package/dist/components/data-display/dashboard-cards/SalesOverviewCard.d.ts +33 -0
  269. package/dist/components/data-display/dashboard-cards/SalesOverviewCard.d.ts.map +1 -0
  270. package/dist/components/data-display/dashboard-cards/ShipmentStatisticsCard.d.ts +33 -0
  271. package/dist/components/data-display/dashboard-cards/ShipmentStatisticsCard.d.ts.map +1 -0
  272. package/dist/components/data-display/dashboard-cards/StockAvailabilityCard.d.ts +24 -0
  273. package/dist/components/data-display/dashboard-cards/StockAvailabilityCard.d.ts.map +1 -0
  274. package/dist/components/data-display/dashboard-cards/SupportTrackerCard.d.ts +25 -0
  275. package/dist/components/data-display/dashboard-cards/SupportTrackerCard.d.ts.map +1 -0
  276. package/dist/components/data-display/dashboard-cards/TopicsCard.d.ts +18 -0
  277. package/dist/components/data-display/dashboard-cards/TopicsCard.d.ts.map +1 -0
  278. package/dist/components/data-display/dashboard-cards/VehicleConditionCard.d.ts +20 -0
  279. package/dist/components/data-display/dashboard-cards/VehicleConditionCard.d.ts.map +1 -0
  280. package/dist/components/data-display/dashboard-cards/VehiclesOverviewCard.d.ts +21 -0
  281. package/dist/components/data-display/dashboard-cards/VehiclesOverviewCard.d.ts.map +1 -0
  282. package/dist/components/data-display/dashboard-cards/index.d.ts +26 -0
  283. package/dist/components/data-display/dashboard-cards/index.d.ts.map +1 -1
  284. package/dist/components/data-display/data-table/DataTable.d.ts.map +1 -1
  285. package/dist/components/data-display/data-table/DataTableControls.d.ts.map +1 -1
  286. package/dist/components/data-display/event-calendar/AddEventPanel.d.ts +11 -0
  287. package/dist/components/data-display/event-calendar/AddEventPanel.d.ts.map +1 -0
  288. package/dist/components/data-display/event-calendar/CalendarHeader.d.ts +13 -0
  289. package/dist/components/data-display/event-calendar/CalendarHeader.d.ts.map +1 -0
  290. package/dist/components/data-display/event-calendar/CalendarSidebar.d.ts +13 -0
  291. package/dist/components/data-display/event-calendar/CalendarSidebar.d.ts.map +1 -0
  292. package/dist/components/data-display/event-calendar/EventCalendar.d.ts +3 -0
  293. package/dist/components/data-display/event-calendar/EventCalendar.d.ts.map +1 -0
  294. package/dist/components/data-display/event-calendar/EventDetailDrawer.d.ts +10 -0
  295. package/dist/components/data-display/event-calendar/EventDetailDrawer.d.ts.map +1 -0
  296. package/dist/components/data-display/event-calendar/EventFilterList.d.ts +9 -0
  297. package/dist/components/data-display/event-calendar/EventFilterList.d.ts.map +1 -0
  298. package/dist/components/data-display/event-calendar/EventPill.d.ts +10 -0
  299. package/dist/components/data-display/event-calendar/EventPill.d.ts.map +1 -0
  300. package/dist/components/data-display/event-calendar/MiniCalendarPicker.d.ts +9 -0
  301. package/dist/components/data-display/event-calendar/MiniCalendarPicker.d.ts.map +1 -0
  302. package/dist/components/data-display/event-calendar/calendarUtils.d.ts +27 -0
  303. package/dist/components/data-display/event-calendar/calendarUtils.d.ts.map +1 -0
  304. package/dist/components/data-display/event-calendar/index.d.ts +4 -0
  305. package/dist/components/data-display/event-calendar/index.d.ts.map +1 -0
  306. package/dist/components/data-display/event-calendar/types.d.ts +52 -0
  307. package/dist/components/data-display/event-calendar/types.d.ts.map +1 -0
  308. package/dist/components/data-display/event-calendar/views/DayView.d.ts +10 -0
  309. package/dist/components/data-display/event-calendar/views/DayView.d.ts.map +1 -0
  310. package/dist/components/data-display/event-calendar/views/ListView.d.ts +10 -0
  311. package/dist/components/data-display/event-calendar/views/ListView.d.ts.map +1 -0
  312. package/dist/components/data-display/event-calendar/views/MonthView.d.ts +11 -0
  313. package/dist/components/data-display/event-calendar/views/MonthView.d.ts.map +1 -0
  314. package/dist/components/data-display/event-calendar/views/WeekView.d.ts +10 -0
  315. package/dist/components/data-display/event-calendar/views/WeekView.d.ts.map +1 -0
  316. package/dist/components/forms/button/Button.d.ts.map +1 -1
  317. package/dist/components/navigation/sidebar/DashboardSidebarShell.d.ts +3 -1
  318. package/dist/components/navigation/sidebar/DashboardSidebarShell.d.ts.map +1 -1
  319. package/dist/components/navigation/sidebar/SidebarLinks.d.ts.map +1 -1
  320. package/dist/components/overlays/tooltip/Tooltip.d.ts +3 -1
  321. package/dist/components/overlays/tooltip/Tooltip.d.ts.map +1 -1
  322. package/dist/dashboard-cards.cjs +18 -0
  323. package/dist/dashboard-cards.d.ts +2 -0
  324. package/dist/dashboard-cards.mjs +2 -0
  325. package/dist/data-table.cjs +1 -1
  326. package/dist/data-table.mjs +1 -1
  327. package/dist/date-picker.cjs +1 -1
  328. package/dist/date-picker.mjs +1 -1
  329. package/dist/dialog.cjs +1 -1
  330. package/dist/dialog.mjs +1 -1
  331. package/dist/docs.cjs +31 -0
  332. package/dist/docs.cjs.map +1 -1
  333. package/dist/docs.d.ts.map +1 -1
  334. package/dist/docs.mjs +31 -0
  335. package/dist/docs.mjs.map +1 -1
  336. package/dist/drawer.cjs +2 -2
  337. package/dist/drawer.mjs +1 -1
  338. package/dist/event-calendar.cjs +5 -0
  339. package/dist/event-calendar.d.ts +2 -0
  340. package/dist/event-calendar.mjs +2 -0
  341. package/dist/form.cjs +1 -1
  342. package/dist/form.mjs +1 -1
  343. package/dist/gradual-blur.cjs +1 -1
  344. package/dist/gradual-blur.mjs +1 -1
  345. package/dist/hover-border-gradient.cjs +1 -1
  346. package/dist/hover-border-gradient.mjs +1 -1
  347. package/dist/hover-card.cjs +1 -1
  348. package/dist/hover-card.mjs +1 -1
  349. package/dist/icons.cjs +3 -2
  350. package/dist/icons.mjs +2 -1
  351. package/dist/index.cjs +74 -330
  352. package/dist/index.cjs.map +1 -1
  353. package/dist/index.d.ts +5 -2
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.mjs +55 -327
  356. package/dist/index.mjs.map +1 -1
  357. package/dist/input.cjs +1 -1
  358. package/dist/input.mjs +1 -1
  359. package/dist/label.cjs +1 -1
  360. package/dist/label.mjs +1 -1
  361. package/dist/loading.cjs +1 -1
  362. package/dist/loading.mjs +1 -1
  363. package/dist/multi-select-combobox.cjs +1 -1
  364. package/dist/multi-select-combobox.mjs +1 -1
  365. package/dist/otp-input.cjs +1 -1
  366. package/dist/otp-input.mjs +1 -1
  367. package/dist/password-strength-meter.cjs +1 -1
  368. package/dist/password-strength-meter.mjs +1 -1
  369. package/dist/progress-bar.cjs +1 -1
  370. package/dist/progress-bar.mjs +1 -1
  371. package/dist/radio.cjs +1 -1
  372. package/dist/radio.mjs +1 -1
  373. package/dist/select.cjs +1 -1
  374. package/dist/select.mjs +1 -1
  375. package/dist/sidebar.cjs +1 -1
  376. package/dist/sidebar.mjs +1 -1
  377. package/dist/skeleton.cjs +1 -1
  378. package/dist/skeleton.mjs +1 -1
  379. package/dist/spinners.cjs +1 -1
  380. package/dist/spinners.mjs +1 -1
  381. package/dist/splash-cursor.cjs +1 -1
  382. package/dist/splash-cursor.mjs +1 -1
  383. package/dist/spotlight-card.cjs +1 -1
  384. package/dist/spotlight-card.mjs +1 -1
  385. package/dist/stepper.cjs +1 -1
  386. package/dist/stepper.mjs +1 -1
  387. package/dist/sun-to-moon-button.cjs +2 -2
  388. package/dist/sun-to-moon-button.mjs +2 -2
  389. package/dist/switch.cjs +1 -1
  390. package/dist/switch.mjs +1 -1
  391. package/dist/textarea.cjs +1 -1
  392. package/dist/textarea.mjs +1 -1
  393. package/dist/toast.cjs +1 -1
  394. package/dist/toast.mjs +1 -1
  395. package/dist/tooltip.cjs +1 -1
  396. package/dist/tooltip.mjs +1 -1
  397. package/dist/truncated-text.cjs +1 -1
  398. package/dist/truncated-text.mjs +1 -1
  399. package/dist/typography.cjs +1 -1
  400. package/dist/typography.mjs +1 -1
  401. package/package.json +17 -5
  402. package/dist/chunks/Tooltip-DD30yj3A.cjs.map +0 -1
  403. package/dist/chunks/Tooltip-DK3B879v.mjs.map +0 -1
  404. package/dist/chunks/button-A6UTvrOu.mjs.map +0 -1
  405. package/dist/chunks/button-C4MXPxsC.cjs.map +0 -1
  406. package/dist/chunks/charts-BmIV-mJy.cjs.map +0 -1
  407. package/dist/chunks/charts-DkVu0rFc.mjs.map +0 -1
  408. package/dist/chunks/data-table-Dtf6lKpp.mjs.map +0 -1
  409. package/dist/chunks/data-table-fAEuevPn.cjs.map +0 -1
  410. package/dist/chunks/icons-CRanVZB1.cjs.map +0 -1
  411. package/dist/chunks/icons-bx3nrxNv.mjs.map +0 -1
  412. package/dist/chunks/sidebar-DYEDFV2u.mjs.map +0 -1
  413. package/dist/chunks/sidebar-Kkr45nuN.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"input-DkCPyWXi.cjs","names":[],"sources":["../../src/components/forms/input/types.ts","../../src/components/forms/input/Input.tsx"],"sourcesContent":["import type { InputHTMLAttributes, ReactNode } from \"react\";\n\nexport enum InputState {\n DEFAULT = \"default\",\n DISABLED = \"disabled\",\n ERROR = \"error\",\n SUCCESS = \"success\",\n}\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n /** Text shown in a tooltip on the info icon next to the label. */\n labelTooltip?: string;\n labelHint?: ReactNode;\n error?: string;\n helperText?: string;\n id?: string;\n extra?: string;\n state?: InputState;\n message?: string;\n leftIcon?: ReactNode;\n leftIconClassName?: string;\n rightIcon?: ReactNode;\n rightIconClassName?: string;\n icon?: ReactNode;\n iconClassName?: string;\n /** Custom background classes (e.g. \"ui:bg-ds-surface-1\"). */\n bgClassName?: string;\n}\n","import { forwardRef, useState } from \"react\";\nimport { type InputProps, InputState } from \"./types\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\nimport { mergeClassNames } from \"../../../utils\";\nimport { Tooltip } from \"../../overlays/tooltip/Tooltip\";\nimport { InfoCircleIcon } from \"../../icons\";\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className = \"\",\n label,\n labelTooltip,\n labelHint,\n error,\n helperText,\n id,\n extra,\n placeholder,\n state = InputState.DEFAULT,\n disabled,\n required,\n message,\n leftIcon,\n leftIconClassName,\n rightIcon,\n rightIconClassName,\n icon,\n iconClassName,\n bgClassName = \"bg-ds-surface-1\",\n ...props\n },\n ref,\n ) => {\n const radius = 100;\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const resolvedState = disabled\n ? InputState.DISABLED\n : error\n ? InputState.ERROR\n : state;\n const isDisabled = resolvedState === InputState.DISABLED;\n const trailingIcon = rightIcon ?? icon;\n const trailingIconClassName = rightIcon\n ? rightIconClassName\n : (rightIconClassName ?? iconClassName);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const wrapperStateStyles: Record<InputState, string> = {\n [InputState.DISABLED]: \"border border-ds-border-field bg-ds-surface-1\",\n [InputState.ERROR]: \"border-ds-state-danger\",\n [InputState.SUCCESS]: \"border-ds-state-success\",\n [InputState.DEFAULT]: \"border-ds-border-2\",\n };\n\n const inputStateStyles: Record<InputState, string> = {\n [InputState.DISABLED]:\n \"border-transparent bg-transparent text-ds-2 placeholder:!text-ds-3 placeholder:opacity-60\",\n [InputState.ERROR]: \"border-ds-state-danger! text-ds-1\",\n [InputState.SUCCESS]: \"border-ds-state-success! text-ds-1\",\n [InputState.DEFAULT]: \"border-ds-border-field text-ds-1\",\n };\n\n return (\n <div className=\"w-full\">\n {label || labelHint ? (\n <div\n className={mergeClassNames(\n \"mb-2 flex items-center gap-3\",\n label ? \"justify-between\" : \"justify-end\",\n )}\n >\n {label ? (\n <label\n htmlFor={id}\n className=\"inline-flex items-center gap-1.5 text-sm leading-none font-medium text-ds-1 peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && (\n <sup className=\"ms-0.5 text-ds-state-danger\">*</sup>\n )}\n {labelTooltip && (\n <Tooltip content={labelTooltip} position=\"top\">\n <span className=\"cursor-help text-ds-3 hover:text-ds-2 transition-colors\">\n <InfoCircleIcon width={14} height={14} color=\"currentColor\" />\n </span>\n </Tooltip>\n )}\n </label>\n ) : null}\n {labelHint ? (\n <div className=\"shrink-0 text-xs text-ds-2\">{labelHint}</div>\n ) : null}\n </div>\n ) : null}\n\n <motion.div\n style={{\n backgroundImage: isDisabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!isDisabled ? handleMouseMove : undefined}\n onMouseEnter={!isDisabled ? () => setVisible(true) : undefined}\n onMouseLeave={!isDisabled ? () => setVisible(false) : undefined}\n className={mergeClassNames(\n \"group/input rounded-lg transition duration-300\",\n isDisabled ? \"p-px\" : \"p-[2px] hover:border-ds-border-accent\",\n wrapperStateStyles[resolvedState],\n extra,\n )}\n >\n <div className=\"relative flex items-center\">\n {leftIcon ? (\n <div\n className={mergeClassNames(\n \"pointer-events-none absolute inset-y-0 flex items-center text-ds-2\",\n leftIconClassName,\n )}\n style={{ insetInlineStart: 0, paddingInlineStart: \"0.75rem\" }}\n >\n {leftIcon}\n </div>\n ) : null}\n {trailingIcon ? (\n <div\n className={mergeClassNames(\n \"pointer-events-none absolute inset-y-0 flex items-center text-ds-2\",\n trailingIconClassName,\n )}\n style={{ insetInlineEnd: 0, paddingInlineEnd: \"0.75rem\" }}\n >\n {trailingIcon}\n </div>\n ) : null}\n <input\n ref={ref}\n id={id}\n placeholder={placeholder}\n disabled={isDisabled}\n required={required}\n className={mergeClassNames(\n \"flex h-10 w-full rounded-md border border-ds-border-field py-2 text-sm text-ds-1 transition duration-400 ease-in-out file:border-0 file:text-sm file:font-medium placeholder:text-ds-3 placeholder:opacity-70 focus-visible:ring-1 focus-visible:ring-ds-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n bgClassName,\n inputStateStyles[resolvedState],\n className,\n )}\n style={{\n paddingInlineStart: leftIcon ? \"2.5rem\" : \"0.75rem\",\n paddingInlineEnd: trailingIcon ? \"2.5rem\" : \"0.75rem\",\n }}\n {...props}\n autoComplete=\"off\"\n />\n </div>\n </motion.div>\n\n {(error || message) && (\n <p\n className={mergeClassNames(\n \"text-sm font-medium mt-1\",\n error ? \"text-ds-state-danger\" : \"text-ds-2\",\n )}\n >\n {error || message}\n </p>\n )}\n {helperText && !error && !message && (\n <p className=\"text-sm text-ds-2 mt-1\">{helperText}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"input-DMTwz27q.cjs","names":[],"sources":["../../src/components/forms/input/types.ts","../../src/components/forms/input/Input.tsx"],"sourcesContent":["import type { InputHTMLAttributes, ReactNode } from \"react\";\n\nexport enum InputState {\n DEFAULT = \"default\",\n DISABLED = \"disabled\",\n ERROR = \"error\",\n SUCCESS = \"success\",\n}\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n /** Text shown in a tooltip on the info icon next to the label. */\n labelTooltip?: string;\n labelHint?: ReactNode;\n error?: string;\n helperText?: string;\n id?: string;\n extra?: string;\n state?: InputState;\n message?: string;\n leftIcon?: ReactNode;\n leftIconClassName?: string;\n rightIcon?: ReactNode;\n rightIconClassName?: string;\n icon?: ReactNode;\n iconClassName?: string;\n /** Custom background classes (e.g. \"ui:bg-ds-surface-1\"). */\n bgClassName?: string;\n}\n","import { forwardRef, useState } from \"react\";\nimport { type InputProps, InputState } from \"./types\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\nimport { mergeClassNames } from \"../../../utils\";\nimport { Tooltip } from \"../../overlays/tooltip/Tooltip\";\nimport { InfoCircleIcon } from \"../../icons\";\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className = \"\",\n label,\n labelTooltip,\n labelHint,\n error,\n helperText,\n id,\n extra,\n placeholder,\n state = InputState.DEFAULT,\n disabled,\n required,\n message,\n leftIcon,\n leftIconClassName,\n rightIcon,\n rightIconClassName,\n icon,\n iconClassName,\n bgClassName = \"bg-ds-surface-1\",\n ...props\n },\n ref,\n ) => {\n const radius = 100;\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const resolvedState = disabled\n ? InputState.DISABLED\n : error\n ? InputState.ERROR\n : state;\n const isDisabled = resolvedState === InputState.DISABLED;\n const trailingIcon = rightIcon ?? icon;\n const trailingIconClassName = rightIcon\n ? rightIconClassName\n : (rightIconClassName ?? iconClassName);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const wrapperStateStyles: Record<InputState, string> = {\n [InputState.DISABLED]: \"border border-ds-border-field bg-ds-surface-1\",\n [InputState.ERROR]: \"border-ds-state-danger\",\n [InputState.SUCCESS]: \"border-ds-state-success\",\n [InputState.DEFAULT]: \"border-ds-border-2\",\n };\n\n const inputStateStyles: Record<InputState, string> = {\n [InputState.DISABLED]:\n \"border-transparent bg-transparent text-ds-2 placeholder:!text-ds-3 placeholder:opacity-60\",\n [InputState.ERROR]: \"border-ds-state-danger! text-ds-1\",\n [InputState.SUCCESS]: \"border-ds-state-success! text-ds-1\",\n [InputState.DEFAULT]: \"border-ds-border-field text-ds-1\",\n };\n\n return (\n <div className=\"w-full\">\n {label || labelHint ? (\n <div\n className={mergeClassNames(\n \"mb-2 flex items-center gap-3\",\n label ? \"justify-between\" : \"justify-end\",\n )}\n >\n {label ? (\n <label\n htmlFor={id}\n className=\"inline-flex items-center gap-1.5 text-sm leading-none font-medium text-ds-1 peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && (\n <sup className=\"ms-0.5 text-ds-state-danger\">*</sup>\n )}\n {labelTooltip && (\n <Tooltip content={labelTooltip} position=\"top\">\n <span className=\"cursor-help text-ds-3 hover:text-ds-2 transition-colors\">\n <InfoCircleIcon width={14} height={14} color=\"currentColor\" />\n </span>\n </Tooltip>\n )}\n </label>\n ) : null}\n {labelHint ? (\n <div className=\"shrink-0 text-xs text-ds-2\">{labelHint}</div>\n ) : null}\n </div>\n ) : null}\n\n <motion.div\n style={{\n backgroundImage: isDisabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!isDisabled ? handleMouseMove : undefined}\n onMouseEnter={!isDisabled ? () => setVisible(true) : undefined}\n onMouseLeave={!isDisabled ? () => setVisible(false) : undefined}\n className={mergeClassNames(\n \"group/input rounded-lg transition duration-300\",\n isDisabled ? \"p-px\" : \"p-[2px] hover:border-ds-border-accent\",\n wrapperStateStyles[resolvedState],\n extra,\n )}\n >\n <div className=\"relative flex items-center\">\n {leftIcon ? (\n <div\n className={mergeClassNames(\n \"pointer-events-none absolute inset-y-0 flex items-center text-ds-2\",\n leftIconClassName,\n )}\n style={{ insetInlineStart: 0, paddingInlineStart: \"0.75rem\" }}\n >\n {leftIcon}\n </div>\n ) : null}\n {trailingIcon ? (\n <div\n className={mergeClassNames(\n \"pointer-events-none absolute inset-y-0 flex items-center text-ds-2\",\n trailingIconClassName,\n )}\n style={{ insetInlineEnd: 0, paddingInlineEnd: \"0.75rem\" }}\n >\n {trailingIcon}\n </div>\n ) : null}\n <input\n ref={ref}\n id={id}\n placeholder={placeholder}\n disabled={isDisabled}\n required={required}\n className={mergeClassNames(\n \"flex h-10 w-full rounded-md border border-ds-border-field py-2 text-sm text-ds-1 transition duration-400 ease-in-out file:border-0 file:text-sm file:font-medium placeholder:text-ds-3 placeholder:opacity-70 focus-visible:ring-1 focus-visible:ring-ds-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n bgClassName,\n inputStateStyles[resolvedState],\n className,\n )}\n style={{\n paddingInlineStart: leftIcon ? \"2.5rem\" : \"0.75rem\",\n paddingInlineEnd: trailingIcon ? \"2.5rem\" : \"0.75rem\",\n }}\n {...props}\n autoComplete=\"off\"\n />\n </div>\n </motion.div>\n\n {(error || message) && (\n <p\n className={mergeClassNames(\n \"text-sm font-medium mt-1\",\n error ? \"text-ds-state-danger\" : \"text-ds-2\",\n )}\n >\n {error || message}\n </p>\n )}\n {helperText && !error && !message && (\n <p className=\"text-sm text-ds-2 mt-1\">{helperText}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n"],"mappings":";;;;;;;;AAEA,IAAY,aAAL,yBAAA,YAAA;AACL,YAAA,aAAU;AACV,YAAA,cAAW;AACX,YAAA,WAAQ;AACR,YAAA,aAAU;;KACX;;;ACAD,IAAa,SAAA,GAAA,MAAA,aAET,EACE,YAAY,IACZ,OACA,cACA,WACA,OACA,YACA,IACA,OACA,aACA,QAAQ,WAAW,SACnB,UACA,UACA,SACA,UACA,mBACA,WACA,oBACA,MACA,eACA,cAAc,mBACd,GAAG,SAEL,QACG;CACH,MAAM,SAAS;CACf,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,MAAM;CAC7C,MAAM,UAAA,GAAA,cAAA,gBAAwB,EAAE;CAChC,MAAM,UAAA,GAAA,cAAA,gBAAwB,EAAE;CAChC,MAAM,gBAAgB,WAClB,WAAW,WACX,QACE,WAAW,QACX;CACN,MAAM,aAAa,kBAAkB,WAAW;CAChD,MAAM,eAAe,aAAa;CAClC,MAAM,wBAAwB,YAC1B,qBACC,sBAAsB;CAE3B,MAAM,mBAAmB,UAA4C;EACnE,MAAM,EAAE,MAAM,QAAQ,MAAM,cAAc,uBAAuB;AACjE,SAAO,IAAI,MAAM,UAAU,KAAK;AAChC,SAAO,IAAI,MAAM,UAAU,IAAI;;CAGjC,MAAM,qBAAiD;GACpD,WAAW,WAAW;GACtB,WAAW,QAAQ;GACnB,WAAW,UAAU;GACrB,WAAW,UAAU;EACvB;CAED,MAAM,mBAA+C;GAClD,WAAW,WACV;GACD,WAAW,QAAQ;GACnB,WAAW,UAAU;GACrB,WAAW,UAAU;EACvB;AAED,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GACG,SAAS,YACR,iBAAA,GAAA,kBAAA,MAAC,OAAD;IACE,WAAW,cAAA,gBACT,gCACA,QAAQ,oBAAoB,cAC7B;cAJH,CAMG,QACC,iBAAA,GAAA,kBAAA,MAAC,SAAD;KACE,SAAS;KACT,WAAU;eAFZ;MAIG;MACA,YACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBAA8B;OAAO,CAAA;MAErD,gBACC,iBAAA,GAAA,kBAAA,KAAC,gBAAA,SAAD;OAAS,SAAS;OAAc,UAAS;iBACvC,iBAAA,GAAA,kBAAA,KAAC,QAAD;QAAM,WAAU;kBACd,iBAAA,GAAA,kBAAA,KAAC,cAAA,gBAAD;SAAgB,OAAO;SAAI,QAAQ;SAAI,OAAM;SAAiB,CAAA;QACzD,CAAA;OACC,CAAA;MAEN;SACN,MACH,YACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eAA8B;KAAgB,CAAA,GAC3D,KACA;QACJ;GAEJ,iBAAA,GAAA,kBAAA,KAAC,cAAA,OAAO,KAAR;IACE,OAAO,EACL,iBAAiB,aACb,SACA,cAAA,iBAAiB;;sBAGX,UAAU,GAAG,OAAO,MAAM,MAC3B,aAAa,OAAO,KAAK,OAAO;;;;mBAK1C;IACD,aAAa,CAAC,aAAa,kBAAkB,KAAA;IAC7C,cAAc,CAAC,mBAAmB,WAAW,KAAK,GAAG,KAAA;IACrD,cAAc,CAAC,mBAAmB,WAAW,MAAM,GAAG,KAAA;IACtD,WAAW,cAAA,gBACT,kDACA,aAAa,SAAS,yCACtB,mBAAmB,gBACnB,MACD;cAED,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf;MACG,WACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;OACE,WAAW,cAAA,gBACT,sEACA,kBACD;OACD,OAAO;QAAE,kBAAkB;QAAG,oBAAoB;QAAW;iBAE5D;OACG,CAAA,GACJ;MACH,eACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;OACE,WAAW,cAAA,gBACT,sEACA,sBACD;OACD,OAAO;QAAE,gBAAgB;QAAG,kBAAkB;QAAW;iBAExD;OACG,CAAA,GACJ;MACJ,iBAAA,GAAA,kBAAA,KAAC,SAAD;OACO;OACD;OACS;OACb,UAAU;OACA;OACV,WAAW,cAAA,gBACT,6UACA,aACA,iBAAiB,gBACjB,UACD;OACD,OAAO;QACL,oBAAoB,WAAW,WAAW;QAC1C,kBAAkB,eAAe,WAAW;QAC7C;OACD,GAAI;OACJ,cAAa;OACb,CAAA;MACE;;IACK,CAAA;IAEX,SAAS,YACT,iBAAA,GAAA,kBAAA,KAAC,KAAD;IACE,WAAW,cAAA,gBACT,4BACA,QAAQ,yBAAyB,YAClC;cAEA,SAAS;IACR,CAAA;GAEL,cAAc,CAAC,SAAS,CAAC,WACxB,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAA0B;IAAe,CAAA;GAEpD;;EAGX;AAED,MAAM,cAAc"}
@@ -29,4 +29,4 @@ Object.defineProperty(exports, "Label", {
29
29
  }
30
30
  });
31
31
 
32
- //# sourceMappingURL=label-BKzqfAAq.cjs.map
32
+ //# sourceMappingURL=label-B5Ugq0Nk.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"label-BKzqfAAq.cjs","names":[],"sources":["../../src/components/forms/label/Label.tsx"],"sourcesContent":["import type { LabelProps } from \"./types\";\nimport { forwardRef } from \"react\";\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className = \"\", children, required, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={`\n text-sm\n font-medium\n leading-none\n peer-disabled:cursor-not-allowed\n peer-disabled:opacity-70\n ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \")}\n {...props}\n >\n {children}\n {required && <span className=\"text-destructive ms-1\">*</span>}\n </label>\n );\n },\n);\n\nLabel.displayName = \"Label\";\n"],"mappings":";;;;AAGA,IAAa,SAAA,GAAA,MAAA,aACV,EAAE,YAAY,IAAI,UAAU,UAAU,GAAG,SAAS,QAAQ;AACzD,QACE,iBAAA,GAAA,kBAAA,MAAC,SAAD;EACO;EACL,WAAW;;;;;;YAMP,UAAU;UAEX,MAAM,CACN,QAAQ,QAAQ,IAAI;EACvB,GAAI;YAZN,CAcG,UACA,YAAY,iBAAA,GAAA,kBAAA,KAAC,QAAD;GAAM,WAAU;aAAwB;GAAQ,CAAA,CACvD;;EAGb;AAED,MAAM,cAAc"}
1
+ {"version":3,"file":"label-B5Ugq0Nk.cjs","names":[],"sources":["../../src/components/forms/label/Label.tsx"],"sourcesContent":["import type { LabelProps } from \"./types\";\nimport { forwardRef } from \"react\";\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className = \"\", children, required, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={`\n text-sm\n font-medium\n leading-none\n peer-disabled:cursor-not-allowed\n peer-disabled:opacity-70\n ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \")}\n {...props}\n >\n {children}\n {required && <span className=\"text-destructive ms-1\">*</span>}\n </label>\n );\n },\n);\n\nLabel.displayName = \"Label\";\n"],"mappings":";;;;AAGA,IAAa,SAAA,GAAA,MAAA,aACV,EAAE,YAAY,IAAI,UAAU,UAAU,GAAG,SAAS,QAAQ;AACzD,QACE,iBAAA,GAAA,kBAAA,MAAC,SAAD;EACO;EACL,WAAW;;;;;;YAMP,UAAU;UAEX,MAAM,CACN,QAAQ,QAAQ,IAAI;EACvB,GAAI;YAZN,CAcG,UACA,YAAY,iBAAA,GAAA,kBAAA,KAAC,QAAD;GAAM,WAAU;aAAwB;GAAQ,CAAA,CACvD;;EAGb;AAED,MAAM,cAAc"}
@@ -23,4 +23,4 @@ Label.displayName = "Label";
23
23
  //#endregion
24
24
  export { Label as t };
25
25
 
26
- //# sourceMappingURL=label-Drxg0cG2.mjs.map
26
+ //# sourceMappingURL=label-Bc_r54NU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"label-Drxg0cG2.mjs","names":[],"sources":["../../src/components/forms/label/Label.tsx"],"sourcesContent":["import type { LabelProps } from \"./types\";\nimport { forwardRef } from \"react\";\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className = \"\", children, required, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={`\n text-sm\n font-medium\n leading-none\n peer-disabled:cursor-not-allowed\n peer-disabled:opacity-70\n ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \")}\n {...props}\n >\n {children}\n {required && <span className=\"text-destructive ms-1\">*</span>}\n </label>\n );\n },\n);\n\nLabel.displayName = \"Label\";\n"],"mappings":";;;AAGA,IAAa,QAAQ,YAClB,EAAE,YAAY,IAAI,UAAU,UAAU,GAAG,SAAS,QAAQ;AACzD,QACE,qBAAC,SAAD;EACO;EACL,WAAW;;;;;;YAMP,UAAU;UAEX,MAAM,CACN,QAAQ,QAAQ,IAAI;EACvB,GAAI;YAZN,CAcG,UACA,YAAY,oBAAC,QAAD;GAAM,WAAU;aAAwB;GAAQ,CAAA,CACvD;;EAGb;AAED,MAAM,cAAc"}
1
+ {"version":3,"file":"label-Bc_r54NU.mjs","names":[],"sources":["../../src/components/forms/label/Label.tsx"],"sourcesContent":["import type { LabelProps } from \"./types\";\nimport { forwardRef } from \"react\";\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className = \"\", children, required, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={`\n text-sm\n font-medium\n leading-none\n peer-disabled:cursor-not-allowed\n peer-disabled:opacity-70\n ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \")}\n {...props}\n >\n {children}\n {required && <span className=\"text-destructive ms-1\">*</span>}\n </label>\n );\n },\n);\n\nLabel.displayName = \"Label\";\n"],"mappings":";;;AAGA,IAAa,QAAQ,YAClB,EAAE,YAAY,IAAI,UAAU,UAAU,GAAG,SAAS,QAAQ;AACzD,QACE,qBAAC,SAAD;EACO;EACL,WAAW;;;;;;YAMP,UAAU;UAEX,MAAM,CACN,QAAQ,QAAQ,IAAI;EACvB,GAAI;YAZN,CAcG,UACA,YAAY,oBAAC,QAAD;GAAM,WAAU;aAAwB;GAAQ,CAAA,CACvD;;EAGb;AAED,MAAM,cAAc"}
@@ -1,5 +1,5 @@
1
1
  require("./chunk-B_GkZjkl.cjs");
2
- const require_icons = require("./icons-CRanVZB1.cjs");
2
+ const require_icons = require("./icons-ub9iu-JG.cjs");
3
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
4
  //#region src/components/data-display/loading/Loading.tsx
5
5
  var sizeMap = {
@@ -310,4 +310,4 @@ Object.defineProperty(exports, "Wave", {
310
310
  }
311
311
  });
312
312
 
313
- //# sourceMappingURL=loading-BiM4mKh6.cjs.map
313
+ //# sourceMappingURL=loading-DZKJc3e7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"loading-BiM4mKh6.cjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-ds-surface-3 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"var(--ds-color-accent)\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span className={`${sizeMap[size].text} text-ds-2 font-medium`}>\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-ds-canvas/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-ds-canvas/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
1
+ {"version":3,"file":"loading-DZKJc3e7.cjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-ds-surface-3 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"var(--ds-color-accent)\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span className={`${sizeMap[size].text} text-ds-2 font-medium`}>\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-ds-canvas/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-ds-canvas/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { i as RingLoaderIcon, l as LoaderIcon } from "./icons-bx3nrxNv.mjs";
1
+ import { i as RingLoaderIcon, l as LoaderIcon } from "./icons-JzMKLygv.mjs";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/components/data-display/loading/Loading.tsx
4
4
  var sizeMap = {
@@ -256,4 +256,4 @@ function Loading({ variant = "spinner", size = "md", color = "var(--ds-color-acc
256
256
  //#endregion
257
257
  export { Pulse as a, Spinner as c, Loading as i, Wave as l, Bounce as n, Ring as o, Dots as r, Skeleton as s, Bars as t };
258
258
 
259
- //# sourceMappingURL=loading-Dtosnb4A.mjs.map
259
+ //# sourceMappingURL=loading-ll2L6lc7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"loading-Dtosnb4A.mjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-ds-surface-3 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"var(--ds-color-accent)\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span className={`${sizeMap[size].text} text-ds-2 font-medium`}>\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-ds-canvas/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-ds-canvas/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
1
+ {"version":3,"file":"loading-ll2L6lc7.mjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-ds-surface-3 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"var(--ds-color-accent)\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span className={`${sizeMap[size].text} text-ds-2 font-medium`}>\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-ds-canvas/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-ds-canvas/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":";;;AAuCA,IAAM,UAAoE;CACxE,IAAI;EAAE,WAAW;EAAW,MAAM;EAAW;CAC7C,IAAI;EAAE,WAAW;EAAW,MAAM;EAAW;CAC7C,IAAI;EAAE,WAAW;EAAW,MAAM;EAAW;CAC7C,IAAI;EAAE,WAAW;EAAa,MAAM;EAAa;CACjD,IAAI;EAAE,WAAW;EAAa,MAAM;EAAW;CAChD;AAGD,SAAS,QAAQ,EACf,OAAO,MACP,QAAQ,kBAIP;AACD,QACE,oBAAC,YAAD;EACE,WAAW,gBAAgB,QAAQ,MAAM;EAClC;EACP,eAAY;EACZ,CAAA;;AAKN,SAAS,KAAK,EACZ,OAAO,MACP,QAAQ,kBAIP;CACD,MAAM,UAAU;EACd,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AAED,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ;GAAC;GAAG;GAAG;GAAE,CAAC,KAAK,MACd,oBAAC,OAAD;GAEE,WAAW,GAAG,QAAQ,MAAM;GAC5B,OAAO;IACL,iBAAiB;IACjB,gBAAgB,GAAG,IAAI,IAAK;IAC5B,mBAAmB;IACpB;GACD,EAPK,EAOL,CACF;EACE,CAAA;;AAKV,SAAS,MAAM,EACb,OAAO,MACP,QAAQ,kBAIP;AACD,QACE,qBAAC,OAAD;EAAK,WAAW,YAAY,QAAQ,MAAM;YAA1C,CACE,oBAAC,OAAD;GACE,WAAU;GACV,OAAO,EAAE,iBAAiB,OAAO;GACjC,CAAA,EACF,oBAAC,OAAD;GACE,WAAU;GACV,OAAO,EAAE,iBAAiB,OAAO;GACjC,CAAA,CACE;;;AAKV,SAAS,KAAK,EACZ,OAAO,MACP,QAAQ,kBAIP;CACD,MAAM,WAAW;EACf,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AAED,QACE,qBAAC,OAAD;EAAK,WAAW,0BAA0B,QAAQ,MAAM;YAAxD,CACG;GAAC;GAAG;GAAG;GAAG;GAAG;GAAE,CAAC,KAAK,MACpB,oBAAC,OAAD;GAEE,WAAW,GAAG,SAAS,MAAM;GAC7B,OAAO;IACL,iBAAiB;IACjB,WAAW;IACX,gBAAgB,GAAG,IAAI,GAAI;IAC3B,QAAQ;IACT;GACD,EARK,EAQL,CACF,EACF,oBAAC,SAAD,EAAA,UAAQ;;;;;SAKE,CAAA,CACN;;;AAKV,SAAS,KAAK,EACZ,OAAO,MACP,QAAQ,kBAIP;AASD,QACE,oBAAC,gBAAD;EACE,WAAW,gBAAgB,QAAQ,MAAM;EAClC;EACP,aAAa;GAXf,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GAOW,CAAY;EACzB,eAAY;EACZ,CAAA;;AAKN,SAAS,OAAO,EACd,OAAO,MACP,QAAQ,kBAIP;CACD,MAAM,UAAU;EACd,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AAED,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACG;GAAC;GAAG;GAAG;GAAE,CAAC,KAAK,MACd,oBAAC,OAAD;GAEE,WAAW,GAAG,QAAQ,MAAM;GAC5B,OAAO;IACL,iBAAiB;IACjB,WAAW;IACX,gBAAgB,GAAG,IAAI,IAAK;IAC7B;GACD,EAPK,EAOL,CACF,EACF,oBAAC,SAAD,EAAA,UAAQ;;;;;SAKE,CAAA,CACN;;;AAKV,SAAS,KAAK,EACZ,OAAO,MACP,QAAQ,kBAIP;CACD,MAAM,YAAY;EAChB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;CACD,MAAM,WAAW;EACf,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AAED,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACG;GAAC;GAAG;GAAG;GAAG;GAAG;GAAE,CAAC,KAAK,MACpB,oBAAC,OAAD;GAEE,WAAW,GAAG,SAAS,MAAM,GAAG,UAAU,MAAM;GAChD,OAAO;IACL,iBAAiB;IACjB,WAAW;IACX,gBAAgB,GAAG,IAAI,GAAI;IAC5B;GACD,EAPK,EAOL,CACF,EACF,oBAAC,SAAD,EAAA,UAAQ;;;;;SAKE,CAAA,CACN;;;AAKV,SAAS,SAAS,EAChB,QAAQ,QACR,SAAS,QACT,UAAU,QAKT;AASD,QACE,oBAAC,OAAD;EACE,WAAW,iCAAiC;GAT9C,MAAM;GACN,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;GAKwC,CAAW;EACvD,OAAO;GAAE;GAAO;GAAQ;EACxB,CAAA;;AAIN,SAAwB,QAAQ,EAC9B,UAAU,WACV,OAAO,MACP,QAAQ,0BACR,MACA,eAAe,SACf,aAAa,OACb,UAAU,OACV,YAAY,IACZ,eACA,gBACA,kBAAkB,QACH;CACf,MAAM,qBAAqB;AACzB,UAAQ,SAAR;GACE,KAAK,UACH,QAAO,oBAAC,SAAD;IAAe;IAAa;IAAS,CAAA;GAC9C,KAAK,OACH,QAAO,oBAAC,MAAD;IAAY;IAAa;IAAS,CAAA;GAC3C,KAAK,QACH,QAAO,oBAAC,OAAD;IAAa;IAAa;IAAS,CAAA;GAC5C,KAAK,OACH,QAAO,oBAAC,MAAD;IAAY;IAAa;IAAS,CAAA;GAC3C,KAAK,OACH,QAAO,oBAAC,MAAD;IAAY;IAAa;IAAS,CAAA;GAC3C,KAAK,SACH,QAAO,oBAAC,QAAD;IAAc;IAAa;IAAS,CAAA;GAC7C,KAAK,OACH,QAAO,oBAAC,MAAD;IAAY;IAAa;IAAS,CAAA;GAC3C,KAAK,WACH,QACE,oBAAC,UAAD;IACE,OAAO;IACP,QAAQ;IACR,SAAS;IACT,CAAA;GAEN,QACE,QAAO,oBAAC,SAAD;IAAe;IAAa;IAAS,CAAA;;;CAIlD,MAAM,UACJ,qBAAC,OAAD;EACE,WAAW,4BACT,iBAAiB,WAAW,mBAAmB,iBAChD,GAAG;YAHN,CAKG,cAAc,EACd,QACC,oBAAC,QAAD;GAAM,WAAW,GAAG,QAAQ,MAAM,KAAK;aACpC;GACI,CAAA,CAEL;;AAGR,KAAI,WACF,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ;EACG,CAAA;AAIV,KAAI,QACF,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ;EACG,CAAA;AAIV,QAAO"}
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require("./chunk-B_GkZjkl.cjs");
2
2
  const require_utils = require("./utils-LRbEQHYs.cjs");
3
- const require_icons = require("./icons-CRanVZB1.cjs");
4
- const require_DropdownMenu = require("./DropdownMenu-BDrNYO-D.cjs");
3
+ const require_icons = require("./icons-ub9iu-JG.cjs");
4
+ const require_DropdownMenu = require("./DropdownMenu-yh04burS.cjs");
5
5
  let react = require("react");
6
6
  react = require_chunk.__toESM(react, 1);
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -124,4 +124,4 @@ Object.defineProperty(exports, "MultiSelectCombobox", {
124
124
  }
125
125
  });
126
126
 
127
- //# sourceMappingURL=multi-select-combobox-C0DoDzxQ.cjs.map
127
+ //# sourceMappingURL=multi-select-combobox-CFJGq1hn.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-select-combobox-C0DoDzxQ.cjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlays/dropdown-menu\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n noOptionsText?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n searchPlaceholder = \"Type to search...\",\n noOptionsText = \"No options found\",\n className,\n bgClassName = \"bg-ds-surface-1\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <DropdownMenu\n className={mergeClassNames(\"w-full\", className)}\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setSearch(\"\");\n }\n }}\n animationClassName=\"origin-top-left\"\n panelClassName=\"top-[40px] start-0 z-20 mt-1 flex w-full max-h-60 flex-col rounded-lg border border-ds-border-2 bg-ds-surface-1 shadow-3 backdrop-blur-xl transition\"\n trigger={\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox w-full rounded-lg border-ds-border-2 p-[2px] transition duration-300 hover:border-ds-border-accent\"\n >\n <div\n className={mergeClassNames(\n \"flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-ds-border-field px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md border border-ds-border-field bg-ds-surface-2 px-2 py-0.5 text-xs font-medium text-ds-1\"\n >\n {label}\n <button\n type=\"button\"\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ms-0.5 rounded-full p-0.5 text-ds-2 transition-colors hover:bg-ds-surface-1 hover:text-ds-1\"\n >\n <CloseIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-ds-2\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ms-2 shrink-0 text-ds-2 transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n }\n >\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-ds-border-2/30 bg-ds-surface-1/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full rounded-t-lg bg-transparent px-3 py-2 text-sm text-ds-1 outline-none placeholder:text-ds-2 focus-visible:ring-2 focus-visible:ring-ds-focus/30\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-sm text-ds-2\">\n {noOptionsText}\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"text-ds-1 hover:bg-ds-surface-2 hover:text-ds-1\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-ds-border-accent bg-ds-accent text-ds-on-accent\"\n : \"border-ds-border-2\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </DropdownMenu>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
1
+ {"version":3,"file":"multi-select-combobox-CFJGq1hn.cjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlays/dropdown-menu\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n noOptionsText?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n searchPlaceholder = \"Type to search...\",\n noOptionsText = \"No options found\",\n className,\n bgClassName = \"bg-ds-surface-1\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <DropdownMenu\n className={mergeClassNames(\"w-full\", className)}\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setSearch(\"\");\n }\n }}\n animationClassName=\"origin-top-left\"\n panelClassName=\"top-[40px] start-0 z-20 mt-1 flex w-full max-h-60 flex-col rounded-lg border border-ds-border-2 bg-ds-surface-1 shadow-3 backdrop-blur-xl transition\"\n trigger={\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox w-full rounded-lg border-ds-border-2 p-[2px] transition duration-300 hover:border-ds-border-accent\"\n >\n <div\n className={mergeClassNames(\n \"flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-ds-border-field px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md border border-ds-border-field bg-ds-surface-2 px-2 py-0.5 text-xs font-medium text-ds-1\"\n >\n {label}\n <button\n type=\"button\"\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ms-0.5 rounded-full p-0.5 text-ds-2 transition-colors hover:bg-ds-surface-1 hover:text-ds-1\"\n >\n <CloseIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-ds-2\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ms-2 shrink-0 text-ds-2 transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n }\n >\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-ds-border-2/30 bg-ds-surface-1/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full rounded-t-lg bg-transparent px-3 py-2 text-sm text-ds-1 outline-none placeholder:text-ds-2 focus-visible:ring-2 focus-visible:ring-ds-focus/30\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-sm text-ds-2\">\n {noOptionsText}\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"text-ds-1 hover:bg-ds-surface-2 hover:text-ds-1\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-ds-border-accent bg-ds-accent text-ds-on-accent\"\n : \"border-ds-border-2\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </DropdownMenu>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as mergeClassNames } from "./utils-7S0u48mU.mjs";
2
- import { J as CheckIcon, N as ChevronDownIcon, q as CloseIcon } from "./icons-bx3nrxNv.mjs";
3
- import { t as DropdownMenu } from "./DropdownMenu-BtTOri-A.mjs";
2
+ import { K as CloseIcon, M as ChevronDownIcon, q as CheckIcon } from "./icons-JzMKLygv.mjs";
3
+ import { t as DropdownMenu } from "./DropdownMenu-BQ4WlaGp.mjs";
4
4
  import { useState } from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { motion, useMotionTemplate, useMotionValue } from "framer-motion";
@@ -117,4 +117,4 @@ var MultiSelectCombobox = ({ options, value = [], onChange, placeholder = "Selec
117
117
  //#endregion
118
118
  export { MultiSelectCombobox as t };
119
119
 
120
- //# sourceMappingURL=multi-select-combobox-Do23ZfOQ.mjs.map
120
+ //# sourceMappingURL=multi-select-combobox-C_8sxaiL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-select-combobox-Do23ZfOQ.mjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlays/dropdown-menu\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n noOptionsText?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n searchPlaceholder = \"Type to search...\",\n noOptionsText = \"No options found\",\n className,\n bgClassName = \"bg-ds-surface-1\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <DropdownMenu\n className={mergeClassNames(\"w-full\", className)}\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setSearch(\"\");\n }\n }}\n animationClassName=\"origin-top-left\"\n panelClassName=\"top-[40px] start-0 z-20 mt-1 flex w-full max-h-60 flex-col rounded-lg border border-ds-border-2 bg-ds-surface-1 shadow-3 backdrop-blur-xl transition\"\n trigger={\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox w-full rounded-lg border-ds-border-2 p-[2px] transition duration-300 hover:border-ds-border-accent\"\n >\n <div\n className={mergeClassNames(\n \"flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-ds-border-field px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md border border-ds-border-field bg-ds-surface-2 px-2 py-0.5 text-xs font-medium text-ds-1\"\n >\n {label}\n <button\n type=\"button\"\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ms-0.5 rounded-full p-0.5 text-ds-2 transition-colors hover:bg-ds-surface-1 hover:text-ds-1\"\n >\n <CloseIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-ds-2\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ms-2 shrink-0 text-ds-2 transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n }\n >\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-ds-border-2/30 bg-ds-surface-1/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full rounded-t-lg bg-transparent px-3 py-2 text-sm text-ds-1 outline-none placeholder:text-ds-2 focus-visible:ring-2 focus-visible:ring-ds-focus/30\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-sm text-ds-2\">\n {noOptionsText}\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"text-ds-1 hover:bg-ds-surface-2 hover:text-ds-1\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-ds-border-accent bg-ds-accent text-ds-on-accent\"\n : \"border-ds-border-2\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </DropdownMenu>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
1
+ {"version":3,"file":"multi-select-combobox-C_8sxaiL.mjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlays/dropdown-menu\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n noOptionsText?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n searchPlaceholder = \"Type to search...\",\n noOptionsText = \"No options found\",\n className,\n bgClassName = \"bg-ds-surface-1\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <DropdownMenu\n className={mergeClassNames(\"w-full\", className)}\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setSearch(\"\");\n }\n }}\n animationClassName=\"origin-top-left\"\n panelClassName=\"top-[40px] start-0 z-20 mt-1 flex w-full max-h-60 flex-col rounded-lg border border-ds-border-2 bg-ds-surface-1 shadow-3 backdrop-blur-xl transition\"\n trigger={\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox w-full rounded-lg border-ds-border-2 p-[2px] transition duration-300 hover:border-ds-border-accent\"\n >\n <div\n className={mergeClassNames(\n \"flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-ds-border-field px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md border border-ds-border-field bg-ds-surface-2 px-2 py-0.5 text-xs font-medium text-ds-1\"\n >\n {label}\n <button\n type=\"button\"\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ms-0.5 rounded-full p-0.5 text-ds-2 transition-colors hover:bg-ds-surface-1 hover:text-ds-1\"\n >\n <CloseIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-ds-2\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ms-2 shrink-0 text-ds-2 transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n }\n >\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-ds-border-2/30 bg-ds-surface-1/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full rounded-t-lg bg-transparent px-3 py-2 text-sm text-ds-1 outline-none placeholder:text-ds-2 focus-visible:ring-2 focus-visible:ring-ds-focus/30\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-sm text-ds-2\">\n {noOptionsText}\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"text-ds-1 hover:bg-ds-surface-2 hover:text-ds-1\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-ds-border-accent bg-ds-accent text-ds-on-accent\"\n : \"border-ds-border-2\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </DropdownMenu>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
@@ -183,4 +183,4 @@ Object.defineProperty(exports, "OTPInput", {
183
183
  }
184
184
  });
185
185
 
186
- //# sourceMappingURL=otp-input-CkhV-sGl.cjs.map
186
+ //# sourceMappingURL=otp-input-B5-tuc0q.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-input-CkhV-sGl.cjs","names":[],"sources":["../../src/components/forms/otp-input/OTPInput.tsx"],"sourcesContent":["import {\n forwardRef,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type ClipboardEvent,\n type ChangeEvent,\n} from \"react\";\n\nexport type OTPInputSize = \"sm\" | \"md\" | \"lg\";\nexport type OTPInputVariant = \"outlined\" | \"filled\" | \"underlined\";\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Callback when OTP value changes */\n onChange?: (value: string) => void;\n /** Callback when all digits are filled */\n onComplete?: (value: string) => void;\n /** The current value (controlled) */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Size of the input boxes */\n size?: OTPInputSize;\n /** Visual variant */\n variant?: OTPInputVariant;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether there's an error */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Placeholder character */\n placeholder?: string;\n /** Whether to mask the input (like password) */\n mask?: boolean;\n /** Whether to auto-focus the first input */\n autoFocus?: boolean;\n /** Input type - number only or alphanumeric */\n type?: \"number\" | \"text\";\n /** Custom className for the container */\n className?: string;\n /** Custom className for each input box */\n inputClassName?: string;\n /** Separator to show between groups of digits */\n separator?: React.ReactNode;\n /** Position(s) to show separator (e.g., [3] means after 3rd digit) */\n separatorPositions?: number[];\n /** Accessible label */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles: Record<OTPInputSize, string> = {\n sm: \"w-9 h-10 text-base\",\n md: \"w-12 h-14 text-xl\",\n lg: \"w-14 h-16 text-2xl\",\n};\n\nconst variantStyles: Record<\n OTPInputVariant,\n { base: string; focus: string; error: string }\n> = {\n outlined: {\n base: \"border border-ds-border-field bg-ds-surface-1 rounded-lg text-ds-1\",\n focus: \"focus:border-ds-border-accent focus:ring-2 focus:ring-ds-accent\",\n error: \"border-destructive\",\n },\n filled: {\n base: \"border border-transparent bg-ds-accent-subtle rounded-lg text-ds-1\",\n focus:\n \"focus:border-ds-border-accent focus:bg-ds-surface-1 focus:ring-2 focus:ring-ds-accent\",\n error: \"bg-danger-subtle border-danger-border\",\n },\n underlined: {\n base: \"border-b-2 border-ds-border-1 bg-transparent rounded-none text-ds-1\",\n focus: \"focus:border-ds-border-accent\",\n error: \"border-destructive\",\n },\n};\n\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n length = 6,\n onChange,\n onComplete,\n value: controlledValue,\n defaultValue = \"\",\n size = \"md\",\n variant = \"outlined\",\n disabled = false,\n error = false,\n errorMessage,\n placeholder = \"\",\n mask = false,\n autoFocus = false,\n type = \"number\",\n className = \"\",\n inputClassName = \"\",\n separator = <span className=\"text-ds-3 text-2xl mx-2\">—</span>,\n separatorPositions = [],\n \"aria-label\": ariaLabel = \"One-time password\",\n },\n ref,\n ) => {\n const [values, setValues] = useState<string[]>(() => {\n const initial = controlledValue ?? defaultValue;\n return initial\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n });\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n const newValues = controlledValue\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setValues(newValues);\n }\n }, [controlledValue, length]);\n\n // Auto-focus first input\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback(\n (index: number) => {\n if (index >= 0 && index < length && inputRefs.current[index]) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const char = inputValue.slice(-1);\n\n // Validate input based on type\n if (type === \"number\" && char && !/^\\d$/.test(char)) {\n return;\n }\n\n const newValues = [...values];\n newValues[index] = char;\n setValues(newValues);\n\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Move to next input if value entered\n if (char && index < length - 1) {\n focusInput(index + 1);\n }\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && newValues.length === length) {\n onComplete?.(otpValue);\n }\n },\n [values, onChange, onComplete, length, type, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n const newValues = [...values];\n if (values[index]) {\n // Clear current value\n newValues[index] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n } else if (index > 0) {\n // Move to previous and clear\n newValues[index - 1] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n focusInput(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusInput(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusInput(index + 1);\n break;\n case \"Delete\":\n e.preventDefault();\n const deleteValues = [...values];\n deleteValues[index] = \"\";\n setValues(deleteValues);\n onChange?.(deleteValues.join(\"\"));\n break;\n }\n },\n [values, onChange, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").slice(0, length);\n\n // Validate pasted content\n if (type === \"number\" && !/^\\d*$/.test(pastedData)) {\n return;\n }\n\n const newValues = pastedData\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n\n setValues(newValues);\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Focus last filled input or last input\n const lastFilledIndex = newValues.findLastIndex((v) => v !== \"\");\n focusInput(Math.min(lastFilledIndex + 1, length - 1));\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && pastedData.length >= length) {\n onComplete?.(otpValue);\n }\n },\n [length, type, onChange, onComplete, focusInput],\n );\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }, []);\n\n const renderInputs = () => {\n const inputs: React.ReactNode[] = [];\n\n for (let i = 0; i < length; i++) {\n // Add separator if needed\n if (separatorPositions.includes(i) && i > 0) {\n inputs.push(\n <div key={`separator-${i}`} className=\"flex items-center\">\n {separator}\n </div>,\n );\n }\n\n inputs.push(\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el;\n // React 19: Return cleanup function\n return () => {\n inputRefs.current[i] = null;\n };\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n pattern={type === \"number\" ? \"\\\\d*\" : undefined}\n maxLength={1}\n value={values[i] || \"\"}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n className={`\n text-center font-semibold outline-none transition-all\n placeholder:text-ds-2\n ${sizeStyles[size]}\n ${variantStyles[variant].base}\n ${!error ? variantStyles[variant].focus : \"\"}\n ${error ? variantStyles[variant].error : \"\"}\n ${disabled ? \"opacity-50 cursor-not-allowed bg-ds-surface-1\" : \"\"}\n ${inputClassName}\n `}\n />,\n );\n }\n\n return inputs;\n };\n\n return (\n <div ref={ref} className={`flex flex-col gap-2 ${className}`}>\n <div\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderInputs()}\n </div>\n {error && errorMessage && (\n <span className=\"text-sm text-destructive\">{errorMessage}</span>\n )}\n </div>\n );\n },\n);\n\nOTPInput.displayName = \"OTPInput\";\n\nexport default OTPInput;\nexport { OTPInput };\n"],"mappings":"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"}
1
+ {"version":3,"file":"otp-input-B5-tuc0q.cjs","names":[],"sources":["../../src/components/forms/otp-input/OTPInput.tsx"],"sourcesContent":["import {\n forwardRef,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type ClipboardEvent,\n type ChangeEvent,\n} from \"react\";\n\nexport type OTPInputSize = \"sm\" | \"md\" | \"lg\";\nexport type OTPInputVariant = \"outlined\" | \"filled\" | \"underlined\";\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Callback when OTP value changes */\n onChange?: (value: string) => void;\n /** Callback when all digits are filled */\n onComplete?: (value: string) => void;\n /** The current value (controlled) */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Size of the input boxes */\n size?: OTPInputSize;\n /** Visual variant */\n variant?: OTPInputVariant;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether there's an error */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Placeholder character */\n placeholder?: string;\n /** Whether to mask the input (like password) */\n mask?: boolean;\n /** Whether to auto-focus the first input */\n autoFocus?: boolean;\n /** Input type - number only or alphanumeric */\n type?: \"number\" | \"text\";\n /** Custom className for the container */\n className?: string;\n /** Custom className for each input box */\n inputClassName?: string;\n /** Separator to show between groups of digits */\n separator?: React.ReactNode;\n /** Position(s) to show separator (e.g., [3] means after 3rd digit) */\n separatorPositions?: number[];\n /** Accessible label */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles: Record<OTPInputSize, string> = {\n sm: \"w-9 h-10 text-base\",\n md: \"w-12 h-14 text-xl\",\n lg: \"w-14 h-16 text-2xl\",\n};\n\nconst variantStyles: Record<\n OTPInputVariant,\n { base: string; focus: string; error: string }\n> = {\n outlined: {\n base: \"border border-ds-border-field bg-ds-surface-1 rounded-lg text-ds-1\",\n focus: \"focus:border-ds-border-accent focus:ring-2 focus:ring-ds-accent\",\n error: \"border-destructive\",\n },\n filled: {\n base: \"border border-transparent bg-ds-accent-subtle rounded-lg text-ds-1\",\n focus:\n \"focus:border-ds-border-accent focus:bg-ds-surface-1 focus:ring-2 focus:ring-ds-accent\",\n error: \"bg-danger-subtle border-danger-border\",\n },\n underlined: {\n base: \"border-b-2 border-ds-border-1 bg-transparent rounded-none text-ds-1\",\n focus: \"focus:border-ds-border-accent\",\n error: \"border-destructive\",\n },\n};\n\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n length = 6,\n onChange,\n onComplete,\n value: controlledValue,\n defaultValue = \"\",\n size = \"md\",\n variant = \"outlined\",\n disabled = false,\n error = false,\n errorMessage,\n placeholder = \"\",\n mask = false,\n autoFocus = false,\n type = \"number\",\n className = \"\",\n inputClassName = \"\",\n separator = <span className=\"text-ds-3 text-2xl mx-2\">—</span>,\n separatorPositions = [],\n \"aria-label\": ariaLabel = \"One-time password\",\n },\n ref,\n ) => {\n const [values, setValues] = useState<string[]>(() => {\n const initial = controlledValue ?? defaultValue;\n return initial\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n });\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n const newValues = controlledValue\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setValues(newValues);\n }\n }, [controlledValue, length]);\n\n // Auto-focus first input\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback(\n (index: number) => {\n if (index >= 0 && index < length && inputRefs.current[index]) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const char = inputValue.slice(-1);\n\n // Validate input based on type\n if (type === \"number\" && char && !/^\\d$/.test(char)) {\n return;\n }\n\n const newValues = [...values];\n newValues[index] = char;\n setValues(newValues);\n\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Move to next input if value entered\n if (char && index < length - 1) {\n focusInput(index + 1);\n }\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && newValues.length === length) {\n onComplete?.(otpValue);\n }\n },\n [values, onChange, onComplete, length, type, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n const newValues = [...values];\n if (values[index]) {\n // Clear current value\n newValues[index] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n } else if (index > 0) {\n // Move to previous and clear\n newValues[index - 1] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n focusInput(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusInput(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusInput(index + 1);\n break;\n case \"Delete\":\n e.preventDefault();\n const deleteValues = [...values];\n deleteValues[index] = \"\";\n setValues(deleteValues);\n onChange?.(deleteValues.join(\"\"));\n break;\n }\n },\n [values, onChange, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").slice(0, length);\n\n // Validate pasted content\n if (type === \"number\" && !/^\\d*$/.test(pastedData)) {\n return;\n }\n\n const newValues = pastedData\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n\n setValues(newValues);\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Focus last filled input or last input\n const lastFilledIndex = newValues.findLastIndex((v) => v !== \"\");\n focusInput(Math.min(lastFilledIndex + 1, length - 1));\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && pastedData.length >= length) {\n onComplete?.(otpValue);\n }\n },\n [length, type, onChange, onComplete, focusInput],\n );\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }, []);\n\n const renderInputs = () => {\n const inputs: React.ReactNode[] = [];\n\n for (let i = 0; i < length; i++) {\n // Add separator if needed\n if (separatorPositions.includes(i) && i > 0) {\n inputs.push(\n <div key={`separator-${i}`} className=\"flex items-center\">\n {separator}\n </div>,\n );\n }\n\n inputs.push(\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el;\n // React 19: Return cleanup function\n return () => {\n inputRefs.current[i] = null;\n };\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n pattern={type === \"number\" ? \"\\\\d*\" : undefined}\n maxLength={1}\n value={values[i] || \"\"}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n className={`\n text-center font-semibold outline-none transition-all\n placeholder:text-ds-2\n ${sizeStyles[size]}\n ${variantStyles[variant].base}\n ${!error ? variantStyles[variant].focus : \"\"}\n ${error ? variantStyles[variant].error : \"\"}\n ${disabled ? \"opacity-50 cursor-not-allowed bg-ds-surface-1\" : \"\"}\n ${inputClassName}\n `}\n />,\n );\n }\n\n return inputs;\n };\n\n return (\n <div ref={ref} className={`flex flex-col gap-2 ${className}`}>\n <div\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderInputs()}\n </div>\n {error && errorMessage && (\n <span className=\"text-sm text-destructive\">{errorMessage}</span>\n )}\n </div>\n );\n },\n);\n\nOTPInput.displayName = \"OTPInput\";\n\nexport default OTPInput;\nexport { OTPInput };\n"],"mappings":"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"}
@@ -177,4 +177,4 @@ OTPInput.displayName = "OTPInput";
177
177
  //#endregion
178
178
  export { OTPInput as t };
179
179
 
180
- //# sourceMappingURL=otp-input-JOysxKfD.mjs.map
180
+ //# sourceMappingURL=otp-input-BpcTJOmU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-input-JOysxKfD.mjs","names":[],"sources":["../../src/components/forms/otp-input/OTPInput.tsx"],"sourcesContent":["import {\n forwardRef,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type ClipboardEvent,\n type ChangeEvent,\n} from \"react\";\n\nexport type OTPInputSize = \"sm\" | \"md\" | \"lg\";\nexport type OTPInputVariant = \"outlined\" | \"filled\" | \"underlined\";\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Callback when OTP value changes */\n onChange?: (value: string) => void;\n /** Callback when all digits are filled */\n onComplete?: (value: string) => void;\n /** The current value (controlled) */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Size of the input boxes */\n size?: OTPInputSize;\n /** Visual variant */\n variant?: OTPInputVariant;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether there's an error */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Placeholder character */\n placeholder?: string;\n /** Whether to mask the input (like password) */\n mask?: boolean;\n /** Whether to auto-focus the first input */\n autoFocus?: boolean;\n /** Input type - number only or alphanumeric */\n type?: \"number\" | \"text\";\n /** Custom className for the container */\n className?: string;\n /** Custom className for each input box */\n inputClassName?: string;\n /** Separator to show between groups of digits */\n separator?: React.ReactNode;\n /** Position(s) to show separator (e.g., [3] means after 3rd digit) */\n separatorPositions?: number[];\n /** Accessible label */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles: Record<OTPInputSize, string> = {\n sm: \"w-9 h-10 text-base\",\n md: \"w-12 h-14 text-xl\",\n lg: \"w-14 h-16 text-2xl\",\n};\n\nconst variantStyles: Record<\n OTPInputVariant,\n { base: string; focus: string; error: string }\n> = {\n outlined: {\n base: \"border border-ds-border-field bg-ds-surface-1 rounded-lg text-ds-1\",\n focus: \"focus:border-ds-border-accent focus:ring-2 focus:ring-ds-accent\",\n error: \"border-destructive\",\n },\n filled: {\n base: \"border border-transparent bg-ds-accent-subtle rounded-lg text-ds-1\",\n focus:\n \"focus:border-ds-border-accent focus:bg-ds-surface-1 focus:ring-2 focus:ring-ds-accent\",\n error: \"bg-danger-subtle border-danger-border\",\n },\n underlined: {\n base: \"border-b-2 border-ds-border-1 bg-transparent rounded-none text-ds-1\",\n focus: \"focus:border-ds-border-accent\",\n error: \"border-destructive\",\n },\n};\n\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n length = 6,\n onChange,\n onComplete,\n value: controlledValue,\n defaultValue = \"\",\n size = \"md\",\n variant = \"outlined\",\n disabled = false,\n error = false,\n errorMessage,\n placeholder = \"\",\n mask = false,\n autoFocus = false,\n type = \"number\",\n className = \"\",\n inputClassName = \"\",\n separator = <span className=\"text-ds-3 text-2xl mx-2\">—</span>,\n separatorPositions = [],\n \"aria-label\": ariaLabel = \"One-time password\",\n },\n ref,\n ) => {\n const [values, setValues] = useState<string[]>(() => {\n const initial = controlledValue ?? defaultValue;\n return initial\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n });\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n const newValues = controlledValue\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setValues(newValues);\n }\n }, [controlledValue, length]);\n\n // Auto-focus first input\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback(\n (index: number) => {\n if (index >= 0 && index < length && inputRefs.current[index]) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const char = inputValue.slice(-1);\n\n // Validate input based on type\n if (type === \"number\" && char && !/^\\d$/.test(char)) {\n return;\n }\n\n const newValues = [...values];\n newValues[index] = char;\n setValues(newValues);\n\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Move to next input if value entered\n if (char && index < length - 1) {\n focusInput(index + 1);\n }\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && newValues.length === length) {\n onComplete?.(otpValue);\n }\n },\n [values, onChange, onComplete, length, type, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n const newValues = [...values];\n if (values[index]) {\n // Clear current value\n newValues[index] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n } else if (index > 0) {\n // Move to previous and clear\n newValues[index - 1] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n focusInput(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusInput(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusInput(index + 1);\n break;\n case \"Delete\":\n e.preventDefault();\n const deleteValues = [...values];\n deleteValues[index] = \"\";\n setValues(deleteValues);\n onChange?.(deleteValues.join(\"\"));\n break;\n }\n },\n [values, onChange, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").slice(0, length);\n\n // Validate pasted content\n if (type === \"number\" && !/^\\d*$/.test(pastedData)) {\n return;\n }\n\n const newValues = pastedData\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n\n setValues(newValues);\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Focus last filled input or last input\n const lastFilledIndex = newValues.findLastIndex((v) => v !== \"\");\n focusInput(Math.min(lastFilledIndex + 1, length - 1));\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && pastedData.length >= length) {\n onComplete?.(otpValue);\n }\n },\n [length, type, onChange, onComplete, focusInput],\n );\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }, []);\n\n const renderInputs = () => {\n const inputs: React.ReactNode[] = [];\n\n for (let i = 0; i < length; i++) {\n // Add separator if needed\n if (separatorPositions.includes(i) && i > 0) {\n inputs.push(\n <div key={`separator-${i}`} className=\"flex items-center\">\n {separator}\n </div>,\n );\n }\n\n inputs.push(\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el;\n // React 19: Return cleanup function\n return () => {\n inputRefs.current[i] = null;\n };\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n pattern={type === \"number\" ? \"\\\\d*\" : undefined}\n maxLength={1}\n value={values[i] || \"\"}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n className={`\n text-center font-semibold outline-none transition-all\n placeholder:text-ds-2\n ${sizeStyles[size]}\n ${variantStyles[variant].base}\n ${!error ? variantStyles[variant].focus : \"\"}\n ${error ? variantStyles[variant].error : \"\"}\n ${disabled ? \"opacity-50 cursor-not-allowed bg-ds-surface-1\" : \"\"}\n ${inputClassName}\n `}\n />,\n );\n }\n\n return inputs;\n };\n\n return (\n <div ref={ref} className={`flex flex-col gap-2 ${className}`}>\n <div\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderInputs()}\n </div>\n {error && errorMessage && (\n <span className=\"text-sm text-destructive\">{errorMessage}</span>\n )}\n </div>\n );\n },\n);\n\nOTPInput.displayName = \"OTPInput\";\n\nexport default OTPInput;\nexport { OTPInput };\n"],"mappings":"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"}
1
+ {"version":3,"file":"otp-input-BpcTJOmU.mjs","names":[],"sources":["../../src/components/forms/otp-input/OTPInput.tsx"],"sourcesContent":["import {\n forwardRef,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type ClipboardEvent,\n type ChangeEvent,\n} from \"react\";\n\nexport type OTPInputSize = \"sm\" | \"md\" | \"lg\";\nexport type OTPInputVariant = \"outlined\" | \"filled\" | \"underlined\";\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Callback when OTP value changes */\n onChange?: (value: string) => void;\n /** Callback when all digits are filled */\n onComplete?: (value: string) => void;\n /** The current value (controlled) */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Size of the input boxes */\n size?: OTPInputSize;\n /** Visual variant */\n variant?: OTPInputVariant;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether there's an error */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Placeholder character */\n placeholder?: string;\n /** Whether to mask the input (like password) */\n mask?: boolean;\n /** Whether to auto-focus the first input */\n autoFocus?: boolean;\n /** Input type - number only or alphanumeric */\n type?: \"number\" | \"text\";\n /** Custom className for the container */\n className?: string;\n /** Custom className for each input box */\n inputClassName?: string;\n /** Separator to show between groups of digits */\n separator?: React.ReactNode;\n /** Position(s) to show separator (e.g., [3] means after 3rd digit) */\n separatorPositions?: number[];\n /** Accessible label */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles: Record<OTPInputSize, string> = {\n sm: \"w-9 h-10 text-base\",\n md: \"w-12 h-14 text-xl\",\n lg: \"w-14 h-16 text-2xl\",\n};\n\nconst variantStyles: Record<\n OTPInputVariant,\n { base: string; focus: string; error: string }\n> = {\n outlined: {\n base: \"border border-ds-border-field bg-ds-surface-1 rounded-lg text-ds-1\",\n focus: \"focus:border-ds-border-accent focus:ring-2 focus:ring-ds-accent\",\n error: \"border-destructive\",\n },\n filled: {\n base: \"border border-transparent bg-ds-accent-subtle rounded-lg text-ds-1\",\n focus:\n \"focus:border-ds-border-accent focus:bg-ds-surface-1 focus:ring-2 focus:ring-ds-accent\",\n error: \"bg-danger-subtle border-danger-border\",\n },\n underlined: {\n base: \"border-b-2 border-ds-border-1 bg-transparent rounded-none text-ds-1\",\n focus: \"focus:border-ds-border-accent\",\n error: \"border-destructive\",\n },\n};\n\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n length = 6,\n onChange,\n onComplete,\n value: controlledValue,\n defaultValue = \"\",\n size = \"md\",\n variant = \"outlined\",\n disabled = false,\n error = false,\n errorMessage,\n placeholder = \"\",\n mask = false,\n autoFocus = false,\n type = \"number\",\n className = \"\",\n inputClassName = \"\",\n separator = <span className=\"text-ds-3 text-2xl mx-2\">—</span>,\n separatorPositions = [],\n \"aria-label\": ariaLabel = \"One-time password\",\n },\n ref,\n ) => {\n const [values, setValues] = useState<string[]>(() => {\n const initial = controlledValue ?? defaultValue;\n return initial\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n });\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n const newValues = controlledValue\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setValues(newValues);\n }\n }, [controlledValue, length]);\n\n // Auto-focus first input\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback(\n (index: number) => {\n if (index >= 0 && index < length && inputRefs.current[index]) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const char = inputValue.slice(-1);\n\n // Validate input based on type\n if (type === \"number\" && char && !/^\\d$/.test(char)) {\n return;\n }\n\n const newValues = [...values];\n newValues[index] = char;\n setValues(newValues);\n\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Move to next input if value entered\n if (char && index < length - 1) {\n focusInput(index + 1);\n }\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && newValues.length === length) {\n onComplete?.(otpValue);\n }\n },\n [values, onChange, onComplete, length, type, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n const newValues = [...values];\n if (values[index]) {\n // Clear current value\n newValues[index] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n } else if (index > 0) {\n // Move to previous and clear\n newValues[index - 1] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n focusInput(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusInput(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusInput(index + 1);\n break;\n case \"Delete\":\n e.preventDefault();\n const deleteValues = [...values];\n deleteValues[index] = \"\";\n setValues(deleteValues);\n onChange?.(deleteValues.join(\"\"));\n break;\n }\n },\n [values, onChange, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").slice(0, length);\n\n // Validate pasted content\n if (type === \"number\" && !/^\\d*$/.test(pastedData)) {\n return;\n }\n\n const newValues = pastedData\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n\n setValues(newValues);\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Focus last filled input or last input\n const lastFilledIndex = newValues.findLastIndex((v) => v !== \"\");\n focusInput(Math.min(lastFilledIndex + 1, length - 1));\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && pastedData.length >= length) {\n onComplete?.(otpValue);\n }\n },\n [length, type, onChange, onComplete, focusInput],\n );\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }, []);\n\n const renderInputs = () => {\n const inputs: React.ReactNode[] = [];\n\n for (let i = 0; i < length; i++) {\n // Add separator if needed\n if (separatorPositions.includes(i) && i > 0) {\n inputs.push(\n <div key={`separator-${i}`} className=\"flex items-center\">\n {separator}\n </div>,\n );\n }\n\n inputs.push(\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el;\n // React 19: Return cleanup function\n return () => {\n inputRefs.current[i] = null;\n };\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n pattern={type === \"number\" ? \"\\\\d*\" : undefined}\n maxLength={1}\n value={values[i] || \"\"}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n className={`\n text-center font-semibold outline-none transition-all\n placeholder:text-ds-2\n ${sizeStyles[size]}\n ${variantStyles[variant].base}\n ${!error ? variantStyles[variant].focus : \"\"}\n ${error ? variantStyles[variant].error : \"\"}\n ${disabled ? \"opacity-50 cursor-not-allowed bg-ds-surface-1\" : \"\"}\n ${inputClassName}\n `}\n />,\n );\n }\n\n return inputs;\n };\n\n return (\n <div ref={ref} className={`flex flex-col gap-2 ${className}`}>\n <div\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderInputs()}\n </div>\n {error && errorMessage && (\n <span className=\"text-sm text-destructive\">{errorMessage}</span>\n )}\n </div>\n );\n },\n);\n\nOTPInput.displayName = \"OTPInput\";\n\nexport default OTPInput;\nexport { OTPInput };\n"],"mappings":"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"}
@@ -51,4 +51,4 @@ var useOverlayEffects = (containerRef, active) => {
51
51
  //#endregion
52
52
  export { useOverlayEffects as t };
53
53
 
54
- //# sourceMappingURL=overlay-BzkUmjQ-.mjs.map
54
+ //# sourceMappingURL=overlay-CG1dMYtO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-BzkUmjQ-.mjs","names":[],"sources":["../../src/components/shared/overlay.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nconst focusableSelectors = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n];\n\nconst scheduleMicrotask = (callback: () => void) => {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(callback);\n return;\n }\n Promise.resolve()\n .then(callback)\n .catch(() => {\n callback();\n });\n};\n\nexport const useBodyScrollLock = (active: boolean) => {\n useEffect(() => {\n if (!active || typeof window === \"undefined\") return;\n const { overflow } = document.body.style;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [active]);\n};\n\nexport const useFocusTrap = (\n containerRef: RefObject<HTMLElement | null>,\n active: boolean,\n) => {\n useEffect(() => {\n if (!active || typeof window === \"undefined\") return;\n const container = containerRef.current;\n if (!container) return;\n\n const getFocusable = () =>\n Array.from(\n container.querySelectorAll<HTMLElement>(focusableSelectors.join(\",\")),\n ).filter(\n (el) => !el.hasAttribute(\"disabled\") && !el.getAttribute(\"aria-hidden\"),\n );\n\n const focusable = getFocusable();\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n first?.focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\" || focusable.length === 0) return;\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault();\n (last || first)?.focus();\n }\n } else if (document.activeElement === last) {\n event.preventDefault();\n (first || last)?.focus();\n }\n };\n\n container.addEventListener(\"keydown\", handleKeyDown);\n return () => container.removeEventListener(\"keydown\", handleKeyDown);\n }, [containerRef, active]);\n};\n\nexport const useOverlayEffects = (\n containerRef: RefObject<HTMLElement | null>,\n active: boolean,\n) => {\n useBodyScrollLock(active);\n useFocusTrap(containerRef, active);\n};\n\nexport const useOverlayTransition = (open: boolean, duration = 200) => {\n const [closing, setClosing] = useState(false);\n\n useEffect(() => {\n if (open) {\n return undefined;\n }\n\n scheduleMicrotask(() => setClosing(true));\n const timer = setTimeout(() => setClosing(false), duration);\n\n return () => {\n clearTimeout(timer);\n scheduleMicrotask(() => setClosing(false));\n };\n }, [open, duration]);\n\n const shouldRender = open || closing;\n const transitionState: \"open\" | \"closing\" | \"closed\" = open\n ? \"open\"\n : closing\n ? \"closing\"\n : \"closed\";\n\n return { shouldRender, transitionState };\n};\n"],"mappings":";;AAGA,IAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACD;AAcD,IAAa,qBAAqB,WAAoB;AACpD,iBAAgB;AACd,MAAI,CAAC,UAAU,OAAO,WAAW,YAAa;EAC9C,MAAM,EAAE,aAAa,SAAS,KAAK;AACnC,WAAS,KAAK,MAAM,WAAW;AAC/B,eAAa;AACX,YAAS,KAAK,MAAM,WAAW;;IAEhC,CAAC,OAAO,CAAC;;AAGd,IAAa,gBACX,cACA,WACG;AACH,iBAAgB;AACd,MAAI,CAAC,UAAU,OAAO,WAAW,YAAa;EAC9C,MAAM,YAAY,aAAa;AAC/B,MAAI,CAAC,UAAW;EAEhB,MAAM,qBACJ,MAAM,KACJ,UAAU,iBAA8B,mBAAmB,KAAK,IAAI,CAAC,CACtE,CAAC,QACC,OAAO,CAAC,GAAG,aAAa,WAAW,IAAI,CAAC,GAAG,aAAa,cAAc,CACxE;EAEH,MAAM,YAAY,cAAc;EAChC,MAAM,QAAQ,UAAU;EACxB,MAAM,OAAO,UAAU,UAAU,SAAS;AAC1C,SAAO,OAAO;EAEd,MAAM,iBAAiB,UAAyB;AAC9C,OAAI,MAAM,QAAQ,SAAS,UAAU,WAAW,EAAG;AACnD,OAAI,MAAM;QACJ,SAAS,kBAAkB,OAAO;AACpC,WAAM,gBAAgB;AACtB,MAAC,QAAQ,QAAQ,OAAO;;cAEjB,SAAS,kBAAkB,MAAM;AAC1C,UAAM,gBAAgB;AACtB,KAAC,SAAS,OAAO,OAAO;;;AAI5B,YAAU,iBAAiB,WAAW,cAAc;AACpD,eAAa,UAAU,oBAAoB,WAAW,cAAc;IACnE,CAAC,cAAc,OAAO,CAAC;;AAG5B,IAAa,qBACX,cACA,WACG;AACH,mBAAkB,OAAO;AACzB,cAAa,cAAc,OAAO"}
1
+ {"version":3,"file":"overlay-CG1dMYtO.mjs","names":[],"sources":["../../src/components/shared/overlay.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nconst focusableSelectors = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n];\n\nconst scheduleMicrotask = (callback: () => void) => {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(callback);\n return;\n }\n Promise.resolve()\n .then(callback)\n .catch(() => {\n callback();\n });\n};\n\nexport const useBodyScrollLock = (active: boolean) => {\n useEffect(() => {\n if (!active || typeof window === \"undefined\") return;\n const { overflow } = document.body.style;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [active]);\n};\n\nexport const useFocusTrap = (\n containerRef: RefObject<HTMLElement | null>,\n active: boolean,\n) => {\n useEffect(() => {\n if (!active || typeof window === \"undefined\") return;\n const container = containerRef.current;\n if (!container) return;\n\n const getFocusable = () =>\n Array.from(\n container.querySelectorAll<HTMLElement>(focusableSelectors.join(\",\")),\n ).filter(\n (el) => !el.hasAttribute(\"disabled\") && !el.getAttribute(\"aria-hidden\"),\n );\n\n const focusable = getFocusable();\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n first?.focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\" || focusable.length === 0) return;\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault();\n (last || first)?.focus();\n }\n } else if (document.activeElement === last) {\n event.preventDefault();\n (first || last)?.focus();\n }\n };\n\n container.addEventListener(\"keydown\", handleKeyDown);\n return () => container.removeEventListener(\"keydown\", handleKeyDown);\n }, [containerRef, active]);\n};\n\nexport const useOverlayEffects = (\n containerRef: RefObject<HTMLElement | null>,\n active: boolean,\n) => {\n useBodyScrollLock(active);\n useFocusTrap(containerRef, active);\n};\n\nexport const useOverlayTransition = (open: boolean, duration = 200) => {\n const [closing, setClosing] = useState(false);\n\n useEffect(() => {\n if (open) {\n return undefined;\n }\n\n scheduleMicrotask(() => setClosing(true));\n const timer = setTimeout(() => setClosing(false), duration);\n\n return () => {\n clearTimeout(timer);\n scheduleMicrotask(() => setClosing(false));\n };\n }, [open, duration]);\n\n const shouldRender = open || closing;\n const transitionState: \"open\" | \"closing\" | \"closed\" = open\n ? \"open\"\n : closing\n ? \"closing\"\n : \"closed\";\n\n return { shouldRender, transitionState };\n};\n"],"mappings":";;AAGA,IAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACD;AAcD,IAAa,qBAAqB,WAAoB;AACpD,iBAAgB;AACd,MAAI,CAAC,UAAU,OAAO,WAAW,YAAa;EAC9C,MAAM,EAAE,aAAa,SAAS,KAAK;AACnC,WAAS,KAAK,MAAM,WAAW;AAC/B,eAAa;AACX,YAAS,KAAK,MAAM,WAAW;;IAEhC,CAAC,OAAO,CAAC;;AAGd,IAAa,gBACX,cACA,WACG;AACH,iBAAgB;AACd,MAAI,CAAC,UAAU,OAAO,WAAW,YAAa;EAC9C,MAAM,YAAY,aAAa;AAC/B,MAAI,CAAC,UAAW;EAEhB,MAAM,qBACJ,MAAM,KACJ,UAAU,iBAA8B,mBAAmB,KAAK,IAAI,CAAC,CACtE,CAAC,QACC,OAAO,CAAC,GAAG,aAAa,WAAW,IAAI,CAAC,GAAG,aAAa,cAAc,CACxE;EAEH,MAAM,YAAY,cAAc;EAChC,MAAM,QAAQ,UAAU;EACxB,MAAM,OAAO,UAAU,UAAU,SAAS;AAC1C,SAAO,OAAO;EAEd,MAAM,iBAAiB,UAAyB;AAC9C,OAAI,MAAM,QAAQ,SAAS,UAAU,WAAW,EAAG;AACnD,OAAI,MAAM;QACJ,SAAS,kBAAkB,OAAO;AACpC,WAAM,gBAAgB;AACtB,MAAC,QAAQ,QAAQ,OAAO;;cAEjB,SAAS,kBAAkB,MAAM;AAC1C,UAAM,gBAAgB;AACtB,KAAC,SAAS,OAAO,OAAO;;;AAI5B,YAAU,iBAAiB,WAAW,cAAc;AACpD,eAAa,UAAU,oBAAoB,WAAW,cAAc;IACnE,CAAC,cAAc,OAAO,CAAC;;AAG5B,IAAa,qBACX,cACA,WACG;AACH,mBAAkB,OAAO;AACzB,cAAa,cAAc,OAAO"}