@ory/elements-react 0.0.0-pr.2c76cc9 → 0.0.0-pr.2e82b68

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.
package/dist/index.mjs CHANGED
@@ -187,26 +187,32 @@ function nodesToAuthMethodGroups(nodes, excludeAuthMethods = []) {
187
187
  ].includes(group)
188
188
  );
189
189
  }
190
- function useNodesGroups(nodes) {
190
+ function useNodesGroups(nodes, { omit } = {}) {
191
191
  const groupSorter = useGroupSorter();
192
192
  const groups = useMemo(() => {
193
- var _a;
193
+ var _a, _b;
194
194
  const groups2 = {};
195
+ const groupRetained = {};
195
196
  for (const node of nodes) {
196
- if (isUiNodeScriptAttributes(node.attributes)) {
197
- continue;
198
- }
199
- if (isUiNodeInputAttributes(node.attributes)) {
200
- if (node.attributes.type === "hidden") {
201
- continue;
202
- }
203
- }
204
197
  const groupNodes = (_a = groups2[node.group]) != null ? _a : [];
205
198
  groupNodes.push(node);
206
199
  groups2[node.group] = groupNodes;
200
+ if ((omit == null ? void 0 : omit.includes("script")) && isUiNodeScriptAttributes(node.attributes)) {
201
+ continue;
202
+ }
203
+ if ((omit == null ? void 0 : omit.includes("input_hidden")) && isUiNodeInputAttributes(node.attributes) && node.attributes.type === "hidden") {
204
+ continue;
205
+ }
206
+ groupRetained[node.group] = ((_b = groupRetained[node.group]) != null ? _b : 0) + 1;
207
+ }
208
+ const finalGroups = {};
209
+ for (const [group, count] of Object.entries(groupRetained)) {
210
+ if (count > 0) {
211
+ finalGroups[group] = groups2[group];
212
+ }
207
213
  }
208
- return groups2;
209
- }, [nodes]);
214
+ return finalGroups;
215
+ }, [nodes, omit]);
210
216
  const entries = useMemo(
211
217
  () => Object.entries(groups).sort(([a], [b]) => groupSorter(a, b)),
212
218
  [groups, groupSorter]
@@ -873,7 +879,11 @@ function useOryFormSubmit(onAfterSubmit) {
873
879
  };
874
880
  return onSubmit;
875
881
  }
876
- function OryForm({ children, onAfterSubmit }) {
882
+ function OryForm({
883
+ children,
884
+ onAfterSubmit,
885
+ "data-testid": dataTestId
886
+ }) {
877
887
  const { Form } = useComponents();
878
888
  const flowContainer = useOryFlow();
879
889
  const methods = useFormContext();
@@ -882,6 +892,9 @@ function OryForm({ children, onAfterSubmit }) {
882
892
  const onSubmit = useOryFormSubmit(onAfterSubmit);
883
893
  const hasMethods = flowContainer.flow.ui.nodes.some((node) => {
884
894
  if (isUiNodeInputAttributes(node.attributes)) {
895
+ if (node.attributes.type === "hidden") {
896
+ return false;
897
+ }
885
898
  return node.attributes.name !== "csrf_token";
886
899
  } else if (isUiNodeAnchorAttributes(node.attributes)) {
887
900
  return true;
@@ -901,10 +914,7 @@ function OryForm({ children, onAfterSubmit }) {
901
914
  }),
902
915
  type: "error"
903
916
  };
904
- return /* @__PURE__ */ jsxs(Fragment, { children: [
905
- /* @__PURE__ */ jsx(Message.Root, { children: /* @__PURE__ */ jsx(Message.Content, { message: m }, m.id) }),
906
- /* @__PURE__ */ jsx(OryCardFooter, {})
907
- ] });
917
+ return /* @__PURE__ */ jsx("div", { "data-testid": dataTestId, children: /* @__PURE__ */ jsx(Message.Root, { children: /* @__PURE__ */ jsx(Message.Content, { message: m }, m.id) }) });
908
918
  }
909
919
  if (flowContainer.flowType === FlowType.Login && flowContainer.formState.current === "method_active" && flowContainer.formState.method === "code") {
910
920
  methods.setValue("method", "code");
@@ -912,6 +922,7 @@ function OryForm({ children, onAfterSubmit }) {
912
922
  return /* @__PURE__ */ jsx(
913
923
  Form.Root,
914
924
  {
925
+ "data-testid": dataTestId,
915
926
  action: flowContainer.flow.ui.action,
916
927
  method: flowContainer.flow.ui.method,
917
928
  onSubmit: (e) => void methods.handleSubmit(onSubmit)(e),
@@ -959,10 +970,7 @@ var NodeInput = ({
959
970
  const isResendNode = ((_a = node.meta.label) == null ? void 0 : _a.id) === 1070008;
960
971
  const isScreenSelectionNode = "name" in node.attributes && node.attributes.name === "screen";
961
972
  const setFormValue = () => {
962
- if (isResendNode || isScreenSelectionNode || node.group === UiNodeGroupEnum.Oauth2Consent) {
963
- return;
964
- }
965
- if (attrs.value !== void 0) {
973
+ if (attrs.value && !(isResendNode || isScreenSelectionNode || node.group === UiNodeGroupEnum.Oauth2Consent)) {
966
974
  setValue(attrs.name, attrs.value);
967
975
  }
968
976
  };
@@ -1132,23 +1140,27 @@ function OryFormSocialButtonsForm() {
1132
1140
  if (filteredNodes.length === 0) {
1133
1141
  return null;
1134
1142
  }
1135
- return /* @__PURE__ */ jsx(OryFormProvider, { children: /* @__PURE__ */ jsx(OryForm, { children: /* @__PURE__ */ jsx(OryFormOidcButtons, {}) }) });
1143
+ return /* @__PURE__ */ jsx(OryFormProvider, { children: /* @__PURE__ */ jsx(OryForm, { "data-testid": `ory/form/methods/oidc-saml`, children: /* @__PURE__ */ jsx(OryFormOidcButtons, {}) }) });
1136
1144
  }
1137
1145
  function isUINodeGroupEnum(method) {
1138
1146
  return Object.values(UiNodeGroupEnum).includes(method);
1139
1147
  }
1140
1148
  function OryTwoStepCard() {
1141
1149
  var _a, _b, _c, _d;
1142
- const { Form, Card } = useComponents();
1150
+ const { Form, Card, Message } = useComponents();
1143
1151
  const { flow, flowType, formState, dispatchFormState } = useOryFlow();
1144
1152
  const { ui } = flow;
1153
+ const intl = useIntl();
1145
1154
  const nodeSorter = useNodeSorter();
1146
1155
  const sortNodes = (a, b) => nodeSorter(a, b, { flowType });
1147
- const uniqueGroups = useNodesGroups(ui.nodes);
1148
- const options = Object.fromEntries(
1156
+ const groupsToShow = useNodesGroups(ui.nodes, {
1157
+ // We only want to render groups that have visible elements.
1158
+ omit: ["script", "input_hidden"]
1159
+ });
1160
+ const authMethodBlocks = Object.fromEntries(
1149
1161
  Object.values(UiNodeGroupEnum).filter((group) => {
1150
1162
  var _a2;
1151
- return (_a2 = uniqueGroups.groups[group]) == null ? void 0 : _a2.length;
1163
+ return (_a2 = groupsToShow.groups[group]) == null ? void 0 : _a2.length;
1152
1164
  }).filter(
1153
1165
  (group) => ![
1154
1166
  UiNodeGroupEnum.Oidc,
@@ -1160,7 +1172,17 @@ function OryTwoStepCard() {
1160
1172
  ].includes(group)
1161
1173
  ).map((g) => [g, {}])
1162
1174
  );
1163
- if (UiNodeGroupEnum.Code in options) {
1175
+ const authMethodAdditionalNodes = ui.nodes.filter(
1176
+ ({ group }) => [
1177
+ UiNodeGroupEnum.Oidc,
1178
+ UiNodeGroupEnum.Saml,
1179
+ UiNodeGroupEnum.Default,
1180
+ UiNodeGroupEnum.IdentifierFirst,
1181
+ UiNodeGroupEnum.Profile,
1182
+ UiNodeGroupEnum.Captcha
1183
+ ].includes(group)
1184
+ );
1185
+ if (UiNodeGroupEnum.Code in authMethodBlocks) {
1164
1186
  let identifier = (_b = (_a = findNode(ui.nodes, {
1165
1187
  group: "identifier_first",
1166
1188
  node_type: "input",
@@ -1172,7 +1194,7 @@ function OryTwoStepCard() {
1172
1194
  name: "address"
1173
1195
  })) == null ? void 0 : _c.attributes) == null ? void 0 : _d.value);
1174
1196
  if (identifier) {
1175
- options[UiNodeGroupEnum.Code] = {
1197
+ authMethodBlocks[UiNodeGroupEnum.Code] = {
1176
1198
  title: {
1177
1199
  id: "identities.messages.1010023",
1178
1200
  values: { address: identifier }
@@ -1181,7 +1203,7 @@ function OryTwoStepCard() {
1181
1203
  }
1182
1204
  }
1183
1205
  const nonSsoNodes = removeSsoNodes(ui.nodes);
1184
- const finalNodes = formState.current === "method_active" ? getFinalNodes(uniqueGroups.groups, formState.method) : [];
1206
+ const finalNodes = formState.current === "method_active" ? getFinalNodes(groupsToShow.groups, formState.method) : [];
1185
1207
  const handleAfterFormSubmit = (method) => {
1186
1208
  if (typeof method !== "string" || !isUINodeGroupEnum(method)) {
1187
1209
  return;
@@ -1197,48 +1219,99 @@ function OryTwoStepCard() {
1197
1219
  (node) => node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml
1198
1220
  );
1199
1221
  const showSso = !(formState.current === "method_active" && !(formState.method === UiNodeGroupEnum.Oidc || formState.method === UiNodeGroupEnum.Saml));
1200
- const showSsoDivider = hasSso && nonSsoNodes.filter((n) => {
1222
+ const showSsoDivider = hasSso && nonSsoNodes.some((n) => {
1201
1223
  if (isUiNodeInputAttributes(n.attributes)) {
1202
1224
  return n.attributes.type !== UiNodeInputAttributesTypeEnum.Hidden;
1203
1225
  } else if (isUiNodeScriptAttributes(n.attributes)) {
1204
1226
  return false;
1205
1227
  }
1206
1228
  return true;
1207
- }).length > 0;
1208
- const captchaNodes = ui.nodes.filter(
1209
- (n) => n.group === UiNodeGroupEnum.Captcha
1210
- );
1211
- return /* @__PURE__ */ jsxs(OryCard, { children: [
1212
- /* @__PURE__ */ jsx(OryCardHeader, {}),
1213
- /* @__PURE__ */ jsxs(OryCardContent, { children: [
1214
- /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1215
- showSso && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1216
- /* @__PURE__ */ jsxs(OryForm, { onAfterSubmit: handleAfterFormSubmit, children: [
1217
- formState.current === "provide_identifier" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1218
- showSsoDivider && /* @__PURE__ */ jsx(Card.Divider, {}),
1219
- nonSsoNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1229
+ });
1230
+ const noMethods = {
1231
+ id: 5000002,
1232
+ text: intl.formatMessage({
1233
+ id: `identities.messages.${5000002}`,
1234
+ defaultMessage: "No authentication methods are available for this request. Please contact the site or app owner."
1235
+ }),
1236
+ type: "error"
1237
+ };
1238
+ switch (formState.current) {
1239
+ case "provide_identifier":
1240
+ return /* @__PURE__ */ jsxs(OryCard, { children: [
1241
+ /* @__PURE__ */ jsx(OryCardHeader, {}),
1242
+ /* @__PURE__ */ jsxs(OryCardContent, { children: [
1243
+ /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1244
+ showSso && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1245
+ /* @__PURE__ */ jsx(
1246
+ OryForm,
1247
+ {
1248
+ "data-testid": `ory/form/methods/local`,
1249
+ onAfterSubmit: handleAfterFormSubmit,
1250
+ children: /* @__PURE__ */ jsxs(Form.Group, { children: [
1251
+ showSsoDivider && /* @__PURE__ */ jsx(Card.Divider, {}),
1252
+ nonSsoNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1253
+ ] })
1254
+ }
1255
+ )
1220
1256
  ] }),
1221
- formState.current === "select_method" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1222
- Object.entries(options).length > 0 && /* @__PURE__ */ jsx(Card.Divider, {}),
1223
- Object.entries(options).length > 0 && /* @__PURE__ */ jsx(
1224
- AuthMethodList,
1257
+ /* @__PURE__ */ jsx(OryCardFooter, {})
1258
+ ] });
1259
+ case "select_method":
1260
+ return /* @__PURE__ */ jsxs(OryCard, { children: [
1261
+ /* @__PURE__ */ jsx(OryCardHeader, {}),
1262
+ /* @__PURE__ */ jsxs(OryCardContent, { children: [
1263
+ /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1264
+ showSso && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1265
+ Object.entries(authMethodBlocks).length > 0 ? /* @__PURE__ */ jsx(
1266
+ OryForm,
1225
1267
  {
1226
- options,
1227
- setSelectedGroup: (group) => dispatchFormState({
1228
- type: "action_select_method",
1229
- method: group
1230
- })
1268
+ "data-testid": `ory/form/methods/local`,
1269
+ onAfterSubmit: handleAfterFormSubmit,
1270
+ children: /* @__PURE__ */ jsxs(Form.Group, { children: [
1271
+ /* @__PURE__ */ jsx(Card.Divider, {}),
1272
+ /* @__PURE__ */ jsx(
1273
+ AuthMethodList,
1274
+ {
1275
+ options: authMethodBlocks,
1276
+ setSelectedGroup: (group) => dispatchFormState({
1277
+ type: "action_select_method",
1278
+ method: group
1279
+ })
1280
+ }
1281
+ ),
1282
+ authMethodAdditionalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1283
+ ] })
1231
1284
  }
1232
- ),
1233
- captchaNodes.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1285
+ ) : /* @__PURE__ */ jsx("div", { "data-testid": `ory/form/methods/local`, children: /* @__PURE__ */ jsx(Message.Root, { children: /* @__PURE__ */ jsx(Message.Content, { message: noMethods }, noMethods.id) }) })
1234
1286
  ] }),
1235
- formState.current === "method_active" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1236
- ui.nodes.filter((n) => n.type === "script").map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1237
- finalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1287
+ /* @__PURE__ */ jsx(OryCardFooter, {})
1288
+ ] });
1289
+ case "method_active":
1290
+ return /* @__PURE__ */ jsxs(OryCard, { children: [
1291
+ /* @__PURE__ */ jsx(OryCardHeader, {}),
1292
+ /* @__PURE__ */ jsxs(OryCardContent, { children: [
1293
+ /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1294
+ showSso && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1295
+ /* @__PURE__ */ jsx(
1296
+ OryForm,
1297
+ {
1298
+ "data-testid": `ory/form/methods/local`,
1299
+ onAfterSubmit: handleAfterFormSubmit,
1300
+ children: /* @__PURE__ */ jsxs(Form.Group, { children: [
1301
+ ui.nodes.filter(
1302
+ (n) => isUiNodeScriptAttributes(n.attributes) || n.group === UiNodeGroupEnum.Captcha || n.group === UiNodeGroupEnum.Default || n.group === UiNodeGroupEnum.Profile
1303
+ ).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1304
+ finalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1305
+ ] })
1306
+ }
1307
+ )
1238
1308
  ] }),
1239
1309
  /* @__PURE__ */ jsx(OryCardFooter, {})
1240
- ] })
1241
- ] })
1310
+ ] });
1311
+ }
1312
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1313
+ "unknown form state: ",
1314
+ formState.current
1242
1315
  ] });
1243
1316
  }
1244
1317
  function AuthMethodList({ options, setSelectedGroup }) {
@@ -1672,16 +1745,19 @@ function SettingsSectionContent({ group, nodes }) {
1672
1745
  const { Card } = useComponents();
1673
1746
  const intl = useIntl();
1674
1747
  const { flow } = useOryFlow();
1675
- const uniqueGroups = useNodesGroups(flow.ui.nodes);
1748
+ const groupedNodes = useNodesGroups(flow.ui.nodes, {
1749
+ // Script nodes are already handled by the parent component.
1750
+ omit: ["script"]
1751
+ });
1676
1752
  if (group === UiNodeGroupEnum.Totp) {
1677
1753
  return /* @__PURE__ */ jsxs(
1678
1754
  OryFormSection,
1679
1755
  {
1680
- nodes: uniqueGroups.groups.totp,
1756
+ nodes: groupedNodes.groups.totp,
1681
1757
  "data-testid": "ory/screen/settings/group/totp",
1682
1758
  children: [
1683
- /* @__PURE__ */ jsx(OrySettingsTotp, { nodes: (_a = uniqueGroups.groups.totp) != null ? _a : [] }),
1684
- (_b = uniqueGroups.groups.default) == null ? void 0 : _b.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1759
+ /* @__PURE__ */ jsx(OrySettingsTotp, { nodes: (_a = groupedNodes.groups.totp) != null ? _a : [] }),
1760
+ (_b = groupedNodes.groups.default) == null ? void 0 : _b.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1685
1761
  ]
1686
1762
  }
1687
1763
  );
@@ -1690,16 +1766,16 @@ function SettingsSectionContent({ group, nodes }) {
1690
1766
  return /* @__PURE__ */ jsxs(
1691
1767
  OryFormSection,
1692
1768
  {
1693
- nodes: uniqueGroups.groups.lookup_secret,
1769
+ nodes: groupedNodes.groups.lookup_secret,
1694
1770
  "data-testid": "ory/screen/settings/group/lookup_secret",
1695
1771
  children: [
1696
1772
  /* @__PURE__ */ jsx(
1697
1773
  OrySettingsRecoveryCodes,
1698
1774
  {
1699
- nodes: (_c = uniqueGroups.groups.lookup_secret) != null ? _c : []
1775
+ nodes: (_c = groupedNodes.groups.lookup_secret) != null ? _c : []
1700
1776
  }
1701
1777
  ),
1702
- (_d = uniqueGroups.groups.default) == null ? void 0 : _d.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1778
+ (_d = groupedNodes.groups.default) == null ? void 0 : _d.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1703
1779
  ]
1704
1780
  }
1705
1781
  );
@@ -1708,11 +1784,11 @@ function SettingsSectionContent({ group, nodes }) {
1708
1784
  return /* @__PURE__ */ jsxs(
1709
1785
  OryFormSection,
1710
1786
  {
1711
- nodes: uniqueGroups.groups.oidc,
1787
+ nodes: groupedNodes.groups.oidc,
1712
1788
  "data-testid": "ory/screen/settings/group/oidc",
1713
1789
  children: [
1714
- /* @__PURE__ */ jsx(OrySettingsOidc, { nodes: (_e = uniqueGroups.groups.oidc) != null ? _e : [] }),
1715
- (_f = uniqueGroups.groups.default) == null ? void 0 : _f.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1790
+ /* @__PURE__ */ jsx(OrySettingsOidc, { nodes: (_e = groupedNodes.groups.oidc) != null ? _e : [] }),
1791
+ (_f = groupedNodes.groups.default) == null ? void 0 : _f.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1716
1792
  ]
1717
1793
  }
1718
1794
  );
@@ -1721,11 +1797,11 @@ function SettingsSectionContent({ group, nodes }) {
1721
1797
  return /* @__PURE__ */ jsxs(
1722
1798
  OryFormSection,
1723
1799
  {
1724
- nodes: uniqueGroups.groups.webauthn,
1800
+ nodes: groupedNodes.groups.webauthn,
1725
1801
  "data-testid": "ory/screen/settings/group/webauthn",
1726
1802
  children: [
1727
- /* @__PURE__ */ jsx(OrySettingsWebauthn, { nodes: (_g = uniqueGroups.groups.webauthn) != null ? _g : [] }),
1728
- (_h = uniqueGroups.groups.default) == null ? void 0 : _h.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1803
+ /* @__PURE__ */ jsx(OrySettingsWebauthn, { nodes: (_g = groupedNodes.groups.webauthn) != null ? _g : [] }),
1804
+ (_h = groupedNodes.groups.default) == null ? void 0 : _h.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1729
1805
  ]
1730
1806
  }
1731
1807
  );
@@ -1734,11 +1810,11 @@ function SettingsSectionContent({ group, nodes }) {
1734
1810
  return /* @__PURE__ */ jsxs(
1735
1811
  OryFormSection,
1736
1812
  {
1737
- nodes: uniqueGroups.groups.passkey,
1813
+ nodes: groupedNodes.groups.passkey,
1738
1814
  "data-testid": "ory/screen/settings/group/passkey",
1739
1815
  children: [
1740
- /* @__PURE__ */ jsx(OrySettingsPasskey, { nodes: (_i = uniqueGroups.groups.passkey) != null ? _i : [] }),
1741
- (_j = uniqueGroups.groups.default) == null ? void 0 : _j.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1816
+ /* @__PURE__ */ jsx(OrySettingsPasskey, { nodes: (_i = groupedNodes.groups.passkey) != null ? _i : [] }),
1817
+ (_j = groupedNodes.groups.default) == null ? void 0 : _j.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1742
1818
  ]
1743
1819
  }
1744
1820
  );
@@ -1759,7 +1835,7 @@ function SettingsSectionContent({ group, nodes }) {
1759
1835
  id: `settings.${group}.description`
1760
1836
  }),
1761
1837
  children: [
1762
- (_k = uniqueGroups.groups.default) == null ? void 0 : _k.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1838
+ (_k = groupedNodes.groups.default) == null ? void 0 : _k.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1763
1839
  nodes.filter(
1764
1840
  (node) => "type" in node.attributes && node.attributes.type !== "submit"
1765
1841
  ).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
@@ -1773,16 +1849,16 @@ function SettingsSectionContent({ group, nodes }) {
1773
1849
  }
1774
1850
  );
1775
1851
  }
1776
- var getScriptNode = (nodes) => nodes.find(
1777
- (node) => "id" in node.attributes && node.attributes.id === "webauthn_script"
1852
+ var onlyScriptNodes = (nodes) => nodes.filter(
1853
+ (node) => isUiNodeScriptAttributes(node.attributes) && node.attributes.id === "webauthn_script"
1778
1854
  );
1779
1855
  function OrySettingsCard() {
1780
1856
  const { flow } = useOryFlow();
1781
- const uniqueGroups = useNodesGroups(flow.ui.nodes);
1782
- const scriptNode = getScriptNode(flow.ui.nodes);
1857
+ const uniqueGroups = useNodesGroups(flow.ui.nodes, { omit: ["script"] });
1858
+ const scriptNodes = onlyScriptNodes(flow.ui.nodes);
1783
1859
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1784
1860
  /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1785
- scriptNode && /* @__PURE__ */ jsx(Node, { node: scriptNode }),
1861
+ scriptNodes.map((n) => /* @__PURE__ */ jsx(Node, { node: n })),
1786
1862
  uniqueGroups.entries.map(([group, nodes]) => {
1787
1863
  if (group === UiNodeGroupEnum.Default) {
1788
1864
  return null;
@@ -2324,20 +2400,20 @@ var de_default = {
2324
2400
  "login.cancel-label": "Nicht das richtige Konto?",
2325
2401
  "identities.messages.1010023": "Code an {address} senden",
2326
2402
  "identities.messages.1010016": "Sie haben versucht, sich mit \u201E{duplicateIdentifier}\u201C anzumelden, aber diese E-Mail-Adresse wird bereits von einem anderen Konto verwendet. \nMelden Sie sich mit einer der folgenden Optionen bei Ihrem Konto an, um Ihr Konto \u201E{duplicateIdentifier}\u201C bei \u201E{provider}\u201C als weitere Anmeldem\xF6glichkeit hinzuzuf\xFCgen.",
2327
- "identities.messages.1010017": "",
2328
- "identities.messages.1010018": "",
2329
- "identities.messages.1010019": "",
2403
+ "identities.messages.1010017": "Anmelden und verbinden",
2404
+ "identities.messages.1010018": "Mit {provider} best\xE4tigen",
2405
+ "identities.messages.1010019": "Code senden um fortzufahren",
2330
2406
  "identities.messages.1010020": "",
2331
- "identities.messages.1010021": "",
2332
- "identities.messages.1010022": "",
2333
- "identities.messages.1040007": "",
2334
- "identities.messages.1040008": "",
2335
- "identities.messages.1040009": "",
2407
+ "identities.messages.1010021": "Mit Paskey anmelden",
2408
+ "identities.messages.1010022": "Mit Passwort anmelden",
2409
+ "identities.messages.1040007": "Mit Passkey registrieren",
2410
+ "identities.messages.1040008": "Zur\xFCck",
2411
+ "identities.messages.1040009": "Bitte w\xE4hlen Sie eine Authentifizierungsmethode, um fortzufahren.",
2336
2412
  "identities.messages.1050019": "Passkey hinzuf\xFCgen",
2337
- "identities.messages.1050020": "",
2338
- "identities.messages.4000037": "",
2339
- "identities.messages.4010009": "",
2340
- "identities.messages.4010010": "",
2413
+ "identities.messages.1050020": 'Passkey "{display_name}" entfernen',
2414
+ "identities.messages.4000037": "F\xFCr die eingegebenen Daten existiert kein Account",
2415
+ "identities.messages.4010009": "Die Authentifizierungsmethode stimmt nicht mit der vorherigen Authentifizierungsmethode \xFCberein. Bitte versuchen Sie es erneut.",
2416
+ "identities.messages.4010010": "Die eingegebene Adresse stimmt nicht mit der Adresse \xFCberein, die Sie bei der Registrierung angegeben haben. Bitte versuchen Sie es erneut.",
2341
2417
  "input.placeholder": "{placeholder} eingeben",
2342
2418
  "card.header.parts.code": "einem Code per E-Mail",
2343
2419
  "card.header.parts.identifier-first": "Ihr {identifierLabel}",
@@ -2438,7 +2514,6 @@ var es_default = {
2438
2514
  "error.back-button": "Regresar",
2439
2515
  "error.description": "Ocurri\xF3 un error con el siguiente mensaje:",
2440
2516
  "error.support-email-link": "Si el problema persiste, por favor contacte a <a>{contactSupportEmail}</a>",
2441
- "error.title": "",
2442
2517
  "error.title-internal-server-error": "Error Interno del Servidor",
2443
2518
  "error.title-not-found": "404 - P\xE1gina no encontrada",
2444
2519
  "identities.messages.1010001": "Iniciar sesi\xF3n",
@@ -2613,45 +2688,6 @@ var es_default = {
2613
2688
  "two-step.totp.description": "Utilice un c\xF3digo de un solo uso de 6 d\xEDgitos de su aplicaci\xF3n de autenticaci\xF3n",
2614
2689
  "two-step.lookup_secret.title": "C\xF3digo de recuperaci\xF3n de respaldo",
2615
2690
  "two-step.lookup_secret.description": "Utilice uno de sus c\xF3digos de respaldo de 8 d\xEDgitos para autenticarse",
2616
- "identities.messages.1010016": "",
2617
- "identities.messages.1010017": "",
2618
- "identities.messages.1010018": "",
2619
- "identities.messages.1010019": "",
2620
- "identities.messages.1010020": "",
2621
- "identities.messages.1010021": "",
2622
- "identities.messages.1010022": "",
2623
- "identities.messages.1010023": "",
2624
- "identities.messages.1040007": "",
2625
- "identities.messages.1040008": "",
2626
- "identities.messages.1040009": "",
2627
- "identities.messages.1050019": "",
2628
- "identities.messages.1050020": "",
2629
- "identities.messages.1070014": "",
2630
- "identities.messages.1070015": "",
2631
- "identities.messages.4000037": "",
2632
- "identities.messages.4000038": "",
2633
- "identities.messages.4010009": "",
2634
- "identities.messages.4010010": "",
2635
- "login.cancel-button": "",
2636
- "login.cancel-label": "",
2637
- "input.placeholder": "",
2638
- "card.header.description.login": "",
2639
- "card.header.description.registration": "",
2640
- "card.header.parts.code": "",
2641
- "card.header.parts.identifier-first": "",
2642
- "card.header.parts.oidc": "",
2643
- "card.header.parts.passkey": "",
2644
- "card.header.parts.password.login": "",
2645
- "card.header.parts.password.registration": "",
2646
- "card.header.parts.webauthn": "",
2647
- "forms.label.forgot-password": "",
2648
- "login.subtitle": "",
2649
- "login.subtitle-refresh": "",
2650
- "misc.or": "",
2651
- "recovery.subtitle": "",
2652
- "registration.subtitle": "",
2653
- "settings.subtitle": "",
2654
- "verification.subtitle": "",
2655
2691
  "settings.totp.info.linked": "Actualmente tienes una aplicaci\xF3n de autenticaci\xF3n conectada.",
2656
2692
  "settings.totp.info.not-linked": "Para habilitar, escanea el c\xF3digo QR con tu autenticador e ingresa el c\xF3digo.",
2657
2693
  "settings.totp.title": "Aplicaci\xF3n Autenticadora",
@@ -2669,25 +2705,6 @@ var es_default = {
2669
2705
  "settings.profile.title": "Configuraci\xF3n de Perfil",
2670
2706
  "settings.webauthn.description": "Administra la configuraci\xF3n de tu token de hardware",
2671
2707
  "settings.webauthn.title": "Gestionar Tokens de Hardware",
2672
- "settings.oidc.info": "",
2673
- "settings.passkey.info": "",
2674
- "settings.title-lookup-secret": "",
2675
- "settings.title-navigation": "",
2676
- "settings.title-oidc": "",
2677
- "settings.title-passkey": "",
2678
- "settings.title-password": "",
2679
- "settings.title-profile": "",
2680
- "settings.title-totp": "",
2681
- "settings.title-webauthn": "",
2682
- "settings.webauthn.info": "",
2683
- "card.footer.select-another-method": "",
2684
- "account-linking.title": "",
2685
- "property.code": "",
2686
- "property.email": "",
2687
- "property.identifier": "",
2688
- "property.password": "",
2689
- "property.phone": "",
2690
- "property.username": "",
2691
2708
  "consent.title": "Autorizar {party}",
2692
2709
  "consent.subtitle": "Una aplicaci\xF3n de terceros quiere acceder a la informaci\xF3n asociada a su cuenta {identifier}.",
2693
2710
  "consent.scope.openid.title": "Identidad",
@@ -2702,12 +2719,71 @@ var es_default = {
2702
2719
  "consent.scope.address.description": "Acceda a su direcci\xF3n postal.",
2703
2720
  "consent.scope.phone.title": "N\xFAmero de tel\xE9fono",
2704
2721
  "consent.scope.phone.description": "Recupere su n\xFAmero de tel\xE9fono y su estado de verificaci\xF3n.",
2705
- "error.action.go-back": "",
2706
- "error.footer.copy": "",
2707
- "error.footer.text": "",
2708
- "error.instructions": "",
2709
- "error.title.what-can-i-do": "",
2710
- "error.title.what-happened": ""
2722
+ "error.title": "Ocurri\xF3 un error",
2723
+ "identities.messages.1010016": 'Intentaste iniciar sesi\xF3n con "{duplicateIdentifier}", pero ese correo electr\xF3nico ya est\xE1 en uso por otra cuenta. Inicia sesi\xF3n en tu cuenta con una de las opciones a continuaci\xF3n para agregar tu cuenta "{duplicateIdentifier}" en "{provider}" como otra forma de iniciar sesi\xF3n.',
2724
+ "identities.messages.1010017": "Iniciar sesi\xF3n y vincular",
2725
+ "identities.messages.1010018": "Confirmar con {provider}",
2726
+ "identities.messages.1010019": "Solicitar c\xF3digo para continuar",
2727
+ "identities.messages.1010021": "Iniciar sesi\xF3n con clave de acceso",
2728
+ "identities.messages.1010022": "Iniciar sesi\xF3n con contrase\xF1a",
2729
+ "identities.messages.1010023": "Enviar c\xF3digo a {address}",
2730
+ "identities.messages.1040007": "Registrarse con clave de acceso",
2731
+ "identities.messages.1040008": "Atr\xE1s",
2732
+ "identities.messages.1040009": "Por favor, elige una credencial para autenticarte.",
2733
+ "identities.messages.1050019": "Agregar clave de acceso",
2734
+ "identities.messages.1070014": "Iniciar sesi\xF3n y vincular credencial",
2735
+ "identities.messages.1070015": "Por favor, completa el desaf\xEDo captcha para continuar.",
2736
+ "identities.messages.4000037": "Esta cuenta no existe o no tiene ning\xFAn m\xE9todo de inicio de sesi\xF3n configurado.",
2737
+ "identities.messages.4000038": "Fall\xF3 la verificaci\xF3n de Captcha, por favor intenta de nuevo.",
2738
+ "identities.messages.4010009": "Las credenciales vinculadas no coinciden.",
2739
+ "identities.messages.4010010": "La direcci\xF3n que ingresaste no coincide con ninguna direcci\xF3n conocida en la cuenta actual.",
2740
+ "login.cancel-button": "Cancelar",
2741
+ "login.cancel-label": "\xBFNo es la cuenta correcta?",
2742
+ "login.subtitle": "Iniciar sesi\xF3n con {parts}",
2743
+ "login.subtitle-refresh": "Confirma tu identidad con {parts}",
2744
+ "recovery.subtitle": "Ingresa la direcci\xF3n de correo electr\xF3nico asociada con tu cuenta para recibir un c\xF3digo de acceso \xFAnico",
2745
+ "registration.subtitle": "Registrarse con {parts}",
2746
+ "settings.subtitle": "Actualiza la configuraci\xF3n de tu cuenta",
2747
+ "settings.title-lookup-secret": "Administrar c\xF3digos de recuperaci\xF3n de respaldo 2FA",
2748
+ "settings.title-navigation": "Configuraci\xF3n de la cuenta",
2749
+ "settings.title-oidc": "Inicio de sesi\xF3n social",
2750
+ "settings.title-password": "Cambiar contrase\xF1a",
2751
+ "settings.title-profile": "Configuraci\xF3n del perfil",
2752
+ "settings.title-totp": "Administrar la aplicaci\xF3n de autenticaci\xF3n 2FA TOTP",
2753
+ "settings.title-webauthn": "Administrar tokens de hardware",
2754
+ "settings.title-passkey": "Administrar claves de acceso",
2755
+ "verification.subtitle": "Ingresa la direcci\xF3n de correo electr\xF3nico asociada con tu cuenta para verificarla",
2756
+ "input.placeholder": "Ingresa tu {placeholder}",
2757
+ "card.header.parts.oidc": "un proveedor social",
2758
+ "card.header.parts.password.registration": "tu {identifierLabel} y una contrase\xF1a",
2759
+ "card.header.parts.password.login": "tu {identifierLabel} y contrase\xF1a",
2760
+ "card.header.parts.code": "un c\xF3digo enviado a tu correo electr\xF3nico",
2761
+ "card.header.parts.passkey": "una clave de acceso",
2762
+ "card.header.parts.webauthn": "una clave de seguridad",
2763
+ "card.header.parts.identifier-first": "tu {identifierLabel}",
2764
+ "card.header.description.login": "Iniciar sesi\xF3n con {identifierLabel}",
2765
+ "card.header.description.registration": "Registrarse con {identifierLabel}",
2766
+ "misc.or": "o",
2767
+ "forms.label.forgot-password": "\xBFOlvidaste tu contrase\xF1a?",
2768
+ "settings.oidc.info": "Las cuentas conectadas de estos proveedores se pueden utilizar para iniciar sesi\xF3n en tu cuenta",
2769
+ "settings.webauthn.info": "Los tokens de hardware se utilizan para la autenticaci\xF3n de segundo factor o como primer factor con las claves de acceso",
2770
+ "settings.passkey.info": "Administra la configuraci\xF3n de tus claves de acceso",
2771
+ "card.footer.select-another-method": "Seleccionar otro m\xE9todo",
2772
+ "account-linking.title": "Vincular cuenta",
2773
+ "property.password": "contrase\xF1a",
2774
+ "property.email": "correo electr\xF3nico",
2775
+ "property.phone": "tel\xE9fono",
2776
+ "property.username": "nombre de usuario",
2777
+ "property.identifier": "identificador",
2778
+ "property.code": "c\xF3digo",
2779
+ "error.title.what-happened": "\xBFQu\xE9 pas\xF3?",
2780
+ "error.title.what-can-i-do": "\xBFQu\xE9 puedo hacer?",
2781
+ "error.instructions": "Por favor, int\xE9ntalo de nuevo en unos minutos o contacta al operador del sitio web.",
2782
+ "error.footer.text": "Al informar este error, incluye la siguiente informaci\xF3n:",
2783
+ "error.footer.copy": "Copiar",
2784
+ "error.action.go-back": "Regresar",
2785
+ "identities.messages.1010020": "",
2786
+ "identities.messages.1050020": 'Eliminar passkey "{display_name}"'
2711
2787
  };
2712
2788
 
2713
2789
  // src/locales/fr.json
@@ -2898,81 +2974,10 @@ var fr_default = {
2898
2974
  "two-step.totp.description": "Utilisez un code \xE0 usage unique \xE0 6 chiffres provenant de votre application d'authentification",
2899
2975
  "two-step.lookup_secret.title": "Code de r\xE9cup\xE9ration de secours",
2900
2976
  "two-step.lookup_secret.description": "Utilisez l'un de vos codes de secours \xE0 8 chiffres pour vous authentifier",
2901
- "identities.messages.1010023": "",
2902
- "identities.messages.1070015": "",
2903
- "identities.messages.4000038": "",
2904
- "login.cancel-button": "",
2905
- "login.cancel-label": "",
2906
- "identities.messages.1010016": "",
2907
- "identities.messages.1010017": "",
2908
- "identities.messages.1010018": "",
2909
- "identities.messages.1010019": "",
2910
- "identities.messages.1010020": "",
2911
- "identities.messages.1010021": "",
2912
- "identities.messages.1010022": "",
2913
- "identities.messages.1040007": "",
2914
- "identities.messages.1040008": "",
2915
- "identities.messages.1040009": "",
2916
- "identities.messages.1050019": "",
2917
- "identities.messages.1050020": "",
2918
- "identities.messages.1070014": "",
2919
- "identities.messages.4000037": "",
2920
- "identities.messages.4010009": "",
2921
- "identities.messages.4010010": "",
2922
- "input.placeholder": "",
2923
- "card.header.description.login": "",
2924
- "card.header.description.registration": "",
2925
- "card.header.parts.code": "",
2926
- "card.header.parts.identifier-first": "",
2927
- "card.header.parts.oidc": "",
2928
- "card.header.parts.passkey": "",
2929
- "card.header.parts.password.login": "",
2930
- "card.header.parts.password.registration": "",
2931
- "card.header.parts.webauthn": "",
2932
- "forms.label.forgot-password": "",
2933
- "login.subtitle": "",
2934
- "login.subtitle-refresh": "",
2935
- "misc.or": "",
2936
- "recovery.subtitle": "",
2937
- "registration.subtitle": "",
2938
- "settings.subtitle": "",
2939
- "verification.subtitle": "",
2940
2977
  "settings.totp.info.linked": "Vous avez actuellement une application d'authentification connect\xE9e.",
2941
2978
  "settings.totp.info.not-linked": "Pour activer, scannez le QR code avec votre authentificateur et entrez le code.",
2942
2979
  "settings.totp.title": "Application d'authentification",
2943
2980
  "settings.totp.description": "Ajoutez une application d'authentification TOTP \xE0 votre compte pour am\xE9liorer la s\xE9curit\xE9 de votre compte. Les applications d'authentification populaires sont LastPass et Google Authenticator.",
2944
- "settings.lookup_secret.description": "",
2945
- "settings.lookup_secret.title": "",
2946
- "settings.navigation.title": "",
2947
- "settings.oidc.description": "",
2948
- "settings.oidc.info": "",
2949
- "settings.oidc.title": "",
2950
- "settings.passkey.description": "",
2951
- "settings.passkey.info": "",
2952
- "settings.passkey.title": "",
2953
- "settings.password.description": "",
2954
- "settings.password.title": "",
2955
- "settings.profile.description": "",
2956
- "settings.profile.title": "",
2957
- "settings.title-lookup-secret": "",
2958
- "settings.title-navigation": "",
2959
- "settings.title-oidc": "",
2960
- "settings.title-passkey": "",
2961
- "settings.title-password": "",
2962
- "settings.title-profile": "",
2963
- "settings.title-totp": "",
2964
- "settings.title-webauthn": "",
2965
- "settings.webauthn.description": "",
2966
- "settings.webauthn.info": "",
2967
- "settings.webauthn.title": "",
2968
- "card.footer.select-another-method": "",
2969
- "account-linking.title": "",
2970
- "property.code": "",
2971
- "property.email": "",
2972
- "property.identifier": "",
2973
- "property.password": "",
2974
- "property.phone": "",
2975
- "property.username": "",
2976
2981
  "consent.title": "Autoriser {party}",
2977
2982
  "consent.subtitle": "Une application tierce souhaite acc\xE9der aux informations associ\xE9es \xE0 votre compte {identifier}.",
2978
2983
  "consent.scope.openid.title": "Identit\xE9",
@@ -2987,12 +2992,83 @@ var fr_default = {
2987
2992
  "consent.scope.address.description": "Acc\xE8de \xE0 votre adresse postale.",
2988
2993
  "consent.scope.phone.title": "Num\xE9ro de t\xE9l\xE9phone",
2989
2994
  "consent.scope.phone.description": "R\xE9cup\xE8re votre num\xE9ro de t\xE9l\xE9phone et son statut de v\xE9rification.",
2990
- "error.action.go-back": "",
2991
- "error.footer.copy": "",
2992
- "error.footer.text": "",
2993
- "error.title.what-can-i-do": "",
2994
- "error.title.what-happened": "",
2995
- "error.instructions": ""
2995
+ "identities.messages.1010016": "Vous avez essay\xE9 de vous connecter avec \xAB {duplicateIdentifier} \xBB, mais cet e-mail est d\xE9j\xE0 utilis\xE9 par un autre compte. Connectez-vous \xE0 votre compte avec l'une des options ci-dessous pour ajouter votre compte \xAB {duplicateIdentifier} \xBB sur \xAB {provider} \xBB comme autre moyen de vous connecter.",
2996
+ "identities.messages.1010017": "Se connecter et lier",
2997
+ "identities.messages.1010018": "Confirmer avec {provider}",
2998
+ "identities.messages.1010019": "Demander un code pour continuer",
2999
+ "identities.messages.1010021": "Se connecter avec une cl\xE9 d'acc\xE8s",
3000
+ "identities.messages.1010022": "Se connecter avec un mot de passe",
3001
+ "identities.messages.1010023": "Envoyer le code \xE0 {address}",
3002
+ "identities.messages.1040007": "S'inscrire avec une cl\xE9 d'acc\xE8s",
3003
+ "identities.messages.1040008": "Retour",
3004
+ "identities.messages.1040009": "Veuillez choisir une identification pour vous authentifier.",
3005
+ "identities.messages.1050019": "Ajouter une cl\xE9 d'acc\xE8s",
3006
+ "identities.messages.1050020": "Supprimer la cl\xE9 d'acc\xE8s \xAB {display_name} \xBB",
3007
+ "identities.messages.1070014": "Se connecter et lier l'identification",
3008
+ "identities.messages.1070015": "Veuillez compl\xE9ter le d\xE9fi captcha pour continuer.",
3009
+ "identities.messages.4000037": "Ce compte n'existe pas ou n'a aucune m\xE9thode de connexion configur\xE9e.",
3010
+ "identities.messages.4000038": "La v\xE9rification Captcha a \xE9chou\xE9, veuillez r\xE9essayer.",
3011
+ "identities.messages.4010009": "Les identifications li\xE9es ne correspondent pas.",
3012
+ "identities.messages.4010010": "L'adresse que vous avez saisie ne correspond \xE0 aucune adresse connue dans le compte actuel.",
3013
+ "login.cancel-button": "Annuler",
3014
+ "login.cancel-label": "Ce n'est pas le bon compte\xA0?",
3015
+ "login.subtitle": "Se connecter avec {parts}",
3016
+ "login.subtitle-refresh": "Confirmez votre identit\xE9 avec {parts}",
3017
+ "recovery.subtitle": "Saisissez l'adresse e-mail associ\xE9e \xE0 votre compte pour recevoir un code d'acc\xE8s unique",
3018
+ "registration.subtitle": "S'inscrire avec {parts}",
3019
+ "settings.subtitle": "Mettre \xE0 jour les param\xE8tres de votre compte",
3020
+ "settings.title-lookup-secret": "G\xE9rer les codes de r\xE9cup\xE9ration de sauvegarde 2FA",
3021
+ "settings.title-navigation": "Param\xE8tres du compte",
3022
+ "settings.title-oidc": "Connexion via les r\xE9seaux sociaux",
3023
+ "settings.title-password": "Changer le mot de passe",
3024
+ "settings.title-profile": "Param\xE8tres du profil",
3025
+ "settings.title-totp": "G\xE9rer l'application d'authentification 2FA TOTP",
3026
+ "settings.title-webauthn": "G\xE9rer les jetons mat\xE9riels",
3027
+ "settings.title-passkey": "G\xE9rer les cl\xE9s d'acc\xE8s",
3028
+ "settings.navigation.title": "Param\xE8tres du compte",
3029
+ "settings.password.title": "Changer le mot de passe",
3030
+ "settings.password.description": "Modifier votre mot de passe",
3031
+ "settings.profile.title": "Param\xE8tres du profil",
3032
+ "settings.profile.description": "Mettre \xE0 jour les informations de votre profil",
3033
+ "settings.webauthn.title": "G\xE9rer les jetons mat\xE9riels",
3034
+ "settings.webauthn.description": "G\xE9rer les param\xE8tres de votre jeton mat\xE9riel",
3035
+ "verification.subtitle": "Saisissez l'adresse e-mail associ\xE9e \xE0 votre compte pour la v\xE9rifier",
3036
+ "input.placeholder": "Saisissez votre {placeholder}",
3037
+ "card.header.parts.oidc": "un fournisseur de r\xE9seaux sociaux",
3038
+ "card.header.parts.password.registration": "votre {identifierLabel} et un mot de passe",
3039
+ "card.header.parts.password.login": "votre {identifierLabel} et votre mot de passe",
3040
+ "card.header.parts.code": "un code envoy\xE9 \xE0 votre adresse e-mail",
3041
+ "card.header.parts.passkey": "une cl\xE9 d'acc\xE8s",
3042
+ "card.header.parts.webauthn": "une cl\xE9 de s\xE9curit\xE9",
3043
+ "card.header.parts.identifier-first": "votre {identifierLabel}",
3044
+ "card.header.description.login": "Se connecter avec {identifierLabel}",
3045
+ "card.header.description.registration": "S'inscrire avec {identifierLabel}",
3046
+ "misc.or": "ou",
3047
+ "forms.label.forgot-password": "Mot de passe oubli\xE9?",
3048
+ "settings.lookup_secret.title": "Codes de r\xE9cup\xE9ration de sauvegarde (second facteur)",
3049
+ "settings.lookup_secret.description": "Les codes de r\xE9cup\xE9ration sont une sauvegarde s\xE9curis\xE9e pour l'authentification \xE0 deux facteurs (2FA), vous permettant de retrouver l'acc\xE8s \xE0 votre compte si vous perdez votre appareil 2FA.",
3050
+ "settings.oidc.title": "Comptes connect\xE9s",
3051
+ "settings.oidc.description": "Connectez un fournisseur de connexion sociale \xE0 votre compte.",
3052
+ "settings.oidc.info": "Les comptes connect\xE9s de ces fournisseurs peuvent \xEAtre utilis\xE9s pour vous connecter \xE0 votre compte",
3053
+ "settings.webauthn.info": "Les jetons mat\xE9riels sont utilis\xE9s pour l'authentification \xE0 deux facteurs ou comme premier facteur avec les cl\xE9s d'acc\xE8s",
3054
+ "settings.passkey.title": "G\xE9rer les cl\xE9s d'acc\xE8s",
3055
+ "settings.passkey.description": "G\xE9rer les param\xE8tres de vos cl\xE9s d'acc\xE8s",
3056
+ "settings.passkey.info": "G\xE9rer les param\xE8tres de vos cl\xE9s d'acc\xE8s",
3057
+ "card.footer.select-another-method": "S\xE9lectionner une autre m\xE9thode",
3058
+ "account-linking.title": "Lier le compte",
3059
+ "property.password": "mot de passe",
3060
+ "property.email": "e-mail",
3061
+ "property.phone": "t\xE9l\xE9phone",
3062
+ "property.username": "nom d'utilisateur",
3063
+ "property.identifier": "identifiant",
3064
+ "property.code": "code",
3065
+ "error.title.what-happened": "Que s'est-il pass\xE9?",
3066
+ "error.title.what-can-i-do": "Que puis-je faire?",
3067
+ "error.instructions": "Veuillez r\xE9essayer dans quelques minutes ou contacter l'op\xE9rateur du site Web.",
3068
+ "error.footer.text": "Lorsque vous signalez cette erreur, veuillez inclure les informations suivantes:",
3069
+ "error.footer.copy": "Copier",
3070
+ "error.action.go-back": "Retour",
3071
+ "identities.messages.1010020": ""
2996
3072
  };
2997
3073
 
2998
3074
  // src/locales/nl.json