@dxos/plugin-preview 0.8.2-main.fbd8ed0 → 0.8.2-staging.42af850

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 (45) hide show
  1. package/dist/lib/browser/chunk-B2VK6GFP.mjs +28 -0
  2. package/dist/lib/browser/chunk-B2VK6GFP.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +17 -309
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/preview-popover-S3OY3CFZ.mjs +65 -0
  7. package/dist/lib/browser/preview-popover-S3OY3CFZ.mjs.map +7 -0
  8. package/dist/lib/browser/react-surface-XDHP6EN7.mjs +285 -0
  9. package/dist/lib/browser/react-surface-XDHP6EN7.mjs.map +7 -0
  10. package/dist/lib/node/chunk-VFSOM2B4.cjs +55 -0
  11. package/dist/lib/node/chunk-VFSOM2B4.cjs.map +7 -0
  12. package/dist/lib/node/index.cjs +20 -314
  13. package/dist/lib/node/index.cjs.map +4 -4
  14. package/dist/lib/node/meta.json +1 -1
  15. package/dist/lib/node/preview-popover-GPBOHU5E.cjs +84 -0
  16. package/dist/lib/node/preview-popover-GPBOHU5E.cjs.map +7 -0
  17. package/dist/lib/node/react-surface-CPAQ7ZYR.cjs +297 -0
  18. package/dist/lib/node/react-surface-CPAQ7ZYR.cjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-PYKIS3N7.mjs +30 -0
  20. package/dist/lib/node-esm/chunk-PYKIS3N7.mjs.map +7 -0
  21. package/dist/lib/node-esm/index.mjs +17 -310
  22. package/dist/lib/node-esm/index.mjs.map +4 -4
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/preview-popover-EQAEYYDT.mjs +67 -0
  25. package/dist/lib/node-esm/preview-popover-EQAEYYDT.mjs.map +7 -0
  26. package/dist/lib/node-esm/react-surface-QJRHN4PN.mjs +286 -0
  27. package/dist/lib/node-esm/react-surface-QJRHN4PN.mjs.map +7 -0
  28. package/dist/types/src/Preview.stories.d.ts +6 -6
  29. package/dist/types/src/PreviewPlugin.d.ts.map +1 -1
  30. package/dist/types/src/capabilities/index.d.ts +3 -0
  31. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  32. package/dist/types/src/capabilities/preview-popover.d.ts +4 -0
  33. package/dist/types/src/capabilities/preview-popover.d.ts.map +1 -0
  34. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  35. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  36. package/dist/types/src/components/OrganizationCard.d.ts.map +1 -1
  37. package/dist/types/src/types.d.ts +1 -1
  38. package/dist/types/src/types.d.ts.map +1 -1
  39. package/package.json +20 -19
  40. package/src/PreviewPlugin.tsx +5 -184
  41. package/src/capabilities/index.ts +8 -0
  42. package/src/capabilities/preview-popover.ts +65 -0
  43. package/src/capabilities/react-surface.tsx +126 -0
  44. package/src/components/OrganizationCard.tsx +8 -2
  45. package/src/types.ts +1 -1
@@ -0,0 +1,285 @@
1
+ import {
2
+ PREVIEW_PLUGIN,
3
+ defaultCard,
4
+ kanbanCardWithoutPoster,
5
+ popoverCard,
6
+ previewChrome,
7
+ previewProse,
8
+ previewTitle
9
+ } from "./chunk-B2VK6GFP.mjs";
10
+
11
+ // packages/plugins/plugin-preview/src/capabilities/react-surface.tsx
12
+ import React4, { useCallback } from "react";
13
+ import { Capabilities, LayoutAction, Surface, contributes, createIntent, createSurface, useIntentDispatcher } from "@dxos/app-framework";
14
+ import { Filter, fullyQualifiedId, getSchema, getSpace, isEchoObject } from "@dxos/client/echo";
15
+ import { isInstanceOf, setValue } from "@dxos/echo-schema";
16
+ import { useTranslation } from "@dxos/react-ui";
17
+ import { Form } from "@dxos/react-ui-form";
18
+ import { TableType } from "@dxos/react-ui-table";
19
+ import { descriptionMessage } from "@dxos/react-ui-theme";
20
+ import { DataType } from "@dxos/schema";
21
+
22
+ // packages/plugins/plugin-preview/src/components/ContactCard.tsx
23
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
24
+ import React, { Fragment } from "react";
25
+ import { Icon, Avatar, Button } from "@dxos/react-ui";
26
+ import { mx } from "@dxos/react-ui-theme";
27
+ var ContactCard = ({ children, classNames, role, subject: { fullName, image, organization, emails }, onOrgClick }) => {
28
+ var _effect = _useSignals();
29
+ try {
30
+ const organizationName = organization && typeof organization === "object" ? organization.target?.name : organization;
31
+ return /* @__PURE__ */ React.createElement("div", {
32
+ role: "none",
33
+ className: mx(role === "popover" ? popoverCard : defaultCard, classNames)
34
+ }, /* @__PURE__ */ React.createElement(Avatar.Root, null, /* @__PURE__ */ React.createElement("div", {
35
+ role: "group",
36
+ className: mx(previewProse, "grid gap-3 grid-cols-[min-content_1fr]")
37
+ }, /* @__PURE__ */ React.createElement(Avatar.Content, {
38
+ imgSrc: image,
39
+ icon: "ph--user--regular",
40
+ size: 16,
41
+ hue: "neutral"
42
+ }), /* @__PURE__ */ React.createElement("div", {
43
+ role: "none",
44
+ className: "bs-min self-center"
45
+ }, /* @__PURE__ */ React.createElement(Avatar.Label, {
46
+ asChild: true
47
+ }, /* @__PURE__ */ React.createElement("h2", {
48
+ className: previewTitle
49
+ }, fullName))))), organizationName && /* @__PURE__ */ React.createElement("div", {
50
+ role: "none",
51
+ className: previewChrome
52
+ }, typeof organization === "object" && onOrgClick ? /* @__PURE__ */ React.createElement(Button, {
53
+ variant: "ghost",
54
+ classNames: "gap-2 text-start",
55
+ onClick: () => onOrgClick(organization.target)
56
+ }, /* @__PURE__ */ React.createElement(Icon, {
57
+ icon: "ph--buildings--regular",
58
+ size: 5,
59
+ classNames: "text-subdued"
60
+ }), /* @__PURE__ */ React.createElement("span", {
61
+ className: "min-is-0 flex-1 truncate"
62
+ }, organizationName), /* @__PURE__ */ React.createElement(Icon, {
63
+ icon: "ph--arrow-right--regular"
64
+ })) : /* @__PURE__ */ React.createElement("p", {
65
+ className: "dx-button gap-2",
66
+ "data-variant": "ghost"
67
+ }, /* @__PURE__ */ React.createElement(Icon, {
68
+ icon: "ph--buildings--regular",
69
+ size: 5,
70
+ classNames: "text-subdued"
71
+ }), /* @__PURE__ */ React.createElement("span", {
72
+ className: "min-is-0 flex-1 truncate"
73
+ }, organizationName))), /* @__PURE__ */ React.createElement("dl", {
74
+ className: mx(previewProse, "grid gap-2 grid-cols-[min-content_1fr] [&_dt]:text-subdued [&_dt]:pbs-0.5 [&_dd]:min-is-0")
75
+ }, emails?.length && emails.map(({ label, value }) => /* @__PURE__ */ React.createElement(Fragment, {
76
+ key: value
77
+ }, /* @__PURE__ */ React.createElement("dt", null, /* @__PURE__ */ React.createElement(Icon, {
78
+ icon: "ph--at--regular",
79
+ size: 5
80
+ })), /* @__PURE__ */ React.createElement("dd", {
81
+ key: value,
82
+ className: "break-words"
83
+ }, value)))), children);
84
+ } finally {
85
+ _effect.f();
86
+ }
87
+ };
88
+
89
+ // packages/plugins/plugin-preview/src/components/OrganizationCard.tsx
90
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
91
+ import React2 from "react";
92
+ import { Icon as Icon2 } from "@dxos/react-ui";
93
+ import { mx as mx2 } from "@dxos/react-ui-theme";
94
+ var OrganizationCard = ({ children, classNames, subject: { name, image, description, website }, role }) => {
95
+ var _effect = _useSignals2();
96
+ try {
97
+ return /* @__PURE__ */ React2.createElement("div", {
98
+ role: "none",
99
+ className: mx2(role === "popover" ? popoverCard : defaultCard, classNames)
100
+ }, image ? /* @__PURE__ */ React2.createElement("img", {
101
+ className: "aspect-video object-cover is-full bs-auto",
102
+ src: image,
103
+ alt: name
104
+ }) : /* @__PURE__ */ React2.createElement("div", {
105
+ role: "image",
106
+ className: "grid aspect-video place-items-center bg-inputSurface text-subdued"
107
+ }, /* @__PURE__ */ React2.createElement(Icon2, {
108
+ icon: "ph--building-office--regular",
109
+ size: 10
110
+ })), /* @__PURE__ */ React2.createElement("h2", {
111
+ className: mx2(previewTitle, previewProse)
112
+ }, name), description && /* @__PURE__ */ React2.createElement("p", {
113
+ className: mx2(previewProse, "line-clamp-2")
114
+ }, description), website && /* @__PURE__ */ React2.createElement("div", {
115
+ role: "none",
116
+ className: previewChrome
117
+ }, /* @__PURE__ */ React2.createElement("a", {
118
+ className: "dx-button dx-focus-ring gap-2",
119
+ "data-variant": "ghost",
120
+ href: website,
121
+ target: "_blank",
122
+ rel: "noreferrer"
123
+ }, /* @__PURE__ */ React2.createElement(Icon2, {
124
+ icon: "ph--link--regular",
125
+ size: 5,
126
+ classNames: "text-subdued"
127
+ }), /* @__PURE__ */ React2.createElement("span", {
128
+ className: "grow"
129
+ }, website), /* @__PURE__ */ React2.createElement(Icon2, {
130
+ icon: "ph--arrow-square-out--regular"
131
+ }))), children);
132
+ } finally {
133
+ _effect.f();
134
+ }
135
+ };
136
+
137
+ // packages/plugins/plugin-preview/src/components/ProjectCard.tsx
138
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
139
+ import React3 from "react";
140
+ import { mx as mx3 } from "@dxos/react-ui-theme";
141
+ var ProjectCard = ({ classNames, role, subject: { name, image, description } }) => {
142
+ var _effect = _useSignals3();
143
+ try {
144
+ return /* @__PURE__ */ React3.createElement("div", {
145
+ role: "none",
146
+ className: mx3(role === "popover" ? popoverCard : defaultCard, classNames)
147
+ }, image && /* @__PURE__ */ React3.createElement("img", {
148
+ className: "is-full bs-auto",
149
+ src: image,
150
+ alt: name
151
+ }), /* @__PURE__ */ React3.createElement("h2", {
152
+ className: mx3(previewTitle, "pli-3 mlb-3")
153
+ }, name), description && /* @__PURE__ */ React3.createElement("p", {
154
+ className: "pli-3 line-clamp-2 mlb-3"
155
+ }, description));
156
+ } finally {
157
+ _effect.f();
158
+ }
159
+ };
160
+
161
+ // packages/plugins/plugin-preview/src/capabilities/react-surface.tsx
162
+ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
163
+ //
164
+ // Specific schema types.
165
+ //
166
+ createSurface({
167
+ id: `${PREVIEW_PLUGIN}/schema-popover--contact`,
168
+ role: [
169
+ "popover",
170
+ "card--kanban",
171
+ "card"
172
+ ],
173
+ filter: (data) => isInstanceOf(DataType.Person, data.subject),
174
+ component: ({ data, role }) => {
175
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
176
+ const handleOrgClick = useCallback(async (org) => {
177
+ const space = getSpace(org);
178
+ const tablesQuery = await space?.db.query(Filter.type(TableType)).run();
179
+ const currentSpaceOrgTable = tablesQuery?.objects.find((table) => {
180
+ return table.view?.target?.query?.typename === DataType.Organization.typename;
181
+ });
182
+ await dispatch(createIntent(LayoutAction.UpdatePopover, {
183
+ part: "popover",
184
+ options: {
185
+ state: false,
186
+ anchorId: ""
187
+ }
188
+ }));
189
+ if (currentSpaceOrgTable) {
190
+ return dispatch(createIntent(LayoutAction.Open, {
191
+ part: "main",
192
+ subject: [
193
+ fullyQualifiedId(currentSpaceOrgTable)
194
+ ],
195
+ options: {
196
+ workspace: space?.id
197
+ }
198
+ }));
199
+ }
200
+ }, [
201
+ dispatch
202
+ ]);
203
+ return /* @__PURE__ */ React4.createElement(ContactCard, {
204
+ subject: data.subject,
205
+ onOrgClick: handleOrgClick,
206
+ role
207
+ }, role === "popover" && /* @__PURE__ */ React4.createElement(Surface, {
208
+ role: "related",
209
+ data
210
+ }));
211
+ }
212
+ }),
213
+ createSurface({
214
+ id: `${PREVIEW_PLUGIN}/schema-popover--organization`,
215
+ role: [
216
+ "popover",
217
+ "card--kanban",
218
+ "card"
219
+ ],
220
+ filter: (data) => isInstanceOf(DataType.Organization, data.subject),
221
+ component: ({ data, role }) => /* @__PURE__ */ React4.createElement(OrganizationCard, {
222
+ subject: data.subject,
223
+ role
224
+ }, role === "popover" && /* @__PURE__ */ React4.createElement(Surface, {
225
+ role: "related",
226
+ data
227
+ }))
228
+ }),
229
+ createSurface({
230
+ id: `${PREVIEW_PLUGIN}/schema-popover--project`,
231
+ role: [
232
+ "popover",
233
+ "card--kanban",
234
+ "card"
235
+ ],
236
+ filter: (data) => isInstanceOf(DataType.Project, data.subject),
237
+ component: ({ data, role }) => /* @__PURE__ */ React4.createElement(ProjectCard, {
238
+ subject: data.subject,
239
+ role
240
+ })
241
+ }),
242
+ //
243
+ // Fallback for any object.
244
+ //
245
+ createSurface({
246
+ id: `${PREVIEW_PLUGIN}/fallback-popover`,
247
+ role: [
248
+ "popover",
249
+ "card--kanban",
250
+ "card"
251
+ ],
252
+ position: "fallback",
253
+ filter: (data) => isEchoObject(data.subject),
254
+ component: ({ data, role }) => {
255
+ const schema = getSchema(data.subject);
256
+ const { t } = useTranslation(PREVIEW_PLUGIN);
257
+ if (!schema) {
258
+ return /* @__PURE__ */ React4.createElement("p", {
259
+ className: descriptionMessage
260
+ }, t("unable to create preview message"));
261
+ }
262
+ const handleSave = useCallback((values, { changed }) => {
263
+ const changedPaths = Object.keys(changed).filter((path) => changed[path]);
264
+ for (const path of changedPaths) {
265
+ const value = values[path];
266
+ setValue(data.subject, path, value);
267
+ }
268
+ }, []);
269
+ return /* @__PURE__ */ React4.createElement(Form, {
270
+ schema,
271
+ values: data.subject,
272
+ readonly: role === "popover",
273
+ onSave: handleSave,
274
+ autoSave: true,
275
+ ...role === "card--kanban" && {
276
+ classNames: kanbanCardWithoutPoster
277
+ }
278
+ });
279
+ }
280
+ })
281
+ ]);
282
+ export {
283
+ react_surface_default as default
284
+ };
285
+ //# sourceMappingURL=react-surface-XDHP6EN7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/ContactCard.tsx", "../../../src/components/OrganizationCard.tsx", "../../../src/components/ProjectCard.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport {\n Capabilities,\n LayoutAction,\n Surface,\n contributes,\n createIntent,\n createSurface,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { Filter, fullyQualifiedId, getSchema, getSpace, isEchoObject, type AnyLiveObject } from '@dxos/client/echo';\nimport { isInstanceOf, type JsonPath, setValue } from '@dxos/echo-schema';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { TableType } from '@dxos/react-ui-table';\nimport { descriptionMessage } from '@dxos/react-ui-theme';\nimport { DataType } from '@dxos/schema';\n\nimport { ContactCard, OrganizationCard, ProjectCard } from '../components';\nimport { PREVIEW_PLUGIN } from '../meta';\nimport { kanbanCardWithoutPoster } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n //\n // Specific schema types.\n //\n createSurface({\n id: `${PREVIEW_PLUGIN}/schema-popover--contact`,\n role: ['popover', 'card--kanban', 'card'],\n filter: (data): data is { subject: DataType.Person } => isInstanceOf(DataType.Person, data.subject),\n component: ({ data, role }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const handleOrgClick = useCallback(\n async (org: DataType.Organization) => {\n const space = getSpace(org);\n const tablesQuery = await space?.db.query(Filter.type(TableType)).run();\n const currentSpaceOrgTable = tablesQuery?.objects.find((table) => {\n return table.view?.target?.query?.typename === DataType.Organization.typename;\n });\n await dispatch(\n createIntent(LayoutAction.UpdatePopover, {\n part: 'popover',\n options: {\n state: false,\n anchorId: '',\n },\n }),\n );\n if (currentSpaceOrgTable) {\n return dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [fullyQualifiedId(currentSpaceOrgTable)],\n options: { workspace: space?.id },\n }),\n );\n }\n },\n [dispatch],\n );\n return (\n <ContactCard subject={data.subject} onOrgClick={handleOrgClick} role={role}>\n {role === 'popover' && <Surface role='related' data={data} />}\n </ContactCard>\n );\n },\n }),\n createSurface({\n id: `${PREVIEW_PLUGIN}/schema-popover--organization`,\n role: ['popover', 'card--kanban', 'card'],\n filter: (data): data is { subject: DataType.Organization } => isInstanceOf(DataType.Organization, data.subject),\n component: ({ data, role }) => (\n <OrganizationCard subject={data.subject} role={role}>\n {role === 'popover' && <Surface role='related' data={data} />}\n </OrganizationCard>\n ),\n }),\n createSurface({\n id: `${PREVIEW_PLUGIN}/schema-popover--project`,\n role: ['popover', 'card--kanban', 'card'],\n filter: (data): data is { subject: DataType.Project } => isInstanceOf(DataType.Project, data.subject),\n component: ({ data, role }) => <ProjectCard subject={data.subject} role={role} />,\n }),\n\n //\n // Fallback for any object.\n //\n createSurface({\n id: `${PREVIEW_PLUGIN}/fallback-popover`,\n role: ['popover', 'card--kanban', 'card'],\n position: 'fallback',\n filter: (data): data is { subject: AnyLiveObject<any> } => isEchoObject(data.subject),\n component: ({ data, role }) => {\n const schema = getSchema(data.subject);\n const { t } = useTranslation(PREVIEW_PLUGIN);\n if (!schema) {\n return <p className={descriptionMessage}>{t('unable to create preview message')}</p>;\n }\n\n const handleSave = useCallback((values: any, { changed }: { changed: Record<string, boolean> }) => {\n const changedPaths = Object.keys(changed).filter((path) => changed[path]);\n for (const path of changedPaths) {\n const value = values[path];\n setValue(data.subject, path as JsonPath, value);\n }\n }, []);\n\n return (\n <Form\n schema={schema}\n values={data.subject}\n readonly={role === 'popover'}\n onSave={handleSave}\n autoSave\n {...(role === 'card--kanban' && { classNames: kanbanCardWithoutPoster })}\n />\n );\n },\n }),\n ]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment } from 'react';\n\nimport { Icon, Avatar, Button } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\n\nimport { type PreviewProps, popoverCard, previewTitle, previewProse, previewChrome, defaultCard } from '../types';\n\nexport const ContactCard = ({\n children,\n classNames,\n role,\n subject: { fullName, image, organization, emails },\n onOrgClick,\n}: PreviewProps<DataType.Person> & { onOrgClick?: (org: DataType.Organization) => void }) => {\n const organizationName = organization && typeof organization === 'object' ? organization.target?.name : organization;\n return (\n <div role='none' className={mx(role === 'popover' ? popoverCard : defaultCard, classNames)}>\n <Avatar.Root>\n <div role='group' className={mx(previewProse, 'grid gap-3 grid-cols-[min-content_1fr]')}>\n <Avatar.Content imgSrc={image} icon='ph--user--regular' size={16} hue='neutral' />\n <div role='none' className='bs-min self-center'>\n <Avatar.Label asChild>\n <h2 className={previewTitle}>{fullName}</h2>\n </Avatar.Label>\n </div>\n </div>\n </Avatar.Root>\n {organizationName && (\n <div role='none' className={previewChrome}>\n {typeof organization === 'object' && onOrgClick ? (\n <Button variant='ghost' classNames='gap-2 text-start' onClick={() => onOrgClick(organization.target!)}>\n <Icon icon='ph--buildings--regular' size={5} classNames='text-subdued' />\n <span className='min-is-0 flex-1 truncate'>{organizationName}</span>\n <Icon icon='ph--arrow-right--regular' />\n </Button>\n ) : (\n <p className='dx-button gap-2' data-variant='ghost'>\n <Icon icon='ph--buildings--regular' size={5} classNames='text-subdued' />\n <span className='min-is-0 flex-1 truncate'>{organizationName}</span>\n </p>\n )}\n </div>\n )}\n <dl\n className={mx(\n previewProse,\n 'grid gap-2 grid-cols-[min-content_1fr] [&_dt]:text-subdued [&_dt]:pbs-0.5 [&_dd]:min-is-0',\n )}\n >\n {emails?.length &&\n emails.map(({ label, value }) => (\n <Fragment key={value}>\n <dt>\n <Icon icon='ph--at--regular' size={5} />\n </dt>\n <dd key={value} className='break-words'>\n {value}\n </dd>\n </Fragment>\n ))}\n </dl>\n {children}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Icon } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\n\nimport { type PreviewProps, popoverCard, previewTitle, previewProse, previewChrome, defaultCard } from '../types';\n\nexport const OrganizationCard = ({\n children,\n classNames,\n subject: { name, image, description, website },\n role,\n}: PreviewProps<DataType.Organization>) => {\n return (\n <div role='none' className={mx(role === 'popover' ? popoverCard : defaultCard, classNames)}>\n {image ? (\n <img className='aspect-video object-cover is-full bs-auto' src={image} alt={name} />\n ) : (\n <div role='image' className='grid aspect-video place-items-center bg-inputSurface text-subdued'>\n <Icon icon='ph--building-office--regular' size={10} />\n </div>\n )}\n <h2 className={mx(previewTitle, previewProse)}>{name}</h2>\n {description && <p className={mx(previewProse, 'line-clamp-2')}>{description}</p>}\n {website && (\n <div role='none' className={previewChrome}>\n <a\n className='dx-button dx-focus-ring gap-2'\n data-variant='ghost'\n href={website}\n target='_blank'\n rel='noreferrer'\n >\n <Icon icon='ph--link--regular' size={5} classNames='text-subdued' />\n <span className='grow'>{website}</span>\n <Icon icon='ph--arrow-square-out--regular' />\n </a>\n </div>\n )}\n {children}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\n\nimport { type PreviewProps, popoverCard, previewTitle, defaultCard } from '../types';\n\nexport const ProjectCard = ({\n classNames,\n role,\n subject: { name, image, description },\n}: PreviewProps<DataType.Project>) => {\n return (\n <div role='none' className={mx(role === 'popover' ? popoverCard : defaultCard, classNames)}>\n {image && <img className='is-full bs-auto' src={image} alt={name} />}\n <h2 className={mx(previewTitle, 'pli-3 mlb-3')}>{name}</h2>\n {description && <p className='pli-3 line-clamp-2 mlb-3'>{description}</p>}\n </div>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;AAIA,OAAOA,UAASC,mBAAmB;AAEnC,SACEC,cACAC,cACAC,SACAC,aACAC,cACAC,eACAC,2BACK;AACP,SAASC,QAAQC,kBAAkBC,WAAWC,UAAUC,oBAAwC;AAChG,SAASC,cAA6BC,gBAAgB;AACtD,SAASC,sBAAsB;AAC/B,SAASC,YAAY;AACrB,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,gBAAgB;;;;ACjBzB,OAAOC,SAASC,gBAAgB;AAEhC,SAASC,MAAMC,QAAQC,cAAc;AACrC,SAASC,UAAU;AAKZ,IAAMC,cAAc,CAAC,EAC1BC,UACAC,YACAC,MACAC,SAAS,EAAEC,UAAUC,OAAOC,cAAcC,OAAM,GAChDC,WAAU,MAC4E;;;AACtF,UAAMC,mBAAmBH,gBAAgB,OAAOA,iBAAiB,WAAWA,aAAaI,QAAQC,OAAOL;AACxG,WACE,sBAAA,cAACM,OAAAA;MAAIV,MAAK;MAAOW,WAAWC,GAAGZ,SAAS,YAAYa,cAAcC,aAAaf,UAAAA;OAC7E,sBAAA,cAACgB,OAAOC,MAAI,MACV,sBAAA,cAACN,OAAAA;MAAIV,MAAK;MAAQW,WAAWC,GAAGK,cAAc,wCAAA;OAC5C,sBAAA,cAACF,OAAOG,SAAO;MAACC,QAAQhB;MAAOiB,MAAK;MAAoBC,MAAM;MAAIC,KAAI;QACtE,sBAAA,cAACZ,OAAAA;MAAIV,MAAK;MAAOW,WAAU;OACzB,sBAAA,cAACI,OAAOQ,OAAK;MAACC,SAAAA;OACZ,sBAAA,cAACC,MAAAA;MAAGd,WAAWe;OAAexB,QAAAA,CAAAA,CAAAA,CAAAA,CAAAA,GAKrCK,oBACC,sBAAA,cAACG,OAAAA;MAAIV,MAAK;MAAOW,WAAWgB;OACzB,OAAOvB,iBAAiB,YAAYE,aACnC,sBAAA,cAACsB,QAAAA;MAAOC,SAAQ;MAAQ9B,YAAW;MAAmB+B,SAAS,MAAMxB,WAAWF,aAAaI,MAAM;OACjG,sBAAA,cAACuB,MAAAA;MAAKX,MAAK;MAAyBC,MAAM;MAAGtB,YAAW;QACxD,sBAAA,cAACiC,QAAAA;MAAKrB,WAAU;OAA4BJ,gBAAAA,GAC5C,sBAAA,cAACwB,MAAAA;MAAKX,MAAK;UAGb,sBAAA,cAACa,KAAAA;MAAEtB,WAAU;MAAkBuB,gBAAa;OAC1C,sBAAA,cAACH,MAAAA;MAAKX,MAAK;MAAyBC,MAAM;MAAGtB,YAAW;QACxD,sBAAA,cAACiC,QAAAA;MAAKrB,WAAU;OAA4BJ,gBAAAA,CAAAA,CAAAA,GAKpD,sBAAA,cAAC4B,MAAAA;MACCxB,WAAWC,GACTK,cACA,2FAAA;OAGDZ,QAAQ+B,UACP/B,OAAOgC,IAAI,CAAC,EAAEC,OAAOC,MAAK,MACxB,sBAAA,cAACC,UAAAA;MAASC,KAAKF;OACb,sBAAA,cAACG,MAAAA,MACC,sBAAA,cAACX,MAAAA;MAAKX,MAAK;MAAkBC,MAAM;SAErC,sBAAA,cAACsB,MAAAA;MAAGF,KAAKF;MAAO5B,WAAU;OACvB4B,KAAAA,CAAAA,CAAAA,CAAAA,GAKVzC,QAAAA;;;;AAGP;;;;ACjEA,OAAO8C,YAAW;AAElB,SAASC,QAAAA,aAAY;AACrB,SAASC,MAAAA,WAAU;AAKZ,IAAMC,mBAAmB,CAAC,EAC/BC,UACAC,YACAC,SAAS,EAAEC,MAAMC,OAAOC,aAAaC,QAAO,GAC5CC,KAAI,MACgC;;;AACpC,WACE,gBAAAC,OAAA,cAACC,OAAAA;MAAIF,MAAK;MAAOG,WAAWC,IAAGJ,SAAS,YAAYK,cAAcC,aAAaZ,UAAAA;OAC5EG,QACC,gBAAAI,OAAA,cAACM,OAAAA;MAAIJ,WAAU;MAA4CK,KAAKX;MAAOY,KAAKb;SAE5E,gBAAAK,OAAA,cAACC,OAAAA;MAAIF,MAAK;MAAQG,WAAU;OAC1B,gBAAAF,OAAA,cAACS,OAAAA;MAAKC,MAAK;MAA+BC,MAAM;SAGpD,gBAAAX,OAAA,cAACY,MAAAA;MAAGV,WAAWC,IAAGU,cAAcC,YAAAA;OAAgBnB,IAAAA,GAC/CE,eAAe,gBAAAG,OAAA,cAACe,KAAAA;MAAEb,WAAWC,IAAGW,cAAc,cAAA;OAAkBjB,WAAAA,GAChEC,WACC,gBAAAE,OAAA,cAACC,OAAAA;MAAIF,MAAK;MAAOG,WAAWc;OAC1B,gBAAAhB,OAAA,cAACiB,KAAAA;MACCf,WAAU;MACVgB,gBAAa;MACbC,MAAMrB;MACNsB,QAAO;MACPC,KAAI;OAEJ,gBAAArB,OAAA,cAACS,OAAAA;MAAKC,MAAK;MAAoBC,MAAM;MAAGlB,YAAW;QACnD,gBAAAO,OAAA,cAACsB,QAAAA;MAAKpB,WAAU;OAAQJ,OAAAA,GACxB,gBAAAE,OAAA,cAACS,OAAAA;MAAKC,MAAK;UAIhBlB,QAAAA;;;;AAGP;;;;AC3CA,OAAO+B,YAAW;AAElB,SAASC,MAAAA,WAAU;AAKZ,IAAMC,cAAc,CAAC,EAC1BC,YACAC,MACAC,SAAS,EAAEC,MAAMC,OAAOC,YAAW,EAAE,MACN;;;AAC/B,WACE,gBAAAC,OAAA,cAACC,OAAAA;MAAIN,MAAK;MAAOO,WAAWC,IAAGR,SAAS,YAAYS,cAAcC,aAAaX,UAAAA;OAC5EI,SAAS,gBAAAE,OAAA,cAACM,OAAAA;MAAIJ,WAAU;MAAkBK,KAAKT;MAAOU,KAAKX;QAC5D,gBAAAG,OAAA,cAACS,MAAAA;MAAGP,WAAWC,IAAGO,cAAc,aAAA;OAAiBb,IAAAA,GAChDE,eAAe,gBAAAC,OAAA,cAACW,KAAAA;MAAET,WAAU;OAA4BH,WAAAA,CAAAA;;;;AAG/D;;;AHIA,IAAA,wBAAe,MACba,YAAYC,aAAaC,cAAc;;;;EAIrCC,cAAc;IACZC,IAAI,GAAGC,cAAAA;IACPC,MAAM;MAAC;MAAW;MAAgB;;IAClCC,QAAQ,CAACC,SAA+CC,aAAaC,SAASC,QAAQH,KAAKI,OAAO;IAClGC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MAAE;AACxB,YAAM,EAAEQ,iBAAiBC,SAAQ,IAAKC,oBAAAA;AACtC,YAAMC,iBAAiBC,YACrB,OAAOC,QAAAA;AACL,cAAMC,QAAQC,SAASF,GAAAA;AACvB,cAAMG,cAAc,MAAMF,OAAOG,GAAGC,MAAMC,OAAOC,KAAKC,SAAAA,CAAAA,EAAYC,IAAAA;AAClE,cAAMC,uBAAuBP,aAAaQ,QAAQC,KAAK,CAACC,UAAAA;AACtD,iBAAOA,MAAMC,MAAMC,QAAQV,OAAOW,aAAazB,SAAS0B,aAAaD;QACvE,CAAA;AACA,cAAMpB,SACJsB,aAAaC,aAAaC,eAAe;UACvCC,MAAM;UACNC,SAAS;YACPC,OAAO;YACPC,UAAU;UACZ;QACF,CAAA,CAAA;AAEF,YAAId,sBAAsB;AACxB,iBAAOd,SACLsB,aAAaC,aAAaM,MAAM;YAC9BJ,MAAM;YACN5B,SAAS;cAACiC,iBAAiBhB,oBAAAA;;YAC3BY,SAAS;cAAEK,WAAW1B,OAAOhB;YAAG;UAClC,CAAA,CAAA;QAEJ;MACF,GACA;QAACW;OAAS;AAEZ,aACE,gBAAAgC,OAAA,cAACC,aAAAA;QAAYpC,SAASJ,KAAKI;QAASqC,YAAYhC;QAAgBX;SAC7DA,SAAS,aAAa,gBAAAyC,OAAA,cAACG,SAAAA;QAAQ5C,MAAK;QAAUE;;IAGrD;EACF,CAAA;EACAL,cAAc;IACZC,IAAI,GAAGC,cAAAA;IACPC,MAAM;MAAC;MAAW;MAAgB;;IAClCC,QAAQ,CAACC,SAAqDC,aAAaC,SAAS0B,cAAc5B,KAAKI,OAAO;IAC9GC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MACtB,gBAAAyC,OAAA,cAACI,kBAAAA;MAAiBvC,SAASJ,KAAKI;MAASN;OACtCA,SAAS,aAAa,gBAAAyC,OAAA,cAACG,SAAAA;MAAQ5C,MAAK;MAAUE;;EAGrD,CAAA;EACAL,cAAc;IACZC,IAAI,GAAGC,cAAAA;IACPC,MAAM;MAAC;MAAW;MAAgB;;IAClCC,QAAQ,CAACC,SAAgDC,aAAaC,SAAS0C,SAAS5C,KAAKI,OAAO;IACpGC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MAAO,gBAAAyC,OAAA,cAACM,aAAAA;MAAYzC,SAASJ,KAAKI;MAASN;;EACrE,CAAA;;;;EAKAH,cAAc;IACZC,IAAI,GAAGC,cAAAA;IACPC,MAAM;MAAC;MAAW;MAAgB;;IAClCgD,UAAU;IACV/C,QAAQ,CAACC,SAAkD+C,aAAa/C,KAAKI,OAAO;IACpFC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MAAE;AACxB,YAAMkD,SAASC,UAAUjD,KAAKI,OAAO;AACrC,YAAM,EAAE8C,EAAC,IAAKC,eAAetD,cAAAA;AAC7B,UAAI,CAACmD,QAAQ;AACX,eAAO,gBAAAT,OAAA,cAACa,KAAAA;UAAEC,WAAWC;WAAqBJ,EAAE,kCAAA,CAAA;MAC9C;AAEA,YAAMK,aAAa7C,YAAY,CAAC8C,QAAa,EAAEC,QAAO,MAAwC;AAC5F,cAAMC,eAAeC,OAAOC,KAAKH,OAAAA,EAAS1D,OAAO,CAAC8D,SAASJ,QAAQI,IAAAA,CAAK;AACxE,mBAAWA,QAAQH,cAAc;AAC/B,gBAAMI,QAAQN,OAAOK,IAAAA;AACrBE,mBAAS/D,KAAKI,SAASyD,MAAkBC,KAAAA;QAC3C;MACF,GAAG,CAAA,CAAE;AAEL,aACE,gBAAAvB,OAAA,cAACyB,MAAAA;QACChB;QACAQ,QAAQxD,KAAKI;QACb6D,UAAUnE,SAAS;QACnBoE,QAAQX;QACRY,UAAAA;QACC,GAAIrE,SAAS,kBAAkB;UAAEsE,YAAYC;QAAwB;;IAG5E;EACF,CAAA;CACD;",
6
+ "names": ["React", "useCallback", "Capabilities", "LayoutAction", "Surface", "contributes", "createIntent", "createSurface", "useIntentDispatcher", "Filter", "fullyQualifiedId", "getSchema", "getSpace", "isEchoObject", "isInstanceOf", "setValue", "useTranslation", "Form", "TableType", "descriptionMessage", "DataType", "React", "Fragment", "Icon", "Avatar", "Button", "mx", "ContactCard", "children", "classNames", "role", "subject", "fullName", "image", "organization", "emails", "onOrgClick", "organizationName", "target", "name", "div", "className", "mx", "popoverCard", "defaultCard", "Avatar", "Root", "previewProse", "Content", "imgSrc", "icon", "size", "hue", "Label", "asChild", "h2", "previewTitle", "previewChrome", "Button", "variant", "onClick", "Icon", "span", "p", "data-variant", "dl", "length", "map", "label", "value", "Fragment", "key", "dt", "dd", "React", "Icon", "mx", "OrganizationCard", "children", "classNames", "subject", "name", "image", "description", "website", "role", "React", "div", "className", "mx", "popoverCard", "defaultCard", "img", "src", "alt", "Icon", "icon", "size", "h2", "previewTitle", "previewProse", "p", "previewChrome", "a", "data-variant", "href", "target", "rel", "span", "React", "mx", "ProjectCard", "classNames", "role", "subject", "name", "image", "description", "React", "div", "className", "mx", "popoverCard", "defaultCard", "img", "src", "alt", "h2", "previewTitle", "p", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "PREVIEW_PLUGIN", "role", "filter", "data", "isInstanceOf", "DataType", "Person", "subject", "component", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleOrgClick", "useCallback", "org", "space", "getSpace", "tablesQuery", "db", "query", "Filter", "type", "TableType", "run", "currentSpaceOrgTable", "objects", "find", "table", "view", "target", "typename", "Organization", "createIntent", "LayoutAction", "UpdatePopover", "part", "options", "state", "anchorId", "Open", "fullyQualifiedId", "workspace", "React", "ContactCard", "onOrgClick", "Surface", "OrganizationCard", "Project", "ProjectCard", "position", "isEchoObject", "schema", "getSchema", "t", "useTranslation", "p", "className", "descriptionMessage", "handleSave", "values", "changed", "changedPaths", "Object", "keys", "path", "value", "setValue", "Form", "readonly", "onSave", "autoSave", "classNames", "kanbanCardWithoutPoster"]
7
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var chunk_VFSOM2B4_exports = {};
20
+ __export(chunk_VFSOM2B4_exports, {
21
+ PREVIEW_PLUGIN: () => PREVIEW_PLUGIN,
22
+ defaultCard: () => defaultCard,
23
+ kanbanCardWithoutPoster: () => kanbanCardWithoutPoster,
24
+ meta: () => meta,
25
+ popoverCard: () => popoverCard,
26
+ previewChrome: () => previewChrome,
27
+ previewProse: () => previewProse,
28
+ previewTitle: () => previewTitle
29
+ });
30
+ module.exports = __toCommonJS(chunk_VFSOM2B4_exports);
31
+ var PREVIEW_PLUGIN = "dxos.org/plugin/preview";
32
+ var meta = {
33
+ id: PREVIEW_PLUGIN,
34
+ name: "Preview",
35
+ icon: "ph--eye--regular",
36
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-preview"
37
+ };
38
+ var popoverCard = "popover-card-width rounded-lg overflow-hidden";
39
+ var defaultCard = "";
40
+ var kanbanCardWithoutPoster = "pbs-[--rail-action]";
41
+ var previewTitle = "text-lg font-medium line-clamp-2";
42
+ var previewProse = "pli-3 mlb-3";
43
+ var previewChrome = "pli-1.5 mlb-1.5 [&_.dx-button]:pli-1.5 [&_.dx-button]:text-start [&_.dx-button]:is-full";
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ PREVIEW_PLUGIN,
47
+ defaultCard,
48
+ kanbanCardWithoutPoster,
49
+ meta,
50
+ popoverCard,
51
+ previewChrome,
52
+ previewProse,
53
+ previewTitle
54
+ });
55
+ //# sourceMappingURL=chunk-VFSOM2B4.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts", "../../../src/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const PREVIEW_PLUGIN = 'dxos.org/plugin/preview';\n\nexport const meta: PluginMeta = {\n id: PREVIEW_PLUGIN,\n name: 'Preview',\n icon: 'ph--eye--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-preview',\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type PropsWithChildren } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\n// TODO(burdon): Better place for these defs?\nexport type PreviewProps<T extends object> = PropsWithChildren<\n ThemedClassName<{\n subject: T;\n role: string;\n }>\n>;\n\n// TODO(burdon): Update react-ui-card (to use grid) and re-use here.\n// - See https://dxos-storybook.pages.dev/?path=/story/ui-react-ui-card-card--draggable\n// - Standardize Header, actions, image, body, etc.\n// - Support different grid layouts (e.g., image to the side, on top, etc.)\n// - Should co-exist naturally with react-ui-form (e.g., as main content).\n// - Considerations for drag-and-drop.\n/**\n * <Card.Root>\n * <Card.Header>\n * <Card.Title>\n * <Card.Action>\n * </Card.Header>\n * <Card.Body>\n * <Card.Image>\n * <Form />\n * </Card.Body>\n * </Card.Root>\n */\nexport const popoverCard = 'popover-card-width rounded-lg overflow-hidden';\nexport const defaultCard = '';\nexport const kanbanCardWithoutPoster = 'pbs-[--rail-action]';\nexport const previewTitle = 'text-lg font-medium line-clamp-2';\nexport const previewProse = 'pli-3 mlb-3';\nexport const previewChrome = 'pli-1.5 mlb-1.5 [&_.dx-button]:pli-1.5 [&_.dx-button]:text-start [&_.dx-button]:is-full';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,iBAAiB;AAEvB,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;EACNC,MAAM;EACNC,QAAQ;AACV;ACqBO,IAAMC,cAAc;AACpB,IAAMC,cAAc;AACpB,IAAMC,0BAA0B;AAChC,IAAMC,eAAe;AACrB,IAAMC,eAAe;AACrB,IAAMC,gBAAgB;",
6
+ "names": ["PREVIEW_PLUGIN", "meta", "id", "name", "icon", "source", "popoverCard", "defaultCard", "kanbanCardWithoutPoster", "previewTitle", "previewProse", "previewChrome"]
7
+ }