@stapel/listings-react 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +212 -0
- package/dist/api/types.d.ts +10 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/default/ListingCard.d.ts +2 -2
- package/dist/default/ListingCard.d.ts.map +1 -1
- package/dist/default/ListingCard.js +8 -2
- package/dist/default/ListingCard.js.map +1 -1
- package/dist/default/ListingComposerPage.d.ts +59 -0
- package/dist/default/ListingComposerPage.d.ts.map +1 -1
- package/dist/default/ListingComposerPage.js +103 -12
- package/dist/default/ListingComposerPage.js.map +1 -1
- package/dist/default/ListingDetailPane.d.ts +2 -2
- package/dist/default/ListingDetailPane.d.ts.map +1 -1
- package/dist/default/ListingDetailPane.js +6 -1
- package/dist/default/ListingDetailPane.js.map +1 -1
- package/dist/default/ListingSerpCard.d.ts +2 -2
- package/dist/default/ListingSerpCard.d.ts.map +1 -1
- package/dist/default/ListingSerpCard.js +7 -2
- package/dist/default/ListingSerpCard.js.map +1 -1
- package/dist/default/index.d.ts +2 -2
- package/dist/default/index.d.ts.map +1 -1
- package/dist/default/index.js +1 -1
- package/dist/default/index.js.map +1 -1
- package/dist/default/types.d.ts +21 -0
- package/dist/default/types.d.ts.map +1 -1
- package/dist/headless/ListingComposer.d.ts +11 -0
- package/dist/headless/ListingComposer.d.ts.map +1 -1
- package/dist/headless/ListingComposer.js +18 -1
- package/dist/headless/ListingComposer.js.map +1 -1
- package/dist/headless/ListingDetail.d.ts +16 -1
- package/dist/headless/ListingDetail.d.ts.map +1 -1
- package/dist/headless/ListingDetail.js +13 -4
- package/dist/headless/ListingDetail.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +4 -0
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/keys.d.ts +10 -0
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +16 -0
- package/dist/i18n/keys.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +4 -0
- package/dist/i18n/ru.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/model/features.d.ts +90 -20
- package/dist/model/features.d.ts.map +1 -1
- package/dist/model/features.js +148 -17
- package/dist/model/features.js.map +1 -1
- package/dist/model/validation.d.ts +12 -0
- package/dist/model/validation.d.ts.map +1 -1
- package/dist/model/validation.js +19 -0
- package/dist/model/validation.js.map +1 -1
- package/dist/nav/manifest.d.ts.map +1 -1
- package/dist/nav/manifest.js +2 -0
- package/dist/nav/manifest.js.map +1 -1
- package/llms.txt +1 -1
- package/manifest.json +6 -1
- package/nav-manifest.json +3 -1
- package/package.json +7 -7
- package/src/analytics/generated/events.json +1 -1
- package/src/api/types.ts +10 -0
- package/src/default/ListingCard.tsx +17 -4
- package/src/default/ListingComposerPage.tsx +221 -32
- package/src/default/ListingDetailPane.tsx +10 -6
- package/src/default/ListingSerpCard.tsx +13 -4
- package/src/default/index.ts +7 -2
- package/src/default/types.ts +22 -0
- package/src/headless/ListingComposer.tsx +28 -0
- package/src/headless/ListingDetail.tsx +37 -10
- package/src/i18n/es.ts +5 -0
- package/src/i18n/keys.ts +17 -0
- package/src/i18n/ru.ts +5 -0
- package/src/index.ts +1 -0
- package/src/model/features.ts +253 -35
- package/src/model/validation.ts +20 -0
- package/src/nav/manifest.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,217 @@
|
|
|
1
1
|
# @stapel/listings-react
|
|
2
2
|
|
|
3
|
+
## 0.13.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5397813: The composer asks what is being sold before it asks about the parcel
|
|
8
|
+
|
|
9
|
+
`<ListingComposerPage>` had two section orders chosen by the form's width, and
|
|
10
|
+
the narrow one put the category's characteristics directly under the category
|
|
11
|
+
picker. On a leaf with a handful of attributes that was an improvement; on an
|
|
12
|
+
imported one it was a funnel with nothing left in it. Measured at 390x844 on a
|
|
13
|
+
live classified deployment: 32 fields between the category and the title, so
|
|
14
|
+
`Title` sat at y=5575, `Price` at y=5871 and `Photos` at y=6245 of a 7308px
|
|
15
|
+
form — the seller was asked for the parcel's weight, its length and "what the
|
|
16
|
+
goods are measured in" before being asked what the thing is or what it costs.
|
|
17
|
+
|
|
18
|
+
There is now ONE order, at every width, and it belongs to the component:
|
|
19
|
+
|
|
20
|
+
category → title → description → price → currency → where → photos →
|
|
21
|
+
the category's characteristics → the listing's own options
|
|
22
|
+
|
|
23
|
+
Measured on the showcase's own composer story at 390 (five attribute rows, not
|
|
24
|
+
32): title moves 993 → 314, the first attribute row 412 → 1266, and the page
|
|
25
|
+
shortens 2227 → 2071px.
|
|
26
|
+
|
|
27
|
+
- `COMPOSER_STACKED_BELOW` is gone, and with it the width measurement that
|
|
28
|
+
chose between the two orders. `COMPOSER_DETAILS_PLACEMENT` replaces it: a
|
|
29
|
+
constant, exported because `data-placement` on the characteristics region is
|
|
30
|
+
what an e2e suite reads to prove the order has not regressed.
|
|
31
|
+
- The discoverability the narrow order was reaching for is kept by the two
|
|
32
|
+
things that do not move the questions around — "take me to the first empty
|
|
33
|
+
field", which now also OPENS whatever disclosure the field is folded inside,
|
|
34
|
+
and a shorter region.
|
|
35
|
+
- `<FeatureFields>` takes `groupCollapse` (`"none"` by default, unchanged for
|
|
36
|
+
every existing host; `"auto"` in the composer). Under `"auto"` each named
|
|
37
|
+
group is a native `<details>` that starts open when it asks something
|
|
38
|
+
required or something already answered, and closed otherwise — so identity
|
|
39
|
+
groups are open and the delivery dimensions and wholesale terms are one tap
|
|
40
|
+
away under their own headings. The rule reads the SCHEMA and never a list of
|
|
41
|
+
group names: groups are admin-authored text in the deployment's language.
|
|
42
|
+
- The group order the catalogue emits is untouched.
|
|
43
|
+
|
|
44
|
+
## 0.12.0
|
|
45
|
+
|
|
46
|
+
### Minor Changes
|
|
47
|
+
|
|
48
|
+
- 0eab206: A published listing prints its option COPY wherever the copy exists, and the
|
|
49
|
+
composer's characteristics step is reachable on a phone.
|
|
50
|
+
|
|
51
|
+
**The copy.** A `select` DAO carries the chosen values and the display config,
|
|
52
|
+
never the option table — the table lives on the CATEGORY, and not needing it
|
|
53
|
+
is what lets a card draw a badge without a category read. A row written before
|
|
54
|
+
the server started snapshotting labels therefore had nothing to resolve
|
|
55
|
+
against, and the STORAGE SLUG reached the screen: a live classified deployment
|
|
56
|
+
printed `b-u`, `bez-defektov` and `ne-rabotaet-vspyshka` on its spec rows.
|
|
57
|
+
`featureFromDao(dao, { categoryFeatures })` adds the third and last source of
|
|
58
|
+
copy, with the precedence written out: a row carrying its own `options` table
|
|
59
|
+
is left alone, then the row's own `labels` snapshot, then the CATEGORY's
|
|
60
|
+
option table, then the raw value. The snapshot wins over the category on
|
|
61
|
+
purpose — it is what the listing was PUBLISHED with, and the whole reason the
|
|
62
|
+
server takes one is that a category edited afterwards must not silently
|
|
63
|
+
restate an old listing. A category def is used only when slug AND value type
|
|
64
|
+
match, so a renamed feature is ignored rather than forced, and a value the
|
|
65
|
+
catalogue no longer declares still prints itself rather than vanishing or
|
|
66
|
+
being invented. `hierarchical_select` gets the same repair, its tree adopted
|
|
67
|
+
whole because no positional snapshot can describe one. `<ListingDetailPane>`,
|
|
68
|
+
`<ListingCard>`, `<ListingSerpCard>`, `<ListingDetail>` and `useListingDetail`
|
|
69
|
+
take the optional `categoryFeatures`; a host that wires nothing is unchanged.
|
|
70
|
+
|
|
71
|
+
**The composer.** On a 390px viewport the characteristics of the chosen
|
|
72
|
+
category began about 1.8 viewports below the fold, under a 700px photo
|
|
73
|
+
dropzone, with no step indicator and nothing saying they existed — while the
|
|
74
|
+
footer counted ten unfilled required details, none of them on screen.
|
|
75
|
+
|
|
76
|
+
- Below `COMPOSER_STACKED_BELOW` the characteristics render directly under the
|
|
77
|
+
category choice and ABOVE the photos; at or above it they stay where they
|
|
78
|
+
were. The threshold is measured on the FORM's own width via `useElementWidth`
|
|
79
|
+
— a composer in a 400px panel on a desktop is a narrow composer — and an
|
|
80
|
+
unmeasured element falls to the wide arm.
|
|
81
|
+
- The placeholder said "loading the category's characteristics" when nothing
|
|
82
|
+
was in flight and no category had been chosen. That is now its own fourth
|
|
83
|
+
state with its own sentence, en/ru/es.
|
|
84
|
+
- `ListingComposerBag.firstUnsatisfied` names the first refused field in the
|
|
85
|
+
form's own order, and the closed gate renders a real button (accessible
|
|
86
|
+
name, focus AND scroll) that takes the person to it. A count of ten with
|
|
87
|
+
nothing on screen is a dead end.
|
|
88
|
+
- A field showing a refusal now drops its hint instead of stacking on it: the
|
|
89
|
+
refusal is the more specific statement and the one just earned.
|
|
90
|
+
- The whole attribute region carried exactly one test id. `attributes-fields`,
|
|
91
|
+
`attributes-group-<group>`, `attributes-group-<group>-heading` and
|
|
92
|
+
`attributes-row-<slug>` (with `featureSectionTestId` / `featureRowTestId`
|
|
93
|
+
exported) make it measurable, and the row id sits on the same element with
|
|
94
|
+
or without a host `renderRow`.
|
|
95
|
+
|
|
96
|
+
- 9a123b9: A stored `select` prints its option copy, not the storage slug.
|
|
97
|
+
|
|
98
|
+
A DAO carries the value and the display config, never the option table — the
|
|
99
|
+
table lives on the category, and not needing it is what lets a card render a
|
|
100
|
+
badge without a category read. `formatFeatureValue` resolves an option's copy
|
|
101
|
+
out of `config.options`, so with no table it fell through to `String(value)`
|
|
102
|
+
and the SLUG reached the screen: a live classified deployment printed
|
|
103
|
+
"Condition: b-u" on its spec rows and a subtitle of three slugs on its cards.
|
|
104
|
+
|
|
105
|
+
The identity table `featureFromDao` synthesized (`{value: v, label: v}`) only
|
|
106
|
+
ever answered for a TRANSLATABLE catalogue, whose labels are its keys. The
|
|
107
|
+
catalogues that produced those screens set `translatable_options: false` and
|
|
108
|
+
carry literal copy on the category, so `t("b-u")` returned `"b-u"` and there
|
|
109
|
+
was nothing else to fall back to.
|
|
110
|
+
|
|
111
|
+
- `featureFromDao` now builds the option table from the DAO's write-time
|
|
112
|
+
`labels` snapshot — the `string[]` positionally aligned with `value` that
|
|
113
|
+
`ref_select` has always carried and that `select` carries from the
|
|
114
|
+
stapel-attributes release which snapshots option copy. The copy a listing was
|
|
115
|
+
published with is the copy it prints, whatever the category has become since.
|
|
116
|
+
- A row written before that release carries no `labels` key and keeps the
|
|
117
|
+
identity table exactly as it behaved: a translatable catalogue still reads
|
|
118
|
+
out of the host's bundle, and a non-translatable one still shows the slug
|
|
119
|
+
until the listing is re-projected. A visible slug gets fixed; an invented
|
|
120
|
+
label ships wrong.
|
|
121
|
+
- A snapshot whose length differs from `value` is dropped WHOLE rather than
|
|
122
|
+
paired over its overlap, which is the engine's own rule: one option's copy
|
|
123
|
+
printed against another option's value does not look wrong.
|
|
124
|
+
- `ListingFeatureDao` declares `labels?: readonly string[]`.
|
|
125
|
+
|
|
126
|
+
Minor rather than patch: the fix rides on a new optional wire field and changes
|
|
127
|
+
what every listing surface renders. `ListingCard`, `ListingSerpCard`,
|
|
128
|
+
`ListingDetailPane` and the `ListingDetail` headless bag all split their DAOs
|
|
129
|
+
through this one function, so no surface needed its own patch — and a host
|
|
130
|
+
snapshotting card or detail output will see the labels change.
|
|
131
|
+
|
|
132
|
+
- 8d1e20f: The phone dock stops truncating its labels, stops covering the footer, and the
|
|
133
|
+
phone SERP gets a one-line toolbar instead of four stacked rows.
|
|
134
|
+
|
|
135
|
+
**A compact label for a compact chrome.** `NavEntry.shortLabelKey` (core) is an
|
|
136
|
+
optional second i18n key a manifest declares when its menu label cannot fit a
|
|
137
|
+
dock cell. A five-item dock at 390px gives each destination about ten
|
|
138
|
+
characters, and a label written for a menu row ellipsizes mid-word — a
|
|
139
|
+
destination a person has to guess at, which is the one thing a dock must not
|
|
140
|
+
produce. A key and not a length hint, because which words survive the cut is a
|
|
141
|
+
translator's judgement: the useful short form of "Post a listing" is the verb,
|
|
142
|
+
of "My listings" the noun, and no truncation rule finds either. `resolveNav`
|
|
143
|
+
carries it through, `<NavDock>` prints it and keeps the LONG label as the
|
|
144
|
+
link's accessible name; `listings-react` declares one for `compose` and `mine`.
|
|
145
|
+
The dock also drops its inter-cell gap and one inset step — 24px given back to
|
|
146
|
+
five labels — and `scripts/gen-nav-manifest.mjs` validates the new field.
|
|
147
|
+
|
|
148
|
+
**The clearance belongs to the page, not the content.** The island is fixed
|
|
149
|
+
over the last thing on the page, and the last thing is the footer. Reserving
|
|
150
|
+
`DOCK_CLEARANCE` on `<Layout.Content>` cleared the final card and left the
|
|
151
|
+
footer's legal links permanently under the island. `<PublicShell>` reserves it
|
|
152
|
+
on the page column instead, and only when `dockRenders(nav)` says an island
|
|
153
|
+
will actually be drawn — a one-entry nav used to get a strip of empty page
|
|
154
|
+
under a dock nobody rendered.
|
|
155
|
+
|
|
156
|
+
**A phone toolbar that is one row.** `<SearchResultsPane header="compact">`
|
|
157
|
+
gives the toolbar its own line and puts the count directly above the cards as
|
|
158
|
+
their caption, with the heading visually hidden but still in the document
|
|
159
|
+
outline; the banner shape (heading | count + toolbar) is unchanged and
|
|
160
|
+
remains the default. `<SortSelect compact>` drops the caption and the 200px
|
|
161
|
+
floor so the control shares a row, and moves the blocked `distance` option's
|
|
162
|
+
REASON into the option's own label — on a phone, where that refusal is most
|
|
163
|
+
common, a separate reason row costs a band of viewport above the first result.
|
|
164
|
+
`<FilterChips>` takes `geoChip={false}` for a surface that already states the
|
|
165
|
+
location above it (the phone SERP mounts `<LocationSummaryLine>`, and the two
|
|
166
|
+
together asked about one filter twice), and renders NOTHING when it would be a
|
|
167
|
+
row of one button — a free-text query has no category, so the server returns no
|
|
168
|
+
facet plan, and the row was a lone circle floating between two working filter
|
|
169
|
+
affordances. `<LocationSummaryLine>` says "Filters", not "All filters": that
|
|
170
|
+
end of the row shares 390px with a place name.
|
|
171
|
+
|
|
172
|
+
**Tiles say which category they are.** `<CategoryTileGrid>` draws the
|
|
173
|
+
category's own initial where art is missing, instead of a muted disc. A live
|
|
174
|
+
catalogue put nine identical grey discs on one landing — every category there
|
|
175
|
+
carries an empty `carousel_icon`, which is the state every catalogue is in
|
|
176
|
+
until somebody uploads art — and a grid of them reads as nine images still
|
|
177
|
+
loading. A letter cannot be mistaken for a pending image, and every tile
|
|
178
|
+
differs from every other.
|
|
179
|
+
|
|
180
|
+
**`visuallyHidden`** (tokens-antd `/skin`) is the fleet's one off-screen-but-
|
|
181
|
+
announced style. It was written twice before, in `calendar-react` and
|
|
182
|
+
`search-react`, and the two disagreed on `clip-path` versus the deprecated
|
|
183
|
+
`clip`; both now import it.
|
|
184
|
+
|
|
185
|
+
### Patch Changes
|
|
186
|
+
|
|
187
|
+
- e738b83: Regenerated against the contracts the fleet actually installs.
|
|
188
|
+
|
|
189
|
+
`contract-pins.json` moves stapel-search 0.4.0 → 0.7.0 and stapel-categories
|
|
190
|
+
0.7.0 → 0.9.0 — the two pins the freshness gate reported as three and two
|
|
191
|
+
minors behind, and the two versions a live classified deployment now runs. A
|
|
192
|
+
pair regenerated from a stale pin is internally consistent and wrong about the
|
|
193
|
+
wire, which is the whole reason the gate exists.
|
|
194
|
+
|
|
195
|
+
What the regeneration brings in:
|
|
196
|
+
|
|
197
|
+
- `search-react`'s `GET /suggest` grows `categories[]` — a destination per row
|
|
198
|
+
with its full ancestor path, the number of LIVE listings behind it and a
|
|
199
|
+
`category` string to pass verbatim to `/query`, ranked by that count. The
|
|
200
|
+
answer is now public and conditional (`Cache-Control` + `ETag`), which is
|
|
201
|
+
what makes a per-keystroke read reasonable.
|
|
202
|
+
- `categories-react`'s feature-config union gains `group` — attributes v2's
|
|
203
|
+
container type, whose config holds its children as raw dicts each
|
|
204
|
+
discriminated by its own `type`, plus an optional `repeat`. The pair's
|
|
205
|
+
discriminator contract test pins thirteen members instead of twelve; it
|
|
206
|
+
checks in both directions on purpose, and this is the direction that was
|
|
207
|
+
supposed to fire.
|
|
208
|
+
- `calendar-react` and `search-react` raise their `@stapel/tokens-antd` peer
|
|
209
|
+
floor to the release that first ships `visuallyHidden`, which both now
|
|
210
|
+
import. The monorepo cannot catch that by building — in here every package
|
|
211
|
+
compiles against the workspace peer, never against its own declared floor —
|
|
212
|
+
so only a consumer installing at the floor would have found it, after the
|
|
213
|
+
release.
|
|
214
|
+
|
|
3
215
|
## 0.11.0
|
|
4
216
|
|
|
5
217
|
### Minor Changes
|
package/dist/api/types.d.ts
CHANGED
|
@@ -140,6 +140,16 @@ export interface ListingFeatureDao {
|
|
|
140
140
|
* can lack it and a JSONField will pass that through. */
|
|
141
141
|
readonly type?: ListingFeatureType;
|
|
142
142
|
readonly value?: unknown;
|
|
143
|
+
/**
|
|
144
|
+
* The write-time LABEL SNAPSHOT: the copy each entry of `value` had when the
|
|
145
|
+
* listing was stored, positionally aligned with it, one entry per value.
|
|
146
|
+
* `ref_select`/`ref_hierarchical_select` have always carried it (their codes
|
|
147
|
+
* name vocabulary terms no display package can reach) and `select` carries
|
|
148
|
+
* it from the release that snapshots option copy — so it is OPTIONAL, and a
|
|
149
|
+
* row stored before that one has no key at all. `model/features.ts` reads
|
|
150
|
+
* it, and says what a row without it falls back to.
|
|
151
|
+
*/
|
|
152
|
+
readonly labels?: readonly string[];
|
|
143
153
|
/** Display name or translation key; falls back to the slug. */
|
|
144
154
|
readonly name?: string | null;
|
|
145
155
|
readonly order?: number | null;
|
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
package/dist/api/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAsGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsC;IACjE,OAAO;IACP,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC;AAMF;gEACgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAuC;IACrE,SAAS;IACT,UAAU;IACV,UAAU;IACV,cAAc;CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAsGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsC;IACjE,OAAO;IACP,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC;AAMF;gEACgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAuC;IACrE,SAAS;IACT,UAAU;IACV,UAAU;IACV,cAAc;CACf,CAAC;AAyGF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC"}
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
import type { ReactElement, ReactNode } from "react";
|
|
77
77
|
import type { LinkComponent, SignInCtaProp } from "@stapel/core";
|
|
78
78
|
import type { ListingCard as ListingCardData } from "../api/types.js";
|
|
79
|
-
import type { ThemeModeProp } from "./types.js";
|
|
79
|
+
import type { CategoryFeaturesProp, ThemeModeProp } from "./types.js";
|
|
80
80
|
/**
|
|
81
81
|
* How the card opens — ONE of three, and the type says so.
|
|
82
82
|
*
|
|
@@ -146,7 +146,7 @@ export declare const CARD_TARGET_STYLE_HREF = "stapel-listings-card-target";
|
|
|
146
146
|
* design system's ROLE catalogue and this is a component's private plumbing.
|
|
147
147
|
*/
|
|
148
148
|
export declare function cardTargetCss(): string;
|
|
149
|
-
export interface ListingCardBaseProps extends ThemeModeProp, SignInCtaProp {
|
|
149
|
+
export interface ListingCardBaseProps extends ThemeModeProp, SignInCtaProp, CategoryFeaturesProp {
|
|
150
150
|
readonly listing: ListingCardData;
|
|
151
151
|
/** See {@link ListingCardBlockedReason}. Default `"text"`. */
|
|
152
152
|
readonly blockedReason?: ListingCardBlockedReason;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListingCard.d.ts","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIpE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ListingCard.d.ts","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIpE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IACE;iEAC6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;8CAE0C;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B,GACD;IACE;wEACoE;IACpE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;CACpC,GACD;IACE;kBACc;IACd,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;CACpC,CAAC;AAEN;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,gCAAgC,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAwBD,MAAM,WAAW,oBACf,SAAQ,aAAa,EACnB,aAAa,EACb,oBAAoB;IACtB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,wBAAwB,CAAC;IAClD;oEACgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;gFAC4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,oBAAoB,GAAG;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;6CAEyC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,GACA,YAAY,CA2Dd;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAsLjE"}
|
|
@@ -99,7 +99,13 @@ export function ListingCard(props) {
|
|
|
99
99
|
const favorite = useFavoriteToggle(listing.id, listing.is_favorited);
|
|
100
100
|
const { token } = antdTheme.useToken();
|
|
101
101
|
const badgeDaos = asFeatureDaoList(listing.features_badges);
|
|
102
|
-
|
|
102
|
+
// The category's own option table, when the surface has it: a stored
|
|
103
|
+
// `select` carries no table of its own, so without this a badge prints the
|
|
104
|
+
// storage slug. Absent on a mixed grid, which is why it is optional.
|
|
105
|
+
const copy = props.categoryFeatures !== undefined
|
|
106
|
+
? { categoryFeatures: props.categoryFeatures }
|
|
107
|
+
: {};
|
|
108
|
+
const badgeFeatures = featuresFromDaoList(badgeDaos, copy);
|
|
103
109
|
const badgeValues = featuresDtoFromDaoList(badgeDaos);
|
|
104
110
|
const titleDaos = asFeatureDaoList(listing.features_title);
|
|
105
111
|
const status = listing.status === undefined ? undefined : lifecycleCaption(listing.status);
|
|
@@ -123,7 +129,7 @@ export function ListingCard(props) {
|
|
|
123
129
|
* all of them absent. That is why the photo and the price carry the layout:
|
|
124
130
|
* they are the two fields a result always has.
|
|
125
131
|
*/
|
|
126
|
-
const content = (_jsxs(_Fragment, { children: [_jsx(ListingPhoto, { imageRef: listing.images?.[0], alt: title.length > 0 ? title : String(listing.id) }), _jsxs(Flex, { vertical: true, gap: spacing[1], style: { minWidth: 0, padding: token.paddingSM }, children: [props.badge, _jsx(Typography.Text, { strong: true, "data-testid": "listings-card-price", children: _jsx(ListingPrice, { amount: listing.price, ...(listing.currency !== undefined ? { currency: listing.currency } : {}) }) }), _jsx(Typography.Text, { ellipsis: true, "data-testid": "listings-card-title", children: title }), titleDaos.length > 0 ? (_jsx(Typography.Text, { type: "secondary", ellipsis: true, children: _jsx(FeatureBadges, { features: featuresFromDaoList(titleDaos).map((view) => view.feature), values: featuresDtoFromDaoList(titleDaos) }) })) : null, badgeFeatures.length > 0 ? (_jsx(FeatureBadges, { features: badgeFeatures.map((view) => view.feature), values: badgeValues })) : null, listing.location_label !== undefined &&
|
|
132
|
+
const content = (_jsxs(_Fragment, { children: [_jsx(ListingPhoto, { imageRef: listing.images?.[0], alt: title.length > 0 ? title : String(listing.id) }), _jsxs(Flex, { vertical: true, gap: spacing[1], style: { minWidth: 0, padding: token.paddingSM }, children: [props.badge, _jsx(Typography.Text, { strong: true, "data-testid": "listings-card-price", children: _jsx(ListingPrice, { amount: listing.price, ...(listing.currency !== undefined ? { currency: listing.currency } : {}) }) }), _jsx(Typography.Text, { ellipsis: true, "data-testid": "listings-card-title", children: title }), titleDaos.length > 0 ? (_jsx(Typography.Text, { type: "secondary", ellipsis: true, children: _jsx(FeatureBadges, { features: featuresFromDaoList(titleDaos, copy).map((view) => view.feature), values: featuresDtoFromDaoList(titleDaos) }) })) : null, badgeFeatures.length > 0 ? (_jsx(FeatureBadges, { features: badgeFeatures.map((view) => view.feature), values: badgeValues })) : null, listing.location_label !== undefined &&
|
|
127
133
|
listing.location_label.length > 0 ? (_jsx(Typography.Text, { type: "secondary", "data-testid": "listings-card-location", children: listing.location_label })) : null] })] }));
|
|
128
134
|
return (_jsxs(SkinTheme, { surface: "bare", ...(props.mode !== undefined ? { mode: props.mode } : {}), children: [_jsx("style", { href: CARD_TARGET_STYLE_HREF, precedence: "default", children: cardTargetCss() }), _jsxs(Card, { size: "small", "data-testid": "listings-card", "data-listing-id": listing.id, ...(status !== undefined
|
|
129
135
|
? { "data-listing-status": status.status }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListingCard.js","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":";AA4EA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ListingCard.js","sourceRoot":"","sources":["../../src/default/ListingCard.tsx"],"names":[],"mappings":";AA4EA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAErG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA4DjD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAE9D,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,iBAAiB,oDAAoD;QACzE,IAAI,iBAAiB,gFAAgF;KACtG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAED;+CAC+C;AAC/C,MAAM,YAAY,GAAkB;IAClC,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,MAAM;CACvB,CAAC;AAEF;;6BAE6B;AAC7B,MAAM,mBAAmB,GAAkB;IACzC,GAAG,YAAY;IACf,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,SAAS;CAClB,CAAC;AAmBF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,UAAU,CACxB,KAUC;IAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,oBAAoB,CAAC;IAEpD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;QACjC,yEAAyE;QACzE,yEAAyE;QACzE,8DAA8D;QAC9D,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,KAAC,IAAI,IACH,IAAI,EAAE,KAAK,CAAC,IAAI,gBACJ,KAAK,EACjB,SAAS,EAAE,iBAAiB,iBACf,MAAM,oBACJ,MAAM,2BACC,8DAAyD,YAE9E,QAAQ,GACJ,CACR,CAAC,CAAC,CAAC,CACF,YACE,IAAI,EAAE,KAAK,CAAC,IAAI,gBACJ,KAAK,EACjB,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,YAAY,iBACN,MAAM,oBACJ,MAAM,2BACC,8DAAyD,YAE9E,QAAQ,GACP,CACL,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,gBACD,KAAK,EACjB,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,mBAAmB,iBACb,MAAM,oBACJ,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,GAAG,EAAE;gBACZ,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,YAEA,QAAQ,GACF,CACV,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,OAAO,CACL,6BAAkB,KAAK,CAAC,UAAU,IAAI,oBAAoB,YAAG,QAAQ,GAAO,CAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAEvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,qEAAqE;IACrE,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,IAAI,GACR,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE;QAC9C,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3F,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC;IAEpD,MAAM,aAAa,GAAG,CAAC,CACrB,QAAQ,CAAC,SAAS;QAChB,CAAC,CAAC,kBAAkB,CAAC,kBAAkB;QACvC,CAAC,CAAC,kBAAkB,CAAC,eAAe,CACvC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,2EAA2E;IAC3E,4EAA4E;IAC5E,eAAe;IACf,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAEhE;;;;;;;;;OASG;IACH,MAAM,OAAO,GAAG,CACd,8BACE,KAAC,YAAY,IACX,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC7B,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAClD,EACF,MAAC,IAAI,IACH,QAAQ,QACR,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,aAE/C,KAAK,CAAC,KAAK,EAEZ,KAAC,UAAU,CAAC,IAAI,IAAC,MAAM,uBAAa,qBAAqB,YACvD,KAAC,YAAY,IACX,MAAM,EAAE,OAAO,CAAC,KAAK,KACjB,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC1E,GACc,EAElB,KAAC,UAAU,CAAC,IAAI,IAAC,QAAQ,uBAAa,qBAAqB,YACxD,KAAK,GACU,EAIjB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,kBACxC,KAAC,aAAa,IACZ,QAAQ,EAAE,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAChD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CACvB,EACD,MAAM,EAAE,sBAAsB,CAAC,SAAS,CAAC,GACzC,GACc,CACnB,CAAC,CAAC,CAAC,IAAI,EAEP,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1B,KAAC,aAAa,IACZ,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EACnD,MAAM,EAAE,WAAW,GACnB,CACH,CAAC,CAAC,CAAC,IAAI,EAEP,OAAO,CAAC,cAAc,KAAK,SAAS;wBACrC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,wBAAwB,YACnE,OAAO,CAAC,cAAc,GACP,CACnB,CAAC,CAAC,CAAC,IAAI,IACH,IACN,CACJ,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IACR,OAAO,EAAC,MAAM,KACV,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAE1D,gBAAO,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAC,SAAS,YACtD,aAAa,EAAE,GACV,EACR,MAAC,IAAI,IACH,IAAI,EAAC,OAAO,iBACA,eAAe,qBACV,OAAO,CAAC,EAAE,KACvB,CAAC,MAAM,KAAK,SAAS;oBACvB,CAAC,CAAC,EAAE,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;gBACP,oEAAoE;gBACpE,uEAAuE;gBACvE,oEAAoE;gBACpE,6BAA6B;gBAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAC7C,KAAK,EAAE,EAAE,CAAC,sBAAgC,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,aAEjE,KAAC,UAAU,OAAK,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,YAC7D,OAAO,GACG,EAMZ,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACrC,eACE,KAAK,EAAE;4BACL,aAAa,EAAE,KAAK,CAAC,SAAS;4BAC9B,eAAe,EAAE,KAAK,CAAC,SAAS;yBACjC,aAED,KAAC,YAAY,IACX,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,EAAC,uBAAuB,EAC9B,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAEvB,CAAC,IAAI,EAAE,EAAE,CAAC,CACT,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAC/C,KAAC,MAAM,IACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,0BACF,2EAA2E,KAC5F,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,SAAS;4CACzC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE;4CAClD,CAAC,CAAC,EAAE,CAAC,gBACK,aAAa,kBACX,QAAQ,CAAC,SAAS,iBACpB,wBAAwB,oBACpB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAC3B,MAAM,2BACC,8DAAyD,EAC/E,OAAO,EAAE,QAAQ,CAAC,MAAM,EACxB,IAAI,EAAE,KAAC,SAAS,IAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,GAAI,GAC/C,GACG,CACR,GACY,EAQd,YAAY,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACtE,KAAC,UAAU,CAAC,IAAI,IACd,IAAI,EAAC,WAAW,iBACJ,gCAAgC,YAE5C,KAAC,UAAU,IAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAC,uBAAuB,GAAG,GAChD,CACnB,IACG,CACP,IACI,IACG,CACb,CAAC;AACJ,CAAC"}
|
|
@@ -50,6 +50,45 @@
|
|
|
50
50
|
* do not import each other; the container is the seam. A library that picked
|
|
51
51
|
* one would pick it for every host.
|
|
52
52
|
*
|
|
53
|
+
* ── The SECTION ORDER is this component's, and it is not a prop ────────────
|
|
54
|
+
*
|
|
55
|
+
* One order, at every width:
|
|
56
|
+
*
|
|
57
|
+
* category → title → description → price → currency → where → photos →
|
|
58
|
+
* the category's characteristics → the listing's own options
|
|
59
|
+
*
|
|
60
|
+
* The category comes first because everything after it depends on the choice.
|
|
61
|
+
* Then the five questions a seller came to answer — what it is, what it says,
|
|
62
|
+
* what it costs, where it is, what it looks like — and only then the questions
|
|
63
|
+
* the CATEGORY asks.
|
|
64
|
+
*
|
|
65
|
+
* This used to be two orders chosen by the form's width, and the narrow one
|
|
66
|
+
* put the characteristics directly under the category. The reason was real:
|
|
67
|
+
* measured on a live classified deployment, Mobile phones put the first
|
|
68
|
+
* attribute control at y=1596, two viewports below the fold, while the footer
|
|
69
|
+
* said "10 required details not filled in" with none of them on screen. The
|
|
70
|
+
* fix was not: the same leaf carries 32 imported fields, so on the next
|
|
71
|
+
* measurement of the same form the seller was asked for the parcel's weight,
|
|
72
|
+
* its length and "what the goods are measured in" BEFORE the title — title
|
|
73
|
+
* y=5575, price y=5871, photos y=6245, of a 7308px form. A composer that asks
|
|
74
|
+
* about postage before it asks what is being sold has no funnel left.
|
|
75
|
+
*
|
|
76
|
+
* So the discoverability problem is solved where it actually lives, and by two
|
|
77
|
+
* things that do not move the questions around:
|
|
78
|
+
*
|
|
79
|
+
* - the count of unfilled details is a CONTROL that goes to the first of them
|
|
80
|
+
* (`listings-composer-goto-missing`, below), so "10 required details" is
|
|
81
|
+
* never a dead end wherever the region sits;
|
|
82
|
+
* - the region itself is short, because `groupCollapse="auto"` opens the
|
|
83
|
+
* groups that ask something required and leaves the plumbing (delivery
|
|
84
|
+
* dimensions, wholesale terms) closed under its own heading.
|
|
85
|
+
*
|
|
86
|
+
* `detailsPlacement` is therefore gone as a decision — `data-placement` stays
|
|
87
|
+
* on the region as a constant, because an e2e that measured the regression
|
|
88
|
+
* needs something to read that is not a pixel count. A host that wants a
|
|
89
|
+
* different order does not want this page; it wants `<FeatureFields>` and its
|
|
90
|
+
* own form, which is exactly why that component is exported separately.
|
|
91
|
+
*
|
|
53
92
|
* ── Every blocked control says which of six reasons it is ──────────────────
|
|
54
93
|
*
|
|
55
94
|
* The publish button is the most-gated control in the fleet, and that is the
|
|
@@ -71,6 +110,26 @@ import type { ThemeModeProp } from "./types.js";
|
|
|
71
110
|
* A measure, not a pixel guess: `ch` scales with the type the theme is set to.
|
|
72
111
|
*/
|
|
73
112
|
export declare const COMPOSER_MEASURE = "44rem";
|
|
113
|
+
/**
|
|
114
|
+
* What `data-placement` says on the characteristics region.
|
|
115
|
+
*
|
|
116
|
+
* A constant, and deliberately so: the order is the composer's and does not
|
|
117
|
+
* depend on the width any more (see the header). The attribute stays because
|
|
118
|
+
* an e2e suite measured the regression through it and needs a reading that is
|
|
119
|
+
* not a pixel count.
|
|
120
|
+
*/
|
|
121
|
+
export declare const COMPOSER_DETAILS_PLACEMENT = "after-core-fields";
|
|
122
|
+
/**
|
|
123
|
+
* The DOM id of the control that answers one of the composer's own fields —
|
|
124
|
+
* the names `mirrorListingFields` refuses by (`title`, `description`, …).
|
|
125
|
+
*
|
|
126
|
+
* A person told "10 required details are still empty" needs to be taken to
|
|
127
|
+
* one, and taking them there needs an ADDRESS. Features already have one
|
|
128
|
+
* (`featureControlId`); the composer's own fields had none, and a test id is
|
|
129
|
+
* not an address — it is a test's handle, and reaching for it in product code
|
|
130
|
+
* makes every test id load-bearing.
|
|
131
|
+
*/
|
|
132
|
+
export declare function composerFieldId(field: string): string;
|
|
74
133
|
/**
|
|
75
134
|
* What `renderCategoryPicker` is handed: the current category and the ONLY
|
|
76
135
|
* function that changes it. Same shape as any other bag in this monorepo — the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListingComposerPage.d.ts","sourceRoot":"","sources":["../../src/default/ListingComposerPage.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ListingComposerPage.d.ts","sourceRoot":"","sources":["../../src/default/ListingComposerPage.tsx"],"names":[],"mappings":"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"}
|