@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,897 @@
1
+ import { DOCUMENT } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, ElementRef, InjectionToken, Injector, booleanAttribute, computed, effect, inject, input, model, output, signal, untracked } from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import { FormsModule } from "@angular/forms";
6
+ import { Button } from "@masmarino/gabarit/button";
7
+ import { Checkbox } from "@masmarino/gabarit/checkbox";
8
+ import { CopyButton } from "@masmarino/gabarit/copy-button";
9
+ import { AUTH_PORT, DEFAULT_BACKUP_CODES_LABELS, DEFAULT_MFA_ENROLLMENT_LABELS, DEFAULT_TOTP_QR_LABELS, PASSKEY_NAME_MAX, authLabels, classifyMfaFailure, classifyPasskeyError, createPasskeyCredential, focusAfterRender, isAuthPortError, passkeyNameProblem, passkeysSupported } from "@masmarino/gabarit/auth";
10
+ import { EMPTY, from, switchMap } from "rxjs";
11
+ import { Badge } from "@masmarino/gabarit/badge";
12
+ import { GbtInput } from "@masmarino/gabarit/input";
13
+ import { Alert } from "@masmarino/gabarit/alert";
14
+ import { Card } from "@masmarino/gabarit/card";
15
+ import { CopyField } from "@masmarino/gabarit/copy-field";
16
+ let nextId$1 = 0;
17
+ var BackupCodes = class BackupCodes {
18
+ codes = input.required(...ngDevMode ? [{ debugName: "codes" }] : /* istanbul ignore next */ []);
19
+ acknowledged = model(false, ...ngDevMode ? [{ debugName: "acknowledged" }] : /* istanbul ignore next */ []);
20
+ labels = input({}, ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
21
+ text = authLabels("backupCodes", DEFAULT_BACKUP_CODES_LABELS, this.labels);
22
+ id = `gbt-backup-codes-${nextId$1++}`;
23
+ document = inject(DOCUMENT);
24
+ display = computed(() => this.codes().map((code) => (code.match(/.{1,16}/g) ?? []).map((line) => line.replace(/(.{8})(?=.)/g, "$1 "))), ...ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []);
25
+ constructor() {
26
+ let shown;
27
+ effect(() => {
28
+ const codes = this.codes();
29
+ if (shown !== void 0 && codes !== shown) untracked(() => this.acknowledged.set(false));
30
+ shown = codes;
31
+ });
32
+ }
33
+ codesText = computed(() => this.codes().join("\n"), ...ngDevMode ? [{ debugName: "codesText" }] : /* istanbul ignore next */ []);
34
+ download() {
35
+ const text = this.text();
36
+ const content = [
37
+ text.fileTitle,
38
+ text.fileNotice,
39
+ "",
40
+ ...this.codes(),
41
+ ""
42
+ ].join("\n");
43
+ const url = URL.createObjectURL(new Blob([content], { type: "text/plain;charset=utf-8" }));
44
+ const link = this.document.createElement("a");
45
+ link.href = url;
46
+ link.download = text.fileName;
47
+ link.click();
48
+ URL.revokeObjectURL(url);
49
+ }
50
+ static ɵfac = i0.ɵɵngDeclareFactory({
51
+ minVersion: "12.0.0",
52
+ version: "22.2.0",
53
+ ngImport: i0,
54
+ type: BackupCodes,
55
+ deps: [],
56
+ target: i0.ɵɵFactoryTarget.Component
57
+ });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({
59
+ minVersion: "17.0.0",
60
+ version: "22.2.0",
61
+ type: BackupCodes,
62
+ isStandalone: true,
63
+ selector: "gbt-backup-codes",
64
+ inputs: {
65
+ codes: {
66
+ classPropertyName: "codes",
67
+ publicName: "codes",
68
+ isSignal: true,
69
+ isRequired: true,
70
+ transformFunction: null
71
+ },
72
+ acknowledged: {
73
+ classPropertyName: "acknowledged",
74
+ publicName: "acknowledged",
75
+ isSignal: true,
76
+ isRequired: false,
77
+ transformFunction: null
78
+ },
79
+ labels: {
80
+ classPropertyName: "labels",
81
+ publicName: "labels",
82
+ isSignal: true,
83
+ isRequired: false,
84
+ transformFunction: null
85
+ }
86
+ },
87
+ outputs: { acknowledged: "acknowledgedChange" },
88
+ ngImport: i0,
89
+ template: "<div class=\"gbt-backup-codes\">\n <ol #grid class=\"gbt-backup-codes__grid\" [attr.aria-label]=\"text().listLabel\">\n @for (lines of display(); track $index) {\n <li class=\"gbt-backup-codes__code\">\n @for (line of lines; track $index) {\n <span class=\"gbt-backup-codes__line\">{{ line }}</span>\n }\n </li>\n }\n </ol>\n\n <div class=\"gbt-backup-codes__actions\">\n <gbt-copy-button\n variant=\"secondary\"\n size=\"small\"\n feedback=\"inline\"\n [text]=\"text().copy\"\n [copiedText]=\"text().copied\"\n [failedText]=\"text().copyFailed\"\n [value]=\"codesText()\"\n [selectTarget]=\"grid\"\n />\n <gbt-button\n variant=\"secondary\"\n size=\"small\"\n iconName=\"download\"\n [text]=\"text().download\"\n (clicked)=\"download()\"\n />\n </div>\n\n <div class=\"gbt-backup-codes__ack\">\n <gbt-checkbox\n [id]=\"id + '-ack'\"\n [label]=\"text().acknowledge\"\n [ngModel]=\"acknowledged()\"\n (ngModelChange)=\"acknowledged.set($event)\"\n />\n </div>\n</div>\n",
90
+ styles: [":host{display:block}.gbt-backup-codes{display:flex;flex-direction:column;gap:1rem}.gbt-backup-codes__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;margin:0;padding:0;list-style:none}.gbt-backup-codes__code{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.125rem;box-sizing:border-box;min-width:0;padding:.5rem .25rem;border:1px solid var(--gbt-card-border);border-radius:var(--site-border-radius-sm);background:var(--bg-panel);color:var(--text-primary);font-family:var(--gbt-font-mono);font-size:.75rem;line-height:1.125rem;-webkit-user-select:all;user-select:all}.gbt-backup-codes__line{overflow-wrap:anywhere;white-space:pre}.gbt-backup-codes__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.gbt-backup-codes__actions gbt-copy-button{display:contents}.gbt-backup-codes__actions ::ng-deep .gbt-copy-button__status{order:1}.gbt-backup-codes__actions ::ng-deep .gbt-button{position:relative}.gbt-backup-codes__actions ::ng-deep .gbt-button:after{content:\"\";position:absolute;inset:calc((var(--gbt-control-height-sm) - var(--gbt-control-height-lg)) / 2) -2px}.gbt-backup-codes__ack{padding-top:.25rem;border-top:1px solid var(--gbt-hairline)}.gbt-backup-codes__ack ::ng-deep .gbt-checkbox{display:flex;box-sizing:border-box;width:100%;min-height:2.75rem}\n"],
91
+ dependencies: [
92
+ {
93
+ kind: "ngmodule",
94
+ type: FormsModule
95
+ },
96
+ {
97
+ kind: "directive",
98
+ type: i1.NgControlStatus,
99
+ selector: "[formControlName],[ngModel],[formControl]"
100
+ },
101
+ {
102
+ kind: "directive",
103
+ type: i1.NgModel,
104
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
105
+ inputs: [
106
+ "name",
107
+ "disabled",
108
+ "ngModel",
109
+ "ngModelOptions"
110
+ ],
111
+ outputs: ["ngModelChange"],
112
+ exportAs: ["ngModel"]
113
+ },
114
+ {
115
+ kind: "component",
116
+ type: Button,
117
+ selector: "gbt-button, a[gbtButton]",
118
+ inputs: [
119
+ "variant",
120
+ "size",
121
+ "type",
122
+ "text",
123
+ "iconName",
124
+ "ariaLabel",
125
+ "loading",
126
+ "loadingLabel",
127
+ "disabled",
128
+ "pressed",
129
+ "ariaExpanded",
130
+ "ariaControls",
131
+ "ariaHaspopup",
132
+ "block",
133
+ "iconOnly"
134
+ ],
135
+ outputs: ["clicked"]
136
+ },
137
+ {
138
+ kind: "component",
139
+ type: Checkbox,
140
+ selector: "gbt-checkbox",
141
+ inputs: [
142
+ "id",
143
+ "label",
144
+ "disabled",
145
+ "hint",
146
+ "checked"
147
+ ],
148
+ outputs: ["checkedChange"]
149
+ },
150
+ {
151
+ kind: "component",
152
+ type: CopyButton,
153
+ selector: "gbt-copy-button",
154
+ inputs: [
155
+ "value",
156
+ "text",
157
+ "ariaLabel",
158
+ "copiedText",
159
+ "failedText",
160
+ "feedbackMs",
161
+ "variant",
162
+ "size",
163
+ "icon",
164
+ "disabled",
165
+ "feedback",
166
+ "selectTarget"
167
+ ],
168
+ outputs: ["copied", "copyFailed"]
169
+ }
170
+ ],
171
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
172
+ });
173
+ };
174
+ i0.ɵɵngDeclareClassMetadata({
175
+ minVersion: "12.0.0",
176
+ version: "22.2.0",
177
+ ngImport: i0,
178
+ type: BackupCodes,
179
+ decorators: [{
180
+ type: Component,
181
+ args: [{
182
+ selector: "gbt-backup-codes",
183
+ standalone: true,
184
+ imports: [
185
+ FormsModule,
186
+ Button,
187
+ Checkbox,
188
+ CopyButton
189
+ ],
190
+ changeDetection: ChangeDetectionStrategy.OnPush,
191
+ template: "<div class=\"gbt-backup-codes\">\n <ol #grid class=\"gbt-backup-codes__grid\" [attr.aria-label]=\"text().listLabel\">\n @for (lines of display(); track $index) {\n <li class=\"gbt-backup-codes__code\">\n @for (line of lines; track $index) {\n <span class=\"gbt-backup-codes__line\">{{ line }}</span>\n }\n </li>\n }\n </ol>\n\n <div class=\"gbt-backup-codes__actions\">\n <gbt-copy-button\n variant=\"secondary\"\n size=\"small\"\n feedback=\"inline\"\n [text]=\"text().copy\"\n [copiedText]=\"text().copied\"\n [failedText]=\"text().copyFailed\"\n [value]=\"codesText()\"\n [selectTarget]=\"grid\"\n />\n <gbt-button\n variant=\"secondary\"\n size=\"small\"\n iconName=\"download\"\n [text]=\"text().download\"\n (clicked)=\"download()\"\n />\n </div>\n\n <div class=\"gbt-backup-codes__ack\">\n <gbt-checkbox\n [id]=\"id + '-ack'\"\n [label]=\"text().acknowledge\"\n [ngModel]=\"acknowledged()\"\n (ngModelChange)=\"acknowledged.set($event)\"\n />\n </div>\n</div>\n",
192
+ styles: [":host{display:block}.gbt-backup-codes{display:flex;flex-direction:column;gap:1rem}.gbt-backup-codes__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;margin:0;padding:0;list-style:none}.gbt-backup-codes__code{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.125rem;box-sizing:border-box;min-width:0;padding:.5rem .25rem;border:1px solid var(--gbt-card-border);border-radius:var(--site-border-radius-sm);background:var(--bg-panel);color:var(--text-primary);font-family:var(--gbt-font-mono);font-size:.75rem;line-height:1.125rem;-webkit-user-select:all;user-select:all}.gbt-backup-codes__line{overflow-wrap:anywhere;white-space:pre}.gbt-backup-codes__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.gbt-backup-codes__actions gbt-copy-button{display:contents}.gbt-backup-codes__actions ::ng-deep .gbt-copy-button__status{order:1}.gbt-backup-codes__actions ::ng-deep .gbt-button{position:relative}.gbt-backup-codes__actions ::ng-deep .gbt-button:after{content:\"\";position:absolute;inset:calc((var(--gbt-control-height-sm) - var(--gbt-control-height-lg)) / 2) -2px}.gbt-backup-codes__ack{padding-top:.25rem;border-top:1px solid var(--gbt-hairline)}.gbt-backup-codes__ack ::ng-deep .gbt-checkbox{display:flex;box-sizing:border-box;width:100%;min-height:2.75rem}\n"]
193
+ }]
194
+ }],
195
+ ctorParameters: () => [],
196
+ propDecorators: {
197
+ codes: [{
198
+ type: i0.Input,
199
+ args: [{
200
+ isSignal: true,
201
+ alias: "codes",
202
+ required: true
203
+ }]
204
+ }],
205
+ acknowledged: [{
206
+ type: i0.Input,
207
+ args: [{
208
+ isSignal: true,
209
+ alias: "acknowledged",
210
+ required: false
211
+ }]
212
+ }, {
213
+ type: i0.Output,
214
+ args: ["acknowledgedChange"]
215
+ }],
216
+ labels: [{
217
+ type: i0.Input,
218
+ args: [{
219
+ isSignal: true,
220
+ alias: "labels",
221
+ required: false
222
+ }]
223
+ }]
224
+ }
225
+ });
226
+ const TOTP_QR_RENDERER = new InjectionToken("TOTP_QR_RENDERER");
227
+ const RENDER_OPTIONS = {
228
+ errorCorrectionLevel: "M",
229
+ margin: 1,
230
+ width: 448
231
+ };
232
+ var TotpQr = class TotpQr {
233
+ otpauthUrl = input.required(...ngDevMode ? [{ debugName: "otpauthUrl" }] : /* istanbul ignore next */ []);
234
+ secret = input.required(...ngDevMode ? [{ debugName: "secret" }] : /* istanbul ignore next */ []);
235
+ labels = input({}, ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
236
+ text = authLabels("totpQr", DEFAULT_TOTP_QR_LABELS, this.labels);
237
+ dataUrl = signal(null, ...ngDevMode ? [{ debugName: "dataUrl" }] : /* istanbul ignore next */ []);
238
+ failed = signal(false, ...ngDevMode ? [{ debugName: "failed" }] : /* istanbul ignore next */ []);
239
+ render = inject(TOTP_QR_RENDERER, { optional: true });
240
+ generation = 0;
241
+ constructor() {
242
+ effect(() => {
243
+ const url = this.otpauthUrl();
244
+ const current = ++this.generation;
245
+ this.dataUrl.set(null);
246
+ this.failed.set(false);
247
+ const render = this.render;
248
+ if (!render) {
249
+ this.failed.set(true);
250
+ return;
251
+ }
252
+ Promise.resolve().then(() => render(url, RENDER_OPTIONS)).then((dataUrl) => {
253
+ if (current === this.generation) this.dataUrl.set(dataUrl);
254
+ }).catch(() => {
255
+ if (current === this.generation) this.failed.set(true);
256
+ });
257
+ });
258
+ }
259
+ static ɵfac = i0.ɵɵngDeclareFactory({
260
+ minVersion: "12.0.0",
261
+ version: "22.2.0",
262
+ ngImport: i0,
263
+ type: TotpQr,
264
+ deps: [],
265
+ target: i0.ɵɵFactoryTarget.Component
266
+ });
267
+ static ɵcmp = i0.ɵɵngDeclareComponent({
268
+ minVersion: "17.0.0",
269
+ version: "22.2.0",
270
+ type: TotpQr,
271
+ isStandalone: true,
272
+ selector: "gbt-totp-qr",
273
+ inputs: {
274
+ otpauthUrl: {
275
+ classPropertyName: "otpauthUrl",
276
+ publicName: "otpauthUrl",
277
+ isSignal: true,
278
+ isRequired: true,
279
+ transformFunction: null
280
+ },
281
+ secret: {
282
+ classPropertyName: "secret",
283
+ publicName: "secret",
284
+ isSignal: true,
285
+ isRequired: true,
286
+ transformFunction: null
287
+ },
288
+ labels: {
289
+ classPropertyName: "labels",
290
+ publicName: "labels",
291
+ isSignal: true,
292
+ isRequired: false,
293
+ transformFunction: null
294
+ }
295
+ },
296
+ ngImport: i0,
297
+ template: "<div class=\"gbt-totp-qr\">\n @if (failed()) {\n <p class=\"gbt-totp-qr__fallback\" role=\"status\">{{ text().fallback }}</p>\n } @else {\n <div class=\"gbt-totp-qr__frame\" [attr.aria-busy]=\"dataUrl() === null ? 'true' : null\">\n @if (dataUrl(); as src) {\n <img [src]=\"src\" [alt]=\"text().imageAlt\" width=\"224\" height=\"224\" />\n }\n </div>\n }\n\n <div class=\"gbt-totp-qr__secret\">\n <p class=\"gbt-totp-qr__label\">\n {{ failed() ? text().fallbackSecretLabel : text().secretLabel }}\n </p>\n <gbt-copy-field\n [value]=\"secret()\"\n [copyLabel]=\"text().copyLabel\"\n [copiedText]=\"text().copied\"\n [failedText]=\"text().copyFailed\"\n />\n </div>\n</div>\n",
298
+ styles: [":host{display:block}.gbt-totp-qr{display:flex;flex-direction:column;align-items:stretch;gap:1.25rem}.gbt-totp-qr__frame{display:flex;box-sizing:border-box;width:14rem;max-width:100%;aspect-ratio:1;align-items:center;justify-content:center;margin-inline:auto;padding:.5rem;border:1px solid var(--gbt-card-border);border-radius:var(--gbt-radius-tile, 4px);background:#fff}.gbt-totp-qr__frame img{display:block;width:100%;height:auto;image-rendering:pixelated}.gbt-totp-qr__frame[aria-busy=true]{background:var(--bg-panel)}.gbt-totp-qr__fallback{margin:0;padding:.625rem .75rem;border:1px solid color-mix(in srgb,var(--color-warning-text) 30%,transparent);border-radius:var(--gbt-radius-tile, 4px);background:var(--color-warning-bg);color:var(--color-warning-text);font-size:.875rem;line-height:1.25rem}.gbt-totp-qr__label{margin:0 0 .375rem;color:var(--text-secondary);font-size:.8125rem;font-weight:600}.gbt-totp-qr__secret ::ng-deep .gbt-copy-field__copy .gbt-button{position:relative}.gbt-totp-qr__secret ::ng-deep .gbt-copy-field__copy .gbt-button:after{content:\"\";position:absolute;inset:calc((var(--gbt-control-height-sm) - var(--gbt-control-height-lg)) / 2)}\n"],
299
+ dependencies: [{
300
+ kind: "component",
301
+ type: CopyField,
302
+ selector: "gbt-copy-field",
303
+ inputs: [
304
+ "value",
305
+ "label",
306
+ "copyLabel",
307
+ "copiedText",
308
+ "failedText",
309
+ "feedbackMs",
310
+ "feedback",
311
+ "wrapAt"
312
+ ],
313
+ outputs: ["copied", "copyFailed"]
314
+ }],
315
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
316
+ });
317
+ };
318
+ i0.ɵɵngDeclareClassMetadata({
319
+ minVersion: "12.0.0",
320
+ version: "22.2.0",
321
+ ngImport: i0,
322
+ type: TotpQr,
323
+ decorators: [{
324
+ type: Component,
325
+ args: [{
326
+ selector: "gbt-totp-qr",
327
+ standalone: true,
328
+ imports: [CopyField],
329
+ changeDetection: ChangeDetectionStrategy.OnPush,
330
+ template: "<div class=\"gbt-totp-qr\">\n @if (failed()) {\n <p class=\"gbt-totp-qr__fallback\" role=\"status\">{{ text().fallback }}</p>\n } @else {\n <div class=\"gbt-totp-qr__frame\" [attr.aria-busy]=\"dataUrl() === null ? 'true' : null\">\n @if (dataUrl(); as src) {\n <img [src]=\"src\" [alt]=\"text().imageAlt\" width=\"224\" height=\"224\" />\n }\n </div>\n }\n\n <div class=\"gbt-totp-qr__secret\">\n <p class=\"gbt-totp-qr__label\">\n {{ failed() ? text().fallbackSecretLabel : text().secretLabel }}\n </p>\n <gbt-copy-field\n [value]=\"secret()\"\n [copyLabel]=\"text().copyLabel\"\n [copiedText]=\"text().copied\"\n [failedText]=\"text().copyFailed\"\n />\n </div>\n</div>\n",
331
+ styles: [":host{display:block}.gbt-totp-qr{display:flex;flex-direction:column;align-items:stretch;gap:1.25rem}.gbt-totp-qr__frame{display:flex;box-sizing:border-box;width:14rem;max-width:100%;aspect-ratio:1;align-items:center;justify-content:center;margin-inline:auto;padding:.5rem;border:1px solid var(--gbt-card-border);border-radius:var(--gbt-radius-tile, 4px);background:#fff}.gbt-totp-qr__frame img{display:block;width:100%;height:auto;image-rendering:pixelated}.gbt-totp-qr__frame[aria-busy=true]{background:var(--bg-panel)}.gbt-totp-qr__fallback{margin:0;padding:.625rem .75rem;border:1px solid color-mix(in srgb,var(--color-warning-text) 30%,transparent);border-radius:var(--gbt-radius-tile, 4px);background:var(--color-warning-bg);color:var(--color-warning-text);font-size:.875rem;line-height:1.25rem}.gbt-totp-qr__label{margin:0 0 .375rem;color:var(--text-secondary);font-size:.8125rem;font-weight:600}.gbt-totp-qr__secret ::ng-deep .gbt-copy-field__copy .gbt-button{position:relative}.gbt-totp-qr__secret ::ng-deep .gbt-copy-field__copy .gbt-button:after{content:\"\";position:absolute;inset:calc((var(--gbt-control-height-sm) - var(--gbt-control-height-lg)) / 2)}\n"]
332
+ }]
333
+ }],
334
+ ctorParameters: () => [],
335
+ propDecorators: {
336
+ otpauthUrl: [{
337
+ type: i0.Input,
338
+ args: [{
339
+ isSignal: true,
340
+ alias: "otpauthUrl",
341
+ required: true
342
+ }]
343
+ }],
344
+ secret: [{
345
+ type: i0.Input,
346
+ args: [{
347
+ isSignal: true,
348
+ alias: "secret",
349
+ required: true
350
+ }]
351
+ }],
352
+ labels: [{
353
+ type: i0.Input,
354
+ args: [{
355
+ isSignal: true,
356
+ alias: "labels",
357
+ required: false
358
+ }]
359
+ }]
360
+ }
361
+ });
362
+ const STEP_NUMBER = {
363
+ choice: 1,
364
+ scan: 2,
365
+ passkey: 2,
366
+ codes: 3
367
+ };
368
+ const STEP_COUNT = 3;
369
+ let nextId = 0;
370
+ var MfaEnrollment = class MfaEnrollment {
371
+ auth = inject(AUTH_PORT);
372
+ host = inject(ElementRef);
373
+ injector = inject(Injector);
374
+ mfaToken = input.required(...ngDevMode ? [{ debugName: "mfaToken" }] : /* istanbul ignore next */ []);
375
+ passkeysAvailable = input(false, {
376
+ ...ngDevMode ? { debugName: "passkeysAvailable" } : /* istanbul ignore next */ {},
377
+ transform: booleanAttribute
378
+ });
379
+ labels = input({}, ...ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []);
380
+ completed = output();
381
+ cancelled = output();
382
+ expired = output();
383
+ text = authLabels("mfaEnrollment", DEFAULT_MFA_ENROLLMENT_LABELS, this.labels);
384
+ stepCount = STEP_COUNT;
385
+ id = `gbt-mfa-enrollment-${nextId++}`;
386
+ step = signal("choice", ...ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []);
387
+ factor = signal("totp", ...ngDevMode ? [{ debugName: "factor" }] : /* istanbul ignore next */ []);
388
+ passkeyOffered = computed(() => this.passkeysAvailable() && this.browserHasPasskeys, ...ngDevMode ? [{ debugName: "passkeyOffered" }] : /* istanbul ignore next */ []);
389
+ passkeyName = signal("", ...ngDevMode ? [{ debugName: "passkeyName" }] : /* istanbul ignore next */ []);
390
+ errorVariant = signal("error", ...ngDevMode ? [{ debugName: "errorVariant" }] : /* istanbul ignore next */ []);
391
+ promptOpen = signal(false, ...ngDevMode ? [{ debugName: "promptOpen" }] : /* istanbul ignore next */ []);
392
+ stepNumber = computed(() => STEP_NUMBER[this.step()], ...ngDevMode ? [{ debugName: "stepNumber" }] : /* istanbul ignore next */ []);
393
+ secret = signal("", ...ngDevMode ? [{ debugName: "secret" }] : /* istanbul ignore next */ []);
394
+ otpauthUrl = signal("", ...ngDevMode ? [{ debugName: "otpauthUrl" }] : /* istanbul ignore next */ []);
395
+ code = signal("", ...ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []);
396
+ backupCodes = signal([], ...ngDevMode ? [{ debugName: "backupCodes" }] : /* istanbul ignore next */ []);
397
+ acknowledged = signal(false, ...ngDevMode ? [{ debugName: "acknowledged" }] : /* istanbul ignore next */ []);
398
+ error = signal("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
399
+ submitting = signal(false, ...ngDevMode ? [{ debugName: "submitting" }] : /* istanbul ignore next */ []);
400
+ sessionToken = null;
401
+ browserHasPasskeys = passkeysSupported();
402
+ ceremony = 0;
403
+ constructor() {
404
+ this.focus("heading");
405
+ effect((onCleanup) => {
406
+ if (this.step() === "codes" && !this.acknowledged()) {
407
+ const view = this.host.nativeElement.ownerDocument.defaultView;
408
+ const warn = (event) => {
409
+ event.preventDefault();
410
+ event.returnValue = "";
411
+ };
412
+ view?.addEventListener("beforeunload", warn);
413
+ onCleanup(() => view?.removeEventListener("beforeunload", warn));
414
+ }
415
+ });
416
+ }
417
+ begin() {
418
+ if (this.submitting()) return;
419
+ this.clearError();
420
+ this.submitting.set(true);
421
+ this.auth.enrollTotp(this.mfaToken()).subscribe({
422
+ next: ({ secret, otpauthUrl }) => {
423
+ this.submitting.set(false);
424
+ this.factor.set("totp");
425
+ this.secret.set(secret);
426
+ this.otpauthUrl.set(otpauthUrl);
427
+ this.goTo("scan");
428
+ },
429
+ error: (err) => {
430
+ this.submitting.set(false);
431
+ this.error.set(this.messageFor(err, this.text().startFailed));
432
+ this.focus("begin");
433
+ }
434
+ });
435
+ }
436
+ confirm() {
437
+ if (this.submitting()) return;
438
+ const code = this.code().replace(/\s+/g, "");
439
+ if (code === "") {
440
+ this.error.set(this.text().enterCode);
441
+ this.focus("field");
442
+ return;
443
+ }
444
+ this.clearError();
445
+ this.submitting.set(true);
446
+ this.auth.confirmTotp(this.mfaToken(), code).subscribe({
447
+ next: ({ token, backupCodes }) => {
448
+ this.submitting.set(false);
449
+ this.secret.set("");
450
+ this.otpauthUrl.set("");
451
+ this.code.set("");
452
+ this.enrolled(token, backupCodes);
453
+ },
454
+ error: (err) => {
455
+ this.submitting.set(false);
456
+ this.error.set(this.messageFor(err, this.text().activationFailed, this.text().wrongCode));
457
+ if (classifyMfaFailure(err) === "wrong-code") this.code.set("");
458
+ this.focus("field");
459
+ }
460
+ });
461
+ }
462
+ choosePasskey() {
463
+ this.clearError();
464
+ this.factor.set("passkey");
465
+ this.goTo("passkey");
466
+ }
467
+ createPasskey() {
468
+ if (this.submitting()) return;
469
+ const name = this.passkeyName().trim() || this.text().defaultPasskeyName;
470
+ const problem = passkeyNameProblem(name);
471
+ if (problem) {
472
+ this.fail(problem === "too-long" ? this.text().nameTooLong(PASSKEY_NAME_MAX) : this.text().nameControlCharacters, "field");
473
+ return;
474
+ }
475
+ const mfaToken = this.mfaToken();
476
+ this.clearError();
477
+ this.submitting.set(true);
478
+ const run = ++this.ceremony;
479
+ this.auth.startPasskeySetup(mfaToken).pipe(switchMap(({ challengeId, publicKey }) => {
480
+ if (run !== this.ceremony) return EMPTY;
481
+ this.promptOpen.set(true);
482
+ return from(createPasskeyCredential(publicKey)).pipe(switchMap((credential) => run === this.ceremony ? this.auth.finishPasskeySetup(mfaToken, challengeId, credential, name) : EMPTY));
483
+ })).subscribe({
484
+ next: ({ token, backupCodes }) => {
485
+ this.submitting.set(false);
486
+ this.promptOpen.set(false);
487
+ this.passkeyName.set("");
488
+ this.enrolled(token, backupCodes);
489
+ },
490
+ error: (err) => {
491
+ if (run !== this.ceremony) return;
492
+ this.submitting.set(false);
493
+ this.promptOpen.set(false);
494
+ this.passkeyFailed(err);
495
+ }
496
+ });
497
+ }
498
+ back() {
499
+ this.ceremony++;
500
+ this.submitting.set(false);
501
+ this.promptOpen.set(false);
502
+ if (this.step() !== "choice" && this.passkeyOffered()) {
503
+ this.clearError();
504
+ this.secret.set("");
505
+ this.otpauthUrl.set("");
506
+ this.code.set("");
507
+ this.goTo("choice");
508
+ return;
509
+ }
510
+ this.cancelled.emit();
511
+ }
512
+ enrolled(token, backupCodes) {
513
+ if (backupCodes.length === 0) {
514
+ this.completed.emit(token);
515
+ return;
516
+ }
517
+ this.sessionToken = token;
518
+ this.backupCodes.set(backupCodes);
519
+ this.goTo("codes");
520
+ }
521
+ finish() {
522
+ if (!this.acknowledged() || this.sessionToken === null) return;
523
+ this.completed.emit(this.sessionToken);
524
+ }
525
+ goTo(step) {
526
+ this.step.set(step);
527
+ this.focus("heading");
528
+ }
529
+ passkeyFailed(err) {
530
+ const text = this.text();
531
+ if (isAuthPortError(err)) {
532
+ if (err.status === 409) {
533
+ this.fail(text.alreadyRegistered, "button");
534
+ return;
535
+ }
536
+ switch (classifyMfaFailure(err)) {
537
+ case "expired":
538
+ this.expired.emit();
539
+ this.fail(text.loginExpired, "button");
540
+ return;
541
+ case "already-set-up":
542
+ this.expired.emit();
543
+ this.fail(text.alreadySetUp, "button");
544
+ return;
545
+ case "rate-limited":
546
+ this.fail(text.tooManyAttempts, "button");
547
+ return;
548
+ case "unavailable":
549
+ this.fail(text.passkeysUnavailable, "button");
550
+ return;
551
+ default:
552
+ this.fail(text.passkeyFailed, "button");
553
+ return;
554
+ }
555
+ }
556
+ switch (classifyPasskeyError(err)) {
557
+ case "cancelled":
558
+ this.fail(text.cancelled, "button", "info");
559
+ return;
560
+ case "already-registered":
561
+ this.fail(text.alreadyRegistered, "button");
562
+ return;
563
+ case "unsupported":
564
+ this.fail(text.browserUnsupported, "button");
565
+ return;
566
+ default: this.fail(text.passkeyFailed, "button");
567
+ }
568
+ }
569
+ clearError() {
570
+ this.error.set("");
571
+ this.errorVariant.set("error");
572
+ }
573
+ fail(message, target, variant = "error") {
574
+ this.errorVariant.set(variant);
575
+ this.error.set(message);
576
+ this.focus(target);
577
+ }
578
+ messageFor(err, generic, wrongCode) {
579
+ const text = this.text();
580
+ switch (classifyMfaFailure(err)) {
581
+ case "rate-limited": return text.tooManyAttempts;
582
+ case "expired":
583
+ this.expired.emit();
584
+ return text.loginExpired;
585
+ case "already-set-up":
586
+ this.expired.emit();
587
+ return text.alreadySetUp;
588
+ case "wrong-code": return wrongCode ?? generic;
589
+ default: return generic;
590
+ }
591
+ }
592
+ focus(target) {
593
+ focusAfterRender(this.host, this.injector, () => {
594
+ return {
595
+ heading: "h2",
596
+ field: this.step() === "passkey" ? `#${this.id}-passkey-name` : `#${this.id}-code`,
597
+ button: ".gbt-mfa-enrollment__primary button",
598
+ begin: ".gbt-mfa-enrollment__begin button"
599
+ }[target];
600
+ });
601
+ }
602
+ static ɵfac = i0.ɵɵngDeclareFactory({
603
+ minVersion: "12.0.0",
604
+ version: "22.2.0",
605
+ ngImport: i0,
606
+ type: MfaEnrollment,
607
+ deps: [],
608
+ target: i0.ɵɵFactoryTarget.Component
609
+ });
610
+ static ɵcmp = i0.ɵɵngDeclareComponent({
611
+ minVersion: "17.0.0",
612
+ version: "22.2.0",
613
+ type: MfaEnrollment,
614
+ isStandalone: true,
615
+ selector: "gbt-mfa-enrollment",
616
+ inputs: {
617
+ mfaToken: {
618
+ classPropertyName: "mfaToken",
619
+ publicName: "mfaToken",
620
+ isSignal: true,
621
+ isRequired: true,
622
+ transformFunction: null
623
+ },
624
+ passkeysAvailable: {
625
+ classPropertyName: "passkeysAvailable",
626
+ publicName: "passkeysAvailable",
627
+ isSignal: true,
628
+ isRequired: false,
629
+ transformFunction: null
630
+ },
631
+ labels: {
632
+ classPropertyName: "labels",
633
+ publicName: "labels",
634
+ isSignal: true,
635
+ isRequired: false,
636
+ transformFunction: null
637
+ }
638
+ },
639
+ outputs: {
640
+ completed: "completed",
641
+ cancelled: "cancelled",
642
+ expired: "expired"
643
+ },
644
+ ngImport: i0,
645
+ template: "<section class=\"gbt-mfa-enrollment\">\n <header class=\"gbt-mfa-enrollment__header\">\n <p class=\"gbt-mfa-enrollment__step\">{{ text().step(stepNumber(), stepCount) }}</p>\n @switch (step()) {\n @case ('choice') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().choiceHeading }}</h2>\n }\n @case ('scan') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().scanHeading }}</h2>\n }\n @case ('passkey') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().passkeyHeading }}</h2>\n }\n @case ('codes') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().codesHeading }}</h2>\n }\n }\n </header>\n\n @switch (step()) {\n @case ('choice') {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"off\">{{\n text().mandatory\n }}</gbt-alert>\n\n @if (passkeyOffered()) {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().choiceLead }}</p>\n\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n\n <div class=\"gbt-mfa-enrollment__options\">\n <gbt-card\n class=\"gbt-mfa-enrollment__option gbt-mfa-enrollment__option--recommended\"\n icon=\"key\"\n [heading]=\"text().passkeyOption\"\n [headingLevel]=\"3\"\n >\n <gbt-badge card-header-actions variant=\"info\">{{ text().recommended }}</gbt-badge>\n <p class=\"gbt-mfa-enrollment__option-text\">{{ text().passkeyOptionText }}</p>\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n size=\"large\"\n [text]=\"text().usePasskey\"\n [disabled]=\"submitting()\"\n (clicked)=\"choosePasskey()\"\n />\n </gbt-card>\n\n <gbt-card\n class=\"gbt-mfa-enrollment__option\"\n icon=\"smartphone\"\n [heading]=\"text().appOption\"\n [headingLevel]=\"3\"\n >\n <p class=\"gbt-mfa-enrollment__option-text\">{{ text().appOptionText }}</p>\n <gbt-button\n class=\"gbt-mfa-enrollment__begin\"\n block\n variant=\"secondary\"\n size=\"large\"\n [text]=\"text().useApp\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().preparing\"\n (clicked)=\"begin()\"\n />\n </gbt-card>\n </div>\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n } @else {\n <ol class=\"gbt-mfa-enrollment__todo\">\n <li>{{ text().todoInstall }}</li>\n <li>{{ text().todoScan }}</li>\n <li>{{ text().todoKeep }}</li>\n </ol>\n\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary gbt-mfa-enrollment__begin\"\n block\n size=\"large\"\n [text]=\"text().begin\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().preparing\"\n (clicked)=\"begin()\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n }\n }\n\n @case ('scan') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().scanLead }}</p>\n\n <form class=\"gbt-mfa-enrollment__form\" (ngSubmit)=\"confirm()\">\n <gbt-totp-qr [otpauthUrl]=\"otpauthUrl()\" [secret]=\"secret()\" />\n\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-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 <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().activate\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().verifying\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n </form>\n }\n\n @case ('passkey') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().passkeyLead }}</p>\n\n <form class=\"gbt-mfa-enrollment__form\" (ngSubmit)=\"createPasskey()\">\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n @if (promptOpen()) {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"polite\">{{\n text().promptOpen\n }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-passkey-name'\"\n name=\"passkeyName\"\n autocomplete=\"off\"\n [label]=\"text().passkeyNameLabel\"\n [placeholder]=\"text().defaultPasskeyName\"\n [ngModel]=\"passkeyName()\"\n (ngModelChange)=\"passkeyName.set($event)\"\n />\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().createPasskey\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().creating\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n (clicked)=\"back()\"\n />\n </div>\n </form>\n }\n\n @case ('codes') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().codesLead(factor()) }}</p>\n\n <gbt-backup-codes [codes]=\"backupCodes()\" [(acknowledged)]=\"acknowledged\" />\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n size=\"large\"\n [text]=\"text().continue\"\n [disabled]=\"!acknowledged()\"\n (clicked)=\"finish()\"\n />\n </div>\n }\n }\n</section>\n",
646
+ styles: [":host{display:block}.gbt-mfa-enrollment{display:flex;flex-direction:column;gap:1.25rem}.gbt-mfa-enrollment__header{text-align:center}.gbt-mfa-enrollment__step{margin:0 0 .25rem;color:var(--text-discret);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.gbt-mfa-enrollment__title{font-family:var(--gbt-font-display, var(--font-display));margin:0;color:var(--text-primary);font-size:1.0625rem;font-weight:600;line-height:1.4}.gbt-mfa-enrollment__title:focus{outline:none}.gbt-mfa-enrollment__lead{margin:0;color:var(--text-secondary);font-size:.875rem;line-height:1.5;text-align:center}.gbt-mfa-enrollment__todo{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;counter-reset:todo}.gbt-mfa-enrollment__todo li{position:relative;padding-left:2rem;color:var(--text-secondary);font-size:.875rem;line-height:1.5;counter-increment:todo}.gbt-mfa-enrollment__todo li:before{content:counter(todo);position:absolute;top:.0625rem;left:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:1.375rem;height:1.375rem;border-radius:50%;background:color-mix(in srgb,var(--primary) 14%,transparent);color:var(--primary);font-size:.75rem;font-weight:700}.gbt-mfa-enrollment__options{display:flex;flex-direction:column;gap:.75rem}.gbt-mfa-enrollment__option ::ng-deep .gbt-card{display:flex;flex-direction:column;gap:.5rem;padding:1rem;border:1px solid var(--border-color);box-shadow:none}.gbt-mfa-enrollment__option ::ng-deep .gbt-card__title{font-size:.9375rem}.gbt-mfa-enrollment__option--recommended ::ng-deep .gbt-card{border-color:color-mix(in srgb,var(--primary) 55%,var(--border-color));background:color-mix(in srgb,var(--primary) 5%,var(--bg-principal))}.gbt-mfa-enrollment__option-text{margin:0 0 .5rem;color:var(--text-secondary);font-size:.875rem;line-height:1.5}.gbt-mfa-enrollment__form{display:flex;flex-direction:column;gap:1.25rem}.gbt-mfa-enrollment__actions{display:flex;flex-direction:column;gap:.5rem;margin-top:.25rem}\n"],
647
+ dependencies: [
648
+ {
649
+ kind: "ngmodule",
650
+ type: FormsModule
651
+ },
652
+ {
653
+ kind: "directive",
654
+ type: i1.ɵNgNoValidate,
655
+ selector: "form:not([ngNoForm]):not([ngNativeValidate])"
656
+ },
657
+ {
658
+ kind: "directive",
659
+ type: i1.NgControlStatus,
660
+ selector: "[formControlName],[ngModel],[formControl]"
661
+ },
662
+ {
663
+ kind: "directive",
664
+ type: i1.NgControlStatusGroup,
665
+ selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"
666
+ },
667
+ {
668
+ kind: "directive",
669
+ type: i1.NgModel,
670
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
671
+ inputs: [
672
+ "name",
673
+ "disabled",
674
+ "ngModel",
675
+ "ngModelOptions"
676
+ ],
677
+ outputs: ["ngModelChange"],
678
+ exportAs: ["ngModel"]
679
+ },
680
+ {
681
+ kind: "directive",
682
+ type: i1.NgForm,
683
+ selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]",
684
+ inputs: ["ngFormOptions"],
685
+ outputs: ["ngSubmit"],
686
+ exportAs: ["ngForm"]
687
+ },
688
+ {
689
+ kind: "component",
690
+ type: Badge,
691
+ selector: "gbt-badge",
692
+ inputs: [
693
+ "variant",
694
+ "icon",
695
+ "appearance",
696
+ "size",
697
+ "truncate",
698
+ "tabularNums",
699
+ "mono",
700
+ "maxWidth",
701
+ "fullText",
702
+ "copyable",
703
+ "copyValue",
704
+ "copyLabel",
705
+ "copiedText",
706
+ "failedText",
707
+ "feedbackMs",
708
+ "value",
709
+ "max",
710
+ "hideZero",
711
+ "label"
712
+ ],
713
+ outputs: ["copied", "copyFailed"]
714
+ },
715
+ {
716
+ kind: "component",
717
+ type: Button,
718
+ selector: "gbt-button, a[gbtButton]",
719
+ inputs: [
720
+ "variant",
721
+ "size",
722
+ "type",
723
+ "text",
724
+ "iconName",
725
+ "ariaLabel",
726
+ "loading",
727
+ "loadingLabel",
728
+ "disabled",
729
+ "pressed",
730
+ "ariaExpanded",
731
+ "ariaControls",
732
+ "ariaHaspopup",
733
+ "block",
734
+ "iconOnly"
735
+ ],
736
+ outputs: ["clicked"]
737
+ },
738
+ {
739
+ kind: "component",
740
+ type: Card,
741
+ selector: "gbt-card",
742
+ inputs: [
743
+ "hoverable",
744
+ "heading",
745
+ "icon",
746
+ "headingLevel",
747
+ "variant",
748
+ "description",
749
+ "count",
750
+ "flush",
751
+ "tone",
752
+ "selected",
753
+ "selectedLabel",
754
+ "href",
755
+ "linkLabel"
756
+ ]
757
+ },
758
+ {
759
+ kind: "component",
760
+ type: GbtInput,
761
+ selector: "gbt-input",
762
+ inputs: [
763
+ "id",
764
+ "label",
765
+ "type",
766
+ "required",
767
+ "disabled",
768
+ "placeholder",
769
+ "errorMessage",
770
+ "autocomplete",
771
+ "hint",
772
+ "hideLabel",
773
+ "size",
774
+ "mono",
775
+ "leadingIcon",
776
+ "inputmode",
777
+ "spellcheck",
778
+ "autocapitalize",
779
+ "enterkeyhint",
780
+ "maxlength",
781
+ "min",
782
+ "max",
783
+ "combobox",
784
+ "showPasswordLabel",
785
+ "hidePasswordLabel"
786
+ ],
787
+ outputs: ["committed"]
788
+ },
789
+ {
790
+ kind: "component",
791
+ type: Alert,
792
+ selector: "gbt-alert",
793
+ inputs: [
794
+ "variant",
795
+ "dismissible",
796
+ "closeLabel",
797
+ "live",
798
+ "heading",
799
+ "size",
800
+ "appearance",
801
+ "iconAlign"
802
+ ],
803
+ outputs: ["dismissed"]
804
+ },
805
+ {
806
+ kind: "component",
807
+ type: TotpQr,
808
+ selector: "gbt-totp-qr",
809
+ inputs: [
810
+ "otpauthUrl",
811
+ "secret",
812
+ "labels"
813
+ ]
814
+ },
815
+ {
816
+ kind: "component",
817
+ type: BackupCodes,
818
+ selector: "gbt-backup-codes",
819
+ inputs: [
820
+ "codes",
821
+ "acknowledged",
822
+ "labels"
823
+ ],
824
+ outputs: ["acknowledgedChange"]
825
+ }
826
+ ],
827
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
828
+ });
829
+ };
830
+ i0.ɵɵngDeclareClassMetadata({
831
+ minVersion: "12.0.0",
832
+ version: "22.2.0",
833
+ ngImport: i0,
834
+ type: MfaEnrollment,
835
+ decorators: [{
836
+ type: Component,
837
+ args: [{
838
+ selector: "gbt-mfa-enrollment",
839
+ standalone: true,
840
+ imports: [
841
+ FormsModule,
842
+ Badge,
843
+ Button,
844
+ Card,
845
+ GbtInput,
846
+ Alert,
847
+ TotpQr,
848
+ BackupCodes
849
+ ],
850
+ changeDetection: ChangeDetectionStrategy.OnPush,
851
+ template: "<section class=\"gbt-mfa-enrollment\">\n <header class=\"gbt-mfa-enrollment__header\">\n <p class=\"gbt-mfa-enrollment__step\">{{ text().step(stepNumber(), stepCount) }}</p>\n @switch (step()) {\n @case ('choice') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().choiceHeading }}</h2>\n }\n @case ('scan') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().scanHeading }}</h2>\n }\n @case ('passkey') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().passkeyHeading }}</h2>\n }\n @case ('codes') {\n <h2 class=\"gbt-mfa-enrollment__title\" tabindex=\"-1\">{{ text().codesHeading }}</h2>\n }\n }\n </header>\n\n @switch (step()) {\n @case ('choice') {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"off\">{{\n text().mandatory\n }}</gbt-alert>\n\n @if (passkeyOffered()) {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().choiceLead }}</p>\n\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n\n <div class=\"gbt-mfa-enrollment__options\">\n <gbt-card\n class=\"gbt-mfa-enrollment__option gbt-mfa-enrollment__option--recommended\"\n icon=\"key\"\n [heading]=\"text().passkeyOption\"\n [headingLevel]=\"3\"\n >\n <gbt-badge card-header-actions variant=\"info\">{{ text().recommended }}</gbt-badge>\n <p class=\"gbt-mfa-enrollment__option-text\">{{ text().passkeyOptionText }}</p>\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n size=\"large\"\n [text]=\"text().usePasskey\"\n [disabled]=\"submitting()\"\n (clicked)=\"choosePasskey()\"\n />\n </gbt-card>\n\n <gbt-card\n class=\"gbt-mfa-enrollment__option\"\n icon=\"smartphone\"\n [heading]=\"text().appOption\"\n [headingLevel]=\"3\"\n >\n <p class=\"gbt-mfa-enrollment__option-text\">{{ text().appOptionText }}</p>\n <gbt-button\n class=\"gbt-mfa-enrollment__begin\"\n block\n variant=\"secondary\"\n size=\"large\"\n [text]=\"text().useApp\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().preparing\"\n (clicked)=\"begin()\"\n />\n </gbt-card>\n </div>\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n } @else {\n <ol class=\"gbt-mfa-enrollment__todo\">\n <li>{{ text().todoInstall }}</li>\n <li>{{ text().todoScan }}</li>\n <li>{{ text().todoKeep }}</li>\n </ol>\n\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary gbt-mfa-enrollment__begin\"\n block\n size=\"large\"\n [text]=\"text().begin\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().preparing\"\n (clicked)=\"begin()\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n }\n }\n\n @case ('scan') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().scanLead }}</p>\n\n <form class=\"gbt-mfa-enrollment__form\" (ngSubmit)=\"confirm()\">\n <gbt-totp-qr [otpauthUrl]=\"otpauthUrl()\" [secret]=\"secret()\" />\n\n @if (error()) {\n <gbt-alert variant=\"error\" appearance=\"subtle\" iconAlign=\"start\">{{ error() }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-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 <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().activate\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().verifying\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n [disabled]=\"submitting()\"\n (clicked)=\"back()\"\n />\n </div>\n </form>\n }\n\n @case ('passkey') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().passkeyLead }}</p>\n\n <form class=\"gbt-mfa-enrollment__form\" (ngSubmit)=\"createPasskey()\">\n @if (error()) {\n <gbt-alert [variant]=\"errorVariant()\" appearance=\"subtle\" iconAlign=\"start\">{{\n error()\n }}</gbt-alert>\n }\n @if (promptOpen()) {\n <gbt-alert variant=\"info\" appearance=\"subtle\" iconAlign=\"start\" live=\"polite\">{{\n text().promptOpen\n }}</gbt-alert>\n }\n\n <gbt-input\n [id]=\"id + '-passkey-name'\"\n name=\"passkeyName\"\n autocomplete=\"off\"\n [label]=\"text().passkeyNameLabel\"\n [placeholder]=\"text().defaultPasskeyName\"\n [ngModel]=\"passkeyName()\"\n (ngModelChange)=\"passkeyName.set($event)\"\n />\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n type=\"submit\"\n size=\"large\"\n [text]=\"text().createPasskey\"\n [loading]=\"submitting()\"\n [loadingLabel]=\"text().creating\"\n />\n <gbt-button\n block\n size=\"large\"\n variant=\"secondary\"\n [text]=\"text().back\"\n (clicked)=\"back()\"\n />\n </div>\n </form>\n }\n\n @case ('codes') {\n <p class=\"gbt-mfa-enrollment__lead\">{{ text().codesLead(factor()) }}</p>\n\n <gbt-backup-codes [codes]=\"backupCodes()\" [(acknowledged)]=\"acknowledged\" />\n\n <div class=\"gbt-mfa-enrollment__actions\">\n <gbt-button\n class=\"gbt-mfa-enrollment__primary\"\n block\n size=\"large\"\n [text]=\"text().continue\"\n [disabled]=\"!acknowledged()\"\n (clicked)=\"finish()\"\n />\n </div>\n }\n }\n</section>\n",
852
+ styles: [":host{display:block}.gbt-mfa-enrollment{display:flex;flex-direction:column;gap:1.25rem}.gbt-mfa-enrollment__header{text-align:center}.gbt-mfa-enrollment__step{margin:0 0 .25rem;color:var(--text-discret);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.gbt-mfa-enrollment__title{font-family:var(--gbt-font-display, var(--font-display));margin:0;color:var(--text-primary);font-size:1.0625rem;font-weight:600;line-height:1.4}.gbt-mfa-enrollment__title:focus{outline:none}.gbt-mfa-enrollment__lead{margin:0;color:var(--text-secondary);font-size:.875rem;line-height:1.5;text-align:center}.gbt-mfa-enrollment__todo{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;counter-reset:todo}.gbt-mfa-enrollment__todo li{position:relative;padding-left:2rem;color:var(--text-secondary);font-size:.875rem;line-height:1.5;counter-increment:todo}.gbt-mfa-enrollment__todo li:before{content:counter(todo);position:absolute;top:.0625rem;left:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:1.375rem;height:1.375rem;border-radius:50%;background:color-mix(in srgb,var(--primary) 14%,transparent);color:var(--primary);font-size:.75rem;font-weight:700}.gbt-mfa-enrollment__options{display:flex;flex-direction:column;gap:.75rem}.gbt-mfa-enrollment__option ::ng-deep .gbt-card{display:flex;flex-direction:column;gap:.5rem;padding:1rem;border:1px solid var(--border-color);box-shadow:none}.gbt-mfa-enrollment__option ::ng-deep .gbt-card__title{font-size:.9375rem}.gbt-mfa-enrollment__option--recommended ::ng-deep .gbt-card{border-color:color-mix(in srgb,var(--primary) 55%,var(--border-color));background:color-mix(in srgb,var(--primary) 5%,var(--bg-principal))}.gbt-mfa-enrollment__option-text{margin:0 0 .5rem;color:var(--text-secondary);font-size:.875rem;line-height:1.5}.gbt-mfa-enrollment__form{display:flex;flex-direction:column;gap:1.25rem}.gbt-mfa-enrollment__actions{display:flex;flex-direction:column;gap:.5rem;margin-top:.25rem}\n"]
853
+ }]
854
+ }],
855
+ ctorParameters: () => [],
856
+ propDecorators: {
857
+ mfaToken: [{
858
+ type: i0.Input,
859
+ args: [{
860
+ isSignal: true,
861
+ alias: "mfaToken",
862
+ required: true
863
+ }]
864
+ }],
865
+ passkeysAvailable: [{
866
+ type: i0.Input,
867
+ args: [{
868
+ isSignal: true,
869
+ alias: "passkeysAvailable",
870
+ required: false
871
+ }]
872
+ }],
873
+ labels: [{
874
+ type: i0.Input,
875
+ args: [{
876
+ isSignal: true,
877
+ alias: "labels",
878
+ required: false
879
+ }]
880
+ }],
881
+ completed: [{
882
+ type: i0.Output,
883
+ args: ["completed"]
884
+ }],
885
+ cancelled: [{
886
+ type: i0.Output,
887
+ args: ["cancelled"]
888
+ }],
889
+ expired: [{
890
+ type: i0.Output,
891
+ args: ["expired"]
892
+ }]
893
+ }
894
+ });
895
+ export { BackupCodes, MfaEnrollment, TOTP_QR_RENDERER, TotpQr };
896
+
897
+ //# sourceMappingURL=masmarino-gabarit-mfa-enrollment.mjs.map