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

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 (101) hide show
  1. package/dist/.vite/manifest.json +30 -8
  2. package/dist/basis-theory-sdk.es.js +1 -1
  3. package/dist/basis-theory-sdk.umd.js +1 -1
  4. package/dist/basis-theory-sdk.umd.js.map +1 -1
  5. package/dist/{create-card-DipDWgph.js → create-card-CB_YcP_4.js} +58 -20
  6. package/dist/create-card-CB_YcP_4.js.map +1 -0
  7. package/dist/create-card-display-kBupMJwe.js +280 -0
  8. package/dist/create-card-display-kBupMJwe.js.map +1 -0
  9. package/dist/create-copy-button-2XtKTEo3.js +236 -0
  10. package/dist/create-copy-button-2XtKTEo3.js.map +1 -0
  11. package/dist/{index-BBfuUaLw.js → index-Dyy7tm5Z.js} +709 -140
  12. package/dist/index-Dyy7tm5Z.js.map +1 -0
  13. package/dist/index.d.ts +1119 -0
  14. package/dist/loader/basis-theory.min.js +1 -1
  15. package/dist/sri.json +9 -9
  16. package/dist/stats.html +1 -1
  17. package/package.json +12 -12
  18. package/dist/api-client/src/api-client.d.ts +0 -11
  19. package/dist/api-client/src/api-client.d.ts.map +0 -1
  20. package/dist/api-client/src/http-client.d.ts +0 -24
  21. package/dist/api-client/src/http-client.d.ts.map +0 -1
  22. package/dist/api-client/src/index.d.ts +0 -9
  23. package/dist/api-client/src/index.d.ts.map +0 -1
  24. package/dist/api-client/src/services/sessions.d.ts +0 -19
  25. package/dist/api-client/src/services/sessions.d.ts.map +0 -1
  26. package/dist/api-client/src/services/token-intents.d.ts +0 -17
  27. package/dist/api-client/src/services/token-intents.d.ts.map +0 -1
  28. package/dist/api-client/src/services/tokens.d.ts +0 -19
  29. package/dist/api-client/src/services/tokens.d.ts.map +0 -1
  30. package/dist/api-client/src/types.d.ts +0 -313
  31. package/dist/api-client/src/types.d.ts.map +0 -1
  32. package/dist/create-card-DipDWgph.js.map +0 -1
  33. package/dist/index-BBfuUaLw.js.map +0 -1
  34. package/dist/postmessage/src/client.d.ts +0 -7
  35. package/dist/postmessage/src/client.d.ts.map +0 -1
  36. package/dist/postmessage/src/event-map.d.ts +0 -135
  37. package/dist/postmessage/src/event-map.d.ts.map +0 -1
  38. package/dist/postmessage/src/index.d.ts +0 -9
  39. package/dist/postmessage/src/index.d.ts.map +0 -1
  40. package/dist/postmessage/src/server.d.ts +0 -11
  41. package/dist/postmessage/src/server.d.ts.map +0 -1
  42. package/dist/postmessage/src/types.d.ts +0 -71
  43. package/dist/postmessage/src/types.d.ts.map +0 -1
  44. package/dist/shared/src/api-url-resolver.d.ts +0 -22
  45. package/dist/shared/src/api-url-resolver.d.ts.map +0 -1
  46. package/dist/shared/src/debug-logger.d.ts +0 -16
  47. package/dist/shared/src/debug-logger.d.ts.map +0 -1
  48. package/dist/shared/src/deep-sanitization.d.ts +0 -24
  49. package/dist/shared/src/deep-sanitization.d.ts.map +0 -1
  50. package/dist/shared/src/errors.d.ts +0 -93
  51. package/dist/shared/src/errors.d.ts.map +0 -1
  52. package/dist/shared/src/generate-id.d.ts +0 -13
  53. package/dist/shared/src/generate-id.d.ts.map +0 -1
  54. package/dist/shared/src/index.d.ts +0 -13
  55. package/dist/shared/src/index.d.ts.map +0 -1
  56. package/dist/shared/src/logger-context.d.ts +0 -25
  57. package/dist/shared/src/logger-context.d.ts.map +0 -1
  58. package/dist/web-elements/src/BasisTheory.d.ts +0 -47
  59. package/dist/web-elements/src/BasisTheory.d.ts.map +0 -1
  60. package/dist/web-elements/src/basis-theory.d.ts +0 -62
  61. package/dist/web-elements/src/basis-theory.d.ts.map +0 -1
  62. package/dist/web-elements/src/elements/create-card-number.d.ts +0 -14
  63. package/dist/web-elements/src/elements/create-card-number.d.ts.map +0 -1
  64. package/dist/web-elements/src/elements/create-card.d.ts +0 -37
  65. package/dist/web-elements/src/elements/create-card.d.ts.map +0 -1
  66. package/dist/web-elements/src/elements/create-cvv.d.ts +0 -10
  67. package/dist/web-elements/src/elements/create-cvv.d.ts.map +0 -1
  68. package/dist/web-elements/src/elements/create-expiry.d.ts +0 -10
  69. package/dist/web-elements/src/elements/create-expiry.d.ts.map +0 -1
  70. package/dist/web-elements/src/elements/create-text.d.ts +0 -13
  71. package/dist/web-elements/src/elements/create-text.d.ts.map +0 -1
  72. package/dist/web-elements/src/index.d.ts +0 -27
  73. package/dist/web-elements/src/index.d.ts.map +0 -1
  74. package/dist/web-elements/src/mounter/create-mounter.d.ts +0 -11
  75. package/dist/web-elements/src/mounter/create-mounter.d.ts.map +0 -1
  76. package/dist/web-elements/src/theme/default-theme.d.ts +0 -22
  77. package/dist/web-elements/src/theme/default-theme.d.ts.map +0 -1
  78. package/dist/web-elements/src/theme/inject-theme-dark.d.ts +0 -13
  79. package/dist/web-elements/src/theme/inject-theme-dark.d.ts.map +0 -1
  80. package/dist/web-elements/src/theme/inject-theme.d.ts +0 -20
  81. package/dist/web-elements/src/theme/inject-theme.d.ts.map +0 -1
  82. package/dist/web-elements/src/types/events.d.ts +0 -137
  83. package/dist/web-elements/src/types/events.d.ts.map +0 -1
  84. package/dist/web-elements/src/types/theme.d.ts +0 -91
  85. package/dist/web-elements/src/types/theme.d.ts.map +0 -1
  86. package/dist/web-elements/src/types.d.ts +0 -537
  87. package/dist/web-elements/src/types.d.ts.map +0 -1
  88. package/dist/web-elements/src/utils/create-event-dispatcher.d.ts +0 -47
  89. package/dist/web-elements/src/utils/create-event-dispatcher.d.ts.map +0 -1
  90. package/dist/web-elements/src/utils/create-iframe.d.ts +0 -10
  91. package/dist/web-elements/src/utils/create-iframe.d.ts.map +0 -1
  92. package/dist/web-elements/src/utils/resolve-element-references.d.ts +0 -20
  93. package/dist/web-elements/src/utils/resolve-element-references.d.ts.map +0 -1
  94. package/dist/web-elements/src/utils/validate-element-options.d.ts +0 -11
  95. package/dist/web-elements/src/utils/validate-element-options.d.ts.map +0 -1
  96. package/dist/web-elements/src/utils/validate-sdk-config.d.ts +0 -15
  97. package/dist/web-elements/src/utils/validate-sdk-config.d.ts.map +0 -1
  98. package/dist/web-elements/src/utils/warn-unknown-keys.d.ts +0 -15
  99. package/dist/web-elements/src/utils/warn-unknown-keys.d.ts.map +0 -1
  100. package/dist/web-elements/src/version.d.ts +0 -25
  101. package/dist/web-elements/src/version.d.ts.map +0 -1
@@ -0,0 +1,236 @@
1
+ import { C as ConfigurationError, l as log, E as ElementError, g as generateId, c as createIframe, a as createPostMessageClient, b as createEventDispatcher, d as createMounter } from "./index-Dyy7tm5Z.js";
2
+ const createCopyButtonElement = (_apiKey, sdkConfig, inputOptions, coordinatorElementId, ensureCoordinatorReady, _notifyCoordinatorElementUnmount) => {
3
+ const options = inputOptions;
4
+ if ((options == null ? void 0 : options.allowClipboard) !== true) {
5
+ throw ConfigurationError(
6
+ "CopyButton requires allowClipboard: true. Clipboard access for raw card data may not be PCI compliant and must be explicitly enabled.",
7
+ {
8
+ received: options == null ? void 0 : options.allowClipboard,
9
+ expected: true,
10
+ elementType: "copyButton"
11
+ }
12
+ );
13
+ }
14
+ let iframe = null;
15
+ let client = null;
16
+ let mounter = null;
17
+ let isMounted = false;
18
+ let container = null;
19
+ let eventDispatcher = null;
20
+ const eventTarget = new EventTarget();
21
+ const id = coordinatorElementId;
22
+ const type = "copyButton";
23
+ const setupEventListeners = () => {
24
+ if (!client) return;
25
+ eventDispatcher = createEventDispatcher({
26
+ elementType: type,
27
+ elementId: id,
28
+ client,
29
+ eventTarget
30
+ });
31
+ eventDispatcher.setupSubscriptions();
32
+ client.subscribe("EVENT_COPY", (payload) => {
33
+ const event = new CustomEvent("copy", {
34
+ detail: {
35
+ elementType: type,
36
+ elementId: id,
37
+ timestamp: Date.now(),
38
+ success: (payload == null ? void 0 : payload.success) ?? false,
39
+ error: payload == null ? void 0 : payload.error
40
+ }
41
+ });
42
+ eventTarget.dispatchEvent(event);
43
+ });
44
+ };
45
+ const element = {
46
+ id,
47
+ type,
48
+ get mounted() {
49
+ return isMounted;
50
+ },
51
+ get loaded() {
52
+ return isMounted;
53
+ },
54
+ mount: async (selector) => {
55
+ if (isMounted) {
56
+ throw ElementError("Element is already mounted", id);
57
+ }
58
+ container = typeof selector === "string" ? document.querySelector(selector) : selector;
59
+ if (!container) {
60
+ throw ElementError(`Container not found: ${selector}`);
61
+ }
62
+ const signature = generateId();
63
+ const parentOrigin = window.location.origin;
64
+ const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/copy-button.html`);
65
+ iframeUrl.searchParams.set("parentOrigin", parentOrigin);
66
+ iframeUrl.searchParams.set("elementId", id);
67
+ iframeUrl.searchParams.set("signature", signature);
68
+ iframeUrl.searchParams.set(
69
+ "measurePerformance",
70
+ String(sdkConfig.measurePerformance || false)
71
+ );
72
+ iframeUrl.searchParams.set("debug", String(sdkConfig.debug || false));
73
+ iframe = createIframe({
74
+ src: iframeUrl.toString(),
75
+ sandbox: "allow-scripts allow-same-origin",
76
+ // clipboard-write is required for Firefox/Safari clipboard access in iframes
77
+ allow: "clipboard-write",
78
+ title: "Copy Button"
79
+ });
80
+ iframe.setAttribute("data-bt-element-id", id);
81
+ client = createPostMessageClient(iframe, {
82
+ targetOrigin: sdkConfig.iframeOrigin,
83
+ timeout: sdkConfig.timeoutMs,
84
+ retries: sdkConfig.retryConfig.maxRetries,
85
+ debug: sdkConfig.debug
86
+ });
87
+ mounter = createMounter();
88
+ setupEventListeners();
89
+ const readyPromise = new Promise((resolve, reject) => {
90
+ const timeout = setTimeout(() => {
91
+ reject(
92
+ ElementError(
93
+ `Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,
94
+ id,
95
+ { elementType: type, timeoutMs: sdkConfig.timeoutMs }
96
+ )
97
+ );
98
+ }, sdkConfig.timeoutMs);
99
+ const handleReady = () => {
100
+ clearTimeout(timeout);
101
+ resolve();
102
+ };
103
+ eventTarget.addEventListener("ready", handleReady, { once: true });
104
+ });
105
+ mounter.mount(container, iframe, {
106
+ timeoutMs: sdkConfig.timeoutMs
107
+ });
108
+ isMounted = true;
109
+ try {
110
+ await ensureCoordinatorReady();
111
+ await readyPromise;
112
+ await client.sendRequest("CMD_SET_CONFIG", {
113
+ elementId: id,
114
+ signature,
115
+ // Must match URL param signature for iframe to operate
116
+ theme: sdkConfig.theme,
117
+ darkTheme: sdkConfig.darkTheme,
118
+ themeMode: sdkConfig.themeMode,
119
+ text: options.text || "Copy",
120
+ value: options.value,
121
+ disabled: options.disabled,
122
+ debug: sdkConfig.debug
123
+ });
124
+ if (iframe) iframe.style.opacity = "1";
125
+ } catch (error) {
126
+ if (eventDispatcher) {
127
+ eventDispatcher.dispatchError(
128
+ "MOUNT_ERROR",
129
+ error.message,
130
+ error
131
+ );
132
+ }
133
+ isMounted = false;
134
+ if (client) {
135
+ client.destroy();
136
+ client = null;
137
+ }
138
+ if (mounter && iframe) {
139
+ mounter.unmount(iframe);
140
+ iframe = null;
141
+ mounter = null;
142
+ }
143
+ eventDispatcher = null;
144
+ container = null;
145
+ throw error;
146
+ }
147
+ },
148
+ unmount: () => {
149
+ if (!isMounted) {
150
+ throw ElementError("Element is not mounted");
151
+ }
152
+ if (client) {
153
+ client.destroy();
154
+ client = null;
155
+ }
156
+ if (mounter && iframe) {
157
+ mounter.unmount(iframe);
158
+ iframe = null;
159
+ mounter = null;
160
+ }
161
+ eventDispatcher = null;
162
+ container = null;
163
+ isMounted = false;
164
+ },
165
+ update: async (newOptions) => {
166
+ if (!isMounted || !client) {
167
+ throw ElementError("Element must be mounted before updating", id);
168
+ }
169
+ const updatePayload = {};
170
+ const copyButtonOptions = newOptions;
171
+ if (copyButtonOptions.text !== void 0) {
172
+ updatePayload.text = copyButtonOptions.text;
173
+ }
174
+ if (copyButtonOptions.value !== void 0) {
175
+ updatePayload.value = copyButtonOptions.value;
176
+ }
177
+ if (copyButtonOptions.disabled !== void 0) {
178
+ updatePayload.disabled = copyButtonOptions.disabled;
179
+ }
180
+ if (newOptions.themeMode !== void 0) {
181
+ updatePayload.themeMode = newOptions.themeMode;
182
+ updatePayload.theme = sdkConfig.theme;
183
+ updatePayload.darkTheme = sdkConfig.darkTheme;
184
+ }
185
+ await client.sendRequest("CMD_UPDATE_CONFIG", updatePayload);
186
+ },
187
+ focus: () => {
188
+ if (!isMounted || !client) {
189
+ throw ElementError("Element must be mounted before focusing", id);
190
+ }
191
+ client.sendRequest("CMD_FOCUS", {});
192
+ },
193
+ blur: () => {
194
+ if (!isMounted || !client) {
195
+ throw ElementError("Element must be mounted before blurring", id);
196
+ }
197
+ client.sendRequest("CMD_BLUR", {});
198
+ },
199
+ // No-op for CopyButton (nothing to clear in a button)
200
+ clear: () => {
201
+ },
202
+ on: (eventType, listener) => {
203
+ eventTarget.addEventListener(
204
+ eventType,
205
+ listener
206
+ );
207
+ return () => eventTarget.removeEventListener(
208
+ eventType,
209
+ listener
210
+ );
211
+ },
212
+ /**
213
+ * Link this copy button to another element's value
214
+ * Sends CMD_SET_VALUE_REF to the iframe with the referenced element's ID
215
+ * @returns Promise that resolves when the reference is set
216
+ */
217
+ setValueRef: async (refElement) => {
218
+ log("setValueRef called", {
219
+ refElementId: refElement == null ? void 0 : refElement.id
220
+ });
221
+ if (!refElement || !refElement.id) {
222
+ throw ElementError("setValueRef requires a valid Element with an ID", id);
223
+ }
224
+ if (!isMounted || !client) {
225
+ throw ElementError("Element must be mounted before calling setValueRef", id);
226
+ }
227
+ await client.sendRequest("CMD_SET_VALUE_REF", {
228
+ referenceElementId: refElement.id
229
+ });
230
+ }
231
+ };
232
+ return element;
233
+ };
234
+ export {
235
+ createCopyButtonElement
236
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-copy-button-2XtKTEo3.js","sources":["../src/elements/create-copy-button.ts"],"sourcesContent":["/**\n * Copy Button Element Factory\n *\n * Creates a secure button that copies values to clipboard.\n * Can copy either a static value or a value from a linked BT element.\n *\n * SECURITY NOTE: This element is opt-in only via allowClipboard: true.\n * Clipboard access for raw card data may not be PCI compliant and must\n * never be enabled inadvertently.\n */\n\nimport type { PostMessageClient } from '@basis-theory-elements/postmessage';\nimport { createPostMessageClient } from '@basis-theory-elements/postmessage';\nimport { ConfigurationError, ElementError, generateId, log } from '@basis-theory-elements/shared';\nimport { createMounter } from '../mounter/create-mounter';\nimport type {\n CopyButtonElement,\n CopyButtonOptions,\n Element,\n ElementMounter,\n ElementOptions,\n EventListener,\n EventType,\n SDKConfig,\n} from '../types';\nimport { createIframe } from '../utils/create-iframe';\nimport { createEventDispatcher } from '../utils/create-event-dispatcher';\n\n/**\n * Factory function to create a copy button element\n *\n * @throws ConfigurationError if allowClipboard is not set to true\n */\nexport const createCopyButtonElement = (\n _apiKey: string, // Reserved for future API calls\n sdkConfig: SDKConfig,\n inputOptions: ElementOptions | CopyButtonOptions | undefined,\n coordinatorElementId: string,\n ensureCoordinatorReady: () => Promise<void>,\n _notifyCoordinatorElementUnmount: (elementId: string) => Promise<void> // Not used - CopyButton doesn't cache sensitive values\n): CopyButtonElement => {\n // SECURITY: Defense-in-depth check for allowClipboard flag\n // Primary validation is in validate-element-options.ts, but we keep this\n // as a backup in case the factory is called directly (e.g., lazy loading)\n const options = inputOptions as CopyButtonOptions | undefined;\n if (options?.allowClipboard !== true) {\n throw ConfigurationError(\n 'CopyButton requires allowClipboard: true. ' +\n 'Clipboard access for raw card data may not be PCI compliant ' +\n 'and must be explicitly enabled.',\n {\n received: options?.allowClipboard,\n expected: true,\n elementType: 'copyButton',\n }\n );\n }\n\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 const eventTarget = new EventTarget();\n const id = coordinatorElementId;\n const type = 'copyButton' as const;\n\n // Setup event dispatcher (centralized event mapping logic)\n const setupEventListeners = () => {\n if (!client) return;\n\n eventDispatcher = createEventDispatcher({\n elementType: type,\n elementId: id,\n client,\n eventTarget,\n });\n\n eventDispatcher.setupSubscriptions();\n\n // Subscribe to copy events from the iframe\n client.subscribe('EVENT_COPY', (payload) => {\n const event = new CustomEvent('copy', {\n detail: {\n elementType: type,\n elementId: id,\n timestamp: Date.now(),\n success: payload?.success ?? false,\n error: payload?.error,\n },\n });\n eventTarget.dispatchEvent(event);\n });\n };\n\n const element: CopyButtonElement = {\n id,\n type,\n get mounted() {\n return isMounted;\n },\n get loaded() {\n return isMounted;\n },\n\n mount: async (selector: string | HTMLElement) => {\n if (isMounted) {\n throw ElementError('Element is already mounted', id);\n }\n\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 // Generate signature for iframe authentication\n // Must match between URL param and CMD_SET_CONFIG to prevent\n // unauthorized iframe framing attacks\n const signature = generateId();\n\n // Pass parent origin + element ID + signature via URL parameters\n const parentOrigin = window.location.origin;\n const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/copy-button.html`);\n iframeUrl.searchParams.set('parentOrigin', parentOrigin);\n iframeUrl.searchParams.set('elementId', id);\n iframeUrl.searchParams.set('signature', signature);\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 // clipboard-write is required for Firefox/Safari clipboard access in iframes\n allow: 'clipboard-write',\n title: 'Copy Button',\n });\n\n // Add element ID attribute for debugging\n iframe.setAttribute('data-bt-element-id', id);\n\n client = createPostMessageClient(iframe, {\n targetOrigin: sdkConfig.iframeOrigin,\n timeout: sdkConfig.timeoutMs,\n retries: sdkConfig.retryConfig.maxRetries,\n debug: sdkConfig.debug,\n });\n\n mounter = createMounter();\n setupEventListeners();\n\n // Subscribe to 'ready' event BEFORE mounting iframe (prevents race condition)\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\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 await ensureCoordinatorReady();\n await readyPromise;\n\n // Send copy button config with signature for authentication\n await client!.sendRequest('CMD_SET_CONFIG', {\n elementId: id,\n signature, // Must match URL param signature for iframe to operate\n theme: sdkConfig.theme,\n darkTheme: sdkConfig.darkTheme,\n themeMode: sdkConfig.themeMode,\n text: options.text || 'Copy',\n value: options.value,\n disabled: options.disabled,\n debug: sdkConfig.debug,\n });\n\n // Reveal iframe now that theme is 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\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 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 isMounted = false;\n },\n\n update: async (newOptions: Partial<CopyButtonOptions> & { themeMode?: string }) => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before updating', id);\n }\n\n // Only send fields that are present (matches create-card-number) so we never\n // overwrite iframe config with undefined/null over postMessage.\n const updatePayload: Record<string, any> = {};\n\n const copyButtonOptions = newOptions as Partial<CopyButtonOptions> & { themeMode?: string };\n\n if (copyButtonOptions.text !== undefined) {\n updatePayload.text = copyButtonOptions.text;\n }\n if (copyButtonOptions.value !== undefined) {\n updatePayload.value = copyButtonOptions.value;\n }\n if (copyButtonOptions.disabled !== undefined) {\n updatePayload.disabled = copyButtonOptions.disabled;\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', id);\n }\n\n client.sendRequest('CMD_FOCUS', {});\n },\n\n blur: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before blurring', id);\n }\n\n client.sendRequest('CMD_BLUR', {});\n },\n\n // No-op for CopyButton (nothing to clear in a button)\n clear: () => {},\n\n on: (eventType: EventType, listener: EventListener) => {\n eventTarget.addEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n\n return () =>\n eventTarget.removeEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n },\n\n /**\n * Link this copy button to another element's value\n * Sends CMD_SET_VALUE_REF to the iframe with the referenced element's ID\n * @returns Promise that resolves when the reference is set\n */\n setValueRef: async (refElement: Element): Promise<void> => {\n log('setValueRef called', {\n copyButtonId: id,\n refElementId: refElement?.id,\n });\n\n if (!refElement || !refElement.id) {\n throw ElementError('setValueRef requires a valid Element with an ID', id);\n }\n\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before calling setValueRef', id);\n }\n\n // Send command to iframe to link to the referenced element\n await client.sendRequest('CMD_SET_VALUE_REF', {\n referenceElementId: refElement.id,\n });\n },\n };\n\n return element;\n};\n"],"names":[],"mappings":"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"}