@mohasinac/appkit 4.57.0 → 4.59.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/dist/.build-stamp.json +4 -4
- package/dist/_internal/server/features/beys/data.d.ts +44 -0
- package/dist/_internal/server/features/beys/data.js +107 -0
- package/dist/_internal/server/features/beys/og.d.ts +42 -0
- package/dist/_internal/server/features/beys/og.js +89 -0
- package/dist/_internal/server/features/parts/data.js +3 -2
- package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/messages.js +1 -1
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +86 -0
- package/dist/_internal/shared/types/base-document.d.ts +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.js +1 -0
- package/dist/constants/api-endpoints.d.ts +12 -0
- package/dist/constants/api-endpoints.js +10 -0
- package/dist/constants/field-names.d.ts +46 -0
- package/dist/constants/field-names.js +46 -0
- package/dist/constants/seed-meta.d.ts +113 -0
- package/dist/constants/seed-meta.js +91 -0
- package/dist/features/admin/components/AdminBeysView.d.ts +27 -0
- package/dist/features/admin/components/AdminBeysView.js +178 -0
- package/dist/features/admin/components/AdminPartsView.d.ts +27 -0
- package/dist/features/admin/components/AdminPartsView.js +160 -0
- package/dist/features/admin/components/OwnerQuickActions.d.ts +19 -2
- package/dist/features/admin/components/OwnerQuickActions.js +31 -3
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +31 -0
- package/dist/features/admin/components/RecordOwnerQuickActions.js +128 -0
- package/dist/features/admin/components/ReferenceRecordEditor.d.ts +45 -0
- package/dist/features/admin/components/ReferenceRecordEditor.js +153 -0
- package/dist/features/admin/schemas/firestore.d.ts +1 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +15 -2
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +12 -1
- package/dist/features/beys/components/BeyDetailPageView.d.ts +50 -0
- package/dist/features/beys/components/BeyDetailPageView.js +98 -0
- package/dist/features/beys/schemas/firestore.d.ts +417 -0
- package/dist/features/beys/schemas/firestore.js +65 -0
- package/dist/features/blog/components/BlogFeaturedCard.js +15 -2
- package/dist/features/blog/components/BlogPostView.js +2 -2
- package/dist/features/categories/components/BrandDetailPageView.js +4 -2
- package/dist/features/categories/components/BundleDetailView.js +2 -2
- package/dist/features/categories/components/CategoryDetailPageView.js +36 -3
- package/dist/features/categories/components/CategoryGrid.js +24 -2
- package/dist/features/categories/components/FranchiseDetailPageView.js +2 -3
- package/dist/features/events/components/EventCard.js +15 -2
- package/dist/features/grouped/components/GroupedListingDetailView.js +2 -3
- package/dist/features/homepage/components/CustomCardsSection.js +67 -50
- package/dist/features/homepage/components/ShopByCategorySection.js +23 -10
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/parts/components/PartDetailPageView.js +5 -3
- package/dist/features/parts/components/PartsSearchBox.js +79 -4
- package/dist/features/parts/schemas/admin-edit.d.ts +81 -0
- package/dist/features/parts/schemas/admin-edit.js +89 -0
- package/dist/features/parts/schemas/firestore.d.ts +2 -1
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +15 -2
- package/dist/features/products/components/MarketplaceBundleCard.js +15 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +15 -2
- package/dist/features/products/components/ProductGrid.js +18 -2
- package/dist/features/products/schemas/firestore.d.ts +18 -0
- package/dist/features/seller/components/CategoryInlineSelect.d.ts +10 -1
- package/dist/features/seller/components/CategoryInlineSelect.js +53 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +39 -0
- package/dist/features/seller/components/SellerProductShell.js +31 -3
- package/dist/index.d.ts +6 -129
- package/dist/index.js +61 -292
- package/dist/next/routing/route-map.d.ts +13 -1
- package/dist/next/routing/route-map.js +37 -0
- package/dist/schemas/registry.d.ts +6 -6
- package/dist/server.d.ts +2 -69
- package/dist/server.js +8 -69
- package/dist/styles.css +468 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/PosterCard.d.ts +99 -0
- package/dist/ui/components/PosterCard.js +109 -0
- package/dist/ui/components/PosterCard.style.css +466 -0
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +2 -0
- package/package.json +4 -2
- package/scripts/seed-cli.mjs +177 -2
- package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
- package/dist/features/tester/seed-data/_happy-path.js +0 -710
- package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
- package/dist/features/tester/seed-data/_money-flows.js +0 -610
- package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
- package/dist/features/tester/seed-data/authored/_types.js +0 -35
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
- package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
- package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/index.js +0 -301
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
- package/dist/features/tester/seed-data/index.d.ts +0 -2
- package/dist/features/tester/seed-data/index.js +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
- package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
- package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
- package/dist/features/tester/seed-data/tester-window.js +0 -66
- package/dist/seed/_helpers/brand-rows.d.ts +0 -35
- package/dist/seed/_helpers/brand-rows.js +0 -600
- package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
- package/dist/seed/_helpers/category-content-generated.js +0 -1853
- package/dist/seed/_helpers/category-content.d.ts +0 -68
- package/dist/seed/_helpers/category-content.js +0 -731
- package/dist/seed/_helpers/category-forest.d.ts +0 -4
- package/dist/seed/_helpers/category-forest.js +0 -824
- package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
- package/dist/seed/_helpers/category-images-generated.js +0 -618
- package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
- package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
- package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
- package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
- package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
- package/dist/seed/_helpers/category-models.d.ts +0 -12
- package/dist/seed/_helpers/category-models.js +0 -45
- package/dist/seed/_helpers/category-names.d.ts +0 -54
- package/dist/seed/_helpers/category-names.js +0 -118
- package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
- package/dist/seed/_helpers/category-parts.d.ts +0 -9
- package/dist/seed/_helpers/category-parts.js +0 -15022
- package/dist/seed/_helpers/category-tree.d.ts +0 -27
- package/dist/seed/_helpers/category-tree.js +0 -119
- package/dist/seed/_helpers/character-features.d.ts +0 -10
- package/dist/seed/_helpers/character-features.js +0 -120
- package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
- package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
- package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
- package/dist/seed/_helpers/franchise-rows.js +0 -189
- package/dist/seed/_helpers/media.d.ts +0 -67
- package/dist/seed/_helpers/media.js +0 -172
- package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
- package/dist/seed/_helpers/part-colours-generated.js +0 -273
- package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
- package/dist/seed/_helpers/product-search-txt.js +0 -23
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
- package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
- package/dist/seed/addresses-seed-data.d.ts +0 -2
- package/dist/seed/addresses-seed-data.js +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
- package/dist/seed/bids-seed-data.d.ts +0 -2
- package/dist/seed/bids-seed-data.js +0 -206
- package/dist/seed/blog-posts-seed-data.d.ts +0 -6
- package/dist/seed/blog-posts-seed-data.js +0 -442
- package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
- package/dist/seed/carousel-slides-seed-data.js +0 -411
- package/dist/seed/carousels-seed-data.d.ts +0 -2
- package/dist/seed/carousels-seed-data.js +0 -36
- package/dist/seed/cart-seed-data.d.ts +0 -2
- package/dist/seed/cart-seed-data.js +0 -241
- package/dist/seed/catalogue-seed-data.d.ts +0 -2
- package/dist/seed/catalogue-seed-data.js +0 -112
- package/dist/seed/categories-seed-data.d.ts +0 -3
- package/dist/seed/categories-seed-data.js +0 -816
- package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
- package/dist/seed/claimed-coupons-seed-data.js +0 -85
- package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
- package/dist/seed/coupon-usage-seed-data.js +0 -55
- package/dist/seed/coupons-seed-data.d.ts +0 -2
- package/dist/seed/coupons-seed-data.js +0 -226
- package/dist/seed/defaults/categories.d.ts +0 -2
- package/dist/seed/defaults/categories.js +0 -12
- package/dist/seed/defaults/faqs.d.ts +0 -2
- package/dist/seed/defaults/faqs.js +0 -40
- package/dist/seed/events-seed-data.d.ts +0 -7
- package/dist/seed/events-seed-data.js +0 -482
- package/dist/seed/factories/address.factory.d.ts +0 -21
- package/dist/seed/factories/address.factory.js +0 -44
- package/dist/seed/factories/bid.factory.d.ts +0 -15
- package/dist/seed/factories/bid.factory.js +0 -33
- package/dist/seed/factories/blog-post.factory.d.ts +0 -15
- package/dist/seed/factories/blog-post.factory.js +0 -22
- package/dist/seed/factories/carousel.factory.d.ts +0 -11
- package/dist/seed/factories/carousel.factory.js +0 -17
- package/dist/seed/factories/cart.factory.d.ts +0 -25
- package/dist/seed/factories/cart.factory.js +0 -35
- package/dist/seed/factories/category.factory.d.ts +0 -11
- package/dist/seed/factories/category.factory.js +0 -16
- package/dist/seed/factories/coupon.factory.d.ts +0 -21
- package/dist/seed/factories/coupon.factory.js +0 -43
- package/dist/seed/factories/faq.factory.d.ts +0 -10
- package/dist/seed/factories/faq.factory.js +0 -15
- package/dist/seed/factories/notification.factory.d.ts +0 -18
- package/dist/seed/factories/notification.factory.js +0 -39
- package/dist/seed/factories/order.factory.d.ts +0 -20
- package/dist/seed/factories/order.factory.js +0 -20
- package/dist/seed/factories/payout.factory.d.ts +0 -21
- package/dist/seed/factories/payout.factory.js +0 -38
- package/dist/seed/factories/product.factory.d.ts +0 -27
- package/dist/seed/factories/product.factory.js +0 -80
- package/dist/seed/factories/review.factory.d.ts +0 -14
- package/dist/seed/factories/review.factory.js +0 -52
- package/dist/seed/factories/session.factory.d.ts +0 -15
- package/dist/seed/factories/session.factory.js +0 -31
- package/dist/seed/factories/store.factory.d.ts +0 -23
- package/dist/seed/factories/store.factory.js +0 -47
- package/dist/seed/factories/user.factory.d.ts +0 -19
- package/dist/seed/factories/user.factory.js +0 -56
- package/dist/seed/faq-seed-data.d.ts +0 -18
- package/dist/seed/faq-seed-data.js +0 -1956
- package/dist/seed/firestore-indexes.d.ts +0 -12
- package/dist/seed/firestore-indexes.js +0 -31
- package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
- package/dist/seed/grouped-listings-seed-data.js +0 -283
- package/dist/seed/history-seed-data.d.ts +0 -12
- package/dist/seed/history-seed-data.js +0 -70
- package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
- package/dist/seed/homepage-sections-seed-data.js +0 -1018
- package/dist/seed/index.d.ts +0 -98
- package/dist/seed/index.js +0 -112
- package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
- package/dist/seed/lottery-entries-seed-data.js +0 -108
- package/dist/seed/manifest.d.ts +0 -16
- package/dist/seed/manifest.js +0 -235
- package/dist/seed/media-assets-seed-data.d.ts +0 -22
- package/dist/seed/media-assets-seed-data.js +0 -5593
- package/dist/seed/model-composition-seed-data.d.ts +0 -15
- package/dist/seed/model-composition-seed-data.js +0 -9032
- package/dist/seed/notifications-seed-data.d.ts +0 -2
- package/dist/seed/notifications-seed-data.js +0 -606
- package/dist/seed/offers-seed-data.d.ts +0 -2
- package/dist/seed/offers-seed-data.js +0 -398
- package/dist/seed/orders-seed-data.d.ts +0 -2
- package/dist/seed/orders-seed-data.js +0 -845
- package/dist/seed/part-glossary/chunk0.d.ts +0 -9
- package/dist/seed/part-glossary/chunk0.js +0 -35448
- package/dist/seed/part-glossary/chunk1.d.ts +0 -9
- package/dist/seed/part-glossary/chunk1.js +0 -40494
- package/dist/seed/part-glossary/chunk2.d.ts +0 -9
- package/dist/seed/part-glossary/chunk2.js +0 -51242
- package/dist/seed/part-glossary/chunk3.d.ts +0 -9
- package/dist/seed/part-glossary/chunk3.js +0 -53337
- package/dist/seed/part-glossary/chunk4.d.ts +0 -9
- package/dist/seed/part-glossary/chunk4.js +0 -51454
- package/dist/seed/part-glossary-seed-data.d.ts +0 -15
- package/dist/seed/part-glossary-seed-data.js +0 -25
- package/dist/seed/payouts-seed-data.d.ts +0 -2
- package/dist/seed/payouts-seed-data.js +0 -302
- package/dist/seed/product-features-seed-data.d.ts +0 -3
- package/dist/seed/product-features-seed-data.js +0 -366
- package/dist/seed/products-art-seed-data.d.ts +0 -2
- package/dist/seed/products-art-seed-data.js +0 -289
- package/dist/seed/products-auctions-seed-data.d.ts +0 -2
- package/dist/seed/products-auctions-seed-data.js +0 -475
- package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
- package/dist/seed/products-beyblade-x-seed-data.js +0 -476
- package/dist/seed/products-catalogue-seed-data.d.ts +0 -22
- package/dist/seed/products-catalogue-seed-data.js +0 -86384
- package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
- package/dist/seed/products-classifieds-seed-data.js +0 -435
- package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
- package/dist/seed/products-digital-codes-seed-data.js +0 -395
- package/dist/seed/products-live-items-seed-data.d.ts +0 -7
- package/dist/seed/products-live-items-seed-data.js +0 -269
- package/dist/seed/products-preorders-seed-data.d.ts +0 -2
- package/dist/seed/products-preorders-seed-data.js +0 -360
- package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
- package/dist/seed/products-prize-draws-seed-data.js +0 -427
- package/dist/seed/products-spares-seed-data.d.ts +0 -2
- package/dist/seed/products-spares-seed-data.js +0 -368
- package/dist/seed/products-standard-seed-data.d.ts +0 -2
- package/dist/seed/products-standard-seed-data.js +0 -632
- package/dist/seed/products-stickers-seed-data.d.ts +0 -2
- package/dist/seed/products-stickers-seed-data.js +0 -319
- package/dist/seed/reviews-seed-data.d.ts +0 -1
- package/dist/seed/reviews-seed-data.js +0 -185
- package/dist/seed/runner.d.ts +0 -2
- package/dist/seed/runner.js +0 -125
- package/dist/seed/scammers-seed-data.d.ts +0 -2
- package/dist/seed/scammers-seed-data.js +0 -235
- package/dist/seed/seed-market-config.d.ts +0 -48
- package/dist/seed/seed-market-config.js +0 -199
- package/dist/seed/seed-purpose.d.ts +0 -299
- package/dist/seed/seed-purpose.js +0 -431
- package/dist/seed/sessions-seed-data.d.ts +0 -3
- package/dist/seed/sessions-seed-data.js +0 -116
- package/dist/seed/shipments-seed-data.d.ts +0 -5
- package/dist/seed/shipments-seed-data.js +0 -185
- package/dist/seed/site-settings-seed-data.d.ts +0 -2
- package/dist/seed/site-settings-seed-data.js +0 -1069
- package/dist/seed/store-addresses-seed-data.d.ts +0 -18
- package/dist/seed/store-addresses-seed-data.js +0 -71
- package/dist/seed/store-extensions-seed-data.d.ts +0 -11
- package/dist/seed/store-extensions-seed-data.js +0 -292
- package/dist/seed/stores-seed-data.d.ts +0 -6
- package/dist/seed/stores-seed-data.js +0 -242
- package/dist/seed/support-tickets-seed-data.d.ts +0 -16
- package/dist/seed/support-tickets-seed-data.js +0 -239
- package/dist/seed/tax-codes-seed-data.d.ts +0 -34
- package/dist/seed/tax-codes-seed-data.js +0 -100
- package/dist/seed/test-data-ttl.d.ts +0 -29
- package/dist/seed/test-data-ttl.js +0 -31
- package/dist/seed/test-utils.d.ts +0 -49
- package/dist/seed/test-utils.js +0 -110
- package/dist/seed/types.d.ts +0 -89
- package/dist/seed/types.js +0 -15
- package/dist/seed/users-seed-data.d.ts +0 -2
- package/dist/seed/users-seed-data.js +0 -597
- package/dist/seed/wishlists-seed-data.d.ts +0 -12
- package/dist/seed/wishlists-seed-data.js +0 -54
|
@@ -215,15 +215,15 @@ export declare const carouselCardSchema: z.ZodObject<{
|
|
|
215
215
|
description?: string | undefined;
|
|
216
216
|
textColor?: string | undefined;
|
|
217
217
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
218
|
-
subtitle?: string | undefined;
|
|
219
218
|
eyebrow?: string | undefined;
|
|
219
|
+
subtitle?: string | undefined;
|
|
220
220
|
}, {
|
|
221
221
|
title?: string | undefined;
|
|
222
222
|
description?: string | undefined;
|
|
223
223
|
textColor?: string | undefined;
|
|
224
224
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
225
|
-
subtitle?: string | undefined;
|
|
226
225
|
eyebrow?: string | undefined;
|
|
226
|
+
subtitle?: string | undefined;
|
|
227
227
|
}>>;
|
|
228
228
|
buttons: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
229
229
|
id: z.ZodOptional<z.ZodString>;
|
|
@@ -282,8 +282,8 @@ export declare const carouselCardSchema: z.ZodObject<{
|
|
|
282
282
|
description?: string | undefined;
|
|
283
283
|
textColor?: string | undefined;
|
|
284
284
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
285
|
-
subtitle?: string | undefined;
|
|
286
285
|
eyebrow?: string | undefined;
|
|
286
|
+
subtitle?: string | undefined;
|
|
287
287
|
} | undefined;
|
|
288
288
|
hover?: {
|
|
289
289
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -323,8 +323,8 @@ export declare const carouselCardSchema: z.ZodObject<{
|
|
|
323
323
|
description?: string | undefined;
|
|
324
324
|
textColor?: string | undefined;
|
|
325
325
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
326
|
-
subtitle?: string | undefined;
|
|
327
326
|
eyebrow?: string | undefined;
|
|
327
|
+
subtitle?: string | undefined;
|
|
328
328
|
} | undefined;
|
|
329
329
|
hover?: {
|
|
330
330
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -555,15 +555,15 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
|
|
|
555
555
|
description?: string | undefined;
|
|
556
556
|
textColor?: string | undefined;
|
|
557
557
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
558
|
-
subtitle?: string | undefined;
|
|
559
558
|
eyebrow?: string | undefined;
|
|
559
|
+
subtitle?: string | undefined;
|
|
560
560
|
}, {
|
|
561
561
|
title?: string | undefined;
|
|
562
562
|
description?: string | undefined;
|
|
563
563
|
textColor?: string | undefined;
|
|
564
564
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
565
|
-
subtitle?: string | undefined;
|
|
566
565
|
eyebrow?: string | undefined;
|
|
566
|
+
subtitle?: string | undefined;
|
|
567
567
|
}>>;
|
|
568
568
|
buttons: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
569
569
|
id: z.ZodOptional<z.ZodString>;
|
|
@@ -622,8 +622,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
|
|
|
622
622
|
description?: string | undefined;
|
|
623
623
|
textColor?: string | undefined;
|
|
624
624
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
625
|
-
subtitle?: string | undefined;
|
|
626
625
|
eyebrow?: string | undefined;
|
|
626
|
+
subtitle?: string | undefined;
|
|
627
627
|
} | undefined;
|
|
628
628
|
hover?: {
|
|
629
629
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -663,8 +663,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
|
|
|
663
663
|
description?: string | undefined;
|
|
664
664
|
textColor?: string | undefined;
|
|
665
665
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
666
|
-
subtitle?: string | undefined;
|
|
667
666
|
eyebrow?: string | undefined;
|
|
667
|
+
subtitle?: string | undefined;
|
|
668
668
|
} | undefined;
|
|
669
669
|
hover?: {
|
|
670
670
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -802,8 +802,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
|
|
|
802
802
|
description?: string | undefined;
|
|
803
803
|
textColor?: string | undefined;
|
|
804
804
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
805
|
-
subtitle?: string | undefined;
|
|
806
805
|
eyebrow?: string | undefined;
|
|
806
|
+
subtitle?: string | undefined;
|
|
807
807
|
} | undefined;
|
|
808
808
|
hover?: {
|
|
809
809
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -911,8 +911,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
|
|
|
911
911
|
description?: string | undefined;
|
|
912
912
|
textColor?: string | undefined;
|
|
913
913
|
textAlign?: "center" | "left" | "right" | undefined;
|
|
914
|
-
subtitle?: string | undefined;
|
|
915
914
|
eyebrow?: string | undefined;
|
|
915
|
+
subtitle?: string | undefined;
|
|
916
916
|
} | undefined;
|
|
917
917
|
hover?: {
|
|
918
918
|
effect: "none" | "color" | "scale" | "glow";
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Section, Container, Stack, Row, Div, Heading, Text, Span, TextLink, Badge, } from "../../../ui/index.js";
|
|
2
|
+
import { Section, Container, Stack, Row, Div, Heading, Text, Span, TextLink, Badge, Anchor, } from "../../../ui/index.js";
|
|
3
3
|
import { SpecTable } from "../../../ui/components/SpecTable.js";
|
|
4
|
+
import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
|
|
5
|
+
import { ROUTES } from "../../../next/routing/route-map.js";
|
|
4
6
|
import { PART_SLOT_LABEL, } from "../schemas/firestore.js";
|
|
5
7
|
/**
|
|
6
8
|
* The buyer-facing label for each WBO tournament format, in the order a
|
|
@@ -100,12 +102,12 @@ export function PartDetailPageView({ part, usedBy, listings, listingsTruncated,
|
|
|
100
102
|
: [];
|
|
101
103
|
/* Only the formats this part is actually ruled on — see the note below. */
|
|
102
104
|
const legalFormats = Object.entries(part.wboLegality ?? {}).filter(([, v]) => typeof v === "boolean");
|
|
103
|
-
return (_jsx(Section, { padding: "y-lg", children: _jsx(Container, { size: "lg", children: _jsxs(Stack, { gap: "lg", className: "min-w-0", children: [_jsxs(Stack, { gap: "xs", className: "min-w-0", children: [_jsx(Text, { size: "sm", color: "muted", children: _jsx(TextLink, { href: hrefForClassification(part.slot), children: classification }) }), _jsx(Heading, { level: 1, children: part.name }), _jsxs(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: [part.code && _jsx(Badge, { variant: "info", children: part.code }), typeof part.weightG === "number" && (_jsxs(Badge, { variant: "default", children: [part.weightG, " g"] }))] }), aliases.length > 0 && (_jsxs(Text, { size: "sm", color: "muted", children: ["Also written: ", aliases.join(" · ")] }))] }), specRows.length > 1 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Specifications" }), _jsx(SpecTable, { rows: specRows })] })), ratingRows.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Ratings" }), _jsx(SpecTable, { rows: ratingRows.map((r) => ({
|
|
105
|
+
return (_jsx(Section, { padding: "y-lg", children: _jsx(Container, { size: "lg", children: _jsxs(Stack, { gap: "lg", className: "min-w-0", children: [_jsxs(Stack, { gap: "xs", className: "min-w-0", children: [_jsx(Text, { size: "sm", color: "muted", children: _jsx(TextLink, { href: hrefForClassification(part.slot), children: classification }) }), _jsx(Heading, { level: 1, children: part.name }), _jsx(RecordOwnerQuickActions, { resource: "PART", recordId: part.id, placement: "detail", recordLabel: part.name }), _jsxs(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: [part.code && _jsx(Badge, { variant: "info", children: part.code }), typeof part.weightG === "number" && (_jsxs(Badge, { variant: "default", children: [part.weightG, " g"] }))] }), aliases.length > 0 && (_jsxs(Text, { size: "sm", color: "muted", children: ["Also written: ", aliases.join(" · ")] }))] }), specRows.length > 1 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Specifications" }), _jsx(SpecTable, { rows: specRows })] })), ratingRows.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Ratings" }), _jsx(SpecTable, { rows: ratingRows.map((r) => ({
|
|
104
106
|
name: r.label,
|
|
105
107
|
value: `${r.value} / 100`,
|
|
106
108
|
})) }), _jsxs(Text, { size: "xs", color: "faint", children: ["Rescaled to 0\u2013100 for comparison across generations", typeof part.ratingScale === "number"
|
|
107
109
|
? `; rated 0–${part.ratingScale} at source`
|
|
108
|
-
: "", "."] })] })), legalFormats.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Tournament legality" }), _jsx(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: legalFormats.map(([format, allowed]) => (_jsxs(Badge, { variant: allowed ? "success" : "danger", children: [WBO_FORMAT_LABEL[format] ?? format, allowed ? " ✓" : " ✗"] }, format))) }), _jsx(Text, { size: "xs", color: "faint", children: "World Beyblade Organization formats this part is ruled on. A format not listed has no ruling for it." })] })), _jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: usedBy.length > 0
|
|
110
|
+
: "", "."] })] })), legalFormats.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Tournament legality" }), _jsx(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: legalFormats.map(([format, allowed]) => (_jsxs(Badge, { variant: allowed ? "success" : "danger", children: [WBO_FORMAT_LABEL[format] ?? format, allowed ? " ✓" : " ✗"] }, format))) }), _jsx(Text, { size: "xs", color: "faint", children: "World Beyblade Organization formats this part is ruled on. A format not listed has no ruling for it." })] })), part.sourceUrl && (_jsx(Div, { children: _jsxs(Text, { size: "xs", color: "faint", children: ["Facts on this page are drawn from a community wiki under CC\u00A0BY-SA.", " ", _jsx(Anchor, { href: part.sourceUrl, tone: "muted", underline: "always", children: "Source" }), " · ", _jsx(TextLink, { href: String(ROUTES.PUBLIC.CREDITS), children: "Credits" })] }) })), _jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: usedBy.length > 0
|
|
109
111
|
? `Used by ${usedBy.length} ${usedBy.length === 1 ? "model" : "models"}`
|
|
110
112
|
: "Used by" }), usedBy.length === 0 ? (_jsx(Text, { color: "muted", size: "sm", children: "No model in our database records this part yet." })) : (_jsx(Stack, { gap: "xs", className: "min-w-0", children: usedBy.map((m) => (_jsxs(Row, { gap: "sm", align: "center", padding: "inline", surface: "card", rounded: "md", border: "subtle", className: "min-w-0", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [m.categoryId ? (_jsx(TextLink, { href: hrefForModel(m.categoryId), children: m.name })) : (
|
|
111
113
|
/* 49 of 259 compositions did not join to a category.
|
|
@@ -35,13 +35,88 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
35
35
|
import React from "react";
|
|
36
36
|
import { Div, Input, Stack, Text, TextLink } from "../../../ui/index.js";
|
|
37
37
|
import { useSiteSearch } from "../../search/hooks/useSiteSearch.js";
|
|
38
|
+
import { useUrlTable } from "../../../react/hooks/useUrlTable.js";
|
|
39
|
+
import { TABLE_KEYS } from "../../../constants/table-keys.js";
|
|
38
40
|
/** Only this slice of the index. See `resolveEntity`'s `types` parameter. */
|
|
39
41
|
const PART_TYPES = ["part"];
|
|
40
42
|
/** Stable identity — a `useMemo` dependency inside the hook. */
|
|
41
43
|
const partLabel = () => "Parts";
|
|
42
44
|
export function PartsSearchBox({ indexEnabled, placeholder = "Search parts by name or code — RF, 105, Rubber Flat…", limit = 10, }) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
/*
|
|
46
|
+
* ── 🛑 THE QUERY LIVES IN THE URL, SO A SEARCH IS SHAREABLE ──────────────
|
|
47
|
+
*
|
|
48
|
+
* This was `React.useState("")`, which meant typing filtered the list and
|
|
49
|
+
* left the address bar on `/parts`. Every detail page here is a real slug
|
|
50
|
+
* (`/parts/{classification}/{code}`, `/beys/{slug}`) and every other listing
|
|
51
|
+
* surface puts its state in the URL — `/search?q=…` reads `searchParams`
|
|
52
|
+
* server-side, and the category pages go as far as path segments
|
|
53
|
+
* (`/categories/{slug}/{tab}/sort/{sortKey}/page/{page}`). A client-local
|
|
54
|
+
* box was the one surface where you could not send someone what you were
|
|
55
|
+
* looking at.
|
|
56
|
+
*
|
|
57
|
+
* `useUrlTable` is the mechanism, not a second one invented here: it owns
|
|
58
|
+
* `router.replace()`, uses replace rather than push so typing does not fill
|
|
59
|
+
* the back button, and `TABLE_KEYS.QUERY` is the same `q` the rest of the
|
|
60
|
+
* app reads.
|
|
61
|
+
*
|
|
62
|
+
* 🛑 TWO pieces of state, deliberately, and they are not redundant. `draft`
|
|
63
|
+
* drives the input so a keystroke is never waiting on a navigation; the URL
|
|
64
|
+
* is the shareable record, written on a debounce. Driving the input straight
|
|
65
|
+
* from `searchParams` makes every character a round trip through the router
|
|
66
|
+
* and the field feels broken on a slow render.
|
|
67
|
+
*
|
|
68
|
+
* 🛑 `useSearchParams` requires a `<Suspense>` ancestor or the build fails
|
|
69
|
+
* on prerender (Root Cause #17b). The root locale layout has one, which is
|
|
70
|
+
* what the ~246 comments citing that pattern are about.
|
|
71
|
+
*/
|
|
72
|
+
/*
|
|
73
|
+
* 🛑 DESTRUCTURED, because `useUrlTable` returns a fresh object literal every
|
|
74
|
+
* render while the callbacks inside it are `useCallback`-memoised. Depending
|
|
75
|
+
* on `table` would make the effect below re-run on every render; depending on
|
|
76
|
+
* `set`/`clear` is stable. Same trap as the `loadOptions` identity bug in
|
|
77
|
+
* `PaginatedSelect`, where an unstable function re-triggered a fetch effect.
|
|
78
|
+
*/
|
|
79
|
+
const { get, set, clear } = useUrlTable();
|
|
80
|
+
const urlQuery = get(TABLE_KEYS.QUERY) ?? "";
|
|
81
|
+
const [draft, setDraft] = React.useState(urlQuery);
|
|
82
|
+
/*
|
|
83
|
+
* 🛑 SEEDED FROM THE URL, not `false`.
|
|
84
|
+
*
|
|
85
|
+
* `useSiteSearch` only fetches the index when `active`, which previously
|
|
86
|
+
* meant "the user has focused the box". Arriving on `/parts?q=rubber-flat`
|
|
87
|
+
* from a shared link, `active` would be false — so the query would sit in
|
|
88
|
+
* the field and in the address bar having searched NOTHING until the visitor
|
|
89
|
+
* clicked into the input. That defeats the entire reason for putting the
|
|
90
|
+
* query in the URL, and it is the kind of gap that looks like the link
|
|
91
|
+
* "didn't work" rather than like a missing fetch.
|
|
92
|
+
*/
|
|
93
|
+
const [active, setActive] = React.useState(urlQuery.length > 0);
|
|
94
|
+
/*
|
|
95
|
+
* Back/forward and a shared link both change the URL without touching the
|
|
96
|
+
* input, so the draft follows the URL when the URL moves on its own.
|
|
97
|
+
* Guarded on inequality — without that this fights the user's typing.
|
|
98
|
+
*/
|
|
99
|
+
React.useEffect(() => {
|
|
100
|
+
setDraft((prev) => (prev === urlQuery ? prev : urlQuery));
|
|
101
|
+
}, [urlQuery]);
|
|
102
|
+
/*
|
|
103
|
+
* 🛑 Debounced, because `router.replace` on every keystroke is a navigation
|
|
104
|
+
* per character. 300ms is the same order the rest of the app uses for a
|
|
105
|
+
* search field, and the cleanup makes the last keystroke the one that wins.
|
|
106
|
+
*/
|
|
107
|
+
React.useEffect(() => {
|
|
108
|
+
if (draft === urlQuery)
|
|
109
|
+
return;
|
|
110
|
+
const t = setTimeout(() => {
|
|
111
|
+
if (draft)
|
|
112
|
+
set(TABLE_KEYS.QUERY, draft);
|
|
113
|
+
else
|
|
114
|
+
clear([TABLE_KEYS.QUERY]);
|
|
115
|
+
}, 300);
|
|
116
|
+
return () => clearTimeout(t);
|
|
117
|
+
}, [draft, urlQuery, set, clear]);
|
|
118
|
+
/* The index is searched on the URL's value — the thing that is shareable. */
|
|
119
|
+
const query = urlQuery;
|
|
45
120
|
const { status, result } = useSiteSearch(query, {
|
|
46
121
|
active,
|
|
47
122
|
indexEnabled,
|
|
@@ -50,8 +125,8 @@ export function PartsSearchBox({ indexEnabled, placeholder = "Search parts by na
|
|
|
50
125
|
});
|
|
51
126
|
const hits = result?.groups[0]?.hits ?? [];
|
|
52
127
|
const typed = query.trim().length > 0;
|
|
53
|
-
return (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Input, { type: "search", value:
|
|
128
|
+
return (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Input, { type: "search", value: draft, placeholder: placeholder, "aria-label": "Search parts", onFocus: () => setActive(true), onChange: (event) => {
|
|
54
129
|
setActive(true);
|
|
55
|
-
|
|
130
|
+
setDraft(event.target.value);
|
|
56
131
|
} }), typed && status === "loading" && _jsx(Text, { color: "muted", children: "Searching\u2026" }), typed && (status === "failed" || status === "disabled") && (_jsx(Text, { size: "sm", color: "muted", children: "Part search is unavailable right now \u2014 browse by classification below." })), typed && status === "ready" && hits.length === 0 && (_jsx(Text, { color: "muted", children: "No part matches that name or code." })), hits.length > 0 && (_jsx(Stack, { gap: "xs", className: "min-w-0", children: hits.slice(0, limit).map((hit) => (_jsxs(Div, { surface: "card", padding: "sm", rounded: "md", border: "subtle", children: [_jsx(TextLink, { href: hit.href, children: hit.title }), hit.detail && (_jsx(Text, { size: "xs", color: "muted", children: hit.detail }))] }, hit.id))) }))] }));
|
|
57
132
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-level protection for hand-corrections to GENERATED reference data.
|
|
3
|
+
*
|
|
4
|
+
* ── 🛑 THE PROBLEM THIS SOLVES ────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `partGlossary` (2,488 rows) and `beys` (1,988) are produced by committed
|
|
7
|
+
* generators from a crawled corpus, and `appkit-seed load` writes them with
|
|
8
|
+
* `set(doc, { merge: true })`. A merge-write overwrites every key present in
|
|
9
|
+
* the payload — so an admin who corrects a wrong extracted weight loses that
|
|
10
|
+
* correction on the next reseed, silently, and the row goes back to being
|
|
11
|
+
* wrong while `appkit-seed status` reports the collection perfectly in sync
|
|
12
|
+
* (it counts ids, and the id did not change).
|
|
13
|
+
*
|
|
14
|
+
* That is not hypothetical for this dataset. This session alone found five
|
|
15
|
+
* wrong claims in the source corpus — an inverted tip transition, a mode that
|
|
16
|
+
* was actually launch spin direction, a mechanism on the wrong part, a part
|
|
17
|
+
* with no modes at all, and a part named "Duo:Dual" that is Delta Drive. A
|
|
18
|
+
* hand-correction is the fast path for exactly those, and it has to survive.
|
|
19
|
+
*
|
|
20
|
+
* ── 🛑 FIELD-LEVEL, NOT ROW-LEVEL ────────────────────────────────────────
|
|
21
|
+
*
|
|
22
|
+
* The obvious shape is one boolean meaning "do not touch this row". It is
|
|
23
|
+
* wrong: freezing a whole row because somebody fixed one weight means the row
|
|
24
|
+
* stops receiving every genuine improvement the generator makes afterwards —
|
|
25
|
+
* a better description, a newly resolved part id, a corrected release date.
|
|
26
|
+
* The row quietly falls out of the dataset's own maintenance.
|
|
27
|
+
*
|
|
28
|
+
* So `adminEditedFields` names the keys a human owns. The loader strips
|
|
29
|
+
* exactly those from its payload and writes everything else, which means a
|
|
30
|
+
* corrected weight and an improved description can both be true at once.
|
|
31
|
+
*
|
|
32
|
+
* `adminEdited` is a plain boolean beside it purely so the loader can find
|
|
33
|
+
* these rows with ONE equality query per collection instead of reading all
|
|
34
|
+
* 4,476 documents to discover the handful that matter. `array-contains` on
|
|
35
|
+
* `adminEditedFields` cannot answer "has any value", and an `orderBy` or `!=`
|
|
36
|
+
* on it would silently exclude every row that lacks the field — which is all
|
|
37
|
+
* of them (Root Cause #100).
|
|
38
|
+
*
|
|
39
|
+
* 🛑 KEEP THE TWO IN SYNC. `adminEdited` is `adminEditedFields.length > 0`.
|
|
40
|
+
* Writing one without the other either hides a protected row from the loader
|
|
41
|
+
* (so the edit is lost anyway) or makes the loader fetch a row with nothing to
|
|
42
|
+
* protect. `applyAdminEdit` is the only function that should set either.
|
|
43
|
+
*/
|
|
44
|
+
/** The fields a human has taken ownership of on one generated row. */
|
|
45
|
+
export interface AdminEditableRecord {
|
|
46
|
+
/**
|
|
47
|
+
* `true` iff `adminEditedFields` is non-empty. Exists ONLY so the seed
|
|
48
|
+
* loader can find protected rows with one indexed equality.
|
|
49
|
+
*/
|
|
50
|
+
adminEdited?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Keys the generator must not overwrite. Dot paths are NOT supported — a
|
|
53
|
+
* nested object is owned whole, because a merge-write replaces a map wholesale
|
|
54
|
+
* and protecting one leaf of it is not something `{ merge: true }` can express.
|
|
55
|
+
*/
|
|
56
|
+
adminEditedFields?: string[];
|
|
57
|
+
/** When the most recent hand-edit landed. Audit trail, never read by logic. */
|
|
58
|
+
adminEditedAt?: Date;
|
|
59
|
+
/** Who. The Auth UID, never a name — this travels into no public projection. */
|
|
60
|
+
adminEditedBy?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Merge a hand-edit into a record, keeping the two protection fields honest.
|
|
64
|
+
*
|
|
65
|
+
* Returns the patch to write — the caller's changed fields plus the updated
|
|
66
|
+
* ownership set. 🛑 Ownership is CUMULATIVE: editing the weight today and the
|
|
67
|
+
* description tomorrow must leave both protected, so the existing set is
|
|
68
|
+
* unioned rather than replaced.
|
|
69
|
+
*/
|
|
70
|
+
export declare function applyAdminEdit<TChanges extends object>(existing: Pick<AdminEditableRecord, "adminEditedFields"> | null | undefined, changes: TChanges, actorUid: string): TChanges & Required<Pick<AdminEditableRecord, "adminEdited" | "adminEditedFields">> & {
|
|
71
|
+
adminEditedAt: Date;
|
|
72
|
+
adminEditedBy: string;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Strip the fields a human owns out of a generator payload.
|
|
76
|
+
*
|
|
77
|
+
* Used by `appkit/scripts/seed-cli.mjs`. Exported from here rather than
|
|
78
|
+
* duplicated there so the rule has one definition — the CLI is `.mjs` and
|
|
79
|
+
* reads this through the built package, the same way it reads the seed data.
|
|
80
|
+
*/
|
|
81
|
+
export declare function stripAdminOwnedFields<T extends object>(payload: T, ownedFields: readonly string[] | undefined): Partial<T>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-level protection for hand-corrections to GENERATED reference data.
|
|
3
|
+
*
|
|
4
|
+
* ── 🛑 THE PROBLEM THIS SOLVES ────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `partGlossary` (2,488 rows) and `beys` (1,988) are produced by committed
|
|
7
|
+
* generators from a crawled corpus, and `appkit-seed load` writes them with
|
|
8
|
+
* `set(doc, { merge: true })`. A merge-write overwrites every key present in
|
|
9
|
+
* the payload — so an admin who corrects a wrong extracted weight loses that
|
|
10
|
+
* correction on the next reseed, silently, and the row goes back to being
|
|
11
|
+
* wrong while `appkit-seed status` reports the collection perfectly in sync
|
|
12
|
+
* (it counts ids, and the id did not change).
|
|
13
|
+
*
|
|
14
|
+
* That is not hypothetical for this dataset. This session alone found five
|
|
15
|
+
* wrong claims in the source corpus — an inverted tip transition, a mode that
|
|
16
|
+
* was actually launch spin direction, a mechanism on the wrong part, a part
|
|
17
|
+
* with no modes at all, and a part named "Duo:Dual" that is Delta Drive. A
|
|
18
|
+
* hand-correction is the fast path for exactly those, and it has to survive.
|
|
19
|
+
*
|
|
20
|
+
* ── 🛑 FIELD-LEVEL, NOT ROW-LEVEL ────────────────────────────────────────
|
|
21
|
+
*
|
|
22
|
+
* The obvious shape is one boolean meaning "do not touch this row". It is
|
|
23
|
+
* wrong: freezing a whole row because somebody fixed one weight means the row
|
|
24
|
+
* stops receiving every genuine improvement the generator makes afterwards —
|
|
25
|
+
* a better description, a newly resolved part id, a corrected release date.
|
|
26
|
+
* The row quietly falls out of the dataset's own maintenance.
|
|
27
|
+
*
|
|
28
|
+
* So `adminEditedFields` names the keys a human owns. The loader strips
|
|
29
|
+
* exactly those from its payload and writes everything else, which means a
|
|
30
|
+
* corrected weight and an improved description can both be true at once.
|
|
31
|
+
*
|
|
32
|
+
* `adminEdited` is a plain boolean beside it purely so the loader can find
|
|
33
|
+
* these rows with ONE equality query per collection instead of reading all
|
|
34
|
+
* 4,476 documents to discover the handful that matter. `array-contains` on
|
|
35
|
+
* `adminEditedFields` cannot answer "has any value", and an `orderBy` or `!=`
|
|
36
|
+
* on it would silently exclude every row that lacks the field — which is all
|
|
37
|
+
* of them (Root Cause #100).
|
|
38
|
+
*
|
|
39
|
+
* 🛑 KEEP THE TWO IN SYNC. `adminEdited` is `adminEditedFields.length > 0`.
|
|
40
|
+
* Writing one without the other either hides a protected row from the loader
|
|
41
|
+
* (so the edit is lost anyway) or makes the loader fetch a row with nothing to
|
|
42
|
+
* protect. `applyAdminEdit` is the only function that should set either.
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Merge a hand-edit into a record, keeping the two protection fields honest.
|
|
46
|
+
*
|
|
47
|
+
* Returns the patch to write — the caller's changed fields plus the updated
|
|
48
|
+
* ownership set. 🛑 Ownership is CUMULATIVE: editing the weight today and the
|
|
49
|
+
* description tomorrow must leave both protected, so the existing set is
|
|
50
|
+
* unioned rather than replaced.
|
|
51
|
+
*/
|
|
52
|
+
export function applyAdminEdit(existing, changes, actorUid) {
|
|
53
|
+
const owned = new Set(existing?.adminEditedFields ?? []);
|
|
54
|
+
for (const key of Object.keys(changes)) {
|
|
55
|
+
/*
|
|
56
|
+
* The protection fields themselves are never protected — that would make
|
|
57
|
+
* the set unmodifiable by the next edit.
|
|
58
|
+
*/
|
|
59
|
+
if (key.startsWith("adminEdited"))
|
|
60
|
+
continue;
|
|
61
|
+
owned.add(key);
|
|
62
|
+
}
|
|
63
|
+
const fields = [...owned].sort();
|
|
64
|
+
return {
|
|
65
|
+
...changes,
|
|
66
|
+
adminEditedFields: fields,
|
|
67
|
+
adminEdited: fields.length > 0,
|
|
68
|
+
adminEditedAt: new Date(),
|
|
69
|
+
adminEditedBy: actorUid,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Strip the fields a human owns out of a generator payload.
|
|
74
|
+
*
|
|
75
|
+
* Used by `appkit/scripts/seed-cli.mjs`. Exported from here rather than
|
|
76
|
+
* duplicated there so the rule has one definition — the CLI is `.mjs` and
|
|
77
|
+
* reads this through the built package, the same way it reads the seed data.
|
|
78
|
+
*/
|
|
79
|
+
export function stripAdminOwnedFields(payload, ownedFields) {
|
|
80
|
+
if (!ownedFields?.length)
|
|
81
|
+
return payload;
|
|
82
|
+
const out = {};
|
|
83
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
84
|
+
if (ownedFields.includes(k))
|
|
85
|
+
continue;
|
|
86
|
+
out[k] = v;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* `Record<Generation, Slot[]>` would be the hand-written enumeration of Root
|
|
30
30
|
* Cause #61 with a merge case it structurally cannot hold.
|
|
31
31
|
*/
|
|
32
|
+
import type { AdminEditableRecord } from "./admin-edit";
|
|
32
33
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
33
34
|
export declare const PART_GLOSSARY_COLLECTION: "partGlossary";
|
|
34
35
|
export declare const MODEL_COMPOSITION_COLLECTION: "modelComposition";
|
|
@@ -271,7 +272,7 @@ export interface PartWboLegality {
|
|
|
271
272
|
* source. A slot missing from that map yields no `role` rather than a guess.
|
|
272
273
|
*/
|
|
273
274
|
export type PartRole = "chip" | "ring" | "wheel" | "weight" | "base" | "blade" | "track" | "tip" | "gear" | "support";
|
|
274
|
-
export interface PartGlossaryDocument extends BaseDocument {
|
|
275
|
+
export interface PartGlossaryDocument extends BaseDocument, AdminEditableRecord {
|
|
275
276
|
/** `${slot}--${codeOrSlug}` — both halves, because a code is not unique. */
|
|
276
277
|
id: string;
|
|
277
278
|
/** Buyer-facing label: "Performance Tip", "Fusion Wheel". */
|
|
@@ -19,6 +19,7 @@ import { normalizeRichTextHtml } from "../../../utils/string.formatter.js";
|
|
|
19
19
|
import { PreorderBadge } from "./PreorderCard.js";
|
|
20
20
|
import { WishlistHeartButton } from "../../wishlist/components/WishlistHeartButton.js";
|
|
21
21
|
import { CardStoreLine } from "../../products/components/CardStoreLine.js";
|
|
22
|
+
import { ProductOwnerQuickActions } from "../../products/components/ProductOwnerQuickActions.js";
|
|
22
23
|
const DEFAULT_LABELS = {
|
|
23
24
|
preOrderBadge: "Pre-order",
|
|
24
25
|
featuredBadge: "Featured",
|
|
@@ -69,11 +70,23 @@ export function MarketplacePreorderCard({ product, className = "", variant = "gr
|
|
|
69
70
|
_jsxs(_Fragment, { children: [_jsxs(Row, { className: "min-w-0", align: "start", justify: "between", gap: "sm", children: [_jsx(TextLink, { href: detailHref, className: "min-w-0 flex-1", children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), wishlistActions && (_jsx(WishlistHeartButton, { size: "inline", inWishlist: inWishlist, addLabel: mergedLabels.addToWishlist, removeLabel: mergedLabels.removeFromWishlist, onToggle: handleWishlist }))] }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), _jsxs(Row, { align: "center", gap: "sm", wrap: true, children: [_jsx(Text, { className: "text-primary", size: "sm", weight: "bold", children: _jsx(GatedPrice, { children: formatCurrency(product.price, getDefaultCurrency()) }) }), shipDate && _jsx(PreorderBadge, { shipDate: shipDate })] }), _jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "self-start mt-0.5", onClick: handleNavigate, children: mergedLabels.reserveNow })] })) : (
|
|
70
71
|
/* ── Full grid layout ── */
|
|
71
72
|
_jsxs(_Fragment, { children: [_jsx(TextLink, { href: detailHref, children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), product.description ? (_jsx(RichText, { html: normalizeRichTextHtml(product.description), proseClass: "prose prose-sm max-w-none dark:prose-invert prose-p:my-0", className: "line-clamp-2 text-[length:var(--appkit-text-xs)] text-[var(--appkit-color-text-muted)]" })) : null, _jsxs(Row, { justify: "between", className: "mt-1", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: _jsx(GatedPrice, { children: formatCurrency(product.price, getDefaultCurrency()) }) }), shipDate && _jsx(PreorderBadge, { shipDate: shipDate })] }), _jsxs(Row, { justify: "between", className: "mt-auto pt-[var(--appkit-space-2)]", gap: "sm", children: [_jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "flex-1", onClick: handleNavigate, children: mergedLabels.reserveNow }), onAddToCart ? (_jsx(Button, { type: "button", variant: "outline", size: "sm", textSize: "xs", className: "flex-1", onClick: (e) => { e.stopPropagation(); onAddToCart(product); }, children: mergedLabels.addToCart })) : null, wishlistActions ? (_jsx(WishlistHeartButton, { size: "inline", inWishlist: inWishlist, addLabel: mergedLabels.addToWishlist, removeLabel: mergedLabels.removeFromWishlist, onToggle: handleWishlist })) : null] })] })) })] }));
|
|
72
|
-
|
|
73
|
+
/*
|
|
74
|
+
* 🛑 Default, not opt-in. Nothing in either repo ever passed
|
|
75
|
+
* `renderOwnerActions`, so this toolbar was unreachable on every grid that
|
|
76
|
+
* mounts this card (Root Cause #8 — a slot shell rendered with zero render
|
|
77
|
+
* props). A card is resource-specific by construction, so it names its own
|
|
78
|
+
* resource rather than being threaded one; the prop stays as an override.
|
|
79
|
+
*/
|
|
80
|
+
const ownerActions = renderOwnerActions
|
|
81
|
+
? renderOwnerActions()
|
|
82
|
+
: product.id
|
|
83
|
+
? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" }))
|
|
84
|
+
: null;
|
|
85
|
+
if (!ownerActions)
|
|
73
86
|
return card;
|
|
74
87
|
/*
|
|
75
88
|
* Sibling of the card, never a child — see the prop's docstring. `z-20`
|
|
76
89
|
* clears this card's own overlays, which all sit at `z-10`.
|
|
77
90
|
*/
|
|
78
|
-
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 bottom-2 z-20", children:
|
|
91
|
+
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 bottom-2 z-20", children: ownerActions })] }));
|
|
79
92
|
}
|
|
@@ -14,6 +14,7 @@ import { BaseListingCard, Div, GatedPrice, PricesOnly, Row, Span, Stack, Text, T
|
|
|
14
14
|
import { MediaImage } from "../../media/MediaImage.js";
|
|
15
15
|
import { computeBundleDiscount } from "../../../_internal/shared/features/categories/bundle-pricing.js";
|
|
16
16
|
import { BUNDLE_COPY } from "../../../_internal/shared/features/categories/bundle-copy.js";
|
|
17
|
+
import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
|
|
17
18
|
const DEFAULT_LABELS = {
|
|
18
19
|
bundleBadge: "Bundle",
|
|
19
20
|
inStockBadge: "In stock",
|
|
@@ -58,11 +59,23 @@ export function MarketplaceBundleCard({ bundle, className = "", variant = "grid"
|
|
|
58
59
|
? formatCurrency(price, getDefaultCurrency())
|
|
59
60
|
: "—" }), discount && (_jsx(Text, { size: "xs", color: "muted", className: "line-through", children: formatCurrency(discount.originalTotal, getDefaultCurrency()) }))] }) }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: mergedLabels.itemsLabel(memberCount) })] }), _jsx(Div, { className: CLS_VIEW_BTN, role: "button", tabIndex: 0, onClick: handleNavigate, onKeyDown: (e) => { if (e.key === "Enter" || e.key === " ")
|
|
60
61
|
handleNavigate(); }, children: "View Bundle" })] })] }));
|
|
61
|
-
|
|
62
|
+
/*
|
|
63
|
+
* 🛑 Default, not opt-in. Nothing in either repo ever passed
|
|
64
|
+
* `renderOwnerActions`, so this toolbar was unreachable on every grid that
|
|
65
|
+
* mounts this card (Root Cause #8 — a slot shell rendered with zero render
|
|
66
|
+
* props). A card is resource-specific by construction, so it names its own
|
|
67
|
+
* resource rather than being threaded one; the prop stays as an override.
|
|
68
|
+
*/
|
|
69
|
+
const ownerActions = renderOwnerActions
|
|
70
|
+
? renderOwnerActions()
|
|
71
|
+
: bundle.id
|
|
72
|
+
? (_jsx(RecordOwnerQuickActions, { resource: "BUNDLE", recordId: String(bundle.id), recordLabel: String(bundle.name), placement: "card" }))
|
|
73
|
+
: null;
|
|
74
|
+
if (!ownerActions)
|
|
62
75
|
return card;
|
|
63
76
|
/*
|
|
64
77
|
* Sibling of the card, never a child — see the prop's docstring. `z-20`
|
|
65
78
|
* clears this card's own overlays, which all sit at `z-10`.
|
|
66
79
|
*/
|
|
67
|
-
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children:
|
|
80
|
+
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: ownerActions })] }));
|
|
68
81
|
}
|
|
@@ -11,6 +11,7 @@ const CLS_PRIZE_PILL = "inline-flex items-center rounded-full bg-fuchsia-600 px-
|
|
|
11
11
|
import { BaseListingCard, Button, Div, GatedPrice, Row, Span, Stack, Text, TextLink } from "../../../ui/index.js";
|
|
12
12
|
import { MediaImage } from "../../media/MediaImage.js";
|
|
13
13
|
import { CardStoreLine } from "./CardStoreLine.js";
|
|
14
|
+
import { ProductOwnerQuickActions } from "./ProductOwnerQuickActions.js";
|
|
14
15
|
const DEFAULT_LABELS = {
|
|
15
16
|
prizeDrawBadge: "Prize draw",
|
|
16
17
|
pendingBadge: "Reveal pending",
|
|
@@ -100,11 +101,23 @@ export function MarketplacePrizeDrawCard({ product, className = "", variant = "g
|
|
|
100
101
|
}, className: selectable || isSelected
|
|
101
102
|
? "opacity-100"
|
|
102
103
|
: "opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto transition-opacity" }))] }), _jsxs(BaseListingCard.Info, { variant: variant, children: [_jsx(TextLink, { href: String(detailHref), children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), _jsxs(Row, { justify: "between", className: "mt-1", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: _jsxs(GatedPrice, { label: "Sign in to see the entry price", children: [formatCurrency(pricePerEntry, getDefaultCurrency()), " ", _jsx(Span, { size: "xs", weight: "normal", className: "text-[var(--appkit-color-text-muted)]", children: mergedLabels.pricePerEntryLabel })] }) }), max > 0 ? (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: mergedLabels.entriesRemainingLabel(remaining, max) })) : null] }), countdown ? (_jsxs(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: [status === "pending" ? "Opens in" : "Closes in", " ", countdown] })) : null, _jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "mt-2 w-full", onClick: handleNavigate, disabled: status === "closed" || remaining === 0, children: mergedLabels.enterDraw })] })] }));
|
|
103
|
-
|
|
104
|
+
/*
|
|
105
|
+
* 🛑 Default, not opt-in. Nothing in either repo ever passed
|
|
106
|
+
* `renderOwnerActions`, so this toolbar was unreachable on every grid that
|
|
107
|
+
* mounts this card (Root Cause #8 — a slot shell rendered with zero render
|
|
108
|
+
* props). A card is resource-specific by construction, so it names its own
|
|
109
|
+
* resource rather than being threaded one; the prop stays as an override.
|
|
110
|
+
*/
|
|
111
|
+
const ownerActions = renderOwnerActions
|
|
112
|
+
? renderOwnerActions()
|
|
113
|
+
: product.id
|
|
114
|
+
? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" }))
|
|
115
|
+
: null;
|
|
116
|
+
if (!ownerActions)
|
|
104
117
|
return card;
|
|
105
118
|
/*
|
|
106
119
|
* Sibling of the card, never a child — see the prop's docstring. `z-20`
|
|
107
120
|
* clears this card's own overlays, which all sit at `z-10`.
|
|
108
121
|
*/
|
|
109
|
-
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children:
|
|
122
|
+
return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: ownerActions })] }));
|
|
110
123
|
}
|
|
@@ -17,6 +17,7 @@ import { PRODUCT_FEATURE_CARD_MAX_VISIBLE } from "../constants/product-features.
|
|
|
17
17
|
import { normalizeListingType } from "../utils/listing-type.js";
|
|
18
18
|
import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
|
|
19
19
|
import { WishlistHeartButton } from "../../wishlist/components/WishlistHeartButton.js";
|
|
20
|
+
import { ProductOwnerQuickActions } from "./ProductOwnerQuickActions.js";
|
|
20
21
|
const __P = {
|
|
21
22
|
p3: "p-[var(--appkit-space-3)]",
|
|
22
23
|
};
|
|
@@ -125,7 +126,22 @@ export function ProductCard({ product, href, onClick, onAddToWishlist, isWishlis
|
|
|
125
126
|
onAddToCart(product);
|
|
126
127
|
}, className: "justify-center text-[length:var(--appkit-text-xs)]", children: [_jsx("svg", { className: "h-3.5 w-3.5 flex-shrink-0", fill: "none", stroke: "currentColor", strokeWidth: 2, viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 3h2l.4 2M7 13h10l4-8H5.4m1.6 8L5 3H3m4 10v7a1 1 0 001 1h8a1 1 0 001-1v-7M9 21h6" }) }), "Cart"] }))] }))] })] })] }));
|
|
127
128
|
const wrapped = href && !selectionMode ? (_jsx(Link, { href: href, className: "block h-full", children: cardBody })) : (cardBody);
|
|
128
|
-
|
|
129
|
+
/*
|
|
130
|
+
* 🛑 Default, not opt-in — nothing in either repo ever passed
|
|
131
|
+
* `renderOwnerActions`, so this toolbar was unreachable on every product
|
|
132
|
+
* grid in the app despite the prop, the docstring and the positioning all
|
|
133
|
+
* being present (Root Cause #8).
|
|
134
|
+
*
|
|
135
|
+
* `ProductOwnerQuickActions`, not the generic wrapper: a product is the one
|
|
136
|
+
* collection a SELLER can also own, so its endpoints live under
|
|
137
|
+
* `SELLER_ENDPOINTS` and its clone has a bespoke redirect to the copy's
|
|
138
|
+
* editor. `storeId` is the store SLUG, which is what `SessionUser.storeId`
|
|
139
|
+
* holds — the component renders nothing for anyone who owns neither.
|
|
140
|
+
*/
|
|
141
|
+
const ownerActions = renderOwnerActions ? (renderOwnerActions()) : product.id ? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" })) : null;
|
|
142
|
+
// Selection is still suppressed: a bulk-select gesture and a per-record edit
|
|
143
|
+
// are different intents, and offering both at once invites the wrong one.
|
|
144
|
+
if (!ownerActions || selectionMode || isSelected)
|
|
129
145
|
return wrapped;
|
|
130
146
|
/*
|
|
131
147
|
* 🛑 OUTSIDE the anchor, as a sibling — never inside `cardBody`.
|
|
@@ -144,7 +160,7 @@ export function ProductCard({ product, href, onClick, onAddToWishlist, isWishlis
|
|
|
144
160
|
*
|
|
145
161
|
* `z-20` beats the in-card overlays, which all sit at `z-10`.
|
|
146
162
|
*/
|
|
147
|
-
return (_jsxs(Div, { className: "relative h-full", children: [wrapped, _jsx(Div, { className: "absolute right-2 top-14 z-20", children:
|
|
163
|
+
return (_jsxs(Div, { className: "relative h-full", children: [wrapped, _jsx(Div, { className: "absolute right-2 top-14 z-20", children: ownerActions })] }));
|
|
148
164
|
}
|
|
149
165
|
function ProductListRow({ product, onClick, onAddToWishlist, isWishlisted, }) {
|
|
150
166
|
const discount = product.originalPrice && product.originalPrice > product.price
|
|
@@ -379,6 +379,24 @@ export interface ProductDocument extends BaseDocument {
|
|
|
379
379
|
* defects welded into the TITLE.
|
|
380
380
|
*/
|
|
381
381
|
unitLabel?: string;
|
|
382
|
+
/**
|
|
383
|
+
* This listing is a complete BEY, and this is which one.
|
|
384
|
+
*
|
|
385
|
+
* The `beys` document id, which is also its slug and also the URL
|
|
386
|
+
* (`/beys/{beyId}`) with no re-derivation — the same property that made
|
|
387
|
+
* `partGlossaryId` a single id rather than a pair.
|
|
388
|
+
*
|
|
389
|
+
* 🛑 THE EXACT COUNTERPART OF `partGlossaryId`, and the pair is what makes
|
|
390
|
+
* the seller's "single" choice meaningful: a single item is either one named
|
|
391
|
+
* bey or one named part, and those are the only two things in the catalogue
|
|
392
|
+
* that have an identity to point at. A lot has neither, which is why it
|
|
393
|
+
* files under a non-leaf CATEGORY instead (see `isLot`).
|
|
394
|
+
*
|
|
395
|
+
* 🛑 Never set together with `partGlossaryId`. A listing is a whole bey or a
|
|
396
|
+
* component, not both — and the two link to different reference pages, so a
|
|
397
|
+
* row carrying both would render two contradictory "what is this" sections.
|
|
398
|
+
*/
|
|
399
|
+
beyId?: string;
|
|
382
400
|
/**
|
|
383
401
|
* This listing is a COMPONENT, and this is which one.
|
|
384
402
|
*
|
|
@@ -22,5 +22,14 @@ export interface CategoryInlineSelectProps {
|
|
|
22
22
|
* `MAX_CATEGORY_ASSIGNMENTS`, which is what the repository refuses above.
|
|
23
23
|
*/
|
|
24
24
|
maxAssignments?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Scope the rows to LEAVES (a single item) or to COLLECTIONS (a lot).
|
|
27
|
+
*
|
|
28
|
+
* 🛑 `undefined` means UNSCOPED, which is what every existing call site
|
|
29
|
+
* gets — this cannot default, because a caller that does not know whether it
|
|
30
|
+
* is a lot must not be silently told it is a single. See `leafFilterFor`
|
|
31
|
+
* for why the server makes this load-bearing rather than cosmetic.
|
|
32
|
+
*/
|
|
33
|
+
leavesOnly?: boolean;
|
|
25
34
|
}
|
|
26
|
-
export declare function CategoryInlineSelect({ value, onChange, placeholder, disabled, allowCreate, extraValues, onExtraValuesChange, maxAssignments, }: CategoryInlineSelectProps): React.JSX.Element;
|
|
35
|
+
export declare function CategoryInlineSelect({ value, onChange, placeholder, disabled, allowCreate, extraValues, onExtraValuesChange, maxAssignments, leavesOnly, }: CategoryInlineSelectProps): React.JSX.Element;
|