@yurikilian/lex4 0.3.2 → 1.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.
package/README.md CHANGED
@@ -175,7 +175,7 @@ The main editor component. Drop it into any React application.
175
175
  | `readOnly` | `boolean` | `false` | Disable editing (view-only mode) |
176
176
  | `extensions` | `Lex4Extension[]` | `[]` | Extensions to load (e.g., `astExtension()`, `variablesExtension(defs)`) |
177
177
  | `translations` | `DeepPartial<Lex4Translations>` | English | Partial i18n overrides, deep-merged with defaults |
178
- | `onSave` | `(payload: { ast, json }) => void` | — | Called when the host app triggers a save |
178
+ | `onSave` | `(payload: { document, ast, json }) => void` | — | Called when the host app triggers a save (includes full `Lex4Document`) |
179
179
  | `captureHistoryShortcutsOnWindow` | `boolean` | `true` | Capture ⌘Z/⌘⇧Z at the window level |
180
180
  | `className` | `string` | — | Additional CSS class for the editor root |
181
181
 
@@ -343,6 +343,71 @@ import { DEFAULT_TRANSLATIONS } from '@yurikilian/lex4';
343
343
  import type { Lex4Translations } from '@yurikilian/lex4';
344
344
  ```
345
345
 
346
+ ## 🎨 Theming & Customization
347
+
348
+ All styling uses **CSS custom properties** (design tokens) and **semantic `.lex4-*` classes** — no Tailwind utilities in the production output. This makes `style.css` safe to import alongside any CSS framework.
349
+
350
+ ### Design Tokens
351
+
352
+ Override tokens on `.lex4-editor` to theme the entire editor without `!important`:
353
+
354
+ ```css
355
+ .lex4-editor {
356
+ /* Brand / accent */
357
+ --lex4-color-primary: #10b981; /* emerald instead of blue */
358
+ --lex4-color-primary-light: #ecfdf5;
359
+ --lex4-color-primary-text: #047857;
360
+
361
+ /* Surfaces & text */
362
+ --lex4-color-bg: #ffffff;
363
+ --lex4-color-bg-canvas: #f8fafc; /* lighter canvas */
364
+ --lex4-color-text: #111827;
365
+ --lex4-color-text-secondary: #6b7280;
366
+
367
+ /* Dimensions */
368
+ --lex4-sidebar-width: 280px; /* narrower sidebar */
369
+ --lex4-font-family: 'Times New Roman', serif;
370
+ }
371
+ ```
372
+
373
+ See the full list of tokens in [`packages/editor/src/styles.css`](packages/editor/src/styles.css).
374
+
375
+ ### Stable CSS Selectors
376
+
377
+ Every UI region has a semantic class you can target:
378
+
379
+ | Region | Selector |
380
+ |--------|----------|
381
+ | Root | `.lex4-editor` |
382
+ | Toolbar | `.lex4-toolbar` |
383
+ | Toolbar button | `.lex4-toolbar-btn` |
384
+ | Toolbar select | `.lex4-toolbar-select` |
385
+ | Document canvas | `.lex4-canvas` |
386
+ | Page | `.lex4-page` |
387
+ | Page body | `.lex4-page-body` |
388
+ | Page header | `.lex4-page-header` |
389
+ | Page footer | `.lex4-page-footer` |
390
+ | Sidebar | `.lex4-sidebar` |
391
+ | History entry | `.lex4-history-entry-row` |
392
+ | Variable chip | `.lex4-variable-chip` |
393
+ | Variable picker | `.lex4-variable-picker` |
394
+
395
+ ### Extension-Level Theming
396
+
397
+ Extensions can contribute CSS variables and a root class name:
398
+
399
+ ```ts
400
+ const darkModeExtension: Lex4Extension = {
401
+ name: 'dark-mode',
402
+ cssVariables: {
403
+ '--lex4-color-bg': '#1a1a2e',
404
+ '--lex4-color-text': '#e0e0e0',
405
+ '--lex4-color-bg-canvas': '#16213e',
406
+ },
407
+ rootClassName: 'lex4-dark',
408
+ };
409
+ ```
410
+
346
411
  ## 📝 Document AST
347
412
 
348
413
  The AST is a **clean, versioned, Lexical-independent** structure designed for backend consumption (e.g., DOCX/PDF generation). It preserves semantic structure, formatting marks, font choices, header/footer layout, A4 page metadata, and variable references.
@@ -436,6 +501,8 @@ interface Lex4Extension {
436
501
  sidePanel?: React.ComponentType; // right-side panel
437
502
  provider?: React.ComponentType<...>; // context provider wrapper
438
503
  themeOverrides?: Partial<EditorThemeClasses>;
504
+ cssVariables?: Record<string, string>; // CSS custom property overrides
505
+ rootClassName?: string; // extra class on editor root
439
506
  handleMethods?: (ctx) => Record<string, Function>;
440
507
  }
441
508
  ```
@@ -528,7 +595,7 @@ pnpm --filter e2e test:ui
528
595
 
529
596
  | Category | Framework | Count | Description |
530
597
  |----------|-----------|-------|-------------|
531
- | Unit | Vitest | 178 | Engine logic, reducers, AST serializers, i18n, variable nodes |
598
+ | Unit | Vitest | 186 | Engine logic, reducers, AST serializers, i18n, variable nodes |
532
599
  | E2E | Playwright | 118 | Full user flows — typing, formatting, pagination, header/footer, variables, theme, i18n |
533
600
 
534
601
  ## 🔧 Build & Bundle
@@ -540,7 +607,7 @@ The library is built with **Vite in library mode**, producing:
540
607
  | ESM | `dist/lex4-editor.js` | ES module for modern bundlers |
541
608
  | CJS | `dist/lex4-editor.cjs` | CommonJS for Node.js / legacy bundlers |
542
609
  | Types | `dist/index.d.ts` | Full TypeScript declarations |
543
- | CSS | `dist/style.css` | Compiled Tailwind styles |
610
+ | CSS | `dist/style.css` | Pure CSS with design tokens (no Tailwind) |
544
611
  | Source maps | `dist/*.map` | Debugging support |
545
612
 
546
613
  React and ReactDOM are **externalized** — they are not bundled and must be provided by the consuming application. Lexical packages are bundled as direct dependencies.
@@ -572,7 +639,7 @@ To deploy manually, trigger the workflow from the Actions tab.
572
639
  | [React 18](https://react.dev/) | UI framework |
573
640
  | [Meta Lexical](https://lexical.dev/) | Rich text editing engine |
574
641
  | [Vite](https://vitejs.dev/) | Library build (ESM + CJS) and dev server |
575
- | [Tailwind CSS](https://tailwindcss.com/) | Styling |
642
+ | [Tailwind CSS](https://tailwindcss.com/) | Dev-only utility reference (not in production output) |
576
643
  | [Vitest](https://vitest.dev/) | Unit testing |
577
644
  | [Playwright](https://playwright.dev/) | End-to-end testing |
578
645
  | [pnpm](https://pnpm.io/) | Package manager (monorepo workspaces) |
@@ -1 +1 @@
1
- {"version":3,"file":"EditorSidebar.d.ts","sourceRoot":"","sources":["../../src/components/EditorSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAgDtD,CAAC"}
1
+ {"version":3,"file":"EditorSidebar.d.ts","sourceRoot":"","sources":["../../src/components/EditorSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA+CtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderFooterActions.d.ts","sourceRoot":"","sources":["../../src/components/HeaderFooterActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAQxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,UAAU,wBAAwB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,uBAAuB,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AASD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAqIlE,CAAC"}
1
+ {"version":3,"file":"HeaderFooterActions.d.ts","sourceRoot":"","sources":["../../src/components/HeaderFooterActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAQxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,UAAU,wBAAwB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,uBAAuB,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AASD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA2HlE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderFooterToggle.d.ts","sourceRoot":"","sources":["../../src/components/HeaderFooterToggle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,uBAAuB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAsChE,CAAC"}
1
+ {"version":3,"file":"HeaderFooterToggle.d.ts","sourceRoot":"","sources":["../../src/components/HeaderFooterToggle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,uBAAuB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA6BhE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HistorySidebar.d.ts","sourceRoot":"","sources":["../../src/components/HistorySidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAkFlC,CAAC"}
1
+ {"version":3,"file":"HistorySidebar.d.ts","sourceRoot":"","sources":["../../src/components/HistorySidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAiFlC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Lex4Editor.d.ts","sourceRoot":"","sources":["../../src/components/Lex4Editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0E,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAa/D,OAAO,eAAe,CAAC;AAkQvB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,0FA0BrB,CAAC"}
1
+ {"version":3,"file":"Lex4Editor.d.ts","sourceRoot":"","sources":["../../src/components/Lex4Editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0E,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAe/D,OAAO,eAAe,CAAC;AA4RvB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,0FA4BrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PageBody.d.ts","sourceRoot":"","sources":["../../src/components/PageBody.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,OAAO,KAAK,EAAe,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAelE,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsBD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkG5C,CAAC"}
1
+ {"version":3,"file":"PageBody.d.ts","sourceRoot":"","sources":["../../src/components/PageBody.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,OAAO,KAAK,EAAe,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAelE,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsBD;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAgG5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAkC3C,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAyW3B,CAAC"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAkC3C,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAuW3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VariablePanel.d.ts","sourceRoot":"","sources":["../../src/components/VariablePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAS9D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA2GA,CAAC"}
1
+ {"version":3,"file":"VariablePanel.d.ts","sourceRoot":"","sources":["../../src/components/VariablePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAS9D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAmGA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VariablePicker.d.ts","sourceRoot":"","sources":["../../src/components/VariablePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAIjF,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA+GxD,CAAC"}
1
+ {"version":3,"file":"VariablePicker.d.ts","sourceRoot":"","sources":["../../src/components/VariablePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAIjF,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAyGxD,CAAC"}
@@ -1,4 +1,13 @@
1
1
  import { Lex4Extension } from './types';
2
+ import { PayloadOptions } from '../ast/payload-builder';
3
+ import { DocumentAst, SaveDocumentRequest } from '../ast/types';
4
+ declare module '../types/editor-handle' {
5
+ interface Lex4EditorHandle {
6
+ getDocumentAst: () => DocumentAst;
7
+ getDocumentJson: () => string;
8
+ buildSavePayload: (options?: PayloadOptions) => SaveDocumentRequest;
9
+ }
10
+ }
2
11
  /**
3
12
  * Creates an AST extension that adds document export capabilities.
4
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ast-extension.d.ts","sourceRoot":"","sources":["../../src/extensions/ast-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,SAAS,CAAC;AAK/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,aAAa,CA0B5C"}
1
+ {"version":3,"file":"ast-extension.d.ts","sourceRoot":"","sources":["../../src/extensions/ast-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,SAAS,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,gBAAgB;QACxB,cAAc,EAAE,MAAM,WAAW,CAAC;QAClC,eAAe,EAAE,MAAM,MAAM,CAAC;QAC9B,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,KAAK,mBAAmB,CAAC;KACrE;CACF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,aAAa,CA0B5C"}
@@ -2,7 +2,9 @@ import { default as React } from 'react';
2
2
  import { ResolvedExtensions, ExtensionContext, Lex4Extension } from './types';
3
3
  /**
4
4
  * Provides resolved extension data to all child components.
5
- * Extensions are resolved once from the extensions array.
5
+ * Extensions are resolved when the set of extension names changes,
6
+ * not on every array reference change — preventing unnecessary
7
+ * editor re-initialization.
6
8
  */
7
9
  export declare const ExtensionProvider: React.FC<{
8
10
  extensions?: Lex4Extension[];
@@ -1 +1 @@
1
- {"version":3,"file":"extension-context.d.ts","sourceRoot":"","sources":["../../src/extensions/extension-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAc7C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAkBA,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAElD;AAMD,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAO1E,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB;UAGvB,CAAC,iBAAiB,MAAM,KAAG,CAAC,GAAG,SAAS;UACxC,CAAC,iBAAiB,MAAM,SAAS,CAAC;EAI3C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAC5C,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GACnD,gBAAgB,CAWlB"}
1
+ {"version":3,"file":"extension-context.d.ts","sourceRoot":"","sources":["../../src/extensions/extension-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAwB7C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAwBA,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAElD;AAMD,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAO1E,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB;UAGvB,CAAC,iBAAiB,MAAM,KAAG,CAAC,GAAG,SAAS;UACxC,CAAC,iBAAiB,MAAM,SAAS,CAAC;EAI3C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAC5C,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GACnD,gBAAgB,CAWlB"}
@@ -46,6 +46,16 @@ export interface Lex4Extension {
46
46
  * Merged into the base theme.
47
47
  */
48
48
  themeOverrides?: Partial<EditorThemeClasses>;
49
+ /**
50
+ * CSS custom property overrides applied on the `.lex4-editor` root.
51
+ * Use to retheme the editor — e.g. `{ '--lex4-color-primary': '#e11d48' }`.
52
+ */
53
+ cssVariables?: Record<string, string>;
54
+ /**
55
+ * Extra CSS class name(s) added to the `.lex4-editor` root element.
56
+ * Useful for scoping extension-specific styles.
57
+ */
58
+ rootClassName?: string;
49
59
  /**
50
60
  * Factory that returns imperative handle methods.
51
61
  * These are merged into the Lex4EditorHandle exposed via ref.
@@ -65,6 +75,8 @@ export interface ResolvedExtensions {
65
75
  children: React.ReactNode;
66
76
  }>[];
67
77
  themeOverrides: Partial<EditorThemeClasses>;
78
+ cssVariables: Record<string, string>;
79
+ rootClassNames: string[];
68
80
  handleFactories: Array<(ctx: ExtensionContext) => Record<string, (...args: never[]) => unknown>>;
69
81
  }
70
82
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/extensions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,YAAY,CAAC;IAChC,eAAe,EAAE,MAAM,OAAO,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,iBAAiB,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC;IAC/D,iBAAiB,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CACjE;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IAEb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAE7B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAEpC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAErC,gDAAgD;IAChD,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAE9D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE7C;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC;CAC1F;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5B,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IACnC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAClC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,EAAE,CAAC;IAChE,cAAc,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,eAAe,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC;CAClG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAwBjF"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/extensions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,YAAY,CAAC;IAChC,eAAe,EAAE,MAAM,OAAO,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,iBAAiB,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC;IAC/D,iBAAiB,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CACjE;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IAEb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAE7B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAEpC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAErC,gDAAgD;IAChD,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAE9D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE7C;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC;CAC1F;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5B,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IACnC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAClC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,EAAE,CAAC;IAChE,cAAc,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC;CAClG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,kBAAkB,CA8BjF"}
@@ -1,5 +1,11 @@
1
1
  import { Lex4Extension } from './types';
2
2
  import { VariableDefinition } from '../variables/types';
3
+ declare module '../types/editor-handle' {
4
+ interface Lex4EditorHandle {
5
+ insertVariable: (key: string) => void;
6
+ refreshVariables: (newDefs: VariableDefinition[]) => void;
7
+ }
8
+ }
3
9
  interface VariablePanelState {
4
10
  panelOpen: boolean;
5
11
  setPanelOpen: (open: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"variables-extension.d.ts","sourceRoot":"","sources":["../../src/extensions/variables-extension.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAa7D,UAAU,kBAAkB;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAOD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D;AAwFD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,GAAE,kBAAkB,EAAO,GAAG,aAAa,CAgCxF"}
1
+ {"version":3,"file":"variables-extension.d.ts","sourceRoot":"","sources":["../../src/extensions/variables-extension.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAQ7D,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,gBAAgB;QACxB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QACtC,gBAAgB,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;KAC3D;CACF;AAOD,UAAU,kBAAkB;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAOD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D;AAmFD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,GAAE,kBAAkB,EAAO,GAAG,aAAa,CAgCxF"}