@stapel/listings-react 0.25.10 → 0.26.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.
Files changed (133) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +77 -9
  3. package/dist/api/generated/schema.d.ts +2 -2
  4. package/dist/api/generated/schema.d.ts.map +1 -1
  5. package/dist/default/CardBadges.d.ts.map +1 -1
  6. package/dist/default/CardBadges.js +3 -1
  7. package/dist/default/CardBadges.js.map +1 -1
  8. package/dist/default/ListingActions.d.ts +108 -0
  9. package/dist/default/ListingActions.d.ts.map +1 -0
  10. package/dist/default/ListingActions.js +29 -0
  11. package/dist/default/ListingActions.js.map +1 -0
  12. package/dist/default/ListingCard.d.ts.map +1 -1
  13. package/dist/default/ListingCard.js +15 -8
  14. package/dist/default/ListingCard.js.map +1 -1
  15. package/dist/default/ListingDetailPane.d.ts +76 -56
  16. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  17. package/dist/default/ListingDetailPane.js +164 -18
  18. package/dist/default/ListingDetailPane.js.map +1 -1
  19. package/dist/default/ListingFeedCard.d.ts.map +1 -1
  20. package/dist/default/ListingFeedCard.js +2 -1
  21. package/dist/default/ListingFeedCard.js.map +1 -1
  22. package/dist/default/ListingPhoto.d.ts.map +1 -1
  23. package/dist/default/ListingPhoto.js +5 -2
  24. package/dist/default/ListingPhoto.js.map +1 -1
  25. package/dist/default/ListingSerpCard.d.ts.map +1 -1
  26. package/dist/default/ListingSerpCard.js +18 -4
  27. package/dist/default/ListingSerpCard.js.map +1 -1
  28. package/dist/default/MyListingsPane.d.ts.map +1 -1
  29. package/dist/default/MyListingsPane.js +45 -21
  30. package/dist/default/MyListingsPane.js.map +1 -1
  31. package/dist/default/ShareAction.d.ts +32 -0
  32. package/dist/default/ShareAction.d.ts.map +1 -0
  33. package/dist/default/ShareAction.js +116 -0
  34. package/dist/default/ShareAction.js.map +1 -0
  35. package/dist/default/actionRow.d.ts +58 -0
  36. package/dist/default/actionRow.d.ts.map +1 -0
  37. package/dist/default/actionRow.js +128 -0
  38. package/dist/default/actionRow.js.map +1 -0
  39. package/dist/default/cardGallery.d.ts +2 -0
  40. package/dist/default/cardGallery.d.ts.map +1 -1
  41. package/dist/default/cardGallery.js +31 -0
  42. package/dist/default/cardGallery.js.map +1 -1
  43. package/dist/default/favorite.d.ts +25 -0
  44. package/dist/default/favorite.d.ts.map +1 -1
  45. package/dist/default/favorite.js +29 -3
  46. package/dist/default/favorite.js.map +1 -1
  47. package/dist/default/icons.d.ts +19 -0
  48. package/dist/default/icons.d.ts.map +1 -1
  49. package/dist/default/icons.js +23 -0
  50. package/dist/default/icons.js.map +1 -1
  51. package/dist/default/index.d.ts +8 -1
  52. package/dist/default/index.d.ts.map +1 -1
  53. package/dist/default/index.js +6 -1
  54. package/dist/default/index.js.map +1 -1
  55. package/dist/default/notice.d.ts +14 -0
  56. package/dist/default/notice.d.ts.map +1 -0
  57. package/dist/default/notice.js +62 -0
  58. package/dist/default/notice.js.map +1 -0
  59. package/dist/headless/MyListings.d.ts +39 -18
  60. package/dist/headless/MyListings.d.ts.map +1 -1
  61. package/dist/headless/MyListings.js +41 -19
  62. package/dist/headless/MyListings.js.map +1 -1
  63. package/dist/headless/Share.d.ts +103 -0
  64. package/dist/headless/Share.d.ts.map +1 -0
  65. package/dist/headless/Share.js +190 -0
  66. package/dist/headless/Share.js.map +1 -0
  67. package/dist/i18n/es.d.ts.map +1 -1
  68. package/dist/i18n/es.js +21 -0
  69. package/dist/i18n/es.js.map +1 -1
  70. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  71. package/dist/i18n/generated/errors.es.gen.js +1 -1
  72. package/dist/i18n/generated/errors.gen.d.ts +18 -0
  73. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  74. package/dist/i18n/generated/errors.gen.js +9 -0
  75. package/dist/i18n/generated/errors.gen.js.map +1 -1
  76. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  77. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  78. package/dist/i18n/keys.d.ts +45 -0
  79. package/dist/i18n/keys.d.ts.map +1 -1
  80. package/dist/i18n/keys.js +60 -0
  81. package/dist/i18n/keys.js.map +1 -1
  82. package/dist/i18n/ru.d.ts.map +1 -1
  83. package/dist/i18n/ru.js +21 -0
  84. package/dist/i18n/ru.js.map +1 -1
  85. package/dist/index.d.ts +5 -3
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/model/cardBadges.d.ts +52 -3
  90. package/dist/model/cardBadges.d.ts.map +1 -1
  91. package/dist/model/cardBadges.js +74 -12
  92. package/dist/model/cardBadges.js.map +1 -1
  93. package/dist/model/mineSource.d.ts +9 -3
  94. package/dist/model/mineSource.d.ts.map +1 -1
  95. package/dist/model/mineSource.js.map +1 -1
  96. package/dist/model/status.d.ts +62 -13
  97. package/dist/model/status.d.ts.map +1 -1
  98. package/dist/model/status.js +69 -15
  99. package/dist/model/status.js.map +1 -1
  100. package/llms.txt +8 -3
  101. package/manifest.json +96 -4
  102. package/nav-manifest.json +1 -1
  103. package/package.json +10 -10
  104. package/src/analytics/generated/events.json +1 -1
  105. package/src/api/generated/schema.ts +2 -2
  106. package/src/default/CardBadges.tsx +3 -1
  107. package/src/default/ListingActions.tsx +196 -0
  108. package/src/default/ListingCard.tsx +79 -43
  109. package/src/default/ListingDetailPane.tsx +268 -81
  110. package/src/default/ListingFeedCard.tsx +2 -0
  111. package/src/default/ListingPhoto.tsx +28 -0
  112. package/src/default/ListingSerpCard.tsx +39 -12
  113. package/src/default/MyListingsPane.tsx +77 -44
  114. package/src/default/ShareAction.tsx +260 -0
  115. package/src/default/actionRow.ts +131 -0
  116. package/src/default/cardGallery.ts +31 -0
  117. package/src/default/favorite.tsx +68 -1
  118. package/src/default/icons.tsx +60 -0
  119. package/src/default/index.ts +23 -0
  120. package/src/default/notice.ts +68 -0
  121. package/src/headless/MyListings.tsx +89 -38
  122. package/src/headless/Share.tsx +278 -0
  123. package/src/i18n/es.ts +28 -0
  124. package/src/i18n/generated/errors.es.gen.ts +1 -1
  125. package/src/i18n/generated/errors.gen.ts +9 -0
  126. package/src/i18n/generated/errors.json +31 -0
  127. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  128. package/src/i18n/keys.ts +63 -0
  129. package/src/i18n/ru.ts +28 -0
  130. package/src/index.ts +22 -0
  131. package/src/model/cardBadges.ts +124 -12
  132. package/src/model/mineSource.ts +9 -3
  133. package/src/model/status.ts +85 -18
@@ -16,12 +16,19 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
16
16
  * listing is offline, or never tell them their edit is being screened.
17
17
  * `moderation_status` is on the owner card, so the row reads the real
18
18
  * value rather than the `"approved"` stand-in it used before 0.7.0.
19
- * 2. **Takedowns are not in a tab.** The three tabs are the SERVER's status
20
- * groupings and `blocked` is in none of them, because `my/counters` counts
21
- * it in none of them. Folding it into one would make a tab's rows and its
22
- * badge describe different sets; leaving it out entirely would hide the
23
- * one listing whose owner most needs to know. So it sits above the tabs,
24
- * where it cannot be missed.
19
+ * 2. **A takedown gets a tab of its own, and a count (D407).** The three
20
+ * tabs are the SERVER's status groupings and `blocked` is in none of them,
21
+ * because `my/counters` counts it in none of them so a cabinet holding a
22
+ * listing a moderator had pulled read "Active 0 · Drafts 0 · Archived 0"
23
+ * over it, and said beside that that nothing of the seller's was live. The
24
+ * row was on the page (in a block above the tabs) and in no tab and in no
25
+ * number, and a person reads the numbers.
26
+ *
27
+ * So the takedowns are the fourth tab, counted from their own read — see
28
+ * `model/status.ts` for why a fourth tab and not the archive. The block
29
+ * above the tabs stays as one LINE, without the rows: a takedown must not
30
+ * need a click to be discovered, and printing the same row twice on one
31
+ * screen is not the way to say so.
25
32
  * 3. **An empty tab says which emptiness it is.** "No drafts" and "nothing
26
33
  * sold yet" are different sentences and one generic "nothing here" is
27
34
  * neither.
@@ -71,12 +78,14 @@ const TAB_LABEL = {
71
78
  active: LISTINGS_I18N_KEYS.mineTabActive,
72
79
  drafts: LISTINGS_I18N_KEYS.mineTabDrafts,
73
80
  archived: LISTINGS_I18N_KEYS.mineTabArchived,
81
+ removed: LISTINGS_I18N_KEYS.mineTabRemoved,
74
82
  };
75
83
  /** One empty sentence per tab — see the header, point 3. */
76
84
  const TAB_EMPTY = {
77
85
  active: LISTINGS_I18N_KEYS.mineEmptyActive,
78
86
  drafts: LISTINGS_I18N_KEYS.mineEmptyDrafts,
79
87
  archived: LISTINGS_I18N_KEYS.mineEmptyArchived,
88
+ removed: LISTINGS_I18N_KEYS.mineEmptyRemoved,
80
89
  };
81
90
  /** The thumbnail column. A photo marketplace whose seller dashboard is a
82
91
  * column of text is missing the one thing that identifies a row at a glance;
@@ -199,9 +208,18 @@ export function MyListingsPane(props) {
199
208
  // ONE confirmation for the whole list, keyed by the row that asked — not one
200
209
  // mounted dialog per row.
201
210
  const [removingId, setRemovingId] = useState(null);
202
- const removal = useListingActions(removingId ?? 0, bag.rows.status === "ready"
203
- ? bag.rows.data.find((row) => row.id === removingId)?.status
204
- : undefined);
211
+ const removingRow = bag.rows.status === "ready"
212
+ ? bag.rows.data.find((row) => row.id === removingId)
213
+ : undefined;
214
+ const removal = useListingActions(removingId ?? 0, removingRow?.status, {
215
+ // The SERVER's answer for THIS row, exactly as the row's own controls
216
+ // take it. Without it this hook fell back to the mirror, and the mirror
217
+ // is a table about a status rather than about a listing — which is the
218
+ // difference between "a sold listing may be archived" and "this one may".
219
+ ...(removingRow?.available_transitions !== undefined
220
+ ? { available: removingRow.available_transitions }
221
+ : {}),
222
+ });
205
223
  const paged = bag.prevPage.available || bag.nextPage.available;
206
224
  const renderRow = (row) => (_jsx(MyListingRow, { listing: row, onEdit: props.onEdit, onAskRemove: setRemovingId, listingHref: props.listingHref, linkComponent: props.linkComponent }));
207
225
  return (_jsx(SkinTheme, { surface: "base", style: {
@@ -213,14 +231,16 @@ export function MyListingsPane(props) {
213
231
  // A refused pane is ONE state, not a banner above a live-looking
214
232
  // dashboard: the tabs still advertised "Active 2 · Drafts 3" to a
215
233
  // visitor who could not read a single row.
216
- _jsx(EmptyState, { testId: "listings-mine-blocked", title: t(bag.gate.block.code, bag.gate.block.params), action: _jsx(SignInLink, { cta: props.signIn, testId: "listings-mine-sign-in" }) })) : (_jsxs(_Fragment, { children: [matchList(bag.blockedRows, {
217
- loading: () => null,
218
- failed: () => (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-mine-takedowns-failed", children: t(LISTINGS_I18N_KEYS.mineBlockedLoadFailed) })),
219
- empty: () => null,
220
- ready: (rows) => (_jsxs(Flex, { vertical: true, gap: spacing[2], "data-testid": "listings-mine-takedowns", children: [_jsx(Typography.Text, { type: "warning", strong: true, children: tPlural(LISTINGS_I18N_KEYS.mineBlockedTitle, {
221
- count: rows.length,
222
- }) }), _jsx(List, { dataSource: [...rows], rowKey: (row) => row.id, renderItem: renderRow })] })),
223
- }), _jsx(Tabs, { activeKey: bag.tab, "data-testid": "listings-mine-tabs", onChange: (key) => {
234
+ _jsx(EmptyState, { testId: "listings-mine-blocked", title: t(bag.gate.block.code, bag.gate.block.params), action: _jsx(SignInLink, { cta: props.signIn, testId: "listings-mine-sign-in" }) })) : (_jsxs(_Fragment, { children: [bag.tab === "removed"
235
+ ? null
236
+ : matchList(bag.blockedRows, {
237
+ loading: () => null,
238
+ failed: () => (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-mine-takedowns-failed", children: t(LISTINGS_I18N_KEYS.mineBlockedLoadFailed) })),
239
+ empty: () => null,
240
+ ready: (rows) => (_jsx(Typography.Text, { type: "warning", strong: true, "data-testid": "listings-mine-takedowns", children: tPlural(LISTINGS_I18N_KEYS.mineBlockedTitle, {
241
+ count: rows.length,
242
+ }) })),
243
+ }), _jsx(Tabs, { activeKey: bag.tab, "data-testid": "listings-mine-tabs", onChange: (key) => {
224
244
  bag.setTab(key);
225
245
  }, items: bag.tabs.map((tab) => ({
226
246
  key: tab,
@@ -235,9 +255,11 @@ export function MyListingsPane(props) {
235
255
  // phone instead of collapsing into an overflow menu.
236
256
  //
237
257
  // `tabCounts`, not `counters`: the badge is never allowed to
238
- // read lower than the rows underneath it (D407 a
239
- // moderator-rejected listing sat in Drafts under a `0`).
240
- ready: (counts) => (_jsx(Typography.Text, { type: "secondary", "data-testid": `listings-mine-count-${tab}`, children: ` ${String(counts[tab])}` })),
258
+ // read lower than the rows underneath it, and the fourth tab
259
+ // has no server counter at all (D407 — a moderator-rejected
260
+ // listing sat in Drafts under a `0`, and a taken-down one
261
+ // under no number whatever).
262
+ ready: (counts) => (_jsx(Typography.Text, { type: tab === "removed" ? "warning" : "secondary", "data-testid": `listings-mine-count-${tab}`, children: ` ${String(counts[tab])}` })),
241
263
  })] })),
242
264
  })) }), matchLoad(bag.counters, {
243
265
  loading: () => null,
@@ -270,7 +292,9 @@ export function MyListingsPane(props) {
270
292
  // The gate itself is open: this pane's own refusal is `bag.gate`
271
293
  // and it is answered far above, as one state.
272
294
  _jsx(PaneGate, { gate: actionAvailable(), testId: "listings-mine-reasons", children: _jsx(List, { dataSource: [...rows], rowKey: (row) => row.id, renderItem: renderRow }) })),
273
- }), paged ? (_jsxs(Flex, { gap: spacing[2], wrap: true, children: [_jsx(GatedButton, { gate: bag.prevPage, size: "small", layout: "inline", testId: "listings-mine-prev", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goPrev, children: t(LISTINGS_I18N_KEYS.pagePrev) }), _jsx(GatedButton, { gate: bag.nextPage, size: "small", layout: "inline", testId: "listings-mine-next", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goNext, children: t(LISTINGS_I18N_KEYS.pageNext) })] })) : null] })), _jsx(SkinConfirm, { open: removingId !== null, danger: true, title: t(LISTINGS_I18N_KEYS.mineDeleteConfirmTitle), body: t(LISTINGS_I18N_KEYS.mineDeleteConfirmBody), confirmLabel: t(LISTINGS_I18N_KEYS.mineDelete), confirming: removal.inFlight, "data-testid": "listings-mine-delete-confirm", onConfirm: () => {
295
+ }), paged ? (_jsxs(Flex, { gap: spacing[2], wrap: true, children: [_jsx(GatedButton, { gate: bag.prevPage, size: "small", layout: "inline", testId: "listings-mine-prev", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goPrev, children: t(LISTINGS_I18N_KEYS.pagePrev) }), _jsx(GatedButton, { gate: bag.nextPage, size: "small", layout: "inline", testId: "listings-mine-next", "data-analytics": "none", "data-analytics-reason": "paging a list the person is already reading; not a business action", onClick: bag.goNext, children: t(LISTINGS_I18N_KEYS.pageNext) })] })) : null] })), _jsx(SkinConfirm, { open: removingId !== null, danger: true, title: t(LISTINGS_I18N_KEYS.mineDeleteConfirmTitle), body: t(removal.moves.some((move) => move.to === "archived")
296
+ ? LISTINGS_I18N_KEYS.mineDeleteConfirmBody
297
+ : LISTINGS_I18N_KEYS.mineDeleteConfirmBodyFinal), confirmLabel: t(LISTINGS_I18N_KEYS.mineDelete), confirming: removal.inFlight, "data-testid": "listings-mine-delete-confirm", onConfirm: () => {
274
298
  removal.doRemove();
275
299
  setRemovingId(null);
276
300
  }, onCancel: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"MyListingsPane.js","sourceRoot":"","sources":["../../src/default/MyListingsPane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MyListingsPane.js","sourceRoot":"","sources":["../../src/default/MyListingsPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { CSSProperties, ReactElement } from "react";
2
+ import type { ShareChannel } from "../headless/Share.js";
3
+ export interface ShareActionProps {
4
+ /**
5
+ * The listing's CANONICAL address — the route the container built, absolute
6
+ * or a path. Given, it is what every arm shares and `window.location` is
7
+ * never consulted; see `useShare` for why that distinction is the whole
8
+ * point of the prop.
9
+ */
10
+ readonly url?: string;
11
+ /** The listing's title: the platform sheet's heading and the networks'
12
+ * text. */
13
+ readonly title?: string;
14
+ /** A line under the title in the platform sheet — the price, typically. */
15
+ readonly text?: string;
16
+ /** Analytics, once per completed share. `"native"` never names the app the
17
+ * person chose, because the platform sheet does not tell the page. */
18
+ readonly onShared?: (channel: ShareChannel) => void;
19
+ /** This surface's own test id, so a screen holding a card and a listing
20
+ * page hands a test one element per name. Default `listings-share`. */
21
+ readonly testId?: string;
22
+ /**
23
+ * `"circle"` for the glyph pinned to the corner of a photograph (no room
24
+ * for a word, and the heart beside it is a circle); `"default"` (the
25
+ * default) draws the word beside the glyph wherever the viewport has room
26
+ * for it.
27
+ */
28
+ readonly shape?: "default" | "circle";
29
+ readonly style?: CSSProperties;
30
+ }
31
+ export declare function ShareAction(props: ShareActionProps): ReactElement;
32
+ //# sourceMappingURL=ShareAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareAction.d.ts","sourceRoot":"","sources":["../../src/default/ShareAction.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAQzD,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,sBAAsB,CAAC;AAkBvE,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;eACW;IACX,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;0EACsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACpD;2EACuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAsJjE"}
@@ -0,0 +1,116 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `<ShareAction>` — "share", the verb the storefront did not have.
4
+ *
5
+ * Measured by the owner on the live deployment (2026-09-06): **no share
6
+ * control anywhere in the product.** Not a badly placed one, not one behind a
7
+ * menu — none. The only way to send somebody a listing was the address bar,
8
+ * which on a phone is the hardest thing on the screen to reach and which
9
+ * carries the SERP's query string, the page anchor and whatever tracking
10
+ * parameters the visitor arrived with.
11
+ *
12
+ * ── One control, two renderings, and the DEVICE picks ─────────────────────
13
+ *
14
+ * Where `navigator.share` exists — which is every phone and almost no desktop
15
+ * — the press opens the PLATFORM's own sheet: the person's own apps, in their
16
+ * own order, including the ones we have never heard of. A library that drew
17
+ * its own list of four networks on a phone would be offering a worse version
18
+ * of something the operating system already does better.
19
+ *
20
+ * Where it does not, the press opens a small menu: copy the link, and the
21
+ * three networks a Russian-speaking marketplace actually receives traffic
22
+ * from. This is the DESKTOP rendering, not a fallback for old browsers, which
23
+ * is why it is built rather than apologised for.
24
+ *
25
+ * ── The menu is a Popover, and that is an exception with an argument ──────
26
+ *
27
+ * `stapel/no-tooltip-in-skin` bans `Popover` because of what a hover-triggered
28
+ * one does: it hides text a touch device can never reveal, and it anchors that
29
+ * text to a disabled control that swallows the events it needs. Neither
30
+ * applies here and both are structurally impossible:
31
+ *
32
+ * - the trigger is `"click"` ONLY — no hover arm at all, so a thumb and a
33
+ * cursor reach it by exactly the same gesture;
34
+ * - the anchor is a live, enabled, focusable button;
35
+ * - nothing is EXPLAINED in the overlay. It holds four controls. A menu is
36
+ * the shape this content has had since menus existed, and the alternative
37
+ * — four buttons standing permanently beside the title — is the "24 copies
38
+ * of one sentence" defect that `GateReasonPopover` was written to end,
39
+ * wearing a different hat.
40
+ *
41
+ * ── The word disappears on a phone; the NAME never does ───────────────────
42
+ *
43
+ * `aria-label` carries the verb in every arm and at every width. What the
44
+ * media query drops is the painted word beside the glyph, because at 390px
45
+ * the action row shares a line with a heart and a price. A screen reader
46
+ * announces the same verb on both.
47
+ *
48
+ * ── Every outbound link is `noopener noreferrer` ──────────────────────────
49
+ *
50
+ * `target="_blank"` without `rel="noopener"` hands the opened page a live
51
+ * `window.opener` handle to the storefront's tab, which is a one-line
52
+ * navigation hijack; `noreferrer` keeps the visitor's exact listing URL out of
53
+ * the network's referer log. Both, on all three, without exception.
54
+ */
55
+ import { useCallback, useEffect, useState } from "react";
56
+ import { Flex, Typography } from "antd";
57
+ // eslint-disable-next-line stapel/no-tooltip-in-skin -- a MENU, not a hover explanation: trigger is click-only (a thumb and a cursor use one gesture), the anchor is a live enabled button, and the overlay holds four controls rather than a sentence. See this file's header.
58
+ import { Popover } from "antd";
59
+ import { SkinButton as Button, ErrorAlert } from "@stapel/tokens-antd/skin";
60
+ import { useT } from "@stapel/core";
61
+ import { spacing } from "@stapel/tokens";
62
+ import { useShare } from "../headless/Share.js";
63
+ import { LISTINGS_I18N_KEYS } from "../i18n/keys.js";
64
+ import { LISTING_ACTIONS_STYLE_HREF, LISTING_ACTION_CLASS, LISTING_ACTION_LABEL_CLASS, actionRowCss, } from "./actionRow.js";
65
+ import { LinkIcon, ShareIcon } from "./icons.js";
66
+ import { useNotice } from "./notice.js";
67
+ /** Which sentence names each network row. */
68
+ const NETWORK_LABEL = {
69
+ telegram: LISTINGS_I18N_KEYS.shareTelegram,
70
+ whatsapp: LISTINGS_I18N_KEYS.shareWhatsapp,
71
+ vk: LISTINGS_I18N_KEYS.shareVk,
72
+ };
73
+ export function ShareAction(props) {
74
+ const t = useT();
75
+ const testId = props.testId ?? "listings-share";
76
+ const [open, setOpen] = useState(false);
77
+ const share = useShare({
78
+ url: props.url,
79
+ title: props.title,
80
+ text: props.text,
81
+ ...(props.onShared !== undefined ? { onShared: props.onShared } : {}),
82
+ });
83
+ const label = t(LISTINGS_I18N_KEYS.shareAction);
84
+ const circle = props.shape === "circle";
85
+ const notice = useNotice();
86
+ const copied = share.copied;
87
+ // The toast, and it is the AMPLIFIER of the sentence already standing in
88
+ // the menu — never the only copy of it. See `notice.ts`.
89
+ useEffect(() => {
90
+ if (copied)
91
+ notice(t(LISTINGS_I18N_KEYS.shareCopied));
92
+ }, [copied, notice, t]);
93
+ const onNetwork = useCallback((channel) => {
94
+ share.report(channel);
95
+ setOpen(false);
96
+ }, [share]);
97
+ /**
98
+ * The button itself.
99
+ *
100
+ * In the MENU arm it carries no `onClick` of its own: the `Popover` clones
101
+ * its own click handler onto this child, and a second handler toggling the
102
+ * same controlled state would open the menu and close it again inside one
103
+ * gesture — the defect `GateReasonPopover` documents at length, reached
104
+ * from the other direction.
105
+ */
106
+ const trigger = (_jsx(Button, { ...(circle ? { shape: "circle" } : {}), className: LISTING_ACTION_CLASS, "aria-label": label, "data-testid": testId, "data-share-mode": share.native ? "native" : "menu", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", icon: _jsx(ShareIcon, {}), ...(props.style !== undefined ? { style: props.style } : {}), ...(share.native ? { onClick: share.shareNatively } : {}), children: circle ? null : (_jsx("span", { className: LISTING_ACTION_LABEL_CLASS, children: label })) }));
107
+ const sheet = (_jsxs(_Fragment, { children: [_jsx("style", { href: LISTING_ACTIONS_STYLE_HREF, precedence: "default", children: actionRowCss() }), trigger] }));
108
+ // The platform's own sheet: no overlay of ours, nothing to lay out.
109
+ if (share.native)
110
+ return sheet;
111
+ const menu = (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": `${testId}-menu`, children: [_jsx(Button, { type: "text", className: LISTING_ACTION_CLASS, icon: _jsx(LinkIcon, {}), "data-testid": `${testId}-copy`, "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: share.copy, children: t(LISTINGS_I18N_KEYS.shareCopy) }), share.copied ? (_jsx(Typography.Text, { type: "success", "aria-live": "polite", "data-testid": `${testId}-copied`, children: t(LISTINGS_I18N_KEYS.shareCopied) })) : null, share.copyFailed ? (_jsx(ErrorAlert, { testId: `${testId}-copy-error`, message: t(LISTINGS_I18N_KEYS.shareCopyFailed), variant: "inline" })) : null, share.links.map((link) => (_jsx("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: LISTING_ACTION_CLASS, "data-testid": `${testId}-${link.channel}`, "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", onClick: () => {
112
+ onNetwork(link.channel);
113
+ }, children: t(NETWORK_LABEL[link.channel]) }, link.channel)))] }));
114
+ return (_jsxs(_Fragment, { children: [_jsx("style", { href: LISTING_ACTIONS_STYLE_HREF, precedence: "default", children: actionRowCss() }), _jsx(Popover, { trigger: ["click"], open: open, onOpenChange: setOpen, content: menu, "data-testid": `${testId}-popover`, children: trigger })] }));
115
+ }
116
+ //# sourceMappingURL=ShareAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareAction.js","sourceRoot":"","sources":["../../src/default/ShareAction.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /** The class every control in the PAGE cluster carries: the 44px floor. */
2
+ export declare const LISTING_ACTION_CLASS = "stapel-listing-action";
3
+ /**
4
+ * The class a CARD's control carries — the same floor, one tier smaller on a
5
+ * pointer device.
6
+ *
7
+ * A card heart is drawn forty to a screen on a desktop grid, where the
8
+ * reference classified uses a 36px target and a cursor hits it every time;
9
+ * the same glyph on a phone is a thumb target and goes back to 44. Two tiers
10
+ * rather than one number, because a 44px circle in the corner of a 267px
11
+ * photograph is a fifth of the picture's height on a desktop — measured
12
+ * against the reference (§23), which is why this is not simply
13
+ * {@link LISTING_ACTION_CLASS}.
14
+ *
15
+ * The GLYPH does not change size in either tier; only the box around it does.
16
+ */
17
+ export declare const LISTING_CARD_ACTION_CLASS = "stapel-listing-card-action";
18
+ /** The class the cluster's row carries. */
19
+ export declare const LISTING_ACTIONS_CLASS = "stapel-listing-actions";
20
+ /**
21
+ * The class that pins the cluster to the trailing TOP corner of the media it
22
+ * is drawn over.
23
+ *
24
+ * Top-trailing is the one corner of a card gallery that is free: the dots own
25
+ * the bottom centre (`SkinCarousel`) and the "3 of 16" counter owns the
26
+ * bottom trailing corner (`cardGalleryCss`). Nothing here may move into
27
+ * either, which is why this is a named constant with a comment rather than
28
+ * two numbers picked per surface.
29
+ */
30
+ export declare const LISTING_ACTIONS_OVERLAY_CLASS = "stapel-listing-actions-over";
31
+ /** The class on the WORD beside a glyph — painted on a desktop, dropped on a
32
+ * phone, where the same word is still the control's accessible name. */
33
+ export declare const LISTING_ACTION_LABEL_CLASS = "stapel-listing-action-label";
34
+ /** The `href` the hoisted action-row stylesheet is deduplicated by. */
35
+ export declare const LISTING_ACTIONS_STYLE_HREF = "stapel-listings-action-row";
36
+ /**
37
+ * The minimum touch target for every control in the cluster, in CSS pixels.
38
+ *
39
+ * Exported so a host laying out beside the cluster measures against the same
40
+ * number — and so `test/shareAction.test.tsx` asserts the rule carries THIS
41
+ * value rather than a literal that could drift from the token.
42
+ */
43
+ export declare const LISTING_ACTION_HIT: number;
44
+ /**
45
+ * A CARD control's minimum target on a pointer device, in CSS pixels.
46
+ *
47
+ * The reference classified's own desktop measurement (§23). It is not on the
48
+ * token scale, and it is not meant to be: the scale carries a control HEIGHT
49
+ * (32) and a touch FLOOR (44), and this is the third thing — the smallest box
50
+ * a cursor reliably hits around a 16px glyph. Named, with the measurement,
51
+ * rather than typed into a stylesheet as `36`.
52
+ *
53
+ * On a phone the card control goes back to {@link LISTING_ACTION_HIT}: there
54
+ * is no such thing as a small touch target.
55
+ */
56
+ export declare const LISTING_CARD_ACTION_HIT = 36;
57
+ export declare function actionRowCss(): string;
58
+ //# sourceMappingURL=actionRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionRow.d.ts","sourceRoot":"","sources":["../../src/default/actionRow.ts"],"names":[],"mappings":"AA6BA,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAC5D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAC3E;wEACwE;AACxE,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;AACxE,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAiC,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,wBAAgB,YAAY,IAAI,MAAM,CA0CrC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * The geometry of a listing's action row — the heart, the share button, and
3
+ * the rules that make both of them reachable with a thumb.
4
+ *
5
+ * Split out of `<ListingActions>` so `<ShareAction>` can carry the same class
6
+ * without the two modules importing each other, and so the numbers below are
7
+ * something a test can READ rather than something a rendered button implies.
8
+ *
9
+ * ── Why a class and not an inline style ───────────────────────────────────
10
+ *
11
+ * Three of the four rules here cannot be written inline at all: a media query
12
+ * (the label that disappears on a phone), a descendant selector (the hit area
13
+ * of whatever element the skin registry substituted for antd's button), and
14
+ * `:focus-visible`. The fourth — the 44px floor — is written here with them so
15
+ * that "how big is this control" has ONE answer in this package instead of one
16
+ * per surface, which is how the SERP heart ended up 32px while the feed
17
+ * heart was 40 and neither was the number the platform guidelines ask for.
18
+ *
19
+ * ── 44 px, and where the number comes from ────────────────────────────────
20
+ *
21
+ * `controls["height-phone"]` — the token dictionary's own touch floor, the
22
+ * same value `SkinTheme` feeds antd as `controlHeight` on a phone (WCAG 2.5.8
23
+ * and both platform HIGs land on 44 CSS px). It is applied here as a MINIMUM
24
+ * on every viewport rather than only on a phone: these two controls are small
25
+ * glyphs pinned to the corner of a photograph, and a 32px circle at the edge
26
+ * of an image is a miss on a touchscreen laptop as surely as on a phone.
27
+ */
28
+ import { breakpoints, controls, radii, spacing } from "@stapel/tokens";
29
+ /** The class every control in the PAGE cluster carries: the 44px floor. */
30
+ export const LISTING_ACTION_CLASS = "stapel-listing-action";
31
+ /**
32
+ * The class a CARD's control carries — the same floor, one tier smaller on a
33
+ * pointer device.
34
+ *
35
+ * A card heart is drawn forty to a screen on a desktop grid, where the
36
+ * reference classified uses a 36px target and a cursor hits it every time;
37
+ * the same glyph on a phone is a thumb target and goes back to 44. Two tiers
38
+ * rather than one number, because a 44px circle in the corner of a 267px
39
+ * photograph is a fifth of the picture's height on a desktop — measured
40
+ * against the reference (§23), which is why this is not simply
41
+ * {@link LISTING_ACTION_CLASS}.
42
+ *
43
+ * The GLYPH does not change size in either tier; only the box around it does.
44
+ */
45
+ export const LISTING_CARD_ACTION_CLASS = "stapel-listing-card-action";
46
+ /** The class the cluster's row carries. */
47
+ export const LISTING_ACTIONS_CLASS = "stapel-listing-actions";
48
+ /**
49
+ * The class that pins the cluster to the trailing TOP corner of the media it
50
+ * is drawn over.
51
+ *
52
+ * Top-trailing is the one corner of a card gallery that is free: the dots own
53
+ * the bottom centre (`SkinCarousel`) and the "3 of 16" counter owns the
54
+ * bottom trailing corner (`cardGalleryCss`). Nothing here may move into
55
+ * either, which is why this is a named constant with a comment rather than
56
+ * two numbers picked per surface.
57
+ */
58
+ export const LISTING_ACTIONS_OVERLAY_CLASS = "stapel-listing-actions-over";
59
+ /** The class on the WORD beside a glyph — painted on a desktop, dropped on a
60
+ * phone, where the same word is still the control's accessible name. */
61
+ export const LISTING_ACTION_LABEL_CLASS = "stapel-listing-action-label";
62
+ /** The `href` the hoisted action-row stylesheet is deduplicated by. */
63
+ export const LISTING_ACTIONS_STYLE_HREF = "stapel-listings-action-row";
64
+ /**
65
+ * The minimum touch target for every control in the cluster, in CSS pixels.
66
+ *
67
+ * Exported so a host laying out beside the cluster measures against the same
68
+ * number — and so `test/shareAction.test.tsx` asserts the rule carries THIS
69
+ * value rather than a literal that could drift from the token.
70
+ */
71
+ export const LISTING_ACTION_HIT = controls["height-phone"];
72
+ /**
73
+ * A CARD control's minimum target on a pointer device, in CSS pixels.
74
+ *
75
+ * The reference classified's own desktop measurement (§23). It is not on the
76
+ * token scale, and it is not meant to be: the scale carries a control HEIGHT
77
+ * (32) and a touch FLOOR (44), and this is the third thing — the smallest box
78
+ * a cursor reliably hits around a 16px glyph. Named, with the measurement,
79
+ * rather than typed into a stylesheet as `36`.
80
+ *
81
+ * On a phone the card control goes back to {@link LISTING_ACTION_HIT}: there
82
+ * is no such thing as a small touch target.
83
+ */
84
+ export const LISTING_CARD_ACTION_HIT = 36;
85
+ export function actionRowCss() {
86
+ const action = `.${LISTING_ACTION_CLASS}`;
87
+ const cardAction = `.${LISTING_CARD_ACTION_CLASS}`;
88
+ const row = `.${LISTING_ACTIONS_CLASS}`;
89
+ const over = `.${LISTING_ACTIONS_OVERLAY_CLASS}`;
90
+ const label = `.${LISTING_ACTION_LABEL_CLASS}`;
91
+ const hit = String(LISTING_ACTION_HIT);
92
+ const phone = `(max-width:${String(breakpoints.tablet - 1)}px)`;
93
+ return [
94
+ // The floor. `min-*` rather than `width`/`height`: a share button with a
95
+ // word in it is wider than 44px and must stay so, and antd's own
96
+ // `controlHeight` already reaches the height on a phone — this is the
97
+ // guarantee for every OTHER viewport and for a host-registered button
98
+ // that never read the antd token at all.
99
+ `${action}{min-inline-size:${hit}px;min-block-size:${hit}px;` +
100
+ `display:inline-flex;align-items:center;justify-content:center}`,
101
+ // A card's control: one tier smaller where there is a cursor, the same
102
+ // 44px where there is a thumb. See LISTING_CARD_ACTION_HIT.
103
+ `${cardAction}{min-inline-size:${String(LISTING_CARD_ACTION_HIT)}px;` +
104
+ `min-block-size:${String(LISTING_CARD_ACTION_HIT)}px;` +
105
+ `display:inline-flex;align-items:center;justify-content:center}`,
106
+ `@media ${phone}{${cardAction}{min-inline-size:${hit}px;min-block-size:${hit}px}}`,
107
+ // The cluster. `align-items:flex-end` so a blocked heart's reason — the
108
+ // one thing here that can be two lines — stacks against the same edge
109
+ // instead of pushing the controls inwards (the arrangement
110
+ // `<ListingFeedCard>` already ships).
111
+ `${row}{display:flex;align-items:flex-end;gap:${String(spacing[2])}px}`,
112
+ // Over a photograph. `z-index:2` puts it above the counter's `1`; the two
113
+ // never meet anyway (top-trailing against bottom-trailing) and the layer
114
+ // is stated so a future third overlay has an order to join.
115
+ `${over}{position:absolute;inset-block-start:${String(spacing[2])}px;` +
116
+ `inset-inline-end:${String(spacing[2])}px;z-index:2;` +
117
+ `flex-direction:column;align-items:flex-end;` +
118
+ `border-radius:${String(radii.full)}px}`,
119
+ // THE WORD DISAPPEARS ON A PHONE, THE NAME NEVER DOES. Both controls
120
+ // carry their `aria-label` in every arm, so what a screen reader
121
+ // announces is identical at 390px and at 1440px; what changes is whether
122
+ // there is room to paint the word as well. A viewport query rather than a
123
+ // container one: this is chrome, not a layout that has to fit a track,
124
+ // and the question really is "is this a phone".
125
+ `@media ${phone}{${label}{display:none}}`,
126
+ ].join("");
127
+ }
128
+ //# sourceMappingURL=actionRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionRow.js","sourceRoot":"","sources":["../../src/default/actionRow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEvE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC5D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,4BAA4B,CAAC;AACtE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAC9D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC;AAC3E;wEACwE;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AACxE,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAW,QAAQ,CAAC,cAAc,CAAC,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,yBAAyB,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,6BAA6B,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,cAAc,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;IAChE,OAAO;QACL,yEAAyE;QACzE,iEAAiE;QACjE,sEAAsE;QACtE,sEAAsE;QACtE,yCAAyC;QACzC,GAAG,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,KAAK;YAC3D,gEAAgE;QAClE,uEAAuE;QACvE,4DAA4D;QAC5D,GAAG,UAAU,oBAAoB,MAAM,CAAC,uBAAuB,CAAC,KAAK;YACnE,kBAAkB,MAAM,CAAC,uBAAuB,CAAC,KAAK;YACtD,gEAAgE;QAClE,UAAU,KAAK,IAAI,UAAU,oBAAoB,GAAG,qBAAqB,GAAG,MAAM;QAClF,wEAAwE;QACxE,sEAAsE;QACtE,2DAA2D;QAC3D,sCAAsC;QACtC,GAAG,GAAG,0CAA0C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,4DAA4D;QAC5D,GAAG,IAAI,wCAAwC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;YACpE,oBAAoB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe;YACrD,6CAA6C;YAC7C,iBAAiB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;QAC1C,qEAAqE;QACrE,iEAAiE;QACjE,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,gDAAgD;QAChD,UAAU,KAAK,IAAI,KAAK,iBAAiB;KAC1C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { PointerEvent as ReactPointerEvent, RefObject } from "react";
2
2
  /** The class the gallery's own box carries — see {@link cardGalleryCss}. */
3
3
  export declare const CARD_GALLERY_CLASS = "stapel-listing-gallery";
4
+ /** The class the "3 of 16" pill carries — see {@link cardGalleryCss}. */
5
+ export declare const CARD_GALLERY_COUNTER_CLASS = "stapel-listing-gallery-count";
4
6
  /** The `href` the hoisted gallery stylesheet is deduplicated by. */
5
7
  export declare const CARD_GALLERY_STYLE_HREF = "stapel-listings-card-gallery";
6
8
  /** The environment a hover scrub is allowed in, and the only one. */
@@ -1 +1 @@
1
- {"version":3,"file":"cardGallery.d.ts","sourceRoot":"","sources":["../../src/default/cardGallery.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,YAAY,IAAI,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1E,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAEtE,qEAAqE;AACrE,eAAO,MAAM,WAAW,uCAAuC,CAAC;AAEhE;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAK5D;AAED;;;qDAGqD;AACrD,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CA0BxC;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD;6DACyD;IACzD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC7E;AAoBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAgIzD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAevC"}
1
+ {"version":3,"file":"cardGallery.d.ts","sourceRoot":"","sources":["../../src/default/cardGallery.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,YAAY,IAAI,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1E,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,iCAAiC,CAAC;AACzE,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAEtE,qEAAqE;AACrE,eAAO,MAAM,WAAW,uCAAuC,CAAC;AAEhE;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAK5D;AAED;;;qDAGqD;AACrD,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CA0BxC;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD;6DACyD;IACzD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC7E;AAoBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAgIzD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CA2CvC"}
@@ -45,8 +45,11 @@
45
45
  * anchor with one accessible name.
46
46
  */
47
47
  import { useCallback, useEffect, useRef, useState } from "react";
48
+ import { fontSize, radii, spacing } from "@stapel/tokens";
48
49
  /** The class the gallery's own box carries — see {@link cardGalleryCss}. */
49
50
  export const CARD_GALLERY_CLASS = "stapel-listing-gallery";
51
+ /** The class the "3 of 16" pill carries — see {@link cardGalleryCss}. */
52
+ export const CARD_GALLERY_COUNTER_CLASS = "stapel-listing-gallery-count";
50
53
  /** The `href` the hoisted gallery stylesheet is deduplicated by. */
51
54
  export const CARD_GALLERY_STYLE_HREF = "stapel-listings-card-gallery";
52
55
  /** The environment a hover scrub is allowed in, and the only one. */
@@ -297,7 +300,35 @@ export function useCardGallery(count) {
297
300
  */
298
301
  export function cardGalleryCss() {
299
302
  const box = `.${CARD_GALLERY_CLASS}`;
303
+ const counter = `.${CARD_GALLERY_COUNTER_CLASS}`;
300
304
  return [
305
+ // The counter is placed against this box, so the box has to be the
306
+ // containing block. Nothing else about the gallery changes: a `relative`
307
+ // with no offsets moves no pixel of what is already in it.
308
+ `${box}{position:relative}`,
309
+ // "3 of 16", bottom-TRAILING corner — the dots own the bottom centre
310
+ // (`SkinCarousel`: `inset-inline:0; justify-content:center`) and two
311
+ // indicators fighting for one spot is worse than neither.
312
+ //
313
+ // `pointer-events:none` is load-bearing rather than tidy: this box owns
314
+ // the hover-scrub and the swipe, and an element that swallowed a pointer
315
+ // would make one corner of every card's photograph dead to both gestures.
316
+ //
317
+ // A FIXED scrim and white text, not a theme role, and this is the one
318
+ // place in the package where that is the right answer: the pill sits on
319
+ // an arbitrary PHOTOGRAPH, which is neither light nor dark, so a value
320
+ // that followed the page's theme would be unreadable on half the photos
321
+ // in either one.
322
+ `${counter}{position:absolute;inset-block-end:${String(spacing[2])}px;` +
323
+ `inset-inline-end:${String(spacing[2])}px;z-index:1;pointer-events:none;` +
324
+ `padding:${String(spacing[1] / 2)}px ${String(spacing[2])}px;` +
325
+ `border-radius:${String(radii.full)}px;` +
326
+ `background:rgba(0,0,0,0.55);color:#fff;` +
327
+ `font-size:${String(fontSize.xs.fontSize)}px;` +
328
+ `line-height:${String(fontSize.xs.lineHeight)}px;` +
329
+ // A counter whose digits change width makes the pill twitch on every
330
+ // swipe.
331
+ `font-variant-numeric:tabular-nums}`,
301
332
  // THE VERTICAL AXIS IS THE BROWSER'S, and is not negotiable: a card is a
302
333
  // small box in a long feed, and the one unacceptable outcome of a gallery
303
334
  // gesture is a page that will not scroll. `pan-y` says so at the platform