@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.
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -1
- package/dist/services/assistantApi.d.ts +15 -0
- package/dist/services/assistantApi.d.ts.map +1 -0
- package/dist/services/assistantApi.js +204 -0
- package/dist/services/assistantApi.js.map +1 -0
- package/dist/services/createSandboxAssistantTransport.d.ts +26 -0
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/services/createSandboxAssistantTransport.js +126 -0
- package/dist/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/theculturepost/TheCulturePostRoot.d.ts +5 -0
- package/dist/theculturepost/TheCulturePostRoot.d.ts.map +1 -0
- package/dist/theculturepost/TheCulturePostRoutes.d.ts +4 -0
- package/dist/theculturepost/TheCulturePostRoutes.d.ts.map +1 -0
- package/dist/theculturepost/TheCulturePostRoutes.js +73 -40
- package/dist/theculturepost/TheCulturePostRoutes.js.map +1 -1
- package/dist/theculturepost/components/AddCitationDialog.d.ts +11 -0
- package/dist/theculturepost/components/AddCitationDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/ArchiveItemCard.d.ts +9 -0
- package/dist/theculturepost/components/ArchiveItemCard.d.ts.map +1 -0
- package/dist/theculturepost/components/AudioPlayer.d.ts +22 -0
- package/dist/theculturepost/components/AudioPlayer.d.ts.map +1 -0
- package/dist/theculturepost/components/AuthorLabel.d.ts +16 -0
- package/dist/theculturepost/components/AuthorLabel.d.ts.map +1 -0
- package/dist/theculturepost/components/AuthorLabel.js +1 -1
- package/dist/theculturepost/components/CitationList.d.ts +27 -0
- package/dist/theculturepost/components/CitationList.d.ts.map +1 -0
- package/dist/theculturepost/components/CollectionCard.d.ts +9 -0
- package/dist/theculturepost/components/CollectionCard.d.ts.map +1 -0
- package/dist/theculturepost/components/CoverImage.d.ts +13 -0
- package/dist/theculturepost/components/CoverImage.d.ts.map +1 -0
- package/dist/theculturepost/components/CreateArchiveItemDialog.d.ts +12 -0
- package/dist/theculturepost/components/CreateArchiveItemDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/CreateCollectionDialog.d.ts +10 -0
- package/dist/theculturepost/components/CreateCollectionDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/CreateStoryDialog.d.ts +12 -0
- package/dist/theculturepost/components/CreateStoryDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/CreateTopicDialog.d.ts +10 -0
- package/dist/theculturepost/components/CreateTopicDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/DecorativeCover.d.ts +17 -0
- package/dist/theculturepost/components/DecorativeCover.d.ts.map +1 -0
- package/dist/theculturepost/components/DecorativeDivider.d.ts +14 -0
- package/dist/theculturepost/components/DecorativeDivider.d.ts.map +1 -0
- package/dist/theculturepost/components/DiscussionCard.d.ts +9 -0
- package/dist/theculturepost/components/DiscussionCard.d.ts.map +1 -0
- package/dist/theculturepost/components/EmptyState.d.ts +18 -0
- package/dist/theculturepost/components/EmptyState.d.ts.map +1 -0
- package/dist/theculturepost/components/FileImage.d.ts +18 -0
- package/dist/theculturepost/components/FileImage.d.ts.map +1 -0
- package/dist/theculturepost/components/FileUploadField.d.ts +29 -0
- package/dist/theculturepost/components/FileUploadField.d.ts.map +1 -0
- package/dist/theculturepost/components/FilterTabs.d.ts +18 -0
- package/dist/theculturepost/components/FilterTabs.d.ts.map +1 -0
- package/dist/theculturepost/components/HistoryTimeline.d.ts +20 -0
- package/dist/theculturepost/components/HistoryTimeline.d.ts.map +1 -0
- package/dist/theculturepost/components/LifecycleStepper.d.ts +11 -0
- package/dist/theculturepost/components/LifecycleStepper.d.ts.map +1 -0
- package/dist/theculturepost/components/OpenDiscussionDialog.d.ts +12 -0
- package/dist/theculturepost/components/OpenDiscussionDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/OralHistoryCard.d.ts +8 -0
- package/dist/theculturepost/components/OralHistoryCard.d.ts.map +1 -0
- package/dist/theculturepost/components/OverlayBadge.d.ts +15 -0
- package/dist/theculturepost/components/OverlayBadge.d.ts.map +1 -0
- package/dist/theculturepost/components/PageHero.d.ts +26 -0
- package/dist/theculturepost/components/PageHero.d.ts.map +1 -0
- package/dist/theculturepost/components/PageLayout.d.ts +16 -0
- package/dist/theculturepost/components/PageLayout.d.ts.map +1 -0
- package/dist/theculturepost/components/Pagination.d.ts +22 -0
- package/dist/theculturepost/components/Pagination.d.ts.map +1 -0
- package/dist/theculturepost/components/RecordOralHistoryDialog.d.ts +47 -0
- package/dist/theculturepost/components/RecordOralHistoryDialog.d.ts.map +1 -0
- package/dist/theculturepost/components/ReplyThread.d.ts +20 -0
- package/dist/theculturepost/components/ReplyThread.d.ts.map +1 -0
- package/dist/theculturepost/components/ReplyThread.js +1 -1
- package/dist/theculturepost/components/StateViews.d.ts +24 -0
- package/dist/theculturepost/components/StateViews.d.ts.map +1 -0
- package/dist/theculturepost/components/StatusBadge.d.ts +11 -0
- package/dist/theculturepost/components/StatusBadge.d.ts.map +1 -0
- package/dist/theculturepost/components/StoryCard.d.ts +11 -0
- package/dist/theculturepost/components/StoryCard.d.ts.map +1 -0
- package/dist/theculturepost/components/Tabs.d.ts +17 -0
- package/dist/theculturepost/components/Tabs.d.ts.map +1 -0
- package/dist/theculturepost/components/TagInput.d.ts +20 -0
- package/dist/theculturepost/components/TagInput.d.ts.map +1 -0
- package/dist/theculturepost/components/TopicCard.d.ts +9 -0
- package/dist/theculturepost/components/TopicCard.d.ts.map +1 -0
- package/dist/theculturepost/components/Waveform.d.ts +23 -0
- package/dist/theculturepost/components/Waveform.d.ts.map +1 -0
- package/dist/theculturepost/components/categoryMeta.d.ts +14 -0
- package/dist/theculturepost/components/categoryMeta.d.ts.map +1 -0
- package/dist/theculturepost/components/index.d.ts +43 -0
- package/dist/theculturepost/components/index.d.ts.map +1 -0
- package/dist/theculturepost/components/kindIcon.d.ts +7 -0
- package/dist/theculturepost/components/kindIcon.d.ts.map +1 -0
- package/dist/theculturepost/components/viz/BarChart.d.ts +23 -0
- package/dist/theculturepost/components/viz/BarChart.d.ts.map +1 -0
- package/dist/theculturepost/components/viz/Donut.d.ts +25 -0
- package/dist/theculturepost/components/viz/Donut.d.ts.map +1 -0
- package/dist/theculturepost/components/viz/StatTile.d.ts +14 -0
- package/dist/theculturepost/components/viz/StatTile.d.ts.map +1 -0
- package/dist/theculturepost/components/viz/index.d.ts +11 -0
- package/dist/theculturepost/components/viz/index.d.ts.map +1 -0
- package/dist/theculturepost/context/TheCulturePostContext.d.ts +16 -0
- package/dist/theculturepost/context/TheCulturePostContext.d.ts.map +1 -0
- package/dist/theculturepost/context/index.d.ts +6 -0
- package/dist/theculturepost/context/index.d.ts.map +1 -0
- package/dist/theculturepost/hooks/index.d.ts +10 -0
- package/dist/theculturepost/hooks/index.d.ts.map +1 -0
- package/dist/theculturepost/hooks/index.js +2 -0
- package/dist/theculturepost/hooks/useCursorPager.d.ts +32 -0
- package/dist/theculturepost/hooks/useCursorPager.d.ts.map +1 -0
- package/dist/theculturepost/hooks/useFiles.d.ts +31 -0
- package/dist/theculturepost/hooks/useFiles.d.ts.map +1 -0
- package/dist/theculturepost/hooks/usePageAnalytics.d.ts +9 -0
- package/dist/theculturepost/hooks/usePageAnalytics.d.ts.map +1 -0
- package/dist/theculturepost/hooks/usePageAnalytics.js +34 -0
- package/dist/theculturepost/hooks/usePageAnalytics.js.map +1 -0
- package/dist/theculturepost/hooks/useTcpApi.d.ts +74 -0
- package/dist/theculturepost/hooks/useTcpApi.d.ts.map +1 -0
- package/dist/theculturepost/hooks/useTr.d.ts +8 -0
- package/dist/theculturepost/hooks/useTr.d.ts.map +1 -0
- package/dist/theculturepost/hooks/useTr.js +14 -0
- package/dist/theculturepost/hooks/useTr.js.map +1 -0
- package/dist/theculturepost/index.d.ts +9 -0
- package/dist/theculturepost/index.d.ts.map +1 -0
- package/dist/theculturepost/index.js +2 -1
- package/dist/theculturepost/lib/graphql-cache.d.ts +26 -0
- package/dist/theculturepost/lib/graphql-cache.d.ts.map +1 -0
- package/dist/theculturepost/lib/toast.d.ts +23 -0
- package/dist/theculturepost/lib/toast.d.ts.map +1 -0
- package/dist/theculturepost/pages/HomePage.d.ts +16 -0
- package/dist/theculturepost/pages/HomePage.d.ts.map +1 -0
- package/dist/theculturepost/pages/HomePage.js +83 -68
- package/dist/theculturepost/pages/HomePage.js.map +1 -1
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.d.ts +12 -0
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/archive/ArchiveItemDetailPage.js +21 -21
- package/dist/theculturepost/pages/archive/ArchivePage.d.ts +7 -0
- package/dist/theculturepost/pages/archive/ArchivePage.d.ts.map +1 -0
- package/dist/theculturepost/pages/archive/ArchivePage.js +144 -125
- package/dist/theculturepost/pages/archive/ArchivePage.js.map +1 -1
- package/dist/theculturepost/pages/archive/CollectionDetailPage.d.ts +12 -0
- package/dist/theculturepost/pages/archive/CollectionDetailPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.d.ts +12 -0
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js +78 -70
- package/dist/theculturepost/pages/discussions/DiscussionDetailPage.js.map +1 -1
- package/dist/theculturepost/pages/discussions/DiscussionsPage.d.ts +10 -0
- package/dist/theculturepost/pages/discussions/DiscussionsPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/discussions/DiscussionsPage.js +63 -56
- package/dist/theculturepost/pages/discussions/DiscussionsPage.js.map +1 -1
- package/dist/theculturepost/pages/governance/GovernancePage.d.ts +20 -0
- package/dist/theculturepost/pages/governance/GovernancePage.d.ts.map +1 -0
- package/dist/theculturepost/pages/stories/StoriesPage.d.ts +9 -0
- package/dist/theculturepost/pages/stories/StoriesPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/stories/StoriesPage.js +65 -58
- package/dist/theculturepost/pages/stories/StoriesPage.js.map +1 -1
- package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts +18 -0
- package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/stories/StoryDetailPage.js +249 -229
- package/dist/theculturepost/pages/stories/StoryDetailPage.js.map +1 -1
- package/dist/theculturepost/pages/timeline/TimelinePage.d.ts +17 -0
- package/dist/theculturepost/pages/timeline/TimelinePage.d.ts.map +1 -0
- package/dist/theculturepost/pages/topics/TopicDetailPage.d.ts +12 -0
- package/dist/theculturepost/pages/topics/TopicDetailPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/topics/TopicsPage.d.ts +12 -0
- package/dist/theculturepost/pages/topics/TopicsPage.d.ts.map +1 -0
- package/dist/theculturepost/pages/topics/TopicsPage.js +61 -52
- package/dist/theculturepost/pages/topics/TopicsPage.js.map +1 -1
- package/dist/theculturepost/styles/injectDisplayFont.d.ts +14 -0
- package/dist/theculturepost/styles/injectDisplayFont.d.ts.map +1 -0
- package/dist/theculturepost/translations/ar.d.ts +50 -0
- package/dist/theculturepost/translations/ar.d.ts.map +1 -0
- package/dist/theculturepost/translations/ar.js +54 -0
- package/dist/theculturepost/translations/ar.js.map +1 -0
- package/dist/theculturepost/translations/en.d.ts +50 -0
- package/dist/theculturepost/translations/en.d.ts.map +1 -0
- package/dist/theculturepost/translations/en.js +54 -0
- package/dist/theculturepost/translations/en.js.map +1 -0
- package/dist/theculturepost/translations/es.d.ts +50 -0
- package/dist/theculturepost/translations/es.d.ts.map +1 -0
- package/dist/theculturepost/translations/es.js +54 -0
- package/dist/theculturepost/translations/es.js.map +1 -0
- package/dist/theculturepost/translations/hi.d.ts +50 -0
- package/dist/theculturepost/translations/hi.d.ts.map +1 -0
- package/dist/theculturepost/translations/hi.js +54 -0
- package/dist/theculturepost/translations/hi.js.map +1 -0
- package/dist/theculturepost/translations/index.d.ts +7 -0
- package/dist/theculturepost/translations/index.d.ts.map +1 -0
- package/dist/theculturepost/translations/ta.d.ts +50 -0
- package/dist/theculturepost/translations/ta.d.ts.map +1 -0
- package/dist/theculturepost/translations/ta.js +54 -0
- package/dist/theculturepost/translations/ta.js.map +1 -0
- package/dist/theculturepost/translations/zh.d.ts +50 -0
- package/dist/theculturepost/translations/zh.d.ts.map +1 -0
- package/dist/theculturepost/translations/zh.js +54 -0
- package/dist/theculturepost/translations/zh.js.map +1 -0
- package/dist/theculturepost/types/index.d.ts +333 -0
- package/dist/theculturepost/types/index.d.ts.map +1 -0
- package/dist/theculturepost/utils/cn.d.ts +4 -0
- package/dist/theculturepost/utils/cn.d.ts.map +1 -0
- package/dist/theculturepost/utils/formatters.d.ts +19 -0
- package/dist/theculturepost/utils/formatters.d.ts.map +1 -0
- package/dist/theculturepost/utils/i18n.d.ts +6 -0
- package/dist/theculturepost/utils/i18n.d.ts.map +1 -0
- package/dist/theculturepost/utils/index.d.ts +11 -0
- package/dist/theculturepost/utils/index.d.ts.map +1 -0
- package/dist/theculturepost/utils/index.js +6 -0
- package/dist/theculturepost/utils/nativeBridge.d.ts +47 -0
- package/dist/theculturepost/utils/nativeBridge.d.ts.map +1 -0
- package/dist/theculturepost/utils/nativeBridge.js +60 -0
- package/dist/theculturepost/utils/nativeBridge.js.map +1 -0
- package/dist/theculturepost/utils/navigation.d.ts +14 -0
- package/dist/theculturepost/utils/navigation.d.ts.map +1 -0
- package/dist/theculturepost/utils/slug.d.ts +6 -0
- package/dist/theculturepost/utils/slug.d.ts.map +1 -0
- package/dist/types/assistant.d.ts +56 -0
- package/dist/types/assistant.d.ts.map +1 -0
- package/dist/utils/pageContext.d.ts +27 -0
- package/dist/utils/pageContext.d.ts.map +1 -0
- package/dist/utils/pageContext.js +47 -0
- package/dist/utils/pageContext.js.map +1 -0
- 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 {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
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:
|
|
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 (
|
|
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: () =>
|
|
59
|
+
onRetry: () => f()
|
|
60
60
|
})
|
|
61
61
|
});
|
|
62
|
-
let x = c.collection, S = Y[c.accessLevel], D =
|
|
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(
|
|
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:
|
|
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 =
|
|
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: [
|
|
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
|
-
}),
|
|
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(""), [
|
|
273
|
-
|
|
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
|
-
}),
|
|
282
|
+
}), f.success("Cited in a story", e.title), t(!1);
|
|
283
283
|
} catch (e) {
|
|
284
|
-
g(
|
|
284
|
+
g(d(e));
|
|
285
285
|
} finally {
|
|
286
|
-
|
|
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
|
-
}),
|
|
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
|
-
|
|
337
|
+
h && /* @__PURE__ */ R("p", {
|
|
338
338
|
className: "text-sm text-status-error-text",
|
|
339
|
-
children:
|
|
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"}
|