@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.
- package/README.md +119 -17
- package/dist/index.js +6330 -5187
- package/dist/index.js.map +1 -1
- package/dist/src/builder/Builder.d.ts +7 -0
- package/dist/{builder → src/builder}/TemplateBuilder.d.ts +10 -13
- package/dist/src/builder/blocks/Palette.d.ts +7 -0
- package/dist/src/builder/canvas/BlockDataPreview.d.ts +7 -0
- package/dist/{builder → src/builder}/canvas/BuilderCanvas.d.ts +8 -4
- package/dist/src/builder/canvas/Canvas.d.ts +4 -0
- package/dist/{builder → src/builder}/canvas/ColumnResizer.d.ts +2 -1
- package/dist/{builder → src/builder}/canvas/PageSheet.d.ts +3 -1
- package/dist/{builder → src/builder}/canvas/SortableBlock.d.ts +7 -5
- package/dist/src/builder/canvas/columns.d.ts +13 -0
- package/dist/src/builder/context/BuilderContext.d.ts +66 -0
- package/dist/src/builder/controls/AlignSelect.d.ts +7 -0
- package/dist/src/builder/controls/BuilderField.d.ts +74 -0
- package/dist/src/builder/controls/Field.d.ts +6 -0
- package/dist/src/builder/controls/fieldConverters.d.ts +4 -0
- package/dist/src/builder/controls/index.d.ts +7 -0
- package/dist/src/builder/controls/inputs.d.ts +5 -0
- package/dist/src/builder/hooks/useBuilderDragDrop.d.ts +24 -0
- package/dist/src/builder/inspector/BlockContentControls.d.ts +9 -0
- package/dist/src/builder/inspector/BlockInspector.d.ts +14 -0
- package/dist/src/builder/inspector/BlockLayoutControls.d.ts +7 -0
- package/dist/src/builder/inspector/DocumentSettings.d.ts +18 -0
- package/dist/src/builder/inspector/Inspector.d.ts +1 -0
- package/dist/src/builder/inspector/InspectorShell.d.ts +17 -0
- package/dist/src/builder/inspector/PageSettings.d.ts +4 -0
- package/dist/src/builder/inspector/SpacingControls.d.ts +15 -0
- package/dist/src/builder/inspector/TypographyControls.d.ts +19 -0
- package/dist/src/builder/inspector/alignOptions.d.ts +10 -0
- package/dist/src/builder/inspector/editors/ImageBlockEditor.d.ts +3 -0
- package/dist/src/builder/inspector/editors/KeyValueBlockEditor.d.ts +11 -0
- package/dist/src/builder/inspector/editors/SortableList.d.ts +7 -0
- package/dist/src/builder/inspector/editors/SortableRow.d.ts +10 -0
- package/dist/src/builder/inspector/editors/TableBlockEditor.d.ts +20 -0
- package/dist/src/builder/inspector/editors/blockEditors.d.ts +7 -0
- package/dist/src/builder/lib/records.d.ts +4 -0
- package/dist/src/builder/lib/sensors.d.ts +1 -0
- package/dist/src/builder/primitives/Button.d.ts +10 -0
- package/dist/src/builder/primitives/Chip.d.ts +7 -0
- package/dist/{builder → src/builder}/schema/schemaAdapter.d.ts +2 -5
- package/dist/src/builder/state/configUpdates.d.ts +23 -0
- package/dist/src/builder/state/dragDrop.d.ts +17 -0
- package/dist/{builder → src/builder}/state/editorModel.d.ts +5 -0
- package/dist/src/builder/state/editorReducer.d.ts +71 -0
- package/dist/src/editor/CodeEditor.d.ts +4 -0
- package/dist/src/editor/TemplateEditor.d.ts +23 -0
- package/dist/src/editor/TemplateEditorContext.d.ts +20 -0
- package/dist/src/editor/editorTheme.d.ts +1 -0
- package/dist/src/editor/parseTemplate.d.ts +6 -0
- package/dist/src/editor/templateSchema.d.ts +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +12 -0
- package/dist/src/render/PdfPane.d.ts +14 -0
- package/dist/src/render/Preview.d.ts +4 -0
- package/dist/src/render/RenderContext.d.ts +17 -0
- package/dist/src/render/usePdfUaApi.d.ts +19 -0
- package/dist/{types → src/types}/template.d.ts +5 -1
- package/dist/style.css +3 -1
- package/package.json +22 -9
- package/dist/builder/canvas/columns.d.ts +0 -4
- package/dist/builder/forms/InlineBlockForm.d.ts +0 -9
- package/dist/builder/pdf/PdfPane.d.ts +0 -8
- package/dist/builder/topbar/BuilderTopbar.d.ts +0 -17
- /package/dist/{api → src/api}/pdfUaApi.d.ts +0 -0
- /package/dist/{builder → src/builder}/blocks/BlockPalette.d.ts +0 -0
- /package/dist/{builder → src/builder}/blocks/blockChrome.d.ts +0 -0
- /package/dist/{builder → src/builder}/canvas/BlockCardPreview.d.ts +0 -0
- /package/dist/{builder → src/builder}/lib/displayScale.d.ts +0 -0
- /package/dist/{builder → src/builder}/lib/pageSizes.d.ts +0 -0
- /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,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 @@
|
|
|
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,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.
|
|
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:
|
|
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
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"
|
|
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": "^
|
|
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": "^
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|