@cascivo/editor 0.2.2 → 0.2.5

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/editor.css CHANGED
@@ -1,2 +1,2 @@
1
- @layer cascivo.component{._root_1m6ns_2{background:var(--cascivo-editor-bg);max-block-size:100%;color:var(--cascivo-editor-fg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font-family:var(--cascivo-font-mono);font-size:var(--cascivo-text-sm);line-height:var(--cascivo-leading-normal);tab-size:var(--cascivo-editor-tab-size,2);display:flex;overflow:auto}._gutter_1m6ns_17{padding-block:var(--cascivo-space-3);background:var(--cascivo-editor-gutter-bg);color:var(--cascivo-editor-gutter-fg);text-align:end;-webkit-user-select:none;user-select:none;flex:none;padding-inline-start:var(--cascivo-space-3);padding-inline-end:var(--cascivo-space-2)}._gutterLine_1m6ns_28{min-block-size:1lh;display:block}._gutterActive_1m6ns_35{inset-inline:0;top:var(--cascivo-space-3);block-size:1lh;transform:translateY(calc(var(--cascivo-editor-caret-line,0) * 1lh));background:var(--cascivo-editor-gutter-active,var(--cascivo-editor-current-line));pointer-events:none;position:absolute}._pre_1m6ns_45{min-inline-size:0;padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);white-space:pre;font:inherit;tab-size:inherit;flex:auto;margin-block:0;margin-inline:0}._code_1m6ns_57{font:inherit}._line_1m6ns_62{min-block-size:1lh;display:block}._root_1m6ns_2[data-wrap=true] ._pre_1m6ns_45{white-space:pre-wrap;word-break:break-word}._root_1m6ns_2[data-line-numbers=false] ._gutter_1m6ns_17{display:none}._plain_1m6ns_77{color:var(--cascivo-editor-fg)}._keyword_1m6ns_80{color:var(--cascivo-editor-syntax-keyword)}._string_1m6ns_83{color:var(--cascivo-editor-syntax-string)}._number_1m6ns_86{color:var(--cascivo-editor-syntax-number)}._comment_1m6ns_89{color:var(--cascivo-editor-syntax-comment);font-style:italic}._function_1m6ns_93{color:var(--cascivo-editor-syntax-function)}._type_1m6ns_96{color:var(--cascivo-editor-syntax-type)}._operator_1m6ns_99{color:var(--cascivo-editor-syntax-operator)}._punctuation_1m6ns_102{color:var(--cascivo-editor-syntax-punctuation)}._variable_1m6ns_105{color:var(--cascivo-editor-syntax-variable)}._tag_1m6ns_108{color:var(--cascivo-editor-syntax-tag)}._attr_1m6ns_111{color:var(--cascivo-editor-syntax-attr)}._regexp_1m6ns_114{color:var(--cascivo-editor-syntax-regexp)}._boolean_1m6ns_117{color:var(--cascivo-editor-syntax-boolean)}._property_1m6ns_120{color:var(--cascivo-editor-syntax-property)}._match_1m6ns_125{background:var(--cascivo-editor-match,#7dd3fc47);border-radius:2px}._matchCurrent_1m6ns_129{background:var(--cascivo-editor-match-current,#facc1580);border-radius:2px}._bracketMatch_1m6ns_133{outline:1px solid var(--cascivo-editor-bracket,currentColor);border-radius:2px}._root_18xci_2{background:var(--cascivo-editor-bg);color:var(--cascivo-editor-fg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font-family:var(--cascivo-font-mono);font-size:var(--cascivo-text-sm);line-height:var(--cascivo-leading-normal);tab-size:var(--cascivo-editor-tab-size,2);transition:box-shadow var(--cascivo-duration-150) var(--cascivo-ease-out);display:flex;position:relative;overflow:hidden}._root_18xci_2:has(._textarea_18xci_18:focus-visible){box-shadow:var(--cascivo-focus-ring);border-color:var(--cascivo-color-accent)}._gutter_18xci_23{padding-block:var(--cascivo-space-3);background:var(--cascivo-editor-gutter-bg);color:var(--cascivo-editor-gutter-fg);text-align:end;-webkit-user-select:none;user-select:none;flex:none;padding-inline-start:var(--cascivo-space-3);padding-inline-end:var(--cascivo-space-2);position:relative;overflow:hidden}._codeArea_18xci_36{flex:auto;min-inline-size:0;position:relative}._pre_18xci_43{padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);white-space:pre;pointer-events:none;font:inherit;tab-size:inherit;margin-block:0;margin-inline:0;position:absolute;inset:0;overflow:hidden}._currentLine_18xci_58{inset-inline:0;top:var(--cascivo-space-3);block-size:1lh;transform:translateY(calc(var(--cascivo-editor-caret-line,0) * 1lh));background:var(--cascivo-editor-current-line);pointer-events:none;position:absolute}._textarea_18xci_18{block-size:100%;inline-size:100%;padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);resize:none;color:#0000;caret-color:var(--cascivo-editor-fg);white-space:pre;font:inherit;tab-size:inherit;background:0 0;border:0;outline:none;margin-block:0;margin-inline:0;position:absolute;inset:0;overflow:auto}._textarea_18xci_18::placeholder{color:var(--cascivo-editor-gutter-fg)}._textarea_18xci_18::selection{background:var(--cascivo-editor-selection)}._textarea_18xci_18:disabled{cursor:not-allowed;opacity:var(--cascivo-disabled-opacity)}._root_18xci_2[data-wrap=true] ._pre_18xci_43,._root_18xci_2[data-wrap=true] ._textarea_18xci_18{white-space:pre-wrap;word-break:break-word}._root_18xci_2[data-line-numbers=false] ._gutter_18xci_23{display:none}@media (pointer:coarse){._root_18xci_2{min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}@media (prefers-reduced-motion:reduce){._root_18xci_2{transition:none}}._panel_hawkv_2{z-index:2;gap:var(--cascivo-space-1);padding:var(--cascivo-space-2);background:var(--cascivo-editor-bg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);box-shadow:var(--cascivo-shadow-md,0 4px 12px #0003);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-editor-fg);flex-direction:column;display:flex;position:absolute;inset-block-start:var(--cascivo-space-2);inset-inline-end:var(--cascivo-space-2)}._row_hawkv_20{align-items:center;gap:var(--cascivo-space-1);display:flex}._input_hawkv_26{min-inline-size:8rem;padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-2);background:var(--cascivo-editor-gutter-bg,transparent);color:inherit;border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font:inherit;flex:auto}._input_hawkv_26:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:var(--cascivo-focus-ring);outline:none}._count_hawkv_44{padding-inline:var(--cascivo-space-1);color:var(--cascivo-editor-gutter-fg);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}._button_hawkv_52,._toggle_hawkv_53{min-inline-size:1.75rem;padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-2);color:inherit;border-radius:var(--cascivo-radius-field);font:inherit;cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;line-height:1;display:inline-flex}._button_hawkv_52:hover,._toggle_hawkv_53:hover{background:var(--cascivo-editor-current-line)}._button_hawkv_52:focus-visible,._toggle_hawkv_53:focus-visible{box-shadow:var(--cascivo-focus-ring);outline:none}._active_hawkv_80{border-color:var(--cascivo-color-accent);color:var(--cascivo-color-accent)}@media (pointer:coarse){._button_hawkv_52,._toggle_hawkv_53,._input_hawkv_26{min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}}@media (forced-colors:active){._root_18xci_2{border:1px solid fieldtext}._pre_18xci_43{display:none}._textarea_18xci_18{color:canvastext;caret-color:canvastext}}
1
+ @layer cascivo.component{._root_1m6ns_2{background:var(--cascivo-editor-bg);max-block-size:100%;color:var(--cascivo-editor-fg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font-family:var(--cascivo-font-mono);font-size:var(--cascivo-text-sm);line-height:var(--cascivo-leading-normal);tab-size:var(--cascivo-editor-tab-size,2);display:flex;overflow:auto}._gutter_1m6ns_17{padding-block:var(--cascivo-space-3);background:var(--cascivo-editor-gutter-bg);color:var(--cascivo-editor-gutter-fg);text-align:end;-webkit-user-select:none;user-select:none;flex:none;padding-inline-start:var(--cascivo-space-3);padding-inline-end:var(--cascivo-space-2)}._gutterLine_1m6ns_28{min-block-size:1lh;display:block}._gutterActive_1m6ns_35{inset-inline:0;top:var(--cascivo-space-3);block-size:1lh;transform:translateY(calc(var(--cascivo-editor-caret-line,0) * 1lh));background:var(--cascivo-editor-gutter-active,var(--cascivo-editor-current-line));pointer-events:none;position:absolute}._pre_1m6ns_45{min-inline-size:0;padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);white-space:pre;font:inherit;tab-size:inherit;flex:auto;margin-block:0;margin-inline:0}._code_1m6ns_57{font:inherit}._line_1m6ns_62{min-block-size:1lh;display:block}._root_1m6ns_2[data-wrap=true] ._pre_1m6ns_45{white-space:pre-wrap;word-break:break-word}._root_1m6ns_2[data-line-numbers=false] ._gutter_1m6ns_17{display:none}._plain_1m6ns_77{color:var(--cascivo-editor-fg)}._keyword_1m6ns_80{color:var(--cascivo-editor-syntax-keyword)}._string_1m6ns_83{color:var(--cascivo-editor-syntax-string)}._number_1m6ns_86{color:var(--cascivo-editor-syntax-number)}._comment_1m6ns_89{color:var(--cascivo-editor-syntax-comment);font-style:italic}._function_1m6ns_93{color:var(--cascivo-editor-syntax-function)}._type_1m6ns_96{color:var(--cascivo-editor-syntax-type)}._operator_1m6ns_99{color:var(--cascivo-editor-syntax-operator)}._punctuation_1m6ns_102{color:var(--cascivo-editor-syntax-punctuation)}._variable_1m6ns_105{color:var(--cascivo-editor-syntax-variable)}._tag_1m6ns_108{color:var(--cascivo-editor-syntax-tag)}._attr_1m6ns_111{color:var(--cascivo-editor-syntax-attr)}._regexp_1m6ns_114{color:var(--cascivo-editor-syntax-regexp)}._boolean_1m6ns_117{color:var(--cascivo-editor-syntax-boolean)}._property_1m6ns_120{color:var(--cascivo-editor-syntax-property)}._match_1m6ns_125{background:var(--cascivo-editor-match,#7dd3fc47);border-radius:2px}._matchCurrent_1m6ns_129{background:var(--cascivo-editor-match-current,#facc1580);border-radius:2px}._bracketMatch_1m6ns_133{outline:1px solid var(--cascivo-editor-bracket,currentColor);border-radius:2px}._root_18xci_2{background:var(--cascivo-editor-bg);color:var(--cascivo-editor-fg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font-family:var(--cascivo-font-mono);font-size:var(--cascivo-text-sm);line-height:var(--cascivo-leading-normal);tab-size:var(--cascivo-editor-tab-size,2);transition:box-shadow var(--cascivo-duration-150) var(--cascivo-ease-out);display:flex;position:relative;overflow:hidden}._root_18xci_2:has(._textarea_18xci_18:focus-visible){box-shadow:var(--cascivo-focus-ring);border-color:var(--cascivo-color-accent)}._gutter_18xci_23{padding-block:var(--cascivo-space-3);background:var(--cascivo-editor-gutter-bg);color:var(--cascivo-editor-gutter-fg);text-align:end;-webkit-user-select:none;user-select:none;flex:none;padding-inline-start:var(--cascivo-space-3);padding-inline-end:var(--cascivo-space-2);position:relative;overflow:hidden}._codeArea_18xci_36{flex:auto;min-inline-size:0;position:relative}._pre_18xci_43{padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);white-space:pre;pointer-events:none;font:inherit;tab-size:inherit;margin-block:0;margin-inline:0;position:absolute;inset:0;overflow:hidden}._currentLine_18xci_58{inset-inline:0;top:var(--cascivo-space-3);block-size:1lh;transform:translateY(calc(var(--cascivo-editor-caret-line,0) * 1lh));background:var(--cascivo-editor-current-line);pointer-events:none;position:absolute}._textarea_18xci_18{block-size:100%;inline-size:100%;padding-block:var(--cascivo-space-3);padding-inline:var(--cascivo-space-3);resize:none;color:#0000;caret-color:var(--cascivo-editor-fg);white-space:pre;font:inherit;tab-size:inherit;background:0 0;border:0;outline:none;margin-block:0;margin-inline:0;position:absolute;inset:0;overflow:auto}._textarea_18xci_18::placeholder{color:var(--cascivo-editor-gutter-fg)}._textarea_18xci_18::selection{background:var(--cascivo-editor-selection)}._textarea_18xci_18:disabled{cursor:not-allowed;opacity:var(--cascivo-disabled-opacity)}._root_18xci_2[data-wrap=true] ._pre_18xci_43,._root_18xci_2[data-wrap=true] ._textarea_18xci_18{white-space:pre-wrap;word-break:break-word}._root_18xci_2[data-line-numbers=false] ._gutter_18xci_23{display:none}@media (pointer:coarse){._root_18xci_2{min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}@media (prefers-reduced-motion:reduce){._root_18xci_2{transition:none}}._panel_hawkv_2{z-index:2;gap:var(--cascivo-space-1);padding:var(--cascivo-space-2);background:var(--cascivo-editor-bg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);box-shadow:var(--cascivo-shadow-md,0 4px 12px #0003);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-editor-fg);flex-direction:column;display:flex;position:absolute;inset-block-start:var(--cascivo-space-2);inset-inline-end:var(--cascivo-space-2)}._row_hawkv_20{align-items:center;gap:var(--cascivo-space-1);display:flex}._input_hawkv_26{min-inline-size:8rem;padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-2);background:var(--cascivo-editor-gutter-bg,transparent);color:inherit;border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);font:inherit;flex:auto}._input_hawkv_26:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:var(--cascivo-focus-ring);outline:none}._count_hawkv_44{padding-inline:var(--cascivo-space-1);color:var(--cascivo-editor-gutter-fg);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}._button_hawkv_52,._toggle_hawkv_53{min-inline-size:1.75rem;padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-2);color:inherit;border-radius:var(--cascivo-radius-field);font:inherit;cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;line-height:1;display:inline-flex}._button_hawkv_52:hover,._toggle_hawkv_53:hover{background:var(--cascivo-editor-current-line)}._button_hawkv_52:focus-visible,._toggle_hawkv_53:focus-visible{box-shadow:var(--cascivo-focus-ring);outline:none}._active_hawkv_80{border-color:var(--cascivo-color-accent);color:var(--cascivo-color-accent)}@media (pointer:coarse){._button_hawkv_52,._toggle_hawkv_53,._input_hawkv_26{min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}._menu_zkolh_2{z-index:3;margin-block:var(--cascivo-space-1);padding-block:var(--cascivo-space-1);background:var(--cascivo-editor-bg);border:1px solid var(--cascivo-editor-border);border-radius:var(--cascivo-radius-field);max-block-size:16rem;min-inline-size:12rem;box-shadow:var(--cascivo-shadow-md,0 4px 12px #0003);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-editor-fg);margin-inline:0;padding-inline:0;list-style:none;position:absolute;overflow-y:auto}._option_zkolh_24{justify-content:space-between;align-items:baseline;gap:var(--cascivo-space-3);padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-3);cursor:pointer;white-space:nowrap;display:flex}._active_zkolh_35{background:var(--cascivo-editor-current-line)}._label_zkolh_39{text-overflow:ellipsis;overflow:hidden}._hint_zkolh_44{color:var(--cascivo-editor-gutter-fg);font-variant-numeric:tabular-nums;flex:none}._empty_zkolh_50{padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-3);color:var(--cascivo-editor-gutter-fg)}@media (pointer:coarse){._option_zkolh_24,._empty_zkolh_50{min-block-size:var(--cascivo-target-min-coarse,2.75rem);align-items:center}}}@media (forced-colors:active){._root_18xci_2{border:1px solid fieldtext}._pre_18xci_43{display:none}._textarea_18xci_18{color:canvastext;caret-color:canvastext}}
2
2
  /*$vite$:1*/
package/dist/index.d.ts CHANGED
@@ -185,6 +185,25 @@ type KeyMap = Record<string, Command>;
185
185
  * while global `data-theme` remains the default.
186
186
  */
187
187
  type EditorTheme = Partial<Record<`--cascivo-editor-${string}`, string>>;
188
+ /**
189
+ * A slash-command entry. Typing `/` at a word boundary opens a filtered menu of
190
+ * these; choosing one replaces the `/query` span with `insert` (undoable) and/or
191
+ * runs `run`. At least one of `insert` / `run` must be provided.
192
+ */
193
+ interface SlashCommand {
194
+ /** Stable id (menu key). */
195
+ id: string;
196
+ /** Shown in the menu and matched against the query. */
197
+ label: string;
198
+ /** Optional right-aligned hint (e.g. a shortcut or category). */
199
+ hint?: string;
200
+ /** Extra match terms beyond the label. */
201
+ keywords?: readonly string[];
202
+ /** Text inserted in place of the `/query` (an undoable edit). */
203
+ insert?: string;
204
+ /** Side effect run after the `/query` is removed (receives the editor handle). */
205
+ run?: (editor: CodeEditorHandle) => void;
206
+ }
188
207
  /**
189
208
  * Imperative handle (via `ref`) for callers that drive their own transactions —
190
209
  * a remote pull, a programmatic insert, a reset. Edits route through the same
@@ -208,6 +227,8 @@ interface CodeEditorHandle {
208
227
  redo(): void;
209
228
  /** Open the find panel. */
210
229
  openFind(): void;
230
+ /** Open the slash-command menu at the current caret (no-op without `commands`). */
231
+ openCommandMenu(): void;
211
232
  }
212
233
  interface CodeEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'defaultValue' | 'onChange' | 'wrap'> {
213
234
  /** Controlled value. */
@@ -243,6 +264,8 @@ interface CodeEditorProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElemen
243
264
  theme?: EditorTheme;
244
265
  /** Highlight the bracket matching the one adjacent to the caret (default false). */
245
266
  bracketMatching?: boolean;
267
+ /** Slash-command entries; typing `/` opens a filtered menu. Omit to disable. */
268
+ commands?: readonly SlashCommand[];
246
269
  }
247
270
  /**
248
271
  * A lightweight code editor: a native `<textarea>` overlaid on a syntax-highlighted
@@ -290,4 +313,4 @@ declare function Highlight({
290
313
  style,
291
314
  ...rest
292
315
  }: HighlightProps): import("react").JSX.Element;
293
- export { CodeEditor, type CodeEditorHandle, type CodeEditorProps, type Command, type CommandContext, type Decoration, type EditorTheme, type Grammar, type GrammarState, Highlight, type HighlightProps, type KeyMap, type LineStateIndex, type LineTokens, type Rule, type RuleSpec, type Token, type TokenKind, type TokenizeResult, bash, createLineStateIndex, createRuleGrammar, css, getGrammar, html, javascript, json, listGrammars, markdown, plaintext, registerGrammar, tokenize, tokenizeDocument, tokenizeRange, typescript };
316
+ export { CodeEditor, type CodeEditorHandle, type CodeEditorProps, type Command, type CommandContext, type Decoration, type EditorTheme, type Grammar, type GrammarState, Highlight, type HighlightProps, type KeyMap, type LineStateIndex, type LineTokens, type Rule, type RuleSpec, type SlashCommand, type Token, type TokenKind, type TokenizeResult, bash, createLineStateIndex, createRuleGrammar, css, getGrammar, html, javascript, json, listGrammars, markdown, plaintext, registerGrammar, tokenize, tokenizeDocument, tokenizeRange, typescript };