sanity-plugin-workspace-home

3.0.203.0.21
~

Modified (3 files)

Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -12,9 +12,9 @@
 	if (isValidElementType(Icon)) return /* @__PURE__ */ jsx(Icon, {});
 	if (isValidElement(Icon)) return Icon;
 }, MediaCard = styled(Card).withConfig({
 	displayName: "MediaCard",
-	componentId: "sc-1dgrtp-0"
+	componentId: "sc-xyqtw-0"
 })`width:35px;height:35px;svg{width:100%;height:100%;}`;
 function WorkspacePreview(props) {
 	let $ = c(39), { workspace, index, query } = props, { icon, title, name, subtitle, dataset } = workspace, { setActiveWorkspace } = useActiveWorkspace(), t0;
 	$[0] === icon ? t0 = $[1] : (t0 = createIcon(icon), $[0] = icon, $[1] = t0);
@@ -143,24 +143,21 @@
 	}), $[36] = t1, $[37] = t18, $[38] = t19) : t19 = $[38], t19;
 }
 const TallCard = styled(Card).withConfig({
 	displayName: "TallCard",
-	componentId: "sc-5cpcf-0"
+	componentId: "sc-1iob-0"
 })`min-height:100%;`;
 function WorkspaceHome() {
-	let $ = c(29), t0 = useWorkspaces(), workspaces;
+	let $ = c(23), t0 = useWorkspaces(), workspaces;
 	$[0] === t0 ? workspaces = $[1] : ([, ...workspaces] = t0, $[0] = t0, $[1] = workspaces);
 	let { setActiveWorkspace } = useActiveWorkspace(), [query, setQuery] = useState(""), searchInput = useRef(null), t1;
 	$[2] === Symbol.for("react.memo_cache_sentinel") ? (t1 = (e) => {
 		setQuery(e.target.value);
 	}, $[2] = t1) : t1 = $[2];
 	let handleQuery = t1, t2;
-	if ($[3] !== query || $[4] !== workspaces) {
-		let t3;
-		$[6] === query ? t3 = $[7] : (t3 = (workspace) => workspace.name.toLowerCase().includes(query.toLowerCase()) || workspace.dataset.toLowerCase().includes(query.toLowerCase()) || workspace.title.toLowerCase().includes(query.toLowerCase()), $[6] = query, $[7] = t3), t2 = workspaces.filter(t3), $[3] = query, $[4] = workspaces, $[5] = t2;
-	} else t2 = $[5];
+	$[3] !== query || $[4] !== workspaces ? (t2 = workspaces.filter((workspace) => workspace.name.toLowerCase().includes(query.toLowerCase()) || workspace.dataset.toLowerCase().includes(query.toLowerCase()) || workspace.title.toLowerCase().includes(query.toLowerCase())), $[3] = query, $[4] = workspaces, $[5] = t2) : t2 = $[5];
 	let filteredWorkspaces = t2, t3, t4;
-	$[8] !== query || $[9] !== setActiveWorkspace || $[10] !== workspaces ? (t3 = () => {
+	$[6] !== query || $[7] !== setActiveWorkspace || $[8] !== workspaces ? (t3 = () => {
 		let handleKeypress = (event) => {
 			if (query || searchInput.current === document.activeElement) return;
 			let index = parseInt(event.key, 10) - 1;
 			index >= 0 && index < workspaces.length && setActiveWorkspace(workspaces[index].name);
@@ -171,53 +168,48 @@
 	}, t4 = [
 		query,
 		workspaces,
 		setActiveWorkspace
-	], $[8] = query, $[9] = setActiveWorkspace, $[10] = workspaces, $[11] = t3, $[12] = t4) : (t3 = $[11], t4 = $[12]), useEffect(t3, t4);
+	], $[6] = query, $[7] = setActiveWorkspace, $[8] = workspaces, $[9] = t3, $[10] = t4) : (t3 = $[9], t4 = $[10]), useEffect(t3, t4);
 	let t5;
-	$[13] === Symbol.for("react.memo_cache_sentinel") ? (t5 = [
+	$[11] === Symbol.for("react.memo_cache_sentinel") ? (t5 = [
 		4,
 		5,
 		6,
 		6
-	], $[13] = t5) : t5 = $[13];
+	], $[11] = t5) : t5 = $[11];
 	let t6;
-	$[14] === Symbol.for("react.memo_cache_sentinel") ? (t6 = /* @__PURE__ */ jsx(Heading, { children: "Workspaces" }), $[14] = t6) : t6 = $[14];
+	$[12] === Symbol.for("react.memo_cache_sentinel") ? (t6 = /* @__PURE__ */ jsx(Heading, { children: "Workspaces" }), $[12] = t6) : t6 = $[12];
 	let t7;
-	$[15] === Symbol.for("react.memo_cache_sentinel") ? (t7 = [
+	$[13] === Symbol.for("react.memo_cache_sentinel") ? (t7 = [
 		2,
 		3,
 		4,
 		4
-	], $[15] = t7) : t7 = $[15];
+	], $[13] = t7) : t7 = $[13];
 	let t8;
-	$[16] === Symbol.for("react.memo_cache_sentinel") ? (t8 = /* @__PURE__ */ jsx(Text, {
+	$[14] === Symbol.for("react.memo_cache_sentinel") ? (t8 = /* @__PURE__ */ jsx(Text, {
 		size: 1,
 		weight: "semibold",
 		children: "Search"
-	}), $[16] = t8) : t8 = $[16];
+	}), $[14] = t8) : t8 = $[14];
 	let t9;
-	$[17] === query ? t9 = $[18] : (t9 = /* @__PURE__ */ jsxs(Stack, {
+	$[15] === query ? t9 = $[16] : (t9 = /* @__PURE__ */ jsxs(Stack, {
 		gap: 2,
 		children: [t8, /* @__PURE__ */ jsx(TextInput, {
 			ref: searchInput,
 			value: query,
 			onChange: handleQuery
 		})]
-	}), $[17] = query, $[18] = t9);
+	}), $[15] = query, $[16] = t9);
 	let t10;
-	if ($[19] !== filteredWorkspaces || $[20] !== query) {
-		let t11;
-		$[22] === query ? t11 = $[23] : (t11 = (workspace_0, index_0) => /* @__PURE__ */ jsx(WorkspacePreview, {
-			workspace: workspace_0,
-			index: index_0,
-			query
-		}, workspace_0.name), $[22] = query, $[23] = t11), t10 = filteredWorkspaces.map(t11), $[19] = filteredWorkspaces, $[20] = query, $[21] = t10;
-	} else t10 = $[21];
+	$[17] !== filteredWorkspaces || $[18] !== query ? (t10 = /* @__PURE__ */ jsx(Box, { children: filteredWorkspaces.map((workspace_0, index_0) => /* @__PURE__ */ jsx(WorkspacePreview, {
+		workspace: workspace_0,
+		index: index_0,
+		query
+	}, workspace_0.name)) }), $[17] = filteredWorkspaces, $[18] = query, $[19] = t10) : t10 = $[19];
 	let t11;
-	$[24] === t10 ? t11 = $[25] : (t11 = /* @__PURE__ */ jsx(Box, { children: t10 }), $[24] = t10, $[25] = t11);
-	let t12;
-	return $[26] !== t11 || $[27] !== t9 ? (t12 = /* @__PURE__ */ jsx(TallCard, {
+	return $[20] !== t10 || $[21] !== t9 ? (t11 = /* @__PURE__ */ jsx(TallCard, {
 		tone: "transparent",
 		children: /* @__PURE__ */ jsx(Flex, {
 			direction: "column",
 			padding: t5,
@@ -228,14 +220,14 @@
 					radius: 3,
 					shadow: 2,
 					children: /* @__PURE__ */ jsxs(Stack, {
 						gap: 3,
-						children: [t9, t11]
+						children: [t9, t10]
 					})
 				})]
 			}) })
 		})
-	}), $[26] = t11, $[27] = t9, $[28] = t12) : t12 = $[28], t12;
+	}), $[20] = t10, $[21] = t9, $[22] = t11) : t11 = $[22], t11;
 }
 const workspaceHome = definePlugin(() => ({
 	name: "sanity-plugin-workspace-home",
 	tools: [{
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "sanity-plugin-workspace-home",
-  "version": "3.0.20",
+  "version": "3.0.21",
   "description": "A home screen for your multi-workspace Sanity Studio",
   "keywords": [
     "sanity",
     "sanity-plugin"
@@ -36,9 +36,9 @@
     "@sanity/tsdown-config": "^0.26.0",
     "@types/node": "^24.13.3",
     "@types/react": "^19.2.18",
     "@types/react-is": "^19.2.0",
-    "babel-plugin-react-compiler": "^1.0.0",
+    "oxc-transform-react": "^0.145.0",
     "react": "^19.2.8",
     "sanity": "^6.10.1",
     "styled-components": "^6.5.3",
     "tsdown": "^0.22.14"
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":["DatabaseIcon","Box","Button","Card","Flex","Grid","Hotkeys","Stack","Text","isValidElement","useMemo","isValidElementType","useActiveWorkspace","WorkspaceSummary","styled","createIcon","Icon","React","ComponentType","ReactNode","undefined","MediaCard","WorkspacePreviewProps","workspace","index","query","WorkspacePreview","props","$","_c","icon","title","name","subtitle","dataset","setActiveWorkspace","t0","iconComponent","hotKeyIndex","t1","Boolean","t2","Symbol","for","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","String","t17","t18","t19","Box","Card","Container","Flex","Heading","Stack","Text","TextInput","useCallback","useEffect","useMemo","useRef","useState","useActiveWorkspace","useWorkspaces","styled","WorkspacePreview","TallCard","WorkspaceHome","$","_c","t0","workspaces","setActiveWorkspace","query","setQuery","searchInput","t1","Symbol","for","e","target","value","handleQuery","t2","t3","workspace","name","toLowerCase","includes","dataset","title","filter","filteredWorkspaces","t4","handleKeypress","event","current","document","activeElement","index","parseInt","key","length","window","addEventListener","removeEventListener","t5","t6","t7","t8","t9","t10","t11","workspace_0","index_0","map","t12","HomeIcon","definePlugin","Plugin","WorkspaceOptions","WorkspaceHome","workspaceHome","name","tools","title","icon","component","WorkspaceHomeConfigProps","projectId","dataset","workspaceHomeConfig","basePath","plugins"],"sources":["../src/components/WorkspacePreview.tsx","../src/components/WorkspaceHome.tsx","../src/index.ts"],"sourcesContent":["import {DatabaseIcon} from '@sanity/icons/Database'\nimport {Box, Button, Card, Flex, Grid, Hotkeys, Stack, Text} from '@sanity/ui'\nimport {isValidElement, useMemo} from 'react'\nimport {isValidElementType} from 'react-is'\nimport {useActiveWorkspace, type WorkspaceSummary} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst createIcon = (Icon: React.ComponentType | React.ReactNode) => {\n  if (isValidElementType(Icon)) return <Icon />\n  if (isValidElement(Icon)) return Icon\n  return undefined\n}\n\nconst MediaCard = styled(Card)`\n  width: 35px;\n  height: 35px;\n\n  svg {\n    width: 100%;\n    height: 100%;\n  }\n`\n\nexport type WorkspacePreviewProps = {\n  workspace: WorkspaceSummary\n  index: number\n  query: string\n}\n\nexport default function WorkspacePreview(props: WorkspacePreviewProps): React.JSX.Element {\n  const {workspace, index, query} = props\n  const {icon, title, name, subtitle, dataset} = workspace\n\n  const {setActiveWorkspace} = useActiveWorkspace()\n  const iconComponent = useMemo(() => createIcon(icon), [icon])\n\n  // TODO: Favorites feature\n  // get favorite workspace name from localStorage\n  //   const favoriteWorkspace = localStorage.getItem('favoriteWorkspace')\n  //   save local state to force re-render\n  //   const [isFavourite, setIsFavourite] = React.useState(favoriteWorkspace === name)\n\n  // set favorite workspace name to localStorage\n  //   const setFavoriteWorkspace = useCallback(() => {\n  //     localStorage.setItem('favoriteWorkspace', name)\n  //   }, [name])\n\n  const hotKeyIndex = index + 1 === 10 ? 0 : index + 1\n\n  return (\n    <Card borderTop={Boolean(index)} tone=\"default\">\n      <Grid gridTemplateColumns={5} gap={[2, 3, 4, 4]} paddingY={1}>\n        <Card gridColumnStart={1} gridColumnEnd={4}>\n          <Stack>\n            <Button mode=\"bleed\" tone=\"default\" onClick={() => setActiveWorkspace(name)}>\n              <Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>\n            </Button>\n          </Stack>\n        </Card>\n        <Card gridColumnStart={4} gridColumnEnd={5}>\n          <Flex height=\"fill\" align=\"center\" gap={2}>\n            <Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>\n            <Text size={1} weight=\"semibold\" textOverflow=\"ellipsis\">\n              {dataset}\n            </Text>\n          </Flex>\n        </Card>\n        <Card paddingRight={[2, 3, 3, 3]}>\n          <Flex height=\"fill\" align=\"center\" justify=\"flex-end\">\n            {!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null}\n          </Flex>\n        </Card>\n        {/* <Button\n          mode={isFavourite ? 'default' : 'bleed'}\n          tone={isFavourite ? 'primary' : 'default'}\n          icon={StarIcon}\n          title=\"Favorite\"\n          onClick={() => {\n            setIsFavourite(!isFavourite)\n            setFavoriteWorkspace()\n          }}\n        /> */}\n      </Grid>\n    </Card>\n  )\n}\n","import {Box, Card, Container, Flex, Heading, Stack, Text, TextInput} from '@sanity/ui'\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {useActiveWorkspace, useWorkspaces} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport WorkspacePreview from './WorkspacePreview'\n\nconst TallCard = styled(Card)`\n  min-height: 100%;\n`\n\nexport default function WorkspaceHome(): React.JSX.Element {\n  const [, ...workspaces] = useWorkspaces()\n  const {setActiveWorkspace} = useActiveWorkspace()\n\n  // Handle search query\n  const [query, setQuery] = useState('')\n  const searchInput = useRef(null)\n  const handleQuery = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      setQuery(e.target.value)\n    },\n    [setQuery],\n  )\n\n  // filter workspaces if name, dataset or title matches query\n  const filteredWorkspaces = useMemo(() => {\n    return workspaces.filter((workspace) => {\n      return (\n        workspace.name.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.dataset.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.title.toLowerCase().includes(query.toLowerCase())\n      )\n    })\n  }, [workspaces, query])\n\n  // Listen to keypress of workspace index\n  useEffect(() => {\n    const handleKeypress = (event: KeyboardEvent) => {\n      // Ignore if search query exists or search input is focused\n      if (query || searchInput.current === document.activeElement) {\n        return\n      }\n\n      const index = parseInt(event.key, 10) - 1\n      if (index >= 0 && index < workspaces.length) {\n        setActiveWorkspace(workspaces[index]!.name)\n      }\n    }\n\n    window.addEventListener('keypress', handleKeypress)\n\n    return () => {\n      window.removeEventListener('keypress', handleKeypress)\n    }\n  }, [query, workspaces, setActiveWorkspace])\n\n  return (\n    <TallCard tone=\"transparent\">\n      <Flex direction=\"column\" padding={[4, 5, 6, 6]}>\n        <Container>\n          <Stack gap={4}>\n            <Heading>Workspaces</Heading>\n            <Card padding={[2, 3, 4, 4]} radius={3} shadow={2}>\n              <Stack gap={3}>\n                <Stack gap={2}>\n                  <Text size={1} weight=\"semibold\">\n                    Search\n                  </Text>\n                  <TextInput ref={searchInput} value={query} onChange={handleQuery} />\n                </Stack>\n                <Box>\n                  {filteredWorkspaces.map((workspace, index) => (\n                    <WorkspacePreview\n                      key={workspace.name}\n                      workspace={workspace}\n                      index={index}\n                      query={query}\n                    />\n                  ))}\n                </Box>\n              </Stack>\n            </Card>\n          </Stack>\n        </Container>\n      </Flex>\n    </TallCard>\n  )\n}\n","import '@sanity/ui/styles.css'\nimport {HomeIcon} from '@sanity/icons/Home'\nimport {definePlugin, type Plugin, type WorkspaceOptions} from 'sanity'\n\nimport WorkspaceHome from './components/WorkspaceHome'\n\nexport const workspaceHome: Plugin = definePlugin(() => {\n  return {\n    name: 'sanity-plugin-workspace-home',\n    tools: [\n      {\n        title: 'Workspace Home',\n        name: 'workspace-home',\n        icon: HomeIcon,\n        component: WorkspaceHome,\n      },\n    ],\n  }\n})\n\ntype WorkspaceHomeConfigProps = {\n  projectId: string\n  dataset: string\n}\n\nexport const workspaceHomeConfig = ({\n  projectId,\n  dataset,\n}: WorkspaceHomeConfigProps): WorkspaceOptions => ({\n  name: 'home',\n  title: 'Home',\n  basePath: '/home',\n  projectId,\n  dataset,\n  icon: HomeIcon,\n  plugins: [workspaceHome()],\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["createIcon(icon)","useMemo(() => createIcon(icon), [icon])","[2, 3, 4, 4]","() => setActiveWorkspace(name)","iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null","[1, 2, 3, 3]","<Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>","title || name","subtitle ? <Text muted>{subtitle}</Text> : null","<Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>","<Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>","<Card gridColumnStart={1} gridColumnEnd={4}>\n          <Stack>\n            <Button mode=\"bleed\" tone=\"default\" onClick={() => setActiveWorkspace(name)}>\n              <Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>\n            </Button>\n          </Stack>\n        </Card>","<Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>","<Card gridColumnStart={4} gridColumnEnd={5}>\n          <Flex height=\"fill\" align=\"center\" gap={2}>\n            <Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>\n            <Text size={1} weight=\"semibold\" textOverflow=\"ellipsis\">\n              {dataset}\n            </Text>\n          </Flex>\n        </Card>","[2, 3, 3, 3]","!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null","<Card paddingRight={[2, 3, 3, 3]}>\n          <Flex height=\"fill\" align=\"center\" justify=\"flex-end\">\n            {!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null}\n          </Flex>\n        </Card>","<Grid gridTemplateColumns={5} gap={[2, 3, 4, 4]} paddingY={1}>\n        <Card gridColumnStart={1} gridColumnEnd={4}>\n          <Stack>\n            <Button mode=\"bleed\" tone=\"default\" onClick={() => setActiveWorkspace(name)}>\n              <Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>\n            </Button>\n          </Stack>\n        </Card>\n        <Card gridColumnStart={4} gridColumnEnd={5}>\n          <Flex height=\"fill\" align=\"center\" gap={2}>\n            <Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>\n            <Text size={1} weight=\"semibold\" textOverflow=\"ellipsis\">\n              {dataset}\n            </Text>\n          </Flex>\n        </Card>\n        <Card paddingRight={[2, 3, 3, 3]}>\n          <Flex height=\"fill\" align=\"center\" justify=\"flex-end\">\n            {!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null}\n          </Flex>\n        </Card>\n        {/* <Button\n          mode={isFavourite ? 'default' : 'bleed'}\n          tone={isFavourite ? 'primary' : 'default'}\n          icon={StarIcon}\n          title=\"Favorite\"\n          onClick={() => {\n            setIsFavourite(!isFavourite)\n            setFavoriteWorkspace()\n          }}\n        /> */}\n      </Grid>","<Card borderTop={Boolean(index)} tone=\"default\">\n      <Grid gridTemplateColumns={5} gap={[2, 3, 4, 4]} paddingY={1}>\n        <Card gridColumnStart={1} gridColumnEnd={4}>\n          <Stack>\n            <Button mode=\"bleed\" tone=\"default\" onClick={() => setActiveWorkspace(name)}>\n              <Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>\n            </Button>\n          </Stack>\n        </Card>\n        <Card gridColumnStart={4} gridColumnEnd={5}>\n          <Flex height=\"fill\" align=\"center\" gap={2}>\n            <Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>\n            <Text size={1} weight=\"semibold\" textOverflow=\"ellipsis\">\n              {dataset}\n            </Text>\n          </Flex>\n        </Card>\n        <Card paddingRight={[2, 3, 3, 3]}>\n          <Flex height=\"fill\" align=\"center\" justify=\"flex-end\">\n            {!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null}\n          </Flex>\n        </Card>\n        {/* <Button\n          mode={isFavourite ? 'default' : 'bleed'}\n          tone={isFavourite ? 'primary' : 'default'}\n          icon={StarIcon}\n          title=\"Favorite\"\n          onClick={() => {\n            setIsFavourite(!isFavourite)\n            setFavoriteWorkspace()\n          }}\n        /> */}\n      </Grid>\n    </Card>","Boolean(index)","useWorkspaces()","(e: React.ChangeEvent<HTMLInputElement>) => {\n      setQuery(e.target.value)\n    }","useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      setQuery(e.target.value)\n    },\n    [setQuery],\n  )","workspaces.filter((workspace) => {\n      return (\n        workspace.name.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.dataset.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.title.toLowerCase().includes(query.toLowerCase())\n      )\n    })","useMemo(() => {\n    return workspaces.filter((workspace) => {\n      return (\n        workspace.name.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.dataset.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.title.toLowerCase().includes(query.toLowerCase())\n      )\n    })\n  }, [workspaces, query])","() => {\n    const handleKeypress = (event: KeyboardEvent) => {\n      // Ignore if search query exists or search input is focused\n      if (query || searchInput.current === document.activeElement) {\n        return\n      }\n\n      const index = parseInt(event.key, 10) - 1\n      if (index >= 0 && index < workspaces.length) {\n        setActiveWorkspace(workspaces[index]!.name)\n      }\n    }\n\n    window.addEventListener('keypress', handleKeypress)\n\n    return () => {\n      window.removeEventListener('keypress', handleKeypress)\n    }\n  }","[query, workspaces, setActiveWorkspace]","workspaces.length","[4, 5, 6, 6]","<Heading>Workspaces</Heading>","[2, 3, 4, 4]","<Text size={1} weight=\"semibold\">\n                    Search\n                  </Text>","<Stack gap={2}>\n                  <Text size={1} weight=\"semibold\">\n                    Search\n                  </Text>\n                  <TextInput ref={searchInput} value={query} onChange={handleQuery} />\n                </Stack>","<Box>\n                  {filteredWorkspaces.map((workspace, index) => (\n                    <WorkspacePreview\n                      key={workspace.name}\n                      workspace={workspace}\n                      index={index}\n                      query={query}\n                    />\n                  ))}\n                </Box>","workspace","index","<TallCard tone=\"transparent\">\n      <Flex direction=\"column\" padding={[4, 5, 6, 6]}>\n        <Container>\n          <Stack gap={4}>\n            <Heading>Workspaces</Heading>\n            <Card padding={[2, 3, 4, 4]} radius={3} shadow={2}>\n              <Stack gap={3}>\n                <Stack gap={2}>\n                  <Text size={1} weight=\"semibold\">\n                    Search\n                  </Text>\n                  <TextInput ref={searchInput} value={query} onChange={handleQuery} />\n                </Stack>\n                <Box>\n                  {filteredWorkspaces.map((workspace, index) => (\n                    <WorkspacePreview\n                      key={workspace.name}\n                      workspace={workspace}\n                      index={index}\n                      query={query}\n                    />\n                  ))}\n                </Box>\n              </Stack>\n            </Card>\n          </Stack>\n        </Container>\n      </Flex>\n    </TallCard>"],"sources":["../src/components/WorkspacePreview.tsx","../src/components/WorkspaceHome.tsx","../src/index.ts"],"sourcesContent":["import {DatabaseIcon} from '@sanity/icons/Database'\nimport {Box, Button, Card, Flex, Grid, Hotkeys, Stack, Text} from '@sanity/ui'\nimport {isValidElement, useMemo} from 'react'\nimport {isValidElementType} from 'react-is'\nimport {useActiveWorkspace, type WorkspaceSummary} from 'sanity'\nimport {styled} from 'styled-components'\n\nconst createIcon = (Icon: React.ComponentType | React.ReactNode) => {\n  if (isValidElementType(Icon)) return <Icon />\n  if (isValidElement(Icon)) return Icon\n  return undefined\n}\n\nconst MediaCard = styled(Card)`\n  width: 35px;\n  height: 35px;\n\n  svg {\n    width: 100%;\n    height: 100%;\n  }\n`\n\nexport type WorkspacePreviewProps = {\n  workspace: WorkspaceSummary\n  index: number\n  query: string\n}\n\nexport default function WorkspacePreview(props: WorkspacePreviewProps): React.JSX.Element {\n  const {workspace, index, query} = props\n  const {icon, title, name, subtitle, dataset} = workspace\n\n  const {setActiveWorkspace} = useActiveWorkspace()\n  const iconComponent = useMemo(() => createIcon(icon), [icon])\n\n  // TODO: Favorites feature\n  // get favorite workspace name from localStorage\n  //   const favoriteWorkspace = localStorage.getItem('favoriteWorkspace')\n  //   save local state to force re-render\n  //   const [isFavourite, setIsFavourite] = React.useState(favoriteWorkspace === name)\n\n  // set favorite workspace name to localStorage\n  //   const setFavoriteWorkspace = useCallback(() => {\n  //     localStorage.setItem('favoriteWorkspace', name)\n  //   }, [name])\n\n  const hotKeyIndex = index + 1 === 10 ? 0 : index + 1\n\n  return (\n    <Card borderTop={Boolean(index)} tone=\"default\">\n      <Grid gridTemplateColumns={5} gap={[2, 3, 4, 4]} paddingY={1}>\n        <Card gridColumnStart={1} gridColumnEnd={4}>\n          <Stack>\n            <Button mode=\"bleed\" tone=\"default\" onClick={() => setActiveWorkspace(name)}>\n              <Flex align=\"center\" gap={[2, 3, 4, 4]}>\n                {iconComponent ? <MediaCard>{createIcon(iconComponent)}</MediaCard> : null}\n                <Box flex={1}>\n                  <Stack gap={[1, 2, 3, 3]}>\n                    <Text size={3} weight=\"semibold\" textOverflow=\"ellipsis\">\n                      {title || name}\n                    </Text>\n                    {subtitle ? <Text muted>{subtitle}</Text> : null}\n                  </Stack>\n                </Box>\n              </Flex>\n            </Button>\n          </Stack>\n        </Card>\n        <Card gridColumnStart={4} gridColumnEnd={5}>\n          <Flex height=\"fill\" align=\"center\" gap={2}>\n            <Text size={1} weight=\"semibold\">\n              <DatabaseIcon />\n            </Text>\n            <Text size={1} weight=\"semibold\" textOverflow=\"ellipsis\">\n              {dataset}\n            </Text>\n          </Flex>\n        </Card>\n        <Card paddingRight={[2, 3, 3, 3]}>\n          <Flex height=\"fill\" align=\"center\" justify=\"flex-end\">\n            {!query && hotKeyIndex < 10 ? (\n              <Hotkeys keys={[String(hotKeyIndex)]} padding={2} />\n            ) : null}\n          </Flex>\n        </Card>\n        {/* <Button\n          mode={isFavourite ? 'default' : 'bleed'}\n          tone={isFavourite ? 'primary' : 'default'}\n          icon={StarIcon}\n          title=\"Favorite\"\n          onClick={() => {\n            setIsFavourite(!isFavourite)\n            setFavoriteWorkspace()\n          }}\n        /> */}\n      </Grid>\n    </Card>\n  )\n}\n","import {Box, Card, Container, Flex, Heading, Stack, Text, TextInput} from '@sanity/ui'\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {useActiveWorkspace, useWorkspaces} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport WorkspacePreview from './WorkspacePreview'\n\nconst TallCard = styled(Card)`\n  min-height: 100%;\n`\n\nexport default function WorkspaceHome(): React.JSX.Element {\n  const [, ...workspaces] = useWorkspaces()\n  const {setActiveWorkspace} = useActiveWorkspace()\n\n  // Handle search query\n  const [query, setQuery] = useState('')\n  const searchInput = useRef(null)\n  const handleQuery = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      setQuery(e.target.value)\n    },\n    [setQuery],\n  )\n\n  // filter workspaces if name, dataset or title matches query\n  const filteredWorkspaces = useMemo(() => {\n    return workspaces.filter((workspace) => {\n      return (\n        workspace.name.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.dataset.toLowerCase().includes(query.toLowerCase()) ||\n        workspace.title.toLowerCase().includes(query.toLowerCase())\n      )\n    })\n  }, [workspaces, query])\n\n  // Listen to keypress of workspace index\n  useEffect(() => {\n    const handleKeypress = (event: KeyboardEvent) => {\n      // Ignore if search query exists or search input is focused\n      if (query || searchInput.current === document.activeElement) {\n        return\n      }\n\n      const index = parseInt(event.key, 10) - 1\n      if (index >= 0 && index < workspaces.length) {\n        setActiveWorkspace(workspaces[index]!.name)\n      }\n    }\n\n    window.addEventListener('keypress', handleKeypress)\n\n    return () => {\n      window.removeEventListener('keypress', handleKeypress)\n    }\n  }, [query, workspaces, setActiveWorkspace])\n\n  return (\n    <TallCard tone=\"transparent\">\n      <Flex direction=\"column\" padding={[4, 5, 6, 6]}>\n        <Container>\n          <Stack gap={4}>\n            <Heading>Workspaces</Heading>\n            <Card padding={[2, 3, 4, 4]} radius={3} shadow={2}>\n              <Stack gap={3}>\n                <Stack gap={2}>\n                  <Text size={1} weight=\"semibold\">\n                    Search\n                  </Text>\n                  <TextInput ref={searchInput} value={query} onChange={handleQuery} />\n                </Stack>\n                <Box>\n                  {filteredWorkspaces.map((workspace, index) => (\n                    <WorkspacePreview\n                      key={workspace.name}\n                      workspace={workspace}\n                      index={index}\n                      query={query}\n                    />\n                  ))}\n                </Box>\n              </Stack>\n            </Card>\n          </Stack>\n        </Container>\n      </Flex>\n    </TallCard>\n  )\n}\n","import '@sanity/ui/styles.css'\nimport {HomeIcon} from '@sanity/icons/Home'\nimport {definePlugin, type Plugin, type WorkspaceOptions} from 'sanity'\n\nimport WorkspaceHome from './components/WorkspaceHome'\n\nexport const workspaceHome: Plugin = definePlugin(() => {\n  return {\n    name: 'sanity-plugin-workspace-home',\n    tools: [\n      {\n        title: 'Workspace Home',\n        name: 'workspace-home',\n        icon: HomeIcon,\n        component: WorkspaceHome,\n      },\n    ],\n  }\n})\n\ntype WorkspaceHomeConfigProps = {\n  projectId: string\n  dataset: string\n}\n\nexport const workspaceHomeConfig = ({\n  projectId,\n  dataset,\n}: WorkspaceHomeConfigProps): WorkspaceOptions => ({\n  name: 'home',\n  title: 'Home',\n  basePath: '/home',\n  projectId,\n  dataset,\n  icon: HomeIcon,\n  plugins: [workspaceHome()],\n})\n"],"mappings":"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"}
\ No newline at end of file