@primer-io/primer-js 0.3.5 → 0.3.6

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.
@@ -284,6 +284,16 @@ export type CardFormComponentProps = {
284
284
  disabled?: boolean;
285
285
  /** Payment managers injected from context */
286
286
  paymentManagers?: InitializedManagersMap;
287
+ /** Client options for configuration */
288
+ clientOptions?: ClientOptionsContextType;
289
+ /** Headless utils for accessing server configuration */
290
+ headlessUtils?: HeadlessUtilsContextType;
291
+ /** Determines whether to show the cardholder name field
292
+ Uses client configuration with fallback to default (true) */
293
+ shouldShowCardholderName?: boolean;
294
+ /** Determines whether the cardholder name field is required
295
+ Uses client configuration with fallback to default (false) */
296
+ shouldRequireCardholderName?: boolean;
287
297
  };
288
298
 
289
299
  export type DynamicPaymentComponentProps = {
@@ -294,7 +304,7 @@ export type DynamicPaymentComponentProps = {
294
304
  /** */
295
305
  sdkState?: SdkStateContextType;
296
306
  /** */
297
- headlessUtils?: HeadlessUnitilsContextType;
307
+ headlessUtils?: HeadlessUtilsContextType;
298
308
  /** */
299
309
  open?: boolean;
300
310
  };
@@ -310,7 +320,7 @@ export type PrimerKlarnaComponentProps = {
310
320
  /** */
311
321
  sdkState?: SdkStateContextType;
312
322
  /** */
313
- headlessUtils?: HeadlessUnitilsContextType;
323
+ headlessUtils?: HeadlessUtilsContextType;
314
324
  /** */
315
325
  klarnaCategories?: KlarnaCategoriesContextType | null;
316
326
  /** */
@@ -360,6 +370,8 @@ export type PortalDialogComponentProps = {
360
370
  /** */
361
371
  onOpen?: () => void | undefined;
362
372
  /** */
373
+ onContentRendered?: () => void | undefined;
374
+ /** */
363
375
  secureHtmlContent?: SecureHtmlContentAccess | undefined;
364
376
  /** */
365
377
  open?: boolean;
@@ -391,7 +403,7 @@ export type RedirectPaymentComponentProps = {
391
403
  /** */
392
404
  sdkState?: SdkStateContextType;
393
405
  /** */
394
- headlessUtils?: HeadlessUnitilsContextType;
406
+ headlessUtils?: HeadlessUtilsContextType;
395
407
  };
396
408
 
397
409
  export type ShowOtherPaymentsComponentProps = {
@@ -419,7 +431,7 @@ export type VaultManagerComponentProps = {
419
431
  /** */
420
432
  vaultItemContext?: VaultItemContextType;
421
433
  /** */
422
- headlessUtils?: HeadlessUnitilsContextType;
434
+ headlessUtils?: HeadlessUtilsContextType;
423
435
  };
424
436
 
425
437
  export type CardFormSubmitComponentProps = {
@@ -427,7 +439,7 @@ export type CardFormSubmitComponentProps = {
427
439
  Falls back to localized default if not explicitly set. */
428
440
  buttonText?: string;
429
441
  /** */
430
- headlessInstance?: HeadlessUnitilsContextType;
442
+ headlessInstance?: HeadlessUtilsContextType;
431
443
  /** */
432
444
  clientOptions?: ClientOptionsContextType;
433
445
  /** */
@@ -444,7 +456,7 @@ export type CardNetworkSelectorComponentProps = {
444
456
  /** Card networks context from provider */
445
457
  cardNetworks?: CardNetworksContextType;
446
458
  /** */
447
- headlessUtils?: HeadlessUnitilsContextType;
459
+ headlessUtils?: HeadlessUtilsContextType;
448
460
  /** Dispatched when a network is selected with the network name as detail */
449
461
  "onnetwork-selected"?: (e: CustomEvent<CustomEvent>) => void;
450
462
  };
@@ -597,7 +609,7 @@ export type VaultManagerHeaderComponentProps = {
597
609
 
598
610
  export type VaultPaymentMethodItemComponentProps = {
599
611
  /** */
600
- headlessUtils?: HeadlessUnitilsContextType;
612
+ headlessUtils?: HeadlessUtilsContextType;
601
613
  /** Whether the component is in edit mode */
602
614
  isEditMode?: boolean;
603
615
  /** Strongly typed event declarations */
@@ -625,7 +637,7 @@ export type VaultPaymentSubmitComponentProps = {
625
637
  Falls back to localized default if not explicitly set. */
626
638
  buttonText?: string;
627
639
  /** */
628
- headlessInstance?: HeadlessUnitilsContextType;
640
+ headlessInstance?: HeadlessUtilsContextType;
629
641
  /** */
630
642
  sdkState?: SdkStateContextType;
631
643
  /** The button variant to use. */
@@ -355,6 +355,10 @@ export interface PaymentMethodConfig {
355
355
  threeDSecureInitUrl?: string;
356
356
  threeDSecureProvider?: string;
357
357
  threeDSecureEnabled?: boolean;
358
+ cardholderName?: {
359
+ visible?: boolean;
360
+ required?: boolean;
361
+ };
358
362
  };
359
363
  forceRedirect?: boolean;
360
364
  }
@@ -751,7 +755,7 @@ export interface PrimerHeadlessCheckout {
751
755
  createPaymentMethodManager(type: PaymentMethodType, options?: PaymentMethodManagerOptions): Promise<IRedirectPaymentMethodManager | null>;
752
756
  createVaultManager(): HeadlessVaultManager;
753
757
  getSDKUtilities(): HeadlessSDKUtilities;
754
- configure: (options: Omit<HeadlessUniversalCheckoutOptions, "clientSessionCachingEnabled">) => void;
758
+ configure?: (options: Omit<HeadlessUniversalCheckoutOptions, "clientSessionCachingEnabled">) => void;
755
759
  getAssetsManager(): IAssetsManager;
756
760
  start: () => Promise<void>;
757
761
  refreshClientSession(): Promise<boolean>;
@@ -936,6 +940,7 @@ export interface PrimerCheckoutOptions {
936
940
  card?: {
937
941
  cardholderName?: {
938
942
  required?: boolean;
943
+ visible?: boolean;
939
944
  };
940
945
  };
941
946
  applePay?: Omit<ApplePayOptions, "container"> & {
@@ -1144,7 +1149,7 @@ declare class PrimerEventsController implements ReactiveController {
1144
1149
  dispatchFormSubmitSuccess(result: unknown): void;
1145
1150
  dispatchFormSubmitErrors(errors: unknown): void;
1146
1151
  }
1147
- export type HeadlessUnitilsContextType = HeadlessSDKUtilities | null;
1152
+ export type HeadlessUtilsContextType = HeadlessSDKUtilities | null;
1148
1153
  export type KlarnaCategoriesContextType = {
1149
1154
  categories: KlarnaPaymentMethodCategory[];
1150
1155
  isLoading: boolean;
@@ -1307,7 +1312,7 @@ declare class SDKContextController implements ReactiveController {
1307
1312
  setVaultManager(value: VaultManagerContextType): void;
1308
1313
  setKlarnaCategories(value: KlarnaCategoriesContextType): void;
1309
1314
  setClientOptions(value: PrimerCheckoutOptions | null): void;
1310
- setHeadlessUtils(value: HeadlessUnitilsContextType): void;
1315
+ setHeadlessUtils(value: HeadlessUtilsContextType): void;
1311
1316
  setComputedStyles(value: CSSStyleDeclaration): void;
1312
1317
  setVaultManagerCvv(value: VaultItemContextType): void;
1313
1318
  }
@@ -2081,7 +2086,7 @@ declare class PrimerKlarnaComponent extends LitElement {
2081
2086
  static styles: import("lit").CSSResult[];
2082
2087
  paymentManagers: InitializedManagersMap;
2083
2088
  sdkState: SdkStateContextType;
2084
- headlessUtils: HeadlessUnitilsContextType;
2089
+ headlessUtils: HeadlessUtilsContextType;
2085
2090
  klarnaCategories: KlarnaCategoriesContextType | null;
2086
2091
  disabled: boolean;
2087
2092
  private selectedCategory;
@@ -2193,7 +2198,7 @@ declare class DynamicPaymentComponent extends LitElement {
2193
2198
  paymentMethod: InitializedPaymentMethod | undefined;
2194
2199
  paymentManagers: InitializedManagersMap;
2195
2200
  sdkState: SdkStateContextType;
2196
- headlessUtils: HeadlessUnitilsContextType;
2201
+ headlessUtils: HeadlessUtilsContextType;
2197
2202
  open: boolean;
2198
2203
  private _paymentMethodManagerTask;
2199
2204
  private _getAssetsTask;
@@ -2219,7 +2224,7 @@ declare class RedirectPaymentComponent extends LitElement {
2219
2224
  disabled: boolean;
2220
2225
  paymentManagers: InitializedManagersMap;
2221
2226
  sdkState: SdkStateContextType;
2222
- headlessUtils: HeadlessUnitilsContextType;
2227
+ headlessUtils: HeadlessUtilsContextType;
2223
2228
  private _paymentMethodManagerTask;
2224
2229
  /**
2225
2230
  * Based on packages/primer-sdk-web/src/payment-methods/Button.tsx
@@ -2247,12 +2252,14 @@ export interface PortalDialogData {
2247
2252
  size?: "flex" | "large";
2248
2253
  showCloseButton?: boolean;
2249
2254
  onOpen?: () => void;
2255
+ onContentRendered?: () => void;
2250
2256
  }
2251
2257
  export declare class PortalDialogComponent extends LitElement {
2252
2258
  static styles: import("lit").CSSResult[];
2253
2259
  size: "flex" | "large";
2254
2260
  showCloseButton: boolean;
2255
2261
  onOpen?: () => void;
2262
+ onContentRendered?: () => void;
2256
2263
  secureHtmlContent?: SecureHtmlContentAccess;
2257
2264
  open: boolean;
2258
2265
  /**
@@ -2314,7 +2321,7 @@ declare class VaultManagerComponent extends LitElement {
2314
2321
  removeEventListener: <K extends keyof VaultManagerEventMap>(type: K, listener: (ev: VaultManagerEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void;
2315
2322
  vaultManagerContext: VaultManagerContextType;
2316
2323
  vaultItemContext: VaultItemContextType;
2317
- headlessUtils: HeadlessUnitilsContextType;
2324
+ headlessUtils: HeadlessUtilsContextType;
2318
2325
  /**
2319
2326
  * Whether we're in edit mode
2320
2327
  */
@@ -2411,7 +2418,7 @@ declare class VaultPaymentMethodItemComponent extends LitElement {
2411
2418
  */
2412
2419
  vaultManagerContext: VaultManagerContextType;
2413
2420
  vaultItemContext: VaultItemContextType;
2414
- headlessUtils: HeadlessUnitilsContextType;
2421
+ headlessUtils: HeadlessUtilsContextType;
2415
2422
  /**
2416
2423
  * The payment method to display
2417
2424
  */
@@ -2578,7 +2585,7 @@ declare class VaultPaymentSubmitComponent extends LitElement {
2578
2585
  */
2579
2586
  get buttonText(): string;
2580
2587
  set buttonText(value: string);
2581
- headlessInstance: HeadlessUnitilsContextType;
2588
+ headlessInstance: HeadlessUtilsContextType;
2582
2589
  sdkState: SdkStateContextType;
2583
2590
  vaultItemContext: VaultItemContextType;
2584
2591
  vaultManager: VaultManagerContextType;
@@ -2725,14 +2732,36 @@ declare class CardFormComponent extends LitElement {
2725
2732
  * Payment managers injected from context
2726
2733
  */
2727
2734
  paymentManagers: InitializedManagersMap;
2735
+ /**
2736
+ * Client options for configuration
2737
+ */
2738
+ clientOptions: ClientOptionsContextType;
2739
+ /**
2740
+ * Headless utils for accessing server configuration
2741
+ */
2742
+ headlessUtils: HeadlessUtilsContextType;
2728
2743
  /**
2729
2744
  * Context provider for card form data
2730
2745
  */
2731
2746
  private readonly cardFormProvider;
2747
+ /**
2748
+ * Determines whether to show the cardholder name field
2749
+ * Uses client configuration with fallback to default (true)
2750
+ */
2751
+ get shouldShowCardholderName(): boolean;
2752
+ /**
2753
+ * Determines whether the cardholder name field is required
2754
+ * Uses client configuration with fallback to default (false)
2755
+ */
2756
+ get shouldRequireCardholderName(): boolean;
2732
2757
  /**
2733
2758
  * Events controller for dispatching form events
2734
2759
  */
2735
2760
  private readonly eventsController;
2761
+ /**
2762
+ * Registry for input controllers to enable context-driven meta state management
2763
+ */
2764
+ private readonly inputControllers;
2736
2765
  /**
2737
2766
  * Task to set up the card form with hosted inputs
2738
2767
  */
@@ -2769,19 +2798,6 @@ declare class CardFormComponent extends LitElement {
2769
2798
  private handleFormSubmit;
2770
2799
  render(): typeof nothing | import("lit-html").TemplateResult<1>;
2771
2800
  }
2772
- export interface CardFormContext {
2773
- cardNumberInput: IHeadlessHostedInput;
2774
- cardHolderNameInput?: IHeadlessHostedInput;
2775
- expiryInput: IHeadlessHostedInput;
2776
- cvvInput: IHeadlessHostedInput;
2777
- setCardholderName: (val: string) => void;
2778
- setCardNetwork: (val: string) => void;
2779
- validate: () => Promise<Validation>;
2780
- submit: (values?: CardPaymentMethodSubmitValues) => Promise<void>;
2781
- errors?: Validation["validationErrors"];
2782
- hideLabels?: boolean;
2783
- disabled?: boolean;
2784
- }
2785
2801
  /**
2786
2802
  * A shared type that ensures the host of a HostedInputController contains
2787
2803
  * the required properties for proper hosted input handling.
@@ -2797,10 +2813,12 @@ export interface HostedInputHost extends ReactiveControllerHost, LitElement {
2797
2813
  label: string;
2798
2814
  requestUpdate: ReactiveControllerHost["requestUpdate"];
2799
2815
  }
2800
- /**
2801
- * Available input types for hosted inputs.
2802
- */
2803
- export type HostedInputType = "cardNumber" | "cvv" | "expire" | "cardholderName";
2816
+ declare enum HostedInputType {
2817
+ CARD_NUMBER = "cardNumber",
2818
+ CVV = "cvv",
2819
+ EXPIRY_DATE = "expire",
2820
+ CARD_HOLDER_NAME = "cardholderName"
2821
+ }
2804
2822
  /**
2805
2823
  * Configuration for the hosted input controller.
2806
2824
  */
@@ -2819,7 +2837,6 @@ export interface HostedInputConfig {
2819
2837
  */
2820
2838
  export type InputSource = IHeadlessHostedInput | "cardholderName" | undefined;
2821
2839
  declare class HostedInputController<T extends HostedInputHost> implements ReactiveController {
2822
- private _isFocused;
2823
2840
  private _meta;
2824
2841
  private _hostedInput;
2825
2842
  private _standardInput;
@@ -2857,18 +2874,74 @@ declare class HostedInputController<T extends HostedInputHost> implements Reacti
2857
2874
  private setupStandardInput;
2858
2875
  /**
2859
2876
  * Sets up event listeners for standard input elements
2877
+ * Following the same meta state tracking pattern as hosted inputs in legacy SDK
2860
2878
  */
2861
2879
  private setupInputEventListeners;
2862
2880
  /**
2863
2881
  * Sets up a hosted iframe input for iframe-based input types
2864
2882
  */
2865
2883
  private setupHostedIframeInput;
2866
- /** Exposes the current focus state. */
2867
- get isFocused(): boolean;
2868
2884
  /** Exposes the current metadata state. */
2869
2885
  get meta(): InputMetadata;
2886
+ /**
2887
+ * Updates meta state from validation results.
2888
+ * Used to propagate form-level validation results to individual inputs.
2889
+ */
2890
+ updateMetaFromValidation(validationResult: {
2891
+ valid?: boolean;
2892
+ error?: string | null;
2893
+ errorCode?: string | null;
2894
+ }): void;
2895
+ /**
2896
+ * Sets the submitted state for form submission handling.
2897
+ * Called when form submission occurs.
2898
+ */
2899
+ setSubmitted(submitted: boolean): void;
2870
2900
  hostConnected(): void;
2871
2901
  hostDisconnected(): void;
2902
+ /**
2903
+ * Registers this controller with the card form context for centralized management
2904
+ */
2905
+ private registerWithContext;
2906
+ /**
2907
+ * Unregisters this controller from the card form context
2908
+ */
2909
+ private unregisterFromContext;
2910
+ }
2911
+ export interface IHostedInputController {
2912
+ meta: {
2913
+ active: boolean;
2914
+ dirty: boolean;
2915
+ error: string | null;
2916
+ errorCode: string | null;
2917
+ submitted: boolean;
2918
+ touched: boolean;
2919
+ valid: boolean;
2920
+ };
2921
+ setSubmitted(submitted: boolean): void;
2922
+ updateMetaFromValidation(result: {
2923
+ valid?: boolean;
2924
+ error?: string | null;
2925
+ errorCode?: string | null;
2926
+ }): void;
2927
+ focusInput(): void;
2928
+ }
2929
+ export interface CardFormContext {
2930
+ cardNumberInput: IHeadlessHostedInput;
2931
+ cardholderNameInput?: IHeadlessHostedInput;
2932
+ expiryInput: IHeadlessHostedInput;
2933
+ cvvInput: IHeadlessHostedInput;
2934
+ setCardholderName: (val: string) => void;
2935
+ setCardNetwork: (val: string) => void;
2936
+ validate: () => Promise<Validation>;
2937
+ submit: (values?: CardPaymentMethodSubmitValues) => Promise<void>;
2938
+ errors?: Validation["validationErrors"];
2939
+ hideLabels?: boolean;
2940
+ disabled?: boolean;
2941
+ setSubmissionState: (submitted: boolean) => void;
2942
+ propagateValidationErrors: (errors: InputValidationError[]) => void;
2943
+ registerInputController: (inputType: HostedInputType, controller: IHostedInputController) => void;
2944
+ unregisterInputController: (inputType: HostedInputType) => void;
2872
2945
  }
2873
2946
  /**
2874
2947
  * Translation configuration object
@@ -3030,7 +3103,7 @@ declare class CardFormSubmitComponent extends LitElement {
3030
3103
  */
3031
3104
  get buttonText(): string;
3032
3105
  set buttonText(value: string);
3033
- headlessInstance: HeadlessUnitilsContextType;
3106
+ headlessInstance: HeadlessUtilsContextType;
3034
3107
  clientOptions: ClientOptionsContextType;
3035
3108
  sdkState: SdkStateContextType;
3036
3109
  cardFormContext: CardFormContext | null;
@@ -3064,7 +3137,7 @@ declare class CardNetworkSelectorComponent extends LitElement {
3064
3137
  * Card networks context from provider
3065
3138
  */
3066
3139
  cardNetworks: CardNetworksContextType;
3067
- headlessUtils: HeadlessUnitilsContextType;
3140
+ headlessUtils: HeadlessUtilsContextType;
3068
3141
  private selectedCardNetwork;
3069
3142
  /**
3070
3143
  * Internal state to track if dropdown is open