@tachui/data 0.8.1-alpha → 0.8.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/menu/Menu.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAS9E;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IACpC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAA;IAC3C,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,KAAK,GACL,WAAW,GACX,SAAS,GACT,OAAO,GACP,aAAa,GACb,WAAW,GACX,MAAM,GACN,YAAY,GACZ,UAAU,CAAA;AAEd;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,cAAc;IAE/C,KAAK,EAAE,QAAQ,EAAE,CAAA;IAGjB,OAAO,EACH,iBAAiB,GACjB,WAAW,GACX,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAA;IAG3C,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAGxB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAA;IAGzB,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IAGf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAG1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;QACpB,eAAe,EAAE,MAAM,CAAA;QACvB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SA0B9B,CAAA;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,iBAAiB,CAAC,SAAS,CAAC;IAChE,SAAgB,IAAI,EAAG,WAAW,CAAS;IAC3C,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,KAAK,EAAE,SAAS,CAAA;IACzB,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAK;IACnC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,KAAK,MAAM,GAEjB;IACD,OAAO,KAAK,SAAS,GAEpB;IACD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,cAAc,CAA2B;gBAErC,KAAK,EAAE,SAAS;IAkC5B,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IA4ItB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,aAAa,CAsDpB;IAED,OAAO,CAAC,iBAAiB;IA4FzB,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,YAAY;IA+CpB,MAAM,IAAI,OAAO;IAgHjB,OAAO,CAAC,kBAAkB,CAUzB;IAED,OAAO,CAAC,cAAc,CASrB;CACF;AAED;;GAEG;AACH,wBAAgB,IAAI,CAClB,KAAK,EAAE,SAAS,GACf,mBAAmB,CAAC,SAAS,CAAC,GAAG;IAClC,QAAQ,EAAE,eAAe,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAA;CAC1D,CAEA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;iBACU,QAAQ;IAIrB;;OAEG;uBAEM,MAAM,UACL,MAAM,IAAI,gBACJ,MAAM,GACnB,QAAQ;IASX;;OAEG;wBAEM,MAAM,YACH,MAAM,UACR,MAAM,IAAI,gBACJ,MAAM,GACnB,QAAQ;IASX;;OAEG;wBACiB,WAAW,SAAS,QAAQ,EAAE,GAAG,IAAI;CAkB1D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;;IAGrB;;OAEG;2BACoB,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;IAIrD;;OAEG;iBACU,SAAS;CAevB,CAAA"}
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/menu/Menu.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,3 @@ export {
6
6
  M as MenuUtils,
7
7
  t as defaultMenuTheme
8
8
  };
9
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tachui/data",
3
- "version": "0.8.1-alpha",
3
+ "version": "0.8.8",
4
4
  "description": "Data display and organization components for tachUI framework",
5
5
  "homepage": "https://tachui.dev/",
6
6
  "type": "module",
@@ -25,14 +25,15 @@
25
25
  "dist"
26
26
  ],
27
27
  "dependencies": {
28
- "@tachui/core": "0.8.1-alpha",
29
- "@tachui/flow-control": "0.8.1-alpha",
30
- "@tachui/mobile": "0.8.1-alpha"
28
+ "@tachui/core": "0.8.8",
29
+ "@tachui/flow-control": "0.8.8",
30
+ "@tachui/mobile": "0.8.8",
31
+ "@tachui/primitives": "0.8.8"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@types/node": "^20.0.0",
34
35
  "@types/jsdom": "^21.1.6",
35
- "@vitest/coverage-v8": "^1.0.0",
36
+ "@vitest/coverage-v8": "^3.2.4",
36
37
  "jsdom": "^23.2.0",
37
38
  "typescript": "^5.2.0",
38
39
  "vite": "^7.1.1",
@@ -64,6 +65,8 @@
64
65
  },
65
66
  "scripts": {
66
67
  "build": "rm -rf dist && vite build && tsc --project tsconfig.build.json",
68
+ "build:dev": "rm -rf dist && vite build --mode development && tsc --project tsconfig.build.json",
69
+ "build:prod": "rm -rf dist && vite build --mode production && tsc --project tsconfig.build.json",
67
70
  "dev": "vite build --watch",
68
71
  "test": "vitest run",
69
72
  "valid": "clear && vitest run && pnpm type-check && pnpm lint && pnpm build",
package/dist/List.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"List.js","sources":["../src/list/List.ts"],"sourcesContent":["/**\n * Enhanced List Components (Phase 5.5)\n *\n * SwiftUI-inspired List components with virtual scrolling, ForEach patterns,\n * and high-performance rendering for large datasets.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, createSignal, isSignal } from '@tachui/core'\nimport type { Signal } from '@tachui/core'\nimport { h } from '@tachui/core'\nimport type { ComponentInstance } from '@tachui/core'\nimport { ScrollView, type ScrollViewProps } from '@tachui/mobile'\nimport { withModifiers } from '@tachui/core'\n\n/**\n * List item selection mode\n */\nexport type SelectionMode = 'none' | 'single' | 'multiple'\n\n/**\n * List style\n */\nexport type ListStyle = 'plain' | 'grouped' | 'inset' | 'sidebar'\n\n/**\n * List item swipe action\n */\nexport interface SwipeAction {\n id: string\n title: string\n backgroundColor?: string\n foregroundColor?: string\n icon?: string\n destructive?: boolean\n onTap: () => void\n}\n\n/**\n * List section header/footer\n */\nexport interface ListSection<T = any> {\n id: string\n header?: string | ComponentInstance\n footer?: string | ComponentInstance\n items: T[]\n}\n\n/**\n * Virtual scrolling configuration\n */\nexport interface VirtualScrollConfig {\n enabled: boolean\n itemHeight?: number | ((index: number, item: any) => number)\n estimatedItemHeight?: number\n overscan?: number\n threshold?: number\n}\n\n/**\n * List component properties\n */\nexport interface ListProps<T = any> extends Omit<ScrollViewProps, 'children'> {\n // Data\n data?: T[] | Signal<T[]>\n sections?: ListSection<T>[] | Signal<ListSection<T>[]>\n\n // Rendering\n renderItem: (item: T, index: number) => ComponentInstance\n renderSectionHeader?: (\n section: ListSection<T>,\n index: number\n ) => ComponentInstance\n renderSectionFooter?: (\n section: ListSection<T>,\n index: number\n ) => ComponentInstance\n\n // Appearance\n style?: ListStyle\n separator?: boolean | ComponentInstance\n\n // Selection\n selectionMode?: SelectionMode\n selectedItems?: Signal<Set<string | number>>\n onSelectionChange?: (selectedItems: Set<string | number>) => void\n\n // Item actions\n leadingSwipeActions?: (item: T, index: number) => SwipeAction[]\n trailingSwipeActions?: (item: T, index: number) => SwipeAction[]\n onItemTap?: (item: T, index: number) => void\n onItemLongPress?: (item: T, index: number) => void\n\n // Virtual scrolling\n virtualScrolling?: VirtualScrollConfig\n\n // Performance\n getItemId?: (item: T, index: number) => string | number\n\n // Empty state\n emptyState?: ComponentInstance\n\n // Loading\n isLoading?: boolean | Signal<boolean>\n loadingIndicator?: ComponentInstance\n\n // Pull to refresh (inherited from ScrollView)\n onRefresh?: () => Promise<void>\n\n // Infinite scroll\n onLoadMore?: () => Promise<void>\n hasMore?: boolean | Signal<boolean>\n}\n\n// ForEach components imported from @tachui/flow-control\n\n/**\n * Virtual scroll item info\n */\ninterface VirtualScrollItem {\n index: number\n height: number\n offset: number\n item: any\n}\n\n/**\n * Enhanced List component class\n */\nexport class EnhancedList<T = any> implements ComponentInstance<ListProps<T>> {\n public readonly type = 'component' as const\n public readonly id: string\n public mounted = false\n public cleanup: (() => void)[] = []\n\n private dataSignal: () => T[]\n private setData: (data: T[]) => void\n private sectionsSignal: () => ListSection<T>[]\n private setSections: (sections: ListSection<T>[]) => void\n private selectedItemsSignal: () => Set<string | number>\n private setSelectedItems: (items: Set<string | number>) => void\n private isLoadingSignal: () => boolean\n private setIsLoading: (loading: boolean) => void\n\n // Virtual scrolling state\n private virtualItems: VirtualScrollItem[] = []\n private visibleStartIndex = 0\n private visibleEndIndex = 0\n private scrollOffset = 0\n private containerHeight = 0\n private totalHeight = 0\n\n constructor(public props: ListProps<T>) {\n this.id = `list-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n // Create reactive signals\n const [dataSignal, setData] = createSignal<T[]>(this.resolveData())\n this.dataSignal = dataSignal\n this.setData = setData\n\n const [sectionsSignal, setSections] = createSignal<ListSection<T>[]>(\n this.resolveSections()\n )\n this.sectionsSignal = sectionsSignal\n this.setSections = setSections\n\n const initialSelection = new Set<string | number>()\n const [selectedItemsSignal, setSelectedItems] =\n createSignal(initialSelection)\n this.selectedItemsSignal = selectedItemsSignal\n this.setSelectedItems = setSelectedItems\n\n const [isLoadingSignal, setIsLoading] = createSignal(\n this.resolveIsLoading()\n )\n this.isLoadingSignal = isLoadingSignal\n this.setIsLoading = setIsLoading\n\n // Set up reactive data updates\n this.setupReactiveUpdates()\n\n // Initialize virtual scrolling if enabled\n if (props.virtualScrolling?.enabled) {\n this.initializeVirtualScrolling()\n }\n }\n\n /**\n * Helper to flatten render results\n */\n private flattenRenderResult(result: any): any[] {\n return Array.isArray(result) ? result : [result]\n }\n\n /**\n * Resolve data from various input types\n */\n private resolveData(): T[] {\n const { data } = this.props\n\n if (Array.isArray(data)) {\n return data\n } else if (isSignal(data)) {\n return data()\n } else {\n return []\n }\n }\n\n /**\n * Resolve sections from various input types\n */\n private resolveSections(): ListSection<T>[] {\n const { sections } = this.props\n\n if (Array.isArray(sections)) {\n return sections\n } else if (isSignal(sections)) {\n return sections()\n } else {\n return []\n }\n }\n\n /**\n * Resolve loading state\n */\n private resolveIsLoading(): boolean {\n const { isLoading } = this.props\n\n if (typeof isLoading === 'boolean') {\n return isLoading\n } else if (isSignal(isLoading)) {\n return isLoading()\n } else {\n return false\n }\n }\n\n /**\n * Set up reactive updates for data and state\n */\n private setupReactiveUpdates(): void {\n // Data updates\n if (isSignal(this.props.data)) {\n const effect = createEffect(() => {\n this.setData(this.resolveData())\n this.updateVirtualScrolling()\n })\n this.cleanup.push(() => effect.dispose())\n }\n\n // Sections updates\n if (isSignal(this.props.sections)) {\n const effect = createEffect(() => {\n this.setSections(this.resolveSections())\n this.updateVirtualScrolling()\n })\n this.cleanup.push(() => effect.dispose())\n }\n\n // Loading state updates\n if (isSignal(this.props.isLoading)) {\n const effect = createEffect(() => {\n this.setIsLoading(this.resolveIsLoading())\n })\n this.cleanup.push(() => effect.dispose())\n }\n\n // Selection updates\n if (this.props.selectedItems) {\n const effect = createEffect(() => {\n if (this.props.selectedItems) {\n this.setSelectedItems(this.props.selectedItems())\n }\n })\n this.cleanup.push(() => effect.dispose())\n }\n }\n\n /**\n * Initialize virtual scrolling calculations\n */\n private initializeVirtualScrolling(): void {\n const data = this.dataSignal()\n const config = this.props.virtualScrolling!\n const estimatedHeight = config.estimatedItemHeight || 50\n\n this.virtualItems = data.map((item, index) => ({\n index,\n height: estimatedHeight,\n offset: index * estimatedHeight,\n item,\n }))\n\n this.totalHeight = data.length * estimatedHeight\n }\n\n /**\n * Update virtual scrolling calculations\n */\n private updateVirtualScrolling(): void {\n if (!this.props.virtualScrolling?.enabled) return\n\n this.initializeVirtualScrolling()\n this.calculateVisibleRange()\n }\n\n /**\n * Calculate visible item range for virtual scrolling\n */\n private calculateVisibleRange(): void {\n if (!this.props.virtualScrolling?.enabled) return\n\n const config = this.props.virtualScrolling\n const overscan = config.overscan || 5\n const threshold = config.threshold || 0\n\n // Find first visible item\n let startIndex = 0\n for (let i = 0; i < this.virtualItems.length; i++) {\n if (\n this.virtualItems[i].offset + this.virtualItems[i].height >\n this.scrollOffset - threshold\n ) {\n startIndex = Math.max(0, i - overscan)\n break\n }\n }\n\n // Find last visible item\n let endIndex = this.virtualItems.length - 1\n for (let i = startIndex; i < this.virtualItems.length; i++) {\n if (\n this.virtualItems[i].offset >\n this.scrollOffset + this.containerHeight + threshold\n ) {\n endIndex = Math.min(this.virtualItems.length - 1, i + overscan)\n break\n }\n }\n\n this.visibleStartIndex = startIndex\n this.visibleEndIndex = endIndex\n }\n\n /**\n * Handle item selection\n */\n private handleItemSelection(item: T, index: number): void {\n const { selectionMode, getItemId, onSelectionChange } = this.props\n\n if (selectionMode === 'none') return\n\n const itemId = getItemId ? getItemId(item, index) : index\n const currentSelection = new Set(this.selectedItemsSignal())\n\n if (selectionMode === 'single') {\n currentSelection.clear()\n currentSelection.add(itemId)\n } else if (selectionMode === 'multiple') {\n if (currentSelection.has(itemId)) {\n currentSelection.delete(itemId)\n } else {\n currentSelection.add(itemId)\n }\n }\n\n this.setSelectedItems(currentSelection)\n\n if (onSelectionChange) {\n onSelectionChange(currentSelection)\n }\n }\n\n /**\n * Create list item component\n */\n private createListItem(\n item: T,\n index: number,\n isSelected: boolean\n ): ComponentInstance {\n const { renderItem, style, onItemTap, onItemLongPress } = this.props\n\n const itemContent = renderItem(item, index)\n\n // Wrap in interactive container\n return {\n type: 'component',\n id: `${this.id}-item-${index}`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => {\n const itemElement = h(\n 'div',\n {\n class: `tachui-list-item tachui-list-item-${style || 'plain'}`,\n style: {\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n backgroundColor: isSelected ? '#e6f3ff' : 'transparent',\n transition: 'background-color 0.2s ease',\n cursor: onItemTap ? 'pointer' : 'default',\n },\n },\n ...this.flattenRenderResult(itemContent.render())\n )\n\n // Add event handlers\n if (itemElement.element) {\n const element = itemElement.element as HTMLElement\n\n if (onItemTap) {\n element.addEventListener('click', () => onItemTap(item, index))\n }\n\n if (onItemLongPress) {\n let longPressTimer: NodeJS.Timeout\n\n const startLongPress = () => {\n longPressTimer = setTimeout(\n () => onItemLongPress(item, index),\n 500\n )\n }\n\n const cancelLongPress = () => {\n clearTimeout(longPressTimer)\n }\n\n element.addEventListener('mousedown', startLongPress)\n element.addEventListener('mouseup', cancelLongPress)\n element.addEventListener('mouseleave', cancelLongPress)\n element.addEventListener('touchstart', startLongPress)\n element.addEventListener('touchend', cancelLongPress)\n }\n\n // Selection handling\n if (this.props.selectionMode !== 'none') {\n element.addEventListener('click', e => {\n if (\n e.metaKey ||\n e.ctrlKey ||\n this.props.selectionMode === 'multiple'\n ) {\n e.preventDefault()\n this.handleItemSelection(item, index)\n }\n })\n }\n }\n\n return [itemElement]\n },\n }\n }\n\n /**\n * Create list separator\n */\n private createSeparator(): ComponentInstance | null {\n const { separator } = this.props\n\n if (!separator) return null\n\n if (typeof separator === 'object' && 'render' in separator) {\n return separator\n }\n\n return {\n type: 'component',\n id: `${this.id}-separator`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h('div', {\n class: 'tachui-list-separator',\n style: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '0 16px',\n },\n }),\n ],\n }\n }\n\n /**\n * Create section header\n */\n private createSectionHeader(\n section: ListSection<T>,\n index: number\n ): ComponentInstance | null {\n if (!section.header) return null\n\n if (typeof section.header === 'string') {\n return {\n type: 'component',\n id: `${this.id}-section-header-${index}`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h(\n 'div',\n {\n class: 'tachui-list-section-header',\n style: {\n padding: '8px 16px',\n backgroundColor: '#f8f9fa',\n fontWeight: '600',\n fontSize: '14px',\n color: '#666',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n },\n },\n section.header as string\n ),\n ],\n }\n }\n\n return this.props.renderSectionHeader\n ? this.props.renderSectionHeader(section, index)\n : (section.header as ComponentInstance)\n }\n\n /**\n * Create section footer\n */\n private createSectionFooter(\n section: ListSection<T>,\n index: number\n ): ComponentInstance | null {\n if (!section.footer) return null\n\n if (typeof section.footer === 'string') {\n return {\n type: 'component',\n id: `${this.id}-section-footer-${index}`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h(\n 'div',\n {\n class: 'tachui-list-section-footer',\n style: {\n padding: '8px 16px',\n fontSize: '12px',\n color: '#999',\n },\n },\n section.footer as string\n ),\n ],\n }\n }\n\n return this.props.renderSectionFooter\n ? this.props.renderSectionFooter(section, index)\n : (section.footer as ComponentInstance)\n }\n\n /**\n * Create empty state component\n */\n private createEmptyState(): ComponentInstance | null {\n const { emptyState } = this.props\n\n if (!emptyState) {\n return {\n type: 'component',\n id: `${this.id}-empty`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h(\n 'div',\n {\n class: 'tachui-list-empty',\n style: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '40px 20px',\n color: '#999',\n fontSize: '16px',\n },\n },\n 'No items to display'\n ),\n ],\n }\n }\n\n return emptyState\n }\n\n /**\n * Create loading indicator\n */\n private createLoadingIndicator(): ComponentInstance | null {\n const { loadingIndicator } = this.props\n\n if (!loadingIndicator) {\n return {\n type: 'component',\n id: `${this.id}-loading`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h(\n 'div',\n {\n class: 'tachui-list-loading',\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '20px',\n color: '#999',\n },\n },\n 'Loading...'\n ),\n ],\n }\n }\n\n return loadingIndicator\n }\n\n /**\n * Render virtual scrolling content\n */\n private renderVirtualContent(): ComponentInstance[] {\n if (!this.props.virtualScrolling?.enabled) {\n return this.renderRegularContent()\n }\n\n const data = this.dataSignal()\n const selectedItems = this.selectedItemsSignal()\n const separator = this.createSeparator()\n\n const visibleItems: ComponentInstance[] = []\n\n // Add spacer for items before visible range\n if (this.visibleStartIndex > 0) {\n const spacerHeight =\n this.virtualItems[this.visibleStartIndex]?.offset || 0\n visibleItems.push({\n type: 'component',\n id: `${this.id}-spacer-top`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h('div', {\n style: { height: `${spacerHeight}px` },\n }),\n ],\n })\n }\n\n // Render visible items\n for (\n let i = this.visibleStartIndex;\n i <= this.visibleEndIndex && i < data.length;\n i++\n ) {\n const item = data[i]\n const itemId = this.props.getItemId ? this.props.getItemId(item, i) : i\n const isSelected = selectedItems.has(itemId)\n\n visibleItems.push(this.createListItem(item, i, isSelected))\n\n if (separator && i < data.length - 1) {\n visibleItems.push(separator)\n }\n }\n\n // Add spacer for items after visible range\n if (this.visibleEndIndex < data.length - 1) {\n const remainingHeight =\n this.totalHeight -\n (this.virtualItems[this.visibleEndIndex + 1]?.offset || 0)\n visibleItems.push({\n type: 'component',\n id: `${this.id}-spacer-bottom`,\n mounted: false,\n cleanup: [],\n props: {},\n render: () => [\n h('div', {\n style: { height: `${remainingHeight}px` },\n }),\n ],\n })\n }\n\n return visibleItems\n }\n\n /**\n * Render regular (non-virtual) content\n */\n private renderRegularContent(): ComponentInstance[] {\n const data = this.dataSignal()\n const sections = this.sectionsSignal()\n const selectedItems = this.selectedItemsSignal()\n const separator = this.createSeparator()\n\n const content: ComponentInstance[] = []\n\n // Render sections if available\n if (sections.length > 0) {\n sections.forEach((section, sectionIndex) => {\n // Section header\n const header = this.createSectionHeader(section, sectionIndex)\n if (header) content.push(header)\n\n // Section items\n section.items.forEach((item, itemIndex) => {\n const globalIndex = sectionIndex * 1000 + itemIndex // Simple global index\n const itemId = this.props.getItemId\n ? this.props.getItemId(item, globalIndex)\n : globalIndex\n const isSelected = selectedItems.has(itemId)\n\n content.push(this.createListItem(item, globalIndex, isSelected))\n\n if (separator && itemIndex < section.items.length - 1) {\n content.push(separator)\n }\n })\n\n // Section footer\n const footer = this.createSectionFooter(section, sectionIndex)\n if (footer) content.push(footer)\n })\n } else {\n // Render flat data\n data.forEach((item, index) => {\n const itemId = this.props.getItemId\n ? this.props.getItemId(item, index)\n : index\n const isSelected = selectedItems.has(itemId)\n\n content.push(this.createListItem(item, index, isSelected))\n\n if (separator && index < data.length - 1) {\n content.push(separator)\n }\n })\n }\n\n return content\n }\n\n /**\n * Handle scroll events for virtual scrolling and infinite scroll\n */\n private handleListScroll = (scrollInfo: any) => {\n this.scrollOffset = scrollInfo.offset.y\n this.containerHeight = scrollInfo.containerSize.height\n\n // Update virtual scrolling\n if (this.props.virtualScrolling?.enabled) {\n this.calculateVisibleRange()\n }\n\n // Handle infinite scroll\n if (this.props.onLoadMore && scrollInfo.edges.bottom) {\n const hasMore = isSignal(this.props.hasMore)\n ? this.props.hasMore()\n : this.props.hasMore\n if (hasMore && !this.isLoadingSignal()) {\n this.setIsLoading(true)\n this.props.onLoadMore().finally(() => {\n this.setIsLoading(false)\n })\n }\n }\n\n // Forward to parent scroll handler\n if (this.props.onScroll) {\n this.props.onScroll(scrollInfo)\n }\n }\n\n /**\n * Render the list component\n */\n render() {\n const data = this.dataSignal()\n const isLoading = this.isLoadingSignal()\n\n // Show loading indicator if loading and no data\n if (isLoading && data.length === 0) {\n const loadingIndicator = this.createLoadingIndicator()\n return loadingIndicator ? loadingIndicator.render() : []\n }\n\n // Show empty state if no data\n if (data.length === 0 && !isLoading) {\n const emptyState = this.createEmptyState()\n return emptyState ? emptyState.render() : []\n }\n\n // Render list content\n const content = this.props.virtualScrolling?.enabled\n ? this.renderVirtualContent()\n : this.renderRegularContent()\n\n // Add loading indicator at bottom if loading more\n if (isLoading && data.length > 0) {\n const loadingIndicator = this.createLoadingIndicator()\n if (loadingIndicator) {\n content.push(loadingIndicator)\n }\n }\n\n // Create scroll view props\n const scrollViewProps: ScrollViewProps = {\n ...this.props,\n children: content,\n onScroll: this.handleListScroll,\n }\n\n // Create scroll view\n const scrollView = new (ScrollView as any)(scrollViewProps)\n return scrollView.render()\n }\n}\n\n// ForEach class implementation available from @tachui/flow-control\n\n/**\n * Create enhanced List component with modifier support\n */\nexport function List<T = any>(\n props: ListProps<T>\n): ModifiableComponent<ListProps<T>> & {\n modifier: ModifierBuilder<ModifiableComponent<ListProps<T>>>\n} {\n const component = new EnhancedList(props)\n return withModifiers(component)\n}\n\n// ForEach functions are imported from @tachui/flow-control\n\n/**\n * List utility functions\n */\nexport const ListUtils = {\n /**\n * Create a simple list from array\n */\n simple<T>(\n data: T[] | Signal<T[]>,\n renderItem: (item: T, index: number) => ComponentInstance,\n props: Omit<ListProps<T>, 'data' | 'renderItem'> = {}\n ): ModifiableComponent<ListProps<T>> & {\n modifier: ModifierBuilder<ModifiableComponent<ListProps<T>>>\n } {\n return List({\n ...props,\n data,\n renderItem,\n })\n },\n\n /**\n * Create a sectioned list\n */\n sectioned<T>(\n sections: ListSection<T>[] | Signal<ListSection<T>[]>,\n renderItem: (item: T, index: number) => ComponentInstance,\n props: Omit<ListProps<T>, 'sections' | 'renderItem'> = {}\n ): ModifiableComponent<ListProps<T>> & {\n modifier: ModifierBuilder<ModifiableComponent<ListProps<T>>>\n } {\n return List({\n ...props,\n sections,\n renderItem,\n })\n },\n\n /**\n * Create a virtual scrolling list for large datasets\n */\n virtual<T>(\n data: T[] | Signal<T[]>,\n renderItem: (item: T, index: number) => ComponentInstance,\n virtualConfig: VirtualScrollConfig,\n props: Omit<ListProps<T>, 'data' | 'renderItem' | 'virtualScrolling'> = {}\n ): ModifiableComponent<ListProps<T>> & {\n modifier: ModifierBuilder<ModifiableComponent<ListProps<T>>>\n } {\n return List({\n ...props,\n data,\n renderItem,\n virtualScrolling: virtualConfig,\n })\n },\n\n /**\n * Create an infinite scrolling list\n */\n infinite<T>(\n data: T[] | Signal<T[]>,\n renderItem: (item: T, index: number) => ComponentInstance,\n onLoadMore: () => Promise<void>,\n hasMore: boolean | Signal<boolean>,\n props: Omit<\n ListProps<T>,\n 'data' | 'renderItem' | 'onLoadMore' | 'hasMore'\n > = {}\n ): ModifiableComponent<ListProps<T>> & {\n modifier: ModifierBuilder<ModifiableComponent<ListProps<T>>>\n } {\n return List({\n ...props,\n data,\n renderItem,\n onLoadMore,\n hasMore,\n })\n },\n}\n"],"names":["EnhancedList","props","__publicField","scrollInfo","isSignal","dataSignal","setData","createSignal","sectionsSignal","setSections","initialSelection","selectedItemsSignal","setSelectedItems","isLoadingSignal","setIsLoading","result","data","sections","isLoading","effect","createEffect","estimatedHeight","item","index","config","overscan","threshold","startIndex","i","endIndex","selectionMode","getItemId","onSelectionChange","itemId","currentSelection","isSelected","renderItem","style","onItemTap","onItemLongPress","itemContent","itemElement","h","element","longPressTimer","startLongPress","cancelLongPress","e","separator","section","emptyState","loadingIndicator","selectedItems","visibleItems","spacerHeight","remainingHeight","content","sectionIndex","header","itemIndex","globalIndex","footer","scrollViewProps","ScrollView","List","component","withModifiers","ListUtils","virtualConfig","onLoadMore","hasMore"],"mappings":"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"}
package/dist/Menu.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"Menu.js","sources":["../src/menu/Menu.ts"],"sourcesContent":["/**\n * Menu Component\n *\n * SwiftUI-inspired Menu component with dropdowns, context menus,\n * positioning, and keyboard navigation support.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, createSignal, isSignal } from '@tachui/core'\nimport type { Signal } from '@tachui/core'\nimport { h } from '@tachui/core'\nimport type { ComponentInstance, ComponentProps, DOMNode } from '@tachui/core'\nimport { withModifiers } from '@tachui/core'\nimport {\n useLifecycle,\n AnimationManager,\n FocusManager,\n setupPositioning,\n} from '@tachui/core'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n id?: string\n title: string | Signal<string>\n systemImage?: string\n shortcut?: string\n disabled?: boolean | Signal<boolean>\n destructive?: boolean\n role?: 'default' | 'destructive' | 'cancel'\n action?: () => void | Promise<void>\n submenu?: MenuItem[]\n}\n\n/**\n * Menu positioning options\n */\nexport type MenuPlacement =\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\n/**\n * Menu component properties\n */\nexport interface MenuProps extends ComponentProps {\n // Content\n items: MenuItem[]\n\n // Trigger\n trigger:\n | ComponentInstance\n | HTMLElement\n | (() => ComponentInstance | HTMLElement)\n\n // Visibility\n isOpen?: Signal<boolean>\n\n // Behavior\n placement?: MenuPlacement\n closeOnSelect?: boolean\n closeOnClickOutside?: boolean\n escapeKeyCloses?: boolean\n\n // Positioning\n offset?: { x: number; y: number }\n flip?: boolean\n shift?: boolean\n\n // Animation\n animationDuration?: number\n\n // Accessibility\n accessibilityLabel?: string\n}\n\n/**\n * Menu theme configuration\n */\nexport interface MenuTheme {\n colors: {\n background: string\n surface: string\n text: string\n textSecondary: string\n textDisabled: string\n textDestructive: string\n border: string\n hover: string\n active: string\n separator: string\n shortcut: string\n backdrop: string\n }\n spacing: {\n padding: number\n itemPadding: number\n gap: number\n }\n borderRadius: number\n minWidth: number\n maxWidth: number\n itemHeight: number\n shadow: string\n backdropBlur: string\n}\n\n/**\n * Default menu theme\n */\nexport const defaultMenuTheme: MenuTheme = {\n colors: {\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A1A',\n textSecondary: '#6B7280',\n textDisabled: '#A0A0A0',\n textDestructive: '#FF3B30',\n border: '#E5E5E5',\n hover: '#F0F0F0',\n active: '#E3F2FD',\n separator: '#E5E5E5',\n shortcut: '#8E8E93',\n backdrop: 'rgba(0, 0, 0, 0.1)',\n },\n spacing: {\n padding: 8,\n itemPadding: 12,\n gap: 4,\n },\n borderRadius: 8,\n minWidth: 200,\n maxWidth: 320,\n itemHeight: 36,\n shadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n backdropBlur: 'blur(2px)',\n}\n\n/**\n * Menu component implementation\n */\nexport class MenuComponent implements ComponentInstance<MenuProps> {\n public readonly type = 'component' as const\n public readonly id: string\n public readonly props: MenuProps\n public cleanup: (() => void)[] = []\n private theme: MenuTheme = defaultMenuTheme\n private isOpenSignal = createSignal(false)\n private get isOpen() {\n return this.isOpenSignal[0]\n }\n private get setIsOpen() {\n return this.isOpenSignal[1]\n }\n private focusedIndex = -1\n private menuElement: HTMLElement | null = null\n private triggerElement: HTMLElement | null = null\n\n constructor(props: MenuProps) {\n this.props = props\n this.id = `menu-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n // Use provided isOpen signal or internal one\n if (this.props.isOpen) {\n this.isOpenSignal = [\n this.props.isOpen,\n ((value: boolean | ((prev: boolean) => boolean)) => {\n if (typeof this.props.isOpen === 'function') {\n ;(this.props.isOpen as any)(\n typeof value === 'function'\n ? value((this.props.isOpen as any)())\n : value\n )\n }\n }) as any,\n ]\n }\n\n // ENHANCED: Set up lifecycle hooks for menu positioning and animations\n useLifecycle(this, {\n onDOMReady: (_elements, primaryElement) => {\n if (primaryElement) {\n // Set up menu positioning when DOM is ready\n this.setupMenuPositioning(primaryElement)\n\n // Set up animation and focus management\n this.setupMenuAnimations(primaryElement)\n }\n },\n })\n }\n\n private resolveValue<T>(value: T | Signal<T>): T {\n return isSignal(value) ? value() : value\n }\n\n /**\n * Set up menu positioning using enhanced lifecycle (ENHANCED Phase 3)\n */\n private setupMenuPositioning(_containerElement: Element): void {\n // Positioning is now handled via onDOMReady hooks when menu elements are guaranteed to exist\n // No more setTimeout positioning hacks needed\n if (!this.cleanup) this.cleanup = []\n\n // Set up positioning calculation that runs when both trigger and menu exist\n setupPositioning(\n this,\n `[data-menu-trigger=\"${this.id}\"]`,\n `[data-menu-content=\"${this.id}\"]`,\n (trigger, menu) =>\n this.calculatePosition(trigger as HTMLElement, menu as HTMLElement)\n )\n }\n\n /**\n * Set up menu animations using enhanced lifecycle (ENHANCED Phase 3)\n */\n private setupMenuAnimations(_containerElement: Element): void {\n // Animation coordination now handled by AnimationManager instead of setTimeout\n // Focus management handled by FocusManager instead of setTimeout\n if (!this.cleanup) this.cleanup = []\n }\n\n private getVisibleItems(): MenuItem[] {\n return this.props.items.filter(item => item.title !== '---') // Exclude separators\n }\n\n private createMenuItem(item: MenuItem, index: number): DOMNode {\n if (item.title === '---') {\n // Separator\n return h('div', {\n role: 'separator',\n style: {\n height: '1px',\n backgroundColor: this.theme.colors.separator,\n margin: `${this.theme.spacing.gap}px 0`,\n },\n })\n }\n\n const isDisabled = this.resolveValue(item.disabled ?? false)\n const title = this.resolveValue(item.title)\n\n const menuItem = h('div', {\n role: 'menuitem',\n tabindex: isDisabled ? '-1' : '0',\n 'aria-disabled': isDisabled,\n 'data-menu-item-index': index,\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${this.theme.spacing.itemPadding}px`,\n minHeight: `${this.theme.itemHeight}px`,\n fontSize: '14px',\n fontWeight: '400',\n color: isDisabled\n ? this.theme.colors.textDisabled\n : item.destructive || item.role === 'destructive'\n ? this.theme.colors.textDestructive\n : this.theme.colors.text,\n cursor: isDisabled ? 'default' : 'pointer',\n borderRadius: `${this.theme.borderRadius / 2}px`,\n transition: 'all 150ms ease-out',\n userSelect: 'none',\n },\n onclick: async (e: Event) => {\n if (isDisabled) return\n\n e.preventDefault()\n e.stopPropagation()\n\n if (item.action) {\n try {\n await item.action()\n } catch (error) {\n console.error('Menu item action failed:', error)\n }\n }\n\n if (this.props.closeOnSelect ?? true) {\n this.setIsOpenValue(false)\n }\n },\n onmouseenter: () => {\n if (!isDisabled) {\n this.focusedIndex = index\n this.updateItemFocus()\n const element = menuItem.element as HTMLElement\n if (element) element.style.backgroundColor = this.theme.colors.hover\n }\n },\n onmouseleave: () => {\n if (!isDisabled) {\n const element = menuItem.element as HTMLElement\n if (element) element.style.backgroundColor = 'transparent'\n }\n },\n })\n\n // Content container\n const content = h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: `${this.theme.spacing.gap * 2}px`,\n },\n })\n\n // System image/icon\n if (item.systemImage) {\n const icon = h('span', {\n style: {\n fontSize: '16px',\n color: 'inherit',\n },\n })\n const iconElement = icon.element as HTMLElement\n if (iconElement) iconElement.textContent = item.systemImage\n const contentElement = content.element as HTMLElement\n if (contentElement && iconElement) contentElement.appendChild(iconElement)\n }\n\n // Title\n const titleElement = h('span')\n const titleElementDOM = titleElement.element as HTMLElement\n if (titleElementDOM) titleElementDOM.textContent = title\n const contentElement = content.element as HTMLElement\n if (contentElement && titleElementDOM)\n contentElement.appendChild(titleElementDOM)\n\n const menuItemElement = menuItem.element as HTMLElement\n if (menuItemElement && contentElement)\n menuItemElement.appendChild(contentElement)\n\n // Keyboard shortcut\n if (item.shortcut) {\n const shortcut = h('span', {\n style: {\n fontSize: '12px',\n color: this.theme.colors.shortcut,\n fontFamily: 'monospace',\n },\n })\n const shortcutElement = shortcut.element as HTMLElement\n if (shortcutElement) shortcutElement.textContent = item.shortcut\n if (menuItemElement && shortcutElement)\n menuItemElement.appendChild(shortcutElement)\n }\n\n // Submenu indicator\n if (item.submenu && item.submenu.length > 0) {\n const indicator = h('span', {\n style: {\n fontSize: '12px',\n color: this.theme.colors.textSecondary,\n },\n })\n const indicatorElement = indicator.element as HTMLElement\n if (indicatorElement) indicatorElement.textContent = '▶'\n if (menuItemElement && indicatorElement)\n menuItemElement.appendChild(indicatorElement)\n }\n\n return menuItem\n }\n\n private updateItemFocus(): void {\n if (!this.menuElement) return\n\n const items = this.menuElement.querySelectorAll('[role=\"menuitem\"]')\n items.forEach((item, index) => {\n const element = item as HTMLElement\n if (index === this.focusedIndex) {\n element.style.backgroundColor = this.theme.colors.hover\n element.focus()\n } else {\n element.style.backgroundColor = 'transparent'\n }\n })\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (!this.isOpen()) return\n\n const visibleItems = this.getVisibleItems()\n\n switch (e.key) {\n case 'Escape':\n if (this.props.escapeKeyCloses ?? true) {\n e.preventDefault()\n this.setIsOpenValue(false)\n }\n break\n\n case 'ArrowDown':\n e.preventDefault()\n this.focusedIndex = Math.min(\n this.focusedIndex + 1,\n visibleItems.length - 1\n )\n this.updateItemFocus()\n break\n\n case 'ArrowUp':\n e.preventDefault()\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0)\n this.updateItemFocus()\n break\n\n case 'Enter':\n case ' ':\n if (this.focusedIndex >= 0 && this.focusedIndex < visibleItems.length) {\n e.preventDefault()\n // const item = visibleItems[this.focusedIndex]\n const menuItem = this.menuElement?.querySelector(\n `[data-menu-item-index=\"${this.focusedIndex}\"]`\n ) as HTMLElement\n if (menuItem) {\n menuItem.click()\n }\n }\n break\n\n case 'Home':\n e.preventDefault()\n this.focusedIndex = 0\n this.updateItemFocus()\n break\n\n case 'End':\n e.preventDefault()\n this.focusedIndex = visibleItems.length - 1\n this.updateItemFocus()\n break\n }\n }\n\n private calculatePosition(\n trigger: HTMLElement,\n menu: HTMLElement\n ): { x: number; y: number } {\n const triggerRect = trigger.getBoundingClientRect()\n const menuRect = menu.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const placement = this.props.placement ?? 'bottom'\n const offset = this.props.offset ?? { x: 0, y: 4 }\n\n let x = 0\n let y = 0\n\n // Calculate base position based on placement\n switch (placement) {\n case 'bottom':\n case 'bottom-start':\n case 'bottom-end':\n y = triggerRect.bottom + offset.y\n break\n case 'top':\n case 'top-start':\n case 'top-end':\n y = triggerRect.top - menuRect.height - offset.y\n break\n case 'right':\n case 'right-start':\n case 'right-end':\n x = triggerRect.right + offset.x\n break\n case 'left':\n case 'left-start':\n case 'left-end':\n x = triggerRect.left - menuRect.width - offset.x\n break\n }\n\n switch (placement) {\n case 'bottom':\n case 'top':\n x = triggerRect.left + (triggerRect.width - menuRect.width) / 2\n break\n case 'bottom-start':\n case 'top-start':\n x = triggerRect.left\n break\n case 'bottom-end':\n case 'top-end':\n x = triggerRect.right - menuRect.width\n break\n case 'right':\n case 'left':\n y = triggerRect.top + (triggerRect.height - menuRect.height) / 2\n break\n case 'right-start':\n case 'left-start':\n y = triggerRect.top\n break\n case 'right-end':\n case 'left-end':\n y = triggerRect.bottom - menuRect.height\n break\n }\n\n // Handle flipping and shifting if enabled\n if (this.props.flip ?? true) {\n if (\n y + menuRect.height > viewport.height &&\n triggerRect.top > menuRect.height\n ) {\n y = triggerRect.top - menuRect.height - offset.y\n }\n if (\n x + menuRect.width > viewport.width &&\n triggerRect.left > menuRect.width\n ) {\n x = triggerRect.left - menuRect.width - offset.x\n }\n }\n\n if (this.props.shift ?? true) {\n x = Math.max(8, Math.min(x, viewport.width - menuRect.width - 8))\n y = Math.max(8, Math.min(y, viewport.height - menuRect.height - 8))\n }\n\n return { x, y }\n }\n\n private createMenuContent(): DOMNode {\n const menu = h('div', {\n role: 'menu',\n 'aria-labelledby': `${this.id}-trigger`,\n 'data-menu-id': this.id,\n 'data-menu-content': this.id, // ENHANCED: Add data attribute for lifecycle hooks\n style: {\n position: 'fixed',\n backgroundColor: this.theme.colors.background,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n boxShadow: this.theme.shadow,\n minWidth: `${this.theme.minWidth}px`,\n maxWidth: `${this.theme.maxWidth}px`,\n padding: `${this.theme.spacing.padding}px`,\n zIndex: '9999',\n opacity: '0',\n transform: 'scale(0.95)',\n transformOrigin: 'top',\n transition: `all ${this.props.animationDuration || 150}ms cubic-bezier(0.16, 1, 0.3, 1)`,\n },\n })\n\n // Create menu items\n this.props.items.forEach((item, index) => {\n const menuItem = this.createMenuItem(item, index)\n const menuElement = menu.element as HTMLElement\n const menuItemElement = menuItem.element as HTMLElement\n if (menuElement && menuItemElement) {\n menuElement.appendChild(menuItemElement)\n }\n })\n\n this.menuElement = menu.element as HTMLElement\n return menu\n }\n\n private setupTrigger(): HTMLElement {\n let trigger: HTMLElement\n\n if (typeof this.props.trigger === 'function') {\n const result = this.props.trigger()\n if ('render' in result) {\n const rendered = result.render()\n if (Array.isArray(rendered)) {\n trigger = rendered[0]?.element as HTMLElement\n } else {\n trigger =\n rendered instanceof HTMLElement\n ? rendered\n : (rendered?.element as HTMLElement)\n }\n } else {\n trigger = result as HTMLElement\n }\n } else if ('render' in this.props.trigger) {\n const rendered = this.props.trigger.render()\n if (Array.isArray(rendered)) {\n trigger = rendered[0]?.element as HTMLElement\n } else {\n trigger =\n rendered instanceof HTMLElement\n ? rendered\n : (rendered?.element as HTMLElement)\n }\n } else {\n trigger = this.props.trigger as HTMLElement\n }\n\n trigger.id = trigger.id || `${this.id}-trigger`\n trigger.setAttribute('aria-haspopup', 'menu')\n trigger.setAttribute('aria-expanded', String(this.isOpen()))\n trigger.setAttribute('data-menu-trigger', this.id) // ENHANCED: Add data attribute for lifecycle hooks\n\n trigger.addEventListener('click', e => {\n e.preventDefault()\n e.stopPropagation()\n this.setIsOpenValue(!this.isOpen())\n })\n\n this.triggerElement = trigger\n return trigger\n }\n\n render(): DOMNode {\n const container = h('div', {\n style: {\n position: 'relative',\n display: 'inline-block',\n },\n })\n\n // Setup trigger\n const trigger = this.setupTrigger()\n if (container.element && trigger) {\n ;(container.element as HTMLElement).appendChild(trigger)\n }\n\n // Create reactive effect for menu visibility\n createEffect(() => {\n const isOpenValue = this.isOpen()\n\n if (isOpenValue) {\n // Show menu\n const menu = this.createMenuContent()\n const menuElement = menu.element as HTMLElement\n if (menuElement) {\n document.body.appendChild(menuElement)\n this.menuElement = menuElement\n }\n\n // ENHANCED: Position and animate menu using lifecycle hooks\n if (this.triggerElement && this.menuElement) {\n // Immediate positioning - no setTimeout needed\n const position = this.calculatePosition(\n this.triggerElement,\n this.menuElement\n )\n this.menuElement.style.left = `${position.x}px`\n this.menuElement.style.top = `${position.y}px`\n\n // Use AnimationManager for smooth animation\n AnimationManager.scaleIn(\n this,\n this.menuElement,\n this.props.animationDuration || 150\n )\n\n // Use FocusManager for proper focus handling\n this.focusedIndex = 0\n FocusManager.focusWhenReady(\n this,\n '[role=\"menuitem\"]',\n this.menuElement\n )\n }\n\n // Add event listeners\n document.addEventListener('keydown', this.handleKeyDown)\n document.addEventListener('click', this.handleClickOutside)\n\n // Update trigger aria-expanded\n this.triggerElement?.setAttribute('aria-expanded', 'true')\n } else {\n // ENHANCED: Hide menu using transition event listener instead of setTimeout\n if (this.menuElement) {\n this.menuElement.style.opacity = '0'\n this.menuElement.style.transform = 'scale(0.95)'\n\n // Use transition event listener for cleanup\n const handleTransitionEnd = () => {\n if (this.menuElement?.parentNode) {\n document.body.removeChild(this.menuElement)\n this.menuElement = null\n }\n this.menuElement?.removeEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n }\n this.menuElement.addEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n\n // Fallback timeout in case transition doesn't fire (rare edge case)\n const fallbackTimeout = setTimeout(() => {\n this.menuElement?.removeEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n handleTransitionEnd()\n }, this.props.animationDuration || 150)\n\n // Store cleanup for fallback timeout\n if (!this.cleanup) this.cleanup = []\n this.cleanup.push(() => {\n if (fallbackTimeout) clearTimeout(fallbackTimeout)\n })\n }\n\n // Remove event listeners\n document.removeEventListener('keydown', this.handleKeyDown)\n document.removeEventListener('click', this.handleClickOutside)\n\n // Update trigger aria-expanded\n this.triggerElement?.setAttribute('aria-expanded', 'false')\n\n // Reset focus index\n this.focusedIndex = -1\n }\n })\n\n return container\n }\n\n private handleClickOutside = (e: Event): void => {\n if (!(this.props.closeOnClickOutside ?? true)) return\n\n const target = e.target as Element\n const isInsideMenu = this.menuElement?.contains(target)\n const isInsideTrigger = this.triggerElement?.contains(target)\n\n if (!isInsideMenu && !isInsideTrigger) {\n this.setIsOpenValue(false)\n }\n }\n\n private setIsOpenValue = (value: boolean): void => {\n if (this.props.isOpen) {\n // For controlled component, the signal setter should be used directly\n if (typeof this.props.isOpen === 'function') {\n ;(this.props.isOpen as any)(value)\n }\n } else {\n this.setIsOpen(value)\n }\n }\n}\n\n/**\n * Create a Menu component\n */\nexport function Menu(\n props: MenuProps\n): ModifiableComponent<MenuProps> & {\n modifier: ModifierBuilder<ModifiableComponent<MenuProps>>\n} {\n return withModifiers(new MenuComponent(props))\n}\n\n/**\n * Menu utility functions and presets\n */\nexport const MenuUtils = {\n /**\n * Create a separator item\n */\n separator(): MenuItem {\n return { title: '---' }\n },\n\n /**\n * Create a destructive menu item\n */\n destructive(\n title: string,\n action: () => void,\n systemImage?: string\n ): MenuItem {\n return {\n title,\n action,\n destructive: true,\n systemImage,\n }\n },\n\n /**\n * Create a menu item with keyboard shortcut\n */\n withShortcut(\n title: string,\n shortcut: string,\n action: () => void,\n systemImage?: string\n ): MenuItem {\n return {\n title,\n shortcut,\n action,\n systemImage,\n }\n },\n\n /**\n * Create a context menu for right-click interactions\n */\n contextMenu(target: HTMLElement, items: MenuItem[]): void {\n const [isOpen, setIsOpen] = createSignal(false)\n const [position, setPosition] = createSignal({ x: 0, y: 0 })\n\n target.addEventListener('contextmenu', e => {\n e.preventDefault()\n setPosition({ x: e.clientX, y: e.clientY })\n setIsOpen(true)\n })\n\n // Note: This is a stub implementation\n // Full context menu positioning would require additional DOM manipulation\n console.log('Context menu requested', {\n items,\n position: position(),\n isOpen: isOpen(),\n })\n },\n}\n\n/**\n * Menu styles and theming\n */\nexport const MenuStyles = {\n theme: defaultMenuTheme,\n\n /**\n * Create a custom menu theme\n */\n createTheme(overrides: Partial<MenuTheme>): MenuTheme {\n return { ...defaultMenuTheme, ...overrides }\n },\n\n /**\n * Dark theme preset\n */\n darkTheme(): MenuTheme {\n return {\n ...defaultMenuTheme,\n colors: {\n ...defaultMenuTheme.colors,\n background: '#2A2A2A',\n surface: '#3A3A3A',\n text: '#FFFFFF',\n textSecondary: '#A0A0A0',\n border: '#404040',\n hover: '#404040',\n active: '#0066CC',\n },\n }\n },\n}\n"],"names":["defaultMenuTheme","MenuComponent","props","__publicField","createSignal","visibleItems","menuItem","target","isInsideMenu","isInsideTrigger","value","useLifecycle","_elements","primaryElement","isSignal","_containerElement","setupPositioning","trigger","menu","item","index","h","isDisabled","title","e","error","element","content","iconElement","contentElement","titleElementDOM","menuItemElement","shortcutElement","indicatorElement","triggerRect","menuRect","viewport","placement","offset","x","y","menuElement","result","rendered","container","createEffect","position","AnimationManager","FocusManager","handleTransitionEnd","fallbackTimeout","Menu","withModifiers","MenuUtils","action","systemImage","shortcut","items","isOpen","setIsOpen","setPosition","MenuStyles","overrides"],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}