.ai/STRUCTURE.md
handsontable-develop/
├── handsontable/ # Core data grid package (vanilla JS)
│ ├── src/ # Source code
│ ├── test/ # E2E tests and test infrastructure
│ ├── types/ # Hand-authored TypeScript .d.ts definitions
│ ├── dist/ # UMD/minified build output
│ ├── tmp/ # ES/CJS module build output (used by wrappers)
│ ├── styles/ # Compiled CSS output
│ ├── languages/ # Compiled language files
│ ├── .config/ # Rspack configs (the `.config/` name predates the Webpack→Rspack switch)
│ ├── scripts/ # Build scripts
│ ├── dev.html # Dev playground (LTR)
│ ├── dev-rtl.html # Dev playground (RTL)
│ └── dev-ltr-rtl.html # Dev playground (both)
├── wrappers/
│ ├── react-wrapper/ # @handsontable/react-wrapper
│ ├── angular-wrapper/ # @handsontable/angular-wrapper
│ └── vue3/ # @handsontable/vue3
├── docs/ # Astro Starlight documentation site (Node 20)
├── examples/ # Code examples
├── visual-tests/ # Playwright visual regression tests
├── .changelogs/ # Changelog entry mechanism
├── bin/ # CLI tools (changelog)
├── scripts/ # Monorepo-level scripts
├── resources/ # Shared resources
├── .github/ # GitHub workflows and CI
├── hot.config.js # Build environment variables
├── pnpm-workspace.yaml # pnpm workspace definition
├── package.json # Root package.json (pnpm 10.30.2)
├── babel.config.js # Root Babel config
├── .eslintrc.js # Root ESLint config
├── .eslintignore # ESLint ignore patterns
├── browser-targets.js # Supported browser targets
├── .nvmrc # Node.js version (22)
└── CHANGELOG.md # Release changelog
handsontable/src/)handsontable/src/
├── core.js # Core class (~5656 lines) - main public API
├── base.js # Tree-shakeable entry point (minimal)
├── index.js # Full entry point (registers all modules)
├── registry.js # Aggregated registerAll*() for all module types
├── tableView.js # Bridge between Core and Walkontable
├── editorManager.js # Manages cell editor lifecycle
├── eventManager.js # Centralized DOM event listener management
│
├── core/ # Core submodules
│ ├── hooks/ # Hooks (event bus) system
│ │ ├── index.js # Hooks class (singleton)
│ │ ├── bucket.js # HooksBucket storage
│ │ └── constants.js # REGISTERED_HOOKS, REMOVED_HOOKS, DEPRECATED_HOOKS
│ ├── coordsMapper/ # CellRange to renderable coordinate mapping
│ └── viewportScroll/ # Viewport scroll management
│
├── plugins/ # All feature plugins (~40 plugins)
│ ├── base/ # BasePlugin abstract class
│ │ └── base.js # Plugin lifecycle template
│ ├── registry.js # Plugin registry (register/get/getNames)
│ ├── index.js # Barrel export + registerAllPlugins()
│ ├── autoColumnSize/ # Auto column sizing
│ ├── autoRowSize/ # Auto row sizing
│ ├── autofill/ # Drag-to-fill
│ ├── bindRowsWithHeaders/ # Row-header binding
│ ├── collapsibleColumns/ # Column collapsing (nested headers)
│ ├── columnSorting/ # Single-column sorting
│ ├── columnSummary/ # Column summary calculations
│ ├── comments/ # Cell comments
│ ├── contextMenu/ # Right-click context menu
│ ├── copyPaste/ # Copy/paste support
│ ├── customBorders/ # Custom cell borders
│ ├── dataProvider/ # Server-backed fetchRows + CRUD
│ ├── dialog/ # Dialog/modal support
│ ├── dragToScroll/ # Drag-to-scroll viewport
│ ├── dropdownMenu/ # Column header dropdown menus
│ ├── emptyDataState/ # Empty state display
│ ├── exportFile/ # CSV export
│ ├── filters/ # Column filters
│ ├── formulas/ # HyperFormula integration
│ ├── hiddenColumns/ # Column hiding
│ ├── hiddenRows/ # Row hiding
│ ├── loading/ # Loading indicator
│ ├── manualColumnFreeze/ # Manual column freezing
│ ├── manualColumnMove/ # Column drag-to-move
│ ├── manualColumnResize/ # Column drag-to-resize
│ ├── manualRowMove/ # Row drag-to-move
│ ├── manualRowResize/ # Row drag-to-resize
│ ├── mergeCells/ # Cell merging
│ ├── multiColumnSorting/ # Multi-column sorting
│ ├── multipleSelectionHandles/ # Mobile selection handles
│ ├── nestedHeaders/ # Multi-level column headers
│ ├── nestedRows/ # Hierarchical row data
│ ├── notification/ # Toast notifications
│ ├── pagination/ # Data pagination
│ ├── search/ # Cell search
│ ├── stretchColumns/ # Column stretching strategies
│ │ └── strategies/ # 'all' and 'last' strategies
│ ├── touchScroll/ # Touch device scrolling
│ ├── trimRows/ # Row trimming (removes from DataMap)
│ └── undoRedo/ # Undo/redo support
│
├── editors/ # Cell editor implementations
│ ├── baseEditor/ # Abstract BaseEditor class
│ ├── textEditor/ # Text input editor (base for most editors)
│ ├── autocompleteEditor/ # Autocomplete dropdown
│ ├── checkboxEditor/ # Checkbox toggle
│ ├── dateEditor/ # Date picker
│ ├── dropdownEditor/ # Dropdown select
│ ├── handsontableEditor/ # Embedded Handsontable editor
│ ├── intlDateEditor/ # Internationalized date editor
│ ├── intlTimeEditor/ # Internationalized time editor
│ ├── multiSelectEditor/ # Multi-select editor
│ ├── numericEditor/ # Numeric input
│ ├── passwordEditor/ # Password input
│ ├── selectEditor/ # Native select editor
│ ├── timeEditor/ # Time input
│ ├── registry.js # Editor registry
│ ├── factory.js # Editor factory
│ └── index.js # Barrel export + registerAllEditors()
│
├── renderers/ # Cell renderer functions
│ ├── baseRenderer/ # Base decorator renderer
│ ├── textRenderer/ # Text cell renderer
│ ├── autocompleteRenderer/ # Autocomplete cell renderer
│ ├── checkboxRenderer/ # Checkbox renderer
│ ├── dateRenderer/ # Date renderer
│ ├── htmlRenderer/ # HTML content renderer
│ ├── numericRenderer/ # Numeric renderer
│ ├── passwordRenderer/ # Password mask renderer
│ ├── registry.js # Renderer registry
│ ├── factory.js # Renderer factory
│ └── index.js # Barrel export + registerAllRenderers()
│
├── validators/ # Cell value validators
│ ├── autocompleteValidator/ # Autocomplete validation
│ ├── dateValidator/ # Date validation
│ ├── numericValidator/ # Numeric validation
│ ├── timeValidator/ # Time validation
│ ├── registry.js # Validator registry
│ └── index.js # Barrel export + registerAllValidators()
│
├── cellTypes/ # Composite cell types (editor+renderer+validator)
│ ├── textType/ # Default text type
│ ├── numericType/ # Numeric type
│ ├── checkboxType/ # Checkbox type
│ ├── dateType/ # Date type
│ ├── dropdownType/ # Dropdown type
│ ├── autocompleteType/ # Autocomplete type
│ ├── handsontableType/ # Embedded grid type
│ ├── intlDateType/ # Internationalized date type
│ ├── intlTimeType/ # Internationalized time type
│ ├── multiSelectType/ # Multi-select type
│ ├── passwordType/ # Password type
│ ├── selectType/ # Select type
│ ├── timeType/ # Time type
│ ├── registry.js # Cell type registry
│ └── index.js # Barrel export + registerAllCellTypes()
│
├── dataMap/ # Data management layer
│ ├── dataMap.js # DataMap - row/column data access
│ ├── dataSource.js # DataSource - raw data wrapper
│ ├── replaceData.js # Data replacement logic
│ ├── sourceDataValidator.js # Source data validation
│ ├── metaManager/ # Cascading metadata system
│ │ ├── index.js # MetaManager class
│ │ ├── metaSchema.js # Default meta schema (all settings defaults)
│ │ ├── lazyFactoryMap.js # Lazy map for meta objects
│ │ ├── metaLayers/ # Four meta layers
│ │ │ ├── globalMeta.js # Global defaults (prototype)
│ │ │ ├── tableMeta.js # Table-level overrides (instance)
│ │ │ ├── columnMeta.js # Column-level overrides (prototype)
│ │ │ └── cellMeta.js # Cell-level overrides (instance)
│ │ ├── mods/ # Meta modifier modules
│ │ │ ├── dynamicCellMeta.js # Dynamic cell meta from `cells()` function
│ │ │ └── extendMetaProperties.js # Extends meta with type-resolved properties
│ │ └── utils.js # Meta utilities
│ └── index.js # Barrel export
│
├── translations/ # Index mapping (3 coordinate systems)
│ ├── indexMapper.js # IndexMapper - main translation class
│ ├── maps/ # Map implementations
│ │ ├── hidingMap.js # HidingMap (hidden but in DataMap)
│ │ ├── trimmingMap.js # TrimmingMap (removed from DataMap)
│ │ ├── indexesSequence.js # IndexesSequence (ordering)
│ │ └── ... # PhysicalIndexToValueMap, LinkedPhysicalIndexToValueMap
│ ├── mapCollections/ # Map collection types
│ │ ├── mapCollection.js # MapCollection base
│ │ └── aggregatedCollection.js # AggregatedCollection (aggregates multiple maps)
│ ├── changesObservable/ # Observable for index changes
│ └── index.js # Barrel export
│
├── selection/ # Selection management
│ ├── selection.js # Selection class (main)
│ ├── range.js # SelectionRange data layer
│ ├── highlight/ # Selection highlight rendering
│ │ └── highlight.js # Highlight class with type constants
│ ├── transformation/ # Selection transformation modules
│ │ ├── extender.js # ExtenderTransformation (extend selection)
│ │ └── focus.js # FocusTransformation (move focus)
│ ├── mouseEventHandler.js # Mouse event -> selection actions
│ └── utils.js # Selection utilities
│
├── 3rdparty/walkontable/ # Walkontable rendering engine
│ ├── src/
│ │ ├── core/ # Walkontable core classes
│ │ │ ├── _base.js # Base Walkontable class
│ │ │ ├── core.js # Main Walkontable core
│ │ │ └── clone.js # Clone Walkontable (for overlays)
│ │ ├── facade/ # Facade pattern for external access
│ │ │ └── core.js # Public Walkontable API
│ │ ├── table/ # Table implementations
│ │ │ ├── master.js # Master (main) table
│ │ │ ├── top.js # Top frozen overlay table
│ │ │ ├── bottom.js # Bottom frozen overlay table
│ │ │ ├── inlineStart.js # Left/right frozen overlay table
│ │ │ ├── topInlineStartCorner.js # Top-left corner table
│ │ │ └── bottomInlineStartCorner.js # Bottom-left corner table
│ │ ├── overlay/ # Overlay system (frozen rows/cols)
│ │ │ ├── _base.js # Base overlay
│ │ │ ├── top.js # Top overlay
│ │ │ ├── bottom.js # Bottom overlay
│ │ │ ├── inlineStart.js # Inline-start (left/right) overlay
│ │ │ ├── topInlineStartCorner.js # Corner overlays
│ │ │ └── bottomInlineStartCorner.js
│ │ ├── renderer/ # Low-level DOM renderers
│ │ │ ├── _base.js # Base renderer
│ │ │ ├── table.js # Table renderer orchestrator
│ │ │ ├── rows.js # Row renderer
│ │ │ ├── cells.js # Cell renderer
│ │ │ ├── columnHeaders.js # Column header renderer
│ │ │ ├── rowHeaders.js # Row header renderer
│ │ │ └── colGroup.js # ColGroup renderer
│ │ ├── calculator/ # Viewport calculators
│ │ ├── cell/ # CellCoords and CellRange
│ │ ├── selection/ # Selection rendering in Walkontable
│ │ ├── filter/ # Row/column filters for rendering
│ │ ├── utils/ # Walkontable utilities
│ │ ├── scroll.js # Scroll position management
│ │ ├── viewport.js # Viewport state
│ │ ├── overlays.js # Overlay manager
│ │ ├── settings.js # Walkontable settings adapter
│ │ ├── event.js # Walkontable event handling
│ │ └── table.js # Table abstraction
│ └── test/ # Walkontable-specific tests
│
├── shortcuts/ # Keyboard shortcut system
│ ├── manager.js # ShortcutManager
│ ├── context.js # ShortcutContext
│ ├── recorder.js # Key recorder
│ ├── keyObserver.js # Key observer
│ └── utils.js # Shortcut utilities
│
├── shortcutContexts/ # Predefined shortcut contexts
│
├── focusManager/ # Focus management for accessibility
│ ├── index.js # FocusGridManager, scope manager
│ ├── grid.js # Grid focus manager
│ ├── scope.js # Focus scope
│ ├── scopeManager.js # Scope manager
│ ├── scopes/ # Predefined focus scopes
│ ├── eventListener.js # Focus event listener
│ ├── constants.js # Focus constants
│ └── utils/ # Focus utilities
│
├── themes/ # Theme system
│ ├── engine/ # Theme engine (runtime)
│ ├── registry.js # Theme registry
│ ├── static/ # Static theme definitions
│ ├── theme/ # Theme class
│ └── index.js # Barrel export
│
├── styles/ # SCSS source files
│ ├── handsontable.scss # Main stylesheet
│ ├── handsontableStyles.js # Style injection
│ ├── base/ # Base styles
│ ├── components/ # Component styles
│ └── utils/ # Style utilities
│
├── i18n/ # Internationalization
│ ├── registry.js # Language registry
│ └── utils.js # i18n utilities
│
├── helpers/ # Shared utility functions
│ ├── dom/ # DOM helpers
│ │ ├── element.js # Element manipulation (addClass, empty, etc.)
│ │ └── event.js # Event helpers (isImmediatePropagationStopped, etc.)
│ ├── a11y.js # Accessibility ARIA helpers
│ ├── array.js # Array utilities
│ ├── browser.js # Browser detection
│ ├── console.js # Console wrappers (use instead of raw console)
│ ├── constants.js # Shared constants
│ ├── data.js # Data helpers (spreadsheetColumnLabel, etc.)
│ ├── dateTime.js # Date/time utilities
│ ├── errors.js # throwWithCause (use instead of throw new Error)
│ ├── feature.js # Feature detection
│ ├── function.js # Function utilities
│ ├── mixed.js # Mixed type utilities
│ ├── moves.js # Movement helpers
│ ├── number.js # Number utilities (rangeEach, clamp)
│ ├── object.js # Object utilities (deepClone, mixin, etc.)
│ ├── string.js # String utilities
│ ├── templateLiteralTag.js # Template literal helpers
│ ├── themes.js # Theme helpers
│ ├── unicode.js # Unicode/keyboard key helpers
│ └── wrappers/ # Framework wrappers (jQuery)
│
├── mixins/ # Object mixins
│ ├── localHooks.js # Local hooks mixin (used by IndexMapper, Selection, etc.)
│ └── hooksRefRegisterer.js # Hooks reference registerer mixin
│
└── utils/ # Utility classes
├── autoResize.js # Auto-resize textarea utility
├── ghostTable.js # Ghost table for measuring
├── interval.js # Interval helper
├── paginator.js # Pagination utility
├── parseTable.js # HTML table parsing (instanceToHTML, etc.)
├── rootInstance.js # Root instance management
├── samplesGenerator.js # Sample data generator (for auto-sizing)
├── staticRegister.js # Static registration utility
├── stylesHandler.js # Runtime CSS style handler
├── valueAccessors.js # Value getter/setter utilities
├── a11yAnnouncer.js # Accessibility announcer
└── dataStructures/ # Data structure utilities
└── uniqueMap.js # UniqueMap implementation
handsontable/src/plugins/:
index.js barrel exportbase/base.js (BasePlugin), registry.js (plugin registry){ PLUGIN_KEY, PLUGIN_PRIORITY, PluginClassName } from index.jshandsontable/src/3rdparty/walkontable/:
src/facade/core.js (public API), src/core/core.js (internal core)npm run test:walkontable). Do not mix with main E2E tests.handsontable/src/dataMap/metaManager/:
handsontable/types/:
.d.ts files only. Do NOT create .ts files in the core package.Entry Points:
handsontable/src/index.js: Full entry - registers all modules, used for UMD buildshandsontable/src/base.js: Tree-shakeable entry - minimal registration, users add moduleshandsontable/src/core.js: Core constructor function (~5656 lines)handsontable/src/registry.js: Aggregated registerAllModules() functionConfiguration:
hot.config.js: Build environment variables (HOT_VERSION, HOT_BUILD_DATE, etc.)handsontable/rspack.config.js: Main Rspack config (entry loader that dispatches to .config/ per NODE_ENV)handsontable/.config/: Additional Rspack configs (base, languages, styles, themes, e2e, etc.)handsontable/babel.config.js: Babel confighandsontable/jest.config.js: Jest config for unit tests.eslintrc.js: Root ESLint confighandsontable/.eslintrc.js: Package-level ESLint configbrowser-targets.js: Supported browser list.nvmrc: Node.js version (22)Core Logic:
handsontable/src/core.js: All public API methodshandsontable/src/tableView.js: Core-to-Walkontable bridgehandsontable/src/editorManager.js: Editor lifecyclehandsontable/src/eventManager.js: DOM event managementhandsontable/src/dataMap/metaManager/metaSchema.js: All default settings and their documentationTesting:
handsontable/test/e2e/: E2E test specs (Jasmine/Puppeteer)handsontable/test/helpers/: Test helper functions (globally available in specs)handsontable/test/bootstrap.js: Test environment bootstraphandsontable/test/types/: TypeScript type testshandsontable/src/**/__tests__/: Co-located unit tests (Jest) and some E2E specsvisual-tests/: Playwright visual regression testshandsontable/src/3rdparty/walkontable/test/: Walkontable-specific testsFiles:
camelCase.js (e.g., dataMap.js, indexMapper.js, baseEditor/)*.unit.js (Jest unit), *.spec.js (Jasmine E2E)*.d.ts in handsontable/types/, *.types.ts for type testscamelCase matching the plugin key (e.g., hiddenColumns/, contextMenu/)Directories:
camelCase (e.g., autoColumnSize/, manualRowMove/)camelCase (e.g., dataMap/, focusManager/, shortcutContexts/)camelCase (e.g., calculator/, renderer/, overlay/)Exports:
{ PLUGIN_KEY, PLUGIN_PRIORITY, PluginClassName }register*, get*, getRegistered*NamescamelCase directory name, PascalCase class nameNew Plugin:
handsontable/src/plugins/myPlugin/handsontable/src/plugins/myPlugin/myPlugin.jshandsontable/src/plugins/myPlugin/index.js (export PLUGIN_KEY, PLUGIN_PRIORITY, class)handsontable/src/plugins/index.js (add to registerAllPlugins())handsontable/src/plugins/myPlugin/__tests__/myPlugin.spec.jshandsontable/src/plugins/myPlugin/__tests__/myPlugin.unit.jshandsontable/types/plugins/myPlugin/myPlugin.d.tsNew Editor:
handsontable/src/editors/myEditor/handsontable/src/editors/index.jshandsontable/types/editors/myEditor.d.tsNew Renderer:
handsontable/src/renderers/myRenderer/handsontable/src/renderers/index.jsNew Cell Type:
handsontable/src/cellTypes/myType/handsontable/src/cellTypes/index.jsNew Helper/Utility:
handsontable/src/helpers/myHelper.jshandsontable/src/utils/myUtil.jshandsontable/src/helpers/dom/myDomHelper.jsNew Walkontable Feature:
handsontable/src/3rdparty/walkontable/src/handsontable/src/3rdparty/walkontable/test/New Framework Wrapper Feature:
wrappers/react-wrapper/src/wrappers/angular-wrapper/projects/hot-table/src/lib/wrappers/vue3/src/handsontable/dist/:
handsontable/tmp/:
handsontable/styles/:
src/styles/)handsontable/types/:
.d.ts definitionshandsontable/languages/:
node_modules/:
pnpm install)