jazz-tools 0.19.11 → 0.19.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +46 -46
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-HX5S6W5E.js → chunk-AGF4HEDH.js} +56 -27
- package/dist/chunk-AGF4HEDH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/inspector/{chunk-C6BJPHBQ.js → chunk-YQNK5Y7B.js} +47 -35
- package/dist/inspector/chunk-YQNK5Y7B.js.map +1 -0
- package/dist/inspector/{custom-element-GJVBPZES.js → custom-element-KYV64IOC.js} +47 -35
- package/dist/inspector/{custom-element-GJVBPZES.js.map → custom-element-KYV64IOC.js.map} +1 -1
- package/dist/inspector/index.js +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/standalone.js +1 -1
- package/dist/inspector/tests/utils/transactions-changes.test.d.ts +2 -0
- package/dist/inspector/tests/utils/transactions-changes.test.d.ts.map +1 -0
- package/dist/inspector/utils/transactions-changes.d.ts +13 -13
- package/dist/inspector/utils/transactions-changes.d.ts.map +1 -1
- package/dist/react/index.js +4 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react-core/index.js +2 -2
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-native/index.js +4 -1
- package/dist/react-native/index.js.map +1 -1
- package/dist/react-native-core/index.js +4 -1
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/provider.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +3 -6
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/inspector/tests/utils/transactions-changes.test.ts +102 -0
- package/src/inspector/ui/icons/add-icon.tsx +3 -3
- package/src/inspector/utils/history.ts +6 -6
- package/src/inspector/utils/transactions-changes.ts +37 -3
- package/src/inspector/viewer/history-view.tsx +13 -13
- package/src/react/provider.tsx +6 -1
- package/src/react-core/hooks.ts +2 -2
- package/src/react-core/tests/useSuspenseCoState.test.tsx +47 -0
- package/src/react-native-core/provider.tsx +6 -1
- package/src/tools/implementation/ContextManager.ts +10 -0
- package/src/tools/subscribe/SubscriptionScope.ts +61 -39
- package/dist/chunk-HX5S6W5E.js.map +0 -1
- package/dist/inspector/chunk-C6BJPHBQ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/inspector/contexts/node.tsx","../../src/inspector/router/hash-router.tsx","../../src/inspector/router/context.ts","../../src/inspector/router/in-memory-router.tsx","../../src/inspector/viewer/page-stack.tsx","../../src/inspector/viewer/page.tsx","../../src/inspector/ui/badge.tsx","../../src/inspector/ui/heading.tsx","../../src/inspector/ui/text.tsx","../../src/inspector/viewer/account-or-group-text.tsx","../../src/inspector/ui/button.tsx","../../src/inspector/viewer/use-resolve-covalue.ts","../../src/inspector/viewer/co-stream-view.tsx","../../src/inspector/viewer/grid-view.tsx","../../src/inspector/viewer/type-icon.tsx","../../src/inspector/viewer/types.ts","../../src/inspector/viewer/value-renderer.tsx","../../src/inspector/ui/icons/caution.tsx","../../src/inspector/ui/icons/chevron-down-icon.tsx","../../src/inspector/ui/icons/delete-icon.tsx","../../src/inspector/ui/icons/edit-icon.tsx","../../src/inspector/ui/icons/link-icon.tsx","../../src/inspector/ui/icons/history.tsx","../../src/inspector/ui/icons/add-icon.tsx","../../src/inspector/ui/icon.tsx","../../src/inspector/viewer/co-value-editor.tsx","../../src/inspector/ui/select.tsx","../../src/inspector/ui/card.tsx","../../src/inspector/ui/grid.tsx","../../src/inspector/utils/permissions.ts","../../src/inspector/viewer/raw-data-card.tsx","../../src/inspector/ui/modal.tsx","../../src/inspector/ui/input.tsx","../../src/inspector/ui/data-table.tsx","../../src/inspector/ui/table.tsx","../../src/inspector/ui/accordion.tsx","../../src/inspector/viewer/account-view.tsx","../../src/inspector/viewer/co-plain-text-view.tsx","../../src/inspector/viewer/group-view.tsx","../../src/inspector/viewer/role-display.tsx","../../src/inspector/viewer/table-viewer.tsx","../../src/inspector/viewer/history-view.tsx","../../src/inspector/utils/transactions-changes.ts","../../src/inspector/utils/history.ts","../../src/inspector/viewer/co-map-view.tsx","../../src/inspector/ui/error-boundary.tsx","../../src/inspector/pages/home.tsx","../../src/inspector/ui/global-styles.tsx","../../src/inspector/viewer/header.tsx","../../src/inspector/viewer/breadcrumbs.tsx","../../src/inspector/viewer/delete-local-data.tsx"],"sourcesContent":["import {\n createContext,\n type PropsWithChildren,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { CoID, LocalNode, RawAccount } from \"cojson\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport type { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport { createWebSocketPeer } from \"cojson-transport-ws\";\n\ntype NodeContextType = {\n accountID: CoID<RawAccount> | null;\n localNode: LocalNode | null;\n server: string;\n createLocalNode: (\n accountID: CoID<RawAccount>,\n clientSecret: string,\n server: string,\n ) => Promise<void>;\n reset: () => void;\n};\n\nexport const NodeContext = createContext<NodeContextType>({\n accountID: null,\n localNode: null,\n server: \"wss://cloud.jazz.tools/\",\n createLocalNode: async () => {\n throw new Error(\"createLocalNode not implemented\");\n },\n reset: () => {\n throw new Error(\"reset not implemented\");\n },\n});\n\ntype NodeProviderProps = PropsWithChildren<{\n localNode?: LocalNode | null;\n accountID?: CoID<RawAccount> | null;\n server?: string;\n}>;\n\nlet crypto: WasmCrypto | PureJSCrypto | null = null;\n\nasync function getCrypto() {\n if (crypto) return crypto;\n crypto = await WasmCrypto.create();\n return crypto;\n}\n\nexport function NodeProvider(props: NodeProviderProps) {\n const [accountID, setAccountID] = useState<CoID<RawAccount> | null>(\n props?.accountID ?? null,\n );\n const [localNode, setLocalNode] = useState<LocalNode | null>(\n props?.localNode ?? null,\n );\n const [server, setServer] = useState<string>(\n props?.server ?? \"wss://cloud.jazz.tools/\",\n );\n\n useEffect(() => {\n if (props.localNode !== undefined) setLocalNode(props.localNode);\n\n if (props.accountID !== undefined) setAccountID(props.accountID);\n\n if (props.server !== undefined) setServer(props.server);\n }, [props.localNode, props.accountID, props.server]);\n\n async function createLocalNode(\n accountID: CoID<RawAccount>,\n clientSecret: string,\n server: string,\n ) {\n if (localNode) {\n localNode.gracefulShutdown();\n }\n\n setLocalNode(null);\n\n const wsPeer = createWebSocketPeer({\n id: \"cloud\",\n websocket: new WebSocket(server),\n role: \"server\",\n });\n\n const crypto = await getCrypto();\n\n const node = await LocalNode.withLoadedAccount({\n accountID: accountID,\n accountSecret: clientSecret as any,\n sessionID: crypto.newRandomSessionID(accountID),\n peers: [wsPeer],\n crypto,\n migration: async () => {\n console.log(\"Not running any migration in inspector\");\n },\n });\n\n setLocalNode(node);\n setAccountID(accountID);\n setServer(server);\n }\n\n function reset() {\n if (localNode) {\n localNode.gracefulShutdown();\n }\n setLocalNode(null);\n setAccountID(null);\n setServer(\"wss://cloud.jazz.tools/\");\n }\n\n return (\n <NodeContext.Provider\n value={{ accountID, localNode, server, createLocalNode, reset }}\n >\n {props.children}\n </NodeContext.Provider>\n );\n}\n\nexport function useNode() {\n const context = useContext(NodeContext);\n if (!context) {\n throw new Error(\"useNode must be used within a NodeProvider\");\n }\n return context;\n}\n","import React, {\n ReactNode,\n useState,\n useCallback,\n useEffect,\n useMemo,\n} from \"react\";\nimport { Router, RouterContext } from \"./context.js\";\nimport { PageInfo } from \"../viewer/types.js\";\nimport { CoID, RawCoValue } from \"cojson\";\n\nexport function HashRouterProvider({\n children,\n defaultPath,\n}: {\n children: ReactNode;\n defaultPath?: PageInfo[];\n}) {\n const [path, setPath] = useState<PageInfo[]>(() => {\n if (typeof window === \"undefined\") return defaultPath || [];\n const hash = window.location.hash.slice(2); // Remove '#/'\n\n const defaultEncoded = encodePathToHash(defaultPath || []);\n\n if (defaultPath) {\n window.history.pushState({}, \"\", `#/${defaultEncoded}`);\n return defaultPath;\n }\n\n if (hash) {\n const path = decodePathFromHash(hash);\n return path;\n }\n\n window.history.pushState({}, \"\", `#/${encodePathToHash([])}`);\n return [];\n });\n\n const updatePath = useCallback((newPath: PageInfo[]) => {\n setPath(newPath);\n if (typeof window !== \"undefined\") {\n const hash = encodePathToHash(newPath);\n window.history.pushState({}, \"\", `#/${hash}`);\n }\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleHashChange = () => {\n const hash = window.location.hash.slice(2);\n const currentPath = encodePathToHash(path);\n\n if (hash === currentPath) return;\n\n if (hash) {\n try {\n const newPath = decodePathFromHash(hash);\n setPath(newPath);\n } catch (e) {\n console.error(\"Failed to parse hash:\", e);\n }\n } else if (defaultPath) {\n setPath(defaultPath);\n }\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n return () => window.removeEventListener(\"hashchange\", handleHashChange);\n }, [path, defaultPath]);\n\n useEffect(() => {\n if (defaultPath) {\n updatePath(defaultPath);\n }\n }, [defaultPath]);\n\n const router: Router = useMemo(() => {\n const addPages = (newPages: PageInfo[]) => {\n updatePath([...path, ...newPages]);\n };\n\n const goToIndex = (index: number) => {\n updatePath(path.slice(0, index + 1));\n };\n\n const setPage = (coId: CoID<RawCoValue>) => {\n updatePath([{ coId, name: \"Root\" }]);\n };\n\n const goBack = () => {\n updatePath(path.slice(0, path.length - 1));\n };\n\n return {\n path,\n addPages,\n goToIndex,\n setPage,\n goBack,\n };\n }, [path, updatePath]);\n\n return (\n <RouterContext.Provider value={router}>{children}</RouterContext.Provider>\n );\n}\n\nfunction encodePathToHash(path: PageInfo[]): string {\n return path\n .map((page) => {\n if (page.name && page.name !== \"Root\") {\n return `${page.coId}:${encodeURIComponent(page.name)}`;\n }\n return page.coId;\n })\n .join(\"/\");\n}\n\nfunction decodePathFromHash(hash: string): PageInfo[] {\n return hash.split(\"/\").map((segment) => {\n const [coId, encodedName] = segment.split(\":\");\n return {\n coId,\n name: encodedName ? decodeURIComponent(encodedName) : undefined,\n } as PageInfo;\n });\n}\n","import { CoID, RawCoValue } from \"cojson\";\nimport { PageInfo } from \"../viewer/types.js\";\nimport { createContext, useContext } from \"react\";\n\nexport interface Router {\n path: PageInfo[];\n setPage: (coId: CoID<RawCoValue>) => void;\n addPages: (newPages: PageInfo[]) => void;\n goToIndex: (index: number) => void;\n goBack: () => void;\n}\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport function useRouter(): Router {\n const context = useContext(RouterContext);\n if (!context) {\n throw new Error(\"useRouter must be used within a RouterProvider\");\n }\n return context;\n}\n","import { ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { CoID, RawCoValue } from \"cojson\";\nimport { Router, RouterContext } from \"./context.js\";\nimport { PageInfo } from \"../viewer/types.js\";\n\nconst STORAGE_KEY = \"jazz-inspector-paths\";\n\nexport function InMemoryRouterProvider({\n children,\n defaultPath,\n}: {\n children: ReactNode;\n defaultPath?: PageInfo[];\n}) {\n const [path, setPath] = useState<PageInfo[]>(() => {\n if (typeof window === \"undefined\") return [];\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n console.warn(\"Failed to parse stored path:\", e);\n }\n }\n return defaultPath || [];\n });\n\n const updatePath = useCallback((newPath: PageInfo[]) => {\n setPath(newPath);\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newPath));\n }, []);\n\n useEffect(() => {\n if (defaultPath && JSON.stringify(path) !== JSON.stringify(defaultPath)) {\n updatePath(defaultPath);\n }\n }, [defaultPath, path, updatePath]);\n\n const router: Router = useMemo(() => {\n const addPages = (newPages: PageInfo[]) => {\n updatePath([...path, ...newPages]);\n };\n\n const goToIndex = (index: number) => {\n updatePath(path.slice(0, index + 1));\n };\n\n const setPage = (coId: CoID<RawCoValue>) => {\n updatePath([{ coId, name: \"Root\" }]);\n };\n\n const goBack = () => {\n updatePath(path.slice(0, path.length - 1));\n };\n\n return {\n path,\n addPages,\n goToIndex,\n setPage,\n goBack,\n };\n }, [path, updatePath]);\n\n return (\n <RouterContext.Provider value={router}>{children}</RouterContext.Provider>\n );\n}\n","import { CoID, LocalNode, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport { Page } from \"./page.js\";\nimport { ErrorBoundary } from \"../ui/error-boundary.js\";\nimport { useRouter } from \"../router/context.js\";\nimport { useNode } from \"../contexts/node.js\";\nimport { HomePage } from \"../pages/home.js\";\n\nconst PageStackContainer = styled(\"article\")`\n position: relative;\n padding: 0 0.75rem;\n overflow-y: auto;\n flex: 1;\n color: var(--j-text-color);\n font-size: 16px;\n`;\n\ntype PageStackProps = {\n homePage?: React.ReactNode;\n};\n\nexport function PageStack({ homePage }: PageStackProps) {\n const { path, addPages, goBack } = useRouter();\n const { localNode } = useNode();\n\n const page = path[path.length - 1];\n const index = path.length - 1;\n\n if (path.length <= 0) {\n return <PageStackContainer>{homePage ?? <HomePage />}</PageStackContainer>;\n }\n\n return (\n <>\n <PageStackContainer>\n {localNode && page && (\n <ErrorBoundary title=\"An error occurred while rendering this CoValue\">\n <Page\n coId={page.coId}\n node={localNode}\n name={page.name || page.coId}\n onHeaderClick={goBack}\n onNavigate={addPages}\n isTopLevel={index === path.length - 1}\n />\n </ErrorBoundary>\n )}\n </PageStackContainer>\n </>\n );\n}\n","import {\n CoID,\n LocalNode,\n RawCoList,\n RawCoMap,\n RawCoPlainText,\n RawCoStream,\n RawCoValue,\n} from \"cojson\";\nimport { styled } from \"goober\";\nimport React from \"react\";\nimport { Badge } from \"../ui/badge.js\";\nimport { Heading } from \"../ui/heading.js\";\nimport { Text } from \"../ui/text.js\";\nimport { AccountOrGroupText } from \"./account-or-group-text.js\";\nimport { AccountView } from \"./account-view.js\";\nimport { CoPlainTextView } from \"./co-plain-text-view.js\";\nimport { CoStreamView } from \"./co-stream-view.js\";\nimport { GridView } from \"./grid-view.js\";\nimport { GroupView } from \"./group-view.js\";\nimport { RoleDisplay } from \"./role-display.js\";\nimport { TableView } from \"./table-viewer.js\";\nimport { TypeIcon } from \"./type-icon.js\";\nimport { PageInfo } from \"./types.js\";\nimport { resolveCoValue, useResolvedCoValue } from \"./use-resolve-covalue.js\";\nimport { HistoryView } from \"./history-view.js\";\nimport { CoMapView } from \"./co-map-view.js\";\n\ninterface PageContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n isTopLevel?: boolean;\n}\n\nconst BasePageContainer = React.forwardRef<HTMLDivElement, PageContainerProps>(\n ({ isTopLevel, ...rest }, ref) => <div ref={ref} {...rest} />,\n);\n\nconst PageContainer = styled(BasePageContainer)<PageContainerProps>`\n position: absolute;\n z-index: 10;\n inset: 0;\n width: 100%;\n height: 100%;\n padding: 0 0.75rem;\n`;\n\nconst BackButton = styled(\"div\")`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n height: 2.5rem;\n`;\n\nconst HeaderContainer = styled(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n`;\n\nconst TitleContainer = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 0.75rem;\n`;\n\nconst Title = styled(Heading)`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n`;\n\nconst BadgeContainer = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 0.75rem;\n`;\n\nconst ContentContainer = styled(\"div\")`\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding-bottom: 2rem;\n`;\n\ntype PageProps = {\n coId: CoID<RawCoValue>;\n node: LocalNode;\n name: string;\n onNavigate: (newPages: PageInfo[]) => void;\n onHeaderClick?: () => void;\n isTopLevel?: boolean;\n style?: React.CSSProperties;\n className?: string;\n};\n\nfunction canEdit(value: RawCoValue) {\n try {\n const myRole = value.group.myRole();\n\n return myRole === \"writer\" || myRole === \"admin\";\n } catch (e) {\n return false;\n }\n}\n\nfunction View(\n props: PageProps & { coValue: Awaited<ReturnType<typeof resolveCoValue>> },\n) {\n const { type, extendedType } = props.coValue;\n const { snapshot, value } = props.coValue;\n const { node, onNavigate } = props;\n\n if (!snapshot || snapshot === \"unavailable\") return;\n\n if (type === \"costream\") {\n return (\n <CoStreamView\n data={snapshot}\n onNavigate={onNavigate}\n node={node}\n value={value as RawCoStream}\n />\n );\n }\n\n if (extendedType === \"group\") {\n return (\n <GroupView\n coValue={value}\n data={snapshot}\n node={node}\n onNavigate={onNavigate}\n />\n );\n }\n\n if (extendedType === \"account\") {\n return <AccountView data={snapshot} node={node} onNavigate={onNavigate} />;\n }\n\n if (type === \"coplaintext\") {\n return (\n <CoPlainTextView\n data={snapshot}\n coValue={value as RawCoPlainText}\n node={node}\n />\n );\n }\n\n if (type === \"colist\") {\n const handleRemove = (index: number) => {\n if (confirm(\"Are you sure you want to remove this item?\")) {\n const list = value as RawCoList;\n list.delete(index);\n }\n };\n\n return (\n <TableView\n data={snapshot}\n node={node}\n onNavigate={onNavigate}\n onRemove={canEdit(value) ? handleRemove : undefined}\n />\n );\n }\n\n if (extendedType === \"record\") {\n return <TableView data={snapshot} node={node} onNavigate={onNavigate} />;\n }\n\n if (type === \"comap\") {\n return (\n <CoMapView\n coValue={value as RawCoMap}\n data={snapshot}\n node={node}\n onNavigate={onNavigate}\n />\n );\n }\n\n return <GridView data={snapshot} onNavigate={onNavigate} node={node} />;\n}\n\nexport function Page(props: PageProps) {\n const {\n coId,\n node,\n name,\n onNavigate,\n onHeaderClick,\n style,\n className = \"\",\n isTopLevel,\n } = props;\n const coValue = useResolvedCoValue(coId, node);\n\n const { value, snapshot, type, extendedType } = coValue;\n\n if (snapshot === \"unavailable\") {\n return <div style={style}>Data unavailable</div>;\n }\n\n if (!snapshot) {\n return <div style={style}></div>;\n }\n\n return (\n <PageContainer style={style} className={className} isTopLevel={isTopLevel}>\n {!isTopLevel && (\n <BackButton\n aria-label=\"Back\"\n onClick={() => {\n onHeaderClick?.();\n }}\n aria-hidden=\"true\"\n ></BackButton>\n )}\n <HeaderContainer>\n <TitleContainer>\n <Title>\n <span>\n {name}\n {typeof snapshot === \"object\" && \"name\" in snapshot ? (\n <span style={{ color: \"#57534e\", fontWeight: 500 }}>\n {\" \"}\n {(snapshot as { name: string }).name}\n </span>\n ) : null}\n </span>\n </Title>\n <BadgeContainer>\n <Badge>\n {type && <TypeIcon type={type} extendedType={extendedType} />}\n </Badge>\n <Badge>{coId}</Badge>\n </BadgeContainer>\n </TitleContainer>\n </HeaderContainer>\n <ContentContainer>\n <View {...props} coValue={coValue} />\n {extendedType !== \"account\" && extendedType !== \"group\" && (\n <>\n <RoleDisplay node={node} value={value} />\n <Text muted>\n Owned by{\" \"}\n <AccountOrGroupText\n coId={value.group.id}\n node={node}\n showId\n onClick={() => {\n onNavigate([{ coId: value.group.id, name: \"owner\" }]);\n }}\n />\n </Text>\n </>\n )}\n {value && <HistoryView coValue={value} node={node} />}\n </ContentContainer>\n </PageContainer>\n );\n}\n","import { styled } from \"goober\";\n\nconst StyledBadge = styled(\"span\")<{ className?: string }>`\n font-size: 0.875rem;\n font-weight: 500;\n padding: 0.125rem 0.25rem;\n margin-left: -0.125rem;\n border-radius: var(--j-radius-sm);\n background-color: var(--j-foreground);\n display: inline-block;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--j-text-color-strong);\n`;\n\nexport function Badge({\n children,\n className,\n}: React.PropsWithChildren<{ className?: string }>) {\n return <StyledBadge className={className}>{children}</StyledBadge>;\n}\n","import { styled } from \"goober\";\n\nconst StyledHeading = styled(\"h1\")<{ className?: string }>`\n font-size: 1.125rem;\n text-align: center;\n font-weight: 500;\n color: var(--j-text-color-strong);\n`;\n\nexport function Heading({\n children,\n className,\n id,\n}: React.PropsWithChildren<{ className?: string; id?: string }>) {\n return (\n <StyledHeading className={className} id={id}>\n {children}\n </StyledHeading>\n );\n}\n","import { styled } from \"goober\";\nimport React from \"react\";\n\ninterface TextProps extends React.HTMLAttributes<HTMLParagraphElement> {\n muted?: boolean;\n strong?: boolean;\n small?: boolean;\n inline?: boolean;\n mono?: boolean;\n}\n\nconst BaseText = React.forwardRef<HTMLParagraphElement, TextProps>(\n ({ muted, strong, small, inline, mono, ...rest }, ref) => (\n <div ref={ref} {...rest} />\n ),\n);\n\nconst StyledText = styled(BaseText)<TextProps>`\n ${(props) =>\n props.muted &&\n `\n color: var(--j-neutral-500);\n `}\n\n ${(props) =>\n props.strong &&\n `\n font-weight: 500;\n color: var(--j-text-color-strong);\n `}\n\n ${(props) =>\n props.small &&\n `\n font-size: 0.875rem;\n `}\n\n ${(props) =>\n props.inline &&\n `\n display: inline;\n `}\n\n ${(props) =>\n props.mono &&\n `\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n `}\n`;\n\nexport function Text(\n props: React.PropsWithChildren<{\n className?: string;\n muted?: boolean;\n strong?: boolean;\n inline?: boolean;\n small?: boolean;\n mono?: boolean;\n style?: React.CSSProperties;\n }>,\n) {\n return <StyledText {...props} />;\n}\n","import { CoID, LocalNode, RawCoValue } from \"cojson\";\nimport { useEffect, useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { resolveCoValue, useResolvedCoValue } from \"./use-resolve-covalue.js\";\n\nexport function AccountOrGroupText({\n coId,\n node,\n showId = false,\n onClick,\n}: {\n coId: CoID<RawCoValue>;\n node: LocalNode;\n showId?: boolean;\n onClick?: (name?: string) => void;\n}) {\n const { snapshot, extendedType } = useResolvedCoValue(coId, node);\n const [name, setName] = useState<string | null>(null);\n\n useEffect(() => {\n if (snapshot && typeof snapshot === \"object\" && \"profile\" in snapshot) {\n const profileId = snapshot.profile as CoID<RawCoValue>;\n resolveCoValue(profileId, node).then((profileResult) => {\n if (\n profileResult.snapshot &&\n typeof profileResult.snapshot === \"object\" &&\n \"name\" in profileResult.snapshot\n ) {\n setName(profileResult.snapshot.name as string);\n }\n });\n }\n }, [snapshot, node, extendedType]);\n\n if (!snapshot) return <span>Loading...</span>;\n if (extendedType !== \"account\" && extendedType !== \"group\") {\n return <span>CoID is not an account or group</span>;\n }\n\n const displayName = extendedType === \"account\" ? name || \"Account\" : \"Group\";\n const displayText = showId ? `${displayName} <${coId}>` : displayName;\n\n if (onClick) {\n return (\n <Button variant=\"link\" onClick={() => onClick(displayName)}>\n {displayText}\n </Button>\n );\n }\n\n return <>{displayText}</>;\n}\n","import { styled } from \"goober\";\nimport { forwardRef } from \"react\";\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"link\" | \"plain\" | \"destructive\";\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n}\n\nconst StyledButton = styled(\"button\")<{ variant: string; disabled?: boolean }>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n text-align: center;\n transition: colors 0.2s;\n border-radius: var(--j-radius-lg);\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n\n ${(props) => {\n switch (props.variant) {\n case \"primary\":\n return `\n padding: 0.375rem 0.75rem;\n background-color: var(--j-primary-color);\n border-color: var(--j-primary-color);\n color: white;\n font-weight: 500;\n &:hover {\n opacity: 0.8;\n }\n `;\n case \"secondary\":\n return `\n padding: 0.375rem 0.75rem;\n color: var(--j-text-color-strong);\n border: 1px solid var(--j-border-color);\n font-weight: 500;\n &:hover {\n border-color: var(--j-border-color-hover);\n }\n `;\n case \"link\":\n return `\n color: var(--j-link-color);\n &:hover {\n text-decoration: underline;\n }\n `;\n case \"destructive\":\n return `\n padding: 0.375rem 0.75rem;\n background-color: var(--j-destructive-color);\n border-color: var(--j-destructive-color);\n color: white;\n font-weight: 500;\n &:hover {\n opacity: 0.8;\n }\n `;\n default:\n return \"\";\n }\n }}\n`;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n children,\n variant = \"primary\",\n disabled,\n type = \"button\",\n ...buttonProps\n },\n ref,\n ) => {\n return (\n <StyledButton\n ref={ref}\n {...buttonProps}\n disabled={disabled}\n className={className}\n type={type}\n variant={variant}\n >\n {children}\n </StyledButton>\n );\n },\n);\n","import {\n CoID,\n LocalNode,\n RawBinaryCoStream,\n RawCoStream,\n RawCoValue,\n} from \"cojson\";\nimport { useEffect, useState } from \"react\";\nimport { detectCoStreamType } from \"./co-stream-view.js\";\n\nexport type CoJsonType = \"comap\" | \"costream\" | \"colist\" | \"coplaintext\";\nexport type ExtendedCoJsonType =\n | \"image\"\n | \"record\"\n | \"account\"\n | \"group\"\n | \"file\";\n\ntype JSON = string | number | boolean | null | JSON[] | { [key: string]: JSON };\ntype JSONObject = { [key: string]: JSON };\n\ntype ResolvedImageDefinition = {\n originalSize: [number, number];\n placeholderDataURL?: string;\n [res: `${number}x${number}`]: RawBinaryCoStream[\"id\"];\n};\n\n// Type guard for browser image\nexport const isBrowserImage = (\n coValue: JSONObject,\n): coValue is ResolvedImageDefinition => {\n return \"originalSize\" in coValue && \"placeholderDataURL\" in coValue;\n};\n\nexport type ResolvedGroup = {\n readKey: string;\n [key: string]: JSON;\n};\n\nexport const isGroup = (coValue: JSONObject): coValue is ResolvedGroup => {\n return \"readKey\" in coValue;\n};\n\nexport type ResolvedAccount = {\n profile: {\n name: string;\n };\n [key: string]: JSON;\n};\n\nexport async function resolveCoValue(\n coValueId: CoID<RawCoValue>,\n node: LocalNode,\n): Promise<\n | {\n value: RawCoValue;\n snapshot: JSONObject;\n type: CoJsonType | null;\n extendedType: ExtendedCoJsonType | undefined;\n }\n | {\n value: undefined;\n snapshot: \"unavailable\";\n type: null;\n extendedType: undefined;\n }\n> {\n const value = await node.load(coValueId);\n\n if (value === \"unavailable\") {\n return {\n value: undefined,\n snapshot: \"unavailable\",\n type: null,\n extendedType: undefined,\n };\n }\n\n const snapshot = value.toJSON() as JSONObject;\n const type = value.type as CoJsonType;\n\n // Determine extended type\n let extendedType: ExtendedCoJsonType | undefined;\n\n if (type === \"comap\") {\n if (isBrowserImage(snapshot)) {\n extendedType = \"image\";\n } else if (value.headerMeta?.type === \"account\") {\n extendedType = \"account\";\n } else if (value.core.isGroup()) {\n extendedType = \"group\";\n }\n }\n\n return {\n value,\n snapshot,\n type,\n extendedType,\n };\n}\n\nfunction subscribeToCoValue(\n coValueId: CoID<RawCoValue>,\n node: LocalNode,\n callback: (result: Awaited<ReturnType<typeof resolveCoValue>>) => void,\n) {\n return node.subscribe(coValueId, (value) => {\n if (value === \"unavailable\") {\n callback({\n value: undefined,\n snapshot: \"unavailable\",\n type: null,\n extendedType: undefined,\n });\n } else {\n const snapshot = value.toJSON() as JSONObject;\n const type = value.type as CoJsonType;\n let extendedType: ExtendedCoJsonType | undefined;\n\n if (type === \"comap\") {\n if (isBrowserImage(snapshot)) {\n extendedType = \"image\";\n } else if (value.headerMeta?.type === \"account\") {\n extendedType = \"account\";\n } else if (value.core.isGroup()) {\n extendedType = \"group\";\n }\n } else if (type === \"costream\") {\n const coStream = detectCoStreamType(value as RawCoStream);\n\n if (coStream.type === \"binary\") {\n extendedType = \"file\";\n }\n }\n\n callback({\n value,\n snapshot,\n type,\n extendedType,\n });\n }\n });\n}\n\nexport function useResolvedCoValue(\n coValueId: CoID<RawCoValue>,\n node: LocalNode,\n) {\n const [result, setResult] =\n useState<Awaited<ReturnType<typeof resolveCoValue>>>();\n\n useEffect(() => {\n let isMounted = true;\n const unsubscribe = subscribeToCoValue(coValueId, node, (newResult) => {\n if (isMounted) {\n setResult(newResult);\n }\n });\n\n return () => {\n isMounted = false;\n unsubscribe();\n };\n }, [coValueId, node]);\n\n return (\n result || {\n value: undefined,\n snapshot: undefined,\n type: undefined,\n extendedType: undefined,\n }\n );\n}\n\nexport function useResolvedCoValues(\n coValueIds: CoID<RawCoValue>[],\n node: LocalNode,\n) {\n const [results, setResults] = useState<\n Awaited<ReturnType<typeof resolveCoValue>>[]\n >([]);\n\n useEffect(() => {\n let isMounted = true;\n const unsubscribes: (() => void)[] = [];\n\n coValueIds.forEach((coValueId, index) => {\n const unsubscribe = subscribeToCoValue(coValueId, node, (newResult) => {\n if (isMounted) {\n setResults((prevResults) => {\n const newResults = prevResults.slice(0, coValueIds.length);\n newResults[index] = newResult;\n return newResults;\n });\n }\n });\n unsubscribes.push(unsubscribe);\n });\n\n return () => {\n isMounted = false;\n unsubscribes.forEach((unsubscribe) => unsubscribe());\n };\n }, [coValueIds, node]);\n\n return results;\n}\n","import {\n CoID,\n LocalNode,\n RawBinaryCoStream,\n RawCoStream,\n RawCoValue,\n} from \"cojson\";\nimport { base64URLtoBytes } from \"cojson\";\nimport { BinaryStreamItem, BinaryStreamStart, CoStreamItem } from \"cojson\";\nimport type { JsonObject, JsonValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport { useEffect, useState } from \"react\";\nimport { Badge } from \"../ui/badge.js\";\nimport { Button } from \"../ui/button.js\";\nimport { AccountOrGroupText } from \"./account-or-group-text.js\";\nimport { PageInfo } from \"./types.js\";\n\n// typeguard for BinaryStreamStart\nfunction isBinaryStreamStart(item: unknown): item is BinaryStreamStart {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"type\" in item &&\n item.type === \"start\"\n );\n}\n\nexport function detectCoStreamType(value: RawCoStream | RawBinaryCoStream) {\n const firstKey = Object.keys(value.items)[0];\n if (!firstKey)\n return {\n type: \"unknown\",\n };\n\n const items = value.items[firstKey as never]?.map((v) => v.value);\n\n if (!items)\n return {\n type: \"unknown\",\n };\n const firstItem = items[0];\n if (!firstItem)\n return {\n type: \"unknown\",\n };\n // This is a binary stream\n if (isBinaryStreamStart(firstItem)) {\n return {\n type: \"binary\",\n items: items as BinaryStreamItem[],\n };\n } else {\n return {\n type: \"coStream\",\n };\n }\n}\n\nasync function getBlobFromCoStream({\n items,\n onlyFirstChunk = false,\n}: {\n items: BinaryStreamItem[];\n onlyFirstChunk?: boolean;\n}) {\n if (onlyFirstChunk && items.length > 1) {\n items = items.slice(0, 2);\n }\n\n const chunks: Uint8Array[] = [];\n\n const binary_U_prefixLength = 8;\n\n let lastProgressUpdate = Date.now();\n\n for (const item of items.slice(1)) {\n if (item.type === \"end\") {\n break;\n }\n\n if (item.type !== \"chunk\") {\n console.error(\"Invalid binary stream chunk\", item);\n return undefined;\n }\n\n const chunk = base64URLtoBytes(item.chunk.slice(binary_U_prefixLength));\n // totalLength += chunk.length;\n chunks.push(chunk);\n\n if (Date.now() - lastProgressUpdate > 100) {\n lastProgressUpdate = Date.now();\n }\n }\n const defaultMime =\n items[0] && \"mimeType\" in items[0] ? items[0].mimeType : null;\n\n const blob = new Blob(chunks, defaultMime ? { type: defaultMime } : {});\n\n const mimeType =\n defaultMime === \"\" ? await detectPDFMimeType(blob) : defaultMime;\n\n return {\n blob,\n mimeType: mimeType as string,\n unfinishedChunks: items.length > 1,\n totalSize:\n items[0] && \"totalSizeBytes\" in items[0]\n ? (items[0].totalSizeBytes as number)\n : undefined,\n };\n}\n\nconst detectPDFMimeType = async (blob: Blob): Promise<string> => {\n const arrayBuffer = await blob.slice(0, 4).arrayBuffer();\n const uint8Array = new Uint8Array(arrayBuffer);\n const header = uint8Array.reduce(\n (acc, byte) => acc + String.fromCharCode(byte),\n \"\",\n );\n\n if (header === \"%PDF\") {\n return \"application/pdf\";\n }\n return \"unknown\";\n};\n\nconst BinaryDownloadButton = ({\n pdfBlob,\n fileName = \"document\",\n label,\n mimeType,\n}: {\n pdfBlob: Blob;\n mimeType?: string;\n fileName?: string;\n label: string;\n}) => {\n const downloadFile = () => {\n const url = URL.createObjectURL(\n new Blob([pdfBlob], mimeType ? { type: mimeType } : {}),\n );\n const link = document.createElement(\"a\");\n link.href = url;\n link.download =\n mimeType === \"application/pdf\" ? `${fileName}.pdf` : fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n return (\n <Button variant=\"secondary\" onClick={downloadFile}>\n ⬇️ {label}\n {/* Download {mimeType === \"application/pdf\" ? \"PDF\" : \"File\"} */}\n </Button>\n );\n};\n\nconst LabelContentPairContainer = styled(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n`;\n\nconst BinaryStreamGrid = styled(\"div\")`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.5rem;\n max-width: 48rem;\n`;\n\nconst ImagePreviewContainer = styled(\"div\")`\n background-color: rgb(249 250 251);\n padding: 0.75rem;\n border-radius: var(--j-radius-md);\n @media (prefers-color-scheme: dark) {\n background-color: rgb(28 25 23);\n }\n`;\n\nconst CoStreamGrid = styled(\"div\")`\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.5rem;\n`;\n\nconst CoStreamItemContainer = styled(\"div\")`\n padding: 0.75rem;\n border-radius: var(--j-radius-lg);\n overflow: hidden;\n border: 1px solid rgb(229 231 235);\n cursor: pointer;\n box-shadow: var(--j-shadow-sm);\n &:hover {\n background-color: rgb(243 244 246 / 0.05);\n }\n`;\n\nconst LabelContentPair = ({\n label,\n content,\n}: {\n label: string;\n content: React.ReactNode;\n}) => {\n return (\n <LabelContentPairContainer>\n <span>{label}</span>\n <span>{content}</span>\n </LabelContentPairContainer>\n );\n};\n\nfunction RenderCoBinaryStream({\n value,\n items,\n}: {\n items: BinaryStreamItem[];\n value: RawBinaryCoStream;\n}) {\n const [file, setFile] = useState<\n | {\n blob: Blob;\n mimeType: string;\n unfinishedChunks: boolean;\n totalSize: number | undefined;\n }\n | undefined\n | null\n >(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n // load only the first chunk to get the mime type and size\n getBlobFromCoStream({\n items,\n onlyFirstChunk: true,\n })\n .then((v) => {\n if (v) {\n setFile(v);\n if (v.mimeType.includes(\"image\")) {\n // If it's an image, load the full blob\n getBlobFromCoStream({\n items,\n }).then((s) => {\n if (s) setFile(s);\n });\n }\n }\n })\n .finally(() => setIsLoading(false));\n }, [items]);\n\n if (!isLoading && !file) return <div>No blob</div>;\n\n if (isLoading) return <div>Loading...</div>;\n if (!file) return <div>No blob</div>;\n\n const { blob, mimeType } = file;\n\n const sizeInKB = (file.totalSize || 0) / 1024;\n\n return (\n <>\n <BinaryStreamGrid>\n <LabelContentPair\n label=\"Mime Type\"\n content={<Badge>{mimeType || \"No mime type\"}</Badge>}\n />\n <LabelContentPair\n label=\"Size\"\n content={<span>{sizeInKB.toFixed(2)} KB</span>}\n />\n <LabelContentPair\n label=\"Download\"\n content={\n <BinaryDownloadButton\n fileName={value.id.toString()}\n pdfBlob={blob}\n mimeType={mimeType}\n label={\n mimeType === \"application/pdf\"\n ? \"Download PDF\"\n : \"Download file\"\n }\n />\n }\n />\n </BinaryStreamGrid>\n {mimeType === \"image/png\" || mimeType === \"image/jpeg\" ? (\n <LabelContentPair\n label=\"Preview\"\n content={\n <ImagePreviewContainer>\n <RenderBlobImage blob={blob} />\n </ImagePreviewContainer>\n }\n />\n ) : null}\n </>\n );\n}\n\nfunction RenderCoStream({\n value,\n node,\n}: {\n value: RawCoStream;\n node: LocalNode;\n}) {\n const streamPerUser = Object.keys(value.items);\n const userCoIds = streamPerUser.map((stream) => stream.split(\"_session\")[0]);\n\n return (\n <CoStreamGrid>\n {userCoIds.map((id, idx) => (\n <CoStreamItemContainer key={id}>\n <AccountOrGroupText coId={id as CoID<RawCoValue>} node={node} />\n {/* @ts-expect-error - TODO: fix types */}\n {value.items[streamPerUser[idx]]?.map(\n (item: CoStreamItem<JsonValue>) => (\n <div key={item.tx.txIndex + item.tx.sessionID}>\n {new Date(item.madeAt).toLocaleString()}{\" \"}\n {JSON.stringify(item.value)}\n </div>\n ),\n )}\n </CoStreamItemContainer>\n ))}\n </CoStreamGrid>\n );\n}\n\nexport function CoStreamView({\n value,\n node,\n}: {\n data: JsonObject;\n onNavigate: (pages: PageInfo[]) => void;\n node: LocalNode;\n value: RawCoStream;\n}) {\n // if (!value) return <div>No value</div>;\n\n const streamType = detectCoStreamType(value);\n\n if (streamType.type === \"binary\") {\n if (streamType.items === undefined) {\n return <div>No binary stream</div>;\n }\n\n return (\n <RenderCoBinaryStream\n value={value as RawBinaryCoStream}\n items={streamType.items}\n />\n );\n }\n\n if (streamType.type === \"coStream\") {\n return <RenderCoStream value={value} node={node} />;\n }\n\n if (streamType.type === \"unknown\") return <div>Unknown stream type</div>;\n\n return <div>Unknown stream type</div>;\n}\n\nfunction RenderBlobImage({ blob }: { blob: Blob }) {\n const urlCreator = window.URL || window.webkitURL;\n return <img src={urlCreator.createObjectURL(blob)} />;\n}\n","import { CoID, LocalNode, RawCoValue } from \"cojson\";\nimport { JsonObject, JsonValue } from \"cojson\";\nimport { useState } from \"react\";\nimport { styled } from \"goober\";\nimport { ResolveIcon } from \"./type-icon.js\";\nimport { PageInfo, isCoId } from \"./types.js\";\nimport { CoMapPreview, ValueRenderer } from \"./value-renderer.js\";\nimport { CoValueEditor } from \"./co-value-editor.js\";\n\nimport { Badge } from \"../ui/badge.js\";\nimport { Card, CardBody, CardHeader } from \"../ui/card.js\";\nimport { Grid } from \"../ui/grid.js\";\nimport { Icon } from \"../ui/icon.js\";\nimport { Text } from \"../ui/text.js\";\nimport { isWriter } from \"../utils/permissions.js\";\n\nfunction GridItem({\n entry,\n onNavigate,\n node,\n coValue,\n}: {\n entry: [string, JsonValue | undefined];\n onNavigate: (pages: PageInfo[]) => void;\n node: LocalNode;\n coValue?: RawCoValue;\n}) {\n const [key, value] = entry;\n const isCoValue = isCoId(value);\n const [isEditing, setIsEditing] = useState(false);\n\n const handleEditClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setIsEditing(true);\n };\n\n const handleCancel = () => {\n setIsEditing(false);\n };\n\n const handleDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (confirm(`Are you sure you want to delete the property \"${key}\"?`)) {\n coValue?.core.makeTransaction(\n [\n {\n op: \"del\",\n key,\n },\n ],\n \"private\",\n );\n }\n };\n\n if (isEditing) {\n return (\n <Card\n style={{\n backgroundColor: \"var(--j-foreground)\",\n borderColor: \"var(--j-foreground)\",\n }}\n >\n <CardHeader>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n {isCoValue ? (\n <>\n <Text strong>{key}</Text>\n <Badge>\n <ResolveIcon coId={value as CoID<RawCoValue>} node={node} />\n </Badge>\n </>\n ) : (\n <Text strong>{key}</Text>\n )}\n </div>\n </CardHeader>\n <CardBody style={{ wordBreak: \"break-word\" }}>\n <CoValueEditor\n node={node}\n property={key}\n value={value}\n coValue={coValue!}\n onCancel={handleCancel}\n />\n </CardBody>\n </Card>\n );\n }\n\n const cardProps = isCoValue\n ? {\n onClick: () =>\n onNavigate([{ coId: value as CoID<RawCoValue>, name: key }]),\n as: \"button\",\n }\n : {\n style: {\n backgroundColor: \"var(--j-foreground)\",\n borderColor: \"var(--j-foreground)\",\n },\n };\n\n return (\n <Card {...cardProps}>\n <CardHeader>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n {isCoValue ? (\n <>\n <Text strong>{key}</Text>\n <Badge>\n <ResolveIcon coId={value as CoID<RawCoValue>} node={node} />\n </Badge>\n </>\n ) : (\n <Text strong>{key}</Text>\n )}\n </div>\n {coValue && isWriter(coValue.group.myRole()) && (\n <ActionButtons>\n <EditButton\n onClick={handleEditClick}\n type=\"button\"\n aria-label=\"Edit\"\n >\n <Icon name=\"edit\" size=\"sm\" />\n </EditButton>\n <DeleteButton\n onClick={handleDelete}\n type=\"button\"\n aria-label=\"Delete\"\n >\n <Icon name=\"delete\" size=\"sm\" />\n </DeleteButton>\n </ActionButtons>\n )}\n </CardHeader>\n <CardBody style={{ wordBreak: \"break-word\" }}>\n {isCoValue ? (\n <CoMapPreview coId={value as CoID<RawCoValue>} node={node} />\n ) : (\n <ValueRenderer\n json={value}\n onCoIDClick={(coId) => {\n onNavigate([{ coId, name: key }]);\n }}\n />\n )}\n </CardBody>\n </Card>\n );\n}\n\nexport function GridView({\n data,\n onNavigate,\n node,\n coValue,\n}: {\n data: JsonObject;\n onNavigate: (pages: PageInfo[]) => void;\n node: LocalNode;\n coValue?: RawCoValue;\n}) {\n const entries = Object.entries(data);\n\n return (\n <Grid cols={entries.length === 1 ? 1 : 3}>\n {entries.map((entry, childIndex) => (\n <GridItem\n entry={entry}\n onNavigate={onNavigate}\n node={node}\n coValue={coValue}\n key={childIndex}\n />\n ))}\n </Grid>\n );\n}\n\nconst EditButton = styled(\"button\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--j-text-color);\n border-radius: var(--j-radius-sm);\n transition: background-color 0.2s;\n\n &:hover {\n background-color: var(--j-foreground);\n }\n`;\n\nconst DeleteButton = styled(\"button\")`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--j-text-color);\n border-radius: var(--j-radius-sm);\n transition: background-color 0.2s;\n\n &:hover {\n background-color: var(--j-foreground);\n }\n`;\n\nconst ActionButtons = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 0.25rem;\n`;\n","import { CoID, LocalNode, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport {\n CoJsonType,\n ExtendedCoJsonType,\n useResolvedCoValue,\n} from \"./use-resolve-covalue.js\";\n\nconst IconText = styled(\"span\")`\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n`;\n\nconst UnavailableText = styled(\"div\")`\n font-weight: 500;\n`;\n\nconst EmptySpace = styled(\"div\")`\n white-space: pre;\n width: 3.5rem;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n`;\n\nexport const TypeIcon = ({\n type,\n extendedType,\n}: {\n type: CoJsonType;\n extendedType?: ExtendedCoJsonType;\n}) => {\n const iconMap: Record<ExtendedCoJsonType | CoJsonType, string> = {\n record: \"{} Record\",\n image: \"🖼️ Image\",\n comap: \"{} CoMap\",\n costream: \"≋ CoFeed\",\n colist: \"☰ CoList\",\n account: \"👤 Account\",\n group: \"👥 Group\",\n file: \"📃 FileStream\",\n coplaintext: \"📄 CoPlainText\",\n };\n\n const iconKey = extendedType || type;\n const icon = iconMap[iconKey as keyof typeof iconMap];\n\n return icon ? <IconText>{icon}</IconText> : null;\n};\n\nexport const ResolveIcon = ({\n coId,\n node,\n}: {\n coId: CoID<RawCoValue>;\n node: LocalNode;\n}) => {\n const { type, extendedType, snapshot } = useResolvedCoValue(coId, node);\n\n if (snapshot === \"unavailable\" && !type) {\n return <UnavailableText>Unavailable</UnavailableText>;\n }\n\n if (!type) return <EmptySpace> </EmptySpace>;\n\n return <TypeIcon type={type} extendedType={extendedType} />;\n};\n","import { CoID, RawCoValue } from \"cojson\";\n\nexport type PageInfo = {\n coId: CoID<RawCoValue>;\n name?: string;\n};\n\nexport const isCoId = (coId: unknown): coId is CoID<RawCoValue> =>\n typeof coId === \"string\" &&\n coId.startsWith(\"co_\") &&\n !coId.includes(\"inviteSecret\");\n","import { CoID, JsonValue, LocalNode, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport React, { useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { Icon } from \"../ui/icon.js\";\nimport { Text } from \"../ui/text.js\";\nimport { isCoId } from \"./types.js\";\nimport { isBrowserImage, useResolvedCoValue } from \"./use-resolve-covalue.js\";\n\nconst LinkContainer = styled(\"span\")`\n display: inline-flex;\n gap: 0.25rem;\n align-items: center;\n`;\n\nconst BooleanText = styled(\"span\")<{ value: boolean }>`\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n ${(props) =>\n props.value\n ? `\n color: var(--j-success-color);\n `\n : `\n color: var(--j-destructive-color);\n `}\n`;\n\nconst ObjectContent = styled(\"pre\")`\n margin-top: 0.375rem;\n font-size: 0.875rem;\n white-space: pre-wrap;\n`;\n\nconst PreviewContainer = styled(\"div\")`\n font-size: 0.875rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n align-items: flex-start;\n`;\n\nconst PreviewGrid = styled(\"div\")`\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0.5rem;\n`;\n\nconst PreviewMoreText = styled(Text)`\n text-align: left;\n margin-top: 0.5rem;\n`;\n\nconst ImagePreviewContainer = styled(\"div\")`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n`;\n\nconst PreviewImage = styled(\"img\")`\n width: 2rem;\n height: 2rem;\n border: 2px solid white;\n box-shadow: var(--j-shadow-sm);\n margin: 0.5rem 0;\n`;\n\nconst RecordText = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 0.25rem;\n`;\n\nconst ListText = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 0.25rem;\n`;\n\n// Is there a chance we can pass the actual CoValue here?\nexport function ValueRenderer({\n json,\n onCoIDClick,\n compact,\n}: {\n json: JsonValue | undefined;\n onCoIDClick?: (childNode: CoID<RawCoValue>) => void;\n compact?: boolean;\n}) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (typeof json === \"undefined\" || json === undefined) {\n return <Text muted>undefined</Text>;\n }\n\n if (json === null) {\n return <Text muted>null</Text>;\n }\n\n if (typeof json === \"string\" && isCoId(json)) {\n const content = (\n <>\n {json}\n {onCoIDClick && <Icon name=\"link\" />}\n </>\n );\n\n if (onCoIDClick) {\n return (\n <Button\n variant=\"link\"\n onClick={() => {\n onCoIDClick?.(json as CoID<RawCoValue>);\n }}\n >\n {content}\n </Button>\n );\n }\n\n return <LinkContainer>{content}</LinkContainer>;\n }\n\n if (typeof json === \"string\") {\n return <Text>{json}</Text>;\n }\n\n if (typeof json === \"number\") {\n return <Text mono>{json}</Text>;\n }\n\n if (typeof json === \"boolean\") {\n return <BooleanText value={json}>{json.toString()}</BooleanText>;\n }\n const longJson = JSON.stringify(json, null, 2);\n const shortJson = longJson\n .split(\"\\n\")\n .slice(0, compact ? 3 : 8)\n .join(\"\\n\");\n\n // Check if collapsed differs from full\n const hasDifference = longJson !== shortJson;\n\n if (typeof json === \"object\") {\n return (\n <>\n <p>{Array.isArray(json) ? <>Array ({json.length})</> : <>Object</>}</p>\n <ObjectContent>\n {isExpanded ? longJson : shortJson}\n\n {hasDifference && !isExpanded ? \"\\n ...\" : null}\n </ObjectContent>\n\n {!compact && hasDifference ? (\n <Button variant=\"link\" onClick={() => setIsExpanded(!isExpanded)}>\n {isExpanded ? \"Show less\" : \"Show more\"}\n </Button>\n ) : null}\n </>\n );\n }\n\n return <span>{String(json)}</span>;\n}\n\nexport const CoMapPreview = ({\n coId,\n node,\n limit = 6,\n}: {\n coId: CoID<RawCoValue>;\n node: LocalNode;\n limit?: number;\n}) => {\n const { value, snapshot, type, extendedType } = useResolvedCoValue(\n coId,\n node,\n );\n\n if (!snapshot) {\n return (\n <div\n style={{\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--j-foreground)\",\n animation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n whiteSpace: \"pre\",\n width: \"6rem\",\n }}\n >\n {\" \"}\n </div>\n );\n }\n\n if (snapshot === \"unavailable\" && !value) {\n return (\n <Text inline muted>\n Unavailable\n </Text>\n );\n }\n\n if (type === \"coplaintext\") {\n return <>{value.toString()}</>;\n }\n\n if (extendedType === \"image\" && isBrowserImage(snapshot)) {\n return (\n <ImagePreviewContainer>\n <PreviewImage src={snapshot.placeholderDataURL} />\n <Text inline small muted>\n {snapshot.originalSize[0]} x {snapshot.originalSize[1]}\n </Text>\n </ImagePreviewContainer>\n );\n }\n\n if (extendedType === \"record\") {\n return (\n <RecordText>\n Record{\" \"}\n <Text inline muted>\n ({Object.keys(snapshot).length})\n </Text>\n </RecordText>\n );\n }\n\n if (type === \"colist\") {\n return (\n <ListText>\n List{\" \"}\n <Text inline muted>\n ({(snapshot as unknown as []).length})\n </Text>\n </ListText>\n );\n }\n\n const properties = Object.entries(snapshot);\n const limitedProperties =\n extendedType === \"account\"\n ? properties\n .filter(\n ([key]) =>\n !key.startsWith(\"key_z\") &&\n !key.startsWith(\"sealer_z\") &&\n key !== \"readKey\",\n )\n .slice(0, limit)\n : properties.slice(0, limit);\n\n return (\n <PreviewContainer>\n <PreviewGrid>\n {limitedProperties.map(([key, value]) => (\n <React.Fragment key={key}>\n <Text strong>{key}: </Text>\n <ValueRenderer compact json={value} />\n </React.Fragment>\n ))}\n </PreviewGrid>\n {properties.length > limit && (\n <PreviewMoreText muted small>\n {properties.length - limit} more\n </PreviewMoreText>\n )}\n </PreviewContainer>\n );\n};\n","export function CautionIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"currentColor\" />\n <rect x=\"10.5\" y=\"6\" width=\"3\" height=\"7.5\" rx=\"1.5\" fill=\"#fff\" />\n <rect x=\"10.5\" y=\"16.5\" width=\"3\" height=\"3\" rx=\"1.5\" fill=\"#fff\" />\n </svg>\n );\n}\n","export function ChevronDownIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","export function DeleteIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-trash-icon lucide-trash\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n );\n}\n","export function EditIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-edit lucide-pencil\"\n >\n <path d=\"M13.2942 7.95881C13.5533 7.63559 13.5013 7.16358 13.178 6.90453C12.8548 6.64549 12.3828 6.6975 12.1238 7.02072L13.2942 7.95881ZM6.811 14.8488L7.37903 15.3385C7.38489 15.3317 7.39062 15.3248 7.39623 15.3178L6.811 14.8488ZM6.64 15.2668L5.89146 15.2179L5.8908 15.2321L6.64 15.2668ZM6.5 18.2898L5.7508 18.2551C5.74908 18.2923 5.75013 18.3296 5.75396 18.3667L6.5 18.2898ZM7.287 18.9768L7.31152 19.7264C7.36154 19.7247 7.41126 19.7181 7.45996 19.7065L7.287 18.9768ZM10.287 18.2658L10.46 18.9956L10.4716 18.9927L10.287 18.2658ZM10.672 18.0218L11.2506 18.4991L11.2571 18.491L10.672 18.0218ZM17.2971 10.959C17.5562 10.6358 17.5043 10.1638 17.1812 9.90466C16.8581 9.64552 16.386 9.69742 16.1269 10.0206L17.2971 10.959ZM12.1269 7.02052C11.8678 7.34365 11.9196 7.81568 12.2428 8.07484C12.5659 8.33399 13.0379 8.28213 13.2971 7.95901L12.1269 7.02052ZM14.3 5.50976L14.8851 5.97901C14.8949 5.96672 14.9044 5.95412 14.9135 5.94123L14.3 5.50976ZM15.929 5.18976L16.4088 4.61332C16.3849 4.59344 16.3598 4.57507 16.3337 4.5583L15.929 5.18976ZM18.166 7.05176L18.6968 6.52192C18.6805 6.50561 18.6635 6.49007 18.6458 6.47532L18.166 7.05176ZM18.5029 7.87264L19.2529 7.87676V7.87676L18.5029 7.87264ZM18.157 8.68976L17.632 8.15412C17.6108 8.17496 17.5908 8.19704 17.5721 8.22025L18.157 8.68976ZM16.1271 10.0203C15.8678 10.3433 15.9195 10.8153 16.2425 11.0746C16.5655 11.3339 17.0376 11.2823 17.2969 10.9593L16.1271 10.0203ZM13.4537 7.37862C13.3923 6.96898 13.0105 6.68666 12.6009 6.74805C12.1912 6.80943 11.9089 7.19127 11.9703 7.60091L13.4537 7.37862ZM16.813 11.2329C17.2234 11.1772 17.5109 10.7992 17.4552 10.3888C17.3994 9.97834 17.0215 9.69082 16.611 9.74659L16.813 11.2329ZM12.1238 7.02072L6.22577 14.3797L7.39623 15.3178L13.2942 7.95881L12.1238 7.02072ZM6.24297 14.359C6.03561 14.5995 5.91226 14.9011 5.89159 15.218L7.38841 15.3156C7.38786 15.324 7.38457 15.3321 7.37903 15.3385L6.24297 14.359ZM5.8908 15.2321L5.7508 18.2551L7.2492 18.3245L7.3892 15.3015L5.8908 15.2321ZM5.75396 18.3667C5.83563 19.1586 6.51588 19.7524 7.31152 19.7264L7.26248 18.2272C7.25928 18.2273 7.25771 18.2268 7.25669 18.2264C7.25526 18.2259 7.25337 18.2249 7.25144 18.2232C7.2495 18.2215 7.24825 18.2198 7.24754 18.2185C7.24703 18.2175 7.24637 18.216 7.24604 18.2128L5.75396 18.3667ZM7.45996 19.7065L10.46 18.9955L10.114 17.536L7.11404 18.247L7.45996 19.7065ZM10.4716 18.9927C10.7771 18.9151 11.05 18.7422 11.2506 18.499L10.0934 17.5445C10.0958 17.5417 10.0989 17.5397 10.1024 17.5388L10.4716 18.9927ZM11.2571 18.491L17.2971 10.959L16.1269 10.0206L10.0869 17.5526L11.2571 18.491ZM13.2971 7.95901L14.8851 5.97901L13.7149 5.04052L12.1269 7.02052L13.2971 7.95901ZM14.9135 5.94123C15.0521 5.74411 15.3214 5.6912 15.5243 5.82123L16.3337 4.5583C15.4544 3.99484 14.2873 4.2241 13.6865 5.0783L14.9135 5.94123ZM15.4492 5.7662L17.6862 7.6282L18.6458 6.47532L16.4088 4.61332L15.4492 5.7662ZM17.6352 7.58161C17.7111 7.6577 17.7535 7.761 17.7529 7.86852L19.2529 7.87676C19.2557 7.36905 19.0555 6.88127 18.6968 6.52192L17.6352 7.58161ZM17.7529 7.86852C17.7524 7.97604 17.7088 8.07886 17.632 8.15412L18.682 9.22541C19.0446 8.87002 19.2501 8.38447 19.2529 7.87676L17.7529 7.86852ZM17.5721 8.22025L16.1271 10.0203L17.2969 10.9593L18.7419 9.15928L17.5721 8.22025ZM11.9703 7.60091C12.3196 9.93221 14.4771 11.5503 16.813 11.2329L16.611 9.74659C15.0881 9.95352 13.6815 8.89855 13.4537 7.37862L11.9703 7.60091Z\" />\n </svg>\n );\n}\n","export function LinkIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n {...props}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\"\n />\n </svg>\n );\n}\n","export function HistoryIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n className=\"lucide lucide-trash-icon lucide-trash\"\n >\n <path\n d=\"M5.52786 16.7023C6.6602 18.2608 8.3169 19.3584 10.1936 19.7934C12.0703 20.2284 14.0409 19.9716 15.7434 19.0701C17.446 18.1687 18.766 16.6832 19.4611 14.8865C20.1562 13.0898 20.1796 11.1027 19.527 9.29011C18.8745 7.47756 17.5898 5.96135 15.909 5.02005C14.2282 4.07875 12.2641 3.77558 10.3777 4.16623C8.49129 4.55689 6.80919 5.61514 5.64045 7.14656C4.47171 8.67797 3.89482 10.5797 4.01579 12.5023M4.01579 12.5023L2.51579 11.0023M4.01579 12.5023L5.51579 11.0023\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 8V12L15 15\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export function AddIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n >\n <path\n d=\"M4 12H20M12 4V20\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n );\n}\n","import { CautionIcon } from \"./icons/caution.js\";\nimport { ChevronDownIcon } from \"./icons/chevron-down-icon.js\";\nimport { DeleteIcon } from \"./icons/delete-icon.js\";\nimport { EditIcon } from \"./icons/edit-icon.js\";\nimport { LinkIcon } from \"./icons/link-icon.js\";\nimport { HistoryIcon } from \"./icons/history.js\";\nimport { AddIcon } from \"./icons/add-icon.js\";\n\nconst icons = {\n caution: CautionIcon,\n chevronDown: ChevronDownIcon,\n delete: DeleteIcon,\n edit: EditIcon,\n link: LinkIcon,\n history: HistoryIcon,\n add: AddIcon,\n};\n\n// copied from tailwind line height https://tailwindcss.com/docs/font-size\nconst sizes = {\n \"2xs\": 14,\n xs: 16,\n sm: 20,\n md: 24,\n lg: 28,\n xl: 28,\n \"2xl\": 32,\n \"3xl\": 36,\n \"4xl\": 40,\n \"5xl\": 48,\n \"6xl\": 60,\n \"7xl\": 72,\n \"8xl\": 96,\n \"9xl\": 128,\n};\n\nconst strokeWidths = {\n \"2xs\": 2.5,\n xs: 2,\n sm: 2,\n md: 1.5,\n lg: 1.5,\n xl: 1.5,\n \"2xl\": 1.25,\n \"3xl\": 1.25,\n \"4xl\": 1.25,\n \"5xl\": 1,\n \"6xl\": 1,\n \"7xl\": 1,\n \"8xl\": 1,\n \"9xl\": 1,\n};\n\nexport function Icon({\n name,\n size = \"md\",\n className,\n ...svgProps\n}: {\n name?: keyof typeof icons;\n size?: keyof typeof sizes;\n} & React.SVGProps<SVGSVGElement>) {\n if (!name || !icons.hasOwnProperty(name)) {\n throw new Error(`Icon not found: ${name}`);\n }\n\n // @ts-ignore\n const IconComponent = icons?.hasOwnProperty(name) ? icons[name] : icon;\n\n return (\n <IconComponent\n aria-hidden=\"true\"\n size={sizes[size]}\n strokeWidth={strokeWidths[size]}\n strokeLinecap=\"round\"\n {...svgProps}\n />\n );\n}\n","import { LocalNode, RawCoValue } from \"cojson\";\nimport { JsonValue } from \"cojson\";\nimport { useState } from \"react\";\nimport { styled } from \"goober\";\nimport { Button } from \"../ui/button.js\";\nimport { Select } from \"../ui/select.js\";\n\ntype ValueType =\n | \"number\"\n | \"string\"\n | \"true\"\n | \"false\"\n | \"object\"\n | \"null\"\n | \"undefined\";\n\nexport function CoValueEditor({\n node,\n property,\n value,\n coValue,\n onCancel,\n}: {\n node: LocalNode;\n property: string;\n value: JsonValue | undefined;\n coValue: RawCoValue;\n onCancel: () => void;\n}) {\n const getInitialType = (): ValueType => {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (typeof value === \"object\") return \"object\";\n return \"undefined\";\n };\n\n const [selectedType, setSelectedType] = useState<ValueType>(getInitialType());\n const [editValue, setEditValue] = useState(\n value === undefined || value === null\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value, null, 2)\n : String(value),\n );\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n let newValue;\n switch (selectedType) {\n case \"null\":\n newValue = null;\n break;\n case \"undefined\":\n newValue = undefined;\n break;\n case \"true\":\n newValue = true;\n break;\n case \"false\":\n newValue = false;\n break;\n case \"number\":\n newValue = parseFloat(editValue);\n break;\n case \"string\":\n newValue = editValue;\n break;\n case \"object\":\n newValue = JSON.parse(editValue);\n break;\n default:\n throw new Error(`Invalid type: ${selectedType}`);\n }\n\n coValue.core.makeTransaction(\n [\n {\n op: \"set\",\n key: property,\n value: newValue,\n },\n ],\n \"private\",\n );\n\n onCancel();\n };\n\n const showTextarea =\n selectedType === \"number\" ||\n selectedType === \"string\" ||\n selectedType === \"object\";\n\n return (\n <EditForm onSubmit={handleSubmit}>\n <Select\n label=\"Type\"\n value={selectedType}\n onChange={(e) => {\n setSelectedType(e.target.value as ValueType);\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <option value=\"number\">number</option>\n <option value=\"string\">string</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n <option value=\"object\">object</option>\n <option value=\"null\">null</option>\n <option value=\"undefined\">undefined</option>\n </Select>\n {showTextarea && (\n <StyledTextarea\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n <FormActions>\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\">\n Submit\n </Button>\n </FormActions>\n </EditForm>\n );\n}\n\nconst EditForm = styled(\"form\")`\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n`;\n\nconst StyledTextarea = styled(\"textarea\")`\n width: 100%;\n min-height: 120px;\n border-radius: var(--j-radius-md);\n border: 1px solid var(--j-border-color);\n padding: 0.5rem 0.875rem;\n box-shadow: var(--j-shadow-sm);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.875rem;\n background-color: white;\n color: var(--j-text-color-strong);\n resize: vertical;\n\n @media (prefers-color-scheme: dark) {\n background-color: var(--j-foreground);\n }\n`;\n\nconst FormActions = styled(\"div\")`\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n`;\n","import { styled } from \"goober\";\nimport { useId } from \"react\";\nimport { Icon } from \"./icon.js\";\n\nconst SelectContainer = styled(\"div\")<{ className?: string }>`\n display: grid;\n gap: 0.25rem;\n`;\n\nconst SelectWrapper = styled(\"div\")`\n position: relative;\n display: flex;\n align-items: center;\n`;\n\nconst StyledSelect = styled(\"select\")`\n width: 100%;\n border-radius: var(--j-radius-md);\n border: 1px solid var(--j-border-color);\n padding: 0.5rem 0.875rem 0.5rem 0.875rem;\n padding-right: 2rem;\n box-shadow: var(--j-shadow-sm);\n font-weight: 500;\n color: var(--j-text-color-strong);\n appearance: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n @media (prefers-color-scheme: dark) {\n background-color: var(--j-foreground);\n }\n`;\n\nconst SelectIcon = styled(\"span\")`\n position: absolute;\n right: 0.5em;\n color: var(--j-neutral-400);\n pointer-events: none;\n\n @media (prefers-color-scheme: dark) {\n color: var(--j-neutral-900);\n }\n`;\n\nexport function Select(\n props: React.SelectHTMLAttributes<HTMLSelectElement> & {\n label: string;\n hideLabel?: boolean;\n },\n) {\n const { label, hideLabel, id: customId, className, ...selectProps } = props;\n const generatedId = useId();\n const id = customId || generatedId;\n\n return (\n <SelectContainer className={className}>\n <label htmlFor={id} className={hideLabel ? \"j-sr-only\" : \"\"}>\n {label}\n </label>\n\n <SelectWrapper>\n <StyledSelect {...selectProps} id={id}>\n {props.children}\n </StyledSelect>\n\n <SelectIcon>\n <Icon name=\"chevronDown\" size=\"sm\" />\n </SelectIcon>\n </SelectWrapper>\n </SelectContainer>\n );\n}\n","import { styled } from \"goober\";\nexport const Card = styled(\"div\")`\n background-color: var(--j-background);\n border-radius: var(--j-radius-lg);\n box-shadow: var(--j-shadow-sm);\n border: 1px solid var(--j-border-color);\n padding: 1rem;\n text-align: left;\n overflow-x: hidden;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n`;\n\nexport const CardHeader = styled(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nexport const CardBody = styled(\"div\")`\n flex: 1;\n`;\n","import { styled } from \"goober\";\n\nconst GridThreeColumns = styled(\"div\")`\n display: grid;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n gap: 1rem;\n \n @media (min-width: 768px) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n \n @media (min-width: 1280px) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n`;\n\nconst GridTwoColumns = styled(\"div\")`\n display: grid;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n gap: 1rem;\n \n @media (min-width: 768px) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n`;\n\nconst GridOneColumn = styled(\"div\")`\n display: grid;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n gap: 1rem;\n`;\n\nexport function Grid(\n props: React.HTMLAttributes<HTMLElement> & { cols: 1 | 2 | 3 },\n) {\n const { cols, children, ...rest } = props;\n\n switch (cols) {\n case 1:\n return <GridOneColumn {...rest}>{children}</GridOneColumn>;\n case 2:\n return <GridTwoColumns {...rest}>{children}</GridTwoColumns>;\n case 3:\n return <GridThreeColumns {...rest}>{children}</GridThreeColumns>;\n default:\n throw new Error(`Invalid number of columns: ${cols}`);\n }\n}\n","import { Role } from \"cojson\";\n\nexport function isWriter(role: Role | undefined): boolean {\n return (\n role === \"writer\" ||\n role === \"admin\" ||\n role === \"manager\" ||\n role === \"writeOnly\"\n );\n}\n","import { JsonObject } from \"cojson\";\nimport { useEffect, useState } from \"react\";\nimport { Button, Accordion } from \"../ui\";\nimport { Card, CardBody, CardHeader } from \"../ui/card.js\";\nimport { ValueRenderer } from \"./value-renderer.js\";\n\nfunction CopyButton({ data }: { data: JsonObject }) {\n const [copyCount, setCopyCount] = useState(0);\n const copied = copyCount > 0;\n const stringifiedData = JSON.stringify(data);\n\n useEffect(() => {\n if (copyCount > 0) {\n const timeout = setTimeout(() => setCopyCount(0), 1000);\n return () => {\n clearTimeout(timeout);\n };\n }\n }, [copyCount]);\n\n return (\n <Button\n style={{\n position: \"absolute\",\n top: \"10px\",\n right: \"10px\",\n }}\n onClick={() => {\n window.navigator.clipboard.writeText(stringifiedData).then(() => {\n setCopyCount((count) => count + 1);\n });\n }}\n variant=\"secondary\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </Button>\n );\n}\n\nexport function RawDataCard({ data }: { data: JsonObject }) {\n return (\n <Accordion title=\"Raw data\" storageKey=\"jazz-inspector-show-raw-data\">\n <Card style={{ position: \"relative\" }}>\n <CardHeader>\n <CopyButton data={data} />\n </CardHeader>\n <CardBody>\n <ValueRenderer json={data} />\n </CardBody>\n </Card>\n </Accordion>\n );\n}\n","import { styled } from \"goober\";\nimport { forwardRef, useEffect, useRef } from \"react\";\nimport { Button } from \"./button.js\";\nimport { Heading } from \"./heading.js\";\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n heading: string;\n text?: string;\n children?: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm?: () => void;\n onCancel?: () => void;\n showButtons?: boolean;\n className?: string;\n wide?: boolean;\n}\n\nconst ModalContent = styled(\"dialog\")<{ wide?: boolean }>`\n background-color: var(--j-background);\n border-radius: var(--j-radius-lg);\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);\n border: 1px solid var(--j-border-color);\n ${(props) => (props.wide ? \"max-width: 60vw;\" : \"max-width: 32rem;\")}\n margin-block: auto;\n margin-inline: auto;\n &::backdrop {\n background-color: rgba(0, 0, 0, 0.7);\n }\n\n`;\n\nconst ModalHeader = styled(\"div\")`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 0 1.5rem;\n gap: 1rem;\n`;\n\nconst ModalBody = styled(\"div\")`\n padding: 1rem 1.5rem;\n flex: 1;\n`;\n\nconst ModalFooter = styled(\"div\")`\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 0 1.5rem 1.5rem 1.5rem;\n`;\n\nconst CloseButton = styled(\"button\")`\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n border-radius: var(--j-radius-sm);\n color: var(--j-text-color);\n font-size: 1.25rem;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n min-height: 2rem;\n\n &:hover {\n background-color: var(--j-foreground);\n }\n\n &:focus-visible {\n outline: 2px solid var(--j-border-focus);\n outline-offset: 2px;\n }\n`;\n\nexport const Modal = forwardRef<HTMLDialogElement, ModalProps>(\n (\n {\n isOpen,\n onClose,\n heading,\n text,\n children,\n confirmText = \"Confirm\",\n cancelText = \"Cancel\",\n onConfirm,\n onCancel,\n showButtons = true,\n className,\n wide = false,\n },\n ref,\n ) => {\n const modalRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n if (isOpen) {\n modalRef.current?.showModal();\n } else {\n onClose();\n modalRef.current?.close();\n }\n }, [isOpen, onClose]);\n\n const handleConfirm = () => {\n onConfirm?.();\n onClose();\n };\n\n const handleCancel = () => {\n onCancel?.();\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalContent\n ref={ref || modalRef}\n className={className}\n role=\"dialog\"\n aria-labelledby=\"modal-heading\"\n onClose={onClose}\n wide={wide}\n >\n <ModalHeader>\n <Heading id=\"modal-heading\">{heading}</Heading>\n <CloseButton onClick={onClose} aria-label=\"Close modal\" type=\"button\">\n ×\n </CloseButton>\n </ModalHeader>\n\n <ModalBody>\n {text && (\n <p style={{ margin: \"0 0 1rem 0\", color: \"var(--j-text-color)\" }}>\n {text}\n </p>\n )}\n {children}\n </ModalBody>\n\n {showButtons && (\n <ModalFooter>\n <Button variant=\"secondary\" onClick={handleCancel}>\n {cancelText}\n </Button>\n <Button variant=\"primary\" onClick={handleConfirm}>\n {confirmText}\n </Button>\n </ModalFooter>\n )}\n </ModalContent>\n );\n },\n);\n\nModal.displayName = \"Modal\";\n","import { styled } from \"goober\";\nimport { forwardRef, useId } from \"react\";\n\ninterface LabelProps {\n hideLabel?: boolean;\n}\n\ninterface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n LabelProps {\n // label can be hidden with a \"label:sr-only\" className\n label: string;\n className?: string;\n id?: string;\n}\n\nconst Container = styled(\"div\")`\n display: grid;\n gap: 0.25rem;\n`;\n\nconst StyledInput = styled(\"input\")`\n width: 100%;\n border-radius: var(--j-radius-md);\n border: 1px solid var(--j-border-color);\n padding: 0.5rem 0.875rem;\n box-shadow: var(--j-shadow-sm);\n font-weight: 500;\n background-color: white;\n color: var(--j-text-color-strong);\n\n @media (prefers-color-scheme: dark) {\n background-color: var(--j-foreground);\n }\n`;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ label, className, hideLabel, id: customId, ...inputProps }, ref) => {\n const generatedId = useId();\n const id = customId || generatedId;\n\n return (\n <Container className={className}>\n <label\n htmlFor={id}\n className={hideLabel ? \"j-sr-only\" : \"\"}\n style={{ color: \"var(--j-text-color)\" }}\n >\n {label}\n </label>\n <StyledInput ref={ref} {...inputProps} id={id} />\n </Container>\n );\n },\n);\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\n\nexport type ColumnDef<T> = {\n id: string;\n header: string;\n accessor: (row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n sortFn?: (a: T, b: T) => number;\n filterFn?: (row: T, filterValue: string) => boolean;\n};\n\nexport type SortConfig = {\n columnId: string;\n direction: \"asc\" | \"desc\";\n} | null;\n\nexport type DataTableProps<T> = {\n columns: ColumnDef<T>[];\n data: T[];\n pageSize?: number;\n initialSort?: SortConfig;\n getRowKey: (row: T, index: number) => string;\n emptyMessage?: string;\n};\n\nexport function DataTable<T>({\n columns,\n data,\n pageSize = 10,\n initialSort = null,\n getRowKey,\n emptyMessage = \"No data available\",\n}: DataTableProps<T>) {\n const [currentPage, setCurrentPage] = useState(1);\n const [sortConfig, setSortConfig] = useState<SortConfig>(initialSort);\n const [filters, setFilters] = useState<Record<string, string>>({});\n\n // Apply filtering\n const filteredData = useMemo(() => {\n return data.filter((row) => {\n return Object.entries(filters).every(([columnId, filterValue]) => {\n if (!filterValue) return true;\n\n const column = columns.find((col) => col.id === columnId);\n if (!column?.filterable) return true;\n\n if (column.filterFn) {\n return column.filterFn(row, filterValue);\n }\n\n // Default filter: convert to string and check inclusion\n const cellValue = String(column.accessor(row));\n return cellValue.toLowerCase().includes(filterValue.toLowerCase());\n });\n });\n }, [data, filters, columns]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n if (!sortConfig) return filteredData;\n\n const column = columns.find((col) => col.id === sortConfig.columnId);\n if (!column?.sortable) return filteredData;\n\n const sorted = [...filteredData].sort((a, b) => {\n if (column.sortFn) {\n return column.sortFn(a, b);\n }\n\n // Default sort: compare string values\n const aValue = String(column.accessor(a));\n const bValue = String(column.accessor(b));\n return aValue.localeCompare(bValue);\n });\n\n return sortConfig.direction === \"desc\" ? sorted.reverse() : sorted;\n }, [filteredData, sortConfig, columns]);\n\n // Calculate pagination\n const totalPages = Math.ceil(sortedData.length / pageSize);\n const showPagination = sortedData.length > pageSize;\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const paginatedData = sortedData.slice(startIndex, endIndex);\n\n // Reset to page 1 when filters change\n useEffect(() => {\n setCurrentPage(1);\n }, [filters]);\n\n const handleSort = (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n setSortConfig((current) => {\n if (current?.columnId === columnId) {\n if (current.direction === \"asc\") {\n return { columnId, direction: \"desc\" };\n }\n return null; // Remove sorting\n }\n return { columnId, direction: \"asc\" };\n });\n };\n\n const handleFilterChange = (columnId: string, value: string) => {\n setFilters((current) => ({\n ...current,\n [columnId]: value,\n }));\n };\n\n const handlePageChange = (page: number) => {\n setCurrentPage(Math.max(1, Math.min(page, totalPages)));\n };\n\n return (\n <>\n <Table>\n <TableHead>\n <TableRow>\n {columns.map((column) => (\n <TableHeader key={column.id}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n cursor: column.sortable ? \"pointer\" : \"default\",\n }}\n onClick={() => handleSort(column.id)}\n >\n <span>{column.header}</span>\n {column.sortable && (\n <span\n style={{\n fontSize: \"12px\",\n opacity: 0.7,\n }}\n >\n {sortConfig?.columnId === column.id\n ? sortConfig.direction === \"asc\"\n ? \"↑\"\n : \"↓\"\n : \"↕\"}\n </span>\n )}\n </div>\n </TableHeader>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {columns.some((column) => column.filterable) && (\n <TableRow>\n {columns.map((column) => (\n <TableCell key={column.id}>\n {column.filterable && (\n <Input\n label=\"Filter\"\n hideLabel\n type=\"search\"\n placeholder={`Filter ${column.header.toLowerCase()}`}\n value={filters[column.id] || \"\"}\n onChange={(e) =>\n handleFilterChange(column.id, e.target.value)\n }\n onClick={(e) => e.stopPropagation()}\n />\n )}\n </TableCell>\n ))}\n </TableRow>\n )}\n {paginatedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length}>\n <div\n style={{\n textAlign: \"center\",\n padding: \"20px\",\n opacity: 0.6,\n }}\n >\n {emptyMessage}\n </div>\n </TableCell>\n </TableRow>\n ) : (\n paginatedData.map((row, index) => (\n <TableRow key={getRowKey(row, startIndex + index)}>\n {columns.map((column) => (\n <TableCell key={column.id}>{column.accessor(row)}</TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n\n {showPagination && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: \"16px\",\n padding: \"8px 0\",\n }}\n >\n <div style={{ fontSize: \"14px\", opacity: 0.7 }}>\n Showing {startIndex + 1} to {Math.min(endIndex, sortedData.length)}{\" \"}\n of {sortedData.length} entries\n {Object.keys(filters).some((key) => filters[key]) &&\n ` (filtered from ${data.length})`}\n </div>\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <Button\n variant=\"secondary\"\n onClick={() => handlePageChange(1)}\n disabled={currentPage === 1}\n >\n ««\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n >\n «\n </Button>\n <span style={{ fontSize: \"14px\" }}>\n Page {currentPage} of {totalPages}\n </span>\n <Button\n variant=\"secondary\"\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n >\n »\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => handlePageChange(totalPages)}\n disabled={currentPage === totalPages}\n >\n »»\n </Button>\n </div>\n </div>\n )}\n </>\n );\n}\n","import { styled } from \"goober\";\nimport React from \"react\";\n\nconst StyledTable = styled(\"table\")`\n width: 100%;\n`;\n\nconst StyledThead = styled(\"thead\")`\n text-align: left;\n border-bottom: 1px solid var(--j-border-color);\n background-color: var(--j-neutral-100);\n\n @media (prefers-color-scheme: dark) {\n background-color: var(--j-neutral-925);\n }\n`;\n\nconst StyledTbody = styled(\"tbody\")`\n tr {\n border-bottom: 1px solid var(--j-border-color);\n\n &:last-child {\n border-bottom: none;\n }\n }\n`;\n\nconst StyledTh = styled(\"th\")`\n font-weight: 500;\n padding: 0.5rem 0.75rem;\n color: var(--j-text-color-strong);\n`;\n\nconst StyledTd = styled(\"td\")`\n padding: 0.5rem 0.75rem;\n`;\n\nexport const Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ children, ...props }, ref) => (\n <StyledTable ref={ref} {...props}>\n {children}\n </StyledTable>\n));\n\nexport const TableHead = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ children, ...props }, ref) => (\n <StyledThead ref={ref} {...props}>\n {children}\n </StyledThead>\n));\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ children, ...props }, ref) => (\n <StyledTbody ref={ref} {...props}>\n {children}\n </StyledTbody>\n));\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ children, ...props }, ref) => (\n <tr ref={ref} {...props}>\n {children}\n </tr>\n));\n\nexport const TableHeader = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ children, ...props }, ref) => (\n <StyledTh ref={ref} {...props}>\n {children}\n </StyledTh>\n));\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ children, ...props }, ref) => (\n <StyledTd ref={ref} {...props}>\n {children}\n </StyledTd>\n));\n","import { styled } from \"goober\";\nimport { PropsWithChildren, useEffect, useState } from \"react\";\n\ntype AccordionProps = PropsWithChildren<{\n title: string;\n storageKey: string;\n}>;\n\nexport function Accordion({ title, children, storageKey }: AccordionProps) {\n const [open, setOpen] = useStoragedState(storageKey, false);\n\n return (\n <details\n open={open}\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}\n >\n <StyledSummary\n onClick={(e) => {\n e.preventDefault();\n setOpen((v) => !v);\n }}\n >\n {title}\n </StyledSummary>\n {children}\n </details>\n );\n}\n\nfunction useStoragedState<T>(\n key: string,\n defaultValue: T,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n const [state, setState] = useState<T>(() => {\n if (typeof window === \"undefined\") return defaultValue;\n const stored = localStorage.getItem(key);\n return stored ? JSON.parse(stored) : defaultValue;\n });\n\n useEffect(() => {\n localStorage.setItem(key, JSON.stringify(state));\n }, [state]);\n\n return [state, setState];\n}\n\nconst StyledSummary = styled(\"summary\")`\n font-size: 1.125rem;\n cursor: pointer;\n font-weight: 500;\n color: var(--j-text-color-strong);\n`;\n","import { JsonObject, LocalNode } from \"cojson\";\nimport { GridView } from \"./grid-view.js\";\nimport { RawDataCard } from \"./raw-data-card.js\";\nimport { PageInfo } from \"./types.js\";\n\nexport function AccountView({\n data,\n onNavigate,\n node,\n}: {\n data: JsonObject;\n onNavigate: (pages: PageInfo[]) => void;\n node: LocalNode;\n}) {\n const readableData = { ...data };\n\n for (const key in readableData) {\n if (\n key === \"readKey\" ||\n key.startsWith(\"sealer_z\") ||\n key.startsWith(\"key_z\")\n ) {\n delete readableData[key];\n }\n }\n\n return (\n <>\n <GridView data={readableData} onNavigate={onNavigate} node={node} />\n\n <RawDataCard data={data} />\n </>\n );\n}\n","import { JsonObject, LocalNode, RawCoPlainText } from \"cojson\";\nimport { useState } from \"react\";\nimport { styled } from \"goober\";\nimport { CoPlainText } from \"jazz-tools\";\nimport { isWriter } from \"../utils/permissions.js\";\nimport { Button } from \"../ui/button.js\";\nimport { RawDataCard } from \"./raw-data-card.js\";\nimport { Icon } from \"../ui/icon.js\";\n\nexport function CoPlainTextView({\n data,\n coValue,\n}: {\n data: JsonObject;\n coValue: RawCoPlainText;\n node: LocalNode;\n}) {\n const currentText = Object.values(data).join(\"\");\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const canEdit = isWriter(coValue.group.myRole());\n\n const handleEditClick = () => {\n setIsEditing(true);\n setEditValue(currentText);\n };\n\n const handleCancel = () => {\n setIsEditing(false);\n setEditValue(currentText);\n };\n\n const handleSave = (e: React.FormEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const coPlainText = CoPlainText.fromRaw(coValue);\n coPlainText.$jazz.applyDiff(editValue);\n\n setIsEditing(false);\n };\n\n if (!data) return;\n\n if (isEditing) {\n return (\n <>\n <EditForm onSubmit={handleSave}>\n <StyledTextarea\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n <FormActions>\n <Button type=\"button\" variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\">\n Save\n </Button>\n </FormActions>\n </EditForm>\n <RawDataCard data={data} />\n </>\n );\n }\n\n return (\n <>\n <p>{currentText}</p>\n <div>\n {canEdit && (\n <Button variant=\"secondary\" onClick={handleEditClick} title=\"Edit\">\n <Icon name=\"edit\" />\n </Button>\n )}\n </div>\n <RawDataCard data={data} />\n </>\n );\n}\n\nconst EditForm = styled(\"form\")`\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n`;\n\nconst StyledTextarea = styled(\"textarea\")`\n width: 100%;\n min-height: 120px;\n border-radius: var(--j-radius-md);\n border: 1px solid var(--j-border-color);\n padding: 0.5rem 0.875rem;\n box-shadow: var(--j-shadow-sm);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.875rem;\n background-color: white;\n color: var(--j-text-color-strong);\n resize: vertical;\n\n @media (prefers-color-scheme: dark) {\n background-color: var(--j-foreground);\n }\n`;\n\nconst FormActions = styled(\"div\")`\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n`;\n","import {\n Everyone,\n JsonObject,\n LocalNode,\n RawAccount,\n RawCoValue,\n RawGroup,\n} from \"cojson\";\nimport { CoID } from \"cojson\";\nimport { useState } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table.js\";\nimport { AccountOrGroupText } from \"./account-or-group-text.js\";\nimport { RawDataCard } from \"./raw-data-card.js\";\nimport { PageInfo, isCoId } from \"./types.js\";\nimport { Button, Icon, Modal, Input, Select } from \"../ui/index.js\";\n\nfunction partitionMembers(data: Record<string, string>) {\n const everyone = Object.entries(data)\n .filter(([key]) => key === \"everyone\")\n .map(([key, value]) => ({\n id: key as CoID<RawCoValue>,\n role: value as string,\n }));\n\n const members = Object.entries(data)\n .filter(([key]) => isCoId(key))\n .map(([key, value]) => ({\n id: key as CoID<RawCoValue>,\n role: value,\n }));\n\n const parentGroups = Object.entries(data)\n .filter(([key]) => key.startsWith(\"parent_co_\"))\n .map(([key, value]) => ({\n id: key.slice(7) as CoID<RawCoValue>,\n role: value,\n }));\n\n const childGroups = Object.entries(data)\n .filter(\n ([key, value]) => key.startsWith(\"child_co_\") && value !== \"revoked\",\n )\n .map(([key, value]) => ({\n id: key.slice(6) as CoID<RawCoValue>,\n role: value,\n }));\n\n return { everyone, members, parentGroups, childGroups };\n}\n\nexport function GroupView({\n coValue,\n data,\n onNavigate,\n node,\n}: {\n coValue: RawCoValue;\n data: JsonObject;\n onNavigate: (pages: PageInfo[]) => void;\n node: LocalNode;\n}) {\n const [addMemberType, setAddMemberType] = useState<\n null | \"account\" | \"group\"\n >(null);\n\n const { everyone, members, parentGroups, childGroups } = partitionMembers(\n data as Record<string, string>,\n );\n\n const onRemoveMember = async (id: CoID<RawCoValue>) => {\n if (confirm(\"Are you sure you want to remove this member?\") === false) {\n return;\n }\n try {\n const group = await node.load(coValue.id);\n if (group === \"unavailable\") {\n throw new Error(\"Group not found\");\n }\n const rawGroup = group as RawGroup;\n rawGroup.removeMember(id as any);\n } catch (error) {\n console.error(error);\n throw error;\n }\n };\n\n const onRemoveGroup = async (id: CoID<RawCoValue>) => {\n if (confirm(\"Are you sure you want to remove this group?\") === false) {\n return;\n }\n try {\n const group = await node.load(coValue.id);\n if (group === \"unavailable\") {\n throw new Error(\"Group not found\");\n }\n const rawGroup = group as RawGroup;\n const targetGroup = await node.load(id);\n if (targetGroup === \"unavailable\") {\n throw new Error(\"Group not found\");\n }\n const rawTargetGroup = targetGroup as RawGroup;\n rawGroup.revokeExtend(rawTargetGroup);\n } catch (error) {\n console.error(error);\n throw error;\n }\n };\n\n const handleAddMemberSubmit = async (\n event: React.FormEvent<HTMLFormElement>,\n ) => {\n event.preventDefault();\n const form = event.currentTarget;\n\n const memberId = (form.elements.namedItem(\"memberId\") as HTMLInputElement)\n ?.value;\n const role = (form.elements.namedItem(\"role\") as HTMLSelectElement)?.value;\n\n try {\n const group = await node.load(coValue.id);\n if (group === \"unavailable\") {\n throw new Error(\"Group not found\");\n }\n\n const rawGroup = group as RawGroup;\n\n // Adding an account\n if (addMemberType === \"account\") {\n let rawAccount: RawAccount | Everyone = \"everyone\";\n\n if (memberId !== \"everyone\") {\n const account = await node.load(memberId as CoID<RawCoValue>);\n if (account === \"unavailable\") {\n throw new Error(\"Account not found\");\n }\n rawAccount = account as RawAccount;\n }\n\n rawGroup.addMember(rawAccount, role as \"reader\" | \"writer\" | \"admin\");\n }\n // Adding a group\n else if (addMemberType === \"group\") {\n const targetGroup = await node.load(memberId as CoID<RawCoValue>);\n if (targetGroup === \"unavailable\") {\n throw new Error(\"Group not found\");\n }\n\n const rawTargetGroup = targetGroup as RawGroup;\n rawGroup.extend(\n rawTargetGroup,\n role as \"reader\" | \"writer\" | \"admin\" | \"inherit\",\n );\n }\n\n setAddMemberType(null);\n } catch (error: any) {\n console.error(error);\n alert(`Failed to add ${addMemberType}: ${error.message}`);\n }\n };\n\n return (\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeader>Member</TableHeader>\n <TableHeader>Permission</TableHeader>\n <TableHeader></TableHeader>\n </TableRow>\n </TableHead>\n <TableBody>\n {everyone.map((member) => (\n <TableRow key={member.id}>\n <TableCell>{member.id}</TableCell>\n <TableCell>{member.role}</TableCell>\n <TableCell>\n {member.role !== \"revoked\" && (\n <Button\n variant=\"secondary\"\n onClick={() => onRemoveMember(member.id)}\n >\n <Icon name=\"delete\" />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n {members.map((member) => (\n <TableRow key={member.id}>\n <TableCell>\n <AccountOrGroupText\n coId={member.id}\n node={node}\n showId\n onClick={() => {\n onNavigate([{ coId: member.id, name: member.id }]);\n }}\n />\n </TableCell>\n <TableCell>{member.role}</TableCell>\n <TableCell>\n {member.role !== \"revoked\" && (\n <Button\n variant=\"secondary\"\n onClick={() => onRemoveMember(member.id)}\n >\n <Icon name=\"delete\" />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n {parentGroups.map((group) => (\n <TableRow key={group.id}>\n <TableCell>\n <AccountOrGroupText\n coId={group.id}\n node={node}\n showId\n onClick={() => {\n onNavigate([{ coId: group.id, name: group.id }]);\n }}\n />\n </TableCell>\n <TableCell>{group.role}</TableCell>\n <TableCell>\n {group.role !== \"revoked\" && (\n <Button\n variant=\"secondary\"\n onClick={() => onRemoveGroup(group.id)}\n >\n <Icon name=\"delete\" />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"0.75rem\",\n marginTop: \"1rem\",\n }}\n >\n <Button variant=\"primary\" onClick={() => setAddMemberType(\"account\")}>\n Add Account\n </Button>\n <Button variant=\"primary\" onClick={() => setAddMemberType(\"group\")}>\n Add Group\n </Button>\n </div>\n\n {childGroups.length > 0 && (\n <Table>\n <TableHead>\n <TableRow>\n <TableHeader>Member of</TableHeader>\n </TableRow>\n </TableHead>\n <TableBody>\n {childGroups.map((group) => (\n <TableRow key={group.id}>\n <TableCell>\n <AccountOrGroupText\n coId={group.id}\n node={node}\n showId\n onClick={() => {\n onNavigate([{ coId: group.id, name: group.id }]);\n }}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n\n <RawDataCard data={data} />\n\n <Modal\n isOpen={addMemberType !== null}\n onClose={() => setAddMemberType(null)}\n heading={addMemberType === \"account\" ? \"Add Account\" : \"Add Group\"}\n showButtons={false}\n >\n <form onSubmit={handleAddMemberSubmit}>\n <div\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}\n >\n <Input\n name=\"memberId\"\n label={addMemberType === \"account\" ? \"Account ID\" : \"Group ID\"}\n placeholder={\n addMemberType === \"account\"\n ? \"Enter account ID\"\n : \"Enter group ID\"\n }\n required\n />\n <Select name=\"role\" label=\"Role\">\n <option value=\"reader\">Reader</option>\n <option value=\"writer\">Writer</option>\n <option value=\"admin\">Admin</option>\n {addMemberType === \"account\" ? (\n <>\n <option value=\"writeOnly\">Write Only</option>\n </>\n ) : (\n <>\n <option value=\"inherit\">Inherit</option>\n </>\n )}\n </Select>\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n marginTop: \"0.5rem\",\n }}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setAddMemberType(null)}\n >\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\">\n Add\n </Button>\n </div>\n </div>\n </form>\n </Modal>\n </>\n );\n}\n","import { LocalNode, RawCoValue } from \"cojson\";\nimport { Text } from \"../ui/text.js\";\nimport { useResolvedCoValue } from \"./use-resolve-covalue.js\";\n\nexport function RoleDisplay({\n node,\n value,\n}: {\n node: LocalNode;\n value: RawCoValue;\n}) {\n const { snapshot } = useResolvedCoValue(value.group.id, node);\n\n if (!snapshot || snapshot === \"unavailable\") {\n return null;\n }\n\n let role;\n\n if (value.group.id == node.getCurrentAgent().id) {\n role = \"owner\";\n } else if (snapshot[node.getCurrentAgent().id]) {\n role = snapshot[node.getCurrentAgent().id] as string;\n } else if (snapshot.everyone) {\n role = snapshot.everyone as string;\n } else {\n role = \"unauthorized\";\n }\n\n return <Text>Role: {role}</Text>;\n}\n","import { CoID, LocalNode, RawCoValue } from \"cojson\";\nimport type { JsonObject } from \"cojson\";\nimport { styled } from \"goober\";\nimport { useMemo, useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { PageInfo, isCoId } from \"./types.js\";\nimport { useResolvedCoValues } from \"./use-resolve-covalue.js\";\nimport { ValueRenderer } from \"./value-renderer.js\";\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table.js\";\nimport { Text } from \"../ui/text.js\";\nimport { Icon } from \"../ui/icon.js\";\n\nconst PaginationContainer = styled(\"div\")`\n padding: 1rem 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n`;\n\nconst RedTooltip = styled(\"span\")`\n position:relative; /* making the .tooltip span a container for the tooltip text */\n border-bottom:1px dashed #000; /* little indicater to indicate it's hoverable */\n\n &:before {\n content: attr(data-text);\n background-color: red;\n position:absolute;\n\n /* vertically center */\n top:50%;\n transform:translateY(-50%);\n\n /* move to right */\n left:100%;\n margin-left:15px; /* and add a small left margin */\n\n /* basic styles */\n width:200px;\n padding:10px;\n border-radius:10px;\n color: #fff;\n text-align:center;\n\n display:none; /* hide by default */\n }\n\n &:hover:before {\n display:block;\n }\n`;\n\nfunction CoValuesTableView({\n data,\n node,\n onNavigate,\n onRemove,\n}: {\n data: JsonObject;\n node: LocalNode;\n onNavigate: (pages: PageInfo[]) => void;\n onRemove?: (index: number) => void;\n}) {\n const [visibleRowsCount, setVisibleRowsCount] = useState(10);\n const [coIdArray, visibleRows] = useMemo(() => {\n const coIdArray = Array.isArray(data)\n ? data\n : Object.values(data).every((k) => typeof k === \"string\" && isCoId(k))\n ? Object.values(data).map((k) => k as CoID<RawCoValue>)\n : [];\n\n const visibleRows = coIdArray.slice(0, visibleRowsCount);\n\n return [coIdArray, visibleRows];\n }, [data, visibleRowsCount]);\n const resolvedRows = useResolvedCoValues(visibleRows, node);\n\n const hasMore = visibleRowsCount < coIdArray.length;\n\n if (!coIdArray.length) {\n return <div>No data to display</div>;\n }\n\n if (resolvedRows.length === 0) {\n return <div>Loading...</div>;\n }\n\n const keys = Array.from(\n new Set(\n resolvedRows\n .filter((item) => item.snapshot !== \"unavailable\")\n .flatMap((item) => Object.keys(item.snapshot || {})),\n ),\n );\n\n const loadMore = () => {\n setVisibleRowsCount((prevVisibleRows) => prevVisibleRows + 10);\n };\n\n return (\n <>\n <Table>\n <TableHead>\n <TableRow>\n {[\"ID\", ...keys, \"Action\"].map((key) => (\n <TableHeader key={key}>{key}</TableHeader>\n ))}\n {onRemove && <TableHeader></TableHeader>}\n </TableRow>\n </TableHead>\n <TableBody>\n {resolvedRows.slice(0, visibleRowsCount).map((item, index) => (\n <TableRow key={index}>\n <TableCell>\n <Text mono>\n {item.snapshot === \"unavailable\" ? (\n <RedTooltip data-text=\"Unavailable\">\n <Icon\n name=\"caution\"\n color=\"red\"\n style={{\n display: \"inline-block\",\n marginRight: \"0.5rem\",\n }}\n />\n {visibleRows[index]}\n </RedTooltip>\n ) : (\n visibleRows[index]\n )}\n </Text>\n </TableCell>\n {keys.map((key) => (\n <TableCell key={key}>\n {item.snapshot !== \"unavailable\" && (\n <ValueRenderer\n json={item.snapshot[key]}\n onCoIDClick={(coId) => {\n async function handleClick() {\n onNavigate([\n {\n coId: item.value!.id,\n name: index.toString(),\n },\n {\n coId: coId,\n name: key,\n },\n ]);\n }\n\n handleClick();\n }}\n />\n )}\n </TableCell>\n ))}\n\n <TableCell>\n <Button\n variant=\"secondary\"\n onClick={() =>\n onNavigate([\n {\n coId: item.value!.id,\n name: index.toString(),\n },\n ])\n }\n >\n View\n </Button>\n </TableCell>\n {onRemove && (\n <TableCell>\n <Button variant=\"secondary\" onClick={() => onRemove(index)}>\n Remove\n </Button>\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <PaginationContainer>\n <Text muted small>\n Showing {Math.min(visibleRowsCount, coIdArray.length)} of{\" \"}\n {coIdArray.length}\n </Text>\n {hasMore && (\n <Button variant=\"secondary\" onClick={loadMore}>\n Load more\n </Button>\n )}\n </PaginationContainer>\n </>\n );\n}\n\nexport function TableView({\n data,\n node,\n onNavigate,\n onRemove,\n}: {\n data: JsonObject;\n node: LocalNode;\n onNavigate: (pages: PageInfo[]) => void;\n onRemove?: (index: number) => void;\n}) {\n const isListOfCoValues = useMemo(() => {\n return Array.isArray(data) && data.every((k) => isCoId(k));\n }, [data]);\n\n // if data is a list of covalue ids, we need to resolve those covalues\n if (isListOfCoValues) {\n return (\n <CoValuesTableView\n data={data}\n node={node}\n onNavigate={onNavigate}\n onRemove={onRemove}\n />\n );\n }\n\n // if data is a list of primitives, we can render those values directly\n return (\n <Table>\n <TableHead>\n <TableRow>\n <TableHeader style={{ width: \"5rem\" }}>Index</TableHeader>\n <TableHeader>Value</TableHeader>\n {onRemove && <TableHeader>Action</TableHeader>}\n </TableRow>\n </TableHead>\n <TableBody>\n {Array.isArray(data) &&\n data?.map((value, index) => (\n <TableRow key={index}>\n <TableCell>\n <Text mono>{index}</Text>\n </TableCell>\n <TableCell>\n <ValueRenderer json={value} />\n </TableCell>\n {onRemove && (\n <TableCell>\n <Button variant=\"secondary\" onClick={() => onRemove(index)}>\n Remove\n </Button>\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n","import { CoID, JsonValue, LocalNode, OpID, RawCoValue } from \"cojson\";\nimport { useMemo } from \"react\";\nimport { styled } from \"goober\";\nimport { AccountOrGroupText } from \"./account-or-group-text\";\nimport { DataTable, ColumnDef } from \"../ui/data-table\";\nimport { Icon, Accordion } from \"../ui\";\nimport * as TransactionChanges from \"../utils/transactions-changes\";\nimport { getTransactionChanges } from \"../utils/history\";\n\ntype HistoryEntry = {\n id: string;\n author: string;\n action: string;\n timestamp: Date;\n isValid: boolean;\n validationErrorMessage: string | undefined;\n};\n\nexport function HistoryView({\n coValue,\n node,\n}: {\n coValue: RawCoValue;\n node: LocalNode;\n}) {\n const transactions = useMemo(\n () => getHistory(coValue),\n [coValue.core.verifiedTransactions.length],\n );\n\n const columns: ColumnDef<HistoryEntry>[] = [\n {\n id: \"author\",\n header: \"Author\",\n accessor: (row) => (\n <>\n {row.isValid || (\n <RedTooltip data-text=\"This transaction is invalid and is not used\">\n <Icon\n name=\"caution\"\n size=\"xs\"\n color=\"red\"\n style={{\n display: \"inline-block\",\n verticalAlign: \"middle\",\n marginRight: \"0.25rem\",\n }}\n />\n </RedTooltip>\n )}\n {row.author.startsWith(\"co_\") ? (\n <AccountOrGroupText\n coId={row.author as CoID<RawCoValue>}\n node={node}\n showId\n />\n ) : (\n row.author\n )}\n </>\n ),\n sortable: false,\n filterable: true,\n sortFn: (a, b) => a.author.localeCompare(b.author),\n filterFn: (row, filterValue) =>\n row.author.toLowerCase().includes(filterValue.toLowerCase()),\n },\n {\n id: \"action\",\n header: \"Action\",\n accessor: (row) => {\n if (row.isValid) return row.action;\n\n return (\n <>\n {row.action}\n <span style={{ color: \"red\", display: \"block\" }}>\n Invalid transaction: {row.validationErrorMessage}\n </span>\n </>\n );\n },\n sortable: false,\n filterable: true,\n sortFn: (a, b) => a.action.localeCompare(b.action),\n },\n {\n id: \"timestamp\",\n header: \"Timestamp\",\n accessor: (row) => row.timestamp.toISOString(),\n sortable: true,\n filterable: true,\n sortFn: (a, b) => a.timestamp.getTime() - b.timestamp.getTime(),\n },\n ];\n\n return (\n <Accordion title=\"CoValue history\" storageKey=\"jazz-inspector-show-history\">\n <DataTable\n columns={columns}\n data={transactions}\n pageSize={10}\n initialSort={{ columnId: \"timestamp\", direction: \"desc\" }}\n getRowKey={(row) => row.id}\n emptyMessage=\"No history available\"\n />\n </Accordion>\n );\n}\n\nfunction getHistory(coValue: RawCoValue): HistoryEntry[] {\n return coValue.core.verifiedTransactions.flatMap((tx, index) => {\n const changes = getTransactionChanges(tx, coValue);\n\n return changes.map((change, changeIndex) => ({\n id: `${tx.txID.sessionID.toString()}-${tx.txID.txIndex}-${index}-${changeIndex}`,\n author: tx.author,\n action: mapTransactionToAction(change, coValue),\n timestamp: new Date(tx.currentMadeAt),\n isValid: tx.isValid,\n validationErrorMessage: tx.validationErrorMessage,\n }));\n });\n}\n\nfunction mapTransactionToAction(\n change: JsonValue,\n coValue: RawCoValue,\n): string {\n // Group changes\n if (TransactionChanges.isUserPromotion(change)) {\n if (change.value === \"revoked\") {\n return `${change.key} has been revoked`;\n }\n\n return `${change.key} has been promoted to ${change.value}`;\n }\n\n if (TransactionChanges.isGroupExtension(change)) {\n const child = change.key.slice(6);\n return `Group became a member of ${child}`;\n }\n\n if (TransactionChanges.isGroupExtendRevocation(change)) {\n const child = change.key.slice(6);\n return `Group's membership of ${child} has been revoked.`;\n }\n\n if (TransactionChanges.isGroupPromotion(change)) {\n const parent = change.key.slice(7);\n return `Group ${parent} has been promoted to ${change.value}`;\n }\n\n if (TransactionChanges.isKeyRevelation(change)) {\n const [key, target] = change.key.split(\"_for_\");\n return `Key \"${key}\" has been revealed to \"${target}\"`;\n }\n\n // coList changes\n if (TransactionChanges.isItemAppend(change)) {\n if (change.after === \"start\") {\n return `\"${change.value}\" has been appended`;\n }\n\n const after = findListChange(change.after, coValue);\n\n if (after === undefined) {\n return `\"${change.value}\" has been inserted after undefined item`;\n }\n\n return `\"${change.value}\" has been inserted after \"${(after as any).value}\"`;\n }\n\n if (TransactionChanges.isItemPrepend(change)) {\n if (change.before === \"end\") {\n return `\"${change.value}\" has been prepended`;\n }\n\n const before = findListChange(change.before, coValue);\n\n if (before === undefined) {\n return `\"${change.value}\" has been inserted before undefined item`;\n }\n\n return `\"${change.value}\" has been inserted before \"${(before as any).value}\"`;\n }\n\n if (TransactionChanges.isItemDeletion(change)) {\n const insertion = findListChange(change.insertion, coValue);\n if (insertion === undefined) {\n return `An undefined item has been deleted`;\n }\n\n return `\"${(insertion as any).value}\" has been deleted`;\n }\n\n // coStream changes\n if (TransactionChanges.isStreamStart(change)) {\n return `Stream started with mime type \"${change.mimeType}\" and file name \"${change.fileName}\"`;\n }\n\n if (TransactionChanges.isStreamChunk(change)) {\n return `Stream chunk added`;\n }\n\n if (TransactionChanges.isStreamEnd(change)) {\n return `Stream ended`;\n }\n\n // coMap changes\n if (TransactionChanges.isPropertySet(change)) {\n return `Property \"${change.key}\" has been set to ${JSON.stringify(change.value)}`;\n }\n\n if (TransactionChanges.isPropertyDeletion(change)) {\n return `Property \"${change.key}\" has been deleted`;\n }\n\n if ((change as any).op === \"custom\") {\n return (change as any).action;\n }\n\n return \"Unknown action: \" + JSON.stringify(change);\n}\n\nconst findListChange = (\n opId: OpID,\n coValue: RawCoValue,\n): JsonValue | undefined => {\n return coValue.core.verifiedTransactions.find(\n (tx) =>\n tx.txID.sessionID === opId.sessionID && tx.txID.txIndex === opId.txIndex,\n )?.changes?.[opId.changeIdx];\n};\n\nconst RedTooltip = styled(\"span\")`\n position:relative; /* making the .tooltip span a container for the tooltip text */\n border-bottom:1px dashed #000; /* little indicater to indicate it's hoverable */\n\n &:before {\n content: attr(data-text);\n background-color: red;\n position:absolute;\n\n /* vertically center */\n top:50%;\n transform:translateY(-50%);\n\n /* move to right */\n left:100%;\n margin-left:15px; /* and add a small left margin */\n\n /* basic styles */\n width:200px;\n padding:10px;\n border-radius:10px;\n color: #fff;\n text-align:center;\n\n display:none; /* hide by default */\n }\n\n &:hover:before {\n display:block;\n }\n`;\n","import type {\n AccountRole,\n BinaryStreamStart,\n CoID,\n RawCoValue,\n Role,\n} from \"cojson\";\nimport type { ListOpPayload } from \"cojson/dist/coValues/coList.js\";\nimport type { MapOpPayload } from \"cojson/dist/coValues/coMap.js\";\nimport type {\n BinaryStreamChunk,\n BinaryStreamEnd,\n} from \"cojson/dist/coValues/coStream.js\";\nimport { isCoId } from \"../viewer/types\";\n\nexport const isGroupExtension = (\n change: any,\n): change is Extract<\n MapOpPayload<`child_${string}`, \"extend\">,\n { op: \"set\" }\n> => {\n return change?.op === \"set\" && change?.value === \"extend\";\n};\n\nexport const isGroupExtendRevocation = (\n change: any,\n): change is Extract<\n MapOpPayload<`child_${string}`, \"revoked\">,\n { op: \"set\" }\n> => {\n return change?.op === \"set\" && change?.value === \"revoked\";\n};\n\nexport const isGroupPromotion = (\n change: any,\n): change is Extract<\n MapOpPayload<`parent_co_${string}`, AccountRole>,\n { op: \"set\" }\n> => {\n return change?.op === \"set\" && change?.key.startsWith(\"parent_co_\");\n};\n\nexport const isUserPromotion = (\n change: any,\n): change is Extract<MapOpPayload<CoID<RawCoValue>, Role>, { op: \"set\" }> => {\n return (\n change?.op === \"set\" && (isCoId(change?.key) || change?.key === \"everyone\")\n );\n};\n\nexport const isKeyRevelation = (\n change: any,\n): change is Extract<\n MapOpPayload<`${string}_for_${string}`, string>,\n { op: \"set\" }\n> => {\n return change?.op === \"set\" && change?.key.includes(\"_for_\");\n};\n\nexport const isPropertySet = (\n change: any,\n): change is Extract<MapOpPayload<string, any>, { op: \"set\" }> => {\n return change?.op === \"set\" && \"key\" in change && \"value\" in change;\n};\nexport const isPropertyDeletion = (\n change: any,\n): change is Extract<MapOpPayload<string, any>, { op: \"del\" }> => {\n return change?.op === \"del\" && \"key\" in change;\n};\n\nexport const isItemAppend = (\n change: any,\n): change is Extract<ListOpPayload<any>, { op: \"app\" }> => {\n return change?.op === \"app\" && \"after\" in change && \"value\" in change;\n};\nexport const isItemPrepend = (\n change: any,\n): change is Extract<ListOpPayload<any>, { op: \"pre\" }> => {\n return change?.op === \"pre\" && \"before\" in change && \"value\" in change;\n};\n\nexport const isItemDeletion = (\n change: any,\n): change is Extract<ListOpPayload<any>, { op: \"del\" }> => {\n return change?.op === \"del\" && \"insertion\" in change;\n};\n\nexport const isStreamStart = (change: any): change is BinaryStreamStart => {\n return change?.type === \"start\" && \"mimeType\" in change;\n};\n\nexport const isStreamChunk = (change: any): change is BinaryStreamChunk => {\n return change?.type === \"chunk\" && \"chunk\" in change;\n};\n\nexport const isStreamEnd = (change: any): change is BinaryStreamEnd => {\n return change?.type === \"end\";\n};\n","import type {\n JsonObject,\n JsonValue,\n OpID,\n RawCoMap,\n RawCoPlainText,\n RawCoValue,\n Role,\n} from \"cojson\";\nimport { stringifyOpID } from \"cojson\";\nimport type { VerifiedTransaction } from \"cojson/dist/coValueCore/coValueCore.js\";\nimport type { MapOpPayload } from \"cojson/dist/coValues/coMap.js\";\nimport * as TransactionChanges from \"./transactions-changes\";\nimport type {\n DeletionOpPayload,\n InsertionOpPayload,\n} from \"cojson/dist/coValues/coList.js\";\n\nexport function areSameOpIds(\n opId1: OpID | string,\n opId2: OpID | string,\n): boolean {\n if (typeof opId1 === \"string\" || typeof opId2 === \"string\") {\n return opId1 === opId2;\n }\n\n return (\n opId1.sessionID === opId2.sessionID &&\n opId1.txIndex === opId2.txIndex &&\n opId1.changeIdx === opId2.changeIdx\n );\n}\n\nexport function isCoPlainText(coValue: RawCoValue): coValue is RawCoPlainText {\n return coValue.type === \"coplaintext\";\n}\n\nexport function getTransactionChanges(\n tx: VerifiedTransaction,\n coValue: RawCoValue,\n): JsonValue[] {\n if (tx.isValid === false && tx.tx.privacy === \"private\") {\n const readKey = coValue.core.getReadKey(tx.tx.keyUsed);\n if (!readKey) {\n return [\n `Unable to decrypt transaction: read key ${tx.tx.keyUsed} not found.`,\n ];\n }\n\n return (\n coValue.core.verified.decryptTransaction(\n tx.txID.sessionID,\n tx.txID.txIndex,\n readKey,\n ) ?? []\n );\n }\n\n // Trying to collapse multiple changes into a single action in the history\n if (isCoPlainText(coValue)) {\n if (tx.changes === undefined || tx.changes.length === 0) return [];\n const firstChange = tx.changes[0]!;\n\n if (\n TransactionChanges.isItemAppend(firstChange) &&\n tx.changes.every(\n (c) =>\n TransactionChanges.isItemAppend(c) &&\n areSameOpIds(c.after, firstChange.after),\n )\n ) {\n const changes = tx.changes as InsertionOpPayload<string>[];\n if (firstChange.after !== \"start\") {\n changes.reverse();\n }\n\n return [\n {\n op: \"app\",\n value: changes.map((c) => c.value).join(\"\"),\n after: firstChange.after,\n },\n ];\n }\n\n if (\n TransactionChanges.isItemPrepend(firstChange) &&\n tx.changes.every(\n (c) =>\n TransactionChanges.isItemPrepend(c) &&\n areSameOpIds(c.before, firstChange.before),\n )\n ) {\n const changes = tx.changes as InsertionOpPayload<string>[];\n if (firstChange.before !== \"end\") {\n changes.reverse();\n }\n\n return [\n {\n op: \"pre\",\n value: changes.map((c) => c.value).join(\"\"),\n before: firstChange.before,\n },\n ];\n }\n\n if (\n TransactionChanges.isItemDeletion(firstChange) &&\n tx.changes.every((c) => TransactionChanges.isItemDeletion(c))\n ) {\n const coValueBeforeDeletions = coValue.atTime(tx.madeAt - 1);\n\n // Verify if the deleted chars are consecutive\n function changesAreConsecutive(changes: DeletionOpPayload[]): boolean {\n if (changes.length < 2) return false;\n const mapping = coValueBeforeDeletions.mapping.idxAfterOpID;\n\n for (let i = 1; i < changes.length; ++i) {\n const prevIdx = mapping[stringifyOpID(changes[i - 1]!.insertion)];\n const currIdx = mapping[stringifyOpID(changes[i]!.insertion)];\n if (currIdx !== prevIdx && currIdx !== (prevIdx ?? -2) + 1) {\n return false;\n }\n }\n return true;\n }\n\n if (changesAreConsecutive(tx.changes)) {\n // Group the deletions by insertion.sessionID-txIndex\n // This is to help the readability of deletions that act on different previous transactions\n const groupedBySession: Map<string, DeletionOpPayload[]> = new Map();\n for (const change of tx.changes) {\n const group = `${change.insertion.sessionID}-${change.insertion.txIndex}`;\n if (!groupedBySession.has(group)) groupedBySession.set(group, []);\n groupedBySession.get(group)!.push(change);\n }\n\n return Array.from(groupedBySession.values()).map((changes) => {\n const stringDeleted = changes\n // order by txIndex and changeIdx\n .toSorted((a, b) => {\n if (a.insertion.txIndex === b.insertion.txIndex) {\n return a.insertion.changeIdx - b.insertion.changeIdx;\n }\n\n return a.insertion.txIndex - b.insertion.txIndex;\n })\n // extract the single char from the insertions\n .map((c) =>\n coValueBeforeDeletions.get(\n coValueBeforeDeletions.mapping.idxAfterOpID[\n stringifyOpID(c.insertion)\n ]!,\n ),\n )\n .join(\"\");\n\n return {\n op: \"custom\",\n action: `\"${stringDeleted}\" has been deleted`,\n };\n });\n }\n }\n }\n\n return tx.changes ?? (tx.tx as any).changes ?? [];\n}\n\nexport function restoreCoMapToTimestamp(\n coValue: RawCoMap,\n timestamp: number,\n removeUnknownProperties: boolean,\n): void {\n const myRole = coValue.group.myRole();\n\n if (\n myRole === undefined ||\n !([\"admin\", \"manager\", \"writer\", \"writerOnly\"] as Role[]).includes(myRole)\n ) {\n return;\n }\n\n const newCoValue = coValue.atTime(timestamp).toJSON() as JsonObject | null;\n const oldCoValue = coValue.toJSON() as JsonObject;\n\n if (newCoValue === null) return;\n\n let changes: MapOpPayload<string, JsonValue | undefined>[] = [];\n\n if (removeUnknownProperties) {\n for (const key in oldCoValue) {\n if (!(key in newCoValue)) {\n changes.push({\n op: \"del\",\n key,\n });\n }\n }\n }\n\n for (const key in newCoValue) {\n if (newCoValue[key] !== oldCoValue[key]) {\n changes.push({\n op: \"set\",\n key,\n value: newCoValue[key],\n });\n }\n }\n\n if (changes.length > 0) {\n coValue.core.makeTransaction(changes, \"private\");\n }\n}\n","import { JsonObject, LocalNode, RawCoMap } from \"cojson\";\nimport { PageInfo } from \"./types\";\nimport { GridView } from \"./grid-view.js\";\nimport { useState, useMemo } from \"react\";\nimport { Button, Icon, Input, Modal } from \"../ui\";\nimport { styled } from \"goober\";\nimport { restoreCoMapToTimestamp } from \"../utils/history\";\nimport { CoValueEditor } from \"./co-value-editor.js\";\nimport { isWriter } from \"../utils/permissions\";\n\nexport function CoMapView({\n coValue,\n data,\n node,\n onNavigate,\n}: {\n coValue: RawCoMap;\n data: JsonObject;\n node: LocalNode;\n onNavigate: (pages: PageInfo[]) => void;\n}) {\n return (\n <>\n <GridView\n data={data}\n onNavigate={onNavigate}\n node={node}\n coValue={coValue}\n />\n <div>\n <AddPropertyModal\n disabled={!isWriter(coValue.group.myRole())}\n coValue={coValue}\n node={node}\n />{\" \"}\n <RestoreSnapshotModal coValue={coValue} />\n </div>\n </>\n );\n}\n\nfunction AddPropertyModal({\n coValue,\n node,\n disabled,\n}: {\n coValue: RawCoMap;\n node: LocalNode;\n disabled: boolean;\n}) {\n const [isAddPropertyModalOpen, setIsAddPropertyModalOpen] = useState(false);\n const [propertyName, setPropertyName] = useState(\"\");\n\n const openAddPropertyModal = () => {\n setIsAddPropertyModalOpen(true);\n setPropertyName(\"\");\n };\n\n const handleCancel = () => {\n setIsAddPropertyModalOpen(false);\n setPropertyName(\"\");\n };\n\n return (\n <>\n <Button\n title=\"Add Property\"\n variant=\"secondary\"\n disabled={disabled}\n onClick={openAddPropertyModal}\n >\n <Icon name=\"add\" />\n </Button>\n\n <Modal\n isOpen={isAddPropertyModalOpen}\n onClose={handleCancel}\n heading=\"Add Property\"\n showButtons={false}\n >\n <Input\n label=\"Property Name\"\n value={propertyName}\n onChange={(e) => setPropertyName(e.target.value)}\n placeholder=\"Enter property name\"\n />\n {propertyName && (\n <EditorContainer>\n <CoValueEditor\n node={node}\n property={propertyName}\n value={undefined}\n coValue={coValue}\n onCancel={handleCancel}\n />\n </EditorContainer>\n )}\n </Modal>\n </>\n );\n}\n\nfunction RestoreSnapshotModal({ coValue }: { coValue: RawCoMap }) {\n const [isRestoreModalOpen, setIsRestoreModalOpen] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState<number>(-1);\n const [removeUnknownProperties, setRemoveUnknownProperties] = useState(false);\n\n const timestamps = useMemo(\n () => coValue.core.verifiedTransactions.map((tx) => tx.madeAt),\n [coValue.core.verifiedTransactions.length],\n );\n\n const coMapAtSelectedIndex = useMemo(() => {\n if (selectedIndex === -1) return null;\n return coValue.atTime(timestamps[selectedIndex]!).toJSON() as JsonObject;\n }, [coValue, timestamps, selectedIndex]);\n\n const openRestoreModal = () => {\n setIsRestoreModalOpen(true);\n setSelectedIndex(timestamps.length - 1);\n };\n\n const handleRestore = () => {\n if (timestamps.length < 2) return;\n if (timestamps.length === 0) return;\n\n const selectedTimestamp = timestamps[selectedIndex];\n if (selectedTimestamp === undefined) return;\n\n restoreCoMapToTimestamp(\n coValue,\n selectedTimestamp,\n removeUnknownProperties,\n );\n\n setIsRestoreModalOpen(false);\n };\n\n const handleClose = () => {\n setIsRestoreModalOpen(false);\n };\n\n const canRestore = isWriter(coValue.group.myRole());\n\n return (\n <>\n <Button title=\"Timeline\" variant=\"secondary\" onClick={openRestoreModal}>\n <Icon name=\"history\" />\n </Button>\n\n <Modal\n isOpen={isRestoreModalOpen}\n onClose={handleClose}\n heading=\"Timeline\"\n confirmText=\"Restore\"\n cancelText=\"Cancel\"\n onConfirm={handleRestore}\n onCancel={handleClose}\n showButtons={timestamps.length > 1 && canRestore}\n >\n {timestamps.length > 1 && (\n <>\n <RangeContainer>\n <RangeLabel>Select Timestamp</RangeLabel>\n <RangeInput\n type=\"range\"\n min={0}\n max={Math.max(0, timestamps.length - 1)}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(Number(e.target.value))}\n disabled={timestamps.length === 0}\n />\n <TimestampDisplay>\n {timestamps[selectedIndex] !== undefined\n ? new Date(timestamps[selectedIndex]!).toISOString()\n : \"No timestamps available\"}\n </TimestampDisplay>\n </RangeContainer>\n\n {canRestore && (\n <CheckboxContainer>\n <CheckboxInput\n type=\"checkbox\"\n id=\"remove-unknown-properties\"\n checked={removeUnknownProperties}\n onChange={(e) => setRemoveUnknownProperties(e.target.checked)}\n />\n <CheckboxLabel htmlFor=\"remove-unknown-properties\">\n Remove unknown properties (properties that don't exist in the\n selected snapshot)\n </CheckboxLabel>\n </CheckboxContainer>\n )}\n </>\n )}\n\n {timestamps.length > 0 && timestamps[selectedIndex] !== undefined && (\n <PreviewSection>\n <PreviewLabel>State at that time:</PreviewLabel>\n <PreviewPre>\n {JSON.stringify(coMapAtSelectedIndex, null, 2)}\n </PreviewPre>\n </PreviewSection>\n )}\n\n {timestamps.length < 2 && (\n <div style={{ color: \"var(--j-text-color)\" }}>\n At least 2 timestamps are required to restore a snapshot.\n </div>\n )}\n </Modal>\n </>\n );\n}\n\nconst PreviewSection = styled(\"div\")`\n margin-top: 1.5rem;\n`;\n\nconst PreviewLabel = styled(\"div\")`\n font-weight: 500;\n margin-bottom: 0.5rem;\n color: var(--j-text-color-strong);\n`;\n\nconst PreviewPre = styled(\"pre\")`\n background-color: var(--j-foreground);\n border: 1px solid var(--j-border-color);\n border-radius: var(--j-radius-md);\n padding: 1rem;\n overflow-x: auto;\n font-size: 0.875rem;\n max-height: 400px;\n overflow-y: auto;\n color: var(--j-text-color);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n`;\n\nconst RangeContainer = styled(\"div\")`\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n`;\n\nconst RangeLabel = styled(\"label\")`\n font-weight: 500;\n color: var(--j-text-color-strong);\n font-size: 0.875rem;\n`;\n\nconst RangeInput = styled(\"input\")`\n width: 100%;\n height: 0.5rem;\n border-radius: var(--j-radius-sm);\n outline: none;\n -webkit-appearance: none;\n appearance: none;\n background: var(--j-foreground);\n cursor: pointer;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--j-primary-color);\n cursor: pointer;\n border: 2px solid var(--j-background);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n\n &::-moz-range-thumb {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--j-primary-color);\n cursor: pointer;\n border: 2px solid var(--j-background);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst TimestampDisplay = styled(\"div\")`\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.875rem;\n color: var(--j-text-color);\n padding: 0.5rem;\n background-color: var(--j-foreground);\n border: 1px solid var(--j-border-color);\n border-radius: var(--j-radius-md);\n text-align: center;\n`;\n\nconst CheckboxContainer = styled(\"div\")`\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-top: 1rem;\n`;\n\nconst CheckboxInput = styled(\"input\")`\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n cursor: pointer;\n accent-color: var(--j-primary-color);\n`;\n\nconst CheckboxLabel = styled(\"label\")`\n font-size: 0.875rem;\n color: var(--j-text-color);\n cursor: pointer;\n line-height: 1.25rem;\n`;\n\nconst EditorContainer = styled(\"div\")`\n margin-top: 1rem;\n`;\n","import React from \"react\";\nimport { Text } from \"./text\";\nimport { styled } from \"goober\";\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n}\n\nexport class ErrorBoundary extends React.Component<\n { children: React.ReactNode; title: string },\n ErrorBoundaryState\n> {\n constructor(props: { children: React.ReactNode; title: string }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n console.error(error);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div style={{ padding: \"1rem\" }}>\n <StyledHeading>{this.props.title}</StyledHeading>\n <Text mono style={{ marginTop: \"0.5rem\", color: \"#ef4444\" }}>\n {this.state.error?.message || \"An unexpected error occurred\"}\n </Text>\n\n <pre style={{ paddingLeft: \"1rem\", color: \"#ef4444\" }}>\n {this.state.error?.stack}\n </pre>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nconst StyledHeading = styled(\"h1\")<{ className?: string }>`\n font-size: 1.125rem;\n font-weight: 500;\n color: var(--j-text-color-strong);\n`;\n","import { styled } from \"goober\";\nimport { useNode } from \"../contexts/node\";\nimport { Heading } from \"../ui/heading\";\nimport { Button, Input } from \"../ui\";\nimport { useState } from \"react\";\nimport { CoID, RawCoValue } from \"cojson\";\nimport { useRouter } from \"../router\";\n\nexport function HomePage() {\n const { localNode, accountID } = useNode();\n const { path, setPage } = useRouter();\n const [coValueId, setCoValueId] = useState<CoID<RawCoValue> | \"\">(\"\");\n\n if (!localNode || !accountID) {\n return <div>Loading...</div>;\n }\n\n const handleCoValueIdSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (coValueId) {\n setPage(coValueId);\n }\n setCoValueId(\"\");\n };\n\n return (\n <>\n <CenteredForm\n onSubmit={handleCoValueIdSubmit}\n aria-hidden={path.length !== 0}\n >\n <Heading>Jazz CoValue Inspector</Heading>\n\n <Input\n label=\"CoValue ID\"\n className=\"font-mono\"\n hideLabel\n placeholder=\"co_z1234567890abcdef123456789\"\n value={coValueId}\n onChange={(e) => setCoValueId(e.target.value as CoID<RawCoValue>)}\n />\n\n <Button type=\"submit\" variant=\"primary\">\n Inspect CoValue\n </Button>\n\n <OrText>or</OrText>\n\n <Button\n variant=\"secondary\"\n onClick={() => {\n setPage(accountID);\n }}\n >\n Inspect my account\n </Button>\n </CenteredForm>\n </>\n );\n}\n\nconst CenteredForm = styled(\"form\")`\n display: flex;\n flex-direction: column;\n position: relative;\n top: -1.5rem;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n width: 100%;\n max-width: 24rem;\n margin: 0 auto;\n`;\n\nconst OrText = styled(\"p\")`\n text-align: center;\n`;\n","import { styled } from \"goober\";\n\nexport const GlobalStyles = styled(\"div\")`\n /* Colors */\n --j-primary-color: #146AFF;\n --j-link-color: var(--j-primary-color);\n --j-success-color: oklch(52.7% 0.154 150.069);\n --j-destructive-color: oklch(50.5% 0.213 27.518);\n \n /* Neutral Colors */\n --j-neutral-100: #faf8f8;\n --j-neutral-200: #e5e3e4;\n --j-neutral-300: #d0cecf;\n --j-neutral-400: #bbbaba;\n --j-neutral-500: #a8a6a6;\n --j-neutral-600: #858484;\n --j-neutral-700: #6b696a;\n --j-neutral-900: #2f2e2e;\n --j-neutral-925: #1b1a1a;\n --j-neutral-950: #151414;\n \n /* Text Colors */\n --j-text-color: var(--j-neutral-700);\n --j-text-color-strong: var(--j-neutral-900);\n\n /* Border Colors */\n --j-border-color: var(--j-neutral-200);\n --j-border-color-hover: var(--j-neutral-300);\n --j-border-dark: var(--j-neutral-900);\n --j-border-focus: var(--j-primary-color);\n\n /* Background Colors */\n --j-background: #FFFFFF;\n --j-foreground: var(--j-neutral-100);\n\n /* Border Radius */\n --j-radius-sm: 0.25rem;\n --j-radius-md: 0.375rem;\n --j-radius-lg: 0.5rem;\n\n /* Shadows */\n --j-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n\n @media (prefers-color-scheme: dark) {\n --j-text-color: var(--j-neutral-400);\n --j-border-color: var(--j-neutral-900);\n --j-background: var(--j-neutral-950);\n --j-foreground: var(--j-neutral-925);\n --j-border-color-hover: var(--j-neutral-700);\n --j-text-color-strong: var(--j-neutral-100);\n --j-success-color: oklch(72.3% 0.219 149.579);\n --j-destructive-color: oklch(63.7% 0.237 25.331);\n }\n \n *:focus {\n outline: none;\n }\n \n *:focus-visible {\n box-shadow: 0 0 0 2px var(--j-link-color);\n }\n \n .j-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n`;\n","import { CoID, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport React, { type PropsWithChildren, useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { Input } from \"../ui/input.js\";\nimport { Breadcrumbs } from \"./breadcrumbs.js\";\nimport { DeleteLocalData } from \"./delete-local-data.js\";\nimport { useRouter } from \"../router/context.js\";\n\nexport function Header({\n showDeleteLocalData = false,\n showClose = false,\n onClose,\n children,\n}: PropsWithChildren<{\n showDeleteLocalData?: boolean;\n showClose?: boolean;\n onClose?: () => void;\n}>) {\n const [coValueId, setCoValueId] = useState<CoID<RawCoValue> | \"\">(\"\");\n const { path, setPage } = useRouter();\n\n const handleCoValueIdSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (coValueId) {\n setPage(coValueId);\n }\n setCoValueId(\"\");\n };\n\n return (\n <HeaderContainer>\n <Breadcrumbs />\n {path.length !== 0 && (\n <Form onSubmit={handleCoValueIdSubmit}>\n <Input\n label=\"CoValue ID\"\n style={{ fontFamily: \"monospace\" }}\n hideLabel\n placeholder=\"co_z1234567890abcdef123456789\"\n value={coValueId}\n onChange={(e) => setCoValueId(e.target.value as CoID<RawCoValue>)}\n />\n </Form>\n )}\n {children}\n {showDeleteLocalData && <DeleteLocalData />}\n {showClose && (\n <Button variant=\"plain\" type=\"button\" onClick={onClose}>\n Close\n </Button>\n )}\n </HeaderContainer>\n );\n}\n\nconst HeaderContainer = styled(\"div\")`\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0 0.75rem;\n margin: 0.75rem 0;\n`;\n\nconst Form = styled(\"form\")`\n width: 24rem;\n`;\n","import { styled } from \"goober\";\nimport React from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { useRouter } from \"../router/context.js\";\n\nconst BreadcrumbsContainer = styled(\"div\")`\n position: relative;\n z-index: 20;\n flex: 1;\n display: flex;\n align-items: center;\n`;\n\nconst Separator = styled(\"span\")`\n padding: 0 0.125rem;\n`;\n\nexport const Breadcrumbs: React.FC<{}> = () => {\n const { path, goToIndex } = useRouter();\n\n return (\n <BreadcrumbsContainer>\n <Button\n variant=\"link\"\n style={{ padding: \"0 0.25rem\" }}\n onClick={() => goToIndex(-1)}\n >\n Home\n </Button>\n {path.map((page, index) => {\n return (\n <React.Fragment key={page.coId}>\n <Separator aria-hidden>/</Separator>\n <Button\n variant=\"link\"\n style={{ padding: \"0 0.25rem\" }}\n onClick={() => goToIndex(index)}\n >\n {index === 0 ? page.name || \"Root\" : page.name}\n </Button>\n </React.Fragment>\n );\n })}\n </BreadcrumbsContainer>\n );\n};\n","import { Button } from \"../ui/button.js\";\nimport { Modal } from \"../ui/modal.js\";\nimport { Input } from \"../ui/input.js\";\nimport { useState } from \"react\";\n\nconst DELETE_LOCAL_DATA_STRING = \"delete my local data\";\n\nexport function DeleteLocalData() {\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [confirmDeleteString, setConfirmDeleteString] = useState(\"\");\n\n return (\n <>\n <Button variant=\"destructive\" onClick={() => setShowDeleteModal(true)}>\n Delete my local data\n </Button>\n <Modal\n isOpen={showDeleteModal}\n onClose={() => setShowDeleteModal(false)}\n heading=\"Delete Local Data\"\n showButtons={false}\n >\n <div\n style={{\n margin: \"0 0 1rem 0\",\n color: \"var(--j-text-color)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n <p>\n This action <strong>cannot</strong> be undone.\n </p>\n <p>\n Be aware that the following data will be{\" \"}\n <strong>permanently</strong> deleted:\n </p>\n <ul style={{ listStyleType: \"disc\", paddingLeft: \"1rem\" }}>\n <li>\n Unsynced data for <strong>all apps</strong> on{\" \"}\n <code>{window.location.origin}</code>\n </li>\n <li>Accounts</li>\n <li>Logged in sessions</li>\n </ul>\n <p></p>\n </div>\n <Input\n label={`Type \"${DELETE_LOCAL_DATA_STRING}\" to confirm`}\n placeholder={DELETE_LOCAL_DATA_STRING}\n value={confirmDeleteString}\n onChange={(e) => {\n setConfirmDeleteString(e.target.value);\n }}\n />\n <p\n style={{\n margin: \"0 0 1rem 0\",\n color: \"var(--j-text-color)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n <small>\n Data synced to a sync server will <strong>not</strong> be deleted,\n and will be synced when you log in again.\n </small>\n </p>\n <div\n style={{\n display: \"flex\",\n marginTop: \"0.5rem\",\n justifyContent: \"flex-end\",\n gap: \"0.5rem\",\n }}\n >\n <Button variant=\"secondary\" onClick={() => setShowDeleteModal(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n disabled={confirmDeleteString !== DELETE_LOCAL_DATA_STRING}\n onClick={() => {\n const jazzKeys = Object.keys(localStorage).filter(\n (key) => key.startsWith(\"jazz-\") || key.startsWith(\"co_z\"),\n );\n jazzKeys.forEach((key) => localStorage.removeItem(key));\n indexedDB.deleteDatabase(\"jazz-storage\");\n window.location.reload();\n setShowDeleteModal(false);\n }}\n >\n I'm sure, delete my local data\n </Button>\n </div>\n </Modal>\n </>\n );\n}\n"],"mappings":"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","names":["accountID","server","crypto","useState","useEffect","createContext","useContext","jsx","useState","path","useEffect","useCallback","useEffect","useMemo","useState","jsx","useState","useCallback","useEffect","useMemo","styled","styled","React","jsx","styled","jsx","styled","React","jsx","useEffect","useState","styled","jsx","useEffect","useState","styled","useEffect","useState","jsx","styled","useState","useEffect","useState","useEffect","Fragment","jsx","useState","useEffect","useState","styled","styled","jsx","styled","icon","styled","React","useState","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","Fragment","jsx","jsxs","styled","ImagePreviewContainer","useState","value","React","useState","styled","styled","jsx","jsxs","styled","jsx","jsxs","useState","styled","styled","styled","jsx","Fragment","jsx","jsxs","useState","styled","useEffect","useState","styled","forwardRef","useEffect","jsx","jsxs","styled","forwardRef","useEffect","styled","forwardRef","useId","jsx","jsxs","useEffect","useMemo","useState","styled","React","jsx","Fragment","jsx","jsxs","useState","useMemo","useEffect","styled","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","styled","Fragment","jsx","jsxs","useState","canEdit","EditForm","StyledTextarea","FormActions","styled","useState","Fragment","jsx","jsxs","useState","jsxs","styled","useMemo","useState","Fragment","jsx","jsxs","styled","useState","useMemo","coIdArray","visibleRows","useMemo","styled","changesAreConsecutive","Fragment","jsx","jsxs","useMemo","RedTooltip","styled","useState","useMemo","styled","Fragment","jsx","jsxs","useState","useMemo","styled","Fragment","jsx","jsxs","React","styled","React","styled","jsx","jsxs","React","StyledHeading","styled","useState","Fragment","jsx","jsxs","useState","styled","Fragment","jsx","styled","styled","styled","useState","styled","React","jsx","jsxs","styled","React","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","HeaderContainer","styled"]}
|