@sanity/dashboard
6.0.176.0.18
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Card","Box","Heading","getTheme_v2","styled","Root","Header","Footer","Content","theme","media","DashboardWidgetProps","header","children","React","ReactNode","footer","ref","Ref","HTMLDivElement","DashboardWidgetContainer","props","$","_c","t0","t1","t2","t3","createContext","useContext","DashboardConfig","DashboardContext","widgets","useDashboardConfig","Card","useMemo","DashboardWidget","useDashboardConfig","WidgetContainer","props","$","_c","config","t0","layout","Widget","component","t1","t2","height","width","useClient","useVersionedClient","$","_c","t0","Symbol","for","apiVersion","Box","Card","Stack","Heading","Grid","Label","Text","Button","Code","useEffect","useMemo","useState","Subscription","DashboardWidgetContainer","WidgetContainer","DashboardWidget","useVersionedClient","App","ProjectInfoProps","ProjectData","UserApplication","isUrl","url","test","getGraphQLUrl","projectId","dataset","getGroqUrl","getManageUrl","NO_EXPERIMENTAL","NO_DATA","ProjectInfo","props","$","_c","__experimental_before","t0","data","t1","undefined","studioApps","setStudioApps","graphQLApi","setGraphQLApi","versionedClient","t2","config","t3","t4","t5","observable","subscriptions","push","request","tag","subscribe","next","result","filter","_temp","error","console","method","error_0","statusCode","forEach","_temp2","t6","result_0","title","rows","value","apps","_temp3","Array","isArray","app_0","app","urlType","appHost","length","concat","_temp4","otherStuff","item_1","item","category","group","Object","keys","assembleTableRows","t7","map","_temp5","t8","t9","Symbol","for","width","t10","t11","t12","t13","_temp7","t14","t15","t16","t17","item_2","_temp6","row","rowValue","wordBreak","widgetConfig","idx","item_0","s","unsubscribe","type","LayoutConfig","DashboardWidget","ProjectInfo","projectInfoWidget","config","layout","name","component","width","RobotIcon","Box","Flex","rem","Stack","Text","useListFormat","User","UserAvatar","styled","Root","ProjectUserProps","user","isRobot","roles","ProjectUser","t0","$","_c","t1","Symbol","for","style","listFormat","t2","t3","color","t4","displayName","t5","format","t6","t7","t8","Stack","Spinner","Box","Text","Button","useCallback","useEffect","useState","from","map","switchMap","Role","User","useUserStore","DashboardWidgetContainer","useVersionedClient","ProjectUser","getInviteUrl","projectId","Member","id","roles","isRobot","isCurrentUser","createdAt","Project","members","ProjectUsers","$","_c","project","setProject","users","setUsers","error","setError","userStore","versionedClient","t0","config","subscription","observable","request","url","tag","pipe","_project","getUsers","_temp","_users","subscribe","next","t1","_users_0","_project_0","Array","isArray","sort","userA","userB","sortUsersByRobotStatus","e","unsubscribe","fetchData","t2","t3","handleRetryFetch","isLoading","t4","Symbol","for","t5","width","undefined","t6","t7","t8","user","membership","find","member","_temp2","t9","role","title","mem","membershipA","membershipB","LayoutConfig","DashboardWidget","ProjectUsers","projectUsersWidget","config","layout","name","component","createImageUrlBuilder","useMemo","useVersionedClient","tutorialsProjectConfig","projectId","dataset","Guide","_type","slug","current","presenter","name","FeedItem","_id","title","poster","category","guideOrTutorial","externalLink","hasVideo","useDataAdapter","$","_c","versionedClient","t0","templateRepoId","url","observable","request","tag","withCredentials","t1","Symbol","for","t2","getFeed","urlBuilder","PlayIcon","Card","Box","Heading","Flex","Text","Stack","getTheme_v2","styled","PlayIconBox","theme","color","bg","Root","PosterCard","Poster","img","TutorialProps","title","posterURL","href","showPlayIcon","presenterName","presenterSubtitle","Tutorial","props","$","_c","t0","Symbol","for","position","t1","height","t2","t3","t4","t5","opacity","t6","t7","t8","t9","t10","Flex","useEffect","useState","DashboardWidgetContainer","FeedItem","useDataAdapter","Tutorial","createUrl","slug","current","type","SanityTutorialsProps","templateRepoId","SanityTutorials","props","$","_c","t0","Symbol","for","feedItems","setFeedItems","getFeed","urlBuilder","t1","t2","subscription","subscribe","response","items","unsubscribe","t3","map","feedItem","index","title","guideOrTutorial","externalLink","presenter","subtitle","category","t4","undefined","href","_type","_id","length","minWidth","width","name","hasVideo","poster","image","height","url","LayoutConfig","DashboardWidget","SanityTutorials","sanityTutorialsWidget","config","layout","name","component","width","Container","DashboardLayout","t0","$","_c","children","t1","Symbol","for","height","overflowY","t2","Box","Card","Grid","Text","getTheme_v2","styled","css","WidgetContainer","DashboardConfig","LayoutConfig","DashboardWidget","media","small","args","Parameters","theme","medium","Root","WidgetGroupProps","config","Partial","NO_WIDGETS","NO_LAYOUT","WidgetGroup","props","$","_c","t0","layout","t1","widgets","t2","undefined","t3","width","t4","height","t5","length","t6","map","_temp","t7","widgetConfig","index","type","component","name","DashboardLayout","WidgetGroup","DashboardConfig","DashboardContext","Dashboard","t0","$","_c","config","t1","t2","ComponentType","CSSProperties","definePlugin","Dashboard","DashboardConfig","DashboardWidget","LayoutConfig","strokeStyle","stroke","strokeWidth","DashboardIcon","$","_c","t0","Symbol","for","DashboardPluginConfig","title","name","icon","widgets","defaultLayout","dashboardTool","config","pluginConfig","layout","tools","component"],"sources":["../src/components/DashboardWidgetContainer.tsx","../src/containers/DashboardContext.tsx","../src/containers/WidgetContainer.tsx","../src/versionedClient.ts","../src/widgets/projectInfo/ProjectInfo.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/ProjectUser.tsx","../src/widgets/projectUsers/ProjectUsers.tsx","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/dataAdapter.ts","../src/widgets/sanityTutorials/Tutorial.tsx","../src/widgets/sanityTutorials/SanityTutorials.tsx","../src/widgets/sanityTutorials/index.ts","../src/components/DashboardLayout.tsx","../src/components/WidgetGroup.tsx","../src/containers/Dashboard.tsx","../src/plugin.tsx"],"sourcesContent":["import {Card, Box, Heading} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Card)`\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n`\n\nconst Header = styled(Card)`\n position: sticky;\n top: 0;\n z-index: 2;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n`\n\nconst Footer = styled(Card)`\n position: sticky;\n overflow: hidden;\n bottom: 0;\n z-index: 2;\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n margin-top: auto;\n`\n\nconst Content = styled(Box)`\n position: relative;\n z-index: 1;\n height: stretch;\n min-height: 21.5em;\n\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n overflow-y: auto;\n outline: none;\n }\n`\n\ninterface DashboardWidgetProps {\n header?: string\n children: React.ReactNode\n footer?: React.ReactNode\n ref?: React.Ref<HTMLDivElement>\n}\n\nexport function DashboardWidgetContainer(props: DashboardWidgetProps) {\n const {header, children, footer, ref} = props\n\n return (\n <Root radius={3} display=\"flex\" ref={ref}>\n {header && (\n <Header borderBottom paddingX={3} paddingY={4}>\n <Heading size={1} textOverflow=\"ellipsis\">\n {header}\n </Heading>\n </Header>\n )}\n {children && <Content>{children}</Content>}\n {footer && <Footer borderTop>{footer}</Footer>}\n </Root>\n )\n}\n","import {createContext, useContext} from 'react'\n\nimport {type DashboardConfig} from '../types'\n\nexport const DashboardContext = createContext<DashboardConfig>({widgets: []})\n\nexport function useDashboardConfig(): DashboardConfig {\n return useContext(DashboardContext)\n}\n","import {Card} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {type DashboardWidget} from '../types'\nimport {useDashboardConfig} from './DashboardContext'\n\nexport function WidgetContainer(props: DashboardWidget) {\n const config = useDashboardConfig()\n const layout = useMemo(\n () => ({\n ...props.layout,\n ...config.layout,\n }),\n [props.layout, config.layout],\n )\n\n const Widget = props.component\n\n return (\n <Card shadow={1} data-width={layout.width} data-height={layout.height}>\n <Widget />\n </Card>\n )\n}\n","import {useClient} from 'sanity'\n\nexport function useVersionedClient() {\n return useClient({apiVersion: '2024-08-01'})\n}\n","import {Box, Card, Stack, Heading, Grid, Label, Text, Button} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useEffect, useMemo, useState} from 'react'\nimport {type Subscription} from 'rxjs'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {WidgetContainer} from '../../containers/WidgetContainer'\nimport {type DashboardWidget} from '../../types'\nimport {useVersionedClient} from '../../versionedClient'\nimport {type App, type ProjectInfoProps, type ProjectData, type UserApplication} from './types'\n\nfunction isUrl(url?: string) {\n return url && /^https?:\\/\\//.test(url)\n}\n\nfunction getGraphQLUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/graphql/${dataset}/default`\n}\n\nfunction getGroqUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/groq/${dataset}`\n}\n\nfunction getManageUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}`\n}\n\nconst NO_EXPERIMENTAL: DashboardWidget[] = []\nconst NO_DATA: ProjectData[] = []\n\nexport function ProjectInfo(props: ProjectInfoProps) {\n const {__experimental_before = NO_EXPERIMENTAL, data = NO_DATA} = props\n const [studioApps, setStudioApps] = useState<UserApplication[] | {error: string} | undefined>()\n const [graphQLApi, setGraphQLApi] = useState<string | {error: string} | undefined>()\n const versionedClient = useVersionedClient()\n const {projectId = 'unknown', dataset = 'unknown'} = versionedClient.config()\n\n useEffect(() => {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n versionedClient.observable\n .request<UserApplication[]>({url: '/user-applications', tag: 'dashboard.project-info'})\n .subscribe({\n next: (result) => setStudioApps(result.filter((app) => app.type === 'studio')),\n error: (error) => {\n console.error('Error while resolving user applications', error)\n setStudioApps({\n error: 'Something went wrong while resolving user applications. See console.',\n })\n },\n }),\n )\n\n // ping assumed graphql endpoint\n subscriptions.push(\n versionedClient.observable\n .request({\n method: 'HEAD',\n url: `/graphql/${dataset}/default`,\n tag: 'dashboard.project-info.graphql-api',\n })\n .subscribe({\n next: () => setGraphQLApi(getGraphQLUrl(projectId, dataset)),\n error: (error) => {\n if (error.statusCode === 404) {\n setGraphQLApi(undefined)\n } else {\n console.error('Error while looking for graphQLApi', error)\n setGraphQLApi({\n error: 'Something went wrong while looking up graphQLApi. See console.',\n })\n }\n },\n }),\n )\n\n return () => {\n subscriptions.forEach((s) => s.unsubscribe())\n }\n }, [dataset, projectId, versionedClient, setGraphQLApi])\n\n const assembleTableRows = useMemo(() => {\n let result: App[] = [\n {\n title: 'Sanity project',\n rows: [\n {title: 'Project ID', value: projectId},\n {title: 'Dataset', value: dataset},\n ],\n },\n ]\n\n const apps: App[] = data.filter((item) => item.category === 'apps')\n\n // Handle studios\n ;(Array.isArray(studioApps) ? studioApps : []).forEach((app) => {\n apps.push({\n title: app.title || 'Studio',\n value: app.urlType === 'internal' ? `https://${app.appHost}.sanity.studio` : app.appHost,\n })\n })\n\n if (apps.length > 0) {\n result = result.concat([{title: 'Apps', rows: apps}])\n }\n\n // Handle APIs\n result = result.concat(\n [\n {\n title: 'APIs',\n rows: [\n {title: 'GROQ', value: getGroqUrl(projectId, dataset)},\n {\n title: 'GraphQL',\n value: (typeof graphQLApi === 'object' ? 'Error' : graphQLApi) ?? 'Not deployed',\n },\n ],\n },\n ],\n data.filter((item) => item.category === 'apis'),\n )\n\n // Handle whatever else there might be\n const otherStuff: Record<string, ProjectData[]> = {}\n data.forEach((item) => {\n if (item.category && item.category !== 'apps' && item.category !== 'apis') {\n const group = otherStuff[item.category] ?? []\n group.push(item)\n otherStuff[item.category] = group\n }\n })\n Object.keys(otherStuff).forEach((category) => {\n result.push({title: category, rows: otherStuff[category]})\n })\n\n return result\n }, [graphQLApi, studioApps, projectId, dataset, data])\n\n return (\n <>\n {__experimental_before.map((widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n ))}\n <Box height=\"fill\" marginTop={__experimental_before?.length > 0 ? 4 : 0}>\n <DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>\n </Box>\n </>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectInfo} from './ProjectInfo'\n\nexport function projectInfoWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-info',\n component: ProjectInfo,\n layout: config?.layout ?? {width: 'medium'},\n }\n}\n","import {RobotIcon} from '@sanity/icons/Robot'\nimport {Box, Flex, rem, Stack, Text} from '@sanity/ui'\nimport {useListFormat, type User, UserAvatar} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Flex)`\n height: ${rem(33)}; // 33 = PREVIEW_SIZES.default.media.height\n box-sizing: content-box;\n`\n\nexport interface ProjectUserProps {\n user: User\n isRobot: boolean\n roles: string[]\n}\n\nexport function ProjectUser({user, isRobot, roles}: ProjectUserProps) {\n const listFormat = useListFormat({style: 'narrow'})\n return (\n <Root align=\"center\">\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex=\"none\">\n {isRobot ? (\n <Text size={2}>\n <RobotIcon />\n </Text>\n ) : (\n <UserAvatar user={user} />\n )}\n </Box>\n\n <Stack flex={1} gap={2}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>\n\n <Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>\n </Stack>\n </Flex>\n </Root>\n )\n}\n","import {Stack, Spinner, Box, Text, Button} from '@sanity/ui'\nimport {useCallback, useEffect, useState} from 'react'\nimport {from} from 'rxjs'\nimport {map, switchMap} from 'rxjs/operators'\nimport {type Role, type User, useUserStore} from 'sanity'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {useVersionedClient} from '../../versionedClient'\nimport {ProjectUser} from './ProjectUser'\n\nfunction getInviteUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}/members`\n}\n\ninterface Member {\n id: string\n roles: Role[]\n isRobot: boolean\n isCurrentUser: boolean\n createdAt: string\n}\n\ninterface Project {\n id: string\n members: Member[]\n}\n\nexport function ProjectUsers() {\n const [project, setProject] = useState<Project | undefined>()\n const [users, setUsers] = useState<User[] | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const userStore = useUserStore()\n const versionedClient = useVersionedClient()\n\n const fetchData = useCallback(() => {\n const {projectId} = versionedClient.config()\n const subscription = versionedClient.observable\n .request<Project>({\n url: `/projects/${projectId}`,\n tag: 'dashboard.project-users',\n })\n .pipe(\n switchMap((_project) =>\n from(userStore.getUsers(_project.members.map((mem) => mem.id))).pipe(\n map((_users) => ({project: _project, users: _users})),\n ),\n ),\n )\n .subscribe({\n next: ({users: _users, project: _project}) => {\n setProject(_project)\n setUsers(\n (Array.isArray(_users) ? _users : [_users]).sort((userA, userB) =>\n sortUsersByRobotStatus(userA, userB, _project),\n ),\n )\n },\n error: (e: Error) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [userStore, versionedClient])\n\n useEffect(() => fetchData(), [fetchData])\n\n const handleRetryFetch = useCallback(() => fetchData(), [fetchData])\n\n const isLoading = !users || !project\n\n if (error) {\n return (\n <DashboardWidgetContainer header=\"Project users\">\n <Box padding={4}>\n <Stack gap={3}>\n <Text>Something went wrong while fetching data.</Text>\n <Box>\n <Button\n mode=\"ghost\"\n text=\"Retry\"\n title=\"Retry users fetch\"\n onClick={handleRetryFetch}\n />\n </Box>\n </Stack>\n </Box>\n </DashboardWidgetContainer>\n )\n }\n\n return (\n <DashboardWidgetContainer\n header=\"Project users\"\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage members\"\n as=\"a\"\n loading={isLoading}\n href={isLoading ? undefined : getInviteUrl(project.id)}\n />\n }\n >\n {isLoading && (\n <Box paddingY={5} paddingX={2}>\n <Stack gap={4}>\n <Text align=\"center\" muted size={1}>\n <Spinner />\n </Text>\n <Text align=\"center\" size={1} muted>\n Loading items…\n </Text>\n </Stack>\n </Box>\n )}\n\n {!isLoading && (\n <Stack gap={3} padding={3}>\n {users?.map((user) => {\n const membership = project.members.find((member) => member.id === user.id)\n return (\n <ProjectUser\n key={user.id}\n user={user}\n isRobot={membership?.isRobot ?? false}\n roles={membership?.roles.map((role) => role.title) || []}\n />\n )\n })}\n </Stack>\n )}\n </DashboardWidgetContainer>\n )\n}\n\nfunction sortUsersByRobotStatus(userA: User, userB: User, project: Project) {\n const {members} = project\n const membershipA = members.find((member) => member.id === userA?.id)\n const membershipB = members.find((member) => member.id === userB?.id)\n\n // On ties, sort by when the user was added\n if (membershipA?.isRobot === membershipB?.isRobot) {\n return (membershipA?.createdAt || '') > (membershipB?.createdAt || '') ? 1 : -1\n }\n\n // Robots go to the bottom\n return membershipA?.isRobot ? 1 : -1\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectUsers} from './ProjectUsers'\n\nexport function projectUsersWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-users',\n component: ProjectUsers,\n layout: config?.layout,\n }\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\n\nimport {useVersionedClient} from '../../versionedClient'\n\nconst tutorialsProjectConfig = {\n projectId: '3do82whm',\n dataset: 'next',\n}\n\nexport interface Guide {\n _type?: string\n slug?: {current: string}\n presenter?: {\n name?: string\n }\n}\n\nexport interface FeedItem {\n _id: string\n title?: string\n poster?: string\n category?: string\n guideOrTutorial?: Guide\n externalLink?: string\n presenter?: {\n name?: string\n }\n hasVideo?: boolean\n}\n\nexport function useDataAdapter() {\n const versionedClient = useVersionedClient()\n return useMemo(\n () => ({\n getFeed: (templateRepoId: string) => {\n const url = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n url,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n },\n urlBuilder: createImageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Card, Box, Heading, Flex, Text, Stack} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst PlayIconBox = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n &:before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2.75em;\n height: 2.75em;\n border-radius: 50%;\n background: ${({theme}) => getTheme_v2(theme).color.bg};\n opacity: 0.75;\n }\n`\n\nconst Root = styled(Flex)`\n &:hover {\n ${PlayIconBox} {\n &:before {\n opacity: 1;\n }\n }\n }\n`\n\nconst PosterCard = styled(Card)`\n width: 100%;\n padding-bottom: calc(9 / 16 * 100%);\n position: relative;\n`\n\nconst Poster = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n object-fit: cover;\n display: block;\n\n &:not([src]) {\n display: none;\n }\n`\n\nexport interface TutorialProps {\n title: string\n posterURL?: string\n href: string\n showPlayIcon?: boolean\n presenterName?: string\n presenterSubtitle?: string\n}\n\nexport function Tutorial(props: TutorialProps) {\n const {title, posterURL, showPlayIcon, href, presenterName, presenterSubtitle} = props\n\n return (\n <Root flex={1}>\n <Card\n sizing=\"border\"\n flex={1}\n padding={2}\n radius={2}\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{position: 'relative'}}\n >\n <Flex direction=\"column\" style={{height: '100%'}}>\n {posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )}\n <Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>\n </Flex>\n </Card>\n </Root>\n )\n}\n","import {Flex} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {type FeedItem, useDataAdapter} from './dataAdapter'\nimport {Tutorial} from './Tutorial'\n\nfunction createUrl(slug: {current: string}, type?: string) {\n if (type === 'tutorial') {\n return `https://www.sanity.io/docs/tutorials/${slug.current}`\n } else if (type === 'guide') {\n return `https://www.sanity.io/docs/guides/${slug.current}`\n }\n return false\n}\n\nexport interface SanityTutorialsProps {\n templateRepoId: string\n}\n\nexport function SanityTutorials(props: SanityTutorialsProps) {\n const {templateRepoId} = props\n const [feedItems, setFeedItems] = useState<FeedItem[]>([])\n\n const {getFeed, urlBuilder} = useDataAdapter()\n\n useEffect(() => {\n const subscription = getFeed(templateRepoId).subscribe((response) => {\n setFeedItems(response.items)\n })\n return () => {\n subscription.unsubscribe()\n }\n }, [setFeedItems, getFeed, templateRepoId])\n\n const title = 'Learn about Sanity'\n\n return (\n <DashboardWidgetContainer header={title}>\n <Flex as=\"ul\" overflow=\"auto\" align=\"stretch\" paddingY={2}>\n {feedItems?.map((feedItem, index) => {\n if (!feedItem.title || (!feedItem.guideOrTutorial && !feedItem.externalLink)) {\n return null\n }\n const presenter = feedItem.presenter || feedItem.guideOrTutorial?.presenter || {}\n const subtitle = feedItem.category\n const {guideOrTutorial = {}} = feedItem\n const href =\n (guideOrTutorial.slug\n ? createUrl(guideOrTutorial.slug, guideOrTutorial._type)\n : feedItem.externalLink) || feedItem.externalLink\n\n return (\n <Flex\n as=\"li\"\n key={feedItem._id}\n paddingRight={index < feedItems?.length - 1 ? 1 : 3}\n paddingLeft={index === 0 ? 3 : 0}\n align=\"stretch\"\n style={{minWidth: 272, width: '30%'}}\n >\n <Tutorial\n title={feedItem.title}\n href={href ?? ''}\n presenterName={presenter.name}\n presenterSubtitle={subtitle}\n showPlayIcon={feedItem.hasVideo}\n posterURL={\n feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined\n }\n />\n </Flex>\n )\n })}\n </Flex>\n </DashboardWidgetContainer>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {SanityTutorials} from './SanityTutorials'\n\nexport function sanityTutorialsWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'sanity-tutorials',\n component: SanityTutorials,\n layout: config?.layout ?? {width: 'full'},\n }\n}\n","import {Container} from '@sanity/ui'\n\nexport function DashboardLayout({children}: {children: React.ReactNode}) {\n return (\n <Container width={4} padding={4} sizing=\"border\" style={{height: '100%', overflowY: 'auto'}}>\n {children}\n </Container>\n )\n}\n","import {Box, Card, Grid, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled, css} from 'styled-components'\n\nimport {WidgetContainer} from '../containers/WidgetContainer'\nimport {type DashboardConfig, type LayoutConfig, type DashboardWidget} from '../types'\n\nconst media = {\n small: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n ${css(...args)}\n }\n `,\n medium: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[2]}px) {\n ${css(...args)}\n }\n `,\n}\n\nconst Root = styled(Grid)`\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n\n & > div {\n overflow: hidden;\n }\n\n & > div[data-width='medium'] {\n ${media.small`\n grid-column: span 2;\n `}\n }\n\n & > div[data-width='large'] {\n ${media.small`\n grid-column: span 2;\n `}\n\n ${media.medium`\n grid-column: span 3;\n `}\n }\n\n & > div[data-width='full'] {\n ${media.small`\n grid-column: 1 / -1;\n `}\n }\n\n & > div[data-height='medium'] {\n ${media.small`\n grid-row: span 2;\n `}\n }\n\n & > div[data-height='large'] {\n ${media.small`\n grid-row: span 2;\n `}\n\n ${media.medium`\n grid-row: span 3;\n `}\n }\n\n & > div[data-height='full'] {\n ${media.medium`\n grid-row: 1 / -1;\n `}\n }\n`\n\nexport interface WidgetGroupProps {\n config: Partial<DashboardConfig>\n}\n\nconst NO_WIDGETS: DashboardWidget[] = []\nconst NO_LAYOUT: LayoutConfig = {}\n\nexport function WidgetGroup(props: WidgetGroupProps) {\n const {\n config: {layout = NO_LAYOUT, widgets = NO_WIDGETS},\n } = props\n return (\n <Root\n autoFlow=\"row dense\"\n data-width={layout.width || 'auto'}\n data-height={layout.height || 'auto'}\n gap={4}\n >\n {widgets.length ? null : (\n <Card padding={4} shadow={1} tone=\"primary\">\n <Text align=\"center\">Add some widgets to populate this space.</Text>\n </Card>\n )}\n {widgets.map((widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n })}\n </Root>\n )\n}\n","import {DashboardLayout} from '../components/DashboardLayout'\nimport {WidgetGroup} from '../components/WidgetGroup'\nimport {type DashboardConfig} from '../types'\nimport {DashboardContext} from './DashboardContext'\n\nexport function Dashboard({config}: {config: DashboardConfig}) {\n if (!config) {\n return null\n }\n\n return (\n <DashboardContext.Provider value={config}>\n <DashboardLayout>\n <WidgetGroup config={config} />\n </DashboardLayout>\n </DashboardContext.Provider>\n )\n}\n","import {type ComponentType, type CSSProperties} from 'react'\nimport {definePlugin} from 'sanity'\n\nimport {Dashboard} from './containers/Dashboard'\nimport {type DashboardConfig, type DashboardWidget, type LayoutConfig} from './types'\n\nconst strokeStyle: CSSProperties = {\n stroke: 'currentColor',\n strokeWidth: 1.2,\n}\n\nconst DashboardIcon = () => (\n <svg\n data-sanity-icon\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid\"\n width=\"1em\"\n height=\"1em\"\n >\n <path d=\"M19.5 19.5H5.5V5.5H19.5V19.5Z\" style={strokeStyle} />\n <path d=\"M5.5 12.5H19.5\" style={strokeStyle} />\n <path d=\"M14.5 19.5V12.5M10.5 12.5V5.5\" style={strokeStyle} />\n </svg>\n)\n\nexport interface DashboardPluginConfig {\n /**\n * Dashboard tool title\n */\n title?: string\n /**\n * Dashboard tool name (used in url path)\n */\n name?: string\n /**\n * Dashboard tool icon\n */\n icon?: ComponentType\n widgets?: DashboardWidget[]\n\n /**\n * Will be used for widgets that do not define a layout directly.\n */\n defaultLayout?: LayoutConfig\n}\n\nexport const dashboardTool = definePlugin<DashboardPluginConfig>((config = {}) => {\n const pluginConfig: DashboardConfig = {\n layout: config.defaultLayout ?? {},\n widgets: config.widgets ?? [],\n }\n\n const title = config.title ?? 'Dashboard'\n const name = config.name ?? 'dashboard'\n const icon = config.icon ?? DashboardIcon\n\n return {\n name: 'dashboard',\n tools: [\n {\n title,\n name,\n icon,\n component: () => <Dashboard config={pluginConfig} />,\n },\n ],\n }\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["header && (\n <Header borderBottom paddingX={3} paddingY={4}>\n <Heading size={1} textOverflow=\"ellipsis\">\n {header}\n </Heading>\n </Header>\n )","children && <Content>{children}</Content>","footer && <Footer borderTop>{footer}</Footer>","<Root radius={3} display=\"flex\" ref={ref}>\n {header && (\n <Header borderBottom paddingX={3} paddingY={4}>\n <Heading size={1} textOverflow=\"ellipsis\">\n {header}\n </Heading>\n </Header>\n )}\n {children && <Content>{children}</Content>}\n {footer && <Footer borderTop>{footer}</Footer>}\n </Root>","{\n ...props.layout,\n ...config.layout,\n }","layout","useMemo(\n () => ({\n ...props.layout,\n ...config.layout,\n }),\n [props.layout, config.layout],\n )","<Widget />","<Card shadow={1} data-width={layout.width} data-height={layout.height}>\n <Widget />\n </Card>","height","width","{apiVersion: '2024-08-01'}","__experimental_before = NO_EXPERIMENTAL","data = NO_DATA","versionedClient.config()","projectId = 'unknown'","dataset = 'unknown'","() => {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n versionedClient.observable\n .request<UserApplication[]>({url: '/user-applications', tag: 'dashboard.project-info'})\n .subscribe({\n next: (result) => setStudioApps(result.filter((app) => app.type === 'studio')),\n error: (error) => {\n console.error('Error while resolving user applications', error)\n setStudioApps({\n error: 'Something went wrong while resolving user applications. See console.',\n })\n },\n }),\n )\n\n // ping assumed graphql endpoint\n subscriptions.push(\n versionedClient.observable\n .request({\n method: 'HEAD',\n url: `/graphql/${dataset}/default`,\n tag: 'dashboard.project-info.graphql-api',\n })\n .subscribe({\n next: () => setGraphQLApi(getGraphQLUrl(projectId, dataset)),\n error: (error) => {\n if (error.statusCode === 404) {\n setGraphQLApi(undefined)\n } else {\n console.error('Error while looking for graphQLApi', error)\n setGraphQLApi({\n error: 'Something went wrong while looking up graphQLApi. See console.',\n })\n }\n },\n }),\n )\n\n return () => {\n subscriptions.forEach((s) => s.unsubscribe())\n }\n }","observable","(app) => app.type === 'studio'","error","(s) => s.unsubscribe()","[dataset, projectId, versionedClient, setGraphQLApi]","result","(item) => item.category === 'apps'","app","(item) => item.category === 'apis'","item","useMemo(() => {\n let result: App[] = [\n {\n title: 'Sanity project',\n rows: [\n {title: 'Project ID', value: projectId},\n {title: 'Dataset', value: dataset},\n ],\n },\n ]\n\n const apps: App[] = data.filter((item) => item.category === 'apps')\n\n // Handle studios\n ;(Array.isArray(studioApps) ? studioApps : []).forEach((app) => {\n apps.push({\n title: app.title || 'Studio',\n value: app.urlType === 'internal' ? `https://${app.appHost}.sanity.studio` : app.appHost,\n })\n })\n\n if (apps.length > 0) {\n result = result.concat([{title: 'Apps', rows: apps}])\n }\n\n // Handle APIs\n result = result.concat(\n [\n {\n title: 'APIs',\n rows: [\n {title: 'GROQ', value: getGroqUrl(projectId, dataset)},\n {\n title: 'GraphQL',\n value: (typeof graphQLApi === 'object' ? 'Error' : graphQLApi) ?? 'Not deployed',\n },\n ],\n },\n ],\n data.filter((item) => item.category === 'apis'),\n )\n\n // Handle whatever else there might be\n const otherStuff: Record<string, ProjectData[]> = {}\n data.forEach((item) => {\n if (item.category && item.category !== 'apps' && item.category !== 'apis') {\n const group = otherStuff[item.category] ?? []\n group.push(item)\n otherStuff[item.category] = group\n }\n })\n Object.keys(otherStuff).forEach((category) => {\n result.push({title: category, rows: otherStuff[category]})\n })\n\n return result\n }, [graphQLApi, studioApps, projectId, dataset, data])","__experimental_before.map((widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n ))","(widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n )","{width: '100%'}","getManageUrl(projectId)","<Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />","<Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>","assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })","(item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n }","<Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>","<DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>","<Box height=\"fill\" marginTop={__experimental_before?.length > 0 ? 4 : 0}>\n <DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>\n </Box>","__experimental_before?.length > 0 ? 4 : 0","<>\n {__experimental_before.map((widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n ))}\n <Box height=\"fill\" marginTop={__experimental_before?.length > 0 ? 4 : 0}>\n <DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>\n </Box>\n </>","(row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n }","{user, isRobot, roles}: ProjectUserProps","{style: 'narrow'}","<Box flex=\"none\">\n {isRobot ? (\n <Text size={2}>\n <RobotIcon />\n </Text>\n ) : (\n <UserAvatar user={user} />\n )}\n </Box>","{color: 'inherit'}","<Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>","displayName","listFormat.format(roles)","<Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>","<Stack flex={1} gap={2}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>\n\n <Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>\n </Stack>","<Root align=\"center\">\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex=\"none\">\n {isRobot ? (\n <Text size={2}>\n <RobotIcon />\n </Text>\n ) : (\n <UserAvatar user={user} />\n )}\n </Box>\n\n <Stack flex={1} gap={2}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>\n\n <Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>\n </Stack>\n </Flex>\n </Root>","() => {\n const {projectId} = versionedClient.config()\n const subscription = versionedClient.observable\n .request<Project>({\n url: `/projects/${projectId}`,\n tag: 'dashboard.project-users',\n })\n .pipe(\n switchMap((_project) =>\n from(userStore.getUsers(_project.members.map((mem) => mem.id))).pipe(\n map((_users) => ({project: _project, users: _users})),\n ),\n ),\n )\n .subscribe({\n next: ({users: _users, project: _project}) => {\n setProject(_project)\n setUsers(\n (Array.isArray(_users) ? _users : [_users]).sort((userA, userB) =>\n sortUsersByRobotStatus(userA, userB, _project),\n ),\n )\n },\n error: (e: Error) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }","(mem) => mem.id","_users","_project","{users: _users, project: _project}","useCallback(() => {\n const {projectId} = versionedClient.config()\n const subscription = versionedClient.observable\n .request<Project>({\n url: `/projects/${projectId}`,\n tag: 'dashboard.project-users',\n })\n .pipe(\n switchMap((_project) =>\n from(userStore.getUsers(_project.members.map((mem) => mem.id))).pipe(\n map((_users) => ({project: _project, users: _users})),\n ),\n ),\n )\n .subscribe({\n next: ({users: _users, project: _project}) => {\n setProject(_project)\n setUsers(\n (Array.isArray(_users) ? _users : [_users]).sort((userA, userB) =>\n sortUsersByRobotStatus(userA, userB, _project),\n ),\n )\n },\n error: (e: Error) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [userStore, versionedClient])","() => fetchData()","[fetchData]","useCallback(() => fetchData(), [fetchData])","<Text>Something went wrong while fetching data.</Text>","<DashboardWidgetContainer header=\"Project users\">\n <Box padding={4}>\n <Stack gap={3}>\n <Text>Something went wrong while fetching data.</Text>\n <Box>\n <Button\n mode=\"ghost\"\n text=\"Retry\"\n title=\"Retry users fetch\"\n onClick={handleRetryFetch}\n />\n </Box>\n </Stack>\n </Box>\n </DashboardWidgetContainer>","{width: '100%'}","isLoading ? undefined : getInviteUrl(project.id)","project.id","<Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage members\"\n as=\"a\"\n loading={isLoading}\n href={isLoading ? undefined : getInviteUrl(project.id)}\n />","isLoading && (\n <Box paddingY={5} paddingX={2}>\n <Stack gap={4}>\n <Text align=\"center\" muted size={1}>\n <Spinner />\n </Text>\n <Text align=\"center\" size={1} muted>\n Loading items…\n </Text>\n </Stack>\n </Box>\n )","!isLoading && (\n <Stack gap={3} padding={3}>\n {users?.map((user) => {\n const membership = project.members.find((member) => member.id === user.id)\n return (\n <ProjectUser\n key={user.id}\n user={user}\n isRobot={membership?.isRobot ?? false}\n roles={membership?.roles.map((role) => role.title) || []}\n />\n )\n })}\n </Stack>\n )","project.members","users?.map","(role) => role.title","<DashboardWidgetContainer\n header=\"Project users\"\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage members\"\n as=\"a\"\n loading={isLoading}\n href={isLoading ? undefined : getInviteUrl(project.id)}\n />\n }\n >\n {isLoading && (\n <Box paddingY={5} paddingX={2}>\n <Stack gap={4}>\n <Text align=\"center\" muted size={1}>\n <Spinner />\n </Text>\n <Text align=\"center\" size={1} muted>\n Loading items…\n </Text>\n </Stack>\n </Box>\n )}\n\n {!isLoading && (\n <Stack gap={3} padding={3}>\n {users?.map((user) => {\n const membership = project.members.find((member) => member.id === user.id)\n return (\n <ProjectUser\n key={user.id}\n user={user}\n isRobot={membership?.isRobot ?? false}\n roles={membership?.roles.map((role) => role.title) || []}\n />\n )\n })}\n </Stack>\n )}\n </DashboardWidgetContainer>","(templateRepoId: string) => {\n const url = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n url,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n }","versionedClient.observable","createImageUrlBuilder(tutorialsProjectConfig)","{\n getFeed: (templateRepoId: string) => {\n const url = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n url,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n },\n urlBuilder: createImageUrlBuilder(tutorialsProjectConfig),\n }","useMemo(\n () => ({\n getFeed: (templateRepoId: string) => {\n const url = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n url,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n },\n urlBuilder: createImageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )","{position: 'relative'}","{height: '100%'}","posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )","<Heading as=\"h3\" size={1}>\n {title}\n </Heading>","<Text size={1}>{presenterName}</Text>","{opacity: 0.7}","<Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>","<Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>","<Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>","<Flex direction=\"column\" style={{height: '100%'}}>\n {posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )}\n <Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>\n </Flex>","<Root flex={1}>\n <Card\n sizing=\"border\"\n flex={1}\n padding={2}\n radius={2}\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{position: 'relative'}}\n >\n <Flex direction=\"column\" style={{height: '100%'}}>\n {posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )}\n <Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>\n </Flex>\n </Card>\n </Root>","[]","() => {\n const subscription = getFeed(templateRepoId).subscribe((response) => {\n setFeedItems(response.items)\n })\n return () => {\n subscription.unsubscribe()\n }\n }","[setFeedItems, getFeed, templateRepoId]","feedItems?.map((feedItem, index) => {\n if (!feedItem.title || (!feedItem.guideOrTutorial && !feedItem.externalLink)) {\n return null\n }\n const presenter = feedItem.presenter || feedItem.guideOrTutorial?.presenter || {}\n const subtitle = feedItem.category\n const {guideOrTutorial = {}} = feedItem\n const href =\n (guideOrTutorial.slug\n ? createUrl(guideOrTutorial.slug, guideOrTutorial._type)\n : feedItem.externalLink) || feedItem.externalLink\n\n return (\n <Flex\n as=\"li\"\n key={feedItem._id}\n paddingRight={index < feedItems?.length - 1 ? 1 : 3}\n paddingLeft={index === 0 ? 3 : 0}\n align=\"stretch\"\n style={{minWidth: 272, width: '30%'}}\n >\n <Tutorial\n title={feedItem.title}\n href={href ?? ''}\n presenterName={presenter.name}\n presenterSubtitle={subtitle}\n showPlayIcon={feedItem.hasVideo}\n posterURL={\n feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined\n }\n />\n </Flex>\n )\n })","guideOrTutorial = {}","feedItems?.map","<DashboardWidgetContainer header={title}>\n <Flex as=\"ul\" overflow=\"auto\" align=\"stretch\" paddingY={2}>\n {feedItems?.map((feedItem, index) => {\n if (!feedItem.title || (!feedItem.guideOrTutorial && !feedItem.externalLink)) {\n return null\n }\n const presenter = feedItem.presenter || feedItem.guideOrTutorial?.presenter || {}\n const subtitle = feedItem.category\n const {guideOrTutorial = {}} = feedItem\n const href =\n (guideOrTutorial.slug\n ? createUrl(guideOrTutorial.slug, guideOrTutorial._type)\n : feedItem.externalLink) || feedItem.externalLink\n\n return (\n <Flex\n as=\"li\"\n key={feedItem._id}\n paddingRight={index < feedItems?.length - 1 ? 1 : 3}\n paddingLeft={index === 0 ? 3 : 0}\n align=\"stretch\"\n style={{minWidth: 272, width: '30%'}}\n >\n <Tutorial\n title={feedItem.title}\n href={href ?? ''}\n presenterName={presenter.name}\n presenterSubtitle={subtitle}\n showPlayIcon={feedItem.hasVideo}\n posterURL={\n feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined\n }\n />\n </Flex>\n )\n })}\n </Flex>\n </DashboardWidgetContainer>","{children}: {children: React.ReactNode}","{height: '100%', overflowY: 'auto'}","<Container width={4} padding={4} sizing=\"border\" style={{height: '100%', overflowY: 'auto'}}>\n {children}\n </Container>","{layout = NO_LAYOUT, widgets = NO_WIDGETS}","layout = NO_LAYOUT","widgets = NO_WIDGETS","widgets.length ? null : (\n <Card padding={4} shadow={1} tone=\"primary\">\n <Text align=\"center\">Add some widgets to populate this space.</Text>\n </Card>\n )","length","widgets.map((widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n })","(widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n }","<Root\n autoFlow=\"row dense\"\n data-width={layout.width || 'auto'}\n data-height={layout.height || 'auto'}\n gap={4}\n >\n {widgets.length ? null : (\n <Card padding={4} shadow={1} tone=\"primary\">\n <Text align=\"center\">Add some widgets to populate this space.</Text>\n </Card>\n )}\n {widgets.map((widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n })}\n </Root>","layout.width || 'auto'","layout.height || 'auto'","{config}: {config: DashboardConfig}","<DashboardLayout>\n <WidgetGroup config={config} />\n </DashboardLayout>","<DashboardContext.Provider value={config}>\n <DashboardLayout>\n <WidgetGroup config={config} />\n </DashboardLayout>\n </DashboardContext.Provider>","DashboardContext.Provider","<svg\n data-sanity-icon\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid\"\n width=\"1em\"\n height=\"1em\"\n >\n <path d=\"M19.5 19.5H5.5V5.5H19.5V19.5Z\" style={strokeStyle} />\n <path d=\"M5.5 12.5H19.5\" style={strokeStyle} />\n <path d=\"M14.5 19.5V12.5M10.5 12.5V5.5\" style={strokeStyle} />\n </svg>"],"sources":["../src/components/DashboardWidgetContainer.tsx","../src/containers/DashboardContext.tsx","../src/containers/WidgetContainer.tsx","../src/versionedClient.ts","../src/widgets/projectInfo/ProjectInfo.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/ProjectUser.tsx","../src/widgets/projectUsers/ProjectUsers.tsx","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/dataAdapter.ts","../src/widgets/sanityTutorials/Tutorial.tsx","../src/widgets/sanityTutorials/SanityTutorials.tsx","../src/widgets/sanityTutorials/index.ts","../src/components/DashboardLayout.tsx","../src/components/WidgetGroup.tsx","../src/containers/Dashboard.tsx","../src/plugin.tsx"],"sourcesContent":["import {Card, Box, Heading} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Card)`\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n`\n\nconst Header = styled(Card)`\n position: sticky;\n top: 0;\n z-index: 2;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n`\n\nconst Footer = styled(Card)`\n position: sticky;\n overflow: hidden;\n bottom: 0;\n z-index: 2;\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n margin-top: auto;\n`\n\nconst Content = styled(Box)`\n position: relative;\n z-index: 1;\n height: stretch;\n min-height: 21.5em;\n\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n overflow-y: auto;\n outline: none;\n }\n`\n\ninterface DashboardWidgetProps {\n header?: string\n children: React.ReactNode\n footer?: React.ReactNode\n ref?: React.Ref<HTMLDivElement>\n}\n\nexport function DashboardWidgetContainer(props: DashboardWidgetProps) {\n const {header, children, footer, ref} = props\n\n return (\n <Root radius={3} display=\"flex\" ref={ref}>\n {header && (\n <Header borderBottom paddingX={3} paddingY={4}>\n <Heading size={1} textOverflow=\"ellipsis\">\n {header}\n </Heading>\n </Header>\n )}\n {children && <Content>{children}</Content>}\n {footer && <Footer borderTop>{footer}</Footer>}\n </Root>\n )\n}\n","import {createContext, useContext} from 'react'\n\nimport {type DashboardConfig} from '../types'\n\nexport const DashboardContext = createContext<DashboardConfig>({widgets: []})\n\nexport function useDashboardConfig(): DashboardConfig {\n return useContext(DashboardContext)\n}\n","import {Card} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {type DashboardWidget} from '../types'\nimport {useDashboardConfig} from './DashboardContext'\n\nexport function WidgetContainer(props: DashboardWidget) {\n const config = useDashboardConfig()\n const layout = useMemo(\n () => ({\n ...props.layout,\n ...config.layout,\n }),\n [props.layout, config.layout],\n )\n\n const Widget = props.component\n\n return (\n <Card shadow={1} data-width={layout.width} data-height={layout.height}>\n <Widget />\n </Card>\n )\n}\n","import {useClient} from 'sanity'\n\nexport function useVersionedClient() {\n return useClient({apiVersion: '2024-08-01'})\n}\n","import {Box, Card, Stack, Heading, Grid, Label, Text, Button} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useEffect, useMemo, useState} from 'react'\nimport {type Subscription} from 'rxjs'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {WidgetContainer} from '../../containers/WidgetContainer'\nimport {type DashboardWidget} from '../../types'\nimport {useVersionedClient} from '../../versionedClient'\nimport {type App, type ProjectInfoProps, type ProjectData, type UserApplication} from './types'\n\nfunction isUrl(url?: string) {\n return url && /^https?:\\/\\//.test(url)\n}\n\nfunction getGraphQLUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/graphql/${dataset}/default`\n}\n\nfunction getGroqUrl(projectId: string, dataset: string) {\n return `https://${projectId}.api.sanity.io/v1/groq/${dataset}`\n}\n\nfunction getManageUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}`\n}\n\nconst NO_EXPERIMENTAL: DashboardWidget[] = []\nconst NO_DATA: ProjectData[] = []\n\nexport function ProjectInfo(props: ProjectInfoProps) {\n const {__experimental_before = NO_EXPERIMENTAL, data = NO_DATA} = props\n const [studioApps, setStudioApps] = useState<UserApplication[] | {error: string} | undefined>()\n const [graphQLApi, setGraphQLApi] = useState<string | {error: string} | undefined>()\n const versionedClient = useVersionedClient()\n const {projectId = 'unknown', dataset = 'unknown'} = versionedClient.config()\n\n useEffect(() => {\n const subscriptions: Subscription[] = []\n\n subscriptions.push(\n versionedClient.observable\n .request<UserApplication[]>({url: '/user-applications', tag: 'dashboard.project-info'})\n .subscribe({\n next: (result) => setStudioApps(result.filter((app) => app.type === 'studio')),\n error: (error) => {\n console.error('Error while resolving user applications', error)\n setStudioApps({\n error: 'Something went wrong while resolving user applications. See console.',\n })\n },\n }),\n )\n\n // ping assumed graphql endpoint\n subscriptions.push(\n versionedClient.observable\n .request({\n method: 'HEAD',\n url: `/graphql/${dataset}/default`,\n tag: 'dashboard.project-info.graphql-api',\n })\n .subscribe({\n next: () => setGraphQLApi(getGraphQLUrl(projectId, dataset)),\n error: (error) => {\n if (error.statusCode === 404) {\n setGraphQLApi(undefined)\n } else {\n console.error('Error while looking for graphQLApi', error)\n setGraphQLApi({\n error: 'Something went wrong while looking up graphQLApi. See console.',\n })\n }\n },\n }),\n )\n\n return () => {\n subscriptions.forEach((s) => s.unsubscribe())\n }\n }, [dataset, projectId, versionedClient, setGraphQLApi])\n\n const assembleTableRows = useMemo(() => {\n let result: App[] = [\n {\n title: 'Sanity project',\n rows: [\n {title: 'Project ID', value: projectId},\n {title: 'Dataset', value: dataset},\n ],\n },\n ]\n\n const apps: App[] = data.filter((item) => item.category === 'apps')\n\n // Handle studios\n ;(Array.isArray(studioApps) ? studioApps : []).forEach((app) => {\n apps.push({\n title: app.title || 'Studio',\n value: app.urlType === 'internal' ? `https://${app.appHost}.sanity.studio` : app.appHost,\n })\n })\n\n if (apps.length > 0) {\n result = result.concat([{title: 'Apps', rows: apps}])\n }\n\n // Handle APIs\n result = result.concat(\n [\n {\n title: 'APIs',\n rows: [\n {title: 'GROQ', value: getGroqUrl(projectId, dataset)},\n {\n title: 'GraphQL',\n value: (typeof graphQLApi === 'object' ? 'Error' : graphQLApi) ?? 'Not deployed',\n },\n ],\n },\n ],\n data.filter((item) => item.category === 'apis'),\n )\n\n // Handle whatever else there might be\n const otherStuff: Record<string, ProjectData[]> = {}\n data.forEach((item) => {\n if (item.category && item.category !== 'apps' && item.category !== 'apis') {\n const group = otherStuff[item.category] ?? []\n group.push(item)\n otherStuff[item.category] = group\n }\n })\n Object.keys(otherStuff).forEach((category) => {\n result.push({title: category, rows: otherStuff[category]})\n })\n\n return result\n }, [graphQLApi, studioApps, projectId, dataset, data])\n\n return (\n <>\n {__experimental_before.map((widgetConfig, idx) => (\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n <WidgetContainer key={idx} {...widgetConfig} />\n ))}\n <Box height=\"fill\" marginTop={__experimental_before?.length > 0 ? 4 : 0}>\n <DashboardWidgetContainer\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage project\"\n as=\"a\"\n href={getManageUrl(projectId)}\n />\n }\n >\n <Card paddingY={4} radius={2} aria-label=\"Project info\">\n <Stack gap={4}>\n <Box paddingX={3} as=\"header\">\n <Heading size={1} as=\"h2\" id=\"project_info_table\">\n Project info\n </Heading>\n </Box>\n {assembleTableRows.map((item) => {\n if (!item || !item.rows) {\n return null\n }\n\n return (\n <Stack key={item.title} gap={3}>\n <Card borderBottom padding={3}>\n <Label size={0} muted>\n {item.title}\n </Label>\n </Card>\n <Stack gap={4} paddingX={3}>\n {item.rows.map((row) => {\n const rowValue = typeof row.value === 'object' ? row.value.error : row.value\n return (\n <Grid key={`${rowValue ?? ''}-${row.title}`} gridTemplateColumns={2}>\n <Text weight=\"medium\">{row.title}</Text>\n {typeof row.value === 'object' && (\n <Text size={1}>{row.value?.error}</Text>\n )}\n {typeof row.value === 'string' && (\n <>\n {isUrl(row.value) ? (\n <Text size={1} style={{wordBreak: 'break-word'}}>\n <a href={row.value}>{row.value}</a>\n </Text>\n ) : (\n <Code size={1} style={{wordBreak: 'break-word'}}>\n {row.value}\n </Code>\n )}\n </>\n )}\n </Grid>\n )\n })}\n </Stack>\n </Stack>\n )\n })}\n </Stack>\n </Card>\n </DashboardWidgetContainer>\n </Box>\n </>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectInfo} from './ProjectInfo'\n\nexport function projectInfoWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-info',\n component: ProjectInfo,\n layout: config?.layout ?? {width: 'medium'},\n }\n}\n","import {RobotIcon} from '@sanity/icons/Robot'\nimport {Box, Flex, rem, Stack, Text} from '@sanity/ui'\nimport {useListFormat, type User, UserAvatar} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst Root = styled(Flex)`\n height: ${rem(33)}; // 33 = PREVIEW_SIZES.default.media.height\n box-sizing: content-box;\n`\n\nexport interface ProjectUserProps {\n user: User\n isRobot: boolean\n roles: string[]\n}\n\nexport function ProjectUser({user, isRobot, roles}: ProjectUserProps) {\n const listFormat = useListFormat({style: 'narrow'})\n return (\n <Root align=\"center\">\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex=\"none\">\n {isRobot ? (\n <Text size={2}>\n <RobotIcon />\n </Text>\n ) : (\n <UserAvatar user={user} />\n )}\n </Box>\n\n <Stack flex={1} gap={2}>\n <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\" weight=\"medium\">\n {user.displayName}\n </Text>\n\n <Text muted size={1} textOverflow=\"ellipsis\">\n {listFormat.format(roles)}\n </Text>\n </Stack>\n </Flex>\n </Root>\n )\n}\n","import {Stack, Spinner, Box, Text, Button} from '@sanity/ui'\nimport {useCallback, useEffect, useState} from 'react'\nimport {from} from 'rxjs'\nimport {map, switchMap} from 'rxjs/operators'\nimport {type Role, type User, useUserStore} from 'sanity'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {useVersionedClient} from '../../versionedClient'\nimport {ProjectUser} from './ProjectUser'\n\nfunction getInviteUrl(projectId: string) {\n return `https://manage.sanity.io/projects/${projectId}/members`\n}\n\ninterface Member {\n id: string\n roles: Role[]\n isRobot: boolean\n isCurrentUser: boolean\n createdAt: string\n}\n\ninterface Project {\n id: string\n members: Member[]\n}\n\nexport function ProjectUsers() {\n const [project, setProject] = useState<Project | undefined>()\n const [users, setUsers] = useState<User[] | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const userStore = useUserStore()\n const versionedClient = useVersionedClient()\n\n const fetchData = useCallback(() => {\n const {projectId} = versionedClient.config()\n const subscription = versionedClient.observable\n .request<Project>({\n url: `/projects/${projectId}`,\n tag: 'dashboard.project-users',\n })\n .pipe(\n switchMap((_project) =>\n from(userStore.getUsers(_project.members.map((mem) => mem.id))).pipe(\n map((_users) => ({project: _project, users: _users})),\n ),\n ),\n )\n .subscribe({\n next: ({users: _users, project: _project}) => {\n setProject(_project)\n setUsers(\n (Array.isArray(_users) ? _users : [_users]).sort((userA, userB) =>\n sortUsersByRobotStatus(userA, userB, _project),\n ),\n )\n },\n error: (e: Error) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [userStore, versionedClient])\n\n useEffect(() => fetchData(), [fetchData])\n\n const handleRetryFetch = useCallback(() => fetchData(), [fetchData])\n\n const isLoading = !users || !project\n\n if (error) {\n return (\n <DashboardWidgetContainer header=\"Project users\">\n <Box padding={4}>\n <Stack gap={3}>\n <Text>Something went wrong while fetching data.</Text>\n <Box>\n <Button\n mode=\"ghost\"\n text=\"Retry\"\n title=\"Retry users fetch\"\n onClick={handleRetryFetch}\n />\n </Box>\n </Stack>\n </Box>\n </DashboardWidgetContainer>\n )\n }\n\n return (\n <DashboardWidgetContainer\n header=\"Project users\"\n footer={\n <Button\n style={{width: '100%'}}\n paddingX={2}\n paddingY={4}\n mode=\"bleed\"\n tone=\"primary\"\n text=\"Manage members\"\n as=\"a\"\n loading={isLoading}\n href={isLoading ? undefined : getInviteUrl(project.id)}\n />\n }\n >\n {isLoading && (\n <Box paddingY={5} paddingX={2}>\n <Stack gap={4}>\n <Text align=\"center\" muted size={1}>\n <Spinner />\n </Text>\n <Text align=\"center\" size={1} muted>\n Loading items…\n </Text>\n </Stack>\n </Box>\n )}\n\n {!isLoading && (\n <Stack gap={3} padding={3}>\n {users?.map((user) => {\n const membership = project.members.find((member) => member.id === user.id)\n return (\n <ProjectUser\n key={user.id}\n user={user}\n isRobot={membership?.isRobot ?? false}\n roles={membership?.roles.map((role) => role.title) || []}\n />\n )\n })}\n </Stack>\n )}\n </DashboardWidgetContainer>\n )\n}\n\nfunction sortUsersByRobotStatus(userA: User, userB: User, project: Project) {\n const {members} = project\n const membershipA = members.find((member) => member.id === userA?.id)\n const membershipB = members.find((member) => member.id === userB?.id)\n\n // On ties, sort by when the user was added\n if (membershipA?.isRobot === membershipB?.isRobot) {\n return (membershipA?.createdAt || '') > (membershipB?.createdAt || '') ? 1 : -1\n }\n\n // Robots go to the bottom\n return membershipA?.isRobot ? 1 : -1\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {ProjectUsers} from './ProjectUsers'\n\nexport function projectUsersWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'project-users',\n component: ProjectUsers,\n layout: config?.layout,\n }\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\n\nimport {useVersionedClient} from '../../versionedClient'\n\nconst tutorialsProjectConfig = {\n projectId: '3do82whm',\n dataset: 'next',\n}\n\nexport interface Guide {\n _type?: string\n slug?: {current: string}\n presenter?: {\n name?: string\n }\n}\n\nexport interface FeedItem {\n _id: string\n title?: string\n poster?: string\n category?: string\n guideOrTutorial?: Guide\n externalLink?: string\n presenter?: {\n name?: string\n }\n hasVideo?: boolean\n}\n\nexport function useDataAdapter() {\n const versionedClient = useVersionedClient()\n return useMemo(\n () => ({\n getFeed: (templateRepoId: string) => {\n const url = templateRepoId\n ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n : '/addons/dashboard'\n return versionedClient.observable.request<{items: FeedItem[]}>({\n url,\n tag: 'dashboard.sanity-tutorials',\n withCredentials: false,\n })\n },\n urlBuilder: createImageUrlBuilder(tutorialsProjectConfig),\n }),\n [versionedClient],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Card, Box, Heading, Flex, Text, Stack} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst PlayIconBox = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n &:before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2.75em;\n height: 2.75em;\n border-radius: 50%;\n background: ${({theme}) => getTheme_v2(theme).color.bg};\n opacity: 0.75;\n }\n`\n\nconst Root = styled(Flex)`\n &:hover {\n ${PlayIconBox} {\n &:before {\n opacity: 1;\n }\n }\n }\n`\n\nconst PosterCard = styled(Card)`\n width: 100%;\n padding-bottom: calc(9 / 16 * 100%);\n position: relative;\n`\n\nconst Poster = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n object-fit: cover;\n display: block;\n\n &:not([src]) {\n display: none;\n }\n`\n\nexport interface TutorialProps {\n title: string\n posterURL?: string\n href: string\n showPlayIcon?: boolean\n presenterName?: string\n presenterSubtitle?: string\n}\n\nexport function Tutorial(props: TutorialProps) {\n const {title, posterURL, showPlayIcon, href, presenterName, presenterSubtitle} = props\n\n return (\n <Root flex={1}>\n <Card\n sizing=\"border\"\n flex={1}\n padding={2}\n radius={2}\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{position: 'relative'}}\n >\n <Flex direction=\"column\" style={{height: '100%'}}>\n {posterURL && (\n <PosterCard marginBottom={1}>\n <Poster src={posterURL} />\n {showPlayIcon && (\n <PlayIconBox display=\"flex\">\n <Text align=\"center\">\n <PlayIcon />\n </Text>\n </PlayIconBox>\n )}\n </PosterCard>\n )}\n <Flex direction=\"column\" justify=\"space-between\" paddingY={2} flex={1}>\n <Heading as=\"h3\" size={1}>\n {title}\n </Heading>\n <Box marginTop={4}>\n <Stack gap={2} flex={1}>\n <Text size={1}>{presenterName}</Text>\n <Text size={0} style={{opacity: 0.7}}>\n {presenterSubtitle}\n </Text>\n </Stack>\n </Box>\n </Flex>\n </Flex>\n </Card>\n </Root>\n )\n}\n","import {Flex} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\n\nimport {DashboardWidgetContainer} from '../../components/DashboardWidgetContainer'\nimport {type FeedItem, useDataAdapter} from './dataAdapter'\nimport {Tutorial} from './Tutorial'\n\nfunction createUrl(slug: {current: string}, type?: string) {\n if (type === 'tutorial') {\n return `https://www.sanity.io/docs/tutorials/${slug.current}`\n } else if (type === 'guide') {\n return `https://www.sanity.io/docs/guides/${slug.current}`\n }\n return false\n}\n\nexport interface SanityTutorialsProps {\n templateRepoId: string\n}\n\nexport function SanityTutorials(props: SanityTutorialsProps) {\n const {templateRepoId} = props\n const [feedItems, setFeedItems] = useState<FeedItem[]>([])\n\n const {getFeed, urlBuilder} = useDataAdapter()\n\n useEffect(() => {\n const subscription = getFeed(templateRepoId).subscribe((response) => {\n setFeedItems(response.items)\n })\n return () => {\n subscription.unsubscribe()\n }\n }, [setFeedItems, getFeed, templateRepoId])\n\n const title = 'Learn about Sanity'\n\n return (\n <DashboardWidgetContainer header={title}>\n <Flex as=\"ul\" overflow=\"auto\" align=\"stretch\" paddingY={2}>\n {feedItems?.map((feedItem, index) => {\n if (!feedItem.title || (!feedItem.guideOrTutorial && !feedItem.externalLink)) {\n return null\n }\n const presenter = feedItem.presenter || feedItem.guideOrTutorial?.presenter || {}\n const subtitle = feedItem.category\n const {guideOrTutorial = {}} = feedItem\n const href =\n (guideOrTutorial.slug\n ? createUrl(guideOrTutorial.slug, guideOrTutorial._type)\n : feedItem.externalLink) || feedItem.externalLink\n\n return (\n <Flex\n as=\"li\"\n key={feedItem._id}\n paddingRight={index < feedItems?.length - 1 ? 1 : 3}\n paddingLeft={index === 0 ? 3 : 0}\n align=\"stretch\"\n style={{minWidth: 272, width: '30%'}}\n >\n <Tutorial\n title={feedItem.title}\n href={href ?? ''}\n presenterName={presenter.name}\n presenterSubtitle={subtitle}\n showPlayIcon={feedItem.hasVideo}\n posterURL={\n feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined\n }\n />\n </Flex>\n )\n })}\n </Flex>\n </DashboardWidgetContainer>\n )\n}\n","import {type LayoutConfig, type DashboardWidget} from '../../types'\nimport {SanityTutorials} from './SanityTutorials'\n\nexport function sanityTutorialsWidget(config?: {layout?: LayoutConfig}): DashboardWidget {\n return {\n name: 'sanity-tutorials',\n component: SanityTutorials,\n layout: config?.layout ?? {width: 'full'},\n }\n}\n","import {Container} from '@sanity/ui'\n\nexport function DashboardLayout({children}: {children: React.ReactNode}) {\n return (\n <Container width={4} padding={4} sizing=\"border\" style={{height: '100%', overflowY: 'auto'}}>\n {children}\n </Container>\n )\n}\n","import {Box, Card, Grid, Text} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled, css} from 'styled-components'\n\nimport {WidgetContainer} from '../containers/WidgetContainer'\nimport {type DashboardConfig, type LayoutConfig, type DashboardWidget} from '../types'\n\nconst media = {\n small: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[0]}px) {\n ${css(...args)}\n }\n `,\n medium: (...args: Parameters<typeof css>) => css`\n @media (min-width: ${({theme}) => getTheme_v2(theme).media[2]}px) {\n ${css(...args)}\n }\n `,\n}\n\nconst Root = styled(Grid)`\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n\n & > div {\n overflow: hidden;\n }\n\n & > div[data-width='medium'] {\n ${media.small`\n grid-column: span 2;\n `}\n }\n\n & > div[data-width='large'] {\n ${media.small`\n grid-column: span 2;\n `}\n\n ${media.medium`\n grid-column: span 3;\n `}\n }\n\n & > div[data-width='full'] {\n ${media.small`\n grid-column: 1 / -1;\n `}\n }\n\n & > div[data-height='medium'] {\n ${media.small`\n grid-row: span 2;\n `}\n }\n\n & > div[data-height='large'] {\n ${media.small`\n grid-row: span 2;\n `}\n\n ${media.medium`\n grid-row: span 3;\n `}\n }\n\n & > div[data-height='full'] {\n ${media.medium`\n grid-row: 1 / -1;\n `}\n }\n`\n\nexport interface WidgetGroupProps {\n config: Partial<DashboardConfig>\n}\n\nconst NO_WIDGETS: DashboardWidget[] = []\nconst NO_LAYOUT: LayoutConfig = {}\n\nexport function WidgetGroup(props: WidgetGroupProps) {\n const {\n config: {layout = NO_LAYOUT, widgets = NO_WIDGETS},\n } = props\n return (\n <Root\n autoFlow=\"row dense\"\n data-width={layout.width || 'auto'}\n data-height={layout.height || 'auto'}\n gap={4}\n >\n {widgets.length ? null : (\n <Card padding={4} shadow={1} tone=\"primary\">\n <Text align=\"center\">Add some widgets to populate this space.</Text>\n </Card>\n )}\n {widgets.map((widgetConfig, index) => {\n if (widgetConfig.type === '__experimental_group') {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetGroup key={index} config={widgetConfig} />\n }\n if (widgetConfig.component) {\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <WidgetContainer key={index} {...widgetConfig} />\n }\n // eslint-disable-next-line react/no-array-index-key -- static widget config never reorders\n return <Box key={index}>{widgetConfig.name} is missing widget component</Box>\n })}\n </Root>\n )\n}\n","import {DashboardLayout} from '../components/DashboardLayout'\nimport {WidgetGroup} from '../components/WidgetGroup'\nimport {type DashboardConfig} from '../types'\nimport {DashboardContext} from './DashboardContext'\n\nexport function Dashboard({config}: {config: DashboardConfig}) {\n if (!config) {\n return null\n }\n\n return (\n <DashboardContext.Provider value={config}>\n <DashboardLayout>\n <WidgetGroup config={config} />\n </DashboardLayout>\n </DashboardContext.Provider>\n )\n}\n","import {type ComponentType, type CSSProperties} from 'react'\nimport {definePlugin} from 'sanity'\n\nimport {Dashboard} from './containers/Dashboard'\nimport {type DashboardConfig, type DashboardWidget, type LayoutConfig} from './types'\n\nconst strokeStyle: CSSProperties = {\n stroke: 'currentColor',\n strokeWidth: 1.2,\n}\n\nconst DashboardIcon = () => (\n <svg\n data-sanity-icon\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n preserveAspectRatio=\"xMidYMid\"\n width=\"1em\"\n height=\"1em\"\n >\n <path d=\"M19.5 19.5H5.5V5.5H19.5V19.5Z\" style={strokeStyle} />\n <path d=\"M5.5 12.5H19.5\" style={strokeStyle} />\n <path d=\"M14.5 19.5V12.5M10.5 12.5V5.5\" style={strokeStyle} />\n </svg>\n)\n\nexport interface DashboardPluginConfig {\n /**\n * Dashboard tool title\n */\n title?: string\n /**\n * Dashboard tool name (used in url path)\n */\n name?: string\n /**\n * Dashboard tool icon\n */\n icon?: ComponentType\n widgets?: DashboardWidget[]\n\n /**\n * Will be used for widgets that do not define a layout directly.\n */\n defaultLayout?: LayoutConfig\n}\n\nexport const dashboardTool = definePlugin<DashboardPluginConfig>((config = {}) => {\n const pluginConfig: DashboardConfig = {\n layout: config.defaultLayout ?? {},\n widgets: config.widgets ?? [],\n }\n\n const title = config.title ?? 'Dashboard'\n const name = config.name ?? 'dashboard'\n const icon = config.icon ?? DashboardIcon\n\n return {\n name: 'dashboard',\n tools: [\n {\n title,\n name,\n icon,\n component: () => <Dashboard config={pluginConfig} />,\n },\n ],\n }\n})\n"],"mappings":"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"}
\ No newline at end of file