* docs: add list schema implementation plan
* feat(schemas): add list schema
* fix(schemas): improve list form editing
* fix(schemas): localize list editing labels
* fix(schemas): align table control buttons
* fix(schemas): keep list designer editing during actions
* fix(tsconfig): resolve list schema subpath
* fix(schemas): keep list action clicks isolated
* fix(schemas): support empty list state
* fix(schemas): allow editing list items in designer
* fix(schemas): keep list designer editing on enter
* fix(schemas): ignore IME enter in list editor
* fix(schemas): make enter insert list item line breaks
* test(generator): add list plugin to playground snapshots
* refactor(schemas): render list items with text ui
* fix(schemas): adapt list prop panel fields by style
* fix(schemas): simplify list options and nested numbering
* Reorder import statements in generate-templates-thumbnail
* Reorder List plugin in getPlugins function
* fix(ui): reflow schemas after dynamic list resize
* chore: remove obsolete list plan
* fix(ui): reflow form list height changes
* fix(ui): keep designer height changes local
* fix(schemas): commit list item line breaks immediately
* fix(schemas): restore list focus after line break rerender
* fix(schemas): keep form list focused after enter
* test(generator): update dynamic list snapshots
* fix(schemas): store list content as json arrays
* fix(schemas): address list review cleanup
* test(ui): update designer snapshot
* chore: trim list pr noise
* fix(schemas): align list markers in ui
* fix(ui): prevent focus loss on schema name input
Exclude name from the live handleWatch update path to prevent the sidebar from re-rendering on every keystroke. The name field will now only be updated on blur/Enter instead.
* fix(ui): add onBlur handler to persist schema name changes
Added onBlur handler to schema name field to persist changes when field loses focus, while keeping the exclusion of 'name' from handleWatch to prevent focus loss during typing.
* fix(ui): refactor form handling and update schema name validation logic
---------
Co-authored-by: bobo-xxx <111567133+bobo-xxx@users.noreply.github.com>
- Changed the test script in package.json to run workspace tests using a new script.
- Updated imports in generator and helper files to point to specific schema paths.
- Added new builtins and tables exports in schemas package.json and created corresponding files.
- Enhanced error handling in multiVariableText propPanel for JSON parsing.
- Refactored UI components to use React 18 and updated dependencies accordingly.
- Improved snapshot tests to ensure cleaner output by removing empty text nodes.
- Updated documentation to reflect changes in package usage and requirements.
* fix(dynamicTemplate): rewrite layout engine for accurate multi-page table rendering
- Implement sequential offset-based layout algorithm for correct element positioning
- Add floating point tolerance (EPSILON) to prevent precision errors in page break calculations
- Fix __bodyRange indexing to correctly map dynamicHeights to table body data
- Prevent orphaned table headers by moving header with first data row when page breaks
- Fix UI recalculation timing to use immediate input values for dynamic templates
- Update tests to match new layout behavior
* refactor(common): process dynamic template per page and remove duplicate cloneDeep
* refactor(common): process each template page independently regardless of dynamic content
* feat: add page change listener API
- Add onPageChange() method to Designer class for listening to page changes
- Add getTotalPages() method to get total page count
- Update onPageCursorChange callback to pass totalPages from schemasList.length
- Ensures accurate page count when pages are added/removed
* feat: add page change listener to Form and Viewer
- Add onPageChange() method to Form and Viewer classes
- Add getPageCursor() and getTotalPages() methods to Form and Viewer
- Update Preview component to accept and call onPageChange callback
- Fix Designer test to use proper callback signature
---------
Co-authored-by: Rob H-Y <Rob-HY@users.noreply.github.com>
- introduce shared sidebar frame/header/body/footer wrappers with consistent padding
- adjust ListView and DetailView to use new structure so scrollbars reach edge
- tighten hooks in DetailView (memoized i18n helper, correct deps) and tidy sidebar container styling
* Add HTML component IDs to Designer UI sections and buttons
- Add IDs to all major UI sections (Root, LeftSidebar, RightSidebar, Canvas, CtlBar)
- Add IDs to all interactive buttons (zoom, pager, bulk update, align, etc.)
- Add IDs to plugin buttons with dynamic type-based naming
- Update DeleteButton to use consistent ID naming
- Enables users to hide/style UI elements via CSS selectors
* Convert designer UI component IDs to class names
- Add DESIGNER_CLASSNAME constant ('pdfme-designer-') to constants.ts
- Convert all pdfme-designer-* IDs to class names using DESIGNER_CLASSNAME prefix
- Revert DELETE_BTN_ID to use uuid() as in main/master
- Add class name for canvas background element
- Update all designer UI components (Root, Canvas, LeftSidebar, RightSidebar, DetailView, AlignWidget, ListView, CtlBar)
* Use UI_CLASSNAME for CtlBar component
- Add UI_CLASSNAME constant ('pdfme-ui-') for shared UI components
- Update CtlBar to use UI_CLASSNAME instead of DESIGNER_CLASSNAME
- CtlBar is used in both Designer and Form Viewer, so needs generic prefix
---------
Co-authored-by: Rob H-Y <Rob-HY@users.noreply.github.com>
* Ignore XML repomix output
* Extend UIOptions schema
* Enable init and update of pageCursor, sidebarOpen, and zoomLevel through options
* Rollback options-configurable pageCursor for now
* Remove onPageCursorChange mistakenly kept in useEffect dependencies
* Add UI options section to documentation for controlling zoom level and sidebar state
---------
Co-authored-by: hand-dot <kyouhei.fukuda0729@gmail.com>
* add pluginRepository and make plugin checking more robust
* Apply suggestions from code review
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* f
* f
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* onChange should be fired only if the schema is in the current page
* Update packages/ui/src/components/Designer/Canvas/index.tsx
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* make the function inline to avoid type errors
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>