@stacksjs/desktop 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/alerts.ts", "../src/components.ts", "../src/modals.ts", "../src/system-tray.ts", "../src/dialogs.ts", "../src/window.ts"],
4
+ "sourcesContent": [
5
+ "import type { AlertOptions, ToastOptions } from './types'\n\n/**\n * Alert / Toast Notification Implementation\n *\n * Provides cross-platform notification functionality.\n * Uses native notifications when available, falls back to web-based toasts.\n *\n * Features:\n * - Multiple notification types (info, success, warning, error)\n * - Configurable position and duration\n * - Auto-dismiss with optional manual close\n * - Queue management for multiple notifications\n * - Click handlers\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface AlertState {\n id: string\n options: AlertOptions\n element?: HTMLElement\n timeout?: ReturnType<typeof setTimeout>\n}\n\n// =============================================================================\n// Platform Detection\n// =============================================================================\n\n/**\n * Check if native notifications are available\n */\nfunction hasNativeNotificationSupport(): boolean {\n // Check for browser Notification API\n if (typeof Notification !== 'undefined' && Notification.permission === 'granted') {\n return true\n }\n // Future: Check for @stacksjs/zyte bindings for desktop notifications\n return false\n}\n\n/**\n * Check if running in browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Request notification permission (browser)\n */\nexport async function requestNotificationPermission(): Promise<boolean> {\n if (typeof Notification === 'undefined') {\n return false\n }\n\n if (Notification.permission === 'granted') {\n return true\n }\n\n if (Notification.permission === 'denied') {\n return false\n }\n\n const permission = await Notification.requestPermission()\n return permission === 'granted'\n}\n\n// =============================================================================\n// Alert Manager\n// =============================================================================\n\n// Active alerts\nconst activeAlerts = new Map<string, AlertState>()\n\n// Toast container element\nconst _toastContainer: HTMLElement | null = null\n\n/**\n * Generate a unique alert ID\n */\nfunction generateAlertId(): string {\n return `alert-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n\n/**\n * Get icon for alert type\n */\nfunction getAlertIcon(type: AlertOptions['type']): string {\n switch (type) {\n case 'info':\n return '&#x2139;'\n case 'success':\n return '&#x2714;'\n case 'warning':\n return '&#x26A0;'\n case 'error':\n return '&#x2716;'\n default:\n return '&#x2139;'\n }\n}\n\n/**\n * Get or create the toast container element\n */\nfunction getToastContainer(position: AlertOptions['position'] = 'top-right'): HTMLElement {\n if (!isBrowser()) {\n throw new Error('Toast container requires browser environment')\n }\n\n // Check if container already exists with correct position\n try {\n const existingContainer = document.querySelector(`.stx-toast-container[data-position=\"${position}\"]`)\n if (existingContainer) {\n return existingContainer as HTMLElement\n }\n }\n catch {\n // Ignore querySelector errors in very-happy-dom\n }\n\n // Create new container\n const container = document.createElement('div')\n container.className = `stx-toast-container ${position}`\n container.dataset.position = position\n\n // Safely append to body\n try {\n if (document.body) {\n document.body.appendChild(container)\n }\n }\n catch {\n // Ignore appendChild errors in very-happy-dom\n }\n\n return container\n}\n\n/**\n * Create toast HTML\n */\nfunction createToastHTML(state: AlertState): string {\n const { options } = state\n const icon = getAlertIcon(options.type)\n const typeClass = options.type || 'info'\n const hasClose = options.duration !== 0\n\n return `\n <div class=\"stx-toast ${typeClass}\" data-alert-id=\"${state.id}\" role=\"alert\" aria-live=\"polite\">\n <div class=\"stx-toast-icon\">${icon}</div>\n <div class=\"stx-toast-content\">\n ${options.title ? `<div class=\"stx-toast-title\">${escapeHtml(options.title)}</div>` : ''}\n <div class=\"stx-toast-message\">${escapeHtml(options.message)}</div>\n </div>\n ${hasClose ? '<button class=\"stx-toast-close\" aria-label=\"Close\">&times;</button>' : ''}\n </div>\n `\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * Dismiss an alert\n */\nfunction dismissAlert(state: AlertState): void {\n // Clear timeout if exists\n if (state.timeout) {\n clearTimeout(state.timeout)\n }\n\n // Remove from active alerts\n activeAlerts.delete(state.id)\n\n // Animate out and remove element\n if (state.element && isBrowser()) {\n state.element.classList.add('dismissing')\n setTimeout(() => {\n state.element?.remove()\n }, 200)\n }\n}\n\n/**\n * Show an alert/notification\n *\n * @param options - Alert configuration options\n *\n * @example\n * ```typescript\n * await showAlert({\n * title: 'Success',\n * message: 'Your changes have been saved',\n * type: 'success',\n * duration: 3000,\n * position: 'top-right',\n * })\n * ```\n */\nexport async function showAlert(options: AlertOptions): Promise<void> {\n const id = generateAlertId()\n const hasNative = hasNativeNotificationSupport()\n const duration = options.duration ?? 5000\n\n const state: AlertState = {\n id,\n options,\n }\n\n activeAlerts.set(id, state)\n\n if (hasNative && options.type !== 'error') {\n // Use native Notification API for non-error alerts\n try {\n const notification = new Notification(options.title || 'Notification', {\n body: options.message,\n icon: options.type === 'success' ? '✓' : options.type === 'warning' ? '⚠' : 'ℹ',\n tag: id,\n })\n\n notification.onclick = () => {\n if (options.onClick) {\n options.onClick()\n }\n notification.close()\n }\n\n if (duration > 0) {\n state.timeout = setTimeout(() => {\n notification.close()\n activeAlerts.delete(id)\n }, duration)\n }\n\n return\n }\n catch {\n // Fall through to web-based implementation\n }\n }\n\n if (isBrowser()) {\n // Web-based toast implementation\n try {\n const container = getToastContainer(options.position)\n const wrapper = document.createElement('div')\n wrapper.innerHTML = createToastHTML(state)\n const toast = wrapper.firstElementChild as HTMLElement\n\n if (!toast) {\n // Fallback to console if DOM manipulation fails\n const typeLabel = (options.type || 'info').toUpperCase()\n console.log(`[stx-alert] ${typeLabel}: ${options.title || ''}`)\n console.log(`[stx-alert] ${options.message}`)\n return\n }\n\n state.element = toast\n\n // Add to container\n try {\n container.appendChild(toast)\n }\n catch {\n // Fallback to console if appendChild fails (e.g., in very-happy-dom)\n const typeLabel = (options.type || 'info').toUpperCase()\n console.log(`[stx-alert] ${typeLabel}: ${options.title || ''}`)\n console.log(`[stx-alert] ${options.message}`)\n return\n }\n\n // Trigger animation\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => {\n try {\n toast.classList.add('visible')\n }\n catch {\n // Ignore classList errors\n }\n })\n }\n\n // Handle click\n try {\n toast.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).classList?.contains('stx-toast-close')) {\n dismissAlert(state)\n return\n }\n\n if (options.onClick) {\n options.onClick()\n }\n })\n }\n catch {\n // Ignore addEventListener errors\n }\n\n // Auto-dismiss\n if (duration > 0) {\n state.timeout = setTimeout(() => {\n dismissAlert(state)\n }, duration)\n }\n }\n catch {\n // Fallback to console if any DOM operation fails\n const typeLabel = (options.type || 'info').toUpperCase()\n console.log(`[stx-alert] ${typeLabel}: ${options.title || ''}`)\n console.log(`[stx-alert] ${options.message}`)\n }\n }\n else {\n // Node.js environment - console fallback\n const typeLabel = (options.type || 'info').toUpperCase()\n console.log(`[stx-alert] ${typeLabel}: ${options.title || ''}`)\n console.log(`[stx-alert] ${options.message}`)\n\n // Auto-dismiss from tracking\n if (duration > 0) {\n state.timeout = setTimeout(() => {\n activeAlerts.delete(id)\n }, duration)\n }\n }\n}\n\n/**\n * Show a toast notification (alias for showAlert with toast-friendly defaults)\n */\nexport async function showToast(options: ToastOptions): Promise<void> {\n return showAlert({\n ...options,\n position: options.position || 'top-right',\n })\n}\n\n/**\n * Show an info toast\n */\nexport async function showInfoToast(message: string, duration = 3000): Promise<void> {\n return showToast({ message, type: 'info', duration })\n}\n\n/**\n * Show a success toast\n */\nexport async function showSuccessToast(message: string, duration = 3000): Promise<void> {\n return showToast({ message, type: 'success', duration })\n}\n\n/**\n * Show a warning toast\n */\nexport async function showWarningToast(message: string, duration = 3000): Promise<void> {\n return showToast({ message, type: 'warning', duration })\n}\n\n/**\n * Show an error toast\n */\nexport async function showErrorToast(message: string, duration = 5000): Promise<void> {\n return showToast({ message, type: 'error', duration })\n}\n\n/**\n * Show a notification with title\n */\nexport async function notify(title: string, message: string, type: AlertOptions['type'] = 'info'): Promise<void> {\n return showAlert({ title, message, type })\n}\n\n/**\n * Dismiss a specific alert by ID\n */\nexport function dismissAlertById(id: string): void {\n const state = activeAlerts.get(id)\n if (state) {\n dismissAlert(state)\n }\n}\n\n/**\n * Dismiss all active alerts\n */\nexport function dismissAllAlerts(): void {\n for (const state of activeAlerts.values()) {\n dismissAlert(state)\n }\n}\n\n/**\n * Get count of active alerts\n */\nexport function getActiveAlertCount(): number {\n return activeAlerts.size\n}\n\n/**\n * CSS styles for web-based toasts\n */\nexport const TOAST_STYLES = `\n.stx-toast-container {\n position: fixed;\n z-index: 10001;\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-width: 400px;\n pointer-events: none;\n}\n\n.stx-toast-container.top-left { top: 16px; left: 16px; }\n.stx-toast-container.top-center { top: 16px; left: 50%; transform: translateX(-50%); }\n.stx-toast-container.top-right { top: 16px; right: 16px; }\n.stx-toast-container.bottom-left { bottom: 16px; left: 16px; }\n.stx-toast-container.bottom-center { bottom: 16px; left: 50%; transform: translateX(-50%); }\n.stx-toast-container.bottom-right { bottom: 16px; right: 16px; }\n\n.stx-toast {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px 16px;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n pointer-events: auto;\n cursor: pointer;\n opacity: 0;\n transform: translateY(-10px);\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.stx-toast.visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.stx-toast.dismissing {\n opacity: 0;\n transform: translateX(100%);\n}\n\n@media (prefers-color-scheme: dark) {\n .stx-toast {\n background: #2d2d2d;\n color: #fff;\n }\n}\n\n.stx-toast-icon {\n font-size: 20px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.stx-toast.info .stx-toast-icon { color: #3498db; }\n.stx-toast.success .stx-toast-icon { color: #27ae60; }\n.stx-toast.warning .stx-toast-icon { color: #f39c12; }\n.stx-toast.error .stx-toast-icon { color: #e74c3c; }\n\n.stx-toast-content {\n flex: 1;\n min-width: 0;\n}\n\n.stx-toast-title {\n font-weight: 600;\n margin-bottom: 4px;\n}\n\n.stx-toast-message {\n color: #666;\n font-size: 14px;\n line-height: 1.4;\n}\n\n@media (prefers-color-scheme: dark) {\n .stx-toast-message { color: #aaa; }\n}\n\n.stx-toast-close {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n opacity: 0.5;\n padding: 0;\n line-height: 1;\n color: inherit;\n transition: opacity 0.15s;\n}\n\n.stx-toast-close:hover {\n opacity: 1;\n}\n\n/* Border accent for different types */\n.stx-toast.info { border-left: 4px solid #3498db; }\n.stx-toast.success { border-left: 4px solid #27ae60; }\n.stx-toast.warning { border-left: 4px solid #f39c12; }\n.stx-toast.error { border-left: 4px solid #e74c3c; }\n`\n",
6
+ "import type { ComponentProps } from './types'\n\n/**\n * Native Components for Desktop Applications\n *\n * This module provides TypeScript wrappers for native UI components.\n * Components work in both browser (web-based) and desktop (native) environments.\n *\n * Categories:\n * - Input: Button, TextInput, Checkbox, RadioButton, Slider, ColorPicker, DatePicker, TimePicker, Autocomplete\n * - Display: Label, ImageView, ProgressBar, Avatar, Badge, Chip, Card, Tooltip, Toast\n * - Layout: ScrollView, SplitView, Accordion, Stepper, Modal, Tabs, Dropdown\n * - Data: ListView, Table, TreeView, DataGrid, Chart\n * - Advanced: Rating, CodeEditor, MediaPlayer, FileExplorer, WebView\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Button component properties\n */\nexport interface ButtonProps extends ComponentProps {\n text: string\n onClick?: () => void\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive'\n size?: 'small' | 'medium' | 'large'\n disabled?: boolean\n loading?: boolean\n icon?: string\n iconPosition?: 'left' | 'right'\n}\n\n/**\n * TextInput component properties\n */\nexport interface TextInputProps extends ComponentProps {\n value?: string\n placeholder?: string\n onChange?: (value: string) => void\n onSubmit?: (value: string) => void\n type?: 'text' | 'password' | 'email' | 'number' | 'search' | 'url' | 'tel'\n disabled?: boolean\n readonly?: boolean\n maxLength?: number\n minLength?: number\n pattern?: string\n required?: boolean\n autocomplete?: string\n label?: string\n error?: string\n hint?: string\n}\n\n/**\n * Checkbox component properties\n */\nexport interface CheckboxProps extends ComponentProps {\n checked?: boolean\n onChange?: (checked: boolean) => void\n label?: string\n disabled?: boolean\n indeterminate?: boolean\n}\n\n/**\n * RadioButton component properties\n */\nexport interface RadioButtonProps extends ComponentProps {\n value: string\n name: string\n checked?: boolean\n onChange?: (value: string) => void\n label?: string\n disabled?: boolean\n}\n\n/**\n * Slider component properties\n */\nexport interface SliderProps extends ComponentProps {\n value?: number\n min?: number\n max?: number\n step?: number\n onChange?: (value: number) => void\n disabled?: boolean\n label?: string\n showValue?: boolean\n}\n\n/**\n * ProgressBar component properties\n */\nexport interface ProgressBarProps extends ComponentProps {\n value: number\n max?: number\n variant?: 'default' | 'success' | 'warning' | 'error'\n size?: 'small' | 'medium' | 'large'\n showLabel?: boolean\n indeterminate?: boolean\n}\n\n/**\n * Card component properties\n */\nexport interface CardProps extends ComponentProps {\n title?: string\n subtitle?: string\n content?: string\n image?: string\n footer?: string\n onClick?: () => void\n variant?: 'default' | 'outlined' | 'elevated'\n}\n\n/**\n * Badge component properties\n */\nexport interface BadgeProps extends ComponentProps {\n text: string\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error'\n size?: 'small' | 'medium' | 'large'\n}\n\n/**\n * Avatar component properties\n */\nexport interface AvatarProps extends ComponentProps {\n src?: string\n alt?: string\n name?: string\n size?: 'small' | 'medium' | 'large' | number\n shape?: 'circle' | 'square' | 'rounded'\n}\n\n/**\n * Tabs component properties\n */\nexport interface TabsProps extends ComponentProps {\n tabs: Array<{ label: string, value: string, disabled?: boolean }>\n activeTab?: string\n onChange?: (value: string) => void\n variant?: 'default' | 'pills' | 'underline'\n}\n\n/**\n * Dropdown component properties\n */\nexport interface DropdownProps extends ComponentProps {\n options: Array<{ label: string, value: string, disabled?: boolean }>\n value?: string\n placeholder?: string\n onChange?: (value: string) => void\n disabled?: boolean\n searchable?: boolean\n multiple?: boolean\n}\n\n/**\n * Rating component properties\n */\nexport interface RatingProps extends ComponentProps {\n value?: number\n max?: number\n onChange?: (value: number) => void\n readonly?: boolean\n size?: 'small' | 'medium' | 'large'\n allowHalf?: boolean\n}\n\n/**\n * ColorPicker component properties\n */\nexport interface ColorPickerProps extends ComponentProps {\n value?: string\n onChange?: (color: string) => void\n disabled?: boolean\n label?: string\n format?: 'hex' | 'rgb' | 'hsl'\n showAlpha?: boolean\n presetColors?: string[]\n}\n\n/**\n * DatePicker component properties\n */\nexport interface DatePickerProps extends ComponentProps {\n value?: string | Date\n onChange?: (date: Date | null) => void\n min?: string | Date\n max?: string | Date\n disabled?: boolean\n label?: string\n placeholder?: string\n format?: string\n showClear?: boolean\n}\n\n/**\n * TimePicker component properties\n */\nexport interface TimePickerProps extends ComponentProps {\n value?: string\n onChange?: (time: string) => void\n disabled?: boolean\n label?: string\n format?: '12h' | '24h'\n step?: number\n min?: string\n max?: string\n}\n\n/**\n * Autocomplete component properties\n */\nexport interface AutocompleteProps extends ComponentProps {\n options: Array<{ label: string, value: string }>\n value?: string\n placeholder?: string\n onChange?: (value: string) => void\n onSearch?: (query: string) => void\n disabled?: boolean\n label?: string\n loading?: boolean\n minChars?: number\n maxResults?: number\n}\n\n/**\n * Label component properties\n */\nexport interface LabelProps extends ComponentProps {\n text: string\n htmlFor?: string\n required?: boolean\n size?: 'small' | 'medium' | 'large'\n}\n\n/**\n * ImageView component properties\n */\nexport interface ImageViewProps extends ComponentProps {\n src: string\n alt?: string\n width?: number | string\n height?: number | string\n objectFit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down'\n fallback?: string\n loading?: 'eager' | 'lazy'\n onClick?: () => void\n}\n\n/**\n * Chip component properties\n */\nexport interface ChipProps extends ComponentProps {\n text: string\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error'\n size?: 'small' | 'medium' | 'large'\n removable?: boolean\n onRemove?: () => void\n icon?: string\n onClick?: () => void\n}\n\n/**\n * Tooltip component properties\n */\nexport interface TooltipProps extends ComponentProps {\n text: string\n position?: 'top' | 'right' | 'bottom' | 'left'\n trigger?: 'hover' | 'click' | 'focus'\n delay?: number\n children: string\n}\n\n/**\n * ScrollView component properties\n */\nexport interface ScrollViewProps extends ComponentProps {\n direction?: 'vertical' | 'horizontal' | 'both'\n showScrollbar?: boolean\n smooth?: boolean\n height?: string | number\n width?: string | number\n children: string\n}\n\n/**\n * SplitView component properties\n */\nexport interface SplitViewProps extends ComponentProps {\n direction?: 'horizontal' | 'vertical'\n sizes?: [number, number]\n minSizes?: [number, number]\n resizable?: boolean\n children: [string, string]\n}\n\n/**\n * Accordion component properties\n */\nexport interface AccordionProps extends ComponentProps {\n items: Array<{ title: string, content: string, disabled?: boolean }>\n multiple?: boolean\n defaultOpen?: number[]\n}\n\n/**\n * Stepper component properties\n */\nexport interface StepperProps extends ComponentProps {\n steps: Array<{ label: string, description?: string }>\n currentStep: number\n orientation?: 'horizontal' | 'vertical'\n onStepClick?: (step: number) => void\n}\n\n/**\n * ModalComponent properties (different from modals.ts dialog)\n */\nexport interface ModalComponentProps extends ComponentProps {\n open?: boolean\n title?: string\n size?: 'small' | 'medium' | 'large' | 'fullscreen'\n closable?: boolean\n onClose?: () => void\n children: string\n footer?: string\n}\n\n/**\n * ListView component properties\n */\nexport interface ListViewProps extends ComponentProps {\n items: Array<{ id: string, content: string, selected?: boolean }>\n selectable?: boolean\n multiSelect?: boolean\n onSelect?: (ids: string[]) => void\n emptyMessage?: string\n}\n\n/**\n * Table component properties\n */\nexport interface TableProps extends ComponentProps {\n columns: Array<{ key: string, label: string, width?: string, sortable?: boolean }>\n data: Array<Record<string, unknown>>\n striped?: boolean\n bordered?: boolean\n hoverable?: boolean\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n onSort?: (column: string) => void\n}\n\n/**\n * TreeView component properties\n */\nexport interface TreeViewProps extends ComponentProps {\n nodes: TreeNode[]\n expandedKeys?: string[]\n selectedKeys?: string[]\n checkable?: boolean\n onExpand?: (keys: string[]) => void\n onSelect?: (keys: string[]) => void\n}\n\nexport interface TreeNode {\n key: string\n label: string\n children?: TreeNode[]\n icon?: string\n disabled?: boolean\n}\n\n/**\n * DataGrid component properties\n */\nexport interface DataGridProps extends ComponentProps {\n columns: Array<{ key: string, label: string, width?: string, sortable?: boolean, filterable?: boolean }>\n data: Array<Record<string, unknown>>\n pagination?: { page: number, pageSize: number, total: number }\n selectable?: boolean\n onPageChange?: (page: number) => void\n onSort?: (column: string, order: 'asc' | 'desc') => void\n}\n\n/**\n * Chart component properties\n */\nexport interface ChartProps extends ComponentProps {\n type: 'line' | 'bar' | 'pie' | 'doughnut' | 'area'\n data: ChartData\n options?: ChartOptions\n width?: number | string\n height?: number | string\n}\n\nexport interface ChartData {\n labels: string[]\n datasets: Array<{\n label: string\n data: number[]\n backgroundColor?: string | string[]\n borderColor?: string\n }>\n}\n\nexport interface ChartOptions {\n title?: string\n legend?: boolean\n animation?: boolean\n}\n\n/**\n * CodeEditor component properties\n */\nexport interface CodeEditorProps extends ComponentProps {\n value?: string\n language?: string\n theme?: 'light' | 'dark'\n lineNumbers?: boolean\n readOnly?: boolean\n onChange?: (value: string) => void\n height?: string | number\n tabSize?: number\n wordWrap?: boolean\n}\n\n/**\n * MediaPlayer component properties\n */\nexport interface MediaPlayerProps extends ComponentProps {\n src: string\n type?: 'video' | 'audio'\n poster?: string\n autoplay?: boolean\n loop?: boolean\n muted?: boolean\n controls?: boolean\n width?: string | number\n height?: string | number\n onPlay?: () => void\n onPause?: () => void\n onEnded?: () => void\n}\n\n/**\n * FileExplorer component properties\n */\nexport interface FileExplorerProps extends ComponentProps {\n files: FileNode[]\n viewMode?: 'list' | 'grid'\n showHidden?: boolean\n selectable?: boolean\n onSelect?: (path: string) => void\n onOpen?: (path: string) => void\n}\n\nexport interface FileNode {\n name: string\n path: string\n type: 'file' | 'folder'\n size?: number\n modified?: Date\n icon?: string\n}\n\n/**\n * WebView component properties\n */\nexport interface WebViewProps extends ComponentProps {\n url: string\n width?: string | number\n height?: string | number\n sandbox?: boolean\n allowScripts?: boolean\n onLoad?: () => void\n onError?: (error: Error) => void\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Generate unique ID for components\n */\nfunction generateId(prefix: string = 'stx'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * Build class string from props\n */\nfunction buildClasses(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n/**\n * Build style string from object\n */\nfunction buildStyles(styles: Record<string, string> | undefined): string {\n if (!styles)\n return ''\n return Object.entries(styles)\n .map(([key, value]) => `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${value}`)\n .join('; ')\n}\n\n// =============================================================================\n// Input Components\n// =============================================================================\n\n/**\n * Create a Button component\n */\nexport function createButton(props: ButtonProps): string {\n const {\n text,\n variant = 'primary',\n size = 'medium',\n disabled = false,\n loading = false,\n icon,\n iconPosition = 'left',\n id = generateId('btn'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-button',\n `stx-button--${variant}`,\n `stx-button--${size}`,\n disabled && 'stx-button--disabled',\n loading && 'stx-button--loading',\n className,\n )\n\n const styleStr = buildStyles(style)\n const iconHtml = icon ? `<span class=\"stx-button-icon\">${icon}</span>` : ''\n const loadingHtml = loading ? '<span class=\"stx-button-spinner\"></span>' : ''\n\n const content = iconPosition === 'left'\n ? `${iconHtml}${loadingHtml}<span class=\"stx-button-text\">${escapeHtml(text)}</span>`\n : `<span class=\"stx-button-text\">${escapeHtml(text)}</span>${iconHtml}${loadingHtml}`\n\n return `<button id=\"${id}\" class=\"${classes}\" ${disabled || loading ? 'disabled' : ''} ${styleStr ? `style=\"${styleStr}\"` : ''}>${content}</button>`\n}\n\n/**\n * Create a TextInput component\n */\nexport function createTextInput(props: TextInputProps): string {\n const {\n value = '',\n placeholder = '',\n type = 'text',\n disabled = false,\n readonly = false,\n maxLength,\n minLength,\n pattern,\n required = false,\n autocomplete,\n label,\n error,\n hint,\n id = generateId('input'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-input',\n error && 'stx-input--error',\n disabled && 'stx-input--disabled',\n className,\n )\n\n const styleStr = buildStyles(style)\n const attrs = [\n `type=\"${type}\"`,\n `id=\"${id}\"`,\n `class=\"${classes}\"`,\n value && `value=\"${escapeHtml(value)}\"`,\n placeholder && `placeholder=\"${escapeHtml(placeholder)}\"`,\n disabled && 'disabled',\n readonly && 'readonly',\n required && 'required',\n maxLength && `maxlength=\"${maxLength}\"`,\n minLength && `minlength=\"${minLength}\"`,\n pattern && `pattern=\"${escapeHtml(pattern)}\"`,\n autocomplete && `autocomplete=\"${autocomplete}\"`,\n styleStr && `style=\"${styleStr}\"`,\n ].filter(Boolean).join(' ')\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-input-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<input ${attrs} />`\n if (error) {\n html += `<div class=\"stx-input-error\">${escapeHtml(error)}</div>`\n }\n else if (hint) {\n html += `<div class=\"stx-input-hint\">${escapeHtml(hint)}</div>`\n }\n\n return `<div class=\"stx-input-wrapper\">${html}</div>`\n}\n\n/**\n * Create a Checkbox component\n */\nexport function createCheckbox(props: CheckboxProps): string {\n const {\n checked = false,\n label,\n disabled = false,\n indeterminate = false,\n id = generateId('checkbox'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-checkbox', disabled && 'stx-checkbox--disabled', className)\n const styleStr = buildStyles(style)\n\n const inputAttrs = [\n 'type=\"checkbox\"',\n `id=\"${id}\"`,\n checked && 'checked',\n disabled && 'disabled',\n indeterminate && 'data-indeterminate=\"true\"',\n ].filter(Boolean).join(' ')\n\n return `\n <label class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>\n <input ${inputAttrs} />\n <span class=\"stx-checkbox-box\"></span>\n ${label ? `<span class=\"stx-checkbox-label\">${escapeHtml(label)}</span>` : ''}\n </label>\n `\n}\n\n/**\n * Create a Slider component\n */\nexport function createSlider(props: SliderProps): string {\n const {\n value = 50,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n label,\n showValue = true,\n id = generateId('slider'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-slider', disabled && 'stx-slider--disabled', className)\n const styleStr = buildStyles(style)\n\n const inputAttrs = [\n 'type=\"range\"',\n `id=\"${id}\"`,\n `value=\"${value}\"`,\n `min=\"${min}\"`,\n `max=\"${max}\"`,\n `step=\"${step}\"`,\n disabled && 'disabled',\n ].filter(Boolean).join(' ')\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-slider-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<div class=\"stx-slider-track\"><input ${inputAttrs} /></div>`\n if (showValue) {\n html += `<span class=\"stx-slider-value\">${value}</span>`\n }\n\n return `<div class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n// =============================================================================\n// Display Components\n// =============================================================================\n\n/**\n * Create a ProgressBar component\n */\nexport function createProgressBar(props: ProgressBarProps): string {\n const {\n value,\n max = 100,\n variant = 'default',\n size = 'medium',\n showLabel = false,\n indeterminate = false,\n id = generateId('progress'),\n className,\n style,\n } = props\n\n const percentage = Math.min(100, Math.max(0, (value / max) * 100))\n const classes = buildClasses(\n 'stx-progress',\n `stx-progress--${variant}`,\n `stx-progress--${size}`,\n indeterminate && 'stx-progress--indeterminate',\n className,\n )\n const styleStr = buildStyles(style)\n\n return `\n <div id=\"${id}\" class=\"${classes}\" role=\"progressbar\" aria-valuenow=\"${value}\" aria-valuemin=\"0\" aria-valuemax=\"${max}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>\n <div class=\"stx-progress-bar\" style=\"width: ${indeterminate ? '100%' : `${percentage}%`}\"></div>\n ${showLabel ? `<span class=\"stx-progress-label\">${Math.round(percentage)}%</span>` : ''}\n </div>\n `\n}\n\n/**\n * Create a Badge component\n */\nexport function createBadge(props: BadgeProps): string {\n const {\n text,\n variant = 'default',\n size = 'medium',\n id = generateId('badge'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-badge',\n `stx-badge--${variant}`,\n `stx-badge--${size}`,\n className,\n )\n const styleStr = buildStyles(style)\n\n return `<span id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${escapeHtml(text)}</span>`\n}\n\n/**\n * Create an Avatar component\n */\nexport function createAvatar(props: AvatarProps): string {\n const {\n src,\n alt = '',\n name,\n size = 'medium',\n shape = 'circle',\n id = generateId('avatar'),\n className,\n style,\n } = props\n\n const sizeClass = typeof size === 'number' ? '' : `stx-avatar--${size}`\n const sizeStyle = typeof size === 'number' ? `width: ${size}px; height: ${size}px;` : ''\n\n const classes = buildClasses('stx-avatar', sizeClass, `stx-avatar--${shape}`, className)\n const combinedStyle = [sizeStyle, buildStyles(style)].filter(Boolean).join(' ')\n\n // Generate initials from name\n const initials = name\n ? name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)\n : ''\n\n if (src) {\n return `<div id=\"${id}\" class=\"${classes}\" ${combinedStyle ? `style=\"${combinedStyle}\"` : ''}>\n <img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(alt)}\" class=\"stx-avatar-img\" />\n </div>`\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" ${combinedStyle ? `style=\"${combinedStyle}\"` : ''}>\n <span class=\"stx-avatar-initials\">${initials}</span>\n </div>`\n}\n\n/**\n * Create a Card component\n */\nexport function createCard(props: CardProps): string {\n const {\n title,\n subtitle,\n content,\n image,\n footer,\n variant = 'default',\n id = generateId('card'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-card', `stx-card--${variant}`, className)\n const styleStr = buildStyles(style)\n\n let html = ''\n if (image) {\n html += `<div class=\"stx-card-image\"><img src=\"${escapeHtml(image)}\" alt=\"\" /></div>`\n }\n html += '<div class=\"stx-card-body\">'\n if (title) {\n html += `<h3 class=\"stx-card-title\">${escapeHtml(title)}</h3>`\n }\n if (subtitle) {\n html += `<p class=\"stx-card-subtitle\">${escapeHtml(subtitle)}</p>`\n }\n if (content) {\n html += `<div class=\"stx-card-content\">${escapeHtml(content)}</div>`\n }\n html += '</div>'\n if (footer) {\n html += `<div class=\"stx-card-footer\">${escapeHtml(footer)}</div>`\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n// =============================================================================\n// Layout Components\n// =============================================================================\n\n/**\n * Create a Tabs component\n */\nexport function createTabs(props: TabsProps): string {\n const {\n tabs,\n activeTab,\n variant = 'default',\n id = generateId('tabs'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-tabs', `stx-tabs--${variant}`, className)\n const styleStr = buildStyles(style)\n\n const tabsHtml = tabs.map((tab, index) => {\n const isActive = activeTab ? tab.value === activeTab : index === 0\n const tabClasses = buildClasses(\n 'stx-tab',\n isActive && 'stx-tab--active',\n tab.disabled && 'stx-tab--disabled',\n )\n return `<button class=\"${tabClasses}\" data-value=\"${escapeHtml(tab.value)}\" ${tab.disabled ? 'disabled' : ''} role=\"tab\" aria-selected=\"${isActive}\">${escapeHtml(tab.label)}</button>`\n }).join('')\n\n return `<div id=\"${id}\" class=\"${classes}\" role=\"tablist\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${tabsHtml}</div>`\n}\n\n/**\n * Create a Dropdown/Select component\n */\nexport function createDropdown(props: DropdownProps): string {\n const {\n options,\n value,\n placeholder = 'Select...',\n disabled = false,\n id = generateId('dropdown'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-dropdown', disabled && 'stx-dropdown--disabled', className)\n const styleStr = buildStyles(style)\n\n const optionsHtml = options.map((opt) => {\n const selected = opt.value === value ? 'selected' : ''\n const disabledAttr = opt.disabled ? 'disabled' : ''\n return `<option value=\"${escapeHtml(opt.value)}\" ${selected} ${disabledAttr}>${escapeHtml(opt.label)}</option>`\n }).join('')\n\n const placeholderOption = value ? '' : `<option value=\"\" disabled selected>${escapeHtml(placeholder)}</option>`\n\n return `<select id=\"${id}\" class=\"${classes}\" ${disabled ? 'disabled' : ''} ${styleStr ? `style=\"${styleStr}\"` : ''}>${placeholderOption}${optionsHtml}</select>`\n}\n\n// =============================================================================\n// Advanced Components\n// =============================================================================\n\n/**\n * Create a Rating component\n */\nexport function createRating(props: RatingProps): string {\n const {\n value = 0,\n max = 5,\n readonly = false,\n size = 'medium',\n allowHalf = false,\n id = generateId('rating'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-rating',\n `stx-rating--${size}`,\n readonly && 'stx-rating--readonly',\n className,\n )\n const styleStr = buildStyles(style)\n\n let starsHtml = ''\n for (let i = 1; i <= max; i++) {\n const filled = i <= value\n const halfFilled = allowHalf && i - 0.5 === value\n const starClass = filled ? 'stx-star--filled' : halfFilled ? 'stx-star--half' : ''\n starsHtml += `<span class=\"stx-star ${starClass}\" data-value=\"${i}\">★</span>`\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" role=\"slider\" aria-valuenow=\"${value}\" aria-valuemin=\"0\" aria-valuemax=\"${max}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${starsHtml}</div>`\n}\n\n/**\n * Create a RadioButton component\n */\nexport function createRadioButton(props: RadioButtonProps): string {\n const {\n value,\n name,\n checked = false,\n label,\n disabled = false,\n id = generateId('radio'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-radio', disabled && 'stx-radio--disabled', className)\n const styleStr = buildStyles(style)\n\n const inputAttrs = [\n 'type=\"radio\"',\n `id=\"${id}\"`,\n `name=\"${escapeHtml(name)}\"`,\n `value=\"${escapeHtml(value)}\"`,\n checked && 'checked',\n disabled && 'disabled',\n ].filter(Boolean).join(' ')\n\n return `\n <label class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>\n <input ${inputAttrs} />\n <span class=\"stx-radio-circle\"></span>\n ${label ? `<span class=\"stx-radio-label\">${escapeHtml(label)}</span>` : ''}\n </label>\n `\n}\n\n/**\n * Create a ColorPicker component\n */\nexport function createColorPicker(props: ColorPickerProps): string {\n const {\n value = '#3498db',\n disabled = false,\n label,\n presetColors = ['#e74c3c', '#f39c12', '#27ae60', '#3498db', '#9b59b6', '#1abc9c', '#34495e', '#000000'],\n id = generateId('color'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-color-picker', disabled && 'stx-color-picker--disabled', className)\n const styleStr = buildStyles(style)\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-color-picker-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<div class=\"stx-color-picker-input\">\n <input type=\"color\" id=\"${id}\" value=\"${escapeHtml(value)}\" ${disabled ? 'disabled' : ''} />\n <span class=\"stx-color-picker-value\">${escapeHtml(value)}</span>\n </div>`\n\n if (presetColors.length > 0) {\n html += '<div class=\"stx-color-picker-presets\">'\n for (const color of presetColors) {\n html += `<button class=\"stx-color-preset\" style=\"background: ${escapeHtml(color)}\" data-color=\"${escapeHtml(color)}\" ${disabled ? 'disabled' : ''}></button>`\n }\n html += '</div>'\n }\n\n return `<div class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a DatePicker component\n */\nexport function createDatePicker(props: DatePickerProps): string {\n const {\n value,\n min,\n max,\n disabled = false,\n label,\n placeholder = 'Select date',\n showClear = true,\n id = generateId('date'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-date-picker', disabled && 'stx-date-picker--disabled', className)\n const styleStr = buildStyles(style)\n\n const dateValue = value instanceof Date ? value.toISOString().split('T')[0] : value || ''\n const minValue = min instanceof Date ? min.toISOString().split('T')[0] : min\n const maxValue = max instanceof Date ? max.toISOString().split('T')[0] : max\n\n const inputAttrs = [\n 'type=\"date\"',\n `id=\"${id}\"`,\n dateValue && `value=\"${dateValue}\"`,\n minValue && `min=\"${minValue}\"`,\n maxValue && `max=\"${maxValue}\"`,\n disabled && 'disabled',\n `placeholder=\"${escapeHtml(placeholder)}\"`,\n ].filter(Boolean).join(' ')\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-date-picker-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<div class=\"stx-date-picker-input\">\n <input ${inputAttrs} />\n ${showClear && dateValue ? '<button class=\"stx-date-picker-clear\" type=\"button\">&times;</button>' : ''}\n </div>`\n\n return `<div class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a TimePicker component\n */\nexport function createTimePicker(props: TimePickerProps): string {\n const {\n value = '',\n disabled = false,\n label,\n step = 60,\n min,\n max,\n id = generateId('time'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-time-picker', disabled && 'stx-time-picker--disabled', className)\n const styleStr = buildStyles(style)\n\n const inputAttrs = [\n 'type=\"time\"',\n `id=\"${id}\"`,\n value && `value=\"${escapeHtml(value)}\"`,\n `step=\"${step}\"`,\n min && `min=\"${escapeHtml(min)}\"`,\n max && `max=\"${escapeHtml(max)}\"`,\n disabled && 'disabled',\n ].filter(Boolean).join(' ')\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-time-picker-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<input ${inputAttrs} class=\"stx-time-picker-input\" />`\n\n return `<div class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create an Autocomplete component\n */\nexport function createAutocomplete(props: AutocompleteProps): string {\n const {\n options,\n value = '',\n placeholder = 'Search...',\n disabled = false,\n label,\n loading = false,\n id = generateId('autocomplete'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-autocomplete', disabled && 'stx-autocomplete--disabled', className)\n const styleStr = buildStyles(style)\n\n const selectedOption = options.find(opt => opt.value === value)\n const displayValue = selectedOption ? selectedOption.label : value\n\n let html = ''\n if (label) {\n html += `<label class=\"stx-autocomplete-label\" for=\"${id}\">${escapeHtml(label)}</label>`\n }\n html += `<div class=\"stx-autocomplete-input-wrapper\">\n <input type=\"text\" id=\"${id}\" value=\"${escapeHtml(displayValue)}\" placeholder=\"${escapeHtml(placeholder)}\" ${disabled ? 'disabled' : ''} autocomplete=\"off\" class=\"stx-autocomplete-input\" />\n ${loading ? '<span class=\"stx-autocomplete-spinner\"></span>' : ''}\n </div>`\n html += '<ul class=\"stx-autocomplete-list\">'\n for (const opt of options) {\n html += `<li class=\"stx-autocomplete-item ${opt.value === value ? 'stx-autocomplete-item--selected' : ''}\" data-value=\"${escapeHtml(opt.value)}\">${escapeHtml(opt.label)}</li>`\n }\n html += '</ul>'\n\n return `<div class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a Label component\n */\nexport function createLabel(props: LabelProps): string {\n const {\n text,\n htmlFor,\n required = false,\n size = 'medium',\n id = generateId('label'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-label', `stx-label--${size}`, className)\n const styleStr = buildStyles(style)\n\n return `<label id=\"${id}\" class=\"${classes}\" ${htmlFor ? `for=\"${escapeHtml(htmlFor)}\"` : ''} ${styleStr ? `style=\"${styleStr}\"` : ''}>${escapeHtml(text)}${required ? '<span class=\"stx-label-required\">*</span>' : ''}</label>`\n}\n\n/**\n * Create an ImageView component\n */\nexport function createImageView(props: ImageViewProps): string {\n const {\n src,\n alt = '',\n width,\n height,\n objectFit = 'cover',\n fallback,\n loading = 'lazy',\n id = generateId('image'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-image', className)\n const imageStyles: Record<string, string> = { objectFit }\n if (width)\n imageStyles.width = typeof width === 'number' ? `${width}px` : width\n if (height)\n imageStyles.height = typeof height === 'number' ? `${height}px` : height\n\n const combinedStyle = [buildStyles(imageStyles), buildStyles(style)].filter(Boolean).join('; ')\n const fallbackAttr = fallback ? `onerror=\"this.src='${escapeHtml(fallback)}'\"` : ''\n\n return `<img id=\"${id}\" class=\"${classes}\" src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(alt)}\" loading=\"${loading}\" ${combinedStyle ? `style=\"${combinedStyle}\"` : ''} ${fallbackAttr} />`\n}\n\n/**\n * Create a Chip component\n */\nexport function createChip(props: ChipProps): string {\n const {\n text,\n variant = 'default',\n size = 'medium',\n removable = false,\n icon,\n id = generateId('chip'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-chip',\n `stx-chip--${variant}`,\n `stx-chip--${size}`,\n className,\n )\n const styleStr = buildStyles(style)\n\n let html = ''\n if (icon) {\n html += `<span class=\"stx-chip-icon\">${icon}</span>`\n }\n html += `<span class=\"stx-chip-text\">${escapeHtml(text)}</span>`\n if (removable) {\n html += '<button class=\"stx-chip-remove\" type=\"button\">&times;</button>'\n }\n\n return `<span id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</span>`\n}\n\n/**\n * Create a Tooltip component\n */\nexport function createTooltip(props: TooltipProps): string {\n const {\n text,\n position = 'top',\n delay = 200,\n children,\n id = generateId('tooltip'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-tooltip-wrapper', className)\n const styleStr = buildStyles(style)\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''} data-tooltip=\"${escapeHtml(text)}\" data-position=\"${position}\" data-delay=\"${delay}\">\n ${children}\n <span class=\"stx-tooltip stx-tooltip--${position}\">${escapeHtml(text)}</span>\n </div>`\n}\n\n/**\n * Create a ScrollView component\n */\nexport function createScrollView(props: ScrollViewProps): string {\n const {\n direction = 'vertical',\n showScrollbar = true,\n smooth = true,\n height,\n width,\n children,\n id = generateId('scroll'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-scroll-view',\n `stx-scroll-view--${direction}`,\n !showScrollbar && 'stx-scroll-view--hide-scrollbar',\n smooth && 'stx-scroll-view--smooth',\n className,\n )\n\n const scrollStyles: Record<string, string> = {}\n if (height)\n scrollStyles.height = typeof height === 'number' ? `${height}px` : height\n if (width)\n scrollStyles.width = typeof width === 'number' ? `${width}px` : width\n\n const combinedStyle = [buildStyles(scrollStyles), buildStyles(style)].filter(Boolean).join('; ')\n\n return `<div id=\"${id}\" class=\"${classes}\" ${combinedStyle ? `style=\"${combinedStyle}\"` : ''}>${children}</div>`\n}\n\n/**\n * Create a SplitView component\n */\nexport function createSplitView(props: SplitViewProps): string {\n const {\n direction = 'horizontal',\n sizes = [50, 50],\n resizable = true,\n children,\n id = generateId('split'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-split-view',\n `stx-split-view--${direction}`,\n resizable && 'stx-split-view--resizable',\n className,\n )\n const styleStr = buildStyles(style)\n\n const sizeUnit = direction === 'horizontal' ? 'width' : 'height'\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>\n <div class=\"stx-split-pane\" style=\"${sizeUnit}: ${sizes[0]}%\">${children[0]}</div>\n ${resizable ? '<div class=\"stx-split-divider\"></div>' : ''}\n <div class=\"stx-split-pane\" style=\"${sizeUnit}: ${sizes[1]}%\">${children[1]}</div>\n </div>`\n}\n\n/**\n * Create an Accordion component\n */\nexport function createAccordion(props: AccordionProps): string {\n const {\n items,\n multiple = false,\n defaultOpen = [],\n id = generateId('accordion'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-accordion', className)\n const styleStr = buildStyles(style)\n\n let html = ''\n items.forEach((item, index) => {\n const isOpen = defaultOpen.includes(index)\n const itemClasses = buildClasses(\n 'stx-accordion-item',\n isOpen && 'stx-accordion-item--open',\n item.disabled && 'stx-accordion-item--disabled',\n )\n html += `<div class=\"${itemClasses}\" data-index=\"${index}\">\n <button class=\"stx-accordion-header\" ${item.disabled ? 'disabled' : ''} aria-expanded=\"${isOpen}\" data-multiple=\"${multiple}\">\n <span class=\"stx-accordion-title\">${escapeHtml(item.title)}</span>\n <span class=\"stx-accordion-icon\">▼</span>\n </button>\n <div class=\"stx-accordion-content\" ${isOpen ? '' : 'hidden'}>\n ${escapeHtml(item.content)}\n </div>\n </div>`\n })\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a Stepper component\n */\nexport function createStepper(props: StepperProps): string {\n const {\n steps,\n currentStep,\n orientation = 'horizontal',\n id = generateId('stepper'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-stepper', `stx-stepper--${orientation}`, className)\n const styleStr = buildStyles(style)\n\n let html = ''\n steps.forEach((step, index) => {\n const stepClasses = buildClasses(\n 'stx-step',\n index < currentStep && 'stx-step--completed',\n index === currentStep && 'stx-step--active',\n )\n html += `<div class=\"${stepClasses}\" data-step=\"${index}\">\n <div class=\"stx-step-indicator\">\n ${index < currentStep ? '✓' : index + 1}\n </div>\n <div class=\"stx-step-content\">\n <div class=\"stx-step-label\">${escapeHtml(step.label)}</div>\n ${step.description ? `<div class=\"stx-step-description\">${escapeHtml(step.description)}</div>` : ''}\n </div>\n </div>`\n if (index < steps.length - 1) {\n html += '<div class=\"stx-step-connector\"></div>'\n }\n })\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a Modal component (as a component, not a dialog function)\n */\nexport function createModalComponent(props: ModalComponentProps): string {\n const {\n open = false,\n title,\n size = 'medium',\n closable = true,\n children,\n footer,\n id = generateId('modal'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-modal-component', `stx-modal-component--${size}`, className)\n const styleStr = buildStyles(style)\n\n if (!open) {\n return `<div id=\"${id}\" class=\"${classes} stx-modal-component--hidden\" ${styleStr ? `style=\"${styleStr}\"` : ''}></div>`\n }\n\n let html = '<div class=\"stx-modal-component-overlay\">'\n html += '<div class=\"stx-modal-component-dialog\">'\n\n if (title || closable) {\n html += '<div class=\"stx-modal-component-header\">'\n if (title) {\n html += `<h3 class=\"stx-modal-component-title\">${escapeHtml(title)}</h3>`\n }\n if (closable) {\n html += '<button class=\"stx-modal-component-close\">&times;</button>'\n }\n html += '</div>'\n }\n\n html += `<div class=\"stx-modal-component-body\">${children}</div>`\n\n if (footer) {\n html += `<div class=\"stx-modal-component-footer\">${footer}</div>`\n }\n\n html += '</div></div>'\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a ListView component\n */\nexport function createListView(props: ListViewProps): string {\n const {\n items,\n selectable = false,\n multiSelect = false,\n emptyMessage = 'No items',\n id = generateId('list'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-list-view',\n selectable && 'stx-list-view--selectable',\n multiSelect && 'stx-list-view--multi',\n className,\n )\n const styleStr = buildStyles(style)\n\n if (items.length === 0) {\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>\n <div class=\"stx-list-view-empty\">${escapeHtml(emptyMessage)}</div>\n </div>`\n }\n\n let html = '<ul class=\"stx-list-view-items\">'\n for (const item of items) {\n const itemClasses = buildClasses(\n 'stx-list-view-item',\n item.selected && 'stx-list-view-item--selected',\n )\n html += `<li class=\"${itemClasses}\" data-id=\"${escapeHtml(item.id)}\" ${selectable ? 'tabindex=\"0\"' : ''}>${item.content}</li>`\n }\n html += '</ul>'\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a Table component\n */\nexport function createTable(props: TableProps): string {\n const {\n columns,\n data,\n striped = false,\n bordered = false,\n hoverable = true,\n sortBy,\n sortOrder,\n id = generateId('table'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-table',\n striped && 'stx-table--striped',\n bordered && 'stx-table--bordered',\n hoverable && 'stx-table--hoverable',\n className,\n )\n const styleStr = buildStyles(style)\n\n let html = '<table>'\n html += '<thead><tr>'\n for (const col of columns) {\n const isSorted = col.key === sortBy\n const sortClass = isSorted ? `stx-table-sorted stx-table-sorted--${sortOrder}` : ''\n const sortable = col.sortable ? 'data-sortable=\"true\"' : ''\n const widthStyle = col.width ? `style=\"width: ${col.width}\"` : ''\n html += `<th class=\"${sortClass}\" ${sortable} ${widthStyle} data-key=\"${escapeHtml(col.key)}\">${escapeHtml(col.label)}${col.sortable ? '<span class=\"stx-table-sort-icon\"></span>' : ''}</th>`\n }\n html += '</tr></thead>'\n\n html += '<tbody>'\n for (const row of data) {\n html += '<tr>'\n for (const col of columns) {\n const cellValue = row[col.key]\n html += `<td>${cellValue != null ? escapeHtml(String(cellValue)) : ''}</td>`\n }\n html += '</tr>'\n }\n html += '</tbody></table>'\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Render a tree node recursively\n */\nfunction renderTreeNode(node: TreeNode, expandedKeys: string[], selectedKeys: string[], checkable: boolean): string {\n const isExpanded = expandedKeys.includes(node.key)\n const isSelected = selectedKeys.includes(node.key)\n const hasChildren = node.children && node.children.length > 0\n\n const nodeClasses = buildClasses(\n 'stx-tree-node',\n isSelected && 'stx-tree-node--selected',\n node.disabled && 'stx-tree-node--disabled',\n )\n\n let html = `<div class=\"${nodeClasses}\" data-key=\"${escapeHtml(node.key)}\">`\n html += '<div class=\"stx-tree-node-content\">'\n\n if (hasChildren) {\n html += `<span class=\"stx-tree-toggle ${isExpanded ? 'stx-tree-toggle--expanded' : ''}\">▶</span>`\n }\n else {\n html += '<span class=\"stx-tree-toggle-placeholder\"></span>'\n }\n\n if (checkable) {\n html += `<input type=\"checkbox\" class=\"stx-tree-checkbox\" ${isSelected ? 'checked' : ''} ${node.disabled ? 'disabled' : ''} />`\n }\n\n if (node.icon) {\n html += `<span class=\"stx-tree-icon\">${node.icon}</span>`\n }\n\n html += `<span class=\"stx-tree-label\">${escapeHtml(node.label)}</span>`\n html += '</div>'\n\n if (hasChildren && isExpanded) {\n html += '<div class=\"stx-tree-children\">'\n for (const child of node.children!) {\n html += renderTreeNode(child, expandedKeys, selectedKeys, checkable)\n }\n html += '</div>'\n }\n\n html += '</div>'\n return html\n}\n\n/**\n * Create a TreeView component\n */\nexport function createTreeView(props: TreeViewProps): string {\n const {\n nodes,\n expandedKeys = [],\n selectedKeys = [],\n checkable = false,\n id = generateId('tree'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-tree-view', checkable && 'stx-tree-view--checkable', className)\n const styleStr = buildStyles(style)\n\n let html = ''\n for (const node of nodes) {\n html += renderTreeNode(node, expandedKeys, selectedKeys, checkable)\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" role=\"tree\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a DataGrid component\n */\nexport function createDataGrid(props: DataGridProps): string {\n const {\n columns,\n data,\n pagination,\n selectable = false,\n id = generateId('datagrid'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-data-grid', selectable && 'stx-data-grid--selectable', className)\n const styleStr = buildStyles(style)\n\n let html = '<div class=\"stx-data-grid-table-wrapper\">'\n html += '<table class=\"stx-data-grid-table\">'\n html += '<thead><tr>'\n\n if (selectable) {\n html += '<th class=\"stx-data-grid-select-all\"><input type=\"checkbox\" /></th>'\n }\n\n for (const col of columns) {\n const widthStyle = col.width ? `style=\"width: ${col.width}\"` : ''\n html += `<th ${widthStyle}>\n <div class=\"stx-data-grid-header-cell\">\n <span>${escapeHtml(col.label)}</span>\n ${col.sortable ? '<button class=\"stx-data-grid-sort\">⇅</button>' : ''}\n ${col.filterable ? '<button class=\"stx-data-grid-filter\">⊻</button>' : ''}\n </div>\n </th>`\n }\n html += '</tr></thead>'\n\n html += '<tbody>'\n for (const row of data) {\n html += '<tr>'\n if (selectable) {\n html += '<td class=\"stx-data-grid-select\"><input type=\"checkbox\" /></td>'\n }\n for (const col of columns) {\n const cellValue = row[col.key]\n html += `<td>${cellValue != null ? escapeHtml(String(cellValue)) : ''}</td>`\n }\n html += '</tr>'\n }\n html += '</tbody></table></div>'\n\n if (pagination) {\n const totalPages = Math.ceil(pagination.total / pagination.pageSize)\n html += `<div class=\"stx-data-grid-pagination\">\n <span class=\"stx-data-grid-page-info\">Page ${pagination.page} of ${totalPages} (${pagination.total} items)</span>\n <div class=\"stx-data-grid-page-buttons\">\n <button class=\"stx-data-grid-page-btn\" ${pagination.page <= 1 ? 'disabled' : ''}>◀</button>\n <button class=\"stx-data-grid-page-btn\" ${pagination.page >= totalPages ? 'disabled' : ''}>▶</button>\n </div>\n </div>`\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a Chart component (placeholder for integration with charting library)\n */\nexport function createChart(props: ChartProps): string {\n const {\n type,\n data,\n options = {},\n width = '100%',\n height = 300,\n id = generateId('chart'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-chart', `stx-chart--${type}`, className)\n const chartStyles: Record<string, string> = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n }\n const combinedStyle = [buildStyles(chartStyles), buildStyles(style)].filter(Boolean).join('; ')\n\n // Store data as JSON for JavaScript charting library to consume\n const chartData = JSON.stringify({ type, data, options })\n\n return `<div id=\"${id}\" class=\"${classes}\" style=\"${combinedStyle}\" data-chart='${escapeHtml(chartData)}'>\n <div class=\"stx-chart-placeholder\">\n ${options.title ? `<div class=\"stx-chart-title\">${escapeHtml(options.title)}</div>` : ''}\n <div class=\"stx-chart-type\">${type.charAt(0).toUpperCase() + type.slice(1)} Chart</div>\n <div class=\"stx-chart-info\">${data.datasets.length} dataset(s), ${data.labels.length} labels</div>\n </div>\n </div>`\n}\n\n/**\n * Create a CodeEditor component\n */\nexport function createCodeEditor(props: CodeEditorProps): string {\n const {\n value = '',\n language = 'plaintext',\n theme = 'dark',\n lineNumbers = true,\n readOnly = false,\n height = 300,\n tabSize = 2,\n wordWrap = false,\n id = generateId('code'),\n className,\n style,\n } = props\n\n const classes = buildClasses(\n 'stx-code-editor',\n `stx-code-editor--${theme}`,\n lineNumbers && 'stx-code-editor--line-numbers',\n readOnly && 'stx-code-editor--readonly',\n wordWrap && 'stx-code-editor--wrap',\n className,\n )\n\n const editorStyles: Record<string, string> = {\n height: typeof height === 'number' ? `${height}px` : height,\n }\n const combinedStyle = [buildStyles(editorStyles), buildStyles(style)].filter(Boolean).join('; ')\n\n const lines = value.split('\\n')\n let codeHtml = ''\n\n if (lineNumbers) {\n codeHtml += '<div class=\"stx-code-editor-gutter\">'\n for (let i = 1; i <= lines.length; i++) {\n codeHtml += `<div class=\"stx-code-editor-line-number\">${i}</div>`\n }\n codeHtml += '</div>'\n }\n\n codeHtml += `<pre class=\"stx-code-editor-content\"><code class=\"language-${escapeHtml(language)}\">${escapeHtml(value)}</code></pre>`\n\n return `<div id=\"${id}\" class=\"${classes}\" style=\"${combinedStyle}\" data-language=\"${escapeHtml(language)}\" data-tab-size=\"${tabSize}\">${codeHtml}</div>`\n}\n\n/**\n * Create a MediaPlayer component\n */\nexport function createMediaPlayer(props: MediaPlayerProps): string {\n const {\n src,\n type = 'video',\n poster,\n autoplay = false,\n loop = false,\n muted = false,\n controls = true,\n width,\n height,\n id = generateId('media'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-media-player', `stx-media-player--${type}`, className)\n const mediaStyles: Record<string, string> = {}\n if (width)\n mediaStyles.width = typeof width === 'number' ? `${width}px` : width\n if (height)\n mediaStyles.height = typeof height === 'number' ? `${height}px` : height\n\n const combinedStyle = [buildStyles(mediaStyles), buildStyles(style)].filter(Boolean).join('; ')\n\n const mediaAttrs = [\n `id=\"${id}-media\"`,\n `src=\"${escapeHtml(src)}\"`,\n controls && 'controls',\n autoplay && 'autoplay',\n loop && 'loop',\n muted && 'muted',\n type === 'video' && poster && `poster=\"${escapeHtml(poster)}\"`,\n ].filter(Boolean).join(' ')\n\n const mediaElement = type === 'video'\n ? `<video ${mediaAttrs}>Your browser does not support the video tag.</video>`\n : `<audio ${mediaAttrs}>Your browser does not support the audio tag.</audio>`\n\n return `<div id=\"${id}\" class=\"${classes}\" ${combinedStyle ? `style=\"${combinedStyle}\"` : ''}>${mediaElement}</div>`\n}\n\n/**\n * Format file size for display\n */\nfunction formatFileSize(bytes?: number): string {\n if (bytes === undefined)\n return ''\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * Create a FileExplorer component\n */\nexport function createFileExplorer(props: FileExplorerProps): string {\n const {\n files,\n viewMode = 'list',\n showHidden = false,\n selectable = true,\n id = generateId('files'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-file-explorer', `stx-file-explorer--${viewMode}`, className)\n const styleStr = buildStyles(style)\n\n const filteredFiles = showHidden ? files : files.filter(f => !f.name.startsWith('.'))\n\n let html = ''\n if (viewMode === 'list') {\n html = '<table class=\"stx-file-explorer-list\"><thead><tr><th>Name</th><th>Size</th><th>Modified</th></tr></thead><tbody>'\n for (const file of filteredFiles) {\n const icon = file.icon || (file.type === 'folder' ? '📁' : '📄')\n const size = file.type === 'file' ? formatFileSize(file.size) : ''\n const modified = file.modified ? file.modified.toLocaleDateString() : ''\n html += `<tr class=\"stx-file-explorer-item ${selectable ? 'stx-file-explorer-item--selectable' : ''}\" data-path=\"${escapeHtml(file.path)}\" data-type=\"${file.type}\">\n <td><span class=\"stx-file-explorer-icon\">${icon}</span>${escapeHtml(file.name)}</td>\n <td>${size}</td>\n <td>${modified}</td>\n </tr>`\n }\n html += '</tbody></table>'\n }\n else {\n html = '<div class=\"stx-file-explorer-grid\">'\n for (const file of filteredFiles) {\n const icon = file.icon || (file.type === 'folder' ? '📁' : '📄')\n html += `<div class=\"stx-file-explorer-item ${selectable ? 'stx-file-explorer-item--selectable' : ''}\" data-path=\"${escapeHtml(file.path)}\" data-type=\"${file.type}\">\n <div class=\"stx-file-explorer-icon\">${icon}</div>\n <div class=\"stx-file-explorer-name\">${escapeHtml(file.name)}</div>\n </div>`\n }\n html += '</div>'\n }\n\n return `<div id=\"${id}\" class=\"${classes}\" ${styleStr ? `style=\"${styleStr}\"` : ''}>${html}</div>`\n}\n\n/**\n * Create a WebView component\n */\nexport function createWebView(props: WebViewProps): string {\n const {\n url,\n width = '100%',\n height = 400,\n sandbox = true,\n allowScripts = true,\n id = generateId('webview'),\n className,\n style,\n } = props\n\n const classes = buildClasses('stx-webview', className)\n const webviewStyles: Record<string, string> = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n }\n const combinedStyle = [buildStyles(webviewStyles), buildStyles(style)].filter(Boolean).join('; ')\n\n const sandboxAttrs: string[] = []\n if (sandbox) {\n sandboxAttrs.push('allow-same-origin')\n if (allowScripts) {\n sandboxAttrs.push('allow-scripts')\n }\n }\n const sandboxAttr = sandbox ? `sandbox=\"${sandboxAttrs.join(' ')}\"` : ''\n\n return `<iframe id=\"${id}\" class=\"${classes}\" src=\"${escapeHtml(url)}\" style=\"${combinedStyle}\" ${sandboxAttr} loading=\"lazy\" frameborder=\"0\"></iframe>`\n}\n\n// =============================================================================\n// Component List\n// =============================================================================\n\n/**\n * List of all 35 available components\n */\nexport const AVAILABLE_COMPONENTS = [\n // Input Components (9)\n 'Button',\n 'TextInput',\n 'Checkbox',\n 'RadioButton',\n 'Slider',\n 'ColorPicker',\n 'DatePicker',\n 'TimePicker',\n 'Autocomplete',\n\n // Display Components (9)\n 'Label',\n 'ImageView',\n 'ProgressBar',\n 'Avatar',\n 'Badge',\n 'Chip',\n 'Card',\n 'Tooltip',\n 'Toast',\n\n // Layout Components (7)\n 'ScrollView',\n 'SplitView',\n 'Accordion',\n 'Stepper',\n 'Modal',\n 'Tabs',\n 'Dropdown',\n\n // Data Components (5)\n 'ListView',\n 'Table',\n 'TreeView',\n 'DataGrid',\n 'Chart',\n\n // Advanced Components (5)\n 'Rating',\n 'CodeEditor',\n 'MediaPlayer',\n 'FileExplorer',\n 'WebView',\n] as const\n\nexport type ComponentName = typeof AVAILABLE_COMPONENTS[number]\n\n/**\n * CSS styles for all components\n */\nexport const COMPONENT_STYLES = `\n/* Button */\n.stx-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n.stx-button--primary { background: #3498db; color: #fff; }\n.stx-button--primary:hover { background: #2980b9; }\n.stx-button--secondary { background: #6c757d; color: #fff; }\n.stx-button--outline { background: transparent; border: 1px solid #3498db; color: #3498db; }\n.stx-button--ghost { background: transparent; color: #3498db; }\n.stx-button--destructive { background: #e74c3c; color: #fff; }\n.stx-button--small { padding: 4px 8px; font-size: 12px; }\n.stx-button--large { padding: 12px 24px; font-size: 16px; }\n.stx-button--disabled { opacity: 0.5; cursor: not-allowed; }\n.stx-button--loading { pointer-events: none; }\n.stx-button-spinner { width: 16px; height: 16px; border: 2px solid transparent; border-top-color: currentColor; border-radius: 50%; animation: spin 0.6s linear infinite; }\n@keyframes spin { to { transform: rotate(360deg); } }\n\n/* Input */\n.stx-input-wrapper { display: flex; flex-direction: column; gap: 4px; }\n.stx-input-label { font-size: 14px; font-weight: 500; color: #333; }\n.stx-input { padding: 8px 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; transition: border-color 0.15s; }\n.stx-input:focus { outline: none; border-color: #3498db; }\n.stx-input--error { border-color: #e74c3c; }\n.stx-input-error { font-size: 12px; color: #e74c3c; }\n.stx-input-hint { font-size: 12px; color: #666; }\n\n/* Checkbox */\n.stx-checkbox { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n.stx-checkbox input { display: none; }\n.stx-checkbox-box { width: 18px; height: 18px; border: 2px solid #ddd; border-radius: 4px; transition: all 0.15s; }\n.stx-checkbox input:checked + .stx-checkbox-box { background: #3498db; border-color: #3498db; }\n.stx-checkbox--disabled { opacity: 0.5; cursor: not-allowed; }\n\n/* Progress */\n.stx-progress { height: 8px; background: #e0e0e0; border-radius: 4px; overflow: hidden; position: relative; }\n.stx-progress-bar { height: 100%; background: #3498db; transition: width 0.3s; }\n.stx-progress--success .stx-progress-bar { background: #27ae60; }\n.stx-progress--warning .stx-progress-bar { background: #f39c12; }\n.stx-progress--error .stx-progress-bar { background: #e74c3c; }\n.stx-progress--indeterminate .stx-progress-bar { animation: progress-indeterminate 1.5s infinite; }\n@keyframes progress-indeterminate { 0% { transform: translateX(-100%); } 100% { transform: translateX(200%); } }\n\n/* Badge */\n.stx-badge { display: inline-flex; padding: 2px 8px; border-radius: 12px; font-size: 12px; font-weight: 500; }\n.stx-badge--default { background: #e0e0e0; color: #333; }\n.stx-badge--primary { background: #3498db; color: #fff; }\n.stx-badge--success { background: #27ae60; color: #fff; }\n.stx-badge--warning { background: #f39c12; color: #fff; }\n.stx-badge--error { background: #e74c3c; color: #fff; }\n\n/* Avatar */\n.stx-avatar { display: inline-flex; align-items: center; justify-content: center; background: #3498db; color: #fff; overflow: hidden; }\n.stx-avatar--circle { border-radius: 50%; }\n.stx-avatar--square { border-radius: 0; }\n.stx-avatar--rounded { border-radius: 8px; }\n.stx-avatar--small { width: 32px; height: 32px; font-size: 12px; }\n.stx-avatar--medium { width: 40px; height: 40px; font-size: 14px; }\n.stx-avatar--large { width: 56px; height: 56px; font-size: 18px; }\n.stx-avatar-img { width: 100%; height: 100%; object-fit: cover; }\n\n/* Card */\n.stx-card { background: #fff; border-radius: 8px; overflow: hidden; }\n.stx-card--outlined { border: 1px solid #e0e0e0; }\n.stx-card--elevated { box-shadow: 0 4px 12px rgba(0,0,0,0.1); }\n.stx-card-image img { width: 100%; display: block; }\n.stx-card-body { padding: 16px; }\n.stx-card-title { margin: 0 0 4px; font-size: 18px; }\n.stx-card-subtitle { margin: 0 0 8px; color: #666; font-size: 14px; }\n.stx-card-footer { padding: 12px 16px; border-top: 1px solid #e0e0e0; }\n\n/* Tabs */\n.stx-tabs { display: flex; gap: 4px; border-bottom: 1px solid #e0e0e0; }\n.stx-tab { padding: 8px 16px; border: none; background: none; cursor: pointer; color: #666; border-bottom: 2px solid transparent; transition: all 0.15s; }\n.stx-tab:hover { color: #333; }\n.stx-tab--active { color: #3498db; border-bottom-color: #3498db; }\n.stx-tab--disabled { opacity: 0.5; cursor: not-allowed; }\n.stx-tabs--pills { border-bottom: none; }\n.stx-tabs--pills .stx-tab { border-radius: 20px; border-bottom: none; }\n.stx-tabs--pills .stx-tab--active { background: #3498db; color: #fff; }\n\n/* Dropdown */\n.stx-dropdown { padding: 8px 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: #fff; cursor: pointer; min-width: 150px; }\n.stx-dropdown:focus { outline: none; border-color: #3498db; }\n.stx-dropdown--disabled { opacity: 0.5; cursor: not-allowed; }\n\n/* Rating */\n.stx-rating { display: inline-flex; gap: 4px; }\n.stx-star { color: #ddd; cursor: pointer; transition: color 0.15s; }\n.stx-star--filled { color: #f1c40f; }\n.stx-star--half { background: linear-gradient(90deg, #f1c40f 50%, #ddd 50%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n.stx-rating--readonly .stx-star { cursor: default; }\n.stx-rating--small .stx-star { font-size: 16px; }\n.stx-rating--medium .stx-star { font-size: 24px; }\n.stx-rating--large .stx-star { font-size: 32px; }\n\n/* Slider */\n.stx-slider { display: flex; align-items: center; gap: 12px; }\n.stx-slider-track { flex: 1; }\n.stx-slider input[type=\"range\"] { width: 100%; }\n.stx-slider-value { min-width: 40px; text-align: right; font-size: 14px; }\n\n/* Radio Button */\n.stx-radio { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n.stx-radio input { display: none; }\n.stx-radio-circle { width: 18px; height: 18px; border: 2px solid #ddd; border-radius: 50%; position: relative; transition: all 0.15s; }\n.stx-radio input:checked + .stx-radio-circle { border-color: #3498db; }\n.stx-radio input:checked + .stx-radio-circle::after { content: ''; position: absolute; top: 3px; left: 3px; width: 8px; height: 8px; background: #3498db; border-radius: 50%; }\n.stx-radio--disabled { opacity: 0.5; cursor: not-allowed; }\n\n/* Color Picker */\n.stx-color-picker { display: flex; flex-direction: column; gap: 8px; }\n.stx-color-picker-input { display: flex; align-items: center; gap: 8px; }\n.stx-color-picker-input input[type=\"color\"] { width: 40px; height: 40px; border: none; cursor: pointer; }\n.stx-color-picker-value { font-family: monospace; }\n.stx-color-picker-presets { display: flex; gap: 4px; flex-wrap: wrap; }\n.stx-color-preset { width: 24px; height: 24px; border: 2px solid transparent; border-radius: 4px; cursor: pointer; }\n.stx-color-preset:hover { border-color: #333; }\n\n/* Date/Time Picker */\n.stx-date-picker, .stx-time-picker { display: flex; flex-direction: column; gap: 4px; }\n.stx-date-picker-input, .stx-time-picker-input { display: flex; align-items: center; gap: 4px; }\n.stx-date-picker-input input, .stx-time-picker-input { padding: 8px 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; }\n.stx-date-picker-clear { background: none; border: none; cursor: pointer; font-size: 16px; }\n\n/* Autocomplete */\n.stx-autocomplete { position: relative; }\n.stx-autocomplete-input-wrapper { position: relative; }\n.stx-autocomplete-input { width: 100%; padding: 8px 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; }\n.stx-autocomplete-spinner { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; border: 2px solid #ddd; border-top-color: #3498db; border-radius: 50%; animation: spin 0.6s linear infinite; }\n.stx-autocomplete-list { position: absolute; top: 100%; left: 0; right: 0; background: #fff; border: 1px solid #ddd; border-radius: 6px; max-height: 200px; overflow-y: auto; display: none; z-index: 10; }\n.stx-autocomplete:focus-within .stx-autocomplete-list { display: block; }\n.stx-autocomplete-item { padding: 8px 12px; cursor: pointer; }\n.stx-autocomplete-item:hover { background: #f5f5f5; }\n.stx-autocomplete-item--selected { background: #e8f4fc; }\n\n/* Label */\n.stx-label { display: inline-block; font-weight: 500; }\n.stx-label--small { font-size: 12px; }\n.stx-label--medium { font-size: 14px; }\n.stx-label--large { font-size: 16px; }\n.stx-label-required { color: #e74c3c; margin-left: 2px; }\n\n/* Image */\n.stx-image { display: block; max-width: 100%; }\n\n/* Chip */\n.stx-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 12px; border-radius: 16px; font-size: 13px; }\n.stx-chip--default { background: #e0e0e0; color: #333; }\n.stx-chip--primary { background: #e8f4fc; color: #3498db; }\n.stx-chip--success { background: #e8f8f0; color: #27ae60; }\n.stx-chip--warning { background: #fef5e7; color: #f39c12; }\n.stx-chip--error { background: #fdebeb; color: #e74c3c; }\n.stx-chip--small { padding: 2px 8px; font-size: 11px; }\n.stx-chip--large { padding: 6px 16px; font-size: 15px; }\n.stx-chip-remove { background: none; border: none; cursor: pointer; opacity: 0.6; padding: 0 2px; }\n.stx-chip-remove:hover { opacity: 1; }\n\n/* Tooltip */\n.stx-tooltip-wrapper { position: relative; display: inline-block; }\n.stx-tooltip { position: absolute; background: #333; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 12px; white-space: nowrap; opacity: 0; visibility: hidden; transition: opacity 0.2s, visibility 0.2s; z-index: 1000; }\n.stx-tooltip-wrapper:hover .stx-tooltip { opacity: 1; visibility: visible; }\n.stx-tooltip--top { bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 8px; }\n.stx-tooltip--bottom { top: 100%; left: 50%; transform: translateX(-50%); margin-top: 8px; }\n.stx-tooltip--left { right: 100%; top: 50%; transform: translateY(-50%); margin-right: 8px; }\n.stx-tooltip--right { left: 100%; top: 50%; transform: translateY(-50%); margin-left: 8px; }\n\n/* Scroll View */\n.stx-scroll-view { overflow: auto; }\n.stx-scroll-view--vertical { overflow-x: hidden; overflow-y: auto; }\n.stx-scroll-view--horizontal { overflow-x: auto; overflow-y: hidden; }\n.stx-scroll-view--hide-scrollbar::-webkit-scrollbar { display: none; }\n.stx-scroll-view--hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }\n.stx-scroll-view--smooth { scroll-behavior: smooth; }\n\n/* Split View */\n.stx-split-view { display: flex; }\n.stx-split-view--horizontal { flex-direction: row; }\n.stx-split-view--vertical { flex-direction: column; }\n.stx-split-pane { overflow: auto; }\n.stx-split-divider { background: #e0e0e0; flex-shrink: 0; }\n.stx-split-view--horizontal .stx-split-divider { width: 4px; cursor: col-resize; }\n.stx-split-view--vertical .stx-split-divider { height: 4px; cursor: row-resize; }\n.stx-split-divider:hover { background: #3498db; }\n\n/* Accordion */\n.stx-accordion { border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; }\n.stx-accordion-item { border-bottom: 1px solid #e0e0e0; }\n.stx-accordion-item:last-child { border-bottom: none; }\n.stx-accordion-header { width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: none; border: none; cursor: pointer; font-size: 14px; }\n.stx-accordion-header:hover { background: #f5f5f5; }\n.stx-accordion-icon { transition: transform 0.2s; }\n.stx-accordion-item--open .stx-accordion-icon { transform: rotate(180deg); }\n.stx-accordion-content { padding: 0 16px 16px; }\n.stx-accordion-item--disabled { opacity: 0.5; }\n.stx-accordion-item--disabled .stx-accordion-header { cursor: not-allowed; }\n\n/* Stepper */\n.stx-stepper { display: flex; }\n.stx-stepper--horizontal { flex-direction: row; align-items: flex-start; }\n.stx-stepper--vertical { flex-direction: column; }\n.stx-step { display: flex; align-items: center; }\n.stx-stepper--vertical .stx-step { flex-direction: row; }\n.stx-step-indicator { width: 32px; height: 32px; border-radius: 50%; background: #e0e0e0; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 500; flex-shrink: 0; }\n.stx-step--completed .stx-step-indicator { background: #27ae60; color: #fff; }\n.stx-step--active .stx-step-indicator { background: #3498db; color: #fff; }\n.stx-step-content { margin-left: 12px; }\n.stx-step-label { font-size: 14px; font-weight: 500; }\n.stx-step-description { font-size: 12px; color: #666; }\n.stx-step-connector { flex: 1; height: 2px; background: #e0e0e0; margin: 0 8px; min-width: 20px; }\n.stx-stepper--vertical .stx-step-connector { width: 2px; height: 20px; margin: 8px 0 8px 15px; }\n\n/* Modal Component */\n.stx-modal-component--hidden { display: none; }\n.stx-modal-component-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 10000; }\n.stx-modal-component-dialog { background: #fff; border-radius: 12px; max-height: 90vh; overflow: hidden; display: flex; flex-direction: column; }\n.stx-modal-component--small .stx-modal-component-dialog { width: 300px; }\n.stx-modal-component--medium .stx-modal-component-dialog { width: 500px; }\n.stx-modal-component--large .stx-modal-component-dialog { width: 800px; }\n.stx-modal-component--fullscreen .stx-modal-component-dialog { width: 100%; height: 100%; border-radius: 0; }\n.stx-modal-component-header { display: flex; justify-content: space-between; align-items: center; padding: 16px; border-bottom: 1px solid #e0e0e0; }\n.stx-modal-component-title { margin: 0; font-size: 18px; }\n.stx-modal-component-close { background: none; border: none; font-size: 24px; cursor: pointer; opacity: 0.6; }\n.stx-modal-component-close:hover { opacity: 1; }\n.stx-modal-component-body { padding: 16px; overflow-y: auto; flex: 1; }\n.stx-modal-component-footer { padding: 16px; border-top: 1px solid #e0e0e0; display: flex; justify-content: flex-end; gap: 8px; }\n\n/* List View */\n.stx-list-view { border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; }\n.stx-list-view-items { list-style: none; margin: 0; padding: 0; }\n.stx-list-view-item { padding: 12px 16px; border-bottom: 1px solid #e0e0e0; }\n.stx-list-view-item:last-child { border-bottom: none; }\n.stx-list-view--selectable .stx-list-view-item { cursor: pointer; }\n.stx-list-view--selectable .stx-list-view-item:hover { background: #f5f5f5; }\n.stx-list-view-item--selected { background: #e8f4fc; }\n.stx-list-view-empty { padding: 24px; text-align: center; color: #666; }\n\n/* Table */\n.stx-table { overflow-x: auto; }\n.stx-table table { width: 100%; border-collapse: collapse; }\n.stx-table th, .stx-table td { padding: 12px; text-align: left; }\n.stx-table th { font-weight: 600; background: #f5f5f5; }\n.stx-table--bordered th, .stx-table--bordered td { border: 1px solid #e0e0e0; }\n.stx-table--striped tbody tr:nth-child(even) { background: #f9f9f9; }\n.stx-table--hoverable tbody tr:hover { background: #f5f5f5; }\n.stx-table th[data-sortable] { cursor: pointer; }\n.stx-table-sort-icon::after { content: '⇅'; margin-left: 4px; opacity: 0.3; }\n.stx-table-sorted .stx-table-sort-icon::after { opacity: 1; }\n.stx-table-sorted--asc .stx-table-sort-icon::after { content: '↑'; }\n.stx-table-sorted--desc .stx-table-sort-icon::after { content: '↓'; }\n\n/* Tree View */\n.stx-tree-view { font-size: 14px; }\n.stx-tree-node { padding-left: 20px; }\n.stx-tree-node-content { display: flex; align-items: center; gap: 4px; padding: 4px; cursor: pointer; border-radius: 4px; }\n.stx-tree-node-content:hover { background: #f5f5f5; }\n.stx-tree-node--selected > .stx-tree-node-content { background: #e8f4fc; }\n.stx-tree-node--disabled { opacity: 0.5; }\n.stx-tree-toggle { width: 16px; cursor: pointer; transition: transform 0.2s; }\n.stx-tree-toggle--expanded { transform: rotate(90deg); }\n.stx-tree-toggle-placeholder { width: 16px; }\n.stx-tree-children { padding-left: 8px; }\n\n/* Data Grid */\n.stx-data-grid { border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; }\n.stx-data-grid-table-wrapper { overflow-x: auto; }\n.stx-data-grid-table { width: 100%; border-collapse: collapse; }\n.stx-data-grid-table th, .stx-data-grid-table td { padding: 12px; text-align: left; border-bottom: 1px solid #e0e0e0; }\n.stx-data-grid-table th { background: #f5f5f5; }\n.stx-data-grid-header-cell { display: flex; align-items: center; gap: 8px; }\n.stx-data-grid-sort, .stx-data-grid-filter { background: none; border: none; cursor: pointer; opacity: 0.5; }\n.stx-data-grid-sort:hover, .stx-data-grid-filter:hover { opacity: 1; }\n.stx-data-grid-pagination { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-top: 1px solid #e0e0e0; }\n.stx-data-grid-page-buttons { display: flex; gap: 4px; }\n.stx-data-grid-page-btn { padding: 4px 8px; border: 1px solid #e0e0e0; background: #fff; cursor: pointer; border-radius: 4px; }\n.stx-data-grid-page-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n\n/* Chart */\n.stx-chart { background: #f9f9f9; border-radius: 8px; display: flex; align-items: center; justify-content: center; }\n.stx-chart-placeholder { text-align: center; padding: 20px; }\n.stx-chart-title { font-size: 16px; font-weight: 600; margin-bottom: 8px; }\n.stx-chart-type { font-size: 14px; color: #666; }\n.stx-chart-info { font-size: 12px; color: #999; margin-top: 4px; }\n\n/* Code Editor */\n.stx-code-editor { display: flex; font-family: 'Monaco', 'Menlo', monospace; font-size: 13px; line-height: 1.5; overflow: hidden; border-radius: 8px; }\n.stx-code-editor--dark { background: #1e1e1e; color: #d4d4d4; }\n.stx-code-editor--light { background: #fff; color: #333; border: 1px solid #e0e0e0; }\n.stx-code-editor-gutter { padding: 12px 8px; background: rgba(0,0,0,0.1); text-align: right; user-select: none; }\n.stx-code-editor-line-number { color: #858585; }\n.stx-code-editor-content { flex: 1; padding: 12px; overflow: auto; }\n.stx-code-editor-content pre { margin: 0; }\n.stx-code-editor--wrap .stx-code-editor-content { white-space: pre-wrap; word-wrap: break-word; }\n\n/* Media Player */\n.stx-media-player video, .stx-media-player audio { width: 100%; display: block; }\n.stx-media-player--video { background: #000; }\n\n/* File Explorer */\n.stx-file-explorer { border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; }\n.stx-file-explorer-list { width: 100%; border-collapse: collapse; }\n.stx-file-explorer-list th { text-align: left; padding: 8px 12px; background: #f5f5f5; font-weight: 500; }\n.stx-file-explorer-list td { padding: 8px 12px; border-top: 1px solid #e0e0e0; }\n.stx-file-explorer-item--selectable { cursor: pointer; }\n.stx-file-explorer-item--selectable:hover { background: #f5f5f5; }\n.stx-file-explorer-icon { margin-right: 8px; }\n.stx-file-explorer-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 16px; padding: 16px; }\n.stx-file-explorer--grid .stx-file-explorer-item { text-align: center; padding: 12px; border-radius: 8px; }\n.stx-file-explorer--grid .stx-file-explorer-icon { font-size: 32px; display: block; margin-bottom: 8px; }\n.stx-file-explorer--grid .stx-file-explorer-name { font-size: 12px; word-break: break-all; }\n\n/* WebView */\n.stx-webview { border: none; display: block; }\n\n/* Dark mode support */\n@media (prefers-color-scheme: dark) {\n .stx-input-label { color: #eee; }\n .stx-input { background: #333; border-color: #555; color: #fff; }\n .stx-card { background: #2d2d2d; color: #fff; }\n .stx-card-subtitle { color: #aaa; }\n .stx-progress { background: #444; }\n .stx-dropdown { background: #333; border-color: #555; color: #fff; }\n .stx-accordion { border-color: #444; }\n .stx-accordion-item { border-color: #444; }\n .stx-accordion-header:hover { background: #333; }\n .stx-list-view { border-color: #444; }\n .stx-list-view-item { border-color: #444; }\n .stx-list-view--selectable .stx-list-view-item:hover { background: #333; }\n .stx-table th { background: #333; }\n .stx-table--bordered th, .stx-table--bordered td { border-color: #444; }\n .stx-tree-node-content:hover { background: #333; }\n .stx-data-grid { border-color: #444; }\n .stx-data-grid-table th, .stx-data-grid-table td { border-color: #444; }\n .stx-data-grid-table th { background: #333; }\n .stx-modal-component-dialog { background: #2d2d2d; color: #fff; }\n .stx-modal-component-header, .stx-modal-component-footer { border-color: #444; }\n .stx-file-explorer { border-color: #444; }\n .stx-file-explorer-list th { background: #333; }\n .stx-file-explorer-list td { border-color: #444; }\n .stx-autocomplete-list { background: #333; border-color: #444; }\n .stx-autocomplete-item:hover { background: #444; }\n .stx-chip--default { background: #444; color: #eee; }\n .stx-chip--primary { background: #1a3a52; }\n .stx-chip--success { background: #1a3a2a; }\n .stx-chip--warning { background: #3a2a1a; }\n .stx-chip--error { background: #3a1a1a; }\n}\n`\n",
7
+ "import type { ModalButton, ModalOptions, ModalResult } from './types'\n\n/**\n * Modal Dialog Implementation\n *\n * Provides cross-platform modal dialog functionality.\n * Uses native dialogs when available, falls back to web-based modals.\n *\n * Features:\n * - Multiple dialog types (info, warning, error, success, question)\n * - Custom buttons with actions\n * - Promise-based API\n * - Keyboard support (Enter/Escape)\n * - Accessible by default\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface ModalState {\n id: string\n options: ModalOptions\n resolve: (result: ModalResult) => void\n element?: HTMLElement\n}\n\n// =============================================================================\n// Platform Detection\n// =============================================================================\n\n/**\n * Check if native dialog APIs are available\n */\nfunction hasNativeDialogSupport(): boolean {\n // Future: Check for @stacksjs/zyte bindings\n return false\n}\n\n/**\n * Check if running in browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n// =============================================================================\n// Modal Manager\n// =============================================================================\n\n// Active modal stack\nconst activeModals: ModalState[] = []\n\n/**\n * Generate a unique modal ID\n */\nfunction generateModalId(): string {\n return `modal-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n\n/**\n * Get icon for modal type\n */\nfunction getModalIcon(type: ModalOptions['type']): string {\n switch (type) {\n case 'info':\n return '&#x2139;'\n case 'warning':\n return '&#x26A0;'\n case 'error':\n return '&#x2716;'\n case 'success':\n return '&#x2714;'\n case 'question':\n return '&#x2753;'\n default:\n return '&#x2139;'\n }\n}\n\n/**\n * Get default buttons for modal type\n */\nfunction getDefaultButtons(type: ModalOptions['type']): ModalButton[] {\n if (type === 'question') {\n return [\n { label: 'No', style: 'default' },\n { label: 'Yes', style: 'primary' },\n ]\n }\n return [{ label: 'OK', style: 'primary' }]\n}\n\n/**\n * Create modal HTML for web-based implementation\n */\nfunction createModalHTML(state: ModalState): string {\n const { options } = state\n const icon = getModalIcon(options.type)\n const buttons = options.buttons || getDefaultButtons(options.type)\n const typeClass = options.type || 'info'\n\n let buttonsHtml = ''\n buttons.forEach((btn, index) => {\n const styleClass = btn.style === 'destructive' ? 'destructive' : btn.style === 'primary' ? 'primary' : 'default'\n const autoFocus = index === (options.defaultButton ?? buttons.length - 1) ? 'autofocus' : ''\n buttonsHtml += `<button class=\"stx-modal-btn ${styleClass}\" data-index=\"${index}\" ${autoFocus}>${btn.label}</button>`\n })\n\n return `\n <div class=\"stx-modal-overlay\" data-modal-id=\"${state.id}\">\n <div class=\"stx-modal ${typeClass}\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"${state.id}-title\">\n <div class=\"stx-modal-icon\">${icon}</div>\n <div class=\"stx-modal-content\">\n ${options.title ? `<h2 id=\"${state.id}-title\" class=\"stx-modal-title\">${escapeHtml(options.title)}</h2>` : ''}\n <p class=\"stx-modal-message\">${escapeHtml(options.message)}</p>\n </div>\n <div class=\"stx-modal-buttons\">${buttonsHtml}</div>\n </div>\n </div>\n `\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * Close a modal and resolve with result\n */\nfunction closeModal(state: ModalState, buttonIndex: number, cancelled: boolean = false): void {\n // Remove from active modals\n const index = activeModals.indexOf(state)\n if (index > -1) {\n activeModals.splice(index, 1)\n }\n\n // Remove DOM element if exists\n if (state.element && isBrowser()) {\n state.element.remove()\n }\n\n // Call button action if provided\n const buttons = state.options.buttons || getDefaultButtons(state.options.type)\n const button = buttons[buttonIndex]\n if (button?.action) {\n button.action()\n }\n\n // Resolve promise\n state.resolve({ buttonIndex, cancelled })\n}\n\n/**\n * Show a native modal dialog\n *\n * @param options - Modal configuration options\n * @returns Promise resolving to the modal result\n *\n * @example\n * ```typescript\n * const result = await showModal({\n * title: 'Confirm Action',\n * message: 'Are you sure you want to proceed?',\n * type: 'question',\n * buttons: [\n * { label: 'Cancel', style: 'default' },\n * { label: 'Confirm', style: 'primary' },\n * ],\n * })\n *\n * if (result.buttonIndex === 1) {\n * // User clicked Confirm\n * }\n * ```\n */\nexport async function showModal(options: ModalOptions): Promise<ModalResult> {\n const hasNative = hasNativeDialogSupport()\n const id = generateModalId()\n\n return new Promise((resolve) => {\n const state: ModalState = {\n id,\n options,\n resolve,\n }\n\n activeModals.push(state)\n\n if (hasNative) {\n // Future: Use native dialog\n console.log(`[stx-modal] Showing native modal: ${options.title || 'Modal'}`)\n // For now, immediately resolve\n setTimeout(() => {\n closeModal(state, options.defaultButton ?? 0, false)\n }, 0)\n }\n else if (isBrowser()) {\n // Web-based implementation\n try {\n const container = document.createElement('div')\n container.innerHTML = createModalHTML(state)\n const overlay = container.firstElementChild as HTMLElement\n\n if (!overlay) {\n // Fallback to console if DOM manipulation fails\n console.log(`[stx-modal] ${options.type?.toUpperCase() || 'INFO'}: ${options.title || 'Modal'}`)\n console.log(`[stx-modal] ${options.message}`)\n setTimeout(() => {\n closeModal(state, options.defaultButton ?? 0, false)\n }, 0)\n return\n }\n\n state.element = overlay\n\n try {\n document.body.appendChild(overlay)\n }\n catch {\n // Fallback to console if appendChild fails (e.g., in very-happy-dom)\n console.log(`[stx-modal] ${options.type?.toUpperCase() || 'INFO'}: ${options.title || 'Modal'}`)\n console.log(`[stx-modal] ${options.message}`)\n setTimeout(() => {\n closeModal(state, options.defaultButton ?? 0, false)\n }, 0)\n return\n }\n\n // Handle button clicks\n try {\n overlay.querySelectorAll('.stx-modal-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const index = Number.parseInt((btn as HTMLElement).dataset.index || '0', 10)\n closeModal(state, index, false)\n })\n })\n }\n catch {\n // Ignore querySelectorAll errors in very-happy-dom\n }\n\n // Handle overlay click (close on backdrop click)\n try {\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n const cancelIndex = options.cancelButton ?? 0\n closeModal(state, cancelIndex, true)\n }\n })\n }\n catch {\n // Ignore addEventListener errors\n }\n\n // Handle keyboard\n try {\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n const cancelIndex = options.cancelButton ?? 0\n closeModal(state, cancelIndex, true)\n document.removeEventListener('keydown', handleKeydown)\n }\n else if (e.key === 'Enter') {\n const defaultIndex = options.defaultButton ?? ((options.buttons || getDefaultButtons(options.type)).length - 1)\n closeModal(state, defaultIndex, false)\n document.removeEventListener('keydown', handleKeydown)\n }\n }\n document.addEventListener('keydown', handleKeydown)\n }\n catch {\n // Ignore keyboard event errors\n }\n\n // Focus first button\n try {\n const firstButton = overlay.querySelector('.stx-modal-btn[autofocus]') as HTMLElement\n if (firstButton) {\n firstButton.focus()\n }\n }\n catch {\n // Ignore focus errors\n }\n }\n catch {\n // Fallback to console if any DOM operation fails\n console.log(`[stx-modal] ${options.type?.toUpperCase() || 'INFO'}: ${options.title || 'Modal'}`)\n console.log(`[stx-modal] ${options.message}`)\n setTimeout(() => {\n closeModal(state, options.defaultButton ?? 0, false)\n }, 0)\n }\n }\n else {\n // Node.js environment - console fallback\n console.log(`[stx-modal] ${options.type?.toUpperCase() || 'INFO'}: ${options.title || 'Modal'}`)\n console.log(`[stx-modal] ${options.message}`)\n const buttons = options.buttons || getDefaultButtons(options.type)\n console.log(`[stx-modal] Buttons: ${buttons.map(b => b.label).join(', ')}`)\n\n // Auto-resolve with default button\n setTimeout(() => {\n closeModal(state, options.defaultButton ?? 0, false)\n }, 0)\n }\n })\n}\n\n/**\n * Show an info modal\n */\nexport async function showInfoModal(title: string, message: string): Promise<ModalResult> {\n return showModal({ title, message, type: 'info' })\n}\n\n/**\n * Show a warning modal\n */\nexport async function showWarningModal(title: string, message: string): Promise<ModalResult> {\n return showModal({ title, message, type: 'warning' })\n}\n\n/**\n * Show an error modal\n */\nexport async function showErrorModal(title: string, message: string): Promise<ModalResult> {\n return showModal({ title, message, type: 'error' })\n}\n\n/**\n * Show a success modal\n */\nexport async function showSuccessModal(title: string, message: string): Promise<ModalResult> {\n return showModal({ title, message, type: 'success' })\n}\n\n/**\n * Show a question/confirmation modal\n */\nexport async function showQuestionModal(title: string, message: string): Promise<ModalResult> {\n return showModal({\n title,\n message,\n type: 'question',\n buttons: [\n { label: 'No', style: 'default' },\n { label: 'Yes', style: 'primary' },\n ],\n defaultButton: 1,\n cancelButton: 0,\n })\n}\n\n/**\n * Show a confirm dialog (alias for showQuestionModal)\n */\nexport async function confirm(message: string, title: string = 'Confirm'): Promise<boolean> {\n const result = await showQuestionModal(title, message)\n return result.buttonIndex === 1\n}\n\n/**\n * Show an alert dialog (single OK button)\n */\nexport async function alert(message: string, title: string = 'Alert'): Promise<void> {\n await showInfoModal(title, message)\n}\n\n/**\n * Show a prompt dialog with input field\n */\nexport async function prompt(message: string, defaultValue: string = '', title: string = 'Input'): Promise<string | null> {\n // This would need custom implementation for input field\n // For now, use console in Node.js or native prompt in browser\n if (isBrowser() && typeof window.prompt === 'function') {\n return window.prompt(message, defaultValue)\n }\n\n console.log(`[stx-modal] PROMPT: ${title}`)\n console.log(`[stx-modal] ${message}`)\n console.log(`[stx-modal] Default: ${defaultValue}`)\n\n // In Node.js, would need readline or similar\n return defaultValue\n}\n\n/**\n * Get number of active modals\n */\nexport function getActiveModalCount(): number {\n return activeModals.length\n}\n\n/**\n * Close all active modals\n */\nexport function closeAllModals(): void {\n // Close in reverse order (top-most first)\n while (activeModals.length > 0) {\n const state = activeModals[activeModals.length - 1]\n closeModal(state, 0, true)\n }\n}\n\n/**\n * CSS styles for web-based modals\n */\nexport const MODAL_STYLES = `\n.stx-modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: stx-modal-fade-in 0.15s ease-out;\n}\n\n@keyframes stx-modal-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.stx-modal {\n background: #fff;\n border-radius: 12px;\n padding: 24px;\n max-width: 400px;\n width: 90%;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);\n animation: stx-modal-slide-up 0.2s ease-out;\n}\n\n@keyframes stx-modal-slide-up {\n from { transform: translateY(20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n\n@media (prefers-color-scheme: dark) {\n .stx-modal {\n background: #2d2d2d;\n color: #fff;\n }\n}\n\n.stx-modal-icon {\n font-size: 48px;\n text-align: center;\n margin-bottom: 16px;\n}\n\n.stx-modal.info .stx-modal-icon { color: #3498db; }\n.stx-modal.warning .stx-modal-icon { color: #f39c12; }\n.stx-modal.error .stx-modal-icon { color: #e74c3c; }\n.stx-modal.success .stx-modal-icon { color: #27ae60; }\n.stx-modal.question .stx-modal-icon { color: #9b59b6; }\n\n.stx-modal-content {\n text-align: center;\n margin-bottom: 24px;\n}\n\n.stx-modal-title {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n}\n\n.stx-modal-message {\n margin: 0;\n color: #666;\n line-height: 1.5;\n}\n\n@media (prefers-color-scheme: dark) {\n .stx-modal-message { color: #aaa; }\n}\n\n.stx-modal-buttons {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.stx-modal-btn {\n padding: 10px 24px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: background 0.15s, transform 0.1s;\n}\n\n.stx-modal-btn:hover {\n transform: translateY(-1px);\n}\n\n.stx-modal-btn:active {\n transform: translateY(0);\n}\n\n.stx-modal-btn.default {\n background: #e0e0e0;\n color: #333;\n}\n\n.stx-modal-btn.default:hover {\n background: #d0d0d0;\n}\n\n.stx-modal-btn.primary {\n background: #3498db;\n color: #fff;\n}\n\n.stx-modal-btn.primary:hover {\n background: #2980b9;\n}\n\n.stx-modal-btn.destructive {\n background: #e74c3c;\n color: #fff;\n}\n\n.stx-modal-btn.destructive:hover {\n background: #c0392b;\n}\n\n@media (prefers-color-scheme: dark) {\n .stx-modal-btn.default {\n background: #444;\n color: #fff;\n }\n .stx-modal-btn.default:hover {\n background: #555;\n }\n}\n`\n",
8
+ "// @ts-nocheck - Skip type checking due to menu item type constraints\nimport type { SystemTrayInstance, SystemTrayMenuItem, SystemTrayOptions } from './types'\nimport process from 'node:process'\n\n/**\n * System Tray / Menubar Implementation\n *\n * Provides cross-platform system tray functionality using Craft's native APIs.\n *\n * ## Architecture\n *\n * When running inside a Craft native window, tray operations use the\n * `window.craft.tray` bridge to communicate with the native process.\n *\n * When running outside Craft (e.g., in browser or Node.js), provides a\n * web-based simulation for development and testing.\n *\n * ## Usage in Craft\n *\n * The tray is automatically enabled when you pass `systemTray: true` to\n * the window options in Craft. This module provides additional TypeScript\n * APIs for programmatic control.\n *\n * ```typescript\n * // Create tray via @stacksjs/desktop\n * const tray = await createSystemTray({\n * tooltip: 'My App',\n * menu: [\n * { label: 'Show Window', onClick: () => window.craft.window.show() },\n * { type: 'separator' },\n * { label: 'Quit', onClick: () => window.craft.app.quit() },\n * ],\n * })\n *\n * // Or use Craft's bridge directly in your HTML/JS:\n * window.craft.tray.setTitle('My App')\n * window.craft.tray.setMenu([...])\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface TrayState {\n icon: string\n tooltip: string\n menu: SystemTrayMenuItem[]\n visible: boolean\n}\n\n/**\n * Menu item format expected by Craft's tray bridge\n */\ninterface CraftMenuItemDefinition {\n id: string\n label: string\n type?: 'normal' | 'separator' | 'checkbox' | 'radio'\n checked?: boolean\n enabled?: boolean\n action?: string\n shortcut?: string\n submenu?: CraftMenuItemDefinition[]\n}\n\n// =============================================================================\n// Platform Detection\n// =============================================================================\n\n/**\n * Detect the current platform\n */\nfunction getPlatform(): 'darwin' | 'linux' | 'win32' | 'unknown' {\n if (process.platform) {\n return process.platform as 'darwin' | 'linux' | 'win32' | 'unknown'\n }\n return 'unknown'\n}\n\n/**\n * Check if running inside a Craft native window\n */\nfunction isInCraftWindow(): boolean {\n if (typeof window !== 'undefined' && (window as any).craft?.tray) {\n return true\n }\n return false\n}\n\n// =============================================================================\n// Menu Conversion\n// =============================================================================\n\n/**\n * Convert SystemTrayMenuItem to Craft's menu format\n */\nfunction convertMenuItem(item: SystemTrayMenuItem, index: number): CraftMenuItemDefinition {\n if (item.type === 'separator') {\n return {\n id: `sep-${index}`,\n label: '',\n type: 'separator',\n }\n }\n\n const menuItem: CraftMenuItemDefinition = {\n id: `item-${index}-${item.label.replace(/\\s+/g, '-').toLowerCase()}`,\n label: item.label,\n type: item.type || 'normal',\n enabled: item.enabled !== false,\n }\n\n if (item.accelerator) {\n menuItem.shortcut = item.accelerator\n }\n\n if (item.type === 'checkbox') {\n menuItem.checked = item.checked || false\n }\n\n if (item.type === 'submenu' && item.submenu) {\n menuItem.submenu = item.submenu.map((subItem, subIndex) =>\n convertMenuItem(subItem, subIndex),\n )\n }\n\n return menuItem\n}\n\n/**\n * Convert array of SystemTrayMenuItems to Craft format\n */\nfunction convertMenuItems(items: SystemTrayMenuItem[]): CraftMenuItemDefinition[] {\n return items.map((item, index) => convertMenuItem(item, index))\n}\n\n// =============================================================================\n// Menu Rendering (Web Simulation)\n// =============================================================================\n\n/**\n * Render a menu item to HTML (for web-based simulation)\n */\nfunction renderMenuItem(item: SystemTrayMenuItem, level: number = 0): string {\n if (item.type === 'separator') {\n return '<hr class=\"stx-tray-separator\" />'\n }\n\n const indent = ' '.repeat(level)\n const disabled = item.enabled === false ? 'disabled' : ''\n const checked = item.checked ? '✓ ' : ''\n const accelerator = item.accelerator ? `<span class=\"accelerator\">${item.accelerator}</span>` : ''\n\n let html = `${indent}<div class=\"stx-tray-item ${disabled}\" data-action=\"${item.label}\">`\n html += `<span class=\"label\">${checked}${item.label}</span>${accelerator}`\n\n if (item.type === 'submenu' && item.submenu) {\n html += '<span class=\"arrow\">▸</span>'\n html += '<div class=\"stx-tray-submenu\">'\n for (const subItem of item.submenu) {\n html += renderMenuItem(subItem, level + 1)\n }\n html += '</div>'\n }\n\n html += '</div>'\n return html\n}\n\n/**\n * Render the full tray menu to HTML\n */\nfunction renderTrayMenu(menu: SystemTrayMenuItem[]): string {\n let html = '<div class=\"stx-tray-menu\">'\n for (const item of menu) {\n html += renderMenuItem(item)\n }\n html += '</div>'\n return html\n}\n\n// =============================================================================\n// Tray Manager\n// =============================================================================\n\n// Active tray instances\nconst activeTrayInstances = new Map<string, { state: TrayState, handlers: Map<string, () => void> }>()\n\n/**\n * Generate a unique tray ID\n */\nfunction generateTrayId(): string {\n return `tray-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n\n/**\n * Set up event listener for tray menu actions (Craft bridge)\n */\nlet craftTrayListenerSetup = false\n\nfunction setupCraftTrayListener(): void {\n if (craftTrayListenerSetup || typeof window === 'undefined') return\n\n window.addEventListener('craft:tray:menu', ((event: CustomEvent) => {\n const { action } = event.detail\n // Find the handler for this action\n for (const instance of activeTrayInstances.values()) {\n const handler = instance.handlers.get(action)\n if (handler) {\n handler()\n break\n }\n }\n }) as EventListener)\n\n craftTrayListenerSetup = true\n}\n\n/**\n * Create a system tray/menubar application\n *\n * When running inside a Craft native window, this creates a real native tray.\n * Otherwise, it creates a simulated tray for development purposes.\n *\n * @param options - Tray configuration options\n * @returns System tray instance\n *\n * @example\n * ```typescript\n * const tray = await createSystemTray({\n * icon: './icon.png',\n * tooltip: 'My App',\n * menu: [\n * { label: 'Show Window', onClick: () => stxWindow.show() },\n * { type: 'separator' },\n * { label: 'Quit', onClick: () => stxWindow.quit() },\n * ],\n * })\n * ```\n */\nexport async function createSystemTray(options: SystemTrayOptions = {}): Promise<SystemTrayInstance> {\n const id = generateTrayId()\n const platform = getPlatform()\n const inCraft = isInCraftWindow()\n\n // Initialize state\n const state: TrayState = {\n icon: options.icon || '',\n tooltip: options.tooltip || 'stx Application',\n menu: options.menu || [],\n visible: true,\n }\n\n // Store click handlers\n const handlers = new Map<string, () => void>()\n for (const item of options.menu || []) {\n if (item.type !== 'separator' && item.onClick) {\n handlers.set(item.label, item.onClick)\n }\n // Handle submenu items\n if (item.type === 'submenu' && item.submenu) {\n for (const subItem of item.submenu) {\n if (subItem.type !== 'separator' && subItem.onClick) {\n handlers.set(subItem.label, subItem.onClick)\n }\n }\n }\n }\n\n // Store instance\n activeTrayInstances.set(id, { state, handlers })\n\n // Platform-specific implementation\n if (inCraft) {\n setupCraftTrayListener()\n\n // Use Craft's native tray APIs\n const craftWindow = window as any\n try {\n // Set the tray title/tooltip\n if (state.tooltip) {\n await craftWindow.craft.tray.setTitle({ title: state.tooltip })\n await craftWindow.craft.tray.setTooltip({ tooltip: state.tooltip })\n }\n\n // Set the icon if provided\n if (state.icon) {\n await craftWindow.craft.tray.setIcon({ icon: state.icon })\n }\n\n // Set the menu\n const craftMenu = convertMenuItems(state.menu)\n await craftWindow.craft.tray.setMenu({ items: craftMenu })\n\n console.log(`[stx-tray] Native tray created for ${platform}`)\n }\n catch (error) {\n console.warn('[stx-tray] Failed to create native tray:', error)\n }\n }\n else {\n // Web-based simulation for development\n console.log(`[stx-tray] Created simulated tray (not in Craft window)`)\n console.log(`[stx-tray] ID: ${id}`)\n console.log(`[stx-tray] Tooltip: ${state.tooltip}`)\n console.log(`[stx-tray] Menu items: ${state.menu.length}`)\n }\n\n // Create instance methods\n const instance: SystemTrayInstance = {\n id,\n\n setIcon: (icon: string) => {\n state.icon = icon\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.setIcon({ icon }).catch((e: Error) => {\n console.warn('[stx-tray] Failed to set icon:', e)\n })\n }\n console.log(`[stx-tray:${id}] Icon updated`)\n },\n\n setTooltip: (tooltip: string) => {\n state.tooltip = tooltip\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.setTooltip({ tooltip }).catch((e: Error) => {\n console.warn('[stx-tray] Failed to set tooltip:', e)\n })\n }\n console.log(`[stx-tray:${id}] Tooltip: ${tooltip}`)\n },\n\n setMenu: (menu: SystemTrayMenuItem[]) => {\n state.menu = menu\n // Update handlers\n handlers.clear()\n for (const item of menu) {\n if (item.type !== 'separator' && item.onClick) {\n handlers.set(item.label, item.onClick)\n }\n if (item.type === 'submenu' && item.submenu) {\n for (const subItem of item.submenu) {\n if (subItem.type !== 'separator' && subItem.onClick) {\n handlers.set(subItem.label, subItem.onClick)\n }\n }\n }\n }\n\n if (inCraft) {\n const craftWindow = window as any\n const craftMenu = convertMenuItems(menu)\n craftWindow.craft.tray.setMenu({ items: craftMenu }).catch((e: Error) => {\n console.warn('[stx-tray] Failed to set menu:', e)\n })\n }\n console.log(`[stx-tray:${id}] Menu updated (${menu.length} items)`)\n },\n\n destroy: () => {\n state.visible = false\n activeTrayInstances.delete(id)\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.destroy?.().catch((e: Error) => {\n console.warn('[stx-tray] Failed to destroy tray:', e)\n })\n }\n console.log(`[stx-tray:${id}] Destroyed`)\n },\n }\n\n return instance\n}\n\n/**\n * Create a menubar application (alias for createSystemTray)\n */\nexport const createMenubar: typeof createSystemTray = createSystemTray\n\n/**\n * Get all active tray instances\n */\nexport function getActiveTrayInstances(): string[] {\n return Array.from(activeTrayInstances.keys())\n}\n\n/**\n * Get a tray instance by ID\n */\nexport function getTrayInstance(id: string): SystemTrayInstance | null {\n const instance = activeTrayInstances.get(id)\n if (!instance)\n return null\n\n const inCraft = isInCraftWindow()\n\n return {\n id,\n setIcon: (icon: string) => {\n instance.state.icon = icon\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.setIcon({ icon }).catch(() => {})\n }\n },\n setTooltip: (tooltip: string) => {\n instance.state.tooltip = tooltip\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.setTooltip({ tooltip }).catch(() => {})\n }\n },\n setMenu: (menu: SystemTrayMenuItem[]) => {\n instance.state.menu = menu\n if (inCraft) {\n const craftWindow = window as any\n const craftMenu = convertMenuItems(menu)\n craftWindow.craft.tray.setMenu({ items: craftMenu }).catch(() => {})\n }\n },\n destroy: () => {\n activeTrayInstances.delete(id)\n if (inCraft) {\n const craftWindow = window as any\n craftWindow.craft.tray.destroy?.().catch(() => {})\n }\n },\n }\n}\n\n/**\n * Trigger a menu item action by label\n * Useful for testing and programmatic control\n */\nexport function triggerTrayAction(trayId: string, actionLabel: string): boolean {\n const instance = activeTrayInstances.get(trayId)\n if (!instance)\n return false\n\n const handler = instance.handlers.get(actionLabel)\n if (handler) {\n handler()\n return true\n }\n return false\n}\n\n/**\n * Get the HTML for a simulated tray menu\n * Useful for web-based testing and development\n */\nexport function getSimulatedTrayHTML(trayId: string): string | null {\n const instance = activeTrayInstances.get(trayId)\n if (!instance)\n return null\n\n return renderTrayMenu(instance.state.menu)\n}\n\n// =============================================================================\n// Bridge Script Generator\n// =============================================================================\n\n/**\n * Generate a JavaScript snippet for tray control from inside a webview.\n * This provides convenient wrappers around the Craft tray bridge.\n */\nexport function getTrayBridgeScript(): string {\n return `\n// STX Desktop Tray Bridge\n// Provides convenient wrappers around window.craft.tray APIs\nwindow.stxTray = {\n setTitle: (title) => window.craft?.tray?.setTitle({ title }),\n setTooltip: (tooltip) => window.craft?.tray?.setTooltip({ tooltip }),\n setIcon: (icon) => window.craft?.tray?.setIcon({ icon }),\n setMenu: (items) => window.craft?.tray?.setMenu({ items }),\n destroy: () => window.craft?.tray?.destroy(),\n\n // Check if tray is available\n isAvailable: () => typeof window.craft?.tray !== 'undefined',\n};\n`\n}\n\n// =============================================================================\n// CSS Styles\n// =============================================================================\n\n/**\n * CSS styles for the simulated tray menu\n */\nexport const TRAY_MENU_STYLES = `\n.stx-tray-menu {\n background: #2d2d2d;\n border-radius: 8px;\n padding: 4px 0;\n min-width: 200px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: #fff;\n}\n\n.stx-tray-item {\n padding: 6px 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n position: relative;\n}\n\n.stx-tray-item:hover {\n background: #3d3d3d;\n}\n\n.stx-tray-item.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.stx-tray-item .label {\n flex: 1;\n}\n\n.stx-tray-item .accelerator {\n margin-left: 20px;\n opacity: 0.6;\n font-size: 12px;\n}\n\n.stx-tray-item .arrow {\n margin-left: 8px;\n font-size: 10px;\n}\n\n.stx-tray-separator {\n margin: 4px 0;\n border: none;\n border-top: 1px solid #444;\n}\n\n.stx-tray-submenu {\n position: absolute;\n left: 100%;\n top: 0;\n background: #2d2d2d;\n border-radius: 8px;\n padding: 4px 0;\n min-width: 150px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n}\n\n.stx-tray-item:hover > .stx-tray-submenu {\n display: block;\n}\n`\n",
9
+ "/**\n * Native Dialog Integration\n *\n * Provides native file dialogs, message boxes, and other system dialogs\n * using Craft's Dialog Bridge APIs.\n *\n * When running inside a Craft native window, these dialogs use the native\n * OS dialogs (NSOpenPanel on macOS, etc.). When running in a browser,\n * they fall back to web alternatives where possible.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for opening a file dialog\n */\nexport interface OpenDialogOptions {\n /** Dialog title */\n title?: string\n /** Default path to open */\n defaultPath?: string\n /** Button label (e.g., \"Open\", \"Select\") */\n buttonLabel?: string\n /** File type filters */\n filters?: FileFilter[]\n /** Allow selecting multiple files */\n multiSelections?: boolean\n /** Show hidden files */\n showHiddenFiles?: boolean\n /** Allow selecting directories */\n canChooseDirectories?: boolean\n /** Allow selecting files */\n canChooseFiles?: boolean\n /** Allow creating new directories */\n canCreateDirectories?: boolean\n}\n\n/**\n * Options for saving a file dialog\n */\nexport interface SaveDialogOptions {\n /** Dialog title */\n title?: string\n /** Default path/filename */\n defaultPath?: string\n /** Button label (e.g., \"Save\") */\n buttonLabel?: string\n /** File type filters */\n filters?: FileFilter[]\n /** Show hidden files */\n showHiddenFiles?: boolean\n /** Allow creating new directories */\n canCreateDirectories?: boolean\n}\n\n/**\n * File type filter\n */\nexport interface FileFilter {\n /** Filter name (e.g., \"Images\") */\n name: string\n /** File extensions (e.g., [\"png\", \"jpg\", \"gif\"]) */\n extensions: string[]\n}\n\n/**\n * Result from open dialog\n */\nexport interface OpenDialogResult {\n /** Whether the dialog was cancelled */\n canceled: boolean\n /** Selected file paths */\n filePaths: string[]\n}\n\n/**\n * Result from save dialog\n */\nexport interface SaveDialogResult {\n /** Whether the dialog was cancelled */\n canceled: boolean\n /** Selected file path */\n filePath?: string\n}\n\n/**\n * Options for message box dialog\n */\nexport interface MessageBoxOptions {\n /** Message box type */\n type?: 'none' | 'info' | 'warning' | 'error' | 'question'\n /** Dialog title */\n title?: string\n /** Main message */\n message: string\n /** Secondary detail text */\n detail?: string\n /** Button labels */\n buttons?: string[]\n /** Index of default button */\n defaultButton?: number\n /** Index of cancel button */\n cancelButton?: number\n}\n\n/**\n * Result from message box\n */\nexport interface MessageBoxResult {\n /** Index of button clicked */\n response: number\n}\n\n/**\n * Options for color picker dialog\n */\nexport interface ColorPickerOptions {\n /** Initial color (hex format) */\n color?: string\n /** Show alpha/opacity control */\n showAlpha?: boolean\n}\n\n/**\n * Result from color picker\n */\nexport interface ColorPickerResult {\n /** Whether the dialog was cancelled */\n canceled: boolean\n /** Selected color in hex format */\n color?: string\n}\n\n// =============================================================================\n// Platform Detection\n// =============================================================================\n\n/**\n * Check if running inside a Craft native window\n */\nfunction isInCraftWindow(): boolean {\n if (typeof window !== 'undefined' && (window as any).craft?.dialog) {\n return true\n }\n return false\n}\n\n// =============================================================================\n// Native Dialog Functions\n// =============================================================================\n\n/**\n * Show a native file open dialog\n *\n * When running in Craft, uses the native OS file picker.\n * In browser, falls back to HTML file input.\n *\n * @param options - Dialog options\n * @returns Promise resolving to selected files or cancellation\n *\n * @example\n * ```typescript\n * const result = await showOpenDialog({\n * title: 'Select an image',\n * filters: [{ name: 'Images', extensions: ['png', 'jpg', 'gif'] }],\n * multiSelections: true,\n * })\n *\n * if (!result.canceled) {\n * console.log('Selected:', result.filePaths)\n * }\n * ```\n */\nexport async function showOpenDialog(options: OpenDialogOptions = {}): Promise<OpenDialogResult> {\n if (isInCraftWindow()) {\n // Use Craft's native dialog\n const craftWindow = window as any\n try {\n return await craftWindow.craft.dialog.showOpenDialog(options)\n }\n catch (error) {\n console.warn('[stx-dialog] Failed to show native open dialog:', error)\n // Fall through to web fallback\n }\n }\n\n // Web fallback: use file input\n return new Promise((resolve) => {\n if (typeof document === 'undefined') {\n resolve({ canceled: true, filePaths: [] })\n return\n }\n\n const input = document.createElement('input')\n input.type = 'file'\n input.multiple = options.multiSelections ?? false\n\n // Set accept types from filters\n if (options.filters?.length) {\n const extensions = options.filters.flatMap(f => f.extensions.map(e => `.${e}`))\n input.accept = extensions.join(',')\n }\n\n // Directory selection (limited browser support)\n if (options.canChooseDirectories && !options.canChooseFiles) {\n (input as any).webkitdirectory = true\n }\n\n input.onchange = () => {\n const files = Array.from(input.files || [])\n if (files.length === 0) {\n resolve({ canceled: true, filePaths: [] })\n }\n else {\n // Note: In browsers, we can only get file names, not full paths\n const filePaths = files.map(f => f.name)\n resolve({ canceled: false, filePaths })\n }\n }\n\n input.oncancel = () => {\n resolve({ canceled: true, filePaths: [] })\n }\n\n input.click()\n })\n}\n\n/**\n * Show a native file save dialog\n *\n * When running in Craft, uses the native OS save dialog.\n * In browser, this is limited to triggering downloads.\n *\n * @param options - Dialog options\n * @returns Promise resolving to selected path or cancellation\n *\n * @example\n * ```typescript\n * const result = await showSaveDialog({\n * title: 'Save document',\n * defaultPath: 'document.txt',\n * filters: [{ name: 'Text Files', extensions: ['txt'] }],\n * })\n *\n * if (!result.canceled && result.filePath) {\n * console.log('Save to:', result.filePath)\n * }\n * ```\n */\nexport async function showSaveDialog(options: SaveDialogOptions = {}): Promise<SaveDialogResult> {\n if (isInCraftWindow()) {\n // Use Craft's native dialog\n const craftWindow = window as any\n try {\n return await craftWindow.craft.dialog.showSaveDialog(options)\n }\n catch (error) {\n console.warn('[stx-dialog] Failed to show native save dialog:', error)\n }\n }\n\n // Web fallback: use showSaveFilePicker if available (modern browsers)\n if (typeof window !== 'undefined' && 'showSaveFilePicker' in window) {\n try {\n const fileTypes = options.filters?.map(f => ({\n description: f.name,\n accept: {\n '*/*': f.extensions.map(e => `.${e}`),\n },\n }))\n\n const handle = await (window as any).showSaveFilePicker({\n suggestedName: options.defaultPath,\n types: fileTypes,\n })\n\n return { canceled: false, filePath: handle.name }\n }\n catch (error) {\n // User cancelled or API not supported\n return { canceled: true }\n }\n }\n\n // Fallback: prompt for filename\n console.warn('[stx-dialog] Save dialog not available, using prompt fallback')\n const filename = prompt('Enter filename:', options.defaultPath || 'file.txt')\n if (filename) {\n return { canceled: false, filePath: filename }\n }\n return { canceled: true }\n}\n\n/**\n * Show a native message box dialog\n *\n * When running in Craft, uses the native OS message box.\n * In browser, falls back to confirm/alert dialogs.\n *\n * @param options - Message box options\n * @returns Promise resolving to button index clicked\n *\n * @example\n * ```typescript\n * const result = await showMessageBox({\n * type: 'question',\n * title: 'Confirm',\n * message: 'Are you sure you want to delete this file?',\n * buttons: ['Cancel', 'Delete'],\n * defaultButton: 0,\n * cancelButton: 0,\n * })\n *\n * if (result.response === 1) {\n * // User clicked \"Delete\"\n * }\n * ```\n */\nexport async function showMessageBox(options: MessageBoxOptions): Promise<MessageBoxResult> {\n if (isInCraftWindow()) {\n // Use Craft's native dialog\n const craftWindow = window as any\n try {\n return await craftWindow.craft.dialog.showMessageBox(options)\n }\n catch (error) {\n console.warn('[stx-dialog] Failed to show native message box:', error)\n }\n }\n\n // Web fallback\n const buttons = options.buttons || ['OK']\n\n if (buttons.length === 1) {\n // Simple alert\n alert(options.message)\n return { response: 0 }\n }\n\n if (buttons.length === 2 && options.type === 'question') {\n // Use confirm for simple yes/no\n const confirmed = confirm(options.message)\n return { response: confirmed ? 1 : 0 }\n }\n\n // For more complex dialogs, we'd need a custom modal\n // For now, fall back to confirm\n console.warn('[stx-dialog] Complex message box not fully supported in browser, using confirm')\n const confirmed = confirm(`${options.message}\\n\\n${buttons.join(' / ')}`)\n return { response: confirmed ? (buttons.length - 1) : 0 }\n}\n\n/**\n * Show a native color picker dialog\n *\n * @param options - Color picker options\n * @returns Promise resolving to selected color or cancellation\n *\n * @example\n * ```typescript\n * const result = await showColorPicker({\n * color: '#ff0000',\n * showAlpha: true,\n * })\n *\n * if (!result.canceled && result.color) {\n * document.body.style.backgroundColor = result.color\n * }\n * ```\n */\nexport async function showColorPicker(options: ColorPickerOptions = {}): Promise<ColorPickerResult> {\n if (isInCraftWindow()) {\n // Use Craft's native dialog\n const craftWindow = window as any\n try {\n return await craftWindow.craft.dialog.showColorPicker(options)\n }\n catch (error) {\n console.warn('[stx-dialog] Failed to show native color picker:', error)\n }\n }\n\n // Web fallback: use color input\n return new Promise((resolve) => {\n if (typeof document === 'undefined') {\n resolve({ canceled: true })\n return\n }\n\n const input = document.createElement('input')\n input.type = 'color'\n input.value = options.color || '#000000'\n\n input.onchange = () => {\n resolve({ canceled: false, color: input.value })\n }\n\n input.oncancel = () => {\n resolve({ canceled: true })\n }\n\n input.click()\n })\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Show a simple alert message dialog (native)\n *\n * @param message - Message to display\n * @param title - Optional dialog title\n */\nexport async function showAlertDialog(message: string, title?: string): Promise<void> {\n await showMessageBox({\n type: 'info',\n title: title || 'Alert',\n message,\n buttons: ['OK'],\n })\n}\n\n/**\n * Show a confirmation dialog (native)\n *\n * @param message - Message to display\n * @param title - Optional dialog title\n * @returns True if confirmed, false if cancelled\n */\nexport async function showConfirmDialog(message: string, title?: string): Promise<boolean> {\n const result = await showMessageBox({\n type: 'question',\n title: title || 'Confirm',\n message,\n buttons: ['Cancel', 'OK'],\n defaultButton: 1,\n cancelButton: 0,\n })\n return result.response === 1\n}\n\n/**\n * Show an error dialog (native)\n *\n * @param message - Error message\n * @param title - Optional dialog title\n */\nexport async function showErrorDialog(message: string, title?: string): Promise<void> {\n await showMessageBox({\n type: 'error',\n title: title || 'Error',\n message,\n buttons: ['OK'],\n })\n}\n\n/**\n * Show a warning dialog (native)\n *\n * @param message - Warning message\n * @param title - Optional dialog title\n */\nexport async function showWarningDialog(message: string, title?: string): Promise<void> {\n await showMessageBox({\n type: 'warning',\n title: title || 'Warning',\n message,\n buttons: ['OK'],\n })\n}\n\n// =============================================================================\n// Bridge Script Generator\n// =============================================================================\n\n/**\n * Generate a JavaScript snippet for dialog control from inside a webview.\n * This provides convenient wrappers around the Craft dialog bridge.\n */\nexport function getDialogBridgeScript(): string {\n return `\n// STX Desktop Dialog Bridge\n// Provides convenient wrappers around window.craft.dialog APIs\nwindow.stxDialog = {\n // File dialogs\n showOpenDialog: (options) => window.craft?.dialog?.showOpenDialog(options),\n showSaveDialog: (options) => window.craft?.dialog?.showSaveDialog(options),\n\n // Message dialogs\n showMessageBox: (options) => window.craft?.dialog?.showMessageBox(options),\n\n // Color picker\n showColorPicker: (options) => window.craft?.dialog?.showColorPicker(options),\n\n // Font picker\n showFontPicker: (options) => window.craft?.dialog?.showFontPicker(options),\n\n // Convenience functions\n alert: async (message, title) => {\n return window.craft?.dialog?.showMessageBox({\n type: 'info',\n title: title || 'Alert',\n message,\n buttons: ['OK'],\n });\n },\n\n confirm: async (message, title) => {\n const result = await window.craft?.dialog?.showMessageBox({\n type: 'question',\n title: title || 'Confirm',\n message,\n buttons: ['Cancel', 'OK'],\n });\n return result?.response === 1;\n },\n\n error: async (message, title) => {\n return window.craft?.dialog?.showMessageBox({\n type: 'error',\n title: title || 'Error',\n message,\n buttons: ['OK'],\n });\n },\n\n // Check if dialog is available\n isAvailable: () => typeof window.craft?.dialog !== 'undefined',\n};\n`\n}\n",
10
+ "import type { WindowInstance, WindowOptions } from './types'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport process from 'node:process'\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\n/**\n * Desktop window configuration.\n * Can be set via environment variables or setDesktopConfig().\n */\nexport interface DesktopConfig {\n /**\n * Custom path to craft binary.\n * Set via CRAFT_BINARY_PATH env var or setDesktopConfig().\n */\n craftBinaryPath?: string\n /**\n * Additional search paths for craft binary.\n * Searched after craftBinaryPath if set.\n */\n additionalSearchPaths?: string[]\n /**\n * Maximum retries when opening native window fails.\n * Default: 1 (no retries)\n */\n maxRetries?: number\n /**\n * Delay between retries in milliseconds.\n * Default: 1000\n */\n retryDelay?: number\n}\n\n/**\n * Current desktop configuration\n */\nlet currentConfig: DesktopConfig = {}\n\n/**\n * Configure desktop window settings\n *\n * @example\n * ```typescript\n * setDesktopConfig({\n * craftBinaryPath: '/custom/path/to/craft',\n * maxRetries: 3,\n * retryDelay: 2000\n * })\n * ```\n */\nexport function setDesktopConfig(config: Partial<DesktopConfig>): void {\n currentConfig = { ...currentConfig, ...config }\n}\n\n/**\n * Get current desktop configuration\n */\nexport function getDesktopConfig(): DesktopConfig {\n return { ...currentConfig }\n}\n\n/**\n * Reset desktop configuration to defaults\n */\nexport function resetDesktopConfig(): void {\n currentConfig = {}\n}\n\n// =============================================================================\n// Binary Resolution\n// =============================================================================\n\n/**\n * Default paths to search for craft binary.\n * Used when CRAFT_BINARY_PATH is not set.\n */\nconst DEFAULT_SEARCH_PATHS = [\n // Global bun installation\n join(process.env.HOME || '', '.bun/bin/craft'),\n // Absolute path to craft in standard location\n join(process.env.HOME || '', 'Code/Tools/craft/packages/zig/zig-out/bin/craft'),\n join(process.env.HOME || '', 'Code/craft/packages/zig/zig-out/bin/craft'),\n // From linked ts-craft in monorepo (both craft and craft-minimal)\n join(process.cwd(), '../../craft/packages/zig/zig-out/bin/craft'),\n join(process.cwd(), '../../craft/packages/zig/zig-out/bin/craft-minimal'),\n join(process.cwd(), '../../../craft/packages/zig/zig-out/bin/craft'),\n join(process.cwd(), '../../../craft/packages/zig/zig-out/bin/craft-minimal'),\n // If running from stx repo root\n join(process.cwd(), '../craft/packages/zig/zig-out/bin/craft'),\n join(process.cwd(), '../craft/packages/zig/zig-out/bin/craft-minimal'),\n // Local craft installation\n join(process.cwd(), 'node_modules/.bin/craft'),\n]\n\n/**\n * Find craft binary in configured locations.\n *\n * Resolution order:\n * 1. CRAFT_BINARY_PATH environment variable\n * 2. config.craftBinaryPath (set via setDesktopConfig)\n * 3. config.additionalSearchPaths\n * 4. DEFAULT_SEARCH_PATHS (monorepo locations)\n *\n * @returns Path to craft binary or undefined if not found\n */\nfunction getCraftBinaryPath(): string | undefined {\n // 1. Check environment variable first (highest priority)\n const envPath = process.env.CRAFT_BINARY_PATH\n if (envPath && existsSync(envPath)) {\n return envPath\n }\n\n // 2. Check configured path\n if (currentConfig.craftBinaryPath && existsSync(currentConfig.craftBinaryPath)) {\n return currentConfig.craftBinaryPath\n }\n\n // 3. Check additional configured paths\n const additionalPaths = currentConfig.additionalSearchPaths || []\n for (const searchPath of additionalPaths) {\n if (existsSync(searchPath)) {\n return searchPath\n }\n }\n\n // 4. Check default paths\n for (const searchPath of DEFAULT_SEARCH_PATHS) {\n if (existsSync(searchPath)) {\n return searchPath\n }\n }\n\n return undefined\n}\n\n// =============================================================================\n// Window Instance Management\n// =============================================================================\n\n/**\n * Active window instances managed by this module\n */\nconst activeWindows = new Map<string, {\n app: any\n url: string\n options: WindowOptions\n}>()\n\n/**\n * Get all active window IDs\n */\nexport function getActiveWindowIds(): string[] {\n return Array.from(activeWindows.keys())\n}\n\n/**\n * Get a window by ID\n */\nexport function getWindow(id: string): WindowInstance | null {\n const windowData = activeWindows.get(id)\n if (!windowData) return null\n return createWindowInstance(id, windowData.app)\n}\n\n/**\n * Close all active windows\n */\nexport function closeAllWindows(): void {\n for (const [id, windowData] of activeWindows) {\n try {\n windowData.app?.close?.()\n }\n catch (e) {\n console.warn(`Failed to close window ${id}:`, e)\n }\n }\n activeWindows.clear()\n}\n\n/**\n * Create a WindowInstance object with control methods\n */\nfunction createWindowInstance(id: string, app: any): WindowInstance {\n return {\n id,\n\n show: () => {\n // The window is shown when created via app.show()\n // This is a no-op since ts-craft auto-shows windows\n console.log(`[stx/desktop] Window ${id} shown`)\n },\n\n hide: () => {\n // ts-craft doesn't expose hide directly from the process side\n // This would need to be called from inside the webview via window.craft.window.hide()\n console.log(`[stx/desktop] To hide window, use window.craft.window.hide() from inside the webview`)\n },\n\n close: () => {\n const windowData = activeWindows.get(id)\n if (windowData?.app) {\n windowData.app.close()\n activeWindows.delete(id)\n console.log(`[stx/desktop] Window ${id} closed`)\n }\n },\n\n focus: () => {\n console.log(`[stx/desktop] To focus window, use window.craft.window.focus() from inside the webview`)\n },\n\n minimize: () => {\n console.log(`[stx/desktop] To minimize window, use window.craft.window.minimize() from inside the webview`)\n },\n\n maximize: () => {\n console.log(`[stx/desktop] To maximize window, use window.craft.window.maximize() from inside the webview`)\n },\n\n restore: () => {\n console.log(`[stx/desktop] To restore window, use window.craft.window.show() from inside the webview`)\n },\n\n setTitle: (title: string) => {\n console.log(`[stx/desktop] To set title, use window.craft.window.setTitle({ title: \"${title}\" }) from inside the webview`)\n },\n\n loadURL: (url: string) => {\n // Re-create the window with the new URL\n console.log(`[stx/desktop] To navigate, use window.location.href = \"${url}\" from inside the webview`)\n },\n\n reload: () => {\n console.log(`[stx/desktop] To reload, use window.craft.window.reload() from inside the webview`)\n },\n }\n}\n\n// =============================================================================\n// Window Creation\n// =============================================================================\n\n/**\n * Create a native window with URL\n *\n * Uses ts-craft to create native desktop windows. Falls back to returning null\n * if ts-craft is not available.\n *\n * ## Window Control\n *\n * The CraftApp spawns a native webview process. Window control methods like\n * hide(), minimize(), setTitle() etc. are available via the `window.craft`\n * bridge **inside** the webview context:\n *\n * ```javascript\n * // Inside your HTML/JS running in the webview:\n * window.craft.window.hide()\n * window.craft.window.minimize()\n * window.craft.window.setTitle({ title: 'New Title' })\n * window.craft.window.center()\n * ```\n *\n * The returned WindowInstance provides the `close()` method which terminates\n * the native process from the Node.js side.\n *\n * @param url - URL to load in the window\n * @param options - Window configuration options\n * @returns WindowInstance if successful, null if ts-craft unavailable\n */\nexport async function createWindow(url: string, options: WindowOptions = {}): Promise<WindowInstance | null> {\n const {\n title = 'stx Desktop',\n width = 1200,\n height = 800,\n darkMode = false,\n hotReload = false,\n resizable = true,\n frameless = false,\n alwaysOnTop = false,\n } = options\n\n try {\n // Dynamically import ts-craft\n const { createApp } = await import('ts-craft')\n\n const craftPath = getCraftBinaryPath()\n\n const app = createApp({\n url,\n craftPath,\n window: {\n title,\n width,\n height,\n darkMode,\n hotReload,\n resizable,\n frameless,\n alwaysOnTop,\n },\n })\n\n // Generate unique ID\n const id = `craft-window-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n\n // Store the window instance\n activeWindows.set(id, { app, url, options })\n\n // Show the window\n await app.show()\n\n return createWindowInstance(id, app)\n }\n catch (error) {\n console.error('Failed to create native window:', error)\n console.warn('Falling back to browser...')\n return null\n }\n}\n\n/**\n * Open a development server window\n * This is specifically for the stx dev server --native flag\n *\n * Uses ts-craft to create a native window, falls back to browser if unavailable.\n */\nexport async function openDevWindow(port: number, options: WindowOptions = {}): Promise<boolean> {\n const url = `http://localhost:${port}/`\n\n // Try to open with ts-craft first\n try {\n const { createApp } = await import('ts-craft')\n\n console.log('⚡ Opening native window...')\n\n // Try to find craft binary in common locations\n const craftPath = getCraftBinaryPath()\n\n // When native sidebar is enabled, don't use system tray (they're mutually exclusive in Craft)\n const useSystemTray = !options.nativeSidebar\n\n const app = createApp({\n url,\n craftPath,\n window: {\n title: options.title || 'stx Development',\n width: options.width || 1400,\n height: options.height || 900,\n resizable: true,\n systemTray: useSystemTray,\n darkMode: options.darkMode ?? true,\n hotReload: options.hotReload ?? true,\n devTools: true,\n // Native sidebar support (macOS Tahoe style)\n nativeSidebar: options.nativeSidebar ?? false,\n sidebarWidth: options.sidebarWidth ?? 260,\n sidebarConfig: options.sidebarConfig as Record<string, unknown> | undefined,\n },\n })\n\n const id = `dev-window-${port}`\n activeWindows.set(id, { app, url, options })\n\n await app.show()\n console.log(`✓ Native window opened at ${url}`)\n console.log(`📌 Look for the \"stx Development\" icon in your menubar`)\n return true\n }\n catch (error) {\n console.warn('⚠ Could not open native window:', (error as Error).message)\n\n // Skip browser fallback in test environment\n if (process.env.NODE_ENV === 'test' || process.env.BUN_TEST) {\n console.log('(Skipping browser fallback in test environment)')\n return false\n }\n\n console.log('📱 Opening in browser instead...')\n\n // Fallback: Open in default browser\n try {\n const { spawn } = await import('node:child_process')\n const platform = process.platform\n\n let command: string\n let args: string[]\n\n if (platform === 'darwin') {\n command = 'open'\n args = [url]\n }\n else if (platform === 'win32') {\n command = 'cmd'\n args = ['/c', 'start', url]\n }\n else {\n // Linux\n command = 'xdg-open'\n args = [url]\n }\n\n spawn(command, args, { detached: true, stdio: 'ignore' }).unref()\n console.log(`✓ Browser opened at ${url}`)\n return true\n }\n catch (browserError) {\n console.error('Could not open browser:', browserError)\n console.log(`Please open manually: ${url}`)\n return false\n }\n }\n}\n\n/**\n * Create a window with HTML content\n *\n * Uses ts-craft to display HTML content in a native window.\n */\nexport async function createWindowWithHTML(html: string, options: WindowOptions = {}): Promise<WindowInstance | null> {\n const {\n title = 'stx Desktop',\n width = 1200,\n height = 800,\n darkMode = false,\n hotReload = false,\n resizable = true,\n frameless = false,\n alwaysOnTop = false,\n } = options\n\n try {\n // Dynamically import ts-craft\n const { createApp } = await import('ts-craft')\n\n const craftPath = getCraftBinaryPath()\n\n const app = createApp({\n html,\n craftPath,\n window: {\n title,\n width,\n height,\n darkMode,\n hotReload,\n resizable,\n frameless,\n alwaysOnTop,\n },\n })\n\n const id = `craft-window-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n activeWindows.set(id, { app, url: 'html-content', options })\n\n await app.show()\n\n return createWindowInstance(id, app)\n }\n catch (error) {\n console.error('Failed to create window with HTML:', error)\n return null\n }\n}\n\n/**\n * Helper to check if webview implementation is available\n */\nexport function isWebviewAvailable(): boolean {\n try {\n // Try to require ts-craft to check if it's available\n require.resolve('ts-craft')\n return true\n }\n catch {\n return false\n }\n}\n\n// =============================================================================\n// Bridge Script Generator\n// =============================================================================\n\n/**\n * Generate a JavaScript snippet to inject into HTML that provides\n * helper functions for common window operations.\n *\n * This can be injected into your HTML to provide easier access to Craft APIs.\n *\n * @example\n * ```typescript\n * const html = `\n * <html>\n * <head>\n * <script>${getWindowBridgeScript()}</script>\n * </head>\n * <body>\n * <button onclick=\"stxWindow.minimize()\">Minimize</button>\n * </body>\n * </html>\n * `\n * await createWindowWithHTML(html)\n * ```\n */\nexport function getWindowBridgeScript(): string {\n return `\n// STX Desktop Window Bridge\n// Provides convenient wrappers around window.craft APIs\nwindow.stxWindow = {\n // Window control\n hide: () => window.craft?.window?.hide(),\n show: () => window.craft?.window?.show(),\n toggle: () => window.craft?.window?.toggle(),\n close: () => window.craft?.window?.close(),\n minimize: () => window.craft?.window?.minimize(),\n maximize: () => window.craft?.window?.maximize(),\n focus: () => window.craft?.window?.focus(),\n center: () => window.craft?.window?.center(),\n reload: () => window.craft?.window?.reload(),\n toggleFullscreen: () => window.craft?.window?.toggleFullscreen(),\n\n // Window properties\n setTitle: (title) => window.craft?.window?.setTitle({ title }),\n setSize: (width, height) => window.craft?.window?.setSize({ width, height }),\n setPosition: (x, y) => window.craft?.window?.setPosition({ x, y }),\n setAlwaysOnTop: (alwaysOnTop) => window.craft?.window?.setAlwaysOnTop({ alwaysOnTop }),\n setResizable: (resizable) => window.craft?.window?.setResizable({ resizable }),\n setOpacity: (opacity) => window.craft?.window?.setOpacity({ opacity }),\n\n // macOS-specific\n setVibrancy: (vibrancy) => window.craft?.window?.setVibrancy({ vibrancy }),\n\n // App control\n quit: () => window.craft?.app?.quit(),\n isDarkMode: () => window.craft?.app?.isDarkMode(),\n getLocale: () => window.craft?.app?.getLocale(),\n\n // Notifications\n notify: (options) => window.craft?.app?.notify(options),\n\n // Check if running in Craft\n isCraftAvailable: () => typeof window.craft !== 'undefined',\n};\n\n// Expose as global for backwards compatibility\nwindow.desktop = window.stxWindow;\n`\n}\n"
11
+ ],
12
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
13
+ "debugId": "574CB389B0B4B44F64756E2164756E21",
14
+ "names": []
15
+ }