@stapel/listings-react 0.25.10 → 0.27.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 (144) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/MODULE.md +3 -1
  3. package/README.md +122 -9
  4. package/dist/api/generated/schema.d.ts +22 -12
  5. package/dist/api/generated/schema.d.ts.map +1 -1
  6. package/dist/default/CardBadges.d.ts.map +1 -1
  7. package/dist/default/CardBadges.js +3 -1
  8. package/dist/default/CardBadges.js.map +1 -1
  9. package/dist/default/ListingActions.d.ts +108 -0
  10. package/dist/default/ListingActions.d.ts.map +1 -0
  11. package/dist/default/ListingActions.js +29 -0
  12. package/dist/default/ListingActions.js.map +1 -0
  13. package/dist/default/ListingCard.d.ts.map +1 -1
  14. package/dist/default/ListingCard.js +15 -8
  15. package/dist/default/ListingCard.js.map +1 -1
  16. package/dist/default/ListingDetailPane.d.ts +170 -62
  17. package/dist/default/ListingDetailPane.d.ts.map +1 -1
  18. package/dist/default/ListingDetailPane.js +284 -28
  19. package/dist/default/ListingDetailPane.js.map +1 -1
  20. package/dist/default/ListingFeedCard.d.ts.map +1 -1
  21. package/dist/default/ListingFeedCard.js +2 -1
  22. package/dist/default/ListingFeedCard.js.map +1 -1
  23. package/dist/default/ListingPhoto.d.ts.map +1 -1
  24. package/dist/default/ListingPhoto.js +5 -2
  25. package/dist/default/ListingPhoto.js.map +1 -1
  26. package/dist/default/ListingSerpCard.d.ts.map +1 -1
  27. package/dist/default/ListingSerpCard.js +18 -4
  28. package/dist/default/ListingSerpCard.js.map +1 -1
  29. package/dist/default/MyListingsPane.d.ts.map +1 -1
  30. package/dist/default/MyListingsPane.js +49 -21
  31. package/dist/default/MyListingsPane.js.map +1 -1
  32. package/dist/default/ShareAction.d.ts +32 -0
  33. package/dist/default/ShareAction.d.ts.map +1 -0
  34. package/dist/default/ShareAction.js +116 -0
  35. package/dist/default/ShareAction.js.map +1 -0
  36. package/dist/default/actionRow.d.ts +58 -0
  37. package/dist/default/actionRow.d.ts.map +1 -0
  38. package/dist/default/actionRow.js +128 -0
  39. package/dist/default/actionRow.js.map +1 -0
  40. package/dist/default/cardGallery.d.ts +2 -0
  41. package/dist/default/cardGallery.d.ts.map +1 -1
  42. package/dist/default/cardGallery.js +31 -0
  43. package/dist/default/cardGallery.js.map +1 -1
  44. package/dist/default/detailGallery.d.ts +77 -0
  45. package/dist/default/detailGallery.d.ts.map +1 -0
  46. package/dist/default/detailGallery.js +91 -0
  47. package/dist/default/detailGallery.js.map +1 -0
  48. package/dist/default/favorite.d.ts +25 -0
  49. package/dist/default/favorite.d.ts.map +1 -1
  50. package/dist/default/favorite.js +29 -3
  51. package/dist/default/favorite.js.map +1 -1
  52. package/dist/default/icons.d.ts +19 -0
  53. package/dist/default/icons.d.ts.map +1 -1
  54. package/dist/default/icons.js +23 -0
  55. package/dist/default/icons.js.map +1 -1
  56. package/dist/default/index.d.ts +11 -2
  57. package/dist/default/index.d.ts.map +1 -1
  58. package/dist/default/index.js +10 -1
  59. package/dist/default/index.js.map +1 -1
  60. package/dist/default/movableCluster.d.ts +18 -0
  61. package/dist/default/movableCluster.d.ts.map +1 -0
  62. package/dist/default/movableCluster.js +110 -0
  63. package/dist/default/movableCluster.js.map +1 -0
  64. package/dist/default/notice.d.ts +14 -0
  65. package/dist/default/notice.d.ts.map +1 -0
  66. package/dist/default/notice.js +62 -0
  67. package/dist/default/notice.js.map +1 -0
  68. package/dist/headless/MyListings.d.ts +61 -19
  69. package/dist/headless/MyListings.d.ts.map +1 -1
  70. package/dist/headless/MyListings.js +58 -19
  71. package/dist/headless/MyListings.js.map +1 -1
  72. package/dist/headless/Share.d.ts +103 -0
  73. package/dist/headless/Share.d.ts.map +1 -0
  74. package/dist/headless/Share.js +190 -0
  75. package/dist/headless/Share.js.map +1 -0
  76. package/dist/i18n/es.d.ts.map +1 -1
  77. package/dist/i18n/es.js +21 -0
  78. package/dist/i18n/es.js.map +1 -1
  79. package/dist/i18n/generated/errors.es.gen.d.ts +1 -1
  80. package/dist/i18n/generated/errors.es.gen.js +1 -1
  81. package/dist/i18n/generated/errors.gen.d.ts +18 -0
  82. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  83. package/dist/i18n/generated/errors.gen.js +9 -0
  84. package/dist/i18n/generated/errors.gen.js.map +1 -1
  85. package/dist/i18n/generated/errors.ru.gen.d.ts +1 -1
  86. package/dist/i18n/generated/errors.ru.gen.js +1 -1
  87. package/dist/i18n/keys.d.ts +45 -0
  88. package/dist/i18n/keys.d.ts.map +1 -1
  89. package/dist/i18n/keys.js +60 -0
  90. package/dist/i18n/keys.js.map +1 -1
  91. package/dist/i18n/ru.d.ts.map +1 -1
  92. package/dist/i18n/ru.js +21 -0
  93. package/dist/i18n/ru.js.map +1 -1
  94. package/dist/index.d.ts +5 -3
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +2 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/model/cardBadges.d.ts +52 -3
  99. package/dist/model/cardBadges.d.ts.map +1 -1
  100. package/dist/model/cardBadges.js +74 -12
  101. package/dist/model/cardBadges.js.map +1 -1
  102. package/dist/model/mineSource.d.ts +9 -3
  103. package/dist/model/mineSource.d.ts.map +1 -1
  104. package/dist/model/mineSource.js.map +1 -1
  105. package/dist/model/status.d.ts +79 -15
  106. package/dist/model/status.d.ts.map +1 -1
  107. package/dist/model/status.js +86 -17
  108. package/dist/model/status.js.map +1 -1
  109. package/llms.txt +8 -3
  110. package/manifest.json +96 -4
  111. package/nav-manifest.json +1 -1
  112. package/package.json +10 -10
  113. package/src/analytics/generated/events.json +1 -1
  114. package/src/api/generated/schema.ts +22 -12
  115. package/src/default/CardBadges.tsx +3 -1
  116. package/src/default/ListingActions.tsx +196 -0
  117. package/src/default/ListingCard.tsx +79 -43
  118. package/src/default/ListingDetailPane.tsx +520 -89
  119. package/src/default/ListingFeedCard.tsx +2 -0
  120. package/src/default/ListingPhoto.tsx +28 -0
  121. package/src/default/ListingSerpCard.tsx +39 -12
  122. package/src/default/MyListingsPane.tsx +81 -44
  123. package/src/default/ShareAction.tsx +260 -0
  124. package/src/default/actionRow.ts +131 -0
  125. package/src/default/cardGallery.ts +31 -0
  126. package/src/default/detailGallery.ts +97 -0
  127. package/src/default/favorite.tsx +68 -1
  128. package/src/default/icons.tsx +60 -0
  129. package/src/default/index.ts +37 -1
  130. package/src/default/movableCluster.tsx +137 -0
  131. package/src/default/notice.ts +68 -0
  132. package/src/headless/MyListings.tsx +130 -39
  133. package/src/headless/Share.tsx +278 -0
  134. package/src/i18n/es.ts +28 -0
  135. package/src/i18n/generated/errors.es.gen.ts +1 -1
  136. package/src/i18n/generated/errors.gen.ts +9 -0
  137. package/src/i18n/generated/errors.json +31 -0
  138. package/src/i18n/generated/errors.ru.gen.ts +1 -1
  139. package/src/i18n/keys.ts +63 -0
  140. package/src/i18n/ru.ts +28 -0
  141. package/src/index.ts +22 -0
  142. package/src/model/cardBadges.ts +124 -12
  143. package/src/model/mineSource.ts +9 -3
  144. package/src/model/status.ts +102 -20
@@ -1,57 +1,8 @@
1
- /**
2
- * `<ListingDetailPane>` — the listing page, and the page a marketplace makes
3
- * its money on.
4
- *
5
- * Five distinct absences, five distinct sentences, and the whole point of the
6
- * component is that none of them collapses into another:
7
- *
8
- * loading — we are asking
9
- * failed — we could not ask (retry, never "nothing here")
10
- * not found — no listing ever had this id
11
- * removed — one did, and it is gone (the AllowAny status probe
12
- * is the only read that can still say so)
13
- * withdrawn — one did, and its owner took it off the shelf: the
14
- * detail 404s while the probe still answers "not
15
- * deleted". NO retry — nothing a retry could change.
16
- *
17
- * On top of that, a listing that IS returned may still not be on sale: the
18
- * detail endpoint has no `published()` filter, so a draft answers 200 to
19
- * anyone holding the id. The pane says which side of that it is on rather
20
- * than dressing a draft up as a shop page.
21
- *
22
- * ── The page has ONE primary action, and it depends on who is reading ──────
23
- *
24
- * For two releases the only control here was "Save to favourites" — the money
25
- * screen of a marketplace with no way to reach the seller, and the owner's own
26
- * copy of the page offering to favourite their own listing. So:
27
- *
28
- * a buyer → `contactSlot` (the container's `@stapel/chat-react`
29
- * "message the seller" button), with favouriting beside it as
30
- * the secondary it always was;
31
- * the owner → Edit and Take down, and no contact button at all — you do not
32
- * message yourself.
33
- *
34
- * `contactSlot` is a SLOT because conversations belong to another L2 pair and
35
- * L2 pairs do not import each other. Unfilled it renders `<SlotPlaceholder>`,
36
- * so an app wired without a chat is a named gap in a dev build rather than a
37
- * page whose only verb is "save".
38
- *
39
- * ── The page has a DESKTOP, when the host says so ──────────────────────────
40
- *
41
- * Measured on a live classified deployment at 1440×900: the whole listing
42
- * page was a ~930px single column hugging the start edge, the price a 22px
43
- * line UNDER the title and smaller than it, and the right half of the screen
44
- * empty — while the reference design for this page is two columns: gallery +
45
- * description + specs on the left, a sticky buy column on the right with the
46
- * price LARGE at its top, then the actions, then the seller block.
47
- *
48
- * `layout="split"` is that design. The HOST states the axis — the same rule
49
- * as CategoryPage's `subcategories`: a decision taken once by the component
50
- * that knows the viewport it granted, never a media query guessed in a leaf —
51
- * and the default `"column"` renders exactly what existing hosts already get.
52
- */
53
1
  import type { ReactElement, ReactNode } from "react";
54
2
  import type { SignInCta } from "@stapel/core";
3
+ import type { ShareChannel } from "../headless/Share.js";
4
+ import type { ListingActionsConfig } from "./ListingActions.js";
5
+ import type { ListingGalleryLayout } from "./detailGallery.js";
55
6
  import type { CategoryFeaturesProp, ThemeModeProp } from "./types.js";
56
7
  /** The reading measure of the page body. A detail page is prose plus a spec
57
8
  * table; past this it stops being one column and starts being a stripe across
@@ -73,12 +24,30 @@ export declare const DETAIL_SPLIT_MEASURE = "75rem";
73
24
  * `1fr` and this is not.
74
25
  */
75
26
  export declare const DETAIL_SPLIT_ASIDE = "380px";
76
- /** The narrowest a gallery tile may get before the grid drops a column. A
77
- * measure rather than a pixel: the tiles then fill whatever the ELEMENT is,
78
- * which is §83's geometry rule — one photo per row on a phone, three on a
79
- * desktop pane, and no `width: 320` that is near-full-bleed on one and a
80
- * postage stamp on the other. */
81
- export declare const DETAIL_PHOTO_MIN = "14rem";
27
+ /** Re-exported: the tile floor is declared beside the track it feeds, in
28
+ * `detailGallery.ts`. */
29
+ export { DETAIL_PHOTO_MIN } from "./detailGallery.js";
30
+ /**
31
+ * THE GUTTER BETWEEN TWO PHOTOGRAPHS, and it is the page's own (D418).
32
+ *
33
+ * The gallery painted a flat `spacing[3]` — 12px on a 390px phone and 12px on
34
+ * a 1280px desktop — while the page around it had already decided that its
35
+ * edge is 4px on a phone and 24px on a desktop. Measured on the live listing:
36
+ * `getComputedStyle(gallery).gap` answered `12px` at both widths, so neither
37
+ * of the two declared numbers was ever on screen and the tiles sat closer
38
+ * together than the page edge on a desktop and three times further apart than
39
+ * it on a phone.
40
+ *
41
+ * `--stapel-page-gutter` is a RESPONSIVE token role (`@stapel/tokens`: 4px
42
+ * phone, 8px tablet, 24px desktop, declared once with its own media arms), and
43
+ * reading it as a VAR rather than computing a number is the load-bearing half:
44
+ * a value picked in JS is applied at render, so a window resized between
45
+ * renders keeps the gutter it was drawn with, where a var reflows. Written
46
+ * through `cssVar` so a renamed role fails to compile instead of silently
47
+ * resolving to nothing, with the flat value this grid used before as the
48
+ * fallback for a host that loads no token stylesheet.
49
+ */
50
+ export declare const DETAIL_GALLERY_GUTTER: string;
82
51
  export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesProp {
83
52
  readonly id: number;
84
53
  /** The reader's own uuid, when the host knows it. Enables the owner view —
@@ -147,10 +116,144 @@ export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesP
147
116
  /** Open the composer on this listing — the owner's primary. Absent is a real
148
117
  * answer: the button then states that this app has no editing screen. */
149
118
  readonly onEdit?: (id: number) => void;
150
- /** Extra chrome beside the primary (the seller's profile link, a share
151
- * button). Cross-pair navigation is the container's job (spec §6.2 item 5),
152
- * so this pair takes nodes rather than routes. */
153
- readonly actions?: ReactNode;
119
+ /**
120
+ * TWO THINGS UNDER ONE NAME, and the type tells them apart.
121
+ *
122
+ * - a NODE — extra chrome beside the primary (the seller's profile link, a
123
+ * control from another pair). What this prop has always been, unchanged,
124
+ * and still rendered at the end of the buy box. Cross-pair navigation is
125
+ * the container's job (spec §6.2 item 5), so this pair takes nodes
126
+ * rather than routes.
127
+ * - a CONFIG — `{ share: false }` / `{ favorite: false }`, switching off
128
+ * one of the page's own two reader actions.
129
+ *
130
+ * A union rather than a second prop, because they are the same question
131
+ * ("what is in the action row") asked from two sides, and it is
132
+ * unambiguous at runtime: a plain object that is not a React element was
133
+ * never a legal `ReactNode` in the first place — React refuses to render
134
+ * one — so `{ share: false }` cannot be a node that somebody meant.
135
+ */
136
+ readonly actions?: ReactNode | ListingActionsConfig;
137
+ /**
138
+ * The listing's CANONICAL address, for the share sheet — the route the
139
+ * container built (`/l/7`, or an absolute URL), not the address bar.
140
+ *
141
+ * Absent, sharing falls back to `window.location.href`, which is honest for
142
+ * a bare mount and wrong for a real app: the address a visitor is standing
143
+ * on carries the SERP query they arrived from, the page anchor and whatever
144
+ * tracking parameters came with them, and none of that belongs in a link
145
+ * somebody sends to a friend. See `useShare`.
146
+ */
147
+ readonly shareUrl?: string;
148
+ /** Analytics: which channel a completed share went through. */
149
+ readonly onShared?: (channel: ShareChannel) => void;
150
+ /**
151
+ * How many people saved this listing, when the host was told by something
152
+ * else. The listings wire carries `is_favorited` — a per-reader boolean —
153
+ * and no aggregate at all, so this pair never invents the number and never
154
+ * draws a zero in place of "nobody counted".
155
+ */
156
+ readonly favoriteCount?: number;
157
+ /**
158
+ * WHERE THE READER'S TWO ACTIONS SIT.
159
+ *
160
+ * - `"header"` (default) — beside the title, at the trailing edge of the
161
+ * heading row, which is where the reference classified puts them and
162
+ * where a person looks for them on both a phone and a desktop;
163
+ * - `"gallery"` — pinned over the photographs' trailing top corner, for a
164
+ * phone-first host that wants them on the picture. The corner is chosen
165
+ * rather than free: the dots own the bottom centre of the strip and the
166
+ * photo counter owns the bottom trailing corner;
167
+ * - `"buy-box"` — inside `listings-detail-actions`, beside "message the
168
+ * seller", which is where the favourite alone used to live. The escape
169
+ * hatch for a host whose page was laid out around it;
170
+ * - `"bar"` — the condensed top bar the host draws through
171
+ * {@link renderActionsBar}. Only meaningful in a LIST beside one of the
172
+ * three above, and only with that render prop: it names a second place
173
+ * the one cluster may travel to, never a home of its own.
174
+ *
175
+ * A LIST is how a host says "both": `["header", "bar"]` keeps the cluster
176
+ * beside the title and lends it to the bar for as long as the bar is on
177
+ * screen. Exactly one home placement is honoured — the first non-`"bar"`
178
+ * entry — because two homes would need two instances, which is the defect
179
+ * this closes rather than the feature it adds.
180
+ */
181
+ readonly actionsPlacement?: ListingActionsPlacement | readonly ListingActionsPlacement[];
182
+ /**
183
+ * THE SAME CLUSTER, IN A SECOND PLACE — a condensed bar, typically.
184
+ *
185
+ * Called with the bar's MOUNT POINT, not with a copy of the cluster: return
186
+ * it wrapped in whatever chrome the bar is (`position: fixed`, a back arrow,
187
+ * the title), and the pane moves its one `<ListingActions>` into it. Return
188
+ * `null` while the bar is not on screen and the cluster goes back where it
189
+ * came from — the same DOM node, the same hooks, an optimistic favourite
190
+ * still in flight uninterrupted.
191
+ *
192
+ * Requires `"bar"` in {@link actionsPlacement}. Pair it with
193
+ * {@link onTitleVisible} for the usual rule: the bar appears when the title
194
+ * leaves the fold.
195
+ *
196
+ * ```tsx
197
+ * <ListingDetailPane
198
+ * actionsPlacement={["header", "bar"]}
199
+ * onTitleVisible={(visible) => { setBarShown(!visible); }}
200
+ * renderActionsBar={(cluster) =>
201
+ * barShown ? <div className="topbar">{back}{title}{cluster}</div> : null
202
+ * }
203
+ * />
204
+ * ```
205
+ *
206
+ * A container that mounted its own second `<ListingActions>` for this can
207
+ * delete it: two `useFavoriteToggle` instances on one page, two hearts that
208
+ * agree only after a refetch, and a second set of test ids to keep the
209
+ * pane's own single are all what this prop exists to end.
210
+ */
211
+ readonly renderActionsBar?: (cluster: ReactNode) => ReactNode;
212
+ /**
213
+ * IS THE TITLE STILL IN THE FOLD?
214
+ *
215
+ * An `IntersectionObserver` on the pane's own `<h1>` — never a `scroll`
216
+ * listener, which asks the question on every frame of a page whose job is
217
+ * scrolling photographs and answers it no better. Called on each crossing
218
+ * and not on every scroll: `false` when the title leaves, `true` when it
219
+ * comes back.
220
+ *
221
+ * It exists because the chrome a host hangs on this had no way to ask. A
222
+ * container drawing a condensed bar found the title by the pane's published
223
+ * `data-testid` and waited for it with a `MutationObserver`, because the
224
+ * title lands with the listing and not with the first frame — a private
225
+ * selector and a subscription, for a boolean the pane already knows.
226
+ *
227
+ * NOT called at all where the environment has no `IntersectionObserver`:
228
+ * the honest answer there is "this page cannot tell", and a fabricated
229
+ * `true` would leave a host's bar wedged open on the arm that has no
230
+ * scrolling anyway.
231
+ *
232
+ * Pass a STABLE function (a `useState` setter, a `useCallback`). The
233
+ * observer is created once for the title node and reads the latest callback
234
+ * through a ref, so an inline arrow works and does not re-observe.
235
+ */
236
+ readonly onTitleVisible?: (visible: boolean) => void;
237
+ /**
238
+ * WHAT SHAPE THE PHOTOGRAPHS ARE IN.
239
+ *
240
+ * - `"grid"` (default) — the element-width grid this pane has always drawn,
241
+ * `repeat(auto-fit, minmax(14rem, 1fr))`: three tiles across a desktop
242
+ * pane, one across a phone;
243
+ * - `"strip"` — a snap-scrolling horizontal strip, one photograph visible
244
+ * with the next peeking. On a 390px phone the grid resolves to one
245
+ * column, so a listing with three pictures pushes its own title and price
246
+ * nearly three screens down — the first thing a person sees after tapping
247
+ * a search result is a photograph with nothing beside it.
248
+ *
249
+ * The HOST names it, the same rule as {@link layout} and for the same
250
+ * reason: the side that knows the viewport it granted decides, and no media
251
+ * query is guessed in a leaf. A live storefront was carrying
252
+ * `display: flex !important` against this pane's inline `display: grid` to
253
+ * say exactly this; that declaration is a class now, so even a host wanting
254
+ * a third shape needs a selector rather than an `!important`.
255
+ */
256
+ readonly galleryLayout?: ListingGalleryLayout;
154
257
  /**
155
258
  * The container's sign-in door, rendered beside the favourite's refusal —
156
259
  * the same `SignInCta` seam the three card skins already take. The pane was
@@ -183,5 +286,10 @@ export interface ListingDetailPaneProps extends ThemeModeProp, CategoryFeaturesP
183
286
  readonly headingLevel?: 1 | 2 | 3;
184
287
  readonly footer?: ReactNode;
185
288
  }
289
+ /**
290
+ * Where the reader's cluster may sit. Three homes and one loan — see
291
+ * {@link ListingDetailPaneProps.actionsPlacement}.
292
+ */
293
+ export type ListingActionsPlacement = "header" | "gallery" | "buy-box" | "bar";
186
294
  export declare function ListingDetailPane(props: ListingDetailPaneProps): ReactElement;
187
295
  //# sourceMappingURL=ListingDetailPane.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListingDetailPane.d.ts","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAiBrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAe9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtE;;oBAEoB;AACpB,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C;;;;iCAIiC;AACjC,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,MAAM,WAAW,sBACf,SAAQ,aAAa,EACnB,oBAAoB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;6BAEyB;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACrC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC;6EACyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;sDAEkD;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CAyhB7E"}
1
+ {"version":3,"file":"ListingDetailPane.d.ts","sourceRoot":"","sources":["../../src/default/ListingDetailPane.tsx"],"names":[],"mappings":"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"}