jazz-tools 0.19.3 → 0.19.5

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.
Files changed (75) hide show
  1. package/.svelte-kit/__package__/jazz.class.svelte.d.ts +2 -2
  2. package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/jazz.class.svelte.js +15 -17
  4. package/.turbo/turbo-build.log +65 -65
  5. package/CHANGELOG.md +23 -0
  6. package/dist/{chunk-JPWM4CS2.js → chunk-DFFRRRRF.js} +137 -77
  7. package/dist/chunk-DFFRRRRF.js.map +1 -0
  8. package/dist/index.js +14 -7
  9. package/dist/index.js.map +1 -1
  10. package/dist/inspector/{custom-element-3JAYHXWQ.js → custom-element-P76EIWEV.js} +301 -142
  11. package/dist/inspector/{custom-element-3JAYHXWQ.js.map → custom-element-P76EIWEV.js.map} +1 -1
  12. package/dist/inspector/index.js +281 -122
  13. package/dist/inspector/index.js.map +1 -1
  14. package/dist/inspector/register-custom-element.js +1 -1
  15. package/dist/inspector/tests/viewer/co-plain-text-view.test.d.ts +2 -0
  16. package/dist/inspector/tests/viewer/co-plain-text-view.test.d.ts.map +1 -0
  17. package/dist/inspector/utils/history.d.ts +5 -1
  18. package/dist/inspector/utils/history.d.ts.map +1 -1
  19. package/dist/inspector/viewer/co-plain-text-view.d.ts +4 -2
  20. package/dist/inspector/viewer/co-plain-text-view.d.ts.map +1 -1
  21. package/dist/inspector/viewer/page.d.ts.map +1 -1
  22. package/dist/inspector/viewer/use-resolve-covalue.d.ts +0 -1
  23. package/dist/inspector/viewer/use-resolve-covalue.d.ts.map +1 -1
  24. package/dist/react-core/hooks.d.ts.map +1 -1
  25. package/dist/react-core/index.js +4 -17
  26. package/dist/react-core/index.js.map +1 -1
  27. package/dist/svelte/jazz.class.svelte.d.ts +2 -2
  28. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  29. package/dist/svelte/jazz.class.svelte.js +15 -17
  30. package/dist/testing.js +1 -1
  31. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  32. package/dist/tools/coValues/group.d.ts.map +1 -1
  33. package/dist/tools/coValues/interfaces.d.ts +7 -6
  34. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  35. package/dist/tools/coValues/request.d.ts.map +1 -1
  36. package/dist/tools/exports.d.ts +1 -1
  37. package/dist/tools/exports.d.ts.map +1 -1
  38. package/dist/tools/implementation/refs.d.ts +1 -1
  39. package/dist/tools/implementation/refs.d.ts.map +1 -1
  40. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +3 -1
  41. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
  42. package/dist/tools/subscribe/SubscriptionScope.d.ts +5 -2
  43. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  44. package/dist/tools/subscribe/index.d.ts +1 -1
  45. package/dist/tools/subscribe/index.d.ts.map +1 -1
  46. package/dist/tools/subscribe/types.d.ts +2 -1
  47. package/dist/tools/subscribe/types.d.ts.map +1 -1
  48. package/dist/tools/tests/SubscriptionScope.test.d.ts +2 -0
  49. package/dist/tools/tests/SubscriptionScope.test.d.ts.map +1 -0
  50. package/package.json +4 -4
  51. package/src/inspector/tests/utils/history.test.ts +233 -2
  52. package/src/inspector/tests/viewer/co-plain-text-view.test.tsx +125 -0
  53. package/src/inspector/tests/viewer/history-view.test.tsx +134 -2
  54. package/src/inspector/utils/history.ts +168 -1
  55. package/src/inspector/viewer/co-plain-text-view.tsx +102 -3
  56. package/src/inspector/viewer/history-view.tsx +5 -25
  57. package/src/inspector/viewer/page.tsx +8 -1
  58. package/src/inspector/viewer/use-resolve-covalue.ts +2 -6
  59. package/src/react-core/hooks.ts +5 -29
  60. package/src/svelte/jazz.class.svelte.ts +16 -34
  61. package/src/tools/coValues/coFeed.ts +10 -7
  62. package/src/tools/coValues/coMap.ts +10 -7
  63. package/src/tools/coValues/group.ts +6 -2
  64. package/src/tools/coValues/interfaces.ts +48 -28
  65. package/src/tools/coValues/request.ts +12 -8
  66. package/src/tools/exports.ts +1 -0
  67. package/src/tools/implementation/refs.ts +9 -17
  68. package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +62 -30
  69. package/src/tools/subscribe/SubscriptionScope.ts +38 -2
  70. package/src/tools/subscribe/index.ts +28 -13
  71. package/src/tools/subscribe/types.ts +5 -2
  72. package/src/tools/tests/SubscriptionScope.test.ts +397 -0
  73. package/src/tools/tests/deepLoading.test.ts +22 -0
  74. package/src/tools/tests/subscribe.test.ts +69 -0
  75. package/dist/chunk-JPWM4CS2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/inspector/index.tsx","../../src/inspector/viewer/new-app.tsx","../../src/inspector/ui/button.tsx","../../src/inspector/ui/input.tsx","../../src/inspector/viewer/breadcrumbs.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/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/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/viewer/co-map-view.tsx","../../src/inspector/utils/history.ts","../../src/inspector/ui/error-boundary.tsx","../../src/inspector/viewer/use-page-path.ts","../../src/inspector/ui/global-styles.tsx","../../src/inspector/viewer/inspector-button.tsx","../../src/inspector/viewer/use-open-inspector.ts","../../src/inspector/viewer/delete-local-data.tsx"],"sourcesContent":["import React from \"react\";\n\nexport { JazzInspectorInternal } from \"./viewer/new-app.js\";\nexport { PageStack } from \"./viewer/page-stack.js\";\nexport { Breadcrumbs } from \"./viewer/breadcrumbs.js\";\nexport { AccountOrGroupText } from \"./viewer/account-or-group-text.js\";\n\nexport { Button } from \"./ui/button.js\";\nexport { Input } from \"./ui/input.js\";\nexport { Select } from \"./ui/select.js\";\nexport { Icon } from \"./ui/icon.js\";\nexport { GlobalStyles } from \"./ui/global-styles.js\";\n\nexport {\n resolveCoValue,\n useResolvedCoValue,\n} from \"./viewer/use-resolve-covalue.js\";\n\nexport type { PageInfo } from \"./viewer/types.js\";\n\nimport { setup } from \"goober\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\nimport { Account } from \"jazz-tools\";\n\nimport { JazzInspectorInternal } from \"./viewer/new-app.js\";\nimport { Position } from \"./viewer/inspector-button.js\";\n\nexport function JazzInspector({ position = \"right\" }: { position?: Position }) {\n const context = useJazzContext<Account>();\n const localNode = context.node;\n const me = \"me\" in context ? context.me : undefined;\n\n return (\n <JazzInspectorInternal\n position={position}\n localNode={localNode}\n accountId={me?.$jazz.raw.id}\n />\n );\n}\n\nsetup(React.createElement);\n","import { CoID, LocalNode, RawAccount, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport React, { useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { Input } from \"../ui/input.js\";\nimport { Breadcrumbs } from \"./breadcrumbs.js\";\nimport { PageStack } from \"./page-stack.js\";\nimport { usePagePath } from \"./use-page-path.js\";\n\nimport { GlobalStyles } from \"../ui/global-styles.js\";\nimport { Heading } from \"../ui/heading.js\";\nimport { InspectorButton, type Position } from \"./inspector-button.js\";\nimport { useOpenInspector } from \"./use-open-inspector.js\";\nimport { DeleteLocalData } from \"./delete-local-data.js\";\n\nconst InspectorContainer = styled(\"div\")`\n position: fixed;\n height: 50vh;\n max-height: 800px;\n display: flex;\n flex-direction: column;\n bottom: 0;\n left: 0;\n width: 100%;\n background-color: white;\n border-top: 1px solid var(--j-border-color);\n color: var(--j-text-color);\n \n @media (prefers-color-scheme: dark) {\n background-color: var(--j-background);\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\nconst InitialForm = 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\nexport function JazzInspectorInternal({\n position = \"right\",\n localNode,\n accountId,\n}: {\n position?: Position;\n localNode?: LocalNode;\n accountId?: CoID<RawAccount>;\n}) {\n const [open, setOpen] = useOpenInspector();\n const [coValueId, setCoValueId] = useState<CoID<RawCoValue> | \"\">(\"\");\n const { path, addPages, goToIndex, goBack, setPage } = usePagePath();\n\n const handleCoValueIdSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (coValueId) {\n setPage(coValueId);\n }\n setCoValueId(\"\");\n };\n\n if (!open) {\n return (\n <InspectorButton position={position} onClick={() => setOpen(true)} />\n );\n }\n\n return (\n <InspectorContainer as={GlobalStyles} style={{ zIndex: 999 }}>\n <HeaderContainer>\n <Breadcrumbs path={path} onBreadcrumbClick={goToIndex} />\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 <DeleteLocalData />\n <Button variant=\"plain\" type=\"button\" onClick={() => setOpen(false)}>\n Close\n </Button>\n </HeaderContainer>\n\n <PageStack\n path={path}\n node={localNode}\n goBack={goBack}\n addPages={addPages}\n >\n {path.length <= 0 && (\n <InitialForm\n onSubmit={handleCoValueIdSubmit}\n aria-hidden={path.length !== 0}\n >\n <Heading>Jazz CoValue Inspector</Heading>\n <Input\n label=\"CoValue ID\"\n style={{ minWidth: \"21rem\", fontFamily: \"monospace\" }}\n hideLabel\n placeholder=\"co_z1234567890abcdef123456789\"\n value={coValueId}\n onChange={(e) => setCoValueId(e.target.value as CoID<RawCoValue>)}\n />\n <Button type=\"submit\" variant=\"primary\">\n Inspect CoValue\n </Button>\n\n {accountId && (\n <>\n <OrText>or</OrText>\n\n <Button\n variant=\"secondary\"\n onClick={() => {\n setCoValueId(accountId);\n setPage(accountId);\n }}\n >\n Inspect my account\n </Button>\n </>\n )}\n </InitialForm>\n )}\n </PageStack>\n </InspectorContainer>\n );\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 { 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 { styled } from \"goober\";\nimport React from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { PageInfo } from \"./types.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\ninterface BreadcrumbsProps {\n path: PageInfo[];\n onBreadcrumbClick: (index: number) => void;\n}\n\nexport const Breadcrumbs: React.FC<BreadcrumbsProps> = ({\n path,\n onBreadcrumbClick,\n}) => {\n return (\n <BreadcrumbsContainer>\n <Button\n variant=\"link\"\n style={{ padding: \"0 0.25rem\" }}\n onClick={() => onBreadcrumbClick(-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={() => onBreadcrumbClick(index)}\n >\n {index === 0 ? page.name || \"Root\" : page.name}\n </Button>\n </React.Fragment>\n );\n })}\n </BreadcrumbsContainer>\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\";\n\n// Define the structure of a page in the path\ninterface PageInfo {\n coId: CoID<RawCoValue>;\n name?: string;\n}\n\n// Props for the PageStack component\ninterface PageStackProps {\n path: PageInfo[];\n node?: LocalNode | null;\n goBack: () => void;\n addPages: (pages: PageInfo[]) => void;\n children?: React.ReactNode;\n}\n\nconst PageStackContainer = styled(\"div\")`\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\nexport function PageStack({\n path,\n node,\n goBack,\n addPages,\n children,\n}: PageStackProps) {\n const page = path[path.length - 1];\n const index = path.length - 1;\n\n return (\n <>\n <PageStackContainer>\n {children}\n {node && page && (\n <ErrorBoundary title=\"An error occurred while rendering this CoValue\">\n <Page\n coId={page.coId}\n node={node}\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 RawCoStream,\n RawCoValue,\n RawGroup,\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 <CoPlainTextView data={snapshot} />;\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 {\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 const isAccount = (coValue: JSONObject): coValue is ResolvedAccount => {\n return isGroup(coValue) && \"profile\" in coValue;\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 (isAccount(snapshot)) {\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 (isAccount(snapshot)) {\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}\n\nconst ModalContent = styled(\"dialog\")`\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 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 },\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 >\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 { 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 } from \"cojson\";\nimport { RawDataCard } from \"./raw-data-card.js\";\n\nexport function CoPlainTextView({ data }: { data: JsonObject }) {\n if (!data) return;\n\n return (\n <>\n <p>{Object.values(data).join(\"\")}</p>\n <RawDataCard data={data} />\n </>\n );\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 type { VerifiedTransaction } from \"cojson/dist/coValueCore/coValueCore.js\";\nimport { Icon, Accordion } from \"../ui\";\nimport * as TransactionChanges from \"../utils/transactions-changes\";\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 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 return tx.changes ?? (tx.tx as any).changes ?? [];\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 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 { 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 type { JsonObject, JsonValue, RawCoMap, Role } from \"cojson\";\nimport type { MapOpPayload } from \"cojson/dist/coValues/coMap.js\";\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 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 { CoID, RawCoValue } from \"cojson\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PageInfo } from \"./types.js\";\n\nconst STORAGE_KEY = \"jazz-inspector-paths\";\n\nexport function usePagePath(defaultPath?: PageInfo[]) {\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 addPages = useCallback(\n (newPages: PageInfo[]) => {\n updatePath([...path, ...newPages]);\n },\n [path, updatePath],\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n updatePath(path.slice(0, index + 1));\n },\n [path, updatePath],\n );\n\n const setPage = useCallback(\n (coId: CoID<RawCoValue>) => {\n updatePath([{ coId, name: \"Root\" }]);\n },\n [updatePath],\n );\n\n const goBack = useCallback(() => {\n if (path.length > 1) {\n updatePath(path.slice(0, path.length - 1));\n }\n }, [path, updatePath]);\n\n return {\n path,\n setPage,\n addPages,\n goToIndex,\n goBack,\n };\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 { styled } from \"goober\";\nimport React from \"react\";\n\nexport type Position =\n | \"bottom right\"\n | \"bottom left\"\n | \"top right\"\n | \"top left\"\n | \"right\"\n | \"left\";\n\nconst StyledInspectorButton = styled(\"button\")<{ position: Position }>`\n position: fixed;\n width: 2.5rem;\n height: 2.5rem;\n background-color: white;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n margin: 1rem;\n padding: 0.5rem !important;\n border: 1px solid #e5e3e4;\n border-radius: 0.375rem;\n z-index: 999;\n \n ${(props) => {\n switch (props.position) {\n case \"bottom right\":\n return \"bottom: 0; right: 0;\";\n case \"bottom left\":\n return \"bottom: 0; left: 0;\";\n case \"top right\":\n return \"top: 0; right: 0;\";\n case \"top left\":\n return \"top: 0; left: 0;\";\n case \"right\":\n return \"right: 0; top: 50%; transform: translateY(-50%);\";\n case \"left\":\n return \"left: 0; top: 50%; transform: translateY(-50%);\";\n default:\n return \"\";\n }\n }}\n`;\n\nconst JazzIcon = styled(\"svg\")`\n width: 100%;\n height: auto;\n position: relative;\n left: -1px;\n color: #146AFF;\n`;\n\nexport function InspectorButton({\n position = \"right\",\n ...buttonProps\n}: React.ComponentPropsWithoutRef<\"button\"> & { position?: Position }) {\n return (\n <StyledInspectorButton position={position} {...buttonProps}>\n <JazzIcon\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"119\"\n height=\"115\"\n viewBox=\"0 0 119 115\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M118.179 23.8277V0.167999C99.931 7.5527 79.9854 11.6192 59.0897 11.6192C47.1466 11.6192 35.5138 10.2908 24.331 7.7737V30.4076V60.1508C23.2955 59.4385 22.1568 58.8458 20.9405 58.3915C18.1732 57.358 15.128 57.0876 12.1902 57.6145C9.2524 58.1414 6.5539 59.4419 4.4358 61.3516C2.3178 63.2613 0.875401 65.6944 0.291001 68.3433C-0.293399 70.9921 0.00659978 73.7377 1.1528 76.2329C2.2991 78.728 4.2403 80.861 6.7308 82.361C9.2214 83.862 12.1495 84.662 15.1448 84.662C15.6054 84.662 15.8365 84.662 16.0314 84.659C26.5583 84.449 35.042 75.9656 35.2513 65.4386C35.2534 65.3306 35.2544 65.2116 35.2548 65.0486L35.2552 64.7149V64.5521V61.0762V32.1993C43.0533 33.2324 51.0092 33.7656 59.0897 33.7656C59.6696 33.7656 60.2489 33.7629 60.8276 33.7574V89.696C59.792 88.983 58.6533 88.391 57.437 87.936C54.6697 86.903 51.6246 86.632 48.6867 87.159C45.7489 87.686 43.0504 88.987 40.9323 90.896C38.8143 92.806 37.3719 95.239 36.7875 97.888C36.2032 100.537 36.5031 103.283 37.6494 105.778C38.7956 108.273 40.7368 110.405 43.2273 111.906C45.7179 113.406 48.646 114.207 51.6414 114.207C52.1024 114.207 52.3329 114.207 52.5279 114.203C63.0548 113.994 71.5385 105.51 71.7478 94.983C71.7517 94.788 71.7517 94.558 71.7517 94.097V90.621V33.3266C83.962 32.4768 95.837 30.4075 107.255 27.2397V59.9017C106.219 59.1894 105.081 58.5966 103.864 58.1424C101.097 57.1089 98.052 56.8384 95.114 57.3653C92.176 57.8922 89.478 59.1927 87.36 61.1025C85.242 63.0122 83.799 65.4453 83.215 68.0941C82.631 70.743 82.931 73.4886 84.077 75.9837C85.223 78.4789 87.164 80.612 89.655 82.112C92.145 83.612 95.073 84.413 98.069 84.413C98.53 84.413 98.76 84.413 98.955 84.409C109.482 84.2 117.966 75.7164 118.175 65.1895C118.179 64.9945 118.179 64.764 118.179 64.3029V60.8271V23.8277Z\"\n fill=\"currentColor\"\n />\n </JazzIcon>\n <span\n style={{\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 whiteSpace: \"nowrap\",\n border: \"0\",\n }}\n >\n Open Jazz Inspector\n </span>\n </StyledInspectorButton>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nconst STORAGE_KEY = \"jazz-inspector-open\";\n\nexport function useOpenInspector() {\n const [open, setOpen] = useState(() => {\n // Initialize from localStorage if available\n if (typeof window === \"undefined\") return false;\n const stored = localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : false;\n });\n\n // Update localStorage when open state changes\n useEffect(() => {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(open));\n }, [open]);\n\n return [open, setOpen];\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":["React","styled","useState","styled","forwardRef","jsx","styled","jsx","jsxs","styled","styled","styled","React","styled","jsx","styled","jsx","styled","React","jsx","useEffect","useState","useEffect","useState","styled","jsx","jsxs","styled","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","useId","jsx","jsxs","styled","useId","jsx","jsxs","useState","styled","styled","styled","jsx","Fragment","jsx","jsxs","useState","styled","useEffect","useState","styled","forwardRef","useEffect","jsx","jsxs","styled","forwardRef","useEffect","useEffect","useState","styled","React","jsx","Fragment","jsx","jsxs","useState","useEffect","styled","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","jsxs","styled","useMemo","useState","Fragment","jsx","jsxs","styled","useState","useMemo","coIdArray","visibleRows","useMemo","styled","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","Fragment","jsx","jsxs","styled","useEffect","useState","styled","styled","jsx","jsxs","useEffect","useState","STORAGE_KEY","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","styled","HeaderContainer","useState","jsx","React"]}
1
+ {"version":3,"sources":["../../src/inspector/index.tsx","../../src/inspector/viewer/new-app.tsx","../../src/inspector/ui/button.tsx","../../src/inspector/ui/input.tsx","../../src/inspector/viewer/breadcrumbs.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/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/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/viewer/use-page-path.ts","../../src/inspector/ui/global-styles.tsx","../../src/inspector/viewer/inspector-button.tsx","../../src/inspector/viewer/use-open-inspector.ts","../../src/inspector/viewer/delete-local-data.tsx"],"sourcesContent":["import React from \"react\";\n\nexport { JazzInspectorInternal } from \"./viewer/new-app.js\";\nexport { PageStack } from \"./viewer/page-stack.js\";\nexport { Breadcrumbs } from \"./viewer/breadcrumbs.js\";\nexport { AccountOrGroupText } from \"./viewer/account-or-group-text.js\";\n\nexport { Button } from \"./ui/button.js\";\nexport { Input } from \"./ui/input.js\";\nexport { Select } from \"./ui/select.js\";\nexport { Icon } from \"./ui/icon.js\";\nexport { GlobalStyles } from \"./ui/global-styles.js\";\n\nexport {\n resolveCoValue,\n useResolvedCoValue,\n} from \"./viewer/use-resolve-covalue.js\";\n\nexport type { PageInfo } from \"./viewer/types.js\";\n\nimport { setup } from \"goober\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\nimport { Account } from \"jazz-tools\";\n\nimport { JazzInspectorInternal } from \"./viewer/new-app.js\";\nimport { Position } from \"./viewer/inspector-button.js\";\n\nexport function JazzInspector({ position = \"right\" }: { position?: Position }) {\n const context = useJazzContext<Account>();\n const localNode = context.node;\n const me = \"me\" in context ? context.me : undefined;\n\n return (\n <JazzInspectorInternal\n position={position}\n localNode={localNode}\n accountId={me?.$jazz.raw.id}\n />\n );\n}\n\nsetup(React.createElement);\n","import { CoID, LocalNode, RawAccount, RawCoValue } from \"cojson\";\nimport { styled } from \"goober\";\nimport React, { useState } from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { Input } from \"../ui/input.js\";\nimport { Breadcrumbs } from \"./breadcrumbs.js\";\nimport { PageStack } from \"./page-stack.js\";\nimport { usePagePath } from \"./use-page-path.js\";\n\nimport { GlobalStyles } from \"../ui/global-styles.js\";\nimport { Heading } from \"../ui/heading.js\";\nimport { InspectorButton, type Position } from \"./inspector-button.js\";\nimport { useOpenInspector } from \"./use-open-inspector.js\";\nimport { DeleteLocalData } from \"./delete-local-data.js\";\n\nconst InspectorContainer = styled(\"div\")`\n position: fixed;\n height: 50vh;\n max-height: 800px;\n display: flex;\n flex-direction: column;\n bottom: 0;\n left: 0;\n width: 100%;\n background-color: white;\n border-top: 1px solid var(--j-border-color);\n color: var(--j-text-color);\n \n @media (prefers-color-scheme: dark) {\n background-color: var(--j-background);\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\nconst InitialForm = 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\nexport function JazzInspectorInternal({\n position = \"right\",\n localNode,\n accountId,\n}: {\n position?: Position;\n localNode?: LocalNode;\n accountId?: CoID<RawAccount>;\n}) {\n const [open, setOpen] = useOpenInspector();\n const [coValueId, setCoValueId] = useState<CoID<RawCoValue> | \"\">(\"\");\n const { path, addPages, goToIndex, goBack, setPage } = usePagePath();\n\n const handleCoValueIdSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (coValueId) {\n setPage(coValueId);\n }\n setCoValueId(\"\");\n };\n\n if (!open) {\n return (\n <InspectorButton position={position} onClick={() => setOpen(true)} />\n );\n }\n\n return (\n <InspectorContainer as={GlobalStyles} style={{ zIndex: 999 }}>\n <HeaderContainer>\n <Breadcrumbs path={path} onBreadcrumbClick={goToIndex} />\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 <DeleteLocalData />\n <Button variant=\"plain\" type=\"button\" onClick={() => setOpen(false)}>\n Close\n </Button>\n </HeaderContainer>\n\n <PageStack\n path={path}\n node={localNode}\n goBack={goBack}\n addPages={addPages}\n >\n {path.length <= 0 && (\n <InitialForm\n onSubmit={handleCoValueIdSubmit}\n aria-hidden={path.length !== 0}\n >\n <Heading>Jazz CoValue Inspector</Heading>\n <Input\n label=\"CoValue ID\"\n style={{ minWidth: \"21rem\", fontFamily: \"monospace\" }}\n hideLabel\n placeholder=\"co_z1234567890abcdef123456789\"\n value={coValueId}\n onChange={(e) => setCoValueId(e.target.value as CoID<RawCoValue>)}\n />\n <Button type=\"submit\" variant=\"primary\">\n Inspect CoValue\n </Button>\n\n {accountId && (\n <>\n <OrText>or</OrText>\n\n <Button\n variant=\"secondary\"\n onClick={() => {\n setCoValueId(accountId);\n setPage(accountId);\n }}\n >\n Inspect my account\n </Button>\n </>\n )}\n </InitialForm>\n )}\n </PageStack>\n </InspectorContainer>\n );\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 { 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 { styled } from \"goober\";\nimport React from \"react\";\nimport { Button } from \"../ui/button.js\";\nimport { PageInfo } from \"./types.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\ninterface BreadcrumbsProps {\n path: PageInfo[];\n onBreadcrumbClick: (index: number) => void;\n}\n\nexport const Breadcrumbs: React.FC<BreadcrumbsProps> = ({\n path,\n onBreadcrumbClick,\n}) => {\n return (\n <BreadcrumbsContainer>\n <Button\n variant=\"link\"\n style={{ padding: \"0 0.25rem\" }}\n onClick={() => onBreadcrumbClick(-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={() => onBreadcrumbClick(index)}\n >\n {index === 0 ? page.name || \"Root\" : page.name}\n </Button>\n </React.Fragment>\n );\n })}\n </BreadcrumbsContainer>\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\";\n\n// Define the structure of a page in the path\ninterface PageInfo {\n coId: CoID<RawCoValue>;\n name?: string;\n}\n\n// Props for the PageStack component\ninterface PageStackProps {\n path: PageInfo[];\n node?: LocalNode | null;\n goBack: () => void;\n addPages: (pages: PageInfo[]) => void;\n children?: React.ReactNode;\n}\n\nconst PageStackContainer = styled(\"div\")`\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\nexport function PageStack({\n path,\n node,\n goBack,\n addPages,\n children,\n}: PageStackProps) {\n const page = path[path.length - 1];\n const index = path.length - 1;\n\n return (\n <>\n <PageStackContainer>\n {children}\n {node && page && (\n <ErrorBoundary title=\"An error occurred while rendering this CoValue\">\n <Page\n coId={page.coId}\n node={node}\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 RawGroup,\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 {\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}\n\nconst ModalContent = styled(\"dialog\")`\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 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 },\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 >\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 { 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 { CoID, RawCoValue } from \"cojson\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PageInfo } from \"./types.js\";\n\nconst STORAGE_KEY = \"jazz-inspector-paths\";\n\nexport function usePagePath(defaultPath?: PageInfo[]) {\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 addPages = useCallback(\n (newPages: PageInfo[]) => {\n updatePath([...path, ...newPages]);\n },\n [path, updatePath],\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n updatePath(path.slice(0, index + 1));\n },\n [path, updatePath],\n );\n\n const setPage = useCallback(\n (coId: CoID<RawCoValue>) => {\n updatePath([{ coId, name: \"Root\" }]);\n },\n [updatePath],\n );\n\n const goBack = useCallback(() => {\n if (path.length > 1) {\n updatePath(path.slice(0, path.length - 1));\n }\n }, [path, updatePath]);\n\n return {\n path,\n setPage,\n addPages,\n goToIndex,\n goBack,\n };\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 { styled } from \"goober\";\nimport React from \"react\";\n\nexport type Position =\n | \"bottom right\"\n | \"bottom left\"\n | \"top right\"\n | \"top left\"\n | \"right\"\n | \"left\";\n\nconst StyledInspectorButton = styled(\"button\")<{ position: Position }>`\n position: fixed;\n width: 2.5rem;\n height: 2.5rem;\n background-color: white;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n margin: 1rem;\n padding: 0.5rem !important;\n border: 1px solid #e5e3e4;\n border-radius: 0.375rem;\n z-index: 999;\n \n ${(props) => {\n switch (props.position) {\n case \"bottom right\":\n return \"bottom: 0; right: 0;\";\n case \"bottom left\":\n return \"bottom: 0; left: 0;\";\n case \"top right\":\n return \"top: 0; right: 0;\";\n case \"top left\":\n return \"top: 0; left: 0;\";\n case \"right\":\n return \"right: 0; top: 50%; transform: translateY(-50%);\";\n case \"left\":\n return \"left: 0; top: 50%; transform: translateY(-50%);\";\n default:\n return \"\";\n }\n }}\n`;\n\nconst JazzIcon = styled(\"svg\")`\n width: 100%;\n height: auto;\n position: relative;\n left: -1px;\n color: #146AFF;\n`;\n\nexport function InspectorButton({\n position = \"right\",\n ...buttonProps\n}: React.ComponentPropsWithoutRef<\"button\"> & { position?: Position }) {\n return (\n <StyledInspectorButton position={position} {...buttonProps}>\n <JazzIcon\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"119\"\n height=\"115\"\n viewBox=\"0 0 119 115\"\n fill=\"none\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M118.179 23.8277V0.167999C99.931 7.5527 79.9854 11.6192 59.0897 11.6192C47.1466 11.6192 35.5138 10.2908 24.331 7.7737V30.4076V60.1508C23.2955 59.4385 22.1568 58.8458 20.9405 58.3915C18.1732 57.358 15.128 57.0876 12.1902 57.6145C9.2524 58.1414 6.5539 59.4419 4.4358 61.3516C2.3178 63.2613 0.875401 65.6944 0.291001 68.3433C-0.293399 70.9921 0.00659978 73.7377 1.1528 76.2329C2.2991 78.728 4.2403 80.861 6.7308 82.361C9.2214 83.862 12.1495 84.662 15.1448 84.662C15.6054 84.662 15.8365 84.662 16.0314 84.659C26.5583 84.449 35.042 75.9656 35.2513 65.4386C35.2534 65.3306 35.2544 65.2116 35.2548 65.0486L35.2552 64.7149V64.5521V61.0762V32.1993C43.0533 33.2324 51.0092 33.7656 59.0897 33.7656C59.6696 33.7656 60.2489 33.7629 60.8276 33.7574V89.696C59.792 88.983 58.6533 88.391 57.437 87.936C54.6697 86.903 51.6246 86.632 48.6867 87.159C45.7489 87.686 43.0504 88.987 40.9323 90.896C38.8143 92.806 37.3719 95.239 36.7875 97.888C36.2032 100.537 36.5031 103.283 37.6494 105.778C38.7956 108.273 40.7368 110.405 43.2273 111.906C45.7179 113.406 48.646 114.207 51.6414 114.207C52.1024 114.207 52.3329 114.207 52.5279 114.203C63.0548 113.994 71.5385 105.51 71.7478 94.983C71.7517 94.788 71.7517 94.558 71.7517 94.097V90.621V33.3266C83.962 32.4768 95.837 30.4075 107.255 27.2397V59.9017C106.219 59.1894 105.081 58.5966 103.864 58.1424C101.097 57.1089 98.052 56.8384 95.114 57.3653C92.176 57.8922 89.478 59.1927 87.36 61.1025C85.242 63.0122 83.799 65.4453 83.215 68.0941C82.631 70.743 82.931 73.4886 84.077 75.9837C85.223 78.4789 87.164 80.612 89.655 82.112C92.145 83.612 95.073 84.413 98.069 84.413C98.53 84.413 98.76 84.413 98.955 84.409C109.482 84.2 117.966 75.7164 118.175 65.1895C118.179 64.9945 118.179 64.764 118.179 64.3029V60.8271V23.8277Z\"\n fill=\"currentColor\"\n />\n </JazzIcon>\n <span\n style={{\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 whiteSpace: \"nowrap\",\n border: \"0\",\n }}\n >\n Open Jazz Inspector\n </span>\n </StyledInspectorButton>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nconst STORAGE_KEY = \"jazz-inspector-open\";\n\nexport function useOpenInspector() {\n const [open, setOpen] = useState(() => {\n // Initialize from localStorage if available\n if (typeof window === \"undefined\") return false;\n const stored = localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : false;\n });\n\n // Update localStorage when open state changes\n useEffect(() => {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(open));\n }, [open]);\n\n return [open, setOpen];\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":["React","styled","useState","styled","forwardRef","jsx","styled","jsx","jsxs","styled","styled","styled","React","styled","jsx","styled","jsx","styled","React","jsx","useEffect","useState","useEffect","useState","styled","jsx","jsxs","styled","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","useId","jsx","jsxs","styled","useId","jsx","jsxs","useState","styled","styled","styled","jsx","Fragment","jsx","jsxs","useState","styled","useEffect","useState","styled","forwardRef","useEffect","jsx","jsxs","styled","forwardRef","useEffect","useEffect","useState","styled","React","jsx","Fragment","jsx","jsxs","useState","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","Fragment","jsx","jsxs","styled","useEffect","useState","styled","styled","jsx","jsxs","useEffect","useState","STORAGE_KEY","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","styled","HeaderContainer","useState","jsx","React"]}