@stapel/listings-react 0.11.0 → 0.12.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 +171 -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 +22 -62
- package/dist/default/ListingComposerPage.d.ts.map +1 -1
- package/dist/default/ListingComposerPage.js +220 -54
- 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 +203 -33
- 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,176 @@
|
|
|
1
1
|
# @stapel/listings-react
|
|
2
2
|
|
|
3
|
+
## 0.12.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 0eab206: A published listing prints its option COPY wherever the copy exists, and the
|
|
8
|
+
composer's characteristics step is reachable on a phone.
|
|
9
|
+
|
|
10
|
+
**The copy.** A `select` DAO carries the chosen values and the display config,
|
|
11
|
+
never the option table — the table lives on the CATEGORY, and not needing it
|
|
12
|
+
is what lets a card draw a badge without a category read. A row written before
|
|
13
|
+
the server started snapshotting labels therefore had nothing to resolve
|
|
14
|
+
against, and the STORAGE SLUG reached the screen: a live classified deployment
|
|
15
|
+
printed `b-u`, `bez-defektov` and `ne-rabotaet-vspyshka` on its spec rows.
|
|
16
|
+
`featureFromDao(dao, { categoryFeatures })` adds the third and last source of
|
|
17
|
+
copy, with the precedence written out: a row carrying its own `options` table
|
|
18
|
+
is left alone, then the row's own `labels` snapshot, then the CATEGORY's
|
|
19
|
+
option table, then the raw value. The snapshot wins over the category on
|
|
20
|
+
purpose — it is what the listing was PUBLISHED with, and the whole reason the
|
|
21
|
+
server takes one is that a category edited afterwards must not silently
|
|
22
|
+
restate an old listing. A category def is used only when slug AND value type
|
|
23
|
+
match, so a renamed feature is ignored rather than forced, and a value the
|
|
24
|
+
catalogue no longer declares still prints itself rather than vanishing or
|
|
25
|
+
being invented. `hierarchical_select` gets the same repair, its tree adopted
|
|
26
|
+
whole because no positional snapshot can describe one. `<ListingDetailPane>`,
|
|
27
|
+
`<ListingCard>`, `<ListingSerpCard>`, `<ListingDetail>` and `useListingDetail`
|
|
28
|
+
take the optional `categoryFeatures`; a host that wires nothing is unchanged.
|
|
29
|
+
|
|
30
|
+
**The composer.** On a 390px viewport the characteristics of the chosen
|
|
31
|
+
category began about 1.8 viewports below the fold, under a 700px photo
|
|
32
|
+
dropzone, with no step indicator and nothing saying they existed — while the
|
|
33
|
+
footer counted ten unfilled required details, none of them on screen.
|
|
34
|
+
|
|
35
|
+
- Below `COMPOSER_STACKED_BELOW` the characteristics render directly under the
|
|
36
|
+
category choice and ABOVE the photos; at or above it they stay where they
|
|
37
|
+
were. The threshold is measured on the FORM's own width via `useElementWidth`
|
|
38
|
+
— a composer in a 400px panel on a desktop is a narrow composer — and an
|
|
39
|
+
unmeasured element falls to the wide arm.
|
|
40
|
+
- The placeholder said "loading the category's characteristics" when nothing
|
|
41
|
+
was in flight and no category had been chosen. That is now its own fourth
|
|
42
|
+
state with its own sentence, en/ru/es.
|
|
43
|
+
- `ListingComposerBag.firstUnsatisfied` names the first refused field in the
|
|
44
|
+
form's own order, and the closed gate renders a real button (accessible
|
|
45
|
+
name, focus AND scroll) that takes the person to it. A count of ten with
|
|
46
|
+
nothing on screen is a dead end.
|
|
47
|
+
- A field showing a refusal now drops its hint instead of stacking on it: the
|
|
48
|
+
refusal is the more specific statement and the one just earned.
|
|
49
|
+
- The whole attribute region carried exactly one test id. `attributes-fields`,
|
|
50
|
+
`attributes-group-<group>`, `attributes-group-<group>-heading` and
|
|
51
|
+
`attributes-row-<slug>` (with `featureSectionTestId` / `featureRowTestId`
|
|
52
|
+
exported) make it measurable, and the row id sits on the same element with
|
|
53
|
+
or without a host `renderRow`.
|
|
54
|
+
|
|
55
|
+
- 9a123b9: A stored `select` prints its option copy, not the storage slug.
|
|
56
|
+
|
|
57
|
+
A DAO carries the value and the display config, never the option table — the
|
|
58
|
+
table lives on the category, and not needing it is what lets a card render a
|
|
59
|
+
badge without a category read. `formatFeatureValue` resolves an option's copy
|
|
60
|
+
out of `config.options`, so with no table it fell through to `String(value)`
|
|
61
|
+
and the SLUG reached the screen: a live classified deployment printed
|
|
62
|
+
"Condition: b-u" on its spec rows and a subtitle of three slugs on its cards.
|
|
63
|
+
|
|
64
|
+
The identity table `featureFromDao` synthesized (`{value: v, label: v}`) only
|
|
65
|
+
ever answered for a TRANSLATABLE catalogue, whose labels are its keys. The
|
|
66
|
+
catalogues that produced those screens set `translatable_options: false` and
|
|
67
|
+
carry literal copy on the category, so `t("b-u")` returned `"b-u"` and there
|
|
68
|
+
was nothing else to fall back to.
|
|
69
|
+
|
|
70
|
+
- `featureFromDao` now builds the option table from the DAO's write-time
|
|
71
|
+
`labels` snapshot — the `string[]` positionally aligned with `value` that
|
|
72
|
+
`ref_select` has always carried and that `select` carries from the
|
|
73
|
+
stapel-attributes release which snapshots option copy. The copy a listing was
|
|
74
|
+
published with is the copy it prints, whatever the category has become since.
|
|
75
|
+
- A row written before that release carries no `labels` key and keeps the
|
|
76
|
+
identity table exactly as it behaved: a translatable catalogue still reads
|
|
77
|
+
out of the host's bundle, and a non-translatable one still shows the slug
|
|
78
|
+
until the listing is re-projected. A visible slug gets fixed; an invented
|
|
79
|
+
label ships wrong.
|
|
80
|
+
- A snapshot whose length differs from `value` is dropped WHOLE rather than
|
|
81
|
+
paired over its overlap, which is the engine's own rule: one option's copy
|
|
82
|
+
printed against another option's value does not look wrong.
|
|
83
|
+
- `ListingFeatureDao` declares `labels?: readonly string[]`.
|
|
84
|
+
|
|
85
|
+
Minor rather than patch: the fix rides on a new optional wire field and changes
|
|
86
|
+
what every listing surface renders. `ListingCard`, `ListingSerpCard`,
|
|
87
|
+
`ListingDetailPane` and the `ListingDetail` headless bag all split their DAOs
|
|
88
|
+
through this one function, so no surface needed its own patch — and a host
|
|
89
|
+
snapshotting card or detail output will see the labels change.
|
|
90
|
+
|
|
91
|
+
- 8d1e20f: The phone dock stops truncating its labels, stops covering the footer, and the
|
|
92
|
+
phone SERP gets a one-line toolbar instead of four stacked rows.
|
|
93
|
+
|
|
94
|
+
**A compact label for a compact chrome.** `NavEntry.shortLabelKey` (core) is an
|
|
95
|
+
optional second i18n key a manifest declares when its menu label cannot fit a
|
|
96
|
+
dock cell. A five-item dock at 390px gives each destination about ten
|
|
97
|
+
characters, and a label written for a menu row ellipsizes mid-word — a
|
|
98
|
+
destination a person has to guess at, which is the one thing a dock must not
|
|
99
|
+
produce. A key and not a length hint, because which words survive the cut is a
|
|
100
|
+
translator's judgement: the useful short form of "Post a listing" is the verb,
|
|
101
|
+
of "My listings" the noun, and no truncation rule finds either. `resolveNav`
|
|
102
|
+
carries it through, `<NavDock>` prints it and keeps the LONG label as the
|
|
103
|
+
link's accessible name; `listings-react` declares one for `compose` and `mine`.
|
|
104
|
+
The dock also drops its inter-cell gap and one inset step — 24px given back to
|
|
105
|
+
five labels — and `scripts/gen-nav-manifest.mjs` validates the new field.
|
|
106
|
+
|
|
107
|
+
**The clearance belongs to the page, not the content.** The island is fixed
|
|
108
|
+
over the last thing on the page, and the last thing is the footer. Reserving
|
|
109
|
+
`DOCK_CLEARANCE` on `<Layout.Content>` cleared the final card and left the
|
|
110
|
+
footer's legal links permanently under the island. `<PublicShell>` reserves it
|
|
111
|
+
on the page column instead, and only when `dockRenders(nav)` says an island
|
|
112
|
+
will actually be drawn — a one-entry nav used to get a strip of empty page
|
|
113
|
+
under a dock nobody rendered.
|
|
114
|
+
|
|
115
|
+
**A phone toolbar that is one row.** `<SearchResultsPane header="compact">`
|
|
116
|
+
gives the toolbar its own line and puts the count directly above the cards as
|
|
117
|
+
their caption, with the heading visually hidden but still in the document
|
|
118
|
+
outline; the banner shape (heading | count + toolbar) is unchanged and
|
|
119
|
+
remains the default. `<SortSelect compact>` drops the caption and the 200px
|
|
120
|
+
floor so the control shares a row, and moves the blocked `distance` option's
|
|
121
|
+
REASON into the option's own label — on a phone, where that refusal is most
|
|
122
|
+
common, a separate reason row costs a band of viewport above the first result.
|
|
123
|
+
`<FilterChips>` takes `geoChip={false}` for a surface that already states the
|
|
124
|
+
location above it (the phone SERP mounts `<LocationSummaryLine>`, and the two
|
|
125
|
+
together asked about one filter twice), and renders NOTHING when it would be a
|
|
126
|
+
row of one button — a free-text query has no category, so the server returns no
|
|
127
|
+
facet plan, and the row was a lone circle floating between two working filter
|
|
128
|
+
affordances. `<LocationSummaryLine>` says "Filters", not "All filters": that
|
|
129
|
+
end of the row shares 390px with a place name.
|
|
130
|
+
|
|
131
|
+
**Tiles say which category they are.** `<CategoryTileGrid>` draws the
|
|
132
|
+
category's own initial where art is missing, instead of a muted disc. A live
|
|
133
|
+
catalogue put nine identical grey discs on one landing — every category there
|
|
134
|
+
carries an empty `carousel_icon`, which is the state every catalogue is in
|
|
135
|
+
until somebody uploads art — and a grid of them reads as nine images still
|
|
136
|
+
loading. A letter cannot be mistaken for a pending image, and every tile
|
|
137
|
+
differs from every other.
|
|
138
|
+
|
|
139
|
+
**`visuallyHidden`** (tokens-antd `/skin`) is the fleet's one off-screen-but-
|
|
140
|
+
announced style. It was written twice before, in `calendar-react` and
|
|
141
|
+
`search-react`, and the two disagreed on `clip-path` versus the deprecated
|
|
142
|
+
`clip`; both now import it.
|
|
143
|
+
|
|
144
|
+
### Patch Changes
|
|
145
|
+
|
|
146
|
+
- e738b83: Regenerated against the contracts the fleet actually installs.
|
|
147
|
+
|
|
148
|
+
`contract-pins.json` moves stapel-search 0.4.0 → 0.7.0 and stapel-categories
|
|
149
|
+
0.7.0 → 0.9.0 — the two pins the freshness gate reported as three and two
|
|
150
|
+
minors behind, and the two versions a live classified deployment now runs. A
|
|
151
|
+
pair regenerated from a stale pin is internally consistent and wrong about the
|
|
152
|
+
wire, which is the whole reason the gate exists.
|
|
153
|
+
|
|
154
|
+
What the regeneration brings in:
|
|
155
|
+
|
|
156
|
+
- `search-react`'s `GET /suggest` grows `categories[]` — a destination per row
|
|
157
|
+
with its full ancestor path, the number of LIVE listings behind it and a
|
|
158
|
+
`category` string to pass verbatim to `/query`, ranked by that count. The
|
|
159
|
+
answer is now public and conditional (`Cache-Control` + `ETag`), which is
|
|
160
|
+
what makes a per-keystroke read reasonable.
|
|
161
|
+
- `categories-react`'s feature-config union gains `group` — attributes v2's
|
|
162
|
+
container type, whose config holds its children as raw dicts each
|
|
163
|
+
discriminated by its own `type`, plus an optional `repeat`. The pair's
|
|
164
|
+
discriminator contract test pins thirteen members instead of twelve; it
|
|
165
|
+
checks in both directions on purpose, and this is the direction that was
|
|
166
|
+
supposed to fire.
|
|
167
|
+
- `calendar-react` and `search-react` raise their `@stapel/tokens-antd` peer
|
|
168
|
+
floor to the release that first ships `visuallyHidden`, which both now
|
|
169
|
+
import. The monorepo cannot catch that by building — in here every package
|
|
170
|
+
compiles against the workspace peer, never against its own declared floor —
|
|
171
|
+
so only a consumer installing at the floor would have found it, after the
|
|
172
|
+
release.
|
|
173
|
+
|
|
3
174
|
## 0.11.0
|
|
4
175
|
|
|
5
176
|
### 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":"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"}
|
|
@@ -1,65 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `<ListingComposerPage>` — the submission screen.
|
|
3
|
-
*
|
|
4
|
-
* Five contracts meet on this page and each arrives through its own seam, so
|
|
5
|
-
* the component can be read top to bottom without knowing any of the other
|
|
6
|
-
* pairs:
|
|
7
|
-
*
|
|
8
|
-
* category `renderCategoryPicker` — the container's `<CategoryPickerField>`,
|
|
9
|
-
* given `setCategory` to call
|
|
10
|
-
* where `locationPicker` — the container's `<LocationField>`
|
|
11
|
-
* (`@stapel/geo-react`)
|
|
12
|
-
* currency `renderCurrencyPicker` — whatever vocabulary the deployment sells in
|
|
13
|
-
* details `features` — the schema, drawn by `<FeatureFields>` (L0)
|
|
14
|
-
* photos `gallerySlot` — the container's `<MediaGalleryField bag>`,
|
|
15
|
-
* whose bag is handed here as `images`
|
|
16
|
-
* the draft this pair
|
|
17
|
-
*
|
|
18
|
-
* ── An unfilled slot is NAMED, never improvised ────────────────────────────
|
|
19
|
-
*
|
|
20
|
-
* Every one of those four slots used to degrade into a control this pair could
|
|
21
|
-
* write on its own, and every one of those controls asked a question no seller
|
|
22
|
-
* can answer: a numeric category id typed into a text box, a currency CODE
|
|
23
|
-
* typed into a text box, and — the defect the owner named — two decimal boxes
|
|
24
|
-
* labelled Latitude and Longitude. A gallery heading with nothing under it was
|
|
25
|
-
* the same defect with the improvisation left out.
|
|
26
|
-
*
|
|
27
|
-
* So an unfilled slot renders `<SlotPlaceholder name="…"/>`: a labelled dashed
|
|
28
|
-
* region in a dev build, nothing at all in production. The rule is the one the
|
|
29
|
-
* rest of this codebase already lives by — `matchList`'s required empty arm,
|
|
30
|
-
* `ActionAvailability` with no "disabled for unknown reasons", `LoadState`
|
|
31
|
-
* refusing to fold failed into empty. A slot was the last place absence could
|
|
32
|
-
* still be silent, and `stapel/no-silent-slot` now says so at lint time.
|
|
33
|
-
*
|
|
34
|
-
* ── …and its LABEL goes with it ────────────────────────────────────────────
|
|
35
|
-
*
|
|
36
|
-
* The placeholder is nothing in production — but the `Form.Item` around it
|
|
37
|
-
* still drew its label, so a production composer with three unfilled slots
|
|
38
|
-
* rendered three labelled voids: "Category", "Currency", "Where it is" over
|
|
39
|
-
* empty space, and a "Photos" heading over air. A label is a promise that a
|
|
40
|
-
* control follows it. {@link SlotField} therefore renders the WHOLE field —
|
|
41
|
-
* label, help text and control — or nothing at all, and the `Photos` section
|
|
42
|
-
* does the same with its heading. `slotVisibility` pins the dev view on so a
|
|
43
|
-
* production-built showcase can still photograph the named placeholders.
|
|
44
|
-
*
|
|
45
|
-
* ── Why the pickers are slots and not dependencies ─────────────────────────
|
|
46
|
-
*
|
|
47
|
-
* A category tree, a geocoder and a currency vocabulary are all DEPLOYMENT
|
|
48
|
-
* knowledge, and all three live in sibling L2 pairs
|
|
49
|
-
* (`@stapel/categories-react`, `@stapel/geo-react`, the host's own). L2 pairs
|
|
50
|
-
* do not import each other; the container is the seam. A library that picked
|
|
51
|
-
* one would pick it for every host.
|
|
52
|
-
*
|
|
53
|
-
* ── Every blocked control says which of six reasons it is ──────────────────
|
|
54
|
-
*
|
|
55
|
-
* The publish button is the most-gated control in the fleet, and that is the
|
|
56
|
-
* point: "sign in", "choose a category", "we could not load what this
|
|
57
|
-
* category asks for", "this build cannot draw one of these details", "wait
|
|
58
|
-
* for the photos", "fix the highlighted fields" are six different problems
|
|
59
|
-
* with six different next actions. `firstBlock` orders them the way a person
|
|
60
|
-
* would be told, and `<GatedButton>` renders the reason beside the button —
|
|
61
|
-
* never a grey rectangle, never a hover.
|
|
62
|
-
*/
|
|
63
1
|
import type { ComponentType, ReactElement, ReactNode } from "react";
|
|
64
2
|
import type { FeatureDef } from "@stapel/attributes-react";
|
|
65
3
|
import type { ListingLocation } from "../model/draft.js";
|
|
@@ -71,6 +9,28 @@ import type { ThemeModeProp } from "./types.js";
|
|
|
71
9
|
* A measure, not a pixel guess: `ch` scales with the type the theme is set to.
|
|
72
10
|
*/
|
|
73
11
|
export declare const COMPOSER_MEASURE = "44rem";
|
|
12
|
+
/**
|
|
13
|
+
* Below this FORM width the composer is a one-thumb column, and the order of
|
|
14
|
+
* its sections has to change — see {@link ListingComposerPage}'s header on why
|
|
15
|
+
* the characteristics move up.
|
|
16
|
+
*
|
|
17
|
+
* The `tablet` breakpoint, which is what "narrow" means everywhere else in the
|
|
18
|
+
* skin, measured against the form's OWN width and never the viewport's (§83).
|
|
19
|
+
* A composer drawn in a 360px settings pane on a 1440px desktop is narrow; a
|
|
20
|
+
* viewport query would call it wide and bury its questions.
|
|
21
|
+
*/
|
|
22
|
+
export declare const COMPOSER_STACKED_BELOW: number;
|
|
23
|
+
/**
|
|
24
|
+
* The DOM id of the control that answers one of the composer's own fields —
|
|
25
|
+
* the names `mirrorListingFields` refuses by (`title`, `description`, …).
|
|
26
|
+
*
|
|
27
|
+
* A person told "10 required details are still empty" needs to be taken to
|
|
28
|
+
* one, and taking them there needs an ADDRESS. Features already have one
|
|
29
|
+
* (`featureControlId`); the composer's own fields had none, and a test id is
|
|
30
|
+
* not an address — it is a test's handle, and reaching for it in product code
|
|
31
|
+
* makes every test id load-bearing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function composerFieldId(field: string): string;
|
|
74
34
|
/**
|
|
75
35
|
* What `renderCategoryPicker` is handed: the current category and the ONLY
|
|
76
36
|
* 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":"
|
|
1
|
+
{"version":3,"file":"ListingComposerPage.d.ts","sourceRoot":"","sources":["../../src/default/ListingComposerPage.tsx"],"names":[],"mappings":"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"}
|