@burdenoff/microfe-theculturepost 2026.705.2 → 2026.709.2

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 (234) hide show
  1. package/dist/dev/main.d.ts +2 -0
  2. package/dist/dev/main.d.ts.map +1 -0
  3. package/dist/generated/global-operations.d.ts +2 -0
  4. package/dist/generated/global-operations.d.ts.map +1 -0
  5. package/dist/generated/global-types.d.ts +18199 -0
  6. package/dist/generated/global-types.d.ts.map +1 -0
  7. package/dist/generated/wspace-operations.d.ts +2 -0
  8. package/dist/generated/wspace-operations.d.ts.map +1 -0
  9. package/dist/generated/wspace-types.d.ts +43046 -0
  10. package/dist/generated/wspace-types.d.ts.map +1 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +8 -1
  14. package/dist/services/assistantApi.d.ts +15 -0
  15. package/dist/services/assistantApi.d.ts.map +1 -0
  16. package/dist/services/assistantApi.js +204 -0
  17. package/dist/services/assistantApi.js.map +1 -0
  18. package/dist/services/createSandboxAssistantTransport.d.ts +26 -0
  19. package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -0
  20. package/dist/services/createSandboxAssistantTransport.js +126 -0
  21. package/dist/services/createSandboxAssistantTransport.js.map +1 -0
  22. package/dist/theculturepost/TheCulturePostRoot.d.ts +5 -0
  23. package/dist/theculturepost/TheCulturePostRoot.d.ts.map +1 -0
  24. package/dist/theculturepost/TheCulturePostRoutes.d.ts +4 -0
  25. package/dist/theculturepost/TheCulturePostRoutes.d.ts.map +1 -0
  26. package/dist/theculturepost/TheCulturePostRoutes.js +73 -40
  27. package/dist/theculturepost/TheCulturePostRoutes.js.map +1 -1
  28. package/dist/theculturepost/components/AddCitationDialog.d.ts +11 -0
  29. package/dist/theculturepost/components/AddCitationDialog.d.ts.map +1 -0
  30. package/dist/theculturepost/components/ArchiveItemCard.d.ts +9 -0
  31. package/dist/theculturepost/components/ArchiveItemCard.d.ts.map +1 -0
  32. package/dist/theculturepost/components/AudioPlayer.d.ts +22 -0
  33. package/dist/theculturepost/components/AudioPlayer.d.ts.map +1 -0
  34. package/dist/theculturepost/components/AuthorLabel.d.ts +16 -0
  35. package/dist/theculturepost/components/AuthorLabel.d.ts.map +1 -0
  36. package/dist/theculturepost/components/AuthorLabel.js +1 -1
  37. package/dist/theculturepost/components/CitationList.d.ts +27 -0
  38. package/dist/theculturepost/components/CitationList.d.ts.map +1 -0
  39. package/dist/theculturepost/components/CollectionCard.d.ts +9 -0
  40. package/dist/theculturepost/components/CollectionCard.d.ts.map +1 -0
  41. package/dist/theculturepost/components/CoverImage.d.ts +13 -0
  42. package/dist/theculturepost/components/CoverImage.d.ts.map +1 -0
  43. package/dist/theculturepost/components/CreateArchiveItemDialog.d.ts +12 -0
  44. package/dist/theculturepost/components/CreateArchiveItemDialog.d.ts.map +1 -0
  45. package/dist/theculturepost/components/CreateCollectionDialog.d.ts +10 -0
  46. package/dist/theculturepost/components/CreateCollectionDialog.d.ts.map +1 -0
  47. package/dist/theculturepost/components/CreateStoryDialog.d.ts +12 -0
  48. package/dist/theculturepost/components/CreateStoryDialog.d.ts.map +1 -0
  49. package/dist/theculturepost/components/CreateTopicDialog.d.ts +10 -0
  50. package/dist/theculturepost/components/CreateTopicDialog.d.ts.map +1 -0
  51. package/dist/theculturepost/components/DecorativeCover.d.ts +17 -0
  52. package/dist/theculturepost/components/DecorativeCover.d.ts.map +1 -0
  53. package/dist/theculturepost/components/DecorativeDivider.d.ts +14 -0
  54. package/dist/theculturepost/components/DecorativeDivider.d.ts.map +1 -0
  55. package/dist/theculturepost/components/DiscussionCard.d.ts +9 -0
  56. package/dist/theculturepost/components/DiscussionCard.d.ts.map +1 -0
  57. package/dist/theculturepost/components/EmptyState.d.ts +18 -0
  58. package/dist/theculturepost/components/EmptyState.d.ts.map +1 -0
  59. package/dist/theculturepost/components/FileImage.d.ts +18 -0
  60. package/dist/theculturepost/components/FileImage.d.ts.map +1 -0
  61. package/dist/theculturepost/components/FileUploadField.d.ts +29 -0
  62. package/dist/theculturepost/components/FileUploadField.d.ts.map +1 -0
  63. package/dist/theculturepost/components/FilterTabs.d.ts +18 -0
  64. package/dist/theculturepost/components/FilterTabs.d.ts.map +1 -0
  65. package/dist/theculturepost/components/HistoryTimeline.d.ts +20 -0
  66. package/dist/theculturepost/components/HistoryTimeline.d.ts.map +1 -0
  67. package/dist/theculturepost/components/LifecycleStepper.d.ts +11 -0
  68. package/dist/theculturepost/components/LifecycleStepper.d.ts.map +1 -0
  69. package/dist/theculturepost/components/OpenDiscussionDialog.d.ts +12 -0
  70. package/dist/theculturepost/components/OpenDiscussionDialog.d.ts.map +1 -0
  71. package/dist/theculturepost/components/OralHistoryCard.d.ts +8 -0
  72. package/dist/theculturepost/components/OralHistoryCard.d.ts.map +1 -0
  73. package/dist/theculturepost/components/OverlayBadge.d.ts +15 -0
  74. package/dist/theculturepost/components/OverlayBadge.d.ts.map +1 -0
  75. package/dist/theculturepost/components/PageHero.d.ts +26 -0
  76. package/dist/theculturepost/components/PageHero.d.ts.map +1 -0
  77. package/dist/theculturepost/components/PageLayout.d.ts +16 -0
  78. package/dist/theculturepost/components/PageLayout.d.ts.map +1 -0
  79. package/dist/theculturepost/components/Pagination.d.ts +22 -0
  80. package/dist/theculturepost/components/Pagination.d.ts.map +1 -0
  81. package/dist/theculturepost/components/RecordOralHistoryDialog.d.ts +47 -0
  82. package/dist/theculturepost/components/RecordOralHistoryDialog.d.ts.map +1 -0
  83. package/dist/theculturepost/components/ReplyThread.d.ts +20 -0
  84. package/dist/theculturepost/components/ReplyThread.d.ts.map +1 -0
  85. package/dist/theculturepost/components/ReplyThread.js +1 -1
  86. package/dist/theculturepost/components/StateViews.d.ts +24 -0
  87. package/dist/theculturepost/components/StateViews.d.ts.map +1 -0
  88. package/dist/theculturepost/components/StatusBadge.d.ts +11 -0
  89. package/dist/theculturepost/components/StatusBadge.d.ts.map +1 -0
  90. package/dist/theculturepost/components/StoryCard.d.ts +11 -0
  91. package/dist/theculturepost/components/StoryCard.d.ts.map +1 -0
  92. package/dist/theculturepost/components/Tabs.d.ts +17 -0
  93. package/dist/theculturepost/components/Tabs.d.ts.map +1 -0
  94. package/dist/theculturepost/components/TagInput.d.ts +20 -0
  95. package/dist/theculturepost/components/TagInput.d.ts.map +1 -0
  96. package/dist/theculturepost/components/TopicCard.d.ts +9 -0
  97. package/dist/theculturepost/components/TopicCard.d.ts.map +1 -0
  98. package/dist/theculturepost/components/Waveform.d.ts +23 -0
  99. package/dist/theculturepost/components/Waveform.d.ts.map +1 -0
  100. package/dist/theculturepost/components/categoryMeta.d.ts +14 -0
  101. package/dist/theculturepost/components/categoryMeta.d.ts.map +1 -0
  102. package/dist/theculturepost/components/index.d.ts +43 -0
  103. package/dist/theculturepost/components/index.d.ts.map +1 -0
  104. package/dist/theculturepost/components/kindIcon.d.ts +7 -0
  105. package/dist/theculturepost/components/kindIcon.d.ts.map +1 -0
  106. package/dist/theculturepost/components/viz/BarChart.d.ts +23 -0
  107. package/dist/theculturepost/components/viz/BarChart.d.ts.map +1 -0
  108. package/dist/theculturepost/components/viz/Donut.d.ts +25 -0
  109. package/dist/theculturepost/components/viz/Donut.d.ts.map +1 -0
  110. package/dist/theculturepost/components/viz/StatTile.d.ts +14 -0
  111. package/dist/theculturepost/components/viz/StatTile.d.ts.map +1 -0
  112. package/dist/theculturepost/components/viz/index.d.ts +11 -0
  113. package/dist/theculturepost/components/viz/index.d.ts.map +1 -0
  114. package/dist/theculturepost/context/TheCulturePostContext.d.ts +16 -0
  115. package/dist/theculturepost/context/TheCulturePostContext.d.ts.map +1 -0
  116. package/dist/theculturepost/context/index.d.ts +6 -0
  117. package/dist/theculturepost/context/index.d.ts.map +1 -0
  118. package/dist/theculturepost/hooks/index.d.ts +10 -0
  119. package/dist/theculturepost/hooks/index.d.ts.map +1 -0
  120. package/dist/theculturepost/hooks/index.js +2 -0
  121. package/dist/theculturepost/hooks/useCursorPager.d.ts +32 -0
  122. package/dist/theculturepost/hooks/useCursorPager.d.ts.map +1 -0
  123. package/dist/theculturepost/hooks/useFiles.d.ts +31 -0
  124. package/dist/theculturepost/hooks/useFiles.d.ts.map +1 -0
  125. package/dist/theculturepost/hooks/usePageAnalytics.d.ts +9 -0
  126. package/dist/theculturepost/hooks/usePageAnalytics.d.ts.map +1 -0
  127. package/dist/theculturepost/hooks/usePageAnalytics.js +34 -0
  128. package/dist/theculturepost/hooks/usePageAnalytics.js.map +1 -0
  129. package/dist/theculturepost/hooks/useTcpApi.d.ts +74 -0
  130. package/dist/theculturepost/hooks/useTcpApi.d.ts.map +1 -0
  131. package/dist/theculturepost/hooks/useTr.d.ts +8 -0
  132. package/dist/theculturepost/hooks/useTr.d.ts.map +1 -0
  133. package/dist/theculturepost/hooks/useTr.js +14 -0
  134. package/dist/theculturepost/hooks/useTr.js.map +1 -0
  135. package/dist/theculturepost/index.d.ts +9 -0
  136. package/dist/theculturepost/index.d.ts.map +1 -0
  137. package/dist/theculturepost/index.js +2 -1
  138. package/dist/theculturepost/lib/graphql-cache.d.ts +26 -0
  139. package/dist/theculturepost/lib/graphql-cache.d.ts.map +1 -0
  140. package/dist/theculturepost/lib/toast.d.ts +23 -0
  141. package/dist/theculturepost/lib/toast.d.ts.map +1 -0
  142. package/dist/theculturepost/pages/HomePage.d.ts +16 -0
  143. package/dist/theculturepost/pages/HomePage.d.ts.map +1 -0
  144. package/dist/theculturepost/pages/HomePage.js +83 -68
  145. package/dist/theculturepost/pages/HomePage.js.map +1 -1
  146. package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.d.ts +12 -0
  147. package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.d.ts.map +1 -0
  148. package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.js +21 -21
  149. package/dist/theculturepost/pages/archive/ArchivePage.d.ts +7 -0
  150. package/dist/theculturepost/pages/archive/ArchivePage.d.ts.map +1 -0
  151. package/dist/theculturepost/pages/archive/ArchivePage.js +144 -125
  152. package/dist/theculturepost/pages/archive/ArchivePage.js.map +1 -1
  153. package/dist/theculturepost/pages/archive/CollectionDetailPage.d.ts +12 -0
  154. package/dist/theculturepost/pages/archive/CollectionDetailPage.d.ts.map +1 -0
  155. package/dist/theculturepost/pages/discussions/DiscussionDetailPage.d.ts +12 -0
  156. package/dist/theculturepost/pages/discussions/DiscussionDetailPage.d.ts.map +1 -0
  157. package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js +78 -70
  158. package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js.map +1 -1
  159. package/dist/theculturepost/pages/discussions/DiscussionsPage.d.ts +10 -0
  160. package/dist/theculturepost/pages/discussions/DiscussionsPage.d.ts.map +1 -0
  161. package/dist/theculturepost/pages/discussions/DiscussionsPage.js +63 -56
  162. package/dist/theculturepost/pages/discussions/DiscussionsPage.js.map +1 -1
  163. package/dist/theculturepost/pages/governance/GovernancePage.d.ts +20 -0
  164. package/dist/theculturepost/pages/governance/GovernancePage.d.ts.map +1 -0
  165. package/dist/theculturepost/pages/stories/StoriesPage.d.ts +9 -0
  166. package/dist/theculturepost/pages/stories/StoriesPage.d.ts.map +1 -0
  167. package/dist/theculturepost/pages/stories/StoriesPage.js +65 -58
  168. package/dist/theculturepost/pages/stories/StoriesPage.js.map +1 -1
  169. package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts +18 -0
  170. package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts.map +1 -0
  171. package/dist/theculturepost/pages/stories/StoryDetailPage.js +249 -229
  172. package/dist/theculturepost/pages/stories/StoryDetailPage.js.map +1 -1
  173. package/dist/theculturepost/pages/timeline/TimelinePage.d.ts +17 -0
  174. package/dist/theculturepost/pages/timeline/TimelinePage.d.ts.map +1 -0
  175. package/dist/theculturepost/pages/topics/TopicDetailPage.d.ts +12 -0
  176. package/dist/theculturepost/pages/topics/TopicDetailPage.d.ts.map +1 -0
  177. package/dist/theculturepost/pages/topics/TopicsPage.d.ts +12 -0
  178. package/dist/theculturepost/pages/topics/TopicsPage.d.ts.map +1 -0
  179. package/dist/theculturepost/pages/topics/TopicsPage.js +61 -52
  180. package/dist/theculturepost/pages/topics/TopicsPage.js.map +1 -1
  181. package/dist/theculturepost/styles/injectDisplayFont.d.ts +14 -0
  182. package/dist/theculturepost/styles/injectDisplayFont.d.ts.map +1 -0
  183. package/dist/theculturepost/translations/ar.d.ts +50 -0
  184. package/dist/theculturepost/translations/ar.d.ts.map +1 -0
  185. package/dist/theculturepost/translations/ar.js +54 -0
  186. package/dist/theculturepost/translations/ar.js.map +1 -0
  187. package/dist/theculturepost/translations/en.d.ts +50 -0
  188. package/dist/theculturepost/translations/en.d.ts.map +1 -0
  189. package/dist/theculturepost/translations/en.js +54 -0
  190. package/dist/theculturepost/translations/en.js.map +1 -0
  191. package/dist/theculturepost/translations/es.d.ts +50 -0
  192. package/dist/theculturepost/translations/es.d.ts.map +1 -0
  193. package/dist/theculturepost/translations/es.js +54 -0
  194. package/dist/theculturepost/translations/es.js.map +1 -0
  195. package/dist/theculturepost/translations/hi.d.ts +50 -0
  196. package/dist/theculturepost/translations/hi.d.ts.map +1 -0
  197. package/dist/theculturepost/translations/hi.js +54 -0
  198. package/dist/theculturepost/translations/hi.js.map +1 -0
  199. package/dist/theculturepost/translations/index.d.ts +7 -0
  200. package/dist/theculturepost/translations/index.d.ts.map +1 -0
  201. package/dist/theculturepost/translations/ta.d.ts +50 -0
  202. package/dist/theculturepost/translations/ta.d.ts.map +1 -0
  203. package/dist/theculturepost/translations/ta.js +54 -0
  204. package/dist/theculturepost/translations/ta.js.map +1 -0
  205. package/dist/theculturepost/translations/zh.d.ts +50 -0
  206. package/dist/theculturepost/translations/zh.d.ts.map +1 -0
  207. package/dist/theculturepost/translations/zh.js +54 -0
  208. package/dist/theculturepost/translations/zh.js.map +1 -0
  209. package/dist/theculturepost/types/index.d.ts +333 -0
  210. package/dist/theculturepost/types/index.d.ts.map +1 -0
  211. package/dist/theculturepost/utils/cn.d.ts +4 -0
  212. package/dist/theculturepost/utils/cn.d.ts.map +1 -0
  213. package/dist/theculturepost/utils/formatters.d.ts +19 -0
  214. package/dist/theculturepost/utils/formatters.d.ts.map +1 -0
  215. package/dist/theculturepost/utils/i18n.d.ts +6 -0
  216. package/dist/theculturepost/utils/i18n.d.ts.map +1 -0
  217. package/dist/theculturepost/utils/index.d.ts +11 -0
  218. package/dist/theculturepost/utils/index.d.ts.map +1 -0
  219. package/dist/theculturepost/utils/index.js +6 -0
  220. package/dist/theculturepost/utils/nativeBridge.d.ts +47 -0
  221. package/dist/theculturepost/utils/nativeBridge.d.ts.map +1 -0
  222. package/dist/theculturepost/utils/nativeBridge.js +60 -0
  223. package/dist/theculturepost/utils/nativeBridge.js.map +1 -0
  224. package/dist/theculturepost/utils/navigation.d.ts +14 -0
  225. package/dist/theculturepost/utils/navigation.d.ts.map +1 -0
  226. package/dist/theculturepost/utils/slug.d.ts +6 -0
  227. package/dist/theculturepost/utils/slug.d.ts.map +1 -0
  228. package/dist/types/assistant.d.ts +56 -0
  229. package/dist/types/assistant.d.ts.map +1 -0
  230. package/dist/utils/pageContext.d.ts +27 -0
  231. package/dist/utils/pageContext.d.ts.map +1 -0
  232. package/dist/utils/pageContext.js +47 -0
  233. package/dist/utils/pageContext.js.map +1 -0
  234. package/package.json +29 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/theculturepost/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage — the editorial-magazine landing for TheCulturePost.\n * @module theculturepost/pages\n *\n * Layout: a decorative {@link PageHero}, then a two-column magazine grid —\n * - main column: \"Featured topics\" ({@link TopicCard}) + \"Latest published\n * stories\" ({@link StoryCard} status:PUBLISHED)\n * - right rail (compact): \"Active discussions\" (status:APPROVED) rows +\n * \"From the archive\" collection thumbnails.\n *\n * Every surface links into its section and shows an honest empty state when it\n * has no data. Only real schema fields are rendered — no fabricated metrics,\n * avatars or imagery (topics/discussions use token-only decorative motifs).\n */\n\nimport type { ReactNode } from 'react';\nimport {\n BookOpen,\n Compass,\n MessagesSquare,\n Library,\n Layers,\n HeartHandshake,\n ArrowRight,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { PageHero } from '../components/PageHero';\nimport { LoadingView } from '../components/StateViews';\nimport { StoryCard } from '../components/StoryCard';\nimport { TopicCard } from '../components/TopicCard';\nimport { CoverImage } from '../components/CoverImage';\nimport { OverlayBadge } from '../components/OverlayBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useTcpTopics, useTcpStories, useTcpDiscussions, useTcpCollections } from '../hooks';\nimport { useTheCulturePost } from '../context';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport type { TcpDiscussion, TcpCollection } from '../types';\n\n// ---------------------------------------------------------------------------\n// Small presentational helpers (home-only; kept inline)\n// ---------------------------------------------------------------------------\n\nfunction SectionLink({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClick} className=\"shrink-0\">\n {label} <ArrowRight className=\"ml-1 h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n}\n\n/** A magazine section header (serif) for the main reading column. */\nfunction MagSection({\n title,\n description,\n action,\n children,\n}: {\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex items-end justify-between gap-3 border-b border-border-seam pb-3\">\n <div className=\"min-w-0\">\n <h2 className=\"font-display text-xl font-semibold leading-tight text-text-primary sm:text-2xl\">\n {title}\n </h2>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A bordered panel for the compact right rail. */\nfunction RailSection({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-2xl border border-border-seam bg-bg-surface p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-[0.12em] text-text-secondary\">\n {title}\n </h3>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A compact discussion row for the rail — real fields only. */\nfunction DiscussionRow({ discussion, onOpen }: { discussion: TcpDiscussion; onOpen: () => void }) {\n const Icon = discussion.isInterfaith ? HeartHandshake : MessagesSquare;\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-start gap-3 rounded-xl px-2 py-2.5 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span\n className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\"\n aria-hidden=\"true\"\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium text-text-primary group-hover:text-accent\">\n {discussion.title}\n </span>\n <span className=\"mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-xs text-text-tertiary\">\n {discussion.isInterfaith && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-1.5 py-0.5 font-medium text-text-primary\">\n <HeartHandshake className=\"h-3 w-3\" aria-hidden=\"true\" /> Interfaith\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n <MessagesSquare className=\"h-3 w-3\" aria-hidden=\"true\" />\n {formatNumber(discussion.replyCount)}\n </span>\n <span>{formatRelativeTime(discussion.updatedAt)}</span>\n </span>\n </span>\n </button>\n );\n}\n\n/** A compact archive-collection thumbnail for the rail (real itemCount only). */\nfunction ArchiveThumb({ collection, onOpen }: { collection: TcpCollection; onOpen: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Open ${collection.name}`}\n className=\"group flex flex-col gap-2 text-left\"\n >\n <span className=\"relative block aspect-square w-full overflow-hidden rounded-xl\">\n <CoverImage\n fileId={collection.cover?.id}\n alt={collection.name}\n rounded=\"rounded-none\"\n className=\"h-full w-full transition-transform duration-500 group-hover:scale-[1.03]\"\n icon={<Library className=\"h-6 w-6\" />}\n />\n <OverlayBadge position=\"bottom-right\" icon={<Layers className=\"h-3 w-3\" />}>\n {formatNumber(collection.itemCount)}\n </OverlayBadge>\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-display text-sm font-semibold text-text-primary group-hover:text-accent\">\n {collection.name}\n </span>\n {collection.tradition && (\n <span className=\"block truncate text-xs text-text-tertiary\">{collection.tradition}</span>\n )}\n </span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo } = useTheCulturePost();\n\n const topicsQuery = useTcpTopics({ pagination: { limit: 6 } });\n const storiesQuery = useTcpStories({ status: 'PUBLISHED', pagination: { limit: 6 } });\n const discussionsQuery = useTcpDiscussions({ status: 'APPROVED', pagination: { limit: 6 } });\n const collectionsQuery = useTcpCollections({ limit: 6 });\n\n const topics = topicsQuery.data?.items ?? [];\n const featuredTopics = topics.filter((t) => t.isFeatured);\n const shownTopics = (featuredTopics.length > 0 ? featuredTopics : topics).slice(0, 4);\n const stories = storiesQuery.data?.items ?? [];\n const discussions = discussionsQuery.data?.items ?? [];\n const collections = collectionsQuery.data ?? [];\n\n const anythingLoading =\n topicsQuery.isLoading &&\n storiesQuery.isLoading &&\n discussionsQuery.isLoading &&\n collectionsQuery.isLoading;\n\n const everythingEmpty =\n !topicsQuery.isLoading &&\n !storiesQuery.isLoading &&\n !discussionsQuery.isLoading &&\n !collectionsQuery.isLoading &&\n shownTopics.length === 0 &&\n stories.length === 0 &&\n discussions.length === 0 &&\n collections.length === 0;\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex-1 overflow-auto\">\n <div className=\"mx-auto flex max-w-7xl flex-col gap-8 p-4 sm:p-6\">\n <PageHero\n eyebrow=\"TheCulturePost\"\n title=\"Culture, religion, values & history — told with care\"\n description=\"A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record.\"\n actions={\n <Button size=\"lg\" onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Read stories\n </Button>\n }\n />\n\n {anythingLoading ? (\n <LoadingView label=\"Loading the latest…\" />\n ) : everythingEmpty ? (\n <EmptyState\n illustration=\"onboarding\"\n icon={<BookOpen className=\"h-10 w-10\" />}\n title=\"Welcome to TheCulturePost\"\n description=\"This publication is just getting started. Curate a topic, draft a story, or begin building the archive.\"\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Draft a story\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('topics')}>\n <Compass className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Curate a topic\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"grid gap-8 lg:grid-cols-3\">\n {/* Main reading column */}\n <div className=\"flex flex-col gap-10 lg:col-span-2\">\n {/* Featured topics */}\n <MagSection\n title=\"Featured topics\"\n description=\"Curated subjects across culture, faith, history and heritage.\"\n action={<SectionLink label=\"All topics\" onClick={() => navigateTo('topics')} />}\n >\n {shownTopics.length === 0 ? (\n <EmptyState\n icon={<Compass className=\"h-9 w-9\" />}\n title=\"No topics yet\"\n description=\"Curate the first topic to organise the publication.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {shownTopics.map((topic) => (\n <TopicCard\n key={topic.id}\n topic={topic}\n onOpen={() => navigateTo(`topics/${topic.id}`)}\n />\n ))}\n </div>\n )}\n </MagSection>\n\n {/* Latest published stories */}\n <MagSection\n title=\"Latest published stories\"\n description=\"Freshly published pieces from the newsroom.\"\n action={<SectionLink label=\"All stories\" onClick={() => navigateTo('stories')} />}\n >\n {stories.length === 0 ? (\n <EmptyState\n icon={<BookOpen className=\"h-9 w-9\" />}\n title=\"No published stories yet\"\n description=\"Draft a story and move it through the editorial lifecycle to publish.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {stories.map((story) => (\n <StoryCard\n key={story.id}\n story={story}\n hideStatus\n onOpen={() => navigateTo(`stories/${story.id}`)}\n />\n ))}\n </div>\n )}\n </MagSection>\n </div>\n\n {/* Compact right rail */}\n <aside className=\"flex flex-col gap-6\">\n {/* Active discussions */}\n <RailSection\n title=\"Active discussions\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('discussions')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {discussions.length === 0 ? (\n <EmptyState\n icon={<MessagesSquare className=\"h-8 w-8\" />}\n title=\"No open discussions\"\n description=\"Open a discussion to invite thoughtful perspectives.\"\n />\n ) : (\n <div className=\"-mx-2 flex flex-col\">\n {discussions.map((discussion) => (\n <DiscussionRow\n key={discussion.id}\n discussion={discussion}\n onOpen={() => navigateTo(`discussions/${discussion.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n\n {/* From the archive */}\n <RailSection\n title=\"From the archive\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('archive')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {collections.length === 0 ? (\n <EmptyState\n icon={<Library className=\"h-8 w-8\" />}\n title=\"The archive is empty\"\n description=\"Create a collection to begin preserving heritage.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {collections.map((collection) => (\n <ArchiveThumb\n key={collection.id}\n collection={collection}\n onOpen={() => navigateTo(`archive/collections/${collection.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </aside>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/theculturepost/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage — the editorial-magazine landing for TheCulturePost.\n * @module theculturepost/pages\n *\n * Layout: a decorative {@link PageHero}, then a two-column magazine grid —\n * - main column: \"Featured topics\" ({@link TopicCard}) + \"Latest published\n * stories\" ({@link StoryCard} status:PUBLISHED)\n * - right rail (compact): \"Active discussions\" (status:APPROVED) rows +\n * \"From the archive\" collection thumbnails.\n *\n * Every surface links into its section and shows an honest empty state when it\n * has no data. Only real schema fields are rendered — no fabricated metrics,\n * avatars or imagery (topics/discussions use token-only decorative motifs).\n */\n\nimport type { ReactNode } from 'react';\nimport {\n BookOpen,\n Compass,\n MessagesSquare,\n Library,\n Layers,\n HeartHandshake,\n ArrowRight,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { PageHero } from '../components/PageHero';\nimport { LoadingView } from '../components/StateViews';\nimport { StoryCard } from '../components/StoryCard';\nimport { TopicCard } from '../components/TopicCard';\nimport { CoverImage } from '../components/CoverImage';\nimport { OverlayBadge } from '../components/OverlayBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useTcpTopics, useTcpStories, useTcpDiscussions, useTcpCollections } from '../hooks';\nimport { useTheCulturePost } from '../context';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport type { TcpDiscussion, TcpCollection } from '../types';\n\n// ---------------------------------------------------------------------------\n// Small presentational helpers (home-only; kept inline)\n// ---------------------------------------------------------------------------\n\nfunction SectionLink({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClick} className=\"shrink-0\">\n {label} <ArrowRight className=\"ml-1 h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n}\n\n/** A magazine section header (serif) for the main reading column. */\nfunction MagSection({\n title,\n description,\n action,\n children,\n}: {\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex items-end justify-between gap-3 border-b border-border-seam pb-3\">\n <div className=\"min-w-0\">\n <h2 className=\"font-display text-xl font-semibold leading-tight text-text-primary sm:text-2xl\">\n {title}\n </h2>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A bordered panel for the compact right rail. */\nfunction RailSection({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-2xl border border-border-seam bg-bg-surface p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-[0.12em] text-text-secondary\">\n {title}\n </h3>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A compact discussion row for the rail — real fields only. */\nfunction DiscussionRow({ discussion, onOpen }: { discussion: TcpDiscussion; onOpen: () => void }) {\n const Icon = discussion.isInterfaith ? HeartHandshake : MessagesSquare;\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-start gap-3 rounded-xl px-2 py-2.5 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span\n className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\"\n aria-hidden=\"true\"\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium text-text-primary group-hover:text-accent\">\n {discussion.title}\n </span>\n <span className=\"mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-xs text-text-tertiary\">\n {discussion.isInterfaith && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-1.5 py-0.5 font-medium text-text-primary\">\n <HeartHandshake className=\"h-3 w-3\" aria-hidden=\"true\" /> Interfaith\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n <MessagesSquare className=\"h-3 w-3\" aria-hidden=\"true\" />\n {formatNumber(discussion.replyCount)}\n </span>\n <span>{formatRelativeTime(discussion.updatedAt)}</span>\n </span>\n </span>\n </button>\n );\n}\n\n/** A compact archive-collection thumbnail for the rail (real itemCount only). */\nfunction ArchiveThumb({ collection, onOpen }: { collection: TcpCollection; onOpen: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Open ${collection.name}`}\n className=\"group flex flex-col gap-2 text-left\"\n >\n <span className=\"relative block aspect-square w-full overflow-hidden rounded-xl\">\n <CoverImage\n fileId={collection.cover?.id}\n alt={collection.name}\n rounded=\"rounded-none\"\n className=\"h-full w-full transition-transform duration-500 group-hover:scale-[1.03]\"\n icon={<Library className=\"h-6 w-6\" />}\n />\n <OverlayBadge position=\"bottom-right\" icon={<Layers className=\"h-3 w-3\" />}>\n {formatNumber(collection.itemCount)}\n </OverlayBadge>\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-display text-sm font-semibold text-text-primary group-hover:text-accent\">\n {collection.name}\n </span>\n {collection.tradition && (\n <span className=\"block truncate text-xs text-text-tertiary\">{collection.tradition}</span>\n )}\n </span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo } = useTheCulturePost();\n\n const topicsQuery = useTcpTopics({ pagination: { limit: 6 } });\n const storiesQuery = useTcpStories({ status: 'PUBLISHED', pagination: { limit: 6 } });\n const discussionsQuery = useTcpDiscussions({ status: 'APPROVED', pagination: { limit: 6 } });\n const collectionsQuery = useTcpCollections({ limit: 6 });\n\n const topics = topicsQuery.data?.items ?? [];\n const featuredTopics = topics.filter((t) => t.isFeatured);\n const shownTopics = (featuredTopics.length > 0 ? featuredTopics : topics).slice(0, 4);\n const stories = storiesQuery.data?.items ?? [];\n const discussions = discussionsQuery.data?.items ?? [];\n const collections = collectionsQuery.data ?? [];\n\n const anythingLoading =\n topicsQuery.isLoading &&\n storiesQuery.isLoading &&\n discussionsQuery.isLoading &&\n collectionsQuery.isLoading;\n\n const everythingEmpty =\n !topicsQuery.isLoading &&\n !storiesQuery.isLoading &&\n !discussionsQuery.isLoading &&\n !collectionsQuery.isLoading &&\n shownTopics.length === 0 &&\n stories.length === 0 &&\n discussions.length === 0 &&\n collections.length === 0;\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex-1 overflow-auto\">\n <div className=\"mx-auto flex max-w-7xl flex-col gap-8 p-4 sm:p-6\">\n <div data-tour=\"theculturepost-home-hero\">\n <PageHero\n eyebrow=\"TheCulturePost\"\n title=\"Culture, religion, values & history — told with care\"\n description=\"A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record.\"\n actions={\n <Button size=\"lg\" onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Read stories\n </Button>\n }\n />\n </div>\n\n {anythingLoading ? (\n <LoadingView label=\"Loading the latest…\" />\n ) : everythingEmpty ? (\n <EmptyState\n illustration=\"onboarding\"\n icon={<BookOpen className=\"h-10 w-10\" />}\n title=\"Welcome to TheCulturePost\"\n description=\"This publication is just getting started. Curate a topic, draft a story, or begin building the archive.\"\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Draft a story\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('topics')}>\n <Compass className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Curate a topic\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"grid gap-8 lg:grid-cols-3\">\n {/* Main reading column */}\n <div className=\"flex flex-col gap-10 lg:col-span-2\">\n {/* Featured topics */}\n <MagSection\n title=\"Featured topics\"\n description=\"Curated subjects across culture, faith, history and heritage.\"\n action={<SectionLink label=\"All topics\" onClick={() => navigateTo('topics')} />}\n >\n <div data-tour=\"theculturepost-home-topics\">\n {shownTopics.length === 0 ? (\n <EmptyState\n icon={<Compass className=\"h-9 w-9\" />}\n title=\"No topics yet\"\n description=\"Curate the first topic to organise the publication.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {shownTopics.map((topic) => (\n <TopicCard\n key={topic.id}\n topic={topic}\n onOpen={() => navigateTo(`topics/${topic.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n\n {/* Latest published stories */}\n <MagSection\n title=\"Latest published stories\"\n description=\"Freshly published pieces from the newsroom.\"\n action={<SectionLink label=\"All stories\" onClick={() => navigateTo('stories')} />}\n >\n <div data-tour=\"theculturepost-home-stories\">\n {stories.length === 0 ? (\n <EmptyState\n icon={<BookOpen className=\"h-9 w-9\" />}\n title=\"No published stories yet\"\n description=\"Draft a story and move it through the editorial lifecycle to publish.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {stories.map((story) => (\n <StoryCard\n key={story.id}\n story={story}\n hideStatus\n onOpen={() => navigateTo(`stories/${story.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n </div>\n\n {/* Compact right rail */}\n <aside className=\"flex flex-col gap-6\">\n {/* Active discussions */}\n <div data-tour=\"theculturepost-home-discussions\">\n <RailSection\n title=\"Active discussions\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('discussions')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {discussions.length === 0 ? (\n <EmptyState\n icon={<MessagesSquare className=\"h-8 w-8\" />}\n title=\"No open discussions\"\n description=\"Open a discussion to invite thoughtful perspectives.\"\n />\n ) : (\n <div className=\"-mx-2 flex flex-col\">\n {discussions.map((discussion) => (\n <DiscussionRow\n key={discussion.id}\n discussion={discussion}\n onOpen={() => navigateTo(`discussions/${discussion.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n\n {/* From the archive */}\n <div data-tour=\"theculturepost-home-archive\">\n <RailSection\n title=\"From the archive\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('archive')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {collections.length === 0 ? (\n <EmptyState\n icon={<Library className=\"h-8 w-8\" />}\n title=\"The archive is empty\"\n description=\"Create a collection to begin preserving heritage.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {collections.map((collection) => (\n <ArchiveThumb\n key={collection.id}\n collection={collection}\n onOpen={() => navigateTo(`archive/collections/${collection.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n </aside>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ArchiveItemDetailPage — a single archived artifact.
3
+ * @module theculturepost/pages/archive
4
+ *
5
+ * Reads `tcpArchiveItem` (with its parent collection). Two columns: a media
6
+ * viewer with CSS zoom + a full-screen lightbox (the schema exposes a SINGLE
7
+ * `file` — never a thumbnail-strip gallery) and a details panel. "Cite in a
8
+ * story" opens a story picker and writes an `ARCHIVAL_RECORD` citation via
9
+ * `tcpAddCitation`. There is no bookmark/share (the schema has neither).
10
+ */
11
+ export declare function ArchiveItemDetailPage(): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=ArchiveItemDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchiveItemDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/theculturepost/pages/archive/ArchiveItemDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwEH,wBAAgB,qBAAqB,4CAsHpC"}
@@ -1,15 +1,15 @@
1
1
  import { useTheCulturePost as e } from "../../context/TheCulturePostContext.js";
2
- import { cn as t } from "../../utils/cn.js";
3
2
  import "../../context/index.js";
3
+ import { cn as t } from "../../utils/cn.js";
4
4
  import { useFileUrl as n } from "../../hooks/useFiles.js";
5
5
  import { ErrorView as r, LoadingView as i } from "../../components/StateViews.js";
6
6
  import { formatDate as a, formatEnumLabel as o } from "../../utils/formatters.js";
7
7
  import { StatusBadge as s } from "../../components/StatusBadge.js";
8
8
  import { useTcpAddCitation as c, useTcpArchiveItem as l, useTcpStories as u } from "../../hooks/useTcpApi.js";
9
9
  import "../../hooks/index.js";
10
- import { DecorativeDivider as d } from "../../components/DecorativeDivider.js";
11
- import { IMAGE_KINDS as f, KIND_ICON as p } from "../../components/kindIcon.js";
12
- import { describeError as m, notify as h } from "../../lib/toast.js";
10
+ import { describeError as d, notify as f } from "../../lib/toast.js";
11
+ import { DecorativeDivider as p } from "../../components/DecorativeDivider.js";
12
+ import { IMAGE_KINDS as m, KIND_ICON as h } from "../../components/kindIcon.js";
13
13
  import { createElement as g, useEffect as _, useState as v } from "react";
14
14
  import { ArrowLeft as y, CalendarClock as b, Clock as x, Download as S, Globe as C, Landmark as w, Languages as T, Library as E, Loader2 as D, Lock as O, Maximize2 as k, Minus as A, Plus as j, Quote as M, Tag as N, Users as P, X as F } from "lucide-react";
15
15
  import { useParams as I } from "react-router-dom";
@@ -46,20 +46,20 @@ function X({ onBack: e, children: t }) {
46
46
  });
47
47
  }
48
48
  function Z() {
49
- let { id: t } = I(), { navigateTo: n } = e(), { data: c, isLoading: u, isError: f, refetch: m } = l(t), [h, _] = v(!1), y = () => n("archive");
49
+ let { id: t } = I(), { navigateTo: n } = e(), { data: c, isLoading: u, isError: d, refetch: f } = l(t), [m, _] = v(!1), y = () => n("archive");
50
50
  if (u) return /* @__PURE__ */ R(X, {
51
51
  onBack: y,
52
52
  children: /* @__PURE__ */ R(i, { label: "Loading artifact…" })
53
53
  });
54
- if (f || !c) return /* @__PURE__ */ R(X, {
54
+ if (d || !c) return /* @__PURE__ */ R(X, {
55
55
  onBack: y,
56
56
  children: /* @__PURE__ */ R(r, {
57
57
  title: "Artifact not found",
58
58
  message: "This artifact may have been archived, or you may not have access.",
59
- onRetry: () => m()
59
+ onRetry: () => f()
60
60
  })
61
61
  });
62
- let x = c.collection, S = Y[c.accessLevel], D = p[c.kind];
62
+ let x = c.collection, S = Y[c.accessLevel], D = h[c.kind];
63
63
  return /* @__PURE__ */ z(X, {
64
64
  onBack: y,
65
65
  children: [/* @__PURE__ */ z("div", {
@@ -85,7 +85,7 @@ function Z() {
85
85
  className: "whitespace-pre-wrap text-sm leading-relaxed text-text-secondary",
86
86
  children: c.description
87
87
  }),
88
- /* @__PURE__ */ R(d, { className: "py-2" }),
88
+ /* @__PURE__ */ R(p, { className: "py-2" }),
89
89
  /* @__PURE__ */ z("dl", {
90
90
  className: "flex flex-col gap-4",
91
91
  children: [
@@ -143,7 +143,7 @@ function Z() {
143
143
  ]
144
144
  })]
145
145
  }), /* @__PURE__ */ R(ee, {
146
- open: h,
146
+ open: m,
147
147
  onOpenChange: _,
148
148
  item: c
149
149
  })]
@@ -169,7 +169,7 @@ function Q({ icon: e, label: t, children: n }) {
169
169
  });
170
170
  }
171
171
  function $({ item: e }) {
172
- let { data: r } = n(e.file?.id), i = p[e.kind], [a, s] = v(1), [c, l] = v(!1), [u, d] = v(!1), m = f.has(e.kind) && !!r && !u;
172
+ let { data: r } = n(e.file?.id), i = h[e.kind], [a, s] = v(1), [c, l] = v(!1), [u, d] = v(!1), f = m.has(e.kind) && !!r && !u;
173
173
  return _(() => {
174
174
  if (!c) return;
175
175
  let e = (e) => {
@@ -184,7 +184,7 @@ function $({ item: e }) {
184
184
  className: "p-3 sm:p-4",
185
185
  children: /* @__PURE__ */ z("div", {
186
186
  className: t("relative aspect-[4/3] w-full rounded-xl bg-bg-sunken", a > 1 ? "overflow-auto" : "overflow-hidden"),
187
- children: [m && r ? /* @__PURE__ */ R("img", {
187
+ children: [f && r ? /* @__PURE__ */ R("img", {
188
188
  src: r,
189
189
  alt: e.title,
190
190
  onError: () => d(!0),
@@ -202,7 +202,7 @@ function $({ item: e }) {
202
202
  className: "text-sm font-medium",
203
203
  children: o(e.kind)
204
204
  })]
205
- }), m && r && /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R("button", {
205
+ }), f && r && /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R("button", {
206
206
  type: "button",
207
207
  onClick: () => l(!0),
208
208
  "aria-label": "View full screen",
@@ -269,8 +269,8 @@ function $({ item: e }) {
269
269
  });
270
270
  }
271
271
  function ee({ open: e, onOpenChange: t, item: n }) {
272
- let r = u({ pagination: { limit: 50 } }), a = c(), [s, l] = v(""), [d, f] = v(null), [p, g] = v(null), _ = r.data?.items ?? [], y = s.trim().toLowerCase(), b = y ? _.filter((e) => e.title.toLowerCase().includes(y)) : _, x = async (e) => {
273
- f(e.id), g(null);
272
+ let r = u({ pagination: { limit: 50 } }), a = c(), [s, l] = v(""), [p, m] = v(null), [h, g] = v(null), _ = r.data?.items ?? [], y = s.trim().toLowerCase(), b = y ? _.filter((e) => e.title.toLowerCase().includes(y)) : _, x = async (e) => {
273
+ m(e.id), g(null);
274
274
  try {
275
275
  await a.mutateAsync({
276
276
  storyId: e.id,
@@ -279,11 +279,11 @@ function ee({ open: e, onOpenChange: t, item: n }) {
279
279
  provenance: n.provenance ?? null,
280
280
  excerpt: n.description ?? null,
281
281
  sourceFileId: n.file?.id ?? null
282
- }), h.success("Cited in a story", e.title), t(!1);
282
+ }), f.success("Cited in a story", e.title), t(!1);
283
283
  } catch (e) {
284
- g(m(e));
284
+ g(d(e));
285
285
  } finally {
286
- f(null);
286
+ m(null);
287
287
  }
288
288
  };
289
289
  return /* @__PURE__ */ R(U, {
@@ -328,15 +328,15 @@ function ee({ open: e, onOpenChange: t, item: n }) {
328
328
  className: "mt-0.5 block truncate text-xs text-text-tertiary",
329
329
  children: e.topic?.name ?? o(e.status)
330
330
  })]
331
- }), d === e.id ? /* @__PURE__ */ R(D, { className: "h-4 w-4 shrink-0 animate-spin text-text-tertiary" }) : /* @__PURE__ */ R(M, {
331
+ }), p === e.id ? /* @__PURE__ */ R(D, { className: "h-4 w-4 shrink-0 animate-spin text-text-tertiary" }) : /* @__PURE__ */ R(M, {
332
332
  className: "h-4 w-4 shrink-0 text-text-tertiary",
333
333
  "aria-hidden": "true"
334
334
  })]
335
335
  }, e.id))
336
336
  }),
337
- p && /* @__PURE__ */ R("p", {
337
+ h && /* @__PURE__ */ R("p", {
338
338
  className: "text-sm text-status-error-text",
339
- children: p
339
+ children: h
340
340
  })
341
341
  ]
342
342
  }),
@@ -0,0 +1,7 @@
1
+ import { TcpOralHistory } from '../../types';
2
+
3
+ export declare function ArchivePage(): import("react/jsx-runtime").JSX.Element;
4
+ export declare function OralHistoryPlayerRow({ oralHistory }: {
5
+ oralHistory: TcpOralHistory;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=ArchivePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchivePage.d.ts","sourceRoot":"","sources":["../../../../src/theculturepost/pages/archive/ArchivePage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8CH,OAAO,KAAK,EAAsC,cAAc,EAAE,MAAM,aAAa,CAAC;AAUtF,wBAAgB,WAAW,4CA8D1B;AA2OD,wBAAgB,oBAAoB,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,cAAc,CAAA;CAAE,2CAgDpF"}