@sealcode/jdd-editor 0.2.16 → 0.2.17
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/.nyc_output/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
- package/.nyc_output/processinfo/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +1 -1
- package/.nyc_output/processinfo/{15c7e9a9-1ea9-4c86-8310-45fa6fc6e38b.json → a331cb1e-8707-469e-95be-5bc65de3f692.json} +1 -1
- package/.nyc_output/processinfo/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/.xunit +1 -1
- package/@types/components.sreact.d.ts +1 -1
- package/@types/inputs/component-input-markdown.d.ts +6 -0
- package/@types/jdd-creator.d.ts +2 -2
- package/assets/styles/markdown-editor.css +9 -39
- package/coverage/clover.xml +189 -253
- package/dist/src/inputs/component-input-markdown.js +49 -0
- package/dist/src/inputs/component-input-markdown.js.map +7 -0
- package/dist/src/inputs/component-input.js +7 -16
- package/dist/src/inputs/component-input.js.map +2 -2
- package/package.json +1 -1
- package/src/inputs/component-input-markdown.ts +58 -0
- package/src/inputs/component-input.ts +7 -17
- package/.nyc_output/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
- package/.nyc_output/processinfo/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
- package/@types/controllers/markdown-textarea.stimulus.d.ts +0 -20
- package/dist/src/controllers/markdown-textarea.stimulus.js +0 -174
- package/dist/src/controllers/markdown-textarea.stimulus.js.map +0 -7
- package/src/controllers/markdown-textarea.stimulus.ts +0 -198
- /package/.nyc_output/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +0 -0
- /package/.nyc_output/{15c7e9a9-1ea9-4c86-8310-45fa6fc6e38b.json → a331cb1e-8707-469e-95be-5bc65de3f692.json} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { printArgPath } from "./print-arg-path.js";
|
|
2
|
+
import { is, predicates } from "@sealcode/ts-predicates";
|
|
3
|
+
const buttons = [
|
|
4
|
+
{ content: "<b>B</b>", data: { wrap: "**" } },
|
|
5
|
+
{ content: "<i>I</i>", data: { prefix: "*" } },
|
|
6
|
+
{ content: "H1", data: { prefix: "#" } },
|
|
7
|
+
{ content: "\u275D", data: { prefix: ">" } },
|
|
8
|
+
{ content: "\u2022 List", data: { prefix: "-" } },
|
|
9
|
+
{ content: "1. List", data: { prefix: "1" } },
|
|
10
|
+
{ content: "\u{1F517}", data: { "wrap-before": "[", "wrap-after": "]()" } }
|
|
11
|
+
];
|
|
12
|
+
function ComponentInputMarkdown({
|
|
13
|
+
arg_path,
|
|
14
|
+
value,
|
|
15
|
+
component
|
|
16
|
+
}) {
|
|
17
|
+
return `<div
|
|
18
|
+
id="monaco__markdown__${arg_path.join("_")}__for__${component.name}"
|
|
19
|
+
>
|
|
20
|
+
${arg_path.at(-1) || ""}
|
|
21
|
+
<div class="monaco-wrapper monaco-wrapper--markdown">
|
|
22
|
+
<div data-controller="monaco" data-language="markdown">
|
|
23
|
+
<div class="toolbar">
|
|
24
|
+
${buttons.map(
|
|
25
|
+
(e) => `<button type="button" data-action="monaco#wrapSelection" ${Object.entries(
|
|
26
|
+
e.data
|
|
27
|
+
).map(
|
|
28
|
+
([key, value2]) => `data-${key}="${value2}"`
|
|
29
|
+
).join(" ")}>${e.content}</button>`
|
|
30
|
+
).join("")}
|
|
31
|
+
</div>
|
|
32
|
+
<div class="textarea-wrapper" data-monaco-target="wrapper">
|
|
33
|
+
<textarea
|
|
34
|
+
data-monaco-target="textarea"
|
|
35
|
+
name="${`$${printArgPath(arg_path)}`}"
|
|
36
|
+
style="display: none"
|
|
37
|
+
>
|
|
38
|
+
${is(value, predicates.string) ? value : ""}
|
|
39
|
+
</textarea
|
|
40
|
+
>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>`;
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
ComponentInputMarkdown as default
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=component-input-markdown.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/inputs/component-input-markdown.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component } from \"@sealcode/jdd\";\nimport { printArgPath } from \"./print-arg-path.js\";\nimport { is, predicates } from \"@sealcode/ts-predicates\";\n\nconst buttons: { content: string; data: Record<string, string> }[] = [\n\t{ content: \"<b>B</b>\", data: { wrap: \"**\" } },\n\t{ content: \"<i>I</i>\", data: { prefix: \"*\" } },\n\t{ content: \"H1\", data: { prefix: \"#\" } },\n\t{ content: \"\u275D\", data: { prefix: \">\" } },\n\t{ content: \"\u2022 List\", data: { prefix: \"-\" } },\n\t{ content: \"1. List\", data: { prefix: \"1\" } },\n\t{ content: \"\uD83D\uDD17\", data: { \"wrap-before\": \"[\", \"wrap-after\": \"]()\" } },\n];\n\nexport default function ComponentInputMarkdown({\n\targ_path,\n\tvalue,\n\tcomponent,\n}: {\n\targ_path: string[];\n\tvalue: unknown;\n\tcomponent: Component;\n}) {\n\treturn /* HTML */ `<div\n\t\tid=\"monaco__markdown__${arg_path.join(\"_\")}__for__${component.name}\"\n\t>\n\t\t${arg_path.at(-1) || \"\"}\n\t\t<div class=\"monaco-wrapper monaco-wrapper--markdown\">\n\t\t\t<div data-controller=\"monaco\" data-language=\"markdown\">\n\t\t\t\t<div class=\"toolbar\">\n\t\t\t\t\t${buttons\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(e) =>\n\t\t\t\t\t\t\t\t`<button type=\"button\" data-action=\"monaco#wrapSelection\" ${Object.entries(\n\t\t\t\t\t\t\t\t\te.data\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t([key, value]) =>\n\t\t\t\t\t\t\t\t\t\t\t`data-${key}=\"${value}\"`\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join(\" \")}>${e.content}</button>`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"\")}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"textarea-wrapper\" data-monaco-target=\"wrapper\">\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tdata-monaco-target=\"textarea\"\n\t\t\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\t\t\tstyle=\"display: none\"\n\t\t\t\t\t>\n${is(value, predicates.string) ? value : \"\"}\n </textarea\n\t\t\t\t\t>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>`;\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,IAAI,kBAAkB;AAE/B,MAAM,UAA+D;AAAA,EACpE,EAAE,SAAS,YAAY,MAAM,EAAE,MAAM,KAAK,EAAE;AAAA,EAC5C,EAAE,SAAS,YAAY,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EAC7C,EAAE,SAAS,MAAM,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EACvC,EAAE,SAAS,UAAK,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EACtC,EAAE,SAAS,eAAU,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EAC3C,EAAE,SAAS,WAAW,MAAM,EAAE,QAAQ,IAAI,EAAE;AAAA,EAC5C,EAAE,SAAS,aAAM,MAAM,EAAE,eAAe,KAAK,cAAc,MAAM,EAAE;AACpE;AAEe,SAAR,uBAAwC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACD,GAIG;AACF,SAAkB;AAAA,0BACO,SAAS,KAAK,GAAG,WAAW,UAAU;AAAA;AAAA,IAE5D,SAAS,GAAG,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,OAIhB,QACA;AAAA,IACA,CAAC,MACA,4DAA4D,OAAO;AAAA,MAClE,EAAE;AAAA,IACH,EACE;AAAA,MACA,CAAC,CAAC,KAAKA,MAAK,MACX,QAAQ,QAAQA;AAAA,IAClB,EACC,KAAK,GAAG,KAAK,EAAE;AAAA,EACnB,EACC,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,cAKA,IAAI,aAAa,QAAQ;AAAA;AAAA;AAAA,EAGrC,GAAG,OAAO,WAAW,MAAM,IAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzC;",
|
|
6
|
+
"names": ["value"]
|
|
7
|
+
}
|
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
SingleReference,
|
|
10
10
|
Structured,
|
|
11
11
|
Table,
|
|
12
|
-
CodeWithCustomLanguage
|
|
12
|
+
CodeWithCustomLanguage,
|
|
13
|
+
Markdown
|
|
13
14
|
} from "@sealcode/jdd";
|
|
14
15
|
import { is, predicates } from "@sealcode/ts-predicates";
|
|
15
16
|
import { htmlEscape } from "escape-goat";
|
|
@@ -25,6 +26,7 @@ import { ComponentInputStructured } from "./component-input-structured.js";
|
|
|
25
26
|
import { ComponentInputTable } from "./component-input-table.js";
|
|
26
27
|
import { printArgPath } from "./print-arg-path.js";
|
|
27
28
|
import { ComponentInputCodeWithCustomLanguage } from "./component-input-code-with-custom-language.js";
|
|
29
|
+
import ComponentInputMarkdown from "./component-input-markdown.js";
|
|
28
30
|
const actionName = "Components";
|
|
29
31
|
const absoluteUrlPattern = "http(s?)(://)((www.)?)(([^.]+).)?([a-zA-z0-9-_]+)";
|
|
30
32
|
async function ComponentInput({
|
|
@@ -147,6 +149,9 @@ async function ComponentInput({
|
|
|
147
149
|
component
|
|
148
150
|
});
|
|
149
151
|
}
|
|
152
|
+
if (arg instanceof Markdown) {
|
|
153
|
+
return ComponentInputMarkdown({ arg_path, value, component });
|
|
154
|
+
}
|
|
150
155
|
const inputElement = () => {
|
|
151
156
|
if (arg instanceof ComponentArguments.Number) {
|
|
152
157
|
return tempstream` <input
|
|
@@ -176,21 +181,7 @@ async function ComponentInput({
|
|
|
176
181
|
}
|
|
177
182
|
};
|
|
178
183
|
return `<div>
|
|
179
|
-
<label>
|
|
180
|
-
${arg_path.at(-1) || ""}
|
|
181
|
-
${argType == "markdown" ? `<div class="grow-wrap">
|
|
182
|
-
<textarea
|
|
183
|
-
name="${`$${printArgPath(arg_path)}`}"
|
|
184
|
-
onblur="${page.rerender()}"
|
|
185
|
-
cols="40"
|
|
186
|
-
data-controller="markdown-textarea submit-on-input"
|
|
187
|
-
data-action="autogrow-textarea#autogrow blur->autogrow-textarea#autogrow resize->autogrow-textarea#autogrow submit-on-input#sendValues focus->submit-on-input#makePermanent blur->submit-on-input#makeNotPermanent"
|
|
188
|
-
autocomplete="off"
|
|
189
|
-
>
|
|
190
|
-
${is(value, predicates.string) ? value : ""}</textarea
|
|
191
|
-
>
|
|
192
|
-
</div>` : await inputElement()}
|
|
193
|
-
</label>
|
|
184
|
+
<label> ${arg_path.at(-1) || ""} ${await inputElement()} </label>
|
|
194
185
|
</div>`;
|
|
195
186
|
}
|
|
196
187
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/inputs/component-input.ts"],
|
|
4
|
-
"sourcesContent": ["import type { FilePointer } from \"@sealcode/file-manager\";\nimport type {\n\tComponent,\n\tComponentArgument,\n\tJDDContext,\n\tTableData,\n} from \"@sealcode/jdd\";\nimport {\n\tCode,\n\tColor,\n\tComponentArguments,\n\tEnum,\n\tImage,\n\tList,\n\tNestedComponent,\n\tSingleReference,\n\tStructured,\n\tTable,\n\tCodeWithCustomLanguage,\n} from \"@sealcode/jdd\";\nimport type { StatefulPage } from \"@sealcode/sealgen\";\nimport { is, predicates } from \"@sealcode/ts-predicates\";\nimport { htmlEscape } from \"escape-goat\";\nimport type { Context } from \"koa\";\nimport { tempstream } from \"tempstream\";\nimport type { ComponentPreviewActions } from \"../component-preview-actions.js\";\nimport type { JDDPageState } from \"../jdd-page.js\";\nimport { ComponentCheckbox } from \"./component-input-boolean.js\";\nimport { ComponentInputCode } from \"./component-input-code.js\";\nimport { ComponentInputColor } from \"./component-input-color.js\";\nimport { ComponentInputEnum } from \"./component-input-enum.js\";\nimport { ComponentInputImage } from \"./component-input-image.js\";\nimport { ComponentInputList } from \"./component-input-list.js\";\nimport { ComponentInputSingleReference } from \"./component-input-single-reference.js\";\nimport { ComponentInputStructured } from \"./component-input-structured.js\";\nimport { ComponentInputTable } from \"./component-input-table.js\";\nimport { printArgPath } from \"./print-arg-path.js\";\n\nimport { ComponentInputCodeWithCustomLanguage } from \"./component-input-code-with-custom-language.js\";\n\nexport const actionName = \"Components\";\nconst absoluteUrlPattern = \"http(s?)(://)((www.)?)(([^.]+).)?([a-zA-z0-9-_]+)\";\n\nexport async function ComponentInput<State extends JDDPageState, T>({\n\tctx,\n\tstate,\n\targ_path,\n\targ,\n\tvalue,\n\tpage,\n\tmakeJDDContext,\n\tmakeAssetURL,\n\tcomponent,\n}: {\n\tstate: State;\n\tctx: Context;\n\targ_path: string[];\n\targ: ComponentArgument<T>;\n\tvalue: T;\n\tpage: StatefulPage<JDDPageState, typeof ComponentPreviewActions>;\n\tmakeJDDContext: (ctx: Context) => JDDContext;\n\tmakeAssetURL: (asset: string) => string;\n\tcomponent: Component;\n}): Promise<string> {\n\tif (value === undefined) {\n\t\tvalue = await arg.getEmptyValue(makeJDDContext(ctx));\n\t}\n\tif (arg instanceof Color) {\n\t\treturn ComponentInputColor({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tpage,\n\t\t\tonchange: page.rerender(),\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\tif (arg instanceof List) {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn ComponentInputList({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as T[],\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof ComponentArguments.Boolean) {\n\t\treturn ComponentCheckbox({ arg_path, arg, value: value as boolean });\n\t}\n\n\tconst argType = arg.getTypeName();\n\tconst isUrlAbsolute =\n\t\targ instanceof ComponentArguments.URL && arg.urlType === \"absolute\";\n\tconst inputType = isUrlAbsolute ? \"url\" : \"text\";\n\n\tif (arg instanceof CodeWithCustomLanguage) {\n\t\tconst valueCasted = value as {\n\t\t\tlanguage: string;\n\t\t\tcode: string;\n\t\t};\n\n\t\treturn ComponentInputCodeWithCustomLanguage({\n\t\t\tlanguage: valueCasted.language,\n\t\t\tcode: is(valueCasted.code, predicates.string)\n\t\t\t\t? valueCasted.code\n\t\t\t\t: \"\",\n\t\t\targ_path,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof Structured || arg instanceof NestedComponent) {\n\t\treturn ComponentInputStructured({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as Record<string, unknown>,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof SingleReference) {\n\t\treturn ComponentInputSingleReference({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tonchange: page.rerender(),\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\n\tif (arg instanceof Enum) {\n\t\treturn ComponentInputEnum({\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tonchange: page.rerender(),\n\t\t\tjdd_context: makeJDDContext(ctx),\n\t\t});\n\t}\n\n\tif (arg instanceof Image) {\n\t\treturn ComponentInputImage({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as FilePointer,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\n\tif (arg instanceof Table) {\n\t\treturn ComponentInputTable({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as TableData<unknown, unknown>,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof Code) {\n\t\treturn ComponentInputCode({\n\t\t\tlanguage: arg.language,\n\t\t\tvalue: is(value, predicates.string) ? value : \"\",\n\t\t\targ_path,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tconst inputElement = () => {\n\t\tif (arg instanceof ComponentArguments.Number) {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"number\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${htmlEscape((value || \"\").toString())}\"\n\t\t\t\tmin=\"${arg.min || \"\"}\"\n\t\t\t\tmax=\"${arg.max || \"\"}\"\n\t\t\t\tstep=\"${arg.step || \"\"}\"\n\t\t\t/>`;\n\t\t} else if (arg instanceof ComponentArguments.URL) {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"${isUrlAbsolute ? \"url\" : \"text\"}\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${htmlEscape((value || \"\").toString())}\"\n\t\t\t\tsize=\"40\"\n\t\t\t\t${isUrlAbsolute ? `pattern=\"${absoluteUrlPattern}\"` : \"\"}\n\t\t\t/>`;\n\t\t} else {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"${inputType}\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${is(value, predicates.string) ? htmlEscape(value) : \"\"}\"\n\t\t\t\tsize=\"40\"\n\t\t\t\t${isUrlAbsolute ? `pattern=\"${absoluteUrlPattern}\"` : \"\"}\n\t\t\t/>`;\n\t\t}\n\t};\n\n\treturn /* HTML */ `<div>\n\t\t<label
|
|
5
|
-
"mappings": "AAOA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,IAAI,kBAAkB;AAC/B,SAAS,kBAAkB;AAE3B,SAAS,kBAAkB;AAG3B,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,qCAAqC;AAC9C,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAE7B,SAAS,4CAA4C;
|
|
4
|
+
"sourcesContent": ["import type { FilePointer } from \"@sealcode/file-manager\";\nimport type {\n\tComponent,\n\tComponentArgument,\n\tJDDContext,\n\tTableData,\n} from \"@sealcode/jdd\";\nimport {\n\tCode,\n\tColor,\n\tComponentArguments,\n\tEnum,\n\tImage,\n\tList,\n\tNestedComponent,\n\tSingleReference,\n\tStructured,\n\tTable,\n\tCodeWithCustomLanguage,\n\tMarkdown,\n} from \"@sealcode/jdd\";\nimport type { StatefulPage } from \"@sealcode/sealgen\";\nimport { is, predicates } from \"@sealcode/ts-predicates\";\nimport { htmlEscape } from \"escape-goat\";\nimport type { Context } from \"koa\";\nimport { tempstream } from \"tempstream\";\nimport type { ComponentPreviewActions } from \"../component-preview-actions.js\";\nimport type { JDDPageState } from \"../jdd-page.js\";\nimport { ComponentCheckbox } from \"./component-input-boolean.js\";\nimport { ComponentInputCode } from \"./component-input-code.js\";\nimport { ComponentInputColor } from \"./component-input-color.js\";\nimport { ComponentInputEnum } from \"./component-input-enum.js\";\nimport { ComponentInputImage } from \"./component-input-image.js\";\nimport { ComponentInputList } from \"./component-input-list.js\";\nimport { ComponentInputSingleReference } from \"./component-input-single-reference.js\";\nimport { ComponentInputStructured } from \"./component-input-structured.js\";\nimport { ComponentInputTable } from \"./component-input-table.js\";\nimport { printArgPath } from \"./print-arg-path.js\";\n\nimport { ComponentInputCodeWithCustomLanguage } from \"./component-input-code-with-custom-language.js\";\nimport ComponentInputMarkdown from \"./component-input-markdown.js\";\n\nexport const actionName = \"Components\";\nconst absoluteUrlPattern = \"http(s?)(://)((www.)?)(([^.]+).)?([a-zA-z0-9-_]+)\";\n\nexport async function ComponentInput<State extends JDDPageState, T>({\n\tctx,\n\tstate,\n\targ_path,\n\targ,\n\tvalue,\n\tpage,\n\tmakeJDDContext,\n\tmakeAssetURL,\n\tcomponent,\n}: {\n\tstate: State;\n\tctx: Context;\n\targ_path: string[];\n\targ: ComponentArgument<T>;\n\tvalue: T;\n\tpage: StatefulPage<JDDPageState, typeof ComponentPreviewActions>;\n\tmakeJDDContext: (ctx: Context) => JDDContext;\n\tmakeAssetURL: (asset: string) => string;\n\tcomponent: Component;\n}): Promise<string> {\n\tif (value === undefined) {\n\t\tvalue = await arg.getEmptyValue(makeJDDContext(ctx));\n\t}\n\tif (arg instanceof Color) {\n\t\treturn ComponentInputColor({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tpage,\n\t\t\tonchange: page.rerender(),\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\tif (arg instanceof List) {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn ComponentInputList({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as T[],\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof ComponentArguments.Boolean) {\n\t\treturn ComponentCheckbox({ arg_path, arg, value: value as boolean });\n\t}\n\n\tconst argType = arg.getTypeName();\n\tconst isUrlAbsolute =\n\t\targ instanceof ComponentArguments.URL && arg.urlType === \"absolute\";\n\tconst inputType = isUrlAbsolute ? \"url\" : \"text\";\n\n\tif (arg instanceof CodeWithCustomLanguage) {\n\t\tconst valueCasted = value as {\n\t\t\tlanguage: string;\n\t\t\tcode: string;\n\t\t};\n\n\t\treturn ComponentInputCodeWithCustomLanguage({\n\t\t\tlanguage: valueCasted.language,\n\t\t\tcode: is(valueCasted.code, predicates.string)\n\t\t\t\t? valueCasted.code\n\t\t\t\t: \"\",\n\t\t\targ_path,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof Structured || arg instanceof NestedComponent) {\n\t\treturn ComponentInputStructured({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as Record<string, unknown>,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof SingleReference) {\n\t\treturn ComponentInputSingleReference({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tonchange: page.rerender(),\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\n\tif (arg instanceof Enum) {\n\t\treturn ComponentInputEnum({\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as string,\n\t\t\tonchange: page.rerender(),\n\t\t\tjdd_context: makeJDDContext(ctx),\n\t\t});\n\t}\n\n\tif (arg instanceof Image) {\n\t\treturn ComponentInputImage({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as FilePointer,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t});\n\t}\n\n\tif (arg instanceof Table) {\n\t\treturn ComponentInputTable({\n\t\t\tctx,\n\t\t\tstate,\n\t\t\targ_path,\n\t\t\targ,\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tvalue: value as TableData<unknown, unknown>,\n\t\t\tpage,\n\t\t\tmakeJDDContext,\n\t\t\tmakeAssetURL,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof Code) {\n\t\treturn ComponentInputCode({\n\t\t\tlanguage: arg.language,\n\t\t\tvalue: is(value, predicates.string) ? value : \"\",\n\t\t\targ_path,\n\t\t\tcomponent,\n\t\t});\n\t}\n\n\tif (arg instanceof Markdown) {\n\t\treturn ComponentInputMarkdown({ arg_path, value, component });\n\t}\n\n\tconst inputElement = () => {\n\t\tif (arg instanceof ComponentArguments.Number) {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"number\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${htmlEscape((value || \"\").toString())}\"\n\t\t\t\tmin=\"${arg.min || \"\"}\"\n\t\t\t\tmax=\"${arg.max || \"\"}\"\n\t\t\t\tstep=\"${arg.step || \"\"}\"\n\t\t\t/>`;\n\t\t} else if (arg instanceof ComponentArguments.URL) {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"${isUrlAbsolute ? \"url\" : \"text\"}\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${htmlEscape((value || \"\").toString())}\"\n\t\t\t\tsize=\"40\"\n\t\t\t\t${isUrlAbsolute ? `pattern=\"${absoluteUrlPattern}\"` : \"\"}\n\t\t\t/>`;\n\t\t} else {\n\t\t\treturn tempstream /* HTML */ ` <input\n\t\t\t\ttype=\"${inputType}\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tvalue=\"${is(value, predicates.string) ? htmlEscape(value) : \"\"}\"\n\t\t\t\tsize=\"40\"\n\t\t\t\t${isUrlAbsolute ? `pattern=\"${absoluteUrlPattern}\"` : \"\"}\n\t\t\t/>`;\n\t\t}\n\t};\n\n\treturn /* HTML */ `<div>\n\t\t<label> ${arg_path.at(-1) || \"\"} ${await inputElement()} </label>\n\t</div>`;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Component } from "@sealcode/jdd";
|
|
2
|
+
import { printArgPath } from "./print-arg-path.js";
|
|
3
|
+
import { is, predicates } from "@sealcode/ts-predicates";
|
|
4
|
+
|
|
5
|
+
const buttons: { content: string; data: Record<string, string> }[] = [
|
|
6
|
+
{ content: "<b>B</b>", data: { wrap: "**" } },
|
|
7
|
+
{ content: "<i>I</i>", data: { prefix: "*" } },
|
|
8
|
+
{ content: "H1", data: { prefix: "#" } },
|
|
9
|
+
{ content: "❝", data: { prefix: ">" } },
|
|
10
|
+
{ content: "• List", data: { prefix: "-" } },
|
|
11
|
+
{ content: "1. List", data: { prefix: "1" } },
|
|
12
|
+
{ content: "🔗", data: { "wrap-before": "[", "wrap-after": "]()" } },
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
export default function ComponentInputMarkdown({
|
|
16
|
+
arg_path,
|
|
17
|
+
value,
|
|
18
|
+
component,
|
|
19
|
+
}: {
|
|
20
|
+
arg_path: string[];
|
|
21
|
+
value: unknown;
|
|
22
|
+
component: Component;
|
|
23
|
+
}) {
|
|
24
|
+
return /* HTML */ `<div
|
|
25
|
+
id="monaco__markdown__${arg_path.join("_")}__for__${component.name}"
|
|
26
|
+
>
|
|
27
|
+
${arg_path.at(-1) || ""}
|
|
28
|
+
<div class="monaco-wrapper monaco-wrapper--markdown">
|
|
29
|
+
<div data-controller="monaco" data-language="markdown">
|
|
30
|
+
<div class="toolbar">
|
|
31
|
+
${buttons
|
|
32
|
+
.map(
|
|
33
|
+
(e) =>
|
|
34
|
+
`<button type="button" data-action="monaco#wrapSelection" ${Object.entries(
|
|
35
|
+
e.data
|
|
36
|
+
)
|
|
37
|
+
.map(
|
|
38
|
+
([key, value]) =>
|
|
39
|
+
`data-${key}="${value}"`
|
|
40
|
+
)
|
|
41
|
+
.join(" ")}>${e.content}</button>`
|
|
42
|
+
)
|
|
43
|
+
.join("")}
|
|
44
|
+
</div>
|
|
45
|
+
<div class="textarea-wrapper" data-monaco-target="wrapper">
|
|
46
|
+
<textarea
|
|
47
|
+
data-monaco-target="textarea"
|
|
48
|
+
name="${`$${printArgPath(arg_path)}`}"
|
|
49
|
+
style="display: none"
|
|
50
|
+
>
|
|
51
|
+
${is(value, predicates.string) ? value : ""}
|
|
52
|
+
</textarea
|
|
53
|
+
>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>`;
|
|
58
|
+
}
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
Structured,
|
|
18
18
|
Table,
|
|
19
19
|
CodeWithCustomLanguage,
|
|
20
|
+
Markdown,
|
|
20
21
|
} from "@sealcode/jdd";
|
|
21
22
|
import type { StatefulPage } from "@sealcode/sealgen";
|
|
22
23
|
import { is, predicates } from "@sealcode/ts-predicates";
|
|
@@ -37,6 +38,7 @@ import { ComponentInputTable } from "./component-input-table.js";
|
|
|
37
38
|
import { printArgPath } from "./print-arg-path.js";
|
|
38
39
|
|
|
39
40
|
import { ComponentInputCodeWithCustomLanguage } from "./component-input-code-with-custom-language.js";
|
|
41
|
+
import ComponentInputMarkdown from "./component-input-markdown.js";
|
|
40
42
|
|
|
41
43
|
export const actionName = "Components";
|
|
42
44
|
const absoluteUrlPattern = "http(s?)(://)((www.)?)(([^.]+).)?([a-zA-z0-9-_]+)";
|
|
@@ -196,6 +198,10 @@ export async function ComponentInput<State extends JDDPageState, T>({
|
|
|
196
198
|
});
|
|
197
199
|
}
|
|
198
200
|
|
|
201
|
+
if (arg instanceof Markdown) {
|
|
202
|
+
return ComponentInputMarkdown({ arg_path, value, component });
|
|
203
|
+
}
|
|
204
|
+
|
|
199
205
|
const inputElement = () => {
|
|
200
206
|
if (arg instanceof ComponentArguments.Number) {
|
|
201
207
|
return tempstream /* HTML */ ` <input
|
|
@@ -226,22 +232,6 @@ export async function ComponentInput<State extends JDDPageState, T>({
|
|
|
226
232
|
};
|
|
227
233
|
|
|
228
234
|
return /* HTML */ `<div>
|
|
229
|
-
<label>
|
|
230
|
-
${arg_path.at(-1) || ""}
|
|
231
|
-
${argType == "markdown"
|
|
232
|
-
? /* HTML */ `<div class="grow-wrap">
|
|
233
|
-
<textarea
|
|
234
|
-
name="${`$${printArgPath(arg_path)}`}"
|
|
235
|
-
onblur="${page.rerender()}"
|
|
236
|
-
cols="40"
|
|
237
|
-
data-controller="markdown-textarea submit-on-input"
|
|
238
|
-
data-action="autogrow-textarea#autogrow blur->autogrow-textarea#autogrow resize->autogrow-textarea#autogrow submit-on-input#sendValues focus->submit-on-input#makePermanent blur->submit-on-input#makeNotPermanent"
|
|
239
|
-
autocomplete="off"
|
|
240
|
-
>
|
|
241
|
-
${is(value, predicates.string) ? value : ""}</textarea
|
|
242
|
-
>
|
|
243
|
-
</div>`
|
|
244
|
-
: await inputElement()}
|
|
245
|
-
</label>
|
|
235
|
+
<label> ${arg_path.at(-1) || ""} ${await inputElement()} </label>
|
|
246
236
|
</div>`;
|
|
247
237
|
}
|