@burdenoff/microfe-cosmicintersection 2026.830.1 → 2026.1012.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts +1 -1
- package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts.map +1 -1
- package/dist/cosmicintersection/api/cosmicApi.d.ts +48 -48
- package/dist/cosmicintersection/api/cosmicApi.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ActionMenu.d.ts +1 -1
- package/dist/cosmicintersection/components/ActionMenu.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ActionMenu.js.map +1 -1
- package/dist/cosmicintersection/components/ActivityFeedPanel.d.ts +1 -1
- package/dist/cosmicintersection/components/ActivityFeedPanel.d.ts.map +1 -1
- package/dist/cosmicintersection/components/DiscussionPanel.d.ts +1 -1
- package/dist/cosmicintersection/components/DiscussionPanel.d.ts.map +1 -1
- package/dist/cosmicintersection/components/EmptyState.d.ts +1 -1
- package/dist/cosmicintersection/components/EmptyState.d.ts.map +1 -1
- package/dist/cosmicintersection/components/EntityFormShell.d.ts +1 -1
- package/dist/cosmicintersection/components/EntityFormShell.d.ts.map +1 -1
- package/dist/cosmicintersection/components/EntityTagsField.d.ts +1 -1
- package/dist/cosmicintersection/components/EntityTagsField.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ErrorState.d.ts +1 -1
- package/dist/cosmicintersection/components/ErrorState.d.ts.map +1 -1
- package/dist/cosmicintersection/components/ErrorState.js.map +1 -1
- package/dist/cosmicintersection/components/FacetPanel.d.ts +1 -1
- package/dist/cosmicintersection/components/FacetPanel.d.ts.map +1 -1
- package/dist/cosmicintersection/components/FileUploadField.d.ts +2 -2
- package/dist/cosmicintersection/components/FileUploadField.d.ts.map +1 -1
- package/dist/cosmicintersection/components/FileUploadField.js +1 -0
- package/dist/cosmicintersection/components/FileUploadField.js.map +1 -1
- package/dist/cosmicintersection/components/LineageGraph.d.ts +1 -1
- package/dist/cosmicintersection/components/LineageGraph.d.ts.map +1 -1
- package/dist/cosmicintersection/components/LoadingState.d.ts +1 -1
- package/dist/cosmicintersection/components/LoadingState.d.ts.map +1 -1
- package/dist/cosmicintersection/components/PageLayout.d.ts +1 -1
- package/dist/cosmicintersection/components/PageLayout.d.ts.map +1 -1
- package/dist/cosmicintersection/components/Pagination.d.ts +1 -1
- package/dist/cosmicintersection/components/Pagination.d.ts.map +1 -1
- package/dist/cosmicintersection/components/Pagination.js.map +1 -1
- package/dist/cosmicintersection/components/ResultsChart.d.ts +1 -1
- package/dist/cosmicintersection/components/ResultsChart.d.ts.map +1 -1
- package/dist/cosmicintersection/components/SafeLink.d.ts +1 -1
- package/dist/cosmicintersection/components/SafeLink.d.ts.map +1 -1
- package/dist/cosmicintersection/components/StatusBadge.d.ts +1 -1
- package/dist/cosmicintersection/components/StatusBadge.d.ts.map +1 -1
- package/dist/cosmicintersection/components/StatusBadge.js.map +1 -1
- package/dist/cosmicintersection/components/StepDAG.d.ts +1 -1
- package/dist/cosmicintersection/components/StepDAG.d.ts.map +1 -1
- package/dist/cosmicintersection/context/CosmicIntersectionContext.d.ts +1 -1
- package/dist/cosmicintersection/context/CosmicIntersectionContext.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/access/AccessPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/access/AccessPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -1
- package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts +1 -1
- package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/releases/ReleaseFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/runs/RunDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/sources/SourceDetailPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourceFormPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/sources/SourceFormPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts +1 -1
- package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts.map +1 -1
- package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +96 -17
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
- package/dist/shared/hooks/useTr.d.ts.map +1 -1
- package/dist/shared/hooks/useTr.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SourcesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/sources/SourcesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Archive,\n FileInput,\n FlaskConical,\n Plus,\n Radio,\n RadioTower,\n RefreshCw,\n Satellite,\n Telescope,\n Webhook,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosArchiveSourceMutation,\n useCosMarkSourceSyncedMutation,\n useCosSourcesQuery,\n type CosSource,\n type CosSourceStatus,\n type CosSourceType,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst ALL = 'ALL';\n\nconst SOURCE_TYPES: CosSourceType[] = [\n 'TELESCOPE',\n 'SATELLITE',\n 'GROUND_SENSOR',\n 'ARCHIVE',\n 'API',\n 'STREAM',\n 'FILE_DROP',\n 'SIMULATION',\n];\n\nconst SOURCE_STATUSES: CosSourceStatus[] = [\n 'CONFIGURING',\n 'CONNECTED',\n 'SYNCING',\n 'DEGRADED',\n 'ERROR',\n 'DISABLED',\n];\n\n/** Per-type glyph to aid scannability (mockup 06). */\nconst SOURCE_TYPE_ICON: Record<CosSourceType, LucideIcon> = {\n TELESCOPE: Telescope,\n SATELLITE: Satellite,\n GROUND_SENSOR: RadioTower,\n ARCHIVE: Archive,\n API: Webhook,\n STREAM: Radio,\n FILE_DROP: FileInput,\n SIMULATION: FlaskConical,\n};\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function SourcesPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [typeFilter, setTypeFilter] = useState<string>(ALL);\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: `${typeFilter}|${statusFilter}` });\n\n const { data, loading, error, refetch } = useCosSourcesQuery({\n type: typeFilter === ALL ? undefined : (typeFilter as CosSourceType),\n status: statusFilter === ALL ? undefined : (statusFilter as CosSourceStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [markSynced] = useCosMarkSourceSyncedMutation();\n const [archiveSource] = useCosArchiveSourceMutation();\n\n const sources = useMemo(() => data?.cosListSources.items ?? [], [data]);\n const pageInfo = data?.cosListSources.pageInfo;\n\n const handleMarkSynced = async (source: CosSource) => {\n const response = await markSynced({ variables: { id: source.id } });\n if (response.data?.cosMarkSourceSynced) {\n notify.success(\n tr('cosmicintersection.pages.sources.syncSuccess', 'Source marked synced'),\n tr(\n 'cosmicintersection.pages.sources.syncSuccessDescription',\n '“{{name}}” is now up to date.',\n { name: source.name },\n ),\n );\n await refetch();\n }\n };\n\n const handleArchive = async (source: CosSource) => {\n const response = await archiveSource({ variables: { id: source.id } });\n if (response.error) {\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveSource) {\n notify.error(\n tr('cosmicintersection.pages.sources.archiveError', 'Could not archive source'),\n tr('cosmicintersection.pages.sources.archiveErrorDescription', 'The server did not confirm the change.'),\n );\n throw new Error('Archive not confirmed');\n }\n notify.success(tr('cosmicintersection.pages.sources.archiveSuccess', 'Source archived'));\n await refetch();\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('sources/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.sources.create', 'New source')}\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return <LoadingState variant=\"rows\" rows={6} label={tr('cosmicintersection.pages.sources.loading', 'Loading sources…')} />;\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (sources.length === 0) {\n const filtered = typeFilter !== ALL || statusFilter !== ALL;\n return (\n <EmptyState\n icon={Radio}\n title={\n filtered\n ? tr('cosmicintersection.pages.sources.emptyFilterTitle', 'No sources match these filters')\n : tr('cosmicintersection.pages.sources.emptyTitle', 'No data sources yet')\n }\n description={\n filtered\n ? tr(\n 'cosmicintersection.pages.sources.emptyFilterDescription',\n 'Try clearing the type or status filter to see more sources.',\n )\n : tr(\n 'cosmicintersection.pages.sources.emptyDescription',\n 'Connect a telescope, satellite feed, archive or API to start ingesting scientific data.',\n )\n }\n action={filtered ? undefined : newButton}\n />\n );\n }\n\n return (\n <>\n {/* Desktop / tablet: table */}\n <div className=\"hidden overflow-hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tr('cosmicintersection.common.name', 'Name')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.type', 'Type')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.status', 'Status')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.endpoint', 'Endpoint')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.lastSynced', 'Last synced')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.tags', 'Tags')}</TableHead>\n <TableHead className=\"text-right\">{tr('cosmicintersection.common.actions', 'Actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sources.map((source) => {\n const TypeIcon = SOURCE_TYPE_ICON[source.type] ?? Radio;\n return (\n <TableRow\n key={source.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`sources/${source.id}`)}\n >\n <TableCell>\n <div className=\"flex items-start gap-2.5\">\n <span className=\"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <TypeIcon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"font-medium text-text-primary\">{source.name}</div>\n {source.description ? (\n <div className=\"mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary\">\n {source.description}\n </div>\n ) : null}\n </div>\n </div>\n </TableCell>\n <TableCell>\n <Badge variant=\"secondary\">{formatEnumLabel(source.type)}</Badge>\n </TableCell>\n <TableCell>\n <StatusBadge status={source.status} />\n </TableCell>\n <TableCell\n className=\"max-w-[16rem]\"\n onClick={(event) => event.stopPropagation()}\n >\n {source.endpoint ? (\n <SafeLink\n href={source.endpoint}\n className=\"block truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n {source.endpoint}\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(source.lastSyncedAt)}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {source.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n source.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n )}\n {source.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{source.tags.length - 3}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={tr('cosmicintersection.common.actionsFor', 'Actions for {{name}}', { name: source.name })}\n entityName={source.name}\n onView={() => navigate(`sources/${source.id}`)}\n onEdit={() => navigate(`sources/${source.id}/edit`)}\n onDelete={() => handleArchive(source)}\n deleteLabel={tr('cosmicintersection.pages.sources.archive', 'Archive source')}\n extraItems={[\n {\n key: 'mark-synced',\n label: tr('cosmicintersection.pages.sources.markSynced', 'Mark synced'),\n icon: RefreshCw,\n onSelect: () => void handleMarkSynced(source),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile: stacked cards */}\n <ul className=\"space-y-3 md:hidden\">\n {sources.map((source) => {\n const TypeIcon = SOURCE_TYPE_ICON[source.type] ?? Radio;\n return (\n <li key={source.id}>\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={tr('cosmicintersection.common.open', 'Open {{name}}', { name: source.name })}\n onClick={() => navigate(`sources/${source.id}`)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(`sources/${source.id}`);\n }\n }}\n className=\"flex flex-col gap-3 rounded-card border border-border-default bg-bg-elevated p-4 outline-none transition-colors hover:bg-bg-sunken focus-visible:ring-2 focus-visible:ring-border-focus\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <TypeIcon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">{source.name}</p>\n {source.description ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-text-secondary\">\n {source.description}\n </p>\n ) : null}\n </div>\n </div>\n <div onClick={(event) => event.stopPropagation()}>\n <ActionMenu\n ariaLabel={tr('cosmicintersection.common.actionsFor', 'Actions for {{name}}', { name: source.name })}\n entityName={source.name}\n onView={() => navigate(`sources/${source.id}`)}\n onEdit={() => navigate(`sources/${source.id}/edit`)}\n onDelete={() => handleArchive(source)}\n deleteLabel={tr('cosmicintersection.pages.sources.archive', 'Archive source')}\n extraItems={[\n {\n key: 'mark-synced',\n label: tr('cosmicintersection.pages.sources.markSynced', 'Mark synced'),\n icon: RefreshCw,\n onSelect: () => void handleMarkSynced(source),\n },\n ]}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant=\"secondary\">{formatEnumLabel(source.type)}</Badge>\n <StatusBadge status={source.status} />\n </div>\n\n {source.endpoint ? (\n <div onClick={(event) => event.stopPropagation()}>\n <SafeLink\n href={source.endpoint}\n className=\"block truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n {source.endpoint}\n </SafeLink>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-2 text-xs text-text-secondary\">\n <span>{tr('cosmicintersection.common.lastSynced', 'Last synced')}</span>\n <span>{formatDate(source.lastSyncedAt)}</span>\n </div>\n\n {source.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {source.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n {source.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{source.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={sources.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.sources.itemLabel', 'sources')}\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.sources.title', 'Data sources')}\n description={tr(\n 'cosmicintersection.pages.sources.description',\n 'Instruments, archives and feeds that supply raw data into your federation.',\n )}\n actions={newButton}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"w-full max-w-[14rem]\">\n <Select value={typeFilter} onValueChange={setTypeFilter}>\n <SelectTrigger aria-label={tr('cosmicintersection.common.filterByType', 'Filter by type')}>\n <SelectValue placeholder={tr('cosmicintersection.common.allTypes', 'All types')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>{tr('cosmicintersection.common.allTypes', 'All types')}</SelectItem>\n {SOURCE_TYPES.map((type) => (\n <SelectItem key={type} value={type}>\n {formatEnumLabel(type)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"w-full max-w-[14rem]\">\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger aria-label={tr('cosmicintersection.common.filterByStatus', 'Filter by status')}>\n <SelectValue placeholder={tr('cosmicintersection.common.allStatuses', 'All statuses')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>{tr('cosmicintersection.common.allStatuses', 'All statuses')}</SelectItem>\n {SOURCE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {renderBody()}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SourcesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/sources/SourcesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Archive,\n FileInput,\n FlaskConical,\n Plus,\n Radio,\n RadioTower,\n RefreshCw,\n Satellite,\n Telescope,\n Webhook,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosArchiveSourceMutation,\n useCosMarkSourceSyncedMutation,\n useCosSourcesQuery,\n type CosSource,\n type CosSourceStatus,\n type CosSourceType,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst ALL = 'ALL';\n\nconst SOURCE_TYPES: CosSourceType[] = [\n 'TELESCOPE',\n 'SATELLITE',\n 'GROUND_SENSOR',\n 'ARCHIVE',\n 'API',\n 'STREAM',\n 'FILE_DROP',\n 'SIMULATION',\n];\n\nconst SOURCE_STATUSES: CosSourceStatus[] = [\n 'CONFIGURING',\n 'CONNECTED',\n 'SYNCING',\n 'DEGRADED',\n 'ERROR',\n 'DISABLED',\n];\n\n/** Per-type glyph to aid scannability (mockup 06). */\nconst SOURCE_TYPE_ICON: Record<CosSourceType, LucideIcon> = {\n TELESCOPE: Telescope,\n SATELLITE: Satellite,\n GROUND_SENSOR: RadioTower,\n ARCHIVE: Archive,\n API: Webhook,\n STREAM: Radio,\n FILE_DROP: FileInput,\n SIMULATION: FlaskConical,\n};\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function SourcesPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [typeFilter, setTypeFilter] = useState<string>(ALL);\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: `${typeFilter}|${statusFilter}` });\n\n const { data, loading, error, refetch } = useCosSourcesQuery({\n type: typeFilter === ALL ? undefined : (typeFilter as CosSourceType),\n status: statusFilter === ALL ? undefined : (statusFilter as CosSourceStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [markSynced] = useCosMarkSourceSyncedMutation();\n const [archiveSource] = useCosArchiveSourceMutation();\n\n const sources = useMemo(() => data?.cosListSources.items ?? [], [data]);\n const pageInfo = data?.cosListSources.pageInfo;\n\n const handleMarkSynced = async (source: CosSource) => {\n const response = await markSynced({ variables: { id: source.id } });\n if (response.data?.cosMarkSourceSynced) {\n notify.success(\n tr('cosmicintersection.pages.sources.syncSuccess', 'Source marked synced'),\n tr(\n 'cosmicintersection.pages.sources.syncSuccessDescription',\n '“{{name}}” is now up to date.',\n { name: source.name }\n )\n );\n await refetch();\n }\n };\n\n const handleArchive = async (source: CosSource) => {\n const response = await archiveSource({ variables: { id: source.id } });\n if (response.error) {\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveSource) {\n notify.error(\n tr('cosmicintersection.pages.sources.archiveError', 'Could not archive source'),\n tr(\n 'cosmicintersection.pages.sources.archiveErrorDescription',\n 'The server did not confirm the change.'\n )\n );\n throw new Error('Archive not confirmed');\n }\n notify.success(tr('cosmicintersection.pages.sources.archiveSuccess', 'Source archived'));\n await refetch();\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('sources/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.sources.create', 'New source')}\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return (\n <LoadingState\n variant=\"rows\"\n rows={6}\n label={tr('cosmicintersection.pages.sources.loading', 'Loading sources…')}\n />\n );\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (sources.length === 0) {\n const filtered = typeFilter !== ALL || statusFilter !== ALL;\n return (\n <EmptyState\n icon={Radio}\n title={\n filtered\n ? tr(\n 'cosmicintersection.pages.sources.emptyFilterTitle',\n 'No sources match these filters'\n )\n : tr('cosmicintersection.pages.sources.emptyTitle', 'No data sources yet')\n }\n description={\n filtered\n ? tr(\n 'cosmicintersection.pages.sources.emptyFilterDescription',\n 'Try clearing the type or status filter to see more sources.'\n )\n : tr(\n 'cosmicintersection.pages.sources.emptyDescription',\n 'Connect a telescope, satellite feed, archive or API to start ingesting scientific data.'\n )\n }\n action={filtered ? undefined : newButton}\n />\n );\n }\n\n return (\n <>\n {/* Desktop / tablet: table */}\n <div className=\"hidden overflow-hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tr('cosmicintersection.common.name', 'Name')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.type', 'Type')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.status', 'Status')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.endpoint', 'Endpoint')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.lastSynced', 'Last synced')}</TableHead>\n <TableHead>{tr('cosmicintersection.common.tags', 'Tags')}</TableHead>\n <TableHead className=\"text-right\">\n {tr('cosmicintersection.common.actions', 'Actions')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sources.map((source) => {\n const TypeIcon = SOURCE_TYPE_ICON[source.type] ?? Radio;\n return (\n <TableRow\n key={source.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`sources/${source.id}`)}\n >\n <TableCell>\n <div className=\"flex items-start gap-2.5\">\n <span className=\"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <TypeIcon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"font-medium text-text-primary\">{source.name}</div>\n {source.description ? (\n <div className=\"mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary\">\n {source.description}\n </div>\n ) : null}\n </div>\n </div>\n </TableCell>\n <TableCell>\n <Badge variant=\"secondary\">{formatEnumLabel(source.type)}</Badge>\n </TableCell>\n <TableCell>\n <StatusBadge status={source.status} />\n </TableCell>\n <TableCell\n className=\"max-w-[16rem]\"\n onClick={(event) => event.stopPropagation()}\n >\n {source.endpoint ? (\n <SafeLink\n href={source.endpoint}\n className=\"block truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n {source.endpoint}\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(source.lastSyncedAt)}\n </TableCell>\n <TableCell>\n <div className=\"flex max-w-[12rem] flex-wrap gap-1\">\n {source.tags.length === 0 ? (\n <span className=\"text-xs text-text-secondary\">—</span>\n ) : (\n source.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n )}\n {source.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{source.tags.length - 3}\n </span>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={tr(\n 'cosmicintersection.common.actionsFor',\n 'Actions for {{name}}',\n { name: source.name }\n )}\n entityName={source.name}\n onView={() => navigate(`sources/${source.id}`)}\n onEdit={() => navigate(`sources/${source.id}/edit`)}\n onDelete={() => handleArchive(source)}\n deleteLabel={tr(\n 'cosmicintersection.pages.sources.archive',\n 'Archive source'\n )}\n extraItems={[\n {\n key: 'mark-synced',\n label: tr('cosmicintersection.pages.sources.markSynced', 'Mark synced'),\n icon: RefreshCw,\n onSelect: () => void handleMarkSynced(source),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile: stacked cards */}\n <ul className=\"space-y-3 md:hidden\">\n {sources.map((source) => {\n const TypeIcon = SOURCE_TYPE_ICON[source.type] ?? Radio;\n return (\n <li key={source.id}>\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={tr('cosmicintersection.common.open', 'Open {{name}}', {\n name: source.name,\n })}\n onClick={() => navigate(`sources/${source.id}`)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(`sources/${source.id}`);\n }\n }}\n className=\"flex flex-col gap-3 rounded-card border border-border-default bg-bg-elevated p-4 outline-none transition-colors hover:bg-bg-sunken focus-visible:ring-2 focus-visible:ring-border-focus\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-2.5\">\n <span className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <TypeIcon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">{source.name}</p>\n {source.description ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-text-secondary\">\n {source.description}\n </p>\n ) : null}\n </div>\n </div>\n <div onClick={(event) => event.stopPropagation()}>\n <ActionMenu\n ariaLabel={tr(\n 'cosmicintersection.common.actionsFor',\n 'Actions for {{name}}',\n { name: source.name }\n )}\n entityName={source.name}\n onView={() => navigate(`sources/${source.id}`)}\n onEdit={() => navigate(`sources/${source.id}/edit`)}\n onDelete={() => handleArchive(source)}\n deleteLabel={tr(\n 'cosmicintersection.pages.sources.archive',\n 'Archive source'\n )}\n extraItems={[\n {\n key: 'mark-synced',\n label: tr('cosmicintersection.pages.sources.markSynced', 'Mark synced'),\n icon: RefreshCw,\n onSelect: () => void handleMarkSynced(source),\n },\n ]}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant=\"secondary\">{formatEnumLabel(source.type)}</Badge>\n <StatusBadge status={source.status} />\n </div>\n\n {source.endpoint ? (\n <div onClick={(event) => event.stopPropagation()}>\n <SafeLink\n href={source.endpoint}\n className=\"block truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n {source.endpoint}\n </SafeLink>\n </div>\n ) : null}\n\n <div className=\"flex items-center justify-between gap-2 text-xs text-text-secondary\">\n <span>{tr('cosmicintersection.common.lastSynced', 'Last synced')}</span>\n <span>{formatDate(source.lastSyncedAt)}</span>\n </div>\n\n {source.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {source.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n {source.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{source.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={sources.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.sources.itemLabel', 'sources')}\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.sources.title', 'Data sources')}\n description={tr(\n 'cosmicintersection.pages.sources.description',\n 'Instruments, archives and feeds that supply raw data into your federation.'\n )}\n actions={newButton}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"w-full max-w-[14rem]\">\n <Select value={typeFilter} onValueChange={setTypeFilter}>\n <SelectTrigger\n aria-label={tr('cosmicintersection.common.filterByType', 'Filter by type')}\n >\n <SelectValue placeholder={tr('cosmicintersection.common.allTypes', 'All types')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>\n {tr('cosmicintersection.common.allTypes', 'All types')}\n </SelectItem>\n {SOURCE_TYPES.map((type) => (\n <SelectItem key={type} value={type}>\n {formatEnumLabel(type)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"w-full max-w-[14rem]\">\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger\n aria-label={tr('cosmicintersection.common.filterByStatus', 'Filter by status')}\n >\n <SelectValue\n placeholder={tr('cosmicintersection.common.allStatuses', 'All statuses')}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>\n {tr('cosmicintersection.common.allStatuses', 'All statuses')}\n </SelectItem>\n {SOURCE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {renderBody()}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -227,8 +227,8 @@ var e = (e, t) => {
|
|
|
227
227
|
return a = o, (...e) => a(re(...e));
|
|
228
228
|
}, O = [], k = (e) => {
|
|
229
229
|
let t = (t) => t[e] || O;
|
|
230
|
-
return t.isThemeGetter = !0, t;
|
|
231
|
-
}, A = /^\[(?:(\w[\w-]*):)?(.+)\]$/i, j = /^\((?:(\w[\w-]*):)?(.+)\)$/i, M = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/, N = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/, ie = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/, ae = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/, oe = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/, P = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/, F = (e) => M.test(e), I = (e) => !!e && !Number.isNaN(Number(e)), L = (e) => !!e && Number.isInteger(Number(e)), se = (e) => e.endsWith("%") && I(e.slice(0, -1)), R = (e) => N.test(e), ce = () => !0, z = (e) => ie.test(e) && !ae.test(e), B = () => !1, V = (e) => oe.test(e), le = (e) => P.test(e), ue = (e) => !H(e) && !G(e), de = (e) => e.startsWith("@container") && (e[10] === "/" && e[11] !== void 0 || e[11] === "s" && e[16] !== void 0 && e.startsWith("-size/", 10) || e[11] === "n" && e[18] !== void 0 && e.startsWith("-normal/", 10)), fe = (e) => J(e, Q, B), H = (e) => A.test(e), U = (e) => J(e, $, z), pe = (e) => J(e, Ce, I), me = (e) => J(e, Te, ce), he = (e) => J(e, we, B), ge = (e) => J(e, X, B), _e = (e) => J(e, Z, le), W = (e) => J(e, Ee, V), G = (e) => j.test(e), K = (e) => Y(e, $), ve = (e) => Y(e, we), ye = (e) => Y(e, X), be = (e) => Y(e, Q), xe = (e) => Y(e, Z), q = (e) => Y(e, Ee, !0), Se = (e) => Y(e, Te, !0), J = (e, t, n) => {
|
|
230
|
+
return t.isThemeGetter = !0, t.themeKey = e, t;
|
|
231
|
+
}, A = /^\[(?:(\w[\w-]*):)?(.+)\]$/i, j = /^\((?:(\w[\w-]*):)?(.+)\)$/i, M = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/, N = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/, ie = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/, ae = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/, oe = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/, P = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/, F = (e) => M.test(e), I = (e) => !!e && !Number.isNaN(Number(e)), L = (e) => !!e && Number.isInteger(Number(e)), se = (e) => e.endsWith("%") && I(e.slice(0, -1)), R = (e) => N.test(e), ce = () => !0, z = (e) => ie.test(e) && !ae.test(e), B = () => !1, V = (e) => oe.test(e), le = (e) => P.test(e), ue = (e) => !H(e) && !G(e), de = (e) => e.startsWith("@container") && (e[10] === "/" && e[11] !== void 0 || e[11] === "s" && e[16] !== void 0 && e.startsWith("-size/", 10) || e[11] === "n" && e[18] !== void 0 && e.startsWith("-normal/", 10)), fe = (e) => J(e, Q, B), H = (e) => A.test(e), U = (e) => J(e, $, z), pe = (e) => J(e, Ce, I), me = (e) => J(e, Te, ce), he = (e) => J(e, we, B), ge = (e) => J(e, X, B), _e = (e) => J(e, Z, le), W = (e) => J(e, Ee, V), G = (e) => j.test(e), K = (e) => Y(e, $), ve = (e) => Y(e, we), ye = (e) => Y(e, X), be = (e) => Y(e, Q), xe = (e) => Y(e, Z), q = (e) => Y(e, Ee, !0), Se = (e) => Y(e, Te, !0), J = (e, t, n) => {
|
|
232
232
|
let r = A.exec(e);
|
|
233
233
|
return r ? r[1] ? t(r[1]) : n(r[2]) : !1;
|
|
234
234
|
}, Y = (e, t, n = !1) => {
|
|
@@ -343,6 +343,7 @@ var e = (e, t) => {
|
|
|
343
343
|
"fit",
|
|
344
344
|
...C()
|
|
345
345
|
], j = () => [
|
|
346
|
+
s,
|
|
346
347
|
F,
|
|
347
348
|
"screen",
|
|
348
349
|
"full",
|
|
@@ -538,6 +539,7 @@ var e = (e, t) => {
|
|
|
538
539
|
"container-named": [de],
|
|
539
540
|
columns: [{ columns: [
|
|
540
541
|
I,
|
|
542
|
+
"auto",
|
|
541
543
|
H,
|
|
542
544
|
G,
|
|
543
545
|
s
|
|
@@ -786,6 +788,7 @@ var e = (e, t) => {
|
|
|
786
788
|
"max-h": [{ "max-h": [
|
|
787
789
|
"screen",
|
|
788
790
|
"lh",
|
|
791
|
+
"none",
|
|
789
792
|
...A()
|
|
790
793
|
] }],
|
|
791
794
|
"font-size": [{ text: [
|
|
@@ -837,7 +840,11 @@ var e = (e, t) => {
|
|
|
837
840
|
G,
|
|
838
841
|
pe
|
|
839
842
|
] }],
|
|
840
|
-
leading: [{ leading: [
|
|
843
|
+
leading: [{ leading: [
|
|
844
|
+
"none",
|
|
845
|
+
a,
|
|
846
|
+
...C()
|
|
847
|
+
] }],
|
|
841
848
|
"list-image": [{ "list-image": [
|
|
842
849
|
"none",
|
|
843
850
|
G,
|
|
@@ -989,6 +996,7 @@ var e = (e, t) => {
|
|
|
989
996
|
H
|
|
990
997
|
],
|
|
991
998
|
conic: [
|
|
999
|
+
"",
|
|
992
1000
|
L,
|
|
993
1001
|
G,
|
|
994
1002
|
H
|
|
@@ -1075,6 +1083,7 @@ var e = (e, t) => {
|
|
|
1075
1083
|
"outline-color": [{ outline: N() }],
|
|
1076
1084
|
shadow: [{ shadow: [
|
|
1077
1085
|
"",
|
|
1086
|
+
"inner",
|
|
1078
1087
|
"none",
|
|
1079
1088
|
u,
|
|
1080
1089
|
q,
|
|
@@ -1542,8 +1551,18 @@ var e = (e, t) => {
|
|
|
1542
1551
|
"bottom",
|
|
1543
1552
|
"left"
|
|
1544
1553
|
],
|
|
1545
|
-
"inset-x": [
|
|
1546
|
-
|
|
1554
|
+
"inset-x": [
|
|
1555
|
+
"start",
|
|
1556
|
+
"end",
|
|
1557
|
+
"right",
|
|
1558
|
+
"left"
|
|
1559
|
+
],
|
|
1560
|
+
"inset-y": [
|
|
1561
|
+
"inset-bs",
|
|
1562
|
+
"inset-be",
|
|
1563
|
+
"top",
|
|
1564
|
+
"bottom"
|
|
1565
|
+
],
|
|
1547
1566
|
flex: [
|
|
1548
1567
|
"basis",
|
|
1549
1568
|
"grow",
|
|
@@ -1562,8 +1581,18 @@ var e = (e, t) => {
|
|
|
1562
1581
|
"pb",
|
|
1563
1582
|
"pl"
|
|
1564
1583
|
],
|
|
1565
|
-
px: [
|
|
1566
|
-
|
|
1584
|
+
px: [
|
|
1585
|
+
"ps",
|
|
1586
|
+
"pe",
|
|
1587
|
+
"pr",
|
|
1588
|
+
"pl"
|
|
1589
|
+
],
|
|
1590
|
+
py: [
|
|
1591
|
+
"pbs",
|
|
1592
|
+
"pbe",
|
|
1593
|
+
"pt",
|
|
1594
|
+
"pb"
|
|
1595
|
+
],
|
|
1567
1596
|
m: [
|
|
1568
1597
|
"mx",
|
|
1569
1598
|
"my",
|
|
@@ -1576,8 +1605,18 @@ var e = (e, t) => {
|
|
|
1576
1605
|
"mb",
|
|
1577
1606
|
"ml"
|
|
1578
1607
|
],
|
|
1579
|
-
mx: [
|
|
1580
|
-
|
|
1608
|
+
mx: [
|
|
1609
|
+
"ms",
|
|
1610
|
+
"me",
|
|
1611
|
+
"mr",
|
|
1612
|
+
"ml"
|
|
1613
|
+
],
|
|
1614
|
+
my: [
|
|
1615
|
+
"mbs",
|
|
1616
|
+
"mbe",
|
|
1617
|
+
"mt",
|
|
1618
|
+
"mb"
|
|
1619
|
+
],
|
|
1581
1620
|
size: ["w", "h"],
|
|
1582
1621
|
"font-size": ["leading"],
|
|
1583
1622
|
"fvn-normal": [
|
|
@@ -1628,8 +1667,18 @@ var e = (e, t) => {
|
|
|
1628
1667
|
"border-w-b",
|
|
1629
1668
|
"border-w-l"
|
|
1630
1669
|
],
|
|
1631
|
-
"border-w-x": [
|
|
1632
|
-
|
|
1670
|
+
"border-w-x": [
|
|
1671
|
+
"border-w-s",
|
|
1672
|
+
"border-w-e",
|
|
1673
|
+
"border-w-r",
|
|
1674
|
+
"border-w-l"
|
|
1675
|
+
],
|
|
1676
|
+
"border-w-y": [
|
|
1677
|
+
"border-w-bs",
|
|
1678
|
+
"border-w-be",
|
|
1679
|
+
"border-w-t",
|
|
1680
|
+
"border-w-b"
|
|
1681
|
+
],
|
|
1633
1682
|
"border-color": [
|
|
1634
1683
|
"border-color-x",
|
|
1635
1684
|
"border-color-y",
|
|
@@ -1642,8 +1691,18 @@ var e = (e, t) => {
|
|
|
1642
1691
|
"border-color-b",
|
|
1643
1692
|
"border-color-l"
|
|
1644
1693
|
],
|
|
1645
|
-
"border-color-x": [
|
|
1646
|
-
|
|
1694
|
+
"border-color-x": [
|
|
1695
|
+
"border-color-s",
|
|
1696
|
+
"border-color-e",
|
|
1697
|
+
"border-color-r",
|
|
1698
|
+
"border-color-l"
|
|
1699
|
+
],
|
|
1700
|
+
"border-color-y": [
|
|
1701
|
+
"border-color-bs",
|
|
1702
|
+
"border-color-be",
|
|
1703
|
+
"border-color-t",
|
|
1704
|
+
"border-color-b"
|
|
1705
|
+
],
|
|
1647
1706
|
translate: [
|
|
1648
1707
|
"translate-x",
|
|
1649
1708
|
"translate-y",
|
|
@@ -1667,8 +1726,18 @@ var e = (e, t) => {
|
|
|
1667
1726
|
"scroll-mb",
|
|
1668
1727
|
"scroll-ml"
|
|
1669
1728
|
],
|
|
1670
|
-
"scroll-mx": [
|
|
1671
|
-
|
|
1729
|
+
"scroll-mx": [
|
|
1730
|
+
"scroll-ms",
|
|
1731
|
+
"scroll-me",
|
|
1732
|
+
"scroll-mr",
|
|
1733
|
+
"scroll-ml"
|
|
1734
|
+
],
|
|
1735
|
+
"scroll-my": [
|
|
1736
|
+
"scroll-mbs",
|
|
1737
|
+
"scroll-mbe",
|
|
1738
|
+
"scroll-mt",
|
|
1739
|
+
"scroll-mb"
|
|
1740
|
+
],
|
|
1672
1741
|
"scroll-p": [
|
|
1673
1742
|
"scroll-px",
|
|
1674
1743
|
"scroll-py",
|
|
@@ -1681,8 +1750,18 @@ var e = (e, t) => {
|
|
|
1681
1750
|
"scroll-pb",
|
|
1682
1751
|
"scroll-pl"
|
|
1683
1752
|
],
|
|
1684
|
-
"scroll-px": [
|
|
1685
|
-
|
|
1753
|
+
"scroll-px": [
|
|
1754
|
+
"scroll-ps",
|
|
1755
|
+
"scroll-pe",
|
|
1756
|
+
"scroll-pr",
|
|
1757
|
+
"scroll-pl"
|
|
1758
|
+
],
|
|
1759
|
+
"scroll-py": [
|
|
1760
|
+
"scroll-pbs",
|
|
1761
|
+
"scroll-pbe",
|
|
1762
|
+
"scroll-pt",
|
|
1763
|
+
"scroll-pb"
|
|
1764
|
+
],
|
|
1686
1765
|
touch: [
|
|
1687
1766
|
"touch-x",
|
|
1688
1767
|
"touch-y",
|