@dxos/plugin-masonry 0.8.4-main.2c6827d → 0.8.4-main.3c1ae3b

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 (50) hide show
  1. package/dist/lib/browser/{chunk-Z4ORTGID.mjs → chunk-4I5S2QKH.mjs} +62 -46
  2. package/dist/lib/browser/chunk-4I5S2QKH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +22 -20
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/{intent-resolver-TCILFRP3.mjs → intent-resolver-CHMBMGXF.mjs} +9 -8
  6. package/dist/lib/browser/intent-resolver-CHMBMGXF.mjs.map +7 -0
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/{react-surface-EUN65F5S.mjs → react-surface-7JLSS4T2.mjs} +16 -32
  9. package/dist/lib/browser/react-surface-7JLSS4T2.mjs.map +7 -0
  10. package/dist/lib/browser/types/index.mjs +9 -0
  11. package/dist/lib/browser/types/index.mjs.map +7 -0
  12. package/dist/lib/node-esm/{chunk-K7UZDCYX.mjs → chunk-VKN225ZV.mjs} +62 -46
  13. package/dist/lib/node-esm/chunk-VKN225ZV.mjs.map +7 -0
  14. package/dist/lib/node-esm/index.mjs +22 -20
  15. package/dist/lib/node-esm/index.mjs.map +3 -3
  16. package/dist/lib/node-esm/{intent-resolver-ABCXBMFV.mjs → intent-resolver-J7B7SXRB.mjs} +9 -8
  17. package/dist/lib/node-esm/intent-resolver-J7B7SXRB.mjs.map +7 -0
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/{react-surface-OUXYIQWW.mjs → react-surface-VW5VIPBJ.mjs} +16 -32
  20. package/dist/lib/node-esm/react-surface-VW5VIPBJ.mjs.map +7 -0
  21. package/dist/lib/node-esm/types/index.mjs +10 -0
  22. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  23. package/dist/types/src/MasonryPlugin.d.ts.map +1 -1
  24. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  25. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  26. package/dist/types/src/components/MasonryContainer.d.ts +4 -4
  27. package/dist/types/src/components/MasonryContainer.d.ts.map +1 -1
  28. package/dist/types/src/components/MasonryContainer.stories.d.ts.map +1 -1
  29. package/dist/types/src/translations.d.ts +14 -5
  30. package/dist/types/src/translations.d.ts.map +1 -1
  31. package/dist/types/src/types/Masonry.d.ts +20 -16
  32. package/dist/types/src/types/Masonry.d.ts.map +1 -1
  33. package/dist/types/src/types/MasonryAction.d.ts +2 -2
  34. package/dist/types/src/types/MasonryAction.d.ts.map +1 -1
  35. package/dist/types/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +35 -22
  37. package/src/MasonryPlugin.tsx +9 -15
  38. package/src/capabilities/intent-resolver.ts +4 -9
  39. package/src/capabilities/react-surface.tsx +2 -4
  40. package/src/components/MasonryContainer.stories.tsx +7 -16
  41. package/src/components/MasonryContainer.tsx +15 -25
  42. package/src/translations.ts +5 -1
  43. package/src/types/Masonry.ts +38 -26
  44. package/src/types/MasonryAction.ts +11 -6
  45. package/dist/lib/browser/chunk-Z4ORTGID.mjs.map +0 -7
  46. package/dist/lib/browser/intent-resolver-TCILFRP3.mjs.map +0 -7
  47. package/dist/lib/browser/react-surface-EUN65F5S.mjs.map +0 -7
  48. package/dist/lib/node-esm/chunk-K7UZDCYX.mjs.map +0 -7
  49. package/dist/lib/node-esm/intent-resolver-ABCXBMFV.mjs.map +0 -7
  50. package/dist/lib/node-esm/react-surface-OUXYIQWW.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-masonry",
3
- "version": "0.8.4-main.2c6827d",
3
+ "version": "0.8.4-main.3c1ae3b",
4
4
  "description": "Masonry DXOS Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -14,9 +14,22 @@
14
14
  "types": "./dist/types/src/index.d.ts",
15
15
  "browser": "./dist/lib/browser/index.mjs",
16
16
  "node": "./dist/lib/node-esm/index.mjs"
17
+ },
18
+ "./types": {
19
+ "source": "./src/types/index.ts",
20
+ "types": "./dist/types/src/types/index.d.ts",
21
+ "browser": "./dist/lib/browser/types/index.mjs",
22
+ "node": "./dist/lib/node-esm/types/index.mjs"
17
23
  }
18
24
  },
19
25
  "types": "dist/types/src/index.d.ts",
26
+ "typesVersions": {
27
+ "*": {
28
+ "types": [
29
+ "dist/types/src/types/index.d.ts"
30
+ ]
31
+ }
32
+ },
20
33
  "files": [
21
34
  "dist",
22
35
  "src"
@@ -25,20 +38,20 @@
25
38
  "@preact-signals/safe-react": "^0.9.0",
26
39
  "@preact/signals-core": "^1.12.1",
27
40
  "@preact/signals-react": "^3.3.0",
28
- "@dxos/app-framework": "0.8.4-main.2c6827d",
29
- "@dxos/echo": "0.8.4-main.2c6827d",
30
- "@dxos/effect": "0.8.4-main.2c6827d",
31
- "@dxos/plugin-search": "0.8.4-main.2c6827d",
32
- "@dxos/plugin-space": "0.8.4-main.2c6827d",
33
- "@dxos/plugin-client": "0.8.4-main.2c6827d",
34
- "@dxos/react-client": "0.8.4-main.2c6827d",
35
- "@dxos/react-ui": "0.8.4-main.2c6827d",
36
- "@dxos/react-ui-form": "0.8.4-main.2c6827d",
37
- "@dxos/react-ui-stack": "0.8.4-main.2c6827d",
38
- "@dxos/react-ui-masonry": "0.8.4-main.2c6827d",
39
- "@dxos/types": "0.8.4-main.2c6827d",
40
- "@dxos/schema": "0.8.4-main.2c6827d",
41
- "@dxos/util": "0.8.4-main.2c6827d"
41
+ "@dxos/app-framework": "0.8.4-main.3c1ae3b",
42
+ "@dxos/echo": "0.8.4-main.3c1ae3b",
43
+ "@dxos/effect": "0.8.4-main.3c1ae3b",
44
+ "@dxos/plugin-client": "0.8.4-main.3c1ae3b",
45
+ "@dxos/plugin-search": "0.8.4-main.3c1ae3b",
46
+ "@dxos/plugin-space": "0.8.4-main.3c1ae3b",
47
+ "@dxos/react-client": "0.8.4-main.3c1ae3b",
48
+ "@dxos/react-ui": "0.8.4-main.3c1ae3b",
49
+ "@dxos/react-ui-form": "0.8.4-main.3c1ae3b",
50
+ "@dxos/react-ui-stack": "0.8.4-main.3c1ae3b",
51
+ "@dxos/schema": "0.8.4-main.3c1ae3b",
52
+ "@dxos/react-ui-masonry": "0.8.4-main.3c1ae3b",
53
+ "@dxos/types": "0.8.4-main.3c1ae3b",
54
+ "@dxos/util": "0.8.4-main.3c1ae3b"
42
55
  },
43
56
  "devDependencies": {
44
57
  "@types/react": "~19.2.2",
@@ -47,18 +60,18 @@
47
60
  "react": "~19.2.0",
48
61
  "react-dom": "~19.2.0",
49
62
  "vite": "7.1.9",
50
- "@dxos/plugin-preview": "0.8.4-main.2c6827d",
51
- "@dxos/random": "0.8.4-main.2c6827d",
52
- "@dxos/plugin-theme": "0.8.4-main.2c6827d",
53
- "@dxos/storybook-utils": "0.8.4-main.2c6827d",
54
- "@dxos/react-ui-theme": "0.8.4-main.2c6827d"
63
+ "@dxos/plugin-preview": "0.8.4-main.3c1ae3b",
64
+ "@dxos/plugin-theme": "0.8.4-main.3c1ae3b",
65
+ "@dxos/random": "0.8.4-main.3c1ae3b",
66
+ "@dxos/react-ui-theme": "0.8.4-main.3c1ae3b",
67
+ "@dxos/storybook-utils": "0.8.4-main.3c1ae3b"
55
68
  },
56
69
  "peerDependencies": {
57
70
  "effect": "^3.13.3",
58
71
  "react": "^19.0.0",
59
72
  "react-dom": "^19.0.0",
60
- "@dxos/react-ui": "0.8.4-main.2c6827d",
61
- "@dxos/react-ui-theme": "0.8.4-main.2c6827d"
73
+ "@dxos/react-ui": "0.8.4-main.3c1ae3b",
74
+ "@dxos/react-ui-theme": "0.8.4-main.3c1ae3b"
62
75
  },
63
76
  "publishConfig": {
64
77
  "access": "public"
@@ -3,9 +3,9 @@
3
3
  //
4
4
 
5
5
  import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from '@dxos/app-framework';
6
- import { ClientEvents } from '@dxos/plugin-client';
7
- import { SpaceCapabilities } from '@dxos/plugin-space';
8
- import { defineObjectForm } from '@dxos/plugin-space/types';
6
+ import { Type } from '@dxos/echo';
7
+ import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
8
+ import { type CreateObjectIntent } from '@dxos/plugin-space/types';
9
9
 
10
10
  import { IntentResolver, ReactSurface } from './capabilities';
11
11
  import { meta } from './meta';
@@ -28,26 +28,20 @@ export const MasonryPlugin = definePlugin(meta, () => [
28
28
  activatesOn: Events.SetupMetadata,
29
29
  activate: () =>
30
30
  contributes(Capabilities.Metadata, {
31
- id: Masonry.Masonry.typename,
31
+ id: Type.getTypename(Masonry.Masonry),
32
32
  metadata: {
33
33
  icon: 'ph--wall--regular',
34
34
  iconHue: 'green',
35
+ inputSchema: MasonryAction.MasonryProps,
36
+ createObjectIntent: ((props, options) =>
37
+ createIntent(MasonryAction.CreateMasonry, { ...props, space: options.space })) satisfies CreateObjectIntent,
35
38
  },
36
39
  }),
37
40
  }),
38
41
  defineModule({
39
- id: `${meta.id}/module/object-form`,
42
+ id: `${meta.id}/module/schema`,
40
43
  activatesOn: ClientEvents.SetupSchema,
41
- activate: () =>
42
- contributes(
43
- SpaceCapabilities.ObjectForm,
44
- defineObjectForm({
45
- objectSchema: Masonry.Masonry,
46
- formSchema: MasonryAction.MasonryProps,
47
- hidden: true,
48
- getIntent: (props, options) => createIntent(MasonryAction.CreateMasonry, { ...props, space: options.space }),
49
- }),
50
- ),
44
+ activate: () => contributes(ClientCapabilities.Schema, [Masonry.Masonry]),
51
45
  }),
52
46
  defineModule({
53
47
  id: `${meta.id}/module/react-surface`,
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';
6
- import { ClientCapabilities } from '@dxos/plugin-client';
6
+ import { View } from '@dxos/schema';
7
7
 
8
8
  import { Masonry, MasonryAction } from '../types';
9
9
 
@@ -12,14 +12,9 @@ export default (context: PluginContext) =>
12
12
  createResolver({
13
13
  intent: MasonryAction.CreateMasonry,
14
14
  resolve: async ({ space, name, typename }) => {
15
- const client = context.getCapability(ClientCapabilities.Client);
16
- const { view } = await Masonry.makeView({
17
- client,
18
- space,
19
- name,
20
- typename,
21
- });
22
- return { data: { object: view } };
15
+ const { view } = await View.makeFromSpace({ space, typename });
16
+ const masonry = Masonry.make({ name, view });
17
+ return { data: { object: masonry } };
23
18
  },
24
19
  }),
25
20
  ]);
@@ -6,7 +6,6 @@ import React from 'react';
6
6
 
7
7
  import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
8
  import { Obj } from '@dxos/echo';
9
- import { View } from '@dxos/schema';
10
9
 
11
10
  import { MasonryContainer } from '../components/MasonryContainer';
12
11
  import { meta } from '../meta';
@@ -17,8 +16,7 @@ export default () =>
17
16
  createSurface({
18
17
  id: meta.id,
19
18
  role: ['article', 'section'],
20
- filter: (data): data is { subject: View.View } =>
21
- Obj.instanceOf(View.View, data.subject) && Obj.instanceOf(Masonry.Masonry, data.subject.presentation?.target),
22
- component: ({ data, role }) => <MasonryContainer view={data.subject} role={role} />,
19
+ filter: (data): data is { subject: Masonry.Masonry } => Obj.instanceOf(Masonry.Masonry, data.subject),
20
+ component: ({ data, role }) => <MasonryContainer object={data.subject} role={role} />,
23
21
  }),
24
22
  ]);
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useEffect, useState } from 'react';
6
+ import React from 'react';
7
7
 
8
8
  import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
@@ -29,16 +29,10 @@ faker.seed(0);
29
29
  const StorybookMasonry = () => {
30
30
  const spaces = useSpaces();
31
31
  const space = spaces[spaces.length - 1];
32
- const views = useQuery(space, Filter.type(View.View));
33
- const [view, setView] = useState<View.View>();
34
- useEffect(() => {
35
- if (views.length && !view) {
36
- const view = views[0];
37
- setView(view);
38
- }
39
- }, [views]);
32
+ const masonries = useQuery(space, Filter.type(Masonry.Masonry));
33
+ const masonry = masonries.at(0);
40
34
 
41
- return view ? <MasonryContainer view={view} role='story' /> : null;
35
+ return masonry ? <MasonryContainer object={masonry} role='story' /> : null;
42
36
  };
43
37
 
44
38
  const meta = {
@@ -56,12 +50,9 @@ const meta = {
56
50
  const space = await client.spaces.create();
57
51
  await space.waitUntilReady();
58
52
 
59
- const { view } = await Masonry.makeView({
60
- space,
61
- client,
62
- typename: Organization.Organization.typename,
63
- });
64
- space.db.add(view);
53
+ const { view } = await View.makeFromSpace({ space, typename: Organization.Organization.typename });
54
+ const masonry = Masonry.make({ view });
55
+ space.db.add(masonry);
65
56
 
66
57
  const factory = createObjectFactory(space.db, faker as any);
67
58
  await factory([{ type: Organization.Organization, count: 64 }]);
@@ -2,36 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useEffect, useMemo, useState } from 'react';
5
+ import React, { useEffect, useState } from 'react';
6
6
 
7
- import { Surface } from '@dxos/app-framework/react';
7
+ import { Surface, useCapabilities } from '@dxos/app-framework/react';
8
8
  import { Filter, Type } from '@dxos/echo';
9
- import { EchoSchema, type TypedObject } from '@dxos/echo/internal';
9
+ import { type TypedObject } from '@dxos/echo/internal';
10
+ import { ClientCapabilities } from '@dxos/plugin-client';
10
11
  import { useGlobalFilteredObjects } from '@dxos/plugin-search';
11
- import { useClient } from '@dxos/react-client';
12
12
  import { getSpace, useQuery } from '@dxos/react-client/echo';
13
- import { Masonry } from '@dxos/react-ui-masonry';
14
- import { ProjectionModel, type View, getTypenameFromQuery } from '@dxos/schema';
13
+ import { Masonry as MasonryComponent } from '@dxos/react-ui-masonry';
14
+ import { getTypenameFromQuery } from '@dxos/schema';
15
+
16
+ import { type Masonry } from '../types';
15
17
 
16
18
  const Item = ({ data }: { data: any }) => {
17
19
  return <Surface role='card' limit={1} data={{ subject: data }} />;
18
20
  };
19
21
 
20
- export const MasonryContainer = ({ view, role }: { view: View.View; role: string }) => {
21
- const client = useClient();
22
- const space = getSpace(view);
23
- const typename = view.query ? getTypenameFromQuery(view.query.ast) : undefined;
22
+ export const MasonryContainer = ({ object, role }: { object: Masonry.Masonry; role?: string }) => {
23
+ const schemas = useCapabilities(ClientCapabilities.Schema);
24
+ const space = getSpace(object);
25
+ const typename = object.view.target?.query ? getTypenameFromQuery(object.view.target.query.ast) : undefined;
24
26
 
25
27
  const [cardSchema, setCardSchema] = useState<TypedObject<any, any>>();
26
- const [projection, setProjection] = useState<ProjectionModel>();
27
-
28
- const jsonSchema = useMemo(() => {
29
- if (!cardSchema) return undefined;
30
- return cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : Type.toJsonSchema(cardSchema);
31
- }, [cardSchema]);
32
28
 
33
29
  useEffect(() => {
34
- const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);
30
+ const staticSchema = schemas.flat().find((schema) => Type.getTypename(schema) === typename);
35
31
  if (staticSchema) {
36
32
  setCardSchema(() => staticSchema as TypedObject<any, any>);
37
33
  }
@@ -48,19 +44,13 @@ export const MasonryContainer = ({ view, role }: { view: View.View; role: string
48
44
  );
49
45
  return unsubscribe;
50
46
  }
51
- }, [typename, space]);
52
-
53
- useEffect(() => {
54
- if (jsonSchema) {
55
- setProjection(new ProjectionModel(jsonSchema, view.projection));
56
- }
57
- }, [view.projection, JSON.stringify(jsonSchema)]);
47
+ }, [schemas, typename, space]);
58
48
 
59
49
  const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());
60
50
  const filteredObjects = useGlobalFilteredObjects(objects);
61
51
 
62
52
  return (
63
- <Masonry.Root
53
+ <MasonryComponent.Root
64
54
  items={filteredObjects}
65
55
  render={Item as any}
66
56
  classNames='is-full max-is-full bs-full max-bs-full overflow-y-auto p-4'
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Type } from '@dxos/echo';
5
6
  import { type Resource } from '@dxos/react-ui';
6
7
 
7
8
  import { meta } from './meta';
@@ -10,12 +11,15 @@ import { Masonry } from './types';
10
11
  export const translations = [
11
12
  {
12
13
  'en-US': {
13
- [Masonry.Masonry.typename]: {
14
+ [Type.getTypename(Masonry.Masonry)]: {
14
15
  'typename label': 'Masonry',
15
16
  'typename label_zero': 'Masonries',
16
17
  'typename label_one': 'Masonry',
17
18
  'typename label_other': 'Masonries',
18
19
  'object name placeholder': 'New masonry',
20
+ 'rename object label': 'Rename masonry',
21
+ 'delete object label': 'Delete masonry',
22
+ 'object deleted label': 'Masonry deleted',
19
23
  },
20
24
  [meta.id]: {
21
25
  'plugin name': 'Masonry',
@@ -4,47 +4,59 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { Obj, Type } from '@dxos/echo';
8
- import { type JsonSchemaType, ViewAnnotation, toEffectSchema } from '@dxos/echo/internal';
9
- import { View } from '@dxos/schema';
7
+ import { Obj, Ref, Type } from '@dxos/echo';
8
+ import { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/internal';
9
+ import { View, ViewAnnotation } from '@dxos/schema';
10
+
11
+ const MasonrySchema = Schema.Struct({
12
+ name: Schema.String.pipe(Schema.optional),
13
+
14
+ view: Type.Ref(View.View).pipe(FormInputAnnotation.set(false)),
10
15
 
11
- export const Masonry = Schema.Struct({
12
16
  arrangement: Schema.Array(
13
17
  Schema.Struct({
14
- ids: Schema.Array(Type.ObjectId),
18
+ ids: Schema.Array(Obj.ID),
15
19
  hidden: Schema.optional(Schema.Boolean),
16
20
  }).pipe(Schema.mutable),
17
- ).pipe(Schema.mutable, Schema.optional),
21
+ ).pipe(Schema.mutable, FormInputAnnotation.set(false), Schema.optional),
18
22
  // TODO(wittjosiah): Consider Masonry supporting not being just a view but referencing arbitrary data directly.
19
23
  }).pipe(
20
24
  Type.Obj({
21
25
  typename: 'dxos.org/type/Masonry',
22
- version: '0.1.0',
26
+ version: '0.2.0',
23
27
  }),
28
+ LabelAnnotation.set(['name']),
24
29
  ViewAnnotation.set(true),
25
30
  );
31
+ export interface Masonry extends Schema.Schema.Type<typeof MasonrySchema> {}
32
+ export interface MasonryEncoded extends Schema.Schema.Encoded<typeof MasonrySchema> {}
33
+ export const Masonry: Schema.Schema<Masonry, MasonryEncoded> = MasonrySchema;
26
34
 
27
- export type Masonry = Schema.Schema.Type<typeof Masonry>;
35
+ type MakeProps = Omit<Partial<Obj.MakeProps<typeof Masonry>>, 'view'> & {
36
+ view: View.View;
37
+ };
28
38
 
29
39
  /**
30
- * Make a masonry object.
40
+ * Make a masonry as a view of a data set.
31
41
  */
32
- export const make = (props: Obj.MakeProps<typeof Masonry> = {}) => Obj.make(Masonry, props);
33
-
34
- export type MakeViewProps = Omit<View.MakeFromSpaceProps, 'presentation'>;
35
-
36
- export const makeView = async ({
37
- ...props
38
- }: MakeViewProps): Promise<{
39
- jsonSchema: JsonSchemaType;
40
- view: View.View;
41
- schema: ReturnType<typeof toEffectSchema>;
42
- }> => {
43
- const masonry = Obj.make(Masonry, {});
44
- const { jsonSchema, view } = await View.makeFromSpace({ ...props, presentation: masonry });
42
+ export const make = ({ name, arrangement = [], view }: MakeProps): Masonry => {
43
+ return Obj.make(Masonry, { name, view: Ref.make(view), arrangement });
44
+ };
45
45
 
46
- // Preset sizes.
47
- const schema = toEffectSchema(jsonSchema);
46
+ //
47
+ // V1
48
+ //
48
49
 
49
- return { jsonSchema, schema, view };
50
- };
50
+ export const MasonryV1 = Schema.Struct({
51
+ arrangement: Schema.Array(
52
+ Schema.Struct({
53
+ ids: Schema.Array(Obj.ID),
54
+ hidden: Schema.optional(Schema.Boolean),
55
+ }).pipe(Schema.mutable),
56
+ ).pipe(Schema.mutable, Schema.optional),
57
+ }).pipe(
58
+ Type.Obj({
59
+ typename: 'dxos.org/type/Masonry',
60
+ version: '0.1.0',
61
+ }),
62
+ );
@@ -4,27 +4,32 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
+ import { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';
7
8
  import { SpaceSchema } from '@dxos/react-client/echo';
8
- import { TypenameAnnotationId, View } from '@dxos/schema';
9
9
 
10
10
  import { meta } from '../meta';
11
11
 
12
+ import * as Masonry from './Masonry';
13
+
12
14
  const MASONRY_ACTION = `${meta.id}/action`;
13
15
 
14
16
  export const MasonryProps = Schema.Struct({
15
17
  name: Schema.optional(Schema.String),
16
18
  // TODO(wittjosiah): This should be a query input instead.
17
- typename: Schema.optional(
18
- Schema.String.annotations({
19
- [TypenameAnnotationId]: ['used-static', 'dynamic'],
20
- title: 'Select card record type (leave empty to start fresh)',
19
+ typename: Schema.String.pipe(
20
+ Schema.annotations({ title: 'Select card type' }),
21
+ TypeInputOptionsAnnotation.set({
22
+ location: ['database', 'runtime'],
23
+ kind: ['user'],
24
+ registered: ['registered'],
21
25
  }),
26
+ Schema.optional,
22
27
  ),
23
28
  });
24
29
 
25
30
  export class CreateMasonry extends Schema.TaggedClass<CreateMasonry>()(`${MASONRY_ACTION}/create`, {
26
31
  input: Schema.extend(Schema.Struct({ space: SpaceSchema }), MasonryProps),
27
32
  output: Schema.Struct({
28
- object: View.View,
33
+ object: Masonry.Masonry,
29
34
  }),
30
35
  }) {}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts", "../../../src/types/Masonry.ts", "../../../src/types/MasonryAction.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: PluginMeta = {\n id: 'dxos.org/plugin/masonry',\n name: 'Masonry',\n description: trim`\n Responsive grid layout that displays query results in an adaptive masonry pattern.\n Visualize collections of cards, images, or mixed content that automatically adjusts to available screen space.\n `,\n icon: 'ph--wall--regular',\n iconHue: 'green',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-masonry',\n screenshots: [],\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj, Type } from '@dxos/echo';\nimport { type JsonSchemaType, ViewAnnotation, toEffectSchema } from '@dxos/echo/internal';\nimport { View } from '@dxos/schema';\n\nexport const Masonry = Schema.Struct({\n arrangement: Schema.Array(\n Schema.Struct({\n ids: Schema.Array(Type.ObjectId),\n hidden: Schema.optional(Schema.Boolean),\n }).pipe(Schema.mutable),\n ).pipe(Schema.mutable, Schema.optional),\n // TODO(wittjosiah): Consider Masonry supporting not being just a view but referencing arbitrary data directly.\n}).pipe(\n Type.Obj({\n typename: 'dxos.org/type/Masonry',\n version: '0.1.0',\n }),\n ViewAnnotation.set(true),\n);\n\nexport type Masonry = Schema.Schema.Type<typeof Masonry>;\n\n/**\n * Make a masonry object.\n */\nexport const make = (props: Obj.MakeProps<typeof Masonry> = {}) => Obj.make(Masonry, props);\n\nexport type MakeViewProps = Omit<View.MakeFromSpaceProps, 'presentation'>;\n\nexport const makeView = async ({\n ...props\n}: MakeViewProps): Promise<{\n jsonSchema: JsonSchemaType;\n view: View.View;\n schema: ReturnType<typeof toEffectSchema>;\n}> => {\n const masonry = Obj.make(Masonry, {});\n const { jsonSchema, view } = await View.makeFromSpace({ ...props, presentation: masonry });\n\n // Preset sizes.\n const schema = toEffectSchema(jsonSchema);\n\n return { jsonSchema, schema, view };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { SpaceSchema } from '@dxos/react-client/echo';\nimport { TypenameAnnotationId, View } from '@dxos/schema';\n\nimport { meta } from '../meta';\n\nconst MASONRY_ACTION = `${meta.id}/action`;\n\nexport const MasonryProps = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.optional(\n Schema.String.annotations({\n [TypenameAnnotationId]: ['used-static', 'dynamic'],\n title: 'Select card record type (leave empty to start fresh)',\n }),\n ),\n});\n\nexport class CreateMasonry extends Schema.TaggedClass<CreateMasonry>()(`${MASONRY_ACTION}/create`, {\n input: Schema.extend(Schema.Struct({ space: SpaceSchema }), MasonryProps),\n output: Schema.Struct({\n object: View.View,\n }),\n}) {}\n"],
5
- "mappings": ";;;;;;;AAKA,SAASA,YAAY;AAEd,IAAMC,OAAmB;EAC9BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,aAAa,CAAA;AACf;;;AClBA;;;;;;AAIA,YAAYC,YAAY;AAExB,SAASC,KAAKC,YAAY;AAC1B,SAA8BC,gBAAgBC,sBAAsB;AACpE,SAASC,YAAY;AAEd,IAAMC,UAAiBC,cAAO;EACnCC,aAAoBC,aACXF,cAAO;IACZG,KAAYD,aAAME,KAAKC,QAAQ;IAC/BC,QAAeC,gBAAgBC,cAAO;EACxC,CAAA,EAAGC,KAAYC,cAAO,CAAA,EACtBD,KAAYC,gBAAgBH,eAAQ;AAExC,CAAA,EAAGE,KACDL,KAAKO,IAAI;EACPC,UAAU;EACVC,SAAS;AACX,CAAA,GACAC,eAAeC,IAAI,IAAA,CAAA;AAQd,IAAMC,OAAO,CAACC,QAAuC,CAAC,MAAMN,IAAIK,KAAKjB,SAASkB,KAAAA;AAI9E,IAAMC,WAAW,OAAO,EAC7B,GAAGD,MAAAA,MACW;AAKd,QAAME,UAAUR,IAAIK,KAAKjB,SAAS,CAAC,CAAA;AACnC,QAAM,EAAEqB,YAAYC,KAAI,IAAK,MAAMC,KAAKC,cAAc;IAAE,GAAGN;IAAOO,cAAcL;EAAQ,CAAA;AAGxF,QAAMM,SAASC,eAAeN,UAAAA;AAE9B,SAAO;IAAEA;IAAYK;IAAQJ;EAAK;AACpC;;;ACjDA;;;;;AAIA,YAAYM,aAAY;AAExB,SAASC,mBAAmB;AAC5B,SAASC,sBAAsBC,QAAAA,aAAY;AAI3C,IAAMC,iBAAiB,GAAGC,KAAKC,EAAE;AAE1B,IAAMC,eAAsBC,eAAO;EACxCC,MAAaC,iBAAgBC,cAAM;;EAEnCC,UAAiBF,iBACRC,eAAOE,YAAY;IACxB,CAACC,oBAAAA,GAAuB;MAAC;MAAe;;IACxCC,OAAO;EACT,CAAA,CAAA;AAEJ,CAAA;AAEO,IAAMC,gBAAN,cAAmCC,oBAAW,EAAkB,GAAGb,cAAAA,WAAyB;EACjGc,OAAcC,eAAcX,eAAO;IAAEY,OAAOC;EAAY,CAAA,GAAId,YAAAA;EAC5De,QAAed,eAAO;IACpBe,QAAQC,MAAKA;EACf,CAAA;AACF,CAAA,EAAA;AAAI;",
6
- "names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "Schema", "Obj", "Type", "ViewAnnotation", "toEffectSchema", "View", "Masonry", "Struct", "arrangement", "Array", "ids", "Type", "ObjectId", "hidden", "optional", "Boolean", "pipe", "mutable", "Obj", "typename", "version", "ViewAnnotation", "set", "make", "props", "makeView", "masonry", "jsonSchema", "view", "View", "makeFromSpace", "presentation", "schema", "toEffectSchema", "Schema", "SpaceSchema", "TypenameAnnotationId", "View", "MASONRY_ACTION", "meta", "id", "MasonryProps", "Struct", "name", "optional", "String", "typename", "annotations", "TypenameAnnotationId", "title", "CreateMasonry", "TaggedClass", "input", "extend", "space", "SpaceSchema", "output", "object", "View"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { Masonry, MasonryAction } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: MasonryAction.CreateMasonry,\n resolve: async ({ space, name, typename }) => {\n const client = context.getCapability(ClientCapabilities.Client);\n const { view } = await Masonry.makeView({\n client,\n space,\n name,\n typename,\n });\n return { data: { object: view } };\n },\n }),\n ]);\n"],
5
- "mappings": ";;;;;;AAIA,SAASA,cAAkCC,aAAaC,sBAAsB;AAC9E,SAASC,0BAA0B;AAInC,IAAA,2BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;EACvCC,eAAe;IACbC,QAAQC,sBAAcC;IACtBC,SAAS,OAAO,EAAEC,OAAOC,MAAMC,SAAQ,MAAE;AACvC,YAAMC,SAASZ,QAAQa,cAAcC,mBAAmBC,MAAM;AAC9D,YAAM,EAAEC,KAAI,IAAK,MAAMC,gBAAQC,SAAS;QACtCN;QACAH;QACAC;QACAC;MACF,CAAA;AACA,aAAO;QAAEQ,MAAM;UAAEC,QAAQJ;QAAK;MAAE;IAClC;EACF,CAAA;CACD;",
6
- "names": ["Capabilities", "contributes", "createResolver", "ClientCapabilities", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "MasonryAction", "CreateMasonry", "resolve", "space", "name", "typename", "client", "getCapability", "ClientCapabilities", "Client", "view", "Masonry", "makeView", "data", "object"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/MasonryContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { View } from '@dxos/schema';\n\nimport { MasonryContainer } from '../components/MasonryContainer';\nimport { meta } from '../meta';\nimport { Masonry } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: meta.id,\n role: ['article', 'section'],\n filter: (data): data is { subject: View.View } =>\n Obj.instanceOf(View.View, data.subject) && Obj.instanceOf(Masonry.Masonry, data.subject.presentation?.target),\n component: ({ data, role }) => <MasonryContainer view={data.subject} role={role} />,\n }),\n ]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { Filter, Type } from '@dxos/echo';\nimport { EchoSchema, type TypedObject } from '@dxos/echo/internal';\nimport { useGlobalFilteredObjects } from '@dxos/plugin-search';\nimport { useClient } from '@dxos/react-client';\nimport { getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Masonry } from '@dxos/react-ui-masonry';\nimport { ProjectionModel, type View, getTypenameFromQuery } from '@dxos/schema';\n\nconst Item = ({ data }: { data: any }) => {\n return <Surface role='card' limit={1} data={{ subject: data }} />;\n};\n\nexport const MasonryContainer = ({ view, role }: { view: View.View; role: string }) => {\n const client = useClient();\n const space = getSpace(view);\n const typename = view.query ? getTypenameFromQuery(view.query.ast) : undefined;\n\n const [cardSchema, setCardSchema] = useState<TypedObject<any, any>>();\n const [projection, setProjection] = useState<ProjectionModel>();\n\n const jsonSchema = useMemo(() => {\n if (!cardSchema) return undefined;\n return cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : Type.toJsonSchema(cardSchema);\n }, [cardSchema]);\n\n useEffect(() => {\n const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);\n if (staticSchema) {\n setCardSchema(() => staticSchema as TypedObject<any, any>);\n }\n if (!staticSchema && typename && space) {\n const query = space.db.schemaRegistry.query({ typename });\n const unsubscribe = query.subscribe(\n () => {\n const [schema] = query.results;\n if (schema) {\n setCardSchema(schema);\n }\n },\n { fire: true },\n );\n return unsubscribe;\n }\n }, [typename, space]);\n\n useEffect(() => {\n if (jsonSchema) {\n setProjection(new ProjectionModel(jsonSchema, view.projection));\n }\n }, [view.projection, JSON.stringify(jsonSchema)]);\n\n const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());\n const filteredObjects = useGlobalFilteredObjects(objects);\n\n return (\n <Masonry.Root\n items={filteredObjects}\n render={Item as any}\n classNames='is-full max-is-full bs-full max-bs-full overflow-y-auto p-4'\n />\n );\n};\n"],
5
- "mappings": ";;;;;;AAIA,OAAOA,YAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AACzD,SAASC,WAAW;AACpB,SAASC,YAAY;;;;ACJrB,OAAOC,SAASC,WAAWC,SAASC,gBAAgB;AAEpD,SAASC,eAAe;AACxB,SAASC,QAAQC,YAAY;AAC7B,SAASC,kBAAoC;AAC7C,SAASC,gCAAgC;AACzC,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,gBAAgB;AACnC,SAASC,eAAe;AACxB,SAASC,iBAA4BC,4BAA4B;AAEjE,IAAMC,OAAO,CAAC,EAAEC,KAAI,MAAiB;;;AACnC,WAAO,sBAAA,cAACC,SAAAA;MAAQC,MAAK;MAAOC,OAAO;MAAGH,MAAM;QAAEI,SAASJ;MAAK;;;;;AAC9D;AAEO,IAAMK,mBAAmB,CAAC,EAAEC,MAAMJ,KAAI,MAAqC;;;AAChF,UAAMK,SAASC,UAAAA;AACf,UAAMC,QAAQC,SAASJ,IAAAA;AACvB,UAAMK,WAAWL,KAAKM,QAAQC,qBAAqBP,KAAKM,MAAME,GAAG,IAAIC;AAErE,UAAM,CAACC,YAAYC,aAAAA,IAAiBC,SAAAA;AACpC,UAAM,CAACC,YAAYC,aAAAA,IAAiBF,SAAAA;AAEpC,UAAMG,aAAaC,QAAQ,MAAA;AACzB,UAAI,CAACN,WAAY,QAAOD;AACxB,aAAOC,sBAAsBO,aAAaP,WAAWK,aAAaG,KAAKC,aAAaT,UAAAA;IACtF,GAAG;MAACA;KAAW;AAEfU,cAAU,MAAA;AACR,YAAMC,eAAepB,OAAOqB,MAAMC,eAAeC,QAAQC,KAAK,CAACC,WAAWR,KAAKS,YAAYD,MAAAA,MAAYrB,QAAAA;AACvG,UAAIgB,cAAc;AAChBV,sBAAc,MAAMU,YAAAA;MACtB;AACA,UAAI,CAACA,gBAAgBhB,YAAYF,OAAO;AACtC,cAAMG,QAAQH,MAAMyB,GAAGL,eAAejB,MAAM;UAAED;QAAS,CAAA;AACvD,cAAMwB,cAAcvB,MAAMwB,UACxB,MAAA;AACE,gBAAM,CAACJ,MAAAA,IAAUpB,MAAMyB;AACvB,cAAIL,QAAQ;AACVf,0BAAce,MAAAA;UAChB;QACF,GACA;UAAEM,MAAM;QAAK,CAAA;AAEf,eAAOH;MACT;IACF,GAAG;MAACxB;MAAUF;KAAM;AAEpBiB,cAAU,MAAA;AACR,UAAIL,YAAY;AACdD,sBAAc,IAAImB,gBAAgBlB,YAAYf,KAAKa,UAAU,CAAA;MAC/D;IACF,GAAG;MAACb,KAAKa;MAAYqB,KAAKC,UAAUpB,UAAAA;KAAY;AAEhD,UAAMqB,UAAUC,SAASlC,OAAOO,aAAa4B,OAAOC,KAAK7B,UAAAA,IAAc4B,OAAOE,QAAO,CAAA;AACrF,UAAMC,kBAAkBC,yBAAyBN,OAAAA;AAEjD,WACE,sBAAA,cAACO,QAAQC,MAAI;MACXC,OAAOJ;MACPK,QAAQrD;MACRsD,YAAW;;;;;AAGjB;;;ADtDA,IAAA,yBAAe,MACbC,YAAYC,aAAaC,cAAc;EACrCC,cAAc;IACZC,IAAIC,KAAKD;IACTE,MAAM;MAAC;MAAW;;IAClBC,QAAQ,CAACC,SACPC,IAAIC,WAAWC,KAAKA,MAAMH,KAAKI,OAAO,KAAKH,IAAIC,WAAWG,gBAAQA,SAASL,KAAKI,QAAQE,cAAcC,MAAAA;IACxGC,WAAW,CAAC,EAAER,MAAMF,KAAI,MAAO,gBAAAW,OAAA,cAACC,kBAAAA;MAAiBC,MAAMX,KAAKI;MAASN;;EACvE,CAAA;CACD;",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "Obj", "View", "React", "useEffect", "useMemo", "useState", "Surface", "Filter", "Type", "EchoSchema", "useGlobalFilteredObjects", "useClient", "getSpace", "useQuery", "Masonry", "ProjectionModel", "getTypenameFromQuery", "Item", "data", "Surface", "role", "limit", "subject", "MasonryContainer", "view", "client", "useClient", "space", "getSpace", "typename", "query", "getTypenameFromQuery", "ast", "undefined", "cardSchema", "setCardSchema", "useState", "projection", "setProjection", "jsonSchema", "useMemo", "EchoSchema", "Type", "toJsonSchema", "useEffect", "staticSchema", "graph", "schemaRegistry", "schemas", "find", "schema", "getTypename", "db", "unsubscribe", "subscribe", "results", "fire", "ProjectionModel", "JSON", "stringify", "objects", "useQuery", "Filter", "type", "nothing", "filteredObjects", "useGlobalFilteredObjects", "Masonry", "Root", "items", "render", "classNames", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "meta", "role", "filter", "data", "Obj", "instanceOf", "View", "subject", "Masonry", "presentation", "target", "component", "React", "MasonryContainer", "view"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts", "../../../src/types/Masonry.ts", "../../../src/types/MasonryAction.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: PluginMeta = {\n id: 'dxos.org/plugin/masonry',\n name: 'Masonry',\n description: trim`\n Responsive grid layout that displays query results in an adaptive masonry pattern.\n Visualize collections of cards, images, or mixed content that automatically adjusts to available screen space.\n `,\n icon: 'ph--wall--regular',\n iconHue: 'green',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-masonry',\n screenshots: [],\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Obj, Type } from '@dxos/echo';\nimport { type JsonSchemaType, ViewAnnotation, toEffectSchema } from '@dxos/echo/internal';\nimport { View } from '@dxos/schema';\n\nexport const Masonry = Schema.Struct({\n arrangement: Schema.Array(\n Schema.Struct({\n ids: Schema.Array(Type.ObjectId),\n hidden: Schema.optional(Schema.Boolean),\n }).pipe(Schema.mutable),\n ).pipe(Schema.mutable, Schema.optional),\n // TODO(wittjosiah): Consider Masonry supporting not being just a view but referencing arbitrary data directly.\n}).pipe(\n Type.Obj({\n typename: 'dxos.org/type/Masonry',\n version: '0.1.0',\n }),\n ViewAnnotation.set(true),\n);\n\nexport type Masonry = Schema.Schema.Type<typeof Masonry>;\n\n/**\n * Make a masonry object.\n */\nexport const make = (props: Obj.MakeProps<typeof Masonry> = {}) => Obj.make(Masonry, props);\n\nexport type MakeViewProps = Omit<View.MakeFromSpaceProps, 'presentation'>;\n\nexport const makeView = async ({\n ...props\n}: MakeViewProps): Promise<{\n jsonSchema: JsonSchemaType;\n view: View.View;\n schema: ReturnType<typeof toEffectSchema>;\n}> => {\n const masonry = Obj.make(Masonry, {});\n const { jsonSchema, view } = await View.makeFromSpace({ ...props, presentation: masonry });\n\n // Preset sizes.\n const schema = toEffectSchema(jsonSchema);\n\n return { jsonSchema, schema, view };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { SpaceSchema } from '@dxos/react-client/echo';\nimport { TypenameAnnotationId, View } from '@dxos/schema';\n\nimport { meta } from '../meta';\n\nconst MASONRY_ACTION = `${meta.id}/action`;\n\nexport const MasonryProps = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.optional(\n Schema.String.annotations({\n [TypenameAnnotationId]: ['used-static', 'dynamic'],\n title: 'Select card record type (leave empty to start fresh)',\n }),\n ),\n});\n\nexport class CreateMasonry extends Schema.TaggedClass<CreateMasonry>()(`${MASONRY_ACTION}/create`, {\n input: Schema.extend(Schema.Struct({ space: SpaceSchema }), MasonryProps),\n output: Schema.Struct({\n object: View.View,\n }),\n}) {}\n"],
5
- "mappings": ";;;;;;;;AAKA,SAASA,YAAY;AAEd,IAAMC,OAAmB;EAC9BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,aAAa,CAAA;AACf;;;AClBA;;;;;;AAIA,YAAYC,YAAY;AAExB,SAASC,KAAKC,YAAY;AAC1B,SAA8BC,gBAAgBC,sBAAsB;AACpE,SAASC,YAAY;AAEd,IAAMC,UAAiBC,cAAO;EACnCC,aAAoBC,aACXF,cAAO;IACZG,KAAYD,aAAME,KAAKC,QAAQ;IAC/BC,QAAeC,gBAAgBC,cAAO;EACxC,CAAA,EAAGC,KAAYC,cAAO,CAAA,EACtBD,KAAYC,gBAAgBH,eAAQ;AAExC,CAAA,EAAGE,KACDL,KAAKO,IAAI;EACPC,UAAU;EACVC,SAAS;AACX,CAAA,GACAC,eAAeC,IAAI,IAAA,CAAA;AAQd,IAAMC,OAAO,CAACC,QAAuC,CAAC,MAAMN,IAAIK,KAAKjB,SAASkB,KAAAA;AAI9E,IAAMC,WAAW,OAAO,EAC7B,GAAGD,MAAAA,MACW;AAKd,QAAME,UAAUR,IAAIK,KAAKjB,SAAS,CAAC,CAAA;AACnC,QAAM,EAAEqB,YAAYC,KAAI,IAAK,MAAMC,KAAKC,cAAc;IAAE,GAAGN;IAAOO,cAAcL;EAAQ,CAAA;AAGxF,QAAMM,SAASC,eAAeN,UAAAA;AAE9B,SAAO;IAAEA;IAAYK;IAAQJ;EAAK;AACpC;;;ACjDA;;;;;AAIA,YAAYM,aAAY;AAExB,SAASC,mBAAmB;AAC5B,SAASC,sBAAsBC,QAAAA,aAAY;AAI3C,IAAMC,iBAAiB,GAAGC,KAAKC,EAAE;AAE1B,IAAMC,eAAsBC,eAAO;EACxCC,MAAaC,iBAAgBC,cAAM;;EAEnCC,UAAiBF,iBACRC,eAAOE,YAAY;IACxB,CAACC,oBAAAA,GAAuB;MAAC;MAAe;;IACxCC,OAAO;EACT,CAAA,CAAA;AAEJ,CAAA;AAEO,IAAMC,gBAAN,cAAmCC,oBAAW,EAAkB,GAAGb,cAAAA,WAAyB;EACjGc,OAAcC,eAAcX,eAAO;IAAEY,OAAOC;EAAY,CAAA,GAAId,YAAAA;EAC5De,QAAed,eAAO;IACpBe,QAAQC,MAAKA;EACf,CAAA;AACF,CAAA,EAAA;AAAI;",
6
- "names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "Schema", "Obj", "Type", "ViewAnnotation", "toEffectSchema", "View", "Masonry", "Struct", "arrangement", "Array", "ids", "Type", "ObjectId", "hidden", "optional", "Boolean", "pipe", "mutable", "Obj", "typename", "version", "ViewAnnotation", "set", "make", "props", "makeView", "masonry", "jsonSchema", "view", "View", "makeFromSpace", "presentation", "schema", "toEffectSchema", "Schema", "SpaceSchema", "TypenameAnnotationId", "View", "MASONRY_ACTION", "meta", "id", "MasonryProps", "Struct", "name", "optional", "String", "typename", "annotations", "TypenameAnnotationId", "title", "CreateMasonry", "TaggedClass", "input", "extend", "space", "SpaceSchema", "output", "object", "View"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { Masonry, MasonryAction } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: MasonryAction.CreateMasonry,\n resolve: async ({ space, name, typename }) => {\n const client = context.getCapability(ClientCapabilities.Client);\n const { view } = await Masonry.makeView({\n client,\n space,\n name,\n typename,\n });\n return { data: { object: view } };\n },\n }),\n ]);\n"],
5
- "mappings": ";;;;;;;AAIA,SAASA,cAAkCC,aAAaC,sBAAsB;AAC9E,SAASC,0BAA0B;AAInC,IAAA,2BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;EACvCC,eAAe;IACbC,QAAQC,sBAAcC;IACtBC,SAAS,OAAO,EAAEC,OAAOC,MAAMC,SAAQ,MAAE;AACvC,YAAMC,SAASZ,QAAQa,cAAcC,mBAAmBC,MAAM;AAC9D,YAAM,EAAEC,KAAI,IAAK,MAAMC,gBAAQC,SAAS;QACtCN;QACAH;QACAC;QACAC;MACF,CAAA;AACA,aAAO;QAAEQ,MAAM;UAAEC,QAAQJ;QAAK;MAAE;IAClC;EACF,CAAA;CACD;",
6
- "names": ["Capabilities", "contributes", "createResolver", "ClientCapabilities", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "MasonryAction", "CreateMasonry", "resolve", "space", "name", "typename", "client", "getCapability", "ClientCapabilities", "Client", "view", "Masonry", "makeView", "data", "object"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/MasonryContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { View } from '@dxos/schema';\n\nimport { MasonryContainer } from '../components/MasonryContainer';\nimport { meta } from '../meta';\nimport { Masonry } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: meta.id,\n role: ['article', 'section'],\n filter: (data): data is { subject: View.View } =>\n Obj.instanceOf(View.View, data.subject) && Obj.instanceOf(Masonry.Masonry, data.subject.presentation?.target),\n component: ({ data, role }) => <MasonryContainer view={data.subject} role={role} />,\n }),\n ]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { Filter, Type } from '@dxos/echo';\nimport { EchoSchema, type TypedObject } from '@dxos/echo/internal';\nimport { useGlobalFilteredObjects } from '@dxos/plugin-search';\nimport { useClient } from '@dxos/react-client';\nimport { getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Masonry } from '@dxos/react-ui-masonry';\nimport { ProjectionModel, type View, getTypenameFromQuery } from '@dxos/schema';\n\nconst Item = ({ data }: { data: any }) => {\n return <Surface role='card' limit={1} data={{ subject: data }} />;\n};\n\nexport const MasonryContainer = ({ view, role }: { view: View.View; role: string }) => {\n const client = useClient();\n const space = getSpace(view);\n const typename = view.query ? getTypenameFromQuery(view.query.ast) : undefined;\n\n const [cardSchema, setCardSchema] = useState<TypedObject<any, any>>();\n const [projection, setProjection] = useState<ProjectionModel>();\n\n const jsonSchema = useMemo(() => {\n if (!cardSchema) return undefined;\n return cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : Type.toJsonSchema(cardSchema);\n }, [cardSchema]);\n\n useEffect(() => {\n const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);\n if (staticSchema) {\n setCardSchema(() => staticSchema as TypedObject<any, any>);\n }\n if (!staticSchema && typename && space) {\n const query = space.db.schemaRegistry.query({ typename });\n const unsubscribe = query.subscribe(\n () => {\n const [schema] = query.results;\n if (schema) {\n setCardSchema(schema);\n }\n },\n { fire: true },\n );\n return unsubscribe;\n }\n }, [typename, space]);\n\n useEffect(() => {\n if (jsonSchema) {\n setProjection(new ProjectionModel(jsonSchema, view.projection));\n }\n }, [view.projection, JSON.stringify(jsonSchema)]);\n\n const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());\n const filteredObjects = useGlobalFilteredObjects(objects);\n\n return (\n <Masonry.Root\n items={filteredObjects}\n render={Item as any}\n classNames='is-full max-is-full bs-full max-bs-full overflow-y-auto p-4'\n />\n );\n};\n"],
5
- "mappings": ";;;;;;;AAIA,OAAOA,YAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AACzD,SAASC,WAAW;AACpB,SAASC,YAAY;;;;ACJrB,OAAOC,SAASC,WAAWC,SAASC,gBAAgB;AAEpD,SAASC,eAAe;AACxB,SAASC,QAAQC,YAAY;AAC7B,SAASC,kBAAoC;AAC7C,SAASC,gCAAgC;AACzC,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,gBAAgB;AACnC,SAASC,eAAe;AACxB,SAASC,iBAA4BC,4BAA4B;AAEjE,IAAMC,OAAO,CAAC,EAAEC,KAAI,MAAiB;;;AACnC,WAAO,sBAAA,cAACC,SAAAA;MAAQC,MAAK;MAAOC,OAAO;MAAGH,MAAM;QAAEI,SAASJ;MAAK;;;;;AAC9D;AAEO,IAAMK,mBAAmB,CAAC,EAAEC,MAAMJ,KAAI,MAAqC;;;AAChF,UAAMK,SAASC,UAAAA;AACf,UAAMC,QAAQC,SAASJ,IAAAA;AACvB,UAAMK,WAAWL,KAAKM,QAAQC,qBAAqBP,KAAKM,MAAME,GAAG,IAAIC;AAErE,UAAM,CAACC,YAAYC,aAAAA,IAAiBC,SAAAA;AACpC,UAAM,CAACC,YAAYC,aAAAA,IAAiBF,SAAAA;AAEpC,UAAMG,aAAaC,QAAQ,MAAA;AACzB,UAAI,CAACN,WAAY,QAAOD;AACxB,aAAOC,sBAAsBO,aAAaP,WAAWK,aAAaG,KAAKC,aAAaT,UAAAA;IACtF,GAAG;MAACA;KAAW;AAEfU,cAAU,MAAA;AACR,YAAMC,eAAepB,OAAOqB,MAAMC,eAAeC,QAAQC,KAAK,CAACC,WAAWR,KAAKS,YAAYD,MAAAA,MAAYrB,QAAAA;AACvG,UAAIgB,cAAc;AAChBV,sBAAc,MAAMU,YAAAA;MACtB;AACA,UAAI,CAACA,gBAAgBhB,YAAYF,OAAO;AACtC,cAAMG,QAAQH,MAAMyB,GAAGL,eAAejB,MAAM;UAAED;QAAS,CAAA;AACvD,cAAMwB,cAAcvB,MAAMwB,UACxB,MAAA;AACE,gBAAM,CAACJ,MAAAA,IAAUpB,MAAMyB;AACvB,cAAIL,QAAQ;AACVf,0BAAce,MAAAA;UAChB;QACF,GACA;UAAEM,MAAM;QAAK,CAAA;AAEf,eAAOH;MACT;IACF,GAAG;MAACxB;MAAUF;KAAM;AAEpBiB,cAAU,MAAA;AACR,UAAIL,YAAY;AACdD,sBAAc,IAAImB,gBAAgBlB,YAAYf,KAAKa,UAAU,CAAA;MAC/D;IACF,GAAG;MAACb,KAAKa;MAAYqB,KAAKC,UAAUpB,UAAAA;KAAY;AAEhD,UAAMqB,UAAUC,SAASlC,OAAOO,aAAa4B,OAAOC,KAAK7B,UAAAA,IAAc4B,OAAOE,QAAO,CAAA;AACrF,UAAMC,kBAAkBC,yBAAyBN,OAAAA;AAEjD,WACE,sBAAA,cAACO,QAAQC,MAAI;MACXC,OAAOJ;MACPK,QAAQrD;MACRsD,YAAW;;;;;AAGjB;;;ADtDA,IAAA,yBAAe,MACbC,YAAYC,aAAaC,cAAc;EACrCC,cAAc;IACZC,IAAIC,KAAKD;IACTE,MAAM;MAAC;MAAW;;IAClBC,QAAQ,CAACC,SACPC,IAAIC,WAAWC,KAAKA,MAAMH,KAAKI,OAAO,KAAKH,IAAIC,WAAWG,gBAAQA,SAASL,KAAKI,QAAQE,cAAcC,MAAAA;IACxGC,WAAW,CAAC,EAAER,MAAMF,KAAI,MAAO,gBAAAW,OAAA,cAACC,kBAAAA;MAAiBC,MAAMX,KAAKI;MAASN;;EACvE,CAAA;CACD;",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "Obj", "View", "React", "useEffect", "useMemo", "useState", "Surface", "Filter", "Type", "EchoSchema", "useGlobalFilteredObjects", "useClient", "getSpace", "useQuery", "Masonry", "ProjectionModel", "getTypenameFromQuery", "Item", "data", "Surface", "role", "limit", "subject", "MasonryContainer", "view", "client", "useClient", "space", "getSpace", "typename", "query", "getTypenameFromQuery", "ast", "undefined", "cardSchema", "setCardSchema", "useState", "projection", "setProjection", "jsonSchema", "useMemo", "EchoSchema", "Type", "toJsonSchema", "useEffect", "staticSchema", "graph", "schemaRegistry", "schemas", "find", "schema", "getTypename", "db", "unsubscribe", "subscribe", "results", "fire", "ProjectionModel", "JSON", "stringify", "objects", "useQuery", "Filter", "type", "nothing", "filteredObjects", "useGlobalFilteredObjects", "Masonry", "Root", "items", "render", "classNames", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "meta", "role", "filter", "data", "Obj", "instanceOf", "View", "subject", "Masonry", "presentation", "target", "component", "React", "MasonryContainer", "view"]
7
- }