@jsonpdf/editor 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/index.css +1 -0
- package/dist/index.js +6721 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 JsonPDF
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# @jsonpdf/editor
|
|
2
|
+
|
|
3
|
+
Visual drag-and-drop template designer for jsonpdf, built with React, Konva, and Zustand.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Canvas editor** — Drag, resize, and position elements on a WYSIWYG canvas with snap-to-grid and alignment guides
|
|
8
|
+
- **Element palette** — Add text, images, shapes, lines, lists, tables, containers, barcodes, charts, and frames
|
|
9
|
+
- **Property panels** — Edit template, section, band, and element properties through a form-based sidebar
|
|
10
|
+
- **Style manager** — Create and manage reusable named styles
|
|
11
|
+
- **Font manager** — Add and configure font families with weight/style variants
|
|
12
|
+
- **Data schema editor** — Define the JSON Schema for template data binding
|
|
13
|
+
- **PDF preview** — Live PDF rendering with editable sample data
|
|
14
|
+
- **Code view** — Edit the raw JSON template with Monaco Editor
|
|
15
|
+
- **Undo/redo** — Full history via Zustand temporal middleware
|
|
16
|
+
- **Keyboard shortcuts** — Copy, paste, delete, undo/redo, and more
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
The editor is packaged as a Vite library and consumed by `@jsonpdf/cli` via the `jsonpdf editor` command. It can also be embedded in any React application:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { EditorShell, useEditorStore } from '@jsonpdf/editor';
|
|
24
|
+
import '@jsonpdf/editor/dist/index.css';
|
|
25
|
+
|
|
26
|
+
function App() {
|
|
27
|
+
return <EditorShell />;
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Exports
|
|
32
|
+
|
|
33
|
+
| Category | Exports |
|
|
34
|
+
| -------- | ----------------------------------------------------------- |
|
|
35
|
+
| Main | `EditorShell`, `EditorState`, `Tool`, `useEditorStore` |
|
|
36
|
+
| Canvas | `TemplateCanvas`, `CANVAS_PADDING` |
|
|
37
|
+
| Layout | `computeDesignLayout`, `DesignPage`, `DesignBand` |
|
|
38
|
+
| Code | `CodeLayout`, `TemplateEditor`, `TemplateEditorHandle` |
|
|
39
|
+
| Preview | `PreviewLayout`, `PdfViewer`, `DataEditor`, `usePdfPreview` |
|
|
40
|
+
|
|
41
|
+
## Tech stack
|
|
42
|
+
|
|
43
|
+
- [React 19](https://react.dev/) — UI framework
|
|
44
|
+
- [Konva](https://konvajs.org/) + [react-konva](https://github.com/konvajs/react-konva) — 2D canvas rendering
|
|
45
|
+
- [Zustand](https://zustand-demo.pmnd.rs/) — State management with temporal middleware for undo/redo
|
|
46
|
+
- [Monaco Editor](https://microsoft.github.io/monaco-editor/) — JSON template code editing
|
|
47
|
+
- [Vite](https://vite.dev/) — Build tooling (library mode)
|
package/dist/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--jp-color-surface: #ffffff;--jp-color-surface-secondary: #f5f5f5;--jp-color-surface-tertiary: #e8e8e8;--jp-color-border: #d0d0d0;--jp-color-border-light: #e5e5e5;--jp-color-text-primary: #1a1a1a;--jp-color-text-secondary: #666666;--jp-color-text-tertiary: #999999;--jp-color-accent: #2563eb;--jp-color-accent-light: #dbeafe;--jp-color-canvas-bg: #e8e8e8;--jp-space-xs: 4px;--jp-space-sm: 8px;--jp-space-md: 12px;--jp-space-lg: 16px;--jp-space-xl: 24px;--jp-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--jp-font-size-xs: 10px;--jp-font-size-sm: 12px;--jp-font-size-md: 14px;--jp-toolbar-height: 40px;--jp-sidebar-width: 280px;--jp-outline-width: 220px;--jp-color-field-bg: #ffffff;--jp-color-field-border: #d0d0d0;--jp-color-field-focus: #2563eb;--jp-field-height: 28px;--jp-field-label-width: 72px}._toolbar_16i15_1{display:flex;flex-direction:column;border-bottom:1px solid var(--jp-color-border);background:var(--jp-color-surface)}._titleRow_16i15_8{display:flex;align-items:center;height:var(--jp-toolbar-height);padding:0 var(--jp-space-md);gap:var(--jp-space-md)}._name_16i15_16{font-size:var(--jp-font-size-md);font-weight:600;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._menuBar_16i15_25{display:flex;align-items:center;height:28px;padding:0 var(--jp-space-sm)}._menuContainer_16i15_32{position:relative}._hiddenInput_16i15_36{display:none}._menuBarBtn_16i15_40{display:flex;align-items:center;justify-content:center;height:24px;padding:0 var(--jp-space-sm);border:none;border-radius:4px;background:none;color:var(--jp-color-text-primary);cursor:pointer;font-size:var(--jp-font-size-sm);line-height:1;white-space:nowrap}._menuBarBtn_16i15_40:hover,._menuBarBtnActive_16i15_57{background:var(--jp-color-surface-secondary)}._menu_16i15_25{position:absolute;top:100%;left:0;margin-top:var(--jp-space-xs);min-width:180px;padding:var(--jp-space-xs) 0;border:1px solid var(--jp-color-border);border-radius:4px;background:var(--jp-color-surface);box-shadow:0 4px 12px #0000001f;z-index:100}._menuItem_16i15_75{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--jp-space-xs) var(--jp-space-md);border:none;background:none;color:var(--jp-color-text-primary);cursor:pointer;font-size:var(--jp-font-size-sm);text-align:left;line-height:1.6}._menuItem_16i15_75:hover{background:var(--jp-color-surface-secondary)}._menuItemDisabled_16i15_94{color:var(--jp-color-text-tertiary);cursor:default}._menuItemDisabled_16i15_94:hover{background:none}._menuSeparator_16i15_103{height:1px;margin:var(--jp-space-xs) 0;background:var(--jp-color-border)}._shortcutHint_16i15_109{margin-left:var(--jp-space-lg);color:var(--jp-color-text-tertiary);font-size:var(--jp-font-size-xs)}._palette_ajcdg_1{border-bottom:1px solid var(--jp-color-border);flex-shrink:0}._header_ajcdg_6{font-weight:600;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);padding:var(--jp-space-sm) 0;text-transform:uppercase;letter-spacing:.5px}._grid_ajcdg_15{display:grid;grid-template-columns:1fr 1fr;gap:var(--jp-space-xs);padding-bottom:var(--jp-space-md)}._item_ajcdg_22{display:flex;align-items:center;gap:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-border-light);border-radius:3px;cursor:grab;-webkit-user-select:none;user-select:none;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-primary);background:var(--jp-color-surface)}._item_ajcdg_22:hover{border-color:var(--jp-color-accent);background:var(--jp-color-surface-secondary)}._item_ajcdg_22:active{cursor:grabbing}._itemAbbr_ajcdg_45{width:16px;text-align:center;flex-shrink:0;font-weight:600;color:var(--jp-color-text-secondary)}._itemLabel_ajcdg_53{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._toolbar_irajw_1{position:absolute;bottom:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:var(--jp-space-xs);padding:var(--jp-space-xs);border:1px solid var(--jp-color-border);border-radius:8px;background:var(--jp-color-surface);box-shadow:0 2px 8px #0000001f;z-index:10;pointer-events:auto}._toolBtn_irajw_18{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid transparent;border-radius:4px;background:none;color:var(--jp-color-text-secondary);cursor:pointer;padding:0}._toolBtn_irajw_18:hover{background:var(--jp-color-surface-secondary);color:var(--jp-color-text-primary)}._toolBtnActive_irajw_37{background:var(--jp-color-accent-light);color:var(--jp-color-accent);border-color:var(--jp-color-accent)}._toolBtnActive_irajw_37:hover{background:var(--jp-color-accent-light)}._separator_irajw_47{width:1px;height:20px;background:var(--jp-color-border);margin:0 var(--jp-space-xs)}._zoomBtn_irajw_54{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--jp-color-border);border-radius:4px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);cursor:pointer;font-size:var(--jp-font-size-md);line-height:1;padding:0}._zoomBtn_irajw_54:hover{background:var(--jp-color-surface-secondary)}._zoomSelect_irajw_74{font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);min-width:48px;text-align:center;border:none;background:none;cursor:pointer;padding:2px 0}._wrapper_1dwyq_1{position:relative;flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}._viewport_1dwyq_10{flex:1;overflow:auto;background:var(--jp-color-canvas-bg)}._grab_1dwyq_16,._grab_1dwyq_16 *{cursor:grab!important}._grabbing_1dwyq_21,._grabbing_1dwyq_21 *{cursor:grabbing!important}._dropActive_xvzfd_1{outline:2px dashed var(--jp-color-accent);outline-offset:-2px}._group_zgox4_1{margin-bottom:var(--jp-space-md)}._header_zgox4_5{display:flex;align-items:center;gap:var(--jp-space-xs);cursor:pointer;-webkit-user-select:none;user-select:none;padding:var(--jp-space-xs) 0;border:none;background:none;width:100%;text-align:left;font-family:var(--jp-font-family);font-size:var(--jp-font-size-sm);font-weight:600;color:var(--jp-color-text-primary)}._header_zgox4_5:hover{color:var(--jp-color-accent)}._chevron_zgox4_26{font-size:var(--jp-font-size-xs);transition:transform .15s ease;flex-shrink:0;width:12px;text-align:center}._chevronOpen_zgox4_34{transform:rotate(90deg)}._content_zgox4_39{padding-top:var(--jp-space-xs)}._field_fr8vv_1{display:flex;align-items:center;gap:var(--jp-space-sm);margin-bottom:var(--jp-space-sm)}._fieldLabel_fr8vv_8{width:var(--jp-field-label-width);flex-shrink:0;text-align:right;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._fieldInput_fr8vv_19{flex:1;min-width:0;height:var(--jp-field-height);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family);color:var(--jp-color-text-primary);background:var(--jp-color-field-bg);border:1px solid var(--jp-color-field-border);border-radius:4px;padding:0 var(--jp-space-sm);box-sizing:border-box;outline:none}._fieldInput_fr8vv_19:focus{border-color:var(--jp-color-field-focus);box-shadow:0 0 0 1px var(--jp-color-field-focus)}._fieldTextarea_fr8vv_39{height:auto;min-height:56px;padding:var(--jp-space-xs) var(--jp-space-sm);resize:vertical}._fieldSelect_fr8vv_47{cursor:pointer}._fieldCheckbox_fr8vv_52{flex:1;min-width:0}._colorRow_fr8vv_57{flex:1;min-width:0;display:flex;align-items:center;gap:var(--jp-space-xs)}._colorSwatch_fr8vv_65{width:24px;height:24px;border:1px solid var(--jp-color-field-border);border-radius:4px;padding:0;cursor:pointer;flex-shrink:0}._colorSwatch_fr8vv_65::-webkit-color-swatch-wrapper{padding:0}._colorSwatch_fr8vv_65::-webkit-color-swatch{border:none;border-radius:3px}._colorText_fr8vv_84{font-family:monospace}._readOnly_fr8vv_89{flex:1;min-width:0;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-tertiary);font-style:italic}._panelHeader_1goij_1{font-size:var(--jp-font-size-md);font-weight:600;color:var(--jp-color-text-primary);margin-bottom:var(--jp-space-md);padding-bottom:var(--jp-space-sm);border-bottom:1px solid var(--jp-color-border-light)}._panelSubheader_1goij_10{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);text-transform:uppercase;letter-spacing:.5px;margin-bottom:var(--jp-space-xs)}._readOnlyLabel_1goij_18{font-size:var(--jp-font-size-sm);color:var(--jp-color-text-tertiary);font-style:italic;padding:var(--jp-space-xs) 0}._deleteBtn_1goij_25{display:block;width:100%;margin-top:var(--jp-space-md);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-danger, #dc3545);border-radius:3px;background:transparent;color:var(--jp-color-danger, #dc3545);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._deleteBtn_1goij_25:hover{background:var(--jp-color-danger, #dc3545);color:#fff}._addBandBtn_1goij_44{display:block;width:100%;margin-top:var(--jp-space-md);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px dashed var(--jp-color-border);border-radius:3px;background:transparent;color:var(--jp-color-text-secondary);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._addBandBtn_1goij_44:hover{background:var(--jp-color-surface-secondary);border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._sidebar_19jut_1{width:var(--jp-sidebar-width);border-left:1px solid var(--jp-color-border);background:var(--jp-color-surface);padding:var(--jp-space-md);display:flex;flex-direction:column;overflow:hidden}._panelArea_19jut_11,._outlinePanel_m3ahv_1{flex:1;overflow-y:auto}._outlineHeader_m3ahv_6{font-weight:600;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light);text-transform:uppercase;letter-spacing:.5px}._outlineBody_m3ahv_16{padding:var(--jp-space-xs) 0}._node_m3ahv_20{display:flex;align-items:center;gap:var(--jp-space-xs);padding:2px var(--jp-space-sm);cursor:pointer;border-radius:3px;margin:0 var(--jp-space-xs);-webkit-user-select:none;user-select:none}._node_m3ahv_20:hover{background:var(--jp-color-surface-secondary)}._nodeSelected_m3ahv_35,._nodeSelected_m3ahv_35:hover{background:var(--jp-color-accent-light)}._nodeLabel_m3ahv_43{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-primary)}._nodeSelected_m3ahv_35 ._nodeLabel_m3ahv_43{color:var(--jp-color-accent)}._nodeType_m3ahv_56{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);flex-shrink:0}._nodeSelected_m3ahv_35 ._nodeType_m3ahv_56{color:var(--jp-color-accent);opacity:.7}._chevron_m3ahv_67{font-size:var(--jp-font-size-xs);width:12px;flex-shrink:0;text-align:center;transition:transform .15s ease;color:var(--jp-color-text-tertiary)}._chevronOpen_m3ahv_76{transform:rotate(90deg)}._chevronSpacer_m3ahv_81{width:12px;flex-shrink:0}._nodeWrapper_m3ahv_88{position:relative}._nodeDragging_m3ahv_92{opacity:.4}._dropLine_m3ahv_96{position:absolute;left:0;right:0;height:2px;background:var(--jp-color-accent);pointer-events:none;z-index:10}._dropLineBefore_m3ahv_106{top:0}._dropLineAfter_m3ahv_110{bottom:0}._dropTargetInside_m3ahv_114{background:var(--jp-color-accent-light);outline:1px dashed var(--jp-color-accent)}._addSectionBtn_m3ahv_121{display:block;width:calc(100% - 2 * var(--jp-space-xs));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px dashed var(--jp-color-border);border-radius:3px;background:transparent;color:var(--jp-color-text-secondary);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._addSectionBtn_m3ahv_121:hover{background:var(--jp-color-surface-secondary);border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._nodePlaceholder_m3ahv_143{opacity:.45;font-style:italic}._addBandInline_m3ahv_148{display:flex;align-items:center;padding:2px var(--jp-space-sm);margin:0 var(--jp-space-xs);border:none;background:transparent;color:var(--jp-color-text-tertiary);font-size:var(--jp-font-size-xs);cursor:pointer}._addBandInline_m3ahv_148:hover{color:var(--jp-color-accent)}._panel_t0057_1{flex:1;display:flex;flex-direction:column;overflow:hidden}._listHeader_t0057_10{font-weight:600;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light);text-transform:uppercase;letter-spacing:.5px}._listBody_t0057_20{flex:1;overflow-y:auto;padding:var(--jp-space-xs) 0}._styleItem_t0057_26{display:flex;align-items:center;gap:var(--jp-space-sm);padding:4px var(--jp-space-sm);cursor:pointer;border-radius:3px;margin:0 var(--jp-space-xs);-webkit-user-select:none;user-select:none}._styleItem_t0057_26:hover{background:var(--jp-color-surface-secondary)}._styleItemSelected_t0057_41,._styleItemSelected_t0057_41:hover{background:var(--jp-color-accent-light)}._swatch_t0057_49{width:24px;height:24px;border-radius:3px;border:1px solid var(--jp-color-border-light);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0;overflow:hidden}._styleName_t0057_63{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-primary)}._usageBadge_t0057_72{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);flex-shrink:0}._addStyleBtn_t0057_78{display:block;width:calc(100% - 2 * var(--jp-space-xs));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px dashed var(--jp-color-border);border-radius:3px;background:transparent;color:var(--jp-color-text-secondary);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._addStyleBtn_t0057_78:hover{background:var(--jp-color-surface-secondary);border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._addInput_t0057_98{display:block;width:calc(100% - 2 * var(--jp-space-xs) - 2 * var(--jp-space-sm));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-accent);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family);outline:none}._editorHeader_t0057_114{display:flex;align-items:center;gap:var(--jp-space-xs);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light)}._backBtn_t0057_122{border:none;background:none;color:var(--jp-color-text-secondary);cursor:pointer;font-size:var(--jp-font-size-md);padding:0;line-height:1}._backBtn_t0057_122:hover{color:var(--jp-color-accent)}._nameInput_t0057_136{flex:1;border:none;border-bottom:1px solid transparent;background:transparent;color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-weight:600;font-family:var(--jp-font-family);outline:none;padding:2px 0}._nameInput_t0057_136:focus{border-bottom-color:var(--jp-color-accent)}._editorBody_t0057_153{flex:1;overflow-y:auto;padding:var(--jp-space-sm) var(--jp-space-md)}._usageLabel_t0057_159{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);padding:0 0 var(--jp-space-sm) 0}._deleteBtn_t0057_165{display:block;width:100%;margin-top:var(--jp-space-md);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-danger, #dc3545);border-radius:3px;background:transparent;color:var(--jp-color-danger, #dc3545);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._deleteBtn_t0057_165:hover{background:var(--jp-color-danger, #dc3545);color:#fff}._emptyState_t0057_184{padding:var(--jp-space-lg) var(--jp-space-md);text-align:center;color:var(--jp-color-text-tertiary);font-size:var(--jp-font-size-sm)}._panel_1xm0z_1{flex:1;display:flex;flex-direction:column;overflow:hidden}._listHeader_1xm0z_10{font-weight:600;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light);text-transform:uppercase;letter-spacing:.5px}._listBody_1xm0z_20{flex:1;overflow-y:auto;padding:var(--jp-space-xs) 0}._emptyState_1xm0z_26{padding:var(--jp-space-lg) var(--jp-space-md);text-align:center;color:var(--jp-color-text-tertiary);font-size:var(--jp-font-size-sm)}._familyGroup_1xm0z_33{padding:var(--jp-space-xs) var(--jp-space-sm)}._familyName_1xm0z_37{font-size:var(--jp-font-size-sm);font-weight:600;color:var(--jp-color-text-primary);padding:2px 0}._variantRow_1xm0z_44{display:flex;align-items:center;justify-content:space-between;padding:2px 0 2px var(--jp-space-md)}._variantLabel_1xm0z_51{font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary)}._deleteVariantBtn_1xm0z_56{border:none;background:none;color:var(--jp-color-text-tertiary);cursor:pointer;font-size:var(--jp-font-size-md);padding:0 4px;line-height:1}._deleteVariantBtn_1xm0z_56:hover{color:var(--jp-color-danger, #dc3545)}._addBtn_1xm0z_70{display:block;width:calc(100% - 2 * var(--jp-space-xs));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px dashed var(--jp-color-border);border-radius:3px;background:transparent;color:var(--jp-color-text-secondary);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._addBtn_1xm0z_70:hover{background:var(--jp-color-surface-secondary);border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._hiddenInput_1xm0z_90{display:none}._formHeader_1xm0z_96{display:flex;align-items:center;gap:var(--jp-space-xs);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light)}._backBtn_1xm0z_104{border:none;background:none;color:var(--jp-color-text-secondary);cursor:pointer;font-size:var(--jp-font-size-md);padding:0;line-height:1}._backBtn_1xm0z_104:hover{color:var(--jp-color-accent)}._headerTitle_1xm0z_118{font-size:var(--jp-font-size-sm);font-weight:600;color:var(--jp-color-text-primary)}._formBody_1xm0z_124{flex:1;overflow-y:auto;padding:var(--jp-space-sm) var(--jp-space-md);display:flex;flex-direction:column;gap:var(--jp-space-sm)}._fieldLabel_1xm0z_133{display:flex;flex-direction:column;gap:2px;font-size:var(--jp-font-size-xs);color:var(--jp-color-text-secondary)}._fieldInput_1xm0z_141,._fieldSelect_1xm0z_142{padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-border);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family)}._fieldInput_1xm0z_141:focus,._fieldSelect_1xm0z_142:focus{outline:none;border-color:var(--jp-color-accent)}._confirmBtn_1xm0z_158{padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-accent);border-radius:3px;background:var(--jp-color-accent);color:#fff;font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center;margin-top:var(--jp-space-xs)}._confirmBtn_1xm0z_158:hover{opacity:.9}._panel_1bzdr_1{flex:1;display:flex;flex-direction:column;overflow:hidden}._listHeader_1bzdr_10{font-weight:600;font-size:var(--jp-font-size-sm);color:var(--jp-color-text-secondary);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light);text-transform:uppercase;letter-spacing:.5px}._listBody_1bzdr_20{flex:1;overflow-y:auto;padding:var(--jp-space-xs) 0}._propertyRow_1bzdr_26{display:flex;align-items:center;gap:var(--jp-space-xs);padding:3px var(--jp-space-sm);cursor:pointer;border-radius:3px;margin:0 var(--jp-space-xs);-webkit-user-select:none;user-select:none;font-size:var(--jp-font-size-sm)}._propertyRow_1bzdr_26:hover{background:var(--jp-color-surface-secondary)}._expandToggle_1bzdr_42{width:16px;height:16px;display:flex;align-items:center;justify-content:center;border:none;background:none;color:var(--jp-color-text-tertiary);cursor:pointer;padding:0;font-size:10px;flex-shrink:0}._expandToggle_1bzdr_42:hover{color:var(--jp-color-text-primary)}._expandPlaceholder_1bzdr_61{width:16px;flex-shrink:0}._propertyName_1bzdr_66{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--jp-color-text-primary)}._typeBadge_1bzdr_74{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);background:var(--jp-color-surface-secondary);padding:1px 5px;border-radius:3px;flex-shrink:0}._requiredDot_1bzdr_83{width:5px;height:5px;border-radius:50%;background:var(--jp-color-accent);flex-shrink:0}._addBtn_1bzdr_91{display:block;width:calc(100% - 2 * var(--jp-space-xs));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px dashed var(--jp-color-border);border-radius:3px;background:transparent;color:var(--jp-color-text-secondary);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._addBtn_1bzdr_91:hover{background:var(--jp-color-surface-secondary);border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._addInput_1bzdr_111{display:block;width:calc(100% - 2 * var(--jp-space-xs) - 2 * var(--jp-space-sm));margin:var(--jp-space-xs);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-accent);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family);outline:none}._emptyState_1bzdr_125{padding:var(--jp-space-lg) var(--jp-space-md);text-align:center;color:var(--jp-color-text-tertiary);font-size:var(--jp-font-size-sm)}._editorHeader_1bzdr_134{display:flex;align-items:center;gap:var(--jp-space-xs);padding:var(--jp-space-sm) var(--jp-space-md);border-bottom:1px solid var(--jp-color-border-light)}._backBtn_1bzdr_142{border:none;background:none;color:var(--jp-color-text-secondary);cursor:pointer;font-size:var(--jp-font-size-md);padding:0;line-height:1}._backBtn_1bzdr_142:hover{color:var(--jp-color-accent)}._nameInput_1bzdr_156{flex:1;border:none;border-bottom:1px solid transparent;background:transparent;color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-weight:600;font-family:var(--jp-font-family);outline:none;padding:2px 0}._nameInput_1bzdr_156:focus{border-bottom-color:var(--jp-color-accent)}._editorBody_1bzdr_173{flex:1;overflow-y:auto;padding:var(--jp-space-sm) var(--jp-space-md)}._fieldGroup_1bzdr_179{margin-bottom:var(--jp-space-sm)}._fieldLabel_1bzdr_183{display:block;font-size:var(--jp-font-size-xs);color:var(--jp-color-text-secondary);margin-bottom:2px}._fieldInput_1bzdr_190{width:100%;padding:4px var(--jp-space-xs);border:1px solid var(--jp-color-border);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family);outline:none;box-sizing:border-box}._fieldInput_1bzdr_190:focus{border-color:var(--jp-color-accent)}._fieldSelect_1bzdr_207{width:100%;padding:4px var(--jp-space-xs);border:1px solid var(--jp-color-border);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-family);outline:none;box-sizing:border-box}._fieldSelect_1bzdr_207:focus{border-color:var(--jp-color-accent)}._fieldTextarea_1bzdr_224{width:100%;padding:4px var(--jp-space-xs);border:1px solid var(--jp-color-border);border-radius:3px;background:var(--jp-color-surface);color:var(--jp-color-text-primary);font-size:var(--jp-font-size-sm);font-family:var(--jp-font-mono);outline:none;box-sizing:border-box;resize:vertical;min-height:60px}._fieldTextarea_1bzdr_224:focus{border-color:var(--jp-color-accent)}._checkboxRow_1bzdr_243{display:flex;align-items:center;gap:var(--jp-space-xs);font-size:var(--jp-font-size-sm);color:var(--jp-color-text-primary);cursor:pointer;margin-bottom:var(--jp-space-sm)}._sectionLabel_1bzdr_253{font-size:var(--jp-font-size-xs);font-weight:600;color:var(--jp-color-text-secondary);text-transform:uppercase;letter-spacing:.5px;margin:var(--jp-space-md) 0 var(--jp-space-xs) 0}._childInfo_1bzdr_262{font-size:var(--jp-font-size-xs);color:var(--jp-color-text-tertiary);padding:0 0 var(--jp-space-sm) 0}._deleteBtn_1bzdr_268{display:block;width:100%;margin-top:var(--jp-space-md);padding:var(--jp-space-xs) var(--jp-space-sm);border:1px solid var(--jp-color-danger, #dc3545);border-radius:3px;background:transparent;color:var(--jp-color-danger, #dc3545);font-size:var(--jp-font-size-sm);cursor:pointer;text-align:center}._deleteBtn_1bzdr_268:hover{background:var(--jp-color-danger, #dc3545);color:#fff}._sidebar_1t3i2_1{width:var(--jp-sidebar-width);border-right:1px solid var(--jp-color-border);background:var(--jp-color-surface);flex-shrink:0;display:flex;flex-direction:column;overflow:hidden}._tabRow_1t3i2_11{display:flex;align-items:stretch;height:32px;border-bottom:1px solid var(--jp-color-border);flex-shrink:0}._tab_1t3i2_11{display:flex;align-items:center;justify-content:center;flex:1;padding:0 var(--jp-space-md);border:none;border-bottom:2px solid transparent;background:none;color:var(--jp-color-text-secondary);cursor:pointer;font-family:var(--jp-font-family);font-size:var(--jp-font-size-sm);font-weight:500}._tab_1t3i2_11:hover{color:var(--jp-color-text-primary);background:var(--jp-color-surface-secondary)}._tabActive_1t3i2_40{color:var(--jp-color-accent);border-bottom-color:var(--jp-color-accent)}._tabContent_1t3i2_45{flex:1;overflow:hidden;display:flex;flex-direction:column}._tabBar_44yfz_1{display:flex;align-items:stretch;height:36px;border-top:1px solid var(--jp-color-border);background:var(--jp-color-surface)}._tab_44yfz_1{display:flex;align-items:center;justify-content:center;padding:0 var(--jp-space-lg);border:none;border-top:2px solid transparent;background:none;color:var(--jp-color-text-secondary);cursor:pointer;font-family:var(--jp-font-family);font-size:var(--jp-font-size-sm);font-weight:500}._tab_44yfz_1:hover{color:var(--jp-color-text-primary);background:var(--jp-color-surface-secondary)}._tab_44yfz_1._active_44yfz_29{color:var(--jp-color-accent);border-top-color:var(--jp-color-accent)}._layout_1dexk_1{display:flex;flex:1;overflow:hidden}._left_1dexk_7{display:flex;flex-direction:column;width:400px;min-width:300px;border-right:1px solid var(--jp-color-border)}._toolbar_1dexk_15{display:flex;align-items:center;justify-content:space-between;height:var(--jp-toolbar-height);padding:0 var(--jp-space-md);border-bottom:1px solid var(--jp-color-border);background:var(--jp-color-surface)}._label_1dexk_25{font-size:var(--jp-font-size-sm);font-weight:600;color:var(--jp-color-text-secondary);text-transform:uppercase;letter-spacing:.05em}._toolbarActions_1dexk_33{display:flex;align-items:center;gap:var(--jp-space-xs)}._defaultBtn_1dexk_39{display:flex;align-items:center;justify-content:center;height:28px;padding:0 var(--jp-space-md);border:1px solid var(--jp-color-border);border-radius:4px;background:var(--jp-color-surface);color:var(--jp-color-text-secondary);cursor:pointer;font-size:var(--jp-font-size-sm);font-weight:500;line-height:1;white-space:nowrap}._defaultBtn_1dexk_39:hover{border-color:var(--jp-color-accent);color:var(--jp-color-accent)}._renderBtn_1dexk_61{display:flex;align-items:center;justify-content:center;height:28px;padding:0 var(--jp-space-lg);border:none;border-radius:4px;background:var(--jp-color-accent);color:#fff;cursor:pointer;font-size:var(--jp-font-size-sm);font-weight:600;line-height:1;white-space:nowrap}._renderBtn_1dexk_61:hover{opacity:.9}._renderBtn_1dexk_61:disabled{opacity:.5;cursor:not-allowed}._editorWrapper_1dexk_87,._right_1dexk_92{flex:1;overflow:hidden}._viewer_z4wpx_1{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:var(--jp-color-surface-secondary)}._message_z4wpx_10{font-size:var(--jp-font-size-md);color:var(--jp-color-text-tertiary);text-align:center;padding:var(--jp-space-xl)}._error_z4wpx_17{max-width:80%;padding:var(--jp-space-lg);border:1px solid #ef4444;border-radius:4px;background:#fef2f2;color:#991b1b;font-size:var(--jp-font-size-sm);overflow:auto;max-height:80%}._error_z4wpx_17 pre{margin:0;white-space:pre-wrap;word-break:break-word;font-family:monospace}._iframe_z4wpx_36{width:100%;height:100%;border:none}._layout_1ll6n_1{display:flex;flex:1;overflow:hidden}._left_1ll6n_7{display:flex;flex-direction:column;width:33.333%;min-width:280px;border-right:1px solid var(--jp-color-border)}._toolbar_1ll6n_15{display:flex;align-items:center;justify-content:space-between;height:var(--jp-toolbar-height);padding:0 var(--jp-space-md);border-bottom:1px solid var(--jp-color-border);background:var(--jp-color-surface)}._label_1ll6n_25{font-size:var(--jp-font-size-sm);font-weight:600;color:var(--jp-color-text-secondary);text-transform:uppercase;letter-spacing:.05em}._editorWrapper_1ll6n_33{flex:1;overflow:hidden}._right_1ll6n_38{display:flex;flex-direction:column;flex:1;overflow:hidden}._error_1ll6n_45{padding:4px var(--jp-space-md);background:var(--jp-color-error-bg, #fef2f2);color:var(--jp-color-error, #dc2626);font-size:var(--jp-font-size-sm);white-space:pre-wrap;overflow:auto;max-height:100px;border-bottom:1px solid var(--jp-color-border)}._shell_nstdu_1{display:flex;flex-direction:column;height:100%;font-family:var(--jp-font-family);color:var(--jp-color-text-primary);background:var(--jp-color-surface)}._content_nstdu_10,._main_nstdu_16{display:flex;flex:1;overflow:hidden}
|