@mohasinac/appkit 4.57.0 → 4.58.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.
Files changed (134) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/server/features/beys/data.d.ts +44 -0
  3. package/dist/_internal/server/features/beys/data.js +107 -0
  4. package/dist/_internal/server/features/beys/og.d.ts +42 -0
  5. package/dist/_internal/server/features/beys/og.js +89 -0
  6. package/dist/_internal/server/features/parts/data.js +3 -2
  7. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  8. package/dist/_internal/shared/actions/action-registry.js +86 -0
  9. package/dist/client.d.ts +2 -0
  10. package/dist/client.js +1 -0
  11. package/dist/constants/api-endpoints.d.ts +12 -0
  12. package/dist/constants/api-endpoints.js +10 -0
  13. package/dist/constants/field-names.d.ts +46 -0
  14. package/dist/constants/field-names.js +46 -0
  15. package/dist/features/admin/components/AdminBeysView.d.ts +27 -0
  16. package/dist/features/admin/components/AdminBeysView.js +178 -0
  17. package/dist/features/admin/components/AdminPartsView.d.ts +27 -0
  18. package/dist/features/admin/components/AdminPartsView.js +160 -0
  19. package/dist/features/admin/components/OwnerQuickActions.d.ts +19 -2
  20. package/dist/features/admin/components/OwnerQuickActions.js +31 -3
  21. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +31 -0
  22. package/dist/features/admin/components/RecordOwnerQuickActions.js +128 -0
  23. package/dist/features/admin/components/ReferenceRecordEditor.d.ts +45 -0
  24. package/dist/features/admin/components/ReferenceRecordEditor.js +153 -0
  25. package/dist/features/admin/schemas/firestore.d.ts +1 -1
  26. package/dist/features/auctions/components/MarketplaceAuctionCard.js +15 -2
  27. package/dist/features/auth/permissions/constants.d.ts +1 -1
  28. package/dist/features/auth/permissions/constants.js +12 -1
  29. package/dist/features/beys/components/BeyDetailPageView.d.ts +50 -0
  30. package/dist/features/beys/components/BeyDetailPageView.js +98 -0
  31. package/dist/features/beys/schemas/firestore.d.ts +417 -0
  32. package/dist/features/beys/schemas/firestore.js +65 -0
  33. package/dist/features/blog/components/BlogFeaturedCard.js +15 -2
  34. package/dist/features/blog/components/BlogPostView.js +2 -2
  35. package/dist/features/categories/components/BrandDetailPageView.js +4 -2
  36. package/dist/features/categories/components/BundleDetailView.js +2 -2
  37. package/dist/features/categories/components/CategoryDetailPageView.js +36 -3
  38. package/dist/features/categories/components/CategoryGrid.js +24 -2
  39. package/dist/features/categories/components/FranchiseDetailPageView.js +2 -3
  40. package/dist/features/events/components/EventCard.js +15 -2
  41. package/dist/features/grouped/components/GroupedListingDetailView.js +2 -3
  42. package/dist/features/homepage/components/CustomCardsSection.js +67 -50
  43. package/dist/features/homepage/components/ShopByCategorySection.js +23 -10
  44. package/dist/features/homepage/schemas/index.d.ts +10 -10
  45. package/dist/features/parts/components/PartDetailPageView.js +5 -3
  46. package/dist/features/parts/components/PartsSearchBox.js +79 -4
  47. package/dist/features/parts/schemas/admin-edit.d.ts +81 -0
  48. package/dist/features/parts/schemas/admin-edit.js +89 -0
  49. package/dist/features/parts/schemas/firestore.d.ts +2 -1
  50. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +15 -2
  51. package/dist/features/products/components/MarketplaceBundleCard.js +15 -2
  52. package/dist/features/products/components/MarketplacePrizeDrawCard.js +15 -2
  53. package/dist/features/products/components/ProductGrid.js +18 -2
  54. package/dist/features/products/schemas/firestore.d.ts +18 -0
  55. package/dist/features/seller/components/CategoryInlineSelect.d.ts +10 -1
  56. package/dist/features/seller/components/CategoryInlineSelect.js +53 -5
  57. package/dist/features/seller/components/SellerProductShell.d.ts +39 -0
  58. package/dist/features/seller/components/SellerProductShell.js +31 -3
  59. package/dist/index.d.ts +8 -0
  60. package/dist/index.js +13 -0
  61. package/dist/next/routing/route-map.d.ts +13 -1
  62. package/dist/next/routing/route-map.js +37 -0
  63. package/dist/schemas/registry.d.ts +6 -6
  64. package/dist/seed/_helpers/category-parts-glossary-map.js +38 -38
  65. package/dist/seed/_helpers/category-parts.js +39 -39
  66. package/dist/seed/bey-products-seed-data.d.ts +18 -0
  67. package/dist/seed/bey-products-seed-data.js +18011 -0
  68. package/dist/seed/beys/chunk0.d.ts +17 -0
  69. package/dist/seed/beys/chunk0.js +36733 -0
  70. package/dist/seed/beys/chunk1.d.ts +17 -0
  71. package/dist/seed/beys/chunk1.js +35728 -0
  72. package/dist/seed/beys/chunk2.d.ts +17 -0
  73. package/dist/seed/beys/chunk2.js +35857 -0
  74. package/dist/seed/beys/chunk3.d.ts +17 -0
  75. package/dist/seed/beys/chunk3.js +34476 -0
  76. package/dist/seed/beys-seed-data.d.ts +18 -0
  77. package/dist/seed/beys-seed-data.js +11 -0
  78. package/dist/seed/homepage-sections-seed-data.js +16 -0
  79. package/dist/seed/index.d.ts +2 -0
  80. package/dist/seed/index.js +3 -0
  81. package/dist/seed/media-assets-seed-data.js +4 -4
  82. package/dist/seed/products-catalogue/chunk0.d.ts +12 -0
  83. package/dist/seed/products-catalogue/chunk0.js +7262 -0
  84. package/dist/seed/products-catalogue/chunk1.d.ts +12 -0
  85. package/dist/seed/products-catalogue/chunk1.js +7290 -0
  86. package/dist/seed/products-catalogue/chunk10.d.ts +12 -0
  87. package/dist/seed/products-catalogue/chunk10.js +7290 -0
  88. package/dist/seed/products-catalogue/chunk11.d.ts +12 -0
  89. package/dist/seed/products-catalogue/chunk11.js +7005 -0
  90. package/dist/seed/products-catalogue/chunk12.d.ts +12 -0
  91. package/dist/seed/products-catalogue/chunk12.js +7002 -0
  92. package/dist/seed/products-catalogue/chunk13.d.ts +12 -0
  93. package/dist/seed/products-catalogue/chunk13.js +7002 -0
  94. package/dist/seed/products-catalogue/chunk14.d.ts +12 -0
  95. package/dist/seed/products-catalogue/chunk14.js +7002 -0
  96. package/dist/seed/products-catalogue/chunk15.d.ts +12 -0
  97. package/dist/seed/products-catalogue/chunk15.js +7002 -0
  98. package/dist/seed/products-catalogue/chunk16.d.ts +12 -0
  99. package/dist/seed/products-catalogue/chunk16.js +7002 -0
  100. package/dist/seed/products-catalogue/chunk17.d.ts +12 -0
  101. package/dist/seed/products-catalogue/chunk17.js +7002 -0
  102. package/dist/seed/products-catalogue/chunk18.d.ts +12 -0
  103. package/dist/seed/products-catalogue/chunk18.js +4398 -0
  104. package/dist/seed/products-catalogue/chunk2.d.ts +12 -0
  105. package/dist/seed/products-catalogue/chunk2.js +7268 -0
  106. package/dist/seed/products-catalogue/chunk3.d.ts +12 -0
  107. package/dist/seed/products-catalogue/chunk3.js +7264 -0
  108. package/dist/seed/products-catalogue/chunk4.d.ts +12 -0
  109. package/dist/seed/products-catalogue/chunk4.js +7268 -0
  110. package/dist/seed/products-catalogue/chunk5.d.ts +12 -0
  111. package/dist/seed/products-catalogue/chunk5.js +7258 -0
  112. package/dist/seed/products-catalogue/chunk6.d.ts +12 -0
  113. package/dist/seed/products-catalogue/chunk6.js +7268 -0
  114. package/dist/seed/products-catalogue/chunk7.d.ts +12 -0
  115. package/dist/seed/products-catalogue/chunk7.js +7311 -0
  116. package/dist/seed/products-catalogue/chunk8.d.ts +12 -0
  117. package/dist/seed/products-catalogue/chunk8.js +7304 -0
  118. package/dist/seed/products-catalogue/chunk9.d.ts +12 -0
  119. package/dist/seed/products-catalogue/chunk9.js +7309 -0
  120. package/dist/seed/products-catalogue-seed-data.d.ts +2 -22
  121. package/dist/seed/products-catalogue-seed-data.js +58 -86382
  122. package/dist/seed/seed-purpose.js +9 -0
  123. package/dist/server.d.ts +2 -0
  124. package/dist/server.js +8 -0
  125. package/dist/styles.css +468 -1
  126. package/dist/tailwind-utilities.css +1 -1
  127. package/dist/ui/components/PosterCard.d.ts +99 -0
  128. package/dist/ui/components/PosterCard.js +109 -0
  129. package/dist/ui/components/PosterCard.style.css +466 -0
  130. package/dist/ui/components/index.style.css +1 -0
  131. package/dist/ui/index.d.ts +2 -0
  132. package/dist/ui/index.js +2 -0
  133. package/package.json +1 -1
  134. package/scripts/seed-cli.mjs +108 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { useRouter } from "next/navigation.js";
5
5
  import { z } from "zod";
@@ -46,6 +46,21 @@ const sellerProductSchema = z.object({
46
46
  title: z.string().min(1, "Product title is required").max(200),
47
47
  description: z.string().max(10000).optional().or(z.literal("")),
48
48
  price: z.number().min(0).optional(),
49
+ /*
50
+ * LOT vs SINGLE. 🛑 Declared HERE as well as on the interface, for the exact
51
+ * reason the `categoryIds` note below gives: this schema is
52
+ * `.passthrough()`, so an undeclared key survives at runtime and stays
53
+ * UNTYPED — the render site could not read `values.isLot` at all.
54
+ *
55
+ * No `.default(false)`, matching `src/validation/request-schemas.ts`: absent
56
+ * means single, and a default would write a field the seller never touched.
57
+ */
58
+ isLot: z.boolean().optional(),
59
+ /* Bounds mirror the request schema (2–999). A "lot of 1" is a single. */
60
+ lotSize: z.number().int().min(2).max(999).optional(),
61
+ /* The single-item identity, one or the other and never both. */
62
+ beyId: z.string().optional(),
63
+ partGlossaryId: z.string().optional(),
49
64
  category: z.string().optional(),
50
65
  /**
51
66
  * I2 — the assignment list, DEFAULT FIRST. `category` mirrors `[0]`.
@@ -116,9 +131,22 @@ function StepBasic({ values, onChange, renderCategorySelector, renderBrandSelect
116
131
  condition: CONDITION_OPTIONS.find((o) => o.value === (values.condition ?? "new"))?.label ?? "",
117
132
  siteName: "LetItRip",
118
133
  };
119
- return (_jsxs(Stack, { gap: "md", children: [_jsx(FormField, { name: "title", label: "Title", type: "text", value: values.title ?? "", onChange: (v) => onChange({ title: v }), placeholder: "e.g. Charizard Base Set PSA 9" }), _jsxs(FormGroup, { columns: 2, children: [renderCategorySelector ? (_jsxs(_Fragment, { children: [_jsx(Text, { className: "text-[var(--appkit-color-text)] mb-1", size: "sm", weight: "medium", children: "Category" }), renderCategorySelector({
134
+ return (_jsxs(Stack, { gap: "md", children: [_jsx(FormField, { name: "title", label: "Title", type: "text", value: values.title ?? "", onChange: (v) => onChange({ title: v }), placeholder: "e.g. Charizard Base Set PSA 9" }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: "What is in this listing?" }), _jsxs(Row, { gap: "sm", align: "center", wrap: true, children: [_jsx(Toggle, { checked: values.isLot === true, onChange: (next) => onChange(next
135
+ ? /*
136
+ * Switching TO a lot clears the single-item identity. A
137
+ * stale `beyId` would keep the listing pointing at one
138
+ * named bey while claiming to be a mixed pile — the
139
+ * contradiction the server rule exists to prevent, smuggled
140
+ * past it by a field the seller can no longer see.
141
+ */
142
+ { isLot: true, beyId: undefined, partGlossaryId: undefined }
143
+ : /* And back again drops the count, for the same reason. */
144
+ { isLot: false, lotSize: undefined }), label: values.isLot ? "A lot of several items" : "A single item", size: "sm" }), values.isLot && (_jsx(FormField, { name: "lotSize", label: "How many?", type: "number", value: values.lotSize != null ? String(values.lotSize) : "", onChange: (v) => onChange({ lotSize: v ? Number(v) : undefined }), placeholder: "optional" }))] }), _jsx(Text, { size: "xs", color: "muted", children: values.isLot
145
+ ? "A lot files under a category rather than one model, because a category is a collection — naming one model would claim every item in the pile is that model."
146
+ : "A single item can be filed against the exact bey or part it is, so buyers searching that name find it." })] }), _jsxs(FormGroup, { columns: 2, children: [renderCategorySelector ? (_jsxs(_Fragment, { children: [_jsx(Text, { className: "text-[var(--appkit-color-text)] mb-1", size: "sm", weight: "medium", children: "Category" }), renderCategorySelector({
120
147
  value: values.category ?? "",
121
148
  onChange: (v) => onChange({ category: v }),
149
+ isLot: values.isLot === true,
122
150
  /*
123
151
  * 🛑 `categoryIds[0]` is the DEFAULT assignment and is already
124
152
  * rendered by the primary picker above, so the extras list is
@@ -596,7 +624,7 @@ productId, onSave, onPublish, onDiscard, isLoading = false, storeSlug, renderCat
596
624
  label: "Basic",
597
625
  required: true,
598
626
  quick: true,
599
- fields: ["title", "description", "category", "brand", "condition", "tags", "barcodeId"],
627
+ fields: ["title", "isLot", "lotSize", "description", "category", "brand", "condition", "tags", "barcodeId"],
600
628
  render: ({ values, onChange }) => (_jsx(StepBasic, { values: values, onChange: onChange, renderCategorySelector: renderCategorySelector, renderBrandSelector: renderBrandSelector, renderTemplateSelector: renderTemplateSelector })),
601
629
  schema: sectionSchemas.basic,
602
630
  },
package/dist/index.d.ts CHANGED
@@ -2990,6 +2990,12 @@ export { taxCodesSeedData } from "./seed/index";
2990
2990
  export { PART_GLOSSARY_COLLECTION, MODEL_COMPOSITION_COLLECTION, PART_SLOT_VALUES, PART_SLOT_LABEL, ALL_PART_SLOTS, LISTING_TYPE_HAS_COMPOSITION, partSlotFromSegment, partGlossaryId, } from "./features/parts/schemas/firestore";
2991
2991
  export type { PartGlossaryDocument, ModelCompositionDocument, ModelSlot, ModelSlotMerge, PartSlot, } from "./features/parts/schemas/firestore";
2992
2992
  export { partGlossarySeedData } from "./seed/index";
2993
+ export { BEYS_COLLECTION, BEY_PRODUCTS_COLLECTION, beyId, } from "./features/beys/schemas/firestore";
2994
+ export type { BeyDocument, BeyProductDocument, BeyCompositionEntry, BeyRatings, BeyDerivationCoverage, BeyProductAssortmentEntry, } from "./features/beys/schemas/firestore";
2995
+ export { beysSeedData, BEY_SEED_COUNT } from "./seed/index";
2996
+ export { BeyDetailPageView } from "./features/beys/components/BeyDetailPageView";
2997
+ export type { BeyDetailPageViewProps, BeyListingRow } from "./features/beys/components/BeyDetailPageView";
2998
+ export { beyProductsSeedData, BEY_PRODUCT_SEED_COUNT } from "./seed/index";
2993
2999
  export { modelCompositionSeedData } from "./seed/index";
2994
3000
  export { ModelCompositionPanel } from "./features/parts/components/ModelCompositionPanel";
2995
3001
  export { PartsIndexPageView, PartClassificationPageView, } from "./features/parts/components/PartsIndexPageView";
@@ -3067,6 +3073,8 @@ export { LISTING_TYPE_CAPABILITIES, capabilityFor, canAddToCart, canBid, support
3067
3073
  export type { ListingTypeCapability } from "./_internal/shared/listing-types/capabilities";
3068
3074
  export { LISTING_TYPE_REGISTRY, pluginFor, detectListingTypeFromSlug } from "./_internal/shared/listing-types/_registry";
3069
3075
  export { OwnerQuickActions } from "./features/admin/components/OwnerQuickActions";
3076
+ export { RecordOwnerQuickActions } from "./features/admin/components/RecordOwnerQuickActions";
3077
+ export type { RecordOwnerQuickActionsProps, RecordQuickActionResource } from "./features/admin/components/RecordOwnerQuickActions";
3070
3078
  export type { OwnerQuickActionsProps, OwnerQuickActionsResource } from "./features/admin/components/OwnerQuickActions";
3071
3079
  export type { ListingTypePlugin } from "./_internal/shared/listing-types/_registry";
3072
3080
  export { getListingRule, getCategoryRule, pickOrderType, getSplitKey, runSyncPreflight, CHECKOUT_RULES, CATEGORY_CHECKOUT_RULES, CHECKOUT_MAX_ORDERS_PER_TX, PRIZE_DRAW_MAX_REVEALS_PER_ORDER, BUNDLE_MAX_QTY_PER_TX, STANDARD_MAX_QTY_PER_LINE, } from "./_internal/shared/checkout/rules";
package/dist/index.js CHANGED
@@ -5403,6 +5403,18 @@ export { taxCodesSeedData } from "./seed/index.js";
5403
5403
  // E4/D12 — the collection constants and types.
5404
5404
  export { PART_GLOSSARY_COLLECTION, MODEL_COMPOSITION_COLLECTION, PART_SLOT_VALUES, PART_SLOT_LABEL, ALL_PART_SLOTS, LISTING_TYPE_HAS_COMPOSITION, partSlotFromSegment, partGlossaryId, } from "./features/parts/schemas/firestore.js";
5405
5405
  export { partGlossarySeedData } from "./seed/index.js";
5406
+ /*
5407
+ * 🛑 Exported from the MAIN barrel, not just `seed/index.ts`. `seed-cli.mjs`
5408
+ * destructures its seed data from the BARE `@mohasinac/appkit` package, which
5409
+ * resolves through THIS file — so an export present only on the inner barrel is
5410
+ * invisible to the loader and the collection reports "no seed data, skipping"
5411
+ * with exit 0. That is Root Cause #90 exactly, and it is how `mediaAssets`
5412
+ * read "504 seed / 0 in db" while all 504 objects sat in the bucket.
5413
+ */
5414
+ export { BEYS_COLLECTION, BEY_PRODUCTS_COLLECTION, beyId, } from "./features/beys/schemas/firestore.js";
5415
+ export { beysSeedData, BEY_SEED_COUNT } from "./seed/index.js";
5416
+ export { BeyDetailPageView } from "./features/beys/components/BeyDetailPageView.js";
5417
+ export { beyProductsSeedData, BEY_PRODUCT_SEED_COUNT } from "./seed/index.js";
5406
5418
  export { modelCompositionSeedData } from "./seed/index.js";
5407
5419
  // D12 — the public part surfaces.
5408
5420
  export { ModelCompositionPanel } from "./features/parts/components/ModelCompositionPanel.js";
@@ -5494,6 +5506,7 @@ export { LISTING_TYPE_CAPABILITIES, capabilityFor, canAddToCart, canBid, support
5494
5506
  export { LISTING_TYPE_REGISTRY, pluginFor, detectListingTypeFromSlug } from "./_internal/shared/listing-types/_registry.js";
5495
5507
  // Pencil / clone / bin for whoever owns the record, on a PUBLIC surface.
5496
5508
  export { OwnerQuickActions } from "./features/admin/components/OwnerQuickActions.js";
5509
+ export { RecordOwnerQuickActions } from "./features/admin/components/RecordOwnerQuickActions.js";
5497
5510
  // Checkout rule registry â€" pure TS, safe in both client and server bundles.
5498
5511
  export { getListingRule, getCategoryRule, pickOrderType, getSplitKey, runSyncPreflight, CHECKOUT_RULES, CATEGORY_CHECKOUT_RULES, CHECKOUT_MAX_ORDERS_PER_TX, PRIZE_DRAW_MAX_REVEALS_PER_ORDER, BUNDLE_MAX_QTY_PER_TX, STANDARD_MAX_QTY_PER_LINE, } from "./_internal/shared/checkout/rules/index.js";
5499
5512
  // Media upload limits â€" pure constants, safe in both client and server bundles.
@@ -69,6 +69,7 @@ export declare const DEFAULT_ROUTE_MAP: {
69
69
  readonly HELP_AUCTIONS: "/help/auctions";
70
70
  readonly HELP_ORDERS: "/help/orders";
71
71
  readonly HELP_ACCOUNT: "/help/account";
72
+ readonly CREDITS: "/credits";
72
73
  readonly TERMS: "/terms";
73
74
  readonly PRIVACY: "/privacy";
74
75
  readonly ETHICS: "/ethics";
@@ -129,6 +130,7 @@ export declare const DEFAULT_ROUTE_MAP: {
129
130
  readonly PARTS: "/parts";
130
131
  readonly PART_CLASSIFICATION: (classification: string) => string;
131
132
  readonly PART_DETAIL: (classification: string, code: string) => string;
133
+ readonly BEY_DETAIL: (slug: string) => string;
132
134
  readonly SCAM_TYPES: "/scams/types";
133
135
  readonly SCAM_FAQS: "/scams/faqs";
134
136
  readonly CLASSIFIED: "/classified";
@@ -320,6 +322,10 @@ export declare const DEFAULT_ROUTE_MAP: {
320
322
  readonly CATEGORIES: "/admin/categories";
321
323
  readonly CATEGORIES_NEW: "/admin/categories/new";
322
324
  readonly CATEGORIES_EDIT: (id: string) => string;
325
+ readonly PARTS: "/admin/parts";
326
+ readonly PARTS_EDIT: (id: string) => string;
327
+ readonly BEYS: "/admin/beys";
328
+ readonly BEYS_EDIT: (id: string) => string;
323
329
  readonly BRANDS: "/admin/brands";
324
330
  readonly BRANDS_NEW: "/admin/brands/new";
325
331
  readonly BRANDS_EDIT: (id: string) => string;
@@ -504,6 +510,7 @@ export declare const ROUTES: {
504
510
  readonly HELP_AUCTIONS: "/help/auctions";
505
511
  readonly HELP_ORDERS: "/help/orders";
506
512
  readonly HELP_ACCOUNT: "/help/account";
513
+ readonly CREDITS: "/credits";
507
514
  readonly TERMS: "/terms";
508
515
  readonly PRIVACY: "/privacy";
509
516
  readonly ETHICS: "/ethics";
@@ -564,6 +571,7 @@ export declare const ROUTES: {
564
571
  readonly PARTS: "/parts";
565
572
  readonly PART_CLASSIFICATION: (classification: string) => string;
566
573
  readonly PART_DETAIL: (classification: string, code: string) => string;
574
+ readonly BEY_DETAIL: (slug: string) => string;
567
575
  readonly SCAM_TYPES: "/scams/types";
568
576
  readonly SCAM_FAQS: "/scams/faqs";
569
577
  readonly CLASSIFIED: "/classified";
@@ -755,6 +763,10 @@ export declare const ROUTES: {
755
763
  readonly CATEGORIES: "/admin/categories";
756
764
  readonly CATEGORIES_NEW: "/admin/categories/new";
757
765
  readonly CATEGORIES_EDIT: (id: string) => string;
766
+ readonly PARTS: "/admin/parts";
767
+ readonly PARTS_EDIT: (id: string) => string;
768
+ readonly BEYS: "/admin/beys";
769
+ readonly BEYS_EDIT: (id: string) => string;
758
770
  readonly BRANDS: "/admin/brands";
759
771
  readonly BRANDS_NEW: "/admin/brands/new";
760
772
  readonly BRANDS_EDIT: (id: string) => string;
@@ -970,6 +982,6 @@ export declare const SELLER_ROUTES: {
970
982
  readonly GUIDE_CAPABILITIES: "/store/guide/capabilities";
971
983
  readonly GUIDE_SETTINGS: "/store/guide/settings";
972
984
  };
973
- export declare const PUBLIC_ROUTES: readonly ["/", string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, "/unauthorized", "/auth/login", "/auth/register", "/auth/forgot-password", "/auth/reset-password", "/auth/verify-email"];
985
+ export declare const PUBLIC_ROUTES: readonly ["/", string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, "/unauthorized", "/auth/login", "/auth/register", "/auth/forgot-password", "/auth/reset-password", "/auth/verify-email"];
974
986
  export declare const PROTECTED_ROUTES: readonly [string, string, string, string, string, string, string];
975
987
  export declare const AUTH_ROUTES: readonly ["/auth/login", "/auth/register"];
@@ -83,6 +83,14 @@ export const DEFAULT_ROUTE_MAP = {
83
83
  HELP_AUCTIONS: "/help/auctions",
84
84
  HELP_ORDERS: "/help/orders",
85
85
  HELP_ACCOUNT: "/help/account",
86
+ /*
87
+ * 🛑 A LICENCE OBLIGATION, not a vanity page — which is why it is a route
88
+ * key and sits in PUBLIC_ROUTES. The facts across ~5,500 rows (parts, beys,
89
+ * products, characters) come from a CC-BY-SA community wiki; taking facts
90
+ * only and linking back is what keeps us clear of share-alike, and a
91
+ * link-back nobody can reach discharges nothing.
92
+ */
93
+ CREDITS: "/credits",
86
94
  TERMS: "/terms",
87
95
  PRIVACY: "/privacy",
88
96
  ETHICS: "/ethics",
@@ -194,6 +202,14 @@ export const DEFAULT_ROUTE_MAP = {
194
202
  PARTS: "/parts",
195
203
  PART_CLASSIFICATION: (classification) => `/parts/${classification}`,
196
204
  PART_DETAIL: (classification, code) => `/parts/${classification}/${code}`,
205
+ /*
206
+ * The BEY database. A reference surface like `/parts`, and a ONE-segment
207
+ * URL unlike it — a bey's id IS its slug, so the page is a direct doc read
208
+ * with no query and no index. Parts need the classification in the path
209
+ * because a code alone is ambiguous (`105` is a spin-track height in Metal
210
+ * Fight and a disc in Burst); a bey name is not.
211
+ */
212
+ BEY_DETAIL: (slug) => `/beys/${slug}`,
197
213
  SCAM_TYPES: "/scams/types",
198
214
  SCAM_FAQS: "/scams/faqs",
199
215
  CLASSIFIED: "/classified",
@@ -447,6 +463,24 @@ export const DEFAULT_ROUTE_MAP = {
447
463
  CATEGORIES: "/admin/categories",
448
464
  CATEGORIES_NEW: "/admin/categories/new",
449
465
  CATEGORIES_EDIT: (id) => `/admin/categories/${id}/edit`,
466
+ /*
467
+ * The two GENERATED reference databases — 2,488 parts and 1,988 beys.
468
+ *
469
+ * 🛑 THERE IS NO `PARTS_NEW` / `BEYS_NEW`, and that absence is the
470
+ * design. Both collections are produced by committed generators from a
471
+ * crawled corpus; a row created by hand would have no source, would not
472
+ * survive a regeneration, and would sit in a dataset whose whole value is
473
+ * that it reproduces from `appkit/src/seed/` alone. Admin may CORRECT and
474
+ * REMOVE a row — the two operations a wrong extraction needs — and adding
475
+ * one is a change to the generator.
476
+ *
477
+ * `audit-nav-page-wiring` is strict-zero on a route key with no page, so
478
+ * a key added here without its folder is a build failure, not a 404.
479
+ */
480
+ PARTS: "/admin/parts",
481
+ PARTS_EDIT: (id) => `/admin/parts/${id}/edit`,
482
+ BEYS: "/admin/beys",
483
+ BEYS_EDIT: (id) => `/admin/beys/${id}/edit`,
450
484
  BRANDS: "/admin/brands",
451
485
  BRANDS_NEW: "/admin/brands/new",
452
486
  BRANDS_EDIT: (id) => `/admin/brands/${id}/edit`,
@@ -636,6 +670,9 @@ export const PUBLIC_ROUTES = [
636
670
  ROUTES.PUBLIC.CONTACT,
637
671
  ROUTES.BLOG.LIST,
638
672
  ROUTES.PUBLIC.HELP,
673
+ /* Unauthenticated BY NECESSITY: an attribution a reader must sign in to see
674
+ * is not attribution. Same reasoning as the grievance-officer entry below. */
675
+ ROUTES.PUBLIC.CREDITS,
639
676
  ROUTES.PUBLIC.TERMS,
640
677
  ROUTES.PUBLIC.PRIVACY,
641
678
  ROUTES.PUBLIC.ETHICS,
@@ -504,15 +504,15 @@ export declare const SCHEMAS: {
504
504
  description?: string | undefined;
505
505
  textColor?: string | undefined;
506
506
  textAlign?: "center" | "left" | "right" | undefined;
507
- subtitle?: string | undefined;
508
507
  eyebrow?: string | undefined;
508
+ subtitle?: string | undefined;
509
509
  }, {
510
510
  title?: string | undefined;
511
511
  description?: string | undefined;
512
512
  textColor?: string | undefined;
513
513
  textAlign?: "center" | "left" | "right" | undefined;
514
- subtitle?: string | undefined;
515
514
  eyebrow?: string | undefined;
515
+ subtitle?: string | undefined;
516
516
  }>>;
517
517
  buttons: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
518
518
  id: import("zod").ZodOptional<import("zod").ZodString>;
@@ -571,8 +571,8 @@ export declare const SCHEMAS: {
571
571
  description?: string | undefined;
572
572
  textColor?: string | undefined;
573
573
  textAlign?: "center" | "left" | "right" | undefined;
574
- subtitle?: string | undefined;
575
574
  eyebrow?: string | undefined;
575
+ subtitle?: string | undefined;
576
576
  } | undefined;
577
577
  hover?: {
578
578
  effect: "none" | "color" | "scale" | "glow";
@@ -612,8 +612,8 @@ export declare const SCHEMAS: {
612
612
  description?: string | undefined;
613
613
  textColor?: string | undefined;
614
614
  textAlign?: "center" | "left" | "right" | undefined;
615
- subtitle?: string | undefined;
616
615
  eyebrow?: string | undefined;
616
+ subtitle?: string | undefined;
617
617
  } | undefined;
618
618
  hover?: {
619
619
  effect: "none" | "color" | "scale" | "glow";
@@ -751,8 +751,8 @@ export declare const SCHEMAS: {
751
751
  description?: string | undefined;
752
752
  textColor?: string | undefined;
753
753
  textAlign?: "center" | "left" | "right" | undefined;
754
- subtitle?: string | undefined;
755
754
  eyebrow?: string | undefined;
755
+ subtitle?: string | undefined;
756
756
  } | undefined;
757
757
  hover?: {
758
758
  effect: "none" | "color" | "scale" | "glow";
@@ -860,8 +860,8 @@ export declare const SCHEMAS: {
860
860
  description?: string | undefined;
861
861
  textColor?: string | undefined;
862
862
  textAlign?: "center" | "left" | "right" | undefined;
863
- subtitle?: string | undefined;
864
863
  eyebrow?: string | undefined;
864
+ subtitle?: string | undefined;
865
865
  } | undefined;
866
866
  hover?: {
867
867
  effect: "none" | "color" | "scale" | "glow";