@thunderid/react 0.5.0 → 0.6.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 (113) hide show
  1. package/dist/api/{getScim2Me.d.ts → getUsersMe.d.ts} +11 -11
  2. package/dist/api/{getScim2Me.d.ts.map → getUsersMe.d.ts.map} +1 -1
  3. package/dist/api/{getScim2Me.js → getUsersMe.js} +12 -12
  4. package/dist/api/{getScim2Me.js.map → getUsersMe.js.map} +1 -1
  5. package/dist/api/updateMeProfile.d.ts +5 -5
  6. package/dist/api/updateMeProfile.js +6 -6
  7. package/dist/api/updateMeProfile.js.map +1 -1
  8. package/dist/cjs/api/{getScim2Me.cjs → getUsersMe.cjs} +11 -11
  9. package/dist/cjs/api/{getScim2Me.cjs.map → getUsersMe.cjs.map} +1 -1
  10. package/dist/cjs/api/updateMeProfile.cjs +6 -6
  11. package/dist/cjs/api/updateMeProfile.cjs.map +1 -1
  12. package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.cjs +48 -58
  13. package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.cjs.map +1 -1
  14. package/dist/cjs/components/presentation/UserProfile/UserProfile.cjs +21 -8
  15. package/dist/cjs/components/presentation/UserProfile/UserProfile.cjs.map +1 -1
  16. package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.cjs +9 -1
  17. package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.cjs.map +1 -1
  18. package/dist/cjs/components/presentation/auth/AuthOptionFactory.cjs +52 -9
  19. package/dist/cjs/components/presentation/auth/AuthOptionFactory.cjs.map +1 -1
  20. package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.cjs +11 -1
  21. package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.cjs.map +1 -1
  22. package/dist/cjs/components/presentation/auth/Recovery/BaseRecovery.cjs +18 -14
  23. package/dist/cjs/components/presentation/auth/Recovery/BaseRecovery.cjs.map +1 -1
  24. package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.cjs +35 -9
  25. package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.cjs.map +1 -1
  26. package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.cjs +18 -13
  27. package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.cjs.map +1 -1
  28. package/dist/cjs/components/primitives/AffixedField/AffixedField.cjs +88 -0
  29. package/dist/cjs/components/primitives/AffixedField/AffixedField.cjs.map +1 -0
  30. package/dist/cjs/components/primitives/AffixedField/AffixedField.styles.cjs +130 -0
  31. package/dist/cjs/components/primitives/AffixedField/AffixedField.styles.cjs.map +1 -0
  32. package/dist/cjs/contexts/ComponentRenderer/ComponentRendererContext.cjs.map +1 -1
  33. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs +1 -0
  34. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs.map +1 -1
  35. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs +23 -7
  36. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
  37. package/dist/cjs/contexts/User/UserContext.cjs +0 -1
  38. package/dist/cjs/contexts/User/UserContext.cjs.map +1 -1
  39. package/dist/cjs/contexts/User/UserProvider.cjs +0 -2
  40. package/dist/cjs/contexts/User/UserProvider.cjs.map +1 -1
  41. package/dist/cjs/contexts/User/useUser.cjs +0 -1
  42. package/dist/cjs/contexts/User/useUser.cjs.map +1 -1
  43. package/dist/cjs/index.cjs +2 -2
  44. package/dist/cjs/utils/composeAffixedInputs.cjs +74 -0
  45. package/dist/cjs/utils/composeAffixedInputs.cjs.map +1 -0
  46. package/dist/components/presentation/UserProfile/BaseUserProfile.d.ts +0 -20
  47. package/dist/components/presentation/UserProfile/BaseUserProfile.d.ts.map +1 -1
  48. package/dist/components/presentation/UserProfile/BaseUserProfile.js +50 -60
  49. package/dist/components/presentation/UserProfile/BaseUserProfile.js.map +1 -1
  50. package/dist/components/presentation/UserProfile/UserProfile.d.ts +1 -1
  51. package/dist/components/presentation/UserProfile/UserProfile.d.ts.map +1 -1
  52. package/dist/components/presentation/UserProfile/UserProfile.js +22 -9
  53. package/dist/components/presentation/UserProfile/UserProfile.js.map +1 -1
  54. package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.d.ts.map +1 -1
  55. package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.js +9 -1
  56. package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.js.map +1 -1
  57. package/dist/components/presentation/auth/AuthOptionFactory.d.ts +12 -4
  58. package/dist/components/presentation/auth/AuthOptionFactory.d.ts.map +1 -1
  59. package/dist/components/presentation/auth/AuthOptionFactory.js +52 -9
  60. package/dist/components/presentation/auth/AuthOptionFactory.js.map +1 -1
  61. package/dist/components/presentation/auth/InviteUser/BaseInviteUser.d.ts.map +1 -1
  62. package/dist/components/presentation/auth/InviteUser/BaseInviteUser.js +11 -1
  63. package/dist/components/presentation/auth/InviteUser/BaseInviteUser.js.map +1 -1
  64. package/dist/components/presentation/auth/Recovery/BaseRecovery.d.ts.map +1 -1
  65. package/dist/components/presentation/auth/Recovery/BaseRecovery.js +19 -15
  66. package/dist/components/presentation/auth/Recovery/BaseRecovery.js.map +1 -1
  67. package/dist/components/presentation/auth/SignIn/BaseSignIn.d.ts.map +1 -1
  68. package/dist/components/presentation/auth/SignIn/BaseSignIn.js +37 -11
  69. package/dist/components/presentation/auth/SignIn/BaseSignIn.js.map +1 -1
  70. package/dist/components/presentation/auth/SignUp/BaseSignUp.d.ts.map +1 -1
  71. package/dist/components/presentation/auth/SignUp/BaseSignUp.js +18 -13
  72. package/dist/components/presentation/auth/SignUp/BaseSignUp.js.map +1 -1
  73. package/dist/components/primitives/AffixedField/AffixedField.d.ts +52 -0
  74. package/dist/components/primitives/AffixedField/AffixedField.d.ts.map +1 -0
  75. package/dist/components/primitives/AffixedField/AffixedField.js +83 -0
  76. package/dist/components/primitives/AffixedField/AffixedField.js.map +1 -0
  77. package/dist/components/primitives/AffixedField/AffixedField.styles.d.ts +25 -0
  78. package/dist/components/primitives/AffixedField/AffixedField.styles.d.ts.map +1 -0
  79. package/dist/components/primitives/AffixedField/AffixedField.styles.js +127 -0
  80. package/dist/components/primitives/AffixedField/AffixedField.styles.js.map +1 -0
  81. package/dist/components/primitives/AffixedField/index.d.ts +20 -0
  82. package/dist/components/primitives/AffixedField/index.d.ts.map +1 -0
  83. package/dist/components/primitives/Dialog/Dialog.js +3 -3
  84. package/dist/components/primitives/Dialog/Dialog.js.map +1 -1
  85. package/dist/contexts/ComponentRenderer/ComponentRendererContext.d.ts +1 -0
  86. package/dist/contexts/ComponentRenderer/ComponentRendererContext.d.ts.map +1 -1
  87. package/dist/contexts/ComponentRenderer/ComponentRendererContext.js.map +1 -1
  88. package/dist/contexts/ThunderID/ThunderIDContext.d.ts +1 -0
  89. package/dist/contexts/ThunderID/ThunderIDContext.d.ts.map +1 -1
  90. package/dist/contexts/ThunderID/ThunderIDContext.js +1 -0
  91. package/dist/contexts/ThunderID/ThunderIDContext.js.map +1 -1
  92. package/dist/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
  93. package/dist/contexts/ThunderID/ThunderIDProvider.js +23 -7
  94. package/dist/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
  95. package/dist/contexts/User/UserContext.d.ts +1 -2
  96. package/dist/contexts/User/UserContext.d.ts.map +1 -1
  97. package/dist/contexts/User/UserContext.js +0 -1
  98. package/dist/contexts/User/UserContext.js.map +1 -1
  99. package/dist/contexts/User/UserProvider.d.ts +0 -1
  100. package/dist/contexts/User/UserProvider.d.ts.map +1 -1
  101. package/dist/contexts/User/UserProvider.js +0 -2
  102. package/dist/contexts/User/UserProvider.js.map +1 -1
  103. package/dist/contexts/User/useUser.d.ts +0 -1
  104. package/dist/contexts/User/useUser.d.ts.map +1 -1
  105. package/dist/contexts/User/useUser.js +0 -1
  106. package/dist/contexts/User/useUser.js.map +1 -1
  107. package/dist/index.d.ts +2 -2
  108. package/dist/index.js +2 -2
  109. package/dist/utils/composeAffixedInputs.d.ts +52 -0
  110. package/dist/utils/composeAffixedInputs.d.ts.map +1 -0
  111. package/dist/utils/composeAffixedInputs.js +70 -0
  112. package/dist/utils/composeAffixedInputs.js.map +1 -0
  113. package/package.json +3 -2
@@ -0,0 +1,83 @@
1
+ import useTheme_default from "../../../contexts/Theme/useTheme.js";
2
+ import FormControl_default from "../FormControl/FormControl.js";
3
+ import InputLabel_default from "../InputLabel/InputLabel.js";
4
+ import AffixedField_styles_default from "./AffixedField.styles.js";
5
+ import { bem, withVendorCSSClassPrefix } from "@thunderid/browser";
6
+ import { useId } from "react";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { cx } from "@emotion/css";
9
+
10
+ //#region src/components/primitives/AffixedField/AffixedField.tsx
11
+ /**
12
+ * Converts the polymorphic `prefixes` prop into a uniform list. A string is treated
13
+ * as a single fixed entry so the rest of the component can iterate a single shape.
14
+ */
15
+ const normalizePrefixes = (prefixes) => {
16
+ if (typeof prefixes === "string") return prefixes.length > 0 ? [{
17
+ label: prefixes,
18
+ value: prefixes
19
+ }] : [];
20
+ return prefixes ?? [];
21
+ };
22
+ const AffixedField = ({ label, error, required, className, disabled, helperText, prefixes, prefixValue, onPrefixChange, type = "text", style = {},...rest }) => {
23
+ const { theme, colorScheme } = useTheme_default();
24
+ const hasError = !!error;
25
+ const prefixList = normalizePrefixes(prefixes);
26
+ const hasPrefix = prefixList.length > 0;
27
+ const hasFixedPrefix = prefixList.length === 1;
28
+ const styles = AffixedField_styles_default(theme, colorScheme, disabled ?? false, hasError, hasPrefix);
29
+ const prefixDescriptionId = `${useId()}-prefix`;
30
+ const containerClassName = cx(withVendorCSSClassPrefix(bem("affixed-field", "container")), styles["inputContainer"]);
31
+ const inputClassName = cx(withVendorCSSClassPrefix(bem("affixed-field", "input")), styles["input"]);
32
+ const renderPrefix = () => {
33
+ if (prefixList.length === 0) return null;
34
+ if (prefixList.length === 1) return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
35
+ className: cx(withVendorCSSClassPrefix(bem("affixed-field", "prefix-span")), styles["prefixSpan"]),
36
+ "aria-hidden": "true",
37
+ children: prefixList[0].label
38
+ }), /* @__PURE__ */ jsx("span", {
39
+ id: prefixDescriptionId,
40
+ className: styles["visuallyHidden"],
41
+ children: prefixList[0].label
42
+ })] });
43
+ const selectedValue = prefixValue ?? prefixList[0].value;
44
+ return /* @__PURE__ */ jsx("select", {
45
+ className: cx(withVendorCSSClassPrefix(bem("affixed-field", "prefix-select")), styles["prefixSelect"]),
46
+ value: selectedValue,
47
+ disabled,
48
+ onChange: (e) => onPrefixChange?.(e.target.value),
49
+ "aria-label": "Prefix",
50
+ children: prefixList.map((p) => /* @__PURE__ */ jsx("option", {
51
+ value: p.value,
52
+ children: p.label
53
+ }, p.value))
54
+ });
55
+ };
56
+ return /* @__PURE__ */ jsxs(FormControl_default, {
57
+ error,
58
+ helperText,
59
+ className: cx(withVendorCSSClassPrefix(bem("affixed-field")), className),
60
+ style,
61
+ children: [label && /* @__PURE__ */ jsx(InputLabel_default, {
62
+ required,
63
+ error: hasError,
64
+ children: label
65
+ }), /* @__PURE__ */ jsxs("div", {
66
+ className: containerClassName,
67
+ children: [renderPrefix(), /* @__PURE__ */ jsx("input", {
68
+ className: inputClassName,
69
+ type,
70
+ disabled,
71
+ "aria-invalid": hasError,
72
+ "aria-required": required,
73
+ ...rest,
74
+ "aria-describedby": [rest["aria-describedby"], hasFixedPrefix ? prefixDescriptionId : void 0].filter(Boolean).join(" ") || void 0
75
+ })]
76
+ })]
77
+ });
78
+ };
79
+ var AffixedField_default = AffixedField;
80
+
81
+ //#endregion
82
+ export { AffixedField_default as default };
83
+ //# sourceMappingURL=AffixedField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AffixedField.js","names":["AffixedField: FC<AffixedFieldProps>","useTheme","hasError: boolean","prefixList: PrefixOption[]","hasPrefix: boolean","hasFixedPrefix: boolean","styles: Record<string, string>","useStyles","prefixDescriptionId: string","containerClassName: string","inputClassName: string","selectedValue: string","FormControl","InputLabel"],"sources":["../../../../src/components/primitives/AffixedField/AffixedField.tsx"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {cx} from '@emotion/css';\nimport {PrefixOption, bem, withVendorCSSClassPrefix} from '@thunderid/browser';\nimport {ChangeEvent, FC, InputHTMLAttributes, ReactElement, useId} from 'react';\nimport useStyles from './AffixedField.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport FormControl from '../FormControl/FormControl';\nimport InputLabel from '../InputLabel/InputLabel';\n\nexport interface AffixedFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'prefix'> {\n /** Additional CSS class names applied to the outer form control. */\n className?: string;\n /** Whether the field is disabled. */\n disabled?: boolean;\n /** Error message to render below the field. */\n error?: string;\n /** Helper text to render below the field. */\n helperText?: string;\n /** Label rendered above the field. */\n label?: string;\n /**\n * Called when the user changes the selected prefix. Only fires when `prefixes` is an\n * array with two or more entries and the user picks a different one.\n */\n onPrefixChange?: (prefixValue: string) => void;\n /**\n * Currently selected prefix `value` (must match one of the resolved prefix entries'\n * `value`). Required when `prefixes` resolves to a non-empty list. Ignored otherwise.\n */\n prefixValue?: string;\n /**\n * Leading affix. `string` renders as a fixed span; `PrefixOption[]` renders as a fixed\n * span (single entry) or dropdown (multiple entries). Empty or undefined renders a\n * plain input with no leading element.\n */\n prefixes?: string | PrefixOption[];\n /** Whether the field is required. */\n required?: boolean;\n}\n\n/**\n * Converts the polymorphic `prefixes` prop into a uniform list. A string is treated\n * as a single fixed entry so the rest of the component can iterate a single shape.\n */\nconst normalizePrefixes = (prefixes: string | PrefixOption[] | undefined): PrefixOption[] => {\n if (typeof prefixes === 'string') {\n return prefixes.length > 0 ? [{label: prefixes, value: prefixes}] : [];\n }\n return prefixes ?? [];\n};\n\nconst AffixedField: FC<AffixedFieldProps> = ({\n label,\n error,\n required,\n className,\n disabled,\n helperText,\n prefixes,\n prefixValue,\n onPrefixChange,\n type = 'text',\n style = {},\n ...rest\n}: AffixedFieldProps) => {\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const hasError: boolean = !!error;\n const prefixList: PrefixOption[] = normalizePrefixes(prefixes);\n const hasPrefix: boolean = prefixList.length > 0;\n const hasFixedPrefix: boolean = prefixList.length === 1;\n const styles: Record<string, string> = useStyles(theme, colorScheme, disabled ?? false, hasError, hasPrefix);\n // Stable id for the visually-hidden prefix announcement; only referenced when a\n // fixed prefix is present, but generated unconditionally so the hook order is stable.\n const prefixDescriptionId: string = `${useId()}-prefix`;\n\n const containerClassName: string = cx(\n withVendorCSSClassPrefix(bem('affixed-field', 'container')),\n styles['inputContainer'],\n );\n\n const inputClassName: string = cx(withVendorCSSClassPrefix(bem('affixed-field', 'input')), styles['input']);\n\n const renderPrefix = (): ReactElement | null => {\n if (prefixList.length === 0) return null;\n\n if (prefixList.length === 1) {\n return (\n <>\n <span\n className={cx(withVendorCSSClassPrefix(bem('affixed-field', 'prefix-span')), styles['prefixSpan'])}\n aria-hidden=\"true\"\n >\n {prefixList[0].label}\n </span>\n {/* Assistive-tech-only mirror of the fixed prefix; wired to the input via aria-describedby. */}\n <span id={prefixDescriptionId} className={styles['visuallyHidden']}>\n {prefixList[0].label}\n </span>\n </>\n );\n }\n\n const selectedValue: string = prefixValue ?? prefixList[0].value;\n return (\n <select\n className={cx(withVendorCSSClassPrefix(bem('affixed-field', 'prefix-select')), styles['prefixSelect'])}\n value={selectedValue}\n disabled={disabled}\n onChange={(e: ChangeEvent<HTMLSelectElement>): void => onPrefixChange?.(e.target.value)}\n aria-label=\"Prefix\"\n >\n {prefixList.map((p: PrefixOption) => (\n <option key={p.value} value={p.value}>\n {p.label}\n </option>\n ))}\n </select>\n );\n };\n\n return (\n <FormControl\n error={error}\n helperText={helperText}\n className={cx(withVendorCSSClassPrefix(bem('affixed-field')), className)}\n style={style}\n >\n {label && (\n <InputLabel required={required} error={hasError}>\n {label}\n </InputLabel>\n )}\n <div className={containerClassName}>\n {renderPrefix()}\n <input\n className={inputClassName}\n type={type}\n disabled={disabled}\n aria-invalid={hasError}\n aria-required={required}\n {...rest}\n aria-describedby={\n [rest['aria-describedby'], hasFixedPrefix ? prefixDescriptionId : undefined].filter(Boolean).join(' ') ||\n undefined\n }\n />\n </div>\n </FormControl>\n );\n};\n\nexport default AffixedField;\n"],"mappings":";;;;;;;;;;;;;;AA6DA,MAAM,qBAAqB,aAAkE;AAC3F,KAAI,OAAO,aAAa,SACtB,QAAO,SAAS,SAAS,IAAI,CAAC;EAAC,OAAO;EAAU,OAAO;EAAS,CAAC,GAAG,EAAE;AAExE,QAAO,YAAY,EAAE;;AAGvB,MAAMA,gBAAuC,EAC3C,OACA,OACA,UACA,WACA,UACA,YACA,UACA,aACA,gBACA,OAAO,QACP,QAAQ,EAAE,CACV,GAAG,WACoB;CACvB,MAAM,EAAC,OAAO,gBAA4CC,kBAAU;CACpE,MAAMC,WAAoB,CAAC,CAAC;CAC5B,MAAMC,aAA6B,kBAAkB,SAAS;CAC9D,MAAMC,YAAqB,WAAW,SAAS;CAC/C,MAAMC,iBAA0B,WAAW,WAAW;CACtD,MAAMC,SAAiCC,4BAAU,OAAO,aAAa,YAAY,OAAO,UAAU,UAAU;CAG5G,MAAMC,sBAA8B,GAAG,OAAO,CAAC;CAE/C,MAAMC,qBAA6B,GACjC,yBAAyB,IAAI,iBAAiB,YAAY,CAAC,EAC3D,OAAO,kBACR;CAED,MAAMC,iBAAyB,GAAG,yBAAyB,IAAI,iBAAiB,QAAQ,CAAC,EAAE,OAAO,SAAS;CAE3G,MAAM,qBAA0C;AAC9C,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,MAAI,WAAW,WAAW,EACxB,QACE,4CACE,oBAAC;GACC,WAAW,GAAG,yBAAyB,IAAI,iBAAiB,cAAc,CAAC,EAAE,OAAO,cAAc;GAClG,eAAY;aAEX,WAAW,GAAG;IACV,EAEP,oBAAC;GAAK,IAAI;GAAqB,WAAW,OAAO;aAC9C,WAAW,GAAG;IACV,IACN;EAIP,MAAMC,gBAAwB,eAAe,WAAW,GAAG;AAC3D,SACE,oBAAC;GACC,WAAW,GAAG,yBAAyB,IAAI,iBAAiB,gBAAgB,CAAC,EAAE,OAAO,gBAAgB;GACtG,OAAO;GACG;GACV,WAAW,MAA4C,iBAAiB,EAAE,OAAO,MAAM;GACvF,cAAW;aAEV,WAAW,KAAK,MACf,oBAAC;IAAqB,OAAO,EAAE;cAC5B,EAAE;MADQ,EAAE,MAEN,CACT;IACK;;AAIb,QACE,qBAACC;EACQ;EACK;EACZ,WAAW,GAAG,yBAAyB,IAAI,gBAAgB,CAAC,EAAE,UAAU;EACjE;aAEN,SACC,oBAACC;GAAqB;GAAU,OAAO;aACpC;IACU,EAEf,qBAAC;GAAI,WAAW;cACb,cAAc,EACf,oBAAC;IACC,WAAW;IACL;IACI;IACV,gBAAc;IACd,iBAAe;IACf,GAAI;IACJ,oBACE,CAAC,KAAK,qBAAqB,iBAAiB,sBAAsB,OAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IACtG;KAEF;IACE;GACM;;AAIlB,2BAAe"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).
3
+ *
4
+ * WSO2 LLC. licenses this file to you under the Apache License,
5
+ * Version 2.0 (the "License"); you may not use this file except
6
+ * in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing,
12
+ * software distributed under the License is distributed on an
13
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ * KIND, either express or implied. See the License for the
15
+ * specific language governing permissions and limitations
16
+ * under the License.
17
+ */
18
+ import { Theme } from '@thunderid/browser';
19
+ /**
20
+ * Creates styles for the AffixedField component. The container is a horizontal flex
21
+ * row with a prefix element (span or select) joined to a shared-border input.
22
+ */
23
+ declare const useStyles: (theme: Theme, colorScheme: string, disabled: boolean, hasError: boolean, hasPrefix: boolean) => Record<string, string>;
24
+ export default useStyles;
25
+ //# sourceMappingURL=AffixedField.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AffixedField.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/primitives/AffixedField/AffixedField.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAGzC;;;GAGG;AACH,QAAA,MAAM,SAAS,GACb,OAAO,KAAK,EACZ,aAAa,MAAM,EACnB,UAAU,OAAO,EACjB,UAAU,OAAO,EACjB,WAAW,OAAO,KACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CA6HiC,CAAC;AAE1D,eAAe,SAAS,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { useMemo } from "react";
2
+ import { css } from "@emotion/css";
3
+
4
+ //#region src/components/primitives/AffixedField/AffixedField.styles.ts
5
+ /**
6
+ * Creates styles for the AffixedField component. The container is a horizontal flex
7
+ * row with a prefix element (span or select) joined to a shared-border input.
8
+ */
9
+ const useStyles = (theme, colorScheme, disabled, hasError, hasPrefix) => useMemo(() => {
10
+ const borderColor = hasError ? theme.vars.colors.error.main : theme.vars.colors.border;
11
+ const focusColor = hasError ? theme.vars.colors.error.main : theme.vars.colors.primary.main;
12
+ const borderRadius = theme.vars.components?.Field?.root?.borderRadius ?? theme.vars.borderRadius.medium;
13
+ const inputContainer = css`
14
+ position: relative;
15
+ display: flex;
16
+ align-items: stretch;
17
+ width: 100%;
18
+ `;
19
+ const inputBase = css`
20
+ flex: 1;
21
+ min-width: 0;
22
+ padding-block: ${theme.vars.spacing.unit};
23
+ padding-inline: calc(${theme.vars.spacing.unit} * 1.5);
24
+ border: 1px solid ${borderColor};
25
+ font-size: ${theme.vars.typography.fontSizes.md};
26
+ font-family: ${theme.vars.typography.fontFamily};
27
+ color: ${theme.vars.colors.text.primary};
28
+ background-color: ${disabled ? theme.vars.colors.background.disabled : theme.vars.colors.background.surface};
29
+ outline: none;
30
+ transition:
31
+ border-color 0.2s ease,
32
+ box-shadow 0.2s ease;
33
+
34
+ &::placeholder {
35
+ color: ${theme.vars.colors.text.secondary};
36
+ opacity: 0.7;
37
+ }
38
+
39
+ &:focus {
40
+ border-color: ${focusColor};
41
+ box-shadow: 0 0 0 2px ${focusColor}20;
42
+ }
43
+
44
+ &:disabled {
45
+ opacity: 0.6;
46
+ cursor: not-allowed;
47
+ }
48
+
49
+ &:hover:not(:disabled) {
50
+ border-color: ${focusColor};
51
+ }
52
+ `;
53
+ const input = hasPrefix ? css`
54
+ ${inputBase};
55
+ border-start-start-radius: 0;
56
+ border-end-start-radius: 0;
57
+ border-start-end-radius: ${borderRadius};
58
+ border-end-end-radius: ${borderRadius};
59
+ border-inline-start: none;
60
+ ` : css`
61
+ ${inputBase};
62
+ border-radius: ${borderRadius};
63
+ `;
64
+ const prefixBase = css`
65
+ display: flex;
66
+ align-items: center;
67
+ padding-inline: calc(${theme.vars.spacing.unit} * 1.5);
68
+ border: 1px solid ${borderColor};
69
+ border-start-start-radius: ${borderRadius};
70
+ border-end-start-radius: ${borderRadius};
71
+ background-color: ${theme.vars.colors.background.surface};
72
+ color: ${theme.vars.colors.text.primary};
73
+ font-size: ${theme.vars.typography.fontSizes.md};
74
+ font-family: ${theme.vars.typography.fontFamily};
75
+ white-space: nowrap;
76
+ `;
77
+ const prefixSpan = css`
78
+ ${prefixBase};
79
+ user-select: none;
80
+ color: ${theme.vars.colors.text.secondary};
81
+ `;
82
+ return {
83
+ input,
84
+ inputContainer,
85
+ prefixSelect: css`
86
+ ${prefixBase};
87
+ cursor: pointer;
88
+ appearance: auto;
89
+ padding-inline-end: calc(${theme.vars.spacing.unit} * 1.5);
90
+
91
+ &:disabled {
92
+ opacity: 0.6;
93
+ cursor: not-allowed;
94
+ }
95
+
96
+ &:focus {
97
+ outline: none;
98
+ border-color: ${focusColor};
99
+ box-shadow: 0 0 0 2px ${focusColor}20;
100
+ z-index: 1;
101
+ }
102
+ `,
103
+ prefixSpan,
104
+ visuallyHidden: css`
105
+ position: absolute;
106
+ width: 1px;
107
+ height: 1px;
108
+ padding: 0;
109
+ margin: -1px;
110
+ overflow: hidden;
111
+ clip: rect(0, 0, 0, 0);
112
+ white-space: nowrap;
113
+ border: 0;
114
+ `
115
+ };
116
+ }, [
117
+ theme,
118
+ colorScheme,
119
+ disabled,
120
+ hasError,
121
+ hasPrefix
122
+ ]);
123
+ var AffixedField_styles_default = useStyles;
124
+
125
+ //#endregion
126
+ export { AffixedField_styles_default as default };
127
+ //# sourceMappingURL=AffixedField.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AffixedField.styles.js","names":["borderColor: string","focusColor: string","borderRadius: string","inputContainer: string","inputBase: string","input: string","prefixBase: string","prefixSpan: string"],"sources":["../../../../src/components/primitives/AffixedField/AffixedField.styles.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {css} from '@emotion/css';\nimport {Theme} from '@thunderid/browser';\nimport {useMemo} from 'react';\n\n/**\n * Creates styles for the AffixedField component. The container is a horizontal flex\n * row with a prefix element (span or select) joined to a shared-border input.\n */\nconst useStyles = (\n theme: Theme,\n colorScheme: string,\n disabled: boolean,\n hasError: boolean,\n hasPrefix: boolean,\n): Record<string, string> =>\n useMemo(() => {\n const borderColor: string = hasError ? theme.vars.colors.error.main : theme.vars.colors.border;\n const focusColor: string = hasError ? theme.vars.colors.error.main : theme.vars.colors.primary.main;\n const borderRadius: string = theme.vars.components?.Field?.root?.borderRadius ?? theme.vars.borderRadius.medium;\n\n const inputContainer: string = css`\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n `;\n\n const inputBase: string = css`\n flex: 1;\n min-width: 0;\n padding-block: ${theme.vars.spacing.unit};\n padding-inline: calc(${theme.vars.spacing.unit} * 1.5);\n border: 1px solid ${borderColor};\n font-size: ${theme.vars.typography.fontSizes.md};\n font-family: ${theme.vars.typography.fontFamily};\n color: ${theme.vars.colors.text.primary};\n background-color: ${disabled ? theme.vars.colors.background.disabled : theme.vars.colors.background.surface};\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n\n &::placeholder {\n color: ${theme.vars.colors.text.secondary};\n opacity: 0.7;\n }\n\n &:focus {\n border-color: ${focusColor};\n box-shadow: 0 0 0 2px ${focusColor}20;\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &:hover:not(:disabled) {\n border-color: ${focusColor};\n }\n `;\n\n const input: string = hasPrefix\n ? css`\n ${inputBase};\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n border-start-end-radius: ${borderRadius};\n border-end-end-radius: ${borderRadius};\n border-inline-start: none;\n `\n : css`\n ${inputBase};\n border-radius: ${borderRadius};\n `;\n\n const prefixBase: string = css`\n display: flex;\n align-items: center;\n padding-inline: calc(${theme.vars.spacing.unit} * 1.5);\n border: 1px solid ${borderColor};\n border-start-start-radius: ${borderRadius};\n border-end-start-radius: ${borderRadius};\n background-color: ${theme.vars.colors.background.surface};\n color: ${theme.vars.colors.text.primary};\n font-size: ${theme.vars.typography.fontSizes.md};\n font-family: ${theme.vars.typography.fontFamily};\n white-space: nowrap;\n `;\n\n const prefixSpan: string = css`\n ${prefixBase};\n user-select: none;\n color: ${theme.vars.colors.text.secondary};\n `;\n\n const prefixSelect: string = css`\n ${prefixBase};\n cursor: pointer;\n appearance: auto;\n padding-inline-end: calc(${theme.vars.spacing.unit} * 1.5);\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &:focus {\n outline: none;\n border-color: ${focusColor};\n box-shadow: 0 0 0 2px ${focusColor}20;\n z-index: 1;\n }\n `;\n\n /**\n * Visually hides content while keeping it discoverable by assistive tech. Used\n * to expose the fixed prefix value to screen readers via `aria-describedby` while\n * the sighted-user span stays `aria-hidden` (decorative).\n */\n const visuallyHidden: string = css`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n `;\n\n return {\n input,\n inputContainer,\n prefixSelect,\n prefixSpan,\n visuallyHidden,\n };\n }, [theme, colorScheme, disabled, hasError, hasPrefix]);\n\nexport default useStyles;\n"],"mappings":";;;;;;;;AA0BA,MAAM,aACJ,OACA,aACA,UACA,UACA,cAEA,cAAc;CACZ,MAAMA,cAAsB,WAAW,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO;CACxF,MAAMC,aAAqB,WAAW,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,QAAQ;CAC/F,MAAMC,eAAuB,MAAM,KAAK,YAAY,OAAO,MAAM,gBAAgB,MAAM,KAAK,aAAa;CAEzG,MAAMC,iBAAyB,GAAG;;;;;;CAOlC,MAAMC,YAAoB,GAAG;;;uBAGV,MAAM,KAAK,QAAQ,KAAK;6BAClB,MAAM,KAAK,QAAQ,KAAK;0BAC3B,YAAY;mBACnB,MAAM,KAAK,WAAW,UAAU,GAAG;qBACjC,MAAM,KAAK,WAAW,WAAW;eACvC,MAAM,KAAK,OAAO,KAAK,QAAQ;0BACpB,WAAW,MAAM,KAAK,OAAO,WAAW,WAAW,MAAM,KAAK,OAAO,WAAW,QAAQ;;;;;;;iBAOjG,MAAM,KAAK,OAAO,KAAK,UAAU;;;;;wBAK1B,WAAW;gCACH,WAAW;;;;;;;;;wBASnB,WAAW;;;CAI/B,MAAMC,QAAgB,YAClB,GAAG;YACC,UAAU;;;qCAGe,aAAa;mCACf,aAAa;;YAGxC,GAAG;YACC,UAAU;2BACK,aAAa;;CAGpC,MAAMC,aAAqB,GAAG;;;6BAGL,MAAM,KAAK,QAAQ,KAAK;0BAC3B,YAAY;mCACH,aAAa;iCACf,aAAa;0BACpB,MAAM,KAAK,OAAO,WAAW,QAAQ;eAChD,MAAM,KAAK,OAAO,KAAK,QAAQ;mBAC3B,MAAM,KAAK,WAAW,UAAU,GAAG;qBACjC,MAAM,KAAK,WAAW,WAAW;;;CAIlD,MAAMC,aAAqB,GAAG;QAC1B,WAAW;;eAEJ,MAAM,KAAK,OAAO,KAAK,UAAU;;AAuC5C,QAAO;EACL;EACA;EACA,cAvC2B,GAAG;QAC5B,WAAW;;;iCAGc,MAAM,KAAK,QAAQ,KAAK;;;;;;;;;wBASjC,WAAW;gCACH,WAAW;;;;EA0BrC;EACA,gBAjB6B,GAAG;;;;;;;;;;;EAkBjC;GACA;CAAC;CAAO;CAAa;CAAU;CAAU;CAAU,CAAC;AAEzD,kCAAe"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).
3
+ *
4
+ * WSO2 LLC. licenses this file to you under the Apache License,
5
+ * Version 2.0 (the "License"); you may not use this file except
6
+ * in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing,
12
+ * software distributed under the License is distributed on an
13
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ * KIND, either express or implied. See the License for the
15
+ * specific language governing permissions and limitations
16
+ * under the License.
17
+ */
18
+ export { default, default as AffixedField } from './AffixedField';
19
+ export type { AffixedFieldProps } from './AffixedField';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/primitives/AffixedField/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC"}
@@ -6,7 +6,7 @@ import { bem, withVendorCSSClassPrefix } from "@thunderid/browser";
6
6
  import { cloneElement, createContext, forwardRef, isValidElement, useContext, useLayoutEffect, useMemo, useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { cx } from "@emotion/css";
9
- import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useId, useInteractions, useMergeRefs, useRole } from "@floating-ui/react";
9
+ import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useId as useId$1, useInteractions, useMergeRefs, useRole } from "@floating-ui/react";
10
10
 
11
11
  //#region src/components/primitives/Dialog/Dialog.tsx
12
12
  function useDialog({ initialOpen = false, open: controlledOpen, onOpenChange: setControlledOpen } = {}) {
@@ -104,7 +104,7 @@ const DialogHeading = forwardRef(({ children,...props }, ref) => {
104
104
  const context = useDialogContext();
105
105
  const { theme, colorScheme } = useTheme_default();
106
106
  const styles = Dialog_styles_default(theme, colorScheme);
107
- const id = useId();
107
+ const id = useId$1();
108
108
  useLayoutEffect(() => {
109
109
  context.setLabelId(id);
110
110
  return () => {
@@ -139,7 +139,7 @@ const DialogDescription = forwardRef(({ children,...props }, ref) => {
139
139
  const context = useDialogContext();
140
140
  const { theme, colorScheme } = useTheme_default();
141
141
  const styles = Dialog_styles_default(theme, colorScheme);
142
- const id = useId();
142
+ const id = useId$1();
143
143
  useLayoutEffect(() => {
144
144
  context.setDescriptionId(id);
145
145
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","names":["open: boolean","setOpen: (openVal: boolean) => void","data: UseFloatingReturn","interactions: UseInteractionsReturn","DialogContext: Context<DialogContextType>","context: DialogContextType","dialog: DialogHookReturn","DialogTrigger: ForwardRefExoticComponent<\n HTMLProps<HTMLElement> & DialogTriggerProps & RefAttributes<HTMLElement>\n>","context: DialogHookReturn","childrenRef: Ref<HTMLElement>","ref: ReturnType<typeof useMergeRefs>","DialogContent: ForwardRefExoticComponent<HTMLProps<HTMLDivElement> & RefAttributes<HTMLDivElement>>","useTheme","styles: Record<string, string>","useStyles","DialogHeading: ForwardRefExoticComponent<\n HTMLProps<HTMLHeadingElement> & RefAttributes<HTMLHeadingElement>\n>","id: string | undefined","Button","X","DialogDescription: ForwardRefExoticComponent<\n HTMLProps<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>\n>","DialogClose: ForwardRefExoticComponent<\n ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps & RefAttributes<HTMLButtonElement>\n>","childrenRef: Ref<HTMLButtonElement>"],"sources":["../../../../src/components/primitives/Dialog/Dialog.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {cx} from '@emotion/css';\nimport {\n useFloating,\n useClick,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n useId,\n UseFloatingReturn,\n UseInteractionsReturn,\n} from '@floating-ui/react';\nimport {withVendorCSSClassPrefix, bem} from '@thunderid/browser';\nimport {\n type ButtonHTMLAttributes,\n type Context,\n type Dispatch,\n type FC,\n type ForwardRefExoticComponent,\n type HTMLProps,\n type JSX,\n type MouseEvent,\n type ReactNode,\n type Ref,\n type RefAttributes,\n type SetStateAction,\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react';\nimport useStyles from './Dialog.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport Button from '../Button/Button';\nimport {X} from '../Icons';\n\ninterface DialogOptions {\n initialOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n}\n\ninterface DialogHookReturn extends UseFloatingReturn, UseInteractionsReturn {\n descriptionId: string | undefined;\n labelId: string | undefined;\n open: boolean;\n setDescriptionId: Dispatch<SetStateAction<string | undefined>>;\n setLabelId: Dispatch<SetStateAction<string | undefined>>;\n setOpen: (open: boolean) => void;\n}\n\nexport function useDialog({\n initialOpen = false,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n}: DialogOptions = {}): DialogHookReturn {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen);\n const [labelId, setLabelId] = useState<string | undefined>();\n const [descriptionId, setDescriptionId] = useState<string | undefined>();\n\n const open: boolean = controlledOpen ?? uncontrolledOpen;\n const setOpen: (openVal: boolean) => void = setControlledOpen ?? setUncontrolledOpen;\n\n const data: UseFloatingReturn = useFloating({\n onOpenChange: setOpen,\n open,\n });\n\n const {context} = data;\n\n const click: ReturnType<typeof useClick> = useClick(context, {\n enabled: controlledOpen == null,\n });\n const dismiss: ReturnType<typeof useDismiss> = useDismiss(context, {outsidePressEvent: 'mousedown'});\n const role: ReturnType<typeof useRole> = useRole(context);\n\n const interactions: UseInteractionsReturn = useInteractions([click, dismiss, role]);\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n descriptionId,\n labelId,\n setDescriptionId,\n setLabelId,\n }),\n [open, setOpen, interactions, data, labelId, descriptionId],\n );\n}\n\ntype DialogContextType =\n | (DialogHookReturn & {\n setDescriptionId: Dispatch<SetStateAction<string | undefined>>;\n setLabelId: Dispatch<SetStateAction<string | undefined>>;\n })\n | null;\n\nconst DialogContext: Context<DialogContextType> = createContext<DialogContextType>(null);\n\nexport const useDialogContext = (): DialogHookReturn => {\n const context: DialogContextType = useContext(DialogContext);\n if (context == null) {\n throw new Error('Dialog components must be wrapped in <Dialog />');\n }\n return context;\n};\n\n// Dialog Components (Modal)\nexport function Dialog({children, ...options}: {children: ReactNode} & DialogOptions): JSX.Element {\n const dialog: DialogHookReturn = useDialog(options);\n return <DialogContext.Provider value={dialog}>{children}</DialogContext.Provider>;\n}\n\ninterface DialogTriggerProps {\n asChild?: boolean;\n children: ReactNode;\n}\n\nexport const DialogTrigger: ForwardRefExoticComponent<\n HTMLProps<HTMLElement> & DialogTriggerProps & RefAttributes<HTMLElement>\n> = forwardRef<HTMLElement, HTMLProps<HTMLElement> & DialogTriggerProps>(\n ({children, asChild = false, ...props}: HTMLProps<HTMLElement> & DialogTriggerProps, propRef: Ref<HTMLElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const childrenRef: Ref<HTMLElement> = (children as any).ref;\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([context.refs.setReference, propRef, childrenRef]);\n\n if (asChild && isValidElement(children)) {\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(children.props as any),\n 'data-state': context.open ? 'open' : 'closed',\n }),\n );\n }\n\n return (\n <button ref={ref} data-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n );\n },\n);\n\nexport const DialogContent: ForwardRefExoticComponent<HTMLProps<HTMLDivElement> & RefAttributes<HTMLDivElement>> =\n forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>>(\n (props: HTMLProps<HTMLDivElement>, propRef: Ref<HTMLDivElement>) => {\n const {context: floatingContext, ...context} = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([context.refs.setFloating, propRef]);\n\n if (!floatingContext.open) return null;\n\n return (\n <FloatingPortal>\n <FloatingOverlay\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'overlay')), styles['overlay'])}\n lockScroll\n >\n <FloatingFocusManager context={floatingContext} initialFocus={-1}>\n <div\n ref={ref}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'content')), styles['content'], props.className)}\n aria-labelledby={context.labelId}\n aria-describedby={context.descriptionId}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n );\n },\n );\n\nexport const DialogHeading: ForwardRefExoticComponent<\n HTMLProps<HTMLHeadingElement> & RefAttributes<HTMLHeadingElement>\n> = forwardRef<HTMLHeadingElement, HTMLProps<HTMLHeadingElement>>(\n ({children, ...props}: HTMLProps<HTMLHeadingElement>, ref: Ref<HTMLHeadingElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const id: string | undefined = useId();\n\n useLayoutEffect((): (() => void) => {\n context.setLabelId(id);\n return (): void => {\n context.setLabelId(undefined);\n };\n }, [id, context.setLabelId]);\n\n return (\n <div className={cx(withVendorCSSClassPrefix(bem('dialog', 'header')), styles['header'])}>\n <h2\n {...props}\n ref={ref}\n id={id}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'title')), styles['headerTitle'])}\n >\n {children}\n </h2>\n <Button\n color=\"tertiary\"\n variant=\"icon\"\n size=\"small\"\n shape=\"round\"\n onClick={(): void => {\n context.setOpen(false);\n }}\n aria-label=\"Close\"\n >\n <X width={16} height={16} />\n </Button>\n </div>\n );\n },\n);\n\nexport const DialogDescription: ForwardRefExoticComponent<\n HTMLProps<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>\n> = forwardRef<HTMLParagraphElement, HTMLProps<HTMLParagraphElement>>(\n ({children, ...props}: HTMLProps<HTMLParagraphElement>, ref: Ref<HTMLParagraphElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const id: string | undefined = useId();\n\n useLayoutEffect((): (() => void) => {\n context.setDescriptionId(id);\n return (): void => {\n context.setDescriptionId(undefined);\n };\n }, [id, context.setDescriptionId]);\n\n return (\n <p\n {...props}\n ref={ref}\n id={id}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'description')), styles['description'], props.className)}\n >\n {children}\n </p>\n );\n },\n);\n\ninterface DialogCloseProps {\n asChild?: boolean;\n children?: ReactNode;\n}\n\nexport const DialogClose: ForwardRefExoticComponent<\n ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps & RefAttributes<HTMLButtonElement>\n> = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps>(\n (\n {children, asChild = false, ...props}: ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps,\n propRef: Ref<HTMLButtonElement>,\n ) => {\n const context: DialogHookReturn = useDialogContext();\n const childrenRef: Ref<HTMLButtonElement> = (children as any)?.ref;\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([propRef, childrenRef]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n context.setOpen(false);\n props.onClick?.(event);\n };\n\n if (asChild && isValidElement(children)) {\n return cloneElement(children, {\n ref,\n ...props,\n ...(children.props as any),\n onClick: handleClick,\n });\n }\n\n return (\n <Button\n {...props}\n ref={ref}\n onClick={handleClick}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'close')), props.className)}\n variant=\"text\"\n >\n {children}\n </Button>\n );\n },\n);\n\nDialogTrigger.displayName = 'DialogTrigger';\nDialogContent.displayName = 'DialogContent';\nDialogHeading.displayName = 'DialogHeading';\nDialogDescription.displayName = 'DialogDescription';\nDialogClose.displayName = 'DialogClose';\n\n// Attach subcomponents to Dialog\n(Dialog as any).Trigger = DialogTrigger;\n(Dialog as any).Content = DialogContent;\n(Dialog as any).Heading = DialogHeading;\n(Dialog as any).Description = DialogDescription;\n(Dialog as any).Close = DialogClose;\n\nexport interface DialogComponent extends FC<{children: ReactNode} & DialogOptions> {\n Close: typeof DialogClose;\n Content: typeof DialogContent;\n Description: typeof DialogDescription;\n Heading: typeof DialogHeading;\n Trigger: typeof DialogTrigger;\n}\n\nexport default Dialog as DialogComponent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","names":["open: boolean","setOpen: (openVal: boolean) => void","data: UseFloatingReturn","interactions: UseInteractionsReturn","DialogContext: Context<DialogContextType>","context: DialogContextType","dialog: DialogHookReturn","DialogTrigger: ForwardRefExoticComponent<\n HTMLProps<HTMLElement> & DialogTriggerProps & RefAttributes<HTMLElement>\n>","context: DialogHookReturn","childrenRef: Ref<HTMLElement>","ref: ReturnType<typeof useMergeRefs>","DialogContent: ForwardRefExoticComponent<HTMLProps<HTMLDivElement> & RefAttributes<HTMLDivElement>>","useTheme","styles: Record<string, string>","useStyles","DialogHeading: ForwardRefExoticComponent<\n HTMLProps<HTMLHeadingElement> & RefAttributes<HTMLHeadingElement>\n>","id: string | undefined","useId","Button","X","DialogDescription: ForwardRefExoticComponent<\n HTMLProps<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>\n>","DialogClose: ForwardRefExoticComponent<\n ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps & RefAttributes<HTMLButtonElement>\n>","childrenRef: Ref<HTMLButtonElement>"],"sources":["../../../../src/components/primitives/Dialog/Dialog.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {cx} from '@emotion/css';\nimport {\n useFloating,\n useClick,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n useId,\n UseFloatingReturn,\n UseInteractionsReturn,\n} from '@floating-ui/react';\nimport {withVendorCSSClassPrefix, bem} from '@thunderid/browser';\nimport {\n type ButtonHTMLAttributes,\n type Context,\n type Dispatch,\n type FC,\n type ForwardRefExoticComponent,\n type HTMLProps,\n type JSX,\n type MouseEvent,\n type ReactNode,\n type Ref,\n type RefAttributes,\n type SetStateAction,\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react';\nimport useStyles from './Dialog.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport Button from '../Button/Button';\nimport {X} from '../Icons';\n\ninterface DialogOptions {\n initialOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n}\n\ninterface DialogHookReturn extends UseFloatingReturn, UseInteractionsReturn {\n descriptionId: string | undefined;\n labelId: string | undefined;\n open: boolean;\n setDescriptionId: Dispatch<SetStateAction<string | undefined>>;\n setLabelId: Dispatch<SetStateAction<string | undefined>>;\n setOpen: (open: boolean) => void;\n}\n\nexport function useDialog({\n initialOpen = false,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n}: DialogOptions = {}): DialogHookReturn {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen);\n const [labelId, setLabelId] = useState<string | undefined>();\n const [descriptionId, setDescriptionId] = useState<string | undefined>();\n\n const open: boolean = controlledOpen ?? uncontrolledOpen;\n const setOpen: (openVal: boolean) => void = setControlledOpen ?? setUncontrolledOpen;\n\n const data: UseFloatingReturn = useFloating({\n onOpenChange: setOpen,\n open,\n });\n\n const {context} = data;\n\n const click: ReturnType<typeof useClick> = useClick(context, {\n enabled: controlledOpen == null,\n });\n const dismiss: ReturnType<typeof useDismiss> = useDismiss(context, {outsidePressEvent: 'mousedown'});\n const role: ReturnType<typeof useRole> = useRole(context);\n\n const interactions: UseInteractionsReturn = useInteractions([click, dismiss, role]);\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n descriptionId,\n labelId,\n setDescriptionId,\n setLabelId,\n }),\n [open, setOpen, interactions, data, labelId, descriptionId],\n );\n}\n\ntype DialogContextType =\n | (DialogHookReturn & {\n setDescriptionId: Dispatch<SetStateAction<string | undefined>>;\n setLabelId: Dispatch<SetStateAction<string | undefined>>;\n })\n | null;\n\nconst DialogContext: Context<DialogContextType> = createContext<DialogContextType>(null);\n\nexport const useDialogContext = (): DialogHookReturn => {\n const context: DialogContextType = useContext(DialogContext);\n if (context == null) {\n throw new Error('Dialog components must be wrapped in <Dialog />');\n }\n return context;\n};\n\n// Dialog Components (Modal)\nexport function Dialog({children, ...options}: {children: ReactNode} & DialogOptions): JSX.Element {\n const dialog: DialogHookReturn = useDialog(options);\n return <DialogContext.Provider value={dialog}>{children}</DialogContext.Provider>;\n}\n\ninterface DialogTriggerProps {\n asChild?: boolean;\n children: ReactNode;\n}\n\nexport const DialogTrigger: ForwardRefExoticComponent<\n HTMLProps<HTMLElement> & DialogTriggerProps & RefAttributes<HTMLElement>\n> = forwardRef<HTMLElement, HTMLProps<HTMLElement> & DialogTriggerProps>(\n ({children, asChild = false, ...props}: HTMLProps<HTMLElement> & DialogTriggerProps, propRef: Ref<HTMLElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const childrenRef: Ref<HTMLElement> = (children as any).ref;\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([context.refs.setReference, propRef, childrenRef]);\n\n if (asChild && isValidElement(children)) {\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(children.props as any),\n 'data-state': context.open ? 'open' : 'closed',\n }),\n );\n }\n\n return (\n <button ref={ref} data-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n );\n },\n);\n\nexport const DialogContent: ForwardRefExoticComponent<HTMLProps<HTMLDivElement> & RefAttributes<HTMLDivElement>> =\n forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>>(\n (props: HTMLProps<HTMLDivElement>, propRef: Ref<HTMLDivElement>) => {\n const {context: floatingContext, ...context} = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([context.refs.setFloating, propRef]);\n\n if (!floatingContext.open) return null;\n\n return (\n <FloatingPortal>\n <FloatingOverlay\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'overlay')), styles['overlay'])}\n lockScroll\n >\n <FloatingFocusManager context={floatingContext} initialFocus={-1}>\n <div\n ref={ref}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'content')), styles['content'], props.className)}\n aria-labelledby={context.labelId}\n aria-describedby={context.descriptionId}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n );\n },\n );\n\nexport const DialogHeading: ForwardRefExoticComponent<\n HTMLProps<HTMLHeadingElement> & RefAttributes<HTMLHeadingElement>\n> = forwardRef<HTMLHeadingElement, HTMLProps<HTMLHeadingElement>>(\n ({children, ...props}: HTMLProps<HTMLHeadingElement>, ref: Ref<HTMLHeadingElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const id: string | undefined = useId();\n\n useLayoutEffect((): (() => void) => {\n context.setLabelId(id);\n return (): void => {\n context.setLabelId(undefined);\n };\n }, [id, context.setLabelId]);\n\n return (\n <div className={cx(withVendorCSSClassPrefix(bem('dialog', 'header')), styles['header'])}>\n <h2\n {...props}\n ref={ref}\n id={id}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'title')), styles['headerTitle'])}\n >\n {children}\n </h2>\n <Button\n color=\"tertiary\"\n variant=\"icon\"\n size=\"small\"\n shape=\"round\"\n onClick={(): void => {\n context.setOpen(false);\n }}\n aria-label=\"Close\"\n >\n <X width={16} height={16} />\n </Button>\n </div>\n );\n },\n);\n\nexport const DialogDescription: ForwardRefExoticComponent<\n HTMLProps<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>\n> = forwardRef<HTMLParagraphElement, HTMLProps<HTMLParagraphElement>>(\n ({children, ...props}: HTMLProps<HTMLParagraphElement>, ref: Ref<HTMLParagraphElement>) => {\n const context: DialogHookReturn = useDialogContext();\n const {theme, colorScheme}: ReturnType<typeof useTheme> = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const id: string | undefined = useId();\n\n useLayoutEffect((): (() => void) => {\n context.setDescriptionId(id);\n return (): void => {\n context.setDescriptionId(undefined);\n };\n }, [id, context.setDescriptionId]);\n\n return (\n <p\n {...props}\n ref={ref}\n id={id}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'description')), styles['description'], props.className)}\n >\n {children}\n </p>\n );\n },\n);\n\ninterface DialogCloseProps {\n asChild?: boolean;\n children?: ReactNode;\n}\n\nexport const DialogClose: ForwardRefExoticComponent<\n ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps & RefAttributes<HTMLButtonElement>\n> = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps>(\n (\n {children, asChild = false, ...props}: ButtonHTMLAttributes<HTMLButtonElement> & DialogCloseProps,\n propRef: Ref<HTMLButtonElement>,\n ) => {\n const context: DialogHookReturn = useDialogContext();\n const childrenRef: Ref<HTMLButtonElement> = (children as any)?.ref;\n const ref: ReturnType<typeof useMergeRefs> = useMergeRefs([propRef, childrenRef]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n context.setOpen(false);\n props.onClick?.(event);\n };\n\n if (asChild && isValidElement(children)) {\n return cloneElement(children, {\n ref,\n ...props,\n ...(children.props as any),\n onClick: handleClick,\n });\n }\n\n return (\n <Button\n {...props}\n ref={ref}\n onClick={handleClick}\n className={cx(withVendorCSSClassPrefix(bem('dialog', 'close')), props.className)}\n variant=\"text\"\n >\n {children}\n </Button>\n );\n },\n);\n\nDialogTrigger.displayName = 'DialogTrigger';\nDialogContent.displayName = 'DialogContent';\nDialogHeading.displayName = 'DialogHeading';\nDialogDescription.displayName = 'DialogDescription';\nDialogClose.displayName = 'DialogClose';\n\n// Attach subcomponents to Dialog\n(Dialog as any).Trigger = DialogTrigger;\n(Dialog as any).Content = DialogContent;\n(Dialog as any).Heading = DialogHeading;\n(Dialog as any).Description = DialogDescription;\n(Dialog as any).Close = DialogClose;\n\nexport interface DialogComponent extends FC<{children: ReactNode} & DialogOptions> {\n Close: typeof DialogClose;\n Content: typeof DialogContent;\n Description: typeof DialogDescription;\n Heading: typeof DialogHeading;\n Trigger: typeof DialogTrigger;\n}\n\nexport default Dialog as DialogComponent;\n"],"mappings":"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"}
@@ -25,6 +25,7 @@ export interface ComponentRenderContext {
25
25
  isFormValid: boolean;
26
26
  isLoading: boolean;
27
27
  meta?: FlowMetadataResponse | null;
28
+ resetForm?: () => void;
28
29
  onInputBlur?: (name: string) => void;
29
30
  onInputChange: (name: string, value: string) => void;
30
31
  onSubmit?: (component: EmbeddedFlowComponent, data?: Record<string, any>, skipValidation?: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentRendererContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/ComponentRenderer/ComponentRendererContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAC,OAAO,EAAiB,YAAY,EAAC,MAAM,OAAO,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5G,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,sBAAsB,KAC5B,YAAY,GAAG,IAAI,CAAC;AAEzB,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAErE,QAAA,MAAM,wBAAwB,EAAE,OAAO,CAAC,oBAAoB,CAA2C,CAAC;AAExG,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"ComponentRendererContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/ComponentRenderer/ComponentRendererContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAC,OAAO,EAAiB,YAAY,EAAC,MAAM,OAAO,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5G,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,sBAAsB,KAC5B,YAAY,GAAG,IAAI,CAAC;AAEzB,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAErE,QAAA,MAAM,wBAAwB,EAAE,OAAO,CAAC,oBAAoB,CAA2C,CAAC;AAExG,eAAe,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentRendererContext.js","names":["ComponentRendererContext: Context<ComponentRendererMap>"],"sources":["../../../src/contexts/ComponentRenderer/ComponentRendererContext.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {EmbeddedFlowComponent, FlowMetadataResponse} from '@thunderid/browser';\nimport {Context, createContext, ReactElement} from 'react';\n\nexport interface ComponentRenderContext {\n additionalData?: Record<string, any>;\n authType: 'signin' | 'signup' | 'recovery';\n formErrors: Record<string, string>;\n formValues: Record<string, string>;\n isFormValid: boolean;\n isLoading: boolean;\n meta?: FlowMetadataResponse | null;\n onInputBlur?: (name: string) => void;\n onInputChange: (name: string, value: string) => void;\n onSubmit?: (component: EmbeddedFlowComponent, data?: Record<string, any>, skipValidation?: boolean) => void;\n touchedFields: Record<string, boolean>;\n}\n\nexport type ComponentRenderer = (\n component: EmbeddedFlowComponent,\n context: ComponentRenderContext,\n) => ReactElement | null;\n\nexport type ComponentRendererMap = Record<string, ComponentRenderer>;\n\nconst ComponentRendererContext: Context<ComponentRendererMap> = createContext<ComponentRendererMap>({});\n\nexport default ComponentRendererContext;\n"],"mappings":";;;AA0CA,MAAMA,2BAA0D,cAAoC,EAAE,CAAC;AAEvG,uCAAe"}
1
+ {"version":3,"file":"ComponentRendererContext.js","names":["ComponentRendererContext: Context<ComponentRendererMap>"],"sources":["../../../src/contexts/ComponentRenderer/ComponentRendererContext.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {EmbeddedFlowComponent, FlowMetadataResponse} from '@thunderid/browser';\nimport {Context, createContext, ReactElement} from 'react';\n\nexport interface ComponentRenderContext {\n additionalData?: Record<string, any>;\n authType: 'signin' | 'signup' | 'recovery';\n formErrors: Record<string, string>;\n formValues: Record<string, string>;\n isFormValid: boolean;\n isLoading: boolean;\n meta?: FlowMetadataResponse | null;\n resetForm?: () => void;\n onInputBlur?: (name: string) => void;\n onInputChange: (name: string, value: string) => void;\n onSubmit?: (component: EmbeddedFlowComponent, data?: Record<string, any>, skipValidation?: boolean) => void;\n touchedFields: Record<string, boolean>;\n}\n\nexport type ComponentRenderer = (\n component: EmbeddedFlowComponent,\n context: ComponentRenderContext,\n) => ReactElement | null;\n\nexport type ComponentRendererMap = Record<string, ComponentRenderer>;\n\nconst ComponentRendererContext: Context<ComponentRendererMap> = createContext<ComponentRendererMap>({});\n\nexport default ComponentRendererContext;\n"],"mappings":";;;AA2CA,MAAMA,2BAA0D,cAAoC,EAAE,CAAC;AAEvG,uCAAe"}
@@ -27,6 +27,7 @@ export type ThunderIDContextProps = {
27
27
  applicationId: string | undefined;
28
28
  baseUrl: string | undefined;
29
29
  clientId: string | undefined;
30
+ preferences?: ThunderIDReactConfig['preferences'];
30
31
  scopes: string | string[] | undefined;
31
32
  /**
32
33
  * OIDC discovery data.
@@ -1 +1 @@
1
- {"version":3,"file":"ThunderIDContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/ThunderID/ThunderIDContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThunderIDContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/ThunderID/ThunderIDContext.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ const ThunderIDContext = createContext({
11
11
  baseUrl: void 0,
12
12
  clearSession: () => {},
13
13
  clientId: void 0,
14
+ preferences: void 0,
14
15
  scopes: void 0,
15
16
  discovery: { wellKnown: null },
16
17
  exchangeToken: null,
@@ -1 +1 @@
1
- {"version":3,"file":"ThunderIDContext.js","names":["ThunderIDContext: Context<ThunderIDContextProps | null>"],"sources":["../../../src/contexts/ThunderID/ThunderIDContext.ts"],"sourcesContent":["/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n FlowMetadataResponse,\n HttpRequestConfig,\n HttpResponse,\n IdToken,\n OIDCDiscoveryApiResponse,\n SignInOptions,\n TokenExchangeRequestConfig,\n TokenResponse,\n VendorConstants,\n} from '@thunderid/browser';\nimport {Context, createContext} from 'react';\nimport {ThunderIDReactConfig} from '../../models/config';\nimport ThunderIDReactClient from '../../ThunderIDReactClient';\n\n/**\n * Props interface of {@link ThunderIDContext}\n */\nexport type ThunderIDContextProps = {\n afterSignInUrl: string | undefined;\n applicationId: string | undefined;\n baseUrl: string | undefined;\n clientId: string | undefined;\n scopes: string | string[] | undefined;\n /**\n * OIDC discovery data.\n */\n discovery: {\n /**\n * The response from the `.well-known/openid-configuration` endpoint.\n * Contains server capabilities, supported endpoints, and metadata.\n * `null` while loading or when discovery has not been fetched.\n */\n wellKnown: OIDCDiscoveryApiResponse | null;\n };\n /**\n * Swaps the current access token with a new one based on the provided configuration (with a grant type).\n * @param config - Configuration for the token exchange request.\n * @returns A promise that resolves to the token response or the raw response.\n */\n exchangeToken: (config: TokenExchangeRequestConfig) => Promise<TokenResponse | Response>;\n /**\n * Retrieves the access token stored in the storage.\n * This function retrieves the access token and returns it.\n * @remarks This does not work in the `webWorker` or any other worker environment.\n * @returns A promise that resolves to the access token.\n */\n getAccessToken: () => Promise<string>;\n /**\n * Function to retrieve the decoded ID token.\n * This function decodes the ID token and returns its payload.\n * It can be used to access user claims and other information contained in the ID token.\n *\n * @returns A promise that resolves to the decoded ID token payload.\n */\n getDecodedIdToken: () => Promise<IdToken>;\n /**\n * Function to retrieve the ID token.\n * This function retrieves the ID token and returns it.\n *\n * @returns A promise that resolves to the ID token.\n */\n getIdToken: () => Promise<string>;\n /**\n * Returns the underlying StorageManager instance for reading and writing SDK-managed storage.\n */\n getStorageManager: () => Promise<any>;\n /**\n * HTTP request function to make API calls.\n * @param requestConfig - Configuration for the HTTP request.\n * @returns A promise that resolves to the HTTP response.\n */\n http: {\n /**\n * Makes an HTTP request using the provided configuration.\n * @param requestConfig - Configuration for the HTTP request.\n * @returns A promise that resolves to the HTTP response.\n */\n request: (requestConfig?: HttpRequestConfig) => Promise<HttpResponse<any>>;\n /**\n * Makes multiple HTTP requests based on the provided configuration.\n * @param requestConfigs - Set of configurations for the HTTP requests.\n * @returns A promise that resolves to an array of HTTP responses.\n */\n requestAll: (requestConfigs?: HttpRequestConfig[]) => Promise<HttpResponse<any>[]>;\n };\n /**\n * Instance ID for multi-instance support.\n */\n instanceId: number;\n isInitialized: boolean;\n /**\n * Flag indicating whether the SDK is working in the background.\n */\n isLoading: boolean;\n /**\n * Flag indicating whether flow metadata is currently being fetched.\n */\n isMetaLoading: boolean;\n /**\n * Flag indicating whether the user is signed in or not.\n */\n isSignedIn: boolean;\n\n /**\n * Flow metadata returned by `GET /flow/meta` (v2 platform only).\n * `null` while loading or when `resolveFromMeta` is disabled.\n */\n meta: FlowMetadataResponse | null;\n\n organizationHandle: string | undefined;\n\n /**\n * Re-initializes the client with a new configuration.\n *\n * @remarks\n * This can be partial configuration to update only specific fields.\n *\n * @param config - New configuration to re-initialize the client with.\n * @returns Promise resolving to boolean indicating success.\n */\n reInitialize: (config: Partial<ThunderIDReactConfig>) => Promise<boolean>;\n\n /**\n * Recovery function to initiate the account/password recovery flow.\n */\n recover: (...args: any[]) => Promise<any>;\n\n /**\n * Resolves `{{ t(key) }}` and `{{ meta(path) }}` template expressions in a string,\n * using the current i18n translation function and flow metadata from context.\n *\n * Useful in render-props patterns where consumers need to expand template strings\n * that come from the server (e.g. component labels, placeholders, headings).\n *\n * @example\n * const {resolveFlowTemplateLiterals} = useThunderID();\n * resolveFlowTemplateLiterals('{{ t(signin.heading.label) }}') // → 'Sign In'\n * resolveFlowTemplateLiterals('Login to {{ meta(application.name) }}') // → 'Login to My App'\n */\n resolveFlowTemplateLiterals: (text: string | undefined) => string;\n\n /**\n * Sign-in function to initiate the authentication process.\n * @remark This is the programmatic version of the `SignInButton` component.\n * TODO: Fix the types.\n */\n signIn: (...args: any) => Promise<any>;\n\n /**\n * Optional additional parameters to be sent in the sign-in request.\n * This can include custom parameters that your authorization server supports.\n * These parameters will be included in the authorization request sent to the server.\n * If not provided, no additional parameters will be sent.\n *\n * @example\n * signInOptions: { prompt: \"login\", fidp: \"OrganizationSSO\" }\n */\n signInOptions?: SignInOptions;\n\n /**\n * Optional token request configuration. params are appended to the token endpoint POST body.\n *\n * @example\n * tokenRequest: { params: { resource: \"https://api.example.com\" } }\n */\n tokenRequest?: {\n params?: Record<string, unknown>;\n };\n\n /**\n * Silent sign-in function to re-authenticate the user without user interaction.\n * @remark This is the programmatic version of the `SilentSignIn` component.\n */\n signInSilently: ThunderIDReactClient['signInSilently'];\n\n signInUrl: string | undefined;\n /**\n * Sign-out function to terminate the authentication session.\n * @remark This is the programmatic version of the `SignOutButton` component.\n * FIXME: Fix the types.\n */\n signOut: any;\n\n /**\n * Sign-up function to initiate the registration process.\n * @remark This is the programmatic version of the `SignUpButton` component.\n */\n signUp: (...args: any[]) => Promise<any>;\n\n signUpUrl: string | undefined;\n\n user: any;\n\n /**\n * Vendor/brand namespace used to prefix storage keys, cookie names, and CSS class names.\n * Resolved from the `vendor` config option, defaulting to `'thunderid'`.\n */\n vendor: string;\n} & Pick<ThunderIDReactClient, 'clearSession'>;\n\n/**\n * Context object for managing the Authentication flow builder core context.\n */\nconst ThunderIDContext: Context<ThunderIDContextProps | null> = createContext<null | ThunderIDContextProps>({\n afterSignInUrl: undefined,\n applicationId: undefined,\n baseUrl: undefined,\n clearSession: () => {},\n clientId: undefined,\n scopes: undefined,\n discovery: {\n wellKnown: null,\n },\n exchangeToken: null as unknown as ThunderIDContextProps['exchangeToken'],\n getAccessToken: null as unknown as ThunderIDContextProps['getAccessToken'],\n getDecodedIdToken: null as unknown as ThunderIDContextProps['getDecodedIdToken'],\n getIdToken: null as unknown as ThunderIDContextProps['getIdToken'],\n getStorageManager: () => Promise.resolve(null),\n http: {\n request: () => null as unknown as Promise<HttpResponse<any>>,\n requestAll: () => null as unknown as Promise<HttpResponse<any>[]>,\n },\n instanceId: 0,\n isInitialized: false,\n isLoading: true,\n isMetaLoading: false,\n isSignedIn: false,\n meta: null,\n organizationHandle: undefined,\n reInitialize: null as unknown as ThunderIDContextProps['reInitialize'],\n recover: () => Promise.resolve({} as any),\n resolveFlowTemplateLiterals: (text: string | undefined) => text ?? '',\n signIn: () => Promise.resolve({} as any),\n signInSilently: () => Promise.resolve({} as any),\n signInUrl: undefined,\n signOut: () => Promise.resolve({} as any),\n signUp: () => Promise.resolve({} as any),\n signUpUrl: undefined,\n user: null,\n vendor: VendorConstants.VENDOR_PREFIX,\n});\n\nThunderIDContext.displayName = 'ThunderIDContext';\n\nexport default ThunderIDContext;\n"],"mappings":";;;;;;;AA8NA,MAAMA,mBAA0D,cAA4C;CAC1G,gBAAgB;CAChB,eAAe;CACf,SAAS;CACT,oBAAoB;CACpB,UAAU;CACV,QAAQ;CACR,WAAW,EACT,WAAW,MACZ;CACD,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,YAAY;CACZ,yBAAyB,QAAQ,QAAQ,KAAK;CAC9C,MAAM;EACJ,eAAe;EACf,kBAAkB;EACnB;CACD,YAAY;CACZ,eAAe;CACf,WAAW;CACX,eAAe;CACf,YAAY;CACZ,MAAM;CACN,oBAAoB;CACpB,cAAc;CACd,eAAe,QAAQ,QAAQ,EAAE,CAAQ;CACzC,8BAA8B,SAA6B,QAAQ;CACnE,cAAc,QAAQ,QAAQ,EAAE,CAAQ;CACxC,sBAAsB,QAAQ,QAAQ,EAAE,CAAQ;CAChD,WAAW;CACX,eAAe,QAAQ,QAAQ,EAAE,CAAQ;CACzC,cAAc,QAAQ,QAAQ,EAAE,CAAQ;CACxC,WAAW;CACX,MAAM;CACN,QAAQ,gBAAgB;CACzB,CAAC;AAEF,iBAAiB,cAAc;AAE/B,+BAAe"}
1
+ {"version":3,"file":"ThunderIDContext.js","names":["ThunderIDContext: Context<ThunderIDContextProps | null>"],"sources":["../../../src/contexts/ThunderID/ThunderIDContext.ts"],"sourcesContent":["/**\n * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).\n *\n * WSO2 LLC. licenses this file to you under the Apache License,\n * Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n FlowMetadataResponse,\n HttpRequestConfig,\n HttpResponse,\n IdToken,\n OIDCDiscoveryApiResponse,\n SignInOptions,\n TokenExchangeRequestConfig,\n TokenResponse,\n VendorConstants,\n} from '@thunderid/browser';\nimport {Context, createContext} from 'react';\nimport {ThunderIDReactConfig} from '../../models/config';\nimport ThunderIDReactClient from '../../ThunderIDReactClient';\n\n/**\n * Props interface of {@link ThunderIDContext}\n */\nexport type ThunderIDContextProps = {\n afterSignInUrl: string | undefined;\n applicationId: string | undefined;\n baseUrl: string | undefined;\n clientId: string | undefined;\n preferences?: ThunderIDReactConfig['preferences'];\n scopes: string | string[] | undefined;\n /**\n * OIDC discovery data.\n */\n discovery: {\n /**\n * The response from the `.well-known/openid-configuration` endpoint.\n * Contains server capabilities, supported endpoints, and metadata.\n * `null` while loading or when discovery has not been fetched.\n */\n wellKnown: OIDCDiscoveryApiResponse | null;\n };\n /**\n * Swaps the current access token with a new one based on the provided configuration (with a grant type).\n * @param config - Configuration for the token exchange request.\n * @returns A promise that resolves to the token response or the raw response.\n */\n exchangeToken: (config: TokenExchangeRequestConfig) => Promise<TokenResponse | Response>;\n /**\n * Retrieves the access token stored in the storage.\n * This function retrieves the access token and returns it.\n * @remarks This does not work in the `webWorker` or any other worker environment.\n * @returns A promise that resolves to the access token.\n */\n getAccessToken: () => Promise<string>;\n /**\n * Function to retrieve the decoded ID token.\n * This function decodes the ID token and returns its payload.\n * It can be used to access user claims and other information contained in the ID token.\n *\n * @returns A promise that resolves to the decoded ID token payload.\n */\n getDecodedIdToken: () => Promise<IdToken>;\n /**\n * Function to retrieve the ID token.\n * This function retrieves the ID token and returns it.\n *\n * @returns A promise that resolves to the ID token.\n */\n getIdToken: () => Promise<string>;\n /**\n * Returns the underlying StorageManager instance for reading and writing SDK-managed storage.\n */\n getStorageManager: () => Promise<any>;\n /**\n * HTTP request function to make API calls.\n * @param requestConfig - Configuration for the HTTP request.\n * @returns A promise that resolves to the HTTP response.\n */\n http: {\n /**\n * Makes an HTTP request using the provided configuration.\n * @param requestConfig - Configuration for the HTTP request.\n * @returns A promise that resolves to the HTTP response.\n */\n request: (requestConfig?: HttpRequestConfig) => Promise<HttpResponse<any>>;\n /**\n * Makes multiple HTTP requests based on the provided configuration.\n * @param requestConfigs - Set of configurations for the HTTP requests.\n * @returns A promise that resolves to an array of HTTP responses.\n */\n requestAll: (requestConfigs?: HttpRequestConfig[]) => Promise<HttpResponse<any>[]>;\n };\n /**\n * Instance ID for multi-instance support.\n */\n instanceId: number;\n isInitialized: boolean;\n /**\n * Flag indicating whether the SDK is working in the background.\n */\n isLoading: boolean;\n /**\n * Flag indicating whether flow metadata is currently being fetched.\n */\n isMetaLoading: boolean;\n /**\n * Flag indicating whether the user is signed in or not.\n */\n isSignedIn: boolean;\n\n /**\n * Flow metadata returned by `GET /flow/meta` (v2 platform only).\n * `null` while loading or when `resolveFromMeta` is disabled.\n */\n meta: FlowMetadataResponse | null;\n\n organizationHandle: string | undefined;\n\n /**\n * Re-initializes the client with a new configuration.\n *\n * @remarks\n * This can be partial configuration to update only specific fields.\n *\n * @param config - New configuration to re-initialize the client with.\n * @returns Promise resolving to boolean indicating success.\n */\n reInitialize: (config: Partial<ThunderIDReactConfig>) => Promise<boolean>;\n\n /**\n * Recovery function to initiate the account/password recovery flow.\n */\n recover: (...args: any[]) => Promise<any>;\n\n /**\n * Resolves `{{ t(key) }}` and `{{ meta(path) }}` template expressions in a string,\n * using the current i18n translation function and flow metadata from context.\n *\n * Useful in render-props patterns where consumers need to expand template strings\n * that come from the server (e.g. component labels, placeholders, headings).\n *\n * @example\n * const {resolveFlowTemplateLiterals} = useThunderID();\n * resolveFlowTemplateLiterals('{{ t(signin.heading.label) }}') // → 'Sign In'\n * resolveFlowTemplateLiterals('Login to {{ meta(application.name) }}') // → 'Login to My App'\n */\n resolveFlowTemplateLiterals: (text: string | undefined) => string;\n\n /**\n * Sign-in function to initiate the authentication process.\n * @remark This is the programmatic version of the `SignInButton` component.\n * TODO: Fix the types.\n */\n signIn: (...args: any) => Promise<any>;\n\n /**\n * Optional additional parameters to be sent in the sign-in request.\n * This can include custom parameters that your authorization server supports.\n * These parameters will be included in the authorization request sent to the server.\n * If not provided, no additional parameters will be sent.\n *\n * @example\n * signInOptions: { prompt: \"login\", fidp: \"OrganizationSSO\" }\n */\n signInOptions?: SignInOptions;\n\n /**\n * Optional token request configuration. params are appended to the token endpoint POST body.\n *\n * @example\n * tokenRequest: { params: { resource: \"https://api.example.com\" } }\n */\n tokenRequest?: {\n params?: Record<string, unknown>;\n };\n\n /**\n * Silent sign-in function to re-authenticate the user without user interaction.\n * @remark This is the programmatic version of the `SilentSignIn` component.\n */\n signInSilently: ThunderIDReactClient['signInSilently'];\n\n signInUrl: string | undefined;\n /**\n * Sign-out function to terminate the authentication session.\n * @remark This is the programmatic version of the `SignOutButton` component.\n * FIXME: Fix the types.\n */\n signOut: any;\n\n /**\n * Sign-up function to initiate the registration process.\n * @remark This is the programmatic version of the `SignUpButton` component.\n */\n signUp: (...args: any[]) => Promise<any>;\n\n signUpUrl: string | undefined;\n\n user: any;\n\n /**\n * Vendor/brand namespace used to prefix storage keys, cookie names, and CSS class names.\n * Resolved from the `vendor` config option, defaulting to `'thunderid'`.\n */\n vendor: string;\n} & Pick<ThunderIDReactClient, 'clearSession'>;\n\n/**\n * Context object for managing the Authentication flow builder core context.\n */\nconst ThunderIDContext: Context<ThunderIDContextProps | null> = createContext<null | ThunderIDContextProps>({\n afterSignInUrl: undefined,\n applicationId: undefined,\n baseUrl: undefined,\n clearSession: () => {},\n clientId: undefined,\n preferences: undefined,\n scopes: undefined,\n discovery: {\n wellKnown: null,\n },\n exchangeToken: null as unknown as ThunderIDContextProps['exchangeToken'],\n getAccessToken: null as unknown as ThunderIDContextProps['getAccessToken'],\n getDecodedIdToken: null as unknown as ThunderIDContextProps['getDecodedIdToken'],\n getIdToken: null as unknown as ThunderIDContextProps['getIdToken'],\n getStorageManager: () => Promise.resolve(null),\n http: {\n request: () => null as unknown as Promise<HttpResponse<any>>,\n requestAll: () => null as unknown as Promise<HttpResponse<any>[]>,\n },\n instanceId: 0,\n isInitialized: false,\n isLoading: true,\n isMetaLoading: false,\n isSignedIn: false,\n meta: null,\n organizationHandle: undefined,\n reInitialize: null as unknown as ThunderIDContextProps['reInitialize'],\n recover: () => Promise.resolve({} as any),\n resolveFlowTemplateLiterals: (text: string | undefined) => text ?? '',\n signIn: () => Promise.resolve({} as any),\n signInSilently: () => Promise.resolve({} as any),\n signInUrl: undefined,\n signOut: () => Promise.resolve({} as any),\n signUp: () => Promise.resolve({} as any),\n signUpUrl: undefined,\n user: null,\n vendor: VendorConstants.VENDOR_PREFIX,\n});\n\nThunderIDContext.displayName = 'ThunderIDContext';\n\nexport default ThunderIDContext;\n"],"mappings":";;;;;;;AA+NA,MAAMA,mBAA0D,cAA4C;CAC1G,gBAAgB;CAChB,eAAe;CACf,SAAS;CACT,oBAAoB;CACpB,UAAU;CACV,aAAa;CACb,QAAQ;CACR,WAAW,EACT,WAAW,MACZ;CACD,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,YAAY;CACZ,yBAAyB,QAAQ,QAAQ,KAAK;CAC9C,MAAM;EACJ,eAAe;EACf,kBAAkB;EACnB;CACD,YAAY;CACZ,eAAe;CACf,WAAW;CACX,eAAe;CACf,YAAY;CACZ,MAAM;CACN,oBAAoB;CACpB,cAAc;CACd,eAAe,QAAQ,QAAQ,EAAE,CAAQ;CACzC,8BAA8B,SAA6B,QAAQ;CACnE,cAAc,QAAQ,QAAQ,EAAE,CAAQ;CACxC,sBAAsB,QAAQ,QAAQ,EAAE,CAAQ;CAChD,WAAW;CACX,eAAe,QAAQ,QAAQ,EAAE,CAAQ;CACzC,cAAc,QAAQ,QAAQ,EAAE,CAAQ;CACxC,WAAW;CACX,MAAM;CACN,QAAQ,gBAAgB;CACzB,CAAC;AAEF,iBAAiB,cAAc;AAE/B,+BAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThunderIDProvider.d.ts","sourceRoot":"","sources":["../../../src/contexts/ThunderID/ThunderIDProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,OAAO,EAAC,EAAE,EAAa,iBAAiB,EAAkE,MAAM,OAAO,CAAC;AAGxH,OAAO,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAczD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE1D,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAiepE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ThunderIDProvider.d.ts","sourceRoot":"","sources":["../../../src/contexts/ThunderID/ThunderIDProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,OAAO,EAAC,EAAE,EAAa,iBAAiB,EAAkE,MAAM,OAAO,CAAC;AAGxH,OAAO,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAezD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE1D,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CA4epE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -7,6 +7,7 @@ import FlowMetaProvider_default from "../FlowMeta/FlowMetaProvider.js";
7
7
  import I18nProvider_default from "../I18n/I18nProvider.js";
8
8
  import ThemeProvider_default from "../Theme/ThemeProvider.js";
9
9
  import UserProvider_default from "../User/UserProvider.js";
10
+ import getUsersMe_default from "../../api/getUsersMe.js";
10
11
  import { ThunderIDRuntimeError, createPackageComponentLogger, extractUserClaimsFromIdToken, generateFlattenedUserProfile, getVendorPrefix } from "@thunderid/browser";
11
12
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
12
13
  import { jsx } from "react/jsx-runtime";
@@ -62,14 +63,28 @@ const ThunderIDProvider = ({ afterSignInUrl, afterSignOutUrl, baseUrl: initialBa
62
63
  resolvedBaseUrl = `${(await client.getConfiguration()).baseUrl}/o`;
63
64
  setBaseUrl(resolvedBaseUrl);
64
65
  }
66
+ const shouldFetchProfile = preferences?.user?.fetchUserProfile !== false;
65
67
  const claims = extractUserClaimsFromIdToken(decodedToken);
66
- setUser(claims);
68
+ let profileData = claims;
69
+ const currentSignInStatus = await client.isSignedIn();
70
+ if (currentSignInStatus && shouldFetchProfile) try {
71
+ const fetchedProfile = await getUsersMe_default({
72
+ baseUrl: resolvedBaseUrl,
73
+ instanceId
74
+ });
75
+ profileData = {
76
+ ...claims,
77
+ ...fetchedProfile
78
+ };
79
+ } catch (err) {
80
+ logger$1.warn("Failed to fetch user profile from /users/me:", err);
81
+ }
82
+ setUser(profileData);
67
83
  setUserProfile({
68
- flattenedProfile: claims,
69
- profile: claims,
70
- schemas: []
84
+ flattenedProfile: generateFlattenedUserProfile(profileData, []),
85
+ profile: profileData
71
86
  });
72
- setIsSignedInSync(await client.isSignedIn());
87
+ setIsSignedInSync(currentSignInStatus);
73
88
  } catch (error) {} finally {
74
89
  setIsUpdatingSession(false);
75
90
  setIsLoadingSync(client.isLoading());
@@ -203,8 +218,7 @@ const ThunderIDProvider = ({ afterSignInUrl, afterSignOutUrl, baseUrl: initialBa
203
218
  const handleProfileUpdate = (payload) => {
204
219
  setUser(payload);
205
220
  setUserProfile((prev) => ({
206
- schemas: prev?.schemas ?? [],
207
- flattenedProfile: generateFlattenedUserProfile(payload, prev?.schemas ?? []),
221
+ flattenedProfile: generateFlattenedUserProfile(payload),
208
222
  profile: payload
209
223
  }));
210
224
  };
@@ -247,6 +261,7 @@ const ThunderIDProvider = ({ afterSignInUrl, afterSignOutUrl, baseUrl: initialBa
247
261
  isSignedIn: isSignedInSync,
248
262
  organizationChain,
249
263
  organizationHandle: config?.organizationHandle,
264
+ preferences,
250
265
  reInitialize,
251
266
  recover,
252
267
  signIn,
@@ -288,6 +303,7 @@ const ThunderIDProvider = ({ afterSignInUrl, afterSignOutUrl, baseUrl: initialBa
288
303
  getStorageManager,
289
304
  instanceId,
290
305
  organizationChain,
306
+ preferences,
291
307
  recover,
292
308
  reInitialize,
293
309
  request,