@framesquared/component 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.
- package/LICENSE +21 -0
- package/dist/index.d.ts +350 -0
- package/dist/index.js +1644 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Component.ts","../src/Template.ts","../src/query/CQParser.ts","../src/query/CQMatcher.ts","../src/ComponentQuery.ts","../src/Layout.ts","../src/Container.ts","../src/query/ComponentQuery.ts","../src/template/XTemplate.ts"],"sourcesContent":["/**\n * @framesquared/component – Component\n *\n * The base for all UI widgets. Provides a complete lifecycle,\n * DOM element management, CSS operations, sizing with ResizeObserver,\n * template rendering, focus management, and deterministic destruction.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Base, Observable, generateId } from '@framesquared/core';\nimport { Template } from './Template.js';\n\n// ---------------------------------------------------------------------------\n// Observable bootstrap\n// ---------------------------------------------------------------------------\n\nconst ObservableMixin: typeof Base = Observable;\n\nfunction ensureObservable(instance: any): void {\n const proto = ObservableMixin.prototype;\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (name === 'constructor') continue;\n if (name in instance) continue;\n const desc = Object.getOwnPropertyDescriptor(proto, name);\n if (desc && typeof desc.value === 'function') {\n instance[name] = desc.value.bind(instance);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Config interface\n// ---------------------------------------------------------------------------\n\nexport interface ComponentConfig {\n xtype?: string;\n cls?: string | string[];\n style?: Partial<CSSStyleDeclaration> | string;\n width?: number | string;\n height?: number | string;\n minWidth?: number;\n maxWidth?: number;\n minHeight?: number;\n maxHeight?: number;\n margin?: number | string;\n padding?: number | string;\n hidden?: boolean;\n disabled?: boolean;\n html?: string;\n tpl?: Template;\n data?: Record<string, unknown>;\n renderTo?: Element | string;\n floating?: boolean;\n listeners?: Record<string, Function>;\n reference?: string;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toCssValue(v: number | string): string {\n return typeof v === 'number' ? `${v}px` : v;\n}\n\n// ---------------------------------------------------------------------------\n// Simple CQ match (used by up() — full CQ in ComponentQuery.ts)\n// ---------------------------------------------------------------------------\n\nfunction matchesCQSimple(cmp: any, selector: string): boolean {\n selector = selector.trim();\n if (selector.startsWith('#')) {\n return cmp.componentId === selector.slice(1);\n }\n if (selector.startsWith('.')) {\n return cmp.el?.classList?.contains(selector.slice(1)) ?? false;\n }\n // xtype match\n return cmp._config?.xtype === selector;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport class Component extends Base {\n static override $className = 'Ext.Component';\n\n // -- Public state --\n el: HTMLElement | null = null;\n rendered = false;\n\n /** The Container that owns this Component (set by Container.add). */\n ownerCt: Component | null = null;\n\n // -- Internal state --\n private _hidden = false;\n private _disabled = false;\n private _tpl: Template | null = null;\n private _data: Record<string, unknown> | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n private _lastWidth = 0;\n private _lastHeight = 0;\n protected _config: ComponentConfig;\n\n /** Unique component id */\n readonly componentId: string;\n\n $destroyHooks: (() => void)[] = [];\n\n // -----------------------------------------------------------------------\n // Construction\n // -----------------------------------------------------------------------\n\n constructor(config: ComponentConfig = {}) {\n super();\n this._config = config;\n this.componentId = generateId('ext-cmp');\n\n ensureObservable(this);\n\n // Apply listeners from config early so lifecycle events can be caught\n if (config.listeners) {\n for (const [event, handler] of Object.entries(config.listeners)) {\n (this as any).on(event, handler);\n }\n }\n\n // Store template & data\n this._tpl = config.tpl ?? null;\n this._data = config.data ?? null;\n this._hidden = config.hidden ?? false;\n this._disabled = config.disabled ?? false;\n\n // Initialization lifecycle\n this.beforeInitialize();\n this.initialize();\n this.afterInitialize();\n\n // Auto-render if renderTo is specified\n if (config.renderTo) {\n this.render(config.renderTo);\n }\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle hooks (override in subclasses)\n // -----------------------------------------------------------------------\n\n /** Called before initialize(). Override in subclasses. */\n protected beforeInitialize(): void {}\n /** Main initialization. Override in subclasses. */\n protected initialize(): void {}\n /** Called after initialize(). Override in subclasses. */\n protected afterInitialize(): void {}\n /** Called before render(). Override in subclasses. */\n protected beforeRender(): void {}\n /** Called after render(). Override in subclasses. */\n protected afterRender(): void {}\n /** Called before destroy(). Override in subclasses. */\n protected beforeDestroy(): void {}\n /** Called during destroy(). Override in subclasses. */\n protected onDestroy(): void {}\n /** Called after destroy(). Override in subclasses. */\n protected afterDestroy(): void {}\n\n // -----------------------------------------------------------------------\n // Render\n // -----------------------------------------------------------------------\n\n render(container?: Element | string, position?: number | Element): void {\n if (this.rendered || this.isDestroyed) return;\n\n this.fire('beforerender', this);\n this.beforeRender();\n\n // Create the root element\n this.el = document.createElement('div');\n this.el.id = this.componentId;\n this.el.classList.add('x-component');\n\n // Apply configs to DOM\n this.applyConfigs();\n\n // Insert into DOM\n const target = this.resolveElement(container);\n if (target) {\n if (typeof position === 'number') {\n const ref = target.children[position];\n if (ref) {\n target.insertBefore(this.el, ref);\n } else {\n target.appendChild(this.el);\n }\n } else if (position instanceof Element) {\n target.insertBefore(this.el, position);\n } else {\n target.appendChild(this.el);\n }\n }\n\n // Set up ResizeObserver\n this.setupResizeObserver();\n\n this.rendered = true;\n\n this.fire('render', this);\n this.afterRender();\n this.fire('afterrender', this);\n }\n\n private resolveElement(target?: Element | string): Element | null {\n if (!target) return null;\n if (typeof target === 'string') {\n return document.querySelector(target);\n }\n return target;\n }\n\n // -----------------------------------------------------------------------\n // Config application to DOM\n // -----------------------------------------------------------------------\n\n private applyConfigs(): void {\n const el = this.el!;\n const cfg = this._config;\n\n // cls\n if (cfg.cls) {\n const classes = Array.isArray(cfg.cls) ? cfg.cls : cfg.cls.split(/\\s+/);\n for (const c of classes) {\n if (c) el.classList.add(c);\n }\n }\n\n // style\n if (cfg.style) {\n if (typeof cfg.style === 'string') {\n el.style.cssText += cfg.style;\n } else {\n const styleObj = cfg.style as Record<string, string>;\n for (const [prop, value] of Object.entries(styleObj)) {\n (el.style as any)[prop] = value;\n }\n }\n }\n\n // Size\n if (cfg.width !== undefined) el.style.width = toCssValue(cfg.width);\n if (cfg.height !== undefined) el.style.height = toCssValue(cfg.height);\n if (cfg.minWidth !== undefined) el.style.minWidth = toCssValue(cfg.minWidth);\n if (cfg.maxWidth !== undefined) el.style.maxWidth = toCssValue(cfg.maxWidth);\n if (cfg.minHeight !== undefined) el.style.minHeight = toCssValue(cfg.minHeight);\n if (cfg.maxHeight !== undefined) el.style.maxHeight = toCssValue(cfg.maxHeight);\n\n // Spacing\n if (cfg.margin !== undefined) el.style.margin = toCssValue(cfg.margin);\n if (cfg.padding !== undefined) el.style.padding = toCssValue(cfg.padding);\n\n // Content\n if (this._tpl && this._data) {\n el.innerHTML = this._tpl.apply(this._data);\n } else if (cfg.html !== undefined) {\n el.innerHTML = cfg.html;\n }\n\n // Hidden\n if (this._hidden) {\n el.style.display = 'none';\n }\n\n // Disabled\n if (this._disabled) {\n el.classList.add('x-disabled');\n el.setAttribute('aria-disabled', 'true');\n }\n\n // Floating\n if (cfg.floating) {\n el.style.position = 'absolute';\n el.classList.add('x-floating');\n }\n }\n\n // -----------------------------------------------------------------------\n // Visibility\n // -----------------------------------------------------------------------\n\n isVisible(): boolean {\n return !this._hidden;\n }\n\n setVisible(visible: boolean): void {\n if (visible) this.show();\n else this.hide();\n }\n\n show(): void {\n if (this.isDestroyed) return;\n this._hidden = false;\n if (this.el) {\n this.el.style.display = '';\n }\n this.fire('show', this);\n }\n\n hide(): void {\n if (this.isDestroyed) return;\n this._hidden = true;\n if (this.el) {\n this.el.style.display = 'none';\n }\n this.fire('hide', this);\n }\n\n // -----------------------------------------------------------------------\n // Enable / Disable\n // -----------------------------------------------------------------------\n\n isDisabled(): boolean {\n return this._disabled;\n }\n\n enable(): void {\n if (this.isDestroyed) return;\n this._disabled = false;\n if (this.el) {\n this.el.classList.remove('x-disabled');\n this.el.removeAttribute('aria-disabled');\n }\n this.fire('enable', this);\n }\n\n disable(): void {\n if (this.isDestroyed) return;\n this._disabled = true;\n if (this.el) {\n this.el.classList.add('x-disabled');\n this.el.setAttribute('aria-disabled', 'true');\n }\n this.fire('disable', this);\n }\n\n // -----------------------------------------------------------------------\n // Size & Position\n // -----------------------------------------------------------------------\n\n getWidth(): number {\n return this.el?.offsetWidth ?? 0;\n }\n\n getHeight(): number {\n return this.el?.offsetHeight ?? 0;\n }\n\n getSize(): { width: number; height: number } {\n return { width: this.getWidth(), height: this.getHeight() };\n }\n\n setWidth(width: number | string): void {\n if (this.el) this.el.style.width = toCssValue(width);\n }\n\n setHeight(height: number | string): void {\n if (this.el) this.el.style.height = toCssValue(height);\n }\n\n setSize(width: number | string, height: number | string): void {\n this.setWidth(width);\n this.setHeight(height);\n }\n\n getX(): number {\n return this.el?.offsetLeft ?? 0;\n }\n\n getY(): number {\n return this.el?.offsetTop ?? 0;\n }\n\n setX(x: number): void {\n if (this.el) this.el.style.left = `${x}px`;\n }\n\n setY(y: number): void {\n if (this.el) this.el.style.top = `${y}px`;\n }\n\n setPosition(x: number, y: number): void {\n this.setX(x);\n this.setY(y);\n }\n\n getBox(): { x: number; y: number; width: number; height: number } {\n return {\n x: this.getX(),\n y: this.getY(),\n width: this.getWidth(),\n height: this.getHeight(),\n };\n }\n\n // -----------------------------------------------------------------------\n // ResizeObserver\n // -----------------------------------------------------------------------\n\n private setupResizeObserver(): void {\n if (!this.el || typeof ResizeObserver === 'undefined') return;\n\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n const oldWidth = this._lastWidth;\n const oldHeight = this._lastHeight;\n this._lastWidth = width;\n this._lastHeight = height;\n this.fire('resize', this, width, height, oldWidth, oldHeight);\n }\n });\n this._resizeObserver.observe(this.el);\n }\n\n // -----------------------------------------------------------------------\n // CSS operations\n // -----------------------------------------------------------------------\n\n addCls(...classes: string[]): void {\n if (!this.el) return;\n for (const c of classes) {\n if (c) this.el.classList.add(c);\n }\n }\n\n removeCls(...classes: string[]): void {\n if (!this.el) return;\n for (const c of classes) {\n if (c) this.el.classList.remove(c);\n }\n }\n\n toggleCls(cls: string, state?: boolean): void {\n if (!this.el) return;\n if (state !== undefined) {\n this.el.classList.toggle(cls, state);\n } else {\n this.el.classList.toggle(cls);\n }\n }\n\n hasCls(cls: string): boolean {\n return this.el?.classList.contains(cls) ?? false;\n }\n\n setStyle(propOrObj: string | Record<string, string>, value?: string): void {\n if (!this.el) return;\n if (typeof propOrObj === 'string') {\n (this.el.style as any)[propOrObj] = value;\n } else {\n for (const [prop, val] of Object.entries(propOrObj)) {\n (this.el.style as any)[prop] = val;\n }\n }\n }\n\n getStyle(prop: string): string {\n if (!this.el) return '';\n return (this.el.style as any)[prop] ?? '';\n }\n\n // -----------------------------------------------------------------------\n // Content update\n // -----------------------------------------------------------------------\n\n update(htmlOrData: string | Record<string, unknown>): void {\n if (typeof htmlOrData === 'string') {\n this.setHtml(htmlOrData);\n } else {\n this.setData(htmlOrData);\n }\n }\n\n setHtml(html: string): void {\n if (this.el) {\n this.el.innerHTML = html;\n }\n }\n\n setData(data: Record<string, unknown>): void {\n this._data = data;\n if (this.el && this._tpl) {\n this.el.innerHTML = this._tpl.apply(data);\n }\n }\n\n // -----------------------------------------------------------------------\n // Element access\n // -----------------------------------------------------------------------\n\n getEl(): HTMLElement | null {\n return this.el;\n }\n\n getElement(): HTMLElement | null {\n return this.el;\n }\n\n // -----------------------------------------------------------------------\n // Focus management\n // -----------------------------------------------------------------------\n\n focus(): void {\n const target = this.getFocusEl();\n if (target) target.focus();\n }\n\n blur(): void {\n const target = this.getFocusEl();\n if (target) target.blur();\n }\n\n isFocusable(): boolean {\n if (this._disabled || this.isDestroyed || !this.rendered) return false;\n const el = this.getFocusEl();\n if (!el) return false;\n return el.tabIndex >= 0;\n }\n\n /** Returns the element that receives focus. Override for inner focus targets. */\n protected getFocusEl(): HTMLElement | null {\n return this.el;\n }\n\n // -----------------------------------------------------------------------\n // Owner lifecycle hooks\n // -----------------------------------------------------------------------\n\n /** Called when added to a Container. */\n onAdded(_owner: Component, _index: number): void {\n this.fire('added', this, _owner, _index);\n }\n\n /** Called when removed from a Container. */\n onRemoved(_destroying: boolean): void {\n this.fire('removed', this, _destroying);\n }\n\n // -----------------------------------------------------------------------\n // Ancestor traversal\n // -----------------------------------------------------------------------\n\n /**\n * Walks up the ownerCt chain and returns the first Component whose\n * xtype matches the given selector string.\n */\n up(selector: string): Component | undefined {\n let current = this.ownerCt;\n while (current) {\n if (matchesCQSimple(current, selector)) return current;\n current = current.ownerCt;\n }\n return undefined;\n }\n\n // -----------------------------------------------------------------------\n // Destroy\n // -----------------------------------------------------------------------\n\n override destroy(): void {\n if (this.isDestroyed) return;\n\n this.fire('beforedestroy', this);\n this.beforeDestroy();\n\n // Disconnect ResizeObserver\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = null;\n }\n\n // Remove from DOM\n if (this.el && this.el.parentNode) {\n this.el.parentNode.removeChild(this.el);\n }\n\n this.onDestroy();\n\n this.el = null;\n this.isDestroyed = true;\n\n this.afterDestroy();\n\n // Fire 'destroy' event BEFORE clearing listeners\n this.fire('destroy', this);\n\n // Run destroy hooks from mixins (Observable's hook clears listeners)\n for (const hook of this.$destroyHooks) {\n hook();\n }\n\n // Final cleanup — clear any remaining listeners\n if (typeof (this as any).clearListeners === 'function') {\n (this as any).clearListeners();\n }\n }\n\n // -----------------------------------------------------------------------\n // Event helper\n // -----------------------------------------------------------------------\n\n protected fire(eventName: string, ...args: unknown[]): boolean {\n if (typeof (this as any).fireEvent === 'function') {\n return (this as any).fireEvent(eventName, ...args) !== false;\n }\n return true;\n }\n}\n","/**\n * @framesquared/component – Template\n *\n * A simple template engine that supports `{token}` replacement.\n * Used by Component to render content from data.\n *\n * ```ts\n * const tpl = new Template('<div>{name} is {age} years old</div>');\n * const html = tpl.apply({ name: 'Alice', age: 30 });\n * // → '<div>Alice is 30 years old</div>'\n * ```\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class Template {\n private source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n /**\n * Applies data to the template and returns the resulting HTML string.\n * Replaces `{key}` tokens with values from the data object.\n * Supports nested keys via dot notation: `{user.name}`.\n */\n apply(data: Record<string, unknown>): string {\n return this.source.replace(/\\{([^}]+)\\}/g, (_match, key: string) => {\n const value = this.resolve(data, key.trim());\n return value !== undefined && value !== null ? String(value) : '';\n });\n }\n\n /**\n * Alias for apply().\n */\n render(data: Record<string, unknown>): string {\n return this.apply(data);\n }\n\n private resolve(data: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = data;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n }\n}\n","/**\n * @framesquared/component – CQParser\n *\n * Parses Component Query selector strings into an AST.\n *\n * Grammar:\n * selectorList = compound ( ',' compound )*\n * combinatorExpr = compound ( combinator compound )*\n * combinator = ' ' | '>' | '~' | '+'\n * compound = simpleSelector+\n * simpleSelector = typeSelector | idSelector | classSelector |\n * attributeSelector | pseudoSelector | methodSelector\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// AST node types\n// ---------------------------------------------------------------------------\n\nexport interface TypeSelectorNode {\n type: 'type';\n value: string;\n}\n\nexport interface IdSelectorNode {\n type: 'id';\n value: string;\n}\n\nexport interface ClassSelectorNode {\n type: 'class';\n value: string;\n}\n\nexport interface AttributeSelectorNode {\n type: 'attribute';\n name: string;\n operator?: string; // '=', '!=', '>', '<', '>=', '<='\n value?: string;\n}\n\nexport interface PseudoSelectorNode {\n type: 'pseudo';\n name: string;\n argument?: string | SelectorNode;\n}\n\nexport interface MethodSelectorNode {\n type: 'method';\n value: string;\n}\n\nexport interface CompoundSelectorNode {\n type: 'compound';\n selectors: any[]; // simple selector nodes\n}\n\nexport interface CombinatorNode {\n type: 'combinator';\n combinator: string; // ' ', '>', '~', '+'\n left: SelectorNode;\n right: SelectorNode;\n}\n\nexport interface SelectorListNode {\n type: 'list';\n items: SelectorNode[];\n}\n\nexport type SimpleSelectorNode =\n | TypeSelectorNode\n | IdSelectorNode\n | ClassSelectorNode\n | AttributeSelectorNode\n | PseudoSelectorNode\n | MethodSelectorNode;\n\nexport type SelectorNode =\n | CompoundSelectorNode\n | CombinatorNode\n | SelectorListNode;\n\n// ---------------------------------------------------------------------------\n// Tokenizer\n// ---------------------------------------------------------------------------\n\ninterface Token {\n type: 'ident' | 'hash' | 'dot' | 'bracket' | 'colon' | 'brace' |\n 'combinator' | 'comma' | 'whitespace';\n value: string;\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < input.length) {\n const ch = input[i];\n\n // Whitespace\n if (ch === ' ' || ch === '\\t' || ch === '\\n') {\n // Collapse whitespace; emit only if between meaningful tokens\n while (i < input.length && /\\s/.test(input[i])) i++;\n if (tokens.length > 0 && i < input.length) {\n tokens.push({ type: 'whitespace', value: ' ' });\n }\n continue;\n }\n\n // Comma\n if (ch === ',') {\n // Remove trailing whitespace token\n if (tokens.length > 0 && tokens[tokens.length - 1].type === 'whitespace') {\n tokens.pop();\n }\n tokens.push({ type: 'comma', value: ',' });\n i++;\n continue;\n }\n\n // Combinators: >, ~, +\n if (ch === '>' || ch === '~' || ch === '+') {\n // Remove trailing whitespace\n if (tokens.length > 0 && tokens[tokens.length - 1].type === 'whitespace') {\n tokens.pop();\n }\n tokens.push({ type: 'combinator', value: ch });\n i++;\n // Skip leading whitespace after combinator\n while (i < input.length && /\\s/.test(input[i])) i++;\n continue;\n }\n\n // #id\n if (ch === '#') {\n i++;\n let id = '';\n while (i < input.length && /[\\w-]/.test(input[i])) {\n id += input[i++];\n }\n tokens.push({ type: 'hash', value: id });\n continue;\n }\n\n // .class\n if (ch === '.') {\n i++;\n let cls = '';\n while (i < input.length && /[\\w-]/.test(input[i])) {\n cls += input[i++];\n }\n tokens.push({ type: 'dot', value: cls });\n continue;\n }\n\n // [attribute...]\n if (ch === '[') {\n i++;\n let content = '';\n let depth = 1;\n while (i < input.length && depth > 0) {\n if (input[i] === '[') depth++;\n else if (input[i] === ']') depth--;\n if (depth > 0) content += input[i];\n i++;\n }\n tokens.push({ type: 'bracket', value: content });\n continue;\n }\n\n // :pseudo\n if (ch === ':') {\n i++;\n let name = '';\n while (i < input.length && /[\\w-]/.test(input[i])) {\n name += input[i++];\n }\n // Capture argument in parens\n let arg = '';\n if (i < input.length && input[i] === '(') {\n i++;\n let depth = 1;\n while (i < input.length && depth > 0) {\n if (input[i] === '(') depth++;\n else if (input[i] === ')') depth--;\n if (depth > 0) arg += input[i];\n i++;\n }\n }\n tokens.push({ type: 'colon', value: name + (arg ? `(${arg})` : '') });\n continue;\n }\n\n // {method}\n if (ch === '{') {\n i++;\n let name = '';\n while (i < input.length && input[i] !== '}') {\n name += input[i++];\n }\n if (i < input.length) i++; // skip '}'\n tokens.push({ type: 'brace', value: name });\n continue;\n }\n\n // Identifier (xtype)\n if (/[\\w-]/.test(ch)) {\n let ident = '';\n while (i < input.length && /[\\w-]/.test(input[i])) {\n ident += input[i++];\n }\n tokens.push({ type: 'ident', value: ident });\n continue;\n }\n\n // Unknown character — skip\n i++;\n }\n\n // Remove trailing whitespace\n if (tokens.length > 0 && tokens[tokens.length - 1].type === 'whitespace') {\n tokens.pop();\n }\n\n return tokens;\n}\n\n// ---------------------------------------------------------------------------\n// Parser\n// ---------------------------------------------------------------------------\n\nexport class CQParser {\n private tokens: Token[];\n private pos: number;\n\n private constructor(tokens: Token[]) {\n this.tokens = tokens;\n this.pos = 0;\n }\n\n static parse(selector: string): SelectorNode {\n selector = selector.trim();\n if (!selector) throw new Error('CQ: empty selector');\n\n const tokens = tokenize(selector);\n if (tokens.length === 0) throw new Error(`CQ: invalid selector \"${selector}\"`);\n\n const parser = new CQParser(tokens);\n return parser.parseSelectorList();\n }\n\n private peek(): Token | undefined {\n return this.tokens[this.pos];\n }\n\n private advance(): Token {\n return this.tokens[this.pos++];\n }\n\n // selectorList = combinatorExpr ( ',' combinatorExpr )*\n private parseSelectorList(): SelectorNode {\n const first = this.parseCombinatorExpr();\n if (!this.peek() || this.peek()!.type !== 'comma') return first;\n\n const items: SelectorNode[] = [first];\n while (this.peek()?.type === 'comma') {\n this.advance(); // consume ','\n // Skip whitespace after comma\n while (this.peek()?.type === 'whitespace') this.advance();\n items.push(this.parseCombinatorExpr());\n }\n return { type: 'list', items } as SelectorListNode;\n }\n\n // combinatorExpr = compound ( (combinator | whitespace) compound )*\n private parseCombinatorExpr(): SelectorNode {\n let left: SelectorNode = this.parseCompound();\n\n while (this.peek()) {\n const tok = this.peek()!;\n\n if (tok.type === 'combinator') {\n const combinator = this.advance().value;\n const right = this.parseCompound();\n left = { type: 'combinator', combinator, left, right } as CombinatorNode;\n } else if (tok.type === 'whitespace') {\n this.advance(); // consume whitespace\n // Check if the next token is a combinator\n const next = this.peek();\n if (!next || next.type === 'comma') break;\n if (next.type === 'combinator') continue; // let the loop pick it up\n const right = this.parseCompound();\n left = { type: 'combinator', combinator: ' ', left, right } as CombinatorNode;\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // compound = simpleSelector+\n private parseCompound(): CompoundSelectorNode {\n const selectors: SimpleSelectorNode[] = [];\n\n while (this.peek()) {\n const tok = this.peek()!;\n\n if (tok.type === 'ident') {\n selectors.push({ type: 'type', value: this.advance().value });\n } else if (tok.type === 'hash') {\n selectors.push({ type: 'id', value: this.advance().value });\n } else if (tok.type === 'dot') {\n selectors.push({ type: 'class', value: this.advance().value });\n } else if (tok.type === 'bracket') {\n selectors.push(this.parseAttribute(this.advance().value));\n } else if (tok.type === 'colon') {\n selectors.push(this.parsePseudo(this.advance().value));\n } else if (tok.type === 'brace') {\n selectors.push({ type: 'method', value: this.advance().value });\n } else {\n break;\n }\n }\n\n if (selectors.length === 0) {\n throw new Error('CQ: expected selector');\n }\n\n return { type: 'compound', selectors };\n }\n\n // [name], [name=value], [name>5], [name>=5], [name<5], [name<=5], [name!=v]\n private parseAttribute(content: string): AttributeSelectorNode {\n // Match operator: >=, <=, !=, >, <, =\n const opMatch = content.match(/^([\\w-]+)\\s*(>=|<=|!=|>|<|=)\\s*(.*)$/);\n if (opMatch) {\n let val = opMatch[3].trim();\n // Strip quotes\n if ((val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1);\n }\n return { type: 'attribute', name: opMatch[1], operator: opMatch[2], value: val };\n }\n // Existence only\n return { type: 'attribute', name: content.trim() };\n }\n\n // :name or :name(arg)\n private parsePseudo(raw: string): PseudoSelectorNode {\n const parenIdx = raw.indexOf('(');\n if (parenIdx === -1) {\n return { type: 'pseudo', name: raw };\n }\n const name = raw.slice(0, parenIdx);\n const argStr = raw.slice(parenIdx + 1, -1); // strip parens\n\n // :not() gets its argument parsed as a selector\n if (name === 'not') {\n const inner = CQParser.parse(argStr);\n return { type: 'pseudo', name: 'not', argument: inner };\n }\n\n return { type: 'pseudo', name, argument: argStr };\n }\n}\n","/**\n * @framesquared/component – CQMatcher\n *\n * Evaluates parsed CQ AST nodes against Component instances.\n * Handles simple selectors, compound selectors, all four combinators,\n * pseudo-classes, method matchers, and comma-separated OR lists.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Component } from '../Component.js';\nimport { CQParser } from './CQParser.js';\nimport type {\n SelectorNode, CompoundSelectorNode, CombinatorNode,\n SelectorListNode, SimpleSelectorNode,\n} from './CQParser.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport class CQMatcher {\n /**\n * Returns true if `component` matches the selector string.\n */\n static matches(component: Component, selector: string): boolean {\n const ast = CQParser.parse(selector);\n return matchesNode(component, ast);\n }\n\n /**\n * Returns all descendants of `root` matching the selector string.\n */\n static query(root: Component, selector: string): Component[] {\n const ast = CQParser.parse(selector);\n const all = collectDescendants(root);\n return all.filter((c) => matchesInContext(c, ast, root));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Descendant collection (depth-first)\n// ---------------------------------------------------------------------------\n\nfunction collectDescendants(container: any): Component[] {\n const results: Component[] = [];\n const items = container.getItems?.() ?? [];\n for (const child of items) {\n results.push(child);\n if (typeof child.getItems === 'function') {\n results.push(...collectDescendants(child));\n }\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Context-aware matching (handles combinators)\n// ---------------------------------------------------------------------------\n\nfunction matchesInContext(\n component: Component,\n ast: SelectorNode,\n _root: Component,\n): boolean {\n if (ast.type === 'list') {\n return (ast as SelectorListNode).items.some(\n (item) => matchesInContext(component, item, _root),\n );\n }\n\n if (ast.type === 'compound') {\n return matchesCompound(component, ast as CompoundSelectorNode);\n }\n\n if (ast.type === 'combinator') {\n return matchesCombinator(component, ast as CombinatorNode);\n }\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Combinator matching\n// ---------------------------------------------------------------------------\n\nfunction matchesCombinator(component: Component, node: CombinatorNode): boolean {\n const { combinator, left, right } = node;\n\n // Right side must match the component itself\n if (!matchesNode(component, right)) return false;\n\n switch (combinator) {\n case ' ': // descendant\n return hasAncestorMatching(component, left);\n\n case '>': // direct child\n return hasParentMatching(component, left);\n\n case '~': // general sibling\n return hasPrecedingSiblingMatching(component, left);\n\n case '+': // adjacent sibling\n return hasAdjacentSiblingMatching(component, left);\n\n default:\n return false;\n }\n}\n\nfunction hasAncestorMatching(component: Component, ast: SelectorNode): boolean {\n let current = (component as any).ownerCt as Component | null;\n while (current) {\n if (matchesNode(current, ast)) return true;\n current = (current as any).ownerCt;\n }\n return false;\n}\n\nfunction hasParentMatching(component: Component, ast: SelectorNode): boolean {\n const parent = (component as any).ownerCt as Component | null;\n if (!parent) return false;\n return matchesNode(parent, ast);\n}\n\nfunction hasPrecedingSiblingMatching(component: Component, ast: SelectorNode): boolean {\n const siblings = getSiblings(component);\n if (!siblings) return false;\n const myIndex = siblings.indexOf(component);\n for (let i = 0; i < myIndex; i++) {\n if (matchesNode(siblings[i], ast)) return true;\n }\n return false;\n}\n\nfunction hasAdjacentSiblingMatching(component: Component, ast: SelectorNode): boolean {\n const siblings = getSiblings(component);\n if (!siblings) return false;\n const myIndex = siblings.indexOf(component);\n if (myIndex <= 0) return false;\n return matchesNode(siblings[myIndex - 1], ast);\n}\n\nfunction getSiblings(component: Component): Component[] | null {\n const parent = (component as any).ownerCt;\n if (!parent || typeof parent.getItems !== 'function') return null;\n return parent.getItems();\n}\n\n// ---------------------------------------------------------------------------\n// Node matching (dispatches to compound, combinator, list)\n// ---------------------------------------------------------------------------\n\nfunction matchesNode(component: Component, ast: SelectorNode): boolean {\n if (ast.type === 'compound') {\n return matchesCompound(component, ast as CompoundSelectorNode);\n }\n if (ast.type === 'combinator') {\n return matchesCombinator(component, ast as CombinatorNode);\n }\n if (ast.type === 'list') {\n return (ast as SelectorListNode).items.some(\n (item) => matchesNode(component, item),\n );\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Compound selector matching (all simple selectors must match)\n// ---------------------------------------------------------------------------\n\nfunction matchesCompound(component: Component, node: CompoundSelectorNode): boolean {\n return node.selectors.every((sel: SimpleSelectorNode) => matchesSimple(component, sel));\n}\n\n// ---------------------------------------------------------------------------\n// Simple selector matching\n// ---------------------------------------------------------------------------\n\nfunction matchesSimple(component: Component, sel: SimpleSelectorNode): boolean {\n switch (sel.type) {\n case 'type':\n return (component as any)._config?.xtype === sel.value;\n\n case 'id':\n return component.componentId === sel.value;\n\n case 'class':\n return component.el?.classList?.contains(sel.value) ?? false;\n\n case 'attribute':\n return matchesAttribute(component, sel);\n\n case 'pseudo':\n return matchesPseudo(component, sel);\n\n case 'method':\n return matchesMethod(component, sel);\n\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Attribute matching\n// ---------------------------------------------------------------------------\n\nfunction matchesAttribute(component: Component, sel: any): boolean {\n const config = (component as any)._config ?? {};\n const actual = config[sel.name];\n\n // Existence check (no operator)\n if (!sel.operator) {\n return actual !== undefined && actual !== null && actual !== false && actual !== '';\n }\n\n const expected = sel.value;\n\n switch (sel.operator) {\n case '=': {\n // String comparison (strip quotes from expected if present)\n const exp = expected;\n if (exp === 'true') return actual === true;\n if (exp === 'false') return actual === false;\n return String(actual) === exp;\n }\n case '!=': {\n const exp = expected;\n if (exp === 'true') return actual !== true;\n if (exp === 'false') return actual !== false;\n return String(actual) !== exp;\n }\n case '>':\n return Number(actual) > Number(expected);\n case '>=':\n return Number(actual) >= Number(expected);\n case '<':\n return Number(actual) < Number(expected);\n case '<=':\n return Number(actual) <= Number(expected);\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pseudo-class matching\n// ---------------------------------------------------------------------------\n\nfunction matchesPseudo(component: Component, sel: any): boolean {\n switch (sel.name) {\n case 'not': {\n if (!sel.argument) return true;\n return !matchesNode(component, sel.argument as SelectorNode);\n }\n\n case 'visible':\n return typeof component.isVisible === 'function' && component.isVisible();\n\n case 'disabled':\n return typeof component.isDisabled === 'function' && component.isDisabled();\n\n case 'focusable':\n return typeof component.isFocusable === 'function' && component.isFocusable();\n\n case 'first-child':\n return isNthChild(component, 0);\n\n case 'last-child':\n return isLastChild(component);\n\n // Positional aliases (ExtJS compat)\n case 'first':\n return isNthChild(component, 0);\n\n case 'last':\n return isLastChild(component);\n\n case 'nth-child': {\n const n = parseInt(sel.argument as string, 10);\n if (Number.isNaN(n)) return false;\n return isNthChild(component, n - 1); // 1-based to 0-based\n }\n\n default:\n return false;\n }\n}\n\nfunction isNthChild(component: Component, index: number): boolean {\n const siblings = getSiblings(component);\n if (!siblings) return false;\n return siblings[index] === component;\n}\n\nfunction isLastChild(component: Component): boolean {\n const siblings = getSiblings(component);\n if (!siblings || siblings.length === 0) return false;\n return siblings[siblings.length - 1] === component;\n}\n\n// ---------------------------------------------------------------------------\n// Method matching: {methodName}\n// ---------------------------------------------------------------------------\n\nfunction matchesMethod(component: Component, sel: any): boolean {\n const methodName = sel.value;\n const fn = (component as any)[methodName];\n if (typeof fn !== 'function') return false;\n return !!fn.call(component);\n}\n","/**\n * @framesquared/component – ComponentQuery\n *\n * Backward-compatible wrapper that delegates to the new AST-based CQ engine.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Component } from './Component.js';\nimport { CQMatcher } from './query/CQMatcher.js';\n\n/**\n * Tests if a component matches a simple selector. Used by Container.child()\n * and Component.up().\n */\nexport function matchesCQ(cmp: Component, selector: string): boolean {\n try {\n return CQMatcher.matches(cmp, selector);\n } catch {\n return false;\n }\n}\n\n/**\n * Legacy ComponentQuery class — delegates to CQMatcher.\n */\nexport class ComponentQuery {\n static query(root: any, selector: string): Component[] {\n try {\n selector = selector.trim();\n // Special case: \"> selector\" means direct children only\n if (selector.startsWith('>')) {\n const innerSel = selector.slice(1).trim();\n const items = root.getItems?.() ?? [];\n return items.filter((child: Component) => {\n try {\n return CQMatcher.matches(child, innerSel);\n } catch {\n return false;\n }\n });\n }\n return CQMatcher.query(root, selector);\n } catch {\n return [];\n }\n }\n}\n","/**\n * @framesquared/component – Layout (placeholder)\n *\n * Base layout class. Actual layout managers (HBox, VBox, Border, etc.)\n * will be implemented in @framesquared/layout.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface LayoutConfig {\n type?: string;\n [key: string]: unknown;\n}\n\nexport class Layout {\n readonly type: string;\n\n constructor(config: LayoutConfig = {}) {\n this.type = config.type ?? 'auto';\n }\n\n /**\n * Performs layout calculation on the owner container.\n * Override in subclasses.\n */\n doLayout(_owner: any): void {\n // Auto layout: no-op — children use natural flow\n }\n}\n\n/**\n * Resolves a layout config to a Layout instance.\n */\nexport function resolveLayout(config: string | LayoutConfig | undefined): Layout {\n if (!config) return new Layout();\n if (typeof config === 'string') return new Layout({ type: config });\n return new Layout(config);\n}\n","/**\n * @framesquared/component – Container\n *\n * A Component that manages an ordered collection of child Components.\n * Provides add/insert/remove, Component Query (CQ) selectors,\n * layout integration, defaults, reference handling, and destroy cascade.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Component } from './Component.js';\nimport type { ComponentConfig } from './Component.js';\nimport { ComponentQuery, matchesCQ } from './ComponentQuery.js';\nimport { Layout, resolveLayout } from './Layout.js';\nimport type { LayoutConfig } from './Layout.js';\nimport { ClassManager } from '@framesquared/core';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface ContainerConfig extends ComponentConfig {\n items?: (Component | Record<string, unknown>)[];\n layout?: string | LayoutConfig;\n defaults?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Container\n// ---------------------------------------------------------------------------\n\nexport class Container extends Component {\n static override $className = 'Ext.Container';\n\n // These are declared as types only — NOT as class fields.\n // Actual initialization happens in initialize() to avoid\n // ES2022 field declarations overwriting values set during super().\n declare private _items: Component[];\n declare private _layout: Layout | null;\n declare private _bodyEl: HTMLElement | null;\n\n constructor(config: ContainerConfig = {}) {\n super(config);\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle overrides\n // -----------------------------------------------------------------------\n\n protected override initialize(): void {\n super.initialize();\n this._items = [];\n this._layout = null;\n this._bodyEl = null;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n\n // Create body element inside el for child rendering\n this._bodyEl = document.createElement('div');\n this._bodyEl.classList.add('x-container-body');\n this.el!.appendChild(this._bodyEl);\n\n // Render any items that were added before this container was rendered\n for (const child of this._items) {\n if (!child.rendered) {\n child.render(this._bodyEl);\n }\n }\n\n // Add initial items from config\n const config = this._config as ContainerConfig;\n if (config.items && config.items.length > 0) {\n this.add(...config.items);\n }\n }\n\n protected override onDestroy(): void {\n // Destroy all children\n const items = [...this._items];\n for (const child of items) {\n child.destroy();\n }\n this._items.length = 0;\n super.onDestroy();\n }\n\n // -----------------------------------------------------------------------\n // Body element\n // -----------------------------------------------------------------------\n\n /**\n * Returns the inner element where children are rendered.\n * Falls back to el if body hasn't been created yet.\n */\n getBodyEl(): HTMLElement {\n return this._bodyEl ?? this.el!;\n }\n\n // -----------------------------------------------------------------------\n // Child management\n // -----------------------------------------------------------------------\n\n add(...items: (Component | Record<string, unknown>)[]): Component[] {\n const added: Component[] = [];\n for (const item of items) {\n const child = this.resolveItem(item);\n const index = this._items.length;\n\n // Fire beforeadd — if cancelled, skip\n if (this.fireReturning('beforeadd', this, child, index) === false) continue;\n\n this._items.push(child);\n child.ownerCt = this;\n\n // Render child into body\n if (this.rendered && this._bodyEl) {\n child.render(this._bodyEl);\n }\n\n child.onAdded(this, index);\n this.fire('add', this, child, index);\n added.push(child);\n }\n return added;\n }\n\n insert(index: number, item: Component | Record<string, unknown>): Component {\n const child = this.resolveItem(item);\n\n if (this.fireReturning('beforeadd', this, child, index) === false) {\n return child;\n }\n\n // Clamp index\n const i = Math.max(0, Math.min(index, this._items.length));\n this._items.splice(i, 0, child);\n child.ownerCt = this;\n\n // Render into DOM at correct position\n if (this.rendered && this._bodyEl) {\n const refEl = this._bodyEl.children[i] as Element | undefined;\n if (refEl) {\n child.render(this._bodyEl, refEl);\n } else {\n child.render(this._bodyEl);\n }\n }\n\n child.onAdded(this, i);\n this.fire('add', this, child, i);\n return child;\n }\n\n remove(item: Component, destroy = true): Component {\n const index = this._items.indexOf(item);\n if (index === -1) return item;\n\n if (this.fireReturning('beforeremove', this, item, index) === false) {\n return item;\n }\n\n this._items.splice(index, 1);\n item.ownerCt = null;\n\n // Detach from DOM (without destroying yet)\n if (item.el && item.el.parentNode) {\n item.el.parentNode.removeChild(item.el);\n }\n\n item.onRemoved(destroy);\n this.fire('remove', this, item, index);\n\n if (destroy) {\n item.destroy();\n }\n\n return item;\n }\n\n removeAll(destroy = true): Component[] {\n const removed = [...this._items];\n // Iterate in reverse to avoid index shifting issues\n for (let i = removed.length - 1; i >= 0; i--) {\n this.remove(removed[i], destroy);\n }\n return removed;\n }\n\n removeAt(index: number): Component {\n const item = this._items[index];\n if (!item) throw new Error(`No item at index ${index}`);\n return this.remove(item, true);\n }\n\n // -----------------------------------------------------------------------\n // Lookup\n // -----------------------------------------------------------------------\n\n getItems(): Component[] {\n return [...this._items];\n }\n\n getAt(index: number): Component | undefined {\n return this._items[index];\n }\n\n getComponent(id: string): Component | undefined {\n return this._items.find((c) => c.componentId === id);\n }\n\n indexOf(item: Component): number {\n return this._items.indexOf(item);\n }\n\n contains(item: Component, deep = false): boolean {\n if (this._items.includes(item)) return true;\n if (deep) {\n for (const child of this._items) {\n if (child instanceof Container && child.contains(item, true)) {\n return true;\n }\n }\n }\n return false;\n }\n\n getCount(): number {\n return this._items.length;\n }\n\n // -----------------------------------------------------------------------\n // Layout\n // -----------------------------------------------------------------------\n\n getLayout(): Layout {\n if (!this._layout) {\n const config = this._config as ContainerConfig;\n this._layout = resolveLayout(config.layout);\n }\n return this._layout;\n }\n\n doLayout(): void {\n this.getLayout().doLayout(this);\n }\n\n // -----------------------------------------------------------------------\n // Component Query\n // -----------------------------------------------------------------------\n\n query(selector: string): Component[] {\n return ComponentQuery.query(this, selector);\n }\n\n down(selector: string): Component | undefined {\n const results = this.query(selector);\n return results.length > 0 ? results[0] : undefined;\n }\n\n child(selector: string): Component | undefined {\n return this._items.find((c) => matchesCQ(c, selector));\n }\n\n queryById(id: string): Component | undefined {\n return this.query(`#${id}`)[0];\n }\n\n queryBy(fn: (item: Component) => boolean): Component[] {\n const all = this.collectAllDescendants();\n return all.filter(fn);\n }\n\n // -----------------------------------------------------------------------\n // Reference\n // -----------------------------------------------------------------------\n\n lookupReference(ref: string): Component | undefined {\n return this.query(`[reference=${ref}]`)[0];\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n private resolveItem(item: Component | Record<string, unknown>): Component {\n if (item instanceof Component) return item;\n\n // Merge defaults\n const config = this._config as ContainerConfig;\n const merged = config.defaults\n ? { ...config.defaults, ...item }\n : { ...item };\n\n // Resolve xtype via ClassManager if registered, otherwise create generic Component\n const xtype = (merged as any).xtype;\n if (xtype) {\n const Ctor = ClassManager.getByAlias(`widget.${xtype}`) as (new (cfg: any) => Component) | undefined;\n if (Ctor) return new Ctor(merged);\n }\n return new Component(merged);\n }\n\n private collectAllDescendants(): Component[] {\n const results: Component[] = [];\n for (const child of this._items) {\n results.push(child);\n if (child instanceof Container) {\n results.push(...child.collectAllDescendants());\n }\n }\n return results;\n }\n\n /**\n * Fires an event and returns false if any listener returned false.\n */\n private fireReturning(eventName: string, ...args: unknown[]): boolean {\n if (typeof (this as any).fireEvent === 'function') {\n return (this as any).fireEvent(eventName, ...args);\n }\n return true;\n }\n}\n","/**\n * @framesquared/component – CQ (Component Query static API)\n *\n * Static convenience API for querying component trees.\n */\n\nimport type { Component } from '../Component.js';\nimport { CQMatcher } from './CQMatcher.js';\n\nexport class CQ {\n /**\n * Finds all components matching the selector under the given root.\n */\n static query(selector: string, root?: Component): Component[] {\n if (!root) return [];\n return CQMatcher.query(root, selector);\n }\n\n /**\n * Returns true if the component matches the selector.\n */\n static is(component: Component, selector: string): boolean {\n return CQMatcher.matches(component, selector);\n }\n}\n","/**\n * @framesquared/component – XTemplate\n *\n * A powerful template engine inspired by ExtJS's XTemplate.\n *\n * Features:\n * - `{field}` interpolation with dot paths\n * - `{field:format}` built-in format functions\n * - `<tpl if=\"expr\">`, `<tpl elseif=\"expr\">`, `<tpl else>`\n * - `<tpl for=\"field\">` loops with `{.}`, `{#}`, `{[xindex]}`, `{[xcount]}`, `{parent.x}`\n * - `{[expression]}` inline JS expressions (`values` = current scope)\n * - `{[this.method(...)]}` template member functions\n * - Compiled to a JS function for fast repeat rendering\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// Built-in format functions\n// ---------------------------------------------------------------------------\n\nconst HTML_ENCODE_MAP: Record<string, string> = {\n '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''',\n};\nconst HTML_DECODE_MAP: Record<string, string> = {\n '&': '&', '<': '<', '>': '>', '"': '\"', ''': \"'\",\n};\n\nfunction htmlEncode(v: unknown): string {\n return String(v ?? '').replace(/[&<>\"']/g, (ch) => HTML_ENCODE_MAP[ch] ?? ch);\n}\n\nfunction htmlDecode(v: unknown): string {\n return String(v ?? '').replace(/&|<|>|"|'/g, (ent) => HTML_DECODE_MAP[ent] ?? ent);\n}\n\nconst FORMAT_FNS: Record<string, (value: any, arg?: string) => string> = {\n htmlEncode: (v) => htmlEncode(v),\n htmlDecode: (v) => htmlDecode(v),\n trim: (v) => String(v ?? '').trim(),\n uppercase: (v) => String(v ?? '').toUpperCase(),\n lowercase: (v) => String(v ?? '').toLowerCase(),\n capitalize: (v) => {\n const s = String(v ?? '');\n return s.charAt(0).toUpperCase() + s.slice(1);\n },\n ellipsis: (v, arg) => {\n const s = String(v ?? '');\n const max = parseInt(arg ?? '0', 10);\n if (max <= 0 || s.length <= max) return s;\n return s.slice(0, max - 3) + '...';\n },\n round: (v, arg) => {\n const n = Number(v);\n const decimals = parseInt(arg ?? '0', 10);\n return n.toFixed(decimals);\n },\n number: (v) => String(Number(v)),\n currency: (v) => {\n const n = Number(v);\n return n.toFixed(2);\n },\n usMoney: (v) => {\n const n = Number(v);\n const formatted = n.toFixed(2).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return n < 0 ? `-$${formatted.slice(1)}` : `$${formatted}`;\n },\n fileSize: (v) => {\n const n = Number(v);\n if (n >= 1073741824) return `${(n / 1073741824).toFixed(1)} GB`;\n if (n >= 1048576) return `${(n / 1048576).toFixed(0)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(0)} KB`;\n return `${n} bytes`;\n },\n plural: (v, arg) => {\n const n = Number(v);\n const word = (arg ?? '').replace(/^[\"']|[\"']$/g, '');\n return n === 1 ? `${n} ${word}` : `${n} ${word}s`;\n },\n date: (v) => {\n const d = v instanceof Date ? v : new Date(String(v));\n return isNaN(d.getTime()) ? String(v) : d.toLocaleDateString('en-US');\n },\n};\n\n// ---------------------------------------------------------------------------\n// AST node types\n// ---------------------------------------------------------------------------\n\ninterface TextNode { type: 'text'; value: string; }\ninterface InterpNode { type: 'interp'; path: string; format?: string; formatArg?: string; }\ninterface ExprNode { type: 'expr'; code: string; }\ninterface IfNode {\n type: 'if';\n condition: string;\n body: AstNode[];\n elseifs: { condition: string; body: AstNode[] }[];\n elseBody: AstNode[];\n}\ninterface ForNode {\n type: 'for';\n field: string;\n body: AstNode[];\n}\n\ntype AstNode = TextNode | InterpNode | ExprNode | IfNode | ForNode;\n\n// ---------------------------------------------------------------------------\n// Parser: template string → AST\n// ---------------------------------------------------------------------------\n\nfunction parseTemplate(src: string): AstNode[] {\n const nodes: AstNode[] = [];\n let pos = 0;\n\n while (pos < src.length) {\n // Check for <tpl ...>\n const tplMatch = matchTplOpen(src, pos);\n if (tplMatch) {\n const { tag, end } = tplMatch;\n if (tag.startsWith('if=')) {\n const result = parseIf(src, tag, end);\n nodes.push(result.node);\n pos = result.pos;\n continue;\n }\n if (tag.startsWith('for=')) {\n const result = parseFor(src, tag, end);\n nodes.push(result.node);\n pos = result.pos;\n continue;\n }\n }\n\n // Check for {[expr]}\n if (src[pos] === '{' && pos + 1 < src.length && src[pos + 1] === '[') {\n const closeIdx = src.indexOf(']}', pos + 2);\n if (closeIdx !== -1) {\n nodes.push({ type: 'expr', code: src.slice(pos + 2, closeIdx) });\n pos = closeIdx + 2;\n continue;\n }\n }\n\n // Check for {field} or {field:format}\n if (src[pos] === '{') {\n const closeIdx = findClosingBrace(src, pos);\n if (closeIdx !== -1) {\n const inner = src.slice(pos + 1, closeIdx);\n nodes.push(parseInterp(inner));\n pos = closeIdx + 1;\n continue;\n }\n }\n\n // Plain text — consume until next { or <tpl\n let textEnd = pos + 1;\n while (textEnd < src.length) {\n if (src[textEnd] === '{') break;\n if (src[textEnd] === '<' && src.slice(textEnd, textEnd + 4) === '<tpl') break;\n textEnd++;\n }\n nodes.push({ type: 'text', value: src.slice(pos, textEnd) });\n pos = textEnd;\n }\n\n return nodes;\n}\n\nfunction findClosingBrace(src: string, start: number): number {\n // Simple brace matching (no nesting for {field})\n for (let i = start + 1; i < src.length; i++) {\n if (src[i] === '}') return i;\n }\n return -1;\n}\n\nfunction parseInterp(inner: string): InterpNode {\n // {path:format(arg)} or {path:format} or {path}\n const colonIdx = inner.indexOf(':');\n if (colonIdx === -1) {\n return { type: 'interp', path: inner.trim() };\n }\n const path = inner.slice(0, colonIdx).trim();\n const rest = inner.slice(colonIdx + 1).trim();\n const parenIdx = rest.indexOf('(');\n if (parenIdx !== -1) {\n const format = rest.slice(0, parenIdx);\n const arg = rest.slice(parenIdx + 1, rest.lastIndexOf(')'));\n return { type: 'interp', path, format, formatArg: arg };\n }\n return { type: 'interp', path, format: rest };\n}\n\n// ---------------------------------------------------------------------------\n// <tpl> tag matching\n// ---------------------------------------------------------------------------\n\ninterface TplOpenResult { tag: string; end: number; }\n\nfunction matchTplOpen(src: string, pos: number): TplOpenResult | null {\n if (src.slice(pos, pos + 4) !== '<tpl') return null;\n // Find closing > respecting quotes\n let i = pos + 4;\n let inQuote: string | null = null;\n while (i < src.length) {\n const ch = src[i];\n if (inQuote) {\n if (ch === inQuote) inQuote = null;\n } else {\n if (ch === '\"' || ch === \"'\") inQuote = ch;\n else if (ch === '>') {\n const tagContent = src.slice(pos + 5, i).trim();\n return { tag: tagContent, end: i + 1 };\n }\n }\n i++;\n }\n return null;\n}\n\nfunction findClosingTpl(src: string, pos: number): number {\n let depth = 1;\n let i = pos;\n while (i < src.length && depth > 0) {\n // Check for </tpl>\n if (src.slice(i, i + 6) === '</tpl>') {\n depth--;\n if (depth === 0) return i;\n i += 6;\n continue;\n }\n // Check for <tpl\n if (src.slice(i, i + 4) === '<tpl') {\n // Find the close of this tag (quote-aware)\n const tagEnd = findTplTagEnd(src, i + 4);\n if (tagEnd === -1) { i++; continue; }\n const tagContent = src.slice(i + 4, tagEnd).trim();\n\n // <tpl else> or <tpl elseif=\"...\"> at our depth — don't change depth\n if (depth === 1 && (tagContent === 'else' || tagContent.startsWith('elseif'))) {\n i = tagEnd + 1;\n continue;\n }\n // Otherwise it's a new nested <tpl> — increment depth\n depth++;\n i = tagEnd + 1;\n continue;\n }\n i++;\n }\n return src.length;\n}\n\nfunction findTplTagEnd(src: string, start: number): number {\n let i = start;\n let inQuote: string | null = null;\n while (i < src.length) {\n const ch = src[i];\n if (inQuote) {\n if (ch === inQuote) inQuote = null;\n } else {\n if (ch === '\"' || ch === \"'\") inQuote = ch;\n else if (ch === '>') return i;\n }\n i++;\n }\n return -1;\n}\n\n// ---------------------------------------------------------------------------\n// If parsing\n// ---------------------------------------------------------------------------\n\nfunction parseIf(src: string, tag: string, bodyStart: number):\n { node: IfNode; pos: number } {\n const condition = extractQuoted(tag.slice(3)); // after \"if=\"\n const closeTpl = findClosingTpl(src, bodyStart);\n const innerSrc = src.slice(bodyStart, closeTpl);\n\n // Split on <tpl elseif=\"...\"> and <tpl else>\n const branches = splitBranches(innerSrc);\n\n const node: IfNode = {\n type: 'if',\n condition,\n body: parseTemplate(branches.ifBody),\n elseifs: branches.elseifs.map((ei) => ({\n condition: ei.condition,\n body: parseTemplate(ei.body),\n })),\n elseBody: branches.elseBody ? parseTemplate(branches.elseBody) : [],\n };\n\n return { node, pos: closeTpl + 6 }; // skip </tpl>\n}\n\nfunction extractQuoted(s: string): string {\n s = s.trim();\n if ((s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n\ninterface BranchSplit {\n ifBody: string;\n elseifs: { condition: string; body: string }[];\n elseBody: string | null;\n}\n\nfunction splitBranches(inner: string): BranchSplit {\n const result: BranchSplit = { ifBody: '', elseifs: [], elseBody: null };\n const parts: { type: 'if' | 'elseif' | 'else'; condition?: string; start: number }[] = [];\n let i = 0;\n let depth = 0;\n\n while (i < inner.length) {\n // Check for </tpl>\n if (inner.slice(i, i + 6) === '</tpl>') {\n depth--;\n i += 6;\n continue;\n }\n if (inner.slice(i, i + 4) === '<tpl') {\n const tagEnd = findTplTagEnd(inner, i + 4);\n if (tagEnd === -1) { i++; continue; }\n const tagContent = inner.slice(i + 4, tagEnd).trim();\n\n if (depth === 0) {\n if (tagContent.startsWith('elseif=')) {\n parts.push({ type: 'elseif', condition: extractQuoted(tagContent.slice(7)), start: tagEnd + 1 });\n i = tagEnd + 1;\n continue;\n }\n if (tagContent === 'else') {\n parts.push({ type: 'else', start: tagEnd + 1 });\n i = tagEnd + 1;\n continue;\n }\n }\n depth++;\n i = tagEnd + 1;\n continue;\n }\n i++;\n }\n\n if (parts.length === 0) {\n result.ifBody = inner;\n } else {\n result.ifBody = inner.slice(0, findTplTagBefore(inner, parts[0].start));\n for (let p = 0; p < parts.length; p++) {\n const part = parts[p];\n const bodyEnd = p + 1 < parts.length\n ? findTplTagBefore(inner, parts[p + 1].start)\n : inner.length;\n const body = inner.slice(part.start, bodyEnd);\n if (part.type === 'elseif') {\n result.elseifs.push({ condition: part.condition!, body });\n } else {\n result.elseBody = body;\n }\n }\n }\n\n return result;\n}\n\nfunction findTplTagBefore(src: string, contentStart: number): number {\n // Walk back from contentStart to find the opening < of <tpl\n let i = contentStart - 1;\n while (i >= 0 && src[i] !== '<') i--;\n return Math.max(0, i);\n}\n\n// ---------------------------------------------------------------------------\n// For parsing\n// ---------------------------------------------------------------------------\n\nfunction parseFor(src: string, tag: string, bodyStart: number):\n { node: ForNode; pos: number } {\n const field = extractQuoted(tag.slice(4)); // after \"for=\"\n const closeTpl = findClosingTpl(src, bodyStart);\n const body = parseTemplate(src.slice(bodyStart, closeTpl));\n return { node: { type: 'for', field, body }, pos: closeTpl + 6 };\n}\n\n// ---------------------------------------------------------------------------\n// Evaluator: AST + data → string\n// ---------------------------------------------------------------------------\n\nfunction evaluate(\n nodes: AstNode[],\n data: any,\n parentData: any,\n xindex: number,\n xcount: number,\n memberFns: Record<string, Function>,\n): string {\n let result = '';\n for (const node of nodes) {\n switch (node.type) {\n case 'text':\n result += node.value;\n break;\n case 'interp':\n result += evalInterp(node, data, parentData, xindex, xcount);\n break;\n case 'expr':\n result += evalExpr(node.code, data, parentData, xindex, xcount, memberFns);\n break;\n case 'if':\n result += evalIf(node, data, parentData, xindex, xcount, memberFns);\n break;\n case 'for':\n result += evalFor(node, data, parentData, xindex, xcount, memberFns);\n break;\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Interpolation evaluation\n// ---------------------------------------------------------------------------\n\nfunction evalInterp(\n node: InterpNode,\n data: any,\n _parentData: any,\n xindex: number,\n _xcount: number,\n): string {\n let value: unknown;\n\n if (node.path === '.') {\n // Current value — unwrap PrimitiveScope\n value = data instanceof PrimitiveScope ? data._value : data;\n } else if (node.path === '#') {\n value = xindex;\n } else {\n value = resolve(data, node.path);\n }\n\n if (value === undefined || value === null) return '';\n\n let str = String(value);\n\n if (node.format && FORMAT_FNS[node.format]) {\n str = FORMAT_FNS[node.format](value, node.formatArg);\n }\n\n return str;\n}\n\nfunction resolve(data: any, path: string): unknown {\n if (!data || !path) return undefined;\n const parts = path.split('.');\n let current: any = data;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object' && typeof current !== 'function') return undefined;\n current = current[part];\n }\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Expression evaluation\n// ---------------------------------------------------------------------------\n\nfunction evalExpr(\n code: string,\n data: any,\n _parentData: any,\n xindex: number,\n xcount: number,\n memberFns: Record<string, Function>,\n): string {\n try {\n // Create a scope with `values`, `xindex`, `xcount`, and `this` bound to memberFns\n const fn = new Function('values', 'xindex', 'xcount',\n `\"use strict\"; return (${code});`);\n const result = fn.call(memberFns, data, xindex, xcount);\n return result === undefined || result === null ? '' : String(result);\n } catch {\n return '';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Conditional evaluation\n// ---------------------------------------------------------------------------\n\nfunction evalIf(\n node: IfNode,\n data: any,\n parentData: any,\n xindex: number,\n xcount: number,\n memberFns: Record<string, Function>,\n): string {\n if (evalCondition(node.condition, data)) {\n return evaluate(node.body, data, parentData, xindex, xcount, memberFns);\n }\n for (const ei of node.elseifs) {\n if (evalCondition(ei.condition, data)) {\n return evaluate(ei.body, data, parentData, xindex, xcount, memberFns);\n }\n }\n return evaluate(node.elseBody, data, parentData, xindex, xcount, memberFns);\n}\n\nfunction evalCondition(condition: string, data: any): boolean {\n try {\n // Create a function that has all data properties in scope\n const keys = Object.keys(data ?? {});\n const vals = keys.map((k) => data[k]);\n const fn = new Function(...keys, `\"use strict\"; return !!(${condition});`);\n return fn(...vals);\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Loop evaluation\n// ---------------------------------------------------------------------------\n\nfunction evalFor(\n node: ForNode,\n data: any,\n _parentData: any,\n _xindex: number,\n _xcount: number,\n memberFns: Record<string, Function>,\n): string {\n let arr: any[];\n if (node.field === '.') {\n arr = Array.isArray(data) ? data : [];\n } else {\n arr = resolve(data, node.field) as any[];\n if (!Array.isArray(arr)) return '';\n }\n\n let result = '';\n const count = arr.length;\n\n for (let i = 0; i < count; i++) {\n const item = arr[i];\n let scope: any;\n if (item !== null && typeof item === 'object') {\n scope = { ...item, parent: data };\n } else {\n // For primitive values, create a scope object that supports\n // {.} via the evaluate path and {parent.x} via parent key\n scope = new PrimitiveScope(item, data);\n }\n result += evaluate(node.body, scope, data, i + 1, count, memberFns);\n }\n\n return result;\n}\n\n/** Wrapper for primitive loop values that supports {parent.x} lookups. */\nclass PrimitiveScope {\n readonly _value: any;\n readonly parent: any;\n constructor(value: any, parentData: any) {\n this._value = value;\n this.parent = parentData;\n }\n}\n\n// ---------------------------------------------------------------------------\n// XTemplate class\n// ---------------------------------------------------------------------------\n\nexport class XTemplate {\n private source: string;\n private memberFns: Record<string, Function>;\n private ast: AstNode[] | null = null;\n\n constructor(source: string, memberFns?: Record<string, Function>) {\n this.source = source;\n this.memberFns = memberFns ?? {};\n }\n\n /**\n * Pre-compiles the template. Called automatically on first apply().\n */\n compile(): void {\n if (!this.ast) {\n this.ast = parseTemplate(this.source);\n }\n }\n\n /**\n * Applies data to the template and returns the resulting HTML string.\n */\n apply(data: any): string {\n this.compile();\n return evaluate(this.ast!, data, null, 0, 0, this.memberFns);\n }\n\n /**\n * Applies data and appends the resulting HTML to an element.\n */\n append(el: Element, data: any): void {\n el.innerHTML += this.apply(data);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@framesquared/component",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Component model, lifecycle, and rendering",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@framesquared/core": "0.1.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"clean": "rm -rf dist",
|
|
24
|
+
"typecheck": "tsc --noEmit --project tsconfig.build.json"
|
|
25
|
+
}
|
|
26
|
+
}
|