@cofhe/react 0.0.0-beta-20251112060550 → 0.0.0-beta-20251119082915

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -35,7 +35,12 @@ __export(index_exports, {
35
35
  FnxEncryptInput: () => FnxEncryptInput,
36
36
  encryptedValueToString: () => encryptedValueToString,
37
37
  fheTypeToString: () => fheTypeToString,
38
+ useCofheActivePermit: () => useCofheActivePermit,
39
+ useCofheAllPermits: () => useCofheAllPermits,
40
+ useCofheConnection: () => useCofheConnection,
38
41
  useCofheContext: () => useCofheContext,
42
+ useCofheRemovePermit: () => useCofheRemovePermit,
43
+ useCofheSelectPermit: () => useCofheSelectPermit,
39
44
  useEncryptInput: () => useEncryptInput
40
45
  });
41
46
  module.exports = __toCommonJS(index_exports);
@@ -204,27 +209,15 @@ function useEncryptInput() {
204
209
  };
205
210
  }
206
211
 
207
- // src/components/FnxEncryptInput.tsx
212
+ // src/hooks/useCofheConnection.ts
208
213
  var import_react3 = require("react");
214
+ var import_sdk2 = require("@cofhe/sdk");
209
215
 
210
216
  // src/utils/cn.ts
211
217
  var cn = (...classes) => {
212
218
  return classes.filter(Boolean).join(" ").replace(/\s+/g, " ").trim();
213
219
  };
214
220
 
215
- // src/utils/debounce.ts
216
- var debounce = (func, wait) => {
217
- let timeoutId = null;
218
- return (...args) => {
219
- if (timeoutId !== null) {
220
- clearTimeout(timeoutId);
221
- }
222
- timeoutId = setTimeout(() => {
223
- func(...args);
224
- }, wait);
225
- };
226
- };
227
-
228
221
  // src/utils/utils.ts
229
222
  var FheTypesList = [
230
223
  {
@@ -277,8 +270,160 @@ var FheTypesList = [
277
270
  description: "Ethereum address (0x...)"
278
271
  }
279
272
  ];
273
+ var NOOP_CALLBACK = () => () => {
274
+ };
275
+
276
+ // src/utils/logging.ts
277
+ var fheTypeToString = (fheType) => {
278
+ switch (fheType) {
279
+ case "bool":
280
+ return "ebool";
281
+ case "uint8":
282
+ return "euint8";
283
+ case "uint16":
284
+ return "euint16";
285
+ case "uint32":
286
+ return "euint32";
287
+ case "uint64":
288
+ return "euint64";
289
+ case "uint128":
290
+ return "euint128";
291
+ case "address":
292
+ return "eaddress";
293
+ default:
294
+ return "unknown";
295
+ }
296
+ };
297
+ var encryptedValueToString = (fheType, handle) => {
298
+ const hashStr = handle.toString();
299
+ const truncated = hashStr.slice(0, 6) + ".." + hashStr.slice(hashStr.length - 6);
300
+ return `${fheTypeToString(fheType)}(${truncated})`;
301
+ };
302
+
303
+ // src/utils/debounce.ts
304
+ var debounce = (func, wait) => {
305
+ let timeoutId = null;
306
+ return (...args) => {
307
+ if (timeoutId !== null) {
308
+ clearTimeout(timeoutId);
309
+ }
310
+ timeoutId = setTimeout(() => {
311
+ func(...args);
312
+ }, wait);
313
+ };
314
+ };
315
+
316
+ // src/hooks/useCofheConnection.ts
317
+ var subscribeToConnectionConstructor = (client) => (onStoreChange) => {
318
+ return client.subscribe(() => {
319
+ onStoreChange();
320
+ });
321
+ };
322
+ var getConnectionSnapshotConstructor = (client) => () => client.getSnapshot();
323
+ var DEFAULT_SNAPSHOT_GETTER = () => import_sdk2.CONNECT_STORE_DEFAULTS;
324
+ var useCofheConnection = () => {
325
+ const client = useCofheContext().client;
326
+ const { subscribeToConnection, getConnectionSnapshot } = (0, import_react3.useMemo)(() => {
327
+ return {
328
+ subscribeToConnection: client && subscribeToConnectionConstructor(client),
329
+ getConnectionSnapshot: client && getConnectionSnapshotConstructor(client)
330
+ };
331
+ }, [client]);
332
+ return (0, import_react3.useSyncExternalStore)(
333
+ // fallback to default store and no subscription if client is not initialized yet
334
+ subscribeToConnection || NOOP_CALLBACK,
335
+ getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,
336
+ getConnectionSnapshot || void 0
337
+ );
338
+ };
339
+
340
+ // src/hooks/useCofhePermits.ts
341
+ var import_react4 = require("react");
342
+ var import_permits = require("@cofhe/sdk/permits");
343
+ var subscribeToPermitsConstructor = (client) => (onStoreChange) => {
344
+ return client.permits.subscribe(() => {
345
+ onStoreChange();
346
+ });
347
+ };
348
+ var getPermitsSnapshotConstructor = (client) => () => client.permits.getSnapshot();
349
+ var DEFAULT_SNAPSHOT_GETTER2 = () => import_permits.PERMIT_STORE_DEFAULTS;
350
+ var useCofhePermitsStore = () => {
351
+ const client = useCofheContext().client;
352
+ const { subscribeToConnection, getConnectionSnapshot } = (0, import_react4.useMemo)(() => {
353
+ return {
354
+ subscribeToConnection: client && subscribeToPermitsConstructor(client),
355
+ getConnectionSnapshot: client && getPermitsSnapshotConstructor(client)
356
+ };
357
+ }, [client]);
358
+ const state = (0, import_react4.useSyncExternalStore)(
359
+ // fallback to default store and no subscription if client is not initialized yet
360
+ subscribeToConnection || NOOP_CALLBACK,
361
+ getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER2,
362
+ getConnectionSnapshot || void 0
363
+ );
364
+ return { state, client };
365
+ };
366
+ var useCofheActivePermit = () => {
367
+ const { account, chainId, connected } = useCofheConnection();
368
+ const { state } = useCofhePermitsStore();
369
+ const allPermits = chainId && account ? state.permits[chainId]?.[account] : void 0;
370
+ const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : void 0;
371
+ const serialized = hash && allPermits ? allPermits[hash] : void 0;
372
+ const permitData = (0, import_react4.useMemo)(() => {
373
+ const _permit = serialized ? import_permits.PermitUtils.deserialize(serialized) : void 0;
374
+ if (!_permit || !hash) return void 0;
375
+ return {
376
+ permit: _permit,
377
+ isValid: _permit ? import_permits.PermitUtils.isValid(_permit).valid : false,
378
+ hash
379
+ };
380
+ }, [serialized, hash]);
381
+ return connected ? permitData : void 0;
382
+ };
383
+ var useCofheAllPermits = () => {
384
+ const { account, chainId, connected } = useCofheConnection();
385
+ const { state } = useCofhePermitsStore();
386
+ const allPermits = chainId && account ? state.permits[chainId]?.[account] : void 0;
387
+ const allPermitsWithHashes = (0, import_react4.useMemo)(
388
+ () => allPermits ? Object.keys(allPermits).map((hash) => {
389
+ const serializedPermit = allPermits[hash];
390
+ if (!serializedPermit) throw new Error("Permit data missing");
391
+ return {
392
+ hash,
393
+ permit: import_permits.PermitUtils.deserialize(serializedPermit)
394
+ };
395
+ }) : [],
396
+ [allPermits]
397
+ );
398
+ return connected ? allPermitsWithHashes : [];
399
+ };
400
+ var useCofheRemovePermit = () => {
401
+ const { account, chainId } = useCofheConnection();
402
+ const { client } = useCofhePermitsStore();
403
+ return (0, import_react4.useCallback)(
404
+ (hashToRemove) => {
405
+ if (!client || !chainId || !account)
406
+ throw new Error("Client, chainId, and account must be defined to remove a permit");
407
+ client.permits.removePermit(hashToRemove, chainId, account);
408
+ },
409
+ [client, chainId, account]
410
+ );
411
+ };
412
+ var useCofheSelectPermit = () => {
413
+ const { account, chainId } = useCofheConnection();
414
+ const { client } = useCofhePermitsStore();
415
+ return (0, import_react4.useCallback)(
416
+ (hashToSet) => {
417
+ if (!client || !chainId || !account)
418
+ throw new Error("Client, chainId, and account must be defined to set active permit hash");
419
+ client.permits.selectActivePermit(hashToSet, chainId, account);
420
+ },
421
+ [client, chainId, account]
422
+ );
423
+ };
280
424
 
281
425
  // src/components/FnxEncryptInput.tsx
426
+ var import_react5 = require("react");
282
427
  var import_Security = __toESM(require("@mui/icons-material/Security"), 1);
283
428
  var import_KeyboardArrowDown = __toESM(require("@mui/icons-material/KeyboardArrowDown"), 1);
284
429
  var import_ContentCopy = __toESM(require("@mui/icons-material/ContentCopy"), 1);
@@ -303,20 +448,20 @@ var FnxEncryptInput = ({
303
448
  onEncryptComplete,
304
449
  onEncryptError
305
450
  }) => {
306
- const [textValue, setTextValue] = (0, import_react3.useState)(initialValue);
307
- const [selectedType, setSelectedType] = (0, import_react3.useState)(options[0]?.value || "uint32");
308
- const [isDropdownOpen, setIsDropdownOpen] = (0, import_react3.useState)(false);
309
- const [showProgress, setShowProgress] = (0, import_react3.useState)(false);
310
- const [encryptedResult, setEncryptedResult] = (0, import_react3.useState)(null);
311
- const [copySuccess, setCopySuccess] = (0, import_react3.useState)(false);
312
- const dropdownRef = (0, import_react3.useRef)(null);
451
+ const [textValue, setTextValue] = (0, import_react5.useState)(initialValue);
452
+ const [selectedType, setSelectedType] = (0, import_react5.useState)(options[0]?.value || "uint32");
453
+ const [isDropdownOpen, setIsDropdownOpen] = (0, import_react5.useState)(false);
454
+ const [showProgress, setShowProgress] = (0, import_react5.useState)(false);
455
+ const [encryptedResult, setEncryptedResult] = (0, import_react5.useState)(null);
456
+ const [copySuccess, setCopySuccess] = (0, import_react5.useState)(false);
457
+ const dropdownRef = (0, import_react5.useRef)(null);
313
458
  const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();
314
- const debouncedValidation = (0, import_react3.useRef)(
459
+ const debouncedValidation = (0, import_react5.useRef)(
315
460
  debounce((value) => {
316
461
  console.log("Debounced validation for:", value);
317
462
  }, debounceMs)
318
463
  ).current;
319
- (0, import_react3.useEffect)(() => {
464
+ (0, import_react5.useEffect)(() => {
320
465
  if (showProgressBar && isEncryptingInput) {
321
466
  setShowProgress(true);
322
467
  } else if (!isEncryptingInput) {
@@ -324,7 +469,7 @@ var FnxEncryptInput = ({
324
469
  return () => clearTimeout(timer);
325
470
  }
326
471
  }, [showProgressBar, isEncryptingInput]);
327
- (0, import_react3.useEffect)(() => {
472
+ (0, import_react5.useEffect)(() => {
328
473
  if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {
329
474
  onEncryptProgress?.({
330
475
  step: encryptionStep.toString(),
@@ -333,7 +478,7 @@ var FnxEncryptInput = ({
333
478
  });
334
479
  }
335
480
  }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);
336
- (0, import_react3.useEffect)(() => {
481
+ (0, import_react5.useEffect)(() => {
337
482
  const handleClickOutside = (event) => {
338
483
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
339
484
  setIsDropdownOpen(false);
@@ -579,33 +724,6 @@ var FnxEncryptInput = ({
579
724
  )
580
725
  ] });
581
726
  };
582
-
583
- // src/utils/logging.ts
584
- var fheTypeToString = (fheType) => {
585
- switch (fheType) {
586
- case "bool":
587
- return "ebool";
588
- case "uint8":
589
- return "euint8";
590
- case "uint16":
591
- return "euint16";
592
- case "uint32":
593
- return "euint32";
594
- case "uint64":
595
- return "euint64";
596
- case "uint128":
597
- return "euint128";
598
- case "address":
599
- return "eaddress";
600
- default:
601
- return "unknown";
602
- }
603
- };
604
- var encryptedValueToString = (fheType, handle) => {
605
- const hashStr = handle.toString();
606
- const truncated = hashStr.slice(0, 6) + ".." + hashStr.slice(hashStr.length - 6);
607
- return `${fheTypeToString(fheType)}(${truncated})`;
608
- };
609
727
  // Annotate the CommonJS export names for ESM import in node:
610
728
  0 && (module.exports = {
611
729
  CofheProvider,
@@ -613,7 +731,12 @@ var encryptedValueToString = (fheType, handle) => {
613
731
  FnxEncryptInput,
614
732
  encryptedValueToString,
615
733
  fheTypeToString,
734
+ useCofheActivePermit,
735
+ useCofheAllPermits,
736
+ useCofheConnection,
616
737
  useCofheContext,
738
+ useCofheRemovePermit,
739
+ useCofheSelectPermit,
617
740
  useEncryptInput
618
741
  });
619
742
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/CofheProvider.tsx","../src/hooks/useEncryptInput.ts","../src/components/FnxEncryptInput.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/utils.ts","../src/utils/logging.ts"],"sourcesContent":["// Styles\nimport './styles.css';\n\n// Providers\nexport { CofheProvider, useCofheContext } from './providers/index.js';\n\n// Hooks\nexport { useEncryptInput } from './hooks/index.js';\n\n// Components\nexport { FnxEncryptInput } from './components/index.js';\n\n// Utils\nexport { FheTypesList, fheTypeToString, encryptedValueToString } from './utils/index.js';\n\n// Types\nexport type {\n CofheContextValue,\n CofheProviderProps,\n CofheClientConfig,\n} from './types/index.js';\n","import { createContext, useContext, useEffect, useState } from 'react';\nimport type { CofhesdkClient } from '@cofhe/sdk';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index.js';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider({ children, client: providedClient, config }: CofheProviderProps) {\n const [client, setClient] = useState<CofhesdkClient | null>(providedClient || null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (providedClient) {\n setClient(providedClient);\n setIsInitialized(true);\n return;\n }\n\n if (config) {\n try {\n // Initialize client with config\n // This would need to be implemented based on the actual CofheClient constructor\n // const newClient = new CofheClient(config);\n // setClient(newClient);\n setIsInitialized(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to initialize CoFHE client'));\n }\n }\n }, [providedClient, config]);\n\n const contextValue: CofheContextValue = {\n client,\n isInitialized,\n error,\n };\n\n return (\n <CofheContext.Provider value={contextValue}>\n {children}\n </CofheContext.Provider>\n );\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../providers/CofheProvider.js';\nimport { Encryptable } from '@cofhe/sdk';\nimport type { EncryptableItem } from '@cofhe/sdk';\nimport type { FheTypeValue } from '../utils/utils.js';\nimport type { EncryptionStep } from '../types/component-types.js';\n\n// Map SDK encrypt steps to UI display info\nconst STEP_CONFIG: Record<EncryptionStep, { label: string; progress: number }> = {\n 'initTfhe': {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n 'fetchKeys': {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n 'pack': {\n label: 'Packing data...',\n progress: 40,\n },\n 'prove': {\n label: 'Generating proof...',\n progress: 70,\n },\n 'verify': {\n label: 'Verifying...',\n progress: 90,\n },\n 'done': {\n label: 'Encryption complete!',\n progress: 100,\n },\n};\n\nexport interface UseEncryptInputReturn {\n onEncryptInput: (_type: FheTypeValue, _value: string) => Promise<any>;\n isEncryptingInput: boolean;\n encryptionStep: EncryptionStep | null;\n encryptionProgress: number;\n encryptionProgressLabel: string;\n inputEncryptionDisabled: boolean;\n}\n\nexport function useEncryptInput(): UseEncryptInputReturn {\n const { client } = useCofheContext();\n const [isEncrypting, setIsEncrypting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [encryptionStep, setEncryptionStep] = useState<EncryptionStep | null>(null);\n const [encryptionProgress, setEncryptionProgress] = useState<number>(0);\n const [encryptionProgressLabel, setEncryptionProgressLabel] = useState<string>('');\n\n const onEncryptInput = useCallback(async (type: FheTypeValue, value: string) => {\n if (!client) {\n throw new Error('CoFHE client not initialized');\n }\n\n setIsEncrypting(true);\n setError(null);\n\n try {\n // Convert value based on type\n let convertedValue: number | bigint | boolean | string;\n \n if (type === 'bool') {\n convertedValue = value.toLowerCase() === 'true' || value === '1';\n } else if (type === 'address') {\n convertedValue = value as string | bigint;\n } else {\n // Numeric types\n convertedValue = value.includes('.') ? parseFloat(value) : parseInt(value, 10);\n }\n\n // Create encryptable item\n let encryptableItem: EncryptableItem;\n \n switch (type) {\n case 'bool':\n encryptableItem = Encryptable.bool(convertedValue as boolean);\n break;\n case 'uint8':\n encryptableItem = Encryptable.uint8(BigInt(convertedValue));\n break;\n case 'uint16':\n encryptableItem = Encryptable.uint16(BigInt(convertedValue));\n break;\n case 'uint32':\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n break;\n case 'uint64':\n encryptableItem = Encryptable.uint64(BigInt(convertedValue));\n break;\n case 'uint128':\n encryptableItem = Encryptable.uint128(BigInt(convertedValue));\n break;\n case 'address':\n encryptableItem = Encryptable.address(convertedValue as string | bigint);\n break;\n default:\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n }\n\n // Perform encryption with real-time step tracking\n const encryptionBuilder = client.encryptInputs([encryptableItem]).setStepCallback((step, context) => {\n const stepConfig = STEP_CONFIG[step as EncryptionStep];\n \n if (stepConfig) {\n // Update UI with real step information\n setEncryptionStep(step as EncryptionStep);\n setEncryptionProgress(stepConfig.progress);\n setEncryptionProgressLabel(stepConfig.label);\n }\n \n // Log worker status for debugging (prove step only)\n if (step === 'prove' && context?.isEnd) {\n console.log('[Encryption] Worker Status:', {\n useWorker: context.useWorker,\n usedWorker: context.usedWorker,\n workerFailedError: context.workerFailedError,\n duration: context.duration + 'ms'\n });\n }\n });\n const result = await encryptionBuilder.encrypt();\n \n if (!result.success) {\n throw result.error;\n }\n\n // Complete\n setEncryptionStep('done');\n setEncryptionProgress(100);\n setEncryptionProgressLabel('Encryption complete!');\n\n // Reset after a short delay\n setTimeout(() => {\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n }, 1000);\n\n setIsEncrypting(false);\n return result.data[0]; // Return first (and only) encrypted item\n } catch (err) {\n // Reset on error\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n setIsEncrypting(false);\n const error = err instanceof Error ? err : new Error('Encryption failed');\n setError(error);\n throw error;\n }\n }, [client]);\n\n return {\n onEncryptInput,\n isEncryptingInput: isEncrypting,\n encryptionStep,\n encryptionProgress,\n encryptionProgressLabel,\n inputEncryptionDisabled: isEncrypting || !!error,\n };\n}\n","import { useState, useRef, useEffect } from 'react';\nimport type { BaseProps, DropdownOption, ComponentSize, EncryptionProgressData, EncryptionResultData, EncryptionStartData } from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList, type FheTypeValue } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { useEncryptInput } from '../hooks/useEncryptInput.js';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();\n\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncryptingInput) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncryptingInput) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncryptingInput]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: encryptionStep.toString(),\n progress: encryptionProgress,\n label: encryptionProgressLabel\n });\n }\n }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' }\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError \n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500' \n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncryptingInput) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncryptingInput) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncryptingInput) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) => cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible \n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium' \n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500'\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') => cn(\n 'h-full transition-all duration-300 ease-out rounded-full',\n progressVariantClasses[variant]\n );\n\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n \n const typeInfo = FheTypesList.find(type => type.value === typeValue);\n if (!typeInfo) return false;\n \n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n \n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n \n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n \n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n \n return true;\n }\n \n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n \n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n \n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n \n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n \n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(encryptedResult, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }, 2); // Pretty format with 2 spaces\n \n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n \n // Show success indication\n setCopySuccess(true);\n \n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n \n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n \n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const encryptionResult = await onEncryptInput(type, textValue);\n \n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n \n const data = { value: textValue, encrypted: encryptionResult };\n \n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncryptingInput) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => (\n <SecurityIcon sx={{ fontSize: 14 }} />\n );\n\n const ChevronDownIcon = () => (\n <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n \n {/* Encryption status indicator */}\n {(isEncryptingInput || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncryptingInput ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">\n Encrypting...\n </div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess \n ? 'bg-green-600 cursor-default' \n : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? \"Copied to clipboard!\" : \"Copy encrypted result to clipboard\"}\n >\n <>\n {copySuccess ? (\n <CheckIcon sx={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n \n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n \n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n \n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={!isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined}\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div \n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncryptingInput ? 'slideDownFadeIn 0.5s ease-out forwards' : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {encryptionProgress || 0}%\n </span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{ \n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out'\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n \n </div>\n \n {/* Error message */}\n {hasError && errorMessage && (\n <p \n className=\"mt-2 text-sm text-red-600 dark:text-red-400\" \n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n };\n ","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n ): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n };\n ","// FHE Types for the current CoFHE SDK\nexport type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n { \n label: \"Encrypted Bool\", \n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: \"Boolean value (true/false)\"\n },\n { \n label: \"Encrypted Uint8\", \n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: \"8-bit unsigned integer (0 to 255)\"\n },\n { \n label: \"Encrypted Uint16\", \n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: \"16-bit unsigned integer (0 to 65,535)\"\n },\n { \n label: \"Encrypted Uint32\", \n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: \"32-bit unsigned integer (0 to 4,294,967,295)\"\n },\n { \n label: \"Encrypted Uint64\", \n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: \"64-bit unsigned integer (0 to 18,446,744,073,709,551,615)\"\n },\n { \n label: \"Encrypted Uint128\", \n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: \"128-bit unsigned integer\"\n },\n { \n label: \"Encrypted Address\", \n value: 'address',\n maxValue: null, // Address validation is different\n description: \"Ethereum address (0x...)\"\n },\n];\n","import type { FheTypeValue } from './utils.js';\n\nexport const logBlockStart = (message: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE] │ ${message}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return \"ebool\";\n case 'uint8':\n return \"euint8\";\n case 'uint16':\n return \"euint16\";\n case 'uint32':\n return \"euint32\";\n case 'uint64':\n return \"euint64\";\n case 'uint128':\n return \"euint128\";\n case 'address':\n return \"eaddress\";\n default:\n return \"unknown\";\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? \"true\" : \"false\";\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + \"..\" + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n"],"mappings":"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","names":["import_react","error","import_react","import_jsx_runtime","errorMessage","SecurityIcon","KeyboardArrowDownIcon","CheckIcon","ContentCopyIcon"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/providers/CofheProvider.tsx","../src/hooks/useEncryptInput.ts","../src/hooks/useCofheConnection.ts","../src/utils/cn.ts","../src/utils/utils.ts","../src/utils/logging.ts","../src/utils/debounce.ts","../src/hooks/useCofhePermits.ts","../src/components/FnxEncryptInput.tsx"],"sourcesContent":["// Styles\nimport './styles.css';\n\n// Providers\nexport { CofheProvider, useCofheContext } from './providers/index.js';\n\n// Hooks\nexport {\n useEncryptInput,\n useCofheConnection,\n useCofheActivePermit,\n useCofheAllPermits,\n useCofheRemovePermit,\n useCofheSelectPermit,\n} from './hooks/index';\n\n// Components\nexport { FnxEncryptInput } from './components/index';\n\n// Utils\nexport { FheTypesList, fheTypeToString, encryptedValueToString } from './utils/index';\n\n// Types\nexport type { CofheContextValue, CofheProviderProps, CofheClientConfig } from './types/index';\n","import { createContext, useContext, useEffect, useState } from 'react';\nimport type { CofhesdkClient } from '@cofhe/sdk';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index.js';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider({ children, client: providedClient, config }: CofheProviderProps) {\n const [client, setClient] = useState<CofhesdkClient | null>(providedClient || null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (providedClient) {\n setClient(providedClient);\n setIsInitialized(true);\n return;\n }\n\n if (config) {\n try {\n // Initialize client with config\n // This would need to be implemented based on the actual CofheClient constructor\n // const newClient = new CofheClient(config);\n // setClient(newClient);\n setIsInitialized(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to initialize CoFHE client'));\n }\n }\n }, [providedClient, config]);\n\n const contextValue: CofheContextValue = {\n client,\n isInitialized,\n error,\n };\n\n return (\n <CofheContext.Provider value={contextValue}>\n {children}\n </CofheContext.Provider>\n );\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../providers/CofheProvider.js';\nimport { Encryptable } from '@cofhe/sdk';\nimport type { EncryptableItem } from '@cofhe/sdk';\nimport type { FheTypeValue } from '../utils/utils.js';\nimport type { EncryptionStep } from '../types/component-types.js';\n\n// Map SDK encrypt steps to UI display info\nconst STEP_CONFIG: Record<EncryptionStep, { label: string; progress: number }> = {\n 'initTfhe': {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n 'fetchKeys': {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n 'pack': {\n label: 'Packing data...',\n progress: 40,\n },\n 'prove': {\n label: 'Generating proof...',\n progress: 70,\n },\n 'verify': {\n label: 'Verifying...',\n progress: 90,\n },\n 'done': {\n label: 'Encryption complete!',\n progress: 100,\n },\n};\n\nexport interface UseEncryptInputReturn {\n onEncryptInput: (_type: FheTypeValue, _value: string) => Promise<any>;\n isEncryptingInput: boolean;\n encryptionStep: EncryptionStep | null;\n encryptionProgress: number;\n encryptionProgressLabel: string;\n inputEncryptionDisabled: boolean;\n}\n\nexport function useEncryptInput(): UseEncryptInputReturn {\n const { client } = useCofheContext();\n const [isEncrypting, setIsEncrypting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [encryptionStep, setEncryptionStep] = useState<EncryptionStep | null>(null);\n const [encryptionProgress, setEncryptionProgress] = useState<number>(0);\n const [encryptionProgressLabel, setEncryptionProgressLabel] = useState<string>('');\n\n const onEncryptInput = useCallback(async (type: FheTypeValue, value: string) => {\n if (!client) {\n throw new Error('CoFHE client not initialized');\n }\n\n setIsEncrypting(true);\n setError(null);\n\n try {\n // Convert value based on type\n let convertedValue: number | bigint | boolean | string;\n \n if (type === 'bool') {\n convertedValue = value.toLowerCase() === 'true' || value === '1';\n } else if (type === 'address') {\n convertedValue = value as string | bigint;\n } else {\n // Numeric types\n convertedValue = value.includes('.') ? parseFloat(value) : parseInt(value, 10);\n }\n\n // Create encryptable item\n let encryptableItem: EncryptableItem;\n \n switch (type) {\n case 'bool':\n encryptableItem = Encryptable.bool(convertedValue as boolean);\n break;\n case 'uint8':\n encryptableItem = Encryptable.uint8(BigInt(convertedValue));\n break;\n case 'uint16':\n encryptableItem = Encryptable.uint16(BigInt(convertedValue));\n break;\n case 'uint32':\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n break;\n case 'uint64':\n encryptableItem = Encryptable.uint64(BigInt(convertedValue));\n break;\n case 'uint128':\n encryptableItem = Encryptable.uint128(BigInt(convertedValue));\n break;\n case 'address':\n encryptableItem = Encryptable.address(convertedValue as string | bigint);\n break;\n default:\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n }\n\n // Perform encryption with real-time step tracking\n const encryptionBuilder = client.encryptInputs([encryptableItem]).setStepCallback((step, context) => {\n const stepConfig = STEP_CONFIG[step as EncryptionStep];\n \n if (stepConfig) {\n // Update UI with real step information\n setEncryptionStep(step as EncryptionStep);\n setEncryptionProgress(stepConfig.progress);\n setEncryptionProgressLabel(stepConfig.label);\n }\n \n // Log worker status for debugging (prove step only)\n if (step === 'prove' && context?.isEnd) {\n console.log('[Encryption] Worker Status:', {\n useWorker: context.useWorker,\n usedWorker: context.usedWorker,\n workerFailedError: context.workerFailedError,\n duration: context.duration + 'ms'\n });\n }\n });\n const result = await encryptionBuilder.encrypt();\n \n if (!result.success) {\n throw result.error;\n }\n\n // Complete\n setEncryptionStep('done');\n setEncryptionProgress(100);\n setEncryptionProgressLabel('Encryption complete!');\n\n // Reset after a short delay\n setTimeout(() => {\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n }, 1000);\n\n setIsEncrypting(false);\n return result.data[0]; // Return first (and only) encrypted item\n } catch (err) {\n // Reset on error\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n setIsEncrypting(false);\n const error = err instanceof Error ? err : new Error('Encryption failed');\n setError(error);\n throw error;\n }\n }, [client]);\n\n return {\n onEncryptInput,\n isEncryptingInput: isEncrypting,\n encryptionStep,\n encryptionProgress,\n encryptionProgressLabel,\n inputEncryptionDisabled: isEncrypting || !!error,\n };\n}\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofhesdkClient, type CofhesdkClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofhesdkClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofhesdkClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): string | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n };\n ","// FHE Types for the current CoFHE SDK\nexport type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n","import type { FheTypeValue } from './utils.js';\n\nexport const logBlockStart = (message: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE] │ ${message}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return \"ebool\";\n case 'uint8':\n return \"euint8\";\n case 'uint16':\n return \"euint16\";\n case 'uint32':\n return \"euint32\";\n case 'uint64':\n return \"euint64\";\n case 'uint128':\n return \"euint128\";\n case 'address':\n return \"eaddress\";\n default:\n return \"unknown\";\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? \"true\" : \"false\";\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + \"..\" + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n ): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n };\n ","import type { CofhesdkClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\n\nconst subscribeToPermitsConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofhesdkClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofhesdkClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n hash: string;\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheAllPermits = (): { hash: string; permit: Permit }[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits).map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return {\n hash,\n permit: PermitUtils.deserialize(serializedPermit),\n };\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofheRemovePermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToRemove: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n client.permits.removePermit(hashToRemove, chainId, account);\n },\n [client, chainId, account]\n );\n};\n\nexport const useCofheSelectPermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToSet: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n client.permits.selectActivePermit(hashToSet, chainId, account);\n },\n [client, chainId, account]\n );\n};\n","import { useState, useRef, useEffect } from 'react';\nimport type { BaseProps, DropdownOption, ComponentSize, EncryptionProgressData, EncryptionResultData, EncryptionStartData } from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList, type FheTypeValue } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { useEncryptInput } from '../hooks/useEncryptInput.js';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();\n\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncryptingInput) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncryptingInput) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncryptingInput]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: encryptionStep.toString(),\n progress: encryptionProgress,\n label: encryptionProgressLabel\n });\n }\n }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' }\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError \n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500' \n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncryptingInput) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncryptingInput) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncryptingInput) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) => cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible \n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium' \n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500'\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') => cn(\n 'h-full transition-all duration-300 ease-out rounded-full',\n progressVariantClasses[variant]\n );\n\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n \n const typeInfo = FheTypesList.find(type => type.value === typeValue);\n if (!typeInfo) return false;\n \n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n \n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n \n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n \n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n \n return true;\n }\n \n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n \n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n \n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n \n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n \n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(encryptedResult, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }, 2); // Pretty format with 2 spaces\n \n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n \n // Show success indication\n setCopySuccess(true);\n \n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n \n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n \n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const encryptionResult = await onEncryptInput(type, textValue);\n \n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n \n const data = { value: textValue, encrypted: encryptionResult };\n \n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncryptingInput) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => (\n <SecurityIcon sx={{ fontSize: 14 }} />\n );\n\n const ChevronDownIcon = () => (\n <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n \n {/* Encryption status indicator */}\n {(isEncryptingInput || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncryptingInput ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">\n Encrypting...\n </div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess \n ? 'bg-green-600 cursor-default' \n : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? \"Copied to clipboard!\" : \"Copy encrypted result to clipboard\"}\n >\n <>\n {copySuccess ? (\n <CheckIcon sx={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n \n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n \n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n \n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={!isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined}\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div \n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncryptingInput ? 'slideDownFadeIn 0.5s ease-out forwards' : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {encryptionProgress || 0}%\n </span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{ \n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out'\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n \n </div>\n \n {/* Error message */}\n {hasError && errorMessage && (\n <p \n className=\"mt-2 text-sm text-red-600 dark:text-red-400\" \n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["import_react","error","import_react","import_sdk","import_react","DEFAULT_SNAPSHOT_GETTER","import_react","import_jsx_runtime","errorMessage","SecurityIcon","KeyboardArrowDownIcon","CheckIcon","ContentCopyIcon"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.css"],"sourcesContent":["*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n.cofhe-dropdown-container {\n position: relative;\n}\n.cofhe-dropdown-menu {\n position: absolute;\n right: 0px;\n top: 100%;\n z-index: 50;\n margin-top: 0.25rem;\n width: 12rem;\n border-radius: 0.5rem;\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.cofhe-dropdown-menu:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.cofhe-dropdown-menu {\n max-height: 12rem;\n overflow-y: auto;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n/* Custom scrollbar for dropdown */\n.cofhe-dropdown-menu::-webkit-scrollbar {\n width: 0.5rem;\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-track {\n background-color: transparent;\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-thumb {\n border-radius: 9999px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.dark .cofhe-dropdown-menu::-webkit-scrollbar-thumb {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-thumb:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.dark .cofhe-dropdown-menu::-webkit-scrollbar-thumb:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-16 {\n right: 4rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-1\\/2 {\n top: 50%;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-full {\n height: 100%;\n}\n.w-full {\n width: 100%;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes pulse {\n\n 50% {\n opacity: .5;\n }\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n.bg-blue-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-yellow-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1));\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n.px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.pr-20 {\n padding-right: 5rem;\n}\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-medium {\n font-weight: 500;\n}\n.text-blue-700 {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.placeholder-gray-400::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(156 163 175 / var(--tw-placeholder-opacity, 1));\n}\n.placeholder-gray-400::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(156 163 175 / var(--tw-placeholder-opacity, 1));\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* Component-specific styles for proper dropdown behavior */\n\n.focus-within\\:border-blue-500:focus-within {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));\n}\n\n.focus-within\\:border-red-500:focus-within {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n\n.focus-within\\:ring-2:focus-within {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus-within\\:ring-blue-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1));\n}\n\n.focus-within\\:ring-red-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1));\n}\n\n.hover\\:bg-blue-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n\n.hover\\:text-blue-700:hover {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:border-gray-600:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n\n.dark\\:bg-blue-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-blue-900\\/50:is(.dark *) {\n background-color: rgb(30 58 138 / 0.5);\n}\n\n.dark\\:bg-gray-600:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-green-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-red-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:bg-yellow-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:text-blue-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:text-gray-500:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:text-red-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n\n.dark\\:placeholder-gray-500:is(.dark *)::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(107 114 128 / var(--tw-placeholder-opacity, 1));\n}\n\n.dark\\:placeholder-gray-500:is(.dark *)::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(107 114 128 / var(--tw-placeholder-opacity, 1));\n}\n\n.dark\\:hover\\:bg-blue-900\\/30:hover:is(.dark *) {\n background-color: rgb(30 58 138 / 0.3);\n}\n\n.dark\\:hover\\:bg-gray-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n\n.dark\\:hover\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n"],"mappings":";AAAA;AAAG;AAAU;AACX,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAEA;AACE,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAOA;AACA;AACA;AACE,cAAY;AACZ,gBAAc;AACd,gBAAc;AACd,gBAAc;AAChB;AAEA;AACA;AACE,gBAAc;AAChB;AAYA;AACA;AACE,eAAa;AACb,4BAA0B;AAC1B,iBAAe;AACf,eAAa;AACV,YAAU;AACb;AAAA,IAAa,aAAa;AAAA,IAAE,SAAS;AAAA,IAAE,UAAU;AAAA,IAAE,mBAAmB;AAAA,IAAE,gBAAgB;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC7G,yBAAuB;AACvB,2B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","names":[]}
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n.container {\n width: 100%;\n}\n@media (min-width: 640px) {\n\n .container {\n max-width: 640px;\n }\n}\n@media (min-width: 768px) {\n\n .container {\n max-width: 768px;\n }\n}\n@media (min-width: 1024px) {\n\n .container {\n max-width: 1024px;\n }\n}\n@media (min-width: 1280px) {\n\n .container {\n max-width: 1280px;\n }\n}\n@media (min-width: 1536px) {\n\n .container {\n max-width: 1536px;\n }\n}\n.cofhe-dropdown-container {\n position: relative;\n}\n.cofhe-dropdown-menu {\n position: absolute;\n right: 0px;\n top: 100%;\n z-index: 50;\n margin-top: 0.25rem;\n width: 12rem;\n border-radius: 0.5rem;\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.cofhe-dropdown-menu:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.cofhe-dropdown-menu {\n max-height: 12rem;\n overflow-y: auto;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n/* Custom scrollbar for dropdown */\n.cofhe-dropdown-menu::-webkit-scrollbar {\n width: 0.5rem;\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-track {\n background-color: transparent;\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-thumb {\n border-radius: 9999px;\n border-color: transparent;\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));\n}\n.dark .cofhe-dropdown-menu::-webkit-scrollbar-thumb {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.cofhe-dropdown-menu::-webkit-scrollbar-thumb:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));\n}\n.dark .cofhe-dropdown-menu::-webkit-scrollbar-thumb:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.bottom-0 {\n bottom: 0px;\n}\n.right-0 {\n right: 0px;\n}\n.right-16 {\n right: 4rem;\n}\n.top-0 {\n top: 0px;\n}\n.top-1\\/2 {\n top: 50%;\n}\n.mb-1 {\n margin-bottom: 0.25rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.mt-3 {\n margin-top: 0.75rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.h-1 {\n height: 0.25rem;\n}\n.h-full {\n height: 100%;\n}\n.w-full {\n width: 100%;\n}\n.flex-1 {\n flex: 1 1 0%;\n}\n.-translate-y-1\\/2 {\n --tw-translate-y: -50%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes pulse {\n\n 50% {\n opacity: .5;\n }\n}\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n.cursor-default {\n cursor: default;\n}\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.items-start {\n align-items: flex-start;\n}\n.items-center {\n align-items: center;\n}\n.justify-between {\n justify-content: space-between;\n}\n.gap-1 {\n gap: 0.25rem;\n}\n.gap-3 {\n gap: 0.75rem;\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.rounded {\n border-radius: 0.25rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: 0.5rem;\n}\n.rounded-r-md {\n border-top-right-radius: 0.375rem;\n border-bottom-right-radius: 0.375rem;\n}\n.border {\n border-width: 1px;\n}\n.border-0 {\n border-width: 0px;\n}\n.border-l {\n border-left-width: 1px;\n}\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\n}\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n.bg-blue-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\n}\n.bg-green-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.bg-green-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.bg-red-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1));\n}\n.bg-transparent {\n background-color: transparent;\n}\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.bg-yellow-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1));\n}\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n.px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.pr-20 {\n padding-right: 5rem;\n}\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.font-medium {\n font-weight: 500;\n}\n.text-blue-700 {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\n}\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\n}\n.text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.placeholder-gray-400::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(156 163 175 / var(--tw-placeholder-opacity, 1));\n}\n.placeholder-gray-400::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(156 163 175 / var(--tw-placeholder-opacity, 1));\n}\n.opacity-50 {\n opacity: 0.5;\n}\n.outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-200 {\n transition-duration: 200ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* Component-specific styles for proper dropdown behavior */\n.focus-within\\:border-blue-500:focus-within {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));\n}\n.focus-within\\:border-red-500:focus-within {\n --tw-border-opacity: 1;\n border-color: rgb(239 68 68 / var(--tw-border-opacity, 1));\n}\n.focus-within\\:ring-2:focus-within {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n.focus-within\\:ring-blue-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1));\n}\n.focus-within\\:ring-red-500:focus-within {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1));\n}\n.hover\\:bg-blue-50:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\n}\n.hover\\:bg-green-600:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));\n}\n.hover\\:text-blue-700:hover {\n --tw-text-opacity: 1;\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\n}\n.dark\\:border-gray-600:is(.dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\n}\n.dark\\:bg-blue-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-blue-900\\/50:is(.dark *) {\n background-color: rgb(30 58 138 / 0.5);\n}\n.dark\\:bg-gray-600:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-700:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-gray-800:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-green-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-red-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));\n}\n.dark\\:bg-yellow-500:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));\n}\n.dark\\:text-blue-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-300:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-gray-500:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-red-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n.dark\\:text-white:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.dark\\:placeholder-gray-500:is(.dark *)::-moz-placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(107 114 128 / var(--tw-placeholder-opacity, 1));\n}\n.dark\\:placeholder-gray-500:is(.dark *)::placeholder {\n --tw-placeholder-opacity: 1;\n color: rgb(107 114 128 / var(--tw-placeholder-opacity, 1));\n}\n.dark\\:hover\\:bg-blue-900\\/30:hover:is(.dark *) {\n background-color: rgb(30 58 138 / 0.3);\n}\n.dark\\:hover\\:bg-gray-600:hover:is(.dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\n}\n.dark\\:hover\\:text-blue-300:hover:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\n}\n"],"mappings":";AAAA;AAAG;AAAU;AACX,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAEA;AACE,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAOA;AACA;AACA;AACE,cAAY;AACZ,gBAAc;AACd,gBAAc;AACd,gBAAc;AAChB;AAEA;AACA;AACE,gBAAc;AAChB;AAYA;AACA;AACE,eAAa;AACb,4BAA0B;AAC1B,iBAAe;AACf,eAAa;AACV,YAAU;AACb;AAAA,IAAa,aAAa;AAAA,IAAE,SAAS;AAAA,IAAE,UAAU;AAAA,IAAE,mBAAmB;AAAA,IAAE,gBAAgB;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC7G,yBAAuB;AACvB,2B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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { CofhesdkClient } from '@cofhe/sdk';
2
+ import { CofhesdkClient, CofhesdkClientConnectionState } from '@cofhe/sdk';
3
+ import { Permit } from '@cofhe/sdk/permits';
3
4
 
4
5
  type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';
5
6
  interface FheTypeOption {
@@ -66,6 +67,20 @@ interface UseEncryptInputReturn {
66
67
  }
67
68
  declare function useEncryptInput(): UseEncryptInputReturn;
68
69
 
70
+ declare const useCofheConnection: () => CofhesdkClientConnectionState;
71
+
72
+ declare const useCofheActivePermit: () => {
73
+ hash: string;
74
+ permit: Permit;
75
+ isValid: boolean;
76
+ } | undefined;
77
+ declare const useCofheAllPermits: () => {
78
+ hash: string;
79
+ permit: Permit;
80
+ }[];
81
+ declare const useCofheRemovePermit: () => (hashToRemove: string) => void;
82
+ declare const useCofheSelectPermit: () => (hashToSet: string) => void;
83
+
69
84
  interface FnxEncryptInputProps extends BaseProps {
70
85
  /** Placeholder text for the text field */
71
86
  placeholder?: string;
@@ -103,4 +118,4 @@ declare const FnxEncryptInput: React.FC<FnxEncryptInputProps>;
103
118
  declare const fheTypeToString: (fheType: FheTypeValue) => "ebool" | "euint8" | "euint16" | "euint32" | "euint64" | "euint128" | "eaddress" | "unknown";
104
119
  declare const encryptedValueToString: (fheType: FheTypeValue, handle: bigint) => string;
105
120
 
106
- export { type CofheClientConfig, type CofheContextValue, CofheProvider, type CofheProviderProps, FheTypesList, FnxEncryptInput, encryptedValueToString, fheTypeToString, useCofheContext, useEncryptInput };
121
+ export { type CofheClientConfig, type CofheContextValue, CofheProvider, type CofheProviderProps, FheTypesList, FnxEncryptInput, encryptedValueToString, fheTypeToString, useCofheActivePermit, useCofheAllPermits, useCofheConnection, useCofheContext, useCofheRemovePermit, useCofheSelectPermit, useEncryptInput };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { CofhesdkClient } from '@cofhe/sdk';
2
+ import { CofhesdkClient, CofhesdkClientConnectionState } from '@cofhe/sdk';
3
+ import { Permit } from '@cofhe/sdk/permits';
3
4
 
4
5
  type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';
5
6
  interface FheTypeOption {
@@ -66,6 +67,20 @@ interface UseEncryptInputReturn {
66
67
  }
67
68
  declare function useEncryptInput(): UseEncryptInputReturn;
68
69
 
70
+ declare const useCofheConnection: () => CofhesdkClientConnectionState;
71
+
72
+ declare const useCofheActivePermit: () => {
73
+ hash: string;
74
+ permit: Permit;
75
+ isValid: boolean;
76
+ } | undefined;
77
+ declare const useCofheAllPermits: () => {
78
+ hash: string;
79
+ permit: Permit;
80
+ }[];
81
+ declare const useCofheRemovePermit: () => (hashToRemove: string) => void;
82
+ declare const useCofheSelectPermit: () => (hashToSet: string) => void;
83
+
69
84
  interface FnxEncryptInputProps extends BaseProps {
70
85
  /** Placeholder text for the text field */
71
86
  placeholder?: string;
@@ -103,4 +118,4 @@ declare const FnxEncryptInput: React.FC<FnxEncryptInputProps>;
103
118
  declare const fheTypeToString: (fheType: FheTypeValue) => "ebool" | "euint8" | "euint16" | "euint32" | "euint64" | "euint128" | "eaddress" | "unknown";
104
119
  declare const encryptedValueToString: (fheType: FheTypeValue, handle: bigint) => string;
105
120
 
106
- export { type CofheClientConfig, type CofheContextValue, CofheProvider, type CofheProviderProps, FheTypesList, FnxEncryptInput, encryptedValueToString, fheTypeToString, useCofheContext, useEncryptInput };
121
+ export { type CofheClientConfig, type CofheContextValue, CofheProvider, type CofheProviderProps, FheTypesList, FnxEncryptInput, encryptedValueToString, fheTypeToString, useCofheActivePermit, useCofheAllPermits, useCofheConnection, useCofheContext, useCofheRemovePermit, useCofheSelectPermit, useEncryptInput };
package/dist/index.js CHANGED
@@ -162,27 +162,15 @@ function useEncryptInput() {
162
162
  };
163
163
  }
164
164
 
165
- // src/components/FnxEncryptInput.tsx
166
- import { useState as useState3, useRef, useEffect as useEffect2 } from "react";
165
+ // src/hooks/useCofheConnection.ts
166
+ import { useMemo, useSyncExternalStore } from "react";
167
+ import { CONNECT_STORE_DEFAULTS } from "@cofhe/sdk";
167
168
 
168
169
  // src/utils/cn.ts
169
170
  var cn = (...classes) => {
170
171
  return classes.filter(Boolean).join(" ").replace(/\s+/g, " ").trim();
171
172
  };
172
173
 
173
- // src/utils/debounce.ts
174
- var debounce = (func, wait) => {
175
- let timeoutId = null;
176
- return (...args) => {
177
- if (timeoutId !== null) {
178
- clearTimeout(timeoutId);
179
- }
180
- timeoutId = setTimeout(() => {
181
- func(...args);
182
- }, wait);
183
- };
184
- };
185
-
186
174
  // src/utils/utils.ts
187
175
  var FheTypesList = [
188
176
  {
@@ -235,8 +223,160 @@ var FheTypesList = [
235
223
  description: "Ethereum address (0x...)"
236
224
  }
237
225
  ];
226
+ var NOOP_CALLBACK = () => () => {
227
+ };
228
+
229
+ // src/utils/logging.ts
230
+ var fheTypeToString = (fheType) => {
231
+ switch (fheType) {
232
+ case "bool":
233
+ return "ebool";
234
+ case "uint8":
235
+ return "euint8";
236
+ case "uint16":
237
+ return "euint16";
238
+ case "uint32":
239
+ return "euint32";
240
+ case "uint64":
241
+ return "euint64";
242
+ case "uint128":
243
+ return "euint128";
244
+ case "address":
245
+ return "eaddress";
246
+ default:
247
+ return "unknown";
248
+ }
249
+ };
250
+ var encryptedValueToString = (fheType, handle) => {
251
+ const hashStr = handle.toString();
252
+ const truncated = hashStr.slice(0, 6) + ".." + hashStr.slice(hashStr.length - 6);
253
+ return `${fheTypeToString(fheType)}(${truncated})`;
254
+ };
255
+
256
+ // src/utils/debounce.ts
257
+ var debounce = (func, wait) => {
258
+ let timeoutId = null;
259
+ return (...args) => {
260
+ if (timeoutId !== null) {
261
+ clearTimeout(timeoutId);
262
+ }
263
+ timeoutId = setTimeout(() => {
264
+ func(...args);
265
+ }, wait);
266
+ };
267
+ };
268
+
269
+ // src/hooks/useCofheConnection.ts
270
+ var subscribeToConnectionConstructor = (client) => (onStoreChange) => {
271
+ return client.subscribe(() => {
272
+ onStoreChange();
273
+ });
274
+ };
275
+ var getConnectionSnapshotConstructor = (client) => () => client.getSnapshot();
276
+ var DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;
277
+ var useCofheConnection = () => {
278
+ const client = useCofheContext().client;
279
+ const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {
280
+ return {
281
+ subscribeToConnection: client && subscribeToConnectionConstructor(client),
282
+ getConnectionSnapshot: client && getConnectionSnapshotConstructor(client)
283
+ };
284
+ }, [client]);
285
+ return useSyncExternalStore(
286
+ // fallback to default store and no subscription if client is not initialized yet
287
+ subscribeToConnection || NOOP_CALLBACK,
288
+ getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,
289
+ getConnectionSnapshot || void 0
290
+ );
291
+ };
292
+
293
+ // src/hooks/useCofhePermits.ts
294
+ import { useCallback as useCallback2, useMemo as useMemo2, useSyncExternalStore as useSyncExternalStore2 } from "react";
295
+ import { PERMIT_STORE_DEFAULTS, PermitUtils } from "@cofhe/sdk/permits";
296
+ var subscribeToPermitsConstructor = (client) => (onStoreChange) => {
297
+ return client.permits.subscribe(() => {
298
+ onStoreChange();
299
+ });
300
+ };
301
+ var getPermitsSnapshotConstructor = (client) => () => client.permits.getSnapshot();
302
+ var DEFAULT_SNAPSHOT_GETTER2 = () => PERMIT_STORE_DEFAULTS;
303
+ var useCofhePermitsStore = () => {
304
+ const client = useCofheContext().client;
305
+ const { subscribeToConnection, getConnectionSnapshot } = useMemo2(() => {
306
+ return {
307
+ subscribeToConnection: client && subscribeToPermitsConstructor(client),
308
+ getConnectionSnapshot: client && getPermitsSnapshotConstructor(client)
309
+ };
310
+ }, [client]);
311
+ const state = useSyncExternalStore2(
312
+ // fallback to default store and no subscription if client is not initialized yet
313
+ subscribeToConnection || NOOP_CALLBACK,
314
+ getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER2,
315
+ getConnectionSnapshot || void 0
316
+ );
317
+ return { state, client };
318
+ };
319
+ var useCofheActivePermit = () => {
320
+ const { account, chainId, connected } = useCofheConnection();
321
+ const { state } = useCofhePermitsStore();
322
+ const allPermits = chainId && account ? state.permits[chainId]?.[account] : void 0;
323
+ const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : void 0;
324
+ const serialized = hash && allPermits ? allPermits[hash] : void 0;
325
+ const permitData = useMemo2(() => {
326
+ const _permit = serialized ? PermitUtils.deserialize(serialized) : void 0;
327
+ if (!_permit || !hash) return void 0;
328
+ return {
329
+ permit: _permit,
330
+ isValid: _permit ? PermitUtils.isValid(_permit).valid : false,
331
+ hash
332
+ };
333
+ }, [serialized, hash]);
334
+ return connected ? permitData : void 0;
335
+ };
336
+ var useCofheAllPermits = () => {
337
+ const { account, chainId, connected } = useCofheConnection();
338
+ const { state } = useCofhePermitsStore();
339
+ const allPermits = chainId && account ? state.permits[chainId]?.[account] : void 0;
340
+ const allPermitsWithHashes = useMemo2(
341
+ () => allPermits ? Object.keys(allPermits).map((hash) => {
342
+ const serializedPermit = allPermits[hash];
343
+ if (!serializedPermit) throw new Error("Permit data missing");
344
+ return {
345
+ hash,
346
+ permit: PermitUtils.deserialize(serializedPermit)
347
+ };
348
+ }) : [],
349
+ [allPermits]
350
+ );
351
+ return connected ? allPermitsWithHashes : [];
352
+ };
353
+ var useCofheRemovePermit = () => {
354
+ const { account, chainId } = useCofheConnection();
355
+ const { client } = useCofhePermitsStore();
356
+ return useCallback2(
357
+ (hashToRemove) => {
358
+ if (!client || !chainId || !account)
359
+ throw new Error("Client, chainId, and account must be defined to remove a permit");
360
+ client.permits.removePermit(hashToRemove, chainId, account);
361
+ },
362
+ [client, chainId, account]
363
+ );
364
+ };
365
+ var useCofheSelectPermit = () => {
366
+ const { account, chainId } = useCofheConnection();
367
+ const { client } = useCofhePermitsStore();
368
+ return useCallback2(
369
+ (hashToSet) => {
370
+ if (!client || !chainId || !account)
371
+ throw new Error("Client, chainId, and account must be defined to set active permit hash");
372
+ client.permits.selectActivePermit(hashToSet, chainId, account);
373
+ },
374
+ [client, chainId, account]
375
+ );
376
+ };
238
377
 
239
378
  // src/components/FnxEncryptInput.tsx
379
+ import { useState as useState3, useRef, useEffect as useEffect2 } from "react";
240
380
  import SecurityIcon from "@mui/icons-material/Security";
241
381
  import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
242
382
  import ContentCopyIcon from "@mui/icons-material/ContentCopy";
@@ -537,40 +677,18 @@ var FnxEncryptInput = ({
537
677
  )
538
678
  ] });
539
679
  };
540
-
541
- // src/utils/logging.ts
542
- var fheTypeToString = (fheType) => {
543
- switch (fheType) {
544
- case "bool":
545
- return "ebool";
546
- case "uint8":
547
- return "euint8";
548
- case "uint16":
549
- return "euint16";
550
- case "uint32":
551
- return "euint32";
552
- case "uint64":
553
- return "euint64";
554
- case "uint128":
555
- return "euint128";
556
- case "address":
557
- return "eaddress";
558
- default:
559
- return "unknown";
560
- }
561
- };
562
- var encryptedValueToString = (fheType, handle) => {
563
- const hashStr = handle.toString();
564
- const truncated = hashStr.slice(0, 6) + ".." + hashStr.slice(hashStr.length - 6);
565
- return `${fheTypeToString(fheType)}(${truncated})`;
566
- };
567
680
  export {
568
681
  CofheProvider,
569
682
  FheTypesList,
570
683
  FnxEncryptInput,
571
684
  encryptedValueToString,
572
685
  fheTypeToString,
686
+ useCofheActivePermit,
687
+ useCofheAllPermits,
688
+ useCofheConnection,
573
689
  useCofheContext,
690
+ useCofheRemovePermit,
691
+ useCofheSelectPermit,
574
692
  useEncryptInput
575
693
  };
576
694
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/CofheProvider.tsx","../src/hooks/useEncryptInput.ts","../src/components/FnxEncryptInput.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/utils.ts","../src/utils/logging.ts"],"sourcesContent":["import { createContext, useContext, useEffect, useState } from 'react';\nimport type { CofhesdkClient } from '@cofhe/sdk';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index.js';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider({ children, client: providedClient, config }: CofheProviderProps) {\n const [client, setClient] = useState<CofhesdkClient | null>(providedClient || null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (providedClient) {\n setClient(providedClient);\n setIsInitialized(true);\n return;\n }\n\n if (config) {\n try {\n // Initialize client with config\n // This would need to be implemented based on the actual CofheClient constructor\n // const newClient = new CofheClient(config);\n // setClient(newClient);\n setIsInitialized(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to initialize CoFHE client'));\n }\n }\n }, [providedClient, config]);\n\n const contextValue: CofheContextValue = {\n client,\n isInitialized,\n error,\n };\n\n return (\n <CofheContext.Provider value={contextValue}>\n {children}\n </CofheContext.Provider>\n );\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../providers/CofheProvider.js';\nimport { Encryptable } from '@cofhe/sdk';\nimport type { EncryptableItem } from '@cofhe/sdk';\nimport type { FheTypeValue } from '../utils/utils.js';\nimport type { EncryptionStep } from '../types/component-types.js';\n\n// Map SDK encrypt steps to UI display info\nconst STEP_CONFIG: Record<EncryptionStep, { label: string; progress: number }> = {\n 'initTfhe': {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n 'fetchKeys': {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n 'pack': {\n label: 'Packing data...',\n progress: 40,\n },\n 'prove': {\n label: 'Generating proof...',\n progress: 70,\n },\n 'verify': {\n label: 'Verifying...',\n progress: 90,\n },\n 'done': {\n label: 'Encryption complete!',\n progress: 100,\n },\n};\n\nexport interface UseEncryptInputReturn {\n onEncryptInput: (_type: FheTypeValue, _value: string) => Promise<any>;\n isEncryptingInput: boolean;\n encryptionStep: EncryptionStep | null;\n encryptionProgress: number;\n encryptionProgressLabel: string;\n inputEncryptionDisabled: boolean;\n}\n\nexport function useEncryptInput(): UseEncryptInputReturn {\n const { client } = useCofheContext();\n const [isEncrypting, setIsEncrypting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [encryptionStep, setEncryptionStep] = useState<EncryptionStep | null>(null);\n const [encryptionProgress, setEncryptionProgress] = useState<number>(0);\n const [encryptionProgressLabel, setEncryptionProgressLabel] = useState<string>('');\n\n const onEncryptInput = useCallback(async (type: FheTypeValue, value: string) => {\n if (!client) {\n throw new Error('CoFHE client not initialized');\n }\n\n setIsEncrypting(true);\n setError(null);\n\n try {\n // Convert value based on type\n let convertedValue: number | bigint | boolean | string;\n \n if (type === 'bool') {\n convertedValue = value.toLowerCase() === 'true' || value === '1';\n } else if (type === 'address') {\n convertedValue = value as string | bigint;\n } else {\n // Numeric types\n convertedValue = value.includes('.') ? parseFloat(value) : parseInt(value, 10);\n }\n\n // Create encryptable item\n let encryptableItem: EncryptableItem;\n \n switch (type) {\n case 'bool':\n encryptableItem = Encryptable.bool(convertedValue as boolean);\n break;\n case 'uint8':\n encryptableItem = Encryptable.uint8(BigInt(convertedValue));\n break;\n case 'uint16':\n encryptableItem = Encryptable.uint16(BigInt(convertedValue));\n break;\n case 'uint32':\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n break;\n case 'uint64':\n encryptableItem = Encryptable.uint64(BigInt(convertedValue));\n break;\n case 'uint128':\n encryptableItem = Encryptable.uint128(BigInt(convertedValue));\n break;\n case 'address':\n encryptableItem = Encryptable.address(convertedValue as string | bigint);\n break;\n default:\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n }\n\n // Perform encryption with real-time step tracking\n const encryptionBuilder = client.encryptInputs([encryptableItem]).setStepCallback((step, context) => {\n const stepConfig = STEP_CONFIG[step as EncryptionStep];\n \n if (stepConfig) {\n // Update UI with real step information\n setEncryptionStep(step as EncryptionStep);\n setEncryptionProgress(stepConfig.progress);\n setEncryptionProgressLabel(stepConfig.label);\n }\n \n // Log worker status for debugging (prove step only)\n if (step === 'prove' && context?.isEnd) {\n console.log('[Encryption] Worker Status:', {\n useWorker: context.useWorker,\n usedWorker: context.usedWorker,\n workerFailedError: context.workerFailedError,\n duration: context.duration + 'ms'\n });\n }\n });\n const result = await encryptionBuilder.encrypt();\n \n if (!result.success) {\n throw result.error;\n }\n\n // Complete\n setEncryptionStep('done');\n setEncryptionProgress(100);\n setEncryptionProgressLabel('Encryption complete!');\n\n // Reset after a short delay\n setTimeout(() => {\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n }, 1000);\n\n setIsEncrypting(false);\n return result.data[0]; // Return first (and only) encrypted item\n } catch (err) {\n // Reset on error\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n setIsEncrypting(false);\n const error = err instanceof Error ? err : new Error('Encryption failed');\n setError(error);\n throw error;\n }\n }, [client]);\n\n return {\n onEncryptInput,\n isEncryptingInput: isEncrypting,\n encryptionStep,\n encryptionProgress,\n encryptionProgressLabel,\n inputEncryptionDisabled: isEncrypting || !!error,\n };\n}\n","import { useState, useRef, useEffect } from 'react';\nimport type { BaseProps, DropdownOption, ComponentSize, EncryptionProgressData, EncryptionResultData, EncryptionStartData } from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList, type FheTypeValue } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { useEncryptInput } from '../hooks/useEncryptInput.js';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();\n\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncryptingInput) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncryptingInput) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncryptingInput]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: encryptionStep.toString(),\n progress: encryptionProgress,\n label: encryptionProgressLabel\n });\n }\n }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' }\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError \n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500' \n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncryptingInput) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncryptingInput) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncryptingInput) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) => cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible \n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium' \n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500'\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') => cn(\n 'h-full transition-all duration-300 ease-out rounded-full',\n progressVariantClasses[variant]\n );\n\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n \n const typeInfo = FheTypesList.find(type => type.value === typeValue);\n if (!typeInfo) return false;\n \n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n \n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n \n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n \n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n \n return true;\n }\n \n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n \n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n \n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n \n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n \n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(encryptedResult, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }, 2); // Pretty format with 2 spaces\n \n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n \n // Show success indication\n setCopySuccess(true);\n \n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n \n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n \n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const encryptionResult = await onEncryptInput(type, textValue);\n \n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n \n const data = { value: textValue, encrypted: encryptionResult };\n \n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncryptingInput) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => (\n <SecurityIcon sx={{ fontSize: 14 }} />\n );\n\n const ChevronDownIcon = () => (\n <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n \n {/* Encryption status indicator */}\n {(isEncryptingInput || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncryptingInput ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">\n Encrypting...\n </div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess \n ? 'bg-green-600 cursor-default' \n : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? \"Copied to clipboard!\" : \"Copy encrypted result to clipboard\"}\n >\n <>\n {copySuccess ? (\n <CheckIcon sx={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n \n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n \n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n \n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={!isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined}\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div \n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncryptingInput ? 'slideDownFadeIn 0.5s ease-out forwards' : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {encryptionProgress || 0}%\n </span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{ \n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out'\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n \n </div>\n \n {/* Error message */}\n {hasError && errorMessage && (\n <p \n className=\"mt-2 text-sm text-red-600 dark:text-red-400\" \n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n };\n ","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n ): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n };\n ","// FHE Types for the current CoFHE SDK\nexport type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n { \n label: \"Encrypted Bool\", \n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: \"Boolean value (true/false)\"\n },\n { \n label: \"Encrypted Uint8\", \n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: \"8-bit unsigned integer (0 to 255)\"\n },\n { \n label: \"Encrypted Uint16\", \n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: \"16-bit unsigned integer (0 to 65,535)\"\n },\n { \n label: \"Encrypted Uint32\", \n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: \"32-bit unsigned integer (0 to 4,294,967,295)\"\n },\n { \n label: \"Encrypted Uint64\", \n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: \"64-bit unsigned integer (0 to 18,446,744,073,709,551,615)\"\n },\n { \n label: \"Encrypted Uint128\", \n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: \"128-bit unsigned integer\"\n },\n { \n label: \"Encrypted Address\", \n value: 'address',\n maxValue: null, // Address validation is different\n description: \"Ethereum address (0x...)\"\n },\n];\n","import type { FheTypeValue } from './utils.js';\n\nexport const logBlockStart = (message: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE] │ ${message}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return \"ebool\";\n case 'uint8':\n return \"euint8\";\n case 'uint16':\n return \"euint16\";\n case 'uint32':\n return \"euint32\";\n case 'uint64':\n return \"euint64\";\n case 'uint128':\n return \"euint128\";\n case 'address':\n return \"eaddress\";\n default:\n return \"unknown\";\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? \"true\" : \"false\";\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + \"..\" + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n"],"mappings":"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","names":["useState","useState","error","useState","useEffect","jsx","useState","useEffect","errorMessage"]}
1
+ {"version":3,"sources":["../src/providers/CofheProvider.tsx","../src/hooks/useEncryptInput.ts","../src/hooks/useCofheConnection.ts","../src/utils/cn.ts","../src/utils/utils.ts","../src/utils/logging.ts","../src/utils/debounce.ts","../src/hooks/useCofhePermits.ts","../src/components/FnxEncryptInput.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useState } from 'react';\nimport type { CofhesdkClient } from '@cofhe/sdk';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index.js';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider({ children, client: providedClient, config }: CofheProviderProps) {\n const [client, setClient] = useState<CofhesdkClient | null>(providedClient || null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (providedClient) {\n setClient(providedClient);\n setIsInitialized(true);\n return;\n }\n\n if (config) {\n try {\n // Initialize client with config\n // This would need to be implemented based on the actual CofheClient constructor\n // const newClient = new CofheClient(config);\n // setClient(newClient);\n setIsInitialized(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to initialize CoFHE client'));\n }\n }\n }, [providedClient, config]);\n\n const contextValue: CofheContextValue = {\n client,\n isInitialized,\n error,\n };\n\n return (\n <CofheContext.Provider value={contextValue}>\n {children}\n </CofheContext.Provider>\n );\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../providers/CofheProvider.js';\nimport { Encryptable } from '@cofhe/sdk';\nimport type { EncryptableItem } from '@cofhe/sdk';\nimport type { FheTypeValue } from '../utils/utils.js';\nimport type { EncryptionStep } from '../types/component-types.js';\n\n// Map SDK encrypt steps to UI display info\nconst STEP_CONFIG: Record<EncryptionStep, { label: string; progress: number }> = {\n 'initTfhe': {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n 'fetchKeys': {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n 'pack': {\n label: 'Packing data...',\n progress: 40,\n },\n 'prove': {\n label: 'Generating proof...',\n progress: 70,\n },\n 'verify': {\n label: 'Verifying...',\n progress: 90,\n },\n 'done': {\n label: 'Encryption complete!',\n progress: 100,\n },\n};\n\nexport interface UseEncryptInputReturn {\n onEncryptInput: (_type: FheTypeValue, _value: string) => Promise<any>;\n isEncryptingInput: boolean;\n encryptionStep: EncryptionStep | null;\n encryptionProgress: number;\n encryptionProgressLabel: string;\n inputEncryptionDisabled: boolean;\n}\n\nexport function useEncryptInput(): UseEncryptInputReturn {\n const { client } = useCofheContext();\n const [isEncrypting, setIsEncrypting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [encryptionStep, setEncryptionStep] = useState<EncryptionStep | null>(null);\n const [encryptionProgress, setEncryptionProgress] = useState<number>(0);\n const [encryptionProgressLabel, setEncryptionProgressLabel] = useState<string>('');\n\n const onEncryptInput = useCallback(async (type: FheTypeValue, value: string) => {\n if (!client) {\n throw new Error('CoFHE client not initialized');\n }\n\n setIsEncrypting(true);\n setError(null);\n\n try {\n // Convert value based on type\n let convertedValue: number | bigint | boolean | string;\n \n if (type === 'bool') {\n convertedValue = value.toLowerCase() === 'true' || value === '1';\n } else if (type === 'address') {\n convertedValue = value as string | bigint;\n } else {\n // Numeric types\n convertedValue = value.includes('.') ? parseFloat(value) : parseInt(value, 10);\n }\n\n // Create encryptable item\n let encryptableItem: EncryptableItem;\n \n switch (type) {\n case 'bool':\n encryptableItem = Encryptable.bool(convertedValue as boolean);\n break;\n case 'uint8':\n encryptableItem = Encryptable.uint8(BigInt(convertedValue));\n break;\n case 'uint16':\n encryptableItem = Encryptable.uint16(BigInt(convertedValue));\n break;\n case 'uint32':\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n break;\n case 'uint64':\n encryptableItem = Encryptable.uint64(BigInt(convertedValue));\n break;\n case 'uint128':\n encryptableItem = Encryptable.uint128(BigInt(convertedValue));\n break;\n case 'address':\n encryptableItem = Encryptable.address(convertedValue as string | bigint);\n break;\n default:\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n }\n\n // Perform encryption with real-time step tracking\n const encryptionBuilder = client.encryptInputs([encryptableItem]).setStepCallback((step, context) => {\n const stepConfig = STEP_CONFIG[step as EncryptionStep];\n \n if (stepConfig) {\n // Update UI with real step information\n setEncryptionStep(step as EncryptionStep);\n setEncryptionProgress(stepConfig.progress);\n setEncryptionProgressLabel(stepConfig.label);\n }\n \n // Log worker status for debugging (prove step only)\n if (step === 'prove' && context?.isEnd) {\n console.log('[Encryption] Worker Status:', {\n useWorker: context.useWorker,\n usedWorker: context.usedWorker,\n workerFailedError: context.workerFailedError,\n duration: context.duration + 'ms'\n });\n }\n });\n const result = await encryptionBuilder.encrypt();\n \n if (!result.success) {\n throw result.error;\n }\n\n // Complete\n setEncryptionStep('done');\n setEncryptionProgress(100);\n setEncryptionProgressLabel('Encryption complete!');\n\n // Reset after a short delay\n setTimeout(() => {\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n }, 1000);\n\n setIsEncrypting(false);\n return result.data[0]; // Return first (and only) encrypted item\n } catch (err) {\n // Reset on error\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n setIsEncrypting(false);\n const error = err instanceof Error ? err : new Error('Encryption failed');\n setError(error);\n throw error;\n }\n }, [client]);\n\n return {\n onEncryptInput,\n isEncryptingInput: isEncrypting,\n encryptionStep,\n encryptionProgress,\n encryptionProgressLabel,\n inputEncryptionDisabled: isEncrypting || !!error,\n };\n}\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofhesdkClient, type CofhesdkClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofhesdkClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofhesdkClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): string | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n };\n ","// FHE Types for the current CoFHE SDK\nexport type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n","import type { FheTypeValue } from './utils.js';\n\nexport const logBlockStart = (message: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE] │ ${message}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return \"ebool\";\n case 'uint8':\n return \"euint8\";\n case 'uint16':\n return \"euint16\";\n case 'uint32':\n return \"euint32\";\n case 'uint64':\n return \"euint64\";\n case 'uint128':\n return \"euint128\";\n case 'address':\n return \"eaddress\";\n default:\n return \"unknown\";\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? \"true\" : \"false\";\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + \"..\" + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n ): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n };\n ","import type { CofhesdkClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\n\nconst subscribeToPermitsConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofhesdkClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofhesdkClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n hash: string;\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheAllPermits = (): { hash: string; permit: Permit }[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits).map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return {\n hash,\n permit: PermitUtils.deserialize(serializedPermit),\n };\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofheRemovePermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToRemove: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n client.permits.removePermit(hashToRemove, chainId, account);\n },\n [client, chainId, account]\n );\n};\n\nexport const useCofheSelectPermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToSet: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n client.permits.selectActivePermit(hashToSet, chainId, account);\n },\n [client, chainId, account]\n );\n};\n","import { useState, useRef, useEffect } from 'react';\nimport type { BaseProps, DropdownOption, ComponentSize, EncryptionProgressData, EncryptionResultData, EncryptionStartData } from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList, type FheTypeValue } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { useEncryptInput } from '../hooks/useEncryptInput.js';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();\n\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncryptingInput) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncryptingInput) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncryptingInput]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: encryptionStep.toString(),\n progress: encryptionProgress,\n label: encryptionProgressLabel\n });\n }\n }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' }\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError \n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500' \n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncryptingInput) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncryptingInput) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncryptingInput) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) => cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible \n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium' \n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500'\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') => cn(\n 'h-full transition-all duration-300 ease-out rounded-full',\n progressVariantClasses[variant]\n );\n\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n \n const typeInfo = FheTypesList.find(type => type.value === typeValue);\n if (!typeInfo) return false;\n \n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n \n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n \n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n \n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n \n return true;\n }\n \n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n \n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n \n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n \n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n \n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(encryptedResult, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }, 2); // Pretty format with 2 spaces\n \n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n \n // Show success indication\n setCopySuccess(true);\n \n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n \n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n \n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const encryptionResult = await onEncryptInput(type, textValue);\n \n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n \n const data = { value: textValue, encrypted: encryptionResult };\n \n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncryptingInput) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => (\n <SecurityIcon sx={{ fontSize: 14 }} />\n );\n\n const ChevronDownIcon = () => (\n <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n \n {/* Encryption status indicator */}\n {(isEncryptingInput || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncryptingInput ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">\n Encrypting...\n </div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess \n ? 'bg-green-600 cursor-default' \n : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? \"Copied to clipboard!\" : \"Copy encrypted result to clipboard\"}\n >\n <>\n {copySuccess ? (\n <CheckIcon sx={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n \n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n \n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n \n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={!isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined}\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div \n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncryptingInput ? 'slideDownFadeIn 0.5s ease-out forwards' : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {encryptionProgress || 0}%\n </span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{ \n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out'\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n \n </div>\n \n {/* Error message */}\n {hasError && errorMessage && (\n <p \n className=\"mt-2 text-sm text-red-600 dark:text-red-400\" \n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["useState","useState","error","useCallback","useMemo","useSyncExternalStore","DEFAULT_SNAPSHOT_GETTER","useMemo","useSyncExternalStore","useCallback","useState","useEffect","jsx","useState","useEffect","errorMessage"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cofhe/react",
3
- "version": "0.0.0-beta-20251112060550",
3
+ "version": "0.0.0-beta-20251119082915",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -31,12 +31,12 @@
31
31
  "tsup": "^8.5.0",
32
32
  "typescript": "5.5.4",
33
33
  "@cofhe/eslint-config": "0.1.2",
34
- "@cofhe/tsconfig": "0.0.0-beta-20251112060550"
34
+ "@cofhe/tsconfig": "0.0.0-beta-20251119082915"
35
35
  },
36
36
  "dependencies": {
37
37
  "clsx": "^2.0.0",
38
38
  "tailwind-merge": "^2.0.0",
39
- "@cofhe/sdk": "0.0.0-beta-20251112060550"
39
+ "@cofhe/sdk": "0.0.0-beta-20251119082915"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@mui/icons-material": "^5.0.0",