@nok-integration/storefront-react 0.18.1 → 0.18.3

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
@@ -3580,9 +3580,14 @@ export declare interface OrderConfirmationViewProps {
3580
3580
  /**
3581
3581
  * The frame's "Done". Omit it and no button renders.
3582
3582
  *
3583
- * Where it goes is the host's: in the embed this is the end of a checkout DAZN own, so
3584
- * only they know whether it closes the webview, returns to the shop, or goes somewhere
3585
- * else entirely.
3583
+ * **It leaves the shop.** DAZN settled this on 21 Aug 2026: "Done = DAZN home, X = DAZN
3584
+ * Shop home". The two are not the same destination and wiring both to the shop home
3585
+ * which is what the first integration did — loses the only way out of the shop at the
3586
+ * end of a purchase.
3587
+ *
3588
+ * We cannot make that trip ourselves: the DAZN app's own home is not a route on our
3589
+ * `/v1` surface and not something a `navigate('/')` can reach. So this stays the host's
3590
+ * callback, and the header's `onClose` is the one that goes to the shop home.
3586
3591
  */
3587
3592
  onDone?: () => void;
3588
3593
  }
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
- import { useRef, useCallback, useMemo, useEffect, useContext, createContext, forwardRef, useState } from "react";
3
+ import { useContext, useEffect, useState, useRef, useCallback, useMemo, createContext, forwardRef } from "react";
4
4
  var client = {};
5
5
  var catalog = {};
6
6
  var zod = {};
@@ -5542,6 +5542,38 @@ function withAuthorization(init, token) {
5542
5542
  headers.set("authorization", `Bearer ${token}`);
5543
5543
  return { ...init, headers };
5544
5544
  }
5545
+ const ScreenTitleContext = createContext({ title: void 0, claim: () => () => {
5546
+ } });
5547
+ const SuppressedContext = createContext(false);
5548
+ function ScreenTitleProvider({ children }) {
5549
+ const [title2, setTitle] = useState(void 0);
5550
+ const held = useRef(void 0);
5551
+ const claim = useCallback((next) => {
5552
+ held.current = next;
5553
+ setTitle(next);
5554
+ return () => {
5555
+ if (held.current !== next) return;
5556
+ held.current = void 0;
5557
+ setTitle(void 0);
5558
+ };
5559
+ }, []);
5560
+ const value2 = useMemo(() => ({ title: title2, claim }), [title2, claim]);
5561
+ return /* @__PURE__ */ jsx(ScreenTitleContext.Provider, { value: value2, children });
5562
+ }
5563
+ function useScreenTitle() {
5564
+ return useContext(ScreenTitleContext).title;
5565
+ }
5566
+ function useSetScreenTitle(title2) {
5567
+ const { claim } = useContext(ScreenTitleContext);
5568
+ const suppressed = useContext(SuppressedContext);
5569
+ useEffect(() => {
5570
+ if (suppressed || title2 === void 0) return;
5571
+ return claim(title2);
5572
+ }, [claim, title2, suppressed]);
5573
+ }
5574
+ function NoScreenTitle({ children }) {
5575
+ return /* @__PURE__ */ jsx(SuppressedContext.Provider, { value: true, children });
5576
+ }
5545
5577
  const ShopContext = createContext(null);
5546
5578
  function DaznShopProvider({
5547
5579
  children,
@@ -5631,7 +5663,7 @@ function DaznShopProvider({
5631
5663
  }),
5632
5664
  [api, market, theme, notifications, locale, assetBaseUrl, emit, subscribe, navigate]
5633
5665
  );
5634
- return /* @__PURE__ */ jsx(ShopContext.Provider, { value: value2, children });
5666
+ return /* @__PURE__ */ jsx(ShopContext.Provider, { value: value2, children: /* @__PURE__ */ jsx(ScreenTitleProvider, { children }) });
5635
5667
  }
5636
5668
  function useShopOptional() {
5637
5669
  return useContext(ShopContext);
@@ -6893,20 +6925,20 @@ function ReasonSheet({
6893
6925
  }
6894
6926
  ) });
6895
6927
  }
6896
- const page$6 = "_page_opefg_8";
6897
- const widget = "_widget_opefg_18";
6898
- const titleRow = "_titleRow_opefg_26";
6899
- const headline$1 = "_headline_opefg_42";
6900
- const track$5 = "_track_opefg_61";
6901
- const rule = "_rule_opefg_86";
6902
- const help = "_help_opefg_96";
6903
- const helpTitle = "_helpTitle_opefg_102";
6904
- const helpRows = "_helpRows_opefg_109";
6905
- const helpRow = "_helpRow_opefg_109";
6906
- const cancel = "_cancel_opefg_167";
6907
- const cancelledHead = "_cancelledHead_opefg_191";
6908
- const cancelledTitle = "_cancelledTitle_opefg_197";
6909
- const cancelledMeta = "_cancelledMeta_opefg_206";
6928
+ const page$6 = "_page_1v9my_8";
6929
+ const widget = "_widget_1v9my_18";
6930
+ const titleRow = "_titleRow_1v9my_26";
6931
+ const headline$1 = "_headline_1v9my_42";
6932
+ const track$5 = "_track_1v9my_74";
6933
+ const rule = "_rule_1v9my_99";
6934
+ const help = "_help_1v9my_109";
6935
+ const helpTitle = "_helpTitle_1v9my_115";
6936
+ const helpRows = "_helpRows_1v9my_122";
6937
+ const helpRow = "_helpRow_1v9my_122";
6938
+ const cancel = "_cancel_1v9my_180";
6939
+ const cancelledHead = "_cancelledHead_1v9my_204";
6940
+ const cancelledTitle = "_cancelledTitle_1v9my_210";
6941
+ const cancelledMeta = "_cancelledMeta_1v9my_219";
6910
6942
  const styles$A = {
6911
6943
  page: page$6,
6912
6944
  widget,
@@ -7542,6 +7574,19 @@ const styles$w = {
7542
7574
  function OrderConfirmationView(props) {
7543
7575
  return /* @__PURE__ */ jsx(ShopSurface, { tone: "light", fill: true, children: /* @__PURE__ */ jsx(OrderConfirmationContent, { ...props }) });
7544
7576
  }
7577
+ const CONFIRMATION_LABELS = {
7578
+ packing: "Order placed",
7579
+ on_its_way: "On the way"
7580
+ };
7581
+ function confirmationProgress(progress2) {
7582
+ return progress2.map((entry) => {
7583
+ if (entry.step === "delivered" && !entry.at) {
7584
+ return { ...entry, label: "Estimated delivery" };
7585
+ }
7586
+ const relabelled = CONFIRMATION_LABELS[entry.step];
7587
+ return relabelled ? { ...entry, label: relabelled } : { ...entry };
7588
+ });
7589
+ }
7545
7590
  function OrderConfirmationContent({ orderRef, locale: localeProp, onDone }) {
7546
7591
  const { api } = useShop();
7547
7592
  const locale = useLocale(localeProp);
@@ -7581,7 +7626,7 @@ function OrderConfirmationContent({ orderRef, locale: localeProp, onDone }) {
7581
7626
  /* @__PURE__ */ jsx(
7582
7627
  OrderTimeline,
7583
7628
  {
7584
- progress: order.progress,
7629
+ progress: confirmationProgress(order.progress),
7585
7630
  ...order.estimated_delivery ? { estimatedDelivery: order.estimated_delivery } : {},
7586
7631
  locale
7587
7632
  }
@@ -8454,6 +8499,7 @@ const styles$j = {
8454
8499
  lines
8455
8500
  };
8456
8501
  function CartView(props = {}) {
8502
+ useSetScreenTitle("Cart");
8457
8503
  return /* @__PURE__ */ jsx(ShopSurface, { tone: "light", fill: true, className: styles$j.surface, children: /* @__PURE__ */ jsx(CartViewContent, { ...props }) });
8458
8504
  }
8459
8505
  function CartViewContent({
@@ -8644,7 +8690,7 @@ function CartSheetProvider({ children }) {
8644
8690
  const api = useMemo(() => ({ open, close: close2, isOpen }), [open, close2, isOpen]);
8645
8691
  return /* @__PURE__ */ jsxs(CartSheetContext.Provider, { value: api, children: [
8646
8692
  children,
8647
- isOpen && /* @__PURE__ */ jsx(BottomSheet, { open: true, onClose: close2, title: "Cart", children: /* @__PURE__ */ jsx(CartView, { onContinueShopping: close2 }) })
8693
+ isOpen && /* @__PURE__ */ jsx(BottomSheet, { open: true, onClose: close2, title: "Cart", children: /* @__PURE__ */ jsx(NoScreenTitle, { children: /* @__PURE__ */ jsx(CartView, { onContinueShopping: close2 }) }) })
8648
8694
  ] });
8649
8695
  }
8650
8696
  const gallery = "_gallery_10mch_1";
@@ -10124,6 +10170,8 @@ function ShopBar({
10124
10170
  className
10125
10171
  }) {
10126
10172
  const cartCount = useCartCount();
10173
+ const screenTitle = useScreenTitle();
10174
+ const shownTitle = title2 ?? screenTitle;
10127
10175
  const atTop = useScrolledUnder(floating2 && scrolled2 === void 0);
10128
10176
  const isScrolled = scrolled2 ?? atTop;
10129
10177
  const cartLabel = cartCount === null ? "Cart" : cartCount === 0 ? "Cart, empty" : `Cart, ${cartCount} item${cartCount === 1 ? "" : "s"}`;
@@ -10135,7 +10183,7 @@ function ShopBar({
10135
10183
  ].filter(Boolean).join(" ");
10136
10184
  return /* @__PURE__ */ jsxs("header", { className: classes, children: [
10137
10185
  onBack ? /* @__PURE__ */ jsx("button", { type: "button", className: styles$1.iconBtn, "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ jsx(ChevronLeft, {}) }) : /* @__PURE__ */ jsx("span", { className: styles$1.spacer, "aria-hidden": "true" }),
10138
- title2 ? /* @__PURE__ */ jsx("span", { className: styles$1.title, children: title2 }) : null,
10186
+ shownTitle ? /* @__PURE__ */ jsx("span", { className: styles$1.title, children: shownTitle }) : null,
10139
10187
  /* @__PURE__ */ jsxs("div", { className: styles$1.right, children: [
10140
10188
  showCart ? /* @__PURE__ */ jsxs(CartTrigger, { className: styles$1.iconBtn, "aria-label": cartLabel, children: [
10141
10189
  /* @__PURE__ */ jsx(CartIcon, {}),
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
- import { useRef, useCallback, useMemo, useEffect, useContext, createContext, forwardRef, useState } from "react";
3
+ import { useContext, useEffect, useState, useRef, useCallback, useMemo, createContext, forwardRef } from "react";
4
4
  var client = {};
5
5
  var catalog = {};
6
6
  var zod = {};
@@ -5542,6 +5542,38 @@ function withAuthorization(init, token) {
5542
5542
  headers.set("authorization", `Bearer ${token}`);
5543
5543
  return { ...init, headers };
5544
5544
  }
5545
+ const ScreenTitleContext = createContext({ title: void 0, claim: () => () => {
5546
+ } });
5547
+ const SuppressedContext = createContext(false);
5548
+ function ScreenTitleProvider({ children }) {
5549
+ const [title2, setTitle] = useState(void 0);
5550
+ const held = useRef(void 0);
5551
+ const claim = useCallback((next) => {
5552
+ held.current = next;
5553
+ setTitle(next);
5554
+ return () => {
5555
+ if (held.current !== next) return;
5556
+ held.current = void 0;
5557
+ setTitle(void 0);
5558
+ };
5559
+ }, []);
5560
+ const value2 = useMemo(() => ({ title: title2, claim }), [title2, claim]);
5561
+ return /* @__PURE__ */ jsx(ScreenTitleContext.Provider, { value: value2, children });
5562
+ }
5563
+ function useScreenTitle() {
5564
+ return useContext(ScreenTitleContext).title;
5565
+ }
5566
+ function useSetScreenTitle(title2) {
5567
+ const { claim } = useContext(ScreenTitleContext);
5568
+ const suppressed = useContext(SuppressedContext);
5569
+ useEffect(() => {
5570
+ if (suppressed || title2 === void 0) return;
5571
+ return claim(title2);
5572
+ }, [claim, title2, suppressed]);
5573
+ }
5574
+ function NoScreenTitle({ children }) {
5575
+ return /* @__PURE__ */ jsx(SuppressedContext.Provider, { value: true, children });
5576
+ }
5545
5577
  const ShopContext = createContext(null);
5546
5578
  function DaznShopProvider({
5547
5579
  children,
@@ -5631,7 +5663,7 @@ function DaznShopProvider({
5631
5663
  }),
5632
5664
  [api, market, theme, notifications, locale, assetBaseUrl, emit, subscribe, navigate]
5633
5665
  );
5634
- return /* @__PURE__ */ jsx(ShopContext.Provider, { value: value2, children });
5666
+ return /* @__PURE__ */ jsx(ShopContext.Provider, { value: value2, children: /* @__PURE__ */ jsx(ScreenTitleProvider, { children }) });
5635
5667
  }
5636
5668
  function useShopOptional() {
5637
5669
  return useContext(ShopContext);
@@ -6893,20 +6925,20 @@ function ReasonSheet({
6893
6925
  }
6894
6926
  ) });
6895
6927
  }
6896
- const page$6 = "_page_opefg_8";
6897
- const widget = "_widget_opefg_18";
6898
- const titleRow = "_titleRow_opefg_26";
6899
- const headline$1 = "_headline_opefg_42";
6900
- const track$5 = "_track_opefg_61";
6901
- const rule = "_rule_opefg_86";
6902
- const help = "_help_opefg_96";
6903
- const helpTitle = "_helpTitle_opefg_102";
6904
- const helpRows = "_helpRows_opefg_109";
6905
- const helpRow = "_helpRow_opefg_109";
6906
- const cancel = "_cancel_opefg_167";
6907
- const cancelledHead = "_cancelledHead_opefg_191";
6908
- const cancelledTitle = "_cancelledTitle_opefg_197";
6909
- const cancelledMeta = "_cancelledMeta_opefg_206";
6928
+ const page$6 = "_page_1v9my_8";
6929
+ const widget = "_widget_1v9my_18";
6930
+ const titleRow = "_titleRow_1v9my_26";
6931
+ const headline$1 = "_headline_1v9my_42";
6932
+ const track$5 = "_track_1v9my_74";
6933
+ const rule = "_rule_1v9my_99";
6934
+ const help = "_help_1v9my_109";
6935
+ const helpTitle = "_helpTitle_1v9my_115";
6936
+ const helpRows = "_helpRows_1v9my_122";
6937
+ const helpRow = "_helpRow_1v9my_122";
6938
+ const cancel = "_cancel_1v9my_180";
6939
+ const cancelledHead = "_cancelledHead_1v9my_204";
6940
+ const cancelledTitle = "_cancelledTitle_1v9my_210";
6941
+ const cancelledMeta = "_cancelledMeta_1v9my_219";
6910
6942
  const styles$A = {
6911
6943
  page: page$6,
6912
6944
  widget,
@@ -7542,6 +7574,19 @@ const styles$w = {
7542
7574
  function OrderConfirmationView(props) {
7543
7575
  return /* @__PURE__ */ jsx(ShopSurface, { tone: "light", fill: true, children: /* @__PURE__ */ jsx(OrderConfirmationContent, { ...props }) });
7544
7576
  }
7577
+ const CONFIRMATION_LABELS = {
7578
+ packing: "Order placed",
7579
+ on_its_way: "On the way"
7580
+ };
7581
+ function confirmationProgress(progress2) {
7582
+ return progress2.map((entry) => {
7583
+ if (entry.step === "delivered" && !entry.at) {
7584
+ return { ...entry, label: "Estimated delivery" };
7585
+ }
7586
+ const relabelled = CONFIRMATION_LABELS[entry.step];
7587
+ return relabelled ? { ...entry, label: relabelled } : { ...entry };
7588
+ });
7589
+ }
7545
7590
  function OrderConfirmationContent({ orderRef, locale: localeProp, onDone }) {
7546
7591
  const { api } = useShop();
7547
7592
  const locale = useLocale(localeProp);
@@ -7581,7 +7626,7 @@ function OrderConfirmationContent({ orderRef, locale: localeProp, onDone }) {
7581
7626
  /* @__PURE__ */ jsx(
7582
7627
  OrderTimeline,
7583
7628
  {
7584
- progress: order.progress,
7629
+ progress: confirmationProgress(order.progress),
7585
7630
  ...order.estimated_delivery ? { estimatedDelivery: order.estimated_delivery } : {},
7586
7631
  locale
7587
7632
  }
@@ -8454,6 +8499,7 @@ const styles$j = {
8454
8499
  lines
8455
8500
  };
8456
8501
  function CartView(props = {}) {
8502
+ useSetScreenTitle("Cart");
8457
8503
  return /* @__PURE__ */ jsx(ShopSurface, { tone: "light", fill: true, className: styles$j.surface, children: /* @__PURE__ */ jsx(CartViewContent, { ...props }) });
8458
8504
  }
8459
8505
  function CartViewContent({
@@ -8644,7 +8690,7 @@ function CartSheetProvider({ children }) {
8644
8690
  const api = useMemo(() => ({ open, close: close2, isOpen }), [open, close2, isOpen]);
8645
8691
  return /* @__PURE__ */ jsxs(CartSheetContext.Provider, { value: api, children: [
8646
8692
  children,
8647
- isOpen && /* @__PURE__ */ jsx(BottomSheet, { open: true, onClose: close2, title: "Cart", children: /* @__PURE__ */ jsx(CartView, { onContinueShopping: close2 }) })
8693
+ isOpen && /* @__PURE__ */ jsx(BottomSheet, { open: true, onClose: close2, title: "Cart", children: /* @__PURE__ */ jsx(NoScreenTitle, { children: /* @__PURE__ */ jsx(CartView, { onContinueShopping: close2 }) }) })
8648
8694
  ] });
8649
8695
  }
8650
8696
  const gallery = "_gallery_10mch_1";
@@ -10124,6 +10170,8 @@ function ShopBar({
10124
10170
  className
10125
10171
  }) {
10126
10172
  const cartCount = useCartCount();
10173
+ const screenTitle = useScreenTitle();
10174
+ const shownTitle = title2 ?? screenTitle;
10127
10175
  const atTop = useScrolledUnder(floating2 && scrolled2 === void 0);
10128
10176
  const isScrolled = scrolled2 ?? atTop;
10129
10177
  const cartLabel = cartCount === null ? "Cart" : cartCount === 0 ? "Cart, empty" : `Cart, ${cartCount} item${cartCount === 1 ? "" : "s"}`;
@@ -10135,7 +10183,7 @@ function ShopBar({
10135
10183
  ].filter(Boolean).join(" ");
10136
10184
  return /* @__PURE__ */ jsxs("header", { className: classes, children: [
10137
10185
  onBack ? /* @__PURE__ */ jsx("button", { type: "button", className: styles$1.iconBtn, "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ jsx(ChevronLeft, {}) }) : /* @__PURE__ */ jsx("span", { className: styles$1.spacer, "aria-hidden": "true" }),
10138
- title2 ? /* @__PURE__ */ jsx("span", { className: styles$1.title, children: title2 }) : null,
10186
+ shownTitle ? /* @__PURE__ */ jsx("span", { className: styles$1.title, children: shownTitle }) : null,
10139
10187
  /* @__PURE__ */ jsxs("div", { className: styles$1.right, children: [
10140
10188
  showCart ? /* @__PURE__ */ jsxs(CartTrigger, { className: styles$1.iconBtn, "aria-label": cartLabel, children: [
10141
10189
  /* @__PURE__ */ jsx(CartIcon, {}),
@@ -1560,7 +1560,7 @@
1560
1560
  * everything below it is 32 apart: widget, rule, rows, address, summary. Same rhythm and
1561
1561
  * same padding as the confirmation, which is the same page from the fold down.
1562
1562
  */
1563
- ._page_opefg_8 {
1563
+ ._page_1v9my_8 {
1564
1564
  display: flex;
1565
1565
  flex-direction: column;
1566
1566
  gap: var(--space-32);
@@ -1570,7 +1570,7 @@
1570
1570
  /* ── Order number + timeline ───────────────────────────────────────────────── */
1571
1571
 
1572
1572
  /* `mobile/order/delivery-widget`: the title row, then the steps, 32 apart. */
1573
- ._widget_opefg_18 {
1573
+ ._widget_1v9my_18 {
1574
1574
  display: flex;
1575
1575
  flex-direction: column;
1576
1576
  gap: var(--space-32);
@@ -1578,7 +1578,7 @@
1578
1578
 
1579
1579
  /* The number on the left, the carrier link hard right — and nothing between them, so a
1580
1580
  long reference runs into the space the link is not using rather than under it. */
1581
- ._titleRow_opefg_26 {
1581
+ ._titleRow_1v9my_26 {
1582
1582
  display: flex;
1583
1583
  align-items: center;
1584
1584
  justify-content: space-between;
@@ -1594,8 +1594,21 @@
1594
1594
  *
1595
1595
  * Nothing clips it, so the cap-height box needs no descender protection.
1596
1596
  */
1597
- ._headline_opefg_42 {
1598
- margin: 0;
1597
+ ._headline_1v9my_42 {
1598
+ /*
1599
+ * The padding is what the trim costs, and this rule went out without it.
1600
+ *
1601
+ * A 14px box on 20px text is the cap height, so the glyphs deliberately overflow it —
1602
+ * exactly as they do in Figma. That is fine until something clips, and the ellipsis
1603
+ * below does: `overflow: hidden` cuts in both directions and takes the bottom off the
1604
+ * letters. DAZN reported it on the order screen, where the heading is `Order #611887`.
1605
+ *
1606
+ * Nine each way clears 20px glyphs the way six clears 16px ones on the confirmation
1607
+ * subtitle, and the equal negative margin takes the room straight back out, so the box
1608
+ * stays 14 and the row does not move.
1609
+ */
1610
+ margin: -9px 0;
1611
+ padding: 9px 0;
1599
1612
  min-width: 0;
1600
1613
  font-size: var(--type-heading-md-size);
1601
1614
  line-height: 14px;
@@ -1613,7 +1626,7 @@
1613
1626
  * An anchor rather than a button because the destination is a real page on somebody else's
1614
1627
  * site, and it has to behave like one: middle-click, long-press, open in a new tab.
1615
1628
  */
1616
- ._track_opefg_61 {
1629
+ ._track_1v9my_74 {
1617
1630
  display: inline-flex;
1618
1631
  align-items: center;
1619
1632
  gap: var(--space-6);
@@ -1625,7 +1638,7 @@
1625
1638
  text-decoration: none;
1626
1639
  }
1627
1640
 
1628
- ._track_opefg_61:focus-visible {
1641
+ ._track_1v9my_74:focus-visible {
1629
1642
  outline: none;
1630
1643
  box-shadow: var(--focus-ring);
1631
1644
  border-radius: var(--radius-4);
@@ -1638,7 +1651,7 @@
1638
1651
  * separates, with the hairline drawn on that boundary. The negative margin takes the
1639
1652
  * pixel back out of the layout so the two gaps stay 32 rather than becoming 32 and 33.
1640
1653
  */
1641
- ._rule_opefg_86 {
1654
+ ._rule_1v9my_99 {
1642
1655
  height: 1px;
1643
1656
  margin: 0 0 -1px;
1644
1657
  border: 0;
@@ -1648,20 +1661,20 @@
1648
1661
  /* ── Need help? ────────────────────────────────────────────────────────────── */
1649
1662
 
1650
1663
  /* `mobile/explore`: the heading, then the rows, 6 apart. */
1651
- ._help_opefg_96 {
1664
+ ._help_1v9my_109 {
1652
1665
  display: flex;
1653
1666
  flex-direction: column;
1654
1667
  gap: var(--space-6);
1655
1668
  }
1656
1669
 
1657
- ._helpTitle_opefg_102 {
1670
+ ._helpTitle_1v9my_115 {
1658
1671
  margin: 0;
1659
1672
  font-size: var(--type-heading-md-size);
1660
1673
  line-height: 1.32;
1661
1674
  font-weight: var(--font-weight-bold);
1662
1675
  }
1663
1676
 
1664
- ._helpRows_opefg_109 {
1677
+ ._helpRows_1v9my_122 {
1665
1678
  display: flex;
1666
1679
  flex-direction: column;
1667
1680
  }
@@ -1670,7 +1683,7 @@
1670
1683
  * 48 tall: 16 of padding either side of a 16px chevron, which is what sets the height. The
1671
1684
  * label is cap-trimmed to 10 and is shorter than the mark beside it.
1672
1685
  */
1673
- ._helpRow_opefg_109 {
1686
+ ._helpRow_1v9my_122 {
1674
1687
  display: flex;
1675
1688
  align-items: center;
1676
1689
  justify-content: space-between;
@@ -1700,11 +1713,11 @@
1700
1713
  * padding and its 16px chevron rather than from a `height`, so the hairline adds to the
1701
1714
  * row instead of eating into it. 48, the line, then 48 — the frame's own 97 for the pair.
1702
1715
  */
1703
- ._helpRow_opefg_109 + ._helpRow_opefg_109 {
1716
+ ._helpRow_1v9my_122 + ._helpRow_1v9my_122 {
1704
1717
  border-top: 1px solid var(--color-border-subtle);
1705
1718
  }
1706
1719
 
1707
- ._helpRow_opefg_109:focus-visible {
1720
+ ._helpRow_1v9my_122:focus-visible {
1708
1721
  outline: none;
1709
1722
  box-shadow: var(--focus-ring);
1710
1723
  }
@@ -1719,7 +1732,7 @@
1719
1732
  * would put a fourth variant in the primitive for a single use — this is the one control
1720
1733
  * in the package drawn this way, so it is drawn here.
1721
1734
  */
1722
- ._cancel_opefg_167 {
1735
+ ._cancel_1v9my_180 {
1723
1736
  display: inline-flex;
1724
1737
  align-items: center;
1725
1738
  justify-content: center;
@@ -1737,19 +1750,19 @@
1737
1750
  cursor: pointer;
1738
1751
  }
1739
1752
 
1740
- ._cancel_opefg_167:focus-visible {
1753
+ ._cancel_1v9my_180:focus-visible {
1741
1754
  outline: none;
1742
1755
  box-shadow: var(--focus-ring);
1743
1756
  }
1744
1757
 
1745
1758
  /* Screen 3. The head is a title and one meta line, 8 apart. */
1746
- ._cancelledHead_opefg_191 {
1759
+ ._cancelledHead_1v9my_204 {
1747
1760
  display: flex;
1748
1761
  flex-direction: column;
1749
1762
  gap: var(--space-8);
1750
1763
  }
1751
1764
 
1752
- ._cancelledTitle_opefg_197 {
1765
+ ._cancelledTitle_1v9my_210 {
1753
1766
  margin: 0;
1754
1767
  font-size: var(--type-heading-md-size);
1755
1768
  line-height: 1.32;
@@ -1758,7 +1771,7 @@
1758
1771
  }
1759
1772
 
1760
1773
  /* The reference and the date it was placed, cap-trimmed to 10 on 14. */
1761
- ._cancelledMeta_opefg_206 {
1774
+ ._cancelledMeta_1v9my_219 {
1762
1775
  font-size: var(--type-trimmed-sm-size);
1763
1776
  line-height: 10px;
1764
1777
  padding: 5px 0;
package/dist/styles.css CHANGED
@@ -1560,7 +1560,7 @@
1560
1560
  * everything below it is 32 apart: widget, rule, rows, address, summary. Same rhythm and
1561
1561
  * same padding as the confirmation, which is the same page from the fold down.
1562
1562
  */
1563
- ._page_opefg_8 {
1563
+ ._page_1v9my_8 {
1564
1564
  display: flex;
1565
1565
  flex-direction: column;
1566
1566
  gap: var(--space-32);
@@ -1570,7 +1570,7 @@
1570
1570
  /* ── Order number + timeline ───────────────────────────────────────────────── */
1571
1571
 
1572
1572
  /* `mobile/order/delivery-widget`: the title row, then the steps, 32 apart. */
1573
- ._widget_opefg_18 {
1573
+ ._widget_1v9my_18 {
1574
1574
  display: flex;
1575
1575
  flex-direction: column;
1576
1576
  gap: var(--space-32);
@@ -1578,7 +1578,7 @@
1578
1578
 
1579
1579
  /* The number on the left, the carrier link hard right — and nothing between them, so a
1580
1580
  long reference runs into the space the link is not using rather than under it. */
1581
- ._titleRow_opefg_26 {
1581
+ ._titleRow_1v9my_26 {
1582
1582
  display: flex;
1583
1583
  align-items: center;
1584
1584
  justify-content: space-between;
@@ -1594,8 +1594,21 @@
1594
1594
  *
1595
1595
  * Nothing clips it, so the cap-height box needs no descender protection.
1596
1596
  */
1597
- ._headline_opefg_42 {
1598
- margin: 0;
1597
+ ._headline_1v9my_42 {
1598
+ /*
1599
+ * The padding is what the trim costs, and this rule went out without it.
1600
+ *
1601
+ * A 14px box on 20px text is the cap height, so the glyphs deliberately overflow it —
1602
+ * exactly as they do in Figma. That is fine until something clips, and the ellipsis
1603
+ * below does: `overflow: hidden` cuts in both directions and takes the bottom off the
1604
+ * letters. DAZN reported it on the order screen, where the heading is `Order #611887`.
1605
+ *
1606
+ * Nine each way clears 20px glyphs the way six clears 16px ones on the confirmation
1607
+ * subtitle, and the equal negative margin takes the room straight back out, so the box
1608
+ * stays 14 and the row does not move.
1609
+ */
1610
+ margin: -9px 0;
1611
+ padding: 9px 0;
1599
1612
  min-width: 0;
1600
1613
  font-size: var(--type-heading-md-size);
1601
1614
  line-height: 14px;
@@ -1613,7 +1626,7 @@
1613
1626
  * An anchor rather than a button because the destination is a real page on somebody else's
1614
1627
  * site, and it has to behave like one: middle-click, long-press, open in a new tab.
1615
1628
  */
1616
- ._track_opefg_61 {
1629
+ ._track_1v9my_74 {
1617
1630
  display: inline-flex;
1618
1631
  align-items: center;
1619
1632
  gap: var(--space-6);
@@ -1625,7 +1638,7 @@
1625
1638
  text-decoration: none;
1626
1639
  }
1627
1640
 
1628
- ._track_opefg_61:focus-visible {
1641
+ ._track_1v9my_74:focus-visible {
1629
1642
  outline: none;
1630
1643
  box-shadow: var(--focus-ring);
1631
1644
  border-radius: var(--radius-4);
@@ -1638,7 +1651,7 @@
1638
1651
  * separates, with the hairline drawn on that boundary. The negative margin takes the
1639
1652
  * pixel back out of the layout so the two gaps stay 32 rather than becoming 32 and 33.
1640
1653
  */
1641
- ._rule_opefg_86 {
1654
+ ._rule_1v9my_99 {
1642
1655
  height: 1px;
1643
1656
  margin: 0 0 -1px;
1644
1657
  border: 0;
@@ -1648,20 +1661,20 @@
1648
1661
  /* ── Need help? ────────────────────────────────────────────────────────────── */
1649
1662
 
1650
1663
  /* `mobile/explore`: the heading, then the rows, 6 apart. */
1651
- ._help_opefg_96 {
1664
+ ._help_1v9my_109 {
1652
1665
  display: flex;
1653
1666
  flex-direction: column;
1654
1667
  gap: var(--space-6);
1655
1668
  }
1656
1669
 
1657
- ._helpTitle_opefg_102 {
1670
+ ._helpTitle_1v9my_115 {
1658
1671
  margin: 0;
1659
1672
  font-size: var(--type-heading-md-size);
1660
1673
  line-height: 1.32;
1661
1674
  font-weight: var(--font-weight-bold);
1662
1675
  }
1663
1676
 
1664
- ._helpRows_opefg_109 {
1677
+ ._helpRows_1v9my_122 {
1665
1678
  display: flex;
1666
1679
  flex-direction: column;
1667
1680
  }
@@ -1670,7 +1683,7 @@
1670
1683
  * 48 tall: 16 of padding either side of a 16px chevron, which is what sets the height. The
1671
1684
  * label is cap-trimmed to 10 and is shorter than the mark beside it.
1672
1685
  */
1673
- ._helpRow_opefg_109 {
1686
+ ._helpRow_1v9my_122 {
1674
1687
  display: flex;
1675
1688
  align-items: center;
1676
1689
  justify-content: space-between;
@@ -1700,11 +1713,11 @@
1700
1713
  * padding and its 16px chevron rather than from a `height`, so the hairline adds to the
1701
1714
  * row instead of eating into it. 48, the line, then 48 — the frame's own 97 for the pair.
1702
1715
  */
1703
- ._helpRow_opefg_109 + ._helpRow_opefg_109 {
1716
+ ._helpRow_1v9my_122 + ._helpRow_1v9my_122 {
1704
1717
  border-top: 1px solid var(--color-border-subtle);
1705
1718
  }
1706
1719
 
1707
- ._helpRow_opefg_109:focus-visible {
1720
+ ._helpRow_1v9my_122:focus-visible {
1708
1721
  outline: none;
1709
1722
  box-shadow: var(--focus-ring);
1710
1723
  }
@@ -1719,7 +1732,7 @@
1719
1732
  * would put a fourth variant in the primitive for a single use — this is the one control
1720
1733
  * in the package drawn this way, so it is drawn here.
1721
1734
  */
1722
- ._cancel_opefg_167 {
1735
+ ._cancel_1v9my_180 {
1723
1736
  display: inline-flex;
1724
1737
  align-items: center;
1725
1738
  justify-content: center;
@@ -1737,19 +1750,19 @@
1737
1750
  cursor: pointer;
1738
1751
  }
1739
1752
 
1740
- ._cancel_opefg_167:focus-visible {
1753
+ ._cancel_1v9my_180:focus-visible {
1741
1754
  outline: none;
1742
1755
  box-shadow: var(--focus-ring);
1743
1756
  }
1744
1757
 
1745
1758
  /* Screen 3. The head is a title and one meta line, 8 apart. */
1746
- ._cancelledHead_opefg_191 {
1759
+ ._cancelledHead_1v9my_204 {
1747
1760
  display: flex;
1748
1761
  flex-direction: column;
1749
1762
  gap: var(--space-8);
1750
1763
  }
1751
1764
 
1752
- ._cancelledTitle_opefg_197 {
1765
+ ._cancelledTitle_1v9my_210 {
1753
1766
  margin: 0;
1754
1767
  font-size: var(--type-heading-md-size);
1755
1768
  line-height: 1.32;
@@ -1758,7 +1771,7 @@
1758
1771
  }
1759
1772
 
1760
1773
  /* The reference and the date it was placed, cap-trimmed to 10 on 14. */
1761
- ._cancelledMeta_opefg_206 {
1774
+ ._cancelledMeta_1v9my_219 {
1762
1775
  font-size: var(--type-trimmed-sm-size);
1763
1776
  line-height: 10px;
1764
1777
  padding: 5px 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nok-integration/storefront-react",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "description": "Mountable React storefront components: catalogue, product detail and cart, mounted directly into a host DOM tree. No iframe.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",