@owlmeans/web-panel 0.1.18-rc.9 → 0.1.18

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 (669) hide show
  1. package/README.md +510 -143
  2. package/THIRD-PARTY-NOTICES.txt +24 -0
  3. package/agent-meta/manifest.json +163 -4
  4. package/agent-meta/skills/web-panel/SKILL.md +136 -83
  5. package/agent-meta/skills/web-panel/parts/consent.md +114 -0
  6. package/agent-meta/skills/web-panel/parts/editor.md +47 -0
  7. package/agent-meta/skills/web-panel/parts/forms.md +85 -0
  8. package/agent-meta/skills/web-panel/parts/navigation.md +203 -0
  9. package/agent-meta/skills/web-panel/parts/picker.md +164 -0
  10. package/agent-meta/skills/web-panel/parts/reload.md +46 -0
  11. package/agent-meta/skills/web-panel/parts/sign-in.md +65 -0
  12. package/agent-meta/skills/web-panel/parts/theme.md +74 -0
  13. package/build/@/components/ui/alert-dialog.d.ts +15 -0
  14. package/build/@/components/ui/alert-dialog.d.ts.map +1 -0
  15. package/build/@/components/ui/alert-dialog.js +39 -0
  16. package/build/@/components/ui/alert-dialog.js.map +1 -0
  17. package/build/@/components/ui/alert.js +1 -1
  18. package/build/@/components/ui/alert.js.map +1 -1
  19. package/build/@/components/ui/button.js +1 -1
  20. package/build/@/components/ui/button.js.map +1 -1
  21. package/build/@/components/ui/card.js +1 -1
  22. package/build/@/components/ui/card.js.map +1 -1
  23. package/build/@/components/ui/input.js +1 -1
  24. package/build/@/components/ui/input.js.map +1 -1
  25. package/build/@/components/ui/label.js +1 -1
  26. package/build/@/components/ui/label.js.map +1 -1
  27. package/build/@/components/ui/navigation-menu.js +1 -1
  28. package/build/@/components/ui/navigation-menu.js.map +1 -1
  29. package/build/@/components/ui/popover.d.ts +8 -0
  30. package/build/@/components/ui/popover.d.ts.map +1 -0
  31. package/build/@/components/ui/popover.js +17 -0
  32. package/build/@/components/ui/popover.js.map +1 -0
  33. package/build/@/components/ui/progress.js +1 -1
  34. package/build/@/components/ui/progress.js.map +1 -1
  35. package/build/@/components/ui/separator.js +1 -1
  36. package/build/@/components/ui/separator.js.map +1 -1
  37. package/build/@/components/ui/sheet.d.ts +15 -0
  38. package/build/@/components/ui/sheet.d.ts.map +1 -0
  39. package/build/@/components/ui/sheet.js +40 -0
  40. package/build/@/components/ui/sheet.js.map +1 -0
  41. package/build/auth/context.d.ts.map +1 -1
  42. package/build/auth/context.js +0 -1
  43. package/build/auth/context.js.map +1 -1
  44. package/build/auth/entrypoints.d.ts +10 -0
  45. package/build/auth/entrypoints.d.ts.map +1 -0
  46. package/build/auth/entrypoints.js +4 -0
  47. package/build/auth/entrypoints.js.map +1 -0
  48. package/build/auth/exports.d.ts +4 -4
  49. package/build/auth/exports.d.ts.map +1 -1
  50. package/build/auth/exports.js +3 -3
  51. package/build/auth/exports.js.map +1 -1
  52. package/build/auth/modules.d.ts +1 -1
  53. package/build/auth/modules.d.ts.map +1 -1
  54. package/build/auth/plugins/basic-ed25519.js +4 -4
  55. package/build/auth/plugins/basic-ed25519.js.map +1 -1
  56. package/build/auth/plugins/re-captcha.js +3 -3
  57. package/build/auth/plugins/re-captcha.js.map +1 -1
  58. package/build/auth/plugins/tunnel-consumer.js +1 -1
  59. package/build/auth/plugins/tunnel-consumer.js.map +1 -1
  60. package/build/components/block.js +2 -2
  61. package/build/components/block.js.map +1 -1
  62. package/build/components/consts.local.d.ts +14 -0
  63. package/build/components/consts.local.d.ts.map +1 -0
  64. package/build/components/consts.local.js +26 -0
  65. package/build/components/consts.local.js.map +1 -0
  66. package/build/components/footer/component.d.ts +19 -1
  67. package/build/components/footer/component.d.ts.map +1 -1
  68. package/build/components/footer/component.js +38 -11
  69. package/build/components/footer/component.js.map +1 -1
  70. package/build/components/footer/credit.d.ts +27 -0
  71. package/build/components/footer/credit.d.ts.map +1 -0
  72. package/build/components/footer/credit.js +42 -0
  73. package/build/components/footer/credit.js.map +1 -0
  74. package/build/components/footer/index.d.ts +1 -0
  75. package/build/components/footer/index.d.ts.map +1 -1
  76. package/build/components/footer/index.js +1 -0
  77. package/build/components/footer/index.js.map +1 -1
  78. package/build/components/footer/types.d.ts +22 -1
  79. package/build/components/footer/types.d.ts.map +1 -1
  80. package/build/components/form/button/component.d.ts.map +1 -1
  81. package/build/components/form/button/component.js +5 -3
  82. package/build/components/form/button/component.js.map +1 -1
  83. package/build/components/form/component.js +2 -2
  84. package/build/components/form/component.js.map +1 -1
  85. package/build/components/form/text/component.js +2 -2
  86. package/build/components/form/text/component.js.map +1 -1
  87. package/build/components/helper.d.ts.map +1 -1
  88. package/build/components/helper.js +1 -12
  89. package/build/components/helper.js.map +1 -1
  90. package/build/components/index.d.ts +4 -0
  91. package/build/components/index.d.ts.map +1 -1
  92. package/build/components/index.js +4 -0
  93. package/build/components/index.js.map +1 -1
  94. package/build/components/link.js +3 -3
  95. package/build/components/link.js.map +1 -1
  96. package/build/components/login/append.d.ts +15 -0
  97. package/build/components/login/append.d.ts.map +1 -0
  98. package/build/components/login/append.js +26 -0
  99. package/build/components/login/append.js.map +1 -0
  100. package/build/components/login/consts.d.ts +3 -0
  101. package/build/components/login/consts.d.ts.map +1 -0
  102. package/build/components/login/consts.js +3 -0
  103. package/build/components/login/consts.js.map +1 -0
  104. package/build/components/login/consts.local.d.ts +4 -0
  105. package/build/components/login/consts.local.d.ts.map +1 -0
  106. package/build/components/login/consts.local.js +8 -0
  107. package/build/components/login/consts.local.js.map +1 -0
  108. package/build/components/login/credit.d.ts +12 -0
  109. package/build/components/login/credit.d.ts.map +1 -0
  110. package/build/components/login/credit.js +18 -0
  111. package/build/components/login/credit.js.map +1 -0
  112. package/build/components/login/i18n/be.json +10 -0
  113. package/build/components/login/i18n/de.json +10 -0
  114. package/build/components/login/i18n/en.json +10 -0
  115. package/build/components/login/i18n/es.json +10 -0
  116. package/build/components/login/i18n/fr.json +10 -0
  117. package/build/components/login/i18n/pl.json +10 -0
  118. package/build/components/login/i18n/ru.json +10 -0
  119. package/build/components/login/i18n/uk.json +10 -0
  120. package/build/components/login/i18n.d.ts +2 -0
  121. package/build/components/login/i18n.d.ts.map +1 -0
  122. package/build/components/login/i18n.js +28 -0
  123. package/build/components/login/i18n.js.map +1 -0
  124. package/build/components/login/icons.d.ts +14 -0
  125. package/build/components/login/icons.d.ts.map +1 -0
  126. package/build/components/login/icons.js +29 -0
  127. package/build/components/login/icons.js.map +1 -0
  128. package/build/components/login/index.d.ts +11 -0
  129. package/build/components/login/index.d.ts.map +1 -0
  130. package/build/components/login/index.js +10 -0
  131. package/build/components/login/index.js.map +1 -0
  132. package/build/components/login/notify.d.ts +18 -0
  133. package/build/components/login/notify.d.ts.map +1 -0
  134. package/build/components/login/notify.js +41 -0
  135. package/build/components/login/notify.js.map +1 -0
  136. package/build/components/login/provider.d.ts +20 -0
  137. package/build/components/login/provider.d.ts.map +1 -0
  138. package/build/components/login/provider.js +31 -0
  139. package/build/components/login/provider.js.map +1 -0
  140. package/build/components/login/screen.d.ts +24 -0
  141. package/build/components/login/screen.d.ts.map +1 -0
  142. package/build/components/login/screen.js +92 -0
  143. package/build/components/login/screen.js.map +1 -0
  144. package/build/components/login/terms.d.ts +19 -0
  145. package/build/components/login/terms.d.ts.map +1 -0
  146. package/build/components/login/terms.js +32 -0
  147. package/build/components/login/terms.js.map +1 -0
  148. package/build/components/login/types.d.ts +28 -0
  149. package/build/components/login/types.d.ts.map +1 -0
  150. package/build/components/login/types.js +2 -0
  151. package/build/components/login/types.js.map +1 -0
  152. package/build/components/nav/consts.local.d.ts +41 -0
  153. package/build/components/nav/consts.local.d.ts.map +1 -0
  154. package/build/components/nav/consts.local.js +60 -0
  155. package/build/components/nav/consts.local.js.map +1 -0
  156. package/build/components/nav/index.d.ts +1 -0
  157. package/build/components/nav/index.d.ts.map +1 -1
  158. package/build/components/nav/index.js +1 -0
  159. package/build/components/nav/index.js.map +1 -1
  160. package/build/components/nav/layout.d.ts +9 -2
  161. package/build/components/nav/layout.d.ts.map +1 -1
  162. package/build/components/nav/layout.js +48 -7
  163. package/build/components/nav/layout.js.map +1 -1
  164. package/build/components/nav/mobile.d.ts +21 -0
  165. package/build/components/nav/mobile.d.ts.map +1 -0
  166. package/build/components/nav/mobile.js +55 -0
  167. package/build/components/nav/mobile.js.map +1 -0
  168. package/build/components/nav/side.d.ts.map +1 -1
  169. package/build/components/nav/side.js +10 -10
  170. package/build/components/nav/side.js.map +1 -1
  171. package/build/components/nav/top.d.ts.map +1 -1
  172. package/build/components/nav/top.js +12 -8
  173. package/build/components/nav/top.js.map +1 -1
  174. package/build/components/nav/types.d.ts +64 -1
  175. package/build/components/nav/types.d.ts.map +1 -1
  176. package/build/components/nav/viewport.d.ts +3 -0
  177. package/build/components/nav/viewport.d.ts.map +1 -0
  178. package/build/components/nav/viewport.js +14 -0
  179. package/build/components/nav/viewport.js.map +1 -0
  180. package/build/components/panel-app/component.d.ts.map +1 -1
  181. package/build/components/panel-app/component.js +4 -3
  182. package/build/components/panel-app/component.js.map +1 -1
  183. package/build/components/picker/color-picker.d.ts +9 -0
  184. package/build/components/picker/color-picker.d.ts.map +1 -0
  185. package/build/components/picker/color-picker.js +9 -0
  186. package/build/components/picker/color-picker.js.map +1 -0
  187. package/build/components/picker/consts.local.d.ts +76 -0
  188. package/build/components/picker/consts.local.d.ts.map +1 -0
  189. package/build/components/picker/consts.local.js +214 -0
  190. package/build/components/picker/consts.local.js.map +1 -0
  191. package/build/components/picker/dot.d.ts +8 -0
  192. package/build/components/picker/dot.d.ts.map +1 -0
  193. package/build/components/picker/dot.js +10 -0
  194. package/build/components/picker/dot.js.map +1 -0
  195. package/build/components/picker/grid.d.ts +17 -0
  196. package/build/components/picker/grid.d.ts.map +1 -0
  197. package/build/components/picker/grid.js +73 -0
  198. package/build/components/picker/grid.js.map +1 -0
  199. package/build/components/picker/i18n/be.json +60 -0
  200. package/build/components/picker/i18n/de.json +60 -0
  201. package/build/components/picker/i18n/en.json +60 -0
  202. package/build/components/picker/i18n/es.json +60 -0
  203. package/build/components/picker/i18n/fr.json +60 -0
  204. package/build/components/picker/i18n/pl.json +60 -0
  205. package/build/components/picker/i18n/ru.json +60 -0
  206. package/build/components/picker/i18n/uk.json +60 -0
  207. package/build/components/picker/i18n.d.ts +2 -0
  208. package/build/components/picker/i18n.d.ts.map +1 -0
  209. package/build/components/picker/i18n.js +18 -0
  210. package/build/components/picker/i18n.js.map +1 -0
  211. package/build/components/picker/icon-color-picker.d.ts +14 -0
  212. package/build/components/picker/icon-color-picker.d.ts.map +1 -0
  213. package/build/components/picker/icon-color-picker.js +15 -0
  214. package/build/components/picker/icon-color-picker.js.map +1 -0
  215. package/build/components/picker/icon-picker.d.ts +8 -0
  216. package/build/components/picker/icon-picker.d.ts.map +1 -0
  217. package/build/components/picker/icon-picker.js +8 -0
  218. package/build/components/picker/icon-picker.js.map +1 -0
  219. package/build/components/picker/index.d.ts +11 -0
  220. package/build/components/picker/index.d.ts.map +1 -0
  221. package/build/components/picker/index.js +10 -0
  222. package/build/components/picker/index.js.map +1 -0
  223. package/build/components/picker/panel.d.ts +9 -0
  224. package/build/components/picker/panel.d.ts.map +1 -0
  225. package/build/components/picker/panel.js +23 -0
  226. package/build/components/picker/panel.js.map +1 -0
  227. package/build/components/picker/root.d.ts +13 -0
  228. package/build/components/picker/root.d.ts.map +1 -0
  229. package/build/components/picker/root.js +55 -0
  230. package/build/components/picker/root.js.map +1 -0
  231. package/build/components/picker/roving.d.ts +8 -0
  232. package/build/components/picker/roving.d.ts.map +1 -0
  233. package/build/components/picker/roving.js +62 -0
  234. package/build/components/picker/roving.js.map +1 -0
  235. package/build/components/picker/surface.d.ts +18 -0
  236. package/build/components/picker/surface.d.ts.map +1 -0
  237. package/build/components/picker/surface.js +36 -0
  238. package/build/components/picker/surface.js.map +1 -0
  239. package/build/components/picker/swatches/custom.d.ts +10 -0
  240. package/build/components/picker/swatches/custom.d.ts.map +1 -0
  241. package/build/components/picker/swatches/custom.js +65 -0
  242. package/build/components/picker/swatches/custom.js.map +1 -0
  243. package/build/components/picker/swatches.d.ts +16 -0
  244. package/build/components/picker/swatches.d.ts.map +1 -0
  245. package/build/components/picker/swatches.js +35 -0
  246. package/build/components/picker/swatches.js.map +1 -0
  247. package/build/components/picker/text.d.ts +5 -0
  248. package/build/components/picker/text.d.ts.map +1 -0
  249. package/build/components/picker/text.js +29 -0
  250. package/build/components/picker/text.js.map +1 -0
  251. package/build/components/picker/tile.d.ts +11 -0
  252. package/build/components/picker/tile.d.ts.map +1 -0
  253. package/build/components/picker/tile.js +19 -0
  254. package/build/components/picker/tile.js.map +1 -0
  255. package/build/components/picker/translate.d.ts +9 -0
  256. package/build/components/picker/translate.d.ts.map +1 -0
  257. package/build/components/picker/translate.js +13 -0
  258. package/build/components/picker/translate.js.map +1 -0
  259. package/build/components/picker/trigger.d.ts +12 -0
  260. package/build/components/picker/trigger.d.ts.map +1 -0
  261. package/build/components/picker/trigger.js +29 -0
  262. package/build/components/picker/trigger.js.map +1 -0
  263. package/build/components/picker/types.d.ts +114 -0
  264. package/build/components/picker/types.d.ts.map +1 -0
  265. package/build/components/picker/types.js +2 -0
  266. package/build/components/picker/types.js.map +1 -0
  267. package/build/components/picker/types.local.d.ts +143 -0
  268. package/build/components/picker/types.local.d.ts.map +1 -0
  269. package/build/components/picker/types.local.js +2 -0
  270. package/build/components/picker/types.local.js.map +1 -0
  271. package/build/components/scheme/consts.local.d.ts +8 -0
  272. package/build/components/scheme/consts.local.d.ts.map +1 -0
  273. package/build/components/scheme/consts.local.js +13 -0
  274. package/build/components/scheme/consts.local.js.map +1 -0
  275. package/build/components/scheme/hook.d.ts +16 -0
  276. package/build/components/scheme/hook.d.ts.map +1 -0
  277. package/build/components/scheme/hook.js +52 -0
  278. package/build/components/scheme/hook.js.map +1 -0
  279. package/build/components/scheme/index.d.ts +4 -0
  280. package/build/components/scheme/index.d.ts.map +1 -0
  281. package/build/components/scheme/index.js +3 -0
  282. package/build/components/scheme/index.js.map +1 -0
  283. package/build/components/scheme/toggle.d.ts +14 -0
  284. package/build/components/scheme/toggle.d.ts.map +1 -0
  285. package/build/components/scheme/toggle.js +24 -0
  286. package/build/components/scheme/toggle.js.map +1 -0
  287. package/build/components/scheme/types.d.ts +21 -0
  288. package/build/components/scheme/types.d.ts.map +1 -0
  289. package/build/components/scheme/types.js +2 -0
  290. package/build/components/scheme/types.js.map +1 -0
  291. package/build/components/socket/i18n/be.json +9 -0
  292. package/build/components/socket/i18n/de.json +9 -0
  293. package/build/components/socket/i18n/en.json +9 -0
  294. package/build/components/socket/i18n/es.json +9 -0
  295. package/build/components/socket/i18n/fr.json +9 -0
  296. package/build/components/socket/i18n/pl.json +9 -0
  297. package/build/components/socket/i18n/ru.json +9 -0
  298. package/build/components/socket/i18n/uk.json +9 -0
  299. package/build/components/socket/i18n.d.ts +2 -0
  300. package/build/components/socket/i18n.d.ts.map +1 -0
  301. package/build/components/socket/i18n.js +18 -0
  302. package/build/components/socket/i18n.js.map +1 -0
  303. package/build/components/socket/index.d.ts +3 -0
  304. package/build/components/socket/index.d.ts.map +1 -0
  305. package/build/components/socket/index.js +3 -0
  306. package/build/components/socket/index.js.map +1 -0
  307. package/build/components/socket/reload-dialog.d.ts +22 -0
  308. package/build/components/socket/reload-dialog.d.ts.map +1 -0
  309. package/build/components/socket/reload-dialog.js +34 -0
  310. package/build/components/socket/reload-dialog.js.map +1 -0
  311. package/build/components/status.js +1 -1
  312. package/build/components/status.js.map +1 -1
  313. package/build/components/text.d.ts.map +1 -1
  314. package/build/components/text.js +2 -13
  315. package/build/components/text.js.map +1 -1
  316. package/build/components/toaster.d.ts +16 -0
  317. package/build/components/toaster.d.ts.map +1 -0
  318. package/build/components/toaster.js +52 -0
  319. package/build/components/toaster.js.map +1 -0
  320. package/build/components/uploader/consts.local.d.ts +4 -0
  321. package/build/components/uploader/consts.local.d.ts.map +1 -0
  322. package/build/components/uploader/consts.local.js +6 -0
  323. package/build/components/uploader/consts.local.js.map +1 -0
  324. package/build/components/uploader/image.d.ts.map +1 -1
  325. package/build/components/uploader/image.js +2 -6
  326. package/build/components/uploader/image.js.map +1 -1
  327. package/build/consent/component.d.ts +27 -0
  328. package/build/consent/component.d.ts.map +1 -0
  329. package/build/consent/component.js +60 -0
  330. package/build/consent/component.js.map +1 -0
  331. package/build/consent/consts.d.ts +2 -0
  332. package/build/consent/consts.d.ts.map +1 -0
  333. package/build/consent/consts.js +2 -0
  334. package/build/consent/consts.js.map +1 -0
  335. package/build/consent/consts.local.d.ts +9 -0
  336. package/build/consent/consts.local.d.ts.map +1 -0
  337. package/build/consent/consts.local.js +9 -0
  338. package/build/consent/consts.local.js.map +1 -0
  339. package/build/consent/geo.d.ts +17 -0
  340. package/build/consent/geo.d.ts.map +1 -0
  341. package/build/consent/geo.js +19 -0
  342. package/build/consent/geo.js.map +1 -0
  343. package/build/consent/index.d.ts +11 -0
  344. package/build/consent/index.d.ts.map +1 -0
  345. package/build/consent/index.js +9 -0
  346. package/build/consent/index.js.map +1 -0
  347. package/build/consent/language.d.ts +12 -0
  348. package/build/consent/language.d.ts.map +1 -0
  349. package/build/consent/language.js +11 -0
  350. package/build/consent/language.js.map +1 -0
  351. package/build/consent/menu-widget.d.ts +13 -0
  352. package/build/consent/menu-widget.d.ts.map +1 -0
  353. package/build/consent/menu-widget.js +20 -0
  354. package/build/consent/menu-widget.js.map +1 -0
  355. package/build/consent/presence.d.ts +30 -0
  356. package/build/consent/presence.d.ts.map +1 -0
  357. package/build/consent/presence.js +40 -0
  358. package/build/consent/presence.js.map +1 -0
  359. package/build/consent/service.d.ts +18 -0
  360. package/build/consent/service.d.ts.map +1 -0
  361. package/build/consent/service.js +53 -0
  362. package/build/consent/service.js.map +1 -0
  363. package/build/consent/translate.d.ts +14 -0
  364. package/build/consent/translate.d.ts.map +1 -0
  365. package/build/consent/translate.js +28 -0
  366. package/build/consent/translate.js.map +1 -0
  367. package/build/consent/types.d.ts +39 -0
  368. package/build/consent/types.d.ts.map +1 -0
  369. package/build/consent/types.js +2 -0
  370. package/build/consent/types.js.map +1 -0
  371. package/build/consent/types.local.d.ts +6 -0
  372. package/build/consent/types.local.d.ts.map +1 -0
  373. package/build/consent/types.local.js +2 -0
  374. package/build/consent/types.local.js.map +1 -0
  375. package/build/context.d.ts.map +1 -1
  376. package/build/context.js +10 -0
  377. package/build/context.js.map +1 -1
  378. package/build/editor/component.d.ts +4 -0
  379. package/build/editor/component.d.ts.map +1 -0
  380. package/build/editor/component.js +103 -0
  381. package/build/editor/component.js.map +1 -0
  382. package/build/editor/consts.local.d.ts +6 -0
  383. package/build/editor/consts.local.d.ts.map +1 -0
  384. package/build/editor/consts.local.js +58 -0
  385. package/build/editor/consts.local.js.map +1 -0
  386. package/build/editor/index.d.ts +3 -0
  387. package/build/editor/index.d.ts.map +1 -0
  388. package/build/editor/index.js +2 -0
  389. package/build/editor/index.js.map +1 -0
  390. package/build/editor/types.d.ts +24 -0
  391. package/build/editor/types.d.ts.map +1 -0
  392. package/build/editor/types.js +2 -0
  393. package/build/editor/types.js.map +1 -0
  394. package/build/entrypoints.d.ts +8 -0
  395. package/build/entrypoints.d.ts.map +1 -0
  396. package/build/entrypoints.js +4 -0
  397. package/build/entrypoints.js.map +1 -0
  398. package/build/exports.d.ts +6 -5
  399. package/build/exports.d.ts.map +1 -1
  400. package/build/exports.js +5 -5
  401. package/build/exports.js.map +1 -1
  402. package/build/index.d.ts +1 -1
  403. package/build/index.d.ts.map +1 -1
  404. package/build/index.js +1 -1
  405. package/build/index.js.map +1 -1
  406. package/build/main.d.ts +1 -4
  407. package/build/main.d.ts.map +1 -1
  408. package/build/main.js.map +1 -1
  409. package/build/modules.d.ts +1 -1
  410. package/build/modules.d.ts.map +1 -1
  411. package/build/permission/i18n/be.json +13 -0
  412. package/build/permission/i18n/de.json +13 -0
  413. package/build/permission/i18n/en.json +13 -0
  414. package/build/permission/i18n/es.json +13 -0
  415. package/build/permission/i18n/fr.json +13 -0
  416. package/build/permission/i18n/pl.json +13 -0
  417. package/build/permission/i18n/ru.json +13 -0
  418. package/build/permission/i18n/uk.json +13 -0
  419. package/build/permission/i18n.d.ts +2 -0
  420. package/build/permission/i18n.d.ts.map +1 -0
  421. package/build/permission/i18n.js +13 -0
  422. package/build/permission/i18n.js.map +1 -0
  423. package/build/permission/index.d.ts +6 -0
  424. package/build/permission/index.d.ts.map +1 -0
  425. package/build/permission/index.js +27 -0
  426. package/build/permission/index.js.map +1 -0
  427. package/build/permission/toast.d.ts +5 -0
  428. package/build/permission/toast.d.ts.map +1 -0
  429. package/build/permission/toast.js +8 -0
  430. package/build/permission/toast.js.map +1 -0
  431. package/build/permission/types.d.ts +6 -0
  432. package/build/permission/types.d.ts.map +1 -0
  433. package/build/permission/types.js +2 -0
  434. package/build/permission/types.js.map +1 -0
  435. package/build/picker/icons/consts.d.ts +9 -0
  436. package/build/picker/icons/consts.d.ts.map +1 -0
  437. package/build/picker/icons/consts.js +264 -0
  438. package/build/picker/icons/consts.js.map +1 -0
  439. package/build/picker/icons/types.d.ts +18 -0
  440. package/build/picker/icons/types.d.ts.map +1 -0
  441. package/build/picker/icons/types.js +2 -0
  442. package/build/picker/icons/types.js.map +1 -0
  443. package/build/picker/icons.d.ts +4 -0
  444. package/build/picker/icons.d.ts.map +1 -0
  445. package/build/picker/icons.js +54 -0
  446. package/build/picker/icons.js.map +1 -0
  447. package/build/picker/index.d.ts +11 -0
  448. package/build/picker/index.d.ts.map +1 -0
  449. package/build/picker/index.js +10 -0
  450. package/build/picker/index.js.map +1 -0
  451. package/build/picker/utils/color/types.d.ts +35 -0
  452. package/build/picker/utils/color/types.d.ts.map +1 -0
  453. package/build/picker/utils/color/types.js +2 -0
  454. package/build/picker/utils/color/types.js.map +1 -0
  455. package/build/picker/utils/color.d.ts +4 -0
  456. package/build/picker/utils/color.d.ts.map +1 -0
  457. package/build/picker/utils/color.js +96 -0
  458. package/build/picker/utils/color.js.map +1 -0
  459. package/build/picker/vocabulary/consts.d.ts +26 -0
  460. package/build/picker/vocabulary/consts.d.ts.map +1 -0
  461. package/build/picker/vocabulary/consts.js +336 -0
  462. package/build/picker/vocabulary/consts.js.map +1 -0
  463. package/build/picker/vocabulary/types.d.ts +67 -0
  464. package/build/picker/vocabulary/types.d.ts.map +1 -0
  465. package/build/picker/vocabulary/types.js +2 -0
  466. package/build/picker/vocabulary/types.js.map +1 -0
  467. package/build/picker/vocabulary.d.ts +11 -0
  468. package/build/picker/vocabulary.d.ts.map +1 -0
  469. package/build/picker/vocabulary.js +83 -0
  470. package/build/picker/vocabulary.js.map +1 -0
  471. package/build/scheme/consts.d.ts +8 -0
  472. package/build/scheme/consts.d.ts.map +1 -0
  473. package/build/scheme/consts.js +8 -0
  474. package/build/scheme/consts.js.map +1 -0
  475. package/build/scheme/index.d.ts +4 -0
  476. package/build/scheme/index.d.ts.map +1 -0
  477. package/build/scheme/index.js +3 -0
  478. package/build/scheme/index.js.map +1 -0
  479. package/build/scheme/scheme.d.ts +16 -0
  480. package/build/scheme/scheme.d.ts.map +1 -0
  481. package/build/scheme/scheme.js +58 -0
  482. package/build/scheme/scheme.js.map +1 -0
  483. package/build/scheme/types.d.ts +30 -0
  484. package/build/scheme/types.d.ts.map +1 -0
  485. package/build/scheme/types.js +2 -0
  486. package/build/scheme/types.js.map +1 -0
  487. package/build/types.d.ts +18 -2
  488. package/build/types.d.ts.map +1 -1
  489. package/package.json +107 -52
  490. package/src/@/components/ui/alert-dialog.tsx +156 -0
  491. package/src/@/components/ui/alert.tsx +1 -1
  492. package/src/@/components/ui/button.tsx +1 -1
  493. package/src/@/components/ui/card.tsx +1 -1
  494. package/src/@/components/ui/input.tsx +1 -1
  495. package/src/@/components/ui/label.tsx +1 -1
  496. package/src/@/components/ui/navigation-menu.tsx +1 -1
  497. package/src/@/components/ui/popover.tsx +47 -0
  498. package/src/@/components/ui/progress.tsx +1 -1
  499. package/src/@/components/ui/separator.tsx +1 -1
  500. package/src/@/components/ui/sheet.tsx +142 -0
  501. package/src/auth/context.ts +0 -2
  502. package/src/auth/entrypoints.ts +5 -0
  503. package/src/auth/exports.ts +4 -4
  504. package/src/auth/plugins/basic-ed25519.tsx +4 -4
  505. package/src/auth/plugins/re-captcha.tsx +3 -3
  506. package/src/auth/plugins/tunnel-consumer.tsx +1 -1
  507. package/src/components/block.tsx +2 -2
  508. package/src/components/consts.local.ts +29 -0
  509. package/src/components/footer/component.tsx +58 -16
  510. package/src/components/footer/credit.tsx +61 -0
  511. package/src/components/footer/index.ts +1 -0
  512. package/src/components/footer/types.ts +22 -1
  513. package/src/components/form/button/component.tsx +7 -4
  514. package/src/components/form/component.tsx +2 -2
  515. package/src/components/form/text/component.tsx +2 -2
  516. package/src/components/helper.ts +1 -13
  517. package/src/components/index.ts +4 -0
  518. package/src/components/link.tsx +3 -3
  519. package/src/components/login/append.ts +34 -0
  520. package/src/components/login/consts.local.ts +10 -0
  521. package/src/components/login/consts.ts +2 -0
  522. package/src/components/login/credit.tsx +33 -0
  523. package/src/components/login/i18n/be.json +10 -0
  524. package/src/components/login/i18n/de.json +10 -0
  525. package/src/components/login/i18n/en.json +10 -0
  526. package/src/components/login/i18n/es.json +10 -0
  527. package/src/components/login/i18n/fr.json +10 -0
  528. package/src/components/login/i18n/pl.json +10 -0
  529. package/src/components/login/i18n/ru.json +10 -0
  530. package/src/components/login/i18n/uk.json +10 -0
  531. package/src/components/login/i18n.ts +29 -0
  532. package/src/components/login/icons.tsx +39 -0
  533. package/src/components/login/index.ts +11 -0
  534. package/src/components/login/notify.ts +48 -0
  535. package/src/components/login/provider.tsx +57 -0
  536. package/src/components/login/screen.tsx +178 -0
  537. package/src/components/login/terms.tsx +75 -0
  538. package/src/components/login/types.ts +30 -0
  539. package/src/components/nav/consts.local.ts +64 -0
  540. package/src/components/nav/index.ts +1 -0
  541. package/src/components/nav/layout.tsx +184 -26
  542. package/src/components/nav/mobile.tsx +165 -0
  543. package/src/components/nav/side.tsx +43 -27
  544. package/src/components/nav/top.tsx +44 -22
  545. package/src/components/nav/types.ts +65 -2
  546. package/src/components/nav/viewport.ts +16 -0
  547. package/src/components/panel-app/component.tsx +9 -1
  548. package/src/components/picker/color-picker.tsx +15 -0
  549. package/src/components/picker/consts.local.ts +267 -0
  550. package/src/components/picker/dot.tsx +21 -0
  551. package/src/components/picker/grid.tsx +138 -0
  552. package/src/components/picker/i18n/be.json +60 -0
  553. package/src/components/picker/i18n/de.json +60 -0
  554. package/src/components/picker/i18n/en.json +60 -0
  555. package/src/components/picker/i18n/es.json +60 -0
  556. package/src/components/picker/i18n/fr.json +60 -0
  557. package/src/components/picker/i18n/pl.json +60 -0
  558. package/src/components/picker/i18n/ru.json +60 -0
  559. package/src/components/picker/i18n/uk.json +60 -0
  560. package/src/components/picker/i18n.ts +19 -0
  561. package/src/components/picker/icon-color-picker.tsx +25 -0
  562. package/src/components/picker/icon-picker.tsx +13 -0
  563. package/src/components/picker/index.ts +11 -0
  564. package/src/components/picker/panel.tsx +61 -0
  565. package/src/components/picker/root.tsx +81 -0
  566. package/src/components/picker/roving.ts +70 -0
  567. package/src/components/picker/surface.tsx +62 -0
  568. package/src/components/picker/swatches/custom.tsx +110 -0
  569. package/src/components/picker/swatches.tsx +67 -0
  570. package/src/components/picker/text.ts +46 -0
  571. package/src/components/picker/tile.tsx +35 -0
  572. package/src/components/picker/translate.ts +15 -0
  573. package/src/components/picker/trigger.tsx +54 -0
  574. package/src/components/picker/types.local.ts +154 -0
  575. package/src/components/picker/types.ts +125 -0
  576. package/src/components/scheme/consts.local.ts +13 -0
  577. package/src/components/scheme/hook.ts +62 -0
  578. package/src/components/scheme/index.ts +4 -0
  579. package/src/components/scheme/toggle.tsx +32 -0
  580. package/src/components/scheme/types.ts +23 -0
  581. package/src/components/socket/i18n/be.json +9 -0
  582. package/src/components/socket/i18n/de.json +9 -0
  583. package/src/components/socket/i18n/en.json +9 -0
  584. package/src/components/socket/i18n/es.json +9 -0
  585. package/src/components/socket/i18n/fr.json +9 -0
  586. package/src/components/socket/i18n/pl.json +9 -0
  587. package/src/components/socket/i18n/ru.json +9 -0
  588. package/src/components/socket/i18n/uk.json +9 -0
  589. package/src/components/socket/i18n.ts +19 -0
  590. package/src/components/socket/index.ts +2 -0
  591. package/src/components/socket/reload-dialog.tsx +61 -0
  592. package/src/components/status.tsx +1 -1
  593. package/src/components/text.tsx +2 -14
  594. package/src/components/toaster.tsx +65 -0
  595. package/src/components/uploader/consts.local.ts +7 -0
  596. package/src/components/uploader/image.tsx +2 -6
  597. package/src/consent/component.tsx +84 -0
  598. package/src/consent/consts.local.ts +10 -0
  599. package/src/consent/consts.ts +1 -0
  600. package/src/consent/geo.ts +26 -0
  601. package/src/consent/index.ts +24 -0
  602. package/src/consent/language.ts +12 -0
  603. package/src/consent/menu-widget.tsx +22 -0
  604. package/src/consent/presence.ts +45 -0
  605. package/src/consent/service.ts +75 -0
  606. package/src/consent/translate.ts +31 -0
  607. package/src/consent/types.local.ts +6 -0
  608. package/src/consent/types.ts +43 -0
  609. package/src/context.ts +12 -0
  610. package/src/editor/component.tsx +172 -0
  611. package/src/editor/consts.local.ts +62 -0
  612. package/src/editor/index.ts +2 -0
  613. package/src/editor/types.ts +24 -0
  614. package/src/entrypoints.ts +5 -0
  615. package/src/exports.ts +6 -5
  616. package/src/index.ts +1 -1
  617. package/src/main.tsx +2 -6
  618. package/src/permission/i18n/be.json +13 -0
  619. package/src/permission/i18n/de.json +13 -0
  620. package/src/permission/i18n/en.json +13 -0
  621. package/src/permission/i18n/es.json +13 -0
  622. package/src/permission/i18n/fr.json +13 -0
  623. package/src/permission/i18n/pl.json +13 -0
  624. package/src/permission/i18n/ru.json +13 -0
  625. package/src/permission/i18n/uk.json +13 -0
  626. package/src/permission/i18n.ts +13 -0
  627. package/src/permission/index.ts +27 -0
  628. package/src/permission/toast.tsx +20 -0
  629. package/src/permission/types.ts +5 -0
  630. package/src/picker/icons/consts.ts +309 -0
  631. package/src/picker/icons/types.ts +18 -0
  632. package/src/picker/icons.ts +70 -0
  633. package/src/picker/index.ts +11 -0
  634. package/src/picker/utils/color/types.ts +37 -0
  635. package/src/picker/utils/color.ts +119 -0
  636. package/src/picker/vocabulary/consts.ts +347 -0
  637. package/src/picker/vocabulary/types.ts +72 -0
  638. package/src/picker/vocabulary.ts +111 -0
  639. package/src/scheme/consts.ts +8 -0
  640. package/src/scheme/index.ts +3 -0
  641. package/src/scheme/scheme.ts +66 -0
  642. package/src/scheme/types.ts +30 -0
  643. package/src/types.ts +19 -2
  644. package/tests/consent-language.spec.ts +31 -0
  645. package/tests/consent.spec.ts +112 -0
  646. package/tests/context.ts +4 -0
  647. package/tests/editor.spec.ts +58 -0
  648. package/tests/harness/editor.tsx +32 -0
  649. package/tests/harness/index.html +1 -0
  650. package/tests/harness/lazy-screen.tsx +9 -0
  651. package/tests/harness/mount.tsx +370 -29
  652. package/tests/harness/picker.tsx +110 -0
  653. package/tests/lazy.spec.ts +104 -0
  654. package/tests/login-provider.spec.ts +114 -0
  655. package/tests/login.spec.ts +447 -0
  656. package/tests/nav.spec.ts +449 -3
  657. package/tests/package-boundary.spec.ts +19 -0
  658. package/tests/picker-shots.spec.ts +174 -0
  659. package/tests/picker-vocabulary.spec.ts +217 -0
  660. package/tests/picker.spec.ts +333 -0
  661. package/tests/scheme.spec.ts +149 -0
  662. package/tests/smoke.spec.ts +2 -2
  663. package/tests/socket-dialog.spec.ts +154 -0
  664. package/tests/toaster.spec.ts +59 -0
  665. package/zz-tw.d.mts +2 -0
  666. package/zz-tw.d.mts.map +1 -0
  667. package/build/.gitkeep +0 -0
  668. package/src/auth/modules.ts +0 -5
  669. package/src/modules.ts +0 -5
@@ -0,0 +1,33 @@
1
+ import type { FC } from 'react'
2
+ import { cn } from '../../@/lib/utils.js'
3
+ import { OWLMEANS_URL } from './consts.js'
4
+ import type { LoginCreditProps } from './types.js'
5
+
6
+ /**
7
+ * The line at the bottom of a sign-in screen.
8
+ *
9
+ * Two halves, and each may stand alone: the platform credit, and who the application belongs to.
10
+ * A generated application shows both — "Powered by OwlMeans" beside its own product and
11
+ * organization — and an application whose owner has paid to drop the credit shows only the second.
12
+ * Rendering nothing at all is also correct, for an app that is neither.
13
+ */
14
+ export const LoginCredit: FC<LoginCreditProps> = ({ model, translate, className }) => {
15
+ if (!model.poweredBy && model.line == null) {
16
+ return null
17
+ }
18
+
19
+ return <p
20
+ data-login-credit
21
+ className={cn('text-center text-xs text-muted-foreground', className)}
22
+ >
23
+ {model.poweredBy && <a
24
+ data-login-powered
25
+ href={OWLMEANS_URL} target="_blank" rel="noopener noreferrer"
26
+ className="underline-offset-4 hover:text-foreground hover:underline"
27
+ >
28
+ {translate('login.credit.powered', 'Powered by OwlMeans')}
29
+ </a>}
30
+ {model.poweredBy && model.line != null && <span aria-hidden="true"> · </span>}
31
+ {model.line != null && <span>{model.line}</span>}
32
+ </p>
33
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Уваход у {{product}}",
5
+ "top": "Гэтую праграму размяшчае {{operator}} ад імя {{product}}. Для ўваходу выкарыстоўваецца {{provider}}.",
6
+ "inline": "Уваход забяспечвае {{provider}} ад імя {{product}}.",
7
+ "more": "Падрабязней"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Bei {{product}} anmelden",
5
+ "top": "Diese App wird von {{operator}} im Auftrag von {{product}} gehostet. Sie melden sich mit {{provider}} an.",
6
+ "inline": "Die Anmeldung stellt {{provider}} im Auftrag von {{product}} bereit.",
7
+ "more": "Weitere Informationen"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Sign in to {{product}}",
5
+ "top": "This app is hosted by {{operator}} on behalf of {{product}}. You sign in with {{provider}}.",
6
+ "inline": "Sign-in is provided by {{provider}} on behalf of {{product}}.",
7
+ "more": "More information"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Iniciar sesión en {{product}}",
5
+ "top": "Esta aplicación está alojada por {{operator}} en nombre de {{product}}. Inicias sesión con {{provider}}.",
6
+ "inline": "El inicio de sesión lo proporciona {{provider}} en nombre de {{product}}.",
7
+ "more": "Más información"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Connexion à {{product}}",
5
+ "top": "Cette application est hébergée par {{operator}} pour le compte de {{product}}. Vous vous connectez avec {{provider}}.",
6
+ "inline": "La connexion est assurée par {{provider}} pour le compte de {{product}}.",
7
+ "more": "En savoir plus"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Zaloguj się do {{product}}",
5
+ "top": "Ta aplikacja jest hostowana przez {{operator}} w imieniu {{product}}. Logujesz się przez {{provider}}.",
6
+ "inline": "Logowanie zapewnia {{provider}} w imieniu {{product}}.",
7
+ "more": "Więcej informacji"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Вход в {{product}}",
5
+ "top": "Это приложение размещает {{operator}} от имени {{product}}. Для входа используется {{provider}}.",
6
+ "inline": "Вход обеспечивает {{provider}} от имени {{product}}.",
7
+ "more": "Подробнее"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "login": {
3
+ "provider": {
4
+ "title": "Вхід до {{product}}",
5
+ "top": "Цей застосунок розміщує {{operator}} від імені {{product}}. Для входу використовується {{provider}}.",
6
+ "inline": "Вхід забезпечує {{provider}} від імені {{product}}.",
7
+ "more": "Докладніше"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,29 @@
1
+ import { i18nHelper } from '@owlmeans/i18n'
2
+
3
+ import en from './i18n/en.json' with { type: 'json' }
4
+ import pl from './i18n/pl.json' with { type: 'json' }
5
+ import ru from './i18n/ru.json' with { type: 'json' }
6
+ import be from './i18n/be.json' with { type: 'json' }
7
+ import uk from './i18n/uk.json' with { type: 'json' }
8
+ import es from './i18n/es.json' with { type: 'json' }
9
+ import de from './i18n/de.json' with { type: 'json' }
10
+ import fr from './i18n/fr.json' with { type: 'json' }
11
+ import { AUTH_RESOURCE } from './consts.local.js'
12
+
13
+ /**
14
+ * The provider disclosure's copy (`login.provider.*`), registered into the SAME `auth` library
15
+ * resource `@owlmeans/client-auth/login` fills with the rest of the sign-in screen.
16
+ *
17
+ * `_addI18n` pushes and the bundles are merged deeply by tier and priority, so this chunk lands
18
+ * beside `login.title`/`login.terms.*` rather than replacing the `login` subtree. It lives here, not
19
+ * in `client-auth`, because only this package renders the disclosure — and `client-auth` is pinned
20
+ * exactly by applications that must not be pulled into a release for it.
21
+ */
22
+ i18nHelper.addI18nLib('en', AUTH_RESOURCE, en)
23
+ i18nHelper.addI18nLib('pl', AUTH_RESOURCE, pl)
24
+ i18nHelper.addI18nLib('ru', AUTH_RESOURCE, ru)
25
+ i18nHelper.addI18nLib('be', AUTH_RESOURCE, be)
26
+ i18nHelper.addI18nLib('uk', AUTH_RESOURCE, uk)
27
+ i18nHelper.addI18nLib('es', AUTH_RESOURCE, es)
28
+ i18nHelper.addI18nLib('de', AUTH_RESOURCE, de)
29
+ i18nHelper.addI18nLib('fr', AUTH_RESOURCE, fr)
@@ -0,0 +1,39 @@
1
+ import type { FC } from 'react'
2
+ import { KeyRound, LogIn, Mail, ShieldCheck, Wallet } from 'lucide-react'
3
+
4
+ /**
5
+ * Google's mark, inline.
6
+ *
7
+ * Lucide carries no brand marks, and a remote image on a sign-in screen is a third-party request
8
+ * before consent. Four paths cost less than either.
9
+ */
10
+ const GoogleMark: FC<{ className?: string }> = ({ className }) => (
11
+ <svg className={className} viewBox="0 0 48 48" aria-hidden="true" role="presentation">
12
+ <path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z" />
13
+ <path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z" />
14
+ <path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z" />
15
+ <path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z" />
16
+ </svg>
17
+ )
18
+
19
+ const ICONS: Record<string, FC<{ className?: string }>> = {
20
+ google: GoogleMark,
21
+ key: KeyRound,
22
+ shield: ShieldCheck,
23
+ wallet: Wallet,
24
+ mail: Mail,
25
+ }
26
+
27
+ /**
28
+ * A method's icon, resolved from a NAME.
29
+ *
30
+ * The registry carries names rather than components so that `@owlmeans/client-auth` and
31
+ * `@owlmeans/oidc` — neither of which may depend on an icon library — can describe a method
32
+ * completely. An unknown name renders the generic sign-in glyph rather than nothing, because a row
33
+ * of buttons where one has no icon reads as a rendering fault.
34
+ */
35
+ export const LoginMethodIcon: FC<{ name?: string, className?: string }> = ({ name, className }) => {
36
+ const Icon = (name != null ? ICONS[name] : undefined) ?? LogIn
37
+
38
+ return <Icon className={className} />
39
+ }
@@ -0,0 +1,11 @@
1
+ import './i18n.js'
2
+
3
+ export * from './screen.js'
4
+ export * from './terms.js'
5
+ export type * from './types.js'
6
+ export * from './credit.js'
7
+ export * from './provider.js'
8
+ export * from './consts.js'
9
+ export * from './icons.js'
10
+ export * from './append.js'
11
+ export * from './notify.js'
@@ -0,0 +1,48 @@
1
+ import { LIB_NAMESPACE, i18nHelper } from '@owlmeans/i18n'
2
+ import { i18nInstanceHelper } from '@owlmeans/client-i18n/utils'
3
+ import type { ClientConfig } from '@owlmeans/client-context'
4
+ import { toast } from 'sonner'
5
+ import { LoginOutcome, type LoginNotifier } from '@owlmeans/client-auth/login'
6
+ import { AUTH_RESOURCE, POPUP_BLOCKED_FALLBACK } from './consts.local.js'
7
+
8
+ /**
9
+ * Translate an `auth`-library key with no mounted component to read it through.
10
+ *
11
+ * The toast this feeds fires from `registerNotifier`, which is not a render — there is no
12
+ * `useI18nLib('auth')` around to have already pulled the bundle into this app's i18next instance.
13
+ * `initI18nResource` is the same one-shot loader that hook calls internally: whichever of the two
14
+ * runs first merges the bundle into the SAME instance `getI18nInstance` returns (one per app,
15
+ * memoized), and the other later gets `null` back and no-ops with the bundle already there.
16
+ */
17
+ const translateAuth = (cfg: ClientConfig, key: string, fallback: string): string => {
18
+ const i18n = i18nInstanceHelper.getI18nInstance(cfg)
19
+ const resources = i18nHelper.initI18nResource(i18n.language, AUTH_RESOURCE, LIB_NAMESPACE)
20
+ resources?.forEach(
21
+ resource => i18n.addResourceBundle(
22
+ i18n.language, LIB_NAMESPACE, { [AUTH_RESOURCE]: resource.data }, true, true
23
+ )
24
+ )
25
+
26
+ return i18n.t(`${AUTH_RESOURCE}.${key}`, { ns: LIB_NAMESPACE, defaultValue: fallback })
27
+ }
28
+
29
+ /**
30
+ * Tell the user a login/logout attempt was silently blocked, when nothing else on screen will.
31
+ *
32
+ * The sign-in SCREEN already renders `loginAttemptError` inline (`LoginScreen`'s `attemptError`),
33
+ * but a header "Log in"/"Log out" control has no screen at all — `useLogin`/`useLogout` fire the
34
+ * facade and forget the result. This is the one place that outcome reaches a person for that
35
+ * control, and it is registered on the login service itself (see `appendLoginScreen`) so an
36
+ * application gets it merely by calling the function it already calls, not by writing new code.
37
+ *
38
+ * Reacts to `Blocked` only: every other outcome either did something (`Handled`, `Redirected`),
39
+ * is reported elsewhere (`Orphaned`, inside the surrogate window), or has nowhere useful to point a
40
+ * toast at (`Gesture`, `Failed`, `Passed`) — a toast that fires on every click would train a user to
41
+ * dismiss it rather than read it.
42
+ */
43
+ export const notifyPopupBlocked = (cfg: ClientConfig): LoginNotifier => outcome => {
44
+ if (outcome !== LoginOutcome.Blocked) {
45
+ return
46
+ }
47
+ toast.warning(translateAuth(cfg, 'login.error.blocked', POPUP_BLOCKED_FALLBACK))
48
+ }
@@ -0,0 +1,57 @@
1
+ import type { FC } from 'react'
2
+ import { ShieldCheck } from 'lucide-react'
3
+ import { cn } from '../../@/lib/utils.js'
4
+ import { loginProviderHelper } from '@owlmeans/client-panel/auth'
5
+ import type { LoginProviderNoteProps } from './types.js'
6
+
7
+ /**
8
+ * Who signs the person in, and on whose behalf.
9
+ *
10
+ * A sign-in page that a third party runs for an application has to say so wherever the
11
+ * application's own name appears: the relationship in a sentence, and a "More information" link.
12
+ * Without it the page is a stranger's form wearing someone else's name — which is precisely what a
13
+ * browser's impersonation heuristics look for.
14
+ *
15
+ * `top` is a full-width strip the screen renders as its FIRST child, above the card (the platform's
16
+ * own hosts); `inline` is one line inside the card, under the methods (an owner's own domain).
17
+ * A `role="note"` block, never `header`/`nav`: it is a disclosure, not page chrome, and a screen
18
+ * that grew a landmark here would be read as a second banner.
19
+ *
20
+ * The names are put in after translation (`loginProviderHelper.fill`), so word order stays the
21
+ * translator's and nothing but plain text ever reaches the markup.
22
+ */
23
+ export const LoginProviderNote: FC<LoginProviderNoteProps> = ({ model, translate, className }) => {
24
+ const top = model.placement === 'top'
25
+ const sentence = top
26
+ ? translate('login.provider.top', 'This app is hosted by {{operator}} on behalf of {{product}}. You sign in with {{provider}}.')
27
+ : translate('login.provider.inline', 'Sign-in is provided by {{provider}} on behalf of {{product}}.')
28
+
29
+ return <div
30
+ role="note"
31
+ data-login-provider
32
+ data-placement={model.placement}
33
+ // The strip's full width is inline for the same reason the screen's height is: it is the part
34
+ // of the layout a stale `@source` scan must never be able to drop.
35
+ style={top ? { width: '100%', boxSizing: 'border-box' } : undefined}
36
+ className={cn(
37
+ 'flex items-start justify-center gap-2 text-center text-xs text-muted-foreground',
38
+ top && 'border-b bg-muted px-4 py-2',
39
+ className
40
+ )}
41
+ >
42
+ <ShieldCheck aria-hidden="true" className="size-4 shrink-0" />
43
+ <span>
44
+ {loginProviderHelper.fill(sentence, model)}
45
+ {model.info != null && <>
46
+ {' '}
47
+ <a
48
+ data-login-provider-info
49
+ href={model.info} target="_blank" rel="noopener noreferrer"
50
+ className="underline underline-offset-2 hover:text-foreground"
51
+ >
52
+ {translate('login.provider.more', 'More information')}
53
+ </a>
54
+ </>}
55
+ </span>
56
+ </div>
57
+ }
@@ -0,0 +1,178 @@
1
+ import { isValidElement, type FC } from 'react'
2
+ import { Loader2 } from 'lucide-react'
3
+ import { Button } from '../../@/components/ui/button.js'
4
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../../@/components/ui/card.js'
5
+ import { cn } from '../../@/lib/utils.js'
6
+ import { useI18nLib, useLanguage } from '@owlmeans/client-i18n'
7
+ import { loginProviderHelper, useLoginMethods } from '@owlmeans/client-panel/auth'
8
+ import { type LoginMethod, type LoginScreenProps, loginResumeHelper } from '@owlmeans/client-auth/login'
9
+ import { LoginMethodIcon } from './icons.js'
10
+ import { LoginPrivacyNotice, LoginTerms } from './terms.js'
11
+ import { LoginCredit } from './credit.js'
12
+ import { LoginProviderNote } from './provider.js'
13
+ import { VARIANT } from './consts.local.js'
14
+ import './i18n.js'
15
+
16
+ /**
17
+ * The sign-in screen: which identity provider, confirmed against which documents.
18
+ *
19
+ * It never starts anything by itself. Every flow leaves from a click — which is the requirement,
20
+ * and also what makes framed sign-in work at all, because the window a framed application has to
21
+ * open can only be opened inside a user gesture.
22
+ *
23
+ * Pure with respect to i18n: `translate` is a prop. {@link LocalizedLoginScreen} is the wrapper
24
+ * that binds it to the app's own resources, so an application mounted without an i18n provider can
25
+ * still render this one with a resolver of its own.
26
+ */
27
+ export const LoginScreen: FC<LoginScreenProps> = props => {
28
+ const t = props.translate ?? ((_key: string, defaultValue: string) => defaultValue)
29
+ const model = useLoginMethods({
30
+ ...(props.config != null ? { config: props.config } : {}),
31
+ ...(props.terms !== undefined ? { terms: props.terms } : {}),
32
+ ...(props.methods != null ? { methods: props.methods } : {}),
33
+ })
34
+
35
+ const Logo = props.Logo
36
+ const attemptError = model.busy == null ? loginResumeHelper.loginAttemptError(model.outcome) : null
37
+
38
+ const provider = model.provider
39
+ const title = props.title ?? (provider != null
40
+ ? loginProviderHelper.fill(t('login.provider.title', 'Sign in to {{product}}'), provider)
41
+ : t('login.title', 'Sign in'))
42
+
43
+ const card = <Card className={cn('w-full max-w-sm', props.containerClassName)}>
44
+ <CardHeader className="items-center gap-2 text-center">
45
+ {Logo != null && <div className="flex justify-center pb-2">
46
+ {isValidElement(Logo) ? Logo : typeof Logo === 'function'
47
+ ? <Logo className="h-10 w-auto" /> : Logo}
48
+ </div>}
49
+ <CardTitle className="text-xl">{title}</CardTitle>
50
+ <CardDescription>
51
+ {props.subtitle ?? t('login.subtitle', 'Choose how you would like to continue.')}
52
+ </CardDescription>
53
+ </CardHeader>
54
+
55
+ <CardContent className="flex flex-col gap-4">
56
+ {model.methods.length < 1
57
+ ? <p role="status" className="text-sm text-muted-foreground text-center">
58
+ {t('login.empty', 'No sign-in method is configured for this application.')}
59
+ </p>
60
+ : <div className="flex flex-col gap-2">
61
+ {model.methods.map((method: LoginMethod) => <Button
62
+ key={method.id}
63
+ type="button"
64
+ data-login-method={method.id}
65
+ variant={VARIANT[method.emphasis ?? 'secondary'] ?? 'outline'}
66
+ // `aria-disabled`, never `disabled`. A disabled button swallows the click, so a user
67
+ // who has not confirmed the terms would press it and be told nothing at all — the
68
+ // screen would simply seem broken. Blocking happens in the handler, which then says
69
+ // why.
70
+ aria-disabled={model.blocked || undefined}
71
+ data-blocked={model.blocked ? 'true' : undefined}
72
+ // `cursor-pointer` explicitly: the package's private shadcn button stays compatible
73
+ // with the older primitive style too. Stating it here keeps the sign-in control
74
+ // visibly actionable independently of a consumer's shadcn setup.
75
+ className={cn(
76
+ 'w-full justify-center gap-2 cursor-pointer',
77
+ model.blocked && 'opacity-60'
78
+ )}
79
+ autoFocus={method.id === model.primary?.id}
80
+ onClick={() => model.select(method)}
81
+ >
82
+ {model.busy === method.id
83
+ ? <Loader2 className="size-4 animate-spin" />
84
+ : <LoginMethodIcon name={method.icon} className="size-4" />}
85
+ {method.label ?? t(`login.method.${method.i18nKey ?? method.id}`, method.id)}
86
+ </Button>)}
87
+ </div>}
88
+
89
+ {/* On the owner's own domain the disclosure is one line under the methods — the place a
90
+ person looks just before choosing one. */}
91
+ {provider?.placement === 'inline' && <LoginProviderNote model={provider} translate={t} />}
92
+
93
+ {/* Terms mode: the checkbox lives on a post-login step instead (`termsDeferred`) — this
94
+ screen shows the privacy disclosure alone and blocks nothing on it. */}
95
+ {model.terms.required && (model.terms.deferred
96
+ ? <LoginPrivacyNotice model={model.terms} translate={t} locale={props.locale} />
97
+ : <LoginTerms model={model.terms} translate={t} locale={props.locale} />)}
98
+
99
+ {/*
100
+ A thrown message first, because it names the actual fault; otherwise whatever the
101
+ finished outcome means for someone still looking at this screen. An attempt that ends
102
+ without moving the document MUST say so — silence here reads as a dead button.
103
+ */}
104
+ {(model.error ?? attemptError) != null
105
+ && <p role="alert" data-login-error className="text-sm text-destructive text-center">
106
+ {model.error ?? t(attemptError as string, 'Sign-in did not complete. Please try again.')}
107
+ </p>}
108
+ </CardContent>
109
+
110
+ <div className="px-6">
111
+ {props.footer ?? <LoginCredit model={model.credit} translate={t} />}
112
+ </div>
113
+ </Card>
114
+
115
+ // The viewport height is set INLINE, and deliberately.
116
+ //
117
+ // A percentage minimum (`min-h-full`) resolves against a parent that has a height, and this
118
+ // screen is rendered straight out of the dispatcher into whatever the app has around it — which
119
+ // almost never carries one, so the box collapsed to its content and the card sat at the top of
120
+ // an empty page. The fix is a viewport unit; the reason it is not a utility class is that this
121
+ // package's classes reach a consuming app's stylesheet only through a `@source` scan of its
122
+ // `src`, and a class NEW to that stylesheet is the one thing the scan can be stale about. Every
123
+ // other utility here already exists in any app that renders anything; a missing `min-h-dvh`
124
+ // rule, by contrast, is invisible — the screen looks nearly right and is silently uncentred.
125
+ //
126
+ // `props.style` still wins, because a class-based override no longer can.
127
+ //
128
+ // The platform's own hosts put the provider disclosure in a strip across the top of the page —
129
+ // the FIRST child of the screen — and centre the card in a stage that takes the rest of the
130
+ // height. Every layout-bearing property of that variant is inline too, for the same reason.
131
+ if (provider?.placement === 'top') {
132
+ return <div
133
+ data-login-screen
134
+ style={{
135
+ minHeight: '100dvh', display: 'flex', flexDirection: 'column', alignItems: 'stretch',
136
+ justifyContent: 'flex-start', padding: 0, ...props.style,
137
+ }}
138
+ className={cn('w-full', props.className)}
139
+ >
140
+ <LoginProviderNote model={provider} translate={t} />
141
+ <div
142
+ data-login-stage
143
+ style={{
144
+ display: 'flex', flex: '1 1 auto', alignItems: 'center', justifyContent: 'center',
145
+ width: '100%', padding: '1rem', boxSizing: 'border-box',
146
+ }}
147
+ >
148
+ {card}
149
+ </div>
150
+ </div>
151
+ }
152
+
153
+ return <div
154
+ data-login-screen
155
+ style={{ minHeight: '100dvh', ...props.style }}
156
+ className={cn('flex w-full items-center justify-center p-4', props.className)}
157
+ >
158
+ {card}
159
+ </div>
160
+ }
161
+
162
+ /**
163
+ * {@link LoginScreen} bound to the application's own translations.
164
+ *
165
+ * The split exists because the house rule is that a reusable component takes `translate` as a prop
166
+ * and never reaches for a context — but the ordinary case is an app that has one, and making every
167
+ * app write the resolver would guarantee some of them ship English.
168
+ */
169
+ export const LocalizedLoginScreen: FC<LoginScreenProps> = props => {
170
+ const t = useI18nLib('auth')
171
+ const [lng] = useLanguage()
172
+
173
+ return <LoginScreen
174
+ {...props}
175
+ translate={props.translate ?? ((key, defaultValue) => t(key, { defaultValue }))}
176
+ locale={props.locale ?? lng}
177
+ />
178
+ }
@@ -0,0 +1,75 @@
1
+ import type { FC, ReactNode } from 'react'
2
+ import { cn } from '../../@/lib/utils.js'
3
+ import { type TermsSentencePart, loginTermsHelper } from '@owlmeans/client-auth/login'
4
+ import type { LoginPrivacyNoticeProps, LoginTermsProps } from './types.js'
5
+
6
+ const renderParts = (parts: TermsSentencePart[]): ReactNode =>
7
+ parts.map((part, index) => part.href != null
8
+ ? <a key={index} href={part.href} target="_blank" rel="noreferrer noopener"
9
+ data-login-document={part.documentKey}
10
+ className="underline underline-offset-2 hover:text-foreground">{part.text}</a>
11
+ : <span key={index}>{part.text}</span>)
12
+
13
+ /**
14
+ * The privacy disclosure alone — `notices` (privacy, plus cookies per its own rule), never
15
+ * consented to and never nested inside a checkbox's `<label>`.
16
+ *
17
+ * Split out of {@link LoginTerms} so a sign-in screen whose Terms confirmation has moved to a
18
+ * post-login step (`termsDeferred`, `@owlmeans/client-auth/login`) can still show this line on its
19
+ * own — the disclosure does not move just because the confirmation did.
20
+ */
21
+ export const LoginPrivacyNotice: FC<LoginPrivacyNoticeProps> = ({ model, translate, locale, className }) => {
22
+ const resolveLabel = loginTermsHelper.termsLabelResolver(translate, locale)
23
+
24
+ return <p data-login-privacy className={cn('text-xs text-muted-foreground', className)}>
25
+ {renderParts(loginTermsHelper.termsSentence(translate('login.terms.notice', 'How we handle your personal data: {{notices}}.'), model, locale, resolveLabel))}
26
+ </p>
27
+ }
28
+
29
+ /**
30
+ * The sign-in screen's terms confirmation: one consented checkbox for `documents` (terms, plus
31
+ * billing/product/custom when configured), and a SEPARATE, non-consented disclosure line for
32
+ * `notices` (privacy, plus cookies per its own rule) — never nested inside the checkbox's label,
33
+ * because nothing is being agreed to there.
34
+ */
35
+ export const LoginTerms: FC<LoginTermsProps> = ({ model, translate, locale, className }) => {
36
+ const resolveLabel = loginTermsHelper.termsLabelResolver(translate, locale)
37
+
38
+ // Centred, like every other row in the card. The checkbox stays at the start of the sentence
39
+ // rather than above it, so `justify-center` centres the pair and `text-center` centres the
40
+ // wrapped lines within it.
41
+ return <div className={cn('flex flex-col items-center gap-1.5 text-center', className)}>
42
+ {/*
43
+ The ONLY place `data-login-terms` appears — an e2e suite in the consuming product treats it
44
+ as a strict (exactly-one-match) locator, so it must never be duplicated onto a second control.
45
+ */}
46
+ <label className="flex items-start justify-center gap-2 text-sm text-muted-foreground cursor-pointer">
47
+ {/*
48
+ A NATIVE checkbox, deliberately. `web-panel` ships no `checkbox` primitive, and requiring
49
+ every consumer to vendor one plus its Radix peer to render a sign-in screen would be a
50
+ breaking change for every application already on this package. A native control is also the
51
+ most accessible thing available here.
52
+ */}
53
+ <input
54
+ type="checkbox" data-login-terms
55
+ className="mt-0.5 size-4 shrink-0 accent-primary"
56
+ checked={model.accepted}
57
+ aria-invalid={model.attempted && !model.accepted}
58
+ onChange={event => model.accept(event.target.checked)}
59
+ />
60
+ <span>
61
+ {renderParts(loginTermsHelper.termsSentence(translate('login.terms.accept', 'I have read and agree to the {{documents}}.'), model, locale, resolveLabel))}
62
+ </span>
63
+ </label>
64
+
65
+ {model.revisedAt != null && <p data-login-revised className="text-xs text-muted-foreground">
66
+ {translate('login.terms.revised', 'Last updated: {{date}}').split('{{date}}').join(model.revisedAt)}
67
+ </p>}
68
+
69
+ <LoginPrivacyNotice model={model} translate={translate} locale={locale} />
70
+
71
+ {model.attempted && !model.accepted && <p role="alert" className="text-sm text-destructive">
72
+ {renderParts(loginTermsHelper.termsSentence(translate('login.terms.required', 'Please confirm the {{documents}} to continue.'), model, locale, resolveLabel))}
73
+ </p>}
74
+ </div>
75
+ }
@@ -0,0 +1,30 @@
1
+ import type { LoginScreenProps } from '@owlmeans/client-auth/login'
2
+ import type { ComponentType, ReactNode } from 'react'
3
+ import type { LoginCreditModel, LoginProviderModel, LoginTermsModel } from '@owlmeans/client-panel/auth'
4
+
5
+ export interface LoginScreenSetup extends Omit<LoginScreenProps, 'translate'> {
6
+ /** The one thing an application is expected to supply. */
7
+ Logo?: ComponentType<{ className?: string }> | ReactNode
8
+ }
9
+
10
+ export interface LoginCreditProps {
11
+ model: LoginCreditModel
12
+ translate: (key: string, defaultValue: string) => string
13
+ className?: string
14
+ }
15
+
16
+ export interface LoginTermsProps {
17
+ model: LoginTermsModel
18
+ translate: (key: string, defaultValue: string) => string
19
+ /** The current language, for `Intl.ListFormat`, document labels and explicit translated hrefs. */
20
+ locale?: string
21
+ className?: string
22
+ }
23
+
24
+ export type LoginPrivacyNoticeProps = LoginTermsProps
25
+
26
+ export interface LoginProviderNoteProps {
27
+ model: LoginProviderModel
28
+ translate: (key: string, defaultValue: string) => string
29
+ className?: string
30
+ }