draftly 1.0.0-alpha.2 → 2.0.0

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 (79) hide show
  1. package/README.md +12 -0
  2. package/dist/chunk-3T55CBNZ.cjs +33 -0
  3. package/dist/chunk-3T55CBNZ.cjs.map +1 -0
  4. package/dist/chunk-5MC4T7JH.cjs +58 -0
  5. package/dist/chunk-5MC4T7JH.cjs.map +1 -0
  6. package/dist/{chunk-72ZYRGRT.cjs → chunk-BWJLMREN.cjs} +11 -9
  7. package/dist/chunk-BWJLMREN.cjs.map +1 -0
  8. package/dist/{chunk-KBQDZ5IW.cjs → chunk-CLW73JRX.cjs} +100 -75
  9. package/dist/chunk-CLW73JRX.cjs.map +1 -0
  10. package/dist/{chunk-DFQYXFOP.js → chunk-EEHILRG5.js} +26 -3
  11. package/dist/chunk-EEHILRG5.js.map +1 -0
  12. package/dist/{chunk-HPSMS2WB.js → chunk-I563H35S.js} +101 -75
  13. package/dist/chunk-I563H35S.js.map +1 -0
  14. package/dist/chunk-IAXF4SJL.js +55 -0
  15. package/dist/chunk-IAXF4SJL.js.map +1 -0
  16. package/dist/chunk-JF3WXXMJ.js +31 -0
  17. package/dist/chunk-JF3WXXMJ.js.map +1 -0
  18. package/dist/{chunk-N3WL3XPB.js → chunk-L2XSK57Y.js} +1761 -478
  19. package/dist/chunk-L2XSK57Y.js.map +1 -0
  20. package/dist/{chunk-KDEDLC3D.cjs → chunk-TBVZEK2H.cjs} +27 -2
  21. package/dist/chunk-TBVZEK2H.cjs.map +1 -0
  22. package/dist/{chunk-2B3A3VSQ.cjs → chunk-W5ALMXG2.cjs} +1808 -504
  23. package/dist/chunk-W5ALMXG2.cjs.map +1 -0
  24. package/dist/{chunk-CG4M4TC7.js → chunk-ZUI3GI3W.js} +7 -5
  25. package/dist/chunk-ZUI3GI3W.js.map +1 -0
  26. package/dist/{draftly-BLnx3uGX.d.cts → draftly-BBL-AdOl.d.cts} +5 -1
  27. package/dist/{draftly-BLnx3uGX.d.ts → draftly-BBL-AdOl.d.ts} +5 -1
  28. package/dist/editor/index.cjs +22 -14
  29. package/dist/editor/index.d.cts +2 -1
  30. package/dist/editor/index.d.ts +2 -1
  31. package/dist/editor/index.js +2 -2
  32. package/dist/index.cjs +65 -39
  33. package/dist/index.d.cts +6 -3
  34. package/dist/index.d.ts +6 -3
  35. package/dist/index.js +6 -4
  36. package/dist/lib/index.cjs +12 -0
  37. package/dist/lib/index.cjs.map +1 -0
  38. package/dist/lib/index.d.cts +16 -0
  39. package/dist/lib/index.d.ts +16 -0
  40. package/dist/lib/index.js +3 -0
  41. package/dist/lib/index.js.map +1 -0
  42. package/dist/plugins/index.cjs +27 -17
  43. package/dist/plugins/index.d.cts +144 -9
  44. package/dist/plugins/index.d.ts +144 -9
  45. package/dist/plugins/index.js +5 -3
  46. package/dist/preview/index.cjs +16 -11
  47. package/dist/preview/index.d.cts +19 -4
  48. package/dist/preview/index.d.ts +19 -4
  49. package/dist/preview/index.js +3 -2
  50. package/package.json +8 -1
  51. package/src/editor/draftly.ts +1 -0
  52. package/src/editor/plugin.ts +5 -1
  53. package/src/editor/theme.ts +1 -0
  54. package/src/editor/utils.ts +31 -0
  55. package/src/index.ts +5 -4
  56. package/src/lib/index.ts +2 -0
  57. package/src/lib/input-handler.ts +45 -0
  58. package/src/plugins/code-plugin.theme.ts +426 -0
  59. package/src/plugins/code-plugin.ts +810 -561
  60. package/src/plugins/emoji-plugin.ts +140 -0
  61. package/src/plugins/index.ts +63 -57
  62. package/src/plugins/inline-plugin.ts +305 -291
  63. package/src/plugins/math-plugin.ts +12 -0
  64. package/src/plugins/table-plugin.ts +900 -0
  65. package/src/preview/context.ts +4 -1
  66. package/src/preview/css-generator.ts +14 -1
  67. package/src/preview/index.ts +9 -1
  68. package/src/preview/preview.ts +2 -1
  69. package/src/preview/renderer.ts +21 -20
  70. package/src/preview/syntax-theme.ts +110 -0
  71. package/src/preview/types.ts +14 -0
  72. package/dist/chunk-2B3A3VSQ.cjs.map +0 -1
  73. package/dist/chunk-72ZYRGRT.cjs.map +0 -1
  74. package/dist/chunk-CG4M4TC7.js.map +0 -1
  75. package/dist/chunk-DFQYXFOP.js.map +0 -1
  76. package/dist/chunk-HPSMS2WB.js.map +0 -1
  77. package/dist/chunk-KBQDZ5IW.cjs.map +0 -1
  78. package/dist/chunk-KDEDLC3D.cjs.map +0 -1
  79. package/dist/chunk-N3WL3XPB.js.map +0 -1
@@ -27,6 +27,9 @@ function createTheme({
27
27
  light: lightTheme
28
28
  }) {
29
29
  return (theme) => {
30
+ defaultTheme = flattenThemeStyles(defaultTheme);
31
+ darkTheme = flattenThemeStyles(darkTheme || {});
32
+ lightTheme = flattenThemeStyles(lightTheme || {});
30
33
  let style = defaultTheme;
31
34
  if (theme === "dark" /* DARK */) {
32
35
  style = deepMerge(style, darkTheme);
@@ -37,6 +40,26 @@ function createTheme({
37
40
  return style;
38
41
  };
39
42
  }
43
+ function flattenThemeStyles(themeStyles, parentSelector) {
44
+ const flattened = {};
45
+ for (const [selector, styles] of Object.entries(themeStyles)) {
46
+ if (typeof styles === "object" && !Array.isArray(styles)) {
47
+ const fullSelector = fixSelector(parentSelector ? `${parentSelector} ${selector}` : selector);
48
+ const nestedStyles = flattenThemeStyles(styles, fullSelector);
49
+ Object.assign(flattened, nestedStyles);
50
+ } else {
51
+ if (parentSelector) {
52
+ flattened[parentSelector] = { ...flattened[parentSelector], [selector]: styles };
53
+ } else {
54
+ flattened[selector] = styles;
55
+ }
56
+ }
57
+ }
58
+ return flattened;
59
+ }
60
+ function fixSelector(selector) {
61
+ return selector.replace(/\s&/g, "");
62
+ }
40
63
  function cursorInRange(view, from, to) {
41
64
  const selection = view.state.selection.main;
42
65
  return selection.from <= to && selection.to >= from;
@@ -87,7 +110,9 @@ exports.ThemeEnum = ThemeEnum;
87
110
  exports.createTheme = createTheme;
88
111
  exports.cursorInRange = cursorInRange;
89
112
  exports.deepMerge = deepMerge;
113
+ exports.fixSelector = fixSelector;
114
+ exports.flattenThemeStyles = flattenThemeStyles;
90
115
  exports.selectionOverlapsRange = selectionOverlapsRange;
91
116
  exports.toggleMarkdownStyle = toggleMarkdownStyle;
92
- //# sourceMappingURL=chunk-KDEDLC3D.cjs.map
93
- //# sourceMappingURL=chunk-KDEDLC3D.cjs.map
117
+ //# sourceMappingURL=chunk-TBVZEK2H.cjs.map
118
+ //# sourceMappingURL=chunk-TBVZEK2H.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/utils.ts"],"names":["ThemeEnum"],"mappings":";;;AASO,SAAS,SAAA,CAAa,GAAM,CAAA,EAAU;AAC3C,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,CAAA,EAAE;AAEtB,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,OAAO,CAAA,EAAQ;AACxB,IAAA,IAAI,EAAE,GAAG,CAAA,IAAK,OAAO,CAAA,CAAE,GAAG,MAAM,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,GAAG,MAAM,QAAA,EAAU;AAChG,MAAA,MAAA,CAAO,GAAG,IAAI,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAYO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACL,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AAHG,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAcL,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA,EAIqC;AACnC,EAAA,OAAO,CAAC,KAAA,KAAqB;AAC3B,IAAA,YAAA,GAAe,mBAAmB,YAAY,CAAA;AAC9C,IAAA,SAAA,GAAY,kBAAA,CAAmB,SAAA,IAAa,EAAE,CAAA;AAC9C,IAAA,UAAA,GAAa,kBAAA,CAAmB,UAAA,IAAc,EAAE,CAAA;AAEhD,IAAA,IAAI,KAAA,GAAoB,YAAA;AAExB,IAAA,IAAI,UAAU,MAAA,aAAgB;AAC5B,MAAA,KAAA,GAAQ,SAAA,CAAU,OAAO,SAAS,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,UAAU,OAAA,cAAiB;AAC7B,MAAA,KAAA,GAAQ,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,kBAAA,CAAmB,aAAyB,cAAA,EAAqC;AAC/F,EAAA,MAAM,YAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5D,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAExD,MAAA,MAAM,YAAA,GAAe,YAAY,cAAA,GAAiB,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,QAAQ,KAAK,QAAQ,CAAA;AAC5F,MAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,MAAA,EAAsB,YAAY,CAAA;AAC1E,MAAA,MAAA,CAAO,MAAA,CAAO,WAAW,YAAY,CAAA;AAAA,IACvC,CAAA,MAAO;AAEL,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,SAAA,CAAU,cAAc,CAAA,GAAI,EAAE,GAAG,SAAA,CAAU,cAAc,CAAA,EAAG,CAAC,QAAQ,GAAG,MAAA,EAAO;AAAA,MACjF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,MAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,YAAY,QAAA,EAA0B;AAEpD,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACpC;AAKO,SAAS,aAAA,CAAc,IAAA,EAAkB,IAAA,EAAc,EAAA,EAAqB;AACjF,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA;AACvC,EAAA,OAAO,SAAA,CAAU,IAAA,IAAQ,EAAA,IAAM,SAAA,CAAU,EAAA,IAAM,IAAA;AACjD;AAKO,SAAS,sBAAA,CAAuB,IAAA,EAAkB,IAAA,EAAc,EAAA,EAAqB;AAC1F,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,EAAQ;AAC/C,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,EAAA,IAAM,KAAA,CAAM,MAAM,IAAA,EAAM;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,oBAAoB,MAAA,EAA+C;AACjF,EAAA,OAAO,CAAC,IAAA,KAAqB;AAC3B,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,GAAI,MAAM,SAAA,CAAU,IAAA;AAG5C,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAG5C,IAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AACzB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,SAAS,CAAA;AAC/C,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,MAAM,GAAA,CAAI,MAAA,EAAQ,KAAK,SAAS,CAAA;AACzD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,IAAI,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,CAAA;AAE5C,IAAA,MAAM,SAAA,GAAY,UAAA,KAAe,MAAA,IAAU,SAAA,KAAc,MAAA;AAEzD,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,IAAA,EAAM,QAAQ,EAAA,EAAG;AAAA,UACzC,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,OAAA,EAAS,QAAQ,EAAA;AAAG,SACtC;AAAA,QACA,WAAW,EAAE,MAAA,EAAQ,YAAY,IAAA,EAAM,UAAA,GAAa,aAAa,MAAA;AAAO,OACzE,CAAA;AAAA,IACH,WAAW,KAAA,EAAO;AAEhB,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,SAAS,EAAE,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,QAC7C,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,GAAO,SAAA;AAAU,OACvC,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,SAAS,EAAE,IAAA,EAAM,IAAI,MAAA,EAAQ,MAAA,GAAS,eAAe,MAAA,EAAO;AAAA,QAC5D,WAAW,EAAE,MAAA,EAAQ,OAAO,SAAA,EAAW,IAAA,EAAM,KAAK,SAAA;AAAU,OAC7D,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF","file":"chunk-TBVZEK2H.cjs","sourcesContent":["import { EditorView } from \"@codemirror/view\";\nimport { StyleSpec } from \"style-mod\";\n\n/**\n * Deep merge two objects\n * @param a - First object\n * @param b - Second object\n * @returns Merged object\n */\nexport function deepMerge<T>(a: T, b?: T): T {\n const result = { ...a };\n\n if (!b) {\n return result;\n }\n\n for (const key in b as T) {\n if (b[key] && typeof b[key] === \"object\" && !Array.isArray(b[key]) && typeof a[key] === \"object\") {\n result[key] = deepMerge(a[key], b[key]);\n } else {\n result[key] = b[key];\n }\n }\n\n return result;\n}\n\n/**\n * Theme style\n */\nexport type ThemeStyle = {\n [selector: string]: StyleSpec;\n};\n\n/**\n * Theme Enum\n */\nexport enum ThemeEnum {\n DARK = \"dark\",\n LIGHT = \"light\",\n AUTO = \"auto\",\n}\n\n/**\n * Function to create the themes\n *\n * @param defaultTheme - Default theme -- Always applied\n * @param darkTheme - Dark theme -- Applied when theme is \"dark\" or \"auto\" and system is dark\n * @param lightTheme - Light theme -- Applied when theme is \"light\" or \"auto\" and system is light\n * @returns Theme function\n */\nexport function createTheme({\n default: defaultTheme,\n dark: darkTheme,\n light: lightTheme,\n}: {\n default: ThemeStyle;\n dark?: ThemeStyle;\n light?: ThemeStyle;\n}): (theme: ThemeEnum) => ThemeStyle {\n return (theme: ThemeEnum) => {\n defaultTheme = flattenThemeStyles(defaultTheme);\n darkTheme = flattenThemeStyles(darkTheme || {});\n lightTheme = flattenThemeStyles(lightTheme || {});\n\n let style: ThemeStyle = defaultTheme;\n\n if (theme === ThemeEnum.DARK) {\n style = deepMerge(style, darkTheme);\n }\n\n if (theme === ThemeEnum.LIGHT) {\n style = deepMerge(style, lightTheme);\n }\n\n return style;\n };\n}\n\nexport function flattenThemeStyles(themeStyles: ThemeStyle, parentSelector?: string): ThemeStyle {\n const flattened: ThemeStyle = {};\n\n for (const [selector, styles] of Object.entries(themeStyles)) {\n if (typeof styles === \"object\" && !Array.isArray(styles)) {\n // Flatten nested styles\n const fullSelector = fixSelector(parentSelector ? `${parentSelector} ${selector}` : selector);\n const nestedStyles = flattenThemeStyles(styles as ThemeStyle, fullSelector);\n Object.assign(flattened, nestedStyles);\n } else {\n // Add styles to the flattened object\n if (parentSelector) {\n flattened[parentSelector] = { ...flattened[parentSelector], [selector]: styles };\n } else {\n flattened[selector] = styles as StyleSpec;\n }\n }\n }\n\n return flattened;\n}\n\nexport function fixSelector(selector: string): string {\n // Replace all occurrences of \"&\" with the parent selector\n return selector.replace(/\\s&/g, \"\");\n}\n\n/**\n * Check if cursor is within the given range\n */\nexport function cursorInRange(view: EditorView, from: number, to: number): boolean {\n const selection = view.state.selection.main;\n return selection.from <= to && selection.to >= from;\n}\n\n/**\n * Check if any selection overlaps with the given range\n */\nexport function selectionOverlapsRange(view: EditorView, from: number, to: number): boolean {\n for (const range of view.state.selection.ranges) {\n if (range.from <= to && range.to >= from) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Toggle markdown style on selection or insert markers at cursor\n * @param marker - The markdown marker (e.g., \"**\" for bold, \"*\" for italic)\n * @returns Command function for EditorView\n */\nexport function toggleMarkdownStyle(marker: string): (view: EditorView) => boolean {\n return (view: EditorView) => {\n const { state } = view;\n const { from, to, empty } = state.selection.main;\n\n // Get selected text\n const selectedText = state.sliceDoc(from, to);\n\n // Check if already wrapped with markers\n const markerLen = marker.length;\n const beforeFrom = Math.max(0, from - markerLen);\n const afterTo = Math.min(state.doc.length, to + markerLen);\n const textBefore = state.sliceDoc(beforeFrom, from);\n const textAfter = state.sliceDoc(to, afterTo);\n\n const isWrapped = textBefore === marker && textAfter === marker;\n\n if (isWrapped) {\n // Remove markers\n view.dispatch({\n changes: [\n { from: beforeFrom, to: from, insert: \"\" },\n { from: to, to: afterTo, insert: \"\" },\n ],\n selection: { anchor: beforeFrom, head: beforeFrom + selectedText.length },\n });\n } else if (empty) {\n // No selection - insert markers and place cursor between them\n view.dispatch({\n changes: { from, to, insert: marker + marker },\n selection: { anchor: from + markerLen },\n });\n } else {\n // Wrap selection with markers\n view.dispatch({\n changes: { from, to, insert: marker + selectedText + marker },\n selection: { anchor: from + markerLen, head: to + markerLen },\n });\n }\n\n return true;\n };\n}\n"]}