@vtex/faststore 0.0.8 → 0.0.11
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/CHANGELOG.md +101 -0
- package/README.md +0 -1
- package/dist/actions.json +48 -1
- package/dist/catalog.json +1397 -1594
- package/dist/cli/index.d.ts +66 -28
- package/dist/cli/index.js +7371 -512
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/server-runtime.js +41 -60
- package/dist/cli/server-runtime.js.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +2 -2
- package/dist/components.d.ts +67 -56
- package/dist/components.js +64 -53
- package/dist/content-types.json +5886 -555
- package/dist/core/dist/define-component.d.ts +7 -2
- package/dist/core/dist/define-content-type.d.ts +50 -2
- package/dist/core/dist/define-content-type.js +107 -3
- package/dist/core/dist/define-content-type.js.map +1 -1
- package/dist/core/dist/index.d.ts +2 -2
- package/dist/docs/access-code-field.md +1 -1
- package/dist/docs/access-code-sign-in.md +126 -77
- package/dist/docs/account-address-book.md +210 -95
- package/dist/docs/account-entry-point.md +4 -4
- package/dist/docs/account-menu.md +16 -17
- package/dist/docs/account-saved-cards.md +306 -0
- package/dist/docs/alert-dialog.md +3 -1
- package/dist/docs/avatar.md +4 -2
- package/dist/docs/billing-address.md +99 -30
- package/dist/docs/binding-switcher.md +157 -0
- package/dist/docs/buy-button.md +7 -8
- package/dist/docs/card-entry.md +42 -29
- package/dist/docs/card-summary.md +185 -0
- package/dist/docs/cardholder-document.md +5 -3
- package/dist/docs/carousel.md +5 -4
- package/dist/docs/cart-destination.md +251 -0
- package/dist/docs/cart-item.md +48 -15
- package/dist/docs/cart-totalizer.md +8 -6
- package/dist/docs/cart.md +240 -39
- package/dist/docs/challenge-return.md +135 -0
- package/dist/docs/client-preferences-fieldset.md +10 -5
- package/dist/docs/client-preferences.md +31 -8
- package/dist/docs/client-profile-fieldset.md +20 -6
- package/dist/docs/client-profile.md +12 -3
- package/dist/docs/copy-text.md +9 -7
- package/dist/docs/document-field.md +1 -1
- package/dist/docs/email-field.md +2 -1
- package/dist/docs/email-identification.md +12 -2
- package/dist/docs/footer-copyright.md +4 -2
- package/dist/docs/footer-social.md +1 -1
- package/dist/docs/form.md +54 -18
- package/dist/docs/free-shipping-progress.md +18 -13
- package/dist/docs/identity-edit.md +8 -2
- package/dist/docs/identity-summary.md +18 -5
- package/dist/docs/incentives.md +2 -2
- package/dist/docs/installments.md +46 -32
- package/dist/docs/logo.md +1 -1
- package/dist/docs/my-account-profile.md +16 -11
- package/dist/docs/navigation-link.md +5 -3
- package/dist/docs/order-cancel.md +3 -1
- package/dist/docs/order-delivery-address.md +7 -5
- package/dist/docs/order-delivery-group.md +1 -3
- package/dist/docs/order-details-back.md +1 -1
- package/dist/docs/order-details-header.md +1 -4
- package/dist/docs/order-invoice-download.md +60 -0
- package/dist/docs/order-list-row.md +1 -1
- package/dist/docs/order-list-search.md +13 -20
- package/dist/docs/order-list-views.md +11 -17
- package/dist/docs/order-list.md +12 -5
- package/dist/docs/order-payment.md +9 -7
- package/dist/docs/order-placed-date.md +1 -1
- package/dist/docs/order-placed-payment-summary.md +28 -15
- package/dist/docs/order-placed.md +49 -14
- package/dist/docs/order-progress.md +1 -1
- package/dist/docs/order-status-badge.md +20 -9
- package/dist/docs/order-summary.md +2 -2
- package/dist/docs/order-tracking-link.md +58 -0
- package/dist/docs/payment-method-badges.md +32 -6
- package/dist/docs/payment-methods.md +2 -2
- package/dist/docs/payment.md +36 -17
- package/dist/docs/phone-field.md +4 -4
- package/dist/docs/place-order.md +84 -36
- package/dist/docs/postal-code-field.md +3 -1
- package/dist/docs/pricing.md +21 -23
- package/dist/docs/product-gallery.md +19 -20
- package/dist/docs/product-information.md +14 -10
- package/dist/docs/product-list.md +7 -6
- package/dist/docs/product-shelf.md +7 -1
- package/dist/docs/promotion.md +4 -2
- package/dist/docs/region.md +23 -15
- package/dist/docs/save-card.md +7 -6
- package/dist/docs/saved-cards.md +65 -36
- package/dist/docs/select.md +3 -4
- package/dist/docs/shipping-address.md +57 -21
- package/dist/docs/shipping-simulator.md +53 -15
- package/dist/docs/sign-in-disclosure.md +176 -0
- package/dist/docs/sign-in-form.md +78 -47
- package/dist/docs/sign-in-redirect.md +5 -3
- package/dist/docs/sign-in.md +173 -0
- package/dist/docs/toast.md +45 -16
- package/dist/docs/variant-selector.md +15 -11
- package/dist/graphql/types.d.ts +4 -14
- package/dist/index.d.ts +3 -2
- package/dist/internal/client.d.ts +4 -3
- package/dist/internal/client.js +5 -2
- package/dist/internal/server.d.ts +10 -5
- package/dist/internal/server.js +9 -4
- package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +250 -66
- package/dist/matter/access-code-sign-in/access-code-sign-in.js +459 -188
- package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-delete.d.ts +78 -40
- package/dist/matter/account-address-book/account-address-book-delete.js +86 -50
- package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +21 -4
- package/dist/matter/account-address-book/account-address-book-deliverability.js +45 -17
- package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +74 -19
- package/dist/matter/account-address-book/account-address-book-form-parts.js +77 -26
- package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +27 -6
- package/dist/matter/account-address-book/account-address-book-profile-notice.js +55 -28
- package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book.d.ts +67 -14
- package/dist/matter/account-address-book/account-address-book.js +74 -33
- package/dist/matter/account-address-book/account-address-book.js.map +1 -1
- package/dist/matter/account-address-book/account-address-country-switch.js +3 -3
- package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -1
- package/dist/matter/account-address-book/account-address-country.d.ts +66 -20
- package/dist/matter/account-address-book/account-address-country.js +83 -49
- package/dist/matter/account-address-book/account-address-country.js.map +1 -1
- package/dist/matter/account-address-book/account-address-form-context.d.ts +8 -4
- package/dist/matter/account-address-book/account-address-form-context.js.map +1 -1
- package/dist/matter/account-address-book/account-address-form.d.ts +468 -45
- package/dist/matter/account-address-book/account-address-form.js +518 -155
- package/dist/matter/account-address-book/account-address-form.js.map +1 -1
- package/dist/matter/account-address-book/account-address-record.d.ts +27 -6
- package/dist/matter/account-address-book/account-address-record.js +32 -17
- package/dist/matter/account-address-book/account-address-record.js.map +1 -1
- package/dist/matter/account-menu/account-menu.d.ts +34 -17
- package/dist/matter/account-menu/account-menu.js +46 -54
- package/dist/matter/account-menu/account-menu.js.map +1 -1
- package/dist/matter/account-menu-identity/account-menu-identity.js +1 -1
- package/dist/matter/account-saved-cards/account-saved-cards.d.ts +463 -0
- package/dist/matter/account-saved-cards/account-saved-cards.js +1011 -0
- package/dist/matter/account-saved-cards/account-saved-cards.js.map +1 -0
- package/dist/matter/billing-address/billing-address.d.ts +156 -74
- package/dist/matter/billing-address/billing-address.js +227 -156
- package/dist/matter/billing-address/billing-address.js.map +1 -1
- package/dist/matter/breadcrumb/breadcrumb.d.ts +21 -3
- package/dist/matter/breadcrumb/breadcrumb.js +24 -9
- package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/matter/buy-button/buy-button.d.ts +8 -11
- package/dist/matter/buy-button/buy-button.js +10 -19
- package/dist/matter/buy-button/buy-button.js.map +1 -1
- package/dist/matter/card-entry/card-capture.js +12 -4
- package/dist/matter/card-entry/card-capture.js.map +1 -1
- package/dist/matter/card-entry/card-entry.d.ts +123 -32
- package/dist/matter/card-entry/card-entry.js +348 -221
- package/dist/matter/card-entry/card-entry.js.map +1 -1
- package/dist/matter/cart/cart-namespace.d.ts +11 -1
- package/dist/matter/cart/cart-namespace.js +11 -1
- package/dist/matter/cart/cart-namespace.js.map +1 -1
- package/dist/matter/cart/cart.d.ts +416 -45
- package/dist/matter/cart/cart.js +782 -101
- package/dist/matter/cart/cart.js.map +1 -1
- package/dist/matter/cart-destination/cart-destination.d.ts +233 -0
- package/dist/matter/cart-destination/cart-destination.js +703 -0
- package/dist/matter/cart-destination/cart-destination.js.map +1 -0
- package/dist/matter/cart-item/cart-item.d.ts +145 -16
- package/dist/matter/cart-item/cart-item.js +230 -54
- package/dist/matter/cart-item/cart-item.js.map +1 -1
- package/dist/matter/cart-item-compositions/cart-item-compositions.js +1 -1
- package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -1
- package/dist/matter/cart-item-customizations/cart-item-customizations.js +1 -1
- package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -1
- package/dist/matter/cart-item-discounts/cart-item-discounts.js +1 -1
- package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -1
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +1 -1
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -1
- package/dist/matter/cart-item-variations/cart-item-variations.js +1 -1
- package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -1
- package/dist/matter/cart-totalizer/cart-totalizer.d.ts +43 -9
- package/dist/matter/cart-totalizer/cart-totalizer.js +49 -19
- package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -1
- package/dist/matter/challenge-return/challenge-return.d.ts +62 -0
- package/dist/matter/challenge-return/challenge-return.js +241 -0
- package/dist/matter/challenge-return/challenge-return.js.map +1 -0
- package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +86 -17
- package/dist/matter/client-preferences/client-preferences-fieldset.js +126 -54
- package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -1
- package/dist/matter/client-preferences/client-preferences.d.ts +50 -7
- package/dist/matter/client-preferences/client-preferences.js +84 -15
- package/dist/matter/client-preferences/client-preferences.js.map +1 -1
- package/dist/matter/client-profile/client-profile.d.ts +44 -9
- package/dist/matter/client-profile/client-profile.js +64 -24
- package/dist/matter/client-profile/client-profile.js.map +1 -1
- package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -22
- package/dist/matter/client-profile-form/client-profile-fieldset.js +161 -73
- package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options-accordion.d.ts +49 -4
- package/dist/matter/delivery-options/delivery-options-accordion.js +67 -14
- package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options-controller.d.ts +69 -9
- package/dist/matter/delivery-options/delivery-options-controller.js +80 -14
- package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options.d.ts +37 -2
- package/dist/matter/delivery-options/delivery-options.js +75 -12
- package/dist/matter/delivery-options/delivery-options.js.map +1 -1
- package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +1 -0
- package/dist/matter/delivery-options/use-delivery-option-selection.js +1 -1
- package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -1
- package/dist/matter/email-identification/email-identification.d.ts +25 -3
- package/dist/matter/email-identification/email-identification.js +49 -12
- package/dist/matter/email-identification/email-identification.js.map +1 -1
- package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +85 -10
- package/dist/matter/free-shipping-progress/free-shipping-progress.js +153 -53
- package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -1
- package/dist/matter/identity-edit/identity-edit.d.ts +52 -10
- package/dist/matter/identity-edit/identity-edit.js +47 -19
- package/dist/matter/identity-edit/identity-edit.js.map +1 -1
- package/dist/matter/identity-summary/identity-summary.d.ts +76 -22
- package/dist/matter/identity-summary/identity-summary.js +95 -45
- package/dist/matter/identity-summary/identity-summary.js.map +1 -1
- package/dist/matter/installments/installments-select.d.ts +98 -16
- package/dist/matter/installments/installments-select.js +156 -48
- package/dist/matter/installments/installments-select.js.map +1 -1
- package/dist/matter/installments/installments.d.ts +96 -16
- package/dist/matter/installments/installments.js +115 -40
- package/dist/matter/installments/installments.js.map +1 -1
- package/dist/matter/installments/use-installments-selection.d.ts +1 -0
- package/dist/matter/installments/use-installments-selection.js +8 -3
- package/dist/matter/installments/use-installments-selection.js.map +1 -1
- package/dist/matter/my-account-profile/my-account-profile.d.ts +358 -103
- package/dist/matter/my-account-profile/my-account-profile.js +370 -174
- package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
- package/dist/matter/order-cancel/order-cancel.d.ts +65 -19
- package/dist/matter/order-cancel/order-cancel.js +118 -51
- package/dist/matter/order-cancel/order-cancel.js.map +1 -1
- package/dist/matter/order-delivery-address/order-delivery-address.d.ts +8 -18
- package/dist/matter/order-delivery-address/order-delivery-address.js +14 -23
- package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -1
- package/dist/matter/order-delivery-group/order-delivery-group.d.ts +40 -24
- package/dist/matter/order-delivery-group/order-delivery-group.js +64 -74
- package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -1
- package/dist/matter/order-details-header/order-details-header.d.ts +32 -15
- package/dist/matter/order-details-header/order-details-header.js +66 -58
- package/dist/matter/order-details-header/order-details-header.js.map +1 -1
- package/dist/matter/order-invoice-download/order-invoice-download.d.ts +78 -0
- package/dist/matter/order-invoice-download/order-invoice-download.js +173 -0
- package/dist/matter/order-invoice-download/order-invoice-download.js.map +1 -0
- package/dist/matter/order-list/order-list.d.ts +164 -19
- package/dist/matter/order-list/order-list.js +229 -87
- package/dist/matter/order-list/order-list.js.map +1 -1
- package/dist/matter/order-list-row/order-list-row.d.ts +6 -1
- package/dist/matter/order-list-row/order-list-row.js +3 -2
- package/dist/matter/order-list-row/order-list-row.js.map +1 -1
- package/dist/matter/order-list-search/order-list-search.d.ts +18 -26
- package/dist/matter/order-list-search/order-list-search.js +30 -69
- package/dist/matter/order-list-search/order-list-search.js.map +1 -1
- package/dist/matter/order-list-views/order-list-views.d.ts +15 -22
- package/dist/matter/order-list-views/order-list-views.js +22 -68
- package/dist/matter/order-list-views/order-list-views.js.map +1 -1
- package/dist/matter/order-payment/order-payment.d.ts +33 -10
- package/dist/matter/order-payment/order-payment.js +44 -39
- package/dist/matter/order-payment/order-payment.js.map +1 -1
- package/dist/matter/order-placed/order-placed-deliveries.d.ts +144 -12
- package/dist/matter/order-placed/order-placed-deliveries.js +115 -40
- package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -1
- package/dist/matter/order-placed/order-placed.d.ts +198 -31
- package/dist/matter/order-placed/order-placed.js +230 -139
- package/dist/matter/order-placed/order-placed.js.map +1 -1
- package/dist/matter/order-placed-date/order-placed-date.d.ts +5 -8
- package/dist/matter/order-placed-date/order-placed-date.js +7 -8
- package/dist/matter/order-placed-date/order-placed-date.js.map +1 -1
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +90 -17
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +93 -117
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
- package/dist/matter/order-progress/order-progress.d.ts +19 -8
- package/dist/matter/order-progress/order-progress.js +37 -45
- package/dist/matter/order-progress/order-progress.js.map +1 -1
- package/dist/matter/order-summary/order-summary.d.ts +19 -9
- package/dist/matter/order-summary/order-summary.js +38 -44
- package/dist/matter/order-summary/order-summary.js.map +1 -1
- package/dist/matter/order-tracking-link/order-tracking-link.d.ts +43 -0
- package/dist/matter/order-tracking-link/order-tracking-link.js +107 -0
- package/dist/matter/order-tracking-link/order-tracking-link.js.map +1 -0
- package/dist/matter/payment/payment-card-capture.js +17 -10
- package/dist/matter/payment/payment-card-capture.js.map +1 -1
- package/dist/matter/payment/payment-controller.d.ts +4 -2
- package/dist/matter/payment/payment-controller.js +30 -9
- package/dist/matter/payment/payment-controller.js.map +1 -1
- package/dist/matter/payment/payment-method-badges.js +1 -1
- package/dist/matter/payment/payment.d.ts +69 -19
- package/dist/matter/payment/payment.js +101 -35
- package/dist/matter/payment/payment.js.map +1 -1
- package/dist/matter/payment/use-payment-method-selection.d.ts +25 -4
- package/dist/matter/payment/use-payment-method-selection.js +94 -32
- package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
- package/dist/matter/payment/use-payment-submit-gate.d.ts +14 -3
- package/dist/matter/payment/use-payment-submit-gate.js +47 -8
- package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
- package/dist/matter/place-order/place-order.d.ts +171 -57
- package/dist/matter/place-order/place-order.js +376 -185
- package/dist/matter/place-order/place-order.js.map +1 -1
- package/dist/matter/pricing/pricing.d.ts +152 -13
- package/dist/matter/pricing/pricing.js +153 -52
- package/dist/matter/pricing/pricing.js.map +1 -1
- package/dist/matter/product-information/product-information.d.ts +27 -4
- package/dist/matter/product-information/product-information.js +32 -15
- package/dist/matter/product-information/product-information.js.map +1 -1
- package/dist/matter/product-list/product-list.d.ts +24 -6
- package/dist/matter/product-list/product-list.js +32 -26
- package/dist/matter/product-list/product-list.js.map +1 -1
- package/dist/matter/product-shelf/product-shelf.d.ts +8 -3
- package/dist/matter/product-shelf/product-shelf.js +111 -10
- package/dist/matter/product-shelf/product-shelf.js.map +1 -1
- package/dist/matter/region/region.d.ts +33 -16
- package/dist/matter/region/region.js +59 -52
- package/dist/matter/region/region.js.map +1 -1
- package/dist/matter/save-card/save-card.d.ts +43 -8
- package/dist/matter/save-card/save-card.js +61 -23
- package/dist/matter/save-card/save-card.js.map +1 -1
- package/dist/matter/saved-cards/saved-cards.d.ts +113 -21
- package/dist/matter/saved-cards/saved-cards.js +349 -77
- package/dist/matter/saved-cards/saved-cards.js.map +1 -1
- package/dist/matter/shipping-address/address-payload.js +25 -0
- package/dist/matter/shipping-address/address-payload.js.map +1 -0
- package/dist/matter/shipping-address/country-descriptors.js +71 -71
- package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
- package/dist/matter/shipping-address/library-country-descriptors.js +136 -0
- package/dist/matter/shipping-address/library-country-descriptors.js.map +1 -0
- package/dist/matter/shipping-address/shipping-address.d.ts +312 -45
- package/dist/matter/shipping-address/shipping-address.js +443 -188
- package/dist/matter/shipping-address/shipping-address.js.map +1 -1
- package/dist/matter/shipping-simulator/shipping-simulator.d.ts +251 -25
- package/dist/matter/shipping-simulator/shipping-simulator.js +261 -51
- package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
- package/dist/matter/sign-in/sign-in.d.ts +108 -0
- package/dist/matter/sign-in/sign-in.js +285 -0
- package/dist/matter/sign-in/sign-in.js.map +1 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.d.ts +81 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.js +232 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.js.map +1 -0
- package/dist/matter/sign-in-form/sign-in-form.d.ts +93 -62
- package/dist/matter/sign-in-form/sign-in-form.js +134 -144
- package/dist/matter/sign-in-form/sign-in-form.js.map +1 -1
- package/dist/particles/binding-switcher/binding-switcher.d.ts +59 -0
- package/dist/particles/binding-switcher/binding-switcher.js +194 -0
- package/dist/particles/binding-switcher/binding-switcher.js.map +1 -0
- package/dist/particles/card-summary/card-network.d.ts +17 -0
- package/dist/particles/card-summary/card-network.js +25 -0
- package/dist/particles/card-summary/card-network.js.map +1 -0
- package/dist/particles/card-summary/card-summary.d.ts +113 -0
- package/dist/particles/card-summary/card-summary.js +221 -0
- package/dist/particles/card-summary/card-summary.js.map +1 -0
- package/dist/particles/carousel/carousel.d.ts +99 -11
- package/dist/particles/carousel/carousel.js +103 -35
- package/dist/particles/carousel/carousel.js.map +1 -1
- package/dist/particles/copy-text/copy-text.js +5 -15
- package/dist/particles/copy-text/copy-text.js.map +1 -1
- package/dist/particles/dialog/dialog.d.ts +14 -6
- package/dist/particles/dialog/dialog.js +6 -3
- package/dist/particles/dialog/dialog.js.map +1 -1
- package/dist/particles/drawer/drawer.js +1 -1
- package/dist/particles/drawer/drawer.js.map +1 -1
- package/dist/particles/email-field/email-field.d.ts +2 -1
- package/dist/particles/email-field/email-field.js +2 -1
- package/dist/particles/email-field/email-field.js.map +1 -1
- package/dist/particles/footer-link-group/footer-link-group.js +1 -0
- package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
- package/dist/particles/footer-social/footer-social.d.ts +1 -1
- package/dist/particles/footer-social/footer-social.js +1 -1
- package/dist/particles/footer-social/footer-social.js.map +1 -1
- package/dist/particles/form/form.d.ts +85 -13
- package/dist/particles/form/form.js +91 -42
- package/dist/particles/form/form.js.map +1 -1
- package/dist/particles/gallery/gallery.d.ts +129 -12
- package/dist/particles/gallery/gallery.js +121 -34
- package/dist/particles/gallery/gallery.js.map +1 -1
- package/dist/particles/incentives/incentives.d.ts +1 -1
- package/dist/particles/incentives/incentives.js +1 -1
- package/dist/particles/incentives/incentives.js.map +1 -1
- package/dist/particles/order-details-back/order-details-back.d.ts +5 -3
- package/dist/particles/order-details-back/order-details-back.js +8 -10
- package/dist/particles/order-details-back/order-details-back.js.map +1 -1
- package/dist/particles/order-status-badge/order-status-badge.d.ts +3 -3
- package/dist/particles/order-status-badge/order-status-badge.js +4 -20
- package/dist/particles/order-status-badge/order-status-badge.js.map +1 -1
- package/dist/particles/password-field/password-field.d.ts +1 -1
- package/dist/particles/password-field/password-field.js +2 -4
- package/dist/particles/password-field/password-field.js.map +1 -1
- package/dist/particles/payment-methods/payment-methods.d.ts +1 -1
- package/dist/particles/payment-methods/payment-methods.js +1 -1
- package/dist/particles/payment-methods/payment-methods.js.map +1 -1
- package/dist/particles/phone-field/phone-field.d.ts +4 -4
- package/dist/particles/phone-field/phone-field.js +8 -11
- package/dist/particles/phone-field/phone-field.js.map +1 -1
- package/dist/particles/spinner/spinner.d.ts +24 -4
- package/dist/particles/spinner/spinner.js +25 -9
- package/dist/particles/spinner/spinner.js.map +1 -1
- package/dist/particles/switch/switch.d.ts +4 -1
- package/dist/particles/switch/switch.js +3 -1
- package/dist/particles/switch/switch.js.map +1 -1
- package/dist/particles/toast/toast.d.ts +49 -9
- package/dist/particles/toast/toast.js +81 -15
- package/dist/particles/toast/toast.js.map +1 -1
- package/dist/schema.graphql +461 -89
- package/dist/sdk/actions/index.d.ts +3 -1
- package/dist/sdk/actions/index.js +3 -1
- package/dist/sdk/actions/locale-action-provider.d.ts +16 -0
- package/dist/sdk/actions/locale-action-provider.js +20 -0
- package/dist/sdk/actions/locale-action-provider.js.map +1 -0
- package/dist/sdk/actions/saved-card-action-provider.d.ts +12 -0
- package/dist/sdk/actions/saved-card-action-provider.js +16 -0
- package/dist/sdk/actions/saved-card-action-provider.js.map +1 -0
- package/dist/sdk/actions/types.d.ts +6 -2
- package/dist/sdk/address/address-fields.js +4 -4
- package/dist/sdk/address/address-fields.js.map +1 -1
- package/dist/sdk/address/constants.js +1 -6
- package/dist/sdk/address/constants.js.map +1 -1
- package/dist/sdk/address/messages.js +44 -44
- package/dist/sdk/address/messages.js.map +1 -1
- package/dist/sdk/address/postal-code.js +15 -2
- package/dist/sdk/address/postal-code.js.map +1 -1
- package/dist/sdk/address/types.d.ts +5 -3
- package/dist/sdk/address/validate-address.js +3 -3
- package/dist/sdk/address/validate-address.js.map +1 -1
- package/dist/sdk/analytics/use-analytics-actions.d.ts +1 -1
- package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
- package/dist/sdk/cache/storefront-cache.js +2 -1
- package/dist/sdk/cache/storefront-cache.js.map +1 -1
- package/dist/sdk/cart/operations.d.ts +2 -1
- package/dist/sdk/cart/operations.js +55 -1
- package/dist/sdk/cart/operations.js.map +1 -1
- package/dist/sdk/cart/optimistic.d.ts +30 -7
- package/dist/sdk/cart/optimistic.js +78 -41
- package/dist/sdk/cart/optimistic.js.map +1 -1
- package/dist/sdk/cart/use-cart-actions.d.ts +7 -0
- package/dist/sdk/cart/use-cart-actions.js +61 -15
- package/dist/sdk/cart/use-cart-actions.js.map +1 -1
- package/dist/sdk/cart/use-cart-sync-sales-channel.js +70 -0
- package/dist/sdk/cart/use-cart-sync-sales-channel.js.map +1 -0
- package/dist/sdk/data/index.js +2 -2
- package/dist/sdk/data/reactive-list-item-data-provider.js +2 -2
- package/dist/sdk/generated/gql.js +16 -12
- package/dist/sdk/generated/gql.js.map +1 -1
- package/dist/sdk/generated/graphql.d.ts +197 -51
- package/dist/sdk/generated/graphql.js +2318 -91
- package/dist/sdk/generated/graphql.js.map +1 -1
- package/dist/sdk/i18n/format-error-code.js +23 -0
- package/dist/sdk/i18n/format-error-code.js.map +1 -0
- package/dist/sdk/i18n/message-formatter.d.ts +22 -0
- package/dist/sdk/i18n/message-formatter.js +140 -0
- package/dist/sdk/i18n/message-formatter.js.map +1 -0
- package/dist/sdk/i18n/use-message-formatter.d.ts +8 -0
- package/dist/sdk/i18n/use-message-formatter.js +18 -0
- package/dist/sdk/i18n/use-message-formatter.js.map +1 -0
- package/dist/sdk/identity/use-identity-actions.js.map +1 -1
- package/dist/sdk/locale/binding-switch-provider.d.ts +13 -0
- package/dist/sdk/locale/binding-switch-provider.js +20 -0
- package/dist/sdk/locale/binding-switch-provider.js.map +1 -0
- package/dist/sdk/locale/use-locale-actions.d.ts +16 -0
- package/dist/sdk/locale/use-locale-actions.js +70 -0
- package/dist/sdk/locale/use-locale-actions.js.map +1 -0
- package/dist/sdk/navigation/binding-switch.d.ts +39 -0
- package/dist/sdk/navigation/binding-switch.js +129 -0
- package/dist/sdk/navigation/binding-switch.js.map +1 -0
- package/dist/sdk/navigation/decode-route-params.d.ts +11 -0
- package/dist/sdk/navigation/decode-route-params.js +32 -0
- package/dist/sdk/navigation/decode-route-params.js.map +1 -0
- package/dist/sdk/navigation/redirect.d.ts +2 -0
- package/dist/sdk/navigation/redirect.js +19 -1
- package/dist/sdk/navigation/redirect.js.map +1 -1
- package/dist/sdk/navigation/types.d.ts +13 -0
- package/dist/sdk/payment/bin-format.js +20 -0
- package/dist/sdk/payment/bin-format.js.map +1 -0
- package/dist/sdk/payment/challenge-return.js +37 -0
- package/dist/sdk/payment/challenge-return.js.map +1 -0
- package/dist/sdk/payment/confirmation-last-four.js +39 -0
- package/dist/sdk/payment/confirmation-last-four.js.map +1 -0
- package/dist/sdk/payment/gateway.d.ts +1 -1
- package/dist/sdk/payment/gateway.js +8 -2
- package/dist/sdk/payment/gateway.js.map +1 -1
- package/dist/sdk/payment/operations.d.ts +1 -0
- package/dist/sdk/payment/operations.js +28 -6
- package/dist/sdk/payment/operations.js.map +1 -1
- package/dist/sdk/payment/resumed-purchase.d.ts +1 -0
- package/dist/sdk/payment/resumed-purchase.js +119 -0
- package/dist/sdk/payment/resumed-purchase.js.map +1 -0
- package/dist/sdk/payment/security-code-mask.js +16 -23
- package/dist/sdk/payment/security-code-mask.js.map +1 -1
- package/dist/sdk/payment/submission-registry.js +6 -2
- package/dist/sdk/payment/submission-registry.js.map +1 -1
- package/dist/sdk/payment/use-payment-actions.d.ts +18 -3
- package/dist/sdk/payment/use-payment-actions.js +23 -3
- package/dist/sdk/payment/use-payment-actions.js.map +1 -1
- package/dist/sdk/payment/use-place-order.d.ts +10 -2
- package/dist/sdk/payment/use-place-order.js +138 -76
- package/dist/sdk/payment/use-place-order.js.map +1 -1
- package/dist/sdk/provider/storefront-provider.d.ts +1 -7
- package/dist/sdk/provider/storefront-provider.js +4 -11
- package/dist/sdk/provider/storefront-provider.js.map +1 -1
- package/dist/sdk/saved-cards/operations.d.ts +16 -0
- package/dist/sdk/saved-cards/operations.js +41 -0
- package/dist/sdk/saved-cards/operations.js.map +1 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.d.ts +26 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.js +86 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.js.map +1 -0
- package/dist/sdk/seo/entity-landing.d.ts +24 -0
- package/dist/sdk/seo/entity-landing.js +30 -0
- package/dist/sdk/seo/entity-landing.js.map +1 -0
- package/dist/sdk/seo/page-alternates.d.ts +8 -5
- package/dist/sdk/seo/page-alternates.js +11 -14
- package/dist/sdk/seo/page-alternates.js.map +1 -1
- package/dist/sdk/seo/search-landing.d.ts +42 -0
- package/dist/sdk/seo/search-landing.js +85 -0
- package/dist/sdk/seo/search-landing.js.map +1 -0
- package/dist/sdk/session/mock-session.d.ts +9 -0
- package/dist/sdk/session/mock-session.js +31 -0
- package/dist/sdk/session/mock-session.js.map +1 -0
- package/dist/sdk/session/read-server-session.d.ts +3 -0
- package/dist/sdk/session/read-server-session.js +5 -0
- package/dist/sdk/session/read-server-session.js.map +1 -1
- package/dist/sdk/session/return-path-segment.d.ts +10 -0
- package/dist/sdk/session/return-path-segment.js +15 -0
- package/dist/sdk/session/return-path-segment.js.map +1 -0
- package/dist/sdk/session/use-session-actions.js.map +1 -1
- package/dist/sdk/shipping/shipping-operations.d.ts +1 -1
- package/dist/sdk/shipping/shipping-operations.js +13 -0
- package/dist/sdk/shipping/shipping-operations.js.map +1 -1
- package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -1
- package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
- package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -1
- package/dist/sdk/state/cart.d.ts +9 -2
- package/dist/sdk/state/cart.js +9 -2
- package/dist/sdk/state/cart.js.map +1 -1
- package/dist/utils/safe-href.d.ts +2 -0
- package/package.json +4 -3
- package/skills/storefront-asset/SKILL.md +2 -2
- package/skills/storefront-asset/references/api-side.md +27 -14
- package/skills/storefront-asset/references/findings.md +5 -2
- package/src/styles/tailwind.css +9 -2
- package/dist/matter/shipping-address/country-descriptors.d.ts +0 -1
- package/dist/message-locales.json +0 -7
- package/dist/sdk/i18n/client.d.ts +0 -4
- package/dist/sdk/i18n/client.js +0 -4
- package/dist/sdk/i18n/locales.d.ts +0 -8
- package/dist/sdk/i18n/locales.js +0 -57
- package/dist/sdk/i18n/locales.js.map +0 -1
- package/dist/sdk/i18n/messages/en-US.js +0 -164
- package/dist/sdk/i18n/messages/en-US.js.map +0 -1
- package/dist/sdk/i18n/messages/en-US.json +0 -159
- package/dist/sdk/i18n/messages/en-US.json.d.ts +0 -163
- package/dist/sdk/i18n/messages/es-ES.js +0 -164
- package/dist/sdk/i18n/messages/es-ES.js.map +0 -1
- package/dist/sdk/i18n/messages/es-ES.json +0 -159
- package/dist/sdk/i18n/messages/pt-BR.js +0 -164
- package/dist/sdk/i18n/messages/pt-BR.js.map +0 -1
- package/dist/sdk/i18n/messages/pt-BR.json +0 -159
- package/dist/sdk/i18n/provider.d.ts +0 -1
- package/dist/sdk/i18n/provider.js +0 -30
- package/dist/sdk/i18n/provider.js.map +0 -1
- package/dist/sdk/i18n/server.d.ts +0 -28
- package/dist/sdk/i18n/server.js +0 -59
- package/dist/sdk/i18n/server.js.map +0 -1
- package/dist/utils/resolve-authored-copy.js +0 -18
- package/dist/utils/resolve-authored-copy.js.map +0 -1
- package/dist/utils/substitute-template.js +0 -33
- package/dist/utils/substitute-template.js.map +0 -1
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { defineComponent } from "../../core/dist/define-component.js";
|
|
3
|
+
import { defineContentType } from "../../core/dist/define-content-type.js";
|
|
3
4
|
import "../../core/dist/index.js";
|
|
5
|
+
import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
|
|
4
6
|
import { Checkbox } from "../../particles/checkbox/checkbox.js";
|
|
5
7
|
import { Field } from "../../particles/field/field.js";
|
|
6
8
|
import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
|
|
9
|
+
import { formatErrorCode } from "../../sdk/i18n/format-error-code.js";
|
|
7
10
|
import { useDataOverride } from "../../sdk/data/data-override-context.js";
|
|
8
11
|
import { useSession } from "../session/session.js";
|
|
9
12
|
import { Icon } from "../../particles/icon/icon.js";
|
|
@@ -39,10 +42,58 @@ const fragment = `
|
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
44
|
`;
|
|
45
|
+
const SaveCardContent = defineContentType({
|
|
46
|
+
id: "save-card",
|
|
47
|
+
title: "Save Card",
|
|
48
|
+
description: "Copy for the save-card toggle, its consent notice, the nickname field and a refused consent write.",
|
|
49
|
+
schema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
additionalProperties: false,
|
|
52
|
+
properties: {
|
|
53
|
+
label: {
|
|
54
|
+
type: "string",
|
|
55
|
+
title: "Toggle label",
|
|
56
|
+
format: "icu-message",
|
|
57
|
+
messageSource: "Save this card for next time"
|
|
58
|
+
},
|
|
59
|
+
nicknameLabel: {
|
|
60
|
+
type: "string",
|
|
61
|
+
title: "Nickname field label",
|
|
62
|
+
description: "Rendered only while the toggle is checked.",
|
|
63
|
+
format: "icu-message",
|
|
64
|
+
messageSource: "Card nickname"
|
|
65
|
+
},
|
|
66
|
+
consentNoticeLabel: {
|
|
67
|
+
type: "string",
|
|
68
|
+
title: "Consent notice",
|
|
69
|
+
description: "Shown beside the toggle until the shopper has granted the save-personal-data consent.",
|
|
70
|
+
format: "icu-message",
|
|
71
|
+
messageSource: "Checking this also lets us store your personal data for future purchases."
|
|
72
|
+
},
|
|
73
|
+
genericErrorMessage: {
|
|
74
|
+
type: "string",
|
|
75
|
+
title: "Consent write failure message",
|
|
76
|
+
description: "Shown when the consent write fails: a network failure or a fault the shopper cannot fix.",
|
|
77
|
+
format: "icu-message",
|
|
78
|
+
messageSource: "Unable to save your card preference. Please try again."
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
42
83
|
/** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain
|
|
43
84
|
* HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */
|
|
44
85
|
const NICKNAME_MAX_LENGTH = 50;
|
|
45
86
|
/**
|
|
87
|
+
* The message for each code the consent write can return. None is one the shopper can act on, so all share
|
|
88
|
+
* one message, as does a code this map does not know.
|
|
89
|
+
*/
|
|
90
|
+
const SAVE_CARD_ERROR_FIELDS = {
|
|
91
|
+
MISSING_CART_CONTEXT: "genericErrorMessage",
|
|
92
|
+
CART_NOT_FOUND: "genericErrorMessage",
|
|
93
|
+
NO_PREFERENCE_PROVIDED: "genericErrorMessage",
|
|
94
|
+
NETWORK_ERROR: "genericErrorMessage"
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
46
97
|
* Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —
|
|
47
98
|
* `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this
|
|
48
99
|
* reads correctly today even on `state` alone, but checking `loading` explicitly makes that
|
|
@@ -71,41 +122,28 @@ const SaveCardDefinition = defineComponent({
|
|
|
71
122
|
fetchStrategy: "reactive",
|
|
72
123
|
requiresContext: ["payment", "session"],
|
|
73
124
|
actions: { payment: ["saveCard"] },
|
|
125
|
+
content: SaveCardContent,
|
|
74
126
|
editor: {
|
|
75
127
|
label: "Save Card",
|
|
76
128
|
category: "commerce"
|
|
77
129
|
},
|
|
78
130
|
schema: {
|
|
79
|
-
label: {
|
|
80
|
-
type: "string",
|
|
81
|
-
default: "Save this card for next time",
|
|
82
|
-
label: "Toggle label"
|
|
83
|
-
},
|
|
84
|
-
nicknameLabel: {
|
|
85
|
-
type: "string",
|
|
86
|
-
default: "Card nickname",
|
|
87
|
-
label: "Nickname field label"
|
|
88
|
-
},
|
|
89
131
|
nicknamePlaceholder: {
|
|
90
132
|
type: "string",
|
|
91
133
|
label: "Nickname field placeholder"
|
|
92
134
|
},
|
|
93
|
-
consentNoticeLabel: {
|
|
94
|
-
type: "string",
|
|
95
|
-
default: "Checking this also lets us store your personal data for future purchases.",
|
|
96
|
-
label: "Consent notice label"
|
|
97
|
-
},
|
|
98
135
|
disabled: {
|
|
99
136
|
type: "boolean",
|
|
100
137
|
default: false,
|
|
101
138
|
label: "Disabled"
|
|
102
139
|
}
|
|
103
140
|
},
|
|
104
|
-
guideline: "Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time."
|
|
141
|
+
guideline: "Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Its copy comes from the $content fields label, nicknameLabel and consentNoticeLabel; a refused consent write shows genericErrorMessage. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time."
|
|
105
142
|
});
|
|
106
|
-
function SaveCard({
|
|
143
|
+
function SaveCard({ nicknamePlaceholder, disabled = false, className, $content, $locale, $data: $dataProp, $actions: $actionsProp, ...props }) {
|
|
107
144
|
const $data = useDataOverride($dataProp);
|
|
108
145
|
const $actions = useActionsOverride($actionsProp);
|
|
146
|
+
const { format } = useMessageFormatter(SaveCardContent, $content);
|
|
109
147
|
const { state, loading } = useSession();
|
|
110
148
|
const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();
|
|
111
149
|
const [pending, setPending] = useState(false);
|
|
@@ -125,7 +163,7 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
|
|
|
125
163
|
setPending(true);
|
|
126
164
|
try {
|
|
127
165
|
const [firstError] = await saveCard(true);
|
|
128
|
-
if (firstError) setConsentError(firstError
|
|
166
|
+
if (firstError) setConsentError(firstError);
|
|
129
167
|
} finally {
|
|
130
168
|
setPending(false);
|
|
131
169
|
}
|
|
@@ -153,10 +191,10 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
|
|
|
153
191
|
onCheckedChange: handleCheckedChange,
|
|
154
192
|
disabled: fieldDisabled,
|
|
155
193
|
children: /* @__PURE__ */ jsx(Checkbox.Indicator, { children: /* @__PURE__ */ jsx(Icon, { name: "checked" }) })
|
|
156
|
-
}), label] })
|
|
194
|
+
}), format("label")] })
|
|
157
195
|
}), isConsentNoticeVisible($data?.savePersonalData) ? /* @__PURE__ */ jsx("p", {
|
|
158
196
|
"data-fs-save-card-consent-notice": "",
|
|
159
|
-
children: consentNoticeLabel
|
|
197
|
+
children: format("consentNoticeLabel")
|
|
160
198
|
}) : null]
|
|
161
199
|
}),
|
|
162
200
|
checked ? /* @__PURE__ */ jsx("div", {
|
|
@@ -164,7 +202,7 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
|
|
|
164
202
|
children: /* @__PURE__ */ jsxs(Field.Root, {
|
|
165
203
|
disabled: fieldDisabled,
|
|
166
204
|
"data-fs-field-root": "",
|
|
167
|
-
children: [/* @__PURE__ */ jsx(Field.Label, { children: nicknameLabel }), /* @__PURE__ */ jsx(Field.Control, {
|
|
205
|
+
children: [/* @__PURE__ */ jsx(Field.Label, { children: format("nicknameLabel") }), /* @__PURE__ */ jsx(Field.Control, {
|
|
168
206
|
name: "cardLabel",
|
|
169
207
|
placeholder: nicknamePlaceholder,
|
|
170
208
|
value: draft.cardLabel ?? "",
|
|
@@ -177,12 +215,12 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
|
|
|
177
215
|
consentError ? /* @__PURE__ */ jsx("div", {
|
|
178
216
|
role: "alert",
|
|
179
217
|
"data-fs-save-card-error": "",
|
|
180
|
-
children: consentError
|
|
218
|
+
children: formatErrorCode(SaveCardContent, SAVE_CARD_ERROR_FIELDS, consentError, format, "genericErrorMessage")
|
|
181
219
|
}) : null
|
|
182
220
|
]
|
|
183
221
|
});
|
|
184
222
|
}
|
|
185
223
|
//#endregion
|
|
186
|
-
export { SaveCard, SaveCardDefinition, isConsentNoticeVisible, isSaveCardVisible };
|
|
224
|
+
export { SAVE_CARD_ERROR_FIELDS, SaveCard, SaveCardContent, SaveCardDefinition, isConsentNoticeVisible, isSaveCardVisible };
|
|
187
225
|
|
|
188
226
|
//# sourceMappingURL=save-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-card.js","names":[],"sources":["../../../src/matter/save-card/save-card.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport type { ChangeEvent, ComponentPropsWithRef } from 'react';\nimport { useState } from 'react';\nimport { Checkbox } from '../../particles/checkbox/checkbox.js';\nimport { Field } from '../../particles/field/field.js';\nimport { Icon } from '../../particles/icon/icon.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport { usePayment } from '../payment/payment.js';\nimport { type SessionContextValue, useSession } from '../session/session.js';\n\n/**\n * The `SaveCard` matter (specs/save-card-control.md, T10 of the Credit Card epic;\n * docs/features/credit-card/rfc.md § D5). Composes `Checkbox` + `Field` into an opt-in, off-by-default\n * toggle plus a custom nickname field, visible only to an authenticated shopper.\n *\n * Writes exactly two client-only facts T7 already provisioned on `PaymentDraft`\n * (`setDraftSaveCard` / `setDraftCardLabel`, via `usePayment()`) — this component never registers on\n * the submission channel and never calls `sendPayments`. `CardEntry` (T7) folds both facts into the\n * card object at submit time (`card-entry.tsx:639-640`); the saved-card path does NOT, because it\n * submits `{ kind: 'saved', accountId, bin, securityCode }` (`saved-cards.tsx:355`) and\n * `PaymentGatewaySavedCard` (`sdk/payment/gateway.ts:103-111`) declares no field either fact could\n * occupy. So on that path both draft writes are inert while the consent below is still granted\n * account-wide. Checking the toggle grants the account-level data-storage consent a saved card\n * requires (`$actions.payment.saveCard(true)`); unchecking never revokes it — see specs/save-card-control.md Decision 1 for the rationale and the\n * last-write-wins hazard against `SavePersonalDataOptInControl`, which writes the same field.\n *\n * Self-gates on `useSession()` (never `SessionGuard`) and requires BOTH the `payment` and `session`\n * contexts — the first component in this package to declare `requiresContext` as an array (Decision 4).\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching `card-entry.tsx`'s / `payment.tsx`'s convention;\n// the codegen `documents` glob does not scan `src/matter/save-card*`. Deliberately its OWN fragment,\n// never composed under `ClientPreferencesRoot` — that Root's section context is built from a wrapped\n// `$data?.clientPreferences?.savePersonalData` read that is always `false` at runtime for an arity-1\n// fragment (ADR-0015), a live, pre-existing defect this component must not inherit\n// (specs/save-card-control.md Decision 2).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `$data` slice forwarded by the reactive runtime — the unwrapped `ClientPreferences` entity\n * (arity-1 fragment, ADR-0015): the value of the fragment's own `clientPreferences` top-level field,\n * never the wrapping `{ clientPreferences: ... }` shape. Mirrors `card-entry.tsx`'s / `saved-cards.tsx`'s\n * identical arity-1 contract. */\nexport type SaveCardData = {\n savePersonalData?: boolean | null;\n} | null;\n\nexport type SaveCardProps = Omit<ComponentPropsWithRef<'div'>, 'children'> & {\n /** The toggle's own accessible label. */\n label?: string;\n /** Label for the nickname field. Rendered only while the toggle is checked. */\n nicknameLabel?: string;\n nicknamePlaceholder?: string;\n /** Shown beside the toggle while `savePersonalData !== true` (covers both `false` and `null`). */\n consentNoticeLabel?: string;\n /** Disables both the toggle and the nickname field. */\n disabled?: boolean;\n /** This component's own `clientPreferences` slice (arity-1 fragment, ADR-0015). */\n $data?: SaveCardData;\n /** Compiler-injected action surface; carries `payment.saveCard`. */\n $actions?: ComponentActions;\n};\n\n/** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain\n * HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */\nconst NICKNAME_MAX_LENGTH = 50;\n\n// ---------------------------------------------------------------------------\n// Pure decision functions — exported so the gate and the tri-state collapse are unit-testable\n// independent of any rendering (specs/save-card-control.md § Resolution logic).\n// ---------------------------------------------------------------------------\n\n/**\n * Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —\n * `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this\n * reads correctly today even on `state` alone, but checking `loading` explicitly makes that\n * invariant load-bearing in this component's own code rather than incidental to `session.tsx`'s\n * current implementation. Takes no closure over component state, so it is safe to call fresh on\n * every render — this is what lets the control appear the instant a loading session resolves to a\n * logged-in shopper, with no stuck-hidden state (specs/save-card-control.md § NFR-1).\n */\nexport function isSaveCardVisible({ loading, state }: Pick<SessionContextValue, 'loading' | 'state'>): boolean {\n return !loading && state === 'loggedIn';\n}\n\n/**\n * Whether the consent notice should render. Collapses `null` (\"the shopper has never chosen\") and\n * `false` (\"explicitly declined at some point\") into the same \"not yet granted\" outcome — checking\n * the toggle is a new grant either way, from this control's point of view\n * (specs/save-card-control.md Decision 2).\n */\nexport function isConsentNoticeVisible(savePersonalData: boolean | null | undefined): boolean {\n return savePersonalData !== true;\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SaveCardDefinition = defineComponent<SaveCardProps>({\n name: 'SaveCard',\n importPath: '@vtex/faststore/components',\n component: SaveCard,\n fragment,\n fetchStrategy: 'reactive',\n requiresContext: ['payment', 'session'],\n actions: { payment: ['saveCard'] },\n editor: { label: 'Save Card', category: 'commerce' },\n schema: {\n label: { type: 'string', default: 'Save this card for next time', label: 'Toggle label' },\n nicknameLabel: { type: 'string', default: 'Card nickname', label: 'Nickname field label' },\n nicknamePlaceholder: { type: 'string', label: 'Nickname field placeholder' },\n consentNoticeLabel: {\n type: 'string',\n default: 'Checking this also lets us store your personal data for future purchases.',\n label: 'Consent notice label',\n },\n disabled: { type: 'boolean', default: false, label: 'Disabled' },\n },\n guideline:\n 'Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function SaveCard({\n label = 'Save this card for next time',\n nicknameLabel = 'Card nickname',\n nicknamePlaceholder,\n consentNoticeLabel = 'Checking this also lets us store your personal data for future purchases.',\n disabled = false,\n className,\n $data: $dataProp,\n $actions: $actionsProp,\n ...props\n}: SaveCardProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n // Also enforces the SessionRoot ancestor: useSession() throws when rendered outside one.\n const { state, loading } = useSession();\n // Also enforces the PaymentSectionRoot/PaymentSectionController ancestor: usePayment() throws\n // when rendered outside one.\n const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();\n\n const [pending, setPending] = useState(false);\n const [consentError, setConsentError] = useState<string | null>(null);\n\n // Both hooks above are called unconditionally, before this early return, so neither context\n // requirement is skipped depending on the auth state. T191 (FR-7, Decision 3): nothing renders while\n // the card payment is collapsed either; the flag and label stay on `draft` for when it comes back.\n if (cardPaymentCollapsed || !isSaveCardVisible({ loading, state })) return null;\n\n const checked = draft.saveCard ?? false;\n const fieldDisabled = disabled || pending;\n\n async function handleCheckedChange(next: boolean) {\n setDraftSaveCard(next);\n setConsentError(null);\n // Decision 1: unchecking withdraws only this transaction's local intent — no dispatch of any\n // kind, so a standing `savePersonalData` consent an unrelated control granted is never touched.\n if (!next) return;\n\n const saveCard = $actions?.payment?.saveCard;\n // Silent no-op when the action namespace is not injected, mirroring\n // `usePaymentMethodSelection.selectMethod`'s \"no-op (no error, no throw)\" convention — this is a\n // soft, consent-adjacent write, not the PCI-critical submission itself.\n if (!saveCard) return;\n\n setPending(true);\n try {\n const userErrors = await saveCard(true);\n const [firstError] = userErrors;\n if (firstError) setConsentError(firstError.message);\n } finally {\n setPending(false);\n }\n }\n\n function handleNicknameChange(event: ChangeEvent<HTMLInputElement>) {\n const raw = event.target.value.slice(0, NICKNAME_MAX_LENGTH);\n // Normalizes an emptied field to `null`, never `''` — matches `PaymentDraft`'s existing\n // \"always present, null means absent\" idiom for `bin`/`path`.\n setDraftCardLabel(raw.length > 0 ? raw : null);\n }\n\n return (\n <div\n {...props}\n className={className}\n inert={placing}\n aria-disabled={placing || undefined}\n data-fs-save-card=\"\"\n {...(placing ? { 'data-fs-save-card-placing': '' } : {})}\n {...(pending ? { 'data-fs-save-card-pending': '' } : {})}\n >\n <div data-fs-save-card-toggle-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>\n <Checkbox.Root checked={checked} onCheckedChange={handleCheckedChange} disabled={fieldDisabled}>\n <Checkbox.Indicator>\n <Icon name=\"checked\" />\n </Checkbox.Indicator>\n </Checkbox.Root>\n {label}\n </Field.Label>\n </Field.Root>\n {isConsentNoticeVisible($data?.savePersonalData) ? (\n <p data-fs-save-card-consent-notice=\"\">{consentNoticeLabel}</p>\n ) : null}\n </div>\n\n {checked ? (\n <div data-fs-save-card-nickname-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>{nicknameLabel}</Field.Label>\n <Field.Control\n name=\"cardLabel\"\n placeholder={nicknamePlaceholder}\n value={draft.cardLabel ?? ''}\n onChange={handleNicknameChange}\n disabled={fieldDisabled}\n maxLength={NICKNAME_MAX_LENGTH}\n />\n </Field.Root>\n </div>\n ) : null}\n\n {consentError ? (\n <div role=\"alert\" data-fs-save-card-error=\"\">\n {consentError}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"save-card.js","names":[],"sources":["../../../src/matter/save-card/save-card.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ContentValue,\n defineComponent,\n defineContentType,\n type MessageFieldName,\n type MessageLocaleProp,\n} from '@vtex/fs-core';\nimport type { ChangeEvent, ComponentPropsWithRef } from 'react';\nimport { useState } from 'react';\nimport { Checkbox } from '../../particles/checkbox/checkbox.js';\nimport { Field } from '../../particles/field/field.js';\nimport { Icon } from '../../particles/icon/icon.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport { formatErrorCode } from '../../sdk/i18n/format-error-code.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport type { PaymentUserError } from '../../sdk/payment/operations.js';\nimport { usePayment } from '../payment/payment.js';\nimport { type SessionContextValue, useSession } from '../session/session.js';\n\n/**\n * The `SaveCard` matter (specs/save-card-control.md, T10 of the Credit Card epic;\n * docs/features/credit-card/rfc.md § D5). Composes `Checkbox` + `Field` into an opt-in, off-by-default\n * toggle plus a custom nickname field, visible only to an authenticated shopper.\n *\n * Writes exactly two client-only facts T7 already provisioned on `PaymentDraft`\n * (`setDraftSaveCard` / `setDraftCardLabel`, via `usePayment()`) — this component never registers on\n * the submission channel and never calls `sendPayments`. `CardEntry` (T7) folds both facts into the\n * card object at submit time (`card-entry.tsx:639-640`); the saved-card path does NOT, because it\n * submits `{ kind: 'saved', accountId, bin, securityCode }` (`saved-cards.tsx:355`) and\n * `PaymentGatewaySavedCard` (`sdk/payment/gateway.ts:103-111`) declares no field either fact could\n * occupy. So on that path both draft writes are inert while the consent below is still granted\n * account-wide. Checking the toggle grants the account-level data-storage consent a saved card\n * requires (`$actions.payment.saveCard(true)`); unchecking never revokes it — see specs/save-card-control.md Decision 1 for the rationale and the\n * last-write-wins hazard against `SavePersonalDataOptInControl`, which writes the same field.\n *\n * Self-gates on `useSession()` (never `SessionGuard`) and requires BOTH the `payment` and `session`\n * contexts — the first component in this package to declare `requiresContext` as an array (Decision 4).\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching `card-entry.tsx`'s / `payment.tsx`'s convention;\n// the codegen `documents` glob does not scan `src/matter/save-card*`. Deliberately its OWN fragment,\n// never composed under `ClientPreferencesRoot` — that Root's section context is built from a wrapped\n// `$data?.clientPreferences?.savePersonalData` read that is always `false` at runtime for an arity-1\n// fragment (ADR-0015), a live, pre-existing defect this component must not inherit\n// (specs/save-card-control.md Decision 2).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `$data` slice forwarded by the reactive runtime — the unwrapped `ClientPreferences` entity\n * (arity-1 fragment, ADR-0015): the value of the fragment's own `clientPreferences` top-level field,\n * never the wrapping `{ clientPreferences: ... }` shape. Mirrors `card-entry.tsx`'s / `saved-cards.tsx`'s\n * identical arity-1 contract. */\nexport type SaveCardData = {\n savePersonalData?: boolean | null;\n} | null;\n\nexport const SaveCardContent = defineContentType({\n id: 'save-card',\n title: 'Save Card',\n description: 'Copy for the save-card toggle, its consent notice, the nickname field and a refused consent write.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n label: {\n type: 'string',\n title: 'Toggle label',\n format: 'icu-message',\n messageSource: 'Save this card for next time',\n },\n nicknameLabel: {\n type: 'string',\n title: 'Nickname field label',\n description: 'Rendered only while the toggle is checked.',\n format: 'icu-message',\n messageSource: 'Card nickname',\n },\n consentNoticeLabel: {\n type: 'string',\n title: 'Consent notice',\n description: 'Shown beside the toggle until the shopper has granted the save-personal-data consent.',\n format: 'icu-message',\n messageSource: 'Checking this also lets us store your personal data for future purchases.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Consent write failure message',\n description: 'Shown when the consent write fails: a network failure or a fault the shopper cannot fix.',\n format: 'icu-message',\n messageSource: 'Unable to save your card preference. Please try again.',\n },\n },\n },\n});\n\nexport type SaveCardProps = Omit<ComponentPropsWithRef<'div'>, 'children'> &\n MessageLocaleProp & {\n nicknamePlaceholder?: string;\n /** Disables both the toggle and the nickname field. */\n disabled?: boolean;\n /** Merchant-authored copy: the toggle label, the nickname field label, the consent notice and the write error. */\n $content?: ContentValue<typeof SaveCardContent>;\n /** This component's own `clientPreferences` slice (arity-1 fragment, ADR-0015). */\n $data?: SaveCardData;\n /** Compiler-injected action surface; carries `payment.saveCard`. */\n $actions?: ComponentActions;\n };\n\n/** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain\n * HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */\nconst NICKNAME_MAX_LENGTH = 50;\n\n/** The `ClientPreferencesUpdateErrorCode` values plus the client-minted transport failure. */\ntype SaveCardErrorCode = 'MISSING_CART_CONTEXT' | 'CART_NOT_FOUND' | 'NO_PREFERENCE_PROVIDED' | 'NETWORK_ERROR';\n\n/**\n * The message for each code the consent write can return. None is one the shopper can act on, so all share\n * one message, as does a code this map does not know.\n */\nexport const SAVE_CARD_ERROR_FIELDS = {\n MISSING_CART_CONTEXT: 'genericErrorMessage',\n CART_NOT_FOUND: 'genericErrorMessage',\n NO_PREFERENCE_PROVIDED: 'genericErrorMessage',\n NETWORK_ERROR: 'genericErrorMessage',\n} as const satisfies Record<SaveCardErrorCode, MessageFieldName<typeof SaveCardContent>>;\n\n// ---------------------------------------------------------------------------\n// Pure decision functions — exported so the gate and the tri-state collapse are unit-testable\n// independent of any rendering (specs/save-card-control.md § Resolution logic).\n// ---------------------------------------------------------------------------\n\n/**\n * Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —\n * `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this\n * reads correctly today even on `state` alone, but checking `loading` explicitly makes that\n * invariant load-bearing in this component's own code rather than incidental to `session.tsx`'s\n * current implementation. Takes no closure over component state, so it is safe to call fresh on\n * every render — this is what lets the control appear the instant a loading session resolves to a\n * logged-in shopper, with no stuck-hidden state (specs/save-card-control.md § NFR-1).\n */\nexport function isSaveCardVisible({ loading, state }: Pick<SessionContextValue, 'loading' | 'state'>): boolean {\n return !loading && state === 'loggedIn';\n}\n\n/**\n * Whether the consent notice should render. Collapses `null` (\"the shopper has never chosen\") and\n * `false` (\"explicitly declined at some point\") into the same \"not yet granted\" outcome — checking\n * the toggle is a new grant either way, from this control's point of view\n * (specs/save-card-control.md Decision 2).\n */\nexport function isConsentNoticeVisible(savePersonalData: boolean | null | undefined): boolean {\n return savePersonalData !== true;\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SaveCardDefinition = defineComponent<SaveCardProps>({\n name: 'SaveCard',\n importPath: '@vtex/faststore/components',\n component: SaveCard,\n fragment,\n fetchStrategy: 'reactive',\n requiresContext: ['payment', 'session'],\n actions: { payment: ['saveCard'] },\n content: SaveCardContent,\n editor: { label: 'Save Card', category: 'commerce' },\n schema: {\n nicknamePlaceholder: { type: 'string', label: 'Nickname field placeholder' },\n disabled: { type: 'boolean', default: false, label: 'Disabled' },\n },\n guideline:\n 'Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Its copy comes from the $content fields label, nicknameLabel and consentNoticeLabel; a refused consent write shows genericErrorMessage. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function SaveCard({\n nicknamePlaceholder,\n disabled = false,\n className,\n $content,\n $locale,\n $data: $dataProp,\n $actions: $actionsProp,\n ...props\n}: SaveCardProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n const { format } = useMessageFormatter(SaveCardContent, $content);\n // Also enforces the SessionRoot ancestor: useSession() throws when rendered outside one.\n const { state, loading } = useSession();\n // Also enforces the PaymentSectionRoot/PaymentSectionController ancestor: usePayment() throws\n // when rendered outside one.\n const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();\n\n const [pending, setPending] = useState(false);\n const [consentError, setConsentError] = useState<PaymentUserError | null>(null);\n\n // Both hooks above are called unconditionally, before this early return, so neither context\n // requirement is skipped depending on the auth state. T191 (FR-7, Decision 3): nothing renders while\n // the card payment is collapsed either; the flag and label stay on `draft` for when it comes back.\n if (cardPaymentCollapsed || !isSaveCardVisible({ loading, state })) return null;\n\n const checked = draft.saveCard ?? false;\n const fieldDisabled = disabled || pending;\n\n async function handleCheckedChange(next: boolean) {\n setDraftSaveCard(next);\n setConsentError(null);\n // Decision 1: unchecking withdraws only this transaction's local intent — no dispatch of any\n // kind, so a standing `savePersonalData` consent an unrelated control granted is never touched.\n if (!next) return;\n\n const saveCard = $actions?.payment?.saveCard;\n // Silent no-op when the action namespace is not injected, mirroring\n // `usePaymentMethodSelection.selectMethod`'s \"no-op (no error, no throw)\" convention — this is a\n // soft, consent-adjacent write, not the PCI-critical submission itself.\n if (!saveCard) return;\n\n setPending(true);\n try {\n const userErrors = await saveCard(true);\n const [firstError] = userErrors;\n if (firstError) setConsentError(firstError);\n } finally {\n setPending(false);\n }\n }\n\n function handleNicknameChange(event: ChangeEvent<HTMLInputElement>) {\n const raw = event.target.value.slice(0, NICKNAME_MAX_LENGTH);\n // Normalizes an emptied field to `null`, never `''` — matches `PaymentDraft`'s existing\n // \"always present, null means absent\" idiom for `bin`/`path`.\n setDraftCardLabel(raw.length > 0 ? raw : null);\n }\n\n return (\n <div\n {...props}\n className={className}\n inert={placing}\n aria-disabled={placing || undefined}\n data-fs-save-card=\"\"\n {...(placing ? { 'data-fs-save-card-placing': '' } : {})}\n {...(pending ? { 'data-fs-save-card-pending': '' } : {})}\n >\n <div data-fs-save-card-toggle-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>\n <Checkbox.Root checked={checked} onCheckedChange={handleCheckedChange} disabled={fieldDisabled}>\n <Checkbox.Indicator>\n <Icon name=\"checked\" />\n </Checkbox.Indicator>\n </Checkbox.Root>\n {format('label')}\n </Field.Label>\n </Field.Root>\n {isConsentNoticeVisible($data?.savePersonalData) ? (\n <p data-fs-save-card-consent-notice=\"\">{format('consentNoticeLabel')}</p>\n ) : null}\n </div>\n\n {checked ? (\n <div data-fs-save-card-nickname-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>{format('nicknameLabel')}</Field.Label>\n <Field.Control\n name=\"cardLabel\"\n placeholder={nicknamePlaceholder}\n value={draft.cardLabel ?? ''}\n onChange={handleNicknameChange}\n disabled={fieldDisabled}\n maxLength={NICKNAME_MAX_LENGTH}\n />\n </Field.Root>\n </div>\n ) : null}\n\n {consentError ? (\n <div role=\"alert\" data-fs-save-card-error=\"\">\n {formatErrorCode(SaveCardContent, SAVE_CARD_ERROR_FIELDS, consentError, format, 'genericErrorMessage')}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,29 +1,111 @@
|
|
|
1
|
+
import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
|
|
1
2
|
import { ComponentDefinition } from "../../core/dist/define-component.js";
|
|
2
3
|
import "../../core/dist/index.js";
|
|
3
4
|
import { ComponentActions } from "../../sdk/actions/types.js";
|
|
4
5
|
import { ComponentPropsWithRef, ReactNode } from "react";
|
|
5
6
|
//#region src/matter/saved-cards/saved-cards.d.ts
|
|
6
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* The minimal per-row facts `SavedCards` needs to iterate, to dispatch selection, and to tell whether the
|
|
9
|
+
* persisted selection is an expired card (which is never the radio group's value).
|
|
10
|
+
*/
|
|
7
11
|
export type SavedCardsListEntry = Readonly<{
|
|
8
12
|
id: string;
|
|
9
13
|
accountId: string;
|
|
10
14
|
methodId: string;
|
|
11
15
|
bin: string;
|
|
16
|
+
expired: boolean;
|
|
12
17
|
}>;
|
|
13
18
|
export type SavedCardsData = {
|
|
14
19
|
savedCards?: readonly SavedCardsListEntry[];
|
|
15
20
|
} | null;
|
|
16
|
-
export
|
|
21
|
+
export declare const SavedCardsContent: {
|
|
22
|
+
readonly id: "saved-cards";
|
|
23
|
+
readonly title: "Saved Cards";
|
|
24
|
+
readonly description: "Copy for the saved-card group legend and a refused card selection.";
|
|
25
|
+
readonly schema: {
|
|
26
|
+
readonly type: "object";
|
|
27
|
+
readonly additionalProperties: false;
|
|
28
|
+
readonly properties: {
|
|
29
|
+
readonly legend: {
|
|
30
|
+
readonly type: "string";
|
|
31
|
+
readonly title: "Legend";
|
|
32
|
+
readonly description: "The radio group's visible accessible name.";
|
|
33
|
+
readonly format: "icu-message";
|
|
34
|
+
readonly messageSource: "Saved cards";
|
|
35
|
+
};
|
|
36
|
+
readonly savedCardUnavailableMessage: {
|
|
37
|
+
readonly type: "string";
|
|
38
|
+
readonly title: "Saved card unavailable message";
|
|
39
|
+
readonly description: "Shown when the picked saved card can no longer be used.";
|
|
40
|
+
readonly format: "icu-message";
|
|
41
|
+
readonly messageSource: "This saved card is no longer available. Choose another card.";
|
|
42
|
+
};
|
|
43
|
+
readonly genericErrorMessage: {
|
|
44
|
+
readonly type: "string";
|
|
45
|
+
readonly title: "Selection failure message";
|
|
46
|
+
readonly description: "Shown when a card selection fails: a network failure or a fault the shopper cannot fix.";
|
|
47
|
+
readonly format: "icu-message";
|
|
48
|
+
readonly messageSource: "Unable to select this card. Please try again.";
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export declare const SavedCardCvvFieldContent: {
|
|
54
|
+
readonly id: "saved-card-cvv-field";
|
|
55
|
+
readonly title: "Saved Card CVV Field";
|
|
56
|
+
readonly description: "Copy for the security code input of a saved card.";
|
|
57
|
+
readonly schema: {
|
|
58
|
+
readonly type: "object";
|
|
59
|
+
readonly additionalProperties: false;
|
|
60
|
+
readonly properties: {
|
|
61
|
+
readonly securityCodeLabel: {
|
|
62
|
+
readonly type: "string";
|
|
63
|
+
readonly title: "Security code label";
|
|
64
|
+
readonly description: "The input's accessible name; no visible label renders.";
|
|
65
|
+
readonly format: "icu-message";
|
|
66
|
+
readonly messageSource: "Security code";
|
|
67
|
+
};
|
|
68
|
+
readonly securityCodeDescription: {
|
|
69
|
+
readonly type: "string";
|
|
70
|
+
readonly title: "Security code description";
|
|
71
|
+
readonly description: "Helper text linked to the input; blank renders nothing.";
|
|
72
|
+
readonly format: "icu-message";
|
|
73
|
+
readonly messageSource: "The 3-4 digit number on your card";
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export declare const SavedCardRemoveContent: {
|
|
79
|
+
readonly id: "saved-card-remove";
|
|
80
|
+
readonly title: "Saved Card Remove";
|
|
81
|
+
readonly description: "Copy for the remove control of an expired saved card.";
|
|
82
|
+
readonly schema: {
|
|
83
|
+
readonly type: "object";
|
|
84
|
+
readonly additionalProperties: false;
|
|
85
|
+
readonly properties: {
|
|
86
|
+
readonly label: {
|
|
87
|
+
readonly type: "string";
|
|
88
|
+
readonly title: "Label";
|
|
89
|
+
readonly format: "icu-message";
|
|
90
|
+
readonly messageSource: "Remove card";
|
|
91
|
+
};
|
|
92
|
+
readonly failureMessage: {
|
|
93
|
+
readonly type: "string";
|
|
94
|
+
readonly title: "Failure message";
|
|
95
|
+
readonly description: "Rendered when the removal did not complete, never the server's text.";
|
|
96
|
+
readonly format: "icu-message";
|
|
97
|
+
readonly messageSource: "The card was not removed. Please try again.";
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
export type SavedCardsProps = ComponentPropsWithRef<'div'> & MessageLocaleProp & {
|
|
17
103
|
/** Unwrapped `payment` value from the reactive runtime (arity-1 fragment, ADR-0015); `null` until resolved. */
|
|
18
104
|
$data?: SavedCardsData;
|
|
19
105
|
/** The per-row template, typically one `SavedCardOption`, repeated once per saved card. */
|
|
20
106
|
children?: ReactNode;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
* Resolved through `resolveAuthoredCopy`: an authored empty or whitespace-only string falls back to
|
|
24
|
-
* the default rather than rendering a nameless group.
|
|
25
|
-
*/
|
|
26
|
-
legend?: string;
|
|
107
|
+
/** Merchant-authored copy: the radio group's visible legend (T38). */
|
|
108
|
+
$content?: ContentValue<typeof SavedCardsContent>;
|
|
27
109
|
};
|
|
28
110
|
/** The full per-row slice `SavedCardOption` independently resolves via `reactive-list-item`. */
|
|
29
111
|
export type SavedCardOptionSlice = Readonly<{
|
|
@@ -42,26 +124,28 @@ export type SavedCardOptionProps = ComponentPropsWithRef<'div'> & {
|
|
|
42
124
|
/** Typically a `SavedCardCvvField`. */
|
|
43
125
|
children?: ReactNode;
|
|
44
126
|
};
|
|
45
|
-
export type SavedCardCvvFieldProps = ComponentPropsWithRef<'input'> & {
|
|
127
|
+
export type SavedCardCvvFieldProps = ComponentPropsWithRef<'input'> & MessageLocaleProp & {
|
|
46
128
|
/** Compiler-injected action surface; carries `payment.sendPayments`. */
|
|
47
129
|
$actions?: ComponentActions;
|
|
48
130
|
/**
|
|
49
|
-
*
|
|
50
|
-
* is the input's only accessible name
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Helper copy rendered as a sibling `<p>` and linked to the input via `aria-describedby` (this
|
|
55
|
-
* component's root is the input itself, so there is no `Field.Root` to host a `Field.Description` —
|
|
56
|
-
* saved-cards.md Decision 3). An empty string renders nothing. Copy configuration only — never the
|
|
57
|
-
* security code itself.
|
|
131
|
+
* Merchant-authored copy. No visible `<label>` renders (Accessibility Contract), so
|
|
132
|
+
* `securityCodeLabel` is the input's only accessible name. `securityCodeDescription` renders as a
|
|
133
|
+
* sibling `<p>` linked through `aria-describedby` (the root is the input itself, so there is no
|
|
134
|
+
* `Field.Root` to host a `Field.Description` — saved-cards.md Decision 3).
|
|
58
135
|
*/
|
|
59
|
-
|
|
136
|
+
$content?: ContentValue<typeof SavedCardCvvFieldContent>;
|
|
137
|
+
};
|
|
138
|
+
export type SavedCardRemoveProps = Omit<ComponentPropsWithRef<'button'>, 'children'> & MessageLocaleProp & {
|
|
139
|
+
/** Compiler-injected action surface; carries `savedCard.remove`. */
|
|
140
|
+
$actions?: ComponentActions;
|
|
141
|
+
/** Merchant-authored copy: the control's text and the message when the removal did not complete. */
|
|
142
|
+
$content?: ContentValue<typeof SavedCardRemoveContent>;
|
|
60
143
|
};
|
|
61
144
|
export declare const SavedCardsDefinition: ComponentDefinition<SavedCardsProps>;
|
|
62
145
|
export declare const SavedCardOptionDefinition: ComponentDefinition<SavedCardOptionProps>;
|
|
63
146
|
export declare const SavedCardCvvFieldDefinition: ComponentDefinition<SavedCardCvvFieldProps>;
|
|
64
|
-
export declare
|
|
147
|
+
export declare const SavedCardRemoveDefinition: ComponentDefinition<SavedCardRemoveProps>;
|
|
148
|
+
export declare function SavedCards({ $data: $dataProp, $content, $locale, className, children, ...props }: SavedCardsProps): import("react/jsx-runtime").JSX.Element | null;
|
|
65
149
|
export declare function SavedCardOption({ $data: $dataProp, className, children, ...props }: SavedCardOptionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
66
150
|
/**
|
|
67
151
|
* The saved-card path's own client-synthesized refusal (T27, specs/place-order-preflight-card-
|
|
@@ -74,6 +158,14 @@ export declare function SavedCardOption({ $data: $dataProp, className, children,
|
|
|
74
158
|
* `PaymentUserError` (spec NFR-1, Risk R9).
|
|
75
159
|
*/
|
|
76
160
|
export declare const SAVED_CARD_INVALID_SECURITY_CODE = "INVALID_SECURITY_CODE";
|
|
77
|
-
export declare function SavedCardCvvField({ $actions: $actionsProp,
|
|
161
|
+
export declare function SavedCardCvvField({ $actions: $actionsProp, $content, $locale, className, ...props }: SavedCardCvvFieldProps): import("react/jsx-runtime").JSX.Element | null;
|
|
162
|
+
/**
|
|
163
|
+
* Removes an expired saved card (T216). Renders only for a row whose `expired` is the literal `true`. A
|
|
164
|
+
* success evicts the row's `SavedCard` entity, which is what the checkout list reads; the SDK action only
|
|
165
|
+
* updates the account's own `CustomerSavedCards` entity. Anything else, including a missing action, leaves
|
|
166
|
+
* the row and says so with its failureMessage, never the server's message. A caller's `onClick` runs first, and
|
|
167
|
+
* calling `event.preventDefault()` there cancels the removal.
|
|
168
|
+
*/
|
|
169
|
+
export declare function SavedCardRemove({ $actions: $actionsProp, $content, $locale, className, onClick, ...props }: SavedCardRemoveProps): import("react/jsx-runtime").JSX.Element | null;
|
|
78
170
|
//#endregion
|
|
79
171
|
//# sourceMappingURL=saved-cards.d.ts.map
|