@liquidcommerce/elements-sdk 2.7.33 → 2.7.35
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.checkout.esm.js +7932 -7611
- package/dist/index.esm.js +12858 -12475
- package/dist/types/core/a11y/index.d.ts +2 -1
- package/dist/types/core/a11y/required.d.ts +1 -0
- package/dist/types/core/a11y/single-select.d.ts +5 -1
- package/dist/types/core/store/interfaces/checkout.interface.d.ts +1 -0
- package/dist/types/modules/checkout/checkout.commands.d.ts +7 -1
- package/dist/types/modules/checkout/checkout.component.d.ts +4 -1
- package/dist/types/modules/checkout/components/checkout-billing.component.d.ts +3 -0
- package/dist/types/modules/checkout/components/checkout-order-summary.component.d.ts +2 -0
- package/dist/types/modules/checkout/components/checkout-send-as-gift.component.d.ts +3 -0
- package/dist/types/modules/checkout/components/checkout-stripe-form.component.d.ts +2 -1
- package/dist/types/modules/checkout/components/checkout-tips.component.d.ts +2 -0
- package/dist/types/modules/checkout/components/required-fields-legend.d.ts +1 -0
- package/dist/types/modules/checkout/payment-session-error.d.ts +4 -0
- package/dist/types/modules/product/components/components.d.ts +22 -4
- package/dist/types/modules/product/components/product-retailers-carousel.component.d.ts +2 -0
- package/dist/types/modules/product/components/product-retailers-popup-list.component.d.ts +2 -0
- package/docs/v1/guides/accessibility.md +48 -7
- package/package.json +12 -7
|
@@ -2,4 +2,5 @@ export { type AnnouncementPoliteness, AnnouncerService } from '@/core/a11y/annou
|
|
|
2
2
|
export { A11Y_PERSIST_ATTRIBUTE, FocusManagerService } from '@/core/a11y/focus-manager.service';
|
|
3
3
|
export { getFocusableElements, isFocusable, isVisible, safeFocus } from '@/core/a11y/focusable';
|
|
4
4
|
export { type IGlyphButtonParams, createGlyphButton } from '@/core/a11y/glyph-button';
|
|
5
|
-
export {
|
|
5
|
+
export { markRequired } from '@/core/a11y/required';
|
|
6
|
+
export { type IRovingFocusOptions, type RovingOrientation, applyOptionSemantics, applyRadioSemantics, focusSelectedItem, updateSelection, wireRovingFocus, } from '@/core/a11y/single-select';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function markRequired(element: HTMLElement, isRequired?: boolean): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type RovingOrientation = 'horizontal' | 'vertical' | 'both';
|
|
2
|
-
type SelectionAttribute = 'aria-selected' | 'aria-checked';
|
|
2
|
+
type SelectionAttribute = 'aria-selected' | 'aria-checked' | 'aria-pressed';
|
|
3
3
|
export interface IRovingFocusOptions {
|
|
4
4
|
items: HTMLElement[];
|
|
5
5
|
orientation?: RovingOrientation;
|
|
@@ -11,6 +11,10 @@ export declare function applyOptionSemantics(element: HTMLElement, { label, sele
|
|
|
11
11
|
label: string;
|
|
12
12
|
selected: boolean;
|
|
13
13
|
}): void;
|
|
14
|
+
export declare function applyRadioSemantics(element: HTMLElement, { label, selected }: {
|
|
15
|
+
label: string;
|
|
16
|
+
selected: boolean;
|
|
17
|
+
}): void;
|
|
14
18
|
export declare function focusSelectedItem(root: ParentNode, itemSelector: string): boolean;
|
|
15
19
|
export declare function wireRovingFocus({ items, orientation, selectionFollowsFocus, onActivate }: IRovingFocusOptions): void;
|
|
16
20
|
export {};
|
|
@@ -6,6 +6,11 @@ import type { AddItemParams } from '@/modules/cart/cart.commands';
|
|
|
6
6
|
import type { PresaleExpiredReason } from '@/modules/checkout/components';
|
|
7
7
|
export declare class CheckoutCommands extends BaseCommand {
|
|
8
8
|
private readonly uiCommands;
|
|
9
|
+
private lastLoadParams;
|
|
10
|
+
private paymentGeneration;
|
|
11
|
+
private confirmedPayment;
|
|
12
|
+
assertPaymentReady(): void;
|
|
13
|
+
retryLoadCheckout(): Promise<void>;
|
|
9
14
|
constructor();
|
|
10
15
|
static getInstance(): CheckoutCommands;
|
|
11
16
|
addPresaleItem(params: AddItemParams): Promise<void>;
|
|
@@ -14,10 +19,11 @@ export declare class CheckoutCommands extends BaseCommand {
|
|
|
14
19
|
cartId?: string;
|
|
15
20
|
isForPresale?: boolean;
|
|
16
21
|
}): Promise<void>;
|
|
22
|
+
private showAlreadyCompletedCheckout;
|
|
17
23
|
loadCheckoutFromResponse(response: ICheckoutPrepare): void;
|
|
18
24
|
toggleIsGift(active?: boolean): Promise<void>;
|
|
19
25
|
toggleBillingSameAsShipping(active?: boolean): Promise<void>;
|
|
20
|
-
toggleMarketingPreferences(fieldName: 'canEmail' | 'canSms', active?: boolean): Promise<
|
|
26
|
+
toggleMarketingPreferences(fieldName: 'canEmail' | 'canSms', active?: boolean): Promise<boolean>;
|
|
21
27
|
getPaymentSession(): Promise<void>;
|
|
22
28
|
confirmPaymentSession(confirmationTokenId: string, setupIntentId: string): Promise<ICheckoutPaymentMethodStore>;
|
|
23
29
|
applyPromoCode(code: string): Promise<void>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseComponent } from '@/core/base-component.service';
|
|
1
|
+
import { BaseComponent, type IOnStoreChanged } from '@/core/base-component.service';
|
|
2
2
|
import type { ICheckoutComponent } from '@/interfaces/configs';
|
|
3
3
|
export interface ICheckoutComponentParams {
|
|
4
4
|
checkoutId: string;
|
|
@@ -7,6 +7,9 @@ export interface ICheckoutComponentParams {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class CheckoutComponent extends BaseComponent<ICheckoutComponentParams, ICheckoutComponent> {
|
|
9
9
|
constructor();
|
|
10
|
+
onStoreWatch(_changes: IOnStoreChanged[]): void;
|
|
11
|
+
private updateInitializationState;
|
|
12
|
+
afterRender(): void;
|
|
10
13
|
protected template(): HTMLElement[];
|
|
11
14
|
private createHeader;
|
|
12
15
|
}
|
|
@@ -8,6 +8,9 @@ export declare class CheckoutBillingComponent extends BaseComponent<ICheckoutBil
|
|
|
8
8
|
private billingData;
|
|
9
9
|
get hostClasses(): string[];
|
|
10
10
|
constructor();
|
|
11
|
+
private pendingToggleFocus;
|
|
12
|
+
protected afterRender(): void;
|
|
13
|
+
private readonly onBillingSameAsShippingToggle;
|
|
11
14
|
private billingSameAsShippingToggle;
|
|
12
15
|
private updateSaveButtonState;
|
|
13
16
|
protected template(): HTMLElement[];
|
|
@@ -6,6 +6,8 @@ export declare class CheckoutOrderSummaryComponent extends BaseComponent<null, I
|
|
|
6
6
|
onStoreWatch(changes: IOnStoreChanged[]): void;
|
|
7
7
|
private updateZeroAmountElement;
|
|
8
8
|
protected afterRender(): void;
|
|
9
|
+
private paintMarketingCheckbox;
|
|
10
|
+
private toggleMarketingPreference;
|
|
9
11
|
private handleEmailToggle;
|
|
10
12
|
private handleSmsToggle;
|
|
11
13
|
private marketingOptInsContainer;
|
|
@@ -3,5 +3,8 @@ import type { ICheckoutComponent } from '@/interfaces/configs';
|
|
|
3
3
|
export declare class CheckoutSendAsGiftComponent extends BaseComponent<null, ICheckoutComponent> {
|
|
4
4
|
get hostClasses(): string[];
|
|
5
5
|
constructor();
|
|
6
|
+
private pendingToggleFocus;
|
|
7
|
+
protected afterRender(): void;
|
|
8
|
+
private readonly onToggle;
|
|
6
9
|
protected template(): HTMLElement[];
|
|
7
10
|
}
|
|
@@ -26,12 +26,14 @@ export interface IStripeFormStatus {
|
|
|
26
26
|
}
|
|
27
27
|
export declare class CheckoutStripeFormComponent extends SafeHTMLElement {
|
|
28
28
|
private _initialized;
|
|
29
|
+
private _lifecycleGeneration;
|
|
29
30
|
private _stripe;
|
|
30
31
|
private _stripeElements;
|
|
31
32
|
private _paymentElement;
|
|
32
33
|
private _isProcessing;
|
|
33
34
|
private _isFormComplete;
|
|
34
35
|
private _hasUsedCurrentSession;
|
|
36
|
+
private _pendingConfirmation;
|
|
35
37
|
private _stripeConfig;
|
|
36
38
|
private _sessionRefreshPromise;
|
|
37
39
|
initialize({ data }: {
|
|
@@ -45,7 +47,6 @@ export declare class CheckoutStripeFormComponent extends SafeHTMLElement {
|
|
|
45
47
|
private handleSubmit;
|
|
46
48
|
private requestSessionRefresh;
|
|
47
49
|
private refreshPaymentSession;
|
|
48
|
-
private resetForm;
|
|
49
50
|
private updateStripeFormStatus;
|
|
50
51
|
private createConfirmationTokenId;
|
|
51
52
|
disconnected(): Promise<void>;
|
|
@@ -4,6 +4,8 @@ export declare class CheckoutTipsComponent extends BaseComponent<null, ICheckout
|
|
|
4
4
|
private isInitialized;
|
|
5
5
|
get hostClasses(): string[];
|
|
6
6
|
constructor();
|
|
7
|
+
private pendingTipFocus;
|
|
8
|
+
private restoreTipFocus;
|
|
7
9
|
protected afterRender(): void;
|
|
8
10
|
private getTipSelection;
|
|
9
11
|
private getOnDemandFulfillments;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function requiredFieldsLegend(className?: string): HTMLElement;
|
|
@@ -2,17 +2,33 @@ import type { IProductFulfillmentStore } from '@/core/store/interfaces/product.i
|
|
|
2
2
|
import { type FulfillmentType } from '@/enums';
|
|
3
3
|
import type { IProductSizeAttributes } from '@/interfaces/api/product.interface';
|
|
4
4
|
export declare const FULFILLMENT_TAB_SELECTOR = ".fulfillment-tab";
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
5
|
+
export declare function fulfillmentTabId(idPrefix: string, type: FulfillmentType): string;
|
|
6
|
+
export declare function fulfillmentExpectationText(fulfillment: IProductFulfillmentStore, selectedSizeAttributes: IProductSizeAttributes | null, onDemandSelected: boolean): string;
|
|
7
|
+
export declare function fulfillmentFeeText(fulfillment: IProductFulfillmentStore, { prefix, freeLabel }?: {
|
|
8
|
+
prefix?: string | undefined;
|
|
9
|
+
freeLabel?: string | undefined;
|
|
10
|
+
}): string;
|
|
11
|
+
export declare function fulfillmentOptionLabel({ fulfillment, selectedFulfillmentType, selectedSizeAttributes, }: {
|
|
12
|
+
fulfillment: IProductFulfillmentStore;
|
|
13
|
+
selectedFulfillmentType: FulfillmentType;
|
|
14
|
+
selectedSizeAttributes: IProductSizeAttributes | null;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare function fulfillmentSelectedMessage(fulfillment: IProductFulfillmentStore, type: FulfillmentType, selectedSizeAttributes: IProductSizeAttributes | null): string;
|
|
17
|
+
export declare function fulfillmentTypeMessage(type: FulfillmentType, optionCount: number, autoSelected?: {
|
|
18
|
+
fulfillment: IProductFulfillmentStore;
|
|
19
|
+
selectedSizeAttributes: IProductSizeAttributes | null;
|
|
20
|
+
} | null): string;
|
|
7
21
|
export declare function focusSelectedFulfillmentTab(root: ParentNode): boolean;
|
|
8
|
-
export declare function
|
|
22
|
+
export declare function applyFulfillmentPanelSemantics(panel: HTMLElement, tabsContainer: HTMLElement, panelId: string, selectedTabId: string): void;
|
|
23
|
+
export declare function renderPopupRetailerCard({ fulfillment, selectedFulfillmentType, isSelected, selectedSizeAttributes, interactive, disabled, }: {
|
|
9
24
|
fulfillment: IProductFulfillmentStore;
|
|
10
25
|
selectedFulfillmentType: FulfillmentType;
|
|
11
26
|
isSelected: boolean;
|
|
12
27
|
selectedSizeAttributes: IProductSizeAttributes | null;
|
|
13
28
|
interactive?: boolean;
|
|
29
|
+
disabled?: boolean;
|
|
14
30
|
}): HTMLElement;
|
|
15
|
-
export declare function renderFulfillmentTabsContainer({ shippingFulfillments, onDemandFulfillments, shippingSelected, onDemandSelected, onTabClick, enableShippingFulfillment, enableOnDemandFulfillment, primaryFulfillmentMethod, }: {
|
|
31
|
+
export declare function renderFulfillmentTabsContainer({ shippingFulfillments, onDemandFulfillments, shippingSelected, onDemandSelected, onTabClick, enableShippingFulfillment, enableOnDemandFulfillment, primaryFulfillmentMethod, idPrefix, panelId, }: {
|
|
16
32
|
shippingFulfillments: IProductFulfillmentStore[];
|
|
17
33
|
onDemandFulfillments: IProductFulfillmentStore[];
|
|
18
34
|
shippingSelected: boolean;
|
|
@@ -21,4 +37,6 @@ export declare function renderFulfillmentTabsContainer({ shippingFulfillments, o
|
|
|
21
37
|
enableShippingFulfillment: boolean;
|
|
22
38
|
enableOnDemandFulfillment: boolean;
|
|
23
39
|
primaryFulfillmentMethod: FulfillmentType;
|
|
40
|
+
idPrefix: string;
|
|
41
|
+
panelId: string;
|
|
24
42
|
}): HTMLElement;
|
|
@@ -20,6 +20,8 @@ export declare class ProductRetailersCarouselComponent extends BaseComponent<IPr
|
|
|
20
20
|
afterRender(): void;
|
|
21
21
|
private cacheElements;
|
|
22
22
|
private getProductId;
|
|
23
|
+
private get instanceIdPrefix();
|
|
24
|
+
private selectedSizeAttributes;
|
|
23
25
|
onStoreWatch(changes: IOnStoreChanged[]): void;
|
|
24
26
|
private updateSelectedCard;
|
|
25
27
|
private scrollToIndex;
|
|
@@ -9,11 +9,13 @@ export interface IProductRetailersPopupListComponentParams {
|
|
|
9
9
|
export declare class ProductRetailersPopupListComponent extends BaseComponent<IProductRetailersPopupListComponentParams, IProductComponent> {
|
|
10
10
|
get hostClasses(): string[];
|
|
11
11
|
private get isProductContext();
|
|
12
|
+
private get instanceIdPrefix();
|
|
12
13
|
private productPath;
|
|
13
14
|
beforeSetupStoreWatchers(): void;
|
|
14
15
|
private pendingTabFocus;
|
|
15
16
|
protected afterRender(): void;
|
|
16
17
|
private onFulfillmentTabClick;
|
|
18
|
+
private selectedSizeAttributes;
|
|
17
19
|
private announceSelectedFulfillment;
|
|
18
20
|
private announceFulfillmentTypeChange;
|
|
19
21
|
private onRetailerCardClick;
|
|
@@ -5,13 +5,15 @@ What the Elements SDK does for accessibility, what it needs from your page, and
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
7
|
Elements target **WCAG 2.1 Level AA**. Every element ships with keyboard support, screen-reader
|
|
8
|
-
announcements
|
|
8
|
+
announcements and managed focus — there is nothing to switch on. Colour contrast is the exception:
|
|
9
|
+
the SDK renders your theme's colours exactly as given, so that part is yours — see
|
|
10
|
+
[Colour and contrast](#colour-and-contrast).
|
|
9
11
|
|
|
10
12
|
Accessibility is shared between the SDK and the host page:
|
|
11
13
|
|
|
12
14
|
| The SDK owns | Your page owns |
|
|
13
15
|
|---|---|
|
|
14
|
-
| Roles, names and states of everything inside an element | Page structure: landmarks,
|
|
16
|
+
| Roles, names and states of everything inside an element | Page structure: landmarks, `<html lang>` |
|
|
15
17
|
| Keyboard operation of every control it renders | Contrast of your own content, and the surface you place elements on |
|
|
16
18
|
| Focus movement into and out of its overlays | A theme whose colours meet the WCAG contrast minimums (the SDK renders your colours as given) |
|
|
17
19
|
| Announcing its own content changes | Not hiding or `inert`-ing the element container |
|
|
@@ -27,10 +29,11 @@ tab-through slog.
|
|
|
27
29
|
|---|---|
|
|
28
30
|
| Size selector (product) | `Tab` to the group, `←` `→` to move, `Enter` / `Space` to choose, `Home` / `End` for the ends |
|
|
29
31
|
| Size dropdown (product list) | `Enter` / `Space` / `↓` opens, `↑` `↓` moves, `Enter` chooses, `Esc` closes |
|
|
30
|
-
| Delivery method tabs (Shipping / Same-Day) | `←` `→` switches method immediately; unavailable methods are skipped |
|
|
32
|
+
| Delivery method tabs (Shipping / Same-Day) | `←` `→` switches method immediately; unavailable methods are skipped, `Home` / `End` for the ends |
|
|
31
33
|
| Retailer / delivery-option lists | `↑` `↓` moves, `Enter` / `Space` chooses, `Home` / `End` for the ends |
|
|
32
34
|
| Retailer carousel | `←` `→` moves, `Enter` / `Space` chooses |
|
|
33
35
|
| Product image thumbnails | `←` `→` moves, `Enter` / `Space` shows the image |
|
|
36
|
+
| Tip amount | `Tab` to the group, `←` `→` to move, `Enter` / `Space` to choose, `Home` / `End` for the ends |
|
|
34
37
|
| Quantity steppers | `Tab` to each button, `Enter` / `Space` to step |
|
|
35
38
|
| Address field | Type to search, `↑` `↓` through suggestions, `Enter` selects, `Esc` dismisses |
|
|
36
39
|
| Cart / checkout drawer, modals | `Tab` cycles inside the panel only, `Esc` closes |
|
|
@@ -77,8 +80,8 @@ Content that appears or changes without navigation is announced through a shared
|
|
|
77
80
|
|---|---|
|
|
78
81
|
| Buy Now pressed | "Enter delivery address" |
|
|
79
82
|
| Address saved | "Delivery address updated. Now delivering to …" |
|
|
80
|
-
| Delivery option chosen | "Delivery option updated. Shipping from …, $…" |
|
|
81
|
-
| Delivery method switched | "Shipping selected. 5 options available." |
|
|
83
|
+
| Delivery option chosen | "Delivery option updated. Shipping from …, $…, Ships in 2-3 days, delivery $…" |
|
|
84
|
+
| Delivery method switched | "Shipping selected. 5 options available. Shipping from …, $…, Ships in 2-3 days, delivery $…" |
|
|
82
85
|
| Size chosen | "Size 750 ML selected" |
|
|
83
86
|
| Quantity stepped | "Tito's Handmade Vodka, quantity 4" |
|
|
84
87
|
| Personalization saved / removed | "Personalization saved" / "Personalization removed" |
|
|
@@ -98,13 +101,45 @@ on render, and a live region recreated with its text already in place is not ann
|
|
|
98
101
|
- Dialogs carry `role="dialog"`, an accessible name, and `aria-modal` when they cover the page.
|
|
99
102
|
- Single-select groups are `listbox` / `radiogroup` with `option` / `radio` children carrying
|
|
100
103
|
`aria-selected` / `aria-checked` — not toggle buttons with `aria-pressed`, which would describe
|
|
101
|
-
each choice as an independent on/off switch.
|
|
104
|
+
each choice as an independent on/off switch. Product sizes are a `listbox`; the delivery options
|
|
105
|
+
under each method are a `radiogroup`.
|
|
106
|
+
- The delivery-method controls are a `tablist` of `tab`s. Only one method's options are rendered at
|
|
107
|
+
a time, so the selected tab carries `aria-controls` and the region it swaps in is the matching
|
|
108
|
+
`tabpanel`, labelled by that tab; the inactive tab points at nothing, because there is nothing
|
|
109
|
+
there to point at. A method switched off by configuration renders no tab at all, and the region
|
|
110
|
+
then falls back to its own label rather than naming a tab that does not exist. Choosing an option
|
|
111
|
+
closes the panel, so arrow keys move without choosing and `Enter` / `Space` commits — a
|
|
112
|
+
deliberate departure from the radio-group model, which would otherwise select a neighbour and
|
|
113
|
+
end the interaction before the shopper reached the option they wanted.
|
|
102
114
|
- Unavailable controls are `aria-disabled` **and** genuinely inert: they cannot be activated.
|
|
103
115
|
- Icon-only buttons take their name from the button's `aria-label`.
|
|
104
116
|
- Visible label text is always contained in the accessible name (2.5.3 Label in Name), so speech
|
|
105
117
|
input works: saying "click See Delivery Options" activates the button that reads that way.
|
|
106
118
|
- Fields whose design has no room for a visible label (promo code, gift card) get an
|
|
107
|
-
`aria-label` instead — no rendered label, no layout change.
|
|
119
|
+
`aria-label` instead — no rendered label, no layout change. A field that has a visible `<label>`
|
|
120
|
+
is never *also* given an `aria-label`, which would replace the label's text rather than add to
|
|
121
|
+
it.
|
|
122
|
+
- **Required fields** carry `aria-required="true"`, so they announce as required. The visible `*`
|
|
123
|
+
is reinforcement and is `aria-hidden`, since the state is already spoken; each form section
|
|
124
|
+
explains the glyph with a "Fields marked * are required." line above its fields (3.3.2).
|
|
125
|
+
- An option in a single-select group carries its **whole** visible content in its accessible name.
|
|
126
|
+
`option` and `radio` have presentational children, so the name is the only channel: a delivery
|
|
127
|
+
option names the retailer, the price, the timing, the delivery fee and — for same-day — the
|
|
128
|
+
store address and whether it is currently closed.
|
|
129
|
+
|
|
130
|
+
### Headings
|
|
131
|
+
|
|
132
|
+
The product element emits a level-1 title with its sections (`Size`, `About this product:`) at
|
|
133
|
+
level 2, and an overlay supplies its own heading at the top of its content, because the page behind
|
|
134
|
+
it is out of the accessibility tree while it is open.
|
|
135
|
+
|
|
136
|
+
Captions that label a single value — the `Delivers to:` and `Shipping From:` lines — are **not**
|
|
137
|
+
headings, so they do not turn up in a heading list as headings that head nothing. `Shipping From:`
|
|
138
|
+
names the card it captions with `aria-labelledby`; `Delivers to:` is hidden from assistive
|
|
139
|
+
technology because the control beside it already announces the address.
|
|
140
|
+
|
|
141
|
+
The checkout element has its own outline and is not covered by the above. Where any element's
|
|
142
|
+
top-level heading sits in **your** page's outline is yours to place.
|
|
108
143
|
|
|
109
144
|
### Images and icons
|
|
110
145
|
|
|
@@ -171,3 +206,9 @@ for (const region of document.querySelectorAll('[data-lce-live-region]')) {
|
|
|
171
206
|
- [Theming Guide](./theming.md) — the colour tokens to check for contrast
|
|
172
207
|
- [Best Practices](./best-practices.md)
|
|
173
208
|
- [Browser Support](../reference/browser-support.md)
|
|
209
|
+
|
|
210
|
+
## Checkout initialization and payment recovery
|
|
211
|
+
|
|
212
|
+
Checkout announces loading or initialization failure in a status region. If initialization fails, payment fields are withheld and a keyboard-operable **Retry checkout** button retries the same checkout. The button is disabled while loading.
|
|
213
|
+
|
|
214
|
+
Save Payment Information remains disabled until checkout initializes. During payment save it stays busy until the server responds. Recoverable billing/prepare errors are announced while the mounted card fields and billing input remain available for correction and retry.
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "LiquidCommerce Elements SDK",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"author": "LiquidCommerce Team",
|
|
6
|
-
"version": "2.7.
|
|
6
|
+
"version": "2.7.35",
|
|
7
7
|
"homepage": "https://docs.liquidcommerce.co/elements-sdk",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"module": "./dist/index.esm.js",
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
|
-
"packageManager": "pnpm@11.
|
|
17
|
+
"packageManager": "pnpm@11.24.0",
|
|
18
18
|
"exports": {
|
|
19
19
|
".": {
|
|
20
20
|
"types": "./dist/types/index.d.ts",
|
|
@@ -64,7 +64,9 @@
|
|
|
64
64
|
"clean": "rm -rf dist umd node_modules && pnpm install && pnpm build:all",
|
|
65
65
|
"prepublishOnly": "pnpm run build",
|
|
66
66
|
"deprecate:old": "npm deprecate @liquidcommerceteam/elements-sdk@\"*\" \"Package moved to @liquidcommerce/elements-sdk\"",
|
|
67
|
-
"prepare": "husky"
|
|
67
|
+
"prepare": "husky",
|
|
68
|
+
"test": "vitest run",
|
|
69
|
+
"test:browser": "playwright test"
|
|
68
70
|
},
|
|
69
71
|
"keywords": [
|
|
70
72
|
"liquidcommerce",
|
|
@@ -107,9 +109,10 @@
|
|
|
107
109
|
"theming"
|
|
108
110
|
],
|
|
109
111
|
"devDependencies": {
|
|
110
|
-
"@biomejs/biome": "^2.5.
|
|
112
|
+
"@biomejs/biome": "^2.5.11",
|
|
111
113
|
"@commitlint/cli": "^21.2.2",
|
|
112
114
|
"@commitlint/config-conventional": "^21.2.2",
|
|
115
|
+
"@playwright/test": "1.60.0",
|
|
113
116
|
"@rollup/plugin-alias": "^6.0.0",
|
|
114
117
|
"@rollup/plugin-commonjs": "^29.0.3",
|
|
115
118
|
"@rollup/plugin-json": "^6.1.0",
|
|
@@ -123,16 +126,18 @@
|
|
|
123
126
|
"@semantic-release/npm": "^13.1.5",
|
|
124
127
|
"@semantic-release/release-notes-generator": "^14.1.1",
|
|
125
128
|
"@types/core-js": "^2.5.8",
|
|
126
|
-
"@types/node": "^26.
|
|
129
|
+
"@types/node": "^26.4.0",
|
|
127
130
|
"conventional-changelog": "8.1.3",
|
|
128
131
|
"husky": "^9.1.7",
|
|
132
|
+
"jsdom": "26.1.0",
|
|
129
133
|
"process": "^0.11.10",
|
|
130
|
-
"rollup": "^4.
|
|
134
|
+
"rollup": "^4.63.1",
|
|
131
135
|
"rollup-obfuscator": "^4.1.1",
|
|
132
136
|
"rollup-plugin-typescript2": "^0.37.0",
|
|
133
137
|
"semantic-release": "^25.0.9",
|
|
134
138
|
"ts-node": "^10.9.2",
|
|
135
|
-
"typescript": "6.0.3"
|
|
139
|
+
"typescript": "6.0.3",
|
|
140
|
+
"vitest": "2.1.9"
|
|
136
141
|
},
|
|
137
142
|
"engines": {
|
|
138
143
|
"node": ">=22"
|