@bambamboole/pdf-ua-template-builder 0.1.1 → 0.3.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.
Files changed (71) hide show
  1. package/README.md +119 -17
  2. package/dist/index.js +6330 -5187
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/builder/Builder.d.ts +7 -0
  5. package/dist/{builder → src/builder}/TemplateBuilder.d.ts +10 -13
  6. package/dist/src/builder/blocks/Palette.d.ts +7 -0
  7. package/dist/src/builder/canvas/BlockDataPreview.d.ts +7 -0
  8. package/dist/{builder → src/builder}/canvas/BuilderCanvas.d.ts +8 -4
  9. package/dist/src/builder/canvas/Canvas.d.ts +4 -0
  10. package/dist/{builder → src/builder}/canvas/ColumnResizer.d.ts +2 -1
  11. package/dist/{builder → src/builder}/canvas/PageSheet.d.ts +3 -1
  12. package/dist/{builder → src/builder}/canvas/SortableBlock.d.ts +7 -5
  13. package/dist/src/builder/canvas/columns.d.ts +13 -0
  14. package/dist/src/builder/context/BuilderContext.d.ts +66 -0
  15. package/dist/src/builder/controls/AlignSelect.d.ts +7 -0
  16. package/dist/src/builder/controls/BuilderField.d.ts +74 -0
  17. package/dist/src/builder/controls/Field.d.ts +6 -0
  18. package/dist/src/builder/controls/fieldConverters.d.ts +4 -0
  19. package/dist/src/builder/controls/index.d.ts +7 -0
  20. package/dist/src/builder/controls/inputs.d.ts +5 -0
  21. package/dist/src/builder/hooks/useBuilderDragDrop.d.ts +24 -0
  22. package/dist/src/builder/inspector/BlockContentControls.d.ts +9 -0
  23. package/dist/src/builder/inspector/BlockInspector.d.ts +14 -0
  24. package/dist/src/builder/inspector/BlockLayoutControls.d.ts +7 -0
  25. package/dist/src/builder/inspector/DocumentSettings.d.ts +18 -0
  26. package/dist/src/builder/inspector/Inspector.d.ts +1 -0
  27. package/dist/src/builder/inspector/InspectorShell.d.ts +17 -0
  28. package/dist/src/builder/inspector/PageSettings.d.ts +4 -0
  29. package/dist/src/builder/inspector/SpacingControls.d.ts +15 -0
  30. package/dist/src/builder/inspector/TypographyControls.d.ts +19 -0
  31. package/dist/src/builder/inspector/alignOptions.d.ts +10 -0
  32. package/dist/src/builder/inspector/editors/ImageBlockEditor.d.ts +3 -0
  33. package/dist/src/builder/inspector/editors/KeyValueBlockEditor.d.ts +11 -0
  34. package/dist/src/builder/inspector/editors/SortableList.d.ts +7 -0
  35. package/dist/src/builder/inspector/editors/SortableRow.d.ts +10 -0
  36. package/dist/src/builder/inspector/editors/TableBlockEditor.d.ts +20 -0
  37. package/dist/src/builder/inspector/editors/blockEditors.d.ts +7 -0
  38. package/dist/src/builder/lib/records.d.ts +4 -0
  39. package/dist/src/builder/lib/sensors.d.ts +1 -0
  40. package/dist/src/builder/primitives/Button.d.ts +10 -0
  41. package/dist/src/builder/primitives/Chip.d.ts +7 -0
  42. package/dist/{builder → src/builder}/schema/schemaAdapter.d.ts +2 -5
  43. package/dist/src/builder/state/configUpdates.d.ts +23 -0
  44. package/dist/src/builder/state/dragDrop.d.ts +17 -0
  45. package/dist/{builder → src/builder}/state/editorModel.d.ts +5 -0
  46. package/dist/src/builder/state/editorReducer.d.ts +71 -0
  47. package/dist/src/editor/CodeEditor.d.ts +4 -0
  48. package/dist/src/editor/TemplateEditor.d.ts +23 -0
  49. package/dist/src/editor/TemplateEditorContext.d.ts +20 -0
  50. package/dist/src/editor/editorTheme.d.ts +1 -0
  51. package/dist/src/editor/parseTemplate.d.ts +6 -0
  52. package/dist/src/editor/templateSchema.d.ts +1 -0
  53. package/dist/{index.d.ts → src/index.d.ts} +12 -0
  54. package/dist/src/render/PdfPane.d.ts +14 -0
  55. package/dist/src/render/Preview.d.ts +4 -0
  56. package/dist/src/render/RenderContext.d.ts +17 -0
  57. package/dist/src/render/usePdfUaApi.d.ts +19 -0
  58. package/dist/{types → src/types}/template.d.ts +5 -1
  59. package/dist/style.css +3 -1
  60. package/package.json +22 -9
  61. package/dist/builder/canvas/columns.d.ts +0 -4
  62. package/dist/builder/forms/InlineBlockForm.d.ts +0 -9
  63. package/dist/builder/pdf/PdfPane.d.ts +0 -8
  64. package/dist/builder/topbar/BuilderTopbar.d.ts +0 -17
  65. /package/dist/{api → src/api}/pdfUaApi.d.ts +0 -0
  66. /package/dist/{builder → src/builder}/blocks/BlockPalette.d.ts +0 -0
  67. /package/dist/{builder → src/builder}/blocks/blockChrome.d.ts +0 -0
  68. /package/dist/{builder → src/builder}/canvas/BlockCardPreview.d.ts +0 -0
  69. /package/dist/{builder → src/builder}/lib/displayScale.d.ts +0 -0
  70. /package/dist/{builder → src/builder}/lib/pageSizes.d.ts +0 -0
  71. /package/dist/{builder → src/builder}/schema/invoiceExample.d.ts +0 -0
@@ -0,0 +1,23 @@
1
+ import { Block, BlockConfig, DividerConfig, HeadingConfig, ImageConfig, KeyValueConfig, SpacingConfig, SpacerConfig, TableConfig, Template, TypographyConfig } from '../../types/generated/template';
2
+ type EmptyConfigValue = "" | null | undefined;
3
+ type BlockType = Block["type"];
4
+ type BlockByType<TType extends BlockType> = Extract<Block, {
5
+ type: TType;
6
+ }>;
7
+ type BlockConfigByType = {
8
+ text: BlockConfig;
9
+ html: BlockConfig;
10
+ heading: HeadingConfig;
11
+ image: ImageConfig;
12
+ "key-value": KeyValueConfig;
13
+ spacer: SpacerConfig;
14
+ divider: DividerConfig;
15
+ table: TableConfig;
16
+ };
17
+ type BlockConfigFor<TType extends BlockType> = BlockConfigByType[TType];
18
+ export declare function setBlockConfigField<TType extends BlockType, TKey extends keyof BlockConfigFor<TType>>(block: BlockByType<TType>, field: TKey, value: BlockConfigFor<TType>[TKey] | EmptyConfigValue): BlockByType<TType>;
19
+ export declare function setBlockTypographyField<TType extends BlockType, TKey extends keyof TypographyConfig>(block: BlockByType<TType>, field: TKey, value: TypographyConfig[TKey] | EmptyConfigValue): BlockByType<TType>;
20
+ export declare function setBlockSpacingField<TType extends BlockType, TKey extends keyof SpacingConfig>(block: BlockByType<TType>, field: TKey, value: SpacingConfig[TKey] | EmptyConfigValue): BlockByType<TType>;
21
+ export declare function setTemplateTypographyField<TKey extends keyof TypographyConfig>(template: Template, field: TKey, value: TypographyConfig[TKey] | EmptyConfigValue): Template;
22
+ export declare function setTemplatePageMargin<TKey extends keyof SpacingConfig>(template: Template, field: TKey, value: SpacingConfig[TKey] | EmptyConfigValue): Template;
23
+ export {};
@@ -0,0 +1,17 @@
1
+ import { UniqueIdentifier } from '@dnd-kit/core';
2
+ import { EditorArea, EditorModel } from './editorModel';
3
+ export interface DragData {
4
+ source?: string;
5
+ type?: string;
6
+ rowUid?: string;
7
+ blockUid?: string;
8
+ area?: EditorArea;
9
+ }
10
+ export interface DropTarget {
11
+ rowUid: string | null;
12
+ index: number;
13
+ area: EditorArea;
14
+ }
15
+ export declare function getDragData(value: unknown): DragData;
16
+ export declare function getDropTarget(model: EditorModel, overId: UniqueIdentifier | undefined, overData: DragData): DropTarget;
17
+ export declare function getRowIndex(model: EditorModel, overId: UniqueIdentifier | undefined, overData: DragData): number | null;
@@ -27,6 +27,7 @@ export declare function removeBlock(model: EditorModel, blockUid: string): Edito
27
27
  export declare function moveBlock(model: EditorModel, blockUid: string, rowUid: string | null, index: number, area?: EditorArea): EditorModel;
28
28
  export declare function moveRow(model: EditorModel, rowUid: string, index: number): EditorModel;
29
29
  export declare function updateBlock(model: EditorModel, blockUid: string, block: Block): EditorModel;
30
+ export declare function updateTemplateSettings(model: EditorModel, template: Template): EditorModel;
30
31
  export declare function getPageSize(model: EditorModel): ResolvedPageSize;
31
32
  export declare function setPageSize(model: EditorModel, format: PageFormat, orientation: Orientation): EditorModel;
32
33
  export declare function setRowWidths(model: EditorModel, rowUid: string, widths: string[]): EditorModel;
@@ -34,3 +35,7 @@ export declare function getFooterRepeat(model: EditorModel): boolean;
34
35
  export declare function setFooterRepeat(model: EditorModel, repeat: boolean): EditorModel;
35
36
  export declare function getPageNumbers(model: EditorModel): PageNumbersValue;
36
37
  export declare function setPageNumbers(model: EditorModel, value: PageNumbersValue): EditorModel;
38
+ export declare function findEditorBlock(model: EditorModel, blockUid: string): EditorBlock | undefined;
39
+ export declare function resolveSelectedEditorBlock(model: EditorModel, blockUid: string | null): EditorBlock | null;
40
+ export declare function reconcileSelectedBlockUid(model: EditorModel, blockUid: string | null): string | null;
41
+ export declare function createNextBlockId(model: EditorModel, blockType: string): string;
@@ -0,0 +1,71 @@
1
+ import { UniqueIdentifier } from '@dnd-kit/core';
2
+ import { Block, Orientation, PageFormat, Template } from '../../types/generated/template';
3
+ import { JsonSchemaObject, TemplateData } from '../../types/template';
4
+ import { DragData } from './dragDrop';
5
+ import { EditorModel, PageNumbersValue } from './editorModel';
6
+ export interface EditorState {
7
+ model: EditorModel;
8
+ data: TemplateData;
9
+ selectedBlockUid: string | null;
10
+ }
11
+ export type EditorAction = {
12
+ type: "selectBlock";
13
+ blockUid: string;
14
+ } | {
15
+ type: "deselect";
16
+ } | {
17
+ type: "changeBlock";
18
+ blockUid: string;
19
+ block: Block;
20
+ } | {
21
+ type: "removeBlock";
22
+ blockUid: string;
23
+ } | {
24
+ type: "changeTemplateSettings";
25
+ template: Template;
26
+ } | {
27
+ type: "setRowWidths";
28
+ rowUid: string;
29
+ widths: string[];
30
+ } | {
31
+ type: "addBlock";
32
+ schema: JsonSchemaObject;
33
+ blockType: string;
34
+ } | {
35
+ type: "setFormat";
36
+ format: PageFormat;
37
+ } | {
38
+ type: "setOrientation";
39
+ orientation: Orientation;
40
+ } | {
41
+ type: "setFooterRepeat";
42
+ repeat: boolean;
43
+ } | {
44
+ type: "setPageNumbers";
45
+ value: PageNumbersValue;
46
+ } | {
47
+ type: "setData";
48
+ data: TemplateData;
49
+ } | {
50
+ type: "loadExample";
51
+ template: Template;
52
+ data: TemplateData;
53
+ } | {
54
+ type: "dropFromPalette";
55
+ schema: JsonSchemaObject;
56
+ blockType: string;
57
+ overId?: UniqueIdentifier;
58
+ overData: DragData;
59
+ } | {
60
+ type: "moveRowTo";
61
+ rowUid: string;
62
+ overId?: UniqueIdentifier;
63
+ overData: DragData;
64
+ } | {
65
+ type: "moveBlockTo";
66
+ blockUid: string;
67
+ overId?: UniqueIdentifier;
68
+ overData: DragData;
69
+ };
70
+ export declare function createEditorState(template: Template, data: TemplateData): EditorState;
71
+ export declare function editorReducer(state: EditorState, action: EditorAction): EditorState;
@@ -0,0 +1,4 @@
1
+ export interface CodeEditorProps {
2
+ className?: string;
3
+ }
4
+ export declare function CodeEditor({ className }?: CodeEditorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,23 @@
1
+ import { Template } from '../types/generated/template';
2
+ import { TemplateData } from '../types/template';
3
+ export interface TemplateEditorProps {
4
+ /** Base URL of a running pdf-ua-api instance. Defaults to "" (relative URLs / proxy). */
5
+ apiUrl?: string;
6
+ /** Template seeded into the editor as pretty-printed JSON on first render. */
7
+ initialTemplate?: Template;
8
+ /** Runtime data keyed by block id, passed through to render. */
9
+ data?: TemplateData;
10
+ /** Fires on every edit; `template` is null while the JSON is invalid. */
11
+ onChange?: (template: Template | null, text: string) => void;
12
+ /** Fires after a successful render with the produced PDF blob. */
13
+ onRendered?: (pdf: Blob) => void;
14
+ /** Optional className appended to the root element. */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * All-in-one preset: a JSON template editor and a rendered-PDF preview side by side.
19
+ *
20
+ * For custom layouts, compose directly with `TemplateEditorProvider`, `CodeEditor`,
21
+ * and `Preview`.
22
+ */
23
+ export declare function TemplateEditor({ apiUrl, initialTemplate, data, onChange, onRendered, className, }?: TemplateEditorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from 'react';
2
+ import { Template } from '../types/generated/template';
3
+ import { TemplateData } from '../types/template';
4
+ export interface TemplateEditorProviderProps {
5
+ apiUrl?: string;
6
+ initialTemplate?: Template;
7
+ data?: TemplateData;
8
+ onChange?: (template: Template | null, text: string) => void;
9
+ onRendered?: (pdf: Blob) => void;
10
+ children: ReactNode;
11
+ }
12
+ export interface TemplateEditorContextValue {
13
+ text: string;
14
+ setText: (text: string) => void;
15
+ template: Template | null;
16
+ error: string | null;
17
+ data: TemplateData;
18
+ }
19
+ export declare function useTemplateEditor(): TemplateEditorContextValue;
20
+ export declare function TemplateEditorProvider({ apiUrl: apiUrlProp, initialTemplate, data, onChange, onRendered, children, }: TemplateEditorProviderProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const editorTheme: import('@codemirror/state').Extension[];
@@ -0,0 +1,6 @@
1
+ import { Template } from '../types/generated/template';
2
+ export interface ParsedTemplate {
3
+ template: Template | null;
4
+ error: string | null;
5
+ }
6
+ export declare function parseTemplate(text: string): ParsedTemplate;
@@ -0,0 +1 @@
1
+ export declare const templateSchema: Record<string, unknown>;
@@ -1,11 +1,23 @@
1
1
  export { TemplateBuilder } from './builder/TemplateBuilder';
2
2
  export type { TemplateBuilderProps } from './builder/TemplateBuilder';
3
+ export { Builder } from './builder/Builder';
4
+ export type { BuilderProps } from './builder/Builder';
5
+ export { Preview } from './render/Preview';
6
+ export type { PreviewProps } from './render/Preview';
7
+ export { TemplateBuilderProvider, useTemplateBuilder } from './builder/context/BuilderContext';
8
+ export type { TemplateBuilderProviderProps, BuilderContextValue, TemplateExample, } from './builder/context/BuilderContext';
3
9
  export { createInvoiceExample } from './builder/schema/invoiceExample';
4
10
  export type { InvoiceExample, InvoiceData, TableRow } from './builder/schema/invoiceExample';
5
11
  export { PAGE_SIZES_MM, pageSizeForFormat } from './builder/lib/pageSizes';
6
12
  export { mmToPx } from './builder/lib/displayScale';
7
13
  export { createEditorModel, serializeTemplate, getPageSize, setPageSize, getFooterRepeat, setFooterRepeat, getPageNumbers, setPageNumbers, } from './builder/state/editorModel';
8
14
  export type { EditorArea, EditorBlock, EditorModel, EditorRow, PageNumbersValue, ResolvedPageSize, } from './builder/state/editorModel';
15
+ export { TemplateEditor } from './editor/TemplateEditor';
16
+ export type { TemplateEditorProps } from './editor/TemplateEditor';
17
+ export { CodeEditor } from './editor/CodeEditor';
18
+ export type { CodeEditorProps } from './editor/CodeEditor';
19
+ export { TemplateEditorProvider, useTemplateEditor, } from './editor/TemplateEditorContext';
20
+ export type { TemplateEditorProviderProps, TemplateEditorContextValue, } from './editor/TemplateEditorContext';
9
21
  export { fetchTemplateSchema, renderTemplatePdf, resolveDefaultApiUrl } from './api/pdfUaApi';
10
22
  export type { TemplateData, TemplateSchemaResponse } from './types/template';
11
23
  export type { Align, Block, HeadingBlock, ImageBlock, KeyValueBlock, Orientation, PageConfig, PageFormat, PageSize, Row, SpacerBlock, TableBlock, Template, TextBlock, } from './types/generated/template';
@@ -0,0 +1,14 @@
1
+ import { Template } from '../types/generated/template';
2
+ import { TemplateData } from '../types/template';
3
+ export type OutputTab = "pdf" | "data";
4
+ export interface PdfPaneProps {
5
+ pdfUrl: string | null;
6
+ error: string | null;
7
+ loading: boolean;
8
+ template?: Template;
9
+ data?: TemplateData;
10
+ className?: string;
11
+ onRender?: () => void;
12
+ renderDisabled?: boolean;
13
+ }
14
+ export declare function PdfPane({ pdfUrl, error, loading, template, data, className, onRender, renderDisabled, }: PdfPaneProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export interface PreviewProps {
2
+ className?: string;
3
+ }
4
+ export declare function Preview({ className }?: PreviewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ import { Template } from '../types/generated/template';
3
+ import { TemplateData } from '../types/template';
4
+ export interface RenderContextValue {
5
+ template: Template | null;
6
+ data: TemplateData;
7
+ pdfUrl: string | null;
8
+ pdfLoading: boolean;
9
+ error: string | null;
10
+ renderPdf: () => void;
11
+ renderDisabled: boolean;
12
+ }
13
+ export declare function RenderProvider({ value, children, }: {
14
+ value: RenderContextValue;
15
+ children: ReactNode;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ export declare function useRenderContext(): RenderContextValue;
@@ -0,0 +1,19 @@
1
+ import { Template } from '../types/generated/template';
2
+ import { TemplateData, TemplateSchemaResponse } from '../types/template';
3
+ interface UsePdfUaApiOptions {
4
+ initialApiUrl: string;
5
+ apiUrl: string;
6
+ onRendered?: (pdf: Blob) => void;
7
+ loadSchemaOnMount?: boolean;
8
+ }
9
+ interface PdfUaApi {
10
+ schema: TemplateSchemaResponse | null;
11
+ schemaLoading: boolean;
12
+ pdfUrl: string | null;
13
+ pdfLoading: boolean;
14
+ error: string | null;
15
+ loadSchema: (url: string) => Promise<void>;
16
+ renderPdf: (template: Template, data: TemplateData) => Promise<void>;
17
+ }
18
+ export declare function usePdfUaApi({ initialApiUrl, apiUrl, onRendered, loadSchemaOnMount, }: UsePdfUaApiOptions): PdfUaApi;
19
+ export {};
@@ -1,6 +1,10 @@
1
1
  export type { Template } from './generated/template';
2
2
  export type JsonObject = Record<string, unknown>;
3
3
  export type TemplateData = Record<string, unknown>;
4
+ export type JsonSchemaValue = string | number | boolean | null | JsonSchemaObject | JsonSchemaValue[];
5
+ export interface JsonSchemaObject {
6
+ [key: string]: unknown;
7
+ }
4
8
  export interface RenderOptions {
5
9
  title?: string;
6
10
  baseUrl?: string;
@@ -21,7 +25,7 @@ export interface TemplateSchemaMetadata {
21
25
  blockOrder: string[];
22
26
  pageFormats: TemplatePageFormat[];
23
27
  }
24
- export interface TemplateSchemaResponse {
28
+ export interface TemplateSchemaResponse extends JsonSchemaObject {
25
29
  $schema?: string;
26
30
  $id?: string;
27
31
  title?: string;
package/dist/style.css CHANGED
@@ -1 +1,3 @@
1
- :root{--bg: #fafaf9;--surface: #ffffff;--surface-2: #f4f4f3;--surface-sunk: #eeeeec;--border: #eaeaea;--border-strong: #d4d4d2;--border-focus: #4f46e5;--ink: #1a1a1a;--ink-muted: #6b6b6b;--ink-subtle: #9a9a98;--accent: #2e2e2e;--accent-ink: #ffffff;--accent-hover: #0a0a0a;--indigo: #4f46e5;--indigo-soft: #eef0ff;--danger: #b42318;--danger-soft: #fff4f2;--font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--text-xs: 11px;--text-sm: 12px;--text-base: 14px;--text-md: 15px;--text-lg: 17px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--space-6: 32px;--radius-sm: 4px;--radius: 6px;--radius-md: 8px;--radius-lg: 12px;--shadow-page: 0 1px 2px rgba(0, 0, 0, .04), 0 8px 24px -12px rgba(0, 0, 0, .1);--shadow-drag: 0 12px 24px -8px rgba(0, 0, 0, .18);--shadow-pop: 0 4px 12px -4px rgba(0, 0, 0, .12);--ease: cubic-bezier(.2, .8, .2, 1);--dur-fast: .12s;--dur: .2s;--dur-slow: .28s;color:var(--ink);background:var(--bg);font-family:var(--font-sans);font-size:var(--text-base);font-synthesis:none;text-rendering:optimizeLegibility}*{box-sizing:border-box}html{min-width:320px;min-height:100%}body{min-width:320px;min-height:100vh;margin:0}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--indigo);font-weight:500;text-decoration:none}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px;border-radius:var(--radius-sm)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{transition-duration:.001ms!important;animation-duration:.001ms!important}}.template-builder-page{display:grid;min-height:100vh;grid-template-columns:minmax(40rem,1.55fr) minmax(28rem,.95fr);background:var(--bg);color:var(--ink)}.template-builder-page__authoring{display:grid;min-width:0;min-height:100vh;grid-template-columns:220px minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);border-right:1px solid var(--border);background:var(--bg)}.builder-topbar{display:flex;grid-column:1 / -1;min-width:0;align-items:center;gap:var(--space-3);height:56px;border-bottom:1px solid var(--border);background:var(--surface);padding:0 var(--space-4)}.builder-topbar__brand{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-lg);font-weight:600;color:var(--ink);letter-spacing:-.01em;white-space:nowrap}.builder-topbar__brand-mark{display:inline-grid;width:22px;height:22px;place-items:center;border-radius:var(--radius-sm);background:var(--accent);color:var(--accent-ink);font-size:11px;font-weight:600;letter-spacing:0}.builder-topbar__brand-sub{color:var(--ink-muted);font-size:var(--text-md);font-weight:500}.builder-topbar__spacer{flex:1 1 auto}.builder-topbar__group{display:flex;align-items:center;gap:var(--space-2)}.builder-topbar__settings{position:relative}.builder-topbar__settings-panel{position:absolute;top:calc(100% + var(--space-2));right:0;display:grid;width:320px;gap:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-pop);padding:var(--space-3);z-index:10}.builder-topbar__settings-panel label{display:grid;gap:var(--space-1);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.04em}.builder-input,.builder-select{height:32px;min-width:0;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--ink);padding:0 var(--space-3);transition:border-color var(--dur-fast) var(--ease)}.builder-input:hover,.builder-select:hover{border-color:var(--border-strong)}.builder-input:focus-visible,.builder-select:focus-visible{outline:none;border-color:var(--border-focus);box-shadow:0 0 0 3px #4f46e52e}.builder-select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--ink-muted) 50%),linear-gradient(135deg,var(--ink-muted) 50%,transparent 50%);background-position:calc(100% - 14px) 50%,calc(100% - 9px) 50%;background-size:5px 5px;background-repeat:no-repeat;padding-right:26px}.builder-button{display:inline-flex;height:32px;align-items:center;gap:var(--space-2);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--ink);cursor:pointer;font-weight:500;padding:0 var(--space-3);white-space:nowrap;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}.builder-button:hover{background:var(--surface-2);border-color:var(--border-strong)}.builder-button:disabled{color:var(--ink-subtle);background:var(--surface);cursor:not-allowed}.builder-button--primary{border-color:var(--accent);background:var(--accent);color:var(--accent-ink);font-weight:600}.builder-button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.builder-button--primary:disabled{border-color:var(--border-strong);background:var(--surface-2);color:var(--ink-subtle)}.builder-button--ghost{border-color:transparent;background:transparent}.builder-button--ghost:hover{background:var(--surface-2);border-color:var(--border)}.builder-button--icon{width:32px;padding:0;justify-content:center}.builder-button--danger{color:var(--danger)}.builder-button--danger:hover{background:var(--danger-soft);border-color:var(--danger)}.builder-palette{grid-column:1;grid-row:2;display:flex;min-width:0;min-height:0;flex-direction:column;gap:var(--space-5);overflow:auto;border-right:1px solid var(--border);background:var(--surface);padding:var(--space-4)}.builder-palette__section-title{margin:0 0 var(--space-2);color:var(--ink-subtle);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.06em}.builder-palette__list{display:grid;gap:var(--space-1)}.builder-palette__item{display:flex;width:100%;align-items:center;gap:var(--space-3);border:1px solid transparent;border-radius:var(--radius);background:transparent;color:var(--ink);cursor:grab;font-size:var(--text-sm);font-weight:500;padding:var(--space-2) var(--space-2);text-align:left;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}.builder-palette__item:hover{background:var(--surface-2);border-color:var(--border)}.builder-palette__item:active{cursor:grabbing;background:var(--surface-2);transform:scale(.98)}.builder-palette__settings{display:grid;gap:var(--space-3)}.builder-palette__field{display:grid;gap:var(--space-1);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.04em}.builder-chip{display:inline-grid;width:22px;height:22px;flex:0 0 22px;place-items:center;border-radius:var(--radius-sm);background:var(--surface-2);color:var(--ink-muted);font-family:var(--font-mono);font-size:11px;font-weight:600}.builder-canvas{grid-column:2;grid-row:2;min-width:0;min-height:0;overflow:auto;background:var(--surface-sunk);padding:var(--space-5) var(--space-4) var(--space-6)}.builder-canvas__empty{display:grid;height:100%;place-items:center;color:var(--ink-muted);font-size:var(--text-sm)}.builder-page-sheet{display:grid;width:100%;max-width:var(--page-width, 794px);margin:0 auto;gap:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow-page);padding:var(--space-5);transition:max-width var(--dur) var(--ease)}.builder-canvas__area{display:grid;gap:var(--space-3)}.builder-footer-section{display:grid;gap:var(--space-3);margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px dashed var(--border)}.builder-footer-section__header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}.builder-footer-section__title{margin:0;color:var(--ink-subtle);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}.builder-footer-section__hint{margin:2px 0 0;color:var(--ink-subtle);font-size:var(--text-xs)}.builder-footer-section__repeat{display:inline-flex;align-items:center;gap:var(--space-2);color:var(--ink-muted);font-size:var(--text-sm);font-weight:500}.builder-footer-section__repeat input{width:14px;height:14px;accent-color:var(--indigo)}.builder-footer-section__page-numbers{display:flex;justify-content:center;margin-top:var(--space-2);padding-top:var(--space-3);border-top:1px dashed var(--border)}.builder-footer-section__page-numbers label{display:inline-flex;align-items:center;gap:var(--space-3);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.06em}.builder-footer-section__page-numbers select{text-transform:none;font-size:var(--text-sm);font-weight:400;letter-spacing:0}.builder-page-sheet__meta{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-2);color:var(--ink-subtle);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em}.builder-row{display:grid;min-width:0;gap:var(--space-2);border-radius:var(--radius-md);transition:background var(--dur-fast) var(--ease)}.builder-row.is-dragging{opacity:.5}.builder-row__header{display:flex;align-items:center;gap:var(--space-2);height:22px;margin-bottom:-2px;opacity:0;transition:opacity var(--dur-fast) var(--ease)}.builder-row:hover .builder-row__header,.builder-row__header:focus-within{opacity:1}.builder-row__handle{display:inline-flex;align-items:center;height:22px;border:0;background:transparent;color:var(--ink-subtle);cursor:grab;font-family:var(--font-mono);font-size:var(--text-xs);padding:0 var(--space-2)}.builder-row__handle:hover{color:var(--ink)}.builder-row__grid{position:relative;display:grid;min-width:0;align-items:stretch;gap:var(--space-2)}.builder-card{display:grid;min-width:0;overflow:hidden;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}.builder-card:hover{border-color:var(--border-strong)}.builder-card.is-dragging{opacity:.45;border-style:dashed}.builder-card.is-expanded{border-color:var(--ink-subtle)}.builder-card.is-landing{box-shadow:0 0 0 2px var(--indigo-soft);animation:builder-card-land var(--dur-slow) var(--ease)}@keyframes builder-card-land{0%{box-shadow:0 0 #4f46e500}40%{box-shadow:0 0 0 4px #4f46e540}to{box-shadow:0 0 #4f46e500}}.builder-card__header{display:flex;align-items:center;gap:var(--space-2);min-height:40px;background:var(--surface);padding:var(--space-2) var(--space-2) var(--space-2) var(--space-1);cursor:pointer}.builder-card__handle{display:inline-grid;width:20px;height:28px;flex:0 0 20px;place-items:center;border:0;background:transparent;color:var(--ink-subtle);cursor:grab;font-family:var(--font-mono);font-size:12px;opacity:0;padding:0;transition:opacity var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.builder-card:hover .builder-card__handle,.builder-card__handle:focus-visible,.builder-card.is-dragging .builder-card__handle{opacity:1}.builder-card__handle:hover{color:var(--ink)}.builder-card__handle:active{cursor:grabbing}.builder-card__title{display:flex;min-width:0;flex:1 1 auto;align-items:baseline;gap:var(--space-2)}.builder-card__label{color:var(--ink);font-size:var(--text-sm);font-weight:500;white-space:nowrap}.builder-card__summary{color:var(--ink-muted);font-size:var(--text-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.builder-card__actions{display:inline-flex;flex:0 0 auto;align-items:center;gap:var(--space-1);opacity:0;transition:opacity var(--dur-fast) var(--ease)}.builder-card:hover .builder-card__actions,.builder-card__actions:focus-within{opacity:1}.builder-card.is-expanded .builder-card__actions{opacity:1}.builder-card__icon-button{display:inline-grid;width:24px;height:24px;place-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--ink-muted);cursor:pointer;font-size:14px;padding:0;transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.builder-card__icon-button:hover{background:var(--surface-2);color:var(--ink)}.builder-card__icon-button--danger:hover{background:var(--danger-soft);color:var(--danger)}.builder-card__form{border-top:1px solid var(--border);background:var(--surface);padding:var(--space-4);animation:builder-card-fade-in var(--dur-fast) var(--ease)}.builder-card__warning{margin:0;color:var(--ink-muted);font-size:var(--text-sm)}.builder-card__warning code{background:var(--surface-2);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs);padding:1px 6px}@keyframes builder-card-fade-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.builder-new-row{display:grid;min-height:40px;place-items:center;border:1px dashed var(--border-strong);border-radius:var(--radius-md);background:transparent;color:var(--ink-subtle);font-size:var(--text-sm);padding:var(--space-3);transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.builder-new-row.is-over{border-color:var(--indigo);background:var(--indigo-soft);color:var(--indigo)}.builder-drop-line{height:2px;margin:-1px 0;border-radius:999px;background:var(--indigo);box-shadow:0 0 0 4px #4f46e51f}.column-resizer,.builder-column-resizer{width:6px;min-height:100%;align-self:stretch;border:0;border-radius:999px;background:transparent;cursor:col-resize;padding:0;transition:background var(--dur-fast) var(--ease)}.column-resizer:before,.builder-column-resizer:before{display:block;width:2px;height:100%;margin:0 auto;border-radius:999px;background:var(--border-strong);content:"";transition:background var(--dur-fast) var(--ease)}.column-resizer:hover:before,.builder-column-resizer:hover:before{background:var(--indigo)}.inline-block-form{display:grid;gap:var(--space-3)}.inline-block-form label{display:grid;grid-template-columns:110px minmax(0,1fr);align-items:center;gap:var(--space-3);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.04em}.inline-block-form>label>input,.inline-block-form>label>select,.inline-block-form>label>textarea{width:100%;min-width:0;min-height:32px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--ink);font-size:var(--text-base);font-weight:400;letter-spacing:0;text-transform:none;padding:var(--space-2) var(--space-3);transition:border-color var(--dur-fast) var(--ease)}.inline-block-form>label>textarea{min-height:96px;font-family:var(--font-mono);font-size:var(--text-sm)}.inline-block-form>label>input:hover,.inline-block-form>label>select:hover,.inline-block-form>label>textarea:hover{border-color:var(--border-strong)}.inline-block-form>label>input:focus-visible,.inline-block-form>label>select:focus-visible,.inline-block-form>label>textarea:focus-visible{outline:none;border-color:var(--border-focus);box-shadow:0 0 0 3px #4f46e52e}.inline-block-form>label>select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--ink-muted) 50%),linear-gradient(135deg,var(--ink-muted) 50%,transparent 50%);background-position:calc(100% - 14px) 50%,calc(100% - 9px) 50%;background-size:5px 5px;background-repeat:no-repeat;padding-right:28px}.inline-block-form .builder-field--checkbox{grid-template-columns:110px max-content;gap:var(--space-2)}.builder-array-field{display:grid;grid-column:1 / -1;gap:var(--space-2);border:1px solid var(--border);border-radius:var(--radius);margin:0;padding:var(--space-3)}.builder-array-field>legend{padding:0 var(--space-2);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;text-transform:uppercase;letter-spacing:.04em}.builder-array-field__item{display:grid;gap:var(--space-2);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-2);padding:var(--space-3)}.builder-array-field__item button{width:fit-content;height:28px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--ink-muted);cursor:pointer;font-size:var(--text-xs);padding:0 var(--space-3)}.builder-array-field__add{width:fit-content;height:28px;border:1px dashed var(--border-strong);border-radius:var(--radius);background:transparent;color:var(--ink-muted);cursor:pointer;font-size:var(--text-xs);padding:0 var(--space-3)}.builder-array-field__add:hover{border-color:var(--indigo);color:var(--indigo)}.pdf-pane{display:grid;min-width:0;min-height:100vh;grid-template-rows:56px auto minmax(0,1fr) auto;background:var(--surface-sunk)}.pdf-pane__header{grid-row:1;display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);border-bottom:1px solid var(--border);background:var(--surface);padding:0 var(--space-4)}.pdf-pane__header h2{margin:0;color:var(--ink);font-size:var(--text-md);font-weight:600;letter-spacing:-.01em}.pdf-pane__status-pill{display:inline-flex;align-items:center;gap:var(--space-2);border-radius:999px;background:var(--surface-2);color:var(--ink-muted);font-size:var(--text-xs);font-weight:500;padding:4px var(--space-3)}.pdf-pane__status-pill:before{content:"";width:6px;height:6px;border-radius:999px;background:currentColor;opacity:.6}.pdf-pane__status-pill[data-status=ready]{color:#1f7a3a;background:#e6f4ec}.pdf-pane__status-pill[data-status=rendering]{color:var(--indigo);background:var(--indigo-soft)}.pdf-pane__body{grid-row:3;display:grid;min-height:0;padding:var(--space-4)}.pdf-pane__object{width:100%;height:100%;min-height:0;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);box-shadow:var(--shadow-page)}.pdf-pane__empty{display:grid;height:100%;place-items:center;border:1px dashed var(--border-strong);border-radius:var(--radius-md);background:var(--surface);color:var(--ink-muted);font-size:var(--text-sm);padding:var(--space-5);text-align:center}.pdf-pane__error{grid-row:2;margin:var(--space-3) var(--space-4) 0;border-left:3px solid var(--danger);border-radius:var(--radius-sm);background:var(--danger-soft);color:var(--danger);font-size:var(--text-sm);padding:var(--space-3) var(--space-3)}.pdf-pane__footer{grid-row:4;display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);border-top:1px solid var(--border);background:var(--surface);padding:var(--space-3) var(--space-4)}.builder-drag-overlay{cursor:grabbing;filter:drop-shadow(0 12px 24px rgba(0,0,0,.18));transform:rotate(1.5deg) scale(1.02);transform-origin:0 0;pointer-events:none}.builder-drag-overlay__card{display:inline-flex;min-width:180px;max-width:360px;align-items:center;gap:var(--space-2);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);font-size:var(--text-sm);font-weight:500;padding:var(--space-2) var(--space-3)}@media(max-width:1080px){.template-builder-page{grid-template-columns:1fr}.template-builder-page__authoring,.pdf-pane{min-height:auto}.pdf-pane__object,.pdf-pane__empty{height:34rem}}@media(max-width:760px){.template-builder-page__authoring{grid-template-columns:1fr}.builder-palette{grid-column:1;grid-row:auto;border-right:0;border-bottom:1px solid var(--border)}.builder-canvas{grid-column:1;grid-row:auto}.builder-palette__list{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.inline-block-form label{grid-template-columns:1fr;gap:var(--space-1)}}@media(max-width:480px){.builder-row__grid{grid-template-columns:1fr!important}.column-resizer,.builder-column-resizer{display:none}}
1
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-400:oklch(70.4% .191 22.216);--color-red-700:oklch(50.5% .213 27.518);--color-red-950:oklch(25.8% .092 26.042);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-950:oklch(26.2% .051 172.552);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-950:oklch(25.7% .09 281.288);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tighter:-.05em;--tracking-normal:0em;--tracking-wide:.025em;--leading-normal:1.5;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--text-2xs:11px;--drop-shadow-drag:0 12px 24px #0000002e;--animate-flyout:pdfua-flyout .15s ease-out}}@layer base{:root{color:var(--pdfua-fg);background:var(--pdfua-app);font-synthesis:none;text-rendering:optimizelegibility;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:14px}*{box-sizing:border-box}html{min-width:320px;min-height:100%}body{min-width:320px;min-height:100vh;margin:0}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--pdfua-accent);font-weight:500;text-decoration:none}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--pdfua-accent);outline-offset:2px;border-radius:4px}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important}}}@layer components;@layer utilities{.\[container-type\:inline-size\]{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.left-2{left:calc(var(--spacing) * 2)}.z-20{z-index:20}.z-\[1\]{z-index:1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.-mt-2{margin-top:calc(var(--spacing) * -2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.-mb-0\.5{margin-bottom:calc(var(--spacing) * -.5)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[display\:-webkit-box\]{display:-webkit-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\[22px\]{height:22px}.h-\[26px\]{height:26px}.h-\[36rem\]{height:36rem}.h-\[40rem\]{height:40rem}.h-\[56px\]{height:56px}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[120px\]{max-height:120px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[72px\]{min-height:72px}.min-h-full{min-height:100%}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-8{width:calc(var(--spacing) * 8)}.w-\[22px\]{width:22px}.w-\[min\(360px\,100\%\)\]{width:min(360px,100%)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[360px\]{max-width:360px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[22px\]{min-width:22px}.min-w-\[180px\]{min-width:180px}.flex-auto{flex:auto}.flex-none{flex:none}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-top-left{transform-origin:0 0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-\[1\.02\]{scale:1.02}.rotate-\[1\.5deg\]{rotate:1.5deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-flyout{animation:var(--animate-flyout)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-pointer{cursor:pointer}.\[scrollbar-width\:thin\]{scrollbar-width:thin}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[minmax\(40rem\,1\.55fr\)_minmax\(28rem\,0\.95fr\)\]{grid-template-columns:minmax(40rem,1.55fr) minmax(28rem,.95fr)}.grid-cols-\[repeat\(auto-fit\,minmax\(220px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.grid-rows-\[56px_auto_minmax\(0\,1fr\)\]{grid-template-rows:56px auto minmax(0,1fr)}.flex-col{flex-direction:column}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-solid{--tw-border-style:solid;border-style:solid}.\!border-accent{border-color:var(--pdfua-accent)!important}.border-accent{border-color:var(--pdfua-accent)}.border-border{border-color:var(--pdfua-border)}.border-border-strong{border-color:var(--pdfua-border-strong)}.border-danger{border-color:var(--pdfua-danger)}.border-fg{border-color:var(--pdfua-fg)}.border-primary{border-color:var(--pdfua-primary)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.bg-accent-soft{background-color:var(--pdfua-accent-soft)}.bg-app{background-color:var(--pdfua-app)}.bg-border-strong{background-color:var(--pdfua-border-strong)}.bg-canvas{background-color:var(--pdfua-canvas)}.bg-current{background-color:currentColor}.bg-danger-soft{background-color:var(--pdfua-danger-soft)}.bg-page{background-color:var(--pdfua-page)}.bg-primary{background-color:var(--pdfua-primary)}.bg-success-soft{background-color:var(--pdfua-success-soft)}.bg-surface{background-color:var(--pdfua-surface)}.bg-surface-muted{background-color:var(--pdfua-surface-muted)}.bg-surface\/90{background-color:var(--pdfua-surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/90{background-color:color-mix(in oklab, var(--pdfua-surface) 90%, transparent)}}.bg-transparent{background-color:#0000}.bg-\[linear-gradient\(45deg\,transparent_50\%\,var\(--pdfua-fg-muted\)_50\%\)\,linear-gradient\(135deg\,var\(--pdfua-fg-muted\)_50\%\,transparent_50\%\)\]{background-image:linear-gradient(45deg,transparent 50%,var(--pdfua-fg-muted) 50%),linear-gradient(135deg,var(--pdfua-fg-muted) 50%,transparent 50%)}.bg-\[length\:5px_5px\,5px_5px\]{background-size:5px 5px,5px 5px}.bg-\[position\:calc\(100\%-14px\)_50\%\,calc\(100\%-9px\)_50\%\]{background-position:calc(100% - 14px),calc(100% - 9px)}.bg-no-repeat{background-repeat:no-repeat}.object-contain{object-fit:contain}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-\[5px\]{padding-block:5px}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-2xs{font-size:var(--text-2xs)}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.02em\]{--tw-tracking:.02em;letter-spacing:.02em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.\[tab-size\:2\]{tab-size:2}.text-accent{color:var(--pdfua-accent)}.text-danger{color:var(--pdfua-danger)}.text-fg{color:var(--pdfua-fg)}.text-fg-muted{color:var(--pdfua-fg-muted)}.text-fg-subtle{color:var(--pdfua-fg-subtle)}.text-on-dark{color:var(--pdfua-on-dark)}.text-success{color:var(--pdfua-success)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.accent-accent{accent-color:var(--pdfua-accent)}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow-page{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000a), 0 8px 24px -12px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-pop{--tw-shadow:0 4px 12px -4px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-accent-soft{--tw-ring-color:var(--pdfua-accent-soft)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.drop-shadow-drag{--tw-drop-shadow-size:drop-shadow(0 12px 24px var(--tw-drop-shadow-color,#0000002e));--tw-drop-shadow:drop-shadow(var(--drop-shadow-drag));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-\[background\,border-color\,color\]{transition-property:background,border-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background\]{transition-property:background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\,background\,color\]{transition-property:border-color,background,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[max-width\]{transition-property:max-width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[-webkit-box-orient\:vertical\]{-webkit-box-orient:vertical}.group-focus-within\/card\:opacity-100:is(:where(.group\/card):focus-within *){opacity:1}@media (hover:hover){.group-hover\/card\:opacity-100:is(:where(.group\/card):hover *){opacity:1}.group-hover\/resizer\:bg-accent:is(:where(.group\/resizer):hover *){background-color:var(--pdfua-accent)}.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *){opacity:1}}.focus-within\:opacity-100:focus-within{opacity:1}@media (hover:hover){.hover\:border-accent:hover{border-color:var(--pdfua-accent)}.hover\:border-border:hover{border-color:var(--pdfua-border)}.hover\:border-border-strong:hover{border-color:var(--pdfua-border-strong)}.hover\:border-danger:hover{border-color:var(--pdfua-danger)}.hover\:border-primary-strong:hover{border-color:var(--pdfua-primary-strong)}.hover\:bg-danger:hover{background-color:var(--pdfua-danger)}.hover\:bg-danger-soft:hover{background-color:var(--pdfua-danger-soft)}.hover\:bg-primary-strong:hover{background-color:var(--pdfua-primary-strong)}.hover\:bg-surface:hover{background-color:var(--pdfua-surface)}.hover\:bg-surface-muted:hover{background-color:var(--pdfua-surface-muted)}.hover\:text-accent:hover{color:var(--pdfua-accent)}.hover\:text-danger:hover{color:var(--pdfua-danger)}.hover\:text-fg:hover{color:var(--pdfua-fg)}.hover\:text-on-dark:hover{color:var(--pdfua-on-dark)}}.focus-visible\:border-accent:focus-visible{border-color:var(--pdfua-accent)}.focus-visible\:ring-3:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-accent\/20:focus-visible{--tw-ring-color:var(--pdfua-accent)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-accent\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--pdfua-accent) 20%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-surface-muted:active{background-color:var(--pdfua-surface-muted)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-border-strong:disabled{border-color:var(--pdfua-border-strong)}.disabled\:bg-surface:disabled{background-color:var(--pdfua-surface)}.disabled\:bg-surface-muted:disabled{background-color:var(--pdfua-surface-muted)}.disabled\:text-fg-subtle:disabled{color:var(--pdfua-fg-subtle)}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (width>=1080px){.max-\[1080px\]\:h-\[34rem\]{height:34rem}.max-\[1080px\]\:h-auto{height:auto}.max-\[1080px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media not all and (width>=480px){.max-\[480px\]\:hidden{display:none}.max-\[480px\]\:\!grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}.last\:\[\&\>td\]\:border-b-0:last-child>td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}:root,[data-theme=light]{--pdfua-app:var(--color-stone-50);--pdfua-canvas:var(--color-stone-200);--pdfua-surface:var(--color-white);--pdfua-surface-muted:var(--color-stone-100);--pdfua-page:var(--color-stone-100);--pdfua-border:var(--color-stone-200);--pdfua-border-strong:var(--color-stone-300);--pdfua-fg:var(--color-stone-900);--pdfua-fg-muted:var(--color-stone-500);--pdfua-fg-subtle:var(--color-stone-400);--pdfua-on-dark:var(--color-white);--pdfua-accent:var(--color-indigo-600);--pdfua-accent-soft:var(--color-indigo-50);--pdfua-primary:var(--color-stone-800);--pdfua-primary-strong:var(--color-stone-950);--pdfua-danger:var(--color-red-700);--pdfua-danger-soft:var(--color-red-50);--pdfua-success:var(--color-emerald-700);--pdfua-success-soft:var(--color-emerald-100);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--pdfua-app:var(--color-stone-900);--pdfua-canvas:var(--color-stone-900);--pdfua-surface:var(--color-stone-800);--pdfua-surface-muted:var(--color-stone-700);--pdfua-border:var(--color-stone-600);--pdfua-border-strong:var(--color-stone-500);--pdfua-fg:var(--color-stone-100);--pdfua-fg-muted:var(--color-stone-400);--pdfua-fg-subtle:var(--color-stone-500);--pdfua-on-dark:var(--color-stone-900);--pdfua-accent:var(--color-indigo-400);--pdfua-accent-soft:var(--color-indigo-950);--pdfua-primary:var(--color-stone-100);--pdfua-primary-strong:var(--color-white);--pdfua-danger:var(--color-red-400);--pdfua-danger-soft:var(--color-red-950);--pdfua-success:var(--color-emerald-400);--pdfua-success-soft:var(--color-emerald-950);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}[data-theme=dark],.dark{--pdfua-app:var(--color-stone-900);--pdfua-canvas:var(--color-stone-900);--pdfua-surface:var(--color-stone-800);--pdfua-surface-muted:var(--color-stone-700);--pdfua-border:var(--color-stone-600);--pdfua-border-strong:var(--color-stone-500);--pdfua-fg:var(--color-stone-100);--pdfua-fg-muted:var(--color-stone-400);--pdfua-fg-subtle:var(--color-stone-500);--pdfua-on-dark:var(--color-stone-900);--pdfua-accent:var(--color-indigo-400);--pdfua-accent-soft:var(--color-indigo-950);--pdfua-primary:var(--color-stone-100);--pdfua-primary-strong:var(--color-white);--pdfua-danger:var(--color-red-400);--pdfua-danger-soft:var(--color-red-950);--pdfua-success:var(--color-emerald-400);--pdfua-success-soft:var(--color-emerald-950);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@keyframes pdfua-flyout{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}
3
+ /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bambamboole/pdf-ua-template-builder",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Embeddable React template builder for the pdf-ua-api PDF/UA renderer.",
6
6
  "author": "Manuel Christlieb",
@@ -44,11 +44,11 @@
44
44
  "wysiwyg"
45
45
  ],
46
46
  "scripts": {
47
- "dev": "vite",
47
+ "dev": "docker compose up -d --force-recreate && vite",
48
48
  "build": "tsc --noEmit && vite build --mode lib",
49
49
  "build:app": "tsc --noEmit && vite build",
50
50
  "preview": "vite preview",
51
- "sync:schema": "curl -fsS ${PDF_UA_SCHEMA_URL:-http://localhost:8080/schema} -o schemas/template.schema.json",
51
+ "sync:schema": "curl -fsS ${PDF_UA_SCHEMA_URL:-http://localhost:9999/schema} -o schemas/template.schema.json",
52
52
  "generate:types": "json2ts --input schemas/template.schema.json --output src/types/generated/template.d.ts --unreachableDefinitions",
53
53
  "typecheck": "tsc --noEmit",
54
54
  "lint": "oxlint",
@@ -57,6 +57,8 @@
57
57
  "fmt": "oxfmt",
58
58
  "fmt:check": "oxfmt --check",
59
59
  "test": "vitest run",
60
+ "test:e2e": "playwright test",
61
+ "test:e2e:ui": "playwright test --ui",
60
62
  "prepublishOnly": "npm run build"
61
63
  },
62
64
  "peerDependencies": {
@@ -64,25 +66,36 @@
64
66
  "react-dom": "^18.0.0 || ^19.0.0"
65
67
  },
66
68
  "dependencies": {
69
+ "@codemirror/lang-json": "^6.0.2",
70
+ "@codemirror/language": "^6.12.3",
71
+ "@codemirror/lint": "^6.9.6",
72
+ "@codemirror/view": "^6.43.0",
67
73
  "@dnd-kit/core": "^6.3.1",
68
74
  "@dnd-kit/sortable": "^10.0.0",
69
75
  "@dnd-kit/utilities": "^3.2.2",
70
- "@rjsf/core": "^6.5.3",
71
- "@rjsf/utils": "^6.5.3",
72
- "@rjsf/validator-ajv8": "^6.5.3",
73
- "ajv": "^8.20.0"
76
+ "@lezer/highlight": "^1.2.3",
77
+ "@uiw/react-codemirror": "^4.25.10",
78
+ "codemirror-json-schema": "^0.8.1"
74
79
  },
75
80
  "devDependencies": {
81
+ "@playwright/test": "^1.60.0",
82
+ "@tailwindcss/vite": "^4.3.0",
83
+ "@testing-library/dom": "^10.4.1",
84
+ "@testing-library/jest-dom": "^6.9.1",
85
+ "@testing-library/react": "^16.3.2",
86
+ "@testing-library/user-event": "^14.6.1",
76
87
  "@types/react": "^19.2.15",
77
88
  "@types/react-dom": "^19.2.3",
78
- "@vitejs/plugin-react": "^5.0.0",
89
+ "@vitejs/plugin-react": "^6.0.2",
90
+ "jsdom": "^29.1.1",
79
91
  "json-schema-to-typescript": "^15.0.4",
80
92
  "oxfmt": "^0.51.0",
81
93
  "oxlint": "^1.66.0",
82
94
  "react": "^19.0.0",
83
95
  "react-dom": "^19.0.0",
96
+ "tailwindcss": "^4.3.0",
84
97
  "typescript": "^5.9.3",
85
- "vite": "^7.0.0",
98
+ "vite": "^8.0.14",
86
99
  "vite-plugin-dts": "^5.0.1",
87
100
  "vitest": "^4.1.7"
88
101
  }
@@ -1,4 +0,0 @@
1
- export declare function parseWidths(widths: readonly (number | string)[] | null | undefined, count: number): number[];
2
- export declare function formatWidths(widths: readonly number[]): string[];
3
- export declare function gridTemplateForWidths(widths: readonly string[] | null | undefined, count: number): string | null;
4
- export declare function setBoundary(widths: readonly number[], leftIndex: number, leftPercent: number): number[];
@@ -1,9 +0,0 @@
1
- import { Block } from '../../types/generated/template';
2
- import { JsonSchemaObject } from '../schema/schemaAdapter';
3
- export interface InlineBlockFormProps {
4
- block: Block;
5
- fieldSchema: JsonSchemaObject;
6
- configSchema?: JsonSchemaObject;
7
- onChange: (block: Block) => void;
8
- }
9
- export declare function InlineBlockForm({ block, fieldSchema, configSchema, onChange, }: InlineBlockFormProps): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +0,0 @@
1
- export interface PdfPaneProps {
2
- pdfUrl: string | null;
3
- error: string | null;
4
- loading: boolean;
5
- onRender?: () => void;
6
- renderDisabled?: boolean;
7
- }
8
- export declare function PdfPane({ pdfUrl, error, loading, onRender, renderDisabled }: PdfPaneProps): import("react/jsx-runtime").JSX.Element;
@@ -1,17 +0,0 @@
1
- import { Orientation, PageFormat } from '../../types/generated/template';
2
- export interface BuilderTopbarProps {
3
- format: PageFormat;
4
- orientation: Orientation;
5
- onChangeFormat: (format: PageFormat) => void;
6
- onChangeOrientation: (orientation: Orientation) => void;
7
- apiUrl: string;
8
- onApiUrlChange: (value: string) => void;
9
- onLoadSchema: () => void;
10
- schemaLoading: boolean;
11
- onLoadExample: () => void;
12
- exampleDisabled: boolean;
13
- onRender: () => void;
14
- renderDisabled: boolean;
15
- rendering: boolean;
16
- }
17
- export declare function BuilderTopbar({ format, orientation, onChangeFormat, onChangeOrientation, apiUrl, onApiUrlChange, onLoadSchema, schemaLoading, onLoadExample, exampleDisabled, onRender, renderDisabled, rendering, }: BuilderTopbarProps): import("react/jsx-runtime").JSX.Element;
File without changes