@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.
Files changed (26) hide show
  1. package/.nyc_output/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
  2. package/.nyc_output/processinfo/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +1 -1
  3. package/.nyc_output/processinfo/{15c7e9a9-1ea9-4c86-8310-45fa6fc6e38b.json → a331cb1e-8707-469e-95be-5bc65de3f692.json} +1 -1
  4. package/.nyc_output/processinfo/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -1
  6. package/.xunit +1 -1
  7. package/@types/components.sreact.d.ts +1 -1
  8. package/@types/inputs/component-input-markdown.d.ts +6 -0
  9. package/@types/jdd-creator.d.ts +2 -2
  10. package/assets/styles/markdown-editor.css +9 -39
  11. package/coverage/clover.xml +189 -253
  12. package/dist/src/inputs/component-input-markdown.js +49 -0
  13. package/dist/src/inputs/component-input-markdown.js.map +7 -0
  14. package/dist/src/inputs/component-input.js +7 -16
  15. package/dist/src/inputs/component-input.js.map +2 -2
  16. package/package.json +1 -1
  17. package/src/inputs/component-input-markdown.ts +58 -0
  18. package/src/inputs/component-input.ts +7 -17
  19. package/.nyc_output/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
  20. package/.nyc_output/processinfo/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
  21. package/@types/controllers/markdown-textarea.stimulus.d.ts +0 -20
  22. package/dist/src/controllers/markdown-textarea.stimulus.js +0 -174
  23. package/dist/src/controllers/markdown-textarea.stimulus.js.map +0 -7
  24. package/src/controllers/markdown-textarea.stimulus.ts +0 -198
  25. /package/.nyc_output/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +0 -0
  26. /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>\n\t\t\t${arg_path.at(-1) || \"\"}\n\t\t\t${argType == \"markdown\"\n\t\t\t\t? /* HTML */ `<div class=\"grow-wrap\">\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\t\t\t\tonblur=\"${page.rerender()}\"\n\t\t\t\t\t\t\tcols=\"40\"\n\t\t\t\t\t\t\tdata-controller=\"markdown-textarea submit-on-input\"\n\t\t\t\t\t\t\tdata-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\"\n\t\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\t>\n${is(value, predicates.string) ? value : \"\"}</textarea\n\t\t\t\t\t\t>\n\t\t\t\t\t</div>`\n\t\t\t\t: await inputElement()}\n\t\t</label>\n\t</div>`;\n}\n"],
5
- "mappings": "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",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealcode/jdd-editor",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "main": "dist/src/index.js",
5
5
  "scripts": {
6
6
  "build": "rm -rf dist && node ./esbuild.cjs",
@@ -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
  }