@masmarino/gabarit 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/README.md +131 -85
  2. package/accordion/README.md +56 -0
  3. package/alert/README.md +87 -0
  4. package/app-shell/README.md +133 -0
  5. package/auth/README.md +155 -0
  6. package/auth-activate/README.md +119 -0
  7. package/auth-login/README.md +113 -0
  8. package/auth-register/README.md +104 -0
  9. package/auth-reset-password/README.md +120 -0
  10. package/autocomplete/README.md +77 -0
  11. package/avatar/README.md +34 -0
  12. package/avatar-group/README.md +47 -0
  13. package/badge/README.md +177 -0
  14. package/bar-chart/README.md +44 -0
  15. package/breadcrumb/README.md +38 -0
  16. package/button/README.md +175 -0
  17. package/card/README.md +179 -0
  18. package/checkbox/README.md +50 -0
  19. package/checkbox-group/README.md +78 -0
  20. package/confirm-danger-modal/README.md +77 -0
  21. package/copy-button/README.md +90 -0
  22. package/copy-field/README.md +54 -0
  23. package/date-picker/README.md +84 -0
  24. package/description-list/README.md +63 -0
  25. package/dimension-card/README.md +39 -0
  26. package/disclosure/README.md +48 -0
  27. package/divider/README.md +31 -0
  28. package/drawer/README.md +49 -0
  29. package/empty-state/README.md +84 -0
  30. package/fesm2022/masmarino-gabarit-accordion.mjs +243 -0
  31. package/fesm2022/masmarino-gabarit-accordion.mjs.map +1 -0
  32. package/fesm2022/masmarino-gabarit-alert.mjs +208 -0
  33. package/fesm2022/masmarino-gabarit-alert.mjs.map +1 -0
  34. package/fesm2022/masmarino-gabarit-app-shell.mjs +378 -0
  35. package/fesm2022/masmarino-gabarit-app-shell.mjs.map +1 -0
  36. package/fesm2022/masmarino-gabarit-auth-activate.mjs +415 -0
  37. package/fesm2022/masmarino-gabarit-auth-activate.mjs.map +1 -0
  38. package/fesm2022/masmarino-gabarit-auth-login.mjs +467 -0
  39. package/fesm2022/masmarino-gabarit-auth-login.mjs.map +1 -0
  40. package/fesm2022/masmarino-gabarit-auth-register.mjs +457 -0
  41. package/fesm2022/masmarino-gabarit-auth-register.mjs.map +1 -0
  42. package/fesm2022/masmarino-gabarit-auth-reset-password.mjs +364 -0
  43. package/fesm2022/masmarino-gabarit-auth-reset-password.mjs.map +1 -0
  44. package/fesm2022/masmarino-gabarit-auth.mjs +844 -0
  45. package/fesm2022/masmarino-gabarit-auth.mjs.map +1 -0
  46. package/fesm2022/masmarino-gabarit-autocomplete.mjs +475 -0
  47. package/fesm2022/masmarino-gabarit-autocomplete.mjs.map +1 -0
  48. package/fesm2022/masmarino-gabarit-avatar-group.mjs +202 -0
  49. package/fesm2022/masmarino-gabarit-avatar-group.mjs.map +1 -0
  50. package/fesm2022/masmarino-gabarit-avatar.mjs +107 -0
  51. package/fesm2022/masmarino-gabarit-avatar.mjs.map +1 -0
  52. package/fesm2022/masmarino-gabarit-badge.mjs +449 -0
  53. package/fesm2022/masmarino-gabarit-badge.mjs.map +1 -0
  54. package/fesm2022/masmarino-gabarit-bar-chart.mjs +408 -0
  55. package/fesm2022/masmarino-gabarit-bar-chart.mjs.map +1 -0
  56. package/fesm2022/masmarino-gabarit-breadcrumb.mjs +59 -0
  57. package/fesm2022/masmarino-gabarit-breadcrumb.mjs.map +1 -0
  58. package/fesm2022/masmarino-gabarit-button.mjs +374 -0
  59. package/fesm2022/masmarino-gabarit-button.mjs.map +1 -0
  60. package/fesm2022/masmarino-gabarit-card.mjs +400 -0
  61. package/fesm2022/masmarino-gabarit-card.mjs.map +1 -0
  62. package/fesm2022/masmarino-gabarit-chart.mjs +1289 -0
  63. package/fesm2022/masmarino-gabarit-chart.mjs.map +1 -0
  64. package/fesm2022/masmarino-gabarit-checkbox-group.mjs +335 -0
  65. package/fesm2022/masmarino-gabarit-checkbox-group.mjs.map +1 -0
  66. package/fesm2022/masmarino-gabarit-checkbox.mjs +170 -0
  67. package/fesm2022/masmarino-gabarit-checkbox.mjs.map +1 -0
  68. package/fesm2022/masmarino-gabarit-confirm-danger-modal.mjs +387 -0
  69. package/fesm2022/masmarino-gabarit-confirm-danger-modal.mjs.map +1 -0
  70. package/fesm2022/masmarino-gabarit-copy-button.mjs +407 -0
  71. package/fesm2022/masmarino-gabarit-copy-button.mjs.map +1 -0
  72. package/fesm2022/masmarino-gabarit-copy-field.mjs +229 -0
  73. package/fesm2022/masmarino-gabarit-copy-field.mjs.map +1 -0
  74. package/fesm2022/masmarino-gabarit-date-picker.mjs +1242 -0
  75. package/fesm2022/masmarino-gabarit-date-picker.mjs.map +1 -0
  76. package/fesm2022/masmarino-gabarit-description-list.mjs +127 -0
  77. package/fesm2022/masmarino-gabarit-description-list.mjs.map +1 -0
  78. package/fesm2022/masmarino-gabarit-dimension-card.mjs +162 -0
  79. package/fesm2022/masmarino-gabarit-dimension-card.mjs.map +1 -0
  80. package/fesm2022/masmarino-gabarit-disclosure.mjs +154 -0
  81. package/fesm2022/masmarino-gabarit-disclosure.mjs.map +1 -0
  82. package/fesm2022/masmarino-gabarit-divider.mjs +90 -0
  83. package/fesm2022/masmarino-gabarit-divider.mjs.map +1 -0
  84. package/fesm2022/masmarino-gabarit-docs.mjs +16 -2
  85. package/fesm2022/masmarino-gabarit-docs.mjs.map +1 -1
  86. package/fesm2022/masmarino-gabarit-drawer.mjs +209 -0
  87. package/fesm2022/masmarino-gabarit-drawer.mjs.map +1 -0
  88. package/fesm2022/masmarino-gabarit-empty-state.mjs +226 -0
  89. package/fesm2022/masmarino-gabarit-empty-state.mjs.map +1 -0
  90. package/fesm2022/masmarino-gabarit-file-upload.mjs +335 -0
  91. package/fesm2022/masmarino-gabarit-file-upload.mjs.map +1 -0
  92. package/fesm2022/masmarino-gabarit-floating-panel.mjs +24 -0
  93. package/fesm2022/masmarino-gabarit-floating-panel.mjs.map +1 -0
  94. package/fesm2022/masmarino-gabarit-format.mjs +345 -0
  95. package/fesm2022/masmarino-gabarit-format.mjs.map +1 -0
  96. package/fesm2022/masmarino-gabarit-funnel-chart.mjs +247 -0
  97. package/fesm2022/masmarino-gabarit-funnel-chart.mjs.map +1 -0
  98. package/fesm2022/masmarino-gabarit-gauge-bar.mjs +180 -0
  99. package/fesm2022/masmarino-gabarit-gauge-bar.mjs.map +1 -0
  100. package/fesm2022/masmarino-gabarit-git-field.mjs +127 -0
  101. package/fesm2022/masmarino-gabarit-git-field.mjs.map +1 -0
  102. package/fesm2022/masmarino-gabarit-icon-marker.mjs +150 -0
  103. package/fesm2022/masmarino-gabarit-icon-marker.mjs.map +1 -0
  104. package/fesm2022/masmarino-gabarit-icon.mjs +308 -0
  105. package/fesm2022/masmarino-gabarit-icon.mjs.map +1 -0
  106. package/fesm2022/masmarino-gabarit-input.mjs +493 -0
  107. package/fesm2022/masmarino-gabarit-input.mjs.map +1 -0
  108. package/fesm2022/masmarino-gabarit-job-graph.mjs +216 -0
  109. package/fesm2022/masmarino-gabarit-job-graph.mjs.map +1 -0
  110. package/fesm2022/masmarino-gabarit-job-status.mjs +104 -0
  111. package/fesm2022/masmarino-gabarit-job-status.mjs.map +1 -0
  112. package/fesm2022/masmarino-gabarit-line-chart.mjs +574 -0
  113. package/fesm2022/masmarino-gabarit-line-chart.mjs.map +1 -0
  114. package/fesm2022/masmarino-gabarit-list-card.mjs +320 -0
  115. package/fesm2022/masmarino-gabarit-list-card.mjs.map +1 -0
  116. package/fesm2022/masmarino-gabarit-list-row.mjs +58 -0
  117. package/fesm2022/masmarino-gabarit-list-row.mjs.map +1 -0
  118. package/fesm2022/masmarino-gabarit-list-toolbar.mjs +369 -0
  119. package/fesm2022/masmarino-gabarit-list-toolbar.mjs.map +1 -0
  120. package/fesm2022/masmarino-gabarit-menu.mjs +464 -0
  121. package/fesm2022/masmarino-gabarit-menu.mjs.map +1 -0
  122. package/fesm2022/masmarino-gabarit-mfa-enrollment.mjs +897 -0
  123. package/fesm2022/masmarino-gabarit-mfa-enrollment.mjs.map +1 -0
  124. package/fesm2022/masmarino-gabarit-mfa-settings.mjs +629 -0
  125. package/fesm2022/masmarino-gabarit-mfa-settings.mjs.map +1 -0
  126. package/fesm2022/masmarino-gabarit-modal.mjs +260 -0
  127. package/fesm2022/masmarino-gabarit-modal.mjs.map +1 -0
  128. package/fesm2022/masmarino-gabarit-nav-tabs.mjs +332 -0
  129. package/fesm2022/masmarino-gabarit-nav-tabs.mjs.map +1 -0
  130. package/fesm2022/masmarino-gabarit-notification-dot.mjs +119 -0
  131. package/fesm2022/masmarino-gabarit-notification-dot.mjs.map +1 -0
  132. package/fesm2022/masmarino-gabarit-page-header.mjs +78 -0
  133. package/fesm2022/masmarino-gabarit-page-header.mjs.map +1 -0
  134. package/fesm2022/masmarino-gabarit-page-layout.mjs +157 -0
  135. package/fesm2022/masmarino-gabarit-page-layout.mjs.map +1 -0
  136. package/fesm2022/masmarino-gabarit-pagination.mjs +415 -0
  137. package/fesm2022/masmarino-gabarit-pagination.mjs.map +1 -0
  138. package/fesm2022/masmarino-gabarit-panel.mjs +80 -0
  139. package/fesm2022/masmarino-gabarit-panel.mjs.map +1 -0
  140. package/fesm2022/masmarino-gabarit-passkey-settings.mjs +606 -0
  141. package/fesm2022/masmarino-gabarit-passkey-settings.mjs.map +1 -0
  142. package/fesm2022/masmarino-gabarit-pie-chart.mjs +317 -0
  143. package/fesm2022/masmarino-gabarit-pie-chart.mjs.map +1 -0
  144. package/fesm2022/masmarino-gabarit-popover.mjs +142 -0
  145. package/fesm2022/masmarino-gabarit-popover.mjs.map +1 -0
  146. package/fesm2022/masmarino-gabarit-radio-group.mjs +202 -0
  147. package/fesm2022/masmarino-gabarit-radio-group.mjs.map +1 -0
  148. package/fesm2022/masmarino-gabarit-save-status.mjs +142 -0
  149. package/fesm2022/masmarino-gabarit-save-status.mjs.map +1 -0
  150. package/fesm2022/masmarino-gabarit-search-bar.mjs +576 -0
  151. package/fesm2022/masmarino-gabarit-search-bar.mjs.map +1 -0
  152. package/fesm2022/masmarino-gabarit-secret-reveal.mjs +348 -0
  153. package/fesm2022/masmarino-gabarit-secret-reveal.mjs.map +1 -0
  154. package/fesm2022/masmarino-gabarit-segmented-control.mjs +272 -0
  155. package/fesm2022/masmarino-gabarit-segmented-control.mjs.map +1 -0
  156. package/fesm2022/masmarino-gabarit-select.mjs +512 -0
  157. package/fesm2022/masmarino-gabarit-select.mjs.map +1 -0
  158. package/fesm2022/masmarino-gabarit-skeleton-list.mjs +189 -0
  159. package/fesm2022/masmarino-gabarit-skeleton-list.mjs.map +1 -0
  160. package/fesm2022/masmarino-gabarit-skeleton.mjs +109 -0
  161. package/fesm2022/masmarino-gabarit-skeleton.mjs.map +1 -0
  162. package/fesm2022/masmarino-gabarit-slider.mjs +239 -0
  163. package/fesm2022/masmarino-gabarit-slider.mjs.map +1 -0
  164. package/fesm2022/masmarino-gabarit-sparkline.mjs +276 -0
  165. package/fesm2022/masmarino-gabarit-sparkline.mjs.map +1 -0
  166. package/fesm2022/masmarino-gabarit-spinner.mjs +86 -0
  167. package/fesm2022/masmarino-gabarit-spinner.mjs.map +1 -0
  168. package/fesm2022/masmarino-gabarit-stat-grid.mjs +139 -0
  169. package/fesm2022/masmarino-gabarit-stat-grid.mjs.map +1 -0
  170. package/fesm2022/masmarino-gabarit-stat-tile.mjs +312 -0
  171. package/fesm2022/masmarino-gabarit-stat-tile.mjs.map +1 -0
  172. package/fesm2022/masmarino-gabarit-stepper.mjs +219 -0
  173. package/fesm2022/masmarino-gabarit-stepper.mjs.map +1 -0
  174. package/fesm2022/masmarino-gabarit-switch.mjs +151 -0
  175. package/fesm2022/masmarino-gabarit-switch.mjs.map +1 -0
  176. package/fesm2022/masmarino-gabarit-table.mjs +206 -0
  177. package/fesm2022/masmarino-gabarit-table.mjs.map +1 -0
  178. package/fesm2022/masmarino-gabarit-tabs.mjs +210 -0
  179. package/fesm2022/masmarino-gabarit-tabs.mjs.map +1 -0
  180. package/fesm2022/masmarino-gabarit-tag-input.mjs +288 -0
  181. package/fesm2022/masmarino-gabarit-tag-input.mjs.map +1 -0
  182. package/fesm2022/masmarino-gabarit-tag.mjs +155 -0
  183. package/fesm2022/masmarino-gabarit-tag.mjs.map +1 -0
  184. package/fesm2022/masmarino-gabarit-textarea.mjs +369 -0
  185. package/fesm2022/masmarino-gabarit-textarea.mjs.map +1 -0
  186. package/fesm2022/masmarino-gabarit-timeline-chart.mjs +521 -0
  187. package/fesm2022/masmarino-gabarit-timeline-chart.mjs.map +1 -0
  188. package/fesm2022/masmarino-gabarit-toaster.mjs +220 -0
  189. package/fesm2022/masmarino-gabarit-toaster.mjs.map +1 -0
  190. package/fesm2022/masmarino-gabarit-tooltip.mjs +185 -0
  191. package/fesm2022/masmarino-gabarit-tooltip.mjs.map +1 -0
  192. package/fesm2022/masmarino-gabarit-tree.mjs +258 -0
  193. package/fesm2022/masmarino-gabarit-tree.mjs.map +1 -0
  194. package/fesm2022/masmarino-gabarit-user-chip.mjs +106 -0
  195. package/fesm2022/masmarino-gabarit-user-chip.mjs.map +1 -0
  196. package/fesm2022/masmarino-gabarit.mjs +83 -24785
  197. package/fesm2022/masmarino-gabarit.mjs.map +1 -1
  198. package/file-upload/README.md +47 -0
  199. package/funnel-chart/README.md +39 -0
  200. package/gauge-bar/README.md +35 -0
  201. package/git-field/README.md +34 -0
  202. package/icon/README.md +52 -0
  203. package/icon-marker/README.md +37 -0
  204. package/input/README.md +120 -0
  205. package/job-graph/README.md +76 -0
  206. package/job-status/README.md +34 -0
  207. package/line-chart/README.md +52 -0
  208. package/list-card/README.md +144 -0
  209. package/list-row/README.md +72 -0
  210. package/list-toolbar/README.md +52 -0
  211. package/menu/README.md +90 -0
  212. package/mfa-enrollment/README.md +189 -0
  213. package/mfa-settings/README.md +154 -0
  214. package/modal/README.md +72 -0
  215. package/nav-tabs/README.md +106 -0
  216. package/notification-dot/README.md +43 -0
  217. package/package.json +329 -1
  218. package/page-header/README.md +56 -0
  219. package/page-layout/README.md +76 -0
  220. package/pagination/README.md +73 -0
  221. package/panel/README.md +56 -0
  222. package/passkey-settings/README.md +120 -0
  223. package/pie-chart/README.md +85 -0
  224. package/popover/README.md +62 -0
  225. package/radio-group/README.md +47 -0
  226. package/save-status/README.md +44 -0
  227. package/search-bar/README.md +84 -0
  228. package/secret-reveal/README.md +60 -0
  229. package/segmented-control/README.md +79 -0
  230. package/select/README.md +61 -0
  231. package/skeleton/README.md +49 -0
  232. package/skeleton-list/README.md +40 -0
  233. package/slider/README.md +44 -0
  234. package/sparkline/README.md +37 -0
  235. package/spinner/README.md +41 -0
  236. package/stat-grid/README.md +47 -0
  237. package/stat-tile/README.md +75 -0
  238. package/stepper/README.md +67 -0
  239. package/switch/README.md +51 -0
  240. package/table/README.md +75 -0
  241. package/tabs/README.md +34 -0
  242. package/tag/README.md +34 -0
  243. package/tag-input/README.md +45 -0
  244. package/textarea/README.md +76 -0
  245. package/timeline-chart/README.md +49 -0
  246. package/toaster/README.md +92 -0
  247. package/tooltip/README.md +50 -0
  248. package/tree/README.md +79 -0
  249. package/types/masmarino-gabarit-accordion.d.ts +54 -0
  250. package/types/masmarino-gabarit-alert.d.ts +65 -0
  251. package/types/masmarino-gabarit-app-shell.d.ts +102 -0
  252. package/types/masmarino-gabarit-auth-activate.d.ts +70 -0
  253. package/types/masmarino-gabarit-auth-login.d.ts +63 -0
  254. package/types/masmarino-gabarit-auth-register.d.ts +66 -0
  255. package/types/masmarino-gabarit-auth-reset-password.d.ts +53 -0
  256. package/types/masmarino-gabarit-auth.d.ts +543 -0
  257. package/types/masmarino-gabarit-autocomplete.d.ts +140 -0
  258. package/types/masmarino-gabarit-avatar-group.d.ts +60 -0
  259. package/types/masmarino-gabarit-avatar.d.ts +31 -0
  260. package/types/masmarino-gabarit-badge.d.ts +139 -0
  261. package/types/masmarino-gabarit-bar-chart.d.ts +111 -0
  262. package/types/masmarino-gabarit-breadcrumb.d.ts +12 -0
  263. package/types/masmarino-gabarit-button.d.ts +108 -0
  264. package/types/masmarino-gabarit-card.d.ts +102 -0
  265. package/types/masmarino-gabarit-chart.d.ts +361 -0
  266. package/types/masmarino-gabarit-checkbox-group.d.ts +113 -0
  267. package/types/masmarino-gabarit-checkbox.d.ts +49 -0
  268. package/types/masmarino-gabarit-confirm-danger-modal.d.ts +94 -0
  269. package/types/masmarino-gabarit-copy-button.d.ts +111 -0
  270. package/types/masmarino-gabarit-copy-field.d.ts +64 -0
  271. package/types/masmarino-gabarit-date-picker.d.ts +399 -0
  272. package/types/masmarino-gabarit-description-list.d.ts +40 -0
  273. package/types/masmarino-gabarit-dimension-card.d.ts +55 -0
  274. package/types/masmarino-gabarit-disclosure.d.ts +44 -0
  275. package/types/masmarino-gabarit-divider.d.ts +20 -0
  276. package/types/masmarino-gabarit-docs.d.ts +2 -1
  277. package/types/masmarino-gabarit-drawer.d.ts +51 -0
  278. package/types/masmarino-gabarit-empty-state.d.ts +67 -0
  279. package/types/masmarino-gabarit-file-upload.d.ts +95 -0
  280. package/types/masmarino-gabarit-floating-panel.d.ts +14 -0
  281. package/types/masmarino-gabarit-format.d.ts +54 -0
  282. package/types/masmarino-gabarit-funnel-chart.d.ts +78 -0
  283. package/types/masmarino-gabarit-gauge-bar.d.ts +54 -0
  284. package/types/masmarino-gabarit-git-field.d.ts +39 -0
  285. package/types/masmarino-gabarit-icon-marker.d.ts +47 -0
  286. package/types/masmarino-gabarit-icon.d.ts +23 -0
  287. package/types/masmarino-gabarit-input.d.ts +181 -0
  288. package/types/masmarino-gabarit-job-graph.d.ts +63 -0
  289. package/types/masmarino-gabarit-job-status.d.ts +20 -0
  290. package/types/masmarino-gabarit-line-chart.d.ts +153 -0
  291. package/types/masmarino-gabarit-list-card.d.ts +87 -0
  292. package/types/masmarino-gabarit-list-row.d.ts +14 -0
  293. package/types/masmarino-gabarit-list-toolbar.d.ts +100 -0
  294. package/types/masmarino-gabarit-menu.d.ts +93 -0
  295. package/types/masmarino-gabarit-mfa-enrollment.d.ts +142 -0
  296. package/types/masmarino-gabarit-mfa-settings.d.ts +89 -0
  297. package/types/masmarino-gabarit-modal.d.ts +60 -0
  298. package/types/masmarino-gabarit-nav-tabs.d.ts +65 -0
  299. package/types/masmarino-gabarit-notification-dot.d.ts +34 -0
  300. package/types/masmarino-gabarit-page-header.d.ts +20 -0
  301. package/types/masmarino-gabarit-page-layout.d.ts +46 -0
  302. package/types/masmarino-gabarit-pagination.d.ts +109 -0
  303. package/types/masmarino-gabarit-panel.d.ts +21 -0
  304. package/types/masmarino-gabarit-passkey-settings.d.ts +94 -0
  305. package/types/masmarino-gabarit-pie-chart.d.ts +94 -0
  306. package/types/masmarino-gabarit-popover.d.ts +33 -0
  307. package/types/masmarino-gabarit-radio-group.d.ts +66 -0
  308. package/types/masmarino-gabarit-save-status.d.ts +39 -0
  309. package/types/masmarino-gabarit-search-bar.d.ts +183 -0
  310. package/types/masmarino-gabarit-secret-reveal.d.ts +95 -0
  311. package/types/masmarino-gabarit-segmented-control.d.ts +76 -0
  312. package/types/masmarino-gabarit-select.d.ts +146 -0
  313. package/types/masmarino-gabarit-skeleton-list.d.ts +54 -0
  314. package/types/masmarino-gabarit-skeleton.d.ts +26 -0
  315. package/types/masmarino-gabarit-slider.d.ts +73 -0
  316. package/types/masmarino-gabarit-sparkline.d.ts +70 -0
  317. package/types/masmarino-gabarit-spinner.d.ts +20 -0
  318. package/types/masmarino-gabarit-stat-grid.d.ts +39 -0
  319. package/types/masmarino-gabarit-stat-tile.d.ts +79 -0
  320. package/types/masmarino-gabarit-stepper.d.ts +67 -0
  321. package/types/masmarino-gabarit-switch.d.ts +42 -0
  322. package/types/masmarino-gabarit-table.d.ts +60 -0
  323. package/types/masmarino-gabarit-tabs.d.ts +40 -0
  324. package/types/masmarino-gabarit-tag-input.d.ts +78 -0
  325. package/types/masmarino-gabarit-tag.d.ts +35 -0
  326. package/types/masmarino-gabarit-textarea.d.ts +109 -0
  327. package/types/masmarino-gabarit-timeline-chart.d.ts +145 -0
  328. package/types/masmarino-gabarit-toaster.d.ts +62 -0
  329. package/types/masmarino-gabarit-tooltip.d.ts +39 -0
  330. package/types/masmarino-gabarit-tree.d.ts +71 -0
  331. package/types/masmarino-gabarit-user-chip.d.ts +26 -0
  332. package/types/masmarino-gabarit.d.ts +83 -6599
  333. package/user-chip/README.md +42 -0
@@ -0,0 +1,467 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Injector, computed, contentChild, inject, input, output, signal } from "@angular/core";
3
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
4
+ import * as i1 from "@angular/forms";
5
+ import { FormsModule } from "@angular/forms";
6
+ import { EMPTY, from, switchMap } from "rxjs";
7
+ import { Button } from "@masmarino/gabarit/button";
8
+ import { Divider } from "@masmarino/gabarit/divider";
9
+ import { GbtInput } from "@masmarino/gabarit/input";
10
+ import { Alert } from "@masmarino/gabarit/alert";
11
+ import { AUTH_PORT, AuthFooter, AuthFooterLink, AuthPanel, DEFAULT_LOGIN_LABELS, authLabels, classifyMfaFailure, classifyPasskeyError, focusAfterRender, getPasskeyAssertion, isAuthPortError, passkeysSupported } from "@masmarino/gabarit/auth";
12
+ import { MfaEnrollment } from "@masmarino/gabarit/mfa-enrollment";
13
+ let nextId = 0;
14
+ var AuthLogin = class AuthLogin {
15
+ auth = inject(AUTH_PORT);
16
+ host = inject(ElementRef);
17
+ injector = inject(Injector);
18
+ labels = input({}, ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
19
+ loggedIn = output();
20
+ text = authLabels("login", DEFAULT_LOGIN_LABELS, this.labels);
21
+ registerLink = contentChild(AuthFooterLink, ...ngDevMode ? [{ debugName: "registerLink" }] : /* istanbul ignore next */ []);
22
+ id = `gbt-login-${nextId++}`;
23
+ username = signal("", ...ngDevMode ? [{ debugName: "username" }] : /* istanbul ignore next */ []);
24
+ password = signal("", ...ngDevMode ? [{ debugName: "password" }] : /* istanbul ignore next */ []);
25
+ error = signal("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
26
+ submitting = signal(false, ...ngDevMode ? [{ debugName: "submitting" }] : /* istanbul ignore next */ []);
27
+ mfaToken = signal(null, ...ngDevMode ? [{ debugName: "mfaToken" }] : /* istanbul ignore next */ []);
28
+ mfaSetupRequired = signal(false, ...ngDevMode ? [{ debugName: "mfaSetupRequired" }] : /* istanbul ignore next */ []);
29
+ mfaHasTotp = signal(false, ...ngDevMode ? [{ debugName: "mfaHasTotp" }] : /* istanbul ignore next */ []);
30
+ mfaHasPasskey = signal(false, ...ngDevMode ? [{ debugName: "mfaHasPasskey" }] : /* istanbul ignore next */ []);
31
+ useBackupCode = signal(false, ...ngDevMode ? [{ debugName: "useBackupCode" }] : /* istanbul ignore next */ []);
32
+ code = signal("", ...ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []);
33
+ backupCode = signal("", ...ngDevMode ? [{ debugName: "backupCode" }] : /* istanbul ignore next */ []);
34
+ registrationEnabled = signal(false, ...ngDevMode ? [{ debugName: "registrationEnabled" }] : /* istanbul ignore next */ []);
35
+ passkeysAvailable = signal(null, ...ngDevMode ? [{ debugName: "passkeysAvailable" }] : /* istanbul ignore next */ []);
36
+ browserHasPasskeys = signal(false, ...ngDevMode ? [{ debugName: "browserHasPasskeys" }] : /* istanbul ignore next */ []);
37
+ passkeyInFlight = signal(false, ...ngDevMode ? [{ debugName: "passkeyInFlight" }] : /* istanbul ignore next */ []);
38
+ ceremony = 0;
39
+ errorVariant = signal("error", ...ngDevMode ? [{ debugName: "errorVariant" }] : /* istanbul ignore next */ []);
40
+ enrolling = computed(() => this.mfaToken() !== null && this.mfaSetupRequired(), ...ngDevMode ? [{ debugName: "enrolling" }] : /* istanbul ignore next */ []);
41
+ challenging = computed(() => this.mfaToken() !== null && !this.mfaSetupRequired(), ...ngDevMode ? [{ debugName: "challenging" }] : /* istanbul ignore next */ []);
42
+ canUsePasskey = computed(() => this.mfaHasPasskey() && this.browserHasPasskeys() && this.passkeysAvailable() !== false, ...ngDevMode ? [{ debugName: "canUsePasskey" }] : /* istanbul ignore next */ []);
43
+ hasTotp = computed(() => this.mfaHasTotp() || !this.mfaHasPasskey(), ...ngDevMode ? [{ debugName: "hasTotp" }] : /* istanbul ignore next */ []);
44
+ passkeyBlocked = computed(() => this.challenging() && this.mfaHasPasskey() && !this.hasTotp() && !this.canUsePasskey(), ...ngDevMode ? [{ debugName: "passkeyBlocked" }] : /* istanbul ignore next */ []);
45
+ showBackupCode = computed(() => this.useBackupCode() || this.passkeyBlocked(), ...ngDevMode ? [{ debugName: "showBackupCode" }] : /* istanbul ignore next */ []);
46
+ blockedReason = computed(() => this.browserHasPasskeys() ? this.text().blockedByServer : this.text().blockedByBrowser, ...ngDevMode ? [{ debugName: "blockedReason" }] : /* istanbul ignore next */ []);
47
+ backFromBackupLabel = computed(() => {
48
+ const text = this.text();
49
+ if (this.canUsePasskey()) return this.hasTotp() ? text.backToPasskeyOrApp : text.backToPasskey;
50
+ return text.backToApp;
51
+ }, ...ngDevMode ? [{ debugName: "backFromBackupLabel" }] : /* istanbul ignore next */ []);
52
+ heading = computed(() => {
53
+ if (this.enrolling()) return this.text().enrollmentHeading;
54
+ return this.challenging() ? this.text().challengeHeading : this.text().heading;
55
+ }, ...ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []);
56
+ intro = computed(() => {
57
+ const text = this.text();
58
+ if (this.enrolling()) return "";
59
+ if (!this.challenging()) return text.intro;
60
+ if (this.showBackupCode()) return text.introBackupCode;
61
+ if (this.canUsePasskey()) return this.hasTotp() ? text.introPasskeyOrCode : text.introPasskey;
62
+ return text.introCode;
63
+ }, ...ngDevMode ? [{ debugName: "intro" }] : /* istanbul ignore next */ []);
64
+ constructor() {
65
+ this.focusField("username");
66
+ this.auth.authConfig().pipe(takeUntilDestroyed()).subscribe({
67
+ next: (config) => {
68
+ this.registrationEnabled.set(config.registrationEnabled === true);
69
+ this.passkeysAvailable.set(config.passkeysAvailable === true);
70
+ },
71
+ error: () => this.registrationEnabled.set(false)
72
+ });
73
+ }
74
+ submit() {
75
+ if (this.submitting()) return;
76
+ this.error.set("");
77
+ this.submitting.set(true);
78
+ this.auth.login(this.username(), this.password()).subscribe({
79
+ next: (res) => {
80
+ this.password.set("");
81
+ this.submitting.set(false);
82
+ if (res.token) this.loggedIn.emit();
83
+ else if (res.mfaToken) {
84
+ this.mfaSetupRequired.set(res.mfaSetupRequired === true);
85
+ this.mfaHasTotp.set(res.mfaHasTotp === true);
86
+ this.mfaHasPasskey.set(res.mfaHasPasskey === true);
87
+ this.browserHasPasskeys.set(passkeysSupported());
88
+ this.mfaToken.set(res.mfaToken);
89
+ if (!this.mfaSetupRequired()) this.focusField(this.firstChallengeTarget());
90
+ } else this.fail(this.text().loginFailed, "password");
91
+ },
92
+ error: (err) => {
93
+ this.submitting.set(false);
94
+ this.fail(this.loginFailureMessage(err), "password");
95
+ }
96
+ });
97
+ }
98
+ loginFailureMessage(err) {
99
+ const status = isAuthPortError(err) ? err.status : null;
100
+ if (status === 401) return this.text().wrongCredentials;
101
+ if (status === 429) return this.text().tooManyAttempts;
102
+ return this.text().loginFailed;
103
+ }
104
+ verify() {
105
+ if (this.submitting()) return;
106
+ const mfaToken = this.mfaToken();
107
+ const backup = this.showBackupCode();
108
+ const value = (backup ? this.backupCode() : this.code()).replace(/\s+/g, "");
109
+ const field = backup ? "mfa-backup-code" : "mfa-code";
110
+ if (mfaToken === null) return;
111
+ if (value === "") {
112
+ this.fail(backup ? this.text().enterBackupCode : this.text().enterCode, field);
113
+ return;
114
+ }
115
+ this.error.set("");
116
+ this.submitting.set(true);
117
+ const proof = backup ? { backupCode: value } : { code: value };
118
+ this.auth.verifyMfa(mfaToken, proof).subscribe({
119
+ next: () => {
120
+ this.submitting.set(false);
121
+ this.resetMfa();
122
+ this.loggedIn.emit();
123
+ },
124
+ error: (err) => {
125
+ this.submitting.set(false);
126
+ const failure = classifyMfaFailure(err);
127
+ if (failure === "expired") {
128
+ this.sessionExpired();
129
+ return;
130
+ }
131
+ if (failure === "wrong-code") {
132
+ this.code.set("");
133
+ this.backupCode.set("");
134
+ }
135
+ const text = this.text();
136
+ this.fail(failure === "rate-limited" ? text.tooManyAttempts : failure === "wrong-code" ? text.wrongCode : text.verifyFailed, field);
137
+ }
138
+ });
139
+ }
140
+ usePasskey() {
141
+ const mfaToken = this.mfaToken();
142
+ if (this.submitting() || mfaToken === null) return;
143
+ this.error.set("");
144
+ this.submitting.set(true);
145
+ this.passkeyInFlight.set(true);
146
+ const run = ++this.ceremony;
147
+ this.auth.startPasskeyChallenge(mfaToken).pipe(switchMap(({ challengeId, publicKey }) => run !== this.ceremony ? EMPTY : from(getPasskeyAssertion(publicKey)).pipe(switchMap((credential) => run === this.ceremony ? this.auth.finishPasskeyChallenge(mfaToken, challengeId, credential) : EMPTY)))).subscribe({
148
+ next: () => {
149
+ this.submitting.set(false);
150
+ this.passkeyInFlight.set(false);
151
+ this.resetMfa();
152
+ this.loggedIn.emit();
153
+ },
154
+ error: (err) => {
155
+ if (run !== this.ceremony) return;
156
+ this.submitting.set(false);
157
+ this.passkeyInFlight.set(false);
158
+ this.passkeyFailed(err);
159
+ }
160
+ });
161
+ }
162
+ passkeyFailed(err) {
163
+ const text = this.text();
164
+ if (!isAuthPortError(err)) switch (classifyPasskeyError(err)) {
165
+ case "cancelled":
166
+ this.fail(text.cancelled, "mfa-passkey", "info");
167
+ return;
168
+ case "unsupported":
169
+ this.fail(text.browserUnsupported, "mfa-passkey");
170
+ return;
171
+ default:
172
+ this.fail(text.verifyFailed, "mfa-passkey");
173
+ return;
174
+ }
175
+ switch (classifyMfaFailure(err)) {
176
+ case "expired":
177
+ this.sessionExpired();
178
+ return;
179
+ case "wrong-code":
180
+ this.fail(text.passkeyRefused, "mfa-passkey");
181
+ return;
182
+ case "rate-limited":
183
+ this.fail(text.tooManyAttempts, "mfa-passkey");
184
+ return;
185
+ case "unavailable":
186
+ this.fail(text.passkeysUnavailable, "mfa-passkey");
187
+ return;
188
+ default: this.fail(text.verifyFailed, "mfa-passkey");
189
+ }
190
+ }
191
+ toggleBackupCode() {
192
+ this.error.set("");
193
+ this.useBackupCode.update((backup) => !backup);
194
+ this.focusField(this.useBackupCode() ? "mfa-backup-code" : this.firstChallengeTarget());
195
+ }
196
+ firstChallengeTarget() {
197
+ if (this.showBackupCode()) return "mfa-backup-code";
198
+ return this.canUsePasskey() ? "mfa-passkey" : "mfa-code";
199
+ }
200
+ backToCredentials() {
201
+ this.resetMfa();
202
+ this.error.set("");
203
+ this.focusField("password");
204
+ }
205
+ sessionExpired() {
206
+ this.resetMfa();
207
+ this.fail(this.text().loginExpired, "password");
208
+ }
209
+ enrolled(token) {
210
+ this.auth.setToken(token);
211
+ this.resetMfa();
212
+ this.loggedIn.emit();
213
+ }
214
+ resetMfa() {
215
+ this.ceremony++;
216
+ this.submitting.set(false);
217
+ this.passkeyInFlight.set(false);
218
+ this.mfaToken.set(null);
219
+ this.mfaSetupRequired.set(false);
220
+ this.mfaHasTotp.set(false);
221
+ this.mfaHasPasskey.set(false);
222
+ this.useBackupCode.set(false);
223
+ this.code.set("");
224
+ this.backupCode.set("");
225
+ }
226
+ fail(message, focusSuffix, variant = "error") {
227
+ this.errorVariant.set(variant);
228
+ this.error.set(message);
229
+ this.focusField(focusSuffix);
230
+ }
231
+ focusField(suffix) {
232
+ focusAfterRender(this.host, this.injector, `#${this.id}-${suffix}`, { nestedFallback: "button" });
233
+ }
234
+ static ɵfac = i0.ɵɵngDeclareFactory({
235
+ minVersion: "12.0.0",
236
+ version: "22.2.0",
237
+ ngImport: i0,
238
+ type: AuthLogin,
239
+ deps: [],
240
+ target: i0.ɵɵFactoryTarget.Component
241
+ });
242
+ static ɵcmp = i0.ɵɵngDeclareComponent({
243
+ minVersion: "17.0.0",
244
+ version: "22.2.0",
245
+ type: AuthLogin,
246
+ isStandalone: true,
247
+ selector: "gbt-auth-login",
248
+ inputs: { labels: {
249
+ classPropertyName: "labels",
250
+ publicName: "labels",
251
+ isSignal: true,
252
+ isRequired: false,
253
+ transformFunction: null
254
+ } },
255
+ outputs: { loggedIn: "loggedIn" },
256
+ queries: [{
257
+ propertyName: "registerLink",
258
+ first: true,
259
+ predicate: AuthFooterLink,
260
+ descendants: true,
261
+ isSignal: true
262
+ }],
263
+ ngImport: i0,
264
+ template: "<gbt-auth-panel [heading]=\"heading()\" [intro]=\"intro()\" [wide]=\"enrolling()\">\n <ng-container ngProjectAs=\"[auth-backdrop]\"><ng-content select=\"[auth-backdrop]\" /></ng-container>\n <ng-container ngProjectAs=\"[auth-logo]\"><ng-content select=\"[auth-logo]\" /></ng-container>\n\n @if (mfaToken() === null) {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"submit()\">\n <ng-content select=\"[auth-notice]\" />\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-username'\"\n name=\"username\"\n autocomplete=\"username\"\n [label]=\"text().username\"\n [ngModel]=\"username()\"\n (ngModelChange)=\"username.set($event)\"\n />\n <gbt-input\n [id]=\"id + '-password'\"\n type=\"password\"\n name=\"password\"\n autocomplete=\"current-password\"\n [label]=\"text().password\"\n [showPasswordLabel]=\"text().showPassword\"\n [hidePasswordLabel]=\"text().hidePassword\"\n [ngModel]=\"password()\"\n (ngModelChange)=\"password.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().submit\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().submitting\"\n />\n </form>\n\n @if (registrationEnabled() && registerLink()) {\n <gbt-auth-footer [text]=\"text().registerPrompt\"\n ><ng-content select=\"[gbtAuthFooterLink]\"\n /></gbt-auth-footer>\n }\n } @else if (enrolling()) {\n <gbt-mfa-enrollment\n [mfaToken]=\"mfaToken()!\"\n [passkeysAvailable]=\"passkeysAvailable() === true\"\n (completed)=\"enrolled($event)\"\n (cancelled)=\"backToCredentials()\"\n (expired)=\"sessionExpired()\"\n />\n } @else {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"verify()\">\n @if (passkeyBlocked()) {\n <gbt-alert variant=\"warning\" appearance=\"subtle\" iconAlign=\"start\" live=\"off\">{{\n blockedReason()\n }}</gbt-alert>\n }\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n @if (passkeyInFlight()) {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"polite\">{{\n text().passkeyPrompt\n }}</gbt-alert>\n }\n\n @if (showBackupCode()) {\n <gbt-input\n [id]=\"id + '-mfa-backup-code'\"\n inputmode=\"text\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"backupCode\"\n autocomplete=\"off\"\n [label]=\"text().backupCodeLabel\"\n [ngModel]=\"backupCode()\"\n (ngModelChange)=\"backupCode.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().verifying\"\n />\n } @else {\n @if (canUsePasskey()) {\n <gbt-button\n [attr.id]=\"id + '-mfa-passkey'\"\n class=\"gbt-auth-panel__submit\"\n block\n size=\"large\"\n iconName=\"key\"\n [text]=\"text().usePasskey\"\n [loading]=\"passkeyInFlight()\"\n [disabled]=\"submitting() && !passkeyInFlight()\"\n [loadingLabel]=\"text().passkeyValidating\"\n (clicked)=\"usePasskey()\"\n />\n }\n\n @if (canUsePasskey() && hasTotp()) {\n <gbt-divider [label]=\"text().or\" />\n }\n\n @if (hasTotp()) {\n <gbt-input\n [id]=\"id + '-mfa-code'\"\n inputmode=\"numeric\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"code\"\n autocomplete=\"one-time-code\"\n [label]=\"text().codeLabel\"\n [ngModel]=\"code()\"\n (ngModelChange)=\"code.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [variant]=\"canUsePasskey() ? 'secondary' : 'primary'\"\n [loading]=\"submitting() && !passkeyInFlight()\"\n [disabled]=\"passkeyInFlight()\"\n [loadingLabel]=\"text().verifying\"\n />\n }\n }\n\n <div class=\"gbt-auth-panel__links\">\n @if (!passkeyBlocked()) {\n <gbt-button\n variant=\"link\"\n [text]=\"showBackupCode() ? backFromBackupLabel() : text().useBackupCode\"\n (clicked)=\"toggleBackupCode()\"\n />\n }\n <gbt-button variant=\"link\" [text]=\"text().back\" (clicked)=\"backToCredentials()\" />\n </div>\n </form>\n }\n</gbt-auth-panel>\n",
265
+ dependencies: [
266
+ {
267
+ kind: "ngmodule",
268
+ type: FormsModule
269
+ },
270
+ {
271
+ kind: "directive",
272
+ type: i1.ɵNgNoValidate,
273
+ selector: "form:not([ngNoForm]):not([ngNativeValidate])"
274
+ },
275
+ {
276
+ kind: "directive",
277
+ type: i1.NgControlStatus,
278
+ selector: "[formControlName],[ngModel],[formControl]"
279
+ },
280
+ {
281
+ kind: "directive",
282
+ type: i1.NgControlStatusGroup,
283
+ selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"
284
+ },
285
+ {
286
+ kind: "directive",
287
+ type: i1.NgModel,
288
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
289
+ inputs: [
290
+ "name",
291
+ "disabled",
292
+ "ngModel",
293
+ "ngModelOptions"
294
+ ],
295
+ outputs: ["ngModelChange"],
296
+ exportAs: ["ngModel"]
297
+ },
298
+ {
299
+ kind: "directive",
300
+ type: i1.NgForm,
301
+ selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]",
302
+ inputs: ["ngFormOptions"],
303
+ outputs: ["ngSubmit"],
304
+ exportAs: ["ngForm"]
305
+ },
306
+ {
307
+ kind: "component",
308
+ type: Button,
309
+ selector: "gbt-button, a[gbtButton]",
310
+ inputs: [
311
+ "variant",
312
+ "size",
313
+ "type",
314
+ "text",
315
+ "iconName",
316
+ "ariaLabel",
317
+ "loading",
318
+ "loadingLabel",
319
+ "disabled",
320
+ "pressed",
321
+ "ariaExpanded",
322
+ "ariaControls",
323
+ "ariaHaspopup",
324
+ "block",
325
+ "iconOnly"
326
+ ],
327
+ outputs: ["clicked"]
328
+ },
329
+ {
330
+ kind: "component",
331
+ type: Divider,
332
+ selector: "gbt-divider",
333
+ inputs: ["orientation", "label"]
334
+ },
335
+ {
336
+ kind: "component",
337
+ type: GbtInput,
338
+ selector: "gbt-input",
339
+ inputs: [
340
+ "id",
341
+ "label",
342
+ "type",
343
+ "required",
344
+ "disabled",
345
+ "placeholder",
346
+ "errorMessage",
347
+ "autocomplete",
348
+ "hint",
349
+ "hideLabel",
350
+ "size",
351
+ "mono",
352
+ "leadingIcon",
353
+ "inputmode",
354
+ "spellcheck",
355
+ "autocapitalize",
356
+ "enterkeyhint",
357
+ "maxlength",
358
+ "min",
359
+ "max",
360
+ "combobox",
361
+ "showPasswordLabel",
362
+ "hidePasswordLabel"
363
+ ],
364
+ outputs: ["committed"]
365
+ },
366
+ {
367
+ kind: "component",
368
+ type: Alert,
369
+ selector: "gbt-alert",
370
+ inputs: [
371
+ "variant",
372
+ "dismissible",
373
+ "closeLabel",
374
+ "live",
375
+ "heading",
376
+ "size",
377
+ "appearance",
378
+ "iconAlign"
379
+ ],
380
+ outputs: ["dismissed"]
381
+ },
382
+ {
383
+ kind: "component",
384
+ type: AuthFooter,
385
+ selector: "gbt-auth-footer",
386
+ inputs: [
387
+ "text",
388
+ "href",
389
+ "linkText"
390
+ ]
391
+ },
392
+ {
393
+ kind: "component",
394
+ type: AuthPanel,
395
+ selector: "gbt-auth-panel",
396
+ inputs: [
397
+ "heading",
398
+ "intro",
399
+ "wide"
400
+ ]
401
+ },
402
+ {
403
+ kind: "component",
404
+ type: MfaEnrollment,
405
+ selector: "gbt-mfa-enrollment",
406
+ inputs: [
407
+ "mfaToken",
408
+ "passkeysAvailable",
409
+ "labels"
410
+ ],
411
+ outputs: [
412
+ "completed",
413
+ "cancelled",
414
+ "expired"
415
+ ]
416
+ }
417
+ ],
418
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
419
+ });
420
+ };
421
+ i0.ɵɵngDeclareClassMetadata({
422
+ minVersion: "12.0.0",
423
+ version: "22.2.0",
424
+ ngImport: i0,
425
+ type: AuthLogin,
426
+ decorators: [{
427
+ type: Component,
428
+ args: [{
429
+ selector: "gbt-auth-login",
430
+ standalone: true,
431
+ imports: [
432
+ FormsModule,
433
+ Button,
434
+ Divider,
435
+ GbtInput,
436
+ Alert,
437
+ AuthFooter,
438
+ AuthPanel,
439
+ MfaEnrollment
440
+ ],
441
+ changeDetection: ChangeDetectionStrategy.OnPush,
442
+ template: "<gbt-auth-panel [heading]=\"heading()\" [intro]=\"intro()\" [wide]=\"enrolling()\">\n <ng-container ngProjectAs=\"[auth-backdrop]\"><ng-content select=\"[auth-backdrop]\" /></ng-container>\n <ng-container ngProjectAs=\"[auth-logo]\"><ng-content select=\"[auth-logo]\" /></ng-container>\n\n @if (mfaToken() === null) {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"submit()\">\n <ng-content select=\"[auth-notice]\" />\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-username'\"\n name=\"username\"\n autocomplete=\"username\"\n [label]=\"text().username\"\n [ngModel]=\"username()\"\n (ngModelChange)=\"username.set($event)\"\n />\n <gbt-input\n [id]=\"id + '-password'\"\n type=\"password\"\n name=\"password\"\n autocomplete=\"current-password\"\n [label]=\"text().password\"\n [showPasswordLabel]=\"text().showPassword\"\n [hidePasswordLabel]=\"text().hidePassword\"\n [ngModel]=\"password()\"\n (ngModelChange)=\"password.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().submit\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().submitting\"\n />\n </form>\n\n @if (registrationEnabled() && registerLink()) {\n <gbt-auth-footer [text]=\"text().registerPrompt\"\n ><ng-content select=\"[gbtAuthFooterLink]\"\n /></gbt-auth-footer>\n }\n } @else if (enrolling()) {\n <gbt-mfa-enrollment\n [mfaToken]=\"mfaToken()!\"\n [passkeysAvailable]=\"passkeysAvailable() === true\"\n (completed)=\"enrolled($event)\"\n (cancelled)=\"backToCredentials()\"\n (expired)=\"sessionExpired()\"\n />\n } @else {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"verify()\">\n @if (passkeyBlocked()) {\n <gbt-alert variant=\"warning\" appearance=\"subtle\" iconAlign=\"start\" live=\"off\">{{\n blockedReason()\n }}</gbt-alert>\n }\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n @if (passkeyInFlight()) {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"polite\">{{\n text().passkeyPrompt\n }}</gbt-alert>\n }\n\n @if (showBackupCode()) {\n <gbt-input\n [id]=\"id + '-mfa-backup-code'\"\n inputmode=\"text\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"backupCode\"\n autocomplete=\"off\"\n [label]=\"text().backupCodeLabel\"\n [ngModel]=\"backupCode()\"\n (ngModelChange)=\"backupCode.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().verifying\"\n />\n } @else {\n @if (canUsePasskey()) {\n <gbt-button\n [attr.id]=\"id + '-mfa-passkey'\"\n class=\"gbt-auth-panel__submit\"\n block\n size=\"large\"\n iconName=\"key\"\n [text]=\"text().usePasskey\"\n [loading]=\"passkeyInFlight()\"\n [disabled]=\"submitting() && !passkeyInFlight()\"\n [loadingLabel]=\"text().passkeyValidating\"\n (clicked)=\"usePasskey()\"\n />\n }\n\n @if (canUsePasskey() && hasTotp()) {\n <gbt-divider [label]=\"text().or\" />\n }\n\n @if (hasTotp()) {\n <gbt-input\n [id]=\"id + '-mfa-code'\"\n inputmode=\"numeric\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"code\"\n autocomplete=\"one-time-code\"\n [label]=\"text().codeLabel\"\n [ngModel]=\"code()\"\n (ngModelChange)=\"code.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [variant]=\"canUsePasskey() ? 'secondary' : 'primary'\"\n [loading]=\"submitting() && !passkeyInFlight()\"\n [disabled]=\"passkeyInFlight()\"\n [loadingLabel]=\"text().verifying\"\n />\n }\n }\n\n <div class=\"gbt-auth-panel__links\">\n @if (!passkeyBlocked()) {\n <gbt-button\n variant=\"link\"\n [text]=\"showBackupCode() ? backFromBackupLabel() : text().useBackupCode\"\n (clicked)=\"toggleBackupCode()\"\n />\n }\n <gbt-button variant=\"link\" [text]=\"text().back\" (clicked)=\"backToCredentials()\" />\n </div>\n </form>\n }\n</gbt-auth-panel>\n"
443
+ }]
444
+ }],
445
+ ctorParameters: () => [],
446
+ propDecorators: {
447
+ labels: [{
448
+ type: i0.Input,
449
+ args: [{
450
+ isSignal: true,
451
+ alias: "labels",
452
+ required: false
453
+ }]
454
+ }],
455
+ loggedIn: [{
456
+ type: i0.Output,
457
+ args: ["loggedIn"]
458
+ }],
459
+ registerLink: [{
460
+ type: i0.ContentChild,
461
+ args: [i0.forwardRef(() => AuthFooterLink), { isSignal: true }]
462
+ }]
463
+ }
464
+ });
465
+ export { AuthLogin };
466
+
467
+ //# sourceMappingURL=masmarino-gabarit-auth-login.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masmarino-gabarit-auth-login.mjs","names":[],"sources":["../../../projects/gabarit/auth-login/login.ts","../../../projects/gabarit/auth-login/login.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport { FormsModule } from '@angular/forms'\nimport { EMPTY, from, switchMap } from 'rxjs'\nimport { Button } from '@masmarino/gabarit/button'\nimport { Divider } from '@masmarino/gabarit/divider'\nimport { GbtInput } from '@masmarino/gabarit/input'\nimport { Alert } from '@masmarino/gabarit/alert'\nimport { DEFAULT_LOGIN_LABELS, type LoginLabels, authLabels } from '@masmarino/gabarit/auth'\nimport { AuthFooter, AuthFooterLink } from '@masmarino/gabarit/auth'\nimport { AuthPanel } from '@masmarino/gabarit/auth'\nimport { MfaEnrollment } from '@masmarino/gabarit/mfa-enrollment'\nimport { AUTH_PORT, type MfaProof } from '@masmarino/gabarit/auth'\nimport { focusAfterRender } from '@masmarino/gabarit/auth'\nimport { classifyMfaFailure } from '@masmarino/gabarit/auth'\nimport { isAuthPortError } from '@masmarino/gabarit/auth'\nimport {\n classifyPasskeyError,\n getPasskeyAssertion,\n passkeysSupported,\n} from '@masmarino/gabarit/auth'\n\nlet nextId = 0\n\n@Component({\n selector: 'gbt-auth-login',\n standalone: true,\n imports: [FormsModule, Button, Divider, GbtInput, Alert, AuthFooter, AuthPanel, MfaEnrollment],\n templateUrl: './login.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AuthLogin {\n private readonly auth = inject(AUTH_PORT)\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef)\n private readonly injector = inject(Injector)\n\n labels = input<Partial<LoginLabels>>({})\n loggedIn = output<void>()\n\n protected readonly text = authLabels('login', DEFAULT_LOGIN_LABELS, this.labels)\n protected readonly registerLink = contentChild(AuthFooterLink)\n protected readonly id = `gbt-login-${nextId++}`\n\n username = signal('')\n protected password = signal('')\n error = signal('')\n submitting = signal(false)\n\n protected mfaToken = signal<string | null>(null)\n mfaSetupRequired = signal(false)\n mfaHasTotp = signal(false)\n mfaHasPasskey = signal(false)\n useBackupCode = signal(false)\n protected code = signal('')\n protected backupCode = signal('')\n\n protected registrationEnabled = signal(false)\n protected passkeysAvailable = signal<boolean | null>(null)\n private browserHasPasskeys = signal(false)\n protected passkeyInFlight = signal(false)\n private ceremony = 0\n protected errorVariant = signal<'error' | 'info'>('error')\n\n protected enrolling = computed(() => this.mfaToken() !== null && this.mfaSetupRequired())\n protected challenging = computed(() => this.mfaToken() !== null && !this.mfaSetupRequired())\n\n protected canUsePasskey = computed(\n () => this.mfaHasPasskey() && this.browserHasPasskeys() && this.passkeysAvailable() !== false,\n )\n protected hasTotp = computed(() => this.mfaHasTotp() || !this.mfaHasPasskey())\n protected passkeyBlocked = computed(\n () => this.challenging() && this.mfaHasPasskey() && !this.hasTotp() && !this.canUsePasskey(),\n )\n protected showBackupCode = computed(() => this.useBackupCode() || this.passkeyBlocked())\n protected blockedReason = computed(() =>\n this.browserHasPasskeys() ? this.text().blockedByServer : this.text().blockedByBrowser,\n )\n protected backFromBackupLabel = computed(() => {\n const text = this.text()\n if (this.canUsePasskey()) {\n return this.hasTotp() ? text.backToPasskeyOrApp : text.backToPasskey\n }\n return text.backToApp\n })\n\n protected heading = computed(() => {\n if (this.enrolling()) {\n return this.text().enrollmentHeading\n }\n return this.challenging() ? this.text().challengeHeading : this.text().heading\n })\n protected intro = computed(() => {\n const text = this.text()\n if (this.enrolling()) {\n return ''\n }\n if (!this.challenging()) {\n return text.intro\n }\n if (this.showBackupCode()) {\n return text.introBackupCode\n }\n if (this.canUsePasskey()) {\n return this.hasTotp() ? text.introPasskeyOrCode : text.introPasskey\n }\n return text.introCode\n })\n\n constructor() {\n this.focusField('username')\n this.auth\n .authConfig()\n .pipe(takeUntilDestroyed())\n .subscribe({\n next: (config) => {\n this.registrationEnabled.set(config.registrationEnabled === true)\n this.passkeysAvailable.set(config.passkeysAvailable === true)\n },\n error: () => this.registrationEnabled.set(false),\n })\n }\n\n submit(): void {\n if (this.submitting()) {\n return\n }\n this.error.set('')\n this.submitting.set(true)\n this.auth.login(this.username(), this.password()).subscribe({\n next: (res) => {\n this.password.set('')\n this.submitting.set(false)\n if (res.token) {\n this.loggedIn.emit()\n } else if (res.mfaToken) {\n this.mfaSetupRequired.set(res.mfaSetupRequired === true)\n this.mfaHasTotp.set(res.mfaHasTotp === true)\n this.mfaHasPasskey.set(res.mfaHasPasskey === true)\n this.browserHasPasskeys.set(passkeysSupported())\n this.mfaToken.set(res.mfaToken)\n if (!this.mfaSetupRequired()) {\n this.focusField(this.firstChallengeTarget())\n }\n } else {\n this.fail(this.text().loginFailed, 'password')\n }\n },\n error: (err: unknown) => {\n this.submitting.set(false)\n this.fail(this.loginFailureMessage(err), 'password')\n },\n })\n }\n\n private loginFailureMessage(err: unknown): string {\n const status = isAuthPortError(err) ? err.status : null\n if (status === 401) {\n return this.text().wrongCredentials\n }\n if (status === 429) {\n return this.text().tooManyAttempts\n }\n return this.text().loginFailed\n }\n\n verify(): void {\n if (this.submitting()) {\n return\n }\n const mfaToken = this.mfaToken()\n const backup = this.showBackupCode()\n const value = (backup ? this.backupCode() : this.code()).replace(/\\s+/g, '')\n const field = backup ? 'mfa-backup-code' : 'mfa-code'\n if (mfaToken === null) {\n return\n }\n if (value === '') {\n this.fail(backup ? this.text().enterBackupCode : this.text().enterCode, field)\n return\n }\n this.error.set('')\n this.submitting.set(true)\n const proof: MfaProof = backup ? { backupCode: value } : { code: value }\n this.auth.verifyMfa(mfaToken, proof).subscribe({\n next: () => {\n this.submitting.set(false)\n this.resetMfa()\n this.loggedIn.emit()\n },\n error: (err: unknown) => {\n this.submitting.set(false)\n const failure = classifyMfaFailure(err)\n if (failure === 'expired') {\n this.sessionExpired()\n return\n }\n if (failure === 'wrong-code') {\n this.code.set('')\n this.backupCode.set('')\n }\n const text = this.text()\n this.fail(\n failure === 'rate-limited'\n ? text.tooManyAttempts\n : failure === 'wrong-code'\n ? text.wrongCode\n : text.verifyFailed,\n field,\n )\n },\n })\n }\n\n usePasskey(): void {\n const mfaToken = this.mfaToken()\n if (this.submitting() || mfaToken === null) {\n return\n }\n this.error.set('')\n this.submitting.set(true)\n this.passkeyInFlight.set(true)\n const run = ++this.ceremony\n this.auth\n .startPasskeyChallenge(mfaToken)\n .pipe(\n switchMap(({ challengeId, publicKey }) =>\n run !== this.ceremony\n ? EMPTY\n : from(getPasskeyAssertion(publicKey)).pipe(\n switchMap((credential) =>\n run === this.ceremony\n ? this.auth.finishPasskeyChallenge(mfaToken, challengeId, credential)\n : EMPTY,\n ),\n ),\n ),\n )\n .subscribe({\n next: () => {\n this.submitting.set(false)\n this.passkeyInFlight.set(false)\n this.resetMfa()\n this.loggedIn.emit()\n },\n error: (err: unknown) => {\n if (run !== this.ceremony) {\n return\n }\n this.submitting.set(false)\n this.passkeyInFlight.set(false)\n this.passkeyFailed(err)\n },\n })\n }\n\n private passkeyFailed(err: unknown): void {\n const text = this.text()\n if (!isAuthPortError(err)) {\n switch (classifyPasskeyError(err)) {\n case 'cancelled':\n this.fail(text.cancelled, 'mfa-passkey', 'info')\n return\n case 'unsupported':\n this.fail(text.browserUnsupported, 'mfa-passkey')\n return\n default:\n this.fail(text.verifyFailed, 'mfa-passkey')\n return\n }\n }\n switch (classifyMfaFailure(err)) {\n case 'expired':\n this.sessionExpired()\n return\n case 'wrong-code':\n this.fail(text.passkeyRefused, 'mfa-passkey')\n return\n case 'rate-limited':\n this.fail(text.tooManyAttempts, 'mfa-passkey')\n return\n case 'unavailable':\n this.fail(text.passkeysUnavailable, 'mfa-passkey')\n return\n default:\n this.fail(text.verifyFailed, 'mfa-passkey')\n }\n }\n\n toggleBackupCode(): void {\n this.error.set('')\n this.useBackupCode.update((backup) => !backup)\n this.focusField(this.useBackupCode() ? 'mfa-backup-code' : this.firstChallengeTarget())\n }\n\n private firstChallengeTarget(): string {\n if (this.showBackupCode()) {\n return 'mfa-backup-code'\n }\n return this.canUsePasskey() ? 'mfa-passkey' : 'mfa-code'\n }\n\n backToCredentials(): void {\n this.resetMfa()\n this.error.set('')\n this.focusField('password')\n }\n\n sessionExpired(): void {\n this.resetMfa()\n this.fail(this.text().loginExpired, 'password')\n }\n\n enrolled(token: string): void {\n this.auth.setToken(token)\n this.resetMfa()\n this.loggedIn.emit()\n }\n\n private resetMfa(): void {\n this.ceremony++\n this.submitting.set(false)\n this.passkeyInFlight.set(false)\n this.mfaToken.set(null)\n this.mfaSetupRequired.set(false)\n this.mfaHasTotp.set(false)\n this.mfaHasPasskey.set(false)\n this.useBackupCode.set(false)\n this.code.set('')\n this.backupCode.set('')\n }\n\n private fail(message: string, focusSuffix: string, variant: 'error' | 'info' = 'error'): void {\n this.errorVariant.set(variant)\n this.error.set(message)\n this.focusField(focusSuffix)\n }\n\n private focusField(suffix: string): void {\n focusAfterRender(this.host, this.injector, `#${this.id}-${suffix}`, {\n nestedFallback: 'button',\n })\n }\n}\n","<gbt-auth-panel [heading]=\"heading()\" [intro]=\"intro()\" [wide]=\"enrolling()\">\n <ng-container ngProjectAs=\"[auth-backdrop]\"><ng-content select=\"[auth-backdrop]\" /></ng-container>\n <ng-container ngProjectAs=\"[auth-logo]\"><ng-content select=\"[auth-logo]\" /></ng-container>\n\n @if (mfaToken() === null) {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"submit()\">\n <ng-content select=\"[auth-notice]\" />\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-username'\"\n name=\"username\"\n autocomplete=\"username\"\n [label]=\"text().username\"\n [ngModel]=\"username()\"\n (ngModelChange)=\"username.set($event)\"\n />\n <gbt-input\n [id]=\"id + '-password'\"\n type=\"password\"\n name=\"password\"\n autocomplete=\"current-password\"\n [label]=\"text().password\"\n [showPasswordLabel]=\"text().showPassword\"\n [hidePasswordLabel]=\"text().hidePassword\"\n [ngModel]=\"password()\"\n (ngModelChange)=\"password.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().submit\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().submitting\"\n />\n </form>\n\n @if (registrationEnabled() && registerLink()) {\n <gbt-auth-footer [text]=\"text().registerPrompt\"\n ><ng-content select=\"[gbtAuthFooterLink]\"\n /></gbt-auth-footer>\n }\n } @else if (enrolling()) {\n <gbt-mfa-enrollment\n [mfaToken]=\"mfaToken()!\"\n [passkeysAvailable]=\"passkeysAvailable() === true\"\n (completed)=\"enrolled($event)\"\n (cancelled)=\"backToCredentials()\"\n (expired)=\"sessionExpired()\"\n />\n } @else {\n <form class=\"gbt-auth-panel__form\" (ngSubmit)=\"verify()\">\n @if (passkeyBlocked()) {\n <gbt-alert variant=\"warning\" appearance=\"subtle\" iconAlign=\"start\" live=\"off\">{{\n blockedReason()\n }}</gbt-alert>\n }\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n @if (passkeyInFlight()) {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"polite\">{{\n text().passkeyPrompt\n }}</gbt-alert>\n }\n\n @if (showBackupCode()) {\n <gbt-input\n [id]=\"id + '-mfa-backup-code'\"\n inputmode=\"text\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"backupCode\"\n autocomplete=\"off\"\n [label]=\"text().backupCodeLabel\"\n [ngModel]=\"backupCode()\"\n (ngModelChange)=\"backupCode.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().verifying\"\n />\n } @else {\n @if (canUsePasskey()) {\n <gbt-button\n [attr.id]=\"id + '-mfa-passkey'\"\n class=\"gbt-auth-panel__submit\"\n block\n size=\"large\"\n iconName=\"key\"\n [text]=\"text().usePasskey\"\n [loading]=\"passkeyInFlight()\"\n [disabled]=\"submitting() && !passkeyInFlight()\"\n [loadingLabel]=\"text().passkeyValidating\"\n (clicked)=\"usePasskey()\"\n />\n }\n\n @if (canUsePasskey() && hasTotp()) {\n <gbt-divider [label]=\"text().or\" />\n }\n\n @if (hasTotp()) {\n <gbt-input\n [id]=\"id + '-mfa-code'\"\n inputmode=\"numeric\"\n [spellcheck]=\"false\"\n autocapitalize=\"off\"\n enterkeyhint=\"go\"\n name=\"code\"\n autocomplete=\"one-time-code\"\n [label]=\"text().codeLabel\"\n [ngModel]=\"code()\"\n (ngModelChange)=\"code.set($event)\"\n />\n\n <gbt-button\n class=\"gbt-auth-panel__submit\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().verify\"\n [variant]=\"canUsePasskey() ? 'secondary' : 'primary'\"\n [loading]=\"submitting() && !passkeyInFlight()\"\n [disabled]=\"passkeyInFlight()\"\n [loadingLabel]=\"text().verifying\"\n />\n }\n }\n\n <div class=\"gbt-auth-panel__links\">\n @if (!passkeyBlocked()) {\n <gbt-button\n variant=\"link\"\n [text]=\"showBackupCode() ? backFromBackupLabel() : text().useBackupCode\"\n (clicked)=\"toggleBackupCode()\"\n />\n }\n <gbt-button variant=\"link\" [text]=\"text().back\" (clicked)=\"backToCredentials()\" />\n </div>\n </form>\n }\n</gbt-auth-panel>\n"],"mappings":"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"}