@burdenoff/microfe-store 2026.625.5 → 2026.626.1

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 (184) hide show
  1. package/dist/StoreRoutes.js +3 -3
  2. package/dist/StoreRoutes.js.map +1 -1
  3. package/dist/components/AccessDenied.js +3 -3
  4. package/dist/components/AccessDenied.js.map +1 -1
  5. package/dist/components/InstallAppModal.js +175 -255
  6. package/dist/components/InstallAppModal.js.map +1 -1
  7. package/dist/components/cart/CartDrawer.js +10 -10
  8. package/dist/components/cart/CartDrawer.js.map +1 -1
  9. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/errors/CombinedGraphQLErrors.js +1 -1
  10. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  11. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/errors/utils.js +1 -1
  12. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  13. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/core/ApolloLink.js +2 -2
  14. package/dist/node_modules/@apollo/client/link/core/ApolloLink.js.map +1 -0
  15. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/subscriptions/index.js +2 -2
  16. package/dist/node_modules/@apollo/client/link/subscriptions/index.js.map +1 -0
  17. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/link/utils/createOperation.js +1 -1
  18. package/dist/node_modules/@apollo/client/link/utils/createOperation.js.map +1 -0
  19. package/dist/node_modules/@apollo/client/utilities/caching/sizes.js.map +1 -0
  20. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/graphql/print.js +1 -1
  21. package/dist/node_modules/@apollo/client/utilities/graphql/print.js.map +1 -0
  22. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/caches.js +2 -2
  23. package/dist/node_modules/@apollo/client/utilities/internal/caches.js.map +1 -0
  24. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/checkDocument.js +1 -1
  25. package/dist/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +1 -0
  26. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/getMainDefinition.js +1 -1
  27. package/dist/node_modules/@apollo/client/utilities/internal/getMainDefinition.js.map +1 -0
  28. package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js +9 -0
  29. package/dist/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js.map +1 -0
  30. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/getOperationDefinition.js +1 -1
  31. package/dist/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js.map +1 -0
  32. package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js +8 -0
  33. package/dist/node_modules/@apollo/client/utilities/internal/getOperationName.js.map +1 -0
  34. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/globals/global.js +1 -1
  35. package/dist/node_modules/@apollo/client/utilities/internal/globals/global.js.map +1 -0
  36. package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js +10 -0
  37. package/dist/node_modules/@apollo/client/utilities/internal/globals/maybe.js.map +1 -0
  38. package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js +8 -0
  39. package/dist/node_modules/@apollo/client/utilities/internal/isNonNullObject.js.map +1 -0
  40. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/makeUniqueId.js +1 -1
  41. package/dist/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +1 -0
  42. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/memoize.js +2 -2
  43. package/dist/node_modules/@apollo/client/utilities/internal/memoize.js.map +1 -0
  44. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/internal/stringifyForDisplay.js +1 -1
  45. package/dist/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +1 -0
  46. package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/invariant/index.js +1 -1
  47. package/dist/node_modules/@apollo/client/utilities/invariant/index.js.map +1 -0
  48. package/dist/node_modules/@apollo/client/version.js +6 -0
  49. package/dist/node_modules/@apollo/client/version.js.map +1 -0
  50. package/dist/node_modules/{.bun/@wry_caches@1.0.1/node_modules/@wry → @wry}/caches/lib/weak.js +1 -1
  51. package/dist/node_modules/@wry/caches/lib/weak.js.map +1 -0
  52. package/dist/node_modules/{.bun/@wry_trie@0.5.0/node_modules/@wry → @wry}/trie/lib/index.js +1 -1
  53. package/dist/node_modules/@wry/trie/lib/index.js.map +1 -0
  54. package/dist/node_modules/{.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws → graphql-ws}/dist/client.js +1 -1
  55. package/dist/node_modules/graphql-ws/dist/client.js.map +1 -0
  56. package/dist/node_modules/{.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws → graphql-ws}/dist/common-CGW11Fyb.js +1 -1
  57. package/dist/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +1 -0
  58. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/NotificationFactories.js +1 -1
  59. package/dist/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +1 -0
  60. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Observable.js +1 -1
  61. package/dist/node_modules/rxjs/dist/esm5/internal/Observable.js.map +1 -0
  62. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Subscriber.js +2 -2
  63. package/dist/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +1 -0
  64. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/Subscription.js +2 -2
  65. package/dist/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +1 -0
  66. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/config.js +1 -1
  67. package/dist/node_modules/rxjs/dist/esm5/internal/config.js.map +1 -0
  68. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/observable/empty.js +1 -1
  69. package/dist/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +1 -0
  70. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/scheduler/timeoutProvider.js +2 -2
  71. package/dist/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +1 -0
  72. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/symbol/observable.js +1 -1
  73. package/dist/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +1 -0
  74. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/UnsubscriptionError.js +1 -1
  75. package/dist/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js.map +1 -0
  76. package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +11 -0
  77. package/dist/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js.map +1 -0
  78. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/createErrorClass.js +1 -1
  79. package/dist/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +1 -0
  80. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/errorContext.js +1 -1
  81. package/dist/node_modules/rxjs/dist/esm5/internal/util/errorContext.js.map +1 -0
  82. package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js +8 -0
  83. package/dist/node_modules/rxjs/dist/esm5/internal/util/identity.js.map +1 -0
  84. package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +8 -0
  85. package/dist/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +1 -0
  86. package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js +6 -0
  87. package/dist/node_modules/rxjs/dist/esm5/internal/util/noop.js.map +1 -0
  88. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/pipe.js +1 -1
  89. package/dist/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +1 -0
  90. package/dist/node_modules/{.bun/rxjs@7.8.2/node_modules/rxjs → rxjs}/dist/esm5/internal/util/reportUnhandledError.js +1 -1
  91. package/dist/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +1 -0
  92. package/dist/node_modules/{.bun/tslib@2.8.1 → rxjs}/node_modules/tslib/tslib.es6.js +1 -1
  93. package/dist/node_modules/rxjs/node_modules/tslib/tslib.es6.js.map +1 -0
  94. package/dist/pages/AdminDashboardPage.js +118 -91
  95. package/dist/pages/AdminDashboardPage.js.map +1 -1
  96. package/dist/pages/AdminReviewModerationPage.js +67 -61
  97. package/dist/pages/AdminReviewModerationPage.js.map +1 -1
  98. package/dist/pages/AdminStoresPage.js +424 -371
  99. package/dist/pages/AdminStoresPage.js.map +1 -1
  100. package/dist/pages/AdminSubmissionsQueuePage.js +303 -286
  101. package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
  102. package/dist/pages/AppDetailPage.js +172 -135
  103. package/dist/pages/AppDetailPage.js.map +1 -1
  104. package/dist/pages/AppSettingsPage.js +83 -300
  105. package/dist/pages/AppSettingsPage.js.map +1 -1
  106. package/dist/pages/CartPage.js +71 -79
  107. package/dist/pages/CartPage.js.map +1 -1
  108. package/dist/pages/InstalledAppsPage.js +120 -337
  109. package/dist/pages/InstalledAppsPage.js.map +1 -1
  110. package/dist/pages/MarketplaceHomePage.js +196 -205
  111. package/dist/pages/MarketplaceHomePage.js.map +1 -1
  112. package/dist/pages/MyLicensesPage.js +70 -75
  113. package/dist/pages/MyLicensesPage.js.map +1 -1
  114. package/dist/pages/OrderConfirmationPage.js +70 -37
  115. package/dist/pages/OrderConfirmationPage.js.map +1 -1
  116. package/dist/pages/OrdersPage.js +60 -68
  117. package/dist/pages/OrdersPage.js.map +1 -1
  118. package/dist/pages/ProductDetailPage.js +794 -752
  119. package/dist/pages/ProductDetailPage.js.map +1 -1
  120. package/dist/pages/ProductReviewsPage.js +24 -19
  121. package/dist/pages/ProductReviewsPage.js.map +1 -1
  122. package/dist/pages/PublisherDashboardPage.js +134 -99
  123. package/dist/pages/PublisherDashboardPage.js.map +1 -1
  124. package/dist/pages/PublisherRevenuePage.js +65 -63
  125. package/dist/pages/PublisherRevenuePage.js.map +1 -1
  126. package/dist/pages/PublisherSubmissionsPage.js +120 -111
  127. package/dist/pages/PublisherSubmissionsPage.js.map +1 -1
  128. package/dist/pages/PublisherSubmitPage.js +197 -184
  129. package/dist/pages/PublisherSubmitPage.js.map +1 -1
  130. package/dist/providers/StoreProvider.js +3 -3
  131. package/package.json +2 -2
  132. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +0 -1
  133. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/errors/utils.js.map +0 -1
  134. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/core/ApolloLink.js.map +0 -1
  135. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/subscriptions/index.js.map +0 -1
  136. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/link/utils/createOperation.js.map +0 -1
  137. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/caching/sizes.js.map +0 -1
  138. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/graphql/print.js.map +0 -1
  139. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/caches.js.map +0 -1
  140. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/checkDocument.js.map +0 -1
  141. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMainDefinition.js.map +0 -1
  142. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js +0 -9
  143. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getMemoryInternals.js.map +0 -1
  144. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationDefinition.js.map +0 -1
  145. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationName.js +0 -8
  146. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/getOperationName.js.map +0 -1
  147. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/global.js.map +0 -1
  148. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/maybe.js +0 -10
  149. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/globals/maybe.js.map +0 -1
  150. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/isNonNullObject.js +0 -8
  151. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/isNonNullObject.js.map +0 -1
  152. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/makeUniqueId.js.map +0 -1
  153. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/memoize.js.map +0 -1
  154. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/internal/stringifyForDisplay.js.map +0 -1
  155. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/utilities/invariant/index.js.map +0 -1
  156. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/version.js +0 -6
  157. package/dist/node_modules/.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo/client/version.js.map +0 -1
  158. package/dist/node_modules/.bun/@wry_caches@1.0.1/node_modules/@wry/caches/lib/weak.js.map +0 -1
  159. package/dist/node_modules/.bun/@wry_trie@0.5.0/node_modules/@wry/trie/lib/index.js.map +0 -1
  160. package/dist/node_modules/.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws/dist/client.js.map +0 -1
  161. package/dist/node_modules/.bun/graphql-ws@6.0.8_796ebe57c2b0ffe0/node_modules/graphql-ws/dist/common-CGW11Fyb.js.map +0 -1
  162. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/NotificationFactories.js.map +0 -1
  163. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Observable.js.map +0 -1
  164. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Subscriber.js.map +0 -1
  165. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/Subscription.js.map +0 -1
  166. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/config.js.map +0 -1
  167. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/observable/empty.js.map +0 -1
  168. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js.map +0 -1
  169. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/symbol/observable.js.map +0 -1
  170. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js.map +0 -1
  171. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js +0 -11
  172. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/arrRemove.js.map +0 -1
  173. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js.map +0 -1
  174. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/errorContext.js.map +0 -1
  175. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/identity.js +0 -8
  176. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/identity.js.map +0 -1
  177. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +0 -8
  178. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +0 -1
  179. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/noop.js +0 -6
  180. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/noop.js.map +0 -1
  181. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/pipe.js.map +0 -1
  182. package/dist/node_modules/.bun/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js.map +0 -1
  183. package/dist/node_modules/.bun/tslib@2.8.1/node_modules/tslib/tslib.es6.js.map +0 -1
  184. /package/dist/node_modules/{.bun/@apollo_client@4.1.9_e571b0b00fd00a97/node_modules/@apollo → @apollo}/client/utilities/caching/sizes.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ProductReviewsPage.js","names":[],"sources":["../../src/pages/ProductReviewsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Star } from 'lucide-react';\nimport { useProductReviews } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nexport const ProductReviewsPage: FC = () => {\n const navigate = useNavigate();\n const { productId } = useParams<{ productId: string }>();\n const { reviews, loading, error } = useProductReviews(productId ?? '');\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-default bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.productReviews.title', { defaultValue: 'Product Reviews' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.productReviews.subtitle', {\n defaultValue: 'Moderate and inspect product feedback',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading reviews…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : reviews.length === 0 ? (\n <p className=\"text-sm text-text-muted\">No reviews found for this product.</p>\n ) : (\n <ul className=\"space-y-3\">\n {reviews.map((review) => (\n <li\n key={review.id}\n className=\"rounded-xl border border-border-default bg-bg-surface p-4\"\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-text-primary\">\n {review.title ||\n t('pages.productReviews.untitled', { defaultValue: 'Untitled review' })}\n </p>\n <span className=\"inline-flex items-center gap-1 text-sm text-text-muted\">\n <Star className=\"size-4\" /> {review.rating}/5\n </span>\n </div>\n <p className=\"mt-2 text-sm text-text-muted\">\n {review.comment ||\n t('pages.productReviews.noComment', { defaultValue: 'No comment provided.' })}\n </p>\n <p className=\"mt-2 text-xs text-text-muted\">\n Status: {review.status} • Helpful: {review.helpful}\n </p>\n </li>\n ))}\n </ul>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":";;;;;;AAMA,IAAa,UAA+B;CAC1C,IAAM,IAAW,GAAa,EACxB,EAAE,iBAAc,GAAkC,EAClD,EAAE,YAAS,YAAS,aAAU,EAAkB,KAAa,GAAG,EAChE,EAAE,SAAM,GAAS;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GAAQ,WAAU;aAChB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAS,GAAG;KAC3B,cAAW;KACX,WAAU;eAEV,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;KACzB,CAAA,EACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAE,8BAA8B,EAAE,cAAc,mBAAmB,CAAC;KAClE,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAE,iCAAiC,EAClC,cAAc,yCACf,CAAC;KACA,CAAA,CACA,EAAA,CAAA,CACF;;GACC,CAAA,EAET,kBAAC,QAAD;GAAM,WAAU;aACd,kBAAC,OAAD;IAAK,WAAU;cACZ,IACC,kBAAC,KAAD;KAAG,MAAK;KAAS,WAAU;eAA0B;KAEjD,CAAA,GACF,IACF,kBAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;eACvB,EAAM;KACL,CAAA,GACF,EAAQ,WAAW,IACrB,kBAAC,KAAD;KAAG,WAAU;eAA0B;KAAsC,CAAA,GAE7E,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAO,SACN,EAAE,iCAAiC,EAAE,cAAc,mBAAmB,CAAC;SACvE,CAAA,EACJ,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;;UAAE,EAAO;UAAO;UACtC;WACH;;OACN,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAO,WACN,EAAE,kCAAkC,EAAE,cAAc,wBAAwB,CAAC;QAC7E,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA4C;SACjC,EAAO;SAAO;SAAa,EAAO;SACzC;;OACD;QAnBE,EAAO,GAmBT,CACL;KACC,CAAA;IAEH,CAAA;GACD,CAAA,CACH"}
1
+ {"version":3,"file":"ProductReviewsPage.js","names":[],"sources":["../../src/pages/ProductReviewsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Star } from 'lucide-react';\nimport { useProductReviews } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { PagePurpose, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\n\nexport const ProductReviewsPage: FC = () => {\n const navigate = useNavigate();\n const { productId } = useParams<{ productId: string }>();\n const { reviews, loading, error } = useProductReviews(productId ?? '');\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.productReviews.title', { defaultValue: 'Product Reviews' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.productReviews.subtitle', {\n defaultValue: 'Moderate and inspect product feedback',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n <PagePurpose className=\"mb-4\">\n Read what customers think of this product in their own words. Use these ratings and\n comments to gauge quality before installing, spot recurring issues, and — as a\n moderator — keep an eye on feedback that may need a response or review.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading reviews…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : reviews.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No reviews yet\"\n description=\"This product hasn't received any reviews. Once customers leave feedback, it will appear here for you to read and moderate.\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {reviews.map((review) => (\n <li\n key={review.id}\n className=\"rounded-xl border border-border-seam bg-bg-surface p-4 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop)]\"\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-text-primary\">\n {review.title ||\n t('pages.productReviews.untitled', { defaultValue: 'Untitled review' })}\n </p>\n <span className=\"inline-flex items-center gap-1 text-sm text-text-muted\">\n <Star className=\"size-4\" /> {review.rating}/5\n </span>\n </div>\n <p className=\"mt-2 text-sm text-text-muted\">\n {review.comment ||\n t('pages.productReviews.noComment', { defaultValue: 'No comment provided.' })}\n </p>\n <p className=\"mt-2 text-xs text-text-muted\">\n Status: {review.status} • Helpful: {review.helpful}\n </p>\n </li>\n ))}\n </ul>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAOA,IAAa,UAA+B;CAC1C,IAAM,IAAW,GAAa,EACxB,EAAE,iBAAc,GAAkC,EAClD,EAAE,YAAS,YAAS,aAAU,EAAkB,KAAa,GAAG,EAChE,EAAE,SAAM,GAAS;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GAAQ,WAAU;aAChB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAS,GAAG;KAC3B,cAAW;KACX,WAAU;eAEV,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;KACzB,CAAA,EACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAE,8BAA8B,EAAE,cAAc,mBAAmB,CAAC;KAClE,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAE,iCAAiC,EAClC,cAAc,yCACf,CAAC;KACA,CAAA,CACA,EAAA,CAAA,CACF;;GACC,CAAA,EAET,kBAAC,QAAD;GAAM,WAAU;aACd,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAa,WAAU;eAAO;KAIhB,CAAA,EACb,IACC,kBAAC,KAAD;KAAG,MAAK;KAAS,WAAU;eAA0B;KAEjD,CAAA,GACF,IACF,kBAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;eACvB,EAAM;KACL,CAAA,GACF,EAAQ,WAAW,IACrB,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA,GAEF,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAO,SACN,EAAE,iCAAiC,EAAE,cAAc,mBAAmB,CAAC;SACvE,CAAA,EACJ,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;;UAAE,EAAO;UAAO;UACtC;WACH;;OACN,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAO,WACN,EAAE,kCAAkC,EAAE,cAAc,wBAAwB,CAAC;QAC7E,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA4C;SACjC,EAAO;SAAO;SAAa,EAAO;SACzC;;OACD;QAnBE,EAAO,GAmBT,CACL;KACC,CAAA,CAEH;;GACD,CAAA,CACH"}
@@ -2,159 +2,194 @@ import { useStore as e } from "../providers/StoreProvider.js";
2
2
  import { useMyPublishedProducts as t } from "../hooks/useStoreGraphQL.js";
3
3
  import { useMemo as n } from "react";
4
4
  import { useI18n as r } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
- import { ArrowLeft as i, Download as a, LineChart as o, MessageSquare as s, Package2 as c, Plus as l, Star as u } from "lucide-react";
6
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
- import { useNavigate as p } from "react-router-dom";
5
+ import { ArrowLeft as i, Download as a, LineChart as o, MessageSquare as s, Plus as c, Star as l } from "lucide-react";
6
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
+ import { useNavigate as f } from "react-router-dom";
8
+ import { EmphasisPanel as p, GlassCard as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/pages/PublisherDashboardPage.tsx
9
- var m = () => {
10
- let m = p(), { basePath: h } = e(), { t: g } = r(), { products: _, loading: v, error: y, refetch: b } = t(), x = n(() => {
11
- let e = _.length;
10
+ var v = () => {
11
+ let v = f(), { basePath: y } = e(), { t: b } = r(), { products: x, loading: S, error: C, refetch: w } = t(), T = n(() => {
12
+ let e = x.length;
12
13
  return {
13
14
  totalProducts: e,
14
- totalDownloads: _.reduce((e, t) => e + (t.downloads ?? 0), 0),
15
- avgRating: e > 0 ? _.reduce((e, t) => e + (t.rating ?? 0), 0) / e : 0
15
+ totalDownloads: x.reduce((e, t) => e + (t.downloads ?? 0), 0),
16
+ avgRating: e > 0 ? x.reduce((e, t) => e + (t.rating ?? 0), 0) / e : 0
16
17
  };
17
- }, [_]);
18
- return /* @__PURE__ */ f("div", {
18
+ }, [x]);
19
+ return /* @__PURE__ */ d("div", {
19
20
  className: "flex h-full flex-col",
20
- children: [/* @__PURE__ */ d("header", {
21
- className: "border-b border-border-default bg-bg-surface px-6 py-4",
22
- children: /* @__PURE__ */ f("div", {
21
+ children: [/* @__PURE__ */ u("header", {
22
+ className: "border-b border-border-seam bg-bg-surface px-6 py-4",
23
+ children: /* @__PURE__ */ d("div", {
23
24
  className: "mx-auto flex max-w-6xl items-center justify-between",
24
- children: [/* @__PURE__ */ f("div", {
25
+ children: [/* @__PURE__ */ d("div", {
25
26
  className: "flex items-center gap-3",
26
- children: [/* @__PURE__ */ d("button", {
27
+ children: [/* @__PURE__ */ u("button", {
27
28
  type: "button",
28
- onClick: () => m(-1),
29
+ onClick: () => v(-1),
29
30
  "aria-label": "Go back",
30
31
  className: "cursor-pointer rounded-lg p-2 text-text-muted transition-colors hover:bg-bg-sunken hover:text-text-primary",
31
- children: /* @__PURE__ */ d(i, { className: "size-5" })
32
- }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
32
+ children: /* @__PURE__ */ u(i, { className: "size-5" })
33
+ }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
33
34
  className: "text-2xl font-bold text-text-primary",
34
- children: g("pages.publisherDashboard.title", { defaultValue: "Publisher Dashboard" })
35
- }), /* @__PURE__ */ d("p", {
35
+ children: b("pages.publisherDashboard.title", { defaultValue: "Publisher Dashboard" })
36
+ }), /* @__PURE__ */ u("p", {
36
37
  className: "text-sm text-text-muted",
37
- children: g("pages.publisherDashboard.subtitle", { defaultValue: "Manage your published products and performance" })
38
+ children: b("pages.publisherDashboard.subtitle", { defaultValue: "Manage your published products and performance" })
38
39
  })] })]
39
- }), /* @__PURE__ */ f("button", {
40
+ }), /* @__PURE__ */ d("button", {
40
41
  type: "button",
41
- onClick: () => m(`${h}/publisher/submit`),
42
+ onClick: () => v(`${y}/publisher/submit`),
42
43
  className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text",
43
- children: [/* @__PURE__ */ d(l, { className: "size-4" }), "Submit Product"]
44
+ children: [/* @__PURE__ */ u(c, { className: "size-4" }), "Submit Product"]
44
45
  })]
45
46
  })
46
- }), /* @__PURE__ */ d("main", {
47
+ }), /* @__PURE__ */ u("main", {
47
48
  className: "flex-1 overflow-y-auto p-6",
48
- children: /* @__PURE__ */ f("div", {
49
+ children: /* @__PURE__ */ d("div", {
49
50
  className: "mx-auto max-w-6xl space-y-6",
50
- children: [/* @__PURE__ */ f("div", {
51
- className: "grid gap-4 sm:grid-cols-3",
52
- children: [
53
- /* @__PURE__ */ f("div", {
54
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
55
- children: [/* @__PURE__ */ d("p", {
56
- className: "text-xs uppercase tracking-wide text-text-muted",
57
- children: g("pages.publisherDashboard.totalProducts", { defaultValue: "Published products" })
58
- }), /* @__PURE__ */ d("p", {
59
- className: "mt-2 text-2xl font-bold text-text-primary",
60
- children: x.totalProducts
61
- })]
62
- }),
63
- /* @__PURE__ */ f("div", {
64
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
65
- children: [/* @__PURE__ */ d("p", {
66
- className: "text-xs uppercase tracking-wide text-text-muted",
67
- children: g("pages.publisherDashboard.totalInstalls", { defaultValue: "Total downloads" })
68
- }), /* @__PURE__ */ d("p", {
69
- className: "mt-2 text-2xl font-bold text-text-primary",
70
- children: x.totalDownloads
71
- })]
72
- }),
73
- /* @__PURE__ */ f("div", {
74
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
75
- children: [/* @__PURE__ */ d("p", {
76
- className: "text-xs uppercase tracking-wide text-text-muted",
77
- children: g("pages.publisherDashboard.avgRating", { defaultValue: "Average rating" })
78
- }), /* @__PURE__ */ d("p", {
79
- className: "mt-2 text-2xl font-bold text-text-primary",
80
- children: x.avgRating.toFixed(1)
81
- })]
82
- })
83
- ]
84
- }), /* @__PURE__ */ f("div", {
85
- className: "rounded-xl border border-border-default bg-bg-surface p-5",
86
- children: [/* @__PURE__ */ f("div", {
51
+ children: [
52
+ /* @__PURE__ */ u(_, { children: "Your home base as a marketplace seller. Track how your published products are performing — downloads, ratings and revenue — submit new products for review, and respond to customer reviews. Use it to decide what to build next and to keep your listings healthy." }),
53
+ /* @__PURE__ */ u(g, {
54
+ storageKey: "store-publisher-dashboard",
55
+ steps: [
56
+ {
57
+ id: "submit",
58
+ label: "Submit a product",
59
+ description: "List a new app or tool for review and publishing.",
60
+ icon: /* @__PURE__ */ u(c, { className: "size-4" }),
61
+ onClick: () => v(`${y}/publisher/submit`),
62
+ done: T.totalProducts > 0
63
+ },
64
+ {
65
+ id: "revenue",
66
+ label: "Check your earnings",
67
+ description: "See revenue and payouts across your products.",
68
+ icon: /* @__PURE__ */ u(o, { className: "size-4" }),
69
+ onClick: () => v(`${y}/publisher/revenue`)
70
+ },
71
+ {
72
+ id: "track",
73
+ label: "Track submission status",
74
+ description: "Follow products through the review pipeline.",
75
+ onClick: () => v(`${y}/publisher/submissions`)
76
+ }
77
+ ]
78
+ }),
79
+ /* @__PURE__ */ d("div", {
80
+ className: "grid gap-4 sm:grid-cols-3",
81
+ children: [
82
+ /* @__PURE__ */ d(m, {
83
+ treatment: "metric",
84
+ className: "p-4",
85
+ children: [/* @__PURE__ */ u("p", {
86
+ className: "text-xs uppercase tracking-wide text-text-muted",
87
+ children: b("pages.publisherDashboard.totalProducts", { defaultValue: "Published products" })
88
+ }), /* @__PURE__ */ u("p", {
89
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
90
+ children: T.totalProducts
91
+ })]
92
+ }),
93
+ /* @__PURE__ */ d(m, {
94
+ treatment: "metric",
95
+ className: "p-4",
96
+ children: [/* @__PURE__ */ u("p", {
97
+ className: "text-xs uppercase tracking-wide text-text-muted",
98
+ children: b("pages.publisherDashboard.totalInstalls", { defaultValue: "Total downloads" })
99
+ }), /* @__PURE__ */ u("p", {
100
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
101
+ children: T.totalDownloads
102
+ })]
103
+ }),
104
+ /* @__PURE__ */ d(m, {
105
+ treatment: "metric",
106
+ className: "p-4",
107
+ children: [/* @__PURE__ */ u("p", {
108
+ className: "text-xs uppercase tracking-wide text-text-muted",
109
+ children: b("pages.publisherDashboard.avgRating", { defaultValue: "Average rating" })
110
+ }), /* @__PURE__ */ u("p", {
111
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
112
+ children: T.avgRating.toFixed(1)
113
+ })]
114
+ })
115
+ ]
116
+ }),
117
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ d("div", {
87
118
  className: "mb-4 flex items-center justify-between",
88
- children: [/* @__PURE__ */ d("h2", {
119
+ children: [/* @__PURE__ */ u("h2", {
89
120
  className: "text-lg font-semibold text-text-primary",
90
- children: g("pages.publisherDashboard.yourProducts", { defaultValue: "Your Products" })
91
- }), /* @__PURE__ */ f("button", {
121
+ children: b("pages.publisherDashboard.yourProducts", { defaultValue: "Your Products" })
122
+ }), /* @__PURE__ */ d("button", {
92
123
  type: "button",
93
- onClick: () => m(`${h}/publisher/revenue`),
124
+ onClick: () => v(`${y}/publisher/revenue`),
94
125
  className: "inline-flex cursor-pointer items-center gap-1.5 text-sm font-medium text-text-link hover:underline",
95
- children: [/* @__PURE__ */ d(o, { className: "size-4" }), "Revenue"]
126
+ children: [/* @__PURE__ */ u(o, { className: "size-4" }), "Revenue"]
96
127
  })]
97
- }), v ? /* @__PURE__ */ d("p", {
128
+ }), S ? /* @__PURE__ */ u("p", {
98
129
  role: "status",
99
130
  className: "text-sm text-text-muted",
100
- children: g("common.loading", { defaultValue: "Loading..." })
101
- }) : y ? /* @__PURE__ */ f("div", {
131
+ children: b("common.loading", { defaultValue: "Loading..." })
132
+ }) : C ? /* @__PURE__ */ d("div", {
102
133
  role: "alert",
103
134
  className: "space-y-2",
104
- children: [/* @__PURE__ */ d("p", {
135
+ children: [/* @__PURE__ */ u("p", {
105
136
  className: "text-sm text-status-error-text",
106
- children: g("pages.publisherDashboard.failedToLoad", { defaultValue: "Failed to load publisher products." })
107
- }), /* @__PURE__ */ d("button", {
137
+ children: b("pages.publisherDashboard.failedToLoad", { defaultValue: "Failed to load publisher products." })
138
+ }), /* @__PURE__ */ u("button", {
108
139
  type: "button",
109
- onClick: () => b(),
140
+ onClick: () => w(),
110
141
  className: "cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text",
111
142
  children: "Retry"
112
143
  })]
113
- }) : _.length === 0 ? /* @__PURE__ */ f("div", {
114
- className: "rounded-lg border border-border-default bg-bg-sunken p-6 text-center",
115
- children: [/* @__PURE__ */ d(c, { className: "mx-auto mb-2 size-8 text-text-muted" }), /* @__PURE__ */ d("p", {
116
- className: "text-sm text-text-muted",
117
- children: g("pages.publisherDashboard.noProducts", { defaultValue: "No published products yet. Submit your first product to get started." })
118
- })]
119
- }) : /* @__PURE__ */ d("ul", {
144
+ }) : x.length === 0 ? /* @__PURE__ */ u(h, {
145
+ illustration: "empty-data",
146
+ title: b("pages.publisherDashboard.noProductsTitle", { defaultValue: "No published products yet" }),
147
+ description: b("pages.publisherDashboard.noProducts", { defaultValue: "No published products yet. Submit your first product to get started." }),
148
+ action: /* @__PURE__ */ d("button", {
149
+ type: "button",
150
+ onClick: () => v(`${y}/publisher/submit`),
151
+ className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90",
152
+ children: [/* @__PURE__ */ u(c, { className: "size-4" }), "Submit Product"]
153
+ })
154
+ }) : /* @__PURE__ */ u("ul", {
120
155
  className: "space-y-3",
121
- children: _.map((e) => /* @__PURE__ */ f("li", {
122
- className: "flex items-center justify-between rounded-lg border border-border-default p-3 transition-colors hover:bg-bg-sunken",
123
- children: [/* @__PURE__ */ f("button", {
156
+ children: x.map((e) => /* @__PURE__ */ d("li", {
157
+ className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop)]",
158
+ children: [/* @__PURE__ */ d("button", {
124
159
  type: "button",
125
- onClick: () => m(`${h}/marketplace/product/${e.id}`),
160
+ onClick: () => v(`${y}/marketplace/product/${e.id}`),
126
161
  className: "flex flex-1 cursor-pointer items-center justify-between text-left",
127
- children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
162
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
128
163
  className: "font-medium text-text-primary",
129
164
  children: e.name
130
- }), /* @__PURE__ */ d("p", {
165
+ }), /* @__PURE__ */ u("p", {
131
166
  className: "text-xs text-text-muted",
132
167
  children: e.status
133
- })] }), /* @__PURE__ */ f("div", {
168
+ })] }), /* @__PURE__ */ d("div", {
134
169
  className: "flex items-center gap-4 text-xs text-text-muted",
135
- children: [/* @__PURE__ */ f("span", {
170
+ children: [/* @__PURE__ */ d("span", {
136
171
  className: "inline-flex items-center gap-1",
137
- children: [/* @__PURE__ */ d(u, { className: "size-3.5" }), (e.rating ?? 0).toFixed(1)]
138
- }), /* @__PURE__ */ f("span", {
172
+ children: [/* @__PURE__ */ u(l, { className: "size-3.5" }), (e.rating ?? 0).toFixed(1)]
173
+ }), /* @__PURE__ */ d("span", {
139
174
  className: "inline-flex items-center gap-1",
140
- children: [/* @__PURE__ */ d(a, { className: "size-3.5" }), e.downloads]
175
+ children: [/* @__PURE__ */ u(a, { className: "size-3.5" }), e.downloads]
141
176
  })]
142
177
  })]
143
- }), /* @__PURE__ */ f("button", {
178
+ }), /* @__PURE__ */ d("button", {
144
179
  type: "button",
145
- onClick: () => m(`${h}/publisher/product/${e.id}/reviews`),
180
+ onClick: () => v(`${y}/publisher/product/${e.id}/reviews`),
146
181
  className: "ml-3 inline-flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-text-link hover:bg-bg-sunken hover:underline",
147
182
  title: "View reviews",
148
- children: [/* @__PURE__ */ d(s, { className: "size-3.5" }), "Reviews"]
183
+ children: [/* @__PURE__ */ u(s, { className: "size-3.5" }), "Reviews"]
149
184
  })]
150
185
  }, e.id))
151
- })]
152
- })]
186
+ })] })
187
+ ]
153
188
  })
154
189
  })]
155
190
  });
156
191
  };
157
192
  //#endregion
158
- export { m as PublisherDashboardPage };
193
+ export { v as PublisherDashboardPage };
159
194
 
160
195
  //# sourceMappingURL=PublisherDashboardPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublisherDashboardPage.js","names":[],"sources":["../../src/pages/PublisherDashboardPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ArrowLeft, Package2, Star, Download, Plus, LineChart, MessageSquare } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useMyPublishedProducts } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nexport const PublisherDashboardPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { t } = useI18n();\n const { products, loading, error, refetch } = useMyPublishedProducts();\n\n const metrics = useMemo(() => {\n const totalProducts = products.length;\n const totalDownloads = products.reduce((sum, p) => sum + (p.downloads ?? 0), 0);\n const avgRating =\n totalProducts > 0 ? products.reduce((sum, p) => sum + (p.rating ?? 0), 0) / totalProducts : 0;\n return {\n totalProducts,\n totalDownloads,\n avgRating,\n };\n }, [products]);\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-default bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.publisherDashboard.title', { defaultValue: 'Publisher Dashboard' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherDashboard.subtitle', {\n defaultValue: 'Manage your published products and performance',\n })}\n </p>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/publisher/submit`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text\"\n >\n <Plus className=\"size-4\" />\n Submit Product\n </button>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.totalProducts', {\n defaultValue: 'Published products',\n })}\n </p>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{metrics.totalProducts}</p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.totalInstalls', { defaultValue: 'Total downloads' })}\n </p>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">{metrics.totalDownloads}</p>\n </div>\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.avgRating', { defaultValue: 'Average rating' })}\n </p>\n <p className=\"mt-2 text-2xl font-bold text-text-primary\">\n {metrics.avgRating.toFixed(1)}\n </p>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-border-default bg-bg-surface p-5\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('pages.publisherDashboard.yourProducts', { defaultValue: 'Your Products' })}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/publisher/revenue`)}\n className=\"inline-flex cursor-pointer items-center gap-1.5 text-sm font-medium text-text-link hover:underline\"\n >\n <LineChart className=\"size-4\" />\n Revenue\n </button>\n </div>\n\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n {t('common.loading', { defaultValue: 'Loading...' })}\n </p>\n ) : error ? (\n <div role=\"alert\" className=\"space-y-2\">\n <p className=\"text-sm text-status-error-text\">\n {t('pages.publisherDashboard.failedToLoad', {\n defaultValue: 'Failed to load publisher products.',\n })}\n </p>\n <button\n type=\"button\"\n onClick={() => refetch()}\n className=\"cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n ) : products.length === 0 ? (\n <div className=\"rounded-lg border border-border-default bg-bg-sunken p-6 text-center\">\n <Package2 className=\"mx-auto mb-2 size-8 text-text-muted\" />\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherDashboard.noProducts', {\n defaultValue:\n 'No published products yet. Submit your first product to get started.',\n })}\n </p>\n </div>\n ) : (\n <ul className=\"space-y-3\">\n {products.map((product) => (\n <li\n key={product.id}\n className=\"flex items-center justify-between rounded-lg border border-border-default p-3 transition-colors hover:bg-bg-sunken\"\n >\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/marketplace/product/${product.id}`)}\n className=\"flex flex-1 cursor-pointer items-center justify-between text-left\"\n >\n <div>\n <p className=\"font-medium text-text-primary\">{product.name}</p>\n <p className=\"text-xs text-text-muted\">{product.status}</p>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-text-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <Star className=\"size-3.5\" />\n {(product.rating ?? 0).toFixed(1)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Download className=\"size-3.5\" />\n {product.downloads}\n </span>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/publisher/product/${product.id}/reviews`)\n }\n className=\"ml-3 inline-flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-text-link hover:bg-bg-sunken hover:underline\"\n title=\"View reviews\"\n >\n <MessageSquare className=\"size-3.5\" />\n Reviews\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"PublisherDashboardPage.js","names":[],"sources":["../../src/pages/PublisherDashboardPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { ArrowLeft, Star, Download, Plus, LineChart, MessageSquare } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useMyPublishedProducts } from '../hooks/useStoreGraphQL';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n GlassCard,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const PublisherDashboardPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { t } = useI18n();\n const { products, loading, error, refetch } = useMyPublishedProducts();\n\n const metrics = useMemo(() => {\n const totalProducts = products.length;\n const totalDownloads = products.reduce((sum, p) => sum + (p.downloads ?? 0), 0);\n const avgRating =\n totalProducts > 0 ? products.reduce((sum, p) => sum + (p.rating ?? 0), 0) / totalProducts : 0;\n return {\n totalProducts,\n totalDownloads,\n avgRating,\n };\n }, [products]);\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-6xl items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.publisherDashboard.title', { defaultValue: 'Publisher Dashboard' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.publisherDashboard.subtitle', {\n defaultValue: 'Manage your published products and performance',\n })}\n </p>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/publisher/submit`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text\"\n >\n <Plus className=\"size-4\" />\n Submit Product\n </button>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <PagePurpose>\n Your home base as a marketplace seller. Track how your published products are performing\n — downloads, ratings and revenue — submit new products for review, and respond to\n customer reviews. Use it to decide what to build next and to keep your listings healthy.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"store-publisher-dashboard\"\n steps={[\n {\n id: 'submit',\n label: 'Submit a product',\n description: 'List a new app or tool for review and publishing.',\n icon: <Plus className=\"size-4\" />,\n onClick: () => navigate(`${basePath}/publisher/submit`),\n done: metrics.totalProducts > 0,\n },\n {\n id: 'revenue',\n label: 'Check your earnings',\n description: 'See revenue and payouts across your products.',\n icon: <LineChart className=\"size-4\" />,\n onClick: () => navigate(`${basePath}/publisher/revenue`),\n },\n {\n id: 'track',\n label: 'Track submission status',\n description: 'Follow products through the review pipeline.',\n onClick: () => navigate(`${basePath}/publisher/submissions`),\n },\n ]}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.totalProducts', {\n defaultValue: 'Published products',\n })}\n </p>\n <p className=\"mt-2 text-2xl font-bold tabular-nums text-text-primary\">\n {metrics.totalProducts}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.totalInstalls', { defaultValue: 'Total downloads' })}\n </p>\n <p className=\"mt-2 text-2xl font-bold tabular-nums text-text-primary\">\n {metrics.totalDownloads}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-muted\">\n {t('pages.publisherDashboard.avgRating', { defaultValue: 'Average rating' })}\n </p>\n <p className=\"mt-2 text-2xl font-bold tabular-nums text-text-primary\">\n {metrics.avgRating.toFixed(1)}\n </p>\n </GlassCard>\n </div>\n\n <EmphasisPanel>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('pages.publisherDashboard.yourProducts', { defaultValue: 'Your Products' })}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/publisher/revenue`)}\n className=\"inline-flex cursor-pointer items-center gap-1.5 text-sm font-medium text-text-link hover:underline\"\n >\n <LineChart className=\"size-4\" />\n Revenue\n </button>\n </div>\n\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n {t('common.loading', { defaultValue: 'Loading...' })}\n </p>\n ) : error ? (\n <div role=\"alert\" className=\"space-y-2\">\n <p className=\"text-sm text-status-error-text\">\n {t('pages.publisherDashboard.failedToLoad', {\n defaultValue: 'Failed to load publisher products.',\n })}\n </p>\n <button\n type=\"button\"\n onClick={() => refetch()}\n className=\"cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n ) : products.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('pages.publisherDashboard.noProductsTitle', {\n defaultValue: 'No published products yet',\n })}\n description={t('pages.publisherDashboard.noProducts', {\n defaultValue:\n 'No published products yet. Submit your first product to get started.',\n })}\n action={\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/publisher/submit`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90\"\n >\n <Plus className=\"size-4\" />\n Submit Product\n </button>\n }\n />\n ) : (\n <ul className=\"space-y-3\">\n {products.map((product) => (\n <li\n key={product.id}\n className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop)]\"\n >\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/marketplace/product/${product.id}`)}\n className=\"flex flex-1 cursor-pointer items-center justify-between text-left\"\n >\n <div>\n <p className=\"font-medium text-text-primary\">{product.name}</p>\n <p className=\"text-xs text-text-muted\">{product.status}</p>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-text-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <Star className=\"size-3.5\" />\n {(product.rating ?? 0).toFixed(1)}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Download className=\"size-3.5\" />\n {product.downloads}\n </span>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/publisher/product/${product.id}/reviews`)\n }\n className=\"ml-3 inline-flex cursor-pointer items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-text-link hover:bg-bg-sunken hover:underline\"\n title=\"View reviews\"\n >\n <MessageSquare className=\"size-3.5\" />\n Reviews\n </button>\n </li>\n ))}\n </ul>\n )}\n </EmphasisPanel>\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -4,137 +4,139 @@ import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProv
4
4
  import { ArrowLeft as r, Clock3 as i, TrendingUp as a, Wallet as o } from "lucide-react";
5
5
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
6
6
  import { useNavigate as u } from "react-router-dom";
7
+ import { EmphasisPanel as d, GlassCard as f, IllustratedEmptyState as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/pages/PublisherRevenuePage.tsx
8
- var d = () => {
9
- let d = u(), { earnings: f, loading: p, error: m, refetch: h } = e(), { t: g } = n(), _ = f ?? null, v = _?.currency || "USD", y = t(() => new Intl.NumberFormat(void 0, {
9
+ var h = () => {
10
+ let h = u(), { earnings: g, loading: _, error: v, refetch: y } = e(), { t: b } = n(), x = g ?? null, S = x?.currency || "USD", C = t(() => new Intl.NumberFormat(void 0, {
10
11
  style: "currency",
11
- currency: v,
12
+ currency: S,
12
13
  maximumFractionDigits: 2
13
- }), [v]);
14
+ }), [S]);
14
15
  return /* @__PURE__ */ l("div", {
15
16
  className: "flex h-full flex-col",
16
17
  children: [/* @__PURE__ */ c("header", {
17
- className: "border-b border-border-default bg-bg-surface px-6 py-4",
18
+ className: "border-b border-border-seam bg-bg-surface px-6 py-4",
18
19
  children: /* @__PURE__ */ l("div", {
19
20
  className: "mx-auto flex max-w-6xl items-center gap-3",
20
21
  children: [/* @__PURE__ */ c("button", {
21
22
  type: "button",
22
- onClick: () => d(-1),
23
+ onClick: () => h(-1),
23
24
  "aria-label": "Go back",
24
25
  className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
25
26
  children: /* @__PURE__ */ c(r, { className: "size-5" })
26
27
  }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
27
28
  className: "text-2xl font-bold text-text-primary",
28
- children: g("pages.publisherRevenue.title", { defaultValue: "Revenue" })
29
+ children: b("pages.publisherRevenue.title", { defaultValue: "Revenue" })
29
30
  }), /* @__PURE__ */ c("p", {
30
31
  className: "text-sm text-text-muted",
31
- children: g("pages.publisherRevenue.subtitle", { defaultValue: "Track publisher earnings and payouts" })
32
+ children: b("pages.publisherRevenue.subtitle", { defaultValue: "Track publisher earnings and payouts" })
32
33
  })] })]
33
34
  })
34
35
  }), /* @__PURE__ */ c("main", {
35
36
  className: "flex-1 overflow-y-auto p-6",
36
- children: /* @__PURE__ */ c("div", {
37
+ children: /* @__PURE__ */ l("div", {
37
38
  className: "mx-auto max-w-6xl space-y-6",
38
- children: p ? /* @__PURE__ */ c("p", {
39
+ children: [/* @__PURE__ */ c(m, { children: "See what your published products are actually earning. Track total and monthly revenue, how many orders came in, and which products sell best — so you know where your income comes from and which listings are worth doubling down on." }), _ ? /* @__PURE__ */ c("p", {
39
40
  role: "status",
40
41
  className: "text-sm text-text-muted",
41
42
  children: "Loading earnings…"
42
- }) : m ? /* @__PURE__ */ l("div", {
43
+ }) : v ? /* @__PURE__ */ l("div", {
43
44
  role: "alert",
44
45
  className: "space-y-2 rounded-xl border border-status-error-border bg-status-error-bg-subtle p-6",
45
46
  children: [/* @__PURE__ */ c("p", {
46
47
  className: "text-sm text-status-error-text",
47
- children: g("pages.publisherRevenue.failedToLoad", { defaultValue: "Failed to load earnings data." })
48
+ children: b("pages.publisherRevenue.failedToLoad", { defaultValue: "Failed to load earnings data." })
48
49
  }), /* @__PURE__ */ c("button", {
49
50
  type: "button",
50
- onClick: () => h(),
51
+ onClick: () => y(),
51
52
  className: "cursor-pointer rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text",
52
53
  children: "Retry"
53
54
  })]
54
- }) : _ ? /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ l("div", {
55
+ }) : x ? /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ l("div", {
55
56
  className: "grid gap-4 sm:grid-cols-3",
56
57
  children: [
57
- /* @__PURE__ */ l("div", {
58
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
58
+ /* @__PURE__ */ l(f, {
59
+ treatment: "metric",
60
+ className: "p-4",
59
61
  children: [/* @__PURE__ */ l("div", {
60
62
  className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
61
63
  children: [
62
64
  /* @__PURE__ */ c(o, { className: "size-4" }),
63
65
  " ",
64
- g("pages.publisherRevenue.totalEarnings", { defaultValue: "Total earnings" })
66
+ b("pages.publisherRevenue.totalEarnings", { defaultValue: "Total earnings" })
65
67
  ]
66
68
  }), /* @__PURE__ */ c("p", {
67
- className: "mt-2 text-2xl font-bold text-text-primary",
68
- children: y.format(_.totalEarnings)
69
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
70
+ children: C.format(x.totalEarnings)
69
71
  })]
70
72
  }),
71
- /* @__PURE__ */ l("div", {
72
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
73
+ /* @__PURE__ */ l(f, {
74
+ treatment: "metric",
75
+ className: "p-4",
73
76
  children: [/* @__PURE__ */ l("div", {
74
77
  className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
75
78
  children: [
76
79
  /* @__PURE__ */ c(i, { className: "size-4" }),
77
80
  " ",
78
- g("pages.publisherRevenue.monthlyEarnings", { defaultValue: "Monthly earnings" })
81
+ b("pages.publisherRevenue.monthlyEarnings", { defaultValue: "Monthly earnings" })
79
82
  ]
80
83
  }), /* @__PURE__ */ c("p", {
81
- className: "mt-2 text-2xl font-bold text-text-primary",
82
- children: y.format(_.monthlyEarnings)
84
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
85
+ children: C.format(x.monthlyEarnings)
83
86
  })]
84
87
  }),
85
- /* @__PURE__ */ l("div", {
86
- className: "rounded-xl border border-border-default bg-bg-surface p-4",
88
+ /* @__PURE__ */ l(f, {
89
+ treatment: "metric",
90
+ className: "p-4",
87
91
  children: [/* @__PURE__ */ l("div", {
88
92
  className: "inline-flex items-center gap-2 text-xs uppercase tracking-wide text-text-muted",
89
93
  children: [
90
94
  /* @__PURE__ */ c(a, { className: "size-4" }),
91
95
  " ",
92
- g("pages.publisherRevenue.monthlyOrders", { defaultValue: "Monthly orders" })
96
+ b("pages.publisherRevenue.monthlyOrders", { defaultValue: "Monthly orders" })
93
97
  ]
94
98
  }), /* @__PURE__ */ c("p", {
95
- className: "mt-2 text-2xl font-bold text-text-primary",
96
- children: _.monthlyOrders
99
+ className: "mt-2 text-2xl font-bold tabular-nums text-text-primary",
100
+ children: x.monthlyOrders
97
101
  })]
98
102
  })
99
103
  ]
100
- }), /* @__PURE__ */ l("div", {
101
- className: "rounded-xl border border-border-default bg-bg-surface p-5",
102
- children: [/* @__PURE__ */ c("h2", {
103
- className: "mb-3 text-lg font-semibold text-text-primary",
104
- children: g("pages.publisherRevenue.topSelling", { defaultValue: "Top Selling Items" })
105
- }), !_.topSellingItems || _.topSellingItems.length === 0 ? /* @__PURE__ */ c("p", {
106
- className: "text-sm text-text-muted",
107
- children: g("pages.publisherRevenue.noSales", { defaultValue: "No product sales found for this period." })
108
- }) : /* @__PURE__ */ c("ul", {
109
- className: "space-y-2",
110
- children: _.topSellingItems.map((e) => /* @__PURE__ */ l("li", {
111
- className: "flex items-center justify-between rounded-lg border border-border-default p-3",
112
- children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
113
- className: "text-sm font-medium text-text-primary",
114
- children: e.storeProduct.name
115
- }), /* @__PURE__ */ l("p", {
116
- className: "text-xs text-text-muted",
117
- children: [
118
- e.totalSales,
119
- " total sales • ",
120
- e.monthlySales,
121
- " this period"
122
- ]
123
- })] }), /* @__PURE__ */ c("p", {
124
- className: "text-sm font-semibold text-text-primary",
125
- children: y.format(e.totalEarnings)
126
- })]
127
- }, e.storeProduct.id))
128
- })]
129
- })] }) : /* @__PURE__ */ c("div", {
130
- className: "rounded-xl border border-border-default bg-bg-surface p-8 text-center text-sm text-text-muted",
131
- children: g("pages.publisherRevenue.noRevenue", { defaultValue: "No revenue data available yet." })
132
- })
104
+ }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c("h2", {
105
+ className: "mb-3 text-lg font-semibold text-text-primary",
106
+ children: b("pages.publisherRevenue.topSelling", { defaultValue: "Top Selling Items" })
107
+ }), !x.topSellingItems || x.topSellingItems.length === 0 ? /* @__PURE__ */ c("p", {
108
+ className: "text-sm text-text-muted",
109
+ children: b("pages.publisherRevenue.noSales", { defaultValue: "No product sales found for this period." })
110
+ }) : /* @__PURE__ */ c("ul", {
111
+ className: "space-y-2",
112
+ children: x.topSellingItems.map((e) => /* @__PURE__ */ l("li", {
113
+ className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface p-3",
114
+ children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
115
+ className: "text-sm font-medium text-text-primary",
116
+ children: e.storeProduct.name
117
+ }), /* @__PURE__ */ l("p", {
118
+ className: "text-xs text-text-muted",
119
+ children: [
120
+ e.totalSales,
121
+ " total sales • ",
122
+ e.monthlySales,
123
+ " this period"
124
+ ]
125
+ })] }), /* @__PURE__ */ c("p", {
126
+ className: "text-sm font-semibold text-text-primary",
127
+ children: C.format(e.totalEarnings)
128
+ })]
129
+ }, e.storeProduct.id))
130
+ })] })] }) : /* @__PURE__ */ c(p, {
131
+ illustration: "empty-data",
132
+ title: b("pages.publisherRevenue.noRevenueTitle", { defaultValue: "No revenue data yet" }),
133
+ description: b("pages.publisherRevenue.noRevenue", { defaultValue: "No revenue data available yet. Earnings will appear here once your published products start selling." })
134
+ })]
133
135
  })
134
136
  })]
135
137
  });
136
138
  };
137
139
  //#endregion
138
- export { d as PublisherRevenuePage };
140
+ export { h as PublisherRevenuePage };
139
141
 
140
142
  //# sourceMappingURL=PublisherRevenuePage.js.map