@basis-theory/web-elements 2.11.2 → 3.0.0-beta.3

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 (104) hide show
  1. package/README.md +343 -2
  2. package/dist/.vite/manifest.json +27 -0
  3. package/dist/api-client/src/api-client.d.ts +11 -0
  4. package/dist/api-client/src/api-client.d.ts.map +1 -0
  5. package/dist/api-client/src/http-client.d.ts +24 -0
  6. package/dist/api-client/src/http-client.d.ts.map +1 -0
  7. package/dist/api-client/src/index.d.ts +9 -0
  8. package/dist/api-client/src/index.d.ts.map +1 -0
  9. package/dist/api-client/src/services/sessions.d.ts +19 -0
  10. package/dist/api-client/src/services/sessions.d.ts.map +1 -0
  11. package/dist/api-client/src/services/token-intents.d.ts +17 -0
  12. package/dist/api-client/src/services/token-intents.d.ts.map +1 -0
  13. package/dist/api-client/src/services/tokens.d.ts +19 -0
  14. package/dist/api-client/src/services/tokens.d.ts.map +1 -0
  15. package/dist/api-client/src/types.d.ts +313 -0
  16. package/dist/api-client/src/types.d.ts.map +1 -0
  17. package/dist/basis-theory-sdk.es.js +6 -0
  18. package/dist/basis-theory-sdk.es.js.map +1 -0
  19. package/dist/basis-theory-sdk.umd.js +1 -0
  20. package/dist/basis-theory-sdk.umd.js.map +1 -0
  21. package/dist/create-card-DipDWgph.js +232 -0
  22. package/dist/create-card-DipDWgph.js.map +1 -0
  23. package/dist/index-BBfuUaLw.js +2317 -0
  24. package/dist/index-BBfuUaLw.js.map +1 -0
  25. package/dist/loader/basis-theory.min.js +1 -0
  26. package/dist/postmessage/src/client.d.ts +7 -0
  27. package/dist/postmessage/src/client.d.ts.map +1 -0
  28. package/dist/postmessage/src/event-map.d.ts +135 -0
  29. package/dist/postmessage/src/event-map.d.ts.map +1 -0
  30. package/dist/postmessage/src/index.d.ts +9 -0
  31. package/dist/postmessage/src/index.d.ts.map +1 -0
  32. package/dist/postmessage/src/server.d.ts +11 -0
  33. package/dist/postmessage/src/server.d.ts.map +1 -0
  34. package/dist/postmessage/src/types.d.ts +71 -0
  35. package/dist/postmessage/src/types.d.ts.map +1 -0
  36. package/dist/shared/src/api-url-resolver.d.ts +22 -0
  37. package/dist/shared/src/api-url-resolver.d.ts.map +1 -0
  38. package/dist/shared/src/debug-logger.d.ts +16 -0
  39. package/dist/shared/src/debug-logger.d.ts.map +1 -0
  40. package/dist/shared/src/deep-sanitization.d.ts +24 -0
  41. package/dist/shared/src/deep-sanitization.d.ts.map +1 -0
  42. package/dist/shared/src/errors.d.ts +93 -0
  43. package/dist/shared/src/errors.d.ts.map +1 -0
  44. package/dist/shared/src/generate-id.d.ts +13 -0
  45. package/dist/shared/src/generate-id.d.ts.map +1 -0
  46. package/dist/shared/src/index.d.ts +13 -0
  47. package/dist/shared/src/index.d.ts.map +1 -0
  48. package/dist/shared/src/logger-context.d.ts +25 -0
  49. package/dist/shared/src/logger-context.d.ts.map +1 -0
  50. package/dist/sri.json +22 -0
  51. package/dist/stats.html +4949 -0
  52. package/dist/web-elements/src/BasisTheory.d.ts +47 -0
  53. package/dist/web-elements/src/BasisTheory.d.ts.map +1 -0
  54. package/dist/web-elements/src/basis-theory.d.ts +62 -0
  55. package/dist/web-elements/src/basis-theory.d.ts.map +1 -0
  56. package/dist/web-elements/src/elements/create-card-number.d.ts +14 -0
  57. package/dist/web-elements/src/elements/create-card-number.d.ts.map +1 -0
  58. package/dist/web-elements/src/elements/create-card.d.ts +37 -0
  59. package/dist/web-elements/src/elements/create-card.d.ts.map +1 -0
  60. package/dist/web-elements/src/elements/create-cvv.d.ts +10 -0
  61. package/dist/web-elements/src/elements/create-cvv.d.ts.map +1 -0
  62. package/dist/web-elements/src/elements/create-expiry.d.ts +10 -0
  63. package/dist/web-elements/src/elements/create-expiry.d.ts.map +1 -0
  64. package/dist/web-elements/src/elements/create-text.d.ts +13 -0
  65. package/dist/web-elements/src/elements/create-text.d.ts.map +1 -0
  66. package/dist/web-elements/src/index.d.ts +27 -0
  67. package/dist/web-elements/src/index.d.ts.map +1 -0
  68. package/dist/web-elements/src/mounter/create-mounter.d.ts +11 -0
  69. package/dist/web-elements/src/mounter/create-mounter.d.ts.map +1 -0
  70. package/dist/web-elements/src/theme/default-theme.d.ts +22 -0
  71. package/dist/web-elements/src/theme/default-theme.d.ts.map +1 -0
  72. package/dist/web-elements/src/theme/inject-theme-dark.d.ts +13 -0
  73. package/dist/web-elements/src/theme/inject-theme-dark.d.ts.map +1 -0
  74. package/dist/web-elements/src/theme/inject-theme.d.ts +20 -0
  75. package/dist/web-elements/src/theme/inject-theme.d.ts.map +1 -0
  76. package/dist/web-elements/src/types/events.d.ts +137 -0
  77. package/dist/web-elements/src/types/events.d.ts.map +1 -0
  78. package/dist/web-elements/src/types/theme.d.ts +91 -0
  79. package/dist/web-elements/src/types/theme.d.ts.map +1 -0
  80. package/dist/web-elements/src/types.d.ts +537 -0
  81. package/dist/web-elements/src/types.d.ts.map +1 -0
  82. package/dist/web-elements/src/utils/create-event-dispatcher.d.ts +47 -0
  83. package/dist/web-elements/src/utils/create-event-dispatcher.d.ts.map +1 -0
  84. package/dist/web-elements/src/utils/create-iframe.d.ts +10 -0
  85. package/dist/web-elements/src/utils/create-iframe.d.ts.map +1 -0
  86. package/dist/web-elements/src/utils/resolve-element-references.d.ts +20 -0
  87. package/dist/web-elements/src/utils/resolve-element-references.d.ts.map +1 -0
  88. package/dist/web-elements/src/utils/validate-element-options.d.ts +11 -0
  89. package/dist/web-elements/src/utils/validate-element-options.d.ts.map +1 -0
  90. package/dist/web-elements/src/utils/validate-sdk-config.d.ts +15 -0
  91. package/dist/web-elements/src/utils/validate-sdk-config.d.ts.map +1 -0
  92. package/dist/web-elements/src/utils/warn-unknown-keys.d.ts +15 -0
  93. package/dist/web-elements/src/utils/warn-unknown-keys.d.ts.map +1 -0
  94. package/dist/web-elements/src/version.d.ts +25 -0
  95. package/dist/web-elements/src/version.d.ts.map +1 -0
  96. package/package.json +53 -72
  97. package/LICENSE +0 -202
  98. package/dist/LICENSE +0 -202
  99. package/dist/README.md +0 -3
  100. package/dist/bundle/index.js +0 -1
  101. package/dist/main/index.js +0 -1161
  102. package/dist/module/module.js +0 -1159
  103. package/dist/package.json +0 -37
  104. package/dist/types/index.d.ts +0 -732
@@ -0,0 +1,232 @@
1
+ import { E as ElementError, c as createIframe, a as createPostMessageClient, b as createEventDispatcher, l as log, d as createMounter } from "./index-BBfuUaLw.js";
2
+ const DEFAULT_CARD_STACK_THRESHOLD = 400;
3
+ const createCardElement = (apiKey, sdkConfig, options = {}, coordinatorElementId, ensureCoordinatorReady) => {
4
+ let iframe = null;
5
+ let client = null;
6
+ let mounter = null;
7
+ let isMounted = false;
8
+ let container = null;
9
+ let eventDispatcher = null;
10
+ const eventTarget = new EventTarget();
11
+ const id = coordinatorElementId;
12
+ const type = "card";
13
+ const setupEventListeners = () => {
14
+ if (!client) {
15
+ return;
16
+ }
17
+ eventDispatcher = createEventDispatcher({
18
+ elementType: type,
19
+ elementId: id,
20
+ client,
21
+ eventTarget
22
+ });
23
+ eventDispatcher.setupSubscriptions();
24
+ };
25
+ const createSubElementRef = (subId) => ({
26
+ id: subId,
27
+ type: "card",
28
+ get mounted() {
29
+ return isMounted;
30
+ },
31
+ mount: () => {
32
+ throw ElementError("Sub-field refs cannot be mounted independently");
33
+ },
34
+ unmount: () => {
35
+ },
36
+ update: () => Promise.resolve(),
37
+ focus: () => {
38
+ },
39
+ blur: () => {
40
+ },
41
+ clear: () => {
42
+ },
43
+ on: () => () => {
44
+ }
45
+ });
46
+ const cardElement = {
47
+ id,
48
+ type,
49
+ get mounted() {
50
+ return isMounted;
51
+ },
52
+ // Sub-field references for tokenization
53
+ fields: {
54
+ number: createSubElementRef(`${id}__number`),
55
+ expiryDate: createSubElementRef(`${id}__expiry`),
56
+ cvc: createSubElementRef(`${id}__cvc`)
57
+ },
58
+ mount: async (selector) => {
59
+ if (isMounted) {
60
+ throw ElementError("Element is already mounted");
61
+ }
62
+ container = typeof selector === "string" ? document.querySelector(selector) : selector;
63
+ if (!container) {
64
+ throw ElementError(`Container not found: ${selector}`);
65
+ }
66
+ const parentOrigin = window.location.origin;
67
+ const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/card.html`);
68
+ iframeUrl.searchParams.set("parentOrigin", parentOrigin);
69
+ iframeUrl.searchParams.set("elementId", id);
70
+ iframeUrl.searchParams.set(
71
+ "measurePerformance",
72
+ String(sdkConfig.measurePerformance || false)
73
+ );
74
+ iframeUrl.searchParams.set("debug", String(sdkConfig.debug || false));
75
+ iframe = createIframe({
76
+ src: iframeUrl.toString(),
77
+ sandbox: "allow-scripts allow-same-origin",
78
+ title: options.ariaLabel || "Card Input"
79
+ });
80
+ iframe.setAttribute("data-bt-element-id", id);
81
+ iframe.setAttribute("data-theme-mode", sdkConfig.themeMode || "auto");
82
+ client = createPostMessageClient(iframe, {
83
+ targetOrigin: sdkConfig.iframeOrigin,
84
+ timeout: sdkConfig.timeoutMs,
85
+ retries: sdkConfig.retryConfig.maxRetries,
86
+ debug: sdkConfig.debug
87
+ });
88
+ mounter = createMounter();
89
+ setupEventListeners();
90
+ const readyPromise = new Promise((resolve, reject) => {
91
+ const timeout = setTimeout(() => {
92
+ reject(
93
+ ElementError(
94
+ `Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,
95
+ id,
96
+ { elementType: type, timeoutMs: sdkConfig.timeoutMs }
97
+ )
98
+ );
99
+ }, sdkConfig.timeoutMs);
100
+ const handleReady = () => {
101
+ clearTimeout(timeout);
102
+ resolve();
103
+ };
104
+ eventTarget.addEventListener("ready", handleReady, { once: true });
105
+ });
106
+ mounter.mount(container, iframe, {
107
+ timeoutMs: sdkConfig.timeoutMs
108
+ });
109
+ isMounted = true;
110
+ try {
111
+ await ensureCoordinatorReady();
112
+ await readyPromise;
113
+ await client.sendRequest("CMD_SET_CONFIG", {
114
+ elementId: id,
115
+ apiKey,
116
+ apiTimeout: sdkConfig.timeoutMs,
117
+ apiRetries: sdkConfig.retryConfig.maxRetries,
118
+ theme: sdkConfig.theme,
119
+ darkTheme: sdkConfig.darkTheme,
120
+ themeMode: sdkConfig.themeMode,
121
+ placeholder: options.placeholder,
122
+ style: options.style,
123
+ disabled: options.disabled,
124
+ readOnly: options.readOnly,
125
+ layout: options.layout || "auto",
126
+ stackAt: options.stackAt || DEFAULT_CARD_STACK_THRESHOLD,
127
+ iconPosition: options.iconPosition || "left",
128
+ cardBrands: options.cardBrands,
129
+ debug: sdkConfig.debug
130
+ });
131
+ if (iframe) iframe.style.opacity = "1";
132
+ } catch (error) {
133
+ if (eventDispatcher) {
134
+ eventDispatcher.dispatchError(
135
+ "MOUNT_ERROR",
136
+ error.message,
137
+ error
138
+ );
139
+ }
140
+ isMounted = false;
141
+ if (client) {
142
+ client.destroy();
143
+ client = null;
144
+ }
145
+ if (mounter && iframe) {
146
+ mounter.unmount(iframe);
147
+ iframe = null;
148
+ mounter = null;
149
+ }
150
+ eventDispatcher = null;
151
+ container = null;
152
+ throw error;
153
+ }
154
+ },
155
+ unmount: () => {
156
+ if (!isMounted) {
157
+ throw ElementError("Element is not mounted");
158
+ }
159
+ if (client) {
160
+ client.sendRequest("CMD_CLEAR_CACHE", {}).catch((error) => {
161
+ log("Failed to send clear cache command", {
162
+ error: error.message
163
+ });
164
+ });
165
+ client.destroy();
166
+ client = null;
167
+ }
168
+ if (mounter && iframe) {
169
+ mounter.unmount(iframe);
170
+ iframe = null;
171
+ mounter = null;
172
+ }
173
+ eventDispatcher = null;
174
+ container = null;
175
+ isMounted = false;
176
+ },
177
+ update: async (newOptions) => {
178
+ if (!isMounted || !client) {
179
+ throw ElementError("Element must be mounted before updating");
180
+ }
181
+ const cardOptions = newOptions;
182
+ const updatePayload = {
183
+ placeholder: cardOptions.placeholder,
184
+ style: cardOptions.style,
185
+ disabled: cardOptions.disabled,
186
+ readOnly: cardOptions.readOnly,
187
+ layout: cardOptions.layout,
188
+ stackAt: cardOptions.stackAt,
189
+ iconPosition: cardOptions.iconPosition,
190
+ cardBrands: cardOptions.cardBrands
191
+ };
192
+ if (newOptions.themeMode !== void 0) {
193
+ updatePayload.themeMode = newOptions.themeMode;
194
+ updatePayload.theme = sdkConfig.theme;
195
+ updatePayload.darkTheme = sdkConfig.darkTheme;
196
+ }
197
+ await client.sendRequest("CMD_UPDATE_CONFIG", updatePayload);
198
+ },
199
+ focus: () => {
200
+ if (!isMounted || !client) {
201
+ throw ElementError("Element must be mounted before focusing");
202
+ }
203
+ client.sendRequest("CMD_FOCUS", {});
204
+ },
205
+ blur: () => {
206
+ if (!isMounted || !client) {
207
+ throw ElementError("Element must be mounted before blurring");
208
+ }
209
+ client.sendRequest("CMD_BLUR", {});
210
+ },
211
+ clear: () => {
212
+ if (!isMounted || !client) {
213
+ throw ElementError("Element must be mounted before clearing");
214
+ }
215
+ client.sendRequest("CMD_CLEAR", {});
216
+ },
217
+ on: (eventType, listener) => {
218
+ eventTarget.addEventListener(
219
+ eventType,
220
+ listener
221
+ );
222
+ return () => eventTarget.removeEventListener(
223
+ eventType,
224
+ listener
225
+ );
226
+ }
227
+ };
228
+ return cardElement;
229
+ };
230
+ export {
231
+ createCardElement
232
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-card-DipDWgph.js","sources":["../src/elements/create-card.ts"],"sourcesContent":["/**\n * Card Element Factory (Unified)\n */\n\nimport type { PostMessageClient } from '@basis-theory-elements/postmessage';\nimport { createPostMessageClient } from '@basis-theory-elements/postmessage';\nimport { ElementError, log } from '@basis-theory-elements/shared';\nimport { createMounter } from '../mounter/create-mounter';\nimport type {\n CardElement,\n ElementMounter,\n ElementOptions,\n EventListener,\n EventType,\n SDKConfig,\n SubElementRef,\n} from '../types';\nimport { createIframe } from '../utils/create-iframe';\nimport { createEventDispatcher } from '../utils/create-event-dispatcher';\n\n/**\n * Default stack threshold in pixels for CardElement auto-layout\n * When container width is below this threshold, card inputs stack vertically\n */\nconst DEFAULT_CARD_STACK_THRESHOLD = 400;\n\n/**\n * Card element options\n */\nexport interface CardElementOptions {\n /** CSS styling */\n style?: Record<string, any>;\n\n /** Placeholder text for each sub-field */\n placeholder?: {\n cardNumber?: string;\n expiryDate?: string;\n cvc?: string;\n };\n\n /** Accessibility label */\n ariaLabel?: string;\n\n /** Disabled state (applies to all 3 sub-fields) */\n disabled?: boolean;\n\n /** Read-only state (applies to all 3 sub-fields) */\n readOnly?: boolean;\n\n /** Layout mode */\n layout?: 'row' | 'column' | 'auto';\n\n /** Stack threshold in pixels (only applies when layout: 'auto') */\n stackAt?: number;\n\n /** Icon position */\n iconPosition?: 'left' | 'right' | 'none';\n\n /** Restrict accepted card brands */\n cardBrands?: string[];\n}\n\n/**\n * Factory function to create a unified card element\n * No class, pure functional approach with closure-based state\n */\nexport const createCardElement = (\n apiKey: string,\n sdkConfig: SDKConfig,\n options: CardElementOptions = {},\n coordinatorElementId: string,\n ensureCoordinatorReady: () => Promise<void>\n): CardElement => {\n // Private state (closure)\n let iframe: HTMLIFrameElement | null = null;\n let client: PostMessageClient | null = null;\n let mounter: ElementMounter | null = null;\n let isMounted = false;\n let container: HTMLElement | null = null;\n let eventDispatcher: ReturnType<typeof createEventDispatcher> | null = null;\n\n // Event target for event emission\n const eventTarget = new EventTarget();\n\n // Use coordinator-generated ID for all references\n const id = coordinatorElementId;\n const type = 'card';\n\n // Setup event dispatcher\n const setupEventListeners = () => {\n if (!client) {\n return;\n }\n\n eventDispatcher = createEventDispatcher({\n elementType: type,\n elementId: id,\n client,\n eventTarget,\n });\n\n eventDispatcher.setupSubscriptions();\n };\n\n /**\n * Create sub-element reference for tokenization\n * These refs are used in bt.tokens.create() data payload\n */\n const createSubElementRef = (subId: string): SubElementRef => ({\n id: subId,\n type: 'card',\n get mounted() {\n return isMounted;\n },\n mount: () => {\n throw ElementError('Sub-field refs cannot be mounted independently');\n },\n unmount: () => {},\n update: () => Promise.resolve(),\n focus: () => {},\n blur: () => {},\n clear: () => {},\n on: () => () => {},\n });\n\n // Public API (Element interface with sub-field refs)\n const cardElement = {\n id,\n type,\n get mounted() {\n return isMounted;\n },\n\n // Sub-field references for tokenization\n fields: {\n number: createSubElementRef(`${id}__number`),\n expiryDate: createSubElementRef(`${id}__expiry`),\n cvc: createSubElementRef(`${id}__cvc`),\n },\n\n mount: async (selector: string | HTMLElement) => {\n if (isMounted) {\n throw ElementError('Element is already mounted');\n }\n\n // Resolve container\n container =\n typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n\n if (!container) {\n throw ElementError(`Container not found: ${selector}`);\n }\n\n // Create iframe\n const parentOrigin = window.location.origin;\n const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/card.html`);\n iframeUrl.searchParams.set('parentOrigin', parentOrigin);\n iframeUrl.searchParams.set('elementId', id);\n iframeUrl.searchParams.set(\n 'measurePerformance',\n String(sdkConfig.measurePerformance || false)\n );\n iframeUrl.searchParams.set('debug', String(sdkConfig.debug || false));\n\n iframe = createIframe({\n src: iframeUrl.toString(),\n sandbox: 'allow-scripts allow-same-origin',\n title: options.ariaLabel || 'Card Input',\n });\n\n // Add element ID and theme mode attributes\n iframe.setAttribute('data-bt-element-id', id);\n iframe.setAttribute('data-theme-mode', sdkConfig.themeMode || 'auto');\n\n // Create PostMessage client\n client = createPostMessageClient(iframe, {\n targetOrigin: sdkConfig.iframeOrigin,\n timeout: sdkConfig.timeoutMs,\n retries: sdkConfig.retryConfig.maxRetries,\n debug: sdkConfig.debug,\n });\n\n // Create mounter\n mounter = createMounter();\n\n // Set up event listeners\n setupEventListeners();\n\n // Subscribe to 'ready' event BEFORE mounting iframe\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n ElementError(\n `Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,\n id,\n { elementType: type, timeoutMs: sdkConfig.timeoutMs }\n )\n );\n }, sdkConfig.timeoutMs);\n\n const handleReady = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n eventTarget.addEventListener('ready', handleReady, { once: true });\n });\n\n // Mount iframe to DOM (synchronous)\n mounter.mount(container, iframe, {\n timeoutMs: sdkConfig.timeoutMs,\n });\n\n isMounted = true;\n\n // Wait for coordinator + configuration to complete\n try {\n // Wait for coordinator (loads Core SDK if needed)\n await ensureCoordinatorReady();\n\n // Wait for EVENT_READY\n await readyPromise;\n\n // Send initial configuration with card-specific options\n await client!.sendRequest('CMD_SET_CONFIG', {\n elementId: id,\n apiKey,\n apiTimeout: sdkConfig.timeoutMs,\n apiRetries: sdkConfig.retryConfig.maxRetries,\n theme: sdkConfig.theme,\n darkTheme: sdkConfig.darkTheme,\n themeMode: sdkConfig.themeMode,\n placeholder: options.placeholder,\n style: options.style,\n disabled: options.disabled,\n readOnly: options.readOnly,\n layout: options.layout || 'auto',\n stackAt: options.stackAt || DEFAULT_CARD_STACK_THRESHOLD,\n iconPosition: options.iconPosition || 'left',\n cardBrands: options.cardBrands,\n debug: sdkConfig.debug,\n });\n\n // Reveal iframe now that theme is fully applied\n if (iframe) iframe.style.opacity = '1';\n } catch (error) {\n // Dispatch error event before cleanup\n if (eventDispatcher) {\n eventDispatcher.dispatchError(\n 'MOUNT_ERROR',\n (error as Error).message,\n error as Error\n );\n }\n\n // Mount failed - clean up and mark as unmounted\n isMounted = false;\n\n if (client) {\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n\n throw error;\n }\n },\n\n unmount: () => {\n if (!isMounted) {\n throw ElementError('Element is not mounted');\n }\n\n // Tell iframe to notify coordinator to clear cached values (all 3 sub-fields)\n if (client) {\n client.sendRequest('CMD_CLEAR_CACHE', {}).catch((error) => {\n log('Failed to send clear cache command', {\n elementId: id,\n error: (error as Error).message,\n });\n });\n\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n isMounted = false;\n },\n\n update: async (newOptions: Partial<ElementOptions> & { themeMode?: string }) => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before updating');\n }\n\n // Cast to CardElementOptions to access card-specific properties\n const cardOptions = newOptions as Partial<CardElementOptions> & { themeMode?: string };\n\n // Build update payload\n const updatePayload: Record<string, any> = {\n placeholder: cardOptions.placeholder,\n style: cardOptions.style,\n disabled: cardOptions.disabled,\n readOnly: cardOptions.readOnly,\n layout: cardOptions.layout,\n stackAt: cardOptions.stackAt,\n iconPosition: cardOptions.iconPosition,\n cardBrands: cardOptions.cardBrands,\n };\n\n // Include theme mode update if provided\n if (newOptions.themeMode !== undefined) {\n updatePayload.themeMode = newOptions.themeMode;\n updatePayload.theme = sdkConfig.theme;\n updatePayload.darkTheme = sdkConfig.darkTheme;\n }\n\n await client.sendRequest('CMD_UPDATE_CONFIG', updatePayload);\n },\n\n focus: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before focusing');\n }\n\n client.sendRequest('CMD_FOCUS', {});\n },\n\n blur: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before blurring');\n }\n\n client.sendRequest('CMD_BLUR', {});\n },\n\n clear: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before clearing');\n }\n\n client.sendRequest('CMD_CLEAR', {});\n },\n\n on: (eventType: EventType, listener: EventListener) => {\n eventTarget.addEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n\n // Return unsubscribe function\n return () =>\n eventTarget.removeEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n },\n };\n\n return cardElement as CardElement;\n};\n"],"names":[],"mappings":"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"}