@dxos/plugin-masonry 0.8.4-main.ae835ea → 0.8.4-main.bcb3aa67d6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +77 -67
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/types/index.mjs +66 -0
- package/dist/lib/browser/types/index.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +77 -67
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/types/index.mjs +67 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/MasonryPlugin.d.ts +2 -1
- package/dist/types/src/MasonryPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +2 -2
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +3 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -0
- package/dist/types/src/containers/MasonryContainer/MasonryContainer.d.ts +12 -0
- package/dist/types/src/containers/MasonryContainer/MasonryContainer.d.ts.map +1 -0
- package/dist/types/src/containers/MasonryContainer/MasonryContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/MasonryContainer/index.d.ts +3 -0
- package/dist/types/src/containers/MasonryContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +3 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +22 -11
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Masonry.d.ts +17 -22
- package/dist/types/src/types/Masonry.d.ts.map +1 -1
- package/dist/types/src/types/MasonryAction.d.ts +0 -17
- package/dist/types/src/types/MasonryAction.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +61 -33
- package/src/MasonryPlugin.tsx +43 -54
- package/src/capabilities/index.ts +2 -3
- package/src/capabilities/react-surface.tsx +23 -16
- package/src/components/index.ts +3 -0
- package/src/containers/MasonryContainer/MasonryContainer.stories.tsx +78 -0
- package/src/containers/MasonryContainer/MasonryContainer.tsx +124 -0
- package/src/containers/MasonryContainer/index.ts +7 -0
- package/src/containers/index.ts +7 -0
- package/src/meta.ts +3 -3
- package/src/translations.ts +14 -9
- package/src/types/Masonry.ts +26 -28
- package/src/types/MasonryAction.ts +8 -17
- package/dist/lib/browser/chunk-RVOTJON5.mjs +0 -92
- package/dist/lib/browser/chunk-RVOTJON5.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-WM3U563P.mjs +0 -31
- package/dist/lib/browser/intent-resolver-WM3U563P.mjs.map +0 -7
- package/dist/lib/browser/react-surface-Z7W24EZP.mjs +0 -112
- package/dist/lib/browser/react-surface-Z7W24EZP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KTVJZX5B.mjs +0 -93
- package/dist/lib/node-esm/chunk-KTVJZX5B.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-YKIFA4JI.mjs +0 -32
- package/dist/lib/node-esm/intent-resolver-YKIFA4JI.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-BSDKYPZH.mjs +0 -113
- package/dist/lib/node-esm/react-surface-BSDKYPZH.mjs.map +0 -7
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/components/MasonryContainer.d.ts +0 -7
- package/dist/types/src/components/MasonryContainer.d.ts.map +0 -1
- package/dist/types/src/components/MasonryContainer.stories.d.ts.map +0 -1
- package/src/capabilities/intent-resolver.ts +0 -25
- package/src/components/MasonryContainer.stories.tsx +0 -83
- package/src/components/MasonryContainer.tsx +0 -69
- /package/dist/types/src/{components → containers/MasonryContainer}/MasonryContainer.stories.d.ts +0 -0
|
@@ -4,26 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import { DataType, TypenameAnnotationId } from '@dxos/schema';
|
|
9
|
-
|
|
10
|
-
import { meta } from '../meta';
|
|
11
|
-
|
|
12
|
-
const MASONRY_ACTION = `${meta.id}/action`;
|
|
7
|
+
import { TypeInputOptionsAnnotation } from '@dxos/plugin-space/types';
|
|
13
8
|
|
|
14
9
|
export const MasonryProps = Schema.Struct({
|
|
15
10
|
name: Schema.optional(Schema.String),
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
// TODO(wittjosiah): This should be a query input instead.
|
|
12
|
+
typename: Schema.String.pipe(
|
|
13
|
+
Schema.annotations({ title: 'Select card type' }),
|
|
14
|
+
TypeInputOptionsAnnotation.set({
|
|
15
|
+
location: ['database', 'runtime'],
|
|
16
|
+
kind: ['user'],
|
|
20
17
|
}),
|
|
18
|
+
Schema.optional,
|
|
21
19
|
),
|
|
22
20
|
});
|
|
23
|
-
|
|
24
|
-
export class CreateMasonry extends Schema.TaggedClass<CreateMasonry>()(`${MASONRY_ACTION}/create`, {
|
|
25
|
-
input: Schema.extend(Schema.Struct({ space: SpaceSchema }), MasonryProps),
|
|
26
|
-
output: Schema.Struct({
|
|
27
|
-
object: DataType.View,
|
|
28
|
-
}),
|
|
29
|
-
}) {}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __export = (target, all) => {
|
|
3
|
-
for (var name in all)
|
|
4
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
// src/meta.ts
|
|
8
|
-
import { trim } from "@dxos/util";
|
|
9
|
-
var meta = {
|
|
10
|
-
id: "dxos.org/plugin/masonry",
|
|
11
|
-
name: "Masonry",
|
|
12
|
-
description: trim`
|
|
13
|
-
Responsive grid layout that displays query results in an adaptive masonry pattern.
|
|
14
|
-
Visualize collections of cards, images, or mixed content that automatically adjusts to available screen space.
|
|
15
|
-
`,
|
|
16
|
-
icon: "ph--wall--regular",
|
|
17
|
-
iconHue: "green",
|
|
18
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-masonry",
|
|
19
|
-
screenshots: []
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// src/types/Masonry.ts
|
|
23
|
-
var Masonry_exports = {};
|
|
24
|
-
__export(Masonry_exports, {
|
|
25
|
-
Masonry: () => Masonry,
|
|
26
|
-
make: () => make,
|
|
27
|
-
makeView: () => makeView
|
|
28
|
-
});
|
|
29
|
-
import * as Schema from "effect/Schema";
|
|
30
|
-
import { Obj, Type } from "@dxos/echo";
|
|
31
|
-
import { ViewAnnotation, toEffectSchema } from "@dxos/echo/internal";
|
|
32
|
-
import { createViewFromSpace } from "@dxos/schema";
|
|
33
|
-
var Masonry = Schema.Struct({
|
|
34
|
-
arrangement: Schema.Array(Schema.Struct({
|
|
35
|
-
ids: Schema.Array(Type.ObjectId),
|
|
36
|
-
hidden: Schema.optional(Schema.Boolean)
|
|
37
|
-
}).pipe(Schema.mutable)).pipe(Schema.mutable, Schema.optional)
|
|
38
|
-
}).pipe(Type.Obj({
|
|
39
|
-
typename: "dxos.org/type/Masonry",
|
|
40
|
-
version: "0.1.0"
|
|
41
|
-
}), ViewAnnotation.set(true));
|
|
42
|
-
var make = (props = {}) => Obj.make(Masonry, props);
|
|
43
|
-
var makeView = async ({ ...props }) => {
|
|
44
|
-
const masonry = Obj.make(Masonry, {});
|
|
45
|
-
const { jsonSchema, view } = await createViewFromSpace({
|
|
46
|
-
...props,
|
|
47
|
-
presentation: masonry
|
|
48
|
-
});
|
|
49
|
-
const schema = toEffectSchema(jsonSchema);
|
|
50
|
-
return {
|
|
51
|
-
jsonSchema,
|
|
52
|
-
schema,
|
|
53
|
-
view
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// src/types/MasonryAction.ts
|
|
58
|
-
var MasonryAction_exports = {};
|
|
59
|
-
__export(MasonryAction_exports, {
|
|
60
|
-
CreateMasonry: () => CreateMasonry,
|
|
61
|
-
MasonryProps: () => MasonryProps
|
|
62
|
-
});
|
|
63
|
-
import * as Schema2 from "effect/Schema";
|
|
64
|
-
import { SpaceSchema } from "@dxos/react-client/echo";
|
|
65
|
-
import { DataType, TypenameAnnotationId } from "@dxos/schema";
|
|
66
|
-
var MASONRY_ACTION = `${meta.id}/action`;
|
|
67
|
-
var MasonryProps = Schema2.Struct({
|
|
68
|
-
name: Schema2.optional(Schema2.String),
|
|
69
|
-
typename: Schema2.optional(Schema2.String.annotations({
|
|
70
|
-
[TypenameAnnotationId]: [
|
|
71
|
-
"used-static",
|
|
72
|
-
"dynamic"
|
|
73
|
-
],
|
|
74
|
-
title: "Select card record type (leave empty to start fresh)"
|
|
75
|
-
}))
|
|
76
|
-
});
|
|
77
|
-
var CreateMasonry = class extends Schema2.TaggedClass()(`${MASONRY_ACTION}/create`, {
|
|
78
|
-
input: Schema2.extend(Schema2.Struct({
|
|
79
|
-
space: SpaceSchema
|
|
80
|
-
}), MasonryProps),
|
|
81
|
-
output: Schema2.Struct({
|
|
82
|
-
object: DataType.View
|
|
83
|
-
})
|
|
84
|
-
}) {
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
export {
|
|
88
|
-
meta,
|
|
89
|
-
Masonry_exports,
|
|
90
|
-
MasonryAction_exports
|
|
91
|
-
};
|
|
92
|
-
//# sourceMappingURL=chunk-RVOTJON5.mjs.map
|
|
@@ -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 { type CreateViewFromSpaceProps, type DataType, createViewFromSpace } 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<CreateViewFromSpaceProps, 'presentation'>;\n\nexport const makeView = async ({\n ...props\n}: MakeViewProps): Promise<{\n jsonSchema: JsonSchemaType;\n view: DataType.View;\n schema: ReturnType<typeof toEffectSchema>;\n}> => {\n const masonry = Obj.make(Masonry, {});\n const { jsonSchema, view } = await createViewFromSpace({ ...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 { DataType, TypenameAnnotationId } 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 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: DataType.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,SAAuDC,2BAA2B;AAE3E,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,oBAAoB;IAAE,GAAGL;IAAOM,cAAcJ;EAAQ,CAAA;AAGzF,QAAMK,SAASC,eAAeL,UAAAA;AAE9B,SAAO;IAAEA;IAAYI;IAAQH;EAAK;AACpC;;;ACjDA;;;;;AAIA,YAAYK,aAAY;AAExB,SAASC,mBAAmB;AAC5B,SAASC,UAAUC,4BAA4B;AAI/C,IAAMC,iBAAiB,GAAGC,KAAKC,EAAE;AAE1B,IAAMC,eAAsBC,eAAO;EACxCC,MAAaC,iBAAgBC,cAAM;EACnCC,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,SAASC;EACnB,CAAA;AACF,CAAA,EAAA;AAAI;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "Schema", "Obj", "Type", "ViewAnnotation", "toEffectSchema", "createViewFromSpace", "Masonry", "Struct", "arrangement", "Array", "ids", "Type", "ObjectId", "hidden", "optional", "Boolean", "pipe", "mutable", "Obj", "typename", "version", "ViewAnnotation", "set", "make", "props", "makeView", "masonry", "jsonSchema", "view", "createViewFromSpace", "presentation", "schema", "toEffectSchema", "Schema", "SpaceSchema", "DataType", "TypenameAnnotationId", "MASONRY_ACTION", "meta", "id", "MasonryProps", "Struct", "name", "optional", "String", "typename", "annotations", "TypenameAnnotationId", "title", "CreateMasonry", "TaggedClass", "input", "extend", "space", "SpaceSchema", "output", "object", "DataType", "View"]
|
|
7
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MasonryAction_exports,
|
|
3
|
-
Masonry_exports
|
|
4
|
-
} from "./chunk-RVOTJON5.mjs";
|
|
5
|
-
|
|
6
|
-
// src/capabilities/intent-resolver.ts
|
|
7
|
-
import { Capabilities, contributes, createResolver } from "@dxos/app-framework";
|
|
8
|
-
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
9
|
-
var intent_resolver_default = ((context) => contributes(Capabilities.IntentResolver, [
|
|
10
|
-
createResolver({
|
|
11
|
-
intent: MasonryAction_exports.CreateMasonry,
|
|
12
|
-
resolve: async ({ space, name, typename }) => {
|
|
13
|
-
const client = context.getCapability(ClientCapabilities.Client);
|
|
14
|
-
const { view } = await Masonry_exports.makeView({
|
|
15
|
-
client,
|
|
16
|
-
space,
|
|
17
|
-
name,
|
|
18
|
-
typename
|
|
19
|
-
});
|
|
20
|
-
return {
|
|
21
|
-
data: {
|
|
22
|
-
object: view
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
|
-
]));
|
|
28
|
-
export {
|
|
29
|
-
intent_resolver_default as default
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=intent-resolver-WM3U563P.mjs.map
|
|
@@ -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,112 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Masonry_exports,
|
|
3
|
-
meta
|
|
4
|
-
} from "./chunk-RVOTJON5.mjs";
|
|
5
|
-
|
|
6
|
-
// src/capabilities/react-surface.tsx
|
|
7
|
-
import React2 from "react";
|
|
8
|
-
import { Capabilities, contributes, createSurface } from "@dxos/app-framework";
|
|
9
|
-
import { Obj } from "@dxos/echo";
|
|
10
|
-
import { DataType } from "@dxos/schema";
|
|
11
|
-
|
|
12
|
-
// src/components/MasonryContainer.tsx
|
|
13
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
14
|
-
import React, { useEffect, useMemo, useState } from "react";
|
|
15
|
-
import { Surface } from "@dxos/app-framework";
|
|
16
|
-
import { Filter, Type } from "@dxos/echo";
|
|
17
|
-
import { EchoSchema } from "@dxos/echo/internal";
|
|
18
|
-
import { useGlobalFilteredObjects } from "@dxos/plugin-search";
|
|
19
|
-
import { useClient } from "@dxos/react-client";
|
|
20
|
-
import { getSpace, useQuery } from "@dxos/react-client/echo";
|
|
21
|
-
import { Masonry } from "@dxos/react-ui-masonry";
|
|
22
|
-
import { ProjectionModel, getTypenameFromQuery } from "@dxos/schema";
|
|
23
|
-
var Item = ({ data }) => {
|
|
24
|
-
var _effect = _useSignals();
|
|
25
|
-
try {
|
|
26
|
-
return /* @__PURE__ */ React.createElement(Surface, {
|
|
27
|
-
role: "card",
|
|
28
|
-
limit: 1,
|
|
29
|
-
data: {
|
|
30
|
-
subject: data
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
} finally {
|
|
34
|
-
_effect.f();
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
var MasonryContainer = ({ view, role }) => {
|
|
38
|
-
var _effect = _useSignals();
|
|
39
|
-
try {
|
|
40
|
-
const client = useClient();
|
|
41
|
-
const space = getSpace(view);
|
|
42
|
-
const typename = view.query ? getTypenameFromQuery(view.query.ast) : void 0;
|
|
43
|
-
const [cardSchema, setCardSchema] = useState();
|
|
44
|
-
const [projection, setProjection] = useState();
|
|
45
|
-
const jsonSchema = useMemo(() => {
|
|
46
|
-
if (!cardSchema) return void 0;
|
|
47
|
-
return cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : Type.toJsonSchema(cardSchema);
|
|
48
|
-
}, [
|
|
49
|
-
cardSchema
|
|
50
|
-
]);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);
|
|
53
|
-
if (staticSchema) {
|
|
54
|
-
setCardSchema(() => staticSchema);
|
|
55
|
-
}
|
|
56
|
-
if (!staticSchema && typename && space) {
|
|
57
|
-
const query = space.db.schemaRegistry.query({
|
|
58
|
-
typename
|
|
59
|
-
});
|
|
60
|
-
const unsubscribe = query.subscribe(() => {
|
|
61
|
-
const [schema] = query.results;
|
|
62
|
-
if (schema) {
|
|
63
|
-
setCardSchema(schema);
|
|
64
|
-
}
|
|
65
|
-
}, {
|
|
66
|
-
fire: true
|
|
67
|
-
});
|
|
68
|
-
return unsubscribe;
|
|
69
|
-
}
|
|
70
|
-
}, [
|
|
71
|
-
typename,
|
|
72
|
-
space
|
|
73
|
-
]);
|
|
74
|
-
useEffect(() => {
|
|
75
|
-
if (jsonSchema) {
|
|
76
|
-
setProjection(new ProjectionModel(jsonSchema, view.projection));
|
|
77
|
-
}
|
|
78
|
-
}, [
|
|
79
|
-
view.projection,
|
|
80
|
-
JSON.stringify(jsonSchema)
|
|
81
|
-
]);
|
|
82
|
-
const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());
|
|
83
|
-
const filteredObjects = useGlobalFilteredObjects(objects);
|
|
84
|
-
return /* @__PURE__ */ React.createElement(Masonry.Root, {
|
|
85
|
-
items: filteredObjects,
|
|
86
|
-
render: Item,
|
|
87
|
-
classNames: "is-full max-is-full bs-full max-bs-full overflow-y-auto p-4"
|
|
88
|
-
});
|
|
89
|
-
} finally {
|
|
90
|
-
_effect.f();
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
// src/capabilities/react-surface.tsx
|
|
95
|
-
var react_surface_default = (() => contributes(Capabilities.ReactSurface, [
|
|
96
|
-
createSurface({
|
|
97
|
-
id: meta.id,
|
|
98
|
-
role: [
|
|
99
|
-
"article",
|
|
100
|
-
"section"
|
|
101
|
-
],
|
|
102
|
-
filter: (data) => Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(Masonry_exports.Masonry, data.subject.presentation?.target),
|
|
103
|
-
component: ({ data, role }) => /* @__PURE__ */ React2.createElement(MasonryContainer, {
|
|
104
|
-
view: data.subject,
|
|
105
|
-
role
|
|
106
|
-
})
|
|
107
|
-
})
|
|
108
|
-
]));
|
|
109
|
-
export {
|
|
110
|
-
react_surface_default as default
|
|
111
|
-
};
|
|
112
|
-
//# sourceMappingURL=react-surface-Z7W24EZP.mjs.map
|
|
@@ -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 { DataType } 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: DataType.View } =>\n Obj.instanceOf(DataType.View, data.subject) &&\n 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';\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 { type DataType, ProjectionModel, 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: DataType.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,gBAAgB;;;;ACJzB,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,SAAwBC,iBAAiBC,4BAA4B;AAErE,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,MAAyC;;;AACpF,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,SAASC,MAAMJ,KAAKK,OAAO,KAC1CJ,IAAIC,WAAWI,gBAAQA,SAASN,KAAKK,QAAQE,cAAcC,MAAAA;IAC7DC,WAAW,CAAC,EAAET,MAAMF,KAAI,MAAO,gBAAAY,OAAA,cAACC,kBAAAA;MAAiBC,MAAMZ,KAAKK;MAASP;;EACvE,CAAA;CACD;",
|
|
6
|
-
"names": ["React", "Capabilities", "contributes", "createSurface", "Obj", "DataType", "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", "DataType", "View", "subject", "Masonry", "presentation", "target", "component", "React", "MasonryContainer", "view"]
|
|
7
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __export = (target, all) => {
|
|
4
|
-
for (var name in all)
|
|
5
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
// src/meta.ts
|
|
9
|
-
import { trim } from "@dxos/util";
|
|
10
|
-
var meta = {
|
|
11
|
-
id: "dxos.org/plugin/masonry",
|
|
12
|
-
name: "Masonry",
|
|
13
|
-
description: trim`
|
|
14
|
-
Responsive grid layout that displays query results in an adaptive masonry pattern.
|
|
15
|
-
Visualize collections of cards, images, or mixed content that automatically adjusts to available screen space.
|
|
16
|
-
`,
|
|
17
|
-
icon: "ph--wall--regular",
|
|
18
|
-
iconHue: "green",
|
|
19
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-masonry",
|
|
20
|
-
screenshots: []
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// src/types/Masonry.ts
|
|
24
|
-
var Masonry_exports = {};
|
|
25
|
-
__export(Masonry_exports, {
|
|
26
|
-
Masonry: () => Masonry,
|
|
27
|
-
make: () => make,
|
|
28
|
-
makeView: () => makeView
|
|
29
|
-
});
|
|
30
|
-
import * as Schema from "effect/Schema";
|
|
31
|
-
import { Obj, Type } from "@dxos/echo";
|
|
32
|
-
import { ViewAnnotation, toEffectSchema } from "@dxos/echo/internal";
|
|
33
|
-
import { createViewFromSpace } from "@dxos/schema";
|
|
34
|
-
var Masonry = Schema.Struct({
|
|
35
|
-
arrangement: Schema.Array(Schema.Struct({
|
|
36
|
-
ids: Schema.Array(Type.ObjectId),
|
|
37
|
-
hidden: Schema.optional(Schema.Boolean)
|
|
38
|
-
}).pipe(Schema.mutable)).pipe(Schema.mutable, Schema.optional)
|
|
39
|
-
}).pipe(Type.Obj({
|
|
40
|
-
typename: "dxos.org/type/Masonry",
|
|
41
|
-
version: "0.1.0"
|
|
42
|
-
}), ViewAnnotation.set(true));
|
|
43
|
-
var make = (props = {}) => Obj.make(Masonry, props);
|
|
44
|
-
var makeView = async ({ ...props }) => {
|
|
45
|
-
const masonry = Obj.make(Masonry, {});
|
|
46
|
-
const { jsonSchema, view } = await createViewFromSpace({
|
|
47
|
-
...props,
|
|
48
|
-
presentation: masonry
|
|
49
|
-
});
|
|
50
|
-
const schema = toEffectSchema(jsonSchema);
|
|
51
|
-
return {
|
|
52
|
-
jsonSchema,
|
|
53
|
-
schema,
|
|
54
|
-
view
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// src/types/MasonryAction.ts
|
|
59
|
-
var MasonryAction_exports = {};
|
|
60
|
-
__export(MasonryAction_exports, {
|
|
61
|
-
CreateMasonry: () => CreateMasonry,
|
|
62
|
-
MasonryProps: () => MasonryProps
|
|
63
|
-
});
|
|
64
|
-
import * as Schema2 from "effect/Schema";
|
|
65
|
-
import { SpaceSchema } from "@dxos/react-client/echo";
|
|
66
|
-
import { DataType, TypenameAnnotationId } from "@dxos/schema";
|
|
67
|
-
var MASONRY_ACTION = `${meta.id}/action`;
|
|
68
|
-
var MasonryProps = Schema2.Struct({
|
|
69
|
-
name: Schema2.optional(Schema2.String),
|
|
70
|
-
typename: Schema2.optional(Schema2.String.annotations({
|
|
71
|
-
[TypenameAnnotationId]: [
|
|
72
|
-
"used-static",
|
|
73
|
-
"dynamic"
|
|
74
|
-
],
|
|
75
|
-
title: "Select card record type (leave empty to start fresh)"
|
|
76
|
-
}))
|
|
77
|
-
});
|
|
78
|
-
var CreateMasonry = class extends Schema2.TaggedClass()(`${MASONRY_ACTION}/create`, {
|
|
79
|
-
input: Schema2.extend(Schema2.Struct({
|
|
80
|
-
space: SpaceSchema
|
|
81
|
-
}), MasonryProps),
|
|
82
|
-
output: Schema2.Struct({
|
|
83
|
-
object: DataType.View
|
|
84
|
-
})
|
|
85
|
-
}) {
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export {
|
|
89
|
-
meta,
|
|
90
|
-
Masonry_exports,
|
|
91
|
-
MasonryAction_exports
|
|
92
|
-
};
|
|
93
|
-
//# sourceMappingURL=chunk-KTVJZX5B.mjs.map
|
|
@@ -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 { type CreateViewFromSpaceProps, type DataType, createViewFromSpace } 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<CreateViewFromSpaceProps, 'presentation'>;\n\nexport const makeView = async ({\n ...props\n}: MakeViewProps): Promise<{\n jsonSchema: JsonSchemaType;\n view: DataType.View;\n schema: ReturnType<typeof toEffectSchema>;\n}> => {\n const masonry = Obj.make(Masonry, {});\n const { jsonSchema, view } = await createViewFromSpace({ ...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 { DataType, TypenameAnnotationId } 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 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: DataType.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,SAAuDC,2BAA2B;AAE3E,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,oBAAoB;IAAE,GAAGL;IAAOM,cAAcJ;EAAQ,CAAA;AAGzF,QAAMK,SAASC,eAAeL,UAAAA;AAE9B,SAAO;IAAEA;IAAYI;IAAQH;EAAK;AACpC;;;ACjDA;;;;;AAIA,YAAYK,aAAY;AAExB,SAASC,mBAAmB;AAC5B,SAASC,UAAUC,4BAA4B;AAI/C,IAAMC,iBAAiB,GAAGC,KAAKC,EAAE;AAE1B,IAAMC,eAAsBC,eAAO;EACxCC,MAAaC,iBAAgBC,cAAM;EACnCC,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,SAASC;EACnB,CAAA;AACF,CAAA,EAAA;AAAI;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "screenshots", "Schema", "Obj", "Type", "ViewAnnotation", "toEffectSchema", "createViewFromSpace", "Masonry", "Struct", "arrangement", "Array", "ids", "Type", "ObjectId", "hidden", "optional", "Boolean", "pipe", "mutable", "Obj", "typename", "version", "ViewAnnotation", "set", "make", "props", "makeView", "masonry", "jsonSchema", "view", "createViewFromSpace", "presentation", "schema", "toEffectSchema", "Schema", "SpaceSchema", "DataType", "TypenameAnnotationId", "MASONRY_ACTION", "meta", "id", "MasonryProps", "Struct", "name", "optional", "String", "typename", "annotations", "TypenameAnnotationId", "title", "CreateMasonry", "TaggedClass", "input", "extend", "space", "SpaceSchema", "output", "object", "DataType", "View"]
|
|
7
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
MasonryAction_exports,
|
|
4
|
-
Masonry_exports
|
|
5
|
-
} from "./chunk-KTVJZX5B.mjs";
|
|
6
|
-
|
|
7
|
-
// src/capabilities/intent-resolver.ts
|
|
8
|
-
import { Capabilities, contributes, createResolver } from "@dxos/app-framework";
|
|
9
|
-
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
10
|
-
var intent_resolver_default = ((context) => contributes(Capabilities.IntentResolver, [
|
|
11
|
-
createResolver({
|
|
12
|
-
intent: MasonryAction_exports.CreateMasonry,
|
|
13
|
-
resolve: async ({ space, name, typename }) => {
|
|
14
|
-
const client = context.getCapability(ClientCapabilities.Client);
|
|
15
|
-
const { view } = await Masonry_exports.makeView({
|
|
16
|
-
client,
|
|
17
|
-
space,
|
|
18
|
-
name,
|
|
19
|
-
typename
|
|
20
|
-
});
|
|
21
|
-
return {
|
|
22
|
-
data: {
|
|
23
|
-
object: view
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
]));
|
|
29
|
-
export {
|
|
30
|
-
intent_resolver_default as default
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=intent-resolver-YKIFA4JI.mjs.map
|
|
@@ -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,113 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
Masonry_exports,
|
|
4
|
-
meta
|
|
5
|
-
} from "./chunk-KTVJZX5B.mjs";
|
|
6
|
-
|
|
7
|
-
// src/capabilities/react-surface.tsx
|
|
8
|
-
import React2 from "react";
|
|
9
|
-
import { Capabilities, contributes, createSurface } from "@dxos/app-framework";
|
|
10
|
-
import { Obj } from "@dxos/echo";
|
|
11
|
-
import { DataType } from "@dxos/schema";
|
|
12
|
-
|
|
13
|
-
// src/components/MasonryContainer.tsx
|
|
14
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
15
|
-
import React, { useEffect, useMemo, useState } from "react";
|
|
16
|
-
import { Surface } from "@dxos/app-framework";
|
|
17
|
-
import { Filter, Type } from "@dxos/echo";
|
|
18
|
-
import { EchoSchema } from "@dxos/echo/internal";
|
|
19
|
-
import { useGlobalFilteredObjects } from "@dxos/plugin-search";
|
|
20
|
-
import { useClient } from "@dxos/react-client";
|
|
21
|
-
import { getSpace, useQuery } from "@dxos/react-client/echo";
|
|
22
|
-
import { Masonry } from "@dxos/react-ui-masonry";
|
|
23
|
-
import { ProjectionModel, getTypenameFromQuery } from "@dxos/schema";
|
|
24
|
-
var Item = ({ data }) => {
|
|
25
|
-
var _effect = _useSignals();
|
|
26
|
-
try {
|
|
27
|
-
return /* @__PURE__ */ React.createElement(Surface, {
|
|
28
|
-
role: "card",
|
|
29
|
-
limit: 1,
|
|
30
|
-
data: {
|
|
31
|
-
subject: data
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
} finally {
|
|
35
|
-
_effect.f();
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var MasonryContainer = ({ view, role }) => {
|
|
39
|
-
var _effect = _useSignals();
|
|
40
|
-
try {
|
|
41
|
-
const client = useClient();
|
|
42
|
-
const space = getSpace(view);
|
|
43
|
-
const typename = view.query ? getTypenameFromQuery(view.query.ast) : void 0;
|
|
44
|
-
const [cardSchema, setCardSchema] = useState();
|
|
45
|
-
const [projection, setProjection] = useState();
|
|
46
|
-
const jsonSchema = useMemo(() => {
|
|
47
|
-
if (!cardSchema) return void 0;
|
|
48
|
-
return cardSchema instanceof EchoSchema ? cardSchema.jsonSchema : Type.toJsonSchema(cardSchema);
|
|
49
|
-
}, [
|
|
50
|
-
cardSchema
|
|
51
|
-
]);
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
const staticSchema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);
|
|
54
|
-
if (staticSchema) {
|
|
55
|
-
setCardSchema(() => staticSchema);
|
|
56
|
-
}
|
|
57
|
-
if (!staticSchema && typename && space) {
|
|
58
|
-
const query = space.db.schemaRegistry.query({
|
|
59
|
-
typename
|
|
60
|
-
});
|
|
61
|
-
const unsubscribe = query.subscribe(() => {
|
|
62
|
-
const [schema] = query.results;
|
|
63
|
-
if (schema) {
|
|
64
|
-
setCardSchema(schema);
|
|
65
|
-
}
|
|
66
|
-
}, {
|
|
67
|
-
fire: true
|
|
68
|
-
});
|
|
69
|
-
return unsubscribe;
|
|
70
|
-
}
|
|
71
|
-
}, [
|
|
72
|
-
typename,
|
|
73
|
-
space
|
|
74
|
-
]);
|
|
75
|
-
useEffect(() => {
|
|
76
|
-
if (jsonSchema) {
|
|
77
|
-
setProjection(new ProjectionModel(jsonSchema, view.projection));
|
|
78
|
-
}
|
|
79
|
-
}, [
|
|
80
|
-
view.projection,
|
|
81
|
-
JSON.stringify(jsonSchema)
|
|
82
|
-
]);
|
|
83
|
-
const objects = useQuery(space, cardSchema ? Filter.type(cardSchema) : Filter.nothing());
|
|
84
|
-
const filteredObjects = useGlobalFilteredObjects(objects);
|
|
85
|
-
return /* @__PURE__ */ React.createElement(Masonry.Root, {
|
|
86
|
-
items: filteredObjects,
|
|
87
|
-
render: Item,
|
|
88
|
-
classNames: "is-full max-is-full bs-full max-bs-full overflow-y-auto p-4"
|
|
89
|
-
});
|
|
90
|
-
} finally {
|
|
91
|
-
_effect.f();
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// src/capabilities/react-surface.tsx
|
|
96
|
-
var react_surface_default = (() => contributes(Capabilities.ReactSurface, [
|
|
97
|
-
createSurface({
|
|
98
|
-
id: meta.id,
|
|
99
|
-
role: [
|
|
100
|
-
"article",
|
|
101
|
-
"section"
|
|
102
|
-
],
|
|
103
|
-
filter: (data) => Obj.instanceOf(DataType.View, data.subject) && Obj.instanceOf(Masonry_exports.Masonry, data.subject.presentation?.target),
|
|
104
|
-
component: ({ data, role }) => /* @__PURE__ */ React2.createElement(MasonryContainer, {
|
|
105
|
-
view: data.subject,
|
|
106
|
-
role
|
|
107
|
-
})
|
|
108
|
-
})
|
|
109
|
-
]));
|
|
110
|
-
export {
|
|
111
|
-
react_surface_default as default
|
|
112
|
-
};
|
|
113
|
-
//# sourceMappingURL=react-surface-BSDKYPZH.mjs.map
|
|
@@ -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 { DataType } 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: DataType.View } =>\n Obj.instanceOf(DataType.View, data.subject) &&\n 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';\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 { type DataType, ProjectionModel, 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: DataType.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,gBAAgB;;;;ACJzB,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,SAAwBC,iBAAiBC,4BAA4B;AAErE,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,MAAyC;;;AACpF,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,SAASC,MAAMJ,KAAKK,OAAO,KAC1CJ,IAAIC,WAAWI,gBAAQA,SAASN,KAAKK,QAAQE,cAAcC,MAAAA;IAC7DC,WAAW,CAAC,EAAET,MAAMF,KAAI,MAAO,gBAAAY,OAAA,cAACC,kBAAAA;MAAiBC,MAAMZ,KAAKK;MAASP;;EACvE,CAAA;CACD;",
|
|
6
|
-
"names": ["React", "Capabilities", "contributes", "createSurface", "Obj", "DataType", "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", "DataType", "View", "subject", "Masonry", "presentation", "target", "component", "React", "MasonryContainer", "view"]
|
|
7
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { Capabilities, type PluginContext } from '@dxos/app-framework';
|
|
2
|
-
declare const _default: (context: PluginContext) => import("@dxos/app-framework").Capability<import("@dxos/app-framework").InterfaceDef<Capabilities.IntentResolver>>;
|
|
3
|
-
export default _default;
|
|
4
|
-
//# sourceMappingURL=intent-resolver.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intent-resolver.d.ts","sourceRoot":"","sources":["../../../../src/capabilities/intent-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAA+B,MAAM,qBAAqB,CAAC;yBAKpF,SAAS,aAAa;AAAtC,wBAeK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MasonryContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/MasonryContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,cAAc,CAAC;AAMpF,eAAO,MAAM,gBAAgB,GAAI,gBAAgB;IAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,sBAiDrF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MasonryContainer.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/MasonryContainer.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA8B,MAAM,OAAO,CAAC;AAqCnD,QAAA,MAAM,IAAI;;;;;;;;CAkCM,CAAC;AAEjB,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
|