@blimu/react 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/README.md +552 -0
  2. package/dist/_virtual/index.cjs +2 -0
  3. package/dist/_virtual/index.cjs.map +1 -0
  4. package/dist/_virtual/index.js +6 -0
  5. package/dist/_virtual/index.js.map +1 -0
  6. package/dist/_virtual/index2.cjs +2 -0
  7. package/dist/_virtual/index2.cjs.map +1 -0
  8. package/dist/_virtual/index2.js +5 -0
  9. package/dist/_virtual/index2.js.map +1 -0
  10. package/dist/_virtual/use-sync-external-store-shim.development.cjs +2 -0
  11. package/dist/_virtual/use-sync-external-store-shim.development.cjs.map +1 -0
  12. package/dist/_virtual/use-sync-external-store-shim.development.js +5 -0
  13. package/dist/_virtual/use-sync-external-store-shim.development.js.map +1 -0
  14. package/dist/_virtual/use-sync-external-store-shim.production.cjs +2 -0
  15. package/dist/_virtual/use-sync-external-store-shim.production.cjs.map +1 -0
  16. package/dist/_virtual/use-sync-external-store-shim.production.js +5 -0
  17. package/dist/_virtual/use-sync-external-store-shim.production.js.map +1 -0
  18. package/dist/client/auth.service.cjs +2 -0
  19. package/dist/client/auth.service.cjs.map +1 -0
  20. package/dist/client/auth.service.d.ts +50 -0
  21. package/dist/client/auth.service.d.ts.map +1 -0
  22. package/dist/client/auth.service.js +153 -0
  23. package/dist/client/auth.service.js.map +1 -0
  24. package/dist/client/auth.service.test-service.d.ts +39 -0
  25. package/dist/client/auth.service.test-service.d.ts.map +1 -0
  26. package/dist/client/external-store.cjs +2 -0
  27. package/dist/client/external-store.cjs.map +1 -0
  28. package/dist/client/external-store.d.ts +20 -0
  29. package/dist/client/external-store.d.ts.map +1 -0
  30. package/dist/client/external-store.js +13 -0
  31. package/dist/client/external-store.js.map +1 -0
  32. package/dist/client/runtime-client.cjs +2 -0
  33. package/dist/client/runtime-client.cjs.map +1 -0
  34. package/dist/client/runtime-client.d.ts +49 -0
  35. package/dist/client/runtime-client.d.ts.map +1 -0
  36. package/dist/client/runtime-client.js +103 -0
  37. package/dist/client/runtime-client.js.map +1 -0
  38. package/dist/components/index.d.ts +11 -0
  39. package/dist/components/index.d.ts.map +1 -0
  40. package/dist/components/members-list.cjs +2 -0
  41. package/dist/components/members-list.cjs.map +1 -0
  42. package/dist/components/members-list.d.ts +70 -0
  43. package/dist/components/members-list.d.ts.map +1 -0
  44. package/dist/components/members-list.js +111 -0
  45. package/dist/components/members-list.js.map +1 -0
  46. package/dist/components/redirect-to-sign-in.cjs +2 -0
  47. package/dist/components/redirect-to-sign-in.cjs.map +1 -0
  48. package/dist/components/redirect-to-sign-in.d.ts +39 -0
  49. package/dist/components/redirect-to-sign-in.d.ts.map +1 -0
  50. package/dist/components/redirect-to-sign-in.js +27 -0
  51. package/dist/components/redirect-to-sign-in.js.map +1 -0
  52. package/dist/components/sign-in-button/styles.d.ts +7 -0
  53. package/dist/components/sign-in-button/styles.d.ts.map +1 -0
  54. package/dist/components/sign-in-button.cjs +2 -0
  55. package/dist/components/sign-in-button.cjs.map +1 -0
  56. package/dist/components/sign-in-button.d.ts +47 -0
  57. package/dist/components/sign-in-button.d.ts.map +1 -0
  58. package/dist/components/sign-in-button.js +33 -0
  59. package/dist/components/sign-in-button.js.map +1 -0
  60. package/dist/components/ui/avatar.cjs +2 -0
  61. package/dist/components/ui/avatar.cjs.map +1 -0
  62. package/dist/components/ui/avatar.d.ts +7 -0
  63. package/dist/components/ui/avatar.d.ts.map +1 -0
  64. package/dist/components/ui/avatar.js +43 -0
  65. package/dist/components/ui/avatar.js.map +1 -0
  66. package/dist/components/ui/badge.d.ts +10 -0
  67. package/dist/components/ui/badge.d.ts.map +1 -0
  68. package/dist/components/ui/dropdown-menu.cjs +2 -0
  69. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  70. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  71. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  72. package/dist/components/ui/dropdown-menu.js +130 -0
  73. package/dist/components/ui/dropdown-menu.js.map +1 -0
  74. package/dist/components/ui/popover.d.ts +8 -0
  75. package/dist/components/ui/popover.d.ts.map +1 -0
  76. package/dist/components/ui/separator.d.ts +5 -0
  77. package/dist/components/ui/separator.d.ts.map +1 -0
  78. package/dist/components/user-avatar/styles.d.ts +7 -0
  79. package/dist/components/user-avatar/styles.d.ts.map +1 -0
  80. package/dist/components/user-avatar.cjs +2 -0
  81. package/dist/components/user-avatar.cjs.map +1 -0
  82. package/dist/components/user-avatar.d.ts +41 -0
  83. package/dist/components/user-avatar.d.ts.map +1 -0
  84. package/dist/components/user-avatar.js +23 -0
  85. package/dist/components/user-avatar.js.map +1 -0
  86. package/dist/components/user-button/styles.cjs +2 -0
  87. package/dist/components/user-button/styles.cjs.map +1 -0
  88. package/dist/components/user-button/styles.d.ts +17 -0
  89. package/dist/components/user-button/styles.d.ts.map +1 -0
  90. package/dist/components/user-button/styles.js +39 -0
  91. package/dist/components/user-button/styles.js.map +1 -0
  92. package/dist/components/user-button/user-button.cjs +2 -0
  93. package/dist/components/user-button/user-button.cjs.map +1 -0
  94. package/dist/components/user-button/user-button.d.ts +15 -0
  95. package/dist/components/user-button/user-button.d.ts.map +1 -0
  96. package/dist/components/user-button/user-button.js +93 -0
  97. package/dist/components/user-button/user-button.js.map +1 -0
  98. package/dist/components.cjs +2 -0
  99. package/dist/components.cjs.map +1 -0
  100. package/dist/components.js +13 -0
  101. package/dist/components.js.map +1 -0
  102. package/dist/hooks/index.d.ts +7 -0
  103. package/dist/hooks/index.d.ts.map +1 -0
  104. package/dist/hooks/use-auth.cjs +2 -0
  105. package/dist/hooks/use-auth.cjs.map +1 -0
  106. package/dist/hooks/use-auth.d.ts +92 -0
  107. package/dist/hooks/use-auth.d.ts.map +1 -0
  108. package/dist/hooks/use-auth.js +41 -0
  109. package/dist/hooks/use-auth.js.map +1 -0
  110. package/dist/hooks/use-client.cjs +2 -0
  111. package/dist/hooks/use-client.cjs.map +1 -0
  112. package/dist/hooks/use-client.d.ts +27 -0
  113. package/dist/hooks/use-client.d.ts.map +1 -0
  114. package/dist/hooks/use-client.js +9 -0
  115. package/dist/hooks/use-client.js.map +1 -0
  116. package/dist/hooks/use-members.cjs +2 -0
  117. package/dist/hooks/use-members.cjs.map +1 -0
  118. package/dist/hooks/use-members.d.ts +50 -0
  119. package/dist/hooks/use-members.d.ts.map +1 -0
  120. package/dist/hooks/use-members.js +49 -0
  121. package/dist/hooks/use-members.js.map +1 -0
  122. package/dist/hooks/use-store.cjs +2 -0
  123. package/dist/hooks/use-store.cjs.map +1 -0
  124. package/dist/hooks/use-store.d.ts +24 -0
  125. package/dist/hooks/use-store.d.ts.map +1 -0
  126. package/dist/hooks/use-store.js +18 -0
  127. package/dist/hooks/use-store.js.map +1 -0
  128. package/dist/hooks.cjs +2 -0
  129. package/dist/hooks.cjs.map +1 -0
  130. package/dist/hooks.js +14 -0
  131. package/dist/hooks.js.map +1 -0
  132. package/dist/index.cjs +2 -0
  133. package/dist/index.cjs.map +1 -0
  134. package/dist/index.d.ts +13 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +38 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/lib/utils.cjs +2 -0
  139. package/dist/lib/utils.cjs.map +1 -0
  140. package/dist/lib/utils.d.ts +7 -0
  141. package/dist/lib/utils.d.ts.map +1 -0
  142. package/dist/lib/utils.js +9 -0
  143. package/dist/lib/utils.js.map +1 -0
  144. package/dist/lib/variants.cjs +2 -0
  145. package/dist/lib/variants.cjs.map +1 -0
  146. package/dist/lib/variants.d.ts +37 -0
  147. package/dist/lib/variants.d.ts.map +1 -0
  148. package/dist/lib/variants.js +46 -0
  149. package/dist/lib/variants.js.map +1 -0
  150. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.cjs +2 -0
  151. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.cjs.map +1 -0
  152. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js +528 -0
  153. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
  154. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.cjs +2 -0
  155. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.cjs.map +1 -0
  156. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +403 -0
  157. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  158. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs +2 -0
  159. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs.map +1 -0
  160. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js +209 -0
  161. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js.map +1 -0
  162. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.cjs +2 -0
  163. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.cjs.map +1 -0
  164. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.cjs +2 -0
  165. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.cjs.map +1 -0
  166. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +137 -0
  167. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  168. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +131 -0
  169. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  170. package/dist/node_modules/@radix-ui/primitive/dist/index.cjs +2 -0
  171. package/dist/node_modules/@radix-ui/primitive/dist/index.cjs.map +1 -0
  172. package/dist/node_modules/@radix-ui/primitive/dist/index.js +10 -0
  173. package/dist/node_modules/@radix-ui/primitive/dist/index.js.map +1 -0
  174. package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs +2 -0
  175. package/dist/node_modules/@radix-ui/react-arrow/dist/index.cjs.map +1 -0
  176. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js +25 -0
  177. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js.map +1 -0
  178. package/dist/node_modules/@radix-ui/react-avatar/dist/index.cjs +2 -0
  179. package/dist/node_modules/@radix-ui/react-avatar/dist/index.cjs.map +1 -0
  180. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js +76 -0
  181. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js.map +1 -0
  182. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.cjs +2 -0
  183. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -0
  184. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js +56 -0
  185. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  186. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
  187. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
  188. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js +33 -0
  189. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  190. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
  191. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
  192. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-slot/dist/index.js +59 -0
  193. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  194. package/dist/node_modules/@radix-ui/react-collection/dist/index.cjs +2 -0
  195. package/dist/node_modules/@radix-ui/react-collection/dist/index.cjs.map +1 -0
  196. package/dist/node_modules/@radix-ui/react-collection/dist/index.js +51 -0
  197. package/dist/node_modules/@radix-ui/react-collection/dist/index.js.map +1 -0
  198. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
  199. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
  200. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js +30 -0
  201. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js.map +1 -0
  202. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +2 -0
  203. package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -0
  204. package/dist/node_modules/@radix-ui/react-context/dist/index.js +54 -0
  205. package/dist/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  206. package/dist/node_modules/@radix-ui/react-direction/dist/index.cjs +2 -0
  207. package/dist/node_modules/@radix-ui/react-direction/dist/index.cjs.map +1 -0
  208. package/dist/node_modules/@radix-ui/react-direction/dist/index.js +11 -0
  209. package/dist/node_modules/@radix-ui/react-direction/dist/index.js.map +1 -0
  210. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +2 -0
  211. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -0
  212. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js +128 -0
  213. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +1 -0
  214. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.cjs +2 -0
  215. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.cjs.map +1 -0
  216. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +215 -0
  217. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +1 -0
  218. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +2 -0
  219. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs.map +1 -0
  220. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js +18 -0
  221. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js.map +1 -0
  222. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +2 -0
  223. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -0
  224. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js +137 -0
  225. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js.map +1 -0
  226. package/dist/node_modules/@radix-ui/react-id/dist/index.cjs +2 -0
  227. package/dist/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -0
  228. package/dist/node_modules/@radix-ui/react-id/dist/index.js +14 -0
  229. package/dist/node_modules/@radix-ui/react-id/dist/index.js.map +1 -0
  230. package/dist/node_modules/@radix-ui/react-menu/dist/index.cjs +2 -0
  231. package/dist/node_modules/@radix-ui/react-menu/dist/index.cjs.map +1 -0
  232. package/dist/node_modules/@radix-ui/react-menu/dist/index.js +609 -0
  233. package/dist/node_modules/@radix-ui/react-menu/dist/index.js.map +1 -0
  234. package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs +2 -0
  235. package/dist/node_modules/@radix-ui/react-popper/dist/index.cjs.map +1 -0
  236. package/dist/node_modules/@radix-ui/react-popper/dist/index.js +220 -0
  237. package/dist/node_modules/@radix-ui/react-popper/dist/index.js.map +1 -0
  238. package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs +2 -0
  239. package/dist/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -0
  240. package/dist/node_modules/@radix-ui/react-portal/dist/index.js +16 -0
  241. package/dist/node_modules/@radix-ui/react-portal/dist/index.js.map +1 -0
  242. package/dist/node_modules/@radix-ui/react-presence/dist/index.cjs +2 -0
  243. package/dist/node_modules/@radix-ui/react-presence/dist/index.cjs.map +1 -0
  244. package/dist/node_modules/@radix-ui/react-presence/dist/index.js +71 -0
  245. package/dist/node_modules/@radix-ui/react-presence/dist/index.js.map +1 -0
  246. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
  247. package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
  248. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js +37 -0
  249. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  250. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.cjs +2 -0
  251. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.cjs.map +1 -0
  252. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js +184 -0
  253. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js.map +1 -0
  254. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
  255. package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
  256. package/dist/node_modules/@radix-ui/react-slot/dist/index.js +50 -0
  257. package/dist/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  258. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
  259. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
  260. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js +11 -0
  261. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js.map +1 -0
  262. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +2 -0
  263. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs.map +1 -0
  264. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js +53 -0
  265. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js.map +1 -0
  266. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.cjs +2 -0
  267. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.cjs.map +1 -0
  268. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js +15 -0
  269. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js.map +1 -0
  270. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.cjs +2 -0
  271. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.cjs.map +1 -0
  272. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +16 -0
  273. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js.map +1 -0
  274. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +2 -0
  275. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs.map +1 -0
  276. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js +7 -0
  277. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js.map +1 -0
  278. package/dist/node_modules/@radix-ui/react-use-size/dist/index.cjs +2 -0
  279. package/dist/node_modules/@radix-ui/react-use-size/dist/index.cjs.map +1 -0
  280. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js +28 -0
  281. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js.map +1 -0
  282. package/dist/node_modules/aria-hidden/dist/es2015/index.cjs +2 -0
  283. package/dist/node_modules/aria-hidden/dist/es2015/index.cjs.map +1 -0
  284. package/dist/node_modules/aria-hidden/dist/es2015/index.js +53 -0
  285. package/dist/node_modules/aria-hidden/dist/es2015/index.js.map +1 -0
  286. package/dist/node_modules/class-variance-authority/dist/index.cjs +2 -0
  287. package/dist/node_modules/class-variance-authority/dist/index.cjs.map +1 -0
  288. package/dist/node_modules/class-variance-authority/dist/index.js +36 -0
  289. package/dist/node_modules/class-variance-authority/dist/index.js.map +1 -0
  290. package/dist/node_modules/clsx/dist/clsx.cjs +2 -0
  291. package/dist/node_modules/clsx/dist/clsx.cjs.map +1 -0
  292. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  293. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  294. package/dist/node_modules/get-nonce/dist/es2015/index.cjs +2 -0
  295. package/dist/node_modules/get-nonce/dist/es2015/index.cjs.map +1 -0
  296. package/dist/node_modules/get-nonce/dist/es2015/index.js +8 -0
  297. package/dist/node_modules/get-nonce/dist/es2015/index.js.map +1 -0
  298. package/dist/node_modules/js-cookie/dist/js.cookie.cjs +2 -0
  299. package/dist/node_modules/js-cookie/dist/js.cookie.cjs.map +1 -0
  300. package/dist/node_modules/js-cookie/dist/js.cookie.js +74 -0
  301. package/dist/node_modules/js-cookie/dist/js.cookie.js.map +1 -0
  302. package/dist/node_modules/jwt-decode/build/esm/index.cjs +2 -0
  303. package/dist/node_modules/jwt-decode/build/esm/index.cjs.map +1 -0
  304. package/dist/node_modules/jwt-decode/build/esm/index.js +53 -0
  305. package/dist/node_modules/jwt-decode/build/esm/index.js.map +1 -0
  306. package/dist/node_modules/lucide-react/dist/esm/Icon.cjs +2 -0
  307. package/dist/node_modules/lucide-react/dist/esm/Icon.cjs.map +1 -0
  308. package/dist/node_modules/lucide-react/dist/esm/Icon.js +36 -0
  309. package/dist/node_modules/lucide-react/dist/esm/Icon.js.map +1 -0
  310. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.cjs +2 -0
  311. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.cjs.map +1 -0
  312. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js +22 -0
  313. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +1 -0
  314. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.cjs +2 -0
  315. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.cjs.map +1 -0
  316. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js +15 -0
  317. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +1 -0
  318. package/dist/node_modules/lucide-react/dist/esm/icons/check.cjs +2 -0
  319. package/dist/node_modules/lucide-react/dist/esm/icons/check.cjs.map +1 -0
  320. package/dist/node_modules/lucide-react/dist/esm/icons/check.js +7 -0
  321. package/dist/node_modules/lucide-react/dist/esm/icons/check.js.map +1 -0
  322. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs +2 -0
  323. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs.map +1 -0
  324. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js +7 -0
  325. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +1 -0
  326. package/dist/node_modules/lucide-react/dist/esm/icons/circle.cjs +2 -0
  327. package/dist/node_modules/lucide-react/dist/esm/icons/circle.cjs.map +1 -0
  328. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js +7 -0
  329. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js.map +1 -0
  330. package/dist/node_modules/lucide-react/dist/esm/icons/log-out.cjs +2 -0
  331. package/dist/node_modules/lucide-react/dist/esm/icons/log-out.cjs.map +1 -0
  332. package/dist/node_modules/lucide-react/dist/esm/icons/log-out.js +11 -0
  333. package/dist/node_modules/lucide-react/dist/esm/icons/log-out.js.map +1 -0
  334. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.cjs +2 -0
  335. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.cjs.map +1 -0
  336. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js +19 -0
  337. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +1 -0
  338. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.cjs +2 -0
  339. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.cjs.map +1 -0
  340. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js +12 -0
  341. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js.map +1 -0
  342. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +5 -0
  343. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs.map +1 -0
  344. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js +116 -0
  345. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js.map +1 -0
  346. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.cjs +2 -0
  347. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.cjs.map +1 -0
  348. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js +32 -0
  349. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js.map +1 -0
  350. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.cjs +2 -0
  351. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.cjs.map +1 -0
  352. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js +17 -0
  353. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js.map +1 -0
  354. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.cjs +2 -0
  355. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.cjs.map +1 -0
  356. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js +69 -0
  357. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js.map +1 -0
  358. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.cjs +2 -0
  359. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.cjs.map +1 -0
  360. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js +6 -0
  361. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js.map +1 -0
  362. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.cjs +2 -0
  363. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.cjs.map +1 -0
  364. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js +8 -0
  365. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js.map +1 -0
  366. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.cjs +39 -0
  367. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.cjs.map +1 -0
  368. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js +72 -0
  369. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js.map +1 -0
  370. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.cjs +2 -0
  371. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.cjs.map +1 -0
  372. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js +8 -0
  373. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js.map +1 -0
  374. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.cjs +2 -0
  375. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.cjs.map +1 -0
  376. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js +26 -0
  377. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js.map +1 -0
  378. package/dist/node_modules/react-style-singleton/dist/es2015/component.cjs +2 -0
  379. package/dist/node_modules/react-style-singleton/dist/es2015/component.cjs.map +1 -0
  380. package/dist/node_modules/react-style-singleton/dist/es2015/component.js +12 -0
  381. package/dist/node_modules/react-style-singleton/dist/es2015/component.js.map +1 -0
  382. package/dist/node_modules/react-style-singleton/dist/es2015/hook.cjs +2 -0
  383. package/dist/node_modules/react-style-singleton/dist/es2015/hook.cjs.map +1 -0
  384. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js +16 -0
  385. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js.map +1 -0
  386. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.cjs +2 -0
  387. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.cjs.map +1 -0
  388. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js +31 -0
  389. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js.map +1 -0
  390. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs +2 -0
  391. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.map +1 -0
  392. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +2766 -0
  393. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  394. package/dist/node_modules/tailwindcss/dist/plugin.cjs +2 -0
  395. package/dist/node_modules/tailwindcss/dist/plugin.cjs.map +1 -0
  396. package/dist/node_modules/tailwindcss/dist/plugin.js +14 -0
  397. package/dist/node_modules/tailwindcss/dist/plugin.js.map +1 -0
  398. package/dist/node_modules/tslib/tslib.es6.cjs +2 -0
  399. package/dist/node_modules/tslib/tslib.es6.cjs.map +1 -0
  400. package/dist/node_modules/tslib/tslib.es6.js +28 -0
  401. package/dist/node_modules/tslib/tslib.es6.js.map +1 -0
  402. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.cjs +2 -0
  403. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.cjs.map +1 -0
  404. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js +7 -0
  405. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js.map +1 -0
  406. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.cjs +2 -0
  407. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.cjs.map +1 -0
  408. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js +27 -0
  409. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js.map +1 -0
  410. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.cjs +2 -0
  411. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.cjs.map +1 -0
  412. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js +26 -0
  413. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js.map +1 -0
  414. package/dist/node_modules/use-sidecar/dist/es2015/exports.cjs +2 -0
  415. package/dist/node_modules/use-sidecar/dist/es2015/exports.cjs.map +1 -0
  416. package/dist/node_modules/use-sidecar/dist/es2015/exports.js +19 -0
  417. package/dist/node_modules/use-sidecar/dist/es2015/exports.js.map +1 -0
  418. package/dist/node_modules/use-sidecar/dist/es2015/medium.cjs +2 -0
  419. package/dist/node_modules/use-sidecar/dist/es2015/medium.cjs.map +1 -0
  420. package/dist/node_modules/use-sidecar/dist/es2015/medium.js +68 -0
  421. package/dist/node_modules/use-sidecar/dist/es2015/medium.js.map +1 -0
  422. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs +2 -0
  423. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs.map +1 -0
  424. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +59 -0
  425. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
  426. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.cjs +2 -0
  427. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.cjs.map +1 -0
  428. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +47 -0
  429. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
  430. package/dist/node_modules/use-sync-external-store/shim/index.cjs +2 -0
  431. package/dist/node_modules/use-sync-external-store/shim/index.cjs.map +1 -0
  432. package/dist/node_modules/use-sync-external-store/shim/index.js +11 -0
  433. package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
  434. package/dist/providers/auth/auth.context.cjs +2 -0
  435. package/dist/providers/auth/auth.context.cjs.map +1 -0
  436. package/dist/providers/auth/auth.context.d.ts +3 -0
  437. package/dist/providers/auth/auth.context.d.ts.map +1 -0
  438. package/dist/providers/auth/auth.context.js +6 -0
  439. package/dist/providers/auth/auth.context.js.map +1 -0
  440. package/dist/providers/auth/auth.hook.cjs +2 -0
  441. package/dist/providers/auth/auth.hook.cjs.map +1 -0
  442. package/dist/providers/auth/auth.hook.d.ts +7 -0
  443. package/dist/providers/auth/auth.hook.d.ts.map +1 -0
  444. package/dist/providers/auth/auth.hook.js +12 -0
  445. package/dist/providers/auth/auth.hook.js.map +1 -0
  446. package/dist/providers/auth/auth.provider.cjs +2 -0
  447. package/dist/providers/auth/auth.provider.cjs.map +1 -0
  448. package/dist/providers/auth/auth.provider.d.ts +7 -0
  449. package/dist/providers/auth/auth.provider.d.ts.map +1 -0
  450. package/dist/providers/auth/auth.provider.js +29 -0
  451. package/dist/providers/auth/auth.provider.js.map +1 -0
  452. package/dist/providers/blimu/blimu.context.cjs +2 -0
  453. package/dist/providers/blimu/blimu.context.cjs.map +1 -0
  454. package/dist/providers/blimu/blimu.context.d.ts +27 -0
  455. package/dist/providers/blimu/blimu.context.d.ts.map +1 -0
  456. package/dist/providers/blimu/blimu.context.js +6 -0
  457. package/dist/providers/blimu/blimu.context.js.map +1 -0
  458. package/dist/providers/blimu/blimu.hook.cjs +2 -0
  459. package/dist/providers/blimu/blimu.hook.cjs.map +1 -0
  460. package/dist/providers/blimu/blimu.hook.d.ts +19 -0
  461. package/dist/providers/blimu/blimu.hook.d.ts.map +1 -0
  462. package/dist/providers/blimu/blimu.hook.js +12 -0
  463. package/dist/providers/blimu/blimu.hook.js.map +1 -0
  464. package/dist/providers/blimu/blimu.provider.cjs +2 -0
  465. package/dist/providers/blimu/blimu.provider.cjs.map +1 -0
  466. package/dist/providers/blimu/blimu.provider.d.ts +47 -0
  467. package/dist/providers/blimu/blimu.provider.d.ts.map +1 -0
  468. package/dist/providers/blimu/blimu.provider.js +67 -0
  469. package/dist/providers/blimu/blimu.provider.js.map +1 -0
  470. package/dist/providers/index.d.ts +7 -0
  471. package/dist/providers/index.d.ts.map +1 -0
  472. package/dist/providers/theme/index.d.ts +4 -0
  473. package/dist/providers/theme/index.d.ts.map +1 -0
  474. package/dist/providers/theme/theme.context.cjs +2 -0
  475. package/dist/providers/theme/theme.context.cjs.map +1 -0
  476. package/dist/providers/theme/theme.context.d.ts +8 -0
  477. package/dist/providers/theme/theme.context.d.ts.map +1 -0
  478. package/dist/providers/theme/theme.context.js +6 -0
  479. package/dist/providers/theme/theme.context.js.map +1 -0
  480. package/dist/providers/theme/theme.hook.cjs +2 -0
  481. package/dist/providers/theme/theme.hook.cjs.map +1 -0
  482. package/dist/providers/theme/theme.hook.d.ts +18 -0
  483. package/dist/providers/theme/theme.hook.d.ts.map +1 -0
  484. package/dist/providers/theme/theme.hook.js +12 -0
  485. package/dist/providers/theme/theme.hook.js.map +1 -0
  486. package/dist/providers/theme/theme.provider.cjs +2 -0
  487. package/dist/providers/theme/theme.provider.cjs.map +1 -0
  488. package/dist/providers/theme/theme.provider.d.ts +28 -0
  489. package/dist/providers/theme/theme.provider.d.ts.map +1 -0
  490. package/dist/providers/theme/theme.provider.js +68 -0
  491. package/dist/providers/theme/theme.provider.js.map +1 -0
  492. package/dist/providers.cjs +2 -0
  493. package/dist/providers.cjs.map +1 -0
  494. package/dist/providers.js +13 -0
  495. package/dist/providers.js.map +1 -0
  496. package/dist/styles/styles.css +1351 -0
  497. package/dist/styles/tw-styles.css +120 -0
  498. package/dist/tailwind.plugin.cjs +2 -0
  499. package/dist/tailwind.plugin.cjs.map +1 -0
  500. package/dist/tailwind.plugin.d.ts +19 -0
  501. package/dist/tailwind.plugin.d.ts.map +1 -0
  502. package/dist/tailwind.plugin.js +200 -0
  503. package/dist/tailwind.plugin.js.map +1 -0
  504. package/dist/types/index.cjs +2 -0
  505. package/dist/types/index.cjs.map +1 -0
  506. package/dist/types/index.d.ts +128 -0
  507. package/dist/types/index.d.ts.map +1 -0
  508. package/dist/types/index.js +12 -0
  509. package/dist/types/index.js.map +1 -0
  510. package/dist/utils/publishable-key.cjs +2 -0
  511. package/dist/utils/publishable-key.cjs.map +1 -0
  512. package/dist/utils/publishable-key.d.ts +38 -0
  513. package/dist/utils/publishable-key.d.ts.map +1 -0
  514. package/dist/utils/publishable-key.js +38 -0
  515. package/dist/utils/publishable-key.js.map +1 -0
  516. package/package.json +128 -0
package/README.md ADDED
@@ -0,0 +1,552 @@
1
+ # @blimu/react
2
+
3
+ React components and hooks for [Blimu](https://blimu.dev) authentication and authorization.
4
+
5
+ ## Features
6
+
7
+ - 🔐 **Drop-in Authentication Components** - Pre-built UI components like `UserButton`
8
+ - 🎨 **Fully Customizable** - Theme system with CSS variables and className overrides
9
+ - 🌓 **Dark Mode Support** - Built-in light and dark theme variants
10
+ - 🎯 **TypeScript First** - Complete type safety with IntelliSense support
11
+ - ⚡ **Tailwind CSS v4** - Modern CSS-first configuration
12
+ - 🪝 **React Hooks** - `useAuth`, `useUser`, and more
13
+ - 🧩 **Headless UI** - Built on Radix UI primitives
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @blimu/react
19
+ # or
20
+ yarn add @blimu/react
21
+ # or
22
+ pnpm add @blimu/react
23
+ ```
24
+
25
+ ### Peer Dependencies
26
+
27
+ This library requires:
28
+ - `react` ^18.0.0 || ^19.0.0
29
+ - `react-dom` ^18.0.0 || ^19.0.0
30
+ - `tailwindcss` ^4.0.0 (optional, but recommended)
31
+
32
+ ## Quick Start
33
+
34
+ ### 1. Wrap your app with BlimuProvider
35
+
36
+ ```tsx
37
+ import { BlimuProvider } from '@blimu/react';
38
+ import '@blimu/react/styles';
39
+
40
+ function App() {
41
+ return (
42
+ <BlimuProvider publishableKey="pk_...">
43
+ <YourApp />
44
+ </BlimuProvider>
45
+ );
46
+ }
47
+ ```
48
+
49
+ ### 2. Use authentication components
50
+
51
+ ```tsx
52
+ import { UserButton } from '@blimu/react';
53
+
54
+ function Header() {
55
+ return (
56
+ <header>
57
+ <h1>My App</h1>
58
+ <UserButton />
59
+ </header>
60
+ );
61
+ }
62
+ ```
63
+
64
+ ### 3. Access authentication state
65
+
66
+ ```tsx
67
+ import { useAuth, useUser } from '@blimu/react';
68
+
69
+ function Dashboard() {
70
+ const { isAuthenticated, login, logout } = useAuth();
71
+ const { user } = useUser();
72
+
73
+ if (!isAuthenticated) {
74
+ return <button onClick={() => login()}>Sign In</button>;
75
+ }
76
+
77
+ return (
78
+ <div>
79
+ <h1>Welcome, {user?.firstName}!</h1>
80
+ <button onClick={() => logout()}>Sign Out</button>
81
+ </div>
82
+ );
83
+ }
84
+ ```
85
+
86
+ ## Styling & Customization
87
+
88
+ ### Default Setup (with Tailwind CSS v4)
89
+
90
+ If you're using Tailwind CSS v4, import the stylesheet in your app:
91
+
92
+ ```tsx
93
+ import '@blimu/react/styles';
94
+ ```
95
+
96
+ This gives you the default Blimu theme with dark mode support.
97
+
98
+ ### Theme Customization
99
+
100
+ #### Option 1: Theme Prop (Easiest)
101
+
102
+ Customize colors and border radius via the `theme` prop:
103
+
104
+ ```tsx
105
+ <BlimuProvider
106
+ publishableKey="pk_..."
107
+ theme={{
108
+ colors: {
109
+ primary: 'oklch(0.5 0.2 250)', // Custom blue
110
+ background: '#ffffff', // Hex colors work too
111
+ foreground: 'rgb(0, 0, 0)', // Or RGB
112
+ },
113
+ radius: 'lg', // 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full' | custom CSS value
114
+ }}
115
+ >
116
+ <YourApp />
117
+ </BlimuProvider>
118
+ ```
119
+
120
+ #### Option 2: CSS Variables (Maximum Control)
121
+
122
+ Override CSS variables in your global styles:
123
+
124
+ ```css
125
+ /* your-app.css */
126
+ :root {
127
+ --blimu-primary: oklch(0.45 0.25 264);
128
+ --blimu-primary-foreground: oklch(1 0 0);
129
+ --blimu-radius: 0.5rem;
130
+ /* See full list of variables below */
131
+ }
132
+
133
+ .dark {
134
+ --blimu-primary: oklch(0.7 0.2 264);
135
+ --blimu-background: oklch(0.15 0 0);
136
+ }
137
+ ```
138
+
139
+ **Available CSS Variables:**
140
+
141
+ ```css
142
+ /* Colors */
143
+ --blimu-background
144
+ --blimu-foreground
145
+ --blimu-card
146
+ --blimu-card-foreground
147
+ --blimu-popover
148
+ --blimu-popover-foreground
149
+ --blimu-primary
150
+ --blimu-primary-foreground
151
+ --blimu-secondary
152
+ --blimu-secondary-foreground
153
+ --blimu-muted
154
+ --blimu-muted-foreground
155
+ --blimu-accent
156
+ --blimu-accent-foreground
157
+ --blimu-destructive
158
+ --blimu-destructive-foreground
159
+ --blimu-border
160
+ --blimu-input
161
+ --blimu-ring
162
+
163
+ /* Border Radius */
164
+ --blimu-radius
165
+ ```
166
+
167
+ #### Option 3: className Overrides (Component Level)
168
+
169
+ Every component accepts `className` and `classes` props:
170
+
171
+ ```tsx
172
+ <UserButton
173
+ className="custom-user-button"
174
+ classes={{
175
+ trigger: 'hover:scale-105 transition-transform',
176
+ avatar: 'ring-2 ring-blue-500',
177
+ popover: 'shadow-2xl',
178
+ userName: 'font-bold',
179
+ }}
180
+ onManageAccount={() => router.push('/settings')}
181
+ />
182
+ ```
183
+
184
+ ### Dark Mode
185
+
186
+ Blimu components automatically support dark mode when a `.dark` class is present on any parent element:
187
+
188
+ ```tsx
189
+ // Using next-themes
190
+ import { ThemeProvider } from 'next-themes';
191
+
192
+ <ThemeProvider attribute="class">
193
+ <BlimuProvider publishableKey="pk_...">
194
+ <YourApp />
195
+ </BlimuProvider>
196
+ </ThemeProvider>
197
+ ```
198
+
199
+ Or manually:
200
+
201
+ ```tsx
202
+ <div className="dark">
203
+ <BlimuProvider publishableKey="pk_...">
204
+ <YourApp />
205
+ </BlimuProvider>
206
+ </div>
207
+ ```
208
+
209
+ ## Components
210
+
211
+ ### UserButton
212
+
213
+ A button that displays the current user's avatar and provides account management options.
214
+
215
+ ```tsx
216
+ import { UserButton } from '@blimu/react';
217
+
218
+ <UserButton
219
+ className="custom-class"
220
+ classes={{
221
+ trigger: 'hover:opacity-90',
222
+ avatar: 'ring-2 ring-primary',
223
+ popover: 'shadow-xl',
224
+ userName: 'font-semibold',
225
+ manageAccountButton: 'hover:bg-accent',
226
+ signOutButton: 'hover:bg-destructive/10',
227
+ }}
228
+ onManageAccount={() => {
229
+ // Navigate to account settings
230
+ }}
231
+ />
232
+ ```
233
+
234
+ **Props:**
235
+ - `className?: string` - Custom class for the root element
236
+ - `classes?: object` - Object of classes for sub-elements
237
+ - `onManageAccount?: () => void` - Callback when "Manage account" is clicked
238
+
239
+ ### RedirectToSignIn
240
+
241
+ Redirects unauthenticated users to the sign-in page.
242
+
243
+ ```tsx
244
+ import { RedirectToSignIn } from '@blimu/react';
245
+
246
+ function ProtectedPage() {
247
+ return (
248
+ <>
249
+ <RedirectToSignIn returnUrl="/dashboard" />
250
+ <Dashboard />
251
+ </>
252
+ );
253
+ }
254
+ ```
255
+
256
+ ## Hooks
257
+
258
+ ### useAuth
259
+
260
+ Access authentication state and methods.
261
+
262
+ ```tsx
263
+ import { useAuth } from '@blimu/react';
264
+
265
+ function Component() {
266
+ const {
267
+ state, // Full auth state object
268
+ isAuthenticated, // Boolean
269
+ isLoading, // Boolean
270
+ login, // (returnUrl?) => void
271
+ logout, // () => Promise<void>
272
+ getToken, // (options) => Promise<string | null>
273
+ } = useAuth();
274
+ }
275
+ ```
276
+
277
+ ### useUser
278
+
279
+ Get the current user object.
280
+
281
+ ```tsx
282
+ import { useUser } from '@blimu/react';
283
+
284
+ function Profile() {
285
+ const { user } = useUser();
286
+
287
+ return (
288
+ <div>
289
+ <h1>{user?.firstName} {user?.lastName}</h1>
290
+ <p>{user?.email}</p>
291
+ </div>
292
+ );
293
+ }
294
+ ```
295
+
296
+ **User object:**
297
+ ```ts
298
+ interface User {
299
+ id: string;
300
+ email: string;
301
+ firstName?: string | null;
302
+ lastName?: string | null;
303
+ emailVerified: boolean;
304
+ }
305
+ ```
306
+
307
+ ### useBlimu
308
+
309
+ Access the Blimu client and configuration.
310
+
311
+ ```tsx
312
+ import { useBlimu } from '@blimu/react';
313
+
314
+ function Component() {
315
+ const { client, config } = useBlimu();
316
+ }
317
+ ```
318
+
319
+ ## TypeScript
320
+
321
+ Full TypeScript support with exported types:
322
+
323
+ ```tsx
324
+ import type {
325
+ User,
326
+ AuthState,
327
+ BlimuConfig,
328
+ BlimuTheme,
329
+ BlimuThemeColors,
330
+ UserButtonProps,
331
+ } from '@blimu/react';
332
+
333
+ // Type-safe theme configuration
334
+ const theme: BlimuTheme = {
335
+ colors: {
336
+ primary: 'oklch(0.5 0.2 250)',
337
+ },
338
+ radius: 'lg',
339
+ };
340
+
341
+ // Component props are fully typed
342
+ const userButtonProps: UserButtonProps = {
343
+ className: 'my-button',
344
+ onManageAccount: () => console.log('Account'),
345
+ };
346
+ ```
347
+
348
+ ## Framework Guides
349
+
350
+ ### Next.js (App Router)
351
+
352
+ ```tsx
353
+ // app/layout.tsx
354
+ import { BlimuProvider } from '@blimu/react';
355
+ import '@blimu/react/styles';
356
+
357
+ export default function RootLayout({ children }) {
358
+ return (
359
+ <html>
360
+ <body>
361
+ <BlimuProvider publishableKey={process.env.NEXT_PUBLIC_BLIMU_PUBLISHABLE_KEY!}>
362
+ {children}
363
+ </BlimuProvider>
364
+ </body>
365
+ </html>
366
+ );
367
+ }
368
+ ```
369
+
370
+ ### Next.js (Pages Router)
371
+
372
+ ```tsx
373
+ // pages/_app.tsx
374
+ import { BlimuProvider } from '@blimu/react';
375
+ import '@blimu/react/styles';
376
+ import type { AppProps } from 'next/app';
377
+
378
+ export default function App({ Component, pageProps }: AppProps) {
379
+ return (
380
+ <BlimuProvider publishableKey={process.env.NEXT_PUBLIC_BLIMU_PUBLISHABLE_KEY!}>
381
+ <Component {...pageProps} />
382
+ </BlimuProvider>
383
+ );
384
+ }
385
+ ```
386
+
387
+ ### Vite + React
388
+
389
+ ```tsx
390
+ // main.tsx
391
+ import { BlimuProvider } from '@blimu/react';
392
+ import '@blimu/react/styles';
393
+ import ReactDOM from 'react-dom/client';
394
+ import App from './App';
395
+
396
+ ReactDOM.createRoot(document.getElementById('root')!).render(
397
+ <BlimuProvider publishableKey={import.meta.env.VITE_BLIMU_PUBLISHABLE_KEY}>
398
+ <App />
399
+ </BlimuProvider>
400
+ );
401
+ ```
402
+
403
+ ### Remix
404
+
405
+ ```tsx
406
+ // app/root.tsx
407
+ import { BlimuProvider } from '@blimu/react';
408
+ import styles from '@blimu/react/styles';
409
+
410
+ export const links = () => [
411
+ { rel: 'stylesheet', href: styles },
412
+ ];
413
+
414
+ export default function Root() {
415
+ return (
416
+ <html>
417
+ <head>
418
+ <Links />
419
+ </head>
420
+ <body>
421
+ <BlimuProvider publishableKey={process.env.BLIMU_PUBLISHABLE_KEY!}>
422
+ <Outlet />
423
+ </BlimuProvider>
424
+ </body>
425
+ </html>
426
+ );
427
+ }
428
+ ```
429
+
430
+ ## Advanced Usage
431
+
432
+ ### Protected Routes
433
+
434
+ ```tsx
435
+ import { useAuth, RedirectToSignIn } from '@blimu/react';
436
+
437
+ function ProtectedRoute({ children }) {
438
+ const { isAuthenticated, isLoading } = useAuth();
439
+
440
+ if (isLoading) {
441
+ return <div>Loading...</div>;
442
+ }
443
+
444
+ if (!isAuthenticated) {
445
+ return <RedirectToSignIn />;
446
+ }
447
+
448
+ return <>{children}</>;
449
+ }
450
+ ```
451
+
452
+ ### Getting Tokens
453
+
454
+ ```tsx
455
+ import { useAuth } from '@blimu/react';
456
+
457
+ function ApiCall() {
458
+ const { getToken } = useAuth();
459
+
460
+ const fetchData = async () => {
461
+ const token = await getToken({ template: 'web' });
462
+
463
+ const response = await fetch('/api/data', {
464
+ headers: {
465
+ Authorization: `Bearer ${token}`,
466
+ },
467
+ });
468
+ };
469
+ }
470
+ ```
471
+
472
+ ### Custom Components
473
+
474
+ Build your own components using the hooks:
475
+
476
+ ```tsx
477
+ import { useUser, useAuth } from '@blimu/react';
478
+
479
+ function CustomUserMenu() {
480
+ const { user } = useUser();
481
+ const { logout } = useAuth();
482
+
483
+ if (!user) return null;
484
+
485
+ return (
486
+ <div className="menu">
487
+ <img src={user.avatarUrl} alt={user.firstName} />
488
+ <span>{user.email}</span>
489
+ <button onClick={logout}>Sign Out</button>
490
+ </div>
491
+ );
492
+ }
493
+ ```
494
+
495
+ ## Examples
496
+
497
+ See the [examples directory](../../examples) for complete working examples:
498
+
499
+ - Next.js App Router
500
+ - Next.js Pages Router
501
+ - Vite + React
502
+ - Remix
503
+ - Custom styling examples
504
+
505
+ ## Troubleshooting
506
+
507
+ ### Tailwind classes not working
508
+
509
+ Make sure you've imported the styles:
510
+
511
+ ```tsx
512
+ import '@blimu/react/styles';
513
+ ```
514
+
515
+ If you're using Tailwind CSS v4 in your app, the Blimu components will inherit your Tailwind configuration.
516
+
517
+ ### Dark mode not working
518
+
519
+ Ensure a `.dark` class is added to a parent element:
520
+
521
+ ```tsx
522
+ <div className="dark">
523
+ <BlimuProvider>...</BlimuProvider>
524
+ </div>
525
+ ```
526
+
527
+ ### TypeScript errors
528
+
529
+ Make sure `@blimu/react` is installed and your `tsconfig.json` has:
530
+
531
+ ```json
532
+ {
533
+ "compilerOptions": {
534
+ "moduleResolution": "bundler",
535
+ "jsx": "react-jsx"
536
+ }
537
+ }
538
+ ```
539
+
540
+ ## API Reference
541
+
542
+ Full API documentation available at [docs.blimu.dev](https://docs.blimu.dev)
543
+
544
+ ## License
545
+
546
+ MIT
547
+
548
+ ## Support
549
+
550
+ - Documentation: [docs.blimu.dev](https://docs.blimu.dev)
551
+ - Issues: [GitHub Issues](https://github.com/blimu/blimu/issues)
552
+ - Discord: [Join our community](https://discord.gg/blimu)
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../node_modules/use-sync-external-store/shim/index.cjs");var r=e.__require();exports.shimExports=r;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { __require as r } from "../node_modules/use-sync-external-store/shim/index.js";
2
+ var i = r();
3
+ export {
4
+ i as s
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
2
+ //# sourceMappingURL=index2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ var e = { exports: {} };
2
+ export {
3
+ e as __module
4
+ };
5
+ //# sourceMappingURL=index2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
+ //# sourceMappingURL=use-sync-external-store-shim.development.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sync-external-store-shim.development.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ var e = {};
2
+ export {
3
+ e as __exports
4
+ };
5
+ //# sourceMappingURL=use-sync-external-store-shim.development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sync-external-store-shim.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
+ //# sourceMappingURL=use-sync-external-store-shim.production.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sync-external-store-shim.production.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ var r = {};
2
+ export {
3
+ r as __exports
4
+ };
5
+ //# sourceMappingURL=use-sync-external-store-shim.production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sync-external-store-shim.production.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("@blimu/client"),o=require("../node_modules/js-cookie/dist/js.cookie.cjs"),A=require("../node_modules/jwt-decode/build/esm/index.cjs"),a="__bli_session",d="__lh_jwt",u="__lh_jwt",S=10,_=1e3,m=t=>Math.floor(t*_),O=t=>Math.floor(t/_),C=()=>O(Date.now()),T=t=>m(t),b=(t,e)=>{const s=T(t),r=m(e),n=Date.now();return Math.max(s-r-n,0)},c=(t,e)=>{const s=C();return t-e<s};class P{constructor(e,s,r,n,l){this.isLive=e,this.client=s,this.store=r,this.pendingRefresher=null,this.refreshPromise=null,this.refreshingSignals=new Set,this.refreshingSignalAbortController=null,this.localClient=new E.Blimu({baseURL:n,credentials:"include",headers:{"x-blimu-publishable-key":l}}),this.handleRequestError=this.handleRequestError.bind(this)}setCookie(e,s,r={}){const n={secure:this.isLive,sameSite:"lax",path:"/"};r.maxAge!==void 0&&(n.expires=r.maxAge/(1440*60)),o.set(e,s,n)}getSessionPayload(){const e=o.get(a);return e?A.jwtDecode(e):null}async getSessionToken(){const e=this.getSessionPayload();if(e)return this.refreshPromise?(await this.refreshPromise,o.get(a)):(c(e.exp,0)&&await this.refreshSession(),o.get(a))}async handleRequestError(e){return e instanceof E.BlimuError&&[401,500].includes(e.status)?(o.remove(a),o.remove(u),{error:e.message,user:null}):e instanceof DOMException?{error:e.message,user:null}:e instanceof Error?{error:e.message,user:null}:{error:"unknown error",user:null}}async initialize({signal:e}={}){const s=new URL(window.location.href),r=s.searchParams.get(d)??void 0;if(r&&(s.searchParams.delete(d),window.history.replaceState({},"",s.toString())),r&&this.setCookie(u,r,{maxAge:720*60*60}),o.get(u)&&!o.get(a)){const i=await this.refreshSession({signal:e}).catch(this.handleRequestError);if("error"in i)return i}const l=this.getSessionPayload();if(!l)return{error:null,user:null};if(c(l.exp,S)){const i=await this.refreshSession().catch(this.handleRequestError);if("error"in i)return i}const h=await this.client.auth.getSession().catch(this.handleRequestError);return"error"in h?h:{error:null,user:h.user}}scheduleRefresh(){const e=new AbortController;let s=!0,r=null;const n=()=>{s=!0,this.pendingRefresher&&(this.pendingRefresher(),this.pendingRefresher=null)},l=()=>{s=!1};window.addEventListener("online",n),window.addEventListener("offline",l);const h=()=>{r!==null&&(window.clearTimeout(r),r=null);const i=this.getSessionPayload();if(!i||c(i.exp,0))return;const g=b(i.exp,S);if(g<0)return;const w=async()=>{if(r=null,!s){this.pendingRefresher=w;return}const f=await this.refreshSession({signal:e.signal});if("error"in f){if(f.error==="aborted")return;this.store.setState({status:"error",user:null,error:f.error});return}else h()};r=window.setTimeout(w,g)};return h(),()=>{r&&window.clearTimeout(r),e.abort(),window.removeEventListener("online",n),window.removeEventListener("offline",l)}}async refreshSession({signal:e}={}){if(e&&(this.refreshingSignals.add(e),e.addEventListener("abort",()=>{this.refreshingSignals.delete(e),this.refreshingSignals.size===0&&this.refreshingSignalAbortController?.abort()})),this.refreshPromise)return this.refreshPromise;this.refreshingSignalAbortController=new AbortController,this.refreshingSignalAbortController.signal.addEventListener("abort",()=>{this.refreshPromise=null,this.refreshingSignalAbortController=null,this.refreshingSignals.clear()});const s=o.get(u);this.refreshPromise=this.localClient.auth.refresh({__lh_jwt:s},{signal:this.refreshingSignalAbortController.signal}).then(r=>(r.sessionToken&&this.setCookie(a,r.sessionToken,{maxAge:720*60*60}),r)).catch(this.handleRequestError);try{return await this.refreshPromise}finally{this.refreshPromise=null,this.refreshingSignalAbortController=null,this.refreshingSignals.clear()}}}exports.AuthSessionService=P;exports.LOCALHOST_JWT_COOKIE_NAME=u;exports.LOCALHOST_JWT_URL_PARAM_NAME=d;exports.SESSION_COOKIE_NAME=a;exports.SESSION_EXPIRATION_BUFFER=S;exports.isExpiredIn=c;
2
+ //# sourceMappingURL=auth.service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.cjs","sources":["../../src/client/auth.service.ts"],"sourcesContent":["import { Blimu, BlimuError } from '@blimu/client';\nimport type { RefreshResponse } from '@blimu/client/schema';\nimport Cookies from 'js-cookie';\nimport { jwtDecode } from 'jwt-decode';\n\nimport type { AuthState, User } from '../types';\nimport { ExternalStore } from './external-store';\n\nexport const SESSION_COOKIE_NAME = '__bli_session';\nexport const LOCALHOST_JWT_URL_PARAM_NAME = '__lh_jwt';\nexport const LOCALHOST_JWT_COOKIE_NAME = '__lh_jwt';\nexport const SESSION_EXPIRATION_BUFFER = 10;\n\n/**\n * Time conversion utilities\n * JWT tokens use seconds (Unix timestamp), JavaScript Date uses milliseconds\n */\nconst SECONDS_TO_MS = 1000;\n\n/**\n * Convert seconds to milliseconds\n */\nconst secondsToMilliseconds = (seconds: number): number => Math.floor(seconds * SECONDS_TO_MS);\n\n/**\n * Convert milliseconds to seconds\n */\nconst millisecondsToSeconds = (ms: number): number => Math.floor(ms / SECONDS_TO_MS);\n\n/**\n * Get current time in seconds (Unix timestamp)\n */\nconst nowInSeconds = (): number => millisecondsToSeconds(Date.now());\n\n/**\n * Convert JWT expiration time (seconds) to milliseconds\n */\nconst jwtExpToMilliseconds = (exp: number): number => secondsToMilliseconds(exp);\n\n/**\n * Calculate timeout delay in milliseconds for refreshing before expiration\n * @param expirationSeconds - JWT exp claim in seconds\n * @param bufferSeconds - Buffer time in seconds before expiration\n * @returns Timeout delay in milliseconds\n */\nconst calculateTimeoutDelay = (expirationSeconds: number, bufferSeconds: number): number => {\n const expirationMS = jwtExpToMilliseconds(expirationSeconds);\n const bufferMS = secondsToMilliseconds(bufferSeconds);\n const nowMS = Date.now();\n return Math.max(expirationMS - bufferMS - nowMS, 0);\n};\n\n/**\n * Check if a JWT expiration time (in seconds) is expired or will expire within the buffer\n * @param expiration - JWT exp claim in seconds (Unix timestamp)\n * @param buffer - Buffer time in seconds before expiration to consider it expired\n * @returns true if expired or will expire within buffer\n */\nexport const isExpiredIn = (expiration: number, buffer: number): boolean => {\n const now = nowInSeconds();\n return expiration - buffer < now;\n};\n\nexport class AuthSessionService {\n private pendingRefresher: (() => void) | null = null;\n private refreshPromise: Promise<RefreshResponse | { error: string; user: null }> | null = null;\n private refreshingSignals: Set<AbortSignal> = new Set();\n private refreshingSignalAbortController: AbortController | null = null;\n // A local client that doesn't call getSessionToken() which calls refreshSession().\n private localClient: Blimu;\n\n constructor(\n private readonly isLive: boolean,\n private readonly client: Blimu,\n private readonly store: ExternalStore<AuthState>,\n baseURL: string,\n publishableKey: string,\n ) {\n this.localClient = new Blimu({\n baseURL,\n credentials: 'include',\n headers: { 'x-blimu-publishable-key': publishableKey },\n });\n this.handleRequestError = this.handleRequestError.bind(this);\n }\n\n /**\n * Set cookie with appropriate security settings based on environment\n */\n private setCookie(name: string, value: string, options: { maxAge?: number } = {}): void {\n const cookieOptions: Cookies.CookieAttributes = {\n secure: this.isLive, // true for live environments, false for localhost\n sameSite: 'lax',\n path: '/',\n };\n\n if (options.maxAge !== undefined) {\n cookieOptions.expires = options.maxAge / (24 * 60 * 60); // Convert seconds to days\n }\n\n Cookies.set(name, value, cookieOptions);\n }\n\n getSessionPayload(): {\n sub: string;\n environmentId: string;\n type: string;\n iat: number;\n exp: number;\n } | null {\n const token = Cookies.get(SESSION_COOKIE_NAME);\n\n if (!token) {\n return null;\n }\n\n const decoded = jwtDecode<{\n sub: string;\n environmentId: string;\n type: string;\n iat: number;\n exp: number;\n }>(token);\n\n return decoded;\n }\n\n async getSessionToken(): Promise<string | undefined> {\n const sessionPayload = this.getSessionPayload();\n\n if (!sessionPayload) {\n return undefined;\n }\n\n // If a refresh is already in progress, wait for it to complete\n // This prevents infinite recursion when refreshSession() calls client.auth.refresh()\n // which triggers accessToken() which calls getSessionToken()\n if (this.refreshPromise) {\n await this.refreshPromise;\n // After refresh completes, return the updated token from cookie\n return Cookies.get(SESSION_COOKIE_NAME);\n }\n\n if (isExpiredIn(sessionPayload.exp, 0)) {\n await this.refreshSession();\n }\n\n return Cookies.get(SESSION_COOKIE_NAME);\n }\n\n async handleRequestError(error: unknown): Promise<{ error: string; user: null }> {\n if (error instanceof BlimuError && [401, 500].includes(error.status)) {\n Cookies.remove(SESSION_COOKIE_NAME);\n Cookies.remove(LOCALHOST_JWT_COOKIE_NAME);\n\n return {\n error: error.message,\n user: null,\n };\n }\n\n if (error instanceof DOMException)\n return {\n error: error.message,\n user: null,\n };\n\n if (error instanceof Error) {\n return {\n error: error.message,\n user: null,\n };\n }\n\n return {\n error: 'unknown error',\n user: null,\n };\n }\n\n async initialize({ signal }: { signal?: AbortSignal } = {}): Promise<{\n error: string | null;\n user: User | null;\n }> {\n const url = new URL(window.location.href);\n const localhostJWT = url.searchParams.get(LOCALHOST_JWT_URL_PARAM_NAME) ?? undefined;\n\n // Clean up URL parameters immediately to prevent re-processing on re-renders\n if (localhostJWT) {\n url.searchParams.delete(LOCALHOST_JWT_URL_PARAM_NAME);\n window.history.replaceState({}, '', url.toString());\n }\n\n // Handle localhost JWT from URL parameter\n if (localhostJWT) {\n // Set localhost JWT cookie on customer app domain\n this.setCookie(LOCALHOST_JWT_COOKIE_NAME, localhostJWT, {\n maxAge: 30 * 24 * 60 * 60, // 30 days\n });\n }\n\n const localhostJWTCookie = Cookies.get(LOCALHOST_JWT_COOKIE_NAME);\n\n if (localhostJWTCookie && !Cookies.get(SESSION_COOKIE_NAME)) {\n const result = await this.refreshSession({ signal }).catch(this.handleRequestError);\n if ('error' in result) return result;\n }\n\n const sessionPayload = this.getSessionPayload();\n\n if (!sessionPayload) {\n return {\n error: null,\n user: null,\n };\n }\n\n if (isExpiredIn(sessionPayload.exp, SESSION_EXPIRATION_BUFFER)) {\n const result = await this.refreshSession().catch(this.handleRequestError);\n if ('error' in result) return result;\n }\n\n const result = await this.client.auth.getSession().catch(this.handleRequestError);\n if ('error' in result) return result;\n\n return {\n error: null,\n user: result.user,\n };\n }\n\n scheduleRefresh() {\n const abortController = new AbortController();\n let isOnline = true;\n let timeoutId: number | null = null;\n\n const onlineHandler = () => {\n isOnline = true;\n if (this.pendingRefresher) {\n this.pendingRefresher();\n this.pendingRefresher = null;\n }\n };\n const offlineHandler = () => {\n isOnline = false;\n };\n\n window.addEventListener('online', onlineHandler);\n window.addEventListener('offline', offlineHandler);\n\n const refresh = () => {\n // Clear any existing timeout before scheduling a new one\n // This prevents infinite loops when refresh() is called recursively\n if (timeoutId !== null) {\n window.clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n const sessionPayload = this.getSessionPayload();\n\n if (!sessionPayload || isExpiredIn(sessionPayload.exp, 0)) return;\n\n // Calculate timeout delay: refresh SESSION_EXPIRATION_BUFFER seconds before expiration\n const timeoutDelayMS = calculateTimeoutDelay(sessionPayload.exp, SESSION_EXPIRATION_BUFFER);\n\n // Prevent scheduling if timeout is negative (token already expired)\n // Allow 0ms delays to handle edge cases where we're exactly at the refresh point\n // This prevents immediate re-scheduling that could cause infinite loops\n if (timeoutDelayMS < 0) {\n return;\n }\n\n // Having this function outside timeout, allows us to call refresh immediately when back online\n const refresher = async () => {\n // Clear timeoutId since we're executing now\n timeoutId = null;\n\n if (!isOnline) {\n // Keep closure of refresh function alive\n this.pendingRefresher = refresher;\n return;\n }\n\n const result = await this.refreshSession({ signal: abortController.signal });\n\n if ('error' in result) {\n // If the refresh was aborted (e.g., due to React strict mode unmounting),\n // don't treat it as an error - just return and let the component remount handle it\n if (result.error === 'aborted') {\n return;\n }\n // For real errors, update the store\n this.store.setState({\n status: 'error',\n user: null,\n error: result.error,\n });\n return;\n } else {\n // After successful refresh, schedule the next refresh with the new token\n refresh();\n }\n };\n\n timeoutId = window.setTimeout(refresher, timeoutDelayMS);\n };\n\n refresh();\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n abortController.abort();\n window.removeEventListener('online', onlineHandler);\n window.removeEventListener('offline', offlineHandler);\n };\n }\n\n private async refreshSession({ signal }: { signal?: AbortSignal } = {}) {\n if (signal) {\n // Add signal to tracking set (was using .has() instead of .add() - bug fix)\n this.refreshingSignals.add(signal);\n\n signal.addEventListener('abort', () => {\n this.refreshingSignals.delete(signal);\n\n if (this.refreshingSignals.size === 0) {\n this.refreshingSignalAbortController?.abort();\n }\n });\n }\n\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshingSignalAbortController = new AbortController();\n\n this.refreshingSignalAbortController.signal.addEventListener('abort', () => {\n this.refreshPromise = null;\n this.refreshingSignalAbortController = null;\n this.refreshingSignals.clear();\n });\n\n // Get localhost_jwt from cookie to send as query parameter\n const localhostJWT = Cookies.get(LOCALHOST_JWT_COOKIE_NAME);\n\n // Use local client to avoid infinite recursion. Regular client calls getSessionToken() which calls refreshSession().\n // There are hacks to avoid infinite recursion, but they are not reliable.\n // The localhost_jwt is sent as a query parameter\n // Note: Type assertion needed because the generated SDK type doesn't include 'query' in RequestInit,\n // but the underlying CoreClient.request() method does support it\n this.refreshPromise = this.localClient.auth\n .refresh(\n { __lh_jwt: localhostJWT },\n {\n signal: this.refreshingSignalAbortController.signal,\n },\n )\n .then((response) => {\n // Update cookie with new session token from response body\n // Server also sets it via Set-Cookie header on auth domain, but we set it manually on customer domain\n if (response.sessionToken) {\n this.setCookie(SESSION_COOKIE_NAME, response.sessionToken, {\n maxAge: 30 * 24 * 60 * 60, // 30 days\n });\n }\n return response;\n })\n .catch(this.handleRequestError);\n\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n this.refreshingSignalAbortController = null;\n this.refreshingSignals.clear();\n }\n }\n}\n"],"names":["SESSION_COOKIE_NAME","LOCALHOST_JWT_URL_PARAM_NAME","LOCALHOST_JWT_COOKIE_NAME","SESSION_EXPIRATION_BUFFER","SECONDS_TO_MS","secondsToMilliseconds","seconds","millisecondsToSeconds","ms","nowInSeconds","jwtExpToMilliseconds","exp","calculateTimeoutDelay","expirationSeconds","bufferSeconds","expirationMS","bufferMS","nowMS","isExpiredIn","expiration","buffer","now","AuthSessionService","isLive","client","store","baseURL","publishableKey","Blimu","name","value","options","cookieOptions","Cookies","token","jwtDecode","sessionPayload","error","BlimuError","signal","url","localhostJWT","result","abortController","isOnline","timeoutId","onlineHandler","offlineHandler","refresh","timeoutDelayMS","refresher","response"],"mappings":"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"}