@stapel/listings-react 0.29.1 → 0.30.1

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 (64) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/dist/default/CardBadges.d.ts +32 -0
  3. package/dist/default/CardBadges.d.ts.map +1 -1
  4. package/dist/default/CardBadges.js +41 -3
  5. package/dist/default/CardBadges.js.map +1 -1
  6. package/dist/default/ListingDetailPane.d.ts +115 -8
  7. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  8. package/dist/default/ListingDetailPane.js +366 -177
  9. package/dist/default/ListingDetailPane.js.map +1 -1
  10. package/dist/default/ListingRelated.d.ts +88 -0
  11. package/dist/default/ListingRelated.d.ts.map +1 -0
  12. package/dist/default/ListingRelated.js +41 -0
  13. package/dist/default/ListingRelated.js.map +1 -0
  14. package/dist/default/ListingSpecList.d.ts +29 -34
  15. package/dist/default/ListingSpecList.d.ts.map +1 -1
  16. package/dist/default/ListingSpecList.js +67 -12
  17. package/dist/default/ListingSpecList.js.map +1 -1
  18. package/dist/default/condensedBar.d.ts +17 -0
  19. package/dist/default/condensedBar.d.ts.map +1 -0
  20. package/dist/default/condensedBar.js +73 -0
  21. package/dist/default/condensedBar.js.map +1 -0
  22. package/dist/default/detailGallery.d.ts +40 -40
  23. package/dist/default/detailGallery.d.ts.map +1 -1
  24. package/dist/default/detailGallery.js +129 -0
  25. package/dist/default/detailGallery.js.map +1 -1
  26. package/dist/default/detailRhythm.d.ts +90 -0
  27. package/dist/default/detailRhythm.d.ts.map +1 -0
  28. package/dist/default/detailRhythm.js +51 -0
  29. package/dist/default/detailRhythm.js.map +1 -0
  30. package/dist/default/icons.d.ts +13 -0
  31. package/dist/default/icons.d.ts.map +1 -1
  32. package/dist/default/icons.js +15 -0
  33. package/dist/default/icons.js.map +1 -1
  34. package/dist/default/index.d.ts +9 -5
  35. package/dist/default/index.d.ts.map +1 -1
  36. package/dist/default/index.js +13 -4
  37. package/dist/default/index.js.map +1 -1
  38. package/dist/i18n/es.d.ts.map +1 -1
  39. package/dist/i18n/es.js +9 -0
  40. package/dist/i18n/es.js.map +1 -1
  41. package/dist/i18n/keys.d.ts +23 -0
  42. package/dist/i18n/keys.d.ts.map +1 -1
  43. package/dist/i18n/keys.js +32 -0
  44. package/dist/i18n/keys.js.map +1 -1
  45. package/dist/i18n/ru.d.ts.map +1 -1
  46. package/dist/i18n/ru.js +9 -0
  47. package/dist/i18n/ru.js.map +1 -1
  48. package/llms.txt +3 -2
  49. package/manifest.json +28 -1
  50. package/nav-manifest.json +1 -1
  51. package/package.json +4 -4
  52. package/src/analytics/generated/events.json +1 -1
  53. package/src/default/CardBadges.tsx +65 -4
  54. package/src/default/ListingDetailPane.tsx +501 -55
  55. package/src/default/ListingRelated.tsx +154 -0
  56. package/src/default/ListingSpecList.tsx +64 -1
  57. package/src/default/condensedBar.ts +74 -0
  58. package/src/default/detailGallery.ts +141 -0
  59. package/src/default/detailRhythm.ts +107 -0
  60. package/src/default/icons.tsx +32 -0
  61. package/src/default/index.ts +46 -2
  62. package/src/i18n/es.ts +9 -0
  63. package/src/i18n/keys.ts +32 -0
  64. package/src/i18n/ru.ts +9 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,147 @@
1
1
  # @stapel/listings-react
2
2
 
3
+ ## 0.30.1
4
+
5
+ ### Patch Changes
6
+
7
+ - `<ListingDetailPane>`: a heading's own margin stops adding to the column's
8
+ declared gap.
9
+
10
+ The pane's block columns already reset every direct child's `margin-block` to
11
+ zero, and headings were the one child the sheet could not reach: that reset is
12
+ `.column > *` — one class, specificity (0,1,0) — while antd writes its heading
13
+ margins as `h2.ant-typography`, one class AND one element, (0,1,1). So a
14
+ `<Typography.Title>` kept its own margin and it ADDED to the gap. Measured on
15
+ the stand with the reset live: 29px between the price and the button under it
16
+ at 1440 and 27 at 390, where the buy column declares 12; 42.4 and 53.6 in the
17
+ reading column, where it declares 16.
18
+
19
+ An inline declaration is the one thing that beats a sheet without an
20
+ `!important`, so the pane's headings state the reset themselves
21
+ (`DETAIL_TITLE_RESET`, exported) — the price, the listing's title, and both
22
+ section headings, swept together, both ends of the block axis because a heading
23
+ after a paragraph takes antd's `margin-top` as well. The column's declared gap
24
+ is now the only spacing between its blocks.
25
+
26
+ ## 0.30.0
27
+
28
+ ### Minor Changes
29
+
30
+ - 0421227: The listing page gets the four things the reference has and it did not.
31
+
32
+ Four rows of the closing-wave comparison inventory, all on
33
+ `<ListingDetailPane>`, plus one verdict that is not a defect in this package.
34
+
35
+ **A condensed bar the pane draws itself.** Past the first screen the reference
36
+ classified pins back / title / heart / share to the top of a phone listing;
37
+ this pane offered `renderActionsBar` and left every container to write the
38
+ same four things. `actionsPlacement={["header", "condensed-top"]}` is the pane
39
+ drawing it — `onBack` is the arrow (absent, there is none: a listing opened in
40
+ a new tab has nowhere to go back to), the title is one ellipsised line, and
41
+ the cluster is the SAME travelling `<ListingActions>` the movable-cluster
42
+ portal already moves, so the page still mounts one `useFavoriteToggle` and one
43
+ `aria-pressed` heart. The threshold is the title leaving the fold rather than
44
+ the reference's "~160px", which is a fact about its own header height. A host
45
+ that also passes `renderActionsBar` keeps it: the specific answer beats the
46
+ default one, and two bars never stack.
47
+
48
+ **The strip says where it is.** `galleryLayout="strip"` is a native scroll
49
+ container and the page had no active-photo indicator at all (§20b: a full
50
+ slide of `scrollLeft` moved the strip and moved nothing else).
51
+ `useGalleryPosition` reads the strip's own `scroll`, throttled to one
52
+ measurement per animation frame, from live rectangles rather than
53
+ `scrollLeft / slideWidth` — and the "3 of 16" pill stands in a frame BESIDE
54
+ the strip, because an absolutely positioned child of a scroller scrolls away
55
+ with the content it is counting. Nothing here is keyed off a tap: the gesture
56
+ that changes the photograph is not one.
57
+
58
+ **Four canned questions above the contact control.** `quickQuestions` (the
59
+ pair's own four, in en/ru/es; a host's own list; `[]` to switch off, capped at
60
+ four) with `onQuickQuestion` reporting the press. The press is a callback and
61
+ not a prefilled composer on purpose: `@stapel/chat-react` 0.12.1's door takes
62
+ no initial message — `<StartDirectChat>` takes a seller and a subject,
63
+ `useStartDirectChat` posts `{userId, subject}`, `<MessageComposer>` opens on an
64
+ empty string — so a pane that claimed to seed it would be inventing a seam the
65
+ other pair does not have. Without the callback the block is not drawn, and the
66
+ owner never sees it: the owner is the person being asked.
67
+
68
+ **Two "find more" strips.** `similar` / `fromSeller` take rows and draw
69
+ `<ListingRelatedStrip>`; `renderSimilar` / `renderFromSeller` take the whole
70
+ section and are handed `{listingId, categoryId, ownerKey, axes}` to build a
71
+ query with. Two sections and not one rail, because the reference draws two and
72
+ they answer different questions. The rows come from the host's search: this
73
+ pair does not read search, and the detail wire carries a category id, not a
74
+ slug. Neither strip is drawn empty.
75
+
76
+ **And the characteristics table, which was not the bug.** The comparison
77
+ measured ~2.5× fewer fields than the reference on the same kind of listing.
78
+ Read against a live answer: the pane applies no cap and no filter beyond
79
+ dropping form `header` rows, and it counts what it cannot key
80
+ (`listings-detail-unreadable`). The shortfall is in the DATA — the listing the
81
+ comparison measured carries seven feature rows on the wire, and a
82
+ fully-filled one in the same category carries twenty-eight, all of which the
83
+ pane draws. What is added is the reference's FOLD, not rows:
84
+ `<ListingSpecList limit>` / `<ListingDetailPane characteristicsLimit>`, default
85
+ unlimited, folding only when it saves at least two rows, opening in place.
86
+
87
+ Also fixed on the way past: `useTitleVisibility` attached a fresh
88
+ `IntersectionObserver` to the heading on every render. `<Typography.Title ref>`
89
+ is antd's, which merges refs and invokes them itself, and a ref callback's
90
+ return value means nothing to a caller that is not React — so the cleanup was
91
+ dropped. Three live observers on one `<h1>` after two crossings, each
92
+ announcing the crossing again to `onTitleVisible`. The hook now holds the one
93
+ live observer by the node it watches and disconnects from an effect as well.
94
+
95
+ `test/detailCondensedBar`, `test/detailGalleryPosition`,
96
+ `test/detailQuickQuestions` and `test/detailRelated` are the four; the bar's
97
+ cluster is asserted by ELEMENT IDENTITY across the move, the gallery by a faked
98
+ strip scroll, and the observer by the count of LIVE observers after three
99
+ crossings.
100
+
101
+ The `/default` size budget is raised 31 → 33 KB (measured 31.84) — the note in
102
+ `package.json` says what was bought and what was measured against what.
103
+
104
+ **And the page's own rhythm, which was the sum of two systems.** The stand's
105
+ tidiness probe measured the gaps INSIDE `<ListingDetailPane>`'s column at 1440
106
+ and 390: 111.05, 53.59, 42.39, 29 and 27 pixels, in a container that declares
107
+ 16 (12 in the buy column). Five distances, none of them chosen. A flex `gap`
108
+ governs only the space a container puts BETWEEN its children, and half the
109
+ children here are antd components carrying an outer margin of their own —
110
+ `<Divider>` 24 above and 24 below, `<Typography.Title>` its level's
111
+ margin-block-start, `<Typography.Paragraph>` about a line — and a margin and a
112
+ gap add.
113
+
114
+ `detailRhythm.ts` is the answer, and it is deliberately the same three-line
115
+ answer `@stapel/categories-react`'s `blockRhythm.ts` gives a catalogue page:
116
+ `margin-block: 0` on every direct child of each of the pane's three block
117
+ columns (the page column, and the split layout's reading and buy columns). The
118
+ section rule is the one exception, because a horizontal rule is a BREAK and
119
+ not a block: `DETAIL_RULE_CLASS` gives it one token step on each side
120
+ (`DETAIL_RULE_SPACE`, `spacing[2]`), so the break lands at `gap + step` and the
121
+ number is a decision rather than whatever antd's 24 summed to. Specificity, not
122
+ `!important`: `.column > .rule` beats `.column > *`, and a host can still
123
+ out-specify both.
124
+
125
+ **The card's spec line was a correct picture over a wrong box.**
126
+ `listings-card-specs-text` measured 57px wider than the element it sits in.
127
+ `<Typography.Text ellipsis>` clips on ITSELF and the badge row's `<span>` is a
128
+ separate inline box that lays out at its natural width regardless — so the
129
+ overflow was hidden and the geometry was still wrong, which is what a container
130
+ measuring the card reads. The line is a flex container now and the span a flex
131
+ child with `min-inline-size: 0` — the declaration without which a flex item
132
+ stays pinned at `min-width: auto` and every other rule is decoration — with the
133
+ `overflow`/`white-space`/`text-overflow` moved onto the span that holds the
134
+ words.
135
+
136
+ `test/detailRhythm.tsx` enumerates every direct child of each column and
137
+ asserts the reset's selector matches it (jsdom resolves no `margin-block` from
138
+ a sheet, so the claim is the scope plus the absence of any inline margin that
139
+ would beat it), and `test/cardSpecLineBox.tsx` asserts the flex child and its
140
+ `min-inline-size`. Both were red before: four of the eight assertions fail with
141
+ the classes removed.
142
+
143
+ No budget change: `/default` measures 31.98 of 33.
144
+
3
145
  ## 0.29.1
4
146
 
5
147
  ### Patch Changes
@@ -36,6 +36,38 @@ export interface CardBadgesProps {
36
36
  readonly variant: "badges" | "line";
37
37
  readonly testId?: string;
38
38
  }
39
+ /** The class the spec line's own box carries. */
40
+ export declare const CARD_SPEC_LINE_CLASS = "stapel-listing-spec-line";
41
+ /** The class the spec line's TEXT carries — see {@link cardSpecLineCss}. */
42
+ export declare const CARD_SPEC_TEXT_CLASS = "stapel-listing-spec-line-text";
43
+ /** The `href` the hoisted spec-line stylesheet is deduplicated by. */
44
+ export declare const CARD_SPEC_STYLE_HREF = "stapel-listings-card-spec-line";
45
+ /**
46
+ * THE SPEC LINE TRUNCATES, AND THE THING THAT TRUNCATES IS THE THING THAT
47
+ * HOLDS THE TEXT.
48
+ *
49
+ * `<Typography.Text ellipsis>` writes `overflow:hidden`, `white-space:nowrap`
50
+ * and `text-overflow:ellipsis` on ITSELF, and the text inside it is a separate
51
+ * `<span>` — the badge row's own element. An inline span lays out at its
52
+ * natural width regardless of what its parent clips, so the line was drawn
53
+ * correctly (the overflow is hidden) over a box that is wrong: the stand's
54
+ * tidiness probe measured `listings-card-specs-text` 57px wider than the
55
+ * element it sits in. A box that reports a width nothing on screen has is a
56
+ * defect whether or not a pixel of it is visible — it is what a container
57
+ * measuring the card, a sticky-header calculation or the next layout rule
58
+ * reads.
59
+ *
60
+ * So the truncation moves ONTO the span. The line becomes a flex container
61
+ * and the span a flex child with `min-inline-size: 0`, which is the
62
+ * declaration that lets a flex child shrink below its content at all — without
63
+ * it `min-width:auto` keeps the box at the text's natural width and every
64
+ * other rule here is decoration.
65
+ *
66
+ * A sheet rather than inline styles because the span is rendered by
67
+ * `<CardBadges>` and the box by antd, and an inline style cannot reach a
68
+ * child.
69
+ */
70
+ export declare function cardSpecLineCss(): string;
39
71
  export declare function CardBadges(props: CardBadgesProps): ReactElement | null;
40
72
  /** The spec line under a card's title, wrapped in the secondary, truncating
41
73
  * text every surface already draws it in. */
@@ -1 +1 @@
1
- {"version":3,"file":"CardBadges.d.ts","sourceRoot":"","sources":["../../src/default/CardBadges.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C;8EAC0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAwCtE;AAED;6CAC6C;AAC7C,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,GAAG,IAAI,CAOtB"}
1
+ {"version":3,"file":"CardBadges.d.ts","sourceRoot":"","sources":["../../src/default/CardBadges.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C;8EAC0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAC/D,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,mCAAmC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CA2CtE;AAED;6CAC6C;AAC7C,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,GAAG,IAAI,CAyBtB"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Flex, Tag, Typography } from "antd";
3
3
  import { SkinTheme } from "@stapel/tokens-antd/skin";
4
4
  import { useI18n } from "@stapel/core";
@@ -8,6 +8,44 @@ import { cardBadgeTexts, hasCardBadgeContract } from "../model/cardBadges.js";
8
8
  import { featuresDtoFromDaoList, featuresFromDaoList } from "../model/features.js";
9
9
  /** The separator of a spec line — the one every classified uses. */
10
10
  const LINE_SEPARATOR = " · ";
11
+ /** The class the spec line's own box carries. */
12
+ export const CARD_SPEC_LINE_CLASS = "stapel-listing-spec-line";
13
+ /** The class the spec line's TEXT carries — see {@link cardSpecLineCss}. */
14
+ export const CARD_SPEC_TEXT_CLASS = "stapel-listing-spec-line-text";
15
+ /** The `href` the hoisted spec-line stylesheet is deduplicated by. */
16
+ export const CARD_SPEC_STYLE_HREF = "stapel-listings-card-spec-line";
17
+ /**
18
+ * THE SPEC LINE TRUNCATES, AND THE THING THAT TRUNCATES IS THE THING THAT
19
+ * HOLDS THE TEXT.
20
+ *
21
+ * `<Typography.Text ellipsis>` writes `overflow:hidden`, `white-space:nowrap`
22
+ * and `text-overflow:ellipsis` on ITSELF, and the text inside it is a separate
23
+ * `<span>` — the badge row's own element. An inline span lays out at its
24
+ * natural width regardless of what its parent clips, so the line was drawn
25
+ * correctly (the overflow is hidden) over a box that is wrong: the stand's
26
+ * tidiness probe measured `listings-card-specs-text` 57px wider than the
27
+ * element it sits in. A box that reports a width nothing on screen has is a
28
+ * defect whether or not a pixel of it is visible — it is what a container
29
+ * measuring the card, a sticky-header calculation or the next layout rule
30
+ * reads.
31
+ *
32
+ * So the truncation moves ONTO the span. The line becomes a flex container
33
+ * and the span a flex child with `min-inline-size: 0`, which is the
34
+ * declaration that lets a flex child shrink below its content at all — without
35
+ * it `min-width:auto` keeps the box at the text's natural width and every
36
+ * other rule here is decoration.
37
+ *
38
+ * A sheet rather than inline styles because the span is rendered by
39
+ * `<CardBadges>` and the box by antd, and an inline style cannot reach a
40
+ * child.
41
+ */
42
+ export function cardSpecLineCss() {
43
+ return [
44
+ `.${CARD_SPEC_LINE_CLASS}{display:flex;min-inline-size:0}`,
45
+ `.${CARD_SPEC_TEXT_CLASS}{flex:1 1 auto;min-inline-size:0;` +
46
+ `overflow:hidden;white-space:nowrap;text-overflow:ellipsis}`,
47
+ ].join("");
48
+ }
11
49
  export function CardBadges(props) {
12
50
  const { locale } = useI18n();
13
51
  const rows = props.rows;
@@ -20,7 +58,7 @@ export function CardBadges(props) {
20
58
  if (printed.length === 0)
21
59
  return null;
22
60
  if (props.variant === "line") {
23
- return (_jsx("span", { "data-testid": props.testId ?? "listings-card-badges", children: printed.map((one) => one.text).join(LINE_SEPARATOR) }));
61
+ return (_jsx("span", { className: CARD_SPEC_TEXT_CLASS, "data-testid": props.testId ?? "listings-card-badges", children: printed.map((one) => one.text).join(LINE_SEPARATOR) }));
24
62
  }
25
63
  return (_jsx(SkinTheme, { surface: "bare", children: _jsx(Flex, { gap: spacing[1], wrap: true, "data-testid": props.testId ?? "listings-card-badges", children: printed.map((one) => (_jsx(Tag, { "data-testid": `listings-card-badge-${one.slug}`, children: one.text }, one.slug))) }) }));
26
64
  }
@@ -35,6 +73,6 @@ export function CardBadges(props) {
35
73
  export function CardSpecLine(props) {
36
74
  if (props.rows.length === 0)
37
75
  return null;
38
- return (_jsx(Typography.Text, { type: "secondary", ellipsis: true, "data-testid": props.testId, children: _jsx(CardBadges, { rows: props.rows, copy: props.copy, variant: "line", testId: `${props.testId}-text` }) }));
76
+ return (_jsxs(_Fragment, { children: [_jsx("style", { href: CARD_SPEC_STYLE_HREF, precedence: "default", children: cardSpecLineCss() }), _jsx(Typography.Text, { type: "secondary", ellipsis: true, className: CARD_SPEC_LINE_CLASS, "data-testid": props.testId, children: _jsx(CardBadges, { rows: props.rows, copy: props.copy, variant: "line", testId: `${props.testId}-text` }) })] }));
39
77
  }
40
78
  //# sourceMappingURL=CardBadges.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CardBadges.js","sourceRoot":"","sources":["../../src/default/CardBadges.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CardBadges.js","sourceRoot":"","sources":["../../src/default/CardBadges.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import type { ReactElement, ReactNode } from "react";
2
- import type { SignInCta } from "@stapel/core";
2
+ import type { LinkComponent, SignInCta } from "@stapel/core";
3
3
  import type { ShareChannel, SharePreference } from "../headless/Share.js";
4
4
  import type { ListingActionsConfig } from "./ListingActions.js";
5
5
  import type { ListingGalleryLayout } from "./detailGallery.js";
6
+ import type { ListingRelatedContext } from "./ListingRelated.js";
7
+ import type { ListingCard as ListingCardData } from "../api/types.js";
6
8
  import type { CategoryFeaturesProp, ThemeModeProp } from "./types.js";
7
9
  /** The reading measure of the page body. A detail page is prose plus a spec
8
10
  * table; past this it stops being one column and starts being a stripe across
@@ -178,13 +180,21 @@ export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesP
178
180
  * - `"bar"` — the condensed top bar the host draws through
179
181
  * {@link renderActionsBar}. Only meaningful in a LIST beside one of the
180
182
  * three above, and only with that render prop: it names a second place
181
- * the one cluster may travel to, never a home of its own.
183
+ * the one cluster may travel to, never a home of its own;
184
+ * - `"condensed-top"` — the same second place, drawn by the PANE: a fixed
185
+ * strip carrying {@link onBack}, the title on one line and the cluster,
186
+ * on screen exactly while the title is off it. Also a loan and never a
187
+ * home. See `condensedBar.ts` for what it is and why the pane draws it
188
+ * rather than leaving every container to write the same four things.
182
189
  *
183
- * A LIST is how a host says "both": `["header", "bar"]` keeps the cluster
184
- * beside the title and lends it to the bar for as long as the bar is on
185
- * screen. Exactly one home placement is honoured — the first non-`"bar"`
186
- * entry — because two homes would need two instances, which is the defect
187
- * this closes rather than the feature it adds.
190
+ * A LIST is how a host says "both": `["header", "condensed-top"]` keeps the
191
+ * cluster beside the title and lends it to the bar for as long as the bar is
192
+ * on screen. Exactly one home placement is honoured — the first entry that
193
+ * is neither loan — because two homes would need two instances, which is the
194
+ * defect this closes rather than the feature it adds.
195
+ *
196
+ * Asking for BOTH loans is a host that said something specific and a pair
197
+ * that has a default: `renderActionsBar` wins, and the pane draws nothing.
188
198
  */
189
199
  readonly actionsPlacement?: ListingActionsPlacement | readonly ListingActionsPlacement[];
190
200
  /**
@@ -217,6 +227,94 @@ export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesP
217
227
  * pane's own single are all what this prop exists to end.
218
228
  */
219
229
  readonly renderActionsBar?: (cluster: ReactNode) => ReactNode;
230
+ /**
231
+ * LEAVE THIS PAGE — the back arrow of the pane's own condensed bar.
232
+ *
233
+ * A callback and not an `href`, for the reason the cards' open arm states:
234
+ * "back" is the HISTORY's, not an address, and a pair that called
235
+ * `history.back()` itself would move a router it does not own. Absent, the
236
+ * bar draws no arrow at all — a listing opened in a new tab has nowhere to
237
+ * go back to, and an arrow that reloads the home page is worse than none.
238
+ *
239
+ * Only read with `"condensed-top"` in {@link actionsPlacement}.
240
+ */
241
+ readonly onBack?: () => void;
242
+ /**
243
+ * THE FOUR QUESTIONS EVERY BUYER ASKS, as chips above the contact control.
244
+ *
245
+ * The reference classified puts a "ask the seller" block on every listing —
246
+ * four canned questions and a free-text box — and it is the one thing on
247
+ * that page that turns a reader into a conversation (§16, all four
248
+ * comparisons). This pair ships the four in its own three locales; a host
249
+ * with a category that wants different ones passes its own, and `[]`
250
+ * switches the block off.
251
+ *
252
+ * At most four are drawn. A fifth is not a longer row, it is a wrapped
253
+ * second row of chips above the primary action.
254
+ *
255
+ * Requires {@link onQuickQuestion} — see there for why the pair cannot wire
256
+ * the press itself.
257
+ */
258
+ readonly quickQuestions?: readonly string[];
259
+ /**
260
+ * WHAT A PRESSED CHIP DOES, and why it is the host's.
261
+ *
262
+ * The chip's whole job is to put its text in the composer of the thread with
263
+ * this seller, and neither half of that is this pair's: the thread belongs to
264
+ * `@stapel/chat-react` (it arrives here as `contactSlot`, because L2 pairs do
265
+ * not import each other), and as of chat-react 0.12.1 its own door takes no
266
+ * initial message — `<StartDirectChat>` takes `sellerId` and a subject,
267
+ * `useStartDirectChat` posts `{userId, subject}`, and `<MessageComposer>`
268
+ * opens on an empty string with no seed. So there is nothing for this pane to
269
+ * hand a text to.
270
+ *
271
+ * The honest seam is therefore the callback: the pane draws the chips and
272
+ * reports the press, the container opens the thread and seeds the composer
273
+ * the way it already navigates to one. Without this prop the block is not
274
+ * drawn — a chip that does nothing is worse than no chip.
275
+ */
276
+ readonly onQuickQuestion?: (text: string) => void;
277
+ /**
278
+ * MORE LIKE THIS ONE — rows the host fetched from search
279
+ * (`category=` plus the main axes), drawn as a strip under the description.
280
+ *
281
+ * Empty or absent: no section at all. See `<ListingRelatedStrip>` for why
282
+ * the rows arrive rather than being read here.
283
+ */
284
+ readonly similar?: readonly ListingCardData[];
285
+ /** More from the same seller — the `owner=` search, same contract as
286
+ * {@link similar}. */
287
+ readonly fromSeller?: readonly ListingCardData[];
288
+ /** Where the "show all" link of each strip goes — the search the strip is a
289
+ * sample of. Absent: the strip has no link. */
290
+ readonly similarHref?: string;
291
+ readonly fromSellerHref?: string;
292
+ /**
293
+ * The whole "more like this" section, built by the host — handed everything
294
+ * the pane knows about this listing. Overrides {@link similar}: a host with
295
+ * a renderer has already decided what the section is.
296
+ */
297
+ readonly renderSimilar?: (context: ListingRelatedContext) => ReactNode;
298
+ /** The same, for the seller's other listings. Overrides {@link fromSeller}. */
299
+ readonly renderFromSeller?: (context: ListingRelatedContext) => ReactNode;
300
+ /** Where one card of either strip leads. Absent, the cards are inert. */
301
+ readonly listingHref?: (id: number) => string;
302
+ /** The host's `<Link>`, for those cards and the two "show all" links. */
303
+ readonly linkComponent?: LinkComponent;
304
+ /**
305
+ * HOW MANY SPEC ROWS STAND BEFORE THE FOLD — handed to
306
+ * `<ListingSpecList limit>`, which is where the argument for a fold and the
307
+ * rule about when it is worth one are written.
308
+ *
309
+ * Default: no fold, which is every existing mount unchanged. `10` is the
310
+ * phone answer.
311
+ *
312
+ * It does NOT change which rows exist. A live read was measured against the
313
+ * reference here (§16 comparison 1) and the shortfall was in the DATA, not
314
+ * in this component: the pane draws every stored row the build can key, and
315
+ * says how many it could not (`listings-detail-unreadable`).
316
+ */
317
+ readonly characteristicsLimit?: number;
220
318
  /**
221
319
  * IS THE TITLE STILL IN THE FOLD?
222
320
  *
@@ -341,6 +439,15 @@ export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesP
341
439
  * Where the reader's cluster may sit. Three homes and one loan — see
342
440
  * {@link ListingDetailPaneProps.actionsPlacement}.
343
441
  */
344
- export type ListingActionsPlacement = "header" | "gallery" | "buy-box" | "bar";
442
+ export type ListingActionsPlacement = "header" | "gallery" | "buy-box" | "bar" | "condensed-top";
443
+ /**
444
+ * How many canned questions the page draws, whoever supplies them.
445
+ *
446
+ * Four is the reference's own count and it is not arbitrary: the chips stand
447
+ * between the price and the one primary action on the page, and a fifth does
448
+ * not lengthen the row on a 390px phone — it wraps, and pushes "message the
449
+ * seller" a line further down.
450
+ */
451
+ export declare const QUICK_QUESTIONS_MAX = 4;
345
452
  export declare function ListingDetailPane(props: ListingDetailPaneProps): ReactElement;
346
453
  //# sourceMappingURL=ListingDetailPane.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListingDetailPane.d.ts","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListingDetailPane.d.ts","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"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"}