@stapel/listings-react 0.9.0 → 0.10.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 +76 -0
- package/dist/api/generated/schema.d.ts +34 -2
- package/dist/api/generated/schema.d.ts.map +1 -1
- package/dist/default/FeedGrid.d.ts +42 -0
- package/dist/default/FeedGrid.d.ts.map +1 -0
- package/dist/default/FeedGrid.js +23 -0
- package/dist/default/FeedGrid.js.map +1 -0
- package/dist/default/ListingCard.d.ts +31 -0
- package/dist/default/ListingCard.d.ts.map +1 -1
- package/dist/default/ListingCard.js +12 -4
- package/dist/default/ListingCard.js.map +1 -1
- package/dist/default/ListingFeedCard.d.ts +77 -0
- package/dist/default/ListingFeedCard.d.ts.map +1 -0
- package/dist/default/ListingFeedCard.js +75 -0
- package/dist/default/ListingFeedCard.js.map +1 -0
- package/dist/default/ListingSerpCard.d.ts +114 -0
- package/dist/default/ListingSerpCard.d.ts.map +1 -0
- package/dist/default/ListingSerpCard.js +72 -0
- package/dist/default/ListingSerpCard.js.map +1 -0
- package/dist/default/favorite.d.ts +49 -0
- package/dist/default/favorite.d.ts.map +1 -0
- package/dist/default/favorite.js +25 -0
- package/dist/default/favorite.js.map +1 -0
- package/dist/default/icons.d.ts +17 -3
- package/dist/default/icons.d.ts.map +1 -1
- package/dist/default/icons.js +13 -1
- package/dist/default/icons.js.map +1 -1
- package/dist/default/index.d.ts +17 -1
- package/dist/default/index.d.ts.map +1 -1
- package/dist/default/index.js +14 -1
- package/dist/default/index.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 +11 -0
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +15 -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/llms.txt +3 -1
- package/manifest.json +45 -1
- package/nav-manifest.json +1 -1
- package/package.json +9 -9
- package/src/analytics/generated/events.json +1 -1
- package/src/api/generated/schema.ts +34 -2
- package/src/default/FeedGrid.tsx +70 -0
- package/src/default/ListingCard.tsx +21 -5
- package/src/default/ListingFeedCard.tsx +232 -0
- package/src/default/ListingSerpCard.tsx +374 -0
- package/src/default/favorite.tsx +91 -0
- package/src/default/icons.tsx +37 -3
- package/src/default/index.ts +24 -1
- package/src/i18n/es.ts +4 -0
- package/src/i18n/keys.ts +15 -0
- package/src/i18n/ru.ts +4 -0
package/dist/i18n/keys.js
CHANGED
|
@@ -70,6 +70,17 @@ export const LISTINGS_I18N_KEYS = {
|
|
|
70
70
|
cardUntitled: "listings.card.untitled",
|
|
71
71
|
/** The door beside a blocked favourite: the container supplies WHERE. */
|
|
72
72
|
cardSignIn: "listings.card.sign_in",
|
|
73
|
+
/** The accessible name of `<ListingSerpCard>`'s photo strip. `SkinCarousel`
|
|
74
|
+
* requires one — an unnamed scrollable region is announced as nothing — and
|
|
75
|
+
* the token bridge owns no i18n engine, so the copy is this pair's. */
|
|
76
|
+
cardPhotos: "listings.card.photos",
|
|
77
|
+
/** The label on the struck-through previous price. The strike is styling and
|
|
78
|
+
* a screen reader announces none of it, so the word is on the line. */
|
|
79
|
+
cardPriceWas: "listings.card.price_was",
|
|
80
|
+
/** The name of the trend arrow — the whole message of a glyph that would
|
|
81
|
+
* otherwise be a decoration nobody can read. */
|
|
82
|
+
cardPriceDropped: "listings.card.price_dropped",
|
|
83
|
+
cardPriceRaised: "listings.card.price_raised",
|
|
73
84
|
// ── detail ───────────────────────────────────────────────────────────────
|
|
74
85
|
detailLoading: "listings.detail.loading",
|
|
75
86
|
detailLoadFailed: "listings.detail.load_failed",
|
|
@@ -230,6 +241,10 @@ export const listingsI18nBundleEn = {
|
|
|
230
241
|
"listings.card.favorite_remove": "Remove from favourites",
|
|
231
242
|
"listings.card.untitled": "Untitled listing",
|
|
232
243
|
"listings.card.sign_in": "Sign in",
|
|
244
|
+
"listings.card.photos": "Photos of this listing",
|
|
245
|
+
"listings.card.price_was": "Was",
|
|
246
|
+
"listings.card.price_dropped": "The price went down",
|
|
247
|
+
"listings.card.price_raised": "The price went up",
|
|
233
248
|
"listings.detail.loading": "Loading the listing…",
|
|
234
249
|
"listings.detail.load_failed": "We could not load this listing",
|
|
235
250
|
"listings.detail.retry": "Try again",
|
package/dist/i18n/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY,EAAE,wBAAwB;IAEtC,4EAA4E;IAC5E,WAAW,EAAE,uBAAuB;IACpC,aAAa,EAAE,yBAAyB;IACxC,eAAe,EAAE,2BAA2B;IAC5C,YAAY,EAAE,wBAAwB;IACtC,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,sBAAsB;IAClC,cAAc,EAAE,0BAA0B;IAC1C,aAAa,EAAE,yBAAyB;IACxC,cAAc,EAAE,0BAA0B;IAE1C,4EAA4E;IAC5E,+CAA+C;IAC/C,qBAAqB,EAAE,kCAAkC;IACzD,qEAAqE;IACrE,yBAAyB,EAAE,uCAAuC;IAClE,yEAAyE;IACzE,wBAAwB,EAAE,qCAAqC;IAC/D,qBAAqB,EAAE,kCAAkC;IACzD,yBAAyB,EAAE,uCAAuC;IAClE,kBAAkB,EAAE,8BAA8B;IAClD,oEAAoE;IACpE,2BAA2B,EAAE,yCAAyC;IAEtE,4EAA4E;IAC5E,WAAW,EAAE,wBAAwB;IACrC,oBAAoB,EAAE,iCAAiC;IACvD,eAAe,EAAE,4BAA4B;IAC7C,eAAe,EAAE,4BAA4B;IAC7C,kBAAkB,EAAE,+BAA+B;IACnD;;;;;;;;;OASG;IACH,YAAY,EAAE,wBAAwB;IACtC,yEAAyE;IACzE,UAAU,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n/ru.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,oBAAoB,EAAE,cA4MlC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG7D"}
|
package/dist/i18n/ru.js
CHANGED
|
@@ -70,6 +70,10 @@ export const listingsI18nBundleRu = {
|
|
|
70
70
|
"listings.card.favorite_remove": "Убрать из избранного",
|
|
71
71
|
"listings.card.untitled": "Объявление без названия",
|
|
72
72
|
"listings.card.sign_in": "Войти",
|
|
73
|
+
"listings.card.photos": "Фотографии объявления",
|
|
74
|
+
"listings.card.price_was": "Было",
|
|
75
|
+
"listings.card.price_dropped": "Цена снизилась",
|
|
76
|
+
"listings.card.price_raised": "Цена выросла",
|
|
73
77
|
"listings.detail.loading": "Загружаем объявление…",
|
|
74
78
|
"listings.detail.load_failed": "Не удалось загрузить объявление",
|
|
75
79
|
"listings.detail.retry": "Повторить",
|
package/dist/i18n/ru.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,GAAG,qBAAqB;IAExB,4EAA4E;IAC5E,6BAA6B,EAAE,yBAAyB;IACxD,0BAA0B,EACxB,2DAA2D;IAC7D,uCAAuC,EACrC,0DAA0D;IAC5D,yCAAyC,EACvC,2CAA2C;IAC7C,qCAAqC,EACnC,iDAAiD;IACnD,yCAAyC,EACvC,wDAAwD;IAC1D,6BAA6B,EAAE,wBAAwB;IACvD,6BAA6B,EAAE,uBAAuB;IACtD,6BAA6B,EAAE,4BAA4B;IAC3D,sCAAsC,EACpC,2DAA2D;IAC7D,wCAAwC,EACtC,mEAAmE;IAErE,wBAAwB,EAAE,wCAAwC;IAElE,uBAAuB,EAAE,UAAU;IACnC,yBAAyB,EAAE,aAAa;IACxC,2BAA2B,EAAE,cAAc;IAC3C,wBAAwB,EAAE,gBAAgB;IAC1C,yBAAyB,EAAE,YAAY;IACvC,sBAAsB,EAAE,SAAS;IACjC,0BAA0B,EAAE,WAAW;IACvC,yBAAyB,EAAE,mBAAmB;IAC9C,0BAA0B,EAAE,UAAU;IAEtC,kCAAkC,EAChC,mFAAmF;IACrF,uCAAuC,EACrC,mGAAmG;IACrG,qCAAqC,EACnC,0DAA0D;IAC5D,kCAAkC,EAChC,uCAAuC;IACzC,uCAAuC,EACrC,iDAAiD;IACnD,8BAA8B,EAC5B,6DAA6D;IAC/D,yCAAyC,EACvC,yEAAyE;IAE3E,wBAAwB,EAAE,UAAU;IACpC,iCAAiC,EAAE,iBAAiB;IACpD,4BAA4B,EAAE,iBAAiB;IAC/C,4BAA4B,EAAE,aAAa;IAC3C,+BAA+B,EAAE,sBAAsB;IACvD,wBAAwB,EAAE,yBAAyB;IACnD,uBAAuB,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @stapel/listings-react 0.
|
|
1
|
+
# @stapel/listings-react 0.10.0
|
|
2
2
|
|
|
3
3
|
Headless React flow pair for stapel-listings (contract >=0.10 <0.11) — business + state, zero visual opinion.
|
|
4
4
|
Built on @stapel/core: typed client + StapelApiError envelope, auth token refresh,
|
|
@@ -110,8 +110,10 @@ const { tracked } = useTracked();
|
|
|
110
110
|
- listings.composer → <ListingComposerPage> [default|unwired|photos-in-flight|unsupported-type] demo/ListingComposer.demo.tsx
|
|
111
111
|
- listings.detail → <ListingDetailPane> [default|contact-unwired|owner|not-found] demo/ListingDetail.demo.tsx
|
|
112
112
|
- listings.favorites → <FavoritesPane> [default|paged|empty|failed|visitor] demo/Favorites.demo.tsx
|
|
113
|
+
- listings.feed-card → <ListingFeedCard> [default|tile|visitor|wide] demo/ListingFeedCard.demo.tsx
|
|
113
114
|
- listings.mine → <MyListingsPane> [default|no-editor|taken-down|visitor|failed] demo/MyListings.demo.tsx
|
|
114
115
|
- listings.parts → <ListingStatusBlock> [default|tags|notes|media|door] demo/ListingParts.demo.tsx
|
|
116
|
+
- listings.serp-card → <ListingSerpCard> [default|trend|visitor|bare] demo/ListingSerpCard.demo.tsx
|
|
115
117
|
Each source file is the canonical usage snippet (open the default variant).
|
|
116
118
|
|
|
117
119
|
## Snippets
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$generated": "by scripts/gen-manifest.mjs — do not edit; drift-gated (pnpm gen:manifest:check)",
|
|
3
3
|
"package": "@stapel/listings-react",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.10.0",
|
|
5
5
|
"backend": {
|
|
6
6
|
"module": "stapel-listings",
|
|
7
7
|
"contract": ">=0.10 <0.11"
|
|
@@ -732,6 +732,26 @@
|
|
|
732
732
|
],
|
|
733
733
|
"source": "demo/Favorites.demo.tsx"
|
|
734
734
|
},
|
|
735
|
+
{
|
|
736
|
+
"id": "listings.feed-card",
|
|
737
|
+
"title": "Listing feed card",
|
|
738
|
+
"description": "The phone home feed: no border and no card surface, so the photo is the card and the rhythm of the grid is what separates one listing from the next. Two lines of title then a clamp, the price in bold, the place muted, and the favourite heart pinned over the photo's trailing corner — the one surface in this pair where the heart floats, because a two-column tile has no line to spare for a refusal. A container draws the grid inside a PaneGate so that refusal is said once for the whole feed.",
|
|
739
|
+
"component": "ListingFeedCard",
|
|
740
|
+
"covers": [
|
|
741
|
+
"FeedGrid",
|
|
742
|
+
"ListingsProvider"
|
|
743
|
+
],
|
|
744
|
+
"tokens": [
|
|
745
|
+
"text-muted"
|
|
746
|
+
],
|
|
747
|
+
"variants": [
|
|
748
|
+
"default",
|
|
749
|
+
"tile",
|
|
750
|
+
"visitor",
|
|
751
|
+
"wide"
|
|
752
|
+
],
|
|
753
|
+
"source": "demo/ListingFeedCard.demo.tsx"
|
|
754
|
+
},
|
|
735
755
|
{
|
|
736
756
|
"id": "listings.mine",
|
|
737
757
|
"title": "My listings",
|
|
@@ -774,6 +794,26 @@
|
|
|
774
794
|
"door"
|
|
775
795
|
],
|
|
776
796
|
"source": "demo/ListingParts.demo.tsx"
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
"id": "listings.serp-card",
|
|
800
|
+
"title": "Listing SERP card",
|
|
801
|
+
"description": "The one-column result card of a phone search page: a SkinCarousel photo strip that peeks, then the PRICE as the first and largest line, the title at regular weight, the seller's spec line, the stored badge projection, the seller slot and the place. The strip sits outside the card's anchor on purpose — a horizontal swipe that ends inside a link is a swipe the browser may deliver as a navigation — and the trailing rail carries the container's call and chat controls with the favourite heart at its end.",
|
|
802
|
+
"component": "ListingSerpCard",
|
|
803
|
+
"covers": [
|
|
804
|
+
"ListingsProvider"
|
|
805
|
+
],
|
|
806
|
+
"tokens": [
|
|
807
|
+
"surface-raised",
|
|
808
|
+
"text-muted"
|
|
809
|
+
],
|
|
810
|
+
"variants": [
|
|
811
|
+
"default",
|
|
812
|
+
"trend",
|
|
813
|
+
"visitor",
|
|
814
|
+
"bare"
|
|
815
|
+
],
|
|
816
|
+
"source": "demo/ListingSerpCard.demo.tsx"
|
|
777
817
|
}
|
|
778
818
|
],
|
|
779
819
|
"i18nKeys": [
|
|
@@ -854,7 +894,11 @@
|
|
|
854
894
|
"listings.card.favorite_remove",
|
|
855
895
|
"listings.card.no_photo",
|
|
856
896
|
"listings.card.photo_unavailable",
|
|
897
|
+
"listings.card.photos",
|
|
857
898
|
"listings.card.price_absent",
|
|
899
|
+
"listings.card.price_dropped",
|
|
900
|
+
"listings.card.price_raised",
|
|
901
|
+
"listings.card.price_was",
|
|
858
902
|
"listings.card.sign_in",
|
|
859
903
|
"listings.card.untitled",
|
|
860
904
|
"listings.compose.auto_republish",
|
package/nav-manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stapel/listings-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility and `moderation_status` decides nothing about it, so an edit to a live listing stays live and says 'under review' instead of vanishing. Feature values are drawn and mirrored by @stapel/attributes-react; photos arrive as an injected upload bag whose `refs` ARE `images_draft` and whose `settled` gates the submit; a publish refusal is routed onto the control that caused it by slug. Zero visual opinion in the main entry; an opt-in /default subpath ships the antd skin.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"limit": "11.5 KB"
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
|
-
"name": "default — the antd skin (
|
|
56
|
+
"name": "default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one",
|
|
57
57
|
"path": "dist/default/index.js",
|
|
58
|
-
"limit": "
|
|
58
|
+
"limit": "19 KB"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"name": "i18n/ru — the Russian bundle is opt-in, not carried by the main entry",
|
|
@@ -63,17 +63,17 @@
|
|
|
63
63
|
"limit": "5 KB"
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"name": "i18n/es — the Spanish bundle is opt-in, not carried by the main entry",
|
|
66
|
+
"name": "i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one",
|
|
67
67
|
"path": "dist/i18n/es.js",
|
|
68
|
-
"limit": "
|
|
68
|
+
"limit": "4 KB"
|
|
69
69
|
}
|
|
70
70
|
],
|
|
71
71
|
"peerDependencies": {
|
|
72
|
-
"@stapel/attributes-react": ">=0.
|
|
72
|
+
"@stapel/attributes-react": ">=0.5.0",
|
|
73
73
|
"@stapel/core": ">=0.19.0 <1.0.0",
|
|
74
74
|
"@stapel/currencies-react": ">=0.2.0",
|
|
75
75
|
"@stapel/image": ">=0.2.0",
|
|
76
|
-
"@stapel/tokens-antd": ">=0.
|
|
76
|
+
"@stapel/tokens-antd": ">=0.9.0",
|
|
77
77
|
"@tanstack/react-query": "^5.0.0",
|
|
78
78
|
"antd": ">=5.20.0 <7",
|
|
79
79
|
"react": ">=19"
|
|
@@ -102,13 +102,13 @@
|
|
|
102
102
|
"size-limit": "^11.2.0",
|
|
103
103
|
"typescript": "^5.8.3",
|
|
104
104
|
"vitest": "^3.2.4",
|
|
105
|
-
"@stapel/attributes-react": "^0.
|
|
105
|
+
"@stapel/attributes-react": "^0.5.0",
|
|
106
106
|
"@stapel/core": "^0.20.0",
|
|
107
107
|
"@stapel/currencies-react": "^0.2.0",
|
|
108
108
|
"@stapel/image": "^0.4.2",
|
|
109
109
|
"@stapel/showcase": "^0.3.0",
|
|
110
110
|
"@stapel/tokens": "^0.6.0",
|
|
111
|
-
"@stapel/tokens-antd": "^0.
|
|
111
|
+
"@stapel/tokens-antd": "^0.9.0"
|
|
112
112
|
},
|
|
113
113
|
"engines": {
|
|
114
114
|
"node": ">=22"
|
|
@@ -510,8 +510,8 @@ export interface components {
|
|
|
510
510
|
favorited: boolean;
|
|
511
511
|
listing_id: number;
|
|
512
512
|
};
|
|
513
|
-
FeatureDao: components["schemas"]["IntDao"] | components["schemas"]["FloatDao"] | components["schemas"]["StringDao"] | components["schemas"]["BoolDao"] | components["schemas"]["HexColorDao"] | components["schemas"]["SelectDao"] | components["schemas"]["DateDao"] | components["schemas"]["HeaderDao"] | components["schemas"]["HierarchicalSelectDao"] | components["schemas"]["ConvertibleUnitDao"] | components["schemas"]["RefSelectDao"] | components["schemas"]["RefHierarchicalSelectDao"];
|
|
514
|
-
FeatureDto: components["schemas"]["IntDto"] | components["schemas"]["FloatDto"] | components["schemas"]["StringDto"] | components["schemas"]["BoolDto"] | components["schemas"]["HexColorDto"] | components["schemas"]["SelectDto"] | components["schemas"]["DateDto"] | components["schemas"]["HeaderDto"] | components["schemas"]["HierarchicalSelectDto"] | components["schemas"]["ConvertibleUnitDto"] | components["schemas"]["RefSelectDto"] | components["schemas"]["RefHierarchicalSelectDto"];
|
|
513
|
+
FeatureDao: components["schemas"]["IntDao"] | components["schemas"]["FloatDao"] | components["schemas"]["StringDao"] | components["schemas"]["BoolDao"] | components["schemas"]["HexColorDao"] | components["schemas"]["SelectDao"] | components["schemas"]["DateDao"] | components["schemas"]["HeaderDao"] | components["schemas"]["HierarchicalSelectDao"] | components["schemas"]["ConvertibleUnitDao"] | components["schemas"]["RefSelectDao"] | components["schemas"]["RefHierarchicalSelectDao"] | components["schemas"]["GroupDao"];
|
|
514
|
+
FeatureDto: components["schemas"]["IntDto"] | components["schemas"]["FloatDto"] | components["schemas"]["StringDto"] | components["schemas"]["BoolDto"] | components["schemas"]["HexColorDto"] | components["schemas"]["SelectDto"] | components["schemas"]["DateDto"] | components["schemas"]["HeaderDto"] | components["schemas"]["HierarchicalSelectDto"] | components["schemas"]["ConvertibleUnitDto"] | components["schemas"]["RefSelectDto"] | components["schemas"]["RefHierarchicalSelectDto"] | components["schemas"]["GroupDto"];
|
|
515
515
|
/** @description Serializer for FeatureValidationResult. */
|
|
516
516
|
FeatureValidationResult: {
|
|
517
517
|
id?: unknown;
|
|
@@ -561,6 +561,33 @@ export interface components {
|
|
|
561
561
|
/** Format: double */
|
|
562
562
|
value?: number;
|
|
563
563
|
};
|
|
564
|
+
/** @description Serializer for group feature DAO. */
|
|
565
|
+
GroupDao: {
|
|
566
|
+
name?: string | null;
|
|
567
|
+
order?: number | null;
|
|
568
|
+
title?: boolean | null;
|
|
569
|
+
badge?: boolean | null;
|
|
570
|
+
translate?: string | null;
|
|
571
|
+
/**
|
|
572
|
+
* @description discriminator enum property added by openapi-typescript
|
|
573
|
+
* @enum {string}
|
|
574
|
+
*/
|
|
575
|
+
type: "group";
|
|
576
|
+
value?: {
|
|
577
|
+
[key: string]: unknown;
|
|
578
|
+
}[];
|
|
579
|
+
};
|
|
580
|
+
/** @description Serializer for group feature DTO. */
|
|
581
|
+
GroupDto: {
|
|
582
|
+
/**
|
|
583
|
+
* @description discriminator enum property added by openapi-typescript
|
|
584
|
+
* @enum {string}
|
|
585
|
+
*/
|
|
586
|
+
type: "group";
|
|
587
|
+
value?: {
|
|
588
|
+
[key: string]: unknown;
|
|
589
|
+
}[];
|
|
590
|
+
};
|
|
564
591
|
/** @description Serializer for header feature DAO. */
|
|
565
592
|
HeaderDao: {
|
|
566
593
|
name?: string | null;
|
|
@@ -1047,6 +1074,11 @@ export interface components {
|
|
|
1047
1074
|
* @enum {string}
|
|
1048
1075
|
*/
|
|
1049
1076
|
Type104Enum: "convertible_unit";
|
|
1077
|
+
/**
|
|
1078
|
+
* @description * `group` - group
|
|
1079
|
+
* @enum {string}
|
|
1080
|
+
*/
|
|
1081
|
+
Type312Enum: "group";
|
|
1050
1082
|
/**
|
|
1051
1083
|
* @description * `date` - date
|
|
1052
1084
|
* @enum {string}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<FeedGrid>` — the two-column wall a phone home feed is laid out on.
|
|
3
|
+
*
|
|
4
|
+
* ── Why this is not `<SearchResultsPane>`'s grid ──────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* The results grid is `repeat(auto-fill, minmax(280px, 1fr))`: as many columns
|
|
7
|
+
* as FIT, each at least a readable card. That is right for a catalogue and
|
|
8
|
+
* wrong for a feed — 280px is wider than half of a 390px phone, so a feed laid
|
|
9
|
+
* out that way collapses to one column exactly where the ref calls for two.
|
|
10
|
+
* A feed's column count is a DESIGN decision ("two, side by side, small"), not
|
|
11
|
+
* a consequence of a minimum card width, and the two rules cannot be spelled
|
|
12
|
+
* with one declaration.
|
|
13
|
+
*
|
|
14
|
+
* ── No masonry ────────────────────────────────────────────────────────────
|
|
15
|
+
*
|
|
16
|
+
* The refs' feed looks staggered because the photos have different heights.
|
|
17
|
+
* They do not here: `<ListingFeedCard>` draws every photo in the same 4:3 well
|
|
18
|
+
* (`LISTING_PHOTO_ASPECT`), so the tiles line up in rows on their own and the
|
|
19
|
+
* grid stays a grid. Nothing in this package will pull in a masonry polyfill
|
|
20
|
+
* to reproduce a raggedness that is a property of unconstrained images —
|
|
21
|
+
* `columns: 2` (the CSS multi-column route) was the other candidate and was
|
|
22
|
+
* rejected because it breaks reading order: a screen reader and a keyboard
|
|
23
|
+
* would walk the whole left column before reaching the top of the right one.
|
|
24
|
+
*
|
|
25
|
+
* ── Desktop is not this wave's consumer, and is not broken either ─────────
|
|
26
|
+
*
|
|
27
|
+
* `columns` defaults to 2 because a phone feed is the surface this exists for.
|
|
28
|
+
* A wider surface passes its own number; the declaration is the same one, so
|
|
29
|
+
* there is no second layout to keep in step and no breakpoint in this file.
|
|
30
|
+
*/
|
|
31
|
+
import type { CSSProperties, ReactElement, ReactNode } from "react";
|
|
32
|
+
import { spacing } from "@stapel/tokens";
|
|
33
|
+
|
|
34
|
+
/** The ref's phone feed: two tiles across. */
|
|
35
|
+
export const FEED_GRID_COLUMNS = 2;
|
|
36
|
+
|
|
37
|
+
export interface FeedGridProps {
|
|
38
|
+
/** How many tiles across. Default {@link FEED_GRID_COLUMNS}. */
|
|
39
|
+
readonly columns?: number;
|
|
40
|
+
/** The tiles — `<ListingFeedCard>`s, conventionally. */
|
|
41
|
+
readonly children: ReactNode;
|
|
42
|
+
readonly style?: CSSProperties;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function FeedGrid(props: FeedGridProps): ReactElement {
|
|
46
|
+
const columns = props.columns ?? FEED_GRID_COLUMNS;
|
|
47
|
+
return (
|
|
48
|
+
<div
|
|
49
|
+
data-testid="listings-feed-grid"
|
|
50
|
+
data-columns={String(columns)}
|
|
51
|
+
style={{
|
|
52
|
+
display: "grid",
|
|
53
|
+
// `minmax(0, 1fr)` rather than `1fr`: a bare `1fr` is `minmax(auto,
|
|
54
|
+
// 1fr)`, and `auto` refuses to shrink below its content — one long
|
|
55
|
+
// unbroken word in a title then widens the whole column and pushes the
|
|
56
|
+
// grid past the screen.
|
|
57
|
+
gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))`,
|
|
58
|
+
columnGap: spacing[3],
|
|
59
|
+
// Rows breathe more than columns do: the tiles carry no border, so the
|
|
60
|
+
// gap between two rows is the only thing saying where one card's
|
|
61
|
+
// location line ends and the next card's photo begins.
|
|
62
|
+
rowGap: spacing[5],
|
|
63
|
+
alignItems: "start",
|
|
64
|
+
...props.style,
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
{props.children}
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -221,15 +221,29 @@ export type ListingCardProps = ListingCardBaseProps & ListingCardOpenProps;
|
|
|
221
221
|
* same content in a `<button>` reset to look like nothing, rather than drawing
|
|
222
222
|
* a separate captioned control: a card that is a target on one deployment and
|
|
223
223
|
* a card-plus-a-button on another would be two different products.
|
|
224
|
+
*
|
|
225
|
+
* Exported for this pair's OTHER card surfaces (`<ListingSerpCard>`,
|
|
226
|
+
* `<ListingFeedCard>`) and for no one else — it is deliberately absent from
|
|
227
|
+
* `src/default/index.ts`. Three cards each re-deriving "which of the three
|
|
228
|
+
* arms is this" is three places for the double-navigation defect to come back;
|
|
229
|
+
* one function is one place. The card surfaces differ in what they PUT inside
|
|
230
|
+
* the target, never in how the target is made.
|
|
224
231
|
*/
|
|
225
|
-
function CardTarget(
|
|
232
|
+
export function CardTarget(
|
|
226
233
|
props: ListingCardOpenProps & {
|
|
227
234
|
readonly listingId: number;
|
|
228
235
|
readonly label: string;
|
|
236
|
+
/** The target's own test id. Each card surface names its own, so a screen
|
|
237
|
+
* holding two kinds of card does not hand a test two elements under one
|
|
238
|
+
* name. Default: the original card's. */
|
|
239
|
+
readonly testId?: string;
|
|
240
|
+
/** The body's test id on the arm where nothing opens. */
|
|
241
|
+
readonly bodyTestId?: string;
|
|
229
242
|
readonly children: ReactNode;
|
|
230
243
|
}
|
|
231
244
|
): ReactElement {
|
|
232
245
|
const { label, children } = props;
|
|
246
|
+
const testId = props.testId ?? "listings-card-open";
|
|
233
247
|
|
|
234
248
|
if (props.href !== undefined) {
|
|
235
249
|
const Link = props.linkComponent;
|
|
@@ -241,7 +255,7 @@ function CardTarget(
|
|
|
241
255
|
href={props.href}
|
|
242
256
|
aria-label={label}
|
|
243
257
|
className={CARD_TARGET_CLASS}
|
|
244
|
-
data-testid=
|
|
258
|
+
data-testid={testId}
|
|
245
259
|
data-analytics="none"
|
|
246
260
|
data-analytics-reason="business action — host app wraps with its own tracked()"
|
|
247
261
|
>
|
|
@@ -253,7 +267,7 @@ function CardTarget(
|
|
|
253
267
|
aria-label={label}
|
|
254
268
|
className={CARD_TARGET_CLASS}
|
|
255
269
|
style={TARGET_STYLE}
|
|
256
|
-
data-testid=
|
|
270
|
+
data-testid={testId}
|
|
257
271
|
data-analytics="none"
|
|
258
272
|
data-analytics-reason="business action — host app wraps with its own tracked()"
|
|
259
273
|
>
|
|
@@ -270,7 +284,7 @@ function CardTarget(
|
|
|
270
284
|
aria-label={label}
|
|
271
285
|
className={CARD_TARGET_CLASS}
|
|
272
286
|
style={BUTTON_TARGET_STYLE}
|
|
273
|
-
data-testid=
|
|
287
|
+
data-testid={testId}
|
|
274
288
|
data-analytics="none"
|
|
275
289
|
data-analytics-reason="business action — host app wraps with its own tracked()"
|
|
276
290
|
onClick={() => {
|
|
@@ -283,7 +297,9 @@ function CardTarget(
|
|
|
283
297
|
}
|
|
284
298
|
|
|
285
299
|
// No open control at all — a card inside a screen that IS the listing.
|
|
286
|
-
return
|
|
300
|
+
return (
|
|
301
|
+
<div data-testid={props.bodyTestId ?? "listings-card-body"}>{children}</div>
|
|
302
|
+
);
|
|
287
303
|
}
|
|
288
304
|
|
|
289
305
|
export function ListingCard(props: ListingCardProps): ReactElement {
|