@makroz/web 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +22 -0
  3. package/dist/auth/MkAuthContext.d.ts +43 -0
  4. package/dist/auth/MkAuthContext.d.ts.map +1 -0
  5. package/dist/auth/MkAuthContext.js +3 -0
  6. package/dist/auth/MkAuthContext.js.map +1 -0
  7. package/dist/auth/MkAuthForm.d.ts +42 -0
  8. package/dist/auth/MkAuthForm.d.ts.map +1 -0
  9. package/dist/auth/MkAuthForm.js +53 -0
  10. package/dist/auth/MkAuthForm.js.map +1 -0
  11. package/dist/auth/MkAuthProvider.d.ts +30 -0
  12. package/dist/auth/MkAuthProvider.d.ts.map +1 -0
  13. package/dist/auth/MkAuthProvider.js +319 -0
  14. package/dist/auth/MkAuthProvider.js.map +1 -0
  15. package/dist/auth/auth/MkAuthContext.d.ts +42 -0
  16. package/dist/auth/auth/MkAuthForm.d.ts +41 -0
  17. package/dist/auth/auth/MkAuthProvider.d.ts +29 -0
  18. package/dist/auth/auth/types.d.ts +62 -0
  19. package/dist/auth/auth/useMkAuth.d.ts +18 -0
  20. package/dist/auth/components/MkButton.d.ts +10 -0
  21. package/dist/auth/components/MkInput.d.ts +12 -0
  22. package/dist/auth/types.d.ts +63 -0
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/auth/types.js +20 -0
  25. package/dist/auth/types.js.map +1 -0
  26. package/dist/auth/useMkAuth.d.ts +19 -0
  27. package/dist/auth/useMkAuth.d.ts.map +1 -0
  28. package/dist/auth/useMkAuth.js +26 -0
  29. package/dist/auth/useMkAuth.js.map +1 -0
  30. package/dist/components/MkAccordion.d.ts +36 -0
  31. package/dist/components/MkAccordion.d.ts.map +1 -0
  32. package/dist/components/MkAccordion.js +25 -0
  33. package/dist/components/MkAccordion.js.map +1 -0
  34. package/dist/components/MkAccordion.module.css +79 -0
  35. package/dist/components/MkAlert.d.ts +25 -0
  36. package/dist/components/MkAlert.d.ts.map +1 -0
  37. package/dist/components/MkAlert.js +23 -0
  38. package/dist/components/MkAlert.js.map +1 -0
  39. package/dist/components/MkAlert.module.css +103 -0
  40. package/dist/components/MkAvatar.d.ts +16 -0
  41. package/dist/components/MkAvatar.d.ts.map +1 -0
  42. package/dist/components/MkAvatar.js +25 -0
  43. package/dist/components/MkAvatar.js.map +1 -0
  44. package/dist/components/MkAvatar.module.css +62 -0
  45. package/dist/components/MkBadge.d.ts +15 -0
  46. package/dist/components/MkBadge.d.ts.map +1 -0
  47. package/dist/components/MkBadge.js +9 -0
  48. package/dist/components/MkBadge.js.map +1 -0
  49. package/dist/components/MkBadge.module.css +74 -0
  50. package/dist/components/MkButton.d.ts +11 -0
  51. package/dist/components/MkButton.d.ts.map +1 -0
  52. package/dist/components/MkButton.js +20 -0
  53. package/dist/components/MkButton.js.map +1 -0
  54. package/dist/components/MkButton.module.css +85 -0
  55. package/dist/components/MkButton.test.d.ts +2 -0
  56. package/dist/components/MkButton.test.d.ts.map +1 -0
  57. package/dist/components/MkButton.test.js +58 -0
  58. package/dist/components/MkButton.test.js.map +1 -0
  59. package/dist/components/MkCard.d.ts +18 -0
  60. package/dist/components/MkCard.d.ts.map +1 -0
  61. package/dist/components/MkCard.js +8 -0
  62. package/dist/components/MkCard.js.map +1 -0
  63. package/dist/components/MkCard.module.css +63 -0
  64. package/dist/components/MkCheck.d.ts +32 -0
  65. package/dist/components/MkCheck.d.ts.map +1 -0
  66. package/dist/components/MkCheck.js +14 -0
  67. package/dist/components/MkCheck.js.map +1 -0
  68. package/dist/components/MkCheck.module.css +87 -0
  69. package/dist/components/MkDatePicker.d.ts +29 -0
  70. package/dist/components/MkDatePicker.d.ts.map +1 -0
  71. package/dist/components/MkDatePicker.js +12 -0
  72. package/dist/components/MkDatePicker.js.map +1 -0
  73. package/dist/components/MkDatePicker.module.css +77 -0
  74. package/dist/components/MkDivider.d.ts +14 -0
  75. package/dist/components/MkDivider.d.ts.map +1 -0
  76. package/dist/components/MkDivider.js +14 -0
  77. package/dist/components/MkDivider.js.map +1 -0
  78. package/dist/components/MkDivider.module.css +39 -0
  79. package/dist/components/MkDropDown.d.ts +22 -0
  80. package/dist/components/MkDropDown.d.ts.map +1 -0
  81. package/dist/components/MkDropDown.js +26 -0
  82. package/dist/components/MkDropDown.js.map +1 -0
  83. package/dist/components/MkDropDown.module.css +108 -0
  84. package/dist/components/MkEmptyState.d.ts +14 -0
  85. package/dist/components/MkEmptyState.d.ts.map +1 -0
  86. package/dist/components/MkEmptyState.js +8 -0
  87. package/dist/components/MkEmptyState.js.map +1 -0
  88. package/dist/components/MkEmptyState.module.css +35 -0
  89. package/dist/components/MkFileUpload.d.ts +36 -0
  90. package/dist/components/MkFileUpload.d.ts.map +1 -0
  91. package/dist/components/MkFileUpload.js +52 -0
  92. package/dist/components/MkFileUpload.js.map +1 -0
  93. package/dist/components/MkFileUpload.module.css +74 -0
  94. package/dist/components/MkIcons.d.ts +14 -0
  95. package/dist/components/MkIcons.d.ts.map +1 -0
  96. package/dist/components/MkIcons.js +38 -0
  97. package/dist/components/MkIcons.js.map +1 -0
  98. package/dist/components/MkInfiniteList.d.ts +15 -0
  99. package/dist/components/MkInfiniteList.d.ts.map +1 -0
  100. package/dist/components/MkInfiniteList.js +31 -0
  101. package/dist/components/MkInfiniteList.js.map +1 -0
  102. package/dist/components/MkInfiniteList.module.css +69 -0
  103. package/dist/components/MkInput.d.ts +13 -0
  104. package/dist/components/MkInput.d.ts.map +1 -0
  105. package/dist/components/MkInput.js +23 -0
  106. package/dist/components/MkInput.js.map +1 -0
  107. package/dist/components/MkInput.module.css +94 -0
  108. package/dist/components/MkLoading.d.ts +20 -0
  109. package/dist/components/MkLoading.d.ts.map +1 -0
  110. package/dist/components/MkLoading.js +16 -0
  111. package/dist/components/MkLoading.js.map +1 -0
  112. package/dist/components/MkLoading.module.css +39 -0
  113. package/dist/components/MkModal.d.ts +20 -0
  114. package/dist/components/MkModal.d.ts.map +1 -0
  115. package/dist/components/MkModal.js +33 -0
  116. package/dist/components/MkModal.js.map +1 -0
  117. package/dist/components/MkModal.module.css +107 -0
  118. package/dist/components/MkProgressBar.d.ts +17 -0
  119. package/dist/components/MkProgressBar.d.ts.map +1 -0
  120. package/dist/components/MkProgressBar.js +9 -0
  121. package/dist/components/MkProgressBar.js.map +1 -0
  122. package/dist/components/MkProgressBar.module.css +48 -0
  123. package/dist/components/MkRadio.d.ts +34 -0
  124. package/dist/components/MkRadio.d.ts.map +1 -0
  125. package/dist/components/MkRadio.js +21 -0
  126. package/dist/components/MkRadio.js.map +1 -0
  127. package/dist/components/MkRadio.module.css +74 -0
  128. package/dist/components/MkSearchInput.d.ts +30 -0
  129. package/dist/components/MkSearchInput.d.ts.map +1 -0
  130. package/dist/components/MkSearchInput.js +29 -0
  131. package/dist/components/MkSearchInput.js.map +1 -0
  132. package/dist/components/MkSearchInput.module.css +80 -0
  133. package/dist/components/MkSelect.d.ts +23 -0
  134. package/dist/components/MkSelect.d.ts.map +1 -0
  135. package/dist/components/MkSelect.js +61 -0
  136. package/dist/components/MkSelect.js.map +1 -0
  137. package/dist/components/MkSelect.module.css +177 -0
  138. package/dist/components/MkSkeleton.d.ts +22 -0
  139. package/dist/components/MkSkeleton.d.ts.map +1 -0
  140. package/dist/components/MkSkeleton.js +23 -0
  141. package/dist/components/MkSkeleton.js.map +1 -0
  142. package/dist/components/MkSkeleton.module.css +28 -0
  143. package/dist/components/MkSwitch.d.ts +22 -0
  144. package/dist/components/MkSwitch.d.ts.map +1 -0
  145. package/dist/components/MkSwitch.js +16 -0
  146. package/dist/components/MkSwitch.js.map +1 -0
  147. package/dist/components/MkSwitch.module.css +108 -0
  148. package/dist/components/MkTable.d.ts +27 -0
  149. package/dist/components/MkTable.d.ts.map +1 -0
  150. package/dist/components/MkTable.js +13 -0
  151. package/dist/components/MkTable.js.map +1 -0
  152. package/dist/components/MkTable.module.css +163 -0
  153. package/dist/components/MkTabs.d.ts +22 -0
  154. package/dist/components/MkTabs.d.ts.map +1 -0
  155. package/dist/components/MkTabs.js +19 -0
  156. package/dist/components/MkTabs.js.map +1 -0
  157. package/dist/components/MkTabs.module.css +117 -0
  158. package/dist/components/MkTextArea.d.ts +21 -0
  159. package/dist/components/MkTextArea.d.ts.map +1 -0
  160. package/dist/components/MkTextArea.js +10 -0
  161. package/dist/components/MkTextArea.js.map +1 -0
  162. package/dist/components/MkThemeEditor.d.ts +8 -0
  163. package/dist/components/MkThemeEditor.d.ts.map +1 -0
  164. package/dist/components/MkThemeEditor.js +45 -0
  165. package/dist/components/MkThemeEditor.js.map +1 -0
  166. package/dist/components/MkThemeEditor.module.css +177 -0
  167. package/dist/components/MkToastContainer.d.ts +3 -0
  168. package/dist/components/MkToastContainer.d.ts.map +1 -0
  169. package/dist/components/MkToastContainer.js +81 -0
  170. package/dist/components/MkToastContainer.js.map +1 -0
  171. package/dist/components/MkToastContainer.module.css +95 -0
  172. package/dist/components/MkTooltip.d.ts +14 -0
  173. package/dist/components/MkTooltip.d.ts.map +1 -0
  174. package/dist/components/MkTooltip.js +19 -0
  175. package/dist/components/MkTooltip.js.map +1 -0
  176. package/dist/components/MkTooltip.module.css +43 -0
  177. package/dist/components/MkWindowList.d.ts +20 -0
  178. package/dist/components/MkWindowList.d.ts.map +1 -0
  179. package/dist/components/MkWindowList.js +61 -0
  180. package/dist/components/MkWindowList.js.map +1 -0
  181. package/dist/components/MkWindowList.module.css +59 -0
  182. package/dist/components/index.d.ts +31 -0
  183. package/dist/components/index.d.ts.map +1 -0
  184. package/dist/components/index.js +34 -0
  185. package/dist/components/index.js.map +1 -0
  186. package/dist/context/MkApiContext.d.ts +15 -0
  187. package/dist/context/MkApiContext.d.ts.map +1 -0
  188. package/dist/context/MkApiContext.js +30 -0
  189. package/dist/context/MkApiContext.js.map +1 -0
  190. package/dist/context/MkAuthContext.d.ts +20 -0
  191. package/dist/context/MkAuthContext.d.ts.map +1 -0
  192. package/dist/context/MkAuthContext.js +90 -0
  193. package/dist/context/MkAuthContext.js.map +1 -0
  194. package/dist/context/MkConfirmContext.d.ts +8 -0
  195. package/dist/context/MkConfirmContext.d.ts.map +1 -0
  196. package/dist/context/MkConfirmContext.js +39 -0
  197. package/dist/context/MkConfirmContext.js.map +1 -0
  198. package/dist/context/MkToastContext.d.ts +8 -0
  199. package/dist/context/MkToastContext.d.ts.map +1 -0
  200. package/dist/context/MkToastContext.js +64 -0
  201. package/dist/context/MkToastContext.js.map +1 -0
  202. package/dist/hooks/useApi.d.ts +19 -0
  203. package/dist/hooks/useApi.d.ts.map +1 -0
  204. package/dist/hooks/useApi.js +82 -0
  205. package/dist/hooks/useApi.js.map +1 -0
  206. package/dist/hooks/useApi.test.d.ts +2 -0
  207. package/dist/hooks/useApi.test.d.ts.map +1 -0
  208. package/dist/hooks/useApi.test.js +186 -0
  209. package/dist/hooks/useApi.test.js.map +1 -0
  210. package/dist/hooks/useMkClickOutside.d.ts +8 -0
  211. package/dist/hooks/useMkClickOutside.d.ts.map +1 -0
  212. package/dist/hooks/useMkClickOutside.js +26 -0
  213. package/dist/hooks/useMkClickOutside.js.map +1 -0
  214. package/dist/hooks/useMkCrud.d.ts +39 -0
  215. package/dist/hooks/useMkCrud.d.ts.map +1 -0
  216. package/dist/hooks/useMkCrud.js +121 -0
  217. package/dist/hooks/useMkCrud.js.map +1 -0
  218. package/dist/hooks/useMkCrud.test.d.ts +2 -0
  219. package/dist/hooks/useMkCrud.test.d.ts.map +1 -0
  220. package/dist/hooks/useMkCrud.test.js +89 -0
  221. package/dist/hooks/useMkCrud.test.js.map +1 -0
  222. package/dist/hooks/useMkDebounce.d.ts +24 -0
  223. package/dist/hooks/useMkDebounce.d.ts.map +1 -0
  224. package/dist/hooks/useMkDebounce.js +38 -0
  225. package/dist/hooks/useMkDebounce.js.map +1 -0
  226. package/dist/hooks/useMkEffectDebug.d.ts +7 -0
  227. package/dist/hooks/useMkEffectDebug.d.ts.map +1 -0
  228. package/dist/hooks/useMkEffectDebug.js +26 -0
  229. package/dist/hooks/useMkEffectDebug.js.map +1 -0
  230. package/dist/hooks/useMkEvent.d.ts +31 -0
  231. package/dist/hooks/useMkEvent.d.ts.map +1 -0
  232. package/dist/hooks/useMkEvent.js +56 -0
  233. package/dist/hooks/useMkEvent.js.map +1 -0
  234. package/dist/hooks/useMkForm.d.ts +43 -0
  235. package/dist/hooks/useMkForm.d.ts.map +1 -0
  236. package/dist/hooks/useMkForm.js +115 -0
  237. package/dist/hooks/useMkForm.js.map +1 -0
  238. package/dist/hooks/useMkForm.test.d.ts +2 -0
  239. package/dist/hooks/useMkForm.test.d.ts.map +1 -0
  240. package/dist/hooks/useMkForm.test.js +81 -0
  241. package/dist/hooks/useMkForm.test.js.map +1 -0
  242. package/dist/hooks/useMkInViewPort.d.ts +14 -0
  243. package/dist/hooks/useMkInViewPort.d.ts.map +1 -0
  244. package/dist/hooks/useMkInViewPort.js +31 -0
  245. package/dist/hooks/useMkInViewPort.js.map +1 -0
  246. package/dist/hooks/useMkInfiniteList.d.ts +15 -0
  247. package/dist/hooks/useMkInfiniteList.d.ts.map +1 -0
  248. package/dist/hooks/useMkInfiniteList.js +47 -0
  249. package/dist/hooks/useMkInfiniteList.js.map +1 -0
  250. package/dist/hooks/useMkList.d.ts +61 -0
  251. package/dist/hooks/useMkList.d.ts.map +1 -0
  252. package/dist/hooks/useMkList.js +54 -0
  253. package/dist/hooks/useMkList.js.map +1 -0
  254. package/dist/hooks/useMkLocalStorage.d.ts +6 -0
  255. package/dist/hooks/useMkLocalStorage.d.ts.map +1 -0
  256. package/dist/hooks/useMkLocalStorage.js +33 -0
  257. package/dist/hooks/useMkLocalStorage.js.map +1 -0
  258. package/dist/hooks/useMkLongPress.d.ts +37 -0
  259. package/dist/hooks/useMkLongPress.d.ts.map +1 -0
  260. package/dist/hooks/useMkLongPress.js +59 -0
  261. package/dist/hooks/useMkLongPress.js.map +1 -0
  262. package/dist/hooks/useMkMediaQuery.d.ts +14 -0
  263. package/dist/hooks/useMkMediaQuery.d.ts.map +1 -0
  264. package/dist/hooks/useMkMediaQuery.js +31 -0
  265. package/dist/hooks/useMkMediaQuery.js.map +1 -0
  266. package/dist/hooks/useMkPrevious.d.ts +7 -0
  267. package/dist/hooks/useMkPrevious.d.ts.map +1 -0
  268. package/dist/hooks/useMkPrevious.js +14 -0
  269. package/dist/hooks/useMkPrevious.js.map +1 -0
  270. package/dist/hooks/useMkScreenSize.d.ts +25 -0
  271. package/dist/hooks/useMkScreenSize.d.ts.map +1 -0
  272. package/dist/hooks/useMkScreenSize.js +43 -0
  273. package/dist/hooks/useMkScreenSize.js.map +1 -0
  274. package/dist/hooks/useMkStore.d.ts +22 -0
  275. package/dist/hooks/useMkStore.d.ts.map +1 -0
  276. package/dist/hooks/useMkStore.js +58 -0
  277. package/dist/hooks/useMkStore.js.map +1 -0
  278. package/dist/hooks/useMkToggle.d.ts +6 -0
  279. package/dist/hooks/useMkToggle.d.ts.map +1 -0
  280. package/dist/hooks/useMkToggle.js +13 -0
  281. package/dist/hooks/useMkToggle.js.map +1 -0
  282. package/dist/index.d.ts +33 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +37 -0
  285. package/dist/index.js.map +1 -0
  286. package/dist/styles/index.css +124 -0
  287. package/dist/test-setup.d.ts +2 -0
  288. package/dist/test-setup.d.ts.map +1 -0
  289. package/dist/test-setup.js +2 -0
  290. package/dist/test-setup.js.map +1 -0
  291. package/dist/theme/MkThemeProvider.d.ts +20 -0
  292. package/dist/theme/MkThemeProvider.d.ts.map +1 -0
  293. package/dist/theme/MkThemeProvider.js +91 -0
  294. package/dist/theme/MkThemeProvider.js.map +1 -0
  295. package/dist/utils/images.d.ts +9 -0
  296. package/dist/utils/images.d.ts.map +1 -0
  297. package/dist/utils/images.js +50 -0
  298. package/dist/utils/images.js.map +1 -0
  299. package/eslint-plugin-mk/__tests__/no-cross-module-import.test.js +66 -0
  300. package/eslint-plugin-mk/index.js +29 -0
  301. package/eslint-plugin-mk/rules/no-cross-module-import.js +71 -0
  302. package/package.json +62 -0
package/LICENSE ADDED
@@ -0,0 +1,33 @@
1
+ # LICENSE
2
+
3
+ **Proprietary License - MK-Director**
4
+
5
+ Copyright (c) 2026 Condaty. All rights reserved.
6
+
7
+ This software and associated documentation files (the "Software") are the proprietary property of Condaty ("Owner"). The Software may not be copied, modified, merged, published, distributed, sublicensed, and/or sold without the express written permission of the Owner.
8
+
9
+ ## Terms of Use
10
+
11
+ 1. **Authorization**: Access to this software is granted only to authorized users who have purchased a valid license from Condaty.
12
+
13
+ 2. **Restrictions**: Without prior written permission from the Owner, you may not:
14
+ - Copy, modify, or create derivative works
15
+ - Distribute, sublicense, or sell copies of the Software
16
+ - Reverse engineer, decompile, or disassemble the Software
17
+ - Use the Software for commercial purposes without a valid license
18
+
19
+ 3. **No Warranty**: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+
21
+ 4. **Liability**: IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ 5. **Termination**: This license is effective until terminated. Your rights under this license will terminate automatically without notice if you fail to comply with any of its terms and conditions.
24
+
25
+ ## Contact
26
+
27
+ For licensing inquiries, please contact:
28
+ - **Email**: licensing@condaty.com
29
+ - **Website**: https://www.conday.com
30
+
31
+ ---
32
+
33
+ *Last updated: April 2026*
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @makroz/web
2
+
3
+ Librería de componentes UI para proyectos Web (React). Enfocada en performance y personalización extrema.
4
+
5
+ ## Características Core
6
+ - **Native CSS Theming**: Todo el look se controla via variables CSS (`--mk-primary`, etc.). Sin Tailwind.
7
+ - **Micro-Animations**: Transiciones fluidas y estados activos integrados.
8
+ - **useApi Hook**: Comunicación estandarizada con backend MK-Director, manejando loading/error/success automáticamente.
9
+
10
+ ## Instalación & Tematización
11
+ Importa los estilos en tu root:
12
+ ```typescript
13
+ import '@makroz/web/styles/index.css';
14
+ ```
15
+
16
+ Personaliza el tema redefiniendo variables en tu CSS global:
17
+ ```css
18
+ :root {
19
+ --mk-primary: #your-color;
20
+ --mk-radius: 4px;
21
+ }
22
+ ```
@@ -0,0 +1,43 @@
1
+ import type { AdminDto } from './types';
2
+ /**
3
+ * Shape of the value exposed by `<MkAuthProvider>`.
4
+ *
5
+ * The provider is intentionally minimal: it only knows about the
6
+ * current scope, the cached `user`, and the auth lifecycle (`login`,
7
+ * `logout`, `refresh`, `hasAbility`). Token persistence is internal —
8
+ * callers never see the raw tokens, only the boolean/typed results.
9
+ */
10
+ export interface MkAuthContextValue {
11
+ /** The currently authenticated admin, or `null` if signed out. */
12
+ user: AdminDto | null;
13
+ /** True once the provider has completed its initial bootstrap (me/refresh). */
14
+ isLoading: boolean;
15
+ /** True iff `user !== null`. */
16
+ isAuthenticated: boolean;
17
+ /** Last error from login/refresh, cleared on the next successful call. */
18
+ error: Error | null;
19
+ /**
20
+ * Exchange email + password for tokens, persist them, and set `user`.
21
+ * On failure throws — the form catches and renders the error inline.
22
+ */
23
+ login: (email: string, password: string) => Promise<AdminDto>;
24
+ /**
25
+ * Hit the logout endpoint, clear the local cache, drop `user`.
26
+ * Best-effort: even if the network call fails, the local state is cleared.
27
+ */
28
+ logout: () => Promise<void>;
29
+ /**
30
+ * Manually trigger a token refresh and re-fetch the current user.
31
+ * Mostly used internally on mount, but exposed so consumers can
32
+ * force-refresh after a permission change, for example.
33
+ */
34
+ refresh: () => Promise<AdminDto | null>;
35
+ /**
36
+ * True iff the current user's `abilities` array contains `ability`
37
+ * (exact match). The backend may return wildcard scopes in the
38
+ * future; for now it's a plain array of strings.
39
+ */
40
+ hasAbility: (ability: string) => boolean;
41
+ }
42
+ export declare const MkAuthContext: import("react").Context<MkAuthContextValue | undefined>;
43
+ //# sourceMappingURL=MkAuthContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthContext.d.ts","sourceRoot":"","sources":["../../src/auth/MkAuthContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAC/B,kEAAkE;IAClE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,+EAA+E;IAC/E,SAAS,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB;;;OAGG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9D;;;OAGG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;OAIG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAED,eAAO,MAAM,aAAa,yDAA2D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createContext } from 'react';
2
+ export const MkAuthContext = createContext(undefined);
3
+ //# sourceMappingURL=MkAuthContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthContext.js","sourceRoot":"","sources":["../../src/auth/MkAuthContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAgDtC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAiC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface MkAuthFormProps {
2
+ /** Auth scope to use, e.g. "admin", "member", "guard". */
3
+ scope: string;
4
+ /**
5
+ * Path to navigate to after a successful login. Defaults to
6
+ * `/{scope}/dashboard`. Use a fully qualified path or a relative one
7
+ * — this component only triggers a callback.
8
+ */
9
+ redirectAfterLogin?: string;
10
+ /**
11
+ * Show a "¿Olvidaste tu contraseña?" link below the submit button.
12
+ * Defaults to `true`.
13
+ */
14
+ showForgotPassword?: boolean;
15
+ /**
16
+ * Optional: invoked after a successful login. Receives the resolved
17
+ * `AdminDto` and the `redirectAfterLogin` value so the host can do
18
+ * `router.push(...)` with its own router. When omitted, the
19
+ * component only logs the success.
20
+ */
21
+ onLoginSuccess?: (admin: {
22
+ id: string;
23
+ email: string;
24
+ }, redirectTo: string) => void;
25
+ /**
26
+ * Optional: invoked when the user clicks the forgot-password link.
27
+ * When omitted, the link is rendered as a plain `<a href="/{scope}/forgot">`
28
+ * — sufficient for any routing setup.
29
+ */
30
+ onForgotPassword?: () => void;
31
+ }
32
+ /**
33
+ * Minimal, dependency-free login form. Renders email + password fields,
34
+ * a submit button, an inline error region, and an optional
35
+ * "¿Olvidaste tu contraseña?" link.
36
+ *
37
+ * Validation is intentionally simple (non-empty + email shape) — the
38
+ * server is the source of truth, and this keeps the component focused
39
+ * on the auth lifecycle.
40
+ */
41
+ export declare function MkAuthForm({ scope, redirectAfterLogin, showForgotPassword, onLoginSuccess, onForgotPassword, }: MkAuthFormProps): React.JSX.Element;
42
+ //# sourceMappingURL=MkAuthForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthForm.d.ts","sourceRoot":"","sources":["../../src/auth/MkAuthForm.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAOD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,kBAAkB,EAClB,kBAAyB,EACzB,cAAc,EACd,gBAAgB,GACnB,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqIrC"}
@@ -0,0 +1,53 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useCallback, useMemo } from 'react';
4
+ import { useMkAuth } from './useMkAuth';
5
+ import { MkInput } from '../components/MkInput';
6
+ import { MkButton } from '../components/MkButton';
7
+ /**
8
+ * Minimal, dependency-free login form. Renders email + password fields,
9
+ * a submit button, an inline error region, and an optional
10
+ * "¿Olvidaste tu contraseña?" link.
11
+ *
12
+ * Validation is intentionally simple (non-empty + email shape) — the
13
+ * server is the source of truth, and this keeps the component focused
14
+ * on the auth lifecycle.
15
+ */
16
+ export function MkAuthForm({ scope, redirectAfterLogin, showForgotPassword = true, onLoginSuccess, onForgotPassword, }) {
17
+ const { login, error, isLoading } = useMkAuth();
18
+ const [state, setState] = useState({ email: '', password: '' });
19
+ const [submitting, setSubmitting] = useState(false);
20
+ const target = useMemo(() => redirectAfterLogin !== null && redirectAfterLogin !== void 0 ? redirectAfterLogin : `/${scope}/dashboard`, [redirectAfterLogin, scope]);
21
+ const handleChange = useCallback((field) => (value) => {
22
+ setState((prev) => (Object.assign(Object.assign({}, prev), { [field]: value })));
23
+ }, []);
24
+ const handleSubmit = useCallback((e) => {
25
+ e.preventDefault();
26
+ if (submitting || isLoading)
27
+ return;
28
+ setSubmitting(true);
29
+ // Error is surfaced via `error` from `useMkAuth`; we just need to
30
+ // reset submitting on completion.
31
+ void login(state.email.trim(), state.password)
32
+ .then((admin) => onLoginSuccess === null || onLoginSuccess === void 0 ? void 0 : onLoginSuccess({ id: admin.id, email: admin.email }, target))
33
+ .finally(() => setSubmitting(false));
34
+ }, [submitting, isLoading, login, state.email, state.password, onLoginSuccess, target]);
35
+ // `MkInput` calls `onChange(value: string)`; we forward to our state
36
+ // setter. We don't pass the native event through because the existing
37
+ // `MkInput` signature strips it.
38
+ const onEmailChange = useCallback((v) => handleChange('email')(v), [handleChange]);
39
+ const onPasswordChange = useCallback((v) => handleChange('password')(v), [handleChange]);
40
+ const errorMessage = error ? error.message : null;
41
+ return (_jsxs("form", { "data-mk-auth-scope": scope, onSubmit: handleSubmit, noValidate: true, "aria-busy": submitting || isLoading, style: { display: 'flex', flexDirection: 'column', gap: 12 }, children: [_jsxs("div", { children: [_jsx("label", { htmlFor: `${scope}-email`, children: "Email" }), _jsx(MkInput, { id: `${scope}-email`, name: "email", type: "email", autoComplete: "email", required: true, value: state.email, onChange: onEmailChange, disabled: submitting || isLoading, placeholder: "admin@example.com" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: `${scope}-password`, children: "Contrase\u00F1a" }), _jsx(MkInput, { id: `${scope}-password`, name: "password", type: "password", autoComplete: "current-password", required: true, value: state.password, onChange: onPasswordChange, disabled: submitting || isLoading })] }), errorMessage ? (_jsx("div", { role: "alert", "data-mk-auth-error": true, style: {
42
+ color: 'var(--mk-color-error, #d32f2f)',
43
+ fontSize: 14,
44
+ }, children: errorMessage })) : null, _jsx(MkButton, { type: "submit", variant: "primary", loading: submitting || isLoading, disabled: submitting || isLoading || !state.email || !state.password, children: "Iniciar sesi\u00F3n" }), showForgotPassword ? (_jsx("div", { style: { fontSize: 14, textAlign: 'center' }, children: onForgotPassword ? (_jsx("button", { type: "button", onClick: onForgotPassword, style: {
45
+ background: 'none',
46
+ border: 'none',
47
+ color: 'var(--mk-color-primary, #1976d2)',
48
+ cursor: 'pointer',
49
+ padding: 0,
50
+ textDecoration: 'underline',
51
+ }, children: "\u00BFOlvidaste tu contrase\u00F1a?" })) : (_jsx("a", { href: `/${scope}/forgot`, style: { color: 'var(--mk-color-primary, #1976d2)' }, children: "\u00BFOlvidaste tu contrase\u00F1a?" })) })) : null] }));
52
+ }
53
+ //# sourceMappingURL=MkAuthForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthForm.js","sourceRoot":"","sources":["../../src/auth/MkAuthForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { AuthStorageAdapter } from './types';
3
+ export interface MkAuthProviderProps {
4
+ /** Logical scope of this provider, e.g. "admin", "member", "guard". */
5
+ scope: string;
6
+ /**
7
+ * Base URL of the API. The provider appends `/api/${scope}/auth/...`
8
+ * to it. Trailing slashes are tolerated.
9
+ */
10
+ apiBaseUrl: string;
11
+ /** Children wrapped by the provider. */
12
+ children: ReactNode;
13
+ /**
14
+ * Optional storage adapter. Defaults to `window.localStorage` when
15
+ * available. Tests pass an in-memory adapter.
16
+ */
17
+ storage?: AuthStorageAdapter;
18
+ /**
19
+ * Optional: inject a custom `fetch` implementation (e.g. for tests
20
+ * that polyfill `global.fetch` differently). Defaults to `globalThis.fetch`.
21
+ */
22
+ fetcher?: typeof fetch;
23
+ }
24
+ /**
25
+ * `<QueryClientProvider>` + `<MkAuthProviderInner>`. The outer wrapper
26
+ * exists so consumers don't have to remember to also mount a
27
+ * `QueryClient` — the auth provider is self-contained.
28
+ */
29
+ export declare function MkAuthProvider(props: MkAuthProviderProps): React.JSX.Element;
30
+ //# sourceMappingURL=MkAuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthProvider.d.ts","sourceRoot":"","sources":["../../src/auth/MkAuthProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,OAAO,KAAK,EAER,kBAAkB,EAKrB,MAAM,SAAS,CAAC;AAmBjB,MAAM,WAAW,mBAAmB;IAChC,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAwSD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkB5E"}
@@ -0,0 +1,319 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState, useCallback } from 'react';
4
+ import { QueryClient, QueryClientProvider, useQuery, useMutation, useQueryClient, } from '@tanstack/react-query';
5
+ import { MkAuthContext } from './MkAuthContext';
6
+ const DEFAULT_STORAGE = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined'
7
+ ? {
8
+ getItem: (key) => window.localStorage.getItem(key),
9
+ setItem: (key, value) => window.localStorage.setItem(key, value),
10
+ removeItem: (key) => window.localStorage.removeItem(key),
11
+ }
12
+ : undefined;
13
+ function tokenKey(scope, kind) {
14
+ return `mk_auth_${scope}_${kind}_token`;
15
+ }
16
+ function userKey(scope) {
17
+ return `mk_auth_${scope}_user`;
18
+ }
19
+ /**
20
+ * Internal provider — owns the React Query client and the auth state.
21
+ * Exported only as `<MkAuthProvider>`, which wraps it in
22
+ * `<QueryClientProvider>`.
23
+ */
24
+ function MkAuthProviderInner({ scope, apiBaseUrl, children, storage = DEFAULT_STORAGE, fetcher, }) {
25
+ var _a, _b, _c;
26
+ const normalizedBase = apiBaseUrl.replace(/\/+$/, '');
27
+ const queryClient = useQueryClient();
28
+ const fetchImpl = fetcher !== null && fetcher !== void 0 ? fetcher : (_a = globalThis.fetch) === null || _a === void 0 ? void 0 : _a.bind(globalThis);
29
+ // Persisted token + user snapshots (read on first render only, to keep
30
+ // `useState` initializer cheap; we still write back on every change).
31
+ const initialAccess = (_b = storage === null || storage === void 0 ? void 0 : storage.getItem(tokenKey(scope, 'access'))) !== null && _b !== void 0 ? _b : null;
32
+ const initialRefresh = (_c = storage === null || storage === void 0 ? void 0 : storage.getItem(tokenKey(scope, 'refresh'))) !== null && _c !== void 0 ? _c : null;
33
+ const initialUserJson = storage === null || storage === void 0 ? void 0 : storage.getItem(userKey(scope));
34
+ const initialUser = useRef(initialUserJson ? safeParse(initialUserJson) : null).current;
35
+ const [user, setUserState] = useState(initialUser);
36
+ const [error, setError] = useState(null);
37
+ const persistUser = useCallback((next) => {
38
+ if (!storage)
39
+ return;
40
+ if (next) {
41
+ storage.setItem(userKey(scope), JSON.stringify(next));
42
+ }
43
+ else {
44
+ storage.removeItem(userKey(scope));
45
+ }
46
+ }, [scope, storage]);
47
+ const persistTokens = useCallback((access, refresh) => {
48
+ if (!storage)
49
+ return;
50
+ if (access) {
51
+ storage.setItem(tokenKey(scope, 'access'), access);
52
+ }
53
+ else {
54
+ storage.removeItem(tokenKey(scope, 'access'));
55
+ }
56
+ if (refresh) {
57
+ storage.setItem(tokenKey(scope, 'refresh'), refresh);
58
+ }
59
+ else {
60
+ storage.removeItem(tokenKey(scope, 'refresh'));
61
+ }
62
+ }, [scope, storage]);
63
+ const clearAll = useCallback(() => {
64
+ persistTokens(null, null);
65
+ persistUser(null);
66
+ }, [persistTokens, persistUser]);
67
+ const setUser = useCallback((next) => {
68
+ setUserState(next);
69
+ persistUser(next);
70
+ }, [persistUser]);
71
+ // ---- /me query ---------------------------------------------------------
72
+ // Re-runs whenever the mutation cache is invalidated (after login/logout/
73
+ // refresh) via the `refetchType: 'all'` policy below.
74
+ const meQuery = useQuery({
75
+ queryKey: ['mk-auth', scope, 'me'],
76
+ queryFn: async ({ signal }) => {
77
+ var _a;
78
+ const access = (_a = storage === null || storage === void 0 ? void 0 : storage.getItem(tokenKey(scope, 'access'))) !== null && _a !== void 0 ? _a : null;
79
+ if (!access) {
80
+ throw new Error('No access token available');
81
+ }
82
+ const res = await fetchImpl(`${normalizedBase}/api/${scope}/auth/me`, {
83
+ method: 'GET',
84
+ headers: {
85
+ Accept: 'application/json',
86
+ Authorization: `Bearer ${access}`,
87
+ },
88
+ signal,
89
+ });
90
+ if (res.status === 401) {
91
+ throw unauthorized();
92
+ }
93
+ if (!res.ok) {
94
+ throw new Error(`Failed to fetch user (${res.status})`);
95
+ }
96
+ const json = (await res.json());
97
+ const dto = json && typeof json === 'object' && 'data' in json
98
+ ? json.data
99
+ : json;
100
+ return dto;
101
+ },
102
+ enabled: Boolean(initialAccess) && Boolean(fetchImpl),
103
+ staleTime: 60000,
104
+ retry: false,
105
+ refetchOnWindowFocus: false,
106
+ });
107
+ // Keep `user` in sync with the latest successful /me response.
108
+ useEffect(() => {
109
+ if (meQuery.data) {
110
+ setUser(meQuery.data);
111
+ }
112
+ }, [meQuery.data, setUser]);
113
+ // ---- refresh mutation (also used on mount when /me 401s) ---------------
114
+ const refreshMutation = useMutation({
115
+ mutationFn: async () => {
116
+ var _a;
117
+ const refresh = (_a = storage === null || storage === void 0 ? void 0 : storage.getItem(tokenKey(scope, 'refresh'))) !== null && _a !== void 0 ? _a : null;
118
+ if (!refresh) {
119
+ throw new Error('No refresh token available');
120
+ }
121
+ const res = await fetchImpl(`${normalizedBase}/api/${scope}/auth/refresh`, {
122
+ method: 'POST',
123
+ headers: {
124
+ Accept: 'application/json',
125
+ 'Content-Type': 'application/json',
126
+ },
127
+ body: JSON.stringify({ refresh_token: refresh }),
128
+ });
129
+ if (!res.ok) {
130
+ throw unauthorized();
131
+ }
132
+ return (await res.json());
133
+ },
134
+ });
135
+ // ---- login mutation ----------------------------------------------------
136
+ const loginMutation = useMutation({
137
+ mutationFn: async (input) => {
138
+ const res = await fetchImpl(`${normalizedBase}/api/${scope}/auth/login`, {
139
+ method: 'POST',
140
+ headers: {
141
+ Accept: 'application/json',
142
+ 'Content-Type': 'application/json',
143
+ },
144
+ body: JSON.stringify(input),
145
+ });
146
+ if (!res.ok) {
147
+ const body = await safeReadError(res);
148
+ throw new Error(body !== null && body !== void 0 ? body : 'Invalid credentials');
149
+ }
150
+ return (await res.json());
151
+ },
152
+ onSuccess: (data) => {
153
+ persistTokens(data.access_token, data.refresh_token);
154
+ setUser(data.admin);
155
+ },
156
+ });
157
+ // ---- logout mutation ---------------------------------------------------
158
+ const logoutMutation = useMutation({
159
+ mutationFn: async () => {
160
+ const access = storage === null || storage === void 0 ? void 0 : storage.getItem(tokenKey(scope, 'access'));
161
+ if (!access)
162
+ return;
163
+ const res = await fetchImpl(`${normalizedBase}/api/${scope}/auth/logout`, {
164
+ method: 'POST',
165
+ headers: {
166
+ Accept: 'application/json',
167
+ Authorization: `Bearer ${access}`,
168
+ },
169
+ });
170
+ // 204 No Content is the documented success. Anything else is logged
171
+ // but does not block local cleanup.
172
+ if (!res.ok && res.status !== 204) {
173
+ // eslint-disable-next-line no-console
174
+ console.warn(`Logout returned ${res.status}; clearing local state anyway.`);
175
+ }
176
+ },
177
+ onSettled: () => {
178
+ // Cancel any in-flight /me request and drop its cache so it
179
+ // cannot race the local state clear and re-populate `user`.
180
+ queryClient.cancelQueries({ queryKey: ['mk-auth', scope, 'me'] });
181
+ queryClient.removeQueries({ queryKey: ['mk-auth', scope, 'me'] });
182
+ clearAll();
183
+ setUser(null);
184
+ },
185
+ });
186
+ // ---- bootstrap ---------------------------------------------------------
187
+ // On mount: if we have tokens, /me runs. If /me 401s, try /refresh.
188
+ // If refresh fails, drop tokens and user.
189
+ const bootstrapped = useRef(false);
190
+ useEffect(() => {
191
+ if (bootstrapped.current)
192
+ return;
193
+ bootstrapped.current = true;
194
+ const access = initialAccess;
195
+ const refresh = initialRefresh;
196
+ if (!access) {
197
+ setUser(null);
198
+ return;
199
+ }
200
+ // /me will run automatically (enabled: true since we have access).
201
+ // We hook into its result via subscription below.
202
+ const unsubscribe = meQuery.refetch().then((result) => {
203
+ if (result.isError && refresh) {
204
+ // Try to refresh, then re-run /me.
205
+ refreshMutation
206
+ .mutateAsync()
207
+ .then((data) => {
208
+ persistTokens(data.access_token, data.refresh_token);
209
+ setUser(data.admin);
210
+ })
211
+ .catch(() => {
212
+ clearAll();
213
+ setUser(null);
214
+ });
215
+ }
216
+ else if (result.isError) {
217
+ clearAll();
218
+ setUser(null);
219
+ }
220
+ });
221
+ return () => {
222
+ unsubscribe.catch(() => {
223
+ /* swallow */
224
+ });
225
+ };
226
+ // We intentionally only run this once on mount.
227
+ // eslint-disable-next-line react-hooks/exhaustive-deps
228
+ }, []);
229
+ // ---- exposed API -------------------------------------------------------
230
+ const refresh = useCallback(async () => {
231
+ try {
232
+ const data = await refreshMutation.mutateAsync();
233
+ persistTokens(data.access_token, data.refresh_token);
234
+ setUser(data.admin);
235
+ return data.admin;
236
+ }
237
+ catch (_a) {
238
+ clearAll();
239
+ setUser(null);
240
+ return null;
241
+ }
242
+ }, [refreshMutation, persistTokens, setUser, clearAll]);
243
+ const login = useCallback(async (email, password) => {
244
+ setError(null);
245
+ try {
246
+ const data = await loginMutation.mutateAsync({ email, password });
247
+ return data.admin;
248
+ }
249
+ catch (err) {
250
+ const e = err instanceof Error ? err : new Error('Login failed');
251
+ setError(e);
252
+ throw e;
253
+ }
254
+ }, [loginMutation]);
255
+ const logout = useCallback(async () => {
256
+ // Even on network failure, local state has already been cleared by
257
+ // onSettled. Re-throw so callers can decide what to do.
258
+ await logoutMutation.mutateAsync();
259
+ }, [logoutMutation]);
260
+ const hasAbility = useCallback((ability) => {
261
+ if (!user)
262
+ return false;
263
+ return Array.isArray(user.abilities) && user.abilities.includes(ability);
264
+ }, [user]);
265
+ const isLoading = meQuery.isLoading || meQuery.isFetching || loginMutation.isPending;
266
+ const value = useMemo(() => ({
267
+ user,
268
+ isLoading,
269
+ isAuthenticated: user !== null,
270
+ error,
271
+ login,
272
+ logout,
273
+ refresh,
274
+ hasAbility,
275
+ }), [user, isLoading, error, login, logout, refresh, hasAbility]);
276
+ return _jsx(MkAuthContext.Provider, { value: value, children: children });
277
+ }
278
+ /**
279
+ * `<QueryClientProvider>` + `<MkAuthProviderInner>`. The outer wrapper
280
+ * exists so consumers don't have to remember to also mount a
281
+ * `QueryClient` — the auth provider is self-contained.
282
+ */
283
+ export function MkAuthProvider(props) {
284
+ const [client] = useState(() => new QueryClient({
285
+ defaultOptions: {
286
+ queries: {
287
+ retry: false,
288
+ refetchOnWindowFocus: false,
289
+ },
290
+ },
291
+ }));
292
+ return (_jsx(QueryClientProvider, { client: client, children: _jsx(MkAuthProviderInner, Object.assign({}, props)) }));
293
+ }
294
+ // ---- helpers --------------------------------------------------------------
295
+ function unauthorized() {
296
+ const e = new Error('Unauthorized');
297
+ e.name = 'UnauthorizedError';
298
+ return e;
299
+ }
300
+ function safeParse(json) {
301
+ try {
302
+ return JSON.parse(json);
303
+ }
304
+ catch (_a) {
305
+ return null;
306
+ }
307
+ }
308
+ async function safeReadError(res) {
309
+ try {
310
+ const body = (await res.json());
311
+ if (body && typeof body.message === 'string')
312
+ return body.message;
313
+ }
314
+ catch (_a) {
315
+ /* fallthrough */
316
+ }
317
+ return `Request failed (${res.status})`;
318
+ }
319
+ //# sourceMappingURL=MkAuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MkAuthProvider.js","sourceRoot":"","sources":["../../src/auth/MkAuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { AdminDto } from './types';
2
+ /**
3
+ * Shape of the value exposed by `<MkAuthProvider>`.
4
+ *
5
+ * The provider is intentionally minimal: it only knows about the
6
+ * current scope, the cached `user`, and the auth lifecycle (`login`,
7
+ * `logout`, `refresh`, `hasAbility`). Token persistence is internal —
8
+ * callers never see the raw tokens, only the boolean/typed results.
9
+ */
10
+ export interface MkAuthContextValue {
11
+ /** The currently authenticated admin, or `null` if signed out. */
12
+ user: AdminDto | null;
13
+ /** True once the provider has completed its initial bootstrap (me/refresh). */
14
+ isLoading: boolean;
15
+ /** True iff `user !== null`. */
16
+ isAuthenticated: boolean;
17
+ /** Last error from login/refresh, cleared on the next successful call. */
18
+ error: Error | null;
19
+ /**
20
+ * Exchange email + password for tokens, persist them, and set `user`.
21
+ * On failure throws — the form catches and renders the error inline.
22
+ */
23
+ login: (email: string, password: string) => Promise<AdminDto>;
24
+ /**
25
+ * Hit the logout endpoint, clear the local cache, drop `user`.
26
+ * Best-effort: even if the network call fails, the local state is cleared.
27
+ */
28
+ logout: () => Promise<void>;
29
+ /**
30
+ * Manually trigger a token refresh and re-fetch the current user.
31
+ * Mostly used internally on mount, but exposed so consumers can
32
+ * force-refresh after a permission change, for example.
33
+ */
34
+ refresh: () => Promise<AdminDto | null>;
35
+ /**
36
+ * True iff the current user's `abilities` array contains `ability`
37
+ * (exact match). The backend may return wildcard scopes in the
38
+ * future; for now it's a plain array of strings.
39
+ */
40
+ hasAbility: (ability: string) => boolean;
41
+ }
42
+ export declare const MkAuthContext: import("react").Context<MkAuthContextValue | undefined>;