@ory/elements-react 0.0.0-pr.3a98de9 → 0.0.0-pr.6b3fe62

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
@@ -1,8 +1,8 @@
1
- import { UiNodeGroupEnum, isUiNodeInputAttributes, FlowType, Configuration, FrontendApi, handleContinueWith, handleFlowError, settingsUrl, isResponseError, loginUrl, instanceOfContinueWithRecoveryUi, recoveryUrl, verificationUrl, registrationUrl, isUiNodeAnchorAttributes, isUiNodeImageAttributes, isUiNodeScriptAttributes, isUiNodeTextAttributes, UiNodeInputAttributesTypeEnum } from '@ory/client-fetch';
2
- import { createContext, useContext, useRef, useEffect, useState, useReducer, useMemo } from 'react';
1
+ import { UiNodeGroupEnum, isUiNodeInputAttributes, isUiNodeAnchorAttributes, isUiNodeImageAttributes, isUiNodeScriptAttributes, FlowType, UiNodeInputAttributesTypeEnum, isUiNodeTextAttributes, handleContinueWith, handleFlowError, settingsUrl, isResponseError, loginUrl, recoveryUrl, verificationUrl, registrationUrl, Configuration, FrontendApi, instanceOfContinueWithRecoveryUi } from '@ory/client-fetch';
2
+ import { createContext, useContext, useState, useMemo, useReducer, useRef, useEffect } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useIntl, IntlProvider as IntlProvider$1 } from 'react-intl';
5
- import { useForm, FormProvider, useFormContext } from 'react-hook-form';
5
+ import { useFormContext, useForm, FormProvider } from 'react-hook-form';
6
6
 
7
7
  // src/context/component.tsx
8
8
  var ComponentContext = createContext({
@@ -34,6 +34,7 @@ function useGroupSorter() {
34
34
  }
35
35
  var defaultNodeOrder = [
36
36
  "oidc",
37
+ "saml",
37
38
  "identifier_first",
38
39
  "default",
39
40
  "profile",
@@ -98,8 +99,10 @@ function isChoosingMethod(flow) {
98
99
  (node) => node.group === UiNodeGroupEnum.IdentifierFirst && "name" in node.attributes && node.attributes.name === "identifier" && node.attributes.type === "hidden"
99
100
  ) || flow.flowType === FlowType.Login && flow.flow.requested_aal === "aal2";
100
101
  }
101
- function filterOidcOut(nodes) {
102
- return nodes.filter((node) => node.group !== UiNodeGroupEnum.Oidc);
102
+ function removeSsoNodes(nodes) {
103
+ return nodes.filter(
104
+ (node) => !(node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml)
105
+ );
103
106
  }
104
107
  function getFinalNodes(uniqueGroups, selectedGroup) {
105
108
  var _a, _b, _c, _d;
@@ -184,13 +187,16 @@ function nodesToAuthMethodGroups(nodes, excludeAuthMethods = []) {
184
187
  ].includes(group)
185
188
  );
186
189
  }
187
- function useNodesGroups(nodes) {
190
+ function useNodesGroups(nodes, { omit } = {}) {
188
191
  const groupSorter = useGroupSorter();
189
192
  const groups = useMemo(() => {
190
193
  var _a;
191
194
  const groups2 = {};
192
195
  for (const node of nodes) {
193
- if (node.type === "script") {
196
+ if ((omit == null ? void 0 : omit.includes("script")) && isUiNodeScriptAttributes(node.attributes)) {
197
+ continue;
198
+ }
199
+ if ((omit == null ? void 0 : omit.includes("input_hidden")) && isUiNodeInputAttributes(node.attributes) && node.attributes.type === "hidden") {
194
200
  continue;
195
201
  }
196
202
  const groupNodes = (_a = groups2[node.group]) != null ? _a : [];
@@ -232,7 +238,9 @@ function parseStateFromFlow(flow) {
232
238
  return { current: "method_active", method: "code" };
233
239
  } else if (methodWithMessage) {
234
240
  return { current: "method_active", method: methodWithMessage.group };
235
- } else if (flow.flow.active && !["default", "identifier_first", "oidc"].includes(flow.flow.active)) {
241
+ } else if (flow.flow.active && !["default", "identifier_first", "oidc", "saml"].includes(
242
+ flow.flow.active
243
+ )) {
236
244
  return { current: "method_active", method: flow.flow.active };
237
245
  } else if (isChoosingMethod(flow)) {
238
246
  const authMethods = nodesToAuthMethodGroups(flow.flow.ui.nodes);
@@ -256,23 +264,32 @@ function parseStateFromFlow(flow) {
256
264
  break;
257
265
  case FlowType.Settings:
258
266
  return { current: "settings" };
267
+ case FlowType.OAuth2Consent:
268
+ return { current: "method_active", method: "oauth2_consent" };
259
269
  }
260
270
  console.warn(
261
271
  `[Ory/Elements React] Encountered an unknown form state on ${flow.flowType} flow with ID ${flow.flow.id}`
262
272
  );
263
273
  throw new Error("Unknown form state");
264
274
  }
265
- function formStateReducer(state, action) {
266
- switch (action.type) {
267
- case "action_flow_update":
268
- return parseStateFromFlow(action.flow);
269
- case "action_select_method":
270
- return { current: "method_active", method: action.method };
271
- }
272
- return state;
273
- }
274
275
  function useFormStateReducer(flow) {
275
- return useReducer(formStateReducer, parseStateFromFlow(flow));
276
+ const action = parseStateFromFlow(flow);
277
+ const [selectedMethod, setSelectedMethod] = useState();
278
+ const formStateReducer = (state, action2) => {
279
+ switch (action2.type) {
280
+ case "action_flow_update": {
281
+ if (selectedMethod)
282
+ return { current: "method_active", method: selectedMethod };
283
+ return parseStateFromFlow(action2.flow);
284
+ }
285
+ case "action_select_method": {
286
+ setSelectedMethod(action2.method);
287
+ return { current: "method_active", method: action2.method };
288
+ }
289
+ }
290
+ return state;
291
+ };
292
+ return useReducer(formStateReducer, action);
276
293
  }
277
294
  function useOryFlow() {
278
295
  const ctx = useContext(OryFlowContext);
@@ -362,6 +379,22 @@ function computeDefaultValues(nodes) {
362
379
  if (attrs.name === "method" || attrs.type === "submit" || typeof attrs.value === "undefined") {
363
380
  return acc;
364
381
  }
382
+ if (attrs.name.startsWith("grant_scope")) {
383
+ const scope = attrs.value;
384
+ if (Array.isArray(acc.grant_scope)) {
385
+ return {
386
+ ...acc,
387
+ // We want to have all scopes accepted by default, so that the user has to actively uncheck them.
388
+ grant_scope: [...acc.grant_scope, scope]
389
+ };
390
+ } else if (!acc.grant_scope) {
391
+ return {
392
+ ...acc,
393
+ grant_scope: [scope]
394
+ };
395
+ }
396
+ return acc;
397
+ }
365
398
  return unrollTrait(
366
399
  {
367
400
  name: attrs.name,
@@ -793,7 +826,7 @@ function useOryFormSubmit(onAfterSubmit) {
793
826
  if ("lookup_secret_confirm" in submitData || "lookup_secret_reveal" in submitData || "lookup_secret_regenerate" in submitData || "lookup_secret_disable" in submitData) {
794
827
  submitData.method = "lookup_secret";
795
828
  }
796
- if (submitData.method === "oidc" && submitData.link && supportsSelectAccountPrompt.includes(submitData.link)) {
829
+ if (submitData.method === UiNodeGroupEnum.Oidc && submitData.link && supportsSelectAccountPrompt.includes(submitData.link)) {
797
830
  submitData.upstream_parameters = {
798
831
  prompt: "select_account"
799
832
  };
@@ -811,6 +844,19 @@ function useOryFormSubmit(onAfterSubmit) {
811
844
  });
812
845
  break;
813
846
  }
847
+ case FlowType.OAuth2Consent: {
848
+ const response = await fetch(flowContainer.flow.ui.action, {
849
+ method: "POST",
850
+ body: JSON.stringify(data),
851
+ headers: {
852
+ "Content-Type": "application/json"
853
+ }
854
+ });
855
+ const oauth2Success = await response.json();
856
+ if (oauth2Success.redirect_to && typeof oauth2Success.redirect_to === "string") {
857
+ onRedirect(oauth2Success.redirect_to);
858
+ }
859
+ }
814
860
  }
815
861
  if ("password" in data) {
816
862
  methods.setValue("password", "");
@@ -825,7 +871,11 @@ function useOryFormSubmit(onAfterSubmit) {
825
871
  };
826
872
  return onSubmit;
827
873
  }
828
- function OryForm({ children, onAfterSubmit }) {
874
+ function OryForm({
875
+ children,
876
+ onAfterSubmit,
877
+ "data-testid": dataTestId
878
+ }) {
829
879
  const { Form } = useComponents();
830
880
  const flowContainer = useOryFlow();
831
881
  const methods = useFormContext();
@@ -853,7 +903,7 @@ function OryForm({ children, onAfterSubmit }) {
853
903
  }),
854
904
  type: "error"
855
905
  };
856
- return /* @__PURE__ */ jsxs(Fragment, { children: [
906
+ return /* @__PURE__ */ jsxs("div", { "data-testid": dataTestId, children: [
857
907
  /* @__PURE__ */ jsx(Message.Root, { children: /* @__PURE__ */ jsx(Message.Content, { message: m }, m.id) }),
858
908
  /* @__PURE__ */ jsx(OryCardFooter, {})
859
909
  ] });
@@ -864,6 +914,7 @@ function OryForm({ children, onAfterSubmit }) {
864
914
  return /* @__PURE__ */ jsx(
865
915
  Form.Root,
866
916
  {
917
+ "data-testid": dataTestId,
867
918
  action: flowContainer.flow.ui.action,
868
919
  method: flowContainer.flow.ui.method,
869
920
  onSubmit: (e) => void methods.handleSubmit(onSubmit)(e),
@@ -898,7 +949,7 @@ var NodeInput = ({
898
949
  }) => {
899
950
  var _a;
900
951
  const { Node: Node2 } = useComponents();
901
- const { setValue } = useFormContext();
952
+ const { setValue, watch } = useFormContext();
902
953
  const {
903
954
  onloadTrigger,
904
955
  onclickTrigger,
@@ -911,7 +962,10 @@ var NodeInput = ({
911
962
  const isResendNode = ((_a = node.meta.label) == null ? void 0 : _a.id) === 1070008;
912
963
  const isScreenSelectionNode = "name" in node.attributes && node.attributes.name === "screen";
913
964
  const setFormValue = () => {
914
- if (attrs.value && !(isResendNode || isScreenSelectionNode)) {
965
+ if (isResendNode || isScreenSelectionNode || node.group === UiNodeGroupEnum.Oauth2Consent) {
966
+ return;
967
+ }
968
+ if (attrs.value !== void 0) {
915
969
  setValue(attrs.name, attrs.value);
916
970
  }
917
971
  };
@@ -934,8 +988,21 @@ var NodeInput = ({
934
988
  triggerToWindowCall(onclickTrigger);
935
989
  }
936
990
  };
937
- const isSocial = (attrs.name === "provider" || attrs.name === "link") && node.group === "oidc";
991
+ const isSocial = (attrs.name === "provider" || attrs.name === "link") && (node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml);
938
992
  const isPinCodeInput = attrs.name === "code" && node.group === "code" || attrs.name === "totp_code" && node.group === "totp";
993
+ const handleScopeChange = (checked) => {
994
+ const scopes = watch("grant_scope");
995
+ if (Array.isArray(scopes)) {
996
+ if (checked) {
997
+ setValue("grant_scope", Array.from(/* @__PURE__ */ new Set([...scopes, attrs.value])));
998
+ } else {
999
+ setValue(
1000
+ "grant_scope",
1001
+ scopes.filter((scope) => scope !== attrs.value)
1002
+ );
1003
+ }
1004
+ }
1005
+ };
939
1006
  switch (attributes.type) {
940
1007
  case UiNodeInputAttributesTypeEnum.Submit:
941
1008
  case UiNodeInputAttributesTypeEnum.Button:
@@ -945,6 +1012,9 @@ var NodeInput = ({
945
1012
  if (isResendNode || isScreenSelectionNode) {
946
1013
  return null;
947
1014
  }
1015
+ if (node.group === "oauth2_consent") {
1016
+ return null;
1017
+ }
948
1018
  return /* @__PURE__ */ jsx(
949
1019
  Node2.Label,
950
1020
  {
@@ -956,6 +1026,21 @@ var NodeInput = ({
956
1026
  case UiNodeInputAttributesTypeEnum.DatetimeLocal:
957
1027
  throw new Error("Not implemented");
958
1028
  case UiNodeInputAttributesTypeEnum.Checkbox:
1029
+ if (node.group === "oauth2_consent" && node.attributes.node_type === "input") {
1030
+ switch (node.attributes.name) {
1031
+ case "grant_scope":
1032
+ return /* @__PURE__ */ jsx(
1033
+ Node2.ConsentScopeCheckbox,
1034
+ {
1035
+ attributes: attrs,
1036
+ node,
1037
+ onCheckedChange: handleScopeChange
1038
+ }
1039
+ );
1040
+ default:
1041
+ return null;
1042
+ }
1043
+ }
959
1044
  return /* @__PURE__ */ jsx(
960
1045
  Node2.Label,
961
1046
  {
@@ -1017,7 +1102,9 @@ function OryFormOidcButtons() {
1017
1102
  flow: { ui }
1018
1103
  } = useOryFlow();
1019
1104
  const { setValue } = useFormContext();
1020
- const filteredNodes = ui.nodes.filter((node) => node.group === "oidc");
1105
+ const filteredNodes = ui.nodes.filter(
1106
+ (node) => node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml
1107
+ );
1021
1108
  const { Form, Node: Node2 } = useComponents();
1022
1109
  if (filteredNodes.length === 0) {
1023
1110
  return null;
@@ -1032,7 +1119,7 @@ function OryFormOidcButtons() {
1032
1119
  "provider",
1033
1120
  node.attributes.value
1034
1121
  );
1035
- setValue("method", "oidc");
1122
+ setValue("method", node.group);
1036
1123
  }
1037
1124
  },
1038
1125
  k
@@ -1042,11 +1129,13 @@ function OryFormSocialButtonsForm() {
1042
1129
  const {
1043
1130
  flow: { ui }
1044
1131
  } = useOryFlow();
1045
- const filteredNodes = ui.nodes.filter((node) => node.group === "oidc");
1132
+ const filteredNodes = ui.nodes.filter(
1133
+ (node) => node.group === UiNodeGroupEnum.Saml || node.group === UiNodeGroupEnum.Oidc
1134
+ );
1046
1135
  if (filteredNodes.length === 0) {
1047
1136
  return null;
1048
1137
  }
1049
- return /* @__PURE__ */ jsx(OryFormProvider, { children: /* @__PURE__ */ jsx(OryForm, { children: /* @__PURE__ */ jsx(OryFormOidcButtons, {}) }) });
1138
+ return /* @__PURE__ */ jsx(OryFormProvider, { children: /* @__PURE__ */ jsx(OryForm, { "data-testid": `ory/form/methods/oidc-saml`, children: /* @__PURE__ */ jsx(OryFormOidcButtons, {}) }) });
1050
1139
  }
1051
1140
  function isUINodeGroupEnum(method) {
1052
1141
  return Object.values(UiNodeGroupEnum).includes(method);
@@ -1058,14 +1147,18 @@ function OryTwoStepCard() {
1058
1147
  const { ui } = flow;
1059
1148
  const nodeSorter = useNodeSorter();
1060
1149
  const sortNodes = (a, b) => nodeSorter(a, b, { flowType });
1061
- const uniqueGroups = useNodesGroups(ui.nodes);
1062
- const options = Object.fromEntries(
1150
+ const groupsToShow = useNodesGroups(ui.nodes, {
1151
+ // We only want to render groups that have visible elements.
1152
+ omit: ["script", "input_hidden"]
1153
+ });
1154
+ const authMethodBlocks = Object.fromEntries(
1063
1155
  Object.values(UiNodeGroupEnum).filter((group) => {
1064
1156
  var _a2;
1065
- return (_a2 = uniqueGroups.groups[group]) == null ? void 0 : _a2.length;
1157
+ return (_a2 = groupsToShow.groups[group]) == null ? void 0 : _a2.length;
1066
1158
  }).filter(
1067
1159
  (group) => ![
1068
1160
  UiNodeGroupEnum.Oidc,
1161
+ UiNodeGroupEnum.Saml,
1069
1162
  UiNodeGroupEnum.Default,
1070
1163
  UiNodeGroupEnum.IdentifierFirst,
1071
1164
  UiNodeGroupEnum.Profile,
@@ -1073,7 +1166,17 @@ function OryTwoStepCard() {
1073
1166
  ].includes(group)
1074
1167
  ).map((g) => [g, {}])
1075
1168
  );
1076
- if (UiNodeGroupEnum.Code in options) {
1169
+ const authMethodAdditionalNodes = ui.nodes.filter(
1170
+ ({ group }) => [
1171
+ UiNodeGroupEnum.Oidc,
1172
+ UiNodeGroupEnum.Saml,
1173
+ UiNodeGroupEnum.Default,
1174
+ UiNodeGroupEnum.IdentifierFirst,
1175
+ UiNodeGroupEnum.Profile,
1176
+ UiNodeGroupEnum.Captcha
1177
+ ].includes(group)
1178
+ );
1179
+ if (UiNodeGroupEnum.Code in authMethodBlocks) {
1077
1180
  let identifier = (_b = (_a = findNode(ui.nodes, {
1078
1181
  group: "identifier_first",
1079
1182
  node_type: "input",
@@ -1085,7 +1188,7 @@ function OryTwoStepCard() {
1085
1188
  name: "address"
1086
1189
  })) == null ? void 0 : _c.attributes) == null ? void 0 : _d.value);
1087
1190
  if (identifier) {
1088
- options[UiNodeGroupEnum.Code] = {
1191
+ authMethodBlocks[UiNodeGroupEnum.Code] = {
1089
1192
  title: {
1090
1193
  id: "identities.messages.1010023",
1091
1194
  values: { address: identifier }
@@ -1093,8 +1196,8 @@ function OryTwoStepCard() {
1093
1196
  };
1094
1197
  }
1095
1198
  }
1096
- const nonOidcNodes = filterOidcOut(ui.nodes);
1097
- const finalNodes = formState.current === "method_active" ? getFinalNodes(uniqueGroups.groups, formState.method) : [];
1199
+ const nonSsoNodes = removeSsoNodes(ui.nodes);
1200
+ const finalNodes = formState.current === "method_active" ? getFinalNodes(groupsToShow.groups, formState.method) : [];
1098
1201
  const handleAfterFormSubmit = (method) => {
1099
1202
  if (typeof method !== "string" || !isUINodeGroupEnum(method)) {
1100
1203
  return;
@@ -1106,46 +1209,66 @@ function OryTwoStepCard() {
1106
1209
  });
1107
1210
  }
1108
1211
  };
1109
- const hasOidc = ui.nodes.some((node) => node.group === UiNodeGroupEnum.Oidc);
1110
- const showOidc = !(formState.current === "method_active" && formState.method !== "oidc");
1212
+ const hasSso = ui.nodes.some(
1213
+ (node) => node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml
1214
+ );
1215
+ const showSso = !(formState.current === "method_active" && !(formState.method === UiNodeGroupEnum.Oidc || formState.method === UiNodeGroupEnum.Saml));
1216
+ const showSsoDivider = hasSso && nonSsoNodes.filter((n) => {
1217
+ if (isUiNodeInputAttributes(n.attributes)) {
1218
+ return n.attributes.type !== UiNodeInputAttributesTypeEnum.Hidden;
1219
+ } else if (isUiNodeScriptAttributes(n.attributes)) {
1220
+ return false;
1221
+ }
1222
+ return true;
1223
+ }).length > 0;
1111
1224
  return /* @__PURE__ */ jsxs(OryCard, { children: [
1112
1225
  /* @__PURE__ */ jsx(OryCardHeader, {}),
1113
1226
  /* @__PURE__ */ jsxs(OryCardContent, { children: [
1114
1227
  /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1115
- showOidc && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1116
- /* @__PURE__ */ jsxs(OryForm, { onAfterSubmit: handleAfterFormSubmit, children: [
1117
- /* @__PURE__ */ jsxs(Form.Group, { children: [
1118
- formState.current === "provide_identifier" && /* @__PURE__ */ jsxs(Fragment, { children: [
1119
- hasOidc && /* @__PURE__ */ jsx(Card.Divider, {}),
1120
- nonOidcNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1121
- ] }),
1122
- formState.current === "select_method" && /* @__PURE__ */ jsxs(Fragment, { children: [
1123
- /* @__PURE__ */ jsx(Card.Divider, {}),
1124
- /* @__PURE__ */ jsx(
1125
- AuthMethodList,
1126
- {
1127
- options,
1128
- setSelectedGroup: (group) => dispatchFormState({
1129
- type: "action_select_method",
1130
- method: group
1131
- })
1132
- }
1133
- ),
1134
- ui.nodes.filter((n) => n.group === UiNodeGroupEnum.Captcha).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1135
- ] }),
1136
- formState.current === "method_active" && /* @__PURE__ */ jsxs(Fragment, { children: [
1137
- ui.nodes.filter((n) => n.type === "script").map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1138
- finalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1139
- ] })
1140
- ] }),
1141
- /* @__PURE__ */ jsx(OryCardFooter, {})
1142
- ] })
1228
+ showSso && /* @__PURE__ */ jsx(OryFormSocialButtonsForm, {}),
1229
+ /* @__PURE__ */ jsxs(
1230
+ OryForm,
1231
+ {
1232
+ "data-testid": `ory/form/methods/local`,
1233
+ onAfterSubmit: handleAfterFormSubmit,
1234
+ children: [
1235
+ formState.current === "provide_identifier" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1236
+ showSsoDivider && /* @__PURE__ */ jsx(Card.Divider, {}),
1237
+ nonSsoNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1238
+ ] }),
1239
+ formState.current === "select_method" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1240
+ Object.entries(authMethodBlocks).length > 0 && /* @__PURE__ */ jsx(Card.Divider, {}),
1241
+ Object.entries(authMethodBlocks).length > 0 && /* @__PURE__ */ jsx(
1242
+ AuthMethodList,
1243
+ {
1244
+ options: authMethodBlocks,
1245
+ setSelectedGroup: (group) => dispatchFormState({
1246
+ type: "action_select_method",
1247
+ method: group
1248
+ })
1249
+ }
1250
+ ),
1251
+ authMethodAdditionalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1252
+ ] }),
1253
+ formState.current === "method_active" && /* @__PURE__ */ jsxs(Form.Group, { children: [
1254
+ ui.nodes.filter(
1255
+ (n) => isUiNodeScriptAttributes(n.attributes) || n.group === UiNodeGroupEnum.Captcha
1256
+ ).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1257
+ finalNodes.sort(sortNodes).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1258
+ ] }),
1259
+ /* @__PURE__ */ jsx(OryCardFooter, {})
1260
+ ]
1261
+ }
1262
+ )
1143
1263
  ] })
1144
1264
  ] });
1145
1265
  }
1146
1266
  function AuthMethodList({ options, setSelectedGroup }) {
1147
1267
  const { Card } = useComponents();
1148
1268
  const { setValue, getValues } = useFormContext();
1269
+ if (Object.entries(options).length === 0) {
1270
+ return null;
1271
+ }
1149
1272
  const handleClick = (group, options2) => {
1150
1273
  var _a, _b, _c, _d;
1151
1274
  if (isGroupImmediateSubmit(group)) {
@@ -1205,14 +1328,29 @@ function OryFormSectionInner({
1205
1328
  }
1206
1329
  );
1207
1330
  }
1331
+ function OryConsentCard() {
1332
+ const { Form, Card } = useComponents();
1333
+ const flow = useOryFlow();
1334
+ return /* @__PURE__ */ jsxs(OryCard, { children: [
1335
+ /* @__PURE__ */ jsx(OryCardHeader, {}),
1336
+ /* @__PURE__ */ jsx(OryCardContent, { children: /* @__PURE__ */ jsxs(OryForm, { children: [
1337
+ /* @__PURE__ */ jsx(Card.Divider, {}),
1338
+ /* @__PURE__ */ jsx(Form.Group, { children: flow.flow.ui.nodes.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)) }),
1339
+ /* @__PURE__ */ jsx(Card.Divider, {}),
1340
+ /* @__PURE__ */ jsx(OryCardFooter, {})
1341
+ ] }) })
1342
+ ] });
1343
+ }
1208
1344
  function OryFormGroupDivider() {
1209
1345
  const { Card } = useComponents();
1210
1346
  const {
1211
1347
  flow: { ui }
1212
1348
  } = useOryFlow();
1213
- const filteredNodes = ui.nodes.filter((node) => node.group === "oidc");
1349
+ const filteredNodes = ui.nodes.filter(
1350
+ (node) => node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml
1351
+ );
1214
1352
  const otherNodes = ui.nodes.filter(
1215
- (node) => node.group !== "oidc" && node.group !== "default"
1353
+ (node) => !(node.group === UiNodeGroupEnum.Oidc || node.group === UiNodeGroupEnum.Saml) && node.group !== "default"
1216
1354
  );
1217
1355
  if (filteredNodes.length > 0 && otherNodes.length > 0) {
1218
1356
  return /* @__PURE__ */ jsx(Card.Divider, {});
@@ -1238,7 +1376,7 @@ function OrySettingsOidc({ nodes }) {
1238
1376
  onClick: () => {
1239
1377
  if (node.attributes.node_type === "input") {
1240
1378
  setValue("link", node.attributes.value);
1241
- setValue("method", "oidc");
1379
+ setValue("method", node.group);
1242
1380
  }
1243
1381
  }
1244
1382
  }));
@@ -1247,7 +1385,7 @@ function OrySettingsOidc({ nodes }) {
1247
1385
  onClick: () => {
1248
1386
  if (node.attributes.node_type === "input") {
1249
1387
  setValue("unlink", node.attributes.value);
1250
- setValue("method", "oidc");
1388
+ setValue("method", node.group);
1251
1389
  }
1252
1390
  }
1253
1391
  }));
@@ -1556,16 +1694,19 @@ function SettingsSectionContent({ group, nodes }) {
1556
1694
  const { Card } = useComponents();
1557
1695
  const intl = useIntl();
1558
1696
  const { flow } = useOryFlow();
1559
- const uniqueGroups = useNodesGroups(flow.ui.nodes);
1697
+ const groupedNodes = useNodesGroups(flow.ui.nodes, {
1698
+ // Script nodes are already handled by the parent component.
1699
+ omit: ["script"]
1700
+ });
1560
1701
  if (group === UiNodeGroupEnum.Totp) {
1561
1702
  return /* @__PURE__ */ jsxs(
1562
1703
  OryFormSection,
1563
1704
  {
1564
- nodes: uniqueGroups.groups.totp,
1705
+ nodes: groupedNodes.groups.totp,
1565
1706
  "data-testid": "ory/screen/settings/group/totp",
1566
1707
  children: [
1567
- /* @__PURE__ */ jsx(OrySettingsTotp, { nodes: (_a = uniqueGroups.groups.totp) != null ? _a : [] }),
1568
- (_b = uniqueGroups.groups.default) == null ? void 0 : _b.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1708
+ /* @__PURE__ */ jsx(OrySettingsTotp, { nodes: (_a = groupedNodes.groups.totp) != null ? _a : [] }),
1709
+ (_b = groupedNodes.groups.default) == null ? void 0 : _b.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1569
1710
  ]
1570
1711
  }
1571
1712
  );
@@ -1574,16 +1715,16 @@ function SettingsSectionContent({ group, nodes }) {
1574
1715
  return /* @__PURE__ */ jsxs(
1575
1716
  OryFormSection,
1576
1717
  {
1577
- nodes: uniqueGroups.groups.lookup_secret,
1718
+ nodes: groupedNodes.groups.lookup_secret,
1578
1719
  "data-testid": "ory/screen/settings/group/lookup_secret",
1579
1720
  children: [
1580
1721
  /* @__PURE__ */ jsx(
1581
1722
  OrySettingsRecoveryCodes,
1582
1723
  {
1583
- nodes: (_c = uniqueGroups.groups.lookup_secret) != null ? _c : []
1724
+ nodes: (_c = groupedNodes.groups.lookup_secret) != null ? _c : []
1584
1725
  }
1585
1726
  ),
1586
- (_d = uniqueGroups.groups.default) == null ? void 0 : _d.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1727
+ (_d = groupedNodes.groups.default) == null ? void 0 : _d.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1587
1728
  ]
1588
1729
  }
1589
1730
  );
@@ -1592,11 +1733,11 @@ function SettingsSectionContent({ group, nodes }) {
1592
1733
  return /* @__PURE__ */ jsxs(
1593
1734
  OryFormSection,
1594
1735
  {
1595
- nodes: uniqueGroups.groups.oidc,
1736
+ nodes: groupedNodes.groups.oidc,
1596
1737
  "data-testid": "ory/screen/settings/group/oidc",
1597
1738
  children: [
1598
- /* @__PURE__ */ jsx(OrySettingsOidc, { nodes: (_e = uniqueGroups.groups.oidc) != null ? _e : [] }),
1599
- (_f = uniqueGroups.groups.default) == null ? void 0 : _f.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1739
+ /* @__PURE__ */ jsx(OrySettingsOidc, { nodes: (_e = groupedNodes.groups.oidc) != null ? _e : [] }),
1740
+ (_f = groupedNodes.groups.default) == null ? void 0 : _f.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1600
1741
  ]
1601
1742
  }
1602
1743
  );
@@ -1605,11 +1746,11 @@ function SettingsSectionContent({ group, nodes }) {
1605
1746
  return /* @__PURE__ */ jsxs(
1606
1747
  OryFormSection,
1607
1748
  {
1608
- nodes: uniqueGroups.groups.webauthn,
1749
+ nodes: groupedNodes.groups.webauthn,
1609
1750
  "data-testid": "ory/screen/settings/group/webauthn",
1610
1751
  children: [
1611
- /* @__PURE__ */ jsx(OrySettingsWebauthn, { nodes: (_g = uniqueGroups.groups.webauthn) != null ? _g : [] }),
1612
- (_h = uniqueGroups.groups.default) == null ? void 0 : _h.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1752
+ /* @__PURE__ */ jsx(OrySettingsWebauthn, { nodes: (_g = groupedNodes.groups.webauthn) != null ? _g : [] }),
1753
+ (_h = groupedNodes.groups.default) == null ? void 0 : _h.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1613
1754
  ]
1614
1755
  }
1615
1756
  );
@@ -1618,11 +1759,11 @@ function SettingsSectionContent({ group, nodes }) {
1618
1759
  return /* @__PURE__ */ jsxs(
1619
1760
  OryFormSection,
1620
1761
  {
1621
- nodes: uniqueGroups.groups.passkey,
1762
+ nodes: groupedNodes.groups.passkey,
1622
1763
  "data-testid": "ory/screen/settings/group/passkey",
1623
1764
  children: [
1624
- /* @__PURE__ */ jsx(OrySettingsPasskey, { nodes: (_i = uniqueGroups.groups.passkey) != null ? _i : [] }),
1625
- (_j = uniqueGroups.groups.default) == null ? void 0 : _j.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1765
+ /* @__PURE__ */ jsx(OrySettingsPasskey, { nodes: (_i = groupedNodes.groups.passkey) != null ? _i : [] }),
1766
+ (_j = groupedNodes.groups.default) == null ? void 0 : _j.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
1626
1767
  ]
1627
1768
  }
1628
1769
  );
@@ -1643,7 +1784,7 @@ function SettingsSectionContent({ group, nodes }) {
1643
1784
  id: `settings.${group}.description`
1644
1785
  }),
1645
1786
  children: [
1646
- (_k = uniqueGroups.groups.default) == null ? void 0 : _k.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1787
+ (_k = groupedNodes.groups.default) == null ? void 0 : _k.map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k)),
1647
1788
  nodes.filter(
1648
1789
  (node) => "type" in node.attributes && node.attributes.type !== "submit"
1649
1790
  ).map((node, k) => /* @__PURE__ */ jsx(Node, { node }, k))
@@ -1657,16 +1798,16 @@ function SettingsSectionContent({ group, nodes }) {
1657
1798
  }
1658
1799
  );
1659
1800
  }
1660
- var getScriptNode = (nodes) => nodes.find(
1661
- (node) => "id" in node.attributes && node.attributes.id === "webauthn_script"
1801
+ var onlyScriptNodes = (nodes) => nodes.filter(
1802
+ (node) => isUiNodeScriptAttributes(node.attributes) && node.attributes.id === "webauthn_script"
1662
1803
  );
1663
1804
  function OrySettingsCard() {
1664
1805
  const { flow } = useOryFlow();
1665
- const uniqueGroups = useNodesGroups(flow.ui.nodes);
1666
- const scriptNode = getScriptNode(flow.ui.nodes);
1806
+ const uniqueGroups = useNodesGroups(flow.ui.nodes, { omit: ["script"] });
1807
+ const scriptNodes = onlyScriptNodes(flow.ui.nodes);
1667
1808
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1668
1809
  /* @__PURE__ */ jsx(OryCardValidationMessages, {}),
1669
- scriptNode && /* @__PURE__ */ jsx(Node, { node: scriptNode }),
1810
+ scriptNodes.map((n) => /* @__PURE__ */ jsx(Node, { node: n })),
1670
1811
  uniqueGroups.entries.map(([group, nodes]) => {
1671
1812
  if (group === UiNodeGroupEnum.Default) {
1672
1813
  return null;
@@ -2001,7 +2142,27 @@ var en_default = {
2001
2142
  "property.phone": "phone",
2002
2143
  "property.username": "username",
2003
2144
  "property.identifier": "identifier",
2004
- "property.code": "code"
2145
+ "property.code": "code",
2146
+ "consent.title": "Authorize {party}",
2147
+ "consent.subtitle": "A third party application wants to access information associated with your account {identifier}.",
2148
+ "consent.scope.openid.title": "Identity",
2149
+ "consent.scope.openid.description": "Allows the application to verify your identity. This is required for authentication and a trusted login experience.",
2150
+ "consent.scope.offline_access.title": "Offline Access",
2151
+ "consent.scope.offline_access.description": "Allows this application to keep you signed in even when you're not actively using it.",
2152
+ "consent.scope.profile.title": "Profile Information",
2153
+ "consent.scope.profile.description": "Allows access to your basic profile details, including your username, first name, and last name.",
2154
+ "consent.scope.email.title": "Email Address",
2155
+ "consent.scope.email.description": "Retrieve your email address and its verification status.",
2156
+ "consent.scope.address.title": "Physical Address",
2157
+ "consent.scope.address.description": "Access your postal address.",
2158
+ "consent.scope.phone.title": "Phone Number",
2159
+ "consent.scope.phone.description": "Retrieve your phone number and its verification status.",
2160
+ "error.title.what-happened": "What happened?",
2161
+ "error.title.what-can-i-do": "What can I do?",
2162
+ "error.instructions": "Please try again in a few minutes or contact the website operator.",
2163
+ "error.footer.text": "When reporting this error, please include the following information:",
2164
+ "error.footer.copy": "Copy",
2165
+ "error.action.go-back": "Go back"
2005
2166
  };
2006
2167
 
2007
2168
  // src/locales/de.json
@@ -2172,7 +2333,7 @@ var de_default = {
2172
2333
  "two-step.code.description": "Ein Best\xE4tigungscode wird an Ihre E-Mail gesendet.",
2173
2334
  "two-step.code.title": "E-Mail-Code",
2174
2335
  "two-step.passkey.description": "Verwenden Sie die Fingerabdruck- oder Gesichtserkennung Ihres Ger\xE4ts",
2175
- "two-step.passkey.title": "Passwort (empfohlen)",
2336
+ "two-step.passkey.title": "Passkey (empfohlen)",
2176
2337
  "two-step.password.description": "Geben Sie Ihr Passwort ein, das mit Ihrem Konto verkn\xFCpft ist",
2177
2338
  "two-step.password.title": "Passwort",
2178
2339
  "two-step.webauthn.title": "Sicherheitsschl\xFCssel",
@@ -2266,7 +2427,27 @@ var de_default = {
2266
2427
  "property.password": "Passwort",
2267
2428
  "property.phone": "Telefon",
2268
2429
  "property.code": "Code",
2269
- "property.username": "Benutzername"
2430
+ "property.username": "Benutzername",
2431
+ "consent.title": "Autorisieren {party}",
2432
+ "consent.subtitle": "Eine Drittanbieteranwendung m\xF6chte auf Informationen zugreifen, die mit Ihrem Konto {identifier} verkn\xFCpft sind.",
2433
+ "consent.scope.openid.title": "Identit\xE4t",
2434
+ "consent.scope.openid.description": "Erm\xF6glicht der Anwendung, Ihre Identit\xE4t zu \xFCberpr\xFCfen. Dies ist f\xFCr die Authentifizierung und eine vertrauensw\xFCrdige Login-Erfahrung erforderlich.",
2435
+ "consent.scope.offline_access.title": "Offline-Zugriff",
2436
+ "consent.scope.offline_access.description": "Erm\xF6glicht dieser Anwendung, Sie angemeldet zu lassen, auch wenn Sie sie nicht aktiv nutzen.",
2437
+ "consent.scope.profile.title": "Profilinformationen",
2438
+ "consent.scope.profile.description": "Erm\xF6glicht den Zugriff auf Ihre grundlegenden Profildetails, einschlie\xDFlich Ihres Benutzernamens, Vornamens und Nachnamens.",
2439
+ "consent.scope.email.title": "E-Mail-Adresse",
2440
+ "consent.scope.email.description": "Erm\xF6glicht den Abruf Ihrer E-Mail-Adresse und deren \xDCberpr\xFCfungsstatus.",
2441
+ "consent.scope.address.title": "Physische Adresse",
2442
+ "consent.scope.address.description": "Erm\xF6glicht den Zugriff auf Ihre Postanschrift.",
2443
+ "consent.scope.phone.title": "Telefonnummer",
2444
+ "consent.scope.phone.description": "Erm\xF6glicht den Abruf Ihrer Telefonnummer und deren \xDCberpr\xFCfungsstatus.",
2445
+ "error.title.what-happened": "Was ist passiert?",
2446
+ "error.footer.copy": "Kopieren",
2447
+ "error.footer.text": "Bitte f\xFCgen Sie bei der Meldung dieses Fehlers die folgenden Informationen hinzu:",
2448
+ "error.instructions": "Bitte versuchen Sie es in wenigen Minuten erneut oder wenden Sie sich an den Website-Betreiber.",
2449
+ "error.title.what-can-i-do": "Was kann ich tun?",
2450
+ "error.action.go-back": "Zur\xFCck"
2270
2451
  };
2271
2452
 
2272
2453
  // src/locales/es.json
@@ -2282,7 +2463,7 @@ var es_default = {
2282
2463
  "error.back-button": "Regresar",
2283
2464
  "error.description": "Ocurri\xF3 un error con el siguiente mensaje:",
2284
2465
  "error.support-email-link": "Si el problema persiste, por favor contacte a <a>{contactSupportEmail}</a>",
2285
- "error.title": "Ocurri\xF3 un error",
2466
+ "error.title": "",
2286
2467
  "error.title-internal-server-error": "Error Interno del Servidor",
2287
2468
  "error.title-not-found": "404 - P\xE1gina no encontrada",
2288
2469
  "identities.messages.1010001": "Iniciar sesi\xF3n",
@@ -2531,7 +2712,27 @@ var es_default = {
2531
2712
  "property.identifier": "",
2532
2713
  "property.password": "",
2533
2714
  "property.phone": "",
2534
- "property.username": ""
2715
+ "property.username": "",
2716
+ "consent.title": "Autorizar {party}",
2717
+ "consent.subtitle": "Una aplicaci\xF3n de terceros quiere acceder a la informaci\xF3n asociada a su cuenta {identifier}.",
2718
+ "consent.scope.openid.title": "Identidad",
2719
+ "consent.scope.openid.description": "Permite que la aplicaci\xF3n verifique su identidad. Esto es necesario para la autenticaci\xF3n y una experiencia de inicio de sesi\xF3n confiable.",
2720
+ "consent.scope.offline_access.title": "Acceso sin conexi\xF3n",
2721
+ "consent.scope.offline_access.description": "Permite que esta aplicaci\xF3n le mantenga conectado incluso cuando no la est\xE9 utilizando activamente.",
2722
+ "consent.scope.profile.title": "Informaci\xF3n del perfil",
2723
+ "consent.scope.profile.description": "Permite el acceso a los detalles b\xE1sicos de su perfil, incluyendo su nombre de usuario, nombre y apellido.",
2724
+ "consent.scope.email.title": "Direcci\xF3n de correo electr\xF3nico",
2725
+ "consent.scope.email.description": "Recupere su direcci\xF3n de correo electr\xF3nico y su estado de verificaci\xF3n.",
2726
+ "consent.scope.address.title": "Direcci\xF3n f\xEDsica",
2727
+ "consent.scope.address.description": "Acceda a su direcci\xF3n postal.",
2728
+ "consent.scope.phone.title": "N\xFAmero de tel\xE9fono",
2729
+ "consent.scope.phone.description": "Recupere su n\xFAmero de tel\xE9fono y su estado de verificaci\xF3n.",
2730
+ "error.action.go-back": "",
2731
+ "error.footer.copy": "",
2732
+ "error.footer.text": "",
2733
+ "error.instructions": "",
2734
+ "error.title.what-can-i-do": "",
2735
+ "error.title.what-happened": ""
2535
2736
  };
2536
2737
 
2537
2738
  // src/locales/fr.json
@@ -2796,7 +2997,27 @@ var fr_default = {
2796
2997
  "property.identifier": "",
2797
2998
  "property.password": "",
2798
2999
  "property.phone": "",
2799
- "property.username": ""
3000
+ "property.username": "",
3001
+ "consent.title": "Autoriser {party}",
3002
+ "consent.subtitle": "Une application tierce souhaite acc\xE9der aux informations associ\xE9es \xE0 votre compte {identifier}.",
3003
+ "consent.scope.openid.title": "Identit\xE9",
3004
+ "consent.scope.openid.description": "Permet \xE0 l'application de v\xE9rifier votre identit\xE9. Cela est n\xE9cessaire pour l'authentification et une exp\xE9rience de connexion fiable.",
3005
+ "consent.scope.offline_access.title": "Acc\xE8s hors ligne",
3006
+ "consent.scope.offline_access.description": "Permet \xE0 cette application de vous maintenir connect\xE9 m\xEAme lorsque vous ne l'utilisez pas activement.",
3007
+ "consent.scope.profile.title": "Informations de profil",
3008
+ "consent.scope.profile.description": "Permet l'acc\xE8s aux d\xE9tails de base de votre profil, y compris votre nom d'utilisateur, pr\xE9nom et nom.",
3009
+ "consent.scope.email.title": "Adresse e-mail",
3010
+ "consent.scope.email.description": "R\xE9cup\xE8re votre adresse e-mail et son statut de v\xE9rification.",
3011
+ "consent.scope.address.title": "Adresse physique",
3012
+ "consent.scope.address.description": "Acc\xE8de \xE0 votre adresse postale.",
3013
+ "consent.scope.phone.title": "Num\xE9ro de t\xE9l\xE9phone",
3014
+ "consent.scope.phone.description": "R\xE9cup\xE8re votre num\xE9ro de t\xE9l\xE9phone et son statut de v\xE9rification.",
3015
+ "error.action.go-back": "",
3016
+ "error.footer.copy": "",
3017
+ "error.footer.text": "",
3018
+ "error.title.what-can-i-do": "",
3019
+ "error.title.what-happened": "",
3020
+ "error.instructions": ""
2800
3021
  };
2801
3022
 
2802
3023
  // src/locales/nl.json
@@ -3061,7 +3282,27 @@ var nl_default = {
3061
3282
  "property.identifier": "",
3062
3283
  "property.password": "",
3063
3284
  "property.phone": "",
3064
- "property.username": ""
3285
+ "property.username": "",
3286
+ "consent.title": "Autoriseren {party}",
3287
+ "consent.subtitle": "Een derde partij applicatie wil toegang tot informatie die aan uw account {identifier} is gekoppeld.",
3288
+ "consent.scope.openid.title": "Identiteit",
3289
+ "consent.scope.openid.description": "Stelt de applicatie in staat uw identiteit te verifi\xEBren. Dit is vereist voor authenticatie en een betrouwbare inlogervaring.",
3290
+ "consent.scope.offline_access.title": "Offline toegang",
3291
+ "consent.scope.offline_access.description": "Stelt deze applicatie in staat u ingelogd te houden, zelfs wanneer u deze niet actief gebruikt.",
3292
+ "consent.scope.profile.title": "Profielinformatie",
3293
+ "consent.scope.profile.description": "Geeft toegang tot uw basisprofielgegevens, inclusief uw gebruikersnaam, voornaam en achternaam.",
3294
+ "consent.scope.email.title": "E-mailadres",
3295
+ "consent.scope.email.description": "Haal uw e-mailadres en de verificatiestatus ervan op.",
3296
+ "consent.scope.address.title": "Fysiek adres",
3297
+ "consent.scope.address.description": "Toegang tot uw postadres.",
3298
+ "consent.scope.phone.title": "Telefoonnummer",
3299
+ "consent.scope.phone.description": "Haal uw telefoonnummer en de verificatiestatus ervan op.",
3300
+ "error.action.go-back": "",
3301
+ "error.footer.copy": "",
3302
+ "error.footer.text": "",
3303
+ "error.title.what-can-i-do": "",
3304
+ "error.title.what-happened": "",
3305
+ "error.instructions": ""
3065
3306
  };
3066
3307
 
3067
3308
  // src/locales/pl.json
@@ -3326,7 +3567,27 @@ var pl_default = {
3326
3567
  "property.password": "",
3327
3568
  "property.phone": "",
3328
3569
  "property.username": "",
3329
- "property.identifier": ""
3570
+ "property.identifier": "",
3571
+ "consent.title": "Autoryzuj {party}",
3572
+ "consent.subtitle": "Aplikacja trzeciej strony chce uzyska\u0107 dost\u0119p do informacji powi\u0105zanych z Twoim kontem {identifier}.",
3573
+ "consent.scope.openid.title": "To\u017Csamo\u015B\u0107",
3574
+ "consent.scope.openid.description": "Pozwala aplikacji zweryfikowa\u0107 Twoj\u0105 to\u017Csamo\u015B\u0107. Jest to wymagane do uwierzytelniania i zapewnienia zaufanej sesji logowania.",
3575
+ "consent.scope.offline_access.title": "Dost\u0119p offline",
3576
+ "consent.scope.offline_access.description": "Pozwala aplikacji utrzyma\u0107 Twoje logowanie, nawet gdy nie korzystasz z niej aktywnie.",
3577
+ "consent.scope.profile.title": "Informacje profilowe",
3578
+ "consent.scope.profile.description": "Pozwala na dost\u0119p do podstawowych danych profilowych, w tym nazwy u\u017Cytkownika, imienia i nazwiska.",
3579
+ "consent.scope.email.title": "Adres e-mail",
3580
+ "consent.scope.email.description": "Pobierz sw\xF3j adres e-mail oraz status jego weryfikacji.",
3581
+ "consent.scope.address.title": "Adres fizyczny",
3582
+ "consent.scope.address.description": "Dost\u0119p do Twojego adresu pocztowego.",
3583
+ "consent.scope.phone.title": "Numer telefonu",
3584
+ "consent.scope.phone.description": "Pobierz sw\xF3j numer telefonu oraz status jego weryfikacji.",
3585
+ "error.action.go-back": "",
3586
+ "error.footer.copy": "",
3587
+ "error.footer.text": "",
3588
+ "error.title.what-can-i-do": "",
3589
+ "error.title.what-happened": "",
3590
+ "error.instructions": ""
3330
3591
  };
3331
3592
 
3332
3593
  // src/locales/pt.json
@@ -3591,7 +3852,27 @@ var pt_default = {
3591
3852
  "property.identifier": "",
3592
3853
  "property.password": "",
3593
3854
  "property.phone": "",
3594
- "property.username": ""
3855
+ "property.username": "",
3856
+ "consent.title": "Autorizar {party}",
3857
+ "consent.subtitle": "Um aplicativo de terceiros deseja acessar as informa\xE7\xF5es associadas \xE0 sua conta {identifier}.",
3858
+ "consent.scope.openid.title": "Identidade",
3859
+ "consent.scope.openid.description": "Permite que a aplica\xE7\xE3o verifique sua identidade. Isso \xE9 necess\xE1rio para a autentica\xE7\xE3o e uma experi\xEAncia de login confi\xE1vel.",
3860
+ "consent.scope.offline_access.title": "Acesso Offline",
3861
+ "consent.scope.offline_access.description": "Permite que este aplicativo mantenha voc\xEA conectado mesmo quando n\xE3o estiver usando-o ativamente.",
3862
+ "consent.scope.profile.title": "Informa\xE7\xF5es do Perfil",
3863
+ "consent.scope.profile.description": "Permite o acesso aos detalhes b\xE1sicos do seu perfil, incluindo seu nome de usu\xE1rio, primeiro nome e sobrenome.",
3864
+ "consent.scope.email.title": "Endere\xE7o de E-mail",
3865
+ "consent.scope.email.description": "Recupere seu endere\xE7o de e-mail e seu status de verifica\xE7\xE3o.",
3866
+ "consent.scope.address.title": "Endere\xE7o F\xEDsico",
3867
+ "consent.scope.address.description": "Acesse seu endere\xE7o postal.",
3868
+ "consent.scope.phone.title": "N\xFAmero de Telefone",
3869
+ "consent.scope.phone.description": "Recupere seu n\xFAmero de telefone e seu status de verifica\xE7\xE3o.",
3870
+ "error.action.go-back": "",
3871
+ "error.footer.copy": "",
3872
+ "error.footer.text": "",
3873
+ "error.title.what-can-i-do": "",
3874
+ "error.title.what-happened": "",
3875
+ "error.instructions": ""
3595
3876
  };
3596
3877
 
3597
3878
  // src/locales/sv.json
@@ -3856,7 +4137,27 @@ var sv_default = {
3856
4137
  "property.phone": "telefon",
3857
4138
  "property.username": "anv\xE4ndarnamn",
3858
4139
  "property.identifier": "identifier",
3859
- "property.code": "kod"
4140
+ "property.code": "kod",
4141
+ "consent.title": "Auktorisera {party}",
4142
+ "consent.subtitle": "En tredjepartsapplikation vill f\xE5 tillg\xE5ng till information kopplad till ditt konto {identifier}.",
4143
+ "consent.scope.openid.title": "Identitet",
4144
+ "consent.scope.openid.description": "G\xF6r det m\xF6jligt f\xF6r applikationen att verifiera din identitet. Detta kr\xE4vs f\xF6r autentisering och en p\xE5litlig inloggningsupplevelse.",
4145
+ "consent.scope.offline_access.title": "Offline-\xE5tkomst",
4146
+ "consent.scope.offline_access.description": "G\xF6r det m\xF6jligt f\xF6r denna applikation att h\xE5lla dig inloggad \xE4ven n\xE4r du inte aktivt anv\xE4nder den.",
4147
+ "consent.scope.profile.title": "Profilinformation",
4148
+ "consent.scope.profile.description": "Ger tillg\xE5ng till dina grundl\xE4ggande profiluppgifter, inklusive ditt anv\xE4ndarnamn, f\xF6rnamn och efternamn.",
4149
+ "consent.scope.email.title": "E-postadress",
4150
+ "consent.scope.email.description": "H\xE4mta din e-postadress och dess verifieringsstatus.",
4151
+ "consent.scope.address.title": "Fysisk adress",
4152
+ "consent.scope.address.description": "F\xE5 \xE5tkomst till din postadress.",
4153
+ "consent.scope.phone.title": "Telefonnummer",
4154
+ "consent.scope.phone.description": "H\xE4mta ditt telefonnummer och dess verifieringsstatus.",
4155
+ "error.action.go-back": "",
4156
+ "error.footer.copy": "",
4157
+ "error.footer.text": "",
4158
+ "error.title.what-can-i-do": "",
4159
+ "error.title.what-happened": "",
4160
+ "error.instructions": ""
3860
4161
  };
3861
4162
 
3862
4163
  // src/locales/index.ts
@@ -3871,6 +4172,6 @@ var OryLocales = {
3871
4172
  sv: sv_default
3872
4173
  };
3873
4174
 
3874
- export { HeadlessPageHeader, OryCard, OryCardContent, OryCardFooter, OryCardHeader, OryCardValidationMessages, OryForm, OryFormGroupDivider, OryFormGroups, OryFormOidcButtons, OryFormSection, OryFormSocialButtonsForm, OryLocales, OryProvider, OrySettingsCard, OryTwoStepCard, messageTestId, uiTextToFormattedMessage, useComponents, useNodeSorter, useOryFlow };
4175
+ export { HeadlessPageHeader, OryCard, OryCardContent, OryCardFooter, OryCardHeader, OryCardValidationMessages, OryConsentCard, OryForm, OryFormGroupDivider, OryFormGroups, OryFormOidcButtons, OryFormSection, OryFormSocialButtonsForm, OryLocales, OryProvider, OrySettingsCard, OryTwoStepCard, messageTestId, uiTextToFormattedMessage, useComponents, useNodeSorter, useOryFlow };
3875
4176
  //# sourceMappingURL=index.mjs.map
3876
4177
  //# sourceMappingURL=index.mjs.map