@sanity/dashboard

6.0.86.0.9
~

Modified (5 files)

Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -570,9 +570,9 @@
 		})
 	}), $[21] = href, $[22] = t9, $[23] = t10) : t10 = $[23], t10;
 }
 function createUrl(slug, type) {
-	return type === "tutorial" ? `https://www.sanity.io/docs/tutorials/${slug.current}` : type === "guide" ? `https://www.sanity.io/docs/guides/${slug.current}` : !1;
+	return type === "tutorial" ? `https://www.sanity.io/docs/tutorials/${slug.current}` : type === "guide" && `https://www.sanity.io/docs/guides/${slug.current}`;
 }
 function SanityTutorials(props) {
 	let $ = c(10), { templateRepoId } = props, t0;
 	$[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = [], $[0] = t0) : t0 = $[0];
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@sanity/dashboard",
-  "version": "6.0.8",
+  "version": "6.0.9",
   "description": "Tool for rendering dashboard widgets",
   "keywords": [
     "cms",
     "content",
@@ -34,22 +34,22 @@
   },
   "dependencies": {
     "@sanity/icons": "^5.0.0",
     "@sanity/image-url": "^2.1.1",
-    "@sanity/ui": "^3.3.1",
+    "@sanity/ui": "^3.3.5",
     "rxjs": "^7.8.2"
   },
   "devDependencies": {
     "@sanity/tsconfig": "^2.2.0",
-    "@sanity/tsdown-config": "^0.11.0",
+    "@sanity/tsdown-config": "^0.13.1",
     "@types/react": "^19.2.17",
     "@types/react-dom": "^19.2.3",
     "babel-plugin-react-compiler": "^1.0.0",
     "react": "^19.2.7",
     "react-dom": "^19.2.7",
     "sanity": "^6.3.0",
     "styled-components": "^6.4.3",
-    "tsdown": "^0.22.3"
+    "tsdown": "^0.22.5"
   },
   "peerDependencies": {
     "react": "^19.2",
     "react-dom": "^19.2",
Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/DashboardWidgetContainer.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/index.ts","../src/plugin.tsx"],"mappings":";UAEiB,eAAA;EACf,IAAA;EACA,IAAA;EACA,SAAA,EAAW,iBAAA,QAAyB,cAAA;EACpC,MAAA,GAAS,YAAA;EACT,OAAA,GAAU,eAAA;AAAA;AAAA,KAGA,UAAA;AAAA,UAEK,YAAA;EACf,KAAA,GAAQ,UAAA;EACR,MAAA,GAAS,UAAU;AAAA;AAAA,UAGJ,eAAA;EACf,OAAA,EAAS,eAAA;EACT,MAAA,GAAS,YAAY;AAAA;AAAA,UCwBb,oBAAA;EACR,MAAA;EACA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,cAAA;AAAA;AAAA,iBAGF,wBAAA,CAAyB,KAAA,EAAO,oBAAoB,mBAAA,GAAA,CAAA,OAAA;AAAA,iBC/CpD,iBAAA,CAAkB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,iBCApE,kBAAA,CAAmB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,iBCArE,qBAAA,CAAsB,MAAA;EAAU,MAAA,GAAS,YAAA;AAAA,IAAgB,eAAe;AAAA,UCwBvE,qBAAA;ELzBe;;;EK6B9B,KAAA;ELzBS;;;EK6BT,IAAA;ELhCA;;;EKoCA,IAAA,GAAO,aAAA;EACP,OAAA,GAAU,eAAA;ELlCV;;;EKuCA,aAAA,GAAgB,YAAA;AAAA;AAAA,cAGL,aAAA,mBAAa,MAAA,CAAA,qBAAA"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/components/DashboardWidgetContainer.tsx","../src/widgets/projectInfo/index.ts","../src/widgets/projectUsers/index.ts","../src/widgets/sanityTutorials/index.ts","../src/plugin.tsx"],"mappings":";UAEiB;EACf;EACA;EACA,WAAW,yBAAyB;EACpC,SAAS;EACT,UAAU;;KAGA;UAEK;EACf,QAAQ;EACR,SAAS;;UAGM;EACf,SAAS;EACT,SAAS;;UCwBD;EACR;EACA,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,MAAM,MAAM,IAAI;;iBAGF,yBAAyB,OAAO,uCAAoB,IAAA;iBC/CpD,kBAAkB;EAAU,SAAS;IAAgB;iBCArD,mBAAmB;EAAU,SAAS;IAAgB;iBCAtD,sBAAsB;EAAU,SAAS;IAAgB;UCwBxD;;;;EAIf;;;;EAIA;;;;EAIA,OAAO;EACP,UAAU;;;;EAKV,gBAAgB;;cAGL,gCAAa,OAAA"}
\ No newline at end of file
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","Code","Button","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","uri","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","uri","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","uri","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, Code, Button} from '@sanity/ui'\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[]>({uri: '/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          uri: `/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        uri: `/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 uri = templateRepoId\n          ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n          : '/addons/dashboard'\n        return versionedClient.observable.request<{items: FeedItem[]}>({\n          uri,\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":";;;;;;;;;;;;AAIA,MAAMK,SAAOD,OAAOJ,IAAI,CAAC,CAAA,WAAA;;;qHASnBM,SAASF,OAAOJ,IAAI,CAAC,CAAA,WAAA;;;qGAQrBO,SAASH,OAAOJ,IAAI,CAAC,CAAA,WAAA;;;8IAUrBQ,UAAUJ,OAAOH,GAAG,CAAC,CAAA,WAAA;;;qFAMH,EAACQ,YAAWN,YAAYM,KAAK,CAAC,CAACC,MAAM,GAAE;AAa/D,SAAOU,yBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAX,QAAAC,UAAAG,QAAAC,QAAwCI,OAAKG;CAAA,AAAAF,EAAA,OAAAV,SAUxCY,KAAAF,EAAA,MANAE,KAAAZ,UACC,oBAAC,QAAD;EAAQ,cAAA;EAAuB,UAAA;EAAa,UAAA;YAC1C,oBAAC,SAAD;GAAe,MAAA;GAAgB,cAAA;aAC5BA;EADK,CAAA;CADH,CAAA,GAKRU,EAAA,KAAAV,QAAAU,EAAA,KAAAE;CAAA,IAAAC;CAAA,AAAAH,EAAA,OAAAT,WACyCY,KAAAH,EAAA,MAAzCG,KAAAZ,YAAY,oBAAC,SAAD,EAAUA,SAAF,CAAA,GAAqBS,EAAA,KAAAT,UAAAS,EAAA,KAAAG;CAAA,IAAAC;CAAA,AAAAJ,EAAA,OAAAN,SACIU,KAAAJ,EAAA,MAA7CI,KAAAV,UAAU,oBAAC,QAAD;EAAQ,WAAA;YAAWA;CAAZ,CAAA,GAA4BM,EAAA,KAAAN,QAAAM,EAAA,KAAAI;CAAA,IAAAC;CACzC,OADyCL,EAAA,OAAAL,OAAAK,EAAA,OAAAE,MAAAF,EAAA,OAAAG,MAAAH,EAAA,OAAAI,MAThDC,KAAA,qBAAC,QAAD;EAAc,QAAA;EAAW,SAAA;EAAYV;YAArC;GACGO;GAOAC;GACAC;EATE;KAUEJ,EAAA,KAAAL,KAAAK,EAAA,KAAAE,IAAAF,EAAA,KAAAG,IAAAH,EAAA,KAAAI,IAAAJ,EAAA,MAAAK,MAAAA,KAAAL,EAAA,KAVPK;AAUO;AC5DX,MAAaI,mBAAmBH,cAA+B,EAACI,SAAS,CAAA,EAAE,CAAC;AAE5E,SAAOC,qBAAA;CAAA,OACEJ,WAAWE,gBAAgB;AAAC;ACDrC,SAAOO,gBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACLC,SAAeL,mBAAmB,GAACM;CAAA,AAAAH,EAAA,OAAAE,OAAAE,UAAAJ,EAAA,OAAAD,MAAAK,UAE1BD,KAAA;EAAA,GACFJ,MAAKK;EAAO,GACZF,OAAME;CACX,GAACJ,EAAA,KAAAE,OAAAE,QAAAJ,EAAA,KAAAD,MAAAK,QAAAJ,EAAA,KAAAG,MAAAA,KAAAH,EAAA;CAJH,IAAAI,SACSD,IAOTE,SAAeN,MAAKO,WAAUC;CAAA,AAAAP,EAAA,OAAAK,SAIhBE,KAAAP,EAAA,MAAVO,KAAA,oBAAC,QAAD,CAAO,CAAA,GAAGP,EAAA,KAAAK,QAAAL,EAAA,KAAAO;CAAA,IAAAC;CACL,OADKR,EAAA,OAAAI,OAAAK,UAAAT,EAAA,OAAAI,OAAAM,SAAAV,EAAA,OAAAO,MADZC,KAAA,oBAAC,MAAD;EAAc,QAAA;EAAe,cAAAJ,OAAMM;EAAqB,eAAAN,OAAMK;YAC5DF;CADG,CAAA,GAEEP,EAAA,KAAAI,OAAAK,QAAAT,EAAA,KAAAI,OAAAM,OAAAV,EAAA,KAAAO,IAAAP,EAAA,KAAAQ,MAAAA,KAAAR,EAAA,IAFPQ;AAEO;ACnBX,SAAOI,qBAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAAC;CACsC,OADtCF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KACYF,KAAA,EAAAG,YAAa,aAAY,GAACL,EAAA,KAAAE,MAAAA,KAAAF,EAAA,IAApCF,UAAUI,EAA0B;AAAC;ACO9C,SAASyB,MAAMC,KAAc;CAC3B,OAAOA,OAAO,eAAeC,KAAKD,GAAG;AACvC;AAEA,SAASE,cAAcC,WAAmBC,SAAiB;CACzD,OAAO,WAAWD,UAAS,4BAA6BC,QAAO;AACjE;AAEA,SAASC,WAAWF,WAAmBC,SAAiB;CACtD,OAAO,WAAWD,UAAS,yBAA0BC;AACvD;AAEA,SAASE,aAAaH,WAAmB;CACvC,OAAO,qCAAqCA;AAC9C;AAEA,MAAMI,kBAAqC,CAAA,GACrCC,UAAyB,CAAA;AAE/B,SAAOC,YAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAC,uBAAAC,IAAAC,MAAAC,OAAkEN,OAA3DG,wBAAAC,OAAAG,KAAAA,IAAAV,kBAAAO,IAAyCC,OAAAC,OAAAC,KAAAA,IAAAT,UAAAQ,IAChD,CAAAE,YAAAC,iBAAoC9B,SAA0D,GAC9F,CAAA+B,YAAAC,iBAAoChC,SAA+C,GACnFiC,kBAAwB5B,mBAAmB,GAAC6B;CAAA,AAAAZ,EAAA,OAAAW,kBACiCC,KAAAZ,EAAA,MAAxBY,KAAAD,gBAAeE,OAAQ,GAACb,EAAA,KAAAW,iBAAAX,EAAA,KAAAY;CAA7E,IAAA,EAAApB,WAAAsB,IAAArB,SAAAsB,OAAqDH,IAA9CpB,YAAAsB,OAAAR,KAAAA,IAAA,YAAAQ,IAAuBrB,UAAAsB,OAAAT,KAAAA,IAAA,YAAAS,IAAmBC;CAAA,AAAAhB,EAAA,OAAAP,WAAAO,EAAA,OAAAR,aAAAQ,EAAA,OAAAW,gBAAAM,cAEvCD,WAAA;EACR,IAAAE,gBAAsC,CAAA;EAqCrC,OAnCDA,cAAaC,KACXR,gBAAeM,WAAWG,QACI;GAAAC,KAAM;GAAoBC,KAAO;EAAwB,CAAC,CAAC,CAAAC,UAC5E;GAAAC,OACHC,WAAYjB,cAAciB,OAAMC,OAAQC,OAA8B,CAAC;GAACC,QACvEA,UAAA;IAELpB,AADAqB,QAAOD,MAAO,2CAA2CA,KAAK,GAC9DpB,cAAc,EAAAoB,OACL,uEACT,CAAC;GAAC;EAEN,CAAC,CACL,GAGAV,cAAaC,KACXR,gBAAeM,WAAWG,QACf;GAAAU,QACC;GAAMT,KACT,YAAY5B,QAAO;GAAU6B,KAC7B;EACP,CAAC,CAAC,CAAAC,UACS;GAAAC,YACGd,cAAcnB,cAAcC,WAAWC,OAAO,CAAC;GAACmC,QACrDG,YAAA;IACL,AAAIH,QAAKI,eAAgB,MACvBtB,cAAcJ,KAAAA,CAAS,KAEvBuB,QAAOD,MAAO,sCAAsCA,OAAK,GACzDlB,cAAc,EAAAkB,OACL,iEACT,CAAC;GACF;EAEL,CAAC,CACL,SAEO;GACLV,cAAae,QAASC,QAAsB;EAAC;CAC9C,GACFlC,EAAA,KAAAP,SAAAO,EAAA,KAAAR,WAAAQ,EAAA,KAAAW,gBAAAM,YAAAjB,EAAA,KAAAgB,MAAAA,KAAAhB,EAAA;CAAA,IAAAmC;CA3CD3D,AA2CCwB,EAAA,OAAAP,WAAAO,EAAA,OAAAR,aAAAQ,EAAA,OAAAW,mBAAEwB,KAAA;EAAC1C;EAASD;EAAWmB;EAAiBD;CAAa,GAACV,EAAA,KAAAP,SAAAO,EAAA,KAAAR,WAAAQ,EAAA,KAAAW,iBAAAX,EAAA,KAAAmC,MAAAA,KAAAnC,EAAA,IA3CvDxB,UAAUwC,IA2CPmB,EAAoD;CAAC,IAAAC;CAAA,IAAApC,EAAA,QAAAI,QAAAJ,EAAA,QAAAP,WAAAO,EAAA,QAAAS,cAAAT,EAAA,QAAAR,aAAAQ,EAAA,QAAAO,YAAA;EAGtD6B,WAAoB,CAClB;GAAAC,OACS;GAAgBC,MACjB,CACJ;IAAAD,OAAQ;IAAYE,OAAS/C;GAAS,GACtC;IAAA6C,OAAQ;IAASE,OAAS9C;GAAO,CAAC;EAEtC,CAAC;EAGH,IAAA+C,OAAoBpC,KAAIsB,OAAQe,MAAkC;EAelEhB,CAZEiB,MAAKC,QAASpC,UAA4B,IAA1CA,aAAA,CAAA,EAAA,CAA2C0B,SAAUW,UAAA;GACrDJ,KAAIrB,KAAM;IAAAkB,OACDQ,MAAGR,SAAH;IAAqBE,OACrBM,MAAGC,YAAa,aAAhB,WAAwCD,MAAGE,QAAQ,kBAAmBF,MAAGE;GAClF,CAAC;EAAC,CACH,GAEGP,KAAIQ,SAAU,MAChBvB,WAASA,SAAMwB,OAAQ,CAAC;GAAAZ,OAAQ;GAAMC,MAAQE;EAAI,CAAC,CAAC,IAItDf,WAASA,SAAMwB,OACb,CACE;GAAAZ,OACS;GAAMC,MACP,CACJ;IAAAD,OAAQ;IAAME,OAAS7C,WAAWF,WAAWC,OAAO;GAAC,GACrD;IAAA4C,OACS;IAASE,QACR,OAAO9B,cAAe,WAAtB,UAAAA,eAAD;GACT,CAAC;EAEL,CAAC,GAEHL,KAAIsB,OAAQwB,MAAkC,CAChD;EAGA,IAAAC,aAAkD,CAAC;EAUjDnD,AATFI,KAAI6B,SAASmB,WAAA;GACX,IAAIC,OAAIC,YAAaD,OAAIC,aAAc,UAAUD,OAAIC,aAAc,QAAM;IACvE,IAAAC,QAAcJ,WAAWE,OAAIC,aAAf,CAAA;IAEdH,AADAI,MAAKpC,KAAMkC,MAAI,GACfF,WAAWE,OAAIC,YAAaC;GAAH;EAC1B,CACF,GACDC,OAAMC,KAAMN,UAAU,CAAC,CAAAlB,SAASqB,aAAA;GAC9B7B,SAAMN,KAAM;IAAAkB,OAAQiB;IAAQhB,MAAQa,WAAWG;GAAS,CAAC;EAAC,CAC3D,GAACtD,EAAA,MAAAI,MAAAJ,EAAA,MAAAP,SAAAO,EAAA,MAAAS,YAAAT,EAAA,MAAAR,WAAAQ,EAAA,MAAAO,YAAAP,EAAA,MAAAoC;CAAA,OAAAA,WAAApC,EAAA;CArDJ,IAAA0D,oBAuDEtB,UACoDuB;CAAA,AAAA3D,EAAA,QAAAE,wBAOhDyD,KAAA3D,EAAA,OAHD2D,KAAAzD,sBAAqB0D,IAAKC,MAG1B,GAAC7D,EAAA,MAAAE,uBAAAF,EAAA,MAAA2D;CAC4B,IAAAG,KAAA5D,uBAAqB8C,SAAW,IAAhC,IAAA,GAAyCe;CAAA,AAAA/D,EAAA,QAAAgE,OAAAC,IAAA,2BAAA,KAIxDF,KAAA,EAAAG,OAAQ,OAAM,GAAClE,EAAA,MAAA+D,MAAAA,KAAA/D,EAAA;CAAA,IAAAmE;CAAA,AAAAnE,EAAA,QAAAR,YAOO2E,MAAAnE,EAAA,OAAvBmE,MAAAxE,aAAaH,SAAS,GAACQ,EAAA,MAAAR,WAAAQ,EAAA,MAAAmE;CAAA,IAAAC;CAAA,AAAApE,EAAA,QAAAmE,MAC7BC,MAAApE,EAAA,OATFoE,MAAA,oBAAC,QAAD;EACS,OAAAL;EACG,UAAA;EACA,UAAA;EACL,MAAA;EACA,MAAA;EACA,MAAA;EACF,IAAA;EACG,MAAAI;CAAuB,CAAA,GAC7BnE,EAAA,MAAAmE,KAAAnE,EAAA,MAAAoE;CAAA,IAAAC;CAAA,AAAArE,EAAA,QAAAgE,OAAAC,IAAA,2BAAA,KAKAI,MAAA,oBAAC,KAAD;EAAe,UAAA;EAAM,IAAA;YACnB,oBAAC,SAAD;GAAe,MAAA;GAAM,IAAA;GAAQ,IAAA;aAAqB;EAA1C,CAAA;CADN,CAAA,GAIErE,EAAA,MAAAqE,OAAAA,MAAArE,EAAA;CAAA,IAAAsE;CAAA,AAAAtE,EAAA,QAAA0D,oBAyCJY,MAAAtE,EAAA,OAxCDsE,MAAAZ,kBAAiBE,IAAKW,MAwCtB,GAACvE,EAAA,MAAA0D,mBAAA1D,EAAA,MAAAsE;CAAA,IAAAE;CAAA,AAAAxE,EAAA,QAAAsE,MAECE,MAAAxE,EAAA,OAjDPwE,MAAA,oBAAC,MAAD;EAAgB,UAAA;EAAW,QAAA;EAAc,cAAA;YACvC,qBAAC,OAAD;GAAY,KAAA;aAAZ,CACEH,KAKCC,GANG;;CADH,CAAA,GAiDEtE,EAAA,MAAAsE,KAAAtE,EAAA,MAAAwE;CAAA,IAAAC;CAAA,AAAAzE,EAAA,QAAAoE,OAAApE,EAAA,QAAAwE,OA/DTC,MAAA,oBAAC,0BAAD;EAEI,QAAAL;YAYFI;CAduB,CAAA,GAgEExE,EAAA,MAAAoE,KAAApE,EAAA,MAAAwE,KAAAxE,EAAA,MAAAyE,OAAAA,MAAAzE,EAAA;CAAA,IAAA0E;CAAA,AAAA1E,EAAA,QAAAyE,OAAAzE,EAAA,QAAA8D,MAjE7BY,MAAA,oBAAC,KAAD;EAAY,QAAA;EAAkB,WAAAZ;YAC5BW;CADE,CAAA,GAkEEzE,EAAA,MAAAyE,KAAAzE,EAAA,MAAA8D,IAAA9D,EAAA,MAAA0E,OAAAA,MAAA1E,EAAA;CAAA,IAAA2E;CACL,OADK3E,EAAA,QAAA0E,OAAA1E,EAAA,QAAA2D,MAvERgB,MAAA,qBAAA,UAAA,EAAA,UAAA,CACGhB,IAIDe,GAkEM,EAAA,CAAA,GACL1E,EAAA,MAAA0E,KAAA1E,EAAA,MAAA2D,IAAA3D,EAAA,MAAA2E,OAAAA,MAAA3E,EAAA,KAxEH2E;AAwEG;AAvLA,SAAAJ,OAAAK,QAAA;CA6IU,OAFG,CAACvB,UAAD,CAAUA,OAAIf,OACT,OAIP,qBAAC,OAAD;EAA6B,KAAA;YAA7B,CACE,oBAAC,MAAD;GAAM,cAAA;GAAsB,SAAA;aAC1B,oBAAC,OAAD;IAAa,MAAA;IAAG,OAAA;cACbe,OAAIhB;GADD,CAAA;EADH,CAAA,GAKL,oBAAC,OAAD;GAAY,KAAA;GAAa,UAAA;aACtBgB,OAAIf,KAAKsB,IAAKiB,MAuBd;EAxBG,CAAA,CANF;IAAMxB,OAAIhB,KAAV;AAgCE;AAhLnB,SAAAwC,OAAAC,KAAA;CAwJiB,IAAAC,WAAiB,OAAOD,IAAGvC,SAAW,WAAWuC,IAAGvC,MAAMX,QAASkD,IAAGvC;CAAM,OAE1E,qBAAC,MAAD;EAAkE,qBAAA;YAAlE;GACE,oBAAC,MAAD;IAAa,QAAA;cAAUuC,IAAGzC;GAArB,CAAA;GACJ,OAAOyC,IAAGvC,SAAW,YACpB,oBAAC,MAAD;IAAY,MAAA;cAAIuC,IAAGvC,OAAaX;GAA3B,CAAA;GAEN,OAAOkD,IAAGvC,SAAW,YAArB,oBAAA,UAAA,EAAA,UAEInD,MAAM0F,IAAGvC,KAQV,IAPE,oBAAC,MAAD;IAAY,MAAA;IAAU,OAAA,EAAAyC,WAAY,aAAY;cAC5C,oBAAA,KAAA;KAAS,MAAAF,IAAGvC;eAASuC,IAAGvC;IAAW,CAAA;GADhC,CAAA,IAIL,oBAAC,MAAD;IAAY,MAAA;IAAU,OAAA,EAAAyC,WAAY,aAAY;cAC3CF,IAAGvC;GADD,CAAA,EAGN,CAAA;EAfF;IAAM,GAAGwC,YAAA,GAAc,GAAID,IAAGzC,OAA9B;AAkBE;AA5K1B,SAAAwB,OAAAoB,cAAAC,KAAA;CAAA,OAkHC,oBAAC,iBAAD,EAAyB,GAAMD,aAAY,GAArBC,GAAqB;AAAI;AAlHhD,SAAAhC,OAAAiC,QAAA;CAAA,OA2FqB9B,OAAIC,aAAc;AAAM;AA3F7C,SAAAb,OAAAY,MAAA;CAAA,OA+DuCA,KAAIC,aAAc;AAAM;AA/D/D,SAAApB,SAAAkD,GAAA;CAAA,OAgD4BA,EAACC,YAAa;AAAC;AAhD3C,SAAA1D,QAAAkB,KAAA;CAAA,OAc0DA,IAAGyC,SAAU;AAAQ;ACxCtF,SAAgBI,kBAAkBC,QAAmD;CACnF,OAAO;EACLE,MAAM;EACNC,WAAWL;EACXG,QAAQD,QAAQC,UAAU,EAACG,OAAO,SAAQ;CAC5C;AACF;ACJA,MAAMW,SAAOD,OAAOP,IAAI,CAAC,CAAA,WAAA;;;YACbC,IAAI,EAAE,EAAC;AAUnB,SAAOY,YAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAqB,EAAAN,MAAAC,SAAAC,UAAAE,IAAwCG;CAAA,AAAAF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KACjCF,KAAA,EAAAG,OAAQ,SAAQ,GAACL,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAAlD,IAAAM,aAAmBjB,cAAca,EAAiB,GAACK;CAAA,AAAAP,EAAA,OAAAJ,WAAAI,EAAA,OAAAL,QAI7CY,KAAA,oBAAC,KAAD;EAAU,MAAA;YACPX,UACC,oBAAC,MAAD;GAAY,MAAA;aACV,oBAAC,WAAD,CAAU,CAAA;EADP,CAAA,IAIL,oBAAC,YAAD,EAAkBD,KAAI,CAAA;CANtB,CAAA,GAQEK,EAAA,KAAAJ,SAAAI,EAAA,KAAAL,MAAAK,EAAA,KAAAO,MAAAA,KAAAP,EAAA;CAAA,IAAAQ;CAAA,AAAAR,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KAGkBI,KAAA,EAAAC,OAAQ,UAAS,GAACT,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAAA,IAAAU;CAAA,AAAAV,EAAA,OAAAL,KAAAgB,cAEjCD,KAAAV,EAAA,MAFPU,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAU,OAAAF;EAAiC,cAAA;EAAkB,QAAA;YACtEb,KAAIgB;CADF,CAAA,GAEEX,EAAA,KAAAL,KAAAgB,aAAAX,EAAA,KAAAU;CAAA,IAAAE;CAAA,AAAAZ,EAAA,OAAAM,cAAAN,EAAA,OAAAH,SAGJe,KAAAN,WAAUO,OAAQhB,KAAK,GAACG,EAAA,KAAAM,YAAAN,EAAA,KAAAH,OAAAG,EAAA,KAAAY,MAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,AAAAd,EAAA,QAAAY,KACpBE,KAAAd,EAAA,OAFPc,KAAA,oBAAC,MAAD;EAAM,OAAA;EAAY,MAAA;EAAgB,cAAA;YAC/BF;CADE,CAAA,GAEEZ,EAAA,MAAAY,IAAAZ,EAAA,MAAAc;CAAA,IAAAC;CAAA,AAAAf,EAAA,QAAAU,MAAAV,EAAA,QAAAc,MAPTC,KAAA,qBAAC,OAAD;EAAa,MAAA;EAAQ,KAAA;YAArB,CACEL,IAIAI,EALI;KAQEd,EAAA,MAAAU,IAAAV,EAAA,MAAAc,IAAAd,EAAA,MAAAe,MAAAA,KAAAf,EAAA;CAAA,IAAAgB;CAEL,OAFKhB,EAAA,QAAAO,MAAAP,EAAA,QAAAe,MApBZC,KAAA,oBAAC,QAAD;EAAY,OAAA;YACV,qBAAC,MAAD;GAAY,OAAA;GAAe,MAAA;GAAQ,KAAA;aAAnC,CACET,IAUAQ,EAXG;;CADF,CAAA,GAsBEf,EAAA,MAAAO,IAAAP,EAAA,MAAAe,IAAAf,EAAA,MAAAgB,MAAAA,KAAAhB,EAAA,KAtBPgB;AAsBO;AC/BX,SAASkB,aAAaC,WAAmB;CACvC,OAAO,qCAAqCA,UAAS;AACvD;AAeA,SAAOS,eAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,CAAAC,SAAAC,cAA8BxB,SAA8B,GAC5D,CAAAyB,OAAAC,YAA0B1B,SAA6B,GACvD,CAAA2B,OAAAC,YAA0B5B,SAA4B,GAEtD6B,YAAkBvB,aAAa,GAC/BwB,kBAAwBtB,mBAAmB,GAACuB;CAAA,AAAAV,EAAA,OAAAQ,aAAAR,EAAA,OAAAS,mBAEdC,WAAA;EAC5B,IAAA,EAAApB,cAAoBmB,gBAAeE,OAAQ,GAC3CC,eAAqBH,gBAAeI,WAAWC,QAC3B;GAAAC,KACX,aAAazB;GAAW0B,KACxB;EACP,CAAC,CAAC,CAAAC,KAEAnC,WAAUoC,aACRtC,KAAK4B,UAASW,SAAUD,SAAQpB,QAAQjB,IAAKuC,OAAe,CAAC,CAAC,CAAC,CAAAH,KAC7DpC,KAAIwC,YAAa;GAAAnB,SAAUgB;GAAQd,OAASiB;EAAM,EAAE,CACtD,CACF,CACF,CAAC,CAAAC,UACU;GAAAC,OACHC,OAAA;IAAC,IAAA,EAAApB,OAAAqB,UAAAvB,SAAAwB,eAAAF;IAELnB,AADAF,WAAWe,UAAQ,GACnBb,UACGsB,MAAKC,QAASP,QAA0B,IAAxCI,WAAA,CAAkCJ,QAAM,EAAA,CAACQ,MAAOC,OAAAC,UAC/CC,uBAAuBF,OAAOC,OAAOb,UAAQ,CAC/C,CACF;GAAC;GACFZ,QACM2B,MAAc1B,SAAS0B,CAAC;EACjC,CAAC;EAAC,aAESrB,aAAYsB,YAAa;CAAC,GACxClC,EAAA,KAAAQ,WAAAR,EAAA,KAAAS,iBAAAT,EAAA,KAAAU,MAAAA,KAAAV,EAAA;CA3BD,IAAAmC,YAAkBzB,IA2Bcc,IAAAY;CAEhC1D,AAFgCsB,EAAA,OAAAmC,aAEQX,KAAAxB,EAAA,IAAAoC,KAAApC,EAAA,OAA9BwB,WAAMW,UAAU,GAAGC,KAAA,CAACD,SAAS,GAACnC,EAAA,KAAAmC,WAAAnC,EAAA,KAAAwB,IAAAxB,EAAA,KAAAoC,KAAxC1D,UAAU8C,IAAmBY,EAAW;CAAC,IAAAC;CAAA,AAAArC,EAAA,OAAAmC,YAEaE,KAAArC,EAAA,MAAjBqC,WAAMF,UAAU,GAACnC,EAAA,KAAAmC,WAAAnC,EAAA,KAAAqC;CAAtD,IAAAC,mBAAyBD,IAEzBE,YAAkB,CAACnC,SAAD,CAAWF;CAE7B,IAAII,OAAK;EAAA,IAAAkC;EAAA,AAAAxC,EAAA,OAAAyC,OAAAC,IAAA,2BAAA,KAKCF,KAAA,oBAAC,MAAD,EAAA,UAAM,4CAAD,CAAA,GAAiDxC,EAAA,KAAAwC,MAAAA,KAAAxC,EAAA;EAAA,IAAA2C;EAWjC,OAXiC3C,EAAA,OAAAsC,mBAWjCK,KAAA3C,EAAA,OAd3B2C,KAAA,oBAAC,0BAAD;GAAiC,QAAA;aAC/B,oBAAC,KAAD;IAAc,SAAA;cACZ,qBAAC,OAAD;KAAY,KAAA;eAAZ,CACEH,IACA,oBAAC,KAAD,EAAA,UACE,oBAAC,QAAD;MACO,MAAA;MACA,MAAA;MACC,OAAA;MACGF,SAAAA;KAAgB,CAAA,EALzB,CAAA,CAFA;;GADJ,CAAA;EADmB,CAAA,GAcEtC,EAAA,KAAAsC,kBAAAtC,EAAA,MAAA2C,KAd3BA;CAc2B;CAE9B,IAAAH;CAAA,AAAAxC,EAAA,QAAAyC,OAAAC,IAAA,2BAAA,KAOcF,KAAA,EAAAI,OAAQ,OAAM,GAAC5C,EAAA,MAAAwC,MAAAA,KAAAxC,EAAA;CAAA,IAAA2C;CAAA,AAAA3C,EAAA,QAAAuC,aAAAvC,EAAA,QAAAE,WAQhByC,KAAAJ,YAAAM,KAAAA,IAAwBxD,aAAaa,QAAOV,EAAG,GAACQ,EAAA,MAAAuC,WAAAvC,EAAA,MAAAE,SAAAF,EAAA,MAAA2C,MAAAA,KAAA3C,EAAA;CAAA,IAAA8C;CAAA,AAAA9C,EAAA,QAAAuC,aAAAvC,EAAA,QAAA2C,MATxDG,KAAA,oBAAC,QAAD;EACS,OAAAN;EACG,UAAA;EACA,UAAA;EACL,MAAA;EACA,MAAA;EACA,MAAA;EACF,IAAA;EACMD,SAAAA;EACH,MAAAI;CAAgD,CAAA,GACtD3C,EAAA,MAAAuC,WAAAvC,EAAA,MAAA2C,IAAA3C,EAAA,MAAA8C,MAAAA,KAAA9C,EAAA;CAAA,IAAA+C;CAAA,AAAA/C,EAAA,QAAAuC,YAcHQ,KAAA/C,EAAA,OAXA+C,KAAAR,aACC,oBAAC,KAAD;EAAe,UAAA;EAAa,UAAA;YAC1B,qBAAC,OAAD;GAAY,KAAA;aAAZ,CACE,oBAAC,MAAD;IAAY,OAAA;IAAS,OAAA;IAAY,MAAA;cAC/B,oBAAC,SAAD,CAAQ,CAAA;GADL,CAAA,GAGL,oBAAC,MAAD;IAAY,OAAA;IAAe,MAAA;IAAG,OAAA;cAAM;GAA/B,CAAA,CAJD;;CADJ,CAAA,GAULvC,EAAA,MAAAuC,WAAAvC,EAAA,MAAA+C;CAAA,IAAAC;CAAA,AAAAhD,EAAA,QAAAuC,aAAAvC,EAAA,QAAAE,WAAAF,EAAA,QAAAI,SAEA4C,KAAA,CAACT,aACA,oBAAC,OAAD;EAAY,KAAA;EAAY,SAAA;YACrBnC,OAAKvB,KAAMoE,SAAA;GACV,IAAAC,aAAmBhD,QAAOJ,QAAQqD,MAAMC,WAAYA,OAAM5D,OAAQyD,KAAIzD,EAAG;GAAC,OAExE,oBAAC,aAAD;IAEQyD;IACG,SAAAC,YAAUxD,WAAV;IACF,OAAAwD,YAAUzD,MAAWZ,IAACwE,MAA0B,KAAhD,CAAA;GAAiD,GAHnDJ,KAAIzD,EAG+C;EACxD,CAEL;CAXG,CAAA,GAaPQ,EAAA,MAAAuC,WAAAvC,EAAA,MAAAE,SAAAF,EAAA,MAAAI,OAAAJ,EAAA,MAAAgD,MAAAA,KAAAhD,EAAA;CAAA,IAAAsD;CACwB,OADxBtD,EAAA,QAAA8C,MAAA9C,EAAA,QAAA+C,MAAA/C,EAAA,QAAAgD,MA3CHM,KAAA,qBAAC,0BAAD;EACS,QAAA;EAEL,QAAAR;YAHJ,CAgBGC,IAaAC,EA7BsB;KA4CEhD,EAAA,MAAA8C,IAAA9C,EAAA,MAAA+C,IAAA/C,EAAA,MAAAgD,IAAAhD,EAAA,MAAAsD,MAAAA,KAAAtD,EAAA,KA5C3BsD;AA4C2B;AA5GxB,SAAAD,OAAAE,MAAA;CAAA,OAsGgDA,KAAIC;AAAM;AAtG1D,SAAApC,QAAAqC,KAAA;CAAA,OAiByDA,IAAGjE;AAAG;AA+FtE,SAASwC,uBAAuBF,OAAaC,OAAa7B,SAAkB;CAC1E,IAAM,EAACJ,YAAWI,SACZwD,cAAc5D,QAAQqD,MAAMC,WAAWA,OAAO5D,OAAOsC,OAAOtC,EAAE,GAC9DmE,cAAc7D,QAAQqD,MAAMC,WAAWA,OAAO5D,OAAOuC,OAAOvC,EAAE;CAQpE,OALIkE,aAAahE,YAAYiE,aAAajE,WAChCgE,aAAa9D,aAAa,OAAO+D,aAAa/D,aAAa,MAAM,IAAI,KAIxE8D,aAAahE,UAAU,IAAI;AACpC;ACpJA,SAAgBqE,mBAAmBC,QAAmD;CACpF,OAAO;EACLE,MAAM;EACNC,WAAWL;EACXG,QAAQD,QAAQC;CAClB;AACF;ACJA,MAAMM,yBAAyB;CAC7BC,WAAW;CACXC,SAAS;AACX;AAuBA,SAAOe,iBAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACLC,kBAAwBrB,mBAAmB,GAACsB;CAAA,AAAAH,EAAA,OAAAE,kBAYvCC,KAAAH,EAAA,MATQG,MAAAC,mBAAA;EACP,IAAAC,MAAYD,iBAAA,oCAC4BA,mBAD5B;EAEW,OAChBF,gBAAeI,WAAWC,QAA8B;GAAAF;GAAAG,KAExD;GAA4BC,iBAChB;EACnB,CAAC;CAAC,GACHT,EAAA,KAAAE,iBAAAF,EAAA,KAAAG;CAAA,IAAAO;CAAA,AAAAV,EAAA,OAAAW,OAAAC,IAAA,2BAAA,KACWF,KAAA/B,sBAAsBG,sBAAsB,GAACkB,EAAA,KAAAU,MAAAA,KAAAV,EAAA;CAAA,IAAAa;CAC1D,OAD0Db,EAAA,OAAAG,KAC1DU,KAAAb,EAAA,MAZMa,KAAA;EAAAC,SACIX;EASRY,YACWL;CACd,GAACV,EAAA,KAAAG,IAAAH,EAAA,KAAAa,KAZMA;AAYN;ACzCL,MAAMY,cAAcD,OAAON,GAAG,CAAC,CAAA,WAAA;;;sNAeZ,EAACQ,YAAWH,YAAYG,KAAK,CAAC,CAACC,MAAMC,GAAE,kBAKpDC,SAAOL,OAAOJ,IAAI,CAAC,CAAA,WAAA;;;aAEnBK,YAAW,0BAQXK,aAAaN,OAAOP,IAAI,CAAC,CAAA,WAAA;;;sEAMzBc,SAASP,OAAOQ,IAAAA,WAAAA;;;EAAG;AAuBzB,SAAOQ,SAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAT,OAAAC,WAAAE,cAAAD,MAAAE,eAAAC,sBAAiFE,OAAKG;CAAA,AAAAF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KAazEF,KAAA,EAAAG,UAAW,WAAU,GAACL,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAAA,IAAAM;CAAA,AAAAN,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KAEGE,KAAA,EAAAC,QAAS,OAAM,GAACP,EAAA,KAAAM,MAAAA,KAAAN,EAAA;CAAA,IAAAQ;CAAA,AAAAR,EAAA,OAAAP,aAAAO,EAAA,OAAAL,gBAC7Ca,KAAAf,aACC,qBAAC,YAAD;EAA0B,cAAA;YAA1B,CACE,oBAAC,QAAD,EAAaA,KAAAA,UAAS,CAAA,GACrBE,gBACC,oBAAC,aAAD;GAAqB,SAAA;aACnB,oBAAC,MAAD;IAAY,OAAA;cACV,oBAAC,UAAD,CAAS,CAAA;GADN,CAAA;EADK,CAAA,CAHL;KAUZK,EAAA,KAAAP,WAAAO,EAAA,KAAAL,cAAAK,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAAA,IAAAS;CAAA,AAAAT,EAAA,OAAAR,QAIWiB,KAAAT,EAAA,MAFVS,KAAA,oBAAC,SAAD;EAAY,IAAA;EAAW,MAAA;YACpBjB;CADK,CAAA,GAEEQ,EAAA,KAAAR,OAAAQ,EAAA,KAAAS;CAAA,IAAAC;CAAA,AAAAV,EAAA,OAAAJ,gBAG+Bc,KAAAV,EAAA,MAArCU,KAAA,oBAAC,MAAD;EAAY,MAAA;YAAId;CAAX,CAAA,GAAgCI,EAAA,KAAAJ,eAAAI,EAAA,KAAAU;CAAA,IAAAC;CAAA,AAAAX,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KACfO,KAAA,EAAAC,SAAU,GAAG,GAACZ,EAAA,KAAAW,MAAAA,KAAAX,EAAA;CAAA,IAAAa;CAAA,AAAAb,EAAA,QAAAH,oBAE7BgB,KAAAb,EAAA,OAFPa,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAU,OAAAF;YACnBd;CADE,CAAA,GAEEG,EAAA,MAAAH,mBAAAG,EAAA,MAAAa;CAAA,IAAAC;CAAA,AAAAd,EAAA,QAAAU,MAAAV,EAAA,QAAAa,MALXC,KAAA,oBAAC,KAAD;EAAgB,WAAA;YACd,qBAAC,OAAD;GAAY,KAAA;GAAS,MAAA;aAArB,CACEJ,IACAG,EAFI;;CADJ,CAAA,GAOEb,EAAA,MAAAU,IAAAV,EAAA,MAAAa,IAAAb,EAAA,MAAAc,MAAAA,KAAAd,EAAA;CAAA,IAAAe;CAAA,AAAAf,EAAA,QAAAS,MAAAT,EAAA,QAAAc,MAXRC,KAAA,qBAAC,MAAD;EAAgB,WAAA;EAAiB,SAAA;EAA0B,UAAA;EAAS,MAAA;YAApE,CACEN,IAGAK,EAJG;KAYEd,EAAA,MAAAS,IAAAT,EAAA,MAAAc,IAAAd,EAAA,MAAAe,MAAAA,KAAAf,EAAA;CAAA,IAAAgB;CAAA,AAAAhB,EAAA,QAAAQ,MAAAR,EAAA,QAAAe,MAzBTC,KAAA,qBAAC,MAAD;EAAgB,WAAA;EAAgB,OAAAV;YAAhC,CACGE,IAYDO,EAbG;KA0BEf,EAAA,MAAAQ,IAAAR,EAAA,MAAAe,IAAAf,EAAA,MAAAgB,MAAAA,KAAAhB,EAAA;CAAA,IAAAiB;CAEJ,OAFIjB,EAAA,QAAAN,QAAAM,EAAA,QAAAgB,MAtCXC,MAAA,oBAAC,QAAD;EAAY,MAAA;YACV,oBAAC,MAAD;GACS,QAAA;GACD,MAAA;GACG,SAAA;GACD,QAAA;GACL,IAAA;GACGvB;GACC,QAAA;GACH,KAAA;GACG,OAAAQ;aAEPc;EAXG,CAAA;CADF,CAAA,GAwCEhB,EAAA,MAAAN,MAAAM,EAAA,MAAAgB,IAAAhB,EAAA,MAAAiB,OAAAA,MAAAjB,EAAA,KAxCPiB;AAwCO;ACrGX,SAASQ,UAAUC,MAAyBE,MAAe;CAMzD,OALIA,SAAS,aACJ,wCAAwCF,KAAKC,YAC3CC,SAAS,UACX,qCAAqCF,KAAKC,YAE5C;AACT;AAMA,SAAOI,gBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAJ,mBAAyBE,OAAKG;CAAA,AAAAF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KACyBF,KAAA,CAAA,GAAEF,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAAzD,IAAA,CAAAK,WAAAC,gBAAkCnB,SAAqBe,EAAE,GAEzD,EAAAK,SAAAC,eAA8BlB,eAAe,GAACmB,IAAAC;CAE9CxB,AAF8Cc,EAAA,OAAAO,WAAAP,EAAA,OAAAH,kBAEpCY,WAAA;EACR,IAAAE,eAAqBJ,QAAQV,cAAc,CAAC,CAAAe,WAAWC,aAAA;GACrDP,aAAaO,SAAQC,KAAM;EAAC,CAC7B;EAAC,aACK;GACLH,aAAYI,YAAa;EAAC;CAC3B,GACAL,KAAA;EAACJ;EAAcC;EAASV;CAAc,GAACG,EAAA,KAAAO,SAAAP,EAAA,KAAAH,gBAAAG,EAAA,KAAAS,IAAAT,EAAA,KAAAU,OAAAD,KAAAT,EAAA,IAAAU,KAAAV,EAAA,KAP1Cd,UAAUuB,IAOPC,EAAuC;CAAC,IAAAM;CAAA,AAAAhB,EAAA,OAAAK,aAAAL,EAAA,OAAAQ,cAOpCQ,KAAAX,WAASY,KAAMC,UAAAC,UAAA;EACd,IAAI,CAACD,SAAQE,SAAW,CAACF,SAAQG,mBAAT,CAA8BH,SAAQI,cAAc,OACnE;EAET,IAAAC,YAAkBL,SAAQK,aAAcL,SAAQG,iBAA2BE,aAAzD,CAA8D,GAChFC,WAAiBN,SAAQO,UACzB,EAAAJ,iBAAAK,OAA+BR,UAAxBG,kBAAAK,OAAAC,KAAAA,IAAA,CAAmB,IAAnBD,IACPE,QACGP,gBAAe5B,OACZD,UAAU6B,gBAAe5B,MAAO4B,gBAAeQ,KAC3B,IAApBX,SAAQI,iBAAkBJ,SAAQI;EAAa,OAGnD,oBAAC,MAAD;GACK,IAAA;GAEW,cAAAH,QAAQd,WAAS0B,SAAW,IAA5B,IAAA;GACD,aAAAZ,UAAU,IAAV,IAAA;GACP,OAAA;GACC,OAAA;IAAAa,UAAW;IAAGC,OAAS;GAAK;aAEnC,oBAAC,UAAD;IACS,OAAAf,SAAQE;IACT,MAAAQ,QAAA;IACS,eAAAL,UAASW;IACLV,mBAAAA;IACL,cAAAN,SAAQiB;IAEpB,WAAAjB,SAAQkB,SAAU5B,WAAU6B,MAAOnB,SAAQkB,MAAO,CAAC,CAAAE,OAAQ,GAAG,CAAC,CAAAC,IAAiB,IAAhFZ,KAAAA;GAAiF,CAAA;EAflF,GAEET,SAAQY,GAFV;CAkBE,CAEV,GAAC9B,EAAA,KAAAK,WAAAL,EAAA,KAAAQ,YAAAR,EAAA,KAAAgB,MAAAA,KAAAhB,EAAA;CAAA,IAAA0B;CAEqB,OAFrB1B,EAAA,OAAAgB,KAEqBU,KAAA1B,EAAA,MArC3B0B,KAAA,oBAAC,0BAAD;EAAkCN,QAHtB;YAIV,oBAAC,MAAD;GAAS,IAAA;GAAc,UAAA;GAAa,OAAA;GAAoB,UAAA;aACrDJ;EADE,CAAA;CADkB,CAAA,GAqCEhB,EAAA,KAAAgB,IAAAhB,EAAA,KAAA0B,KArC3BA;AAqC2B;ACxE/B,SAAgBiB,sBAAsBC,QAAmD;CACvF,OAAO;EACLE,MAAM;EACNC,WAAWL;EACXG,QAAQD,QAAQC,UAAU,EAACG,OAAO,OAAM;CAC1C;AACF;ACPA,SAAOE,gBAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAyB,EAAAC,aAAAH,IAAuCI;CAAA,AAAAH,EAAA,OAAAI,OAAAC,IAAA,2BAAA,KAEXF,KAAA;EAAAG,QAAS;EAAMC,WAAa;CAAM,GAACP,EAAA,KAAAG,MAAAA,KAAAH,EAAA;CAAA,IAAAQ;CAE/E,OAF+ER,EAAA,OAAAE,WAE/EM,KAAAR,EAAA,MAFZQ,KAAA,oBAAC,WAAD;EAAkB,OAAA;EAAY,SAAA;EAAU,QAAA;EAAgB,OAAAL;EACrDD;CADO,CAAA,GAEEF,EAAA,KAAAE,UAAAF,EAAA,KAAAQ,KAFZA;AAEY;ACChB,MAAMY,QAAQ;CACZC,QAAQ,GAAGC,SAAiCP,GAAG,sBACvB,EAACS,YAAWX,YAAYW,KAAK,CAAC,CAACJ,MAAM,GAAE,MACzDL,IAAI,GAAGO,IAAI,EAAC;CAGlBG,SAAS,GAAGH,SAAiCP,GAAG,sBACxB,EAACS,YAAWX,YAAYW,KAAK,CAAC,CAACJ,MAAM,GAAE,MACzDL,IAAI,GAAGO,IAAI,EAAC;AAGpB,GAEMI,OAAOZ,OAAOH,IAAI,CAAC,CAAA,WAAA;;;oHAQnBS,MAAMC,KAAK;;MAEZ,+BAICD,MAAMC,KAAK;;MAEZ,GAECD,MAAMK,MAAM;;MAEb,8BAICL,MAAMC,KAAK;;MAEZ,iCAICD,MAAMC,KAAK;;MAEZ,gCAICD,MAAMC,KAAK;;MAEZ,GAECD,MAAMK,MAAM;;MAEb,+BAICL,MAAMK,MAAM;;MAEb,IAQCK,aAAgC,CAAA,GAChCC,YAA0B,CAAC;AAEjC,SAAOC,YAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACL,EAAAP,QAAAQ,OAEIH,OADM,EAAAI,QAAAC,IAAAC,SAAAC,OAAAJ,IAACC,SAAAC,OAAAG,KAAAA,IAAAV,YAAAO,IAAoBC,UAAAC,OAAAC,KAAAA,IAAAX,aAAAU,IAKfE,KAAAL,OAAMM,SAAN,QACCC,KAAAP,OAAMQ,UAAN,QAAuBC;CAAA,AAAAZ,EAAA,OAAAK,QAAAQ,SAOnCD,KAAAZ,EAAA,MAJAY,KAAAP,QAAOQ,SAAP,OACC,oBAAC,MAAD;EAAe,SAAA;EAAW,QAAA;EAAQ,MAAA;YAChC,oBAAC,MAAD;GAAY,OAAA;aAAS;EAAhB,CAAA;CADF,CAAA,GAGNb,EAAA,KAAAK,QAAAQ,QAAAb,EAAA,KAAAY;CAAA,IAAAE;CAAA,AAAAd,EAAA,OAAAK,UAYCS,KAAAd,EAAA,MAXDc,KAAAT,QAAOU,IAAKC,KAWZ,GAAChB,EAAA,KAAAK,SAAAL,EAAA,KAAAc;CAAA,IAAAG;CACG,OADHjB,EAAA,OAAAQ,MAAAR,EAAA,OAAAU,MAAAV,EAAA,OAAAY,MAAAZ,EAAA,OAAAc,MAtBJG,KAAA,qBAAC,MAAD;EACW,UAAA;EACG,cAAAT;EACC,eAAAE;EACR,KAAA;YAJP,CAMGE,IAKAE,EAXE;KAuBEd,EAAA,KAAAQ,IAAAR,EAAA,KAAAU,IAAAV,EAAA,KAAAY,IAAAZ,EAAA,KAAAc,IAAAd,EAAA,KAAAiB,MAAAA,KAAAjB,EAAA,IAvBPiB;AAuBO;AA5BJ,SAAAD,MAAAE,cAAAC,OAAA;CAwBE,OAPGD,aAAYE,SAAU,yBAEjB,oBAAC,aAAD,EAAiCF,QAAAA,aAAY,GAA3BC,KAA2B,IAElDD,aAAYG,YAEP,oBAAC,iBAAD,EAA2B,GAAMH,aAAY,GAAvBC,KAAuB,IAG/C,qBAAC,KAAD,EAAA,UAAA,CAAkBD,aAAYI,MAAM,8BAAhC,EAAA,GAAMH,KAAN;AAAkE;ACpGrF,SAAOQ,UAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAmB,EAAAC,WAAAH;CACxB,IAAI,CAACG,QAAM,OACF;CACR,IAAAC;CAAA,AAAAH,EAAA,OAAAE,SAMqBC,KAAAH,EAAA,MAFlBG,KAAA,oBAAC,iBAAD,EAAA,UACE,oBAAC,aAAD,EAAqBD,OAAM,CAAA,EADb,CAAA,GAEEF,EAAA,KAAAE,QAAAF,EAAA,KAAAG;CAAA,IAAAC;CACQ,OADRJ,EAAA,OAAAE,UAAAF,EAAA,OAAAG,MAHpBC,KAAA,oBAAA,iBAAA,UAAA;EAAkCF,OAAAA;YAChCC;CAGF,CAAA,GAA4BH,EAAA,KAAAE,QAAAF,EAAA,KAAAG,IAAAH,EAAA,KAAAI,MAAAA,KAAAJ,EAAA,IAJ5BI;AAI4B;ACThC,MAAMQ,cAA6B;CACjCC,QAAQ;CACRC,aAAa;AACf,GAEMC,sBAAgB;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAAC;CAad,OAbcF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KACpBF,KAAA,qBAAA,OAAA;EACE,oBAAA;EACQ,SAAA;EACH,MAAA;EACC,OAAA;EACc,qBAAA;EACd,OAAA;EACC,QAAA;YAPT;GASE,oBAAA,QAAA;IAAQ,GAAA;IAAuCN,OAAAA;GAAW,CAAA;GAC1D,oBAAA,QAAA;IAAQ,GAAA;IAAwBA,OAAAA;GAAW,CAAA;GAC3C,oBAAA,QAAA;IAAQ,GAAA;IAAuCA,OAAAA;GAAW,CAAA;EACtD;KAAAI,EAAA,KAAAE,MAAAA,KAAAF,EAAA,IAZNE;AAYM,GAwBKS,gBAAgBpB,cAAqCqB,SAAS,CAAC,MAAM;CAChF,IAAMC,eAAgC;EACpCC,QAAQF,OAAOF,iBAAiB,CAAC;EACjCD,SAASG,OAAOH,WAAW,CAAA;CAC7B;CAMA,OAAO;EACLF,MAAM;EACNQ,OAAO,CACL;GACET,OARQM,OAAON,SAAS;GASxBC,MAROK,OAAOL,QAAQ;GAStBC,MAROI,OAAOJ,QAAQT;GAStBiB,iBAAiB,oBAAC,WAAD,EAAW,QAAQH,aAAa,CAAA;EACnD,CAAC;CAEL;AACF,CAAC"}
\ No newline at end of file
+{"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","Code","Button","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","uri","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","uri","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","uri","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, Code, Button} from '@sanity/ui'\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[]>({uri: '/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          uri: `/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        uri: `/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 uri = templateRepoId\n          ? `/addons/dashboard?templateRepoId=${templateRepoId}`\n          : '/addons/dashboard'\n        return versionedClient.observable.request<{items: FeedItem[]}>({\n          uri,\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
Index: package/README.md
===================================================================
--- package/README.md
+++ package/README.md
@@ -71,11 +71,9 @@
 dashboardTool({
   name: 'stats',
   title: 'Statistics',
   icon: ActivityIcon,
-  widgets: [
-    /* ... */
-  ],
+  widgets: [/* ... */],
 })
 ```
 
 ## How to install a widget