@particle-academy/fancy-code 0.7.0 → 0.9.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.
package/dist/index.d.cts CHANGED
@@ -1,29 +1,9 @@
1
1
  import * as react from 'react';
2
2
  import { RefObject, ReactNode, CSSProperties } from 'react';
3
+ import { ThemeColors, DiffAnnotations, LineChangeType, Token, Tokenizer } from '@particle-academy/fancy-file-commons';
4
+ export { ThemeColors, Token, TokenType, Tokenizer, languageFromFilename } from '@particle-academy/fancy-file-commons';
3
5
  import { MediaKind, MediaViewerProps, InputTagProps, InputTagTriggers, InputTagAdapter } from '@particle-academy/react-fancy';
4
6
 
5
- interface ThemeColors {
6
- background: string;
7
- foreground: string;
8
- gutterBackground: string;
9
- gutterForeground: string;
10
- gutterBorder: string;
11
- activeLineBackground: string;
12
- selectionBackground: string;
13
- cursorColor: string;
14
- keyword: string;
15
- string: string;
16
- comment: string;
17
- number: string;
18
- operator: string;
19
- function: string;
20
- type: string;
21
- tag: string;
22
- attribute: string;
23
- attributeValue: string;
24
- punctuation: string;
25
- variable: string;
26
- }
27
7
  interface ThemeDefinition {
28
8
  /** Unique theme name */
29
9
  name: string;
@@ -93,6 +73,15 @@ interface CodeEditorProps {
93
73
  cursorLine?: number;
94
74
  /** 1-based column for {@link cursorLine} (default 1). */
95
75
  cursorColumn?: number;
76
+ /**
77
+ * Baseline document for the diff gutter. When set, the line-number column
78
+ * shows per-line change marks of the CURRENT value against this baseline —
79
+ * VS Code convention: a green bar for added lines, a blue bar for modified
80
+ * lines, and a red wedge where lines were deleted. Recomputed live as the
81
+ * user types (line-level only — cheap). `null`/omitted disables the gutter
82
+ * marks. Requires `lineNumbers`.
83
+ */
84
+ diffBase?: string | null;
96
85
  }
97
86
  interface CodeEditorContextValue {
98
87
  /** Get the current document text */
@@ -151,6 +140,18 @@ interface CodeEditorContextValue {
151
140
  textareaRef: RefObject<HTMLTextAreaElement | null>;
152
141
  /** Placeholder text */
153
142
  placeholder?: string;
143
+ /**
144
+ * Totals of the live diff against {@link CodeEditorProps.diffBase} —
145
+ * `{ added, modified, removed }` — or `null` when no baseline is set.
146
+ * Handy for a status-bar chip or a host's save indicator.
147
+ */
148
+ diffStats: {
149
+ added: number;
150
+ modified: number;
151
+ removed: number;
152
+ } | null;
153
+ /** @internal — per-line gutter annotations for the diff marks. */
154
+ _diffAnnotations: DiffAnnotations | null;
154
155
  /** @internal */
155
156
  _engineReturn: UseEditorEngineReturn | null;
156
157
  /** @internal */
@@ -190,7 +191,7 @@ declare namespace CodeEditorStatusBar {
190
191
  var displayName: string;
191
192
  }
192
193
 
193
- declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, cursorLine, cursorColumn, }: CodeEditorProps): react.JSX.Element;
194
+ declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, cursorLine, cursorColumn, diffBase, }: CodeEditorProps): react.JSX.Element;
194
195
  declare namespace CodeEditorRoot {
195
196
  var displayName: string;
196
197
  }
@@ -270,11 +271,7 @@ interface ResolveFileKindInput {
270
271
  /** MIME type — preferred over the filename when known. */
271
272
  mime?: string;
272
273
  }
273
- /**
274
- * Resolve the fancy-code editor language for a filename. Returns `"plaintext"`
275
- * (no syntax highlighting) for unknown or extension-less files.
276
- */
277
- declare function languageFromFilename(filename?: string): string;
274
+
278
275
  /**
279
276
  * Decide whether a file is previewable media (image / video / audio / PDF) or
280
277
  * text, from its MIME type (preferred) and/or filename. Media wins when the
@@ -352,6 +349,29 @@ declare namespace FileViewer {
352
349
  var displayName: string;
353
350
  }
354
351
 
352
+ /**
353
+ * Diff-gutter model — the pure mapping between fancy-file-commons line
354
+ * annotations and what the CodeEditor gutter renders per line-number row.
355
+ * Kept DOM-free (like engine/position.ts) so it's unit-testable; the panel
356
+ * only paints what this resolves.
357
+ */
358
+
359
+ /** What one line-number row shows: its own change bar and/or a deletion wedge above. */
360
+ interface GutterDiffMark {
361
+ /** The line's own change (colored bar), if any. */
362
+ type?: LineChangeType;
363
+ /** True when one or more lines were deleted immediately above this line (wedge). */
364
+ deletedAbove: boolean;
365
+ }
366
+ /** Resolve the mark for a 1-based line, or null when the line is untouched. */
367
+ declare function gutterDiffMark(annotations: DiffAnnotations | null, line: number): GutterDiffMark | null;
368
+ /** Whether the deleted-at-EOF wedge should render under the last line. */
369
+ declare function hasDeletedAtEnd(annotations: DiffAnnotations | null): boolean;
370
+ /** The bar color for a change type, honoring theme overrides. */
371
+ declare function diffMarkColor(type: LineChangeType, colors: ThemeColors): string;
372
+ /** The deletion-wedge color, honoring theme overrides. */
373
+ declare function diffRemovedColor(colors: ThemeColors): string;
374
+
355
375
  /**
356
376
  * Tiny, dependency-free Markdown → HTML renderer for the MarkdownEditor preview
357
377
  * pane. Covers the common subset — headings, bold/italic, inline + fenced code,
@@ -362,14 +382,6 @@ declare namespace FileViewer {
362
382
  */
363
383
  declare function renderMarkdown(markdown: string): string;
364
384
 
365
- type TokenType = "keyword" | "string" | "comment" | "number" | "operator" | "tag" | "attribute" | "attributeValue" | "punctuation" | "function" | "type" | "variable" | "plain";
366
- interface Token {
367
- type: TokenType;
368
- start: number;
369
- end: number;
370
- }
371
- type Tokenizer = (source: string) => Token[];
372
-
373
385
  /**
374
386
  * Minimal, dependency-free Markdown tokenizer for editor highlighting. Line-based
375
387
  * for block constructs (fences, headings, blockquotes, list markers) plus a few
@@ -436,4 +448,4 @@ interface CodeEditorInputTagProps extends Omit<InputTagProps, "adapter"> {
436
448
  */
437
449
  declare function CodeEditorInputTag(props: CodeEditorInputTagProps): react.JSX.Element;
438
450
 
439
- export { CodeEditor, type CodeEditorContextValue, CodeEditorInputTag, type CodeEditorInputTagProps, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type FileKind, FileViewer, type FileViewerProps, type LanguageDefinition, MarkdownEditor, type MarkdownEditorMode, type MarkdownEditorProps, type ResolveFileKindInput, type ThemeColors, type ThemeDefinition, type Token, type TokenType, type Tokenizer, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, languageFromFilename, registerLanguage, registerTheme, renderMarkdown, resolveFileKind, tokenizeMarkdown, useCodeEditor, useCodeEditorInputTagAdapter };
451
+ export { CodeEditor, type CodeEditorContextValue, CodeEditorInputTag, type CodeEditorInputTagProps, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type FileKind, FileViewer, type FileViewerProps, type GutterDiffMark, type LanguageDefinition, MarkdownEditor, type MarkdownEditorMode, type MarkdownEditorProps, type ResolveFileKindInput, type ThemeDefinition, diffMarkColor, diffRemovedColor, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, gutterDiffMark, hasDeletedAtEnd, registerLanguage, registerTheme, renderMarkdown, resolveFileKind, tokenizeMarkdown, useCodeEditor, useCodeEditorInputTagAdapter };
package/dist/index.d.ts CHANGED
@@ -1,29 +1,9 @@
1
1
  import * as react from 'react';
2
2
  import { RefObject, ReactNode, CSSProperties } from 'react';
3
+ import { ThemeColors, DiffAnnotations, LineChangeType, Token, Tokenizer } from '@particle-academy/fancy-file-commons';
4
+ export { ThemeColors, Token, TokenType, Tokenizer, languageFromFilename } from '@particle-academy/fancy-file-commons';
3
5
  import { MediaKind, MediaViewerProps, InputTagProps, InputTagTriggers, InputTagAdapter } from '@particle-academy/react-fancy';
4
6
 
5
- interface ThemeColors {
6
- background: string;
7
- foreground: string;
8
- gutterBackground: string;
9
- gutterForeground: string;
10
- gutterBorder: string;
11
- activeLineBackground: string;
12
- selectionBackground: string;
13
- cursorColor: string;
14
- keyword: string;
15
- string: string;
16
- comment: string;
17
- number: string;
18
- operator: string;
19
- function: string;
20
- type: string;
21
- tag: string;
22
- attribute: string;
23
- attributeValue: string;
24
- punctuation: string;
25
- variable: string;
26
- }
27
7
  interface ThemeDefinition {
28
8
  /** Unique theme name */
29
9
  name: string;
@@ -93,6 +73,15 @@ interface CodeEditorProps {
93
73
  cursorLine?: number;
94
74
  /** 1-based column for {@link cursorLine} (default 1). */
95
75
  cursorColumn?: number;
76
+ /**
77
+ * Baseline document for the diff gutter. When set, the line-number column
78
+ * shows per-line change marks of the CURRENT value against this baseline —
79
+ * VS Code convention: a green bar for added lines, a blue bar for modified
80
+ * lines, and a red wedge where lines were deleted. Recomputed live as the
81
+ * user types (line-level only — cheap). `null`/omitted disables the gutter
82
+ * marks. Requires `lineNumbers`.
83
+ */
84
+ diffBase?: string | null;
96
85
  }
97
86
  interface CodeEditorContextValue {
98
87
  /** Get the current document text */
@@ -151,6 +140,18 @@ interface CodeEditorContextValue {
151
140
  textareaRef: RefObject<HTMLTextAreaElement | null>;
152
141
  /** Placeholder text */
153
142
  placeholder?: string;
143
+ /**
144
+ * Totals of the live diff against {@link CodeEditorProps.diffBase} —
145
+ * `{ added, modified, removed }` — or `null` when no baseline is set.
146
+ * Handy for a status-bar chip or a host's save indicator.
147
+ */
148
+ diffStats: {
149
+ added: number;
150
+ modified: number;
151
+ removed: number;
152
+ } | null;
153
+ /** @internal — per-line gutter annotations for the diff marks. */
154
+ _diffAnnotations: DiffAnnotations | null;
154
155
  /** @internal */
155
156
  _engineReturn: UseEditorEngineReturn | null;
156
157
  /** @internal */
@@ -190,7 +191,7 @@ declare namespace CodeEditorStatusBar {
190
191
  var displayName: string;
191
192
  }
192
193
 
193
- declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, cursorLine, cursorColumn, }: CodeEditorProps): react.JSX.Element;
194
+ declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, cursorLine, cursorColumn, diffBase, }: CodeEditorProps): react.JSX.Element;
194
195
  declare namespace CodeEditorRoot {
195
196
  var displayName: string;
196
197
  }
@@ -270,11 +271,7 @@ interface ResolveFileKindInput {
270
271
  /** MIME type — preferred over the filename when known. */
271
272
  mime?: string;
272
273
  }
273
- /**
274
- * Resolve the fancy-code editor language for a filename. Returns `"plaintext"`
275
- * (no syntax highlighting) for unknown or extension-less files.
276
- */
277
- declare function languageFromFilename(filename?: string): string;
274
+
278
275
  /**
279
276
  * Decide whether a file is previewable media (image / video / audio / PDF) or
280
277
  * text, from its MIME type (preferred) and/or filename. Media wins when the
@@ -352,6 +349,29 @@ declare namespace FileViewer {
352
349
  var displayName: string;
353
350
  }
354
351
 
352
+ /**
353
+ * Diff-gutter model — the pure mapping between fancy-file-commons line
354
+ * annotations and what the CodeEditor gutter renders per line-number row.
355
+ * Kept DOM-free (like engine/position.ts) so it's unit-testable; the panel
356
+ * only paints what this resolves.
357
+ */
358
+
359
+ /** What one line-number row shows: its own change bar and/or a deletion wedge above. */
360
+ interface GutterDiffMark {
361
+ /** The line's own change (colored bar), if any. */
362
+ type?: LineChangeType;
363
+ /** True when one or more lines were deleted immediately above this line (wedge). */
364
+ deletedAbove: boolean;
365
+ }
366
+ /** Resolve the mark for a 1-based line, or null when the line is untouched. */
367
+ declare function gutterDiffMark(annotations: DiffAnnotations | null, line: number): GutterDiffMark | null;
368
+ /** Whether the deleted-at-EOF wedge should render under the last line. */
369
+ declare function hasDeletedAtEnd(annotations: DiffAnnotations | null): boolean;
370
+ /** The bar color for a change type, honoring theme overrides. */
371
+ declare function diffMarkColor(type: LineChangeType, colors: ThemeColors): string;
372
+ /** The deletion-wedge color, honoring theme overrides. */
373
+ declare function diffRemovedColor(colors: ThemeColors): string;
374
+
355
375
  /**
356
376
  * Tiny, dependency-free Markdown → HTML renderer for the MarkdownEditor preview
357
377
  * pane. Covers the common subset — headings, bold/italic, inline + fenced code,
@@ -362,14 +382,6 @@ declare namespace FileViewer {
362
382
  */
363
383
  declare function renderMarkdown(markdown: string): string;
364
384
 
365
- type TokenType = "keyword" | "string" | "comment" | "number" | "operator" | "tag" | "attribute" | "attributeValue" | "punctuation" | "function" | "type" | "variable" | "plain";
366
- interface Token {
367
- type: TokenType;
368
- start: number;
369
- end: number;
370
- }
371
- type Tokenizer = (source: string) => Token[];
372
-
373
385
  /**
374
386
  * Minimal, dependency-free Markdown tokenizer for editor highlighting. Line-based
375
387
  * for block constructs (fences, headings, blockquotes, list markers) plus a few
@@ -436,4 +448,4 @@ interface CodeEditorInputTagProps extends Omit<InputTagProps, "adapter"> {
436
448
  */
437
449
  declare function CodeEditorInputTag(props: CodeEditorInputTagProps): react.JSX.Element;
438
450
 
439
- export { CodeEditor, type CodeEditorContextValue, CodeEditorInputTag, type CodeEditorInputTagProps, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type FileKind, FileViewer, type FileViewerProps, type LanguageDefinition, MarkdownEditor, type MarkdownEditorMode, type MarkdownEditorProps, type ResolveFileKindInput, type ThemeColors, type ThemeDefinition, type Token, type TokenType, type Tokenizer, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, languageFromFilename, registerLanguage, registerTheme, renderMarkdown, resolveFileKind, tokenizeMarkdown, useCodeEditor, useCodeEditorInputTagAdapter };
451
+ export { CodeEditor, type CodeEditorContextValue, CodeEditorInputTag, type CodeEditorInputTagProps, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type FileKind, FileViewer, type FileViewerProps, type GutterDiffMark, type LanguageDefinition, MarkdownEditor, type MarkdownEditorMode, type MarkdownEditorProps, type ResolveFileKindInput, type ThemeDefinition, diffMarkColor, diffRemovedColor, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, gutterDiffMark, hasDeletedAtEnd, registerLanguage, registerTheme, renderMarkdown, resolveFileKind, tokenizeMarkdown, useCodeEditor, useCodeEditorInputTagAdapter };