@lapismd/mira-editor 0.0.1

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 (46) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE.md +4 -0
  3. package/README.md +70 -0
  4. package/dist/assets/logo.png +0 -0
  5. package/dist/assets.d.ts +4 -0
  6. package/dist/features.d.ts +164 -0
  7. package/dist/features.d.ts.map +1 -0
  8. package/dist/features.js +348 -0
  9. package/dist/index.d.ts +12 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +7 -0
  12. package/dist/index.test.d.ts +2 -0
  13. package/dist/index.test.d.ts.map +1 -0
  14. package/dist/index.test.js +179 -0
  15. package/dist/mira-editor-about-dialog.svelte +28 -0
  16. package/dist/mira-editor-about-dialog.svelte.d.ts +7 -0
  17. package/dist/mira-editor-about-dialog.svelte.d.ts.map +1 -0
  18. package/dist/mira-editor-toolbar.svelte +805 -0
  19. package/dist/mira-editor-toolbar.svelte.d.ts +6 -0
  20. package/dist/mira-editor-toolbar.svelte.d.ts.map +1 -0
  21. package/dist/mira-editor-toolbar.test.d.ts +2 -0
  22. package/dist/mira-editor-toolbar.test.d.ts.map +1 -0
  23. package/dist/mira-editor-toolbar.test.js +199 -0
  24. package/dist/mira-editor.svelte +492 -0
  25. package/dist/mira-editor.svelte.d.ts +24 -0
  26. package/dist/mira-editor.svelte.d.ts.map +1 -0
  27. package/dist/mira-editor.test.d.ts +2 -0
  28. package/dist/mira-editor.test.d.ts.map +1 -0
  29. package/dist/mira-editor.test.js +208 -0
  30. package/dist/styles.css +165 -0
  31. package/dist/test-setup.d.ts +8 -0
  32. package/dist/test-setup.d.ts.map +1 -0
  33. package/dist/test-setup.js +31 -0
  34. package/dist/toolbar-model.d.ts +32 -0
  35. package/dist/toolbar-model.d.ts.map +1 -0
  36. package/dist/toolbar-model.js +148 -0
  37. package/dist/toolbar-model.test.d.ts +2 -0
  38. package/dist/toolbar-model.test.d.ts.map +1 -0
  39. package/dist/toolbar-model.test.js +46 -0
  40. package/dist/types.d.ts +88 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +1 -0
  43. package/dist/version.d.ts +3 -0
  44. package/dist/version.d.ts.map +1 -0
  45. package/dist/version.js +2 -0
  46. package/package.json +56 -0
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { isMiraEditMode, markdownActionForMiraToolbarItem, miraEditorToolbarItemLabels, miraViewToggleLabel, resolveMiraModeAfterSplit, resolveMiraViewModeMenuItems, resolveMiraViewToggleMode, templateForMiraToolbarItem, } from "./toolbar-model";
3
+ describe("toolbar model", () => {
4
+ it("resolves view menu items for edit and preview modes", () => {
5
+ expect(resolveMiraViewModeMenuItems({
6
+ mode: "live-preview",
7
+ modeOptions: ["source", "live-preview", "preview", "split"],
8
+ resolvedDefaultEditMode: "live-preview",
9
+ })).toEqual([
10
+ { mode: "preview", label: "Reading view", checked: false },
11
+ { mode: "source", label: "Source mode", checked: false },
12
+ ]);
13
+ expect(resolveMiraViewModeMenuItems({
14
+ mode: "preview",
15
+ modeOptions: ["source", "live-preview", "preview", "split"],
16
+ resolvedDefaultEditMode: "live-preview",
17
+ })).toEqual([
18
+ { mode: "live-preview", label: "Live edit", checked: false },
19
+ { mode: "source", label: "Source mode", checked: false },
20
+ ]);
21
+ });
22
+ it("resolves split fallback and view toggle behavior", () => {
23
+ expect(resolveMiraModeAfterSplit({
24
+ lastNonSplitMode: "source",
25
+ modeOptions: ["source", "live-preview", "preview", "split"],
26
+ resolvedDefaultEditMode: "live-preview",
27
+ })).toBe("source");
28
+ expect(resolveMiraViewToggleMode("preview", "live-preview")).toBe("live-preview");
29
+ expect(resolveMiraViewToggleMode("live-preview", "live-preview")).toBe("preview");
30
+ expect(miraViewToggleLabel("preview")).toBe("Edit");
31
+ });
32
+ it("exposes labels and templates for framework renderers", () => {
33
+ expect(isMiraEditMode("source")).toBe(true);
34
+ expect(miraEditorToolbarItemLabels.bold).toBe("Bold");
35
+ expect(miraEditorToolbarItemLabels.strikethrough).toBe("Strikethrough");
36
+ expect(miraEditorToolbarItemLabels.inlineCode).toBe("Inline code");
37
+ expect(miraEditorToolbarItemLabels.numberedList).toBe("Numbered list");
38
+ expect(templateForMiraToolbarItem("bold")).toBe("**strong**");
39
+ expect(templateForMiraToolbarItem("strikethrough")).toBe("~~strikethrough~~");
40
+ expect(templateForMiraToolbarItem("inlineCode")).toBe("`code`");
41
+ expect(templateForMiraToolbarItem("numberedList")).toBe("1. List item");
42
+ expect(markdownActionForMiraToolbarItem("bold")).toBe("bold");
43
+ expect(markdownActionForMiraToolbarItem("code")).toBeNull();
44
+ expect(templateForMiraToolbarItem("gridTable")).toContain("+========+");
45
+ });
46
+ });
@@ -0,0 +1,88 @@
1
+ import type { MiraEditorSelection, MiraMarkdownActionId } from "@lapismd/mira/core";
2
+ import type { MiraAssetResolver, MiraCommand, MiraExtension, MiraFileAdapter, MiraImageConfig, MiraLinkResolver, MiraMarkdownAuthoringConfig, MiraMode, MiraColorMode, MiraTheme, MiraTemplateSelection } from "@lapismd/mira/extensions";
3
+ import type { MiraEditorFeatureConfigs, MiraEditorToolbarAction, MiraEditorToolbarActionContext, MiraEditorToolbarDefinition, MiraEditorEditMode, MiraFeatureFlags } from "./features";
4
+ import type { MiraFrontmatterConfig, MiraOutlineVariant } from "@lapismd/mira";
5
+ export type { MiraEditorEditMode } from "./features";
6
+ export type { MiraFrontmatterConfig, MiraOutlineVariant } from "@lapismd/mira";
7
+ export type MiraEditorProps = {
8
+ value?: string;
9
+ mode?: MiraMode;
10
+ defaultEditMode?: MiraEditorEditMode;
11
+ readonly?: boolean;
12
+ placeholder?: string;
13
+ lineWrapping?: boolean;
14
+ spellcheck?: boolean;
15
+ indentGuides?: boolean;
16
+ indentWithTabs?: boolean;
17
+ indentWidth?: number;
18
+ theme?: MiraTheme;
19
+ colorMode?: MiraColorMode;
20
+ sourcePath?: string;
21
+ class?: string;
22
+ editorClass?: string;
23
+ features?: MiraFeatureFlags;
24
+ featureConfigs?: MiraEditorFeatureConfigs;
25
+ toolbarActions?: MiraEditorToolbarAction[];
26
+ toolbars?: MiraEditorToolbarDefinition[];
27
+ extensions?: MiraExtension[];
28
+ linkResolver?: MiraLinkResolver;
29
+ assetResolver?: MiraAssetResolver;
30
+ fileAdapter?: MiraFileAdapter;
31
+ imageConfig?: MiraImageConfig;
32
+ authoring?: MiraMarkdownAuthoringConfig;
33
+ frontmatterOpen?: boolean;
34
+ frontmatterConfig?: MiraFrontmatterConfig;
35
+ headingIds?: boolean;
36
+ headingIdPrefix?: string;
37
+ htmlPolicy?: "trusted" | "safe";
38
+ emoji?: boolean;
39
+ outline?: boolean;
40
+ outlineVariant?: MiraOutlineVariant;
41
+ onChange?: (value: string) => void;
42
+ onModeChange?: (mode: MiraMode) => void;
43
+ onReadonlyChange?: (readonly: boolean) => void;
44
+ onIndentGuidesChange?: (enabled: boolean) => void;
45
+ onIndentWidthChange?: (width: number) => void;
46
+ onIndentWithTabsChange?: (enabled: boolean) => void;
47
+ onFrontmatterChange?: (nextYaml: string, nextValue: string) => void;
48
+ };
49
+ export type MiraEditorToolbarProps = {
50
+ value?: string;
51
+ mode?: MiraMode;
52
+ defaultEditMode?: MiraEditorEditMode;
53
+ readonly?: boolean;
54
+ class?: string;
55
+ features?: MiraFeatureFlags;
56
+ featureConfigs?: MiraEditorFeatureConfigs;
57
+ toolbarActions?: MiraEditorToolbarAction[];
58
+ toolbars?: MiraEditorToolbarDefinition[];
59
+ modeOptions?: MiraMode[];
60
+ showModeSwitch?: boolean;
61
+ indentGuides?: boolean;
62
+ indentWithTabs?: boolean;
63
+ indentWidth?: number;
64
+ context?: MiraEditorToolbarActionContext;
65
+ onModeChange?: (mode: MiraMode) => void;
66
+ onInsertMarkdown?: (markdown: string) => void;
67
+ onInsertImage?: () => void;
68
+ onIndentGuidesChange?: (enabled: boolean) => void;
69
+ onIndentWidthChange?: (width: number) => void;
70
+ onIndentWithTabsChange?: (enabled: boolean) => void;
71
+ };
72
+ export type MiraEditorHandle = {
73
+ applyMarkdownAction: (action: MiraMarkdownActionId) => boolean;
74
+ executeCommand: (commandId: string) => boolean;
75
+ focus: () => void;
76
+ getCommands: () => readonly MiraCommand[];
77
+ getMarkdown: () => string;
78
+ getMode: () => MiraMode;
79
+ getSelection: () => MiraEditorSelection | null;
80
+ insertImage: () => void;
81
+ insertMarkdown: (markdown: string, selection?: MiraTemplateSelection) => void;
82
+ isCommandEnabled: (commandId: string) => boolean;
83
+ setMarkdown: (markdown: string) => void;
84
+ setMode: (mode: MiraMode) => void;
85
+ setReadonly: (readonly: boolean) => void;
86
+ setSelection: (selection: MiraEditorSelection) => void;
87
+ };
88
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ /** The version of the shipped `@lapismd/mira-editor` package. */
2
+ export declare const MIRA_EDITOR_VERSION = "0.0.1";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** The version of the shipped `@lapismd/mira-editor` package. */
2
+ export const MIRA_EDITOR_VERSION = "0.0.1";
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@lapismd/mira-editor",
3
+ "version": "0.0.1",
4
+ "description": "Batteries-included Svelte Markdown editor, toolbar, features, and default styling for Mira.",
5
+ "author": "Steve Juma <help@lapis.md>",
6
+ "license": "AGPL-3.0-or-later",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/lapismd/mira-mde.git",
10
+ "directory": "packages/mira-editor"
11
+ },
12
+ "type": "module",
13
+ "sideEffects": [
14
+ "*.css"
15
+ ],
16
+ "svelte": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "CHANGELOG.md",
20
+ "dist"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "svelte": "./dist/index.js",
26
+ "import": "./dist/index.js"
27
+ },
28
+ "./styles.css": "./dist/styles.css"
29
+ },
30
+ "dependencies": {
31
+ "@lucide/svelte": "^0.525.0",
32
+ "@lapismd/mira": "~0.0.1",
33
+ "@lapismd/mira-plugin-mermaid": "~0.0.1"
34
+ },
35
+ "peerDependencies": {
36
+ "svelte": "^5.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@sveltejs/vite-plugin-svelte": "^6.2.1",
40
+ "svelte": "^5.46.1",
41
+ "vitest": "^4.1.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "registry": "https://registry.npmjs.org"
46
+ },
47
+ "scripts": {
48
+ "build": "svelte-package --input src --output dist && publint",
49
+ "check": "pnpm check:format && pnpm check:svelte && pnpm check:types",
50
+ "check:format": "prettier --ignore-path ../../.prettierignore . --check",
51
+ "check:types": "tsc -p tsconfig.json --noEmit",
52
+ "check:svelte": "svelte-check --tsconfig tsconfig.json --fail-on-warnings",
53
+ "lint": "eslint src --ext .ts",
54
+ "test": "vitest run"
55
+ }
56
+ }