@dxos/plugin-preview 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f

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,297 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var react_surface_CPAQ7ZYR_exports = {};
30
+ __export(react_surface_CPAQ7ZYR_exports, {
31
+ default: () => react_surface_default
32
+ });
33
+ module.exports = __toCommonJS(react_surface_CPAQ7ZYR_exports);
34
+ var import_chunk_VFSOM2B4 = require("./chunk-VFSOM2B4.cjs");
35
+ var import_react = __toESM(require("react"));
36
+ var import_app_framework = require("@dxos/app-framework");
37
+ var import_echo = require("@dxos/client/echo");
38
+ var import_echo_schema = require("@dxos/echo-schema");
39
+ var import_react_ui = require("@dxos/react-ui");
40
+ var import_react_ui_form = require("@dxos/react-ui-form");
41
+ var import_react_ui_table = require("@dxos/react-ui-table");
42
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
43
+ var import_schema = require("@dxos/schema");
44
+ var import_tracking = require("@preact-signals/safe-react/tracking");
45
+ var import_react2 = __toESM(require("react"));
46
+ var import_react_ui2 = require("@dxos/react-ui");
47
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
48
+ var import_tracking2 = require("@preact-signals/safe-react/tracking");
49
+ var import_react3 = __toESM(require("react"));
50
+ var import_react_ui3 = require("@dxos/react-ui");
51
+ var import_react_ui_theme3 = require("@dxos/react-ui-theme");
52
+ var import_tracking3 = require("@preact-signals/safe-react/tracking");
53
+ var import_react4 = __toESM(require("react"));
54
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
55
+ var ContactCard = ({ children, classNames, role, subject: { fullName, image, organization, emails }, onOrgClick }) => {
56
+ var _effect = (0, import_tracking.useSignals)();
57
+ try {
58
+ const organizationName = organization && typeof organization === "object" ? organization.target?.name : organization;
59
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
60
+ role: "none",
61
+ className: (0, import_react_ui_theme2.mx)(role === "popover" ? import_chunk_VFSOM2B4.popoverCard : import_chunk_VFSOM2B4.defaultCard, classNames)
62
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Avatar.Root, null, /* @__PURE__ */ import_react2.default.createElement("div", {
63
+ role: "group",
64
+ className: (0, import_react_ui_theme2.mx)(import_chunk_VFSOM2B4.previewProse, "grid gap-3 grid-cols-[min-content_1fr]")
65
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Avatar.Content, {
66
+ imgSrc: image,
67
+ icon: "ph--user--regular",
68
+ size: 16,
69
+ hue: "neutral"
70
+ }), /* @__PURE__ */ import_react2.default.createElement("div", {
71
+ role: "none",
72
+ className: "bs-min self-center"
73
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Avatar.Label, {
74
+ asChild: true
75
+ }, /* @__PURE__ */ import_react2.default.createElement("h2", {
76
+ className: import_chunk_VFSOM2B4.previewTitle
77
+ }, fullName))))), organizationName && /* @__PURE__ */ import_react2.default.createElement("div", {
78
+ role: "none",
79
+ className: import_chunk_VFSOM2B4.previewChrome
80
+ }, typeof organization === "object" && onOrgClick ? /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Button, {
81
+ variant: "ghost",
82
+ classNames: "gap-2 text-start",
83
+ onClick: () => onOrgClick(organization.target)
84
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
85
+ icon: "ph--buildings--regular",
86
+ size: 5,
87
+ classNames: "text-subdued"
88
+ }), /* @__PURE__ */ import_react2.default.createElement("span", {
89
+ className: "min-is-0 flex-1 truncate"
90
+ }, organizationName), /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
91
+ icon: "ph--arrow-right--regular"
92
+ })) : /* @__PURE__ */ import_react2.default.createElement("p", {
93
+ className: "dx-button gap-2",
94
+ "data-variant": "ghost"
95
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
96
+ icon: "ph--buildings--regular",
97
+ size: 5,
98
+ classNames: "text-subdued"
99
+ }), /* @__PURE__ */ import_react2.default.createElement("span", {
100
+ className: "min-is-0 flex-1 truncate"
101
+ }, organizationName))), /* @__PURE__ */ import_react2.default.createElement("dl", {
102
+ className: (0, import_react_ui_theme2.mx)(import_chunk_VFSOM2B4.previewProse, "grid gap-2 grid-cols-[min-content_1fr] [&_dt]:text-subdued [&_dt]:pbs-0.5 [&_dd]:min-is-0")
103
+ }, emails?.length && emails.map(({ label, value }) => /* @__PURE__ */ import_react2.default.createElement(import_react2.Fragment, {
104
+ key: value
105
+ }, /* @__PURE__ */ import_react2.default.createElement("dt", null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
106
+ icon: "ph--at--regular",
107
+ size: 5
108
+ })), /* @__PURE__ */ import_react2.default.createElement("dd", {
109
+ key: value,
110
+ className: "break-words"
111
+ }, value)))), children);
112
+ } finally {
113
+ _effect.f();
114
+ }
115
+ };
116
+ var OrganizationCard = ({ children, classNames, subject: { name, image, description, website }, role }) => {
117
+ var _effect = (0, import_tracking2.useSignals)();
118
+ try {
119
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
120
+ role: "none",
121
+ className: (0, import_react_ui_theme3.mx)(role === "popover" ? import_chunk_VFSOM2B4.popoverCard : import_chunk_VFSOM2B4.defaultCard, classNames)
122
+ }, image ? /* @__PURE__ */ import_react3.default.createElement("img", {
123
+ className: "aspect-video object-cover is-full bs-auto",
124
+ src: image,
125
+ alt: name
126
+ }) : /* @__PURE__ */ import_react3.default.createElement("div", {
127
+ role: "image",
128
+ className: "grid aspect-video place-items-center bg-inputSurface text-subdued"
129
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
130
+ icon: "ph--building-office--regular",
131
+ size: 10
132
+ })), /* @__PURE__ */ import_react3.default.createElement("h2", {
133
+ className: (0, import_react_ui_theme3.mx)(import_chunk_VFSOM2B4.previewTitle, import_chunk_VFSOM2B4.previewProse)
134
+ }, name), description && /* @__PURE__ */ import_react3.default.createElement("p", {
135
+ className: (0, import_react_ui_theme3.mx)(import_chunk_VFSOM2B4.previewProse, "line-clamp-2")
136
+ }, description), website && /* @__PURE__ */ import_react3.default.createElement("div", {
137
+ role: "none",
138
+ className: import_chunk_VFSOM2B4.previewChrome
139
+ }, /* @__PURE__ */ import_react3.default.createElement("a", {
140
+ className: "dx-button dx-focus-ring gap-2",
141
+ "data-variant": "ghost",
142
+ href: website,
143
+ target: "_blank",
144
+ rel: "noreferrer"
145
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
146
+ icon: "ph--link--regular",
147
+ size: 5,
148
+ classNames: "text-subdued"
149
+ }), /* @__PURE__ */ import_react3.default.createElement("span", {
150
+ className: "grow"
151
+ }, website), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
152
+ icon: "ph--arrow-square-out--regular"
153
+ }))), children);
154
+ } finally {
155
+ _effect.f();
156
+ }
157
+ };
158
+ var ProjectCard = ({ classNames, role, subject: { name, image, description } }) => {
159
+ var _effect = (0, import_tracking3.useSignals)();
160
+ try {
161
+ return /* @__PURE__ */ import_react4.default.createElement("div", {
162
+ role: "none",
163
+ className: (0, import_react_ui_theme4.mx)(role === "popover" ? import_chunk_VFSOM2B4.popoverCard : import_chunk_VFSOM2B4.defaultCard, classNames)
164
+ }, image && /* @__PURE__ */ import_react4.default.createElement("img", {
165
+ className: "is-full bs-auto",
166
+ src: image,
167
+ alt: name
168
+ }), /* @__PURE__ */ import_react4.default.createElement("h2", {
169
+ className: (0, import_react_ui_theme4.mx)(import_chunk_VFSOM2B4.previewTitle, "pli-3 mlb-3")
170
+ }, name), description && /* @__PURE__ */ import_react4.default.createElement("p", {
171
+ className: "pli-3 line-clamp-2 mlb-3"
172
+ }, description));
173
+ } finally {
174
+ _effect.f();
175
+ }
176
+ };
177
+ var react_surface_default = () => (0, import_app_framework.contributes)(import_app_framework.Capabilities.ReactSurface, [
178
+ //
179
+ // Specific schema types.
180
+ //
181
+ (0, import_app_framework.createSurface)({
182
+ id: `${import_chunk_VFSOM2B4.PREVIEW_PLUGIN}/schema-popover--contact`,
183
+ role: [
184
+ "popover",
185
+ "card--kanban",
186
+ "card"
187
+ ],
188
+ filter: (data) => (0, import_echo_schema.isInstanceOf)(import_schema.DataType.Person, data.subject),
189
+ component: ({ data, role }) => {
190
+ const { dispatchPromise: dispatch } = (0, import_app_framework.useIntentDispatcher)();
191
+ const handleOrgClick = (0, import_react.useCallback)(async (org) => {
192
+ const space = (0, import_echo.getSpace)(org);
193
+ const tablesQuery = await space?.db.query(import_echo.Filter.type(import_react_ui_table.TableType)).run();
194
+ const currentSpaceOrgTable = tablesQuery?.objects.find((table) => {
195
+ return table.view?.target?.query?.typename === import_schema.DataType.Organization.typename;
196
+ });
197
+ await dispatch((0, import_app_framework.createIntent)(import_app_framework.LayoutAction.UpdatePopover, {
198
+ part: "popover",
199
+ options: {
200
+ state: false,
201
+ anchorId: ""
202
+ }
203
+ }));
204
+ if (currentSpaceOrgTable) {
205
+ return dispatch((0, import_app_framework.createIntent)(import_app_framework.LayoutAction.Open, {
206
+ part: "main",
207
+ subject: [
208
+ (0, import_echo.fullyQualifiedId)(currentSpaceOrgTable)
209
+ ],
210
+ options: {
211
+ workspace: space?.id
212
+ }
213
+ }));
214
+ }
215
+ }, [
216
+ dispatch
217
+ ]);
218
+ return /* @__PURE__ */ import_react.default.createElement(ContactCard, {
219
+ subject: data.subject,
220
+ onOrgClick: handleOrgClick,
221
+ role
222
+ }, role === "popover" && /* @__PURE__ */ import_react.default.createElement(import_app_framework.Surface, {
223
+ role: "related",
224
+ data
225
+ }));
226
+ }
227
+ }),
228
+ (0, import_app_framework.createSurface)({
229
+ id: `${import_chunk_VFSOM2B4.PREVIEW_PLUGIN}/schema-popover--organization`,
230
+ role: [
231
+ "popover",
232
+ "card--kanban",
233
+ "card"
234
+ ],
235
+ filter: (data) => (0, import_echo_schema.isInstanceOf)(import_schema.DataType.Organization, data.subject),
236
+ component: ({ data, role }) => /* @__PURE__ */ import_react.default.createElement(OrganizationCard, {
237
+ subject: data.subject,
238
+ role
239
+ }, role === "popover" && /* @__PURE__ */ import_react.default.createElement(import_app_framework.Surface, {
240
+ role: "related",
241
+ data
242
+ }))
243
+ }),
244
+ (0, import_app_framework.createSurface)({
245
+ id: `${import_chunk_VFSOM2B4.PREVIEW_PLUGIN}/schema-popover--project`,
246
+ role: [
247
+ "popover",
248
+ "card--kanban",
249
+ "card"
250
+ ],
251
+ filter: (data) => (0, import_echo_schema.isInstanceOf)(import_schema.DataType.Project, data.subject),
252
+ component: ({ data, role }) => /* @__PURE__ */ import_react.default.createElement(ProjectCard, {
253
+ subject: data.subject,
254
+ role
255
+ })
256
+ }),
257
+ //
258
+ // Fallback for any object.
259
+ //
260
+ (0, import_app_framework.createSurface)({
261
+ id: `${import_chunk_VFSOM2B4.PREVIEW_PLUGIN}/fallback-popover`,
262
+ role: [
263
+ "popover",
264
+ "card--kanban",
265
+ "card"
266
+ ],
267
+ position: "fallback",
268
+ filter: (data) => (0, import_echo.isEchoObject)(data.subject),
269
+ component: ({ data, role }) => {
270
+ const schema = (0, import_echo.getSchema)(data.subject);
271
+ const { t } = (0, import_react_ui.useTranslation)(import_chunk_VFSOM2B4.PREVIEW_PLUGIN);
272
+ if (!schema) {
273
+ return /* @__PURE__ */ import_react.default.createElement("p", {
274
+ className: import_react_ui_theme.descriptionMessage
275
+ }, t("unable to create preview message"));
276
+ }
277
+ const handleSave = (0, import_react.useCallback)((values, { changed }) => {
278
+ const changedPaths = Object.keys(changed).filter((path) => changed[path]);
279
+ for (const path of changedPaths) {
280
+ const value = values[path];
281
+ (0, import_echo_schema.setValue)(data.subject, path, value);
282
+ }
283
+ }, []);
284
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui_form.Form, {
285
+ schema,
286
+ values: data.subject,
287
+ readonly: role === "popover",
288
+ onSave: handleSave,
289
+ autoSave: true,
290
+ ...role === "card--kanban" && {
291
+ classNames: import_chunk_VFSOM2B4.kanbanCardWithoutPoster
292
+ }
293
+ });
294
+ }
295
+ })
296
+ ]);
297
+ //# sourceMappingURL=react-surface-CPAQ7ZYR.cjs.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": "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",
6
+ "names": ["import_react", "import_react_ui", "import_react_ui_theme", "ContactCard", "children", "classNames", "role", "subject", "fullName", "image", "organization", "emails", "onOrgClick", "organizationName", "target", "name", "React", "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", "OrganizationCard", "description", "website", "img", "src", "alt", "a", "href", "rel", "ProjectCard", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "PREVIEW_PLUGIN", "filter", "data", "isInstanceOf", "DataType", "Person", "component", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleOrgClick", "useCallback", "org", "space", "getSpace", "tablesQuery", "db", "query", "Filter", "type", "TableType", "run", "currentSpaceOrgTable", "objects", "find", "table", "view", "typename", "Organization", "createIntent", "LayoutAction", "UpdatePopover", "part", "options", "state", "anchorId", "Open", "fullyQualifiedId", "workspace", "Surface", "Project", "position", "isEchoObject", "schema", "getSchema", "t", "useTranslation", "descriptionMessage", "handleSave", "values", "changed", "changedPaths", "Object", "keys", "path", "setValue", "Form", "readonly", "onSave", "autoSave", "kanbanCardWithoutPoster"]
7
+ }
@@ -0,0 +1,30 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/plugin-preview/src/meta.ts
4
+ var PREVIEW_PLUGIN = "dxos.org/plugin/preview";
5
+ var meta = {
6
+ id: PREVIEW_PLUGIN,
7
+ name: "Preview",
8
+ icon: "ph--eye--regular",
9
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-preview"
10
+ };
11
+
12
+ // packages/plugins/plugin-preview/src/types.ts
13
+ var popoverCard = "popover-card-width rounded-lg overflow-hidden";
14
+ var defaultCard = "";
15
+ var kanbanCardWithoutPoster = "pbs-[--rail-action]";
16
+ var previewTitle = "text-lg font-medium line-clamp-2";
17
+ var previewProse = "pli-3 mlb-3";
18
+ var previewChrome = "pli-1.5 mlb-1.5 [&_.dx-button]:pli-1.5 [&_.dx-button]:text-start [&_.dx-button]:is-full";
19
+
20
+ export {
21
+ PREVIEW_PLUGIN,
22
+ meta,
23
+ popoverCard,
24
+ defaultCard,
25
+ kanbanCardWithoutPoster,
26
+ previewTitle,
27
+ previewProse,
28
+ previewChrome
29
+ };
30
+ //# sourceMappingURL=chunk-PYKIS3N7.mjs.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
+ }