@mohasinac/appkit 4.52.4 → 4.53.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/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +4 -0
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +24 -37
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +1 -1
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +62 -1
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +12 -3
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.d.ts +1 -3
- package/dist/features/layout/TitleBarLayout.js +3 -4
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
- package/dist/features/tester/seed-data/authored/index.js +10 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +4 -4
- package/dist/next/routing/route-map.js +25 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +1 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
|
@@ -5,7 +5,13 @@ import { createPortal } from "react-dom";
|
|
|
5
5
|
import { twMerge } from "tailwind-merge";
|
|
6
6
|
import { Loader2 } from "lucide-react";
|
|
7
7
|
import { surfaceError } from "../../client/api/surface-error.js";
|
|
8
|
-
|
|
8
|
+
/*
|
|
9
|
+
* From `toast-context`, never from `./Toast`. `Toast` renders a `<Button>` as
|
|
10
|
+
* its dismiss control, so importing the hook from there is a real value cycle
|
|
11
|
+
* between two primitives — which makes their module initialisation order a
|
|
12
|
+
* property of the bundler rather than of the code.
|
|
13
|
+
*/
|
|
14
|
+
import { useToastSafe } from "./toast-context.js";
|
|
9
15
|
import { SHADOW_MAP } from "./surface-tokens.js";
|
|
10
16
|
import { resolveIcon, ICON_SIZE } from "../icons/icon-registry.js";
|
|
11
17
|
function spawnRipple(host, clientX, clientY) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import type { OverflowRowDotTone } from "./OverflowRow";
|
|
2
3
|
/**
|
|
3
4
|
* FilterChipGroup — labelled wrap-group of pill buttons.
|
|
4
5
|
*
|
|
@@ -32,6 +33,16 @@ export interface FilterChipGroupTab {
|
|
|
32
33
|
* and a failed count can never hide a filter that has rows (Root Cause #59).
|
|
33
34
|
*/
|
|
34
35
|
count?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Leading status dot. Lets a status chip be found by colour before the label
|
|
38
|
+
* is read, which is the whole job of a status filter bar.
|
|
39
|
+
*
|
|
40
|
+
* 🛑 Colour is NEVER the only signal — the label is always rendered beside
|
|
41
|
+
* it, so the dot is redundant reinforcement rather than information. A chip
|
|
42
|
+
* identified only by colour is unusable to a colour-blind or screen-reader
|
|
43
|
+
* user, and the dot is `aria-hidden` for exactly that reason.
|
|
44
|
+
*/
|
|
45
|
+
dotTone?: OverflowRowDotTone;
|
|
35
46
|
}
|
|
36
47
|
export interface FilterChipGroupProps {
|
|
37
48
|
/** Section label shown above the chips. */
|
|
@@ -56,6 +56,6 @@ export function FilterChipGroup({ label, tabs, value, onChange, allId = "All", m
|
|
|
56
56
|
return (_jsxs("button", { type: "button",
|
|
57
57
|
// Checkboxes report checked state, not pressed state — a screen
|
|
58
58
|
// reader announcing "pressed" for a filter that stays on is wrong.
|
|
59
|
-
role: multiple ? "checkbox" : undefined, "aria-checked": multiple ? isActive : undefined, "aria-pressed": multiple ? undefined : isActive, onClick: () => handleClick(tab.id), className: `${CHIP_BASE_CLS} ${isActive ? ACTIVE_CLS : INACTIVE_CLS}`, children: [tab.label, typeof tab.count === "number" && (_jsx("span", { className: COUNT_CLS, children: tab.count > 99 ? "99+" : tab.count }))] }, tab.id));
|
|
59
|
+
role: multiple ? "checkbox" : undefined, "aria-checked": multiple ? isActive : undefined, "aria-pressed": multiple ? undefined : isActive, onClick: () => handleClick(tab.id), className: `${CHIP_BASE_CLS} ${isActive ? ACTIVE_CLS : INACTIVE_CLS}`, children: [tab.dotTone && (_jsx("span", { className: "appkit-overflow-row__dot mr-1.5 inline-block align-middle", "data-tone": tab.dotTone, "aria-hidden": "true" })), tab.label, typeof tab.count === "number" && (_jsx("span", { className: COUNT_CLS, children: tab.count > 99 ? "99+" : tab.count }))] }, tab.id));
|
|
60
60
|
}) })] }));
|
|
61
61
|
}
|
|
@@ -4,7 +4,12 @@ import { useState, useRef, useEffect } from "react";
|
|
|
4
4
|
import { Text } from "./Typography.js";
|
|
5
5
|
import { Button } from "./Button.js";
|
|
6
6
|
import { HorizontalScroller } from "./HorizontalScroller.js";
|
|
7
|
-
|
|
7
|
+
// Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
|
|
8
|
+
// `react/index.ts` re-exported into each other, which is the whole of
|
|
9
|
+
// `audit-import-cycles` component 1: an 18-module knot held together entirely
|
|
10
|
+
// by barrel hops, none of which needed the barrel.
|
|
11
|
+
import { useSwipe } from "../../react/hooks/useSwipe.js";
|
|
12
|
+
import { useGesture } from "../../react/hooks/useGesture.js";
|
|
8
13
|
import { MediaImage } from "../../features/media/MediaImage.js";
|
|
9
14
|
import { FLEX_CENTER, THEMED_BG_SECONDARY, THEMED_BG_TERTIARY, THEMED_BORDER, THEMED_TEXT_MUTED, THEMED_TEXT_PRIMARY, THEMED_TEXT_SECONDARY, } from "../../_internal/shared/styles/themed.js";
|
|
10
15
|
const themed = {
|
|
@@ -50,24 +50,30 @@ export function ListingLayout({ headerSlot, statusTabsSlot, filterContent, filte
|
|
|
50
50
|
// Must run before the detail-view short-circuit below — hooks cannot sit
|
|
51
51
|
// after a conditional return.
|
|
52
52
|
const bottomChromeSlot = useBottomChromeSlot();
|
|
53
|
-
// Detail view short-circuit (folded from ListingViewShell)
|
|
54
|
-
if (detailView) {
|
|
55
|
-
return _jsx(_Fragment, { children: detailView });
|
|
56
|
-
}
|
|
57
|
-
// Portal-derived isDashboard default (folded from ListingViewShell)
|
|
58
|
-
const effectiveIsDashboard = isDashboard ?? (portal === "admin" || portal === "seller");
|
|
59
|
-
const l = { ...DEFAULT_LABELS, ...labels };
|
|
60
53
|
/* The mobile toolbar is two stacked rows — search + Filter, then a scrolling
|
|
61
54
|
sort/view/actions chip row — roughly 100px of chrome above the first card.
|
|
62
55
|
It opens collapsed below `lg` and stays as the user left it thereafter.
|
|
63
56
|
`forceExpanded` on a selection is load-bearing: the bulk-action bar renders
|
|
64
57
|
INSIDE this toolbar, so a collapsed one would leave the user no way to act
|
|
65
|
-
on rows they had just selected.
|
|
58
|
+
on rows they had just selected.
|
|
59
|
+
|
|
60
|
+
🛑 ABOVE the `detailView` short-circuit, with the other hooks. These two
|
|
61
|
+
sat below it — the THIRD time this component has grown a hook after that
|
|
62
|
+
return, which is what the two comments above are each a record of. Passing
|
|
63
|
+
`detailView` skipped them, so the hook ORDER changed between renders and
|
|
64
|
+
React silently reassigned state between the hooks that did run. */
|
|
66
65
|
const toolbarPathname = usePathname();
|
|
67
66
|
const { collapsed: mobileToolbarCollapsed, toggle: toggleMobileToolbar } = useToolbarCollapse({
|
|
68
67
|
id: `listing-layout${toolbarPathname ? `:${toolbarPathname}` : ""}`,
|
|
69
68
|
forceExpanded: selectedCount > 0,
|
|
70
69
|
});
|
|
70
|
+
// Detail view short-circuit (folded from ListingViewShell)
|
|
71
|
+
if (detailView) {
|
|
72
|
+
return _jsx(_Fragment, { children: detailView });
|
|
73
|
+
}
|
|
74
|
+
// Portal-derived isDashboard default (folded from ListingViewShell)
|
|
75
|
+
const effectiveIsDashboard = isDashboard ?? (portal === "admin" || portal === "seller");
|
|
76
|
+
const l = { ...DEFAULT_LABELS, ...labels };
|
|
71
77
|
const hasFilter = Boolean(filterContent);
|
|
72
78
|
const panelTitle = filterTitle ?? l.filtersTitle;
|
|
73
79
|
const handleMobileApply = () => {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { IconKey } from "../icons/icon-registry";
|
|
3
|
+
/** Status tones for a leading dot. Mirrors the status colour pairs in tokens.css. */
|
|
4
|
+
export type OverflowRowDotTone = "default" | "primary" | "success" | "warning" | "error" | "info" | "muted";
|
|
5
|
+
/**
|
|
6
|
+
* Navigation props forwarded to every `href` item's link.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately an explicit list rather than `Record<string, unknown>`: a bag
|
|
9
|
+
* of unknowns at a component boundary type-checks against anything, so a
|
|
10
|
+
* misspelled `scrollTo` would compile and silently do nothing — the defect
|
|
11
|
+
* being passed through here is precisely the kind that has no visible symptom.
|
|
12
|
+
*/
|
|
13
|
+
export interface OverflowRowLinkProps {
|
|
14
|
+
/**
|
|
15
|
+
* `false` opts the link out of the global `<ScrollToTop>`, which is keyed on
|
|
16
|
+
* pathname. A tab bar that swaps a panel must pass this or every click
|
|
17
|
+
* yanks the page to the top.
|
|
18
|
+
*/
|
|
19
|
+
scroll?: boolean;
|
|
20
|
+
prefetch?: boolean;
|
|
21
|
+
replace?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface OverflowRowItem {
|
|
24
|
+
id: string;
|
|
25
|
+
/**
|
|
26
|
+
* Plain text. Required even when a visual is present: it is the search
|
|
27
|
+
* corpus, the collapsed trigger's text, and the accessible name.
|
|
28
|
+
*/
|
|
29
|
+
label: string;
|
|
30
|
+
/** Trailing count. `undefined` means "not counted", NOT zero — it is omitted rather than rendered as 0. */
|
|
31
|
+
count?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Leading visual, in precedence order: `imageUrl` → `iconName` → `emoji` →
|
|
34
|
+
* `dotTone`. Only one renders. All are optional; an item with none renders
|
|
35
|
+
* label-only and the row stays aligned because the visual box is not
|
|
36
|
+
* reserved when NO item in the set has one.
|
|
37
|
+
*/
|
|
38
|
+
imageUrl?: string;
|
|
39
|
+
iconName?: IconKey;
|
|
40
|
+
emoji?: string;
|
|
41
|
+
dotTone?: OverflowRowDotTone;
|
|
42
|
+
/** Renders the pill as a link. Mutually exclusive with `onSelect`. */
|
|
43
|
+
href?: string;
|
|
44
|
+
onSelect?: () => void;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface OverflowRowProps {
|
|
48
|
+
items: readonly OverflowRowItem[];
|
|
49
|
+
/** Accessible name for the row and its collapsed dropdown. Required — an unnamed tablist is unusable. */
|
|
50
|
+
ariaLabel: string;
|
|
51
|
+
/** Selected item id. Drives `aria-selected`, the active pill, and the collapsed trigger's label. */
|
|
52
|
+
activeId?: string;
|
|
53
|
+
/**
|
|
54
|
+
* `"tabs"` renders `role="tablist"` / `role="tab"`; `"nav"` renders a plain
|
|
55
|
+
* list of links. Pick by what the items DO: a tab swaps a panel in place, a
|
|
56
|
+
* nav item navigates away. The collapsed dropdown is a `listbox` either way,
|
|
57
|
+
* because a `<select>`-shaped control is what a collapsed row reads as.
|
|
58
|
+
*/
|
|
59
|
+
variant?: "tabs" | "nav";
|
|
60
|
+
/** Collapsed trigger text when nothing is selected. */
|
|
61
|
+
placeholder?: string;
|
|
62
|
+
searchPlaceholder?: string;
|
|
63
|
+
noResultsText?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Skip measurement and always render collapsed. For sets known to be large
|
|
66
|
+
* at author time; the measured path is the default and is preferred.
|
|
67
|
+
*/
|
|
68
|
+
alwaysCollapsed?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Component used to render `href` items. Defaults to `next/link`.
|
|
71
|
+
*
|
|
72
|
+
* 🛑 Not a raw `<a>`, and the default is load-bearing: a plain anchor does a
|
|
73
|
+
* FULL PAGE LOAD, so a row of category links silently drops client-side
|
|
74
|
+
* navigation and every click re-downloads the document. Override it only to
|
|
75
|
+
* supply a locale-aware link (the consumer's `@/i18n/navigation` `Link`),
|
|
76
|
+
* never to go back to an anchor.
|
|
77
|
+
*/
|
|
78
|
+
linkAs?: React.ElementType;
|
|
79
|
+
/**
|
|
80
|
+
* Extra props spread onto every `href` item's link.
|
|
81
|
+
*
|
|
82
|
+
* The case this exists for is `scroll={false}`: a tab bar that swaps a panel
|
|
83
|
+
* must NOT jump the page to the top on every click, and the app mounts a
|
|
84
|
+
* global `<ScrollToTop>` keyed on pathname, so opting out per-link is the
|
|
85
|
+
* documented escape hatch. Also carries `prefetch`.
|
|
86
|
+
*/
|
|
87
|
+
linkProps?: OverflowRowLinkProps;
|
|
88
|
+
/** Applied to the outer shell. */
|
|
89
|
+
className?: string;
|
|
90
|
+
}
|
|
91
|
+
export declare function OverflowRow({ items, ariaLabel, activeId, variant, placeholder, searchPlaceholder, noResultsText, alwaysCollapsed, linkAs: Link, linkProps, className, }: OverflowRowProps): React.JSX.Element;
|
|
92
|
+
export default OverflowRow;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/*
|
|
4
|
+
* WHY: A pill/tab row that is wider than its container has, until now, been
|
|
5
|
+
* solved three different ways in this codebase and badly in all of them:
|
|
6
|
+
* seven rows were a bare `overflow-x-auto` with NO affordance (the
|
|
7
|
+
* Subcategories row shipped 12 pills on a 1440px viewport with the last
|
|
8
|
+
* four simply unreachable), six went through `TabBarShell`'s scroll
|
|
9
|
+
* arrows, and `Tabs` collapsed to a native `<select>` on a hard-coded
|
|
10
|
+
* count of 5 — a threshold that is wrong in both directions, since four
|
|
11
|
+
* long labels overflow a phone and eight short ones fit a desktop.
|
|
12
|
+
*
|
|
13
|
+
* Width is the only honest input. This measures it.
|
|
14
|
+
*
|
|
15
|
+
* WHAT: A row of items that renders as pills while they fit and becomes a
|
|
16
|
+
* single searchable, keyboard-navigable dropdown when they do not.
|
|
17
|
+
* Every item may carry a leading visual (cover image, lucide glyph,
|
|
18
|
+
* status dot) which is shown in BOTH states.
|
|
19
|
+
*
|
|
20
|
+
* EXPORTS: OverflowRow, OverflowRowProps, OverflowRowItem
|
|
21
|
+
*
|
|
22
|
+
* @tag domain:ui
|
|
23
|
+
* @tag layer:ui
|
|
24
|
+
* @tag pattern:none
|
|
25
|
+
* @tag access:client
|
|
26
|
+
* @tag sideEffects:dom-measurement
|
|
27
|
+
*/
|
|
28
|
+
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
29
|
+
import NextLink from "next/link.js";
|
|
30
|
+
import { Check, ChevronDown, Search } from "lucide-react";
|
|
31
|
+
import { Avatar } from "./Avatar.js";
|
|
32
|
+
import { Icon } from "./Icon.js";
|
|
33
|
+
import { Input } from "./Input.js";
|
|
34
|
+
import { useRowCollapse } from "./row-collapse.js";
|
|
35
|
+
const UI_OVERFLOW_ROW = {
|
|
36
|
+
shell: "appkit-overflow-row",
|
|
37
|
+
row: "appkit-overflow-row__row",
|
|
38
|
+
pill: "appkit-overflow-row__pill",
|
|
39
|
+
pillActive: "appkit-overflow-row__pill--active",
|
|
40
|
+
count: "appkit-overflow-row__count",
|
|
41
|
+
visual: "appkit-overflow-row__visual",
|
|
42
|
+
dot: "appkit-overflow-row__dot",
|
|
43
|
+
emoji: "appkit-overflow-row__emoji",
|
|
44
|
+
trigger: "appkit-overflow-row__trigger",
|
|
45
|
+
triggerLabel: "appkit-overflow-row__trigger-label",
|
|
46
|
+
popover: "appkit-overflow-row__popover",
|
|
47
|
+
search: "appkit-overflow-row__search",
|
|
48
|
+
list: "appkit-overflow-row__list",
|
|
49
|
+
option: "appkit-overflow-row__option",
|
|
50
|
+
optionActive: "appkit-overflow-row__option--active",
|
|
51
|
+
optionSelected: "appkit-overflow-row__option--selected",
|
|
52
|
+
optionLabel: "appkit-overflow-row__option-label",
|
|
53
|
+
optionCount: "appkit-overflow-row__option-count",
|
|
54
|
+
empty: "appkit-overflow-row__empty",
|
|
55
|
+
check: "appkit-overflow-row__check",
|
|
56
|
+
};
|
|
57
|
+
function visualOf(item, size) {
|
|
58
|
+
if (item.imageUrl) {
|
|
59
|
+
return (_jsx(Avatar, { src: item.imageUrl, name: item.label, size: "xs", className: UI_OVERFLOW_ROW.visual }));
|
|
60
|
+
}
|
|
61
|
+
if (item.iconName) {
|
|
62
|
+
return _jsx(Icon, { name: item.iconName, size: size === "pill" ? "sm" : "md", tone: "current" });
|
|
63
|
+
}
|
|
64
|
+
if (item.emoji) {
|
|
65
|
+
return (_jsx("span", { className: UI_OVERFLOW_ROW.emoji, "aria-hidden": "true", children: item.emoji }));
|
|
66
|
+
}
|
|
67
|
+
if (item.dotTone) {
|
|
68
|
+
return _jsx("span", { className: UI_OVERFLOW_ROW.dot, "data-tone": item.dotTone, "aria-hidden": "true" });
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/** Stable signature of the item set — invalidates the cached natural width when the set changes. */
|
|
73
|
+
function signatureOf(items) {
|
|
74
|
+
return items.map((i) => `${i.id}:${i.label}:${i.count ?? ""}`).join("|");
|
|
75
|
+
}
|
|
76
|
+
export function OverflowRow({ items, ariaLabel, activeId, variant = "tabs", placeholder, searchPlaceholder = "Search…", noResultsText = "No matches", alwaysCollapsed = false, linkAs: Link = NextLink, linkProps, className = "", }) {
|
|
77
|
+
const shellRef = useRef(null);
|
|
78
|
+
const rowRef = useRef(null);
|
|
79
|
+
const triggerRef = useRef(null);
|
|
80
|
+
const searchRef = useRef(null);
|
|
81
|
+
const listboxId = useId();
|
|
82
|
+
const [open, setOpen] = useState(false);
|
|
83
|
+
const [query, setQuery] = useState("");
|
|
84
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
85
|
+
const signature = useMemo(() => signatureOf(items), [items]);
|
|
86
|
+
const collapsed = useRowCollapse(shellRef, rowRef, signature, {
|
|
87
|
+
disabled: alwaysCollapsed,
|
|
88
|
+
initial: alwaysCollapsed,
|
|
89
|
+
});
|
|
90
|
+
// Close on outside click.
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!open)
|
|
93
|
+
return;
|
|
94
|
+
const onDown = (event) => {
|
|
95
|
+
if (!shellRef.current?.contains(event.target))
|
|
96
|
+
setOpen(false);
|
|
97
|
+
};
|
|
98
|
+
document.addEventListener("mousedown", onDown);
|
|
99
|
+
return () => document.removeEventListener("mousedown", onDown);
|
|
100
|
+
}, [open]);
|
|
101
|
+
// Focus the search field on open — the whole point of collapsing is that the
|
|
102
|
+
// set is too big to scan, so typing must work without a second click.
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (open)
|
|
105
|
+
searchRef.current?.focus();
|
|
106
|
+
else {
|
|
107
|
+
setQuery("");
|
|
108
|
+
setActiveIndex(0);
|
|
109
|
+
}
|
|
110
|
+
}, [open]);
|
|
111
|
+
const filtered = useMemo(() => {
|
|
112
|
+
const q = query.trim().toLowerCase();
|
|
113
|
+
if (!q)
|
|
114
|
+
return items;
|
|
115
|
+
return items.filter((item) => item.label.toLowerCase().includes(q));
|
|
116
|
+
}, [items, query]);
|
|
117
|
+
const activeItem = items.find((item) => item.id === activeId);
|
|
118
|
+
const commit = useCallback((item) => {
|
|
119
|
+
if (item.disabled)
|
|
120
|
+
return;
|
|
121
|
+
item.onSelect?.();
|
|
122
|
+
setOpen(false);
|
|
123
|
+
}, []);
|
|
124
|
+
const onSearchKeyDown = (event) => {
|
|
125
|
+
const count = filtered.length;
|
|
126
|
+
if (event.key === "Escape") {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
setOpen(false);
|
|
129
|
+
triggerRef.current?.focus();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!count)
|
|
133
|
+
return;
|
|
134
|
+
if (event.key === "ArrowDown") {
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
setActiveIndex((prev) => (prev + 1) % count);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (event.key === "ArrowUp") {
|
|
140
|
+
event.preventDefault();
|
|
141
|
+
setActiveIndex((prev) => (prev - 1 + count) % count);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (event.key === "Home") {
|
|
145
|
+
event.preventDefault();
|
|
146
|
+
setActiveIndex(0);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (event.key === "End") {
|
|
150
|
+
event.preventDefault();
|
|
151
|
+
setActiveIndex(count - 1);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (event.key === "Enter") {
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
const item = filtered[Math.min(activeIndex, count - 1)];
|
|
157
|
+
if (!item)
|
|
158
|
+
return;
|
|
159
|
+
if (item.href) {
|
|
160
|
+
window.location.assign(item.href);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
commit(item);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
const hasAnyVisual = items.some((item) => item.imageUrl || item.iconName || item.emoji || item.dotTone);
|
|
167
|
+
// ── Collapsed: one searchable dropdown ──────────────────────────────────
|
|
168
|
+
if (collapsed) {
|
|
169
|
+
return (_jsxs("div", { ref: shellRef, className: [UI_OVERFLOW_ROW.shell, className].filter(Boolean).join(" "), "data-collapsed": "true", children: [_jsxs("button", { ref: triggerRef, type: "button", className: UI_OVERFLOW_ROW.trigger, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listboxId : undefined, "aria-label": ariaLabel, onClick: () => setOpen((prev) => !prev), onKeyDown: (event) => {
|
|
170
|
+
if (!open && (event.key === "ArrowDown" || event.key === "Enter")) {
|
|
171
|
+
event.preventDefault();
|
|
172
|
+
setOpen(true);
|
|
173
|
+
}
|
|
174
|
+
}, children: [activeItem ? visualOf(activeItem, "pill") : null, _jsx("span", { className: UI_OVERFLOW_ROW.triggerLabel, children: activeItem?.label ?? placeholder ?? ariaLabel }), items.length > 0 && (_jsx("span", { className: UI_OVERFLOW_ROW.count, children: items.length })), _jsx(ChevronDown, { className: "w-4 h-4", "aria-hidden": "true" })] }), open && (_jsxs("div", { className: UI_OVERFLOW_ROW.popover, children: [_jsx("div", { className: UI_OVERFLOW_ROW.search, children: _jsx(Input, { ref: searchRef, type: "search", value: query, placeholder: searchPlaceholder, "aria-label": searchPlaceholder, "aria-controls": listboxId, "aria-activedescendant": filtered[activeIndex] ? `${listboxId}-${filtered[activeIndex].id}` : undefined, icon: _jsx(Search, { className: "w-4 h-4", "aria-hidden": "true" }), onChange: (event) => {
|
|
175
|
+
setQuery(event.target.value);
|
|
176
|
+
setActiveIndex(0);
|
|
177
|
+
}, onKeyDown: onSearchKeyDown }) }), _jsxs("div", { id: listboxId, role: "listbox", "aria-label": ariaLabel, className: UI_OVERFLOW_ROW.list, children: [filtered.length === 0 && (_jsx("div", { className: UI_OVERFLOW_ROW.empty, children: noResultsText })), filtered.map((item, index) => {
|
|
178
|
+
const isSelected = item.id === activeId;
|
|
179
|
+
const classes = [
|
|
180
|
+
UI_OVERFLOW_ROW.option,
|
|
181
|
+
index === activeIndex ? UI_OVERFLOW_ROW.optionActive : "",
|
|
182
|
+
isSelected ? UI_OVERFLOW_ROW.optionSelected : "",
|
|
183
|
+
]
|
|
184
|
+
.filter(Boolean)
|
|
185
|
+
.join(" ");
|
|
186
|
+
const body = (_jsxs(_Fragment, { children: [hasAnyVisual ? visualOf(item, "option") : null, _jsx("span", { className: UI_OVERFLOW_ROW.optionLabel, children: item.label }), typeof item.count === "number" && (_jsx("span", { className: UI_OVERFLOW_ROW.optionCount, children: item.count > 99 ? "99+" : item.count })), isSelected && (_jsx(Check, { className: `w-4 h-4 ${UI_OVERFLOW_ROW.check}`, "aria-hidden": "true" }))] }));
|
|
187
|
+
return item.href ? (_jsx(Link, { ...linkProps, id: `${listboxId}-${item.id}`, role: "option", "aria-selected": isSelected, href: item.href, className: classes, onMouseEnter: () => setActiveIndex(index), children: body }, item.id)) : (_jsx("button", { id: `${listboxId}-${item.id}`, role: "option", type: "button", "aria-selected": isSelected, disabled: item.disabled, className: classes, onClick: () => commit(item), onMouseEnter: () => setActiveIndex(index), children: body }, item.id));
|
|
188
|
+
})] })] }))] }));
|
|
189
|
+
}
|
|
190
|
+
// ── Expanded: the pill row ──────────────────────────────────────────────
|
|
191
|
+
return (_jsx("div", { ref: shellRef, className: [UI_OVERFLOW_ROW.shell, className].filter(Boolean).join(" "), "data-collapsed": "false", children: _jsx("div", { ref: rowRef, className: UI_OVERFLOW_ROW.row, role: variant === "tabs" ? "tablist" : undefined, "aria-label": ariaLabel, children: items.map((item) => {
|
|
192
|
+
const isActive = item.id === activeId;
|
|
193
|
+
const classes = [
|
|
194
|
+
UI_OVERFLOW_ROW.pill,
|
|
195
|
+
isActive ? UI_OVERFLOW_ROW.pillActive : "",
|
|
196
|
+
]
|
|
197
|
+
.filter(Boolean)
|
|
198
|
+
.join(" ");
|
|
199
|
+
const body = (_jsxs(_Fragment, { children: [visualOf(item, "pill"), item.label, typeof item.count === "number" && (_jsx("span", { className: UI_OVERFLOW_ROW.count, children: item.count > 99 ? "99+" : item.count }))] }));
|
|
200
|
+
return item.href ? (_jsx(Link, { ...linkProps, href: item.href, className: classes, role: variant === "tabs" ? "tab" : undefined, "aria-selected": variant === "tabs" ? isActive : undefined, "aria-current": variant === "nav" && isActive ? "page" : undefined, children: body }, item.id)) : (_jsx("button", { type: "button", className: classes, role: variant === "tabs" ? "tab" : undefined, "aria-selected": variant === "tabs" ? isActive : undefined, disabled: item.disabled, onClick: () => commit(item), children: body }, item.id));
|
|
201
|
+
}) }) }));
|
|
202
|
+
}
|
|
203
|
+
export default OverflowRow;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OverflowRow — pill row that becomes a searchable dropdown when it overflows.
|
|
3
|
+
*
|
|
4
|
+
* All tokens live here rather than on the call site's className. The expanded
|
|
5
|
+
* and collapsed states are selected by `[data-collapsed]` written from JS, NOT
|
|
6
|
+
* by a media query: the decision is a width MEASUREMENT against the row's own
|
|
7
|
+
* content, which no breakpoint can express (four long labels overflow a phone;
|
|
8
|
+
* eight short ones fit a desktop).
|
|
9
|
+
*
|
|
10
|
+
* 🛑 Do not express the two states as Tailwind `md:`/`lg:` overrides. appkit's
|
|
11
|
+
* Tailwind build emits NO variant-prefixed utility (see the measured note in
|
|
12
|
+
* src/tailwind-input.css), so such a rule compiles to nothing and the element
|
|
13
|
+
* silently keeps its base style.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
.appkit-overflow-row {
|
|
17
|
+
position: relative;
|
|
18
|
+
width: 100%;
|
|
19
|
+
min-width: 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* ── Expanded ─────────────────────────────────────────────────────────── */
|
|
23
|
+
|
|
24
|
+
.appkit-overflow-row__row {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: var(--appkit-space-2);
|
|
28
|
+
min-width: 0;
|
|
29
|
+
/*
|
|
30
|
+
* No `overflow-x: auto`. A scrollbar here would let the row satisfy its
|
|
31
|
+
* container at any width, so `scrollWidth` would still exceed `clientWidth`
|
|
32
|
+
* but nothing would ever look broken enough to collapse — the measurement
|
|
33
|
+
* and the visible truth must agree.
|
|
34
|
+
*/
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.appkit-overflow-row__pill {
|
|
38
|
+
display: inline-flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
flex-shrink: 0;
|
|
41
|
+
gap: var(--appkit-space-1-5);
|
|
42
|
+
padding: var(--appkit-space-1-5) var(--appkit-space-4);
|
|
43
|
+
border: 1px solid var(--appkit-color-border);
|
|
44
|
+
border-radius: var(--appkit-radius-full);
|
|
45
|
+
background: var(--appkit-color-surface-elevated);
|
|
46
|
+
color: var(--appkit-color-text-muted);
|
|
47
|
+
font-size: var(--appkit-text-sm);
|
|
48
|
+
font-weight: 500;
|
|
49
|
+
line-height: 1.25;
|
|
50
|
+
white-space: nowrap;
|
|
51
|
+
text-decoration: none;
|
|
52
|
+
transition: color var(--appkit-duration-fast) var(--appkit-ease-out),
|
|
53
|
+
border-color var(--appkit-duration-fast) var(--appkit-ease-out),
|
|
54
|
+
background-color var(--appkit-duration-fast) var(--appkit-ease-out);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.appkit-overflow-row__pill:hover {
|
|
58
|
+
border-color: var(--appkit-color-primary);
|
|
59
|
+
color: var(--appkit-color-primary);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.appkit-overflow-row__pill:disabled {
|
|
63
|
+
opacity: 0.5;
|
|
64
|
+
cursor: not-allowed;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.appkit-overflow-row__pill--active {
|
|
68
|
+
border-color: var(--appkit-color-primary);
|
|
69
|
+
background: var(--appkit-color-primary-surface);
|
|
70
|
+
color: var(--appkit-color-primary);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* ── Leading visuals ──────────────────────────────────────────────────── */
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Sized here rather than by Avatar's own `--xs`, which is a face-sized box.
|
|
77
|
+
* A pill's visual is an identifying mark at text scale: it must not grow the
|
|
78
|
+
* pill's line-box, or every row in the app gets taller.
|
|
79
|
+
*/
|
|
80
|
+
.appkit-overflow-row__visual {
|
|
81
|
+
width: 1.125rem;
|
|
82
|
+
height: 1.125rem;
|
|
83
|
+
flex-shrink: 0;
|
|
84
|
+
font-size: var(--appkit-text-2xs);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.appkit-overflow-row__emoji {
|
|
88
|
+
line-height: 1;
|
|
89
|
+
flex-shrink: 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.appkit-overflow-row__dot {
|
|
93
|
+
width: 0.5rem;
|
|
94
|
+
height: 0.5rem;
|
|
95
|
+
border-radius: var(--appkit-radius-full);
|
|
96
|
+
flex-shrink: 0;
|
|
97
|
+
background: var(--appkit-color-text-faint);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.appkit-overflow-row__dot[data-tone="primary"] { background: var(--appkit-color-primary); }
|
|
101
|
+
.appkit-overflow-row__dot[data-tone="success"] { background: var(--appkit-color-success); }
|
|
102
|
+
.appkit-overflow-row__dot[data-tone="warning"] { background: var(--appkit-color-warning); }
|
|
103
|
+
.appkit-overflow-row__dot[data-tone="error"] { background: var(--appkit-color-error); }
|
|
104
|
+
.appkit-overflow-row__dot[data-tone="info"] { background: var(--appkit-color-info); }
|
|
105
|
+
.appkit-overflow-row__dot[data-tone="muted"] { background: var(--appkit-color-text-faint); }
|
|
106
|
+
|
|
107
|
+
/*
|
|
108
|
+
* `opacity` rather than a literal colour so the count stays legible on both
|
|
109
|
+
* the inactive (surface) and active (primary tint) pill — a fixed colour is
|
|
110
|
+
* invisible against one of them in some theme (Root Cause #67).
|
|
111
|
+
*/
|
|
112
|
+
.appkit-overflow-row__count {
|
|
113
|
+
font-size: var(--appkit-text-xs);
|
|
114
|
+
font-variant-numeric: tabular-nums;
|
|
115
|
+
opacity: 0.7;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* ── Collapsed trigger ────────────────────────────────────────────────── */
|
|
119
|
+
|
|
120
|
+
.appkit-overflow-row__trigger {
|
|
121
|
+
display: inline-flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
gap: var(--appkit-space-2);
|
|
124
|
+
max-width: 100%;
|
|
125
|
+
padding: var(--appkit-space-2) var(--appkit-space-3);
|
|
126
|
+
border: 1px solid var(--appkit-color-border);
|
|
127
|
+
border-radius: var(--appkit-radius-lg);
|
|
128
|
+
background: var(--appkit-color-surface-elevated);
|
|
129
|
+
color: var(--appkit-color-text);
|
|
130
|
+
font-size: var(--appkit-text-sm);
|
|
131
|
+
font-weight: 500;
|
|
132
|
+
line-height: 1.25;
|
|
133
|
+
cursor: pointer;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.appkit-overflow-row__trigger:hover {
|
|
137
|
+
border-color: var(--appkit-color-primary);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.appkit-overflow-row__trigger-label {
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
text-overflow: ellipsis;
|
|
143
|
+
white-space: nowrap;
|
|
144
|
+
min-width: 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* ── Popover ──────────────────────────────────────────────────────────── */
|
|
148
|
+
|
|
149
|
+
.appkit-overflow-row__popover {
|
|
150
|
+
position: absolute;
|
|
151
|
+
z-index: var(--appkit-z-dropdown);
|
|
152
|
+
top: calc(100% + var(--appkit-space-1));
|
|
153
|
+
left: 0;
|
|
154
|
+
width: min(22rem, 100%);
|
|
155
|
+
display: flex;
|
|
156
|
+
flex-direction: column;
|
|
157
|
+
border: 1px solid var(--appkit-color-border);
|
|
158
|
+
border-radius: var(--appkit-radius-lg);
|
|
159
|
+
background: var(--appkit-color-surface-elevated);
|
|
160
|
+
box-shadow: var(--appkit-shadow-lg);
|
|
161
|
+
overflow: hidden;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.appkit-overflow-row__search {
|
|
165
|
+
padding: var(--appkit-space-2);
|
|
166
|
+
border-bottom: 1px solid var(--appkit-color-border-subtle);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.appkit-overflow-row__list {
|
|
170
|
+
max-height: 18rem;
|
|
171
|
+
overflow-y: auto;
|
|
172
|
+
padding: var(--appkit-space-1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.appkit-overflow-row__option {
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
gap: var(--appkit-space-2);
|
|
179
|
+
width: 100%;
|
|
180
|
+
padding: var(--appkit-space-2) var(--appkit-space-2-5);
|
|
181
|
+
border: 0;
|
|
182
|
+
border-radius: var(--appkit-radius-md);
|
|
183
|
+
background: transparent;
|
|
184
|
+
color: var(--appkit-color-text);
|
|
185
|
+
font-size: var(--appkit-text-sm);
|
|
186
|
+
text-align: left;
|
|
187
|
+
text-decoration: none;
|
|
188
|
+
cursor: pointer;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.appkit-overflow-row__option:disabled {
|
|
192
|
+
opacity: 0.5;
|
|
193
|
+
cursor: not-allowed;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
* Hover and keyboard focus resolve to the SAME class, set from `activeIndex`
|
|
198
|
+
* on both `onMouseEnter` and the arrow keys — two different highlights in one
|
|
199
|
+
* list is what makes a combobox feel like it has two cursors.
|
|
200
|
+
*/
|
|
201
|
+
.appkit-overflow-row__option--active {
|
|
202
|
+
background: var(--appkit-color-surface-hover);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.appkit-overflow-row__option--selected {
|
|
206
|
+
color: var(--appkit-color-primary);
|
|
207
|
+
font-weight: 600;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.appkit-overflow-row__option-label {
|
|
211
|
+
flex: 1 1 auto;
|
|
212
|
+
min-width: 0;
|
|
213
|
+
overflow: hidden;
|
|
214
|
+
text-overflow: ellipsis;
|
|
215
|
+
white-space: nowrap;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.appkit-overflow-row__option-count {
|
|
219
|
+
font-size: var(--appkit-text-xs);
|
|
220
|
+
font-variant-numeric: tabular-nums;
|
|
221
|
+
color: var(--appkit-color-text-muted);
|
|
222
|
+
flex-shrink: 0;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.appkit-overflow-row__check {
|
|
226
|
+
flex-shrink: 0;
|
|
227
|
+
color: var(--appkit-color-primary);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.appkit-overflow-row__empty {
|
|
231
|
+
padding: var(--appkit-space-4);
|
|
232
|
+
text-align: center;
|
|
233
|
+
font-size: var(--appkit-text-sm);
|
|
234
|
+
color: var(--appkit-color-text-muted);
|
|
235
|
+
}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
|
|
3
|
+
/*
|
|
4
|
+
* 🛑 This was `from "../index"` — the component importing its own barrel,
|
|
5
|
+
* while also importing `features/media/MediaImage`. That made `ui/index.ts`
|
|
6
|
+
* depend on a module that depends on it, the last two-module knot in
|
|
7
|
+
* `audit-import-cycles`. Every symbol is one directory away.
|
|
8
|
+
*/
|
|
9
|
+
import { ActionRow } from "./ActionRow.js";
|
|
10
|
+
import { Anchor } from "./Anchor.js";
|
|
11
|
+
import { Badge } from "./Badge.js";
|
|
12
|
+
import { Code } from "./Semantic.js";
|
|
13
|
+
import { Div } from "./Div.js";
|
|
14
|
+
import { Modal } from "./Modal.js";
|
|
15
|
+
import { Row, Stack } from "./Layout.js";
|
|
16
|
+
import { Text } from "./Typography.js";
|
|
4
17
|
import { MediaImage } from "../../features/media/MediaImage.js";
|
|
5
18
|
export function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, extra, metadata, footer, }) {
|
|
6
19
|
const hasMetadata = Boolean(metadata && Object.keys(metadata).length > 0);
|
|
@@ -5,7 +5,11 @@ import { createPortal } from "react-dom";
|
|
|
5
5
|
import { MoreHorizontal } from "lucide-react";
|
|
6
6
|
import { Button } from "./Button.js";
|
|
7
7
|
import { Span } from "./Typography.js";
|
|
8
|
-
|
|
8
|
+
// Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
|
|
9
|
+
// `react/index.ts` re-exported into each other, which is the whole of
|
|
10
|
+
// `audit-import-cycles` component 1: an 18-module knot held together entirely
|
|
11
|
+
// by barrel hops, none of which needed the barrel.
|
|
12
|
+
import { useKeyPress } from "../../react/hooks/useKeyPress.js";
|
|
9
13
|
export function RowActionMenu({ actions, align = "right", }) {
|
|
10
14
|
const [open, setOpen] = useState(false);
|
|
11
15
|
const [pos, setPos] = useState(null);
|