@reblu/site-blocks 0.30.0 → 0.32.0

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.d.ts CHANGED
@@ -1,11 +1,12 @@
1
- import { ShopErrorCode, AcademyCourseDetail, AcademyLessonPreview, PageDetail, PageListItem, ProfessionalField, ShopProductListItem, ShopProductTrustIcon, ShopProductTrustItem, TrustBadgeType, TrustBadge, BlockType, PageBlock, ResolvedEmbed, ShopFacets, AcademyInstructorPublic, AcademyCategoryPublic, AcademyCatalogFiltersPublic, ShopBundleComponent, ShopStaffAutoDiscount, ShopOrder, ShopBillingInput, ShopCheckoutInput, ShopCheckoutDeliveryConfig, ShopCheckoutCopy, ShopFulfillmentInput, ShopQuote, Config, ShopOrderInvoice } from '@reblu/site-contracts';
1
+ import { ShopErrorCode, AcademyCourseDetail, AcademyLessonPreview, PageDetail, PageListItem, ProfessionalField, ShopProductListItem, ShopProductTrustIcon, ShopProductTrustItem, TrustBadgeType, TrustBadge, Review, BlockType, PageBlock, ResolvedEmbed, BeforeAfterData, CardIcon, IconCardsData, ImageTextData, ShopFacets, AcademyInstructorPublic, AcademyCategoryPublic, AcademyCatalogFiltersPublic, ShopBundleComponent, ShopStaffAutoDiscount, ShopOrder, ShopCheckoutDeliveryConfig, ShopCheckoutCopy, ShopFulfillmentInput, ShopQuote, ShopCheckoutInput, AcademyCheckoutRequest, Config, ShopOrderInvoice } from '@reblu/site-contracts';
2
2
  export { DATA_REQUEST_TYPES } from '@reblu/site-contracts';
3
3
  import { FaqItem } from './seo.js';
4
4
  export { FaqPageJsonLd, MarkdownToPlainTextOptions, buildFaqPageJsonLd, collectFaqItems, markdownToPlainText } from './seo.js';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import * as React$1 from 'react';
7
7
  import { ReactNode, ComponentType, FormEvent } from 'react';
8
- import { H as HeadingLevel } from './_heading-BsNbc1wc.js';
8
+ import { H as HeadingLevel, a as FullInvoiceValue } from './full-invoice-fields-DMX0sjPG.js';
9
+ export { b as CheckoutTermsAcceptance, c as CheckoutTermsAcceptanceProps, C as CheckoutTermsCopy, D as DEFAULT_INVOICE_COUNTRIES, E as EMPTY_FULL_INVOICE_VALUE, d as FullInvoiceErrors, e as FullInvoiceFields, F as FullInvoiceFieldsLabels, f as FullInvoiceFieldsProps, g as FullInvoiceIdType, i as isOverSimplifiedInvoiceCap, s as shopIssuesInvoices, t as toCheckoutInvoiceFields, h as toCheckoutTermsFields } from './full-invoice-fields-DMX0sjPG.js';
9
10
 
10
11
  declare function readingTime(content: string | null | undefined): number | null;
11
12
 
@@ -775,6 +776,62 @@ interface ArbitrationBadgeProps {
775
776
  }
776
777
  declare function ArbitrationBadge({ badges, numberLabel, showNumber, newWindowLabel, className, logoClassName, numberClassName, }: ArbitrationBadgeProps): react_jsx_runtime.JSX.Element | null;
777
778
 
779
+ /**
780
+ * `Reviews` — the tenant's published, verifiable reviews from
781
+ * `client.reviews.list()` (REB-1272): a responsive grid of cards with the
782
+ * star rating, the text, the author, the date and a «Ver en <fuente>» link to
783
+ * the original review. Publishing, hiding or reordering in nexus changes the
784
+ * SITE on the next revalidation, with no deploy.
785
+ *
786
+ * Server Component, RSC-safe: no hooks, no state, no `'use client'`.
787
+ *
788
+ * Semantics:
789
+ * - `null`, `undefined`, a non-array or `[]` render NOTHING (no heading, no
790
+ * notice): a SITE never shows an empty «Reseñas» section.
791
+ * - A review is shown only if it can be checked: an `https://` link to the
792
+ * original, a rating of 1 to 5 and an author. Anything else is skipped.
793
+ * - A star-only review (`text: null`) renders without a quote.
794
+ * - Stars are one `role="img"` labelled «N de 5 estrellas»; the icons are
795
+ * decorative.
796
+ * - The link opens in a new tab with `rel="noopener nofollow"` and a visually
797
+ * hidden new-tab hint.
798
+ * - `notice` is the tenant's short text on how reviews are checked (Spanish
799
+ * consumer law asks a business showing reviews to say so), shown below the
800
+ * grid, or above it with `noticePosition='above'`.
801
+ * - `heading` wraps everything in a `<section>` labelled by it.
802
+ */
803
+ interface ReviewsProps {
804
+ /** `client.reviews.list()`'s `data` as served — may be `null` / `undefined`. */
805
+ reviews: readonly Review[] | null | undefined;
806
+ /** Optional section title, e.g. «Reseñas verificadas». */
807
+ heading?: ReactNode;
808
+ /** `id` of the section heading (the section's `aria-labelledby`). @default 'reviews-heading' */
809
+ headingId?: string;
810
+ /** Level of the section heading. @default 2 */
811
+ headingLevel?: HeadingLevel;
812
+ /** The tenant's notice on how the reviews are checked. Omitted: no notice. */
813
+ notice?: ReactNode;
814
+ /** Where the notice goes. @default 'below' */
815
+ noticePosition?: 'above' | 'below';
816
+ /** Link text for a review's original. @default (name) => `Ver en ${name}` */
817
+ linkLabel?: (sourceName: string) => string;
818
+ /** Visually hidden text appended to each link. */
819
+ newWindowLabel?: string;
820
+ /** Locale of the review date. @default 'es-ES' */
821
+ locale?: string;
822
+ /** Classes for the root element. */
823
+ className?: string;
824
+ /** Classes for the section heading; they REPLACE the default typography (REB-997). */
825
+ headingClassName?: string;
826
+ /** Classes for the `<ul>` grid; they REPLACE the default columns. */
827
+ gridClassName?: string;
828
+ /** Classes for each card. */
829
+ cardClassName?: string;
830
+ /** Classes for the notice; they REPLACE the default typography. */
831
+ noticeClassName?: string;
832
+ }
833
+ declare function Reviews({ reviews, heading, headingId, headingLevel, notice, noticePosition, linkLabel, newWindowLabel, locale, className, headingClassName, gridClassName, cardClassName, noticeClassName, }: ReviewsProps): react_jsx_runtime.JSX.Element | null;
834
+
778
835
  /**
779
836
  * REB-850 — `PageBlocks`: the shared renderer for a page's registry blocks
780
837
  * (`PageDetail.blocks`, REB-75), so a SITE stops hand-writing its own.
@@ -816,6 +873,13 @@ interface BlockRendererProps<T extends CanonicalBlockType> {
816
873
  headingLevel: HeadingLevel;
817
874
  /** Builds an embed's href (the `embedHref` prop, or the default `/${slug}`). */
818
875
  embedHref: (resolved: ResolvedEmbed) => string;
876
+ /**
877
+ * REB-1268 — set only for block types that draw the SECTION heading
878
+ * themselves (`image_text`, whose heading sits beside the image): the id the
879
+ * section's `aria-labelledby` points at. `headingLevel` is then the section
880
+ * heading's own level. Undefined for every other block type.
881
+ */
882
+ headingId?: string;
819
883
  }
820
884
  /** Per-block-type renderer overrides, keyed by canonical type. */
821
885
  type PageBlocksComponents = Partial<{
@@ -840,6 +904,94 @@ interface PageBlocksProps {
840
904
  }
841
905
  declare function PageBlocks({ blocks, components, headingLevel, embedHref, idPrefix, className, sectionClassName, }: PageBlocksProps): react_jsx_runtime.JSX.Element | null;
842
906
 
907
+ /**
908
+ * REB-1265..1268 — drop-in components for the content blocks a tenant
909
+ * authors in the nexus page editor. Each one takes the block's `data` fields
910
+ * as props, so a SITE can use it inside `PageBlocks` (the default renderer for
911
+ * its block type) or on its own, anywhere.
912
+ *
913
+ * Server Components: no hooks, no `'use client'`. Colours come from theme
914
+ * tokens only; every image is lazy-loaded. The platform ships no tenant copy:
915
+ * the only built-in strings are neutral UI labels, each overridable.
916
+ */
917
+ /** Labels over each image of a pair. Override them for another language. */
918
+ declare const DEFAULT_BEFORE_AFTER_LABELS: Readonly<{
919
+ before: "Antes";
920
+ after: "Después";
921
+ }>;
922
+ interface BeforeAfterPairsProps {
923
+ /** The `before_after` block's `data.pairs`. */
924
+ pairs: BeforeAfterData['pairs'];
925
+ /** The `data.showCaption` toggle. The caption renders only when this is `true`. */
926
+ showCaption?: boolean;
927
+ /** The `data.caption` — free tenant text, shown under the pairs as written. */
928
+ caption?: string;
929
+ labels?: {
930
+ before: string;
931
+ after: string;
932
+ };
933
+ className?: string;
934
+ }
935
+ /**
936
+ * Before/after image pairs. Each pair stacks on mobile and sits side by side
937
+ * from `sm`; pairs flow two per row from `lg`. The caption renders only when
938
+ * `showCaption` is true AND the text is not blank — there is no default text.
939
+ */
940
+ declare function BeforeAfterPairs({ pairs, showCaption, caption, labels, className, }: BeforeAfterPairsProps): react_jsx_runtime.JSX.Element | null;
941
+ interface ChipListProps {
942
+ /** The `chips` block's `data.items` — short texts. Blank ones are skipped. */
943
+ items: readonly string[];
944
+ className?: string;
945
+ }
946
+ /** A short list of texts shown as chips that wrap onto new lines on small screens. */
947
+ declare function ChipList({ items, className }: ChipListProps): react_jsx_runtime.JSX.Element | null;
948
+ /** Every icon name this version can draw — the curated `icon_cards` set. */
949
+ declare const CARD_ICON_NAMES: readonly CardIcon[];
950
+ /** One curated icon as an inline SVG in `currentColor`; an unknown name draws nothing. */
951
+ declare function CardIconSvg({ icon, className }: {
952
+ icon: string;
953
+ className?: string;
954
+ }): react_jsx_runtime.JSX.Element | null;
955
+ interface IconCardGridProps {
956
+ /** The `icon_cards` block's `data.items`. */
957
+ items: IconCardsData['items'];
958
+ /** The `data.intro` — a line above the grid. */
959
+ intro?: string;
960
+ /** Level of each card title. Default `3` (under a section `h2`). */
961
+ headingLevel?: HeadingLevel;
962
+ className?: string;
963
+ }
964
+ /**
965
+ * Cards with an icon, a title and a short text, in a responsive grid: one
966
+ * column on mobile, two from `sm`, three from `lg`. An icon name this version
967
+ * does not know renders the card without an icon (fail-closed).
968
+ */
969
+ declare function IconCardGrid({ items, intro, headingLevel, className }: IconCardGridProps): react_jsx_runtime.JSX.Element | null;
970
+ interface ImageTextSplitProps {
971
+ imageUrl: string;
972
+ alt?: string;
973
+ /** Side of the image from `md` up. */
974
+ imageSide: ImageTextData['imageSide'];
975
+ /** What comes first when stacked on mobile. Default `'image_first'`. */
976
+ mobileOrder?: ImageTextData['mobileOrder'];
977
+ /** Rich text (`data.html`) — sanitised here. */
978
+ html?: string;
979
+ kicker?: string;
980
+ /** Heading drawn at the top of the text column. */
981
+ heading?: string | null;
982
+ /** Level of `heading`. Default `2`. Headings inside `html` nest below it. */
983
+ headingLevel?: HeadingLevel;
984
+ /** `id` on the heading text, for an `aria-labelledby` on the caller's section. */
985
+ headingId?: string;
986
+ className?: string;
987
+ }
988
+ /**
989
+ * An image beside rich text. Stacked on mobile (image first unless
990
+ * `mobileOrder='text_first'`), side by side from `md` with the image on
991
+ * `imageSide`. The kicker and heading sit in the text column.
992
+ */
993
+ declare function ImageTextSplit({ imageUrl, alt, imageSide, mobileOrder, html, kicker, heading, headingLevel, headingId, className, }: ImageTextSplitProps): react_jsx_runtime.JSX.Element;
994
+
843
995
  /**
844
996
  * `ShopFilters` — plug-and-play SITE filter chrome over `GET /api/site/shop/facets`
845
997
  * (REB-809). Which axes appear, their order and labels come entirely from
@@ -1440,7 +1592,14 @@ interface OrderConfirmationLabels {
1440
1592
  pollingTitle: string;
1441
1593
  pollingDescription: string;
1442
1594
  foundTitle: string;
1595
+ /**
1596
+ * The confirmed-order line. `{number}` is replaced by the order number and
1597
+ * `{email}` by the buyer's email (REB-1200). When it carries `{email}`, the
1598
+ * separate «Te hemos enviado un email de confirmación a…» line is not shown.
1599
+ */
1443
1600
  foundDescription: string;
1601
+ /** REB-1200 — the confirmed line while the order itself is not loaded yet. */
1602
+ foundWithoutOrderDescription: string;
1444
1603
  timeoutTitle: string;
1445
1604
  timeoutDescription: string;
1446
1605
  orderNumberLabel: string;
@@ -1485,102 +1644,6 @@ interface OrderConfirmationProps {
1485
1644
  }
1486
1645
  declare function OrderConfirmation({ status, order, sessionId, cartHref, onRecheck, labels, currencyCode, locale, className, }: OrderConfirmationProps): react_jsx_runtime.JSX.Element;
1487
1646
 
1488
- /**
1489
- * `FullInvoiceFields` — the shop checkout's full-invoice request, drop-in
1490
- * (REB-73). Fully controlled (`value`/`onChange`), no hooks, no fetch: the
1491
- * SITE owns the state and sends `toCheckoutInvoiceFields(value, overCap)`
1492
- * with its checkout body.
1493
- *
1494
- * The rule it presents (owner decision 15-Oct-2026): «Si quieren factura
1495
- * completa, si o si deben aportar el NIF, si no lo aportan se emite factura
1496
- * simplificada». The identifier is a Spanish NIF/NIE/CIF or, for a foreign
1497
- * buyer, an EU VAT id, a passport or an ID document of their country — with
1498
- * the country that issued it. Over the shop's simplified-invoice cap
1499
- * (`ShopConfig.simplifiedInvoiceCapCents`, see `isOverSimplifiedInvoiceCap`)
1500
- * a full invoice is the only legal one: pass `overCap` and the fields become
1501
- * required, without a toggle. The server validates the identifier and
1502
- * refuses with `BILLING_DATA_REQUIRED` what this form cannot prevent.
1503
- *
1504
- * A shop that issues no invoices (`ShopConfig.simplifiedInvoiceCapCents` is
1505
- * `null`, see `shopIssuesInvoices`) offers no opt-in: pass
1506
- * `issuesInvoices={false}` and the block renders nothing — the server would
1507
- * refuse `wantsFullInvoice: true` with `FULL_INVOICE_UNAVAILABLE`.
1508
- */
1509
- type FullInvoiceIdType = NonNullable<ShopBillingInput['billingIdType']>;
1510
- interface FullInvoiceValue {
1511
- wantsFullInvoice: boolean;
1512
- billingIdType: FullInvoiceIdType;
1513
- /** ISO 3166-1 alpha-2 country that issued a foreign document. */
1514
- billingIdCountry: string;
1515
- billingNif: string;
1516
- billingName: string;
1517
- street: string;
1518
- postalCode: string;
1519
- city: string;
1520
- /** ISO 3166-1 alpha-2 country of the billing address. */
1521
- country: string;
1522
- }
1523
- declare const EMPTY_FULL_INVOICE_VALUE: FullInvoiceValue;
1524
- type FullInvoiceErrors = Partial<Record<'billingIdType' | 'billingIdCountry' | 'billingNif' | 'billingName' | 'address', string>>;
1525
- interface FullInvoiceFieldsLabels {
1526
- toggle: string;
1527
- underCapNotice: string;
1528
- overCapNotice: string;
1529
- idType: string;
1530
- idCountry: string;
1531
- chooseCountry: string;
1532
- spanishNif: string;
1533
- documentNumber: string;
1534
- name: string;
1535
- street: string;
1536
- postalCode: string;
1537
- city: string;
1538
- country: string;
1539
- idTypeOptions: Record<FullInvoiceIdType, string>;
1540
- }
1541
- /** ISO 3166-1 alpha-2 countries offered by default: Spain, the EU and frequent others. */
1542
- declare const DEFAULT_INVOICE_COUNTRIES: ReadonlyArray<{
1543
- code: string;
1544
- name: string;
1545
- }>;
1546
- /**
1547
- * Whether the shop issues invoices at all, read from the field the contract
1548
- * defines for it: `ShopConfig.simplifiedInvoiceCapCents` is the effective cap
1549
- * while invoicing is on and `null` otherwise (absent on an older base-api,
1550
- * which accepts no opt-in either).
1551
- */
1552
- declare function shopIssuesInvoices(config: {
1553
- simplifiedInvoiceCapCents?: number | null;
1554
- }): boolean;
1555
- /** Whether a cart total (cents) is over the shop's simplified-invoice cap; `null` cap = no gate. */
1556
- declare function isOverSimplifiedInvoiceCap(totalCents: number, capCents: number | null): boolean;
1557
- /**
1558
- * The checkout body fields for the request: `wantsFullInvoice` and the
1559
- * `billing` block (identifier, its type and country, name and address). Empty
1560
- * when the buyer asks for no full invoice within the cap, and always empty
1561
- * when the shop issues no invoices (`issuesInvoices` false).
1562
- */
1563
- declare function toCheckoutInvoiceFields(value: FullInvoiceValue, overCap: boolean, issuesInvoices?: boolean): Pick<ShopCheckoutInput, 'wantsFullInvoice' | 'billing'>;
1564
- interface FullInvoiceFieldsProps {
1565
- value: FullInvoiceValue;
1566
- onChange: (next: FullInvoiceValue) => void;
1567
- /** The cart total is over `ShopConfig.simplifiedInvoiceCapCents`. */
1568
- overCap: boolean;
1569
- /**
1570
- * `false` when the shop issues no invoices (`shopIssuesInvoices(config)`):
1571
- * the block renders nothing. Defaults to `true`.
1572
- */
1573
- issuesInvoices?: boolean;
1574
- errors?: FullInvoiceErrors;
1575
- countries?: ReadonlyArray<{
1576
- code: string;
1577
- name: string;
1578
- }>;
1579
- labels?: Partial<FullInvoiceFieldsLabels>;
1580
- className?: string;
1581
- }
1582
- declare function FullInvoiceFields({ value, onChange, overCap, issuesInvoices, errors, countries, labels, className, }: FullInvoiceFieldsProps): react_jsx_runtime.JSX.Element | null;
1583
-
1584
1647
  /** The shipping address fields the buyer types (country defaults server-side). */
1585
1648
  interface CheckoutAddressValue {
1586
1649
  firstName: string;
@@ -1648,6 +1711,15 @@ declare function CheckoutDeliveryChoice({ delivery, copy, value, onChange, addre
1648
1711
  * neither, or against an API that predates the delivery config.
1649
1712
  */
1650
1713
  declare function defaultCheckoutFulfillment(delivery: ShopCheckoutDeliveryConfig | null | undefined): ShopFulfillmentInput | null;
1714
+ /**
1715
+ * Whether the delivery choice can be quoted (REB-1276): pickup needs a point.
1716
+ * Pass `null` to `useShopQuote` while this is `false` — the quote would only
1717
+ * answer 422 `PICKUP_LOCATION_INVALID` — and show
1718
+ * `CheckoutQuoteNotice` (see `checkoutQuoteNotice`) instead of the total.
1719
+ * `requiresDelivery = false` (a cart with nothing to ship) is always complete:
1720
+ * {@link toCheckoutFulfillmentFields} sends no pickup point for it.
1721
+ */
1722
+ declare function isCheckoutDeliveryComplete(value: ShopFulfillmentInput | null, requiresDelivery?: boolean): boolean;
1651
1723
  /** Whether the cart has something to deliver; `true` until a quote says otherwise. */
1652
1724
  declare function quoteRequiresDelivery(quote: Pick<ShopQuote, 'lines'> | null | undefined): boolean;
1653
1725
  /**
@@ -1707,43 +1779,44 @@ interface CheckoutQuoteSummaryProps {
1707
1779
  * line kinds, the estimate) come from the API; `labels` replaces the rest.
1708
1780
  */
1709
1781
  declare function CheckoutQuoteSummary({ quote, heading, headingLevel, labels, currencyCode, locale, className, }: CheckoutQuoteSummaryProps): react_jsx_runtime.JSX.Element;
1710
-
1782
+ /** Why the summary shows a notice instead of a total (REB-1276). */
1783
+ type CheckoutQuoteNoticeReason = 'PICKUP_LOCATION_REQUIRED';
1784
+ /** SDK texts of {@link CheckoutQuoteNotice}. */
1785
+ interface CheckoutQuoteNoticeLabels {
1786
+ pickupLocationRequired: string;
1787
+ }
1788
+ declare const DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS: CheckoutQuoteNoticeLabels;
1789
+ interface CheckoutQuoteNoticeInput {
1790
+ /** The current delivery choice. */
1791
+ fulfillment: ShopFulfillmentInput | null;
1792
+ /** `quoteRequiresDelivery(quote)`. @default true */
1793
+ requiresDelivery?: boolean;
1794
+ /** `useShopQuote().error` — only its `code` is read. */
1795
+ error?: {
1796
+ code: string | null;
1797
+ } | null;
1798
+ }
1711
1799
  /**
1712
- * `CheckoutTermsAcceptance` (REB-1198) — the mandatory, unticked box «He leído
1713
- * y acepto las {terms} de {tenant}» of the single-step checkout. Every text is
1714
- * the tenant's (`ShopConfig.checkout`, edited in nexus › Configuración ›
1715
- * Legal): `{terms}` becomes the link to the full document (text
1716
- * `termsLinkText`, target `termsLinkUrl` or the SITE's own `termsHref`, a new
1717
- * tab when `isTermsLinkNewTab`), `{tenant}` the site name. A label without
1718
- * `{terms}` gets the link appended.
1719
- *
1720
- * Renders nothing while the tenant has published no terms
1721
- * (`termsVersion: null`): there is nothing to accept and checkout does not
1722
- * ask. Send {@link toCheckoutTermsFields} with the checkout body; the server
1723
- * refuses without it (`TERMS_NOT_ACCEPTED`) or with an old version
1724
- * (`TERMS_VERSION_CHANGED`: reload the config and ask again).
1800
+ * The notice the summary shows instead of a total (REB-1276), or `null`:
1801
+ * a pickup choice with no point, and the quote error `PICKUP_LOCATION_INVALID`
1802
+ * (e.g. the point was deactivated meanwhile), both read «Elige un punto de
1803
+ * recogida» — never the generic «could not compute the total». Any other
1804
+ * error is left to the SITE (`null`).
1725
1805
  */
1726
- type CheckoutTermsCopy = Pick<ShopCheckoutCopy, 'tenantName' | 'termsCheckboxLabel' | 'termsLinkText' | 'termsLinkUrl' | 'isTermsLinkNewTab' | 'termsVersion'>;
1727
- interface CheckoutTermsAcceptanceProps {
1728
- copy: CheckoutTermsCopy;
1729
- /** The SITE's route to its terms page, used when the tenant set no `termsLinkUrl`. */
1730
- termsHref: string;
1731
- checked: boolean;
1732
- onCheckedChange: (checked: boolean) => void;
1733
- /** E.g. «Debes aceptar las condiciones para continuar.» (the SITE's or the API's text). */
1734
- error?: string | null;
1735
- /** Appended inside the link when it opens a new tab (screen readers). @default '(se abre en una pestaña nueva)' */
1736
- newTabHint?: string;
1737
- /** The checkbox id (one box per page). @default 'checkout-terms' */
1738
- id?: string;
1806
+ declare function checkoutQuoteNotice({ fulfillment, requiresDelivery, error, }: CheckoutQuoteNoticeInput): CheckoutQuoteNoticeReason | null;
1807
+ interface CheckoutQuoteNoticeProps {
1808
+ /** `checkoutQuoteNotice(...)`; `null` renders nothing. */
1809
+ reason: CheckoutQuoteNoticeReason | null;
1810
+ labels?: Partial<CheckoutQuoteNoticeLabels>;
1739
1811
  className?: string;
1740
1812
  }
1741
- declare function CheckoutTermsAcceptance({ copy, termsHref, checked, onCheckedChange, error, newTabHint, id, className, }: CheckoutTermsAcceptanceProps): react_jsx_runtime.JSX.Element | null;
1742
1813
  /**
1743
- * The checkout body fields for the terms box: `acceptsTerms` and the version
1744
- * shown (`termsVersionId`), or nothing when the tenant published no terms.
1814
+ * `CheckoutQuoteNotice` (REB-1276) — what the summary says while the order
1815
+ * cannot be quoted yet: «Elige un punto de recogida». Render it in place of
1816
+ * `CheckoutQuoteSummary` and of the total error. A polite `role=status`: it
1817
+ * asks for a choice, it does not report a failure. Presentational, RSC-safe.
1745
1818
  */
1746
- declare function toCheckoutTermsFields(copy: Pick<ShopCheckoutCopy, 'termsVersion'> | null | undefined, accepted: boolean): Pick<ShopCheckoutInput, 'acceptsTerms' | 'termsVersionId'>;
1819
+ declare function CheckoutQuoteNotice({ reason, labels, className }: CheckoutQuoteNoticeProps): react_jsx_runtime.JSX.Element | null;
1747
1820
 
1748
1821
  /**
1749
1822
  * `CheckoutPayAction` (REB-1198) — the last control of the single-step
@@ -1773,6 +1846,26 @@ interface CheckoutPayActionProps {
1773
1846
  }
1774
1847
  declare function CheckoutPayAction({ label, notice, submitting, submittingLabel, disabled, id, className, buttonClassName, noticeClassName, }: CheckoutPayActionProps): react_jsx_runtime.JSX.Element;
1775
1848
 
1849
+ /**
1850
+ * REB-1264 — pure, RSC-safe helpers of the guest course checkout
1851
+ * (`CourseGuestCheckoutForm`, `@reblu/site-blocks/client`). They ship from
1852
+ * the root entry so a Server Component can call them.
1853
+ */
1854
+ /**
1855
+ * Whether the course is bought in one step by a guest
1856
+ * (`POST /api/site/academy/checkout`): on sale, needing no validation and not
1857
+ * free. Otherwise keep the enrollment request flow. The server decides in the
1858
+ * end — it answers `ENROLLMENT_REQUEST_REQUIRED` when this is out of date.
1859
+ */
1860
+ declare function courseSellsAsGuest(course: Pick<AcademyCourseDetail, 'salesEnabled' | 'requiresValidation' | 'priceCents'>): boolean;
1861
+ /**
1862
+ * The guest checkout body fields for the full-invoice request — the academy
1863
+ * twin of `toCheckoutInvoiceFields` (its `billingAddress` has no
1864
+ * first/last name). Empty when the buyer asks for no full invoice within the
1865
+ * cap, and always empty when the tenant issues no invoices.
1866
+ */
1867
+ declare function toAcademyCheckoutInvoiceFields(value: FullInvoiceValue, overCap: boolean, issuesInvoices?: boolean): Pick<AcademyCheckoutRequest, 'wantsFullInvoice' | 'billing'>;
1868
+
1776
1869
  /**
1777
1870
  * `ContactInterestField` — the contact form's tenant-configurable interest
1778
1871
  * question, drop-in (REB-759). Fully controlled (`value`/`onChange`), no hooks,
@@ -1822,4 +1915,4 @@ interface OrderInvoiceLinkProps {
1822
1915
  }
1823
1916
  declare function OrderInvoiceLink({ invoice, labels, className }: OrderInvoiceLinkProps): react_jsx_runtime.JSX.Element | null;
1824
1917
 
1825
- export { ALLOWED_YOUTUBE_HOSTS, AddedToCartToast, type AddedToCartToastLabels, type AddedToCartToastProps, type AddedToCartToastStatus, ArbitrationBadge, type ArbitrationBadgeProps, type BlockRendererProps, type CanonicalBlockType, type CartAdjustmentLine, CartAdjustmentsNotice, type CartAdjustmentsNoticeLabels, type CartAdjustmentsNoticeProps, CartLineIncludes, type CartLineIncludesEntry, type CartLineIncludesProps, type CartLineItemView, CartLineList, type CartLineListLabels, type CartLineListProps, CartSummary, type CartSummaryLabels, type CartSummaryProps, type CheckoutAddressErrors, type CheckoutAddressValue, type CheckoutAppliedDiscount, type CheckoutContactErrors, type CheckoutContactValues, CheckoutDeliveryChoice, type CheckoutDeliveryChoiceLabels, type CheckoutDeliveryChoiceProps, CheckoutForm, type CheckoutFormLabels, type CheckoutFormProps, CheckoutLoginPrompt, type CheckoutLoginPromptLabels, type CheckoutLoginPromptProps, CheckoutPayAction, type CheckoutPayActionProps, CheckoutQuoteSummary, type CheckoutQuoteSummaryLabels, type CheckoutQuoteSummaryProps, CheckoutTermsAcceptance, type CheckoutTermsAcceptanceProps, type CheckoutTermsCopy, type ContactInterest, ContactInterestField, type ContactInterestFieldProps, CourseCatalogFilters, type CourseCatalogFiltersActive, type CourseCatalogFiltersHrefs, type CourseCatalogFiltersLabels, type CourseCatalogFiltersProps, type CourseCatalogPriceBand, CourseDescription, type CourseDescriptionProps, CoursePurchaseTerms, type CoursePurchaseTermsLabels, type CoursePurchaseTermsProps, DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS, DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS, DEFAULT_COURSE_CATALOG_FILTERS_LABELS, DEFAULT_COURSE_PRICE_BANDS, DEFAULT_COURSE_PURCHASE_TERMS_LABELS, DEFAULT_INVOICE_COUNTRIES, DEFAULT_LESSON_PREVIEW_LABELS, DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE, DEFAULT_SHOP_ERROR_MESSAGES, DEFAULT_SHOP_PRICE_BANDS, DEFAULT_TRUST_BADGE_HEADINGS, DEFAULT_TRUST_BADGE_TYPE_ORDER, DEFAULT_TRUST_ICONS, EMPTY_CHECKOUT_ADDRESS, EMPTY_FULL_INVOICE_VALUE, FaqAccordion, type FaqAccordionProps, FaqItem, type FullInvoiceErrors, FullInvoiceFields, type FullInvoiceFieldsLabels, type FullInvoiceFieldsProps, type FullInvoiceIdType, type FullInvoiceValue, HeadingLevel, LegalDocument, type LegalDocumentProps, LessonPreview, type LessonPreviewLabels, type LessonPreviewProps, type MarkdownImageOptions, MarkdownRenderer, type MarkdownRendererProps, OrderConfirmation, type OrderConfirmationLabels, type OrderConfirmationOrder, type OrderConfirmationProps, type OrderConfirmationStatus, OrderInvoiceLink, type OrderInvoiceLinkLabels, type OrderInvoiceLinkProps, PageBlocks, type PageBlocksComponents, type PageBlocksProps, PageCardGrid, type PageCardGridProps, ParentPage, type ParentPageProps, ProductCard, type ProductCardProps, ProductTrustItems, type ProductTrustItemsProps, ProfessionalFields, type ProfessionalFieldsProps, ProfileCard, type ProfileCardProps, type RenderableBlock, SafeHtml, type SafeHtmlProps, type ShareUrls, type ShopFilterPriceBand, ShopFilters, type ShopFiltersActive, type ShopFiltersHrefs, type ShopFiltersLabels, type ShopFiltersProps, Specialty, type SpecialtyProps, Treatment, type TreatmentProps, TrustBadges, type TrustBadgesProps, type TrustIconComponent, type TrustIconProps, buildShareUrls, bundleComponentsToIncludes, defaultCheckoutFulfillment, formatPrice, getShopErrorMessage, isAllowedYouTubeHost, isOverSimplifiedInvoiceCap, markdownToSafeHtml, quoteRequiresDelivery, readingTime, sanitizeHtml, shopIssuesInvoices, shouldRenderShopFilters, toCheckoutFulfillmentFields, toCheckoutInvoiceFields, toCheckoutTermsFields };
1918
+ export { ALLOWED_YOUTUBE_HOSTS, AddedToCartToast, type AddedToCartToastLabels, type AddedToCartToastProps, type AddedToCartToastStatus, ArbitrationBadge, type ArbitrationBadgeProps, BeforeAfterPairs, type BeforeAfterPairsProps, type BlockRendererProps, CARD_ICON_NAMES, type CanonicalBlockType, CardIconSvg, type CartAdjustmentLine, CartAdjustmentsNotice, type CartAdjustmentsNoticeLabels, type CartAdjustmentsNoticeProps, CartLineIncludes, type CartLineIncludesEntry, type CartLineIncludesProps, type CartLineItemView, CartLineList, type CartLineListLabels, type CartLineListProps, CartSummary, type CartSummaryLabels, type CartSummaryProps, type CheckoutAddressErrors, type CheckoutAddressValue, type CheckoutAppliedDiscount, type CheckoutContactErrors, type CheckoutContactValues, CheckoutDeliveryChoice, type CheckoutDeliveryChoiceLabels, type CheckoutDeliveryChoiceProps, CheckoutForm, type CheckoutFormLabels, type CheckoutFormProps, CheckoutLoginPrompt, type CheckoutLoginPromptLabels, type CheckoutLoginPromptProps, CheckoutPayAction, type CheckoutPayActionProps, CheckoutQuoteNotice, type CheckoutQuoteNoticeInput, type CheckoutQuoteNoticeLabels, type CheckoutQuoteNoticeProps, type CheckoutQuoteNoticeReason, CheckoutQuoteSummary, type CheckoutQuoteSummaryLabels, type CheckoutQuoteSummaryProps, ChipList, type ChipListProps, type ContactInterest, ContactInterestField, type ContactInterestFieldProps, CourseCatalogFilters, type CourseCatalogFiltersActive, type CourseCatalogFiltersHrefs, type CourseCatalogFiltersLabels, type CourseCatalogFiltersProps, type CourseCatalogPriceBand, CourseDescription, type CourseDescriptionProps, CoursePurchaseTerms, type CoursePurchaseTermsLabels, type CoursePurchaseTermsProps, DEFAULT_BEFORE_AFTER_LABELS, DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS, DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS, DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS, DEFAULT_COURSE_CATALOG_FILTERS_LABELS, DEFAULT_COURSE_PRICE_BANDS, DEFAULT_COURSE_PURCHASE_TERMS_LABELS, DEFAULT_LESSON_PREVIEW_LABELS, DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE, DEFAULT_SHOP_ERROR_MESSAGES, DEFAULT_SHOP_PRICE_BANDS, DEFAULT_TRUST_BADGE_HEADINGS, DEFAULT_TRUST_BADGE_TYPE_ORDER, DEFAULT_TRUST_ICONS, EMPTY_CHECKOUT_ADDRESS, FaqAccordion, type FaqAccordionProps, FaqItem, FullInvoiceValue, HeadingLevel, IconCardGrid, type IconCardGridProps, ImageTextSplit, type ImageTextSplitProps, LegalDocument, type LegalDocumentProps, LessonPreview, type LessonPreviewLabels, type LessonPreviewProps, type MarkdownImageOptions, MarkdownRenderer, type MarkdownRendererProps, OrderConfirmation, type OrderConfirmationLabels, type OrderConfirmationOrder, type OrderConfirmationProps, type OrderConfirmationStatus, OrderInvoiceLink, type OrderInvoiceLinkLabels, type OrderInvoiceLinkProps, PageBlocks, type PageBlocksComponents, type PageBlocksProps, PageCardGrid, type PageCardGridProps, ParentPage, type ParentPageProps, ProductCard, type ProductCardProps, ProductTrustItems, type ProductTrustItemsProps, ProfessionalFields, type ProfessionalFieldsProps, ProfileCard, type ProfileCardProps, type RenderableBlock, Reviews, type ReviewsProps, SafeHtml, type SafeHtmlProps, type ShareUrls, type ShopFilterPriceBand, ShopFilters, type ShopFiltersActive, type ShopFiltersHrefs, type ShopFiltersLabels, type ShopFiltersProps, Specialty, type SpecialtyProps, Treatment, type TreatmentProps, TrustBadges, type TrustBadgesProps, type TrustIconComponent, type TrustIconProps, buildShareUrls, bundleComponentsToIncludes, checkoutQuoteNotice, courseSellsAsGuest, defaultCheckoutFulfillment, formatPrice, getShopErrorMessage, isAllowedYouTubeHost, isCheckoutDeliveryComplete, markdownToSafeHtml, quoteRequiresDelivery, readingTime, sanitizeHtml, shouldRenderShopFilters, toAcademyCheckoutInvoiceFields, toCheckoutFulfillmentFields };