@zvndev/yable-vanilla 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer.ts","../src/events.ts","../src/createTableDOM.ts"],"names":["value"],"mappings":"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","file":"index.js","sourcesContent":["// @zvndev/yable-vanilla — DOM Renderer\n\nimport type { RowData, Table, Row, Cell, Header, Column } from '@zvndev/yable-core'\n\n// ---------------------------------------------------------------------------\n// SECURITY: Escape HTML for safe injection into innerHTML\n// ---------------------------------------------------------------------------\nfunction esc(value: unknown): string {\n const s = String(value ?? '')\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\n// ---------------------------------------------------------------------------\n// SECURITY: Escape values for use in HTML attributes (data-attributes, etc.)\n// Prevents attribute breakout via characters like \" which would end the attribute.\n// ---------------------------------------------------------------------------\nfunction escAttr(value: unknown): string {\n const s = String(value ?? '')\n return s\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n}\n\n// ---------------------------------------------------------------------------\n// Render the full table HTML\n// ---------------------------------------------------------------------------\nexport function renderTable<TData extends RowData>(\n table: Table<TData>,\n opts: {\n stickyHeader?: boolean\n striped?: boolean\n bordered?: boolean\n compact?: boolean\n theme?: string\n clickableRows?: boolean\n footer?: boolean\n emptyMessage?: string\n } = {}\n): string {\n // SECURITY: Safe — internal/constant class names composed from boolean flags\n const classes = [\n 'yable',\n opts.theme && `yable-theme-${escAttr(opts.theme)}`,\n opts.stickyHeader && 'yable--sticky-header',\n opts.striped && 'yable--striped',\n opts.bordered && 'yable--bordered',\n opts.compact && 'yable--compact',\n ]\n .filter(Boolean)\n .join(' ')\n\n const rows = table.getRowModel().rows\n\n // SECURITY: Safe — aria-rowcount and aria-colcount are numeric values from internal state\n let html = `<div class=\"${classes}\" role=\"grid\" aria-rowcount=\"${rows.length}\" aria-colcount=\"${table.getVisibleLeafColumns().length}\">`\n // SECURITY: Safe — internal/constant value\n html += '<table class=\"yable-table\">'\n html += renderHeader(table)\n html += renderBody(table, opts.clickableRows)\n if (opts.footer) {\n html += renderFooter(table)\n }\n html += '</table>'\n\n if (rows.length === 0) {\n // SECURITY: User data — escaped via esc()\n html += `<div class=\"yable-empty\"><div class=\"yable-empty-message\">${esc(opts.emptyMessage ?? 'No data')}</div></div>`\n }\n\n html += '</div>'\n return html\n}\n\n// ---------------------------------------------------------------------------\n// Header\n// ---------------------------------------------------------------------------\nfunction renderHeader<TData extends RowData>(table: Table<TData>): string {\n const headerGroups = table.getHeaderGroups()\n // SECURITY: Safe — internal/constant value\n let html = '<thead class=\"yable-thead\">'\n\n for (const headerGroup of headerGroups) {\n // SECURITY: User data — headerGroup.id escaped via escAttr() for data-attribute\n html += `<tr class=\"yable-tr\" data-yable-header-group=\"${escAttr(headerGroup.id)}\">`\n for (const header of headerGroup.headers) {\n html += renderHeaderCell(header)\n }\n html += '</tr>'\n }\n\n html += '</thead>'\n return html\n}\n\nfunction renderHeaderCell<TData extends RowData>(header: Header<TData, unknown>): string {\n if (header.isPlaceholder) {\n // SECURITY: Safe — colSpan is numeric from internal state\n return `<th class=\"yable-th\" colspan=\"${header.colSpan}\"></th>`\n }\n\n const column = header.column\n const sortable = column.getCanSort()\n const sortDir = column.getIsSorted()\n const pinned = column.getIsPinned()\n\n // SECURITY: Safe — class names are derived from boolean/enum internal state values\n // sortDir is 'asc' | 'desc' | false, pinned is 'left' | 'right' | false\n const classes = [\n 'yable-th',\n sortable && 'yable-th--sortable',\n sortDir && `yable-th--sorted-${sortDir}`,\n pinned && `yable-th--pinned-${pinned}`,\n ]\n .filter(Boolean)\n .join(' ')\n\n // SECURITY: Safe — getPinStyle returns internally computed CSS\n const style = pinned ? getPinStyle(column) : ''\n // SECURITY: Safe — ariaSort derived from boolean/enum internal state\n const ariaSort = sortDir === 'asc' ? 'ascending' : sortDir === 'desc' ? 'descending' : sortable ? 'none' : undefined\n const ariaSortAttr = ariaSort ? ` aria-sort=\"${ariaSort}\"` : ''\n\n const headerDef = column.columnDef.header\n const content = typeof headerDef === 'function'\n ? String((headerDef as Function)(header.getContext()))\n : String(headerDef ?? column.id)\n\n // SECURITY: Safe — sortDir is 'asc' | 'desc' from internal enum, sortIndicator uses HTML entities\n let sortIndicator = ''\n if (sortable) {\n if (sortDir) {\n sortIndicator = `<span class=\"yable-sort-indicator\" data-active=\"true\" data-direction=\"${sortDir}\" aria-hidden=\"true\">${sortDir === 'asc' ? '&#9650;' : '&#9660;'}</span>`\n } else {\n sortIndicator = `<span class=\"yable-sort-indicator\" aria-hidden=\"true\">&#9650;&#9660;</span>`\n }\n }\n\n let resizeHandle = ''\n if (column.getCanResize()) {\n // SECURITY: User data — column.id escaped via escAttr() for data-attribute\n resizeHandle = `<div class=\"yable-resize-handle\" data-yable-resize=\"${escAttr(column.id)}\"></div>`\n }\n\n // SECURITY: User data — content escaped via esc(), column.id escaped via escAttr() for data-attributes\n // SECURITY: Safe — sortable is boolean, colSpan is numeric\n return `<th class=\"${classes}\"${ariaSortAttr}${style ? ` style=\"${style}\"` : ''} data-yable-column=\"${escAttr(column.id)}\" data-yable-sortable=\"${sortable}\" colspan=\"${header.colSpan}\">${esc(content)}${sortIndicator}${resizeHandle}</th>`\n}\n\n// ---------------------------------------------------------------------------\n// Body\n// ---------------------------------------------------------------------------\nfunction renderBody<TData extends RowData>(\n table: Table<TData>,\n clickableRows?: boolean\n): string {\n const rows = table.getRowModel().rows\n // SECURITY: Safe — internal/constant value\n let html = '<tbody class=\"yable-tbody\">'\n\n for (const row of rows) {\n html += renderRow(table, row, clickableRows)\n }\n\n html += '</tbody>'\n return html\n}\n\nfunction renderRow<TData extends RowData>(\n table: Table<TData>,\n row: Row<TData>,\n clickable?: boolean\n): string {\n const isSelected = row.getIsSelected()\n const isExpanded = row.getIsExpanded()\n\n // SECURITY: Safe — class names derived from boolean flags\n const classes = [\n 'yable-tr',\n clickable && 'yable-tr--clickable',\n isSelected && 'yable-tr--selected',\n ]\n .filter(Boolean)\n .join(' ')\n\n // SECURITY: User data — row.id escaped via escAttr() for data-attribute\n let html = `<tr class=\"${classes}\" data-yable-row=\"${escAttr(row.id)}\"${isSelected ? ' aria-selected=\"true\"' : ''}>`\n\n const cells = row.getVisibleCells()\n for (const cell of cells) {\n html += renderCell(table, cell)\n }\n\n html += '</tr>'\n\n // Expanded detail row\n if (isExpanded) {\n // SECURITY: Safe — colSpan is numeric from internal state\n // SECURITY: User data — row.id escaped via escAttr() for data-attributes\n const colSpan = table.getVisibleLeafColumns().length\n html += `<tr class=\"yable-tr yable-tr--detail\" data-yable-detail=\"${escAttr(row.id)}\"><td class=\"yable-td yable-td--detail\" colspan=\"${colSpan}\"><div class=\"yable-detail-content\" data-yable-detail-content=\"${escAttr(row.id)}\"></div></td></tr>`\n }\n\n return html\n}\n\nfunction renderCell<TData extends RowData>(\n table: Table<TData>,\n cell: Cell<TData, unknown>\n): string {\n const column = cell.column\n const pinned = column.getIsPinned()\n const isEditing = cell.getIsEditing()\n const isAlwaysEditable = cell.getIsAlwaysEditable()\n\n // SECURITY: Safe — class names derived from boolean/enum internal state\n // pinned is 'left' | 'right' | false\n const classes = [\n 'yable-td',\n pinned && `yable-td--pinned-${pinned}`,\n (isEditing || isAlwaysEditable) && 'yable-td--editing',\n ]\n .filter(Boolean)\n .join(' ')\n\n // SECURITY: Safe — getPinStyle returns internally computed CSS\n const style = pinned ? getPinStyle(column) : ''\n\n // Check if this cell should render a form element\n const editConfig = column.columnDef.editConfig\n if (isEditing || isAlwaysEditable) {\n if (editConfig) {\n const value = table.getPendingValue(cell.row.id, column.id) ?? cell.getValue()\n // SECURITY: User data — column.id and cell.row.id escaped via escAttr() for data-attributes\n return `<td class=\"${classes}\"${style ? ` style=\"${style}\"` : ''} data-yable-cell=\"${escAttr(column.id)}\" data-yable-row=\"${escAttr(cell.row.id)}\">${renderFormElement(editConfig, value, cell.row.id, column.id)}</td>`\n }\n }\n\n // Regular cell value\n // SECURITY: User data — value escaped via esc(), column.id and cell.row.id escaped via escAttr()\n const value = cell.renderValue()\n return `<td class=\"${classes}\"${style ? ` style=\"${style}\"` : ''} data-yable-cell=\"${escAttr(column.id)}\" data-yable-row=\"${escAttr(cell.row.id)}\">${esc(value)}</td>`\n}\n\n// ---------------------------------------------------------------------------\n// Footer\n// ---------------------------------------------------------------------------\nfunction renderFooter<TData extends RowData>(table: Table<TData>): string {\n const footerGroups = table.getFooterGroups()\n if (!footerGroups.length) return ''\n\n // SECURITY: Safe — internal/constant value\n let html = '<tfoot class=\"yable-tfoot\">'\n\n for (const footerGroup of footerGroups) {\n html += '<tr class=\"yable-tr\">'\n for (const header of footerGroup.headers) {\n const footerDef = header.column.columnDef.footer\n const content = header.isPlaceholder\n ? ''\n : typeof footerDef === 'function'\n ? String((footerDef as Function)(header.getContext()))\n : String(footerDef ?? '')\n\n // SECURITY: User data — content escaped via esc()\n // SECURITY: Safe — colSpan is numeric from internal state\n html += `<td class=\"yable-td\" colspan=\"${header.colSpan}\">${esc(content)}</td>`\n }\n html += '</tr>'\n }\n\n html += '</tfoot>'\n return html\n}\n\n// ---------------------------------------------------------------------------\n// Form Elements\n// ---------------------------------------------------------------------------\nfunction renderFormElement(\n editConfig: { type?: string; options?: Array<{ label: string; value: unknown }>; placeholder?: string },\n value: unknown,\n rowId: string,\n columnId: string\n): string {\n // SECURITY: Safe — type is from developer-provided column config, constrained to known values below\n const type = editConfig.type ?? 'text'\n\n switch (type) {\n case 'select':\n return renderSelect(editConfig.options ?? [], value, rowId, columnId, editConfig.placeholder)\n case 'checkbox':\n // SECURITY: User data — columnId and rowId escaped via escAttr() for data-attributes\n return `<input type=\"checkbox\" class=\"yable-checkbox\" data-yable-input=\"${escAttr(columnId)}\" data-yable-input-row=\"${escAttr(rowId)}\"${value ? ' checked' : ''} />`\n case 'toggle':\n // SECURITY: User data — columnId and rowId escaped via escAttr() for data-attributes\n // SECURITY: Safe — Boolean(value) produces \"true\" or \"false\"\n return `<input type=\"checkbox\" role=\"switch\" class=\"yable-toggle\" data-yable-input=\"${escAttr(columnId)}\" data-yable-input-row=\"${escAttr(rowId)}\"${value ? ' checked' : ''} aria-checked=\"${Boolean(value)}\" />`\n case 'date':\n case 'datetime-local':\n case 'time':\n // SECURITY: User data — date value escaped via esc() in attribute, columnId and rowId escaped via escAttr()\n return `<input type=\"${esc(type)}\" class=\"yable-input\" data-yable-input=\"${escAttr(columnId)}\" data-yable-input-row=\"${escAttr(rowId)}\" value=\"${esc(formatDateValue(value, type))}\" />`\n default:\n // SECURITY: User data — value escaped via esc() in attribute, placeholder escaped via esc(), columnId and rowId escaped via escAttr()\n // SECURITY: type comes from developer columnDef config — escaped as defense-in-depth\n return `<input type=\"${esc(type)}\" class=\"yable-input\" data-yable-input=\"${escAttr(columnId)}\" data-yable-input-row=\"${escAttr(rowId)}\" value=\"${esc(String(value ?? ''))}\"${editConfig.placeholder ? ` placeholder=\"${esc(editConfig.placeholder)}\"` : ''} />`\n }\n}\n\nfunction renderSelect(\n options: Array<{ label: string; value: unknown }>,\n value: unknown,\n rowId: string,\n columnId: string,\n placeholder?: string\n): string {\n // SECURITY: User data — columnId and rowId escaped via escAttr() for data-attributes\n let html = `<select class=\"yable-select\" data-yable-input=\"${escAttr(columnId)}\" data-yable-input-row=\"${escAttr(rowId)}\">`\n if (placeholder) {\n // SECURITY: User data — placeholder escaped via esc()\n html += `<option value=\"\" disabled>${esc(placeholder)}</option>`\n }\n for (const opt of options) {\n const selected = String(opt.value) === String(value) ? ' selected' : ''\n // SECURITY: User data — opt.value and opt.label escaped via esc()\n html += `<option value=\"${esc(opt.value)}\"${selected}>${esc(opt.label)}</option>`\n }\n html += '</select>'\n return html\n}\n\nfunction formatDateValue(value: unknown, type: string): string {\n if (!value) return ''\n if (typeof value === 'string') return value\n if (value instanceof Date) {\n if (type === 'date') return value.toISOString().split('T')[0]!\n if (type === 'datetime-local') return value.toISOString().slice(0, 16)\n if (type === 'time') return value.toISOString().slice(11, 16)\n }\n return String(value)\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\nfunction getPinStyle<TData extends RowData>(column: Column<TData, unknown>): string {\n const pinned = column.getIsPinned()\n if (!pinned) return ''\n\n // SECURITY: Safe — pinned is 'left' | 'right' from internal enum, offset is numeric\n const offset = column.getPinnedIndex() * 150 // approximate offset, proper calculation needs column sizes\n return `position: sticky; ${pinned}: ${offset}px; z-index: 1;`\n}\n\n// ---------------------------------------------------------------------------\n// Pagination HTML\n// ---------------------------------------------------------------------------\nexport function renderPagination<TData extends RowData>(\n table: Table<TData>,\n opts: {\n showPageSize?: boolean\n pageSizes?: number[]\n showInfo?: boolean\n } = {}\n): string {\n const { showPageSize = true, pageSizes = [10, 20, 50, 100], showInfo = true } = opts\n const { pageIndex, pageSize } = table.getState().pagination\n const pageCount = table.getPageCount()\n const totalRows = table.getPrePaginationRowModel().rows.length\n // SECURITY: Safe — all values are numeric from internal state\n const from = pageIndex * pageSize + 1\n const to = Math.min((pageIndex + 1) * pageSize, totalRows)\n\n // SECURITY: Safe — internal/constant value\n let html = '<div class=\"yable-pagination\">'\n\n if (showInfo) {\n html += '<div class=\"yable-pagination-info\">'\n // SECURITY: Safe — from, to, totalRows are numeric\n html += totalRows > 0 ? `<span>${from}\\u2013${to} of ${totalRows}</span>` : '<span>No results</span>'\n\n if (showPageSize) {\n html += '<select class=\"yable-pagination-select\" data-yable-pagesize>'\n for (const size of pageSizes) {\n // SECURITY: Safe — pageSizes is developer-provided number array\n html += `<option value=\"${size}\"${size === pageSize ? ' selected' : ''}>${size} rows</option>`\n }\n html += '</select>'\n }\n html += '</div>'\n }\n\n html += '<div class=\"yable-pagination-pages\">'\n // SECURITY: Safe — internal/constant values, disabled is boolean\n html += `<button class=\"yable-pagination-btn\" data-yable-page=\"first\"${!table.getCanPreviousPage() ? ' disabled' : ''} aria-label=\"First page\">&#171;</button>`\n html += `<button class=\"yable-pagination-btn\" data-yable-page=\"prev\"${!table.getCanPreviousPage() ? ' disabled' : ''} aria-label=\"Previous page\">&#8249;</button>`\n\n // Page number buttons\n const pages = getPageNumbers(pageIndex, pageCount)\n for (let i = 0; i < pages.length; i++) {\n const page = pages[i]!\n if (page === -1) {\n // SECURITY: Safe — internal/constant value\n html += '<span class=\"yable-pagination-btn\" style=\"cursor:default;opacity:0.5\">...</span>'\n } else {\n // SECURITY: Safe — page is numeric from getPageNumbers()\n html += `<button class=\"yable-pagination-btn\" data-yable-page=\"${page}\"${page === pageIndex ? ' data-active=\"true\" aria-current=\"page\"' : ''} aria-label=\"Page ${page + 1}\">${page + 1}</button>`\n }\n }\n\n // SECURITY: Safe — internal/constant values, disabled is boolean\n html += `<button class=\"yable-pagination-btn\" data-yable-page=\"next\"${!table.getCanNextPage() ? ' disabled' : ''} aria-label=\"Next page\">&#8250;</button>`\n html += `<button class=\"yable-pagination-btn\" data-yable-page=\"last\"${!table.getCanNextPage() ? ' disabled' : ''} aria-label=\"Last page\">&#187;</button>`\n html += '</div></div>'\n\n return html\n}\n\nfunction getPageNumbers(current: number, total: number): number[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i)\n const pages: number[] = [0]\n if (current > 3) pages.push(-1)\n const start = Math.max(1, current - 1)\n const end = Math.min(total - 2, current + 1)\n for (let i = start; i <= end; i++) pages.push(i)\n if (current < total - 4) pages.push(-1)\n pages.push(total - 1)\n return pages\n}\n","// @zvndev/yable-vanilla — Event Delegation\n\nimport type { RowData, Table } from '@zvndev/yable-core'\n\nexport type VanillaEventHandler = (event: {\n type: string\n rowId?: string\n columnId?: string\n originalEvent: Event\n value?: unknown\n}) => void\n\nexport interface VanillaEventHandlers {\n 'cell:click'?: VanillaEventHandler\n 'cell:dblclick'?: VanillaEventHandler\n 'row:click'?: VanillaEventHandler\n 'row:dblclick'?: VanillaEventHandler\n 'header:click'?: VanillaEventHandler\n [key: string]: VanillaEventHandler | undefined\n}\n\nexport function attachEventDelegation<TData extends RowData>(\n root: HTMLElement,\n table: Table<TData>,\n handlers: VanillaEventHandlers,\n onUpdate: () => void\n): () => void {\n const abortController = new AbortController()\n const signal = abortController.signal\n\n // Click delegation\n root.addEventListener(\n 'click',\n (e) => {\n const target = e.target as HTMLElement\n\n // Pagination buttons\n const pageBtn = target.closest<HTMLElement>('[data-yable-page]')\n if (pageBtn) {\n const page = pageBtn.dataset.yablePage!\n if (page === 'first') table.setPageIndex(0)\n else if (page === 'last') table.setPageIndex(table.getPageCount() - 1)\n else if (page === 'prev') table.previousPage()\n else if (page === 'next') table.nextPage()\n else table.setPageIndex(Number(page))\n onUpdate()\n return\n }\n\n // Sort header click\n const th = target.closest<HTMLElement>('[data-yable-sortable=\"true\"]')\n if (th) {\n const columnId = th.dataset.yableColumn!\n const column = table.getColumn(columnId)\n if (column) {\n column.toggleSorting()\n onUpdate()\n }\n handlers['header:click']?.({\n type: 'header:click',\n columnId,\n originalEvent: e,\n })\n return\n }\n\n // Cell click\n const td = target.closest<HTMLElement>('[data-yable-cell]')\n if (td) {\n const columnId = td.dataset.yableCell!\n const rowId = td.dataset.yableRow!\n handlers['cell:click']?.({\n type: 'cell:click',\n rowId,\n columnId,\n originalEvent: e,\n })\n }\n\n // Row click\n const tr = target.closest<HTMLElement>('[data-yable-row]')\n if (tr && !target.closest('input, select, button')) {\n const rowId = tr.dataset.yableRow!\n handlers['row:click']?.({\n type: 'row:click',\n rowId,\n originalEvent: e,\n })\n }\n },\n { signal }\n )\n\n // Double-click delegation\n root.addEventListener(\n 'dblclick',\n (e) => {\n const target = e.target as HTMLElement\n\n const td = target.closest<HTMLElement>('[data-yable-cell]')\n if (td) {\n const columnId = td.dataset.yableCell!\n const rowId = td.dataset.yableRow!\n handlers['cell:dblclick']?.({\n type: 'cell:dblclick',\n rowId,\n columnId,\n originalEvent: e,\n })\n }\n\n const tr = target.closest<HTMLElement>('[data-yable-row]')\n if (tr) {\n const rowId = tr.dataset.yableRow!\n handlers['row:dblclick']?.({\n type: 'row:dblclick',\n rowId,\n originalEvent: e,\n })\n }\n },\n { signal }\n )\n\n // Input change delegation (forms in cells)\n root.addEventListener(\n 'change',\n (e) => {\n const target = e.target as HTMLInputElement | HTMLSelectElement\n const columnId = target.dataset.yableInput\n const rowId = target.dataset.yableInputRow\n if (!columnId || !rowId) return\n\n let value: unknown\n if (target instanceof HTMLInputElement && (target.type === 'checkbox')) {\n value = target.checked\n } else if (target instanceof HTMLInputElement && target.type === 'number') {\n value = Number(target.value)\n } else {\n value = target.value\n }\n\n table.setPendingValue(rowId, columnId, value)\n onUpdate()\n },\n { signal }\n )\n\n // Input blur delegation (commit editing)\n root.addEventListener(\n 'blur',\n (e) => {\n const target = e.target as HTMLElement\n if (target.dataset.yableInput && target.dataset.yableInputRow) {\n // Only commit if we're in click-to-edit mode (not always-editable)\n const editing = table.getState().editing\n if (editing.activeCell) {\n table.commitEdit()\n onUpdate()\n }\n }\n },\n { signal, capture: true }\n )\n\n // Page size select\n root.addEventListener(\n 'change',\n (e) => {\n const target = e.target as HTMLSelectElement\n if (target.dataset.yablePagesize !== undefined) {\n table.setPageSize(Number(target.value))\n onUpdate()\n }\n },\n { signal }\n )\n\n // Resize handle delegation\n root.addEventListener(\n 'mousedown',\n (e) => {\n const target = e.target as HTMLElement\n if (target.classList.contains('yable-resize-handle')) {\n const columnId = target.dataset.yableResize!\n // Find the header for this column to get the resize handler\n for (const headerGroup of table.getHeaderGroups()) {\n for (const header of headerGroup.headers) {\n if (header.column.id === columnId) {\n const handler = header.getResizeHandler()\n if (handler) {\n handler(e)\n onUpdate()\n }\n break\n }\n }\n }\n }\n },\n { signal }\n )\n\n return () => abortController.abort()\n}\n","// @zvndev/yable-vanilla — createTableDOM factory\n\nimport {\n createTable,\n functionalUpdate,\n type RowData,\n type TableOptions,\n type TableState,\n type Table,\n type Updater,\n} from '@zvndev/yable-core'\nimport { renderTable, renderPagination } from './renderer'\nimport { attachEventDelegation, type VanillaEventHandlers, type VanillaEventHandler } from './events'\n\nexport interface CreateTableDOMOptions<TData extends RowData> extends Omit<TableOptions<TData>, 'state' | 'onStateChange'> {\n element: HTMLElement\n /** Optional initial state override */\n initialState?: Partial<TableState>\n\n // Display options\n stickyHeader?: boolean\n striped?: boolean\n bordered?: boolean\n compact?: boolean\n theme?: string\n clickableRows?: boolean\n footer?: boolean\n emptyMessage?: string\n\n // Pagination display options\n pagination?: boolean | {\n showPageSize?: boolean\n pageSizes?: number[]\n showInfo?: boolean\n }\n}\n\nexport interface TableDOM<TData extends RowData> {\n /** The underlying core table instance */\n table: Table<TData>\n /** Re-render the table */\n render: () => void\n /** Update data and re-render */\n setData: (data: TData[]) => void\n /** Get current state */\n getState: () => TableState\n /** Update table options */\n setOptions: (opts: Partial<CreateTableDOMOptions<TData>>) => void\n /** Register event handler */\n on: (event: string, handler: VanillaEventHandler) => void\n /** Remove event handler */\n off: (event: string) => void\n /** Destroy the table instance and clean up */\n destroy: () => void\n}\n\nexport function createTableDOM<TData extends RowData>(\n options: CreateTableDOMOptions<TData>\n): TableDOM<TData> {\n const { element, initialState, ...tableOpts } = options\n const {\n stickyHeader,\n striped,\n bordered,\n compact,\n theme,\n clickableRows,\n footer,\n emptyMessage,\n pagination: paginationOpts,\n ...coreOptions\n } = tableOpts\n\n // Internal state\n let state: TableState = {\n sorting: [],\n columnFilters: [],\n globalFilter: '',\n pagination: { pageIndex: 0, pageSize: 10 },\n rowSelection: {},\n columnVisibility: {},\n columnOrder: [],\n columnPinning: { left: [], right: [] },\n columnSizing: {},\n columnSizingInfo: {\n startOffset: null,\n startSize: null,\n deltaOffset: null,\n deltaPercentage: null,\n isResizingColumn: false,\n columnSizingStart: [],\n },\n expanded: {},\n rowPinning: { top: [], bottom: [] },\n grouping: [],\n editing: { activeCell: undefined, pendingValues: {} },\n commits: { cells: {}, nextOpId: 1 },\n keyboardNavigation: { focusedCell: null },\n undoRedo: { undoStack: [], redoStack: [], maxSize: 50 },\n fillHandle: { isDragging: false },\n formulas: { enabled: false, formulas: {}, computedValues: {}, errors: {} },\n rowDrag: { draggingRowId: null, overRowId: null, dropPosition: null },\n pivot: {\n enabled: false,\n config: { rowFields: [], columnFields: [], valueFields: [] },\n expandedRowGroups: {},\n expandedColumnGroups: {},\n },\n ...initialState,\n }\n\n // Display options (mutable for updates)\n let displayOpts = {\n stickyHeader,\n striped,\n bordered,\n compact,\n theme,\n clickableRows,\n footer,\n emptyMessage,\n }\n\n let paginationDisplayOpts = typeof paginationOpts === 'object'\n ? paginationOpts\n : paginationOpts\n ? {}\n : undefined\n\n // Event handlers (registered via .on())\n const handlers: VanillaEventHandlers = {}\n\n // Create core table\n const coreTable = createTable<TData>({\n ...coreOptions,\n state,\n onStateChange: (updater: Updater<TableState>) => {\n state = functionalUpdate(updater, state)\n render()\n },\n } as TableOptions<TData>)\n\n let cleanupEvents: (() => void) | null = null\n\n function render() {\n // Update state on the core instance\n coreTable.setOptions((prev) => ({\n ...prev,\n ...coreOptions,\n state,\n onStateChange: (updater: Updater<TableState>) => {\n state = functionalUpdate(updater, state)\n render()\n },\n }))\n\n // Clean up old event listeners\n cleanupEvents?.()\n\n // Generate HTML\n let html = renderTable(coreTable, displayOpts)\n\n if (paginationDisplayOpts !== undefined) {\n html += renderPagination(coreTable, paginationDisplayOpts)\n }\n\n element.innerHTML = html\n\n // Re-attach event delegation\n cleanupEvents = attachEventDelegation(element, coreTable, handlers, render)\n }\n\n // Initial render\n render()\n\n const instance: TableDOM<TData> = {\n table: coreTable,\n\n render,\n\n setData(data: TData[]) {\n coreTable.setOptions((prev) => ({\n ...prev,\n data,\n state,\n onStateChange: (updater: Updater<TableState>) => {\n state = functionalUpdate(updater, state)\n render()\n },\n }))\n render()\n },\n\n getState() {\n return state\n },\n\n setOptions(opts) {\n const { element: _el, initialState: _is, ...rest } = opts as any\n const {\n stickyHeader: sh, striped: st, bordered: bd, compact: cp,\n theme: th, clickableRows: cr, footer: ft, emptyMessage: em,\n pagination: pg,\n ...core\n } = rest\n\n if (sh !== undefined || st !== undefined || bd !== undefined || cp !== undefined || th !== undefined || cr !== undefined || ft !== undefined || em !== undefined) {\n displayOpts = { ...displayOpts, stickyHeader: sh ?? displayOpts.stickyHeader, striped: st ?? displayOpts.striped, bordered: bd ?? displayOpts.bordered, compact: cp ?? displayOpts.compact, theme: th ?? displayOpts.theme, clickableRows: cr ?? displayOpts.clickableRows, footer: ft ?? displayOpts.footer, emptyMessage: em ?? displayOpts.emptyMessage }\n }\n\n if (pg !== undefined) {\n paginationDisplayOpts = typeof pg === 'object' ? pg : pg ? {} : undefined\n }\n\n if (Object.keys(core).length > 0) {\n Object.assign(coreOptions, core)\n }\n\n render()\n },\n\n on(event: string, handler: VanillaEventHandler) {\n handlers[event] = handler\n },\n\n off(event: string) {\n delete handlers[event]\n },\n\n destroy() {\n cleanupEvents?.()\n element.innerHTML = ''\n },\n }\n\n return instance\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@zvndev/yable-vanilla",
3
+ "version": "0.1.0",
4
+ "description": "Vanilla JS/DOM renderer for @zvndev/yable-core -- framework-free table rendering",
5
+ "keywords": ["table", "data-grid", "datagrid", "vanilla", "javascript", "dom", "renderer"],
6
+ "license": "MIT",
7
+ "author": "ZVN DEV",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/ZVN-DEV/table.git",
11
+ "directory": "packages/vanilla"
12
+ },
13
+ "homepage": "https://github.com/ZVN-DEV/table#readme",
14
+ "type": "module",
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "import": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ },
24
+ "require": {
25
+ "types": "./dist/index.d.cts",
26
+ "default": "./dist/index.cjs"
27
+ }
28
+ }
29
+ },
30
+ "files": ["dist"],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "test": "vitest",
35
+ "test:ci": "vitest run --passWithNoTests",
36
+ "typecheck": "tsc --noEmit",
37
+ "clean": "rm -rf dist"
38
+ },
39
+ "dependencies": {
40
+ "@zvndev/yable-core": "workspace:*"
41
+ },
42
+ "peerDependencies": {
43
+ "@zvndev/yable-themes": "workspace:*"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@zvndev/yable-themes": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "devDependencies": {
51
+ "tsup": "^8.3.0",
52
+ "vitest": "^2.1.0",
53
+ "typescript": "^5.7.0"
54
+ }
55
+ }