@je-es/client 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/main.cjs +6 -6
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.cts +3 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +6 -6
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mod/core/styles.ts","../src/mod/core/scheduler.ts","../src/mod/core/component.ts","../src/mod/core/decorators.ts","../src/mod/core/context.ts","../src/mod/core/hooks.ts","../src/mod/core/router.ts","../src/mod/core/store.ts","../src/mod/core/client.ts","../src/mod/services/i18n.ts","../src/mod/components/toast.ts","../src/mod/components/loader.ts","../src/mod/components/smart_form.ts","../src/mod/components/popup.ts","../src/mod/components/tabbed_view.ts","../src/mod/components/items_loader.ts","../src/mod/components/dropdown.ts","../src/mod/help.ts","../src/mod/utils/intersection_observer.ts","../src/mod/utils/time_formatter.ts","../src/main.ts"],"names":["StyleManager","css","componentName","id","styleElement","scopedCSS","scope","lines","scopedLines","braceCount","line","selector","rest","scopedSelector","element","strings","values","result","i","UpdateScheduler","callback","callbacks","error","scheduler","Component","props","initialState","partialState","newState","prevState","hasChanged","key","newProps","prevProps","updater","prevIsScheduled","container","unsubscribe","name","el","compute","deps","cached","subscription","fn","delay","timeoutId","args","lastCall","now","timeSinceLastCall","newVNode","parent","index","oldVDomNode","newVDomNode","patch","data","originalElement","newElement","attrs","attr","child","vnode","convertedProps","value","convertedChildren","eventName","errorInfo","prevDeps","nextDeps","dep","propertyName","newValue","oldValue","watchers","methodName","state","target","context","propertyKey","instance","initialValue","hiddenKey","inst","targetConstructor","initKey","computed","targetOrGetter","descriptor","ctx","originalGetter","cacheKey","dirtyKey","watch","decorator","targetOrMethod","Context","defaultValue","subscriber","createContext","Provider","children","html","useContext","component","CombinedContext","initialValues","createCombinedContext","currentComponent","currentHookIndex","hookStates","setHookContext","clearHookContext","getHookStates","useState","hookIndex","states","setState","nextValue","useEffect","effect","areDepsEqual","cleanup","useMemo","factory","useCallback","useRef","useReducer","reducer","dispatch","action","useLocalStorage","storedValue","setStoredValue","item","prevValue","valueToStore","useDebounce","debouncedValue","setDebouncedValue","handler","usePrevious","ref","useToggle","setValue","toggle","v","useInterval","savedCallback","useFetch","url","options","setData","loading","setLoading","setError","fetchData","response","json","e","useWindowSize","size","setSize","handleResize","useEventListener","savedHandler","eventListener","event","createFunctionalComponent","displayName","FunctionalComponent","Router","routes","mode","base","scrollBehavior","path","delta","hook","exact","createElement","r","params","route","matchedRoute","link","href","to","from","guard","resolve","nextPath","ComponentClass","ComponentCtor","proto","exp","errorMessage","normalizedPath","cleanPath","pattern","paramNames","regexPattern","_","paramName","regex","match","search","query","pair","router","navigate","replace","goBack","goForward","getCurrentPath","isCurrentPath","isCurrentPathPrefix","prefix","reloadRoute","currentPath","navigateWithQuery","getQueryParams","getQueryParam","Store","stored","update","middleware","listener","updates","prevNotify","shouldNotify","stateCopy","createStore","createComputedStore","stores","computer","computedStore","s","store","connect","mapStateToProps","client","config","_config","stylesDir","outputPath","sass","writeFileSync","existsSync","mkdirSync","join","dirname","outputDir","outputFile","mainScssFile","fullOutputPath","dir","readdirSync","statSync","extname","files","entries","entry","fullPath","stat","entryDir","eventType","filename","capiConfig","configureApi","I18nManager","lang","translations","trans","translation","param","paramValue","currentLang","htmlString","processedString","openingTag","pairedContent","selfClosingTag","textContent","tagName","updateCallback","urlPattern","urls","langCodes","fullUrl","langMatch","i18nInstance","getI18n","t","tLang","tHtml","setLanguage","setLanguageAsync","staticPath","manager","currentTranslations","baseUrl","getCurrentLanguage","loadLanguage","loadTranslations","getSupportedLanguages","hasKey","getTranslations","createTranslator","loadFromUrl","initializeI18n","setupI18n","langToLoad","langUrl","loadLanguageFile","bb_","Toast","message","type","duration","translateKey","m","msg","icons","displayMessage","__decorateClass","globalToast","initToast","toastContainer","getToast","toast","Loader","containerClasses","spinnerClass","text","progress","increment","SmartFormComponent","field","fieldName","f","validation","stringValue","isValid","errors","firstErrorField","api","labelNode","optionNodes","opt","submitButton","fieldNodes","SmartForm","Popup","popup","sizeClass","variantClass","button","_reject","wrappedFormConfig","p","lastPopup","globalPopup","initPopup","popupContainer","getPopup","TabbedView","savedTab","tabId","tab","containerClass","headerClass","isActive","tabClass","label","contentClass","activeTab","wrappedProps","wrappedVNode","createTabbedView","view","mountTabbedView","ItemsLoader","scrollTop","scrollHeight","clientHeight","scrollContainer","savedScrollTop","savedScrollHeight","nextPage","newItems","total","scrollHeightDiff","newFilters","searchQuery","updatedItems","itemIndex","itemId","shouldTrack","items","containerRect","rect","viewedItemsArray","itemIds","fragment","startIndex","actualIndex","itemElement","loadingEl","loadingVNode","emptyVNode","emptyElement","createDOMElement","triggerVNode","triggerElement","endMsgVNode","endMsgElement","tryObserve","trigger","candidates","candidate","page","separator","headers","token","createItemsLoader","loader","DropdownManagerSingleton","_DropdownManagerSingleton","dropdown","d","ancestorId","descendantId","currentId","ancestors","parentId","descendants","addChildren","childId","sibling","current","dropdownId","clickedDropdownId","rootDropdown","rootId","dropdownManager","Dropdown","open","menu","h","menuContainer","menuVNode","menuElement","customElement","triggerClassName","itemClassName","buttonProps","createDropdown","debounce","throttle","classNames","classes","cls","formatDate","date","format","year","month","day","hours","minutes","seconds","deepClone","obj","clonedMap","clonedSet","cloned","deepMerge","sources","source","isObject","sourceValue","targetValue","uniqueIdCounter","uniqueId","timestamp","randomPart","counter","sleep","ms","isEmpty","capitalize","str","kebabCase","camelCase","char","pascalCase","camel","truncate","length","suffix","parseQuery","queryString","cleaned","pairs","decodedValue","actualKey","stringifyQuery","clamp","min","max","isBrowser","safeJsonParse","fallback","utils","VisibilityObserver","wasVisible","isNowVisible","observeVisibility","observer","formatRelativeTime","diffMs","diffSecs","diffMins","diffHours","diffDays","diffWeeks","diffMonths","diffYears","formatted","getTimeDisplay","title","formatTimeAgo","getTimeTitle","setConfig"],"mappings":"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","file":"main.js","sourcesContent":["// src/mod/core/styles.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Style Manager - handles CSS injection and scoping\r\n */\r\n export class StyleManager {\r\n private static styles = new Map<string, HTMLStyleElement>();\r\n private static scopeCounter = 0;\r\n\r\n /**\r\n * Inject styles into document\r\n */\r\n static inject(css: string, componentName?: string): string {\r\n const id = componentName || `style-${this.scopeCounter++}`;\r\n\r\n if (this.styles.has(id)) {\r\n return id;\r\n }\r\n\r\n const styleElement = document.createElement('style');\r\n styleElement.setAttribute('data-component', id);\r\n\r\n // Scope the CSS\r\n const scopedCSS = this.scopeStyles(css, id);\r\n styleElement.textContent = scopedCSS;\r\n\r\n document.head.appendChild(styleElement);\r\n this.styles.set(id, styleElement);\r\n\r\n return id;\r\n }\r\n\r\n /**\r\n * Remove styles from document\r\n */\r\n static remove(id: string): void {\r\n const styleElement = this.styles.get(id);\r\n if (styleElement && styleElement.parentElement) {\r\n styleElement.parentElement.removeChild(styleElement);\r\n this.styles.delete(id);\r\n }\r\n }\r\n\r\n /**\r\n * Scope CSS selectors\r\n */\r\n private static scopeStyles(css: string, scope: string): string {\r\n // Simple scoping - prefix all selectors with [data-scope=\"id\"]\r\n // This is a basic implementation. A production version would use a proper CSS parser\r\n\r\n const lines = css.split('\\n');\r\n const scopedLines: string[] = [];\r\n let inMediaQuery = false;\r\n let braceCount = 0;\r\n\r\n for (let line of lines) {\r\n line = line.trim();\r\n\r\n // Handle media queries\r\n if (line.startsWith('@media')) {\r\n inMediaQuery = true;\r\n scopedLines.push(line);\r\n continue;\r\n }\r\n\r\n // Count braces\r\n braceCount += (line.match(/{/g) || []).length;\r\n braceCount -= (line.match(/}/g) || []).length;\r\n\r\n if (inMediaQuery && braceCount === 0) {\r\n inMediaQuery = false;\r\n }\r\n\r\n // Scope selectors\r\n if (line.includes('{') && !line.startsWith('@') && !line.startsWith('}')) {\r\n const selector = line.substring(0, line.indexOf('{')).trim();\r\n const rest = line.substring(line.indexOf('{'));\r\n\r\n // Don't scope :root, *, or @-rules\r\n if (selector === ':root' || selector === '*' || line.startsWith('@')) {\r\n scopedLines.push(line);\r\n } else {\r\n const scopedSelector = `[data-scope=\"${scope}\"] ${selector}`;\r\n scopedLines.push(`${scopedSelector} ${rest}`);\r\n }\r\n } else {\r\n scopedLines.push(line);\r\n }\r\n }\r\n\r\n return scopedLines.join('\\n');\r\n }\r\n\r\n /**\r\n * Clear all styles\r\n */\r\n static clear(): void {\r\n for (const [, element] of this.styles) {\r\n if (element.parentElement) {\r\n element.parentElement.removeChild(element);\r\n }\r\n }\r\n this.styles.clear();\r\n }\r\n }\r\n\r\n /**\r\n * CSS template literal tag\r\n * Usage: css`.class { color: red; }`\r\n */\r\n export function css(\r\n strings: TemplateStringsArray,\r\n ...values: unknown[]\r\n ): string {\r\n let result = '';\r\n\r\n for (let i = 0; i < strings.length; i++) {\r\n result += strings[i];\r\n if (i < values.length) {\r\n result += values[i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/scheduler.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n type UpdateCallback = () => void;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Update Scheduler\r\n * Batches multiple state changes into a single render\r\n */\r\n class UpdateScheduler {\r\n private queue = new Set<UpdateCallback>();\r\n private isFlushScheduled = false;\r\n private isFlushing = false;\r\n\r\n /**\r\n * Schedule a component update\r\n */\r\n schedule(callback: UpdateCallback): void {\r\n if (this.isFlushing) {\r\n // If we're currently flushing, schedule for next batch\r\n requestAnimationFrame(() => this.schedule(callback));\r\n return;\r\n }\r\n\r\n this.queue.add(callback);\r\n\r\n if (!this.isFlushScheduled) {\r\n this.isFlushScheduled = true;\r\n\r\n // Use microtask for immediate batching, then RAF for rendering\r\n Promise.resolve().then(() => {\r\n requestAnimationFrame(() => this.flush());\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Force immediate flush (for urgent updates)\r\n */\r\n flushSync(callback: UpdateCallback): void {\r\n callback();\r\n }\r\n\r\n /**\r\n * Flush all pending updates\r\n */\r\n private flush(): void {\r\n if (this.queue.size === 0) {\r\n this.isFlushScheduled = false;\r\n return;\r\n }\r\n\r\n this.isFlushing = true;\r\n this.isFlushScheduled = false;\r\n\r\n const callbacks = Array.from(this.queue);\r\n this.queue.clear();\r\n\r\n // Execute all updates\r\n for (const callback of callbacks) {\r\n try {\r\n callback();\r\n } catch (error) {\r\n console.error('Error during update:', error);\r\n }\r\n }\r\n\r\n this.isFlushing = false;\r\n\r\n // If new updates were scheduled during flush, process them\r\n if (this.queue.size > 0) {\r\n this.schedule(() => {});\r\n }\r\n }\r\n\r\n /**\r\n * Clear all pending updates\r\n */\r\n clear(): void {\r\n this.queue.clear();\r\n this.isFlushScheduled = false;\r\n }\r\n\r\n /**\r\n * Get queue size (for debugging)\r\n */\r\n get size(): number {\r\n return this.queue.size;\r\n }\r\n }\r\n\r\n // Export singleton instance\r\n export const scheduler = new UpdateScheduler();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/component.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { patch } from '@je-es/vdom';\r\n import type { VNode } from '../../types';\r\n import { StyleManager } from './styles';\r\n import { scheduler } from './scheduler';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export abstract class Component<P = Record<string, unknown>, S = Record<string, unknown>> {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n public props : P;\r\n public state : S;\r\n public _isMounted : boolean = false;\r\n\r\n private _isUnmounting : boolean = false;\r\n private _element : HTMLElement | null = null;\r\n private _vnode : VNode | null = null;\r\n private _styleId : string | null = null;\r\n private _isScheduledForUpdate : boolean = false;\r\n private _updateBatch = new Set<string>();\r\n private _refs = new Map<string, HTMLElement>();\r\n private _subscriptions : (() => void)[] = [];\r\n private _memoCache = new Map<string, { args: unknown[]; result: unknown }>();\r\n private _isInitializing : boolean = false;\r\n private _skipNextUpdate : boolean = false;\r\n private _preservedElements = new Map<Element, { parent: Element; children: Node[] }>();\r\n private _updateInProgress : boolean = false;\r\n\r\n constructor(props?: P, initialState?: S) {\r\n this.props = props || {} as P;\r\n this.state = initialState || {} as S;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n onBeforeMount?(): void | Promise<void>;\r\n onMount?(): void | Promise<void>;\r\n onBeforeUpdate?(prevProps: P, prevState: S): void | Promise<void>;\r\n onUpdate?(prevProps: P, prevState: S): void;\r\n onBeforeUnmount?(): void;\r\n onUnmount?(): void;\r\n onError?(error: Error, errorInfo: { componentStack?: string }): void;\r\n onPropsChange?(prevProps: P, newProps: P): void;\r\n onStateChange?(prevState: S, newState: S): void;\r\n shouldUpdate?(prevProps: P, prevState: S): boolean;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n abstract render(): VNode;\r\n styles?(): string;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n setState(\r\n partialState: Partial<S> | ((prevState: S) => Partial<S>),\r\n callback?: () => void\r\n ): void {\r\n // Don't trigger updates during initialization\r\n if (this._isInitializing) {\r\n const newState = typeof partialState === 'function'\r\n ? partialState(this.state)\r\n : partialState;\r\n this.state = { ...this.state, ...newState };\r\n return;\r\n }\r\n\r\n // Don't trigger updates during unmounting\r\n if (this._isUnmounting) {\r\n return;\r\n }\r\n\r\n const prevState = { ...this.state };\r\n const newState = typeof partialState === 'function'\r\n ? partialState(this.state)\r\n : partialState;\r\n\r\n // Check if state actually changed\r\n let hasChanged = false;\r\n for (const key in newState) {\r\n if (prevState[key] !== newState[key]) {\r\n hasChanged = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasChanged) {\r\n // State didn't change, just run callback if provided\r\n if (callback) {\r\n scheduler.schedule(callback);\r\n }\r\n return;\r\n }\r\n\r\n this.state = { ...this.state, ...newState };\r\n\r\n this.onStateChange?.(prevState, this.state);\r\n this.update();\r\n\r\n if (callback) {\r\n scheduler.schedule(callback);\r\n }\r\n }\r\n\r\n setProps(newProps: Partial<P>): void {\r\n if (this._isUnmounting) {\r\n return;\r\n }\r\n\r\n const prevProps = { ...this.props };\r\n\r\n // Check if props actually changed\r\n let hasChanged = false;\r\n for (const key in newProps) {\r\n if (prevProps[key] !== newProps[key]) {\r\n hasChanged = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n this.props = { ...this.props, ...newProps };\r\n\r\n this.onPropsChange?.(prevProps, this.props);\r\n this.update();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n batchUpdate(updater: () => void): void {\r\n const prevIsScheduled = this._isScheduledForUpdate;\r\n this._isScheduledForUpdate = true;\r\n\r\n try {\r\n updater();\r\n } finally {\r\n if (!prevIsScheduled) {\r\n this._isScheduledForUpdate = false;\r\n this.update();\r\n }\r\n }\r\n }\r\n\r\n update(key?: string): void {\r\n // Guard conditions\r\n if (this._skipNextUpdate) {\r\n this._skipNextUpdate = false;\r\n return;\r\n }\r\n\r\n if (this._isInitializing || this._isUnmounting || !this._isMounted) {\r\n return;\r\n }\r\n\r\n // Prevent concurrent updates\r\n if (this._updateInProgress) {\r\n return;\r\n }\r\n\r\n if (key) {\r\n this._updateBatch.add(key);\r\n }\r\n\r\n if (this._isScheduledForUpdate) {\r\n return;\r\n }\r\n\r\n this._isScheduledForUpdate = true;\r\n scheduler.schedule(() => {\r\n this._isScheduledForUpdate = false;\r\n this._updateBatch.clear();\r\n this._performUpdate();\r\n });\r\n }\r\n\r\n forceUpdate(): void {\r\n if (!this._isMounted || this._isUnmounting || this._updateInProgress) {\r\n return;\r\n }\r\n\r\n scheduler.flushSync(() => {\r\n this._performUpdate();\r\n });\r\n }\r\n\r\n skipNextUpdate(): void {\r\n this._skipNextUpdate = true;\r\n }\r\n\r\n beginInitialization(): void {\r\n this._isInitializing = true;\r\n }\r\n\r\n endInitialization(): void {\r\n this._isInitializing = false;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n async mount(container: HTMLElement): Promise<void> {\r\n if (this._isMounted) {\r\n console.warn(`Component ${this.constructor.name} is already mounted`);\r\n return;\r\n }\r\n\r\n if (!container) {\r\n throw new Error(`Cannot mount ${this.constructor.name}: container is null or undefined`);\r\n }\r\n\r\n try {\r\n this._isInitializing = true;\r\n\r\n await this.onBeforeMount?.();\r\n\r\n this._vnode = this.render();\r\n this._element = this._createElementFromVNode(this._vnode);\r\n\r\n if (this.styles) {\r\n this._styleId = StyleManager.inject(\r\n this.styles(),\r\n this.constructor.name\r\n );\r\n this._element?.setAttribute('data-scope', this.constructor.name);\r\n }\r\n\r\n container.appendChild(this._element);\r\n this._isMounted = true;\r\n this._isInitializing = false;\r\n\r\n await this.onMount?.();\r\n } catch (error) {\r\n this._isInitializing = false;\r\n this._isMounted = false;\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n throw error;\r\n }\r\n }\r\n\r\n unmount(): void {\r\n if (!this._isMounted || this._isUnmounting) {\r\n return;\r\n }\r\n\r\n this._isUnmounting = true;\r\n\r\n try {\r\n this.onBeforeUnmount?.();\r\n\r\n // Cancel pending updates\r\n this._isScheduledForUpdate = false;\r\n this._updateBatch.clear();\r\n\r\n // Remove styles\r\n if (this._styleId) {\r\n StyleManager.remove(this._styleId);\r\n this._styleId = null;\r\n }\r\n\r\n // Unsubscribe from all subscriptions\r\n this._subscriptions.forEach(unsubscribe => {\r\n try {\r\n unsubscribe();\r\n } catch (error) {\r\n console.error('Error during unsubscribe:', error);\r\n }\r\n });\r\n this._subscriptions = [];\r\n\r\n // Remove from DOM\r\n if (this._element?.parentElement) {\r\n this._element.parentElement.removeChild(this._element);\r\n }\r\n\r\n // Clear state\r\n this._isMounted = false;\r\n this._element = null;\r\n this._vnode = null;\r\n\r\n this.onUnmount?.();\r\n\r\n // Clear caches\r\n this._refs.clear();\r\n this._memoCache.clear();\r\n this._preservedElements.clear();\r\n } catch (error) {\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n } finally {\r\n this._isUnmounting = false;\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n getRef(name: string): HTMLElement | undefined {\r\n return this._refs.get(name);\r\n }\r\n\r\n createRef(name: string): (el: HTMLElement | null) => void {\r\n return (el: HTMLElement | null) => {\r\n if (el) {\r\n this._refs.set(name, el);\r\n } else {\r\n this._refs.delete(name);\r\n }\r\n };\r\n }\r\n\r\n memo<T>(key: string, compute: () => T, deps: unknown[]): T {\r\n const cached = this._memoCache.get(key);\r\n\r\n if (cached && this._areDepsEqual(cached.args, deps)) {\r\n return cached.result as T;\r\n }\r\n\r\n const result = compute();\r\n this._memoCache.set(key, { args: deps, result });\r\n return result;\r\n }\r\n\r\n subscribe(subscription: () => void): void {\r\n this._subscriptions.push(subscription);\r\n }\r\n\r\n debounce<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n fn.apply(this, args);\r\n }, delay);\r\n };\r\n }\r\n\r\n throttle<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let lastCall = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n const now = Date.now();\r\n const timeSinceLastCall = now - lastCall;\r\n\r\n if (timeSinceLastCall >= delay) {\r\n lastCall = now;\r\n fn.apply(this, args);\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n lastCall = Date.now();\r\n timeoutId = null;\r\n fn.apply(this, args);\r\n }, delay - timeSinceLastCall);\r\n }\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n get element(): HTMLElement | null {\r\n return this._element;\r\n }\r\n\r\n get isMounted(): boolean {\r\n return this._isMounted;\r\n }\r\n\r\n get isUnmounting(): boolean {\r\n return this._isUnmounting;\r\n }\r\n\r\n get isInitializing(): boolean {\r\n return this._isInitializing;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private async _performUpdate(): Promise<void> {\r\n // Guard against invalid states\r\n if (!this._isMounted || !this._element || this._isUnmounting || this._isInitializing) {\r\n return;\r\n }\r\n\r\n // Prevent concurrent updates\r\n if (this._updateInProgress) {\r\n return;\r\n }\r\n\r\n this._updateInProgress = true;\r\n\r\n const prevProps = { ...this.props };\r\n const prevState = { ...this.state };\r\n\r\n try {\r\n // Check if update should proceed\r\n if (this.shouldUpdate && !this.shouldUpdate(prevProps, prevState)) {\r\n return;\r\n }\r\n\r\n await this.onBeforeUpdate?.(prevProps, prevState);\r\n\r\n // Preserve mounted child components before patching\r\n this._preserveComponentMounts();\r\n\r\n const newVNode = this.render();\r\n const parent = this._element.parentElement;\r\n\r\n if (this._vnode && parent) {\r\n const index = Array.from(parent.childNodes).indexOf(this._element);\r\n\r\n if (index === -1) {\r\n // Element was removed from parent, skip update\r\n console.warn(`Component ${this.constructor.name} element removed from parent, skipping update`);\r\n return;\r\n }\r\n\r\n const oldVDomNode = this._convertToVDomNode(this._vnode);\r\n const newVDomNode = this._convertToVDomNode(newVNode);\r\n\r\n patch(parent, oldVDomNode, newVDomNode, index);\r\n this._element = parent.childNodes[index] as HTMLElement;\r\n }\r\n\r\n this._vnode = newVNode;\r\n\r\n // Restore preserved elements after patching\r\n this._restoreComponentMounts();\r\n\r\n this.onUpdate?.(prevProps, prevState);\r\n } catch (error) {\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n } finally {\r\n this._updateInProgress = false;\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _preserveComponentMounts(): void {\r\n if (!this._element) return;\r\n\r\n this._preservedElements.clear();\r\n\r\n // Selectors for elements that contain mounted components\r\n const preserveSelectors = [\r\n '[data-language-dropdown-mount]',\r\n '[data-user-dropdown-mount]',\r\n '[data-notifications-dropdown-mount]',\r\n '[data-dropdown-id]',\r\n '[data-preserve]',\r\n '[data-toast-mount]',\r\n '[data-popup-mount]',\r\n '[data-loader-mount]',\r\n '[data-navbar-notifications-list]'\r\n ];\r\n\r\n preserveSelectors.forEach(selector => {\r\n const elements = this._element!.querySelectorAll(selector);\r\n elements.forEach(el => {\r\n if (el.children.length > 0 && el.parentElement) {\r\n this._preservedElements.set(el, {\r\n parent: el,\r\n children: Array.from(el.childNodes)\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n private _restoreComponentMounts(): void {\r\n if (!this._element) return;\r\n\r\n this._preservedElements.forEach((data, originalElement) => {\r\n let newElement: Element | null = null;\r\n\r\n // Find corresponding element in updated DOM by matching attributes\r\n const attrs = Array.from(originalElement.attributes);\r\n for (const attr of attrs) {\r\n // Match by data attributes that identify mount points\r\n if (attr.name.startsWith('data-')) {\r\n const selector = `[${attr.name}=\"${attr.value}\"]`;\r\n newElement = this._element!.querySelector(selector);\r\n if (newElement) break;\r\n }\r\n }\r\n\r\n if (newElement && data.children.length > 0) {\r\n // Clear any new children added during patch\r\n while (newElement.firstChild) {\r\n newElement.removeChild(newElement.firstChild);\r\n }\r\n\r\n // Restore original children\r\n data.children.forEach(child => {\r\n newElement!.appendChild(child);\r\n });\r\n }\r\n });\r\n\r\n this._preservedElements.clear();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _convertToVDomNode(vnode: VNode): VNode {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Component VNodes cannot be converted to VDom nodes');\r\n }\r\n\r\n const convertedProps: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children') continue;\r\n\r\n if (key === 'style' && typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n convertedProps[key] = value as Record<string, string | number>;\r\n } else {\r\n convertedProps[key] = value;\r\n }\r\n }\r\n\r\n const convertedChildren = vnode.children.map(child => {\r\n if (child == null || typeof child === 'boolean') return null;\r\n if (typeof child === 'string' || typeof child === 'number') return child;\r\n return this._convertToVDomNode(child as VNode);\r\n }).filter((child): child is string | number | VNode => child !== null);\r\n\r\n return {\r\n type: vnode.type,\r\n props: convertedProps as never,\r\n children: convertedChildren\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Component VNodes not supported in _createElementFromVNode');\r\n }\r\n\r\n const element = document.createElement(vnode.type);\r\n\r\n // Set properties\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children') continue;\r\n this._setElementProperty(element, key, value);\r\n }\r\n\r\n // Add children\r\n for (const child of vnode.children) {\r\n if (child == null || child === false) continue;\r\n\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object' && 'type' in child) {\r\n element.appendChild(this._createElementFromVNode(child as VNode));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n private _setElementProperty(element: HTMLElement, key: string, value: unknown): void {\r\n // Event handlers\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.substring(2).toLowerCase();\r\n element.addEventListener(eventName, value as EventListener);\r\n return;\r\n }\r\n\r\n // Class names\r\n if (key === 'className' && typeof value === 'string') {\r\n element.className = value;\r\n return;\r\n }\r\n\r\n // Styles\r\n if (key === 'style') {\r\n if (typeof value === 'string') {\r\n element.setAttribute('style', value);\r\n } else if (typeof value === 'object' && value !== null) {\r\n Object.assign(element.style, value);\r\n }\r\n return;\r\n }\r\n\r\n // Refs\r\n if (key === 'ref' && typeof value === 'function') {\r\n (value as (el: HTMLElement) => void)(element);\r\n return;\r\n }\r\n\r\n // Boolean attributes\r\n if (key === 'checked' || key === 'disabled' || key === 'selected') {\r\n const boolValue = value === 'true' || value === true || value === '';\r\n if (boolValue) {\r\n element.setAttribute(key, '');\r\n }\r\n return;\r\n }\r\n\r\n // Regular attributes\r\n if (value != null && value !== false) {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _handleError(error: Error, errorInfo: { componentStack?: string }): void {\r\n console.error(`Error in component ${this.constructor.name}:`, error);\r\n console.error('Component stack:', errorInfo.componentStack);\r\n\r\n if (this.onError) {\r\n this.onError(error, errorInfo);\r\n } else {\r\n // Re-throw if no error handler\r\n throw error;\r\n }\r\n }\r\n\r\n private _areDepsEqual(prevDeps: unknown[], nextDeps: unknown[]): boolean {\r\n if (prevDeps.length !== nextDeps.length) return false;\r\n return prevDeps.every((dep, i) => Object.is(dep, nextDeps[i]));\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n _invalidateAllComputed(): void {\r\n for (const key in this) {\r\n if (key.startsWith('_computed_dirty_')) {\r\n (this as Record<string, unknown>)[key] = true;\r\n }\r\n }\r\n }\r\n\r\n _triggerWatchers(propertyName: string, newValue: unknown, oldValue: unknown): void {\r\n const watchers = (this.constructor as ComponentConstructor).__watchers__;\r\n if (!watchers?.[propertyName]) return;\r\n\r\n for (const methodName of watchers[propertyName]) {\r\n if (typeof (this as Record<string, unknown>)[methodName] === 'function') {\r\n try {\r\n ((this as Record<string, unknown>)[methodName] as (nv: unknown, ov: unknown) => void).call(this, newValue, oldValue);\r\n } catch (error) {\r\n console.error(`Watcher error in ${methodName}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n setElement(element: HTMLElement): void {\r\n this._element = element;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export interface ComponentConstructor {\r\n __watchers__? : Record<string, string[]>;\r\n __reactiveProps__? : string[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/decorators.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n // Type for decorator context (Stage 3 decorators)\r\n interface ClassFieldDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'field';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n set(object: This, value: Value): void;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n interface ClassGetterDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'getter';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n interface ClassMethodDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'method';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n // Component metadata interface\r\n interface ComponentMetadata {\r\n __reactiveProps__?: string[];\r\n __watchers__?: Record<string, string[]>;\r\n }\r\n\r\n // Helper type for component instance\r\n type ComponentInstance = Record<string, unknown> & {\r\n constructor: ComponentMetadata;\r\n _invalidateAllComputed?: () => void;\r\n _triggerWatchers?: (key: string, newVal: unknown, oldVal: unknown) => void;\r\n _isMounted?: boolean;\r\n update?: () => void;\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * State decorator - makes property reactive\r\n * Usage: @state fields = [];\r\n *\r\n * Supports both TypeScript 5 decorators and legacy decorators\r\n */\r\n export function state<This, Value>(\r\n target: undefined,\r\n context: ClassFieldDecoratorContext<This, Value>\r\n ): (this: This, initialValue: Value) => Value;\r\n export function state(\r\n target: Record<string, unknown>,\r\n context: string\r\n ): void;\r\n export function state<This, Value>(\r\n target: Record<string, unknown> | undefined,\r\n context: string | ClassFieldDecoratorContext<This, Value>\r\n ): unknown {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n const propertyKey = context.name as string;\r\n\r\n context.addInitializer(function(this: unknown) {\r\n const instance = this as ComponentInstance;\r\n if (!instance.constructor.__reactiveProps__) {\r\n instance.constructor.__reactiveProps__ = [];\r\n }\r\n if (!instance.constructor.__reactiveProps__.includes(propertyKey)) {\r\n instance.constructor.__reactiveProps__.push(propertyKey);\r\n }\r\n });\r\n\r\n return function(this: This, initialValue: Value): Value {\r\n const instance = this as ComponentInstance;\r\n const hiddenKey = `_state_${propertyKey}`;\r\n\r\n // Store initial value\r\n instance[hiddenKey] = initialValue;\r\n\r\n // Define getter/setter\r\n Object.defineProperty(this, propertyKey, {\r\n get(this: This) {\r\n const inst = this as Record<string, unknown>;\r\n return inst[hiddenKey];\r\n },\r\n set(this: This, newValue: Value) {\r\n const inst = this as ComponentInstance;\r\n const oldValue = inst[hiddenKey];\r\n\r\n if (oldValue !== newValue) {\r\n inst[hiddenKey] = newValue;\r\n\r\n // Invalidate all computed properties\r\n if (typeof inst._invalidateAllComputed === 'function') {\r\n inst._invalidateAllComputed();\r\n }\r\n\r\n // Trigger watchers with correct old/new values\r\n if (typeof inst._triggerWatchers === 'function') {\r\n inst._triggerWatchers(propertyKey, newValue, oldValue);\r\n }\r\n\r\n // Trigger update if component is mounted\r\n if (inst._isMounted && typeof inst.update === 'function') {\r\n inst.update();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n return initialValue;\r\n };\r\n }\r\n\r\n // Legacy decorator (for backwards compatibility)\r\n const propertyKey = context as string;\r\n\r\n // Store reactive property metadata\r\n const targetConstructor = (target as { constructor: ComponentMetadata }).constructor;\r\n if (!targetConstructor.__reactiveProps__) {\r\n targetConstructor.__reactiveProps__ = [];\r\n }\r\n if (!targetConstructor.__reactiveProps__.includes(propertyKey)) {\r\n targetConstructor.__reactiveProps__.push(propertyKey);\r\n }\r\n\r\n // Create hidden property key\r\n const hiddenKey = `_state_${propertyKey}`;\r\n const initKey = `_state_init_${propertyKey}`;\r\n\r\n // Define getter/setter\r\n Object.defineProperty(target, propertyKey, {\r\n get(this: unknown) {\r\n const instance = this as Record<string, unknown>;\r\n // If not initialized yet, return undefined (don't trigger getter before init)\r\n if (!instance[initKey]) {\r\n return undefined;\r\n }\r\n return instance[hiddenKey];\r\n },\r\n set(this: unknown, newValue: unknown) {\r\n const instance = this as ComponentInstance;\r\n // On first set (during construction), just store the value\r\n if (!instance[initKey]) {\r\n instance[hiddenKey] = newValue;\r\n instance[initKey] = true;\r\n return;\r\n }\r\n\r\n const oldValue = instance[hiddenKey];\r\n\r\n if (oldValue !== newValue) {\r\n instance[hiddenKey] = newValue;\r\n\r\n // Invalidate all computed properties\r\n if (typeof instance._invalidateAllComputed === 'function') {\r\n instance._invalidateAllComputed();\r\n }\r\n\r\n // Trigger watchers with correct old/new values\r\n if (typeof instance._triggerWatchers === 'function') {\r\n instance._triggerWatchers(propertyKey, newValue, oldValue);\r\n }\r\n\r\n // Trigger update if component is mounted\r\n if (instance._isMounted && typeof instance.update === 'function') {\r\n instance.update();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n\r\n /**\r\n * Computed decorator - creates computed property\r\n * Usage: @computed get fullName() { return this.firstName + ' ' + this.lastName; }\r\n */\r\n export function computed<This, Value>(\r\n originalGetter: (this: This) => Value,\r\n context: ClassGetterDecoratorContext<This, Value>\r\n ): (this: This) => Value;\r\n export function computed(\r\n target: Record<string, unknown>,\r\n context: string,\r\n descriptor: PropertyDescriptor\r\n ): PropertyDescriptor;\r\n // Catch-all for invalid uses (like methods) to provide better error messages\r\n export function computed(\r\n targetOrGetter: unknown,\r\n context: unknown\r\n ): never;\r\n export function computed<This, Value>(\r\n targetOrGetter: Record<string, unknown> | ((this: This) => Value) | unknown,\r\n context: string | ClassGetterDecoratorContext<This, Value> | unknown,\r\n descriptor?: PropertyDescriptor\r\n ): unknown {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n const ctx = context as ClassGetterDecoratorContext<This, Value>;\r\n if (ctx.kind !== 'getter') {\r\n throw new Error('@computed can only be used on getters');\r\n }\r\n\r\n const originalGetter = targetOrGetter as (this: This) => Value;\r\n const propertyKey = ctx.name as string;\r\n const cacheKey = `_computed_cache_${propertyKey}`;\r\n const dirtyKey = `_computed_dirty_${propertyKey}`;\r\n\r\n return function(this: This): Value {\r\n const instance = this as Record<string, unknown>;\r\n // Initialize as dirty on first access\r\n if (instance[dirtyKey] === undefined) {\r\n instance[dirtyKey] = true;\r\n }\r\n\r\n // Recompute if dirty\r\n if (instance[dirtyKey] === true) {\r\n instance[cacheKey] = originalGetter.call(this);\r\n instance[dirtyKey] = false;\r\n }\r\n\r\n return instance[cacheKey] as Value;\r\n };\r\n }\r\n\r\n // Legacy decorator\r\n const propertyKey = context as string;\r\n if (!descriptor) {\r\n throw new Error('@computed requires a property descriptor');\r\n }\r\n\r\n const originalGetter = descriptor.get;\r\n\r\n if (!originalGetter) {\r\n throw new Error('@computed can only be used on getters');\r\n }\r\n\r\n const cacheKey = `_computed_cache_${propertyKey}`;\r\n const dirtyKey = `_computed_dirty_${propertyKey}`;\r\n\r\n return {\r\n get(this: unknown) {\r\n const instance = this as Record<string, unknown>;\r\n // Initialize as dirty on first access\r\n if (instance[dirtyKey] === undefined) {\r\n instance[dirtyKey] = true;\r\n }\r\n\r\n // Recompute if dirty\r\n if (instance[dirtyKey] === true) {\r\n instance[cacheKey] = originalGetter.call(this);\r\n instance[dirtyKey] = false;\r\n }\r\n\r\n return instance[cacheKey];\r\n },\r\n enumerable: descriptor.enumerable,\r\n configurable: descriptor.configurable,\r\n };\r\n }\r\n\r\n /**\r\n * Watch decorator - watches for property changes\r\n * Usage: @watch('propertyName') onPropertyChange(newValue, oldValue) {}\r\n */\r\n export function watch(propertyName: string) {\r\n function decorator<This, Args extends unknown[], Return>(\r\n originalMethod: (this: This, ...args: Args) => Return,\r\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>\r\n ): void;\r\n function decorator(\r\n target: Record<string, unknown>,\r\n context: string,\r\n descriptor: PropertyDescriptor\r\n ): PropertyDescriptor;\r\n function decorator<This, Args extends unknown[], Return>(\r\n targetOrMethod: Record<string, unknown> | ((this: This, ...args: Args) => Return),\r\n context: string | ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\r\n descriptor?: PropertyDescriptor\r\n ): PropertyDescriptor | void {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n if (context.kind !== 'method') {\r\n throw new Error('@watch can only be used on methods');\r\n }\r\n\r\n const methodName = context.name as string;\r\n\r\n context.addInitializer(function(this: unknown) {\r\n const instance = this as ComponentInstance;\r\n if (!instance.constructor.__watchers__) {\r\n instance.constructor.__watchers__ = {};\r\n }\r\n if (!instance.constructor.__watchers__[propertyName]) {\r\n instance.constructor.__watchers__[propertyName] = [];\r\n }\r\n if (!instance.constructor.__watchers__[propertyName].includes(methodName)) {\r\n instance.constructor.__watchers__[propertyName].push(methodName);\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Legacy decorator\r\n const methodName = context as string;\r\n if (!descriptor) {\r\n throw new Error('@watch requires a property descriptor');\r\n }\r\n\r\n const target = targetOrMethod as Record<string, unknown>;\r\n const targetConstructor = (target as { constructor: ComponentMetadata }).constructor;\r\n if (!targetConstructor.__watchers__) {\r\n targetConstructor.__watchers__ = {};\r\n }\r\n if (!targetConstructor.__watchers__[propertyName]) {\r\n targetConstructor.__watchers__[propertyName] = [];\r\n }\r\n if (!targetConstructor.__watchers__[propertyName].includes(methodName)) {\r\n targetConstructor.__watchers__[propertyName].push(methodName);\r\n }\r\n\r\n return descriptor;\r\n }\r\n\r\n return decorator;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/context.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from './component';\r\n import { html, type VNode } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ContextSubscriber<T> = (value: T) => void;\r\n\r\n export interface ProviderProps<T> {\r\n context: Context<T>;\r\n value: T;\r\n children: VNode | VNode[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Context class for sharing data across component tree\r\n */\r\n export class Context<T = unknown> {\r\n private _value: T;\r\n private _subscribers = new Set<ContextSubscriber<T>>();\r\n private _defaultValue: T;\r\n\r\n constructor(defaultValue: T) {\r\n this._value = defaultValue;\r\n this._defaultValue = defaultValue;\r\n }\r\n\r\n get value(): T {\r\n return this._value;\r\n }\r\n\r\n set value(newValue: T) {\r\n if (this._value !== newValue) {\r\n this._value = newValue;\r\n this._notify();\r\n }\r\n }\r\n\r\n subscribe(subscriber: ContextSubscriber<T>): () => void {\r\n this._subscribers.add(subscriber);\r\n\r\n // Immediately call with current value (wrapped in try-catch)\r\n try {\r\n subscriber(this._value);\r\n } catch (error) {\r\n console.error('Context subscriber error:', error);\r\n // Don't throw - the test expects this to not throw\r\n }\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this._subscribers.delete(subscriber);\r\n };\r\n }\r\n\r\n reset(): void {\r\n this.value = this._defaultValue;\r\n }\r\n\r\n update(updater: (prev: T) => T): void {\r\n this.value = updater(this._value);\r\n }\r\n\r\n private _notify(): void {\r\n for (const subscriber of this._subscribers) {\r\n try {\r\n subscriber(this._value);\r\n } catch (error) {\r\n console.error('Context subscriber error:', error);\r\n // Continue notifying other subscribers\r\n }\r\n }\r\n }\r\n\r\n get subscriberCount(): number {\r\n return this._subscribers.size;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new context\r\n */\r\n export function createContext<T>(defaultValue: T): Context<T> {\r\n return new Context(defaultValue);\r\n }\r\n\r\n export class Provider<T> extends Component<ProviderProps<T>> {\r\n onMount(): void {\r\n // Update context value\r\n this.props.context.value = this.props.value;\r\n }\r\n\r\n onUpdate(): void {\r\n // Update context when props change\r\n this.props.context.value = this.props.value;\r\n }\r\n\r\n onUnmount(): void {\r\n // Optionally reset context on unmount\r\n // this.props.context.reset();\r\n }\r\n\r\n render(): VNode {\r\n const children = Array.isArray(this.props.children)\r\n ? this.props.children\r\n : [this.props.children];\r\n\r\n return html`\r\n <div class=\"context-provider\" style=\"display: contents;\">\r\n ${children}\r\n </div>\r\n `;\r\n }\r\n }\r\n\r\n /**\r\n * Hook-like function to use context in components\r\n * Call this in your component to get context value\r\n */\r\n export function useContext<T>(context: Context<T>, component: Component): T {\r\n // Subscribe to context changes\r\n const unsubscribe = context.subscribe(() => {\r\n if (component.isMounted) {\r\n component.update();\r\n }\r\n });\r\n\r\n // Cleanup on unmount\r\n component.subscribe(() => unsubscribe);\r\n\r\n return context.value;\r\n }\r\n\r\n /**\r\n * Combined context for complex state management\r\n */\r\n export class CombinedContext<T extends Record<string, unknown>> {\r\n private contexts = new Map<keyof T, Context<T[keyof T]>>();\r\n\r\n constructor(initialValues: T) {\r\n for (const [key, value] of Object.entries(initialValues)) {\r\n this.contexts.set(key as keyof T, new Context(value) as unknown as Context<T[keyof T]>);\r\n }\r\n }\r\n\r\n get<K extends keyof T>(key: K): Context<T[K]> {\r\n const context = this.contexts.get(key);\r\n if (!context) {\r\n throw new Error(`Context key \"${String(key)}\" not found`);\r\n }\r\n return context as unknown as Context<T[K]>;\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n const context = this.contexts.get(key);\r\n if (context) {\r\n (context as unknown as Context<T[K]>).value = value;\r\n }\r\n }\r\n\r\n subscribe<K extends keyof T>(\r\n key: K,\r\n subscriber: ContextSubscriber<T[K]>\r\n ): () => void {\r\n const context = this.contexts.get(key);\r\n if (!context) {\r\n throw new Error(`Context key \"${String(key)}\" not found`);\r\n }\r\n return (context as unknown as Context<T[K]>).subscribe(subscriber);\r\n }\r\n\r\n reset(): void {\r\n for (const context of this.contexts.values()) {\r\n context.reset();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create combined context\r\n */\r\n export function createCombinedContext<T extends Record<string, unknown>>(\r\n initialValues: T\r\n ): CombinedContext<T> {\r\n return new CombinedContext(initialValues);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/hooks.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from './component';\r\n import type { VNode } from '../../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n interface HookState {\r\n value: unknown;\r\n deps?: unknown[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n let currentComponent: Component | null = null;\r\n let currentHookIndex: number = 0;\r\n const hookStates = new WeakMap<Component, HookState[]>();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Set current component context for hooks\r\n */\r\n export function setHookContext(component: Component): void {\r\n currentComponent = component;\r\n currentHookIndex = 0;\r\n }\r\n\r\n /**\r\n * Clear hook context\r\n */\r\n export function clearHookContext(): void {\r\n currentComponent = null;\r\n currentHookIndex = 0;\r\n }\r\n\r\n /**\r\n * Get or create hook states for component\r\n */\r\n function getHookStates(component: Component): HookState[] {\r\n if (!hookStates.has(component)) {\r\n hookStates.set(component, []);\r\n }\r\n return hookStates.get(component)!;\r\n }\r\n\r\n // ─── Core Hooks ───\r\n\r\n /**\r\n * useState hook - manages component state\r\n */\r\n export function useState<T>(initialValue: T | (() => T)): [T, (newValue: T | ((prev: T) => T)) => void] {\r\n if (!currentComponent) {\r\n throw new Error('useState must be called inside a component');\r\n }\r\n\r\n const component = currentComponent;\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(component);\r\n\r\n // Initialize state if first render\r\n if (states[hookIndex] === undefined) {\r\n states[hookIndex] = {\r\n value: typeof initialValue === 'function' ? (initialValue as () => T)() : initialValue\r\n };\r\n }\r\n\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const state = states[hookIndex];\r\n const nextValue = typeof newValue === 'function'\r\n ? (newValue as (prev: T) => T)(state.value as T)\r\n : newValue;\r\n\r\n if (state.value !== nextValue) {\r\n state.value = nextValue;\r\n component.update();\r\n }\r\n };\r\n\r\n return [states[hookIndex].value as T, setState];\r\n }\r\n\r\n /**\r\n * useEffect hook - side effects\r\n */\r\n export function useEffect(\r\n effect: () => void | (() => void),\r\n deps?: unknown[]\r\n ): void {\r\n if (!currentComponent) {\r\n throw new Error('useEffect must be called inside a component');\r\n }\r\n\r\n const component = currentComponent;\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(component);\r\n\r\n const prevState = states[hookIndex];\r\n const hasChanged = !prevState || !deps || !areDepsEqual(prevState.deps, deps);\r\n\r\n if (hasChanged) {\r\n // Cleanup previous effect\r\n if (prevState?.value && typeof prevState.value === 'function') {\r\n try {\r\n (prevState.value as () => void)();\r\n } catch (error) {\r\n console.error('Error in effect cleanup:', error);\r\n }\r\n }\r\n\r\n // Run new effect after a microtask (so it runs after render completes)\r\n Promise.resolve().then(() => {\r\n try {\r\n const cleanup = effect();\r\n\r\n // Store cleanup and deps\r\n states[hookIndex] = {\r\n value: cleanup,\r\n deps: deps ? [...deps] : undefined\r\n };\r\n } catch (error) {\r\n console.error('Error in effect:', error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * useMemo hook - memoize expensive computations\r\n */\r\n export function useMemo<T>(\r\n factory: () => T,\r\n deps: unknown[]\r\n ): T {\r\n if (!currentComponent) {\r\n throw new Error('useMemo must be called inside a component');\r\n }\r\n\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(currentComponent);\r\n\r\n const prevState = states[hookIndex];\r\n const hasChanged = !prevState || !areDepsEqual(prevState.deps, deps);\r\n\r\n if (hasChanged) {\r\n states[hookIndex] = {\r\n value: factory(),\r\n deps: [...deps]\r\n };\r\n }\r\n\r\n return states[hookIndex].value as T;\r\n }\r\n\r\n /**\r\n * useCallback hook - memoize callbacks\r\n */\r\n export function useCallback<T extends (...args: unknown[]) => unknown>(\r\n callback: T,\r\n deps: unknown[]\r\n ): T {\r\n return useMemo(() => callback, deps);\r\n }\r\n\r\n /**\r\n * useRef hook - persistent value across renders\r\n */\r\n export function useRef<T>(initialValue: T): { current: T } {\r\n if (!currentComponent) {\r\n throw new Error('useRef must be called inside a component');\r\n }\r\n\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(currentComponent);\r\n\r\n if (states[hookIndex] === undefined) {\r\n states[hookIndex] = {\r\n value: { current: initialValue }\r\n };\r\n }\r\n\r\n return states[hookIndex].value as { current: T };\r\n }\r\n\r\n /**\r\n * useReducer hook - complex state management\r\n */\r\n export function useReducer<S, A>(\r\n reducer: (state: S, action: A) => S,\r\n initialState: S\r\n ): [S, (action: A) => void] {\r\n const [state, setState] = useState(initialState);\r\n\r\n const dispatch = useCallback((action: unknown) => {\r\n setState(prevState => reducer(prevState, action as A));\r\n }, [reducer]) as (action: A) => void;\r\n\r\n return [state, dispatch];\r\n }\r\n\r\n // ─── Custom Hooks ───\r\n\r\n /**\r\n * useLocalStorage hook - sync state with localStorage\r\n */\r\n export function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T\r\n ): [T, (value: T | ((prev: T) => T)) => void] {\r\n // Initialize from localStorage\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n try {\r\n const item = window.localStorage.getItem(key);\r\n return item ? JSON.parse(item) as T : initialValue;\r\n } catch (error) {\r\n console.error('Error loading from localStorage:', error);\r\n return initialValue;\r\n }\r\n });\r\n\r\n // Create setValue wrapper (recreated each render, but that's okay)\r\n const setValue = (newValue: T | ((prev: T) => T)) => {\r\n setStoredValue((prevValue: T) => {\r\n const valueToStore = newValue instanceof Function\r\n ? newValue(prevValue)\r\n : newValue;\r\n\r\n // Update localStorage synchronously\r\n try {\r\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\r\n } catch (error) {\r\n console.error('Error saving to localStorage:', error);\r\n }\r\n\r\n return valueToStore;\r\n });\r\n };\r\n\r\n return [storedValue, setValue];\r\n }\r\n\r\n /**\r\n * useDebounce hook - debounce value changes\r\n */\r\n export function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState(value);\r\n\r\n useEffect(() => {\r\n // Set up the timeout\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n // Cleanup function that clears the timeout\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n }\r\n\r\n /**\r\n * usePrevious hook - get previous value\r\n */\r\n export function usePrevious<T>(value: T): T | undefined {\r\n const ref = useRef<T | undefined>(undefined);\r\n\r\n // Use effect to update the ref after render\r\n useEffect(() => {\r\n ref.current = value;\r\n });\r\n\r\n // Return the previous value (what ref was BEFORE this render)\r\n const prevValue = ref.current;\r\n\r\n return prevValue;\r\n }\r\n\r\n /**\r\n * useToggle hook - boolean toggle\r\n */\r\n export function useToggle(initialValue: boolean = false): [boolean, () => void] {\r\n const [value, setValue] = useState(initialValue);\r\n\r\n const toggle = useCallback(() => {\r\n setValue(v => !v);\r\n }, []);\r\n\r\n return [value, toggle];\r\n }\r\n\r\n /**\r\n * useInterval hook - setInterval with cleanup\r\n */\r\n export function useInterval(callback: () => void, delay: number | null): void {\r\n const savedCallback = useRef(callback);\r\n\r\n useEffect(() => {\r\n savedCallback.current = callback;\r\n }, [callback]);\r\n\r\n useEffect(() => {\r\n if (delay === null) return;\r\n\r\n const id = setInterval(() => savedCallback.current(), delay);\r\n\r\n return () => clearInterval(id);\r\n }, [delay]);\r\n }\r\n\r\n /**\r\n * useFetch hook - data fetching\r\n */\r\n export function useFetch<T>(\r\n url: string,\r\n options?: RequestInit\r\n ): {\r\n data: T | null;\r\n loading: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n } {\r\n const [data, setData] = useState<T | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const fetchData = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await fetch(url, options);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const json = await response.json() as T;\r\n setData(json);\r\n } catch (e) {\r\n setError(e as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [url]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n return { data, loading, error, refetch: fetchData };\r\n }\r\n\r\n /**\r\n * useWindowSize hook - track window dimensions\r\n */\r\n export function useWindowSize(): { width: number; height: number } {\r\n const [size, setSize] = useState({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setSize({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, []);\r\n\r\n return size;\r\n }\r\n\r\n /**\r\n * useEventListener hook - add event listener\r\n */\r\n export function useEventListener<K extends keyof WindowEventMap>(\r\n eventName: K,\r\n handler: (event: WindowEventMap[K]) => void,\r\n element: HTMLElement | Window = window\r\n ): void {\r\n const savedHandler = useRef(handler);\r\n\r\n useEffect(() => {\r\n savedHandler.current = handler;\r\n }, [handler]);\r\n\r\n useEffect(() => {\r\n const isSupported = element && 'addEventListener' in element;\r\n if (!isSupported) return;\r\n\r\n const eventListener = (event: Event) => {\r\n savedHandler.current(event as WindowEventMap[K]);\r\n };\r\n\r\n element.addEventListener(eventName, eventListener);\r\n\r\n return () => {\r\n element.removeEventListener(eventName, eventListener);\r\n };\r\n }, [eventName, element]);\r\n }\r\n\r\n /**\r\n * Create a functional component with hooks\r\n * Returns a component class that can be instantiated\r\n */\r\n export function createFunctionalComponent<P extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: (props: P) => VNode,\r\n displayName?: string\r\n ): new (props?: P) => Component<P> {\r\n class FunctionalComponent extends Component<P> {\r\n render(): VNode {\r\n setHookContext(this);\r\n try {\r\n return fn(this.props) as VNode;\r\n } finally {\r\n clearHookContext();\r\n }\r\n }\r\n }\r\n\r\n if (displayName) {\r\n Object.defineProperty(FunctionalComponent, 'name', { value: displayName });\r\n }\r\n\r\n return FunctionalComponent as new (props?: P) => Component<P>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n function areDepsEqual(prevDeps: unknown[] | undefined, nextDeps: unknown[]): boolean {\r\n if (!prevDeps || prevDeps.length !== nextDeps.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < prevDeps.length; i++) {\r\n if (prevDeps[i] !== nextDeps[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/router.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { Route, RouteConfig, NavigationGuard } from '../../types';\r\n import type { VNode } from '@je-es/vdom';\r\n import { Component, ComponentConstructor } from './component';\r\n import { createElement } from '@je-es/vdom';\r\n\r\n export type { Route, RouteConfig, NavigationGuard };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n // Type for lazy-loaded module\r\n interface LazyModule {\r\n default? : ComponentConstructor;\r\n HomePage? : ComponentConstructor;\r\n TodoPage? : ComponentConstructor;\r\n [key: string] : unknown;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n private routes: RouteConfig[] = [];\r\n private currentRoute: Route | null = null;\r\n private mode: 'history' | 'hash' = 'history';\r\n private base: string = '/';\r\n private beforeEachHooks: NavigationGuard[] = [];\r\n private afterEachHooks: ((to: Route, from: Route) => void)[] = [];\r\n private currentComponent: Component | null = null;\r\n private routerOutlet: HTMLElement | null = null;\r\n private isNavigating: boolean = false;\r\n private scrollBehavior: 'auto' | 'smooth' | 'instant' = 'auto';\r\n private notFoundHandler: (() => void) | null = null;\r\n private _internalPath: string | null = null;\r\n\r\n /**\r\n * Initialize router\r\n */\r\n init(\r\n routes: RouteConfig[],\r\n mode: 'history' | 'hash' = 'history',\r\n base: string = '/',\r\n scrollBehavior: 'auto' | 'smooth' | 'instant' = 'auto'\r\n ): void {\r\n this.routes = routes;\r\n this.mode = mode;\r\n this.base = base.endsWith('/') ? base.slice(0, -1) : base;\r\n this.scrollBehavior = scrollBehavior;\r\n\r\n this._initializeRouting();\r\n this._handleRoute();\r\n }\r\n\r\n /**\r\n * Navigate to a path\r\n */\r\n async push(path: string, state?: Record<string, unknown>): Promise<void> {\r\n if (this.isNavigating) {\r\n // console.warn('Navigation already in progress');\r\n this.isNavigating = false;\r\n // return;\r\n }\r\n\r\n this._internalPath = path;\r\n\r\n if (this.mode === 'history') {\r\n window.history.pushState(state || {}, '', this._buildFullPath(path));\r\n } else {\r\n window.location.hash = path;\r\n }\r\n\r\n await this._handleRoute();\r\n }\r\n\r\n /**\r\n * Replace current route\r\n */\r\n async replace(path: string, state?: Record<string, unknown>): Promise<void> {\r\n this._internalPath = path;\r\n\r\n if (this.mode === 'history') {\r\n window.history.replaceState(state || {}, '', this._buildFullPath(path));\r\n } else {\r\n window.location.hash = path;\r\n }\r\n\r\n return this._handleRoute();\r\n }\r\n\r\n back(): void { window.history.back(); }\r\n forward(): void { window.history.forward(); }\r\n go(delta: number): void { window.history.go(delta); }\r\n\r\n /**\r\n * Navigation guards\r\n */\r\n beforeEach(hook: NavigationGuard): void {\r\n this.beforeEachHooks.push(hook);\r\n }\r\n\r\n afterEach(hook: (to: Route, from: Route) => void): void {\r\n this.afterEachHooks.push(hook);\r\n }\r\n\r\n onNotFound(handler: () => void): void {\r\n this.notFoundHandler = handler;\r\n }\r\n\r\n /**\r\n * Route utilities\r\n */\r\n getCurrentRoute(): Route | null {\r\n return this.currentRoute ? { ...this.currentRoute } : null;\r\n }\r\n\r\n isActive(path: string, exact: boolean = false): boolean {\r\n if (!this.currentRoute) return false;\r\n return exact\r\n ? this.currentRoute.path === path\r\n : this.currentRoute.path.startsWith(path);\r\n }\r\n\r\n outlet(): VNode {\r\n return createElement('div', {\r\n 'data-router-outlet': 'true',\r\n style: 'display: contents;'\r\n }) as VNode;\r\n }\r\n\r\n getRoute(name: string): RouteConfig | undefined {\r\n return this.routes.find(r => r.name === name);\r\n }\r\n\r\n async pushNamed(name: string, params?: Record<string, string>): Promise<void> {\r\n const route = this.getRoute(name);\r\n if (!route) {\r\n console.error(`Route with name \"${name}\" not found`);\r\n return;\r\n }\r\n\r\n let path = route.path;\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n path = path.replace(`:${key}`, value);\r\n }\r\n }\r\n\r\n return this.push(path);\r\n }\r\n\r\n resolve(path: string): Route | null {\r\n const matchedRoute = this._matchRoute(path);\r\n if (!matchedRoute) return null;\r\n\r\n const { route, params } = matchedRoute;\r\n return {\r\n path,\r\n params,\r\n query: this._parseQuery(path),\r\n meta: route.meta || {},\r\n hash: path.includes('#') ? path.split('#')[1] : '',\r\n name: route.name,\r\n };\r\n }\r\n\r\n /**\r\n * Initialize routing handlers\r\n */\r\n private _initializeRouting(): void {\r\n // Handle browser navigation\r\n window.addEventListener('popstate', () => {\r\n this._internalPath = null;\r\n this._handleRoute();\r\n });\r\n\r\n if (this.mode === 'hash') {\r\n window.addEventListener('hashchange', () => {\r\n this._internalPath = null;\r\n this._handleRoute();\r\n });\r\n }\r\n\r\n // Intercept link clicks\r\n document.addEventListener('click', (e) => {\r\n const link = (e.target as HTMLElement).closest('a[href]') as HTMLAnchorElement | null;\r\n\r\n if (link && this._shouldInterceptLink(link)) {\r\n e.preventDefault();\r\n const href = link.getAttribute('href');\r\n if (href) {\r\n const path = this.mode === 'hash' && href.startsWith('#')\r\n ? href.substring(1)\r\n : href.replace(this.base, '');\r\n this.push(path);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _shouldInterceptLink(link: HTMLAnchorElement): boolean {\r\n const href = link.getAttribute('href');\r\n return !!(\r\n href &&\r\n link.hostname === window.location.hostname &&\r\n link.target !== '_blank' &&\r\n !link.hasAttribute('download') &&\r\n link.rel !== 'external'\r\n );\r\n }\r\n\r\n /**\r\n * Handle route change\r\n */\r\n private async _handleRoute(): Promise<void> {\r\n if (this.isNavigating) return;\r\n\r\n this.isNavigating = true;\r\n\r\n try {\r\n const path = this._getCurrentPath();\r\n const matchedRoute = this._matchRoute(path);\r\n\r\n if (!matchedRoute) {\r\n this._handleNotFound(path);\r\n return;\r\n }\r\n\r\n const { route, params } = matchedRoute;\r\n const to = this._buildRouteObject(path, params, route);\r\n const from = this.currentRoute || this._buildEmptyRoute();\r\n\r\n // Run guards\r\n const canProceed = await this._runNavigationGuards(route, to, from);\r\n if (!canProceed) return;\r\n\r\n this.currentRoute = to;\r\n\r\n await this._renderComponent(route);\r\n this._handleScrollBehavior(to, from);\r\n\r\n if (route.meta?.title && typeof route.meta.title === 'string') {\r\n document.title = route.meta.title;\r\n }\r\n\r\n // Run after hooks\r\n this.afterEachHooks.forEach(hook => hook(to, from));\r\n\r\n } catch (error) {\r\n console.error('Router error:', error);\r\n } finally {\r\n this.isNavigating = false;\r\n }\r\n }\r\n\r\n /**\r\n * Handle 404 not found\r\n */\r\n private _handleNotFound(path: string): void {\r\n console.warn(`No route matched for path: ${path}`);\r\n\r\n this.currentRoute = {\r\n path,\r\n params: {},\r\n query: this._parseQuery(),\r\n meta: {},\r\n hash: window.location.hash.substring(1),\r\n };\r\n\r\n if (this.notFoundHandler) {\r\n this.notFoundHandler();\r\n }\r\n }\r\n\r\n /**\r\n * Build route object\r\n */\r\n private _buildRouteObject(\r\n path: string,\r\n params: Record<string, string>,\r\n route: RouteConfig\r\n ): Route {\r\n return {\r\n path,\r\n params,\r\n query: this._parseQuery(),\r\n meta: route.meta || {},\r\n hash: window.location.hash.substring(1),\r\n name: route.name,\r\n };\r\n }\r\n\r\n private _buildEmptyRoute(): Route {\r\n return {\r\n path: '',\r\n params: {},\r\n query: {},\r\n meta: {},\r\n hash: '',\r\n };\r\n }\r\n\r\n /**\r\n * Run navigation guards\r\n */\r\n private async _runNavigationGuards(\r\n route: RouteConfig,\r\n to: Route,\r\n from: Route\r\n ): Promise<boolean> {\r\n // Route-specific guard\r\n if (route.beforeEnter) {\r\n const result = await this._runGuard(route.beforeEnter, to, from);\r\n if (!result) return false;\r\n }\r\n\r\n // Global guards\r\n for (const guard of this.beforeEachHooks) {\r\n const result = await this._runGuard(guard, to, from);\r\n if (!result) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _runGuard(\r\n guard: NavigationGuard,\r\n to: Route,\r\n from: Route\r\n ): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n guard(to, from, (nextPath?: string | false) => {\r\n if (nextPath === false) {\r\n resolve(false);\r\n } else if (typeof nextPath === 'string') {\r\n this.push(nextPath);\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Render component - simplified component resolution\r\n */\r\n private async _renderComponent(route: RouteConfig): Promise<void> {\r\n // Get or find outlet\r\n if (!this.routerOutlet) {\r\n this.routerOutlet = document.querySelector('[data-router-outlet=\"true\"]') as HTMLElement;\r\n if (!this.routerOutlet) {\r\n console.warn('Router outlet not found');\r\n return;\r\n }\r\n }\r\n\r\n // Unmount previous component\r\n if (this.currentComponent) {\r\n this.currentComponent.unmount();\r\n this.currentComponent = null;\r\n }\r\n\r\n // Clear outlet\r\n this.routerOutlet.innerHTML = '';\r\n\r\n try {\r\n const ComponentClass = await this._resolveComponent(route.component);\r\n\r\n if (!ComponentClass || typeof ComponentClass !== 'function') {\r\n throw new Error('Component is null or not a constructor');\r\n }\r\n\r\n const ComponentCtor = ComponentClass as new () => Component;\r\n // console.log('🎨 Mounting:', ComponentCtor.name || 'Component');\r\n this.currentComponent = new ComponentCtor();\r\n\r\n if (this.currentComponent) {\r\n await this.currentComponent.mount(this.routerOutlet);\r\n // console.log('✅ Mounted successfully!');\r\n }\r\n\r\n } catch (error) {\r\n this._renderError(route.path, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Resolve component (handle lazy loading)\r\n */\r\n private async _resolveComponent(\r\n component: ComponentConstructor | (() => Promise<LazyModule>)\r\n ): Promise<ComponentConstructor | null> {\r\n // console.log('🔍 Resolving component...');\r\n\r\n // Check if it's a class constructor\r\n if (typeof component === 'function') {\r\n // Try to determine if it's a class vs a loader function\r\n const hasPrototype = 'prototype' in component && component.prototype;\r\n const proto = hasPrototype ? (component as { prototype: unknown }).prototype : null;\r\n const hasConstructor = proto && typeof proto === 'object' && 'constructor' in proto;\r\n\r\n if (hasConstructor && (proto as { constructor: unknown }).constructor === component) {\r\n // console.log('✅ Direct component class');\r\n return component as ComponentConstructor;\r\n }\r\n\r\n // Otherwise treat as lazy loader\r\n // console.log('📦 Lazy loading...');\r\n try {\r\n const result = await (component as () => Promise<LazyModule>)();\r\n // console.log('📦 Module keys:', Object.keys(result));\r\n\r\n // Find component in module\r\n const found = result.HomePage ||\r\n result.TodoPage ||\r\n result.default ||\r\n Object.values(result).find((exp: unknown): exp is ComponentConstructor => {\r\n if (typeof exp !== 'function') return false;\r\n // Type guard: check if it's a constructor function\r\n const possibleCtor = exp as { prototype?: unknown };\r\n const proto = possibleCtor.prototype;\r\n return proto !== null && typeof proto === 'object' && proto !== undefined && 'constructor' in proto;\r\n });\r\n\r\n return found || null;\r\n } catch (error) {\r\n console.error('Failed to load lazy component:', error);\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Render error fallback\r\n */\r\n private _renderError(path: string, error: unknown): void {\r\n if (this.routerOutlet) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n this.routerOutlet.innerHTML = `\r\n <div style=\"padding: 2rem; background: #121212ff; border: 2px solid #303030ff;\r\n border-radius: 8px; margin: 2rem;\">\r\n <h2 style=\"color: rgba(208, 31, 31, 1); margin-top: 0;\">⚠️ Failed to Load Component</h2>\r\n <p style=\"color: #a3a3a3ff;\"><strong>Route:</strong> ${path}</p>\r\n <p style=\"color: #a3a3a3ff;\"><strong>Error:</strong> ${errorMessage}</p>\r\n </div>\r\n `;\r\n }\r\n }\r\n\r\n /**\r\n * Handle scroll behavior\r\n */\r\n private _handleScrollBehavior(to: Route, from: Route): void {\r\n if (to.hash) {\r\n const element = document.getElementById(to.hash);\r\n if (element) {\r\n element.scrollIntoView({ behavior: this.scrollBehavior });\r\n return;\r\n }\r\n }\r\n\r\n if (to.path !== from.path) {\r\n window.scrollTo({ top: 0, behavior: this.scrollBehavior });\r\n }\r\n }\r\n\r\n /**\r\n * Get current path (handles test environments)\r\n */\r\n private _getCurrentPath(): string {\r\n if (this._internalPath !== null) {\r\n return this._internalPath;\r\n }\r\n\r\n if (this.mode === 'hash') {\r\n return window.location.hash.substring(1).split('?')[0] || '/';\r\n }\r\n\r\n let path = window.location.pathname;\r\n\r\n // Handle test environments\r\n if (!path || path === 'blank' || path === 'about:blank') {\r\n path = '/';\r\n }\r\n\r\n if (this.base && path.startsWith(this.base)) {\r\n path = path.substring(this.base.length);\r\n }\r\n\r\n return path || '/';\r\n }\r\n\r\n private _buildFullPath(path: string): string {\r\n if (path.startsWith('http')) return path;\r\n const normalizedPath = path.startsWith('/') ? path : '/' + path;\r\n return this.base + normalizedPath;\r\n }\r\n\r\n /**\r\n * Match route pattern to path\r\n */\r\n private _matchRoute(path: string): { route: RouteConfig; params: Record<string, string> } | null {\r\n const cleanPath = path.split('?')[0].split('#')[0];\r\n\r\n for (const route of this.routes) {\r\n const params = this._matchPath(route.path, cleanPath);\r\n if (params !== null) {\r\n return { route, params };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _matchPath(pattern: string, path: string): Record<string, string> | null {\r\n if (pattern === '*') return {};\r\n if (pattern === path) return {};\r\n\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern\r\n .replace(/\\*/g, '.*')\r\n .replace(/:([^/]+)/g, (_, paramName: string) => {\r\n paramNames.push(paramName);\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n\r\n if (!match) return null;\r\n\r\n return paramNames.reduce((params, name, i) => {\r\n params[name] = decodeURIComponent(match[i + 1]);\r\n return params;\r\n }, {} as Record<string, string>);\r\n }\r\n\r\n /**\r\n * Parse query string\r\n */\r\n private _parseQuery(path?: string): Record<string, string> {\r\n const search = path\r\n ? path.includes('?') ? path.split('?')[1].split('#')[0] : ''\r\n : window.location.search.substring(1);\r\n\r\n if (!search) return {};\r\n\r\n return search.split('&').reduce((query, pair) => {\r\n const [key, value] = pair.split('=').map(decodeURIComponent);\r\n if (key) query[key] = value || '';\r\n return query;\r\n }, {} as Record<string, string>);\r\n }\r\n }\r\n\r\n export const router = new Router();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Navigate to a new route\r\n */\r\n export function navigate(path: string, replace: boolean = false): void {\r\n // console.log(`Navigating to ${path}`);\r\n if (replace) {\r\n router.replace(path);\r\n } else {\r\n router.push(path);\r\n }\r\n\r\n // Dispatch custom event for components listening to navigation\r\n window.dispatchEvent(new CustomEvent('navigation', {\r\n detail: { path }\r\n }));\r\n }\r\n\r\n /**\r\n * Navigate back in history\r\n */\r\n export function goBack(): void {\r\n router.back();\r\n }\r\n\r\n /**\r\n * Navigate forward in history\r\n */\r\n export function goForward(): void {\r\n window.history.forward();\r\n }\r\n\r\n /**\r\n * Get current path\r\n */\r\n export function getCurrentPath(): string {\r\n return window.location.pathname;\r\n }\r\n\r\n /**\r\n * Check if current path matches\r\n */\r\n export function isCurrentPath(path: string): boolean {\r\n return getCurrentPath() === path;\r\n }\r\n\r\n /**\r\n * Check if current path starts with\r\n */\r\n export function isCurrentPathPrefix(prefix: string): boolean {\r\n return getCurrentPath().startsWith(prefix);\r\n }\r\n\r\n /**\r\n * Reload current route\r\n */\r\n export function reloadRoute(): void {\r\n const currentPath = getCurrentPath();\r\n navigate(currentPath, true);\r\n }\r\n\r\n /**\r\n * Navigate with query params\r\n */\r\n export function navigateWithQuery(path: string, params: Record<string, string>): void {\r\n const query = new URLSearchParams(params).toString();\r\n navigate(`${path}?${query}`);\r\n }\r\n\r\n /**\r\n * Get query parameters\r\n */\r\n export function getQueryParams(): URLSearchParams {\r\n return new URLSearchParams(window.location.search);\r\n }\r\n\r\n /**\r\n * Get single query parameter\r\n */\r\n export function getQueryParam(key: string): string | null {\r\n return getQueryParams().get(key);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/store.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { StoreOptions, StoreSubscriber } from '../../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Store - Global state management with improved features\r\n */\r\n export class Store<T extends Record<string, unknown> = Record<string, unknown>> {\r\n private _state: T;\r\n private _subscribers = new Set<StoreSubscriber<T>>();\r\n private _persist: boolean;\r\n private _storage: Storage | null = null;\r\n private _storageKey: string;\r\n private _middleware: ((state: T, action?: string) => void)[] = [];\r\n private _isHydrating: boolean = false;\r\n\r\n constructor(options: StoreOptions<T>) {\r\n this._persist = options.persist ?? false;\r\n this._storageKey = options.storageKey || `store_${Date.now()}`;\r\n\r\n // Initialize storage\r\n if (this._persist && typeof window !== 'undefined') {\r\n this._storage = options.storage === 'sessionStorage'\r\n ? sessionStorage\r\n : localStorage;\r\n }\r\n\r\n // Load from storage if persisted\r\n if (this._persist && this._storage) {\r\n const stored = this._loadFromStorage();\r\n this._state = stored !== null ? stored : options.state;\r\n } else {\r\n this._state = options.state;\r\n }\r\n\r\n // Apply initial middleware\r\n if (options.middleware) {\r\n this._middleware = options.middleware;\r\n }\r\n }\r\n\r\n /**\r\n * Get current state (readonly)\r\n */\r\n get state(): Readonly<T> {\r\n return { ...this._state };\r\n }\r\n\r\n /**\r\n * Set entire state (replaces state)\r\n */\r\n set state(newState: T) {\r\n this.setState(newState);\r\n }\r\n\r\n /**\r\n * Update state (merges with existing state)\r\n */\r\n setState(update: Partial<T> | ((prevState: T) => Partial<T>), action?: string): void {\r\n const prevState = { ...this._state };\r\n\r\n const partialState = typeof update === 'function'\r\n ? update(prevState)\r\n : update;\r\n\r\n this._state = { ...prevState, ...partialState };\r\n\r\n // Apply middleware\r\n for (const middleware of this._middleware) {\r\n try {\r\n middleware(this._state, action);\r\n } catch (error) {\r\n console.error('Store middleware error:', error);\r\n }\r\n }\r\n\r\n // Persist to storage\r\n if (this._persist && !this._isHydrating) {\r\n this._saveToStorage();\r\n }\r\n\r\n // Notify subscribers\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Get a specific value from state\r\n */\r\n get<K extends keyof T>(key: K): T[K] {\r\n return this._state[key];\r\n }\r\n\r\n /**\r\n * Set a specific value in state\r\n */\r\n set<K extends keyof T>(key: K, value: T[K], action?: string): void {\r\n this.setState({ [key]: value } as unknown as Partial<T>, action);\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n * Returns unsubscribe function\r\n */\r\n subscribe(listener: StoreSubscriber<T>): () => void {\r\n this._subscribers.add(listener);\r\n\r\n // Immediately call listener with current state\r\n listener(this._state);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this._subscribers.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Subscribe to specific key changes\r\n */\r\n subscribeToKey<K extends keyof T>(\r\n key: K,\r\n listener: (value: T[K]) => void\r\n ): () => void {\r\n let prevValue = this._state[key];\r\n\r\n const subscriber = (state: T) => {\r\n const newValue = state[key];\r\n if (prevValue !== newValue) {\r\n prevValue = newValue;\r\n listener(newValue);\r\n }\r\n };\r\n\r\n return this.subscribe(subscriber);\r\n }\r\n\r\n /**\r\n * Add middleware\r\n */\r\n use(middleware: (state: T, action?: string) => void): void {\r\n this._middleware.push(middleware);\r\n }\r\n\r\n /**\r\n * Clear all state\r\n */\r\n clear(): void {\r\n this._state = {} as T;\r\n\r\n if (this._persist && this._storage) {\r\n try {\r\n this._storage.removeItem(this._storageKey);\r\n } catch (error) {\r\n console.error('Failed to clear storage:', error);\r\n }\r\n }\r\n\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Reset state to initial value\r\n */\r\n reset(initialState: T): void {\r\n this._state = { ...initialState };\r\n\r\n if (this._persist) {\r\n this._saveToStorage();\r\n }\r\n\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Hydrate state from storage\r\n */\r\n hydrate(): void {\r\n if (!this._persist || !this._storage) {\r\n console.warn('Cannot hydrate: persistence not enabled');\r\n return;\r\n }\r\n\r\n this._isHydrating = true;\r\n const stored = this._loadFromStorage();\r\n\r\n if (stored !== null) {\r\n this._state = stored;\r\n this._notify();\r\n }\r\n\r\n this._isHydrating = false;\r\n }\r\n\r\n /**\r\n * Get store snapshot for debugging\r\n */\r\n getSnapshot(): { state: T; subscribers: number; storageKey: string } {\r\n return {\r\n state: { ...this._state },\r\n subscribers: this._subscribers.size,\r\n storageKey: this._storageKey,\r\n };\r\n }\r\n\r\n /**\r\n * Batch multiple updates\r\n */\r\n batch(updates: () => void): void {\r\n const prevNotify = this._notify.bind(this);\r\n let shouldNotify = false;\r\n\r\n // Temporarily override notify\r\n this._notify = () => {\r\n shouldNotify = true;\r\n };\r\n\r\n try {\r\n updates();\r\n } finally {\r\n this._notify = prevNotify;\r\n if (shouldNotify) {\r\n this._notify();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Notify all subscribers\r\n */\r\n private _notify(): void {\r\n const stateCopy = { ...this._state };\r\n\r\n for (const subscriber of this._subscribers) {\r\n try {\r\n subscriber(stateCopy);\r\n } catch (error) {\r\n console.error('Store subscriber error:', error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load state from storage\r\n */\r\n private _loadFromStorage(): T | null {\r\n if (!this._storage) return null;\r\n\r\n try {\r\n const stored = this._storage.getItem(this._storageKey);\r\n return stored ? JSON.parse(stored) as T : null;\r\n } catch (error) {\r\n console.error('Failed to load from storage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Save state to storage\r\n */\r\n private _saveToStorage(): void {\r\n if (!this._storage) return;\r\n\r\n try {\r\n this._storage.setItem(this._storageKey, JSON.stringify(this._state));\r\n } catch (error) {\r\n console.error('Failed to save to storage:', error);\r\n\r\n // Handle quota exceeded\r\n if (error instanceof DOMException && error.name === 'QuotaExceededError') {\r\n console.warn('Storage quota exceeded');\r\n // Could implement cleanup strategy here\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy store and cleanup\r\n */\r\n destroy(): void {\r\n this._subscribers.clear();\r\n this._middleware = [];\r\n this._state = {} as T;\r\n }\r\n }\r\n\r\n /**\r\n * Create a store with type inference\r\n */\r\n export function createStore<T extends Record<string, unknown>>(\r\n options: StoreOptions<T>\r\n ): Store<T> {\r\n return new Store(options);\r\n }\r\n\r\n /**\r\n * Create a computed store that derives from other stores\r\n */\r\n export function createComputedStore<T, S extends Store<Record<string, unknown>>[]>(\r\n stores: S,\r\n computer: (...states: unknown[]) => T\r\n ): Store<{ value: T }> {\r\n const computedStore = createStore<{ value: T }>({\r\n state: { value: computer(...stores.map(s => s.state)) },\r\n });\r\n\r\n // Subscribe to all source stores\r\n for (const store of stores) {\r\n store.subscribe(() => {\r\n computedStore.setState({\r\n value: computer(...stores.map(s => s.state)),\r\n });\r\n });\r\n }\r\n\r\n return computedStore;\r\n }\r\n\r\n /**\r\n * Connect a component to a store\r\n */\r\n export function connect<T extends Record<string, unknown>, C extends { update?: () => void }>(\r\n store: Store<T>,\r\n component: C,\r\n mapStateToProps: (state: T) => Partial<C>\r\n ): () => void {\r\n const unsubscribe = store.subscribe((state) => {\r\n const props = mapStateToProps(state);\r\n Object.assign(component, props);\r\n\r\n // Trigger update if component has update method\r\n if (typeof component.update === 'function') {\r\n component.update();\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/client.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { ClientConfig } from '../../types';\r\n import type { ApiConfig as CapiConfigType } from '@je-es/capi';\r\n import { router } from './router';\r\n import { configureApi } from '@je-es/capi';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type { ClientConfig };\r\n\r\n // Bun build types\r\n interface BunBuildOptions {\r\n entrypoints: string[];\r\n outdir: string;\r\n target: string;\r\n minify?: boolean;\r\n sourcemap?: 'none' | 'external' | 'inline';\r\n splitting?: boolean;\r\n naming?: { entry?: string };\r\n external?: string[];\r\n }\r\n\r\n interface BunBuildResult {\r\n success: boolean;\r\n logs: {\r\n message: string;\r\n level: 'error' | 'warning' | 'info';\r\n }[];\r\n }\r\n\r\n declare const Bun: {\r\n build(options: BunBuildOptions): Promise<BunBuildResult>;\r\n };\r\n\r\n // Window type extension for dev tools\r\n declare global {\r\n interface Window {\r\n __JEES_DEV__?: {\r\n router: typeof router;\r\n config: ClientConfig;\r\n version: string;\r\n };\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Client builder\r\n * Handles build process and runtime configuration\r\n */\r\n export function client(config: ClientConfig) {\r\n // Store configuration\r\n const _config = config;\r\n\r\n return {\r\n /**\r\n * Build the client application\r\n * This compiles TypeScript components to vanilla JavaScript\r\n */\r\n async build(): Promise<void> {\r\n if (!_config.build) {\r\n console.warn('No build configuration provided');\r\n return;\r\n }\r\n\r\n console.log('🔨 Building @je-es/client application...');\r\n\r\n try {\r\n // Build JavaScript\r\n await this._buildJS();\r\n\r\n // Build SCSS/CSS\r\n await this._buildStyles();\r\n\r\n console.log('✅ Build completed successfully!');\r\n\r\n } catch (error) {\r\n console.error('❌ Build error:', error);\r\n throw error;\r\n }\r\n },\r\n\r\n /**\r\n * Build JavaScript bundle\r\n */\r\n async _buildJS(): Promise<void> {\r\n if (!_config.build) return;\r\n\r\n const result = await Bun.build({\r\n entrypoints : [_config.build.entry],\r\n outdir : _config.build.output.substring(0, _config.build.output.lastIndexOf('/')),\r\n target : 'browser',\r\n minify : _config.build.minify ?? false,\r\n sourcemap : _config.build.sourcemap ? 'external' : 'none',\r\n splitting : _config.build.optimization?.splitChunks ?? false,\r\n naming : {\r\n entry : _config.build.output.substring(_config.build.output.lastIndexOf('/') + 1),\r\n },\r\n // Exclude server-side packages from browser bundle\r\n external : [\r\n 'sass',\r\n 'fs',\r\n 'path',\r\n 'url',\r\n 'util',\r\n 'stream',\r\n 'buffer',\r\n 'events',\r\n 'crypto',\r\n 'os',\r\n 'child_process',\r\n ],\r\n });\r\n\r\n if (!result.success) {\r\n console.error('❌ JS Build failed:', result.logs);\r\n throw new Error('JS Build failed');\r\n }\r\n\r\n // console.log('📦 JavaScript bundled');\r\n },\r\n\r\n /**\r\n * Build SCSS/CSS styles\r\n */\r\n async _buildStyles(): Promise<void> {\r\n const stylesDir = _config.build?.styles?.input || './app/gui/style';\r\n const outputPath = _config.build?.styles?.output || './static/client.css';\r\n\r\n // Dynamically import server-side modules only when building\r\n const sass = await import('sass');\r\n const { writeFileSync, existsSync, mkdirSync } = await import('fs');\r\n const { join, dirname } = await import('path');\r\n\r\n const outputDir = dirname(outputPath);\r\n const outputFile = outputPath.split('/').pop() || 'client.css';\r\n\r\n // Main SCSS entry file\r\n const mainScssFile = join(stylesDir, 'index.scss');\r\n\r\n // Check if main entry file exists\r\n if (!existsSync(mainScssFile)) {\r\n console.log('⚠️ No index.scss found, skipping CSS build');\r\n return;\r\n }\r\n\r\n try {\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Compile the main SCSS file (it will automatically include all @use imports)\r\n const result = sass.compile(mainScssFile, {\r\n style: _config.build?.minify ? 'compressed' : 'expanded',\r\n sourceMap: _config.build?.sourcemap ? true : false,\r\n loadPaths: [stylesDir], // Allow SCSS to resolve @use paths\r\n });\r\n\r\n // Write compiled CSS\r\n const fullOutputPath = join(outputDir, outputFile);\r\n writeFileSync(fullOutputPath, result.css, 'utf-8');\r\n\r\n // console.log(`💅 Styles compiled to ${fullOutputPath}`);\r\n\r\n // Write source map if enabled\r\n if (_config.build?.sourcemap && result.sourceMap) {\r\n writeFileSync(\r\n `${fullOutputPath}.map`,\r\n JSON.stringify(result.sourceMap),\r\n 'utf-8'\r\n );\r\n }\r\n\r\n } catch (error) {\r\n console.error('❌ CSS Build failed:', error);\r\n throw error;\r\n }\r\n },\r\n\r\n /**\r\n * Recursively collect all SCSS files (excluding .sass)\r\n */\r\n async _collectScssFiles(dir: string): Promise<string[]> {\r\n const { readdirSync, statSync, existsSync } = await import('fs');\r\n const { join, extname } = await import('path');\r\n\r\n const files: string[] = [];\r\n\r\n if (!existsSync(dir)) {\r\n return files;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n // Recursively scan subdirectories\r\n files.push(...await this._collectScssFiles(fullPath));\r\n } else if (stat.isFile()) {\r\n const ext = extname(entry);\r\n // Only include .scss files, skip partials (starting with _)\r\n if (ext === '.scss' && !entry.startsWith('_')) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n\r\n // Sort files to ensure consistent order\r\n return files.sort();\r\n },\r\n\r\n /**\r\n * Watch mode for development\r\n */\r\n async watch(): Promise<void> {\r\n console.log('👀 Watching for changes...');\r\n\r\n // Initial build\r\n await this.build();\r\n\r\n // Watch for file changes\r\n const { watch } = await import('fs');\r\n const { dirname } = await import('path');\r\n const { existsSync } = await import('fs');\r\n\r\n // Watch TypeScript files\r\n if (_config.build?.entry) {\r\n const entryDir = dirname(_config.build.entry);\r\n watch(entryDir, { recursive: true }, async (eventType, filename) => {\r\n if (filename && (filename.endsWith('.ts') || filename.endsWith('.tsx'))) {\r\n console.log(`🔄 ${filename} changed, rebuilding JS...`);\r\n try {\r\n await this._buildJS();\r\n console.log('✅ JS rebuild complete');\r\n } catch (error) {\r\n console.error('❌ JS rebuild failed:', error);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Watch SCSS files\r\n const stylesDir = './app/style';\r\n if (existsSync(stylesDir)) {\r\n watch(stylesDir, { recursive: true }, async (eventType, filename) => {\r\n if (filename && filename.endsWith('.scss')) {\r\n console.log(`🔄 ${filename} changed, rebuilding CSS...`);\r\n try {\r\n await this._buildStyles();\r\n console.log('✅ CSS rebuild complete');\r\n } catch (error) {\r\n console.error('❌ CSS rebuild failed:', error);\r\n }\r\n }\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Initialize the client runtime\r\n * This runs in the browser\r\n */\r\n async init(): Promise<void> {\r\n console.log('🚀 [client] Initializing @je-es/client...');\r\n\r\n // i18n is now auto-loaded on DOM ready, no need to do it here\r\n // But we keep this for backward compatibility if someone wants to force-reload\r\n\r\n // Configure API client\r\n if (_config.api) {\r\n // Build the capi-compatible config\r\n const capiConfig: Partial<CapiConfigType> = {\r\n baseURL: _config.api.baseURL,\r\n timeout: _config.api.timeout,\r\n headers: _config.api.headers,\r\n };\r\n\r\n // Add interceptors if they exist\r\n if (_config.api.interceptors) {\r\n capiConfig.interceptors = {\r\n request: _config.api.interceptors.request || null,\r\n response: _config.api.interceptors.response || null,\r\n error: _config.api.interceptors.error || null,\r\n };\r\n }\r\n\r\n configureApi(capiConfig);\r\n }\r\n\r\n // Configure router\r\n if (_config.router && _config.app?.routes) {\r\n router.init(\r\n _config.app.routes,\r\n _config.router.mode,\r\n _config.router.base\r\n );\r\n\r\n if (_config.router.beforeEach) {\r\n router.beforeEach(_config.router.beforeEach);\r\n }\r\n\r\n if (_config.router.afterEach) {\r\n router.afterEach(_config.router.afterEach);\r\n }\r\n }\r\n\r\n // Mount root component\r\n if (_config.app?.root) {\r\n const rootElement = document.querySelector(_config.app.root);\r\n if (rootElement) {\r\n // console.log('✅ Client initialized successfully!');\r\n } else {\r\n console.error(`❌ Root element \"${_config.app.root}\" not found`);\r\n }\r\n }\r\n\r\n // Enable dev tools\r\n if (_config.devTools?.enabled) {\r\n this._enableDevTools();\r\n }\r\n },\r\n\r\n /**\r\n * Enable development tools\r\n */\r\n _enableDevTools(): void {\r\n // console.log('🛠️ Dev tools enabled');\r\n\r\n // Add dev tools to window\r\n window.__JEES_DEV__ = {\r\n router,\r\n config: _config,\r\n version: '0.0.1',\r\n };\r\n\r\n // // Log router changes\r\n // if (_config.devTools?.showRouterInfo) {\r\n // router.afterEach((to: Route, from: Route) => {\r\n // console.log('📍 Route changed:', {\r\n // from: from.path,\r\n // to: to.path,\r\n // params: to.params,\r\n // query: to.query,\r\n // });\r\n // });\r\n // }\r\n },\r\n\r\n /**\r\n * Get configuration\r\n */\r\n getConfig(): ClientConfig {\r\n return _config;\r\n },\r\n };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/services/i18n.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n import type { TranslationSet, LanguageCode, I18nConfig, VNode } from '../../types';\r\n import { createElement } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n class I18nManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private translations : TranslationSet = {};\r\n private currentLanguage : LanguageCode = 'en';\r\n private defaultLanguage : LanguageCode = 'en';\r\n private supportedLanguages : Set<LanguageCode> = new Set<LanguageCode>(['en']);\r\n private cachePath : string = '';\r\n private readyListeners : (() => void)[] = [];\r\n\r\n constructor(config?: I18nConfig) {\r\n if (config) {\r\n this.defaultLanguage = config.defaultLanguage || 'en';\r\n this.cachePath = config.staticPath || 'static/i18n';\r\n this.currentLanguage = this.getStoredLanguage() || config.defaultLanguage || 'en';\r\n\r\n if (config.supportedLanguages) {\r\n this.supportedLanguages = new Set(config.supportedLanguages);\r\n }\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Load translations for a specific language\r\n * @param lang Language code (e.g., 'en', 'ar', 'fr')\r\n * @param translations Translation object\r\n */\r\n public loadLanguage(lang: LanguageCode, translations: Record<string, string>): void {\r\n if (!this.translations[lang]) {\r\n this.translations[lang] = {};\r\n }\r\n this.translations[lang] = { ...this.translations[lang], ...translations };\r\n this.supportedLanguages.add(lang);\r\n }\r\n\r\n /**\r\n * Load all translations from static files\r\n * @param translations Object with language codes as keys and translation objects as values\r\n */\r\n public loadTranslations(translations: TranslationSet): void {\r\n Object.entries(translations).forEach(([lang, trans]) => {\r\n this.loadLanguage(lang, trans);\r\n });\r\n }\r\n\r\n /**\r\n * Set the current language\r\n * @param lang Language code\r\n */\r\n public setLanguage(lang: LanguageCode): void {\r\n if (this.supportedLanguages.has(lang)) {\r\n this.currentLanguage = lang;\r\n this.storeLanguage(lang);\r\n this.dispatchLanguageChangeEvent();\r\n } else if (this.supportedLanguages.has(this.defaultLanguage)) {\r\n this.currentLanguage = this.defaultLanguage;\r\n }\r\n }\r\n\r\n /**\r\n * Get the current language\r\n */\r\n public getLanguage(): LanguageCode {\r\n return this.currentLanguage;\r\n }\r\n\r\n /**\r\n * Get all supported languages\r\n */\r\n public getSupportedLanguages(): LanguageCode[] {\r\n return Array.from(this.supportedLanguages);\r\n }\r\n\r\n /**\r\n * Translate a key with smart parameter replacement\r\n * Supports nested translation keys as parameter values\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('hello') // => \"Hello\" or \"مرحبا\" depending on current language\r\n *\r\n * @example\r\n * // With parameters\r\n * t('welcome', { app_name: 'MyApp' })\r\n * // => \"Welcome to MyApp\"\r\n *\r\n * @example\r\n * // With nested translation keys as parameters\r\n * t('greeting', { salutation: 'hello' })\r\n * // => \"Say Hello to everyone\"\r\n *\r\n * @param key Translation key\r\n * @param params Optional parameters for replacement\r\n * @param defaultValue Optional default translation key\r\n * @returns Translated string with replaced parameters\r\n */\r\n public t(key: string, params?: Record<string, string>, defaultValue?: string): string {\r\n const lang = this.currentLanguage;\r\n\r\n let translation = this.getTranslation(key, defaultValue);\r\n\r\n if (params) {\r\n Object.entries(params).forEach(([param, value]) => {\r\n const paramValue =\r\n this.translations[lang]?.[value] ||\r\n this.translations[this.defaultLanguage]?.[value] ||\r\n value;\r\n\r\n translation = translation.replace(\r\n new RegExp(`\\\\{${param}\\\\}`, 'g'),\r\n paramValue\r\n );\r\n });\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n private getTranslation(key: string, defaultValue?: string): string {\r\n const lang = this.currentLanguage;\r\n\r\n // warn if not found\r\n if (!this.translations[lang]?.[key]) {\r\n console.warn(`Translation key not found: ${key}`);\r\n\r\n return defaultValue || key;\r\n }\r\n\r\n return this.translations[lang]?.[key] || this.translations[this.defaultLanguage]?.[key];\r\n }\r\n\r\n /**\r\n * Translate with a specific language (overrides current language temporarily)\r\n *\r\n * @param key Translation key\r\n * @param lang Language code\r\n * @param params Optional parameters\r\n * @returns Translated string\r\n */\r\n public tLang(key: string, lang: LanguageCode, params?: Record<string, string>): string {\r\n const currentLang = this.currentLanguage;\r\n this.currentLanguage = lang;\r\n const result = this.t(key, params);\r\n this.currentLanguage = currentLang;\r\n return result;\r\n }\r\n\r\n /**\r\n * Translate a key and convert HTML tags in the translation to VNode elements\r\n * Supports tags like <br>, <strong>, <em>, <b>, <i>, etc.\r\n * Useful for multiline translations with formatting\r\n *\r\n * @example\r\n * // Translation: \"Hello <br> World\"\r\n * tHtml('greeting') // => [text node, br element, text node]\r\n *\r\n * @param key Translation key\r\n * @param params Optional parameters for replacement\r\n * @returns Array of VNode and string elements that can be used as children\r\n */\r\n public tHtml(key: string, params?: Record<string, string>): (VNode | string)[] {\r\n const translation = this.t(key, params);\r\n return this.parseHtmlString(translation);\r\n }\r\n\r\n /**\r\n * Parse HTML string into VNode and text elements\r\n * Converts \\n and /n sequences to <br> tags\r\n * @private\r\n */\r\n private parseHtmlString(htmlString: string): (VNode | string)[] {\r\n // Replace both \\n and /n with <br> tags\r\n const processedString = htmlString.replace(/\\\\n|\\/n/g, '<br>');\r\n\r\n const result: (VNode | string)[] = [];\r\n const regex = /<([^/>]+)>([^<]*)<\\/\\1>|<([^/>]+)\\s*\\/?>|([^<]+)/g;\r\n let match;\r\n\r\n while ((match = regex.exec(processedString)) !== null) {\r\n const openingTag = match[1]; // For paired tags like <strong>text</strong>\r\n const pairedContent = match[2];\r\n const selfClosingTag = match[3]; // For self-closing tags like <br/>\r\n const textContent = match[4];\r\n\r\n if (textContent) {\r\n // Plain text content\r\n result.push(textContent);\r\n } else if (openingTag) {\r\n // Paired tag like <strong>text</strong>\r\n const tagName = openingTag.split(/\\s+/)[0].toLowerCase();\r\n result.push(createElement(tagName, {}, pairedContent));\r\n } else if (selfClosingTag) {\r\n // Self-closing tag like <br/> or <br>\r\n const tagName = selfClosingTag.trim().toLowerCase();\r\n result.push(createElement(tagName, {}));\r\n }\r\n }\r\n\r\n return result.length > 0 ? result : [htmlString];\r\n }\r\n\r\n /**\r\n * Get all translations for current language\r\n */\r\n public getTranslations(): Record<string, string> {\r\n return this.translations[this.currentLanguage] || {};\r\n }\r\n\r\n /**\r\n * Check if a translation key exists\r\n * @param key Translation key\r\n * @returns true if key exists in current or default language\r\n */\r\n public hasKey(key: string): boolean {\r\n return !!(\r\n this.translations[this.currentLanguage]?.[key] ||\r\n this.translations[this.defaultLanguage]?.[key]\r\n );\r\n }\r\n\r\n /**\r\n * Create a reactive translation function that listens to language changes\r\n * @param updateCallback Callback function to execute when language changes\r\n * @returns Function to unsubscribe from language changes\r\n */\r\n public createTranslator(updateCallback: () => void): () => void {\r\n const handler = () => updateCallback();\r\n if (typeof window !== 'undefined') {\r\n window.addEventListener('languagechange', handler);\r\n return () => window.removeEventListener('languagechange', handler);\r\n }\r\n return () => {};\r\n }\r\n\r\n /**\r\n * Load translations from URL(s)\r\n * Supports patterns like '/static/i18n/*.json' or specific URLs\r\n *\r\n * @example\r\n * // Load from a pattern\r\n * await loadFromUrl('/static/i18n/*.json');\r\n *\r\n * @example\r\n * // Load specific language files\r\n * await loadFromUrl(['/static/i18n/en.json', '/static/i18n/ar.json']);\r\n *\r\n * @param urlPattern String pattern or array of URLs\r\n * @returns Promise that resolves when all translations are loaded\r\n */\r\n public async loadFromUrl(urlPattern: string | string[]): Promise<void> {\r\n const urls = Array.isArray(urlPattern) ? urlPattern : [urlPattern];\r\n const translations: TranslationSet = {};\r\n // let loadedCount = 0;\r\n\r\n for (const url of urls) {\r\n if (url.includes('*')) {\r\n const pattern = url.replace('*.json', '');\r\n const langCodes = this.supportedLanguages;\r\n\r\n for (const lang of langCodes) {\r\n try {\r\n let fullUrl = `${pattern}${lang}.json`;\r\n\r\n if (typeof window !== 'undefined' && !fullUrl.startsWith('http')) {\r\n // Always use domain root + path, ignoring current page path\r\n fullUrl = window.location.origin + (fullUrl.startsWith('/') ? fullUrl : '/' + fullUrl);\r\n }\r\n\r\n const response = await fetch(fullUrl);\r\n if (response.ok) {\r\n const data = await response.json();\r\n translations[lang] = data;\r\n // loadedCount++;\r\n }\r\n } catch {\r\n // Silently continue on error\r\n }\r\n }\r\n } else {\r\n try {\r\n let fullUrl = url;\r\n\r\n if (typeof window !== 'undefined' && !fullUrl.startsWith('http')) {\r\n // Always use domain root + path, ignoring current page path\r\n fullUrl = window.location.origin + (fullUrl.startsWith('/') ? fullUrl : '/' + fullUrl);\r\n }\r\n\r\n const response = await fetch(fullUrl);\r\n if (response.ok) {\r\n const data = await response.json();\r\n const langMatch = url.match(/([a-z]{2,3})\\.json$/i);\r\n const lang = langMatch ? langMatch[1].toLowerCase() : 'en';\r\n translations[lang] = data;\r\n this.supportedLanguages.add(lang);\r\n // loadedCount++;\r\n }\r\n } catch {\r\n // Silently continue on error\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(translations).length > 0) {\r\n this.loadTranslations(translations);\r\n this.notifyReady();\r\n }\r\n }\r\n\r\n /**\r\n * Register a callback for when i18n is ready\r\n */\r\n public onReady(callback: () => void): void {\r\n if (Object.keys(this.translations).length > 0) {\r\n // Already loaded, call immediately\r\n callback();\r\n } else {\r\n // Not loaded yet, add to listeners\r\n this.readyListeners.push(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Notify all listeners that i18n is ready\r\n */\r\n private notifyReady(): void {\r\n for (const listener of this.readyListeners) {\r\n listener();\r\n }\r\n this.readyListeners = [];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Get language from localStorage\r\n */\r\n private getStoredLanguage(): LanguageCode | null {\r\n if (typeof localStorage !== 'undefined') {\r\n return (localStorage.getItem('app-language') as LanguageCode) || null;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Store language in localStorage\r\n */\r\n private storeLanguage(lang: LanguageCode): void {\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.setItem('app-language', lang);\r\n }\r\n }\r\n\r\n /**\r\n * Dispatch language change event\r\n */\r\n private dispatchLanguageChangeEvent(): void {\r\n if (typeof window !== 'undefined') {\r\n window.dispatchEvent(new CustomEvent('languagechange', { detail: { language: this.currentLanguage } }));\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // Singleton instance\r\n let i18nInstance: I18nManager | null = null;\r\n\r\n /**\r\n * Get the global i18n instance\r\n */\r\n export function getI18n(): I18nManager {\r\n if (!i18nInstance) {\r\n i18nInstance = new I18nManager();\r\n }\r\n return i18nInstance;\r\n }\r\n\r\n export { I18nManager };\r\n\r\n export type { TranslationSet, LanguageCode, I18nConfig };\r\n\r\n /**\r\n * Global translation function\r\n * @param key Translation key\r\n * @param params Optional parameters\r\n * @param defaultValue Optional default translation key\r\n * @returns Translated string\r\n */\r\n export function t(key: string, params?: Record<string, string>, defaultValue?: string): string {\r\n return getI18n().t(key, params, defaultValue);\r\n }\r\n\r\n /**\r\n * Translate with a specific language (overrides current language temporarily)\r\n * @param key Translation key\r\n * @param lang Language code\r\n * @param params Optional parameters\r\n * @returns Translated string\r\n */\r\n export function tLang(key: string, lang: string, params?: Record<string, string>): string {\r\n return getI18n().tLang(key, lang, params);\r\n }\r\n\r\n /**\r\n * Translate a key and convert HTML tags to VNode elements\r\n * Useful for multiline translations with formatting like <br>\r\n * @param key Translation key\r\n * @param params Optional parameters\r\n * @returns Array of VNode and string elements that can be used as children\r\n */\r\n export function tHtml(key: string, params?: Record<string, string>): (VNode | string)[] {\r\n return getI18n().tHtml(key, params);\r\n }\r\n\r\n /**\r\n * Set the current language globally (synchronous)\r\n * @param lang Language code\r\n */\r\n export function setLanguage(lang: string): void {\r\n getI18n().setLanguage(lang);\r\n }\r\n\r\n /**\r\n * Set the current language globally with lazy-loading support (asynchronous)\r\n * Use this when you want to lazy-load language files on demand\r\n * @param lang Language code\r\n * @param staticPath Path to language files for lazy-loading\r\n * @returns Promise that resolves when language is loaded and set\r\n */\r\n export async function setLanguageAsync(lang: string, staticPath?: string): Promise<void> {\r\n const manager = getI18n();\r\n\r\n // Check if language is already loaded\r\n const currentTranslations = manager.getTranslations();\r\n const isLanguageLoaded = Object.keys(currentTranslations).length > 0;\r\n\r\n if (!isLanguageLoaded && staticPath) {\r\n // Language not loaded yet, try to lazy-load it\r\n const baseUrl = staticPath.endsWith('/') ? staticPath : staticPath + '/';\r\n try {\r\n await manager.loadFromUrl(baseUrl + `${lang}.json`);\r\n } catch (error) {\r\n console.warn(`Failed to lazy-load language: ${lang}`, error);\r\n }\r\n }\r\n\r\n manager.setLanguage(lang);\r\n }\r\n\r\n /**\r\n * Get the current language\r\n */\r\n export function getCurrentLanguage(): string {\r\n return getI18n().getLanguage();\r\n }\r\n\r\n /**\r\n * Load translations for a specific language\r\n * @param lang Language code\r\n * @param translations Translation object\r\n */\r\n export function loadLanguage(lang: string, translations: Record<string, string>): void {\r\n getI18n().loadLanguage(lang, translations);\r\n }\r\n\r\n /**\r\n * Load all translations\r\n * @param translations The translations object\r\n */\r\n export function loadTranslations(translations: Record<string, Record<string, string>>): void {\r\n getI18n().loadTranslations(translations);\r\n }\r\n\r\n /**\r\n * Get all supported languages\r\n */\r\n export function getSupportedLanguages(): string[] {\r\n return getI18n().getSupportedLanguages();\r\n }\r\n\r\n /**\r\n * Check if a translation key exists\r\n * @param key The translation key to check\r\n * @returns Whether the key exists\r\n */\r\n export function hasKey(key: string): boolean {\r\n return getI18n().hasKey(key);\r\n }\r\n\r\n /**\r\n * Get all translations for current language\r\n */\r\n export function getTranslations(): Record<string, string> {\r\n return getI18n().getTranslations();\r\n }\r\n\r\n /**\r\n * Create a reactive translator that listens to language changes\r\n * @param updateCallback Callback function to execute when language changes\r\n * @returns Function to unsubscribe from language changes\r\n */\r\n export function createTranslator(updateCallback: () => void): () => void {\r\n return getI18n().createTranslator(updateCallback);\r\n }\r\n\r\n /**\r\n * Load translations from URL(s)\r\n * Supports patterns like '/static/i18n/*.json' or specific URLs\r\n *\r\n * @example\r\n * // Load from a pattern\r\n * await loadFromUrl('/static/i18n/*.json');\r\n *\r\n * @example\r\n * // Load specific language files\r\n * await loadFromUrl(['/static/i18n/en.json', '/static/i18n/ar.json']);\r\n *\r\n * @param urlPattern String pattern or array of URLs\r\n * @returns Promise that resolves when all translations are loaded\r\n */\r\n export async function loadFromUrl(urlPattern: string | string[]): Promise<void> {\r\n return getI18n().loadFromUrl(urlPattern);\r\n }\r\n\r\n /**\r\n * Initialize i18n synchronously (useful for testing)\r\n * Creates a new I18nManager instance with the provided config\r\n *\r\n * @param config I18n configuration\r\n *\r\n * @example\r\n * initializeI18n({\r\n * defaultLanguage: 'en',\r\n * supportedLanguages: ['en', 'ar']\r\n * });\r\n */\r\n export function initializeI18n(config?: I18nConfig): void {\r\n i18nInstance = new I18nManager(config);\r\n }\r\n\r\n /**\r\n * Setup i18n: Initialize and load the currently selected language\r\n * Uses stored language from localStorage if available, otherwise uses default\r\n * Other languages are lazy-loaded when setLanguage is called\r\n *\r\n * @param config I18n configuration\r\n * @returns Promise that resolves when the selected language is loaded\r\n *\r\n * @example\r\n * await setupI18n({\r\n * defaultLanguage: 'en',\r\n * supportedLanguages: ['en', 'ar'],\r\n * staticPath: 'static/i18n'\r\n * });\r\n * console.log(t('hello')); // Ready to use in current language!\r\n */\r\n export async function setupI18n(config: I18nConfig): Promise<void> {\r\n // Initialize i18n with config\r\n const manager = new I18nManager(config);\r\n i18nInstance = manager;\r\n\r\n // Load the CURRENT language (stored or default)\r\n if (config.staticPath) {\r\n const baseUrl = config.staticPath.endsWith('/')\r\n ? config.staticPath\r\n : config.staticPath + '/';\r\n\r\n // Get the language to load: stored language or default\r\n const langToLoad = manager.getLanguage();\r\n const langUrl = baseUrl + `${langToLoad}.json`;\r\n\r\n await manager.loadFromUrl(langUrl);\r\n }\r\n }\r\n\r\n /**\r\n * Load a specific language file on-demand\r\n * Use this when user switches to a language that hasn't been loaded yet\r\n *\r\n * @param lang Language code (e.g., 'ar', 'fr')\r\n * @param staticPath Optional path to language files (defaults to 'static/i18n')\r\n * @returns Promise that resolves when language is loaded\r\n *\r\n * @example\r\n * // User switches to Arabic - load it first if not already loaded\r\n * await loadLanguageFile('ar');\r\n * setLanguage('ar');\r\n */\r\n export async function loadLanguageFile(lang: string, staticPath?: string): Promise<void> {\r\n const manager = getI18n();\r\n const path = staticPath || 'static/i18n';\r\n const baseUrl = path.endsWith('/') ? path : path + '/';\r\n const langUrl = baseUrl + lang + '.json';\r\n\r\n await manager.loadFromUrl(langUrl);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/components/toast.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, html } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n export type ToastType = 'success' | 'error' | 'info' | 'warning';\r\n\r\n export interface ToastMessage {\r\n id: number;\r\n message: string;\r\n type: ToastType;\r\n translateKey?: string;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n toast: 'bb_toast',\r\n container: 'bb_toastContainer',\r\n icon: 'bb_toastIcon',\r\n msg: 'bb_toastMsg'\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Toast extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state messages: ToastMessage[] = [];\r\n\r\n private nextId = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Show a toast notification\r\n */\r\n show(message: string, type: ToastType = 'info', duration: number = 2000, translateKey?: string) {\r\n const id = this.nextId++;\r\n\r\n this.messages = [...this.messages, { id, message, type, translateKey }];\r\n\r\n setTimeout(() => {\r\n this.messages = this.messages.filter(m => m.id !== id);\r\n }, duration);\r\n }\r\n\r\n /**\r\n * Convenience methods\r\n */\r\n success(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'success', duration, translateKey);\r\n }\r\n\r\n error(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'error', duration, translateKey);\r\n }\r\n\r\n info(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'info', duration, translateKey);\r\n }\r\n\r\n warning(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'warning', duration, translateKey);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n if (this.messages.length === 0) return html``;\r\n\r\n return createElement('div', {\r\n className: bb_.container\r\n },\r\n ...this.messages.map(msg => this.renderToast(msg))\r\n );\r\n }\r\n\r\n renderToast(msg: ToastMessage) {\r\n const icons = {\r\n success: 'fas fa-check-circle',\r\n error: 'fas fa-exclamation-circle',\r\n info: 'fas fa-info-circle',\r\n warning: 'fas fa-exclamation-triangle'\r\n };\r\n\r\n const displayMessage = msg.translateKey ? t(msg.translateKey) : msg.message;\r\n\r\n return createElement('div', {\r\n key: String(msg.id),\r\n className: `${bb_.toast} ${bb_.toast}--${msg.type}`,\r\n 'data-translate': msg.translateKey || undefined\r\n },\r\n createElement('i', {\r\n className: `${icons[msg.type]} ${bb_.icon}`\r\n }),\r\n createElement('span', {\r\n className: bb_.msg\r\n }, displayMessage)\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOB ════════════════════════════════════════╗\r\n\r\n let globalToast: Toast | null = null;\r\n\r\n export function initToast(container?: HTMLElement): Toast {\r\n if (globalToast) return globalToast;\r\n\r\n const toastContainer = container || document.createElement('div');\r\n if (!container) {\r\n document.body.appendChild(toastContainer);\r\n }\r\n\r\n globalToast = new Toast();\r\n globalToast.mount(toastContainer);\r\n\r\n return globalToast;\r\n }\r\n\r\n export function getToast(): Toast {\r\n if (!globalToast) {\r\n globalToast = initToast();\r\n }\r\n return globalToast;\r\n }\r\n\r\n // Convenience exports\r\n export const toast = {\r\n show: (message: string, type: ToastType = 'info', duration?: number, translateKey?: string) => {\r\n getToast().show(message, type, duration, translateKey);\r\n },\r\n success: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().success(message, duration, translateKey);\r\n },\r\n error: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().error(message, duration, translateKey);\r\n },\r\n info: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().info(message, duration, translateKey);\r\n },\r\n warning: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().warning(message, duration, translateKey);\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/loader.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n export type LoaderSize = 'small' | 'medium' | 'large';\r\n export type LoaderVariant = 'spinner' | 'dots' | 'pulse';\r\n\r\n export interface LoaderOptions {\r\n message? : string;\r\n variant? : LoaderVariant;\r\n size? : LoaderSize;\r\n overlay? : boolean;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n loader: {\r\n container : 'bb_loaderContainer',\r\n containerOverlay : 'bb_loaderContainer--overlay',\r\n bg : 'bb_loaderBg',\r\n loader : 'bb_loader',\r\n },\r\n\r\n spinner: {\r\n container : 'bb_loaderSpinnerContainer',\r\n icon : 'bb_loaderSpinnerIcon',\r\n dot : 'bb_loaderSpinnerDot',\r\n pulse : 'bb_loaderSpinnerPulse',\r\n text : 'bb_loaderSpinnerText',\r\n },\r\n\r\n progress: {\r\n container : 'bb_loaderProgressContainer',\r\n bar : 'bb_loaderProgressBar',\r\n text : 'bb_loaderProgressText',\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Loader extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state visible = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state message = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state variant : LoaderVariant = 'spinner';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state size : LoaderSize = 'medium';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state overlay = true;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state progress = 0;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state showProgress = false;\r\n\r\n private animationFrame : number | null = null;\r\n private hideTimeout : number | null = null;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n this.setupKeyboardListener();\r\n this.initializeAccessibility();\r\n\r\n window.addEventListener('languagechange', () => {\r\n if (!this.message) {\r\n this.update();\r\n }\r\n });\r\n }\r\n\r\n onUnmount() {\r\n if (this.animationFrame) {\r\n cancelAnimationFrame(this.animationFrame);\r\n }\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n document.removeEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n const containerClasses = [\r\n bb_.loader.container,\r\n this.overlay ? `${bb_.loader.containerOverlay}` : '',\r\n `${bb_.loader.container}--${this.size}`\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', {\r\n className: containerClasses,\r\n 'data-status': this.visible ? 'visible' : 'hidden',\r\n role: 'status',\r\n 'aria-live': 'polite',\r\n 'aria-busy': 'true',\r\n },\r\n // bg for blur\r\n createElement('div', { className: bb_.loader.bg }),\r\n\r\n createElement('div', { className: bb_.loader.loader },\r\n this.renderSpinner(),\r\n this.renderMessage(),\r\n this.showProgress ? this.renderProgressBar() : null\r\n )\r\n );\r\n }\r\n\r\n renderSpinner() {\r\n const spinnerClass = `${bb_.spinner.container} ${bb_.spinner.container}--${this.variant}`;\r\n\r\n switch (this.variant) {\r\n case 'dots':\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.dot }),\r\n createElement('div', { className: bb_.spinner.dot }),\r\n createElement('div', { className: bb_.spinner.dot })\r\n );\r\n\r\n case 'pulse':\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.pulse })\r\n );\r\n\r\n case 'spinner':\r\n default:\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.icon })\r\n );\r\n }\r\n }\r\n\r\n renderMessage() {\r\n const text = this.message || t('global.loading');\r\n\r\n return createElement('div', {\r\n className: bb_.spinner.text,\r\n 'data-translate': this.message ? undefined : 'global.loading'\r\n }, text);\r\n }\r\n\r\n renderProgressBar() {\r\n return createElement('div', { className: bb_.progress.container },\r\n createElement('div', {\r\n className: bb_.progress.bar,\r\n style: `width: ${this.progress}%`,\r\n 'aria-valuenow': this.progress.toString(),\r\n 'aria-valuemin': '0',\r\n 'aria-valuemax': '100'\r\n }),\r\n createElement('div', { className: bb_.progress.text },\r\n `${Math.round(this.progress)}%`\r\n )\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CTRL ──────────────────────────────┐\r\n\r\n show(options?: LoaderOptions | string) {\r\n if (typeof options === 'string') {\r\n this.message = options;\r\n } else if (options) {\r\n this.message = options.message || '';\r\n this.variant = options.variant || 'spinner';\r\n this.size = options.size || 'medium';\r\n this.overlay = options.overlay !== undefined ? options.overlay : true;\r\n }\r\n\r\n this.visible = true;\r\n this.progress = 0;\r\n this.showProgress = false;\r\n\r\n this.applyBodyLock();\r\n this.update();\r\n }\r\n\r\n hide(delay: number = 0) {\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if (delay > 0) {\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.performHide();\r\n }, delay);\r\n } else {\r\n this.performHide();\r\n }\r\n }\r\n\r\n setMessage(message: string) {\r\n this.message = message;\r\n this.update();\r\n }\r\n\r\n setProgress(progress: number) {\r\n this.showProgress = true;\r\n this.progress = Math.max(0, Math.min(100, progress));\r\n this.update();\r\n }\r\n\r\n updateProgress(increment: number) {\r\n this.setProgress(this.progress + increment);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private performHide() {\r\n this.visible = false;\r\n this.message = '';\r\n this.progress = 0;\r\n this.showProgress = false;\r\n\r\n this.removeBodyLock();\r\n this.update();\r\n }\r\n\r\n private applyBodyLock() {\r\n if (this.overlay) {\r\n document.body.style.overflow = 'hidden';\r\n }\r\n }\r\n\r\n private removeBodyLock() {\r\n document.body.style.overflow = '';\r\n }\r\n\r\n private setupKeyboardListener() {\r\n this.handleKeyPress = this.handleKeyPress.bind(this);\r\n document.addEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n private handleKeyPress = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this.visible && !this.overlay) {\r\n this.hide();\r\n }\r\n };\r\n\r\n private initializeAccessibility() {\r\n const container = this.element?.querySelector(`.${bb_.spinner.container}`);\r\n if (container) {\r\n container.setAttribute('aria-label', t('loading'));\r\n }\r\n }\r\n\r\n isVisible(): boolean {\r\n return this.visible;\r\n }\r\n\r\n getStatus(): { visible: boolean; message: string; progress: number } {\r\n return {\r\n visible: this.visible,\r\n message: this.message,\r\n progress: this.progress\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/smart_form.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from '../core/component';\r\n import { html } from '@je-es/vdom';\r\n import type { FormFieldOption, VNode } from '../../types';\r\n import { css } from '../core/styles';\r\n import { state } from '../core/decorators';\r\n import { api } from '@je-es/capi';\r\n import type { FormFieldConfig, ValidationRule } from '../../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type { FormFieldConfig, ValidationRule };\r\n\r\n export interface FormConfig {\r\n fields: FormFieldConfig[];\r\n endpoint?: string;\r\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n onSubmit?: (data: Record<string, unknown>, event: Event) => void | Promise<void>;\r\n onSuccess?: (data: unknown) => void;\r\n onError?: (error: unknown) => void;\r\n onValidationError?: (errors: Record<string, string>) => void;\r\n submitButton?: {\r\n label?: string;\r\n loadingLabel?: string;\r\n className?: string;\r\n };\r\n className?: string;\r\n autoValidate?: boolean;\r\n }\r\n\r\n export interface FormField extends FormFieldConfig {\r\n error?: string;\r\n touched?: boolean;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * SmartForm Component\r\n * Auto-validation, CSRF protection, API submission\r\n */\r\n export class SmartFormComponent extends Component<FormConfig> {\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state fields: FormField[] = [];\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state formData: Record<string, unknown> = {};\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state isSubmitting = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state submitError = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state submitSuccess = false;\r\n\r\n constructor(props: FormConfig) {\r\n super(props);\r\n\r\n // Initialize fields immediately in constructor\r\n this.fields = this.props.fields.map((field: FormFieldConfig) => ({\r\n ...field,\r\n error: undefined,\r\n touched: false,\r\n })) as FormField[];\r\n\r\n // Initialize form data\r\n for (const field of this.fields) {\r\n this.formData[field.name] = field.value || '';\r\n }\r\n }\r\n\r\n onMount(): void {\r\n // console.log('📝 SmartForm mounted with', this.fields.length, 'fields');\r\n }\r\n\r\n /**\r\n * Handle field change\r\n */\r\n handleChange(fieldName: string, value: unknown): void {\r\n this.formData[fieldName] = value;\r\n\r\n // Auto-validate if enabled\r\n const field = this.fields.find(f => f.name === fieldName);\r\n if (field && this.props.autoValidate) {\r\n field.error = this.validateField(field, value);\r\n field.touched = true;\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Handle field blur\r\n */\r\n handleBlur(fieldName: string): void {\r\n const field = this.fields.find(f => f.name === fieldName);\r\n if (field) {\r\n field.touched = true;\r\n field.error = this.validateField(field, this.formData[fieldName]);\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Validate single field\r\n */\r\n validateField(field: FormField, value: unknown): string | undefined {\r\n const validation = field.validation;\r\n if (!validation) return undefined;\r\n\r\n // Required\r\n if (validation.required && !value) {\r\n return validation.message || `${field.label || field.name} is required`;\r\n }\r\n\r\n if (!value) return undefined;\r\n\r\n // Convert to string for string validations\r\n const stringValue = String(value);\r\n\r\n // Min length\r\n if (validation.minLength && stringValue.length < validation.minLength) {\r\n return validation.message || `Minimum ${validation.minLength} characters required`;\r\n }\r\n\r\n // Max length\r\n if (validation.maxLength && stringValue.length > validation.maxLength) {\r\n return validation.message || `Maximum ${validation.maxLength} characters allowed`;\r\n }\r\n\r\n // Min value\r\n if (validation.min !== undefined && Number(value) < validation.min) {\r\n return validation.message || `Minimum value is ${validation.min}`;\r\n }\r\n\r\n // Max value\r\n if (validation.max !== undefined && Number(value) > validation.max) {\r\n return validation.message || `Maximum value is ${validation.max}`;\r\n }\r\n\r\n // Pattern\r\n if (validation.pattern && !validation.pattern.test(stringValue)) {\r\n return validation.message || 'Invalid format';\r\n }\r\n\r\n // Email\r\n if (validation.email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(stringValue)) {\r\n return validation.message || 'Invalid email address';\r\n }\r\n\r\n // URL\r\n if (validation.url && !/^https?:\\/\\/.+/.test(stringValue)) {\r\n return validation.message || 'Invalid URL';\r\n }\r\n\r\n // Custom validation\r\n if (validation.custom) {\r\n const result = validation.custom(value);\r\n if (result !== true) {\r\n return typeof result === 'string' ? result : 'Validation failed';\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Validate all fields\r\n */\r\n validateForm(): boolean {\r\n let isValid = true;\r\n const errors: Record<string, string> = {};\r\n\r\n for (const field of this.fields) {\r\n const error = this.validateField(field, this.formData[field.name]);\r\n field.error = error;\r\n field.touched = true;\r\n\r\n if (error) {\r\n isValid = false;\r\n errors[field.name] = error;\r\n }\r\n }\r\n\r\n this.update();\r\n\r\n // Call validation error callback\r\n if (!isValid && this.props.onValidationError) {\r\n this.props.onValidationError(errors);\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(event: Event): Promise<void> {\r\n event.preventDefault();\r\n\r\n // Validate form\r\n if (!this.validateForm()) {\r\n // Focus first error field\r\n const firstErrorField = this.fields.find(f => f.error);\r\n if (firstErrorField) {\r\n const element = document.querySelector(`[name=\"${firstErrorField.name}\"]`) as HTMLElement;\r\n element?.focus();\r\n }\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.submitError = '';\r\n this.submitSuccess = false;\r\n this.update();\r\n\r\n try {\r\n // Custom submit handler\r\n if (this.props.onSubmit) {\r\n await this.props.onSubmit(this.formData, event);\r\n }\r\n // API submission\r\n else if (this.props.endpoint) {\r\n const response = await api({\r\n method: this.props.method || 'POST',\r\n url: this.props.endpoint,\r\n data: this.formData,\r\n });\r\n\r\n this.submitSuccess = true;\r\n\r\n if (this.props.onSuccess) {\r\n this.props.onSuccess(response.data);\r\n }\r\n }\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Submission failed';\r\n this.submitError = errorMessage;\r\n\r\n if (this.props.onError) {\r\n this.props.onError(error);\r\n }\r\n } finally {\r\n this.isSubmitting = false;\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Render label with optional icon\r\n */\r\n renderLabel(field: FormField): VNode | string {\r\n if (!field.label && !field.icon) return '';\r\n\r\n if (field.icon) {\r\n return html`\r\n <label for=${field.name}>\r\n <i class=\"fa ${field.icon}\"></i>\r\n ${field.label ? html`<span>${field.label}</span>` : ''}\r\n </label>\r\n ` as VNode;\r\n }\r\n\r\n return html`<label for=${field.name}>${field.label}</label>` as VNode;\r\n }\r\n\r\n /**\r\n * Render form field\r\n */\r\n renderField(field: FormField): VNode {\r\n const value = this.formData[field.name] || '';\r\n const labelNode = this.renderLabel(field);\r\n\r\n switch (field.type) {\r\n case 'textarea': {\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <textarea\r\n id=${field.name}\r\n name=${field.name}\r\n placeholder=${field.placeholder || ''}\r\n value=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n oninput=${(e: Event) => {\r\n const target = e.target as HTMLTextAreaElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldTextarea\"\r\n ></textarea>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n case 'select': {\r\n const options = field.options || [];\r\n const optionNodes = options.map((opt: FormFieldOption) => html`\r\n <option value=${String(opt.value)}>${opt.label}</option>\r\n `);\r\n\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <select\r\n id=${field.name}\r\n name=${field.name}\r\n value=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n onchange=${(e: Event) => {\r\n const target = e.target as HTMLSelectElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldSelect\"\r\n >\r\n <option value=\"\">Select...</option>\r\n ${optionNodes}\r\n </select>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n case 'checkbox': {\r\n return html`\r\n <div class=\"bb_formField bb_formField-checkbox ${field.className || ''}\">\r\n <label>\r\n <input\r\n type=\"checkbox\"\r\n id=${field.name}\r\n name=${field.name}\r\n checked=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n onchange=${(e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n this.handleChange(field.name, target.checked);\r\n }}\r\n class=\"bb_formFieldCheckbox\"\r\n />\r\n ${field.icon ? html`<i class=\"fa ${field.icon}\"></i>` : ''}\r\n ${field.label || ''}\r\n </label>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n default: {\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <input\r\n type=\"${field.type || 'text'}\"\r\n id=\"${field.name}\"\r\n name=\"${field.name}\"\r\n placeholder=\"${field.placeholder || ''}\"\r\n value=\"${String(value)}\"\r\n disabled=\"${field.disabled || this.isSubmitting}\"\r\n oninput=${(e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldInput\"\r\n />\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n }\r\n }\r\n\r\n render(): VNode {\r\n const submitButton = this.props.submitButton || {};\r\n\r\n // Render all fields into an array first\r\n const fieldNodes = this.fields.map((field: FormField) => this.renderField(field));\r\n\r\n return html`\r\n <form\r\n class=\"smart_form ${this.props.className || ''}\"\r\n onsubmit=${(e: Event) => this.handleSubmit(e)}\r\n >\r\n ${this.submitError ? html`\r\n <div class=\"alert alert-error\">${this.submitError}</div>\r\n ` : ''}\r\n\r\n ${this.submitSuccess ? html`\r\n <div class=\"alert alert-success\">Submitted successfully!</div>\r\n ` : ''}\r\n\r\n ${fieldNodes}\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"submit-button ${submitButton.className || ''}\"\r\n disabled=${String(this.isSubmitting)}\r\n >\r\n ${this.isSubmitting\r\n ? (submitButton.loadingLabel || 'Submitting...')\r\n : (submitButton.label || 'Submit')\r\n }\r\n </button>\r\n </form>\r\n ` as VNode;\r\n }\r\n\r\n styles() { return css``; }\r\n }\r\n\r\n /**\r\n * SmartForm helper function\r\n */\r\n export function SmartForm(config: FormConfig): VNode {\r\n const form = new SmartFormComponent(config);\r\n return form.render();\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/popup.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, VNode } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t, tHtml } from \"../services/i18n\";\r\n import { FormConfig, SmartForm } from \"./smart_form\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type PopupType = 'confirm' | 'alert' | 'form' | 'custom' | 'prompt';\r\n export type PopupVariant = 'default' | 'danger' | 'warning' | 'success' | 'info';\r\n export type PopupSize = 'small' | 'medium' | 'large' | 'xlarge' | 'fullscreen';\r\n\r\n export interface PopupButton {\r\n label : string;\r\n translateKey? : string;\r\n variant? : 'primary' | 'secondary' | 'danger' | 'success';\r\n icon? : string;\r\n onClick : () => void | Promise<void>;\r\n loading? : boolean;\r\n }\r\n\r\n export interface PopupFormOptions {\r\n title : string;\r\n titleTranslateKey? : string;\r\n description? : string;\r\n descriptionTranslateKey? : string;\r\n formConfig : FormConfig;\r\n variant? : PopupVariant;\r\n icon? : string;\r\n size? : PopupSize;\r\n closeOnOverlay? : boolean;\r\n closeOnEscape? : boolean;\r\n showCloseButton? : boolean;\r\n }\r\n\r\n export interface PopupOptions {\r\n title : string;\r\n titleTranslateKey? : string;\r\n message? : string;\r\n messageTranslateKey? : string;\r\n description? : string;\r\n descriptionTranslateKey? : string;\r\n type? : PopupType;\r\n variant? : PopupVariant;\r\n size? : PopupSize;\r\n buttons? : PopupButton[];\r\n customContent? : VNode;\r\n formConfig? : FormConfig;\r\n closeOnOverlay? : boolean;\r\n closeOnEscape? : boolean;\r\n showCloseButton? : boolean;\r\n icon? : string;\r\n onConfirm? : () => void | Promise<void>;\r\n onCancel? : () => void | Promise<void>;\r\n }\r\n\r\n interface ActivePopup extends PopupOptions {\r\n id : number;\r\n resolve? : (value: boolean | string | null | unknown) => void;\r\n inputValue? : string;\r\n isSubmitting? : boolean;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_popupContainer',\r\n\r\n overlay : 'bb_popupOverlay',\r\n\r\n popup: {\r\n base : 'bb_popup',\r\n close : 'bb_popupClose',\r\n },\r\n\r\n header: {\r\n container : 'bb_popupHeader',\r\n icon : 'bb_popupHeaderIcon',\r\n content : 'bb_popupHeaderContent',\r\n title : 'bb_popupHeaderContentTitle',\r\n description : 'bb_popupHeaderContentDesc',\r\n },\r\n\r\n body: {\r\n container : 'bb_popupBody',\r\n message : 'bb_popupBodyMsg',\r\n input : 'bb_popupBodyInput',\r\n formContainer : 'bb_popupBodyFormContainer',\r\n },\r\n\r\n footer : 'bb_popupFooter',\r\n button : 'bb_btn',\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Popup extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state popups : ActivePopup[] = [];\r\n private nextId = 0;\r\n private handleEscapeKey? : (e: KeyboardEvent) => void;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n this.setupKeyboardListener();\r\n\r\n window.addEventListener('languagechange', () => {\r\n this.update();\r\n });\r\n }\r\n\r\n onUnmount() {\r\n if (this.handleEscapeKey) {\r\n document.removeEventListener('keydown', this.handleEscapeKey);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n if (this.popups.length === 0) {\r\n return createElement('div', { className: bb_.container });\r\n }\r\n\r\n return createElement('div', { className: bb_.container },\r\n ...this.popups.map(popup => this.renderPopup(popup))\r\n );\r\n }\r\n\r\n renderPopup(popup: ActivePopup) {\r\n const sizeClass = `bb_popup--${popup.size || 'medium'}`;\r\n const variantClass = popup.variant ? `bb_popup--${popup.variant}` : '';\r\n\r\n return createElement('div', {\r\n key: String(popup.id),\r\n className: bb_.overlay,\r\n 'data-popup-id': popup.id,\r\n onClick: (e: Event) => {\r\n if ((e.target as HTMLElement).classList.contains(bb_.overlay) &&\r\n popup.closeOnOverlay !== false) {\r\n this.closePopup(popup.id, false);\r\n }\r\n }\r\n },\r\n createElement('div', {\r\n className: `${bb_.popup.base} ${sizeClass} ${variantClass}`,\r\n role: 'dialog',\r\n 'aria-modal': 'true',\r\n 'aria-labelledby': `popup-title-${popup.id}`\r\n },\r\n // Close button\r\n popup.showCloseButton !== false ? createElement('button', {\r\n className: bb_.popup.close,\r\n onClick: () => this.closePopup(popup.id, false),\r\n 'aria-label': 'Close'\r\n },\r\n createElement('i', { className: 'fas fa-times' })\r\n ) : null,\r\n\r\n // Header\r\n createElement('div', { className: bb_.header.container },\r\n popup.icon ? createElement('div', { className: bb_.header.icon },\r\n createElement('i', { className: popup.icon })\r\n ) : null,\r\n createElement('div', { className: bb_.header.content },\r\n createElement('h2', {\r\n id: `popup-title-${popup.id}`,\r\n className: bb_.header.title,\r\n 'data-translate': popup.titleTranslateKey\r\n },\r\n popup.titleTranslateKey ? t(popup.titleTranslateKey) : popup.title\r\n ),\r\n popup.description ? createElement('p', {\r\n className: bb_.header.description,\r\n 'data-translate': popup.descriptionTranslateKey\r\n },\r\n popup.descriptionTranslateKey\r\n ? tHtml(popup.descriptionTranslateKey)\r\n : popup.description\r\n ) : null\r\n )\r\n ),\r\n\r\n // Body\r\n createElement('div', { className: bb_.body.container },\r\n popup.message ? createElement('p', {\r\n className: bb_.body.message,\r\n 'data-translate': popup.messageTranslateKey\r\n },\r\n popup.messageTranslateKey\r\n ? tHtml(popup.messageTranslateKey)\r\n : popup.message\r\n ) : null,\r\n\r\n // Prompt input\r\n popup.type === 'prompt' ? createElement('input', {\r\n type: 'text',\r\n className: bb_.body.input,\r\n value: popup.inputValue || '',\r\n placeholder: t('popup.prompt.placeholder'),\r\n 'data-translate': 'popup.prompt.placeholder',\r\n onInput: (e: Event) => {\r\n popup.inputValue = (e.target as HTMLInputElement).value;\r\n }\r\n }) : null,\r\n\r\n // Form rendering\r\n popup.type === 'form' && popup.formConfig ? createElement('div', {\r\n className: bb_.body.formContainer\r\n },\r\n SmartForm(popup.formConfig)\r\n ) : null,\r\n\r\n // Custom content\r\n popup.customContent || null\r\n ),\r\n\r\n // Footer with buttons\r\n popup.buttons && popup.buttons.length > 0 && popup.type !== 'form' ? createElement('div', {\r\n className: bb_.footer\r\n },\r\n ...popup.buttons.map(button => createElement('button', {\r\n className: `${bb_.button} ${button.variant || 'secondary'}`,\r\n 'data-translate': button.translateKey,\r\n disabled: button.loading || popup.isSubmitting,\r\n onClick: async () => {\r\n if (button.loading || popup.isSubmitting) return;\r\n await button.onClick();\r\n }\r\n },\r\n button.icon ? createElement('i', { className: button.icon }) : null,\r\n button.loading || popup.isSubmitting ?\r\n createElement('i', { className: 'fas fa-spinner fa-spin' }) : null,\r\n ' ',\r\n button.translateKey ? t(button.translateKey) : button.label\r\n ))\r\n ) : null\r\n )\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n /**\r\n * Show a custom popup\r\n */\r\n show(options: PopupOptions): Promise<boolean | string | null | unknown> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n ...options,\r\n id,\r\n resolve,\r\n type: options.type || 'custom',\r\n size: options.size || 'medium',\r\n closeOnOverlay: options.closeOnOverlay !== false,\r\n closeOnEscape: options.closeOnEscape !== false,\r\n showCloseButton: options.showCloseButton !== false,\r\n isSubmitting: false\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a form popup\r\n */\r\n showForm(options: PopupFormOptions): Promise<unknown> {\r\n return new Promise((resolve, _reject) => {\r\n const id = this.nextId++;\r\n\r\n // Wrap the form config to handle submission\r\n const wrappedFormConfig: FormConfig = {\r\n ...options.formConfig,\r\n onSubmit: async (data) => {\r\n const popup = this.popups.find(p => p.id === id);\r\n if (popup) {\r\n popup.isSubmitting = true;\r\n this.update();\r\n }\r\n\r\n try {\r\n // Call original onSubmit\r\n if (options.formConfig.onSubmit) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n await options.formConfig.onSubmit(data, undefined as any);\r\n }\r\n\r\n this.closePopup(id, data);\r\n resolve(data);\r\n } catch (error) {\r\n if (popup) {\r\n popup.isSubmitting = false;\r\n this.update();\r\n }\r\n\r\n // Don't close popup on error\r\n if (options.formConfig.onError) {\r\n options.formConfig.onError(error);\r\n }\r\n }\r\n },\r\n submitButton: {\r\n ...options.formConfig.submitButton,\r\n className: options.formConfig.submitButton?.className || `${bb_.button} primary wide`\r\n }\r\n };\r\n\r\n const popup: ActivePopup = {\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n description: options.description,\r\n descriptionTranslateKey: options.descriptionTranslateKey,\r\n type: 'form',\r\n variant: options.variant || 'default',\r\n size: options.size || 'medium',\r\n icon: options.icon,\r\n formConfig: wrappedFormConfig,\r\n closeOnOverlay: options.closeOnOverlay !== false,\r\n closeOnEscape: options.closeOnEscape !== false,\r\n showCloseButton: options.showCloseButton !== false,\r\n id,\r\n resolve,\r\n isSubmitting: false\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a confirmation dialog\r\n */\r\n confirm(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n confirmLabel?: string;\r\n confirmTranslateKey?: string;\r\n cancelLabel?: string;\r\n cancelTranslateKey?: string;\r\n variant?: PopupVariant;\r\n icon?: string;\r\n size?: PopupSize;\r\n onConfirm?: () => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n }): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'confirm',\r\n variant: options.variant || 'default',\r\n size: options.size || 'small',\r\n icon: options.icon,\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm,\r\n onCancel: options.onCancel,\r\n buttons: [\r\n {\r\n label: options.cancelLabel || 'Cancel',\r\n translateKey: options.cancelTranslateKey || 'button.cancel',\r\n variant: 'secondary',\r\n icon: 'fas fa-times',\r\n onClick: async () => {\r\n if (options.onCancel) {\r\n await options.onCancel();\r\n }\r\n this.closePopup(id, false);\r\n }\r\n },\r\n {\r\n label: options.confirmLabel || 'Confirm',\r\n translateKey: options.confirmTranslateKey || 'button.confirm',\r\n variant: options.variant === 'danger' ? 'danger' : 'primary',\r\n icon: 'fas fa-check',\r\n onClick: async () => {\r\n if (options.onConfirm) {\r\n await options.onConfirm();\r\n }\r\n this.closePopup(id, true);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show an alert dialog\r\n */\r\n alert(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n okLabel?: string;\r\n okTranslateKey?: string;\r\n variant?: PopupVariant;\r\n icon?: string;\r\n size?: PopupSize;\r\n onConfirm?: () => void | Promise<void>;\r\n }): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'alert',\r\n variant: options.variant || 'info',\r\n size: options.size || 'small',\r\n icon: options.icon,\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm,\r\n buttons: [\r\n {\r\n label: options.okLabel || 'OK',\r\n translateKey: options.okTranslateKey || 'popup.ok',\r\n variant: 'primary',\r\n icon: 'fas fa-check',\r\n onClick: async () => {\r\n if (options.onConfirm) {\r\n await options.onConfirm();\r\n }\r\n this.closePopup(id, true);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a prompt dialog\r\n */\r\n prompt(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n defaultValue?: string;\r\n confirmLabel?: string;\r\n confirmTranslateKey?: string;\r\n cancelLabel?: string;\r\n cancelTranslateKey?: string;\r\n icon?: string;\r\n onConfirm?: (value: string) => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n }): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'prompt',\r\n variant: 'default',\r\n icon: options.icon,\r\n inputValue: options.defaultValue || '',\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm as (() => void | Promise<void>) | undefined,\r\n onCancel: options.onCancel,\r\n buttons: [\r\n {\r\n label: options.cancelLabel || 'Cancel',\r\n translateKey: options.cancelTranslateKey || 'popup.cancel',\r\n variant: 'secondary',\r\n onClick: async () => {\r\n if (options.onCancel) {\r\n await options.onCancel();\r\n }\r\n this.closePopup(id, null);\r\n }\r\n },\r\n {\r\n label: options.confirmLabel || 'OK',\r\n translateKey: options.confirmTranslateKey || 'popup.ok',\r\n variant: 'primary',\r\n onClick: async () => {\r\n const value = popup.inputValue || '';\r\n if (options.onConfirm) {\r\n await options.onConfirm(value);\r\n }\r\n this.closePopup(id, value);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n });\r\n }\r\n\r\n /**\r\n * Close a specific popup\r\n */\r\n closePopup(id: number, result: boolean | string | null | unknown) {\r\n const popup = this.popups.find(p => p.id === id);\r\n if (popup?.resolve) {\r\n popup.resolve(result);\r\n }\r\n\r\n this.popups = this.popups.filter(p => p.id !== id);\r\n\r\n if (this.popups.length === 0) {\r\n this.removeBodyLock();\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Close all popups\r\n */\r\n closeAll() {\r\n this.popups.forEach(popup => {\r\n if (popup.resolve) {\r\n popup.resolve(false);\r\n }\r\n });\r\n this.popups = [];\r\n this.removeBodyLock();\r\n this.update();\r\n }\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private applyBodyLock() {\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n private removeBodyLock() {\r\n document.body.style.overflow = '';\r\n }\r\n\r\n private setupKeyboardListener() {\r\n this.handleEscapeKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this.popups.length > 0) {\r\n const lastPopup = this.popups[this.popups.length - 1];\r\n if (lastPopup.closeOnEscape !== false) {\r\n this.closePopup(lastPopup.id, false);\r\n }\r\n }\r\n };\r\n document.addEventListener('keydown', this.handleEscapeKey);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOBAL ══════════════════════════════════════╗\r\n\r\n let globalPopup: Popup | null = null;\r\n\r\n export function initPopup(container?: HTMLElement): Popup {\r\n if (globalPopup) return globalPopup;\r\n\r\n const popupContainer = container || document.createElement('div');\r\n if (!container) {\r\n document.body.appendChild(popupContainer);\r\n }\r\n\r\n globalPopup = new Popup();\r\n globalPopup.mount(popupContainer);\r\n\r\n return globalPopup;\r\n }\r\n\r\n export function getPopup(): Popup {\r\n if (!globalPopup) {\r\n globalPopup = initPopup();\r\n }\r\n return globalPopup;\r\n }\r\n\r\n // Convenience exports\r\n export const popup = {\r\n show: (options: PopupOptions) => getPopup().show(options),\r\n\r\n confirm: (options: Parameters<Popup['confirm']>[0]) =>\r\n getPopup().confirm(options),\r\n\r\n alert: (options: Parameters<Popup['alert']>[0]) =>\r\n getPopup().alert(options),\r\n\r\n prompt: (options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n icon?: string;\r\n messageTranslateKey?: string;\r\n onConfirm?: () => void | Promise<void>;\r\n }) => getPopup().prompt(options),\r\n\r\n showForm: (options: PopupFormOptions) =>\r\n getPopup().showForm(options),\r\n\r\n closePopup: (id: number, result: boolean | string | null | unknown) =>\r\n getPopup().closePopup(id, result),\r\n\r\n closeLastPopup: () => getPopup().closePopup(getPopup().popups.length - 1, false),\r\n\r\n closeFirstPopup: () => getPopup().closePopup(0, false),\r\n\r\n closeAll: () => getPopup().closeAll()\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/frontend/app/gui/layout/tabbed-view.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, VNode } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_tabbedview',\r\n\r\n header : 'bb_tabbedviewHeader',\r\n\r\n tab: {\r\n base : 'bb_tabbedviewTab',\r\n active : 'bb_tabbedviewTab--active',\r\n disabled : 'bb_tabbedviewTab--disabled',\r\n badge : 'bb_tabbedviewBadge',\r\n },\r\n\r\n content: {\r\n container : 'bb_tabbedviewContent',\r\n emptyState : 'bb_tabbedviewEmptyState',\r\n error : 'bb_tabbedviewError',\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type TabPosition = 'top' | 'side';\r\n export type TabStyle = 'default' | 'pills' | 'minimal';\r\n\r\n export interface Tab {\r\n id : string;\r\n label : string;\r\n translateKey? : string;\r\n icon? : string;\r\n badge? : number | string;\r\n disabled? : boolean;\r\n component? : Component | (() => VNode);\r\n content? : VNode;\r\n onActivate? : () => void | Promise<void>;\r\n }\r\n\r\n export interface TabbedViewOptions {\r\n tabs : Tab[];\r\n defaultTab? : string;\r\n position? : TabPosition;\r\n style? : TabStyle;\r\n className? : string;\r\n headerClassName? : string;\r\n contentClassName? : string;\r\n showTabCount? : boolean;\r\n persistState? : boolean; // Save active tab to localStorage\r\n storageKey? : string; // Key for localStorage\r\n onChange? : (tabId: string) => void | Promise<void>;\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class TabbedView extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state activeTabId : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state tabs : Tab[] = [];\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state position : TabPosition = 'top';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state style : TabStyle = 'default';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state className : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state headerClassName : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state contentClassName : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state showTabCount : boolean = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state persistState : boolean = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state storageKey : string = 'tabbedview-active';\r\n\r\n private currentTabComponent : Component | null = null;\r\n private onChange? : (tabId: string) => void | Promise<void>;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n // Listen for language changes\r\n window.addEventListener('languagechange', () => {\r\n this.update();\r\n });\r\n }\r\n\r\n onUnmount() {\r\n // Clean up current tab component\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onUnmount === 'function') {\r\n this.currentTabComponent.onUnmount();\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n /**\r\n * Initialize the tabbed view with options\r\n */\r\n init(options: TabbedViewOptions) {\r\n this.tabs = options.tabs;\r\n this.position = options.position || 'top';\r\n this.style = options.style || 'default';\r\n this.className = options.className || '';\r\n this.headerClassName = options.headerClassName || '';\r\n this.contentClassName = options.contentClassName || '';\r\n this.showTabCount = options.showTabCount || false;\r\n this.persistState = options.persistState || false;\r\n this.storageKey = options.storageKey || 'tabbedview-active';\r\n this.onChange = options.onChange;\r\n\r\n // Determine initial active tab\r\n if (this.persistState) {\r\n const savedTab = localStorage.getItem(this.storageKey);\r\n if (savedTab && this.tabs.find(t => t.id === savedTab)) {\r\n this.activeTabId = savedTab;\r\n }\r\n }\r\n\r\n if (!this.activeTabId) {\r\n this.activeTabId = options.defaultTab || this.tabs[0]?.id || '';\r\n }\r\n\r\n this.update();\r\n return this;\r\n }\r\n\r\n /**\r\n * Set active tab\r\n */\r\n async setActiveTab(tabId: string) {\r\n const tab = this.tabs.find(t => t.id === tabId);\r\n if (!tab || tab.disabled) return;\r\n\r\n // Clean up old tab component\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onUnmount === 'function') {\r\n this.currentTabComponent.onUnmount();\r\n }\r\n this.currentTabComponent = null;\r\n\r\n this.activeTabId = tabId;\r\n\r\n // Save to localStorage if persistence is enabled\r\n if (this.persistState) {\r\n localStorage.setItem(this.storageKey, tabId);\r\n }\r\n\r\n // Call tab's onActivate callback\r\n if (tab.onActivate) {\r\n await tab.onActivate();\r\n // (window as any).__globalLoader?.show();\r\n // TODO: better use in-container loading indicator\r\n }\r\n\r\n // Call global onChange callback\r\n if (this.onChange) {\r\n await this.onChange(tabId);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Add a new tab dynamically\r\n */\r\n addTab(tab: Tab) {\r\n this.tabs = [...this.tabs, tab];\r\n this.update();\r\n }\r\n\r\n /**\r\n * Remove a tab\r\n */\r\n removeTab(tabId: string) {\r\n this.tabs = this.tabs.filter(t => t.id !== tabId);\r\n if (this.activeTabId === tabId && this.tabs.length > 0) {\r\n this.activeTabId = this.tabs[0].id;\r\n }\r\n this.update();\r\n }\r\n\r\n /**\r\n * Update tab properties\r\n */\r\n updateTab(tabId: string, updates: Partial<Tab>) {\r\n const tab = this.tabs.find(t => t.id === tabId);\r\n if (tab) {\r\n Object.assign(tab, updates);\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Get active tab\r\n */\r\n getActiveTab(): Tab | undefined {\r\n return this.tabs.find(t => t.id === this.activeTabId);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n const containerClass = [\r\n bb_.container,\r\n `bb_tabbedview__--${this.position}`,\r\n `bb_tabbedview__--${this.style}`,\r\n this.className\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', { className: containerClass },\r\n this.renderTabList(),\r\n this.renderTabContent()\r\n );\r\n }\r\n\r\n renderTabList() {\r\n const headerClass = [\r\n bb_.header,\r\n this.headerClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', { className: headerClass },\r\n ...this.tabs.map(tab => this.renderTab(tab))\r\n );\r\n }\r\n\r\n renderTab(tab: Tab) {\r\n const isActive = this.activeTabId === tab.id;\r\n\r\n const tabClass = [\r\n bb_.tab.base,\r\n isActive ? bb_.tab.active : '',\r\n tab.disabled ? bb_.tab.disabled : ''\r\n ].filter(Boolean).join(' ');\r\n\r\n const label = tab.translateKey ? t(tab.translateKey) : tab.label;\r\n\r\n return createElement('button', {\r\n key: tab.id,\r\n className: tabClass,\r\n onclick: () => this.setActiveTab(tab.id),\r\n disabled: tab.disabled,\r\n 'data-translate': tab.translateKey,\r\n 'aria-selected': isActive,\r\n role: 'tab'\r\n },\r\n tab.icon ? createElement('i', { className: tab.icon }) : null,\r\n createElement('span', {}, label),\r\n tab.badge !== undefined && tab.badge !== null && tab.badge !== 0 ?\r\n createElement('span', { className: bb_.tab.badge },\r\n typeof tab.badge === 'number' && tab.badge > 99 ? '99+' : String(tab.badge)\r\n ) : null\r\n );\r\n }\r\n\r\n renderTabContent() {\r\n const contentClass = [\r\n bb_.content.container,\r\n this.contentClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n const activeTab = this.getActiveTab();\r\n if (!activeTab) {\r\n return createElement('div', { className: contentClass },\r\n createElement('div', { className: bb_.content.emptyState },\r\n createElement('p', {}, 'No tab selected')\r\n )\r\n );\r\n }\r\n\r\n return createElement('div', {\r\n className: contentClass,\r\n role: 'tabpanel'\r\n },\r\n this.renderActiveTabContent(activeTab)\r\n );\r\n }\r\n\r\n renderActiveTabContent(tab: Tab) {\r\n // If tab has a component class/function\r\n if (tab.component) {\r\n try {\r\n // Check if it's a Component instance\r\n if (tab.component instanceof Component) {\r\n // It's already an instance, just render it\r\n this.currentTabComponent = tab.component;\r\n\r\n // Get the VNode from render()\r\n const vnode = this.currentTabComponent.render();\r\n\r\n // Wrap the VNode to set _element when it's mounted via ref callback\r\n const wrappedProps = {\r\n ...vnode.props,\r\n ref: (el: HTMLElement | null) => {\r\n if (el && this.currentTabComponent) {\r\n // Set the component's _element through the private field\r\n (this.currentTabComponent as Component<Record<string, unknown>, Record<string, unknown>>).setElement(el);\r\n // console.log('✅ TabbedView set component._element via ref');\r\n }\r\n // Call original ref if it exists\r\n if (typeof vnode.props.ref === 'function') {\r\n vnode.props.ref(el);\r\n }\r\n }\r\n };\r\n\r\n // Create a new VNode with the wrapped props\r\n const wrappedVNode = {\r\n ...vnode,\r\n props: wrappedProps\r\n };\r\n\r\n // Schedule onMount to be called after element is in DOM\r\n if (typeof this.currentTabComponent.onMount === 'function') {\r\n setTimeout(() => {\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n this.currentTabComponent.onMount();\r\n }\r\n }, 0);\r\n }\r\n\r\n return wrappedVNode;\r\n }\r\n\r\n // Check if it's a function\r\n if (typeof tab.component === 'function') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ComponentClass = tab.component as any;\r\n\r\n // Check if it's a Component class (has prototype.render)\r\n if (ComponentClass.prototype && typeof ComponentClass.prototype.render === 'function') {\r\n // It's a Component class - create new instance\r\n if (!this.currentTabComponent) {\r\n this.currentTabComponent = new ComponentClass();\r\n\r\n // Schedule onMount\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n setTimeout(() => {\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n this.currentTabComponent.onMount();\r\n }\r\n }, 0);\r\n }\r\n }\r\n\r\n return this.currentTabComponent!.render();\r\n } else {\r\n // It's a function returning VNode\r\n return ComponentClass();\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error rendering tab component:', error);\r\n return createElement('div', { className: bb_.content.error },\r\n 'Error rendering tab content'\r\n );\r\n }\r\n }\r\n\r\n // If tab has direct content VNode\r\n if (tab.content) {\r\n return tab.content;\r\n }\r\n\r\n // Fallback\r\n return createElement('div', { className: bb_.content.emptyState },\r\n createElement('p', {}, 'No content available')\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOB ════════════════════════════════════════╗\r\n\r\n /**\r\n * Create a new TabbedView instance with options\r\n */\r\n export function createTabbedView(options: TabbedViewOptions): TabbedView {\r\n const view = new TabbedView();\r\n view.init(options);\r\n return view;\r\n }\r\n\r\n /**\r\n * Helper to create a simple tabbed view and mount it\r\n */\r\n export async function mountTabbedView(\r\n container: HTMLElement,\r\n options: TabbedViewOptions\r\n ): Promise<TabbedView> {\r\n const view = createTabbedView(options);\r\n await view.mount(container);\r\n return view;\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝","// src/frontend/app/gui/layout/items_loader.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createDOMElement, createElement, VNode, VNodeChild } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_itemsLoaderContainer',\r\n list : 'bb_itemsLoaderList',\r\n searchbar : 'bb_itemsLoaderSearchbar',\r\n loading : 'bb_itemsLoaderLoading',\r\n error : 'bb_itemsLoaderError',\r\n trigger : 'bb_itemsLoaderTrigger',\r\n end : 'bb_itemsLoaderEnd',\r\n emptyState : 'bb_tabbedviewEmptyState',\r\n button : 'bb_btn',\r\n item : 'bb_itemsLoader-item',\r\n formFieldInput : 'bb_formFieldInput',\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPES ═══════════════════════════════════════╗\r\n\r\n export interface ItemsLoaderConfig<T> {\r\n // Core configuration\r\n fetchUrl : string | ((page: number, filters: Record<string, unknown>) => string);\r\n renderItem : (item: T, index: number) => HTMLElement;\r\n pageSize? : number;\r\n\r\n // Empty state\r\n emptyStateConfig?: {\r\n icon : string;\r\n title : string;\r\n description : string;\r\n };\r\n\r\n // UI text\r\n loadMoreText? : string;\r\n loadingText? : string;\r\n errorText? : string;\r\n containerClassName? : string;\r\n itemClassName? : string;\r\n\r\n // Filtering\r\n filters? : Record<string, unknown>;\r\n onFiltersChange? : (filters: Record<string, unknown>) => void;\r\n\r\n // Search\r\n enableSearch? : boolean;\r\n searchPlaceholder? : string;\r\n searchFilterKey? : string;\r\n searchDebounceMs? : number;\r\n\r\n // Callbacks\r\n onItemClick? : (item: T, index: number) => void;\r\n onLoadMore? : (page: number, items: T[]) => void;\r\n onError? : (error: Error) => void;\r\n\r\n // Data extraction\r\n initialItems? : T[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n extractItems? : (response: any) => T[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n extractTotal? : (response: any) => number;\r\n\r\n // Authentication\r\n getAuthToken? : () => string | null;\r\n\r\n // Scroll behavior\r\n enableInfiniteScroll? : boolean;\r\n scrollThreshold? : number;\r\n\r\n // 🆕 Visibility tracking (for auto-mark-as-read, analytics, etc.)\r\n enableVisibilityTracking? : boolean;\r\n visibilityThreshold? : number;\r\n visibilityRootMargin? : string;\r\n onItemsViewed? : (viewedItems: T[]) => Promise<void>;\r\n getItemId? : (item: T) => number | string;\r\n shouldTrackItem? : (item: T) => boolean; // e.g., only track unread items\r\n\r\n // 🆕 Dropdown lifecycle (for nested dropdowns)\r\n onDropdownOpen? : () => void;\r\n onDropdownClose? : () => void;\r\n\r\n // 🆕 Batch operations\r\n onBatchAction? : (action: string, itemIds: (number | string)[]) => Promise<void>;\r\n }\r\n\r\n interface LoadState {\r\n loading : boolean;\r\n error : string | null;\r\n hasMore : boolean;\r\n page : number;\r\n total : number;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ItemsLoader<T = unknown> extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n items : T[] = [];\r\n loadState : LoadState = {\r\n loading : false,\r\n error : null,\r\n hasMore : true,\r\n page : 0,\r\n total : 0\r\n };\r\n filters : Record<string, unknown> = {};\r\n\r\n public config! : ItemsLoaderConfig<T>;\r\n\r\n // Scroll management\r\n private scrollContainer : HTMLElement | null = null;\r\n\r\n // Infinite scroll\r\n private loadMoreObserver : IntersectionObserver | null = null;\r\n private currentLoadMoreTrigger : Element | null = null;\r\n private loadMoreMutationObserver : MutationObserver | null = null;\r\n\r\n // Visibility tracking\r\n private visibilityObserver : IntersectionObserver | null = null;\r\n private viewedItems = new Set<number | string>();\r\n private dropdownIsOpen : boolean = false;\r\n\r\n // DOM references\r\n private itemsListContainer : HTMLElement | null = null;\r\n private searchInput : HTMLInputElement | null = null;\r\n\r\n // State flags\r\n private isUpdating : boolean = false;\r\n private searchDebounceTimer : NodeJS.Timeout | null = null;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n initialize(config: ItemsLoaderConfig<T>) {\r\n this.config = {\r\n pageSize: 10,\r\n loadMoreText: 'Load More',\r\n loadingText: 'Loading...',\r\n errorText: 'Failed to load items',\r\n containerClassName: bb_.container,\r\n itemClassName: bb_.item,\r\n enableInfiniteScroll: true,\r\n scrollThreshold: 200,\r\n enableSearch: false,\r\n searchPlaceholder: 'Search...',\r\n searchFilterKey: 'search',\r\n searchDebounceMs: 300,\r\n enableVisibilityTracking: false,\r\n visibilityThreshold: 0.5,\r\n visibilityRootMargin: '0px',\r\n extractItems: (response: { notifications?: T[]; items?: T[]; data?: T[]; logs?: T[] }) =>\r\n response.notifications || response.items || response.data || response.logs || [],\r\n extractTotal: (response: { total?: number; count?: number; pagination?: { total?: number } }) =>\r\n response.pagination?.total || response.total || response.count || 0,\r\n ...config\r\n };\r\n\r\n if (this.config.filters) {\r\n this.filters = { ...this.config.filters };\r\n }\r\n\r\n if (this.config.initialItems) {\r\n this.items = [...this.config.initialItems];\r\n }\r\n }\r\n\r\n async onMount() {\r\n if (this.items.length === 0) {\r\n await this.loadMore();\r\n }\r\n\r\n if (this.config.enableInfiniteScroll) {\r\n this.setupInfiniteScroll();\r\n }\r\n\r\n if (this.config.scrollThreshold) {\r\n this.setupScrollListener();\r\n }\r\n\r\n if (this.config.enableVisibilityTracking) {\r\n this.setupVisibilityTracking();\r\n }\r\n }\r\n\r\n onUnmount() {\r\n this.disconnectInfiniteScrollObserver();\r\n this.disconnectVisibilityObserver();\r\n\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n\r\n if (this.scrollContainer) {\r\n this.scrollContainer.removeEventListener('scroll', this.handleScroll);\r\n this.scrollContainer = null;\r\n }\r\n\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n async loadMore() {\r\n if (this.loadState.loading || !this.loadState.hasMore) {\r\n return;\r\n }\r\n\r\n try {\r\n const scrollContainer = this.scrollContainer || this.findScrollContainer();\r\n const savedScrollTop = scrollContainer?.scrollTop || 0;\r\n const savedScrollHeight = scrollContainer?.scrollHeight || 0;\r\n\r\n this.loadState = { ...this.loadState, loading: true, error: null };\r\n this.updateLoadingState();\r\n\r\n const nextPage = this.loadState.page + 1;\r\n const url = this.buildUrl(nextPage);\r\n\r\n const response = await fetch(url, {\r\n credentials: 'include',\r\n headers: this.buildHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const newItems = this.config.extractItems!(data);\r\n const total = this.config.extractTotal!(data);\r\n\r\n this.items = [...this.items, ...newItems];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: this.items.length < total,\r\n page: nextPage,\r\n total\r\n };\r\n\r\n this.updateLoadingState();\r\n this.appendNewItems(newItems);\r\n\r\n // Restore scroll position\r\n if (scrollContainer && savedScrollTop > 0) {\r\n scrollContainer.scrollTop = savedScrollTop;\r\n\r\n requestAnimationFrame(() => {\r\n const newScrollHeight = scrollContainer.scrollHeight;\r\n const scrollHeightDiff = newScrollHeight - savedScrollHeight;\r\n\r\n if (Math.abs(scrollHeightDiff) > 10) {\r\n scrollContainer.scrollTop = savedScrollTop;\r\n }\r\n });\r\n }\r\n\r\n this.reconnectInfiniteScrollObserver();\r\n this.config.onLoadMore?.(nextPage, this.items);\r\n\r\n } catch (error) {\r\n this.loadState = {\r\n ...this.loadState,\r\n loading: false,\r\n error: error instanceof Error ? error.message : this.config.errorText!\r\n };\r\n\r\n this.updateLoadingState();\r\n this.updateFooter();\r\n this.config.onError?.(error instanceof Error ? error : new Error('Unknown error'));\r\n }\r\n }\r\n\r\n async reload() {\r\n this.items = [];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: true,\r\n page: 0,\r\n total: 0\r\n };\r\n await this.loadMore();\r\n }\r\n\r\n async applyFilters(newFilters: Record<string, unknown>) {\r\n if (this.isUpdating) return;\r\n\r\n this.isUpdating = true;\r\n this.filters = { ...newFilters };\r\n\r\n this.items = [];\r\n this.loadState = {\r\n loading: true,\r\n error: null,\r\n hasMore: true,\r\n page: 0,\r\n total: 0\r\n };\r\n\r\n this.updateLoadingState();\r\n\r\n try {\r\n const url = this.buildUrl(1);\r\n const response = await fetch(url, {\r\n credentials: 'include',\r\n headers: this.buildHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const newItems = this.config.extractItems!(data);\r\n const total = this.config.extractTotal!(data);\r\n\r\n this.items = [...newItems];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: this.items.length < total,\r\n page: 1,\r\n total\r\n };\r\n\r\n // Clear container\r\n if (this.itemsListContainer) {\r\n this.itemsListContainer.innerHTML = '';\r\n }\r\n\r\n if (this.element) {\r\n this.element.querySelectorAll(`.${bb_.trigger}, .${bb_.end}, .${bb_.error}, .${bb_.loading}, .${bb_.emptyState}`).forEach(el => el.remove());\r\n }\r\n\r\n // Append items or show empty state\r\n if (this.items.length > 0) {\r\n if (!this.itemsListContainer) {\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n }\r\n\r\n if (this.itemsListContainer) {\r\n this.appendNewItems(this.items);\r\n }\r\n } else {\r\n this.updateFooter();\r\n }\r\n\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n this.reconnectInfiniteScrollObserver();\r\n\r\n this.config.onLoadMore?.(1, this.items);\r\n this.config.onFiltersChange?.(this.filters);\r\n\r\n } catch (error) {\r\n this.loadState = {\r\n ...this.loadState,\r\n loading: false,\r\n error: error instanceof Error ? error.message : this.config.errorText!\r\n };\r\n\r\n this.updateLoadingState();\r\n this.config.onError?.(error instanceof Error ? error : new Error('Unknown error'));\r\n } finally {\r\n this.isUpdating = false;\r\n }\r\n }\r\n\r\n async handleSearch(searchQuery: string) {\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n\r\n this.searchDebounceTimer = setTimeout(async () => {\r\n const newFilters = { ...this.filters };\r\n\r\n if (searchQuery.trim()) {\r\n newFilters[this.config.searchFilterKey!] = searchQuery.trim();\r\n } else {\r\n delete newFilters[this.config.searchFilterKey!];\r\n }\r\n\r\n await this.applyFilters(newFilters);\r\n }, this.config.searchDebounceMs);\r\n }\r\n\r\n updateItems(updatedItems: T[]) {\r\n this.items = [...updatedItems];\r\n\r\n if (this.itemsListContainer) {\r\n this.itemsListContainer.innerHTML = '';\r\n this.appendNewItems(updatedItems);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private setupVisibilityTracking() {\r\n if (!this.config.enableVisibilityTracking) return;\r\n\r\n if (this.visibilityObserver) {\r\n this.visibilityObserver.disconnect();\r\n }\r\n\r\n const scrollContainer = this.findScrollContainer();\r\n\r\n this.visibilityObserver = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && this.dropdownIsOpen) {\r\n const element = entry.target as HTMLElement;\r\n const itemIndex = parseInt(element.getAttribute('data-item-index') || '-1');\r\n\r\n if (itemIndex >= 0 && itemIndex < this.items.length) {\r\n const item = this.items[itemIndex];\r\n const itemId = this.config.getItemId?.(item);\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n\r\n if (itemId && !this.viewedItems.has(itemId) && shouldTrack) {\r\n this.viewedItems.add(itemId);\r\n }\r\n }\r\n }\r\n });\r\n },\r\n {\r\n root: scrollContainer,\r\n rootMargin: this.config.visibilityRootMargin,\r\n threshold: this.config.visibilityThreshold\r\n }\r\n );\r\n\r\n this.observeTrackableItems();\r\n }\r\n\r\n private observeTrackableItems() {\r\n if (!this.visibilityObserver || !this.itemsListContainer) return;\r\n\r\n const items = this.itemsListContainer.querySelectorAll('[data-item-index]');\r\n items.forEach(element => {\r\n const itemIndex = parseInt((element as HTMLElement).getAttribute('data-item-index') || '-1');\r\n if (itemIndex >= 0 && itemIndex < this.items.length) {\r\n const item = this.items[itemIndex];\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n\r\n if (shouldTrack) {\r\n this.visibilityObserver!.observe(element);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private trackAlreadyVisibleItems() {\r\n if (!this.itemsListContainer) return;\r\n\r\n const scrollContainer = this.findScrollContainer();\r\n if (!scrollContainer) return;\r\n\r\n const items = this.itemsListContainer.querySelectorAll('[data-item-index]');\r\n const containerRect = scrollContainer.getBoundingClientRect();\r\n\r\n items.forEach(element => {\r\n const itemIndex = parseInt((element as HTMLElement).getAttribute('data-item-index') || '-1');\r\n if (itemIndex < 0 || itemIndex >= this.items.length) return;\r\n\r\n const item = this.items[itemIndex];\r\n const itemId = this.config.getItemId?.(item);\r\n if (!itemId || this.viewedItems.has(itemId)) return;\r\n\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n if (!shouldTrack) return;\r\n\r\n const rect = (element as HTMLElement).getBoundingClientRect();\r\n const isVisible = (\r\n rect.top < containerRect.bottom &&\r\n rect.bottom > containerRect.top &&\r\n rect.top >= containerRect.top - 100 &&\r\n rect.bottom <= containerRect.bottom + 100\r\n );\r\n\r\n if (isVisible) {\r\n this.viewedItems.add(itemId);\r\n }\r\n });\r\n }\r\n\r\n private disconnectVisibilityObserver() {\r\n if (this.visibilityObserver) {\r\n this.visibilityObserver.disconnect();\r\n this.visibilityObserver = null;\r\n }\r\n }\r\n\r\n public handleDropdownOpen() {\r\n this.dropdownIsOpen = true;\r\n this.viewedItems.clear();\r\n\r\n if (this.config.enableVisibilityTracking) {\r\n this.trackAlreadyVisibleItems();\r\n this.observeTrackableItems();\r\n }\r\n\r\n this.config.onDropdownOpen?.();\r\n }\r\n\r\n public async handleDropdownClose() {\r\n this.dropdownIsOpen = false;\r\n\r\n if (this.viewedItems.size > 0 && this.config.onItemsViewed) {\r\n const viewedItemsArray = this.items.filter(item => {\r\n const itemId = this.config.getItemId?.(item);\r\n return itemId && this.viewedItems.has(itemId);\r\n });\r\n\r\n await this.config.onItemsViewed(viewedItemsArray);\r\n }\r\n\r\n this.viewedItems.clear();\r\n this.config.onDropdownClose?.();\r\n }\r\n\r\n public async performBatchAction(action: string, itemIds: (number | string)[]) {\r\n if (this.config.onBatchAction) {\r\n await this.config.onBatchAction(action, itemIds);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private appendNewItems(newItems: T[]) {\r\n if (!this.itemsListContainer) {\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n }\r\n\r\n if (!this.itemsListContainer) return;\r\n\r\n const fragment = document.createDocumentFragment();\r\n const startIndex = this.items.length - newItems.length;\r\n\r\n newItems.forEach((item, index) => {\r\n const actualIndex = startIndex + index;\r\n const itemElement = this.config.renderItem(item, actualIndex);\r\n\r\n itemElement.setAttribute('data-item-index', actualIndex.toString());\r\n\r\n if (this.config.onItemClick) {\r\n itemElement.className = `${itemElement.className} ${this.config.itemClassName} clickable`;\r\n itemElement.onclick = () => this.handleItemClick(item, actualIndex);\r\n } else {\r\n itemElement.className = `${itemElement.className} ${this.config.itemClassName}`;\r\n }\r\n\r\n fragment.appendChild(itemElement);\r\n });\r\n\r\n this.itemsListContainer.appendChild(fragment);\r\n this.updateFooter();\r\n\r\n if (this.config.enableVisibilityTracking && this.dropdownIsOpen) {\r\n setTimeout(() => this.observeTrackableItems(), 100);\r\n }\r\n }\r\n\r\n private updateLoadingState() {\r\n const container = this.element?.querySelector(`.${bb_.container}`);\r\n if (!container) return;\r\n\r\n let loadingEl = container.querySelector(`.${bb_.loading}`) as HTMLElement;\r\n\r\n if (this.loadState.loading) {\r\n if (!loadingEl) {\r\n const loadingVNode = this.renderLoading();\r\n loadingEl = this.createElementFromVNode(loadingVNode);\r\n container.appendChild(loadingEl);\r\n }\r\n } else {\r\n if (loadingEl) {\r\n loadingEl.remove();\r\n }\r\n }\r\n }\r\n\r\n public updateFooter() {\r\n const container = this.element;\r\n if (!container) return;\r\n\r\n container.querySelectorAll(`.${bb_.trigger}, .${bb_.end}, .${bb_.emptyState}`).forEach(el => {\r\n el.remove();\r\n });\r\n\r\n if (this.items.length === 0 && !this.loadState.loading && this.config.emptyStateConfig) {\r\n const emptyVNode = this.renderEmptyState();\r\n const emptyElement = createDOMElement(emptyVNode);\r\n container.appendChild(emptyElement);\r\n return;\r\n }\r\n\r\n if (this.loadState.hasMore && !this.loadState.loading && this.items.length > 0) {\r\n const triggerVNode = this.renderLoadMoreTrigger();\r\n const triggerElement = createDOMElement(triggerVNode);\r\n container.appendChild(triggerElement);\r\n }\r\n\r\n if (!this.loadState.hasMore && this.items.length > 0) {\r\n const endMsgVNode = this.renderEndMessage();\r\n const endMsgElement = createDOMElement(endMsgVNode);\r\n container.appendChild(endMsgElement);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private setupInfiniteScroll() {\r\n if (this.loadMoreObserver) {\r\n this.loadMoreObserver.disconnect();\r\n }\r\n\r\n this.loadMoreObserver = new IntersectionObserver(\r\n (entries) => {\r\n const [entry] = entries;\r\n\r\n if (entry.isIntersecting && !this.loadState.loading && this.loadState.hasMore) {\r\n this.loadMore();\r\n }\r\n },\r\n {\r\n threshold: 0.1,\r\n rootMargin: '50px'\r\n }\r\n );\r\n\r\n this.reconnectInfiniteScrollObserver();\r\n }\r\n\r\n private reconnectInfiniteScrollObserver() {\r\n if (!this.config.enableInfiniteScroll || !this.loadMoreObserver) return;\r\n\r\n if (this.currentLoadMoreTrigger) {\r\n this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger);\r\n this.currentLoadMoreTrigger = null;\r\n }\r\n\r\n const tryObserve = () => {\r\n const trigger = this.element?.querySelector('[data-load-more-trigger=\"true\"]');\r\n\r\n if (trigger) {\r\n this.loadMoreObserver!.observe(trigger);\r\n this.currentLoadMoreTrigger = trigger;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n if (!tryObserve()) {\r\n // Use MutationObserver to wait for trigger\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n }\r\n\r\n this.loadMoreMutationObserver = new MutationObserver(() => {\r\n if (tryObserve() && this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n });\r\n\r\n if (this.element) {\r\n this.loadMoreMutationObserver.observe(this.element, {\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n setTimeout(() => {\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n }, 5000);\r\n }\r\n }\r\n }\r\n\r\n private disconnectInfiniteScrollObserver() {\r\n if (this.loadMoreObserver && this.currentLoadMoreTrigger) {\r\n this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger);\r\n this.currentLoadMoreTrigger = null;\r\n }\r\n }\r\n\r\n private setupScrollListener() {\r\n requestAnimationFrame(() => {\r\n this.scrollContainer = this.findScrollContainer();\r\n\r\n if (this.scrollContainer) {\r\n if ('scrollRestoration' in history) {\r\n history.scrollRestoration = 'manual';\r\n }\r\n\r\n this.scrollContainer.addEventListener('scroll', this.handleScroll);\r\n }\r\n });\r\n }\r\n\r\n private handleScroll = () => {\r\n if (!this.scrollContainer || this.loadState.loading || !this.loadState.hasMore) {\r\n return;\r\n }\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n if (distanceFromBottom < this.config.scrollThreshold!) {\r\n this.loadMore();\r\n }\r\n };\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private findScrollContainer(): HTMLElement | null {\r\n const candidates = [\r\n this.element?.closest('.bb_notificationsContent'),\r\n this.element?.closest('.bb_dropdownMenu'),\r\n this.element?.querySelector('[data-notifications-loader]'),\r\n this.element?.closest('[data-notifications-loader]'),\r\n this.element?.closest('.scrollbar-thin'),\r\n this.element?.parentElement,\r\n this.element\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n if (candidate) {\r\n const el = candidate as HTMLElement;\r\n if (el.scrollHeight > el.clientHeight || el.classList.contains('scrollbar-thin')) {\r\n return el;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildUrl(page: number): string {\r\n if (typeof this.config.fetchUrl === 'function') {\r\n return this.config.fetchUrl(page, this.filters);\r\n }\r\n\r\n const separator = this.config.fetchUrl.includes('?') ? '&' : '?';\r\n const params = new URLSearchParams({\r\n page: page.toString(),\r\n limit: this.config.pageSize!.toString(),\r\n ...this.filters as Record<string, string>\r\n });\r\n\r\n return `${this.config.fetchUrl}${separator}${params}`;\r\n }\r\n\r\n private buildHeaders(): HeadersInit {\r\n const headers: HeadersInit = {\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n const token = this.config.getAuthToken?.();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private handleItemClick = (item: T, index: number) => {\r\n this.config.onItemClick?.(item, index);\r\n };\r\n\r\n private createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Can only create elements from string types');\r\n }\r\n\r\n const element = document.createElement(vnode.type);\r\n\r\n if (vnode.props) {\r\n Object.entries(vnode.props).forEach(([key, value]) => {\r\n if (key === 'className') {\r\n element.className = value as string;\r\n } else if (key === 'style') {\r\n if (typeof value === 'string') {\r\n element.setAttribute('style', value);\r\n } else if (typeof value === 'object' && value !== null) {\r\n Object.assign(element.style, value);\r\n }\r\n } else if (key === 'onclick' && typeof value === 'function') {\r\n element.addEventListener('click', value as EventListener);\r\n } else if (key !== 'children' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n if (vnode.children) {\r\n vnode.children.forEach((child: VNodeChild) => {\r\n if (child === null || child === undefined) return;\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object') {\r\n element.appendChild(this.createElementFromVNode(child));\r\n }\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n return createElement('div', {\r\n className: this.config.containerClassName\r\n },\r\n this.config.enableSearch ? this.renderSearchBar() : null,\r\n createElement('div', {\r\n className: bb_.list,\r\n ref: (el: HTMLElement | null) => {\r\n if (el) {\r\n this.itemsListContainer = el;\r\n }\r\n }\r\n }),\r\n\r\n this.loadState.error ? this.renderError() : null,\r\n this.loadState.loading ? this.renderLoading() : null,\r\n this.loadState.hasMore && !this.loadState.loading && this.items.length > 0 ? this.renderLoadMoreTrigger() : null,\r\n !this.loadState.hasMore && this.items.length > 0 ? this.renderEndMessage() : null\r\n );\r\n }\r\n\r\n private renderSearchBar() {\r\n return createElement('div', { className: bb_.searchbar },\r\n createElement('div', { className: 'row gap-sm' },\r\n createElement('i', { className: 'fas fa-search' }),\r\n createElement('input', {\r\n type: 'text',\r\n className: bb_.formFieldInput,\r\n placeholder: this.config.searchPlaceholder,\r\n ref: (el: HTMLElement | null) => {\r\n if (el) {\r\n this.searchInput = el as HTMLInputElement;\r\n this.searchInput.addEventListener('input', (e) => {\r\n const query = (e.target as HTMLInputElement).value;\r\n this.handleSearch(query);\r\n });\r\n }\r\n }\r\n })\r\n )\r\n );\r\n }\r\n\r\n public renderEmptyState() {\r\n const config = this.config.emptyStateConfig!;\r\n return createElement('div', { className: bb_.emptyState },\r\n createElement('i', { className: `__icon ${config.icon}` }),\r\n createElement('h3', { className: '__title' }, config.title),\r\n createElement('p', { className: '__desc' }, config.description)\r\n );\r\n }\r\n\r\n private renderLoading() {\r\n return createElement('div', { className: bb_.loading },\r\n createElement('i', { className: 'fas fa-spinner fa-spin' }),\r\n createElement('p', {}, this.config.loadingText)\r\n );\r\n }\r\n\r\n private renderError() {\r\n return createElement('div', { className: bb_.error },\r\n createElement('i', { className: 'fas fa-exclamation-triangle' }),\r\n createElement('p', {}, this.loadState.error),\r\n createElement('button', {\r\n className: `${bb_.button} secondary`,\r\n onclick: () => this.loadMore()\r\n },\r\n createElement('i', { className: 'fas fa-redo' }),\r\n ' Retry'\r\n )\r\n );\r\n }\r\n\r\n private renderLoadMoreTrigger() {\r\n return createElement('div', {\r\n className: bb_.trigger,\r\n 'data-load-more-trigger': 'true',\r\n style: 'height: 1px; visibility: hidden;'\r\n });\r\n }\r\n\r\n private renderEndMessage() {\r\n return createElement('div', { className: bb_.end },\r\n createElement('i', { className: 'fas fa-check-circle' }),\r\n t(`All loaded`, { count: String(this.loadState.total) })\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function createItemsLoader<T>(config: ItemsLoaderConfig<T>): ItemsLoader<T> {\r\n const loader = new ItemsLoader<T>();\r\n loader.initialize(config);\r\n return loader;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/dropdown.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement as h, VNode, VNodeChild } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface DropdownItemConfig {\r\n id? : string;\r\n icon? : string;\r\n label : string;\r\n onclick? : (e: Event) => void;\r\n className? : string;\r\n disabled? : boolean;\r\n selected? : boolean;\r\n }\r\n\r\n export interface DropdownConfig {\r\n id : string;\r\n trigger : {\r\n text? : string;\r\n icon? : string;\r\n element? : () => unknown;\r\n className? : string;\r\n };\r\n\r\n items : (DropdownItemConfig | 'divider')[];\r\n position? : 'left' | 'right';\r\n parentId? : string; // For nested dropdowns - ID of parent dropdown\r\n closeOnItemClick? : boolean; // Default: true\r\n preventAutoClose? : boolean; // Prevent closing when clicking inside menu (for interactive content)\r\n\r\n onOpen? : () => void;\r\n onClose? : () => void;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Global dropdown manager - handles hierarchical dropdown system\r\n * - Only one root dropdown open at a time\r\n * - Child dropdowns can be open while parent is open\r\n * - Clicking outside closes all dropdowns\r\n * - Clicking inside a dropdown with preventAutoClose keeps it open\r\n */\r\n class DropdownManagerSingleton {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private static instance : DropdownManagerSingleton;\r\n private dropdowns = new Map<string, Dropdown>(); // id -> dropdown instance\r\n private hierarchy = new Map<string, string>(); // childId -> parentId\r\n private clickHandler? : EventListener;\r\n\r\n private constructor() {\r\n this.setupGlobalClickHandler();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n static getInstance(): DropdownManagerSingleton {\r\n if (!DropdownManagerSingleton.instance) {\r\n DropdownManagerSingleton.instance = new DropdownManagerSingleton();\r\n }\r\n return DropdownManagerSingleton.instance;\r\n }\r\n\r\n /**\r\n * Register dropdown\r\n */\r\n public register(dropdown: Dropdown): void {\r\n this.dropdowns.set(dropdown.config.id, dropdown);\r\n\r\n // Register hierarchy if has parent\r\n if (dropdown.config.parentId) {\r\n this.hierarchy.set(dropdown.config.id, dropdown.config.parentId);\r\n }\r\n }\r\n\r\n /**\r\n * Unregister dropdown\r\n */\r\n public unregister(id: string): void {\r\n this.dropdowns.delete(id);\r\n this.hierarchy.delete(id);\r\n }\r\n\r\n /**\r\n * Open dropdown and close siblings (but not ancestors or descendants)\r\n */\r\n public open(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n // console.log(`📂 Opening dropdown: ${id}`);\r\n\r\n // Close siblings (dropdowns at same level, excluding this one)\r\n this.closeSiblings(id);\r\n\r\n // Actually open the dropdown\r\n dropdown.setOpen(true);\r\n }\r\n\r\n /**\r\n * Close dropdown and all its children\r\n */\r\n public close(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n // console.log(`📁 Closing dropdown: ${id}`);\r\n\r\n // Close this dropdown\r\n dropdown.setOpen(false);\r\n\r\n // Close all children\r\n this.closeChildren(id);\r\n }\r\n\r\n /**\r\n * Close all dropdowns\r\n */\r\n public closeAll(): void {\r\n // console.log('🗂️ Closing all dropdowns');\r\n // Close all root dropdowns (those without parents)\r\n const rootDropdowns = Array.from(this.dropdowns.values())\r\n .filter(d => !d.config.parentId);\r\n\r\n rootDropdowns.forEach(d => this.close(d.config.id));\r\n }\r\n\r\n public destroy(): void {\r\n if (this.clickHandler && typeof window !== 'undefined') {\r\n document.removeEventListener('click', this.clickHandler, true);\r\n }\r\n this.dropdowns.clear();\r\n this.hierarchy.clear();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Check if dropdown is ancestor of another\r\n */\r\n private isAncestor(ancestorId: string, descendantId: string): boolean {\r\n let currentId: string | undefined = descendantId;\r\n\r\n while (currentId) {\r\n if (currentId === ancestorId) return true;\r\n currentId = this.hierarchy.get(currentId);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if dropdown is descendant of another\r\n */\r\n private isDescendant(descendantId: string, ancestorId: string): boolean {\r\n return this.isAncestor(ancestorId, descendantId);\r\n }\r\n\r\n /**\r\n * Get all ancestor IDs of a dropdown (parent, grandparent, etc.)\r\n */\r\n private getAncestors(id: string): Set<string> {\r\n const ancestors = new Set<string>();\r\n let currentId: string | undefined = id;\r\n\r\n while (currentId) {\r\n const parentId = this.hierarchy.get(currentId);\r\n if (parentId) {\r\n ancestors.add(parentId);\r\n currentId = parentId;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return ancestors;\r\n }\r\n\r\n /**\r\n * ✨ NEW: Get all descendant IDs of a dropdown (children, grandchildren, etc.)\r\n */\r\n private getDescendants(id: string): Set<string> {\r\n const descendants = new Set<string>();\r\n\r\n const addChildren = (parentId: string) => {\r\n // Find all direct children\r\n const children = Array.from(this.hierarchy.entries())\r\n .filter(([_, parent]) => parent === parentId)\r\n .map(([childId, _]) => childId);\r\n\r\n // Add each child and recursively add their children\r\n children.forEach(childId => {\r\n descendants.add(childId);\r\n addChildren(childId); // Recursive call for grandchildren\r\n });\r\n };\r\n\r\n addChildren(id);\r\n return descendants;\r\n }\r\n\r\n /**\r\n * Close siblings (dropdowns at same hierarchy level)\r\n */\r\n private closeSiblings(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n const parentId = dropdown.config.parentId;\r\n\r\n // Get all dropdowns with same parent (siblings)\r\n const siblings = Array.from(this.dropdowns.values())\r\n .filter(d => d.config.parentId === parentId && d.config.id !== id);\r\n\r\n // console.log(`👥 Closing ${siblings.length} siblings of ${id}`);\r\n siblings.forEach(sibling => this.close(sibling.config.id));\r\n }\r\n\r\n /**\r\n * Close all children of a dropdown\r\n */\r\n private closeChildren(parentId: string): void {\r\n const children = Array.from(this.dropdowns.values())\r\n .filter(d => d.config.parentId === parentId);\r\n\r\n // console.log(`👶 Closing ${children.length} children of ${parentId}`);\r\n children.forEach(child => this.close(child.config.id));\r\n }\r\n\r\n /**\r\n * Check if there are any open dropdowns\r\n */\r\n private hasOpenDropdowns(): boolean {\r\n return Array.from(this.dropdowns.values()).some(d => d.isOpen);\r\n }\r\n\r\n /**\r\n * Find which dropdown an element belongs to (including nested)\r\n */\r\n private findDropdownForElement(element: HTMLElement): string | null {\r\n // Walk up the DOM tree looking for dropdown containers\r\n let current: HTMLElement | null = element;\r\n\r\n while (current && current !== document.body) {\r\n const dropdownId = current.getAttribute('data-dropdown-id');\r\n if (dropdownId) {\r\n return dropdownId;\r\n }\r\n current = current.parentElement;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Setup global click handler\r\n */\r\n private setupGlobalClickHandler(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n this.clickHandler = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n\r\n // console.log('🖱️ Global click detected');\r\n\r\n // No dropdowns open? Nothing to do\r\n if (!this.hasOpenDropdowns()) {\r\n // console.log(' → No open dropdowns, ignoring');\r\n return;\r\n }\r\n\r\n // Find which dropdown (if any) was clicked\r\n const clickedDropdownId = this.findDropdownForElement(target);\r\n\r\n if (!clickedDropdownId) {\r\n // Clicked completely outside all dropdowns - close all\r\n // console.log(' → Clicked outside all dropdowns, closing all');\r\n this.closeAll();\r\n return;\r\n }\r\n\r\n // console.log(` → Clicked inside dropdown: ${clickedDropdownId}`);\r\n\r\n // Check if clicked dropdown has preventAutoClose\r\n const clickedDropdown = this.dropdowns.get(clickedDropdownId);\r\n if (clickedDropdown?.config.preventAutoClose) {\r\n // console.log(' → Dropdown has preventAutoClose, keeping open');\r\n return;\r\n }\r\n\r\n // Check if clicked on a trigger button (to let toggle handle it)\r\n const clickedOnTrigger = target.closest('.bb_dropdownTrigger');\r\n if (clickedOnTrigger) {\r\n // console.log(' → Clicked on trigger, letting toggle handle it');\r\n return;\r\n }\r\n\r\n // Clicked inside a dropdown menu but not on trigger\r\n const clickedOnMenu = target.closest('.bb_dropdownMenu');\r\n if (clickedOnMenu) {\r\n // Get ancestors of clicked dropdown\r\n const ancestors = this.getAncestors(clickedDropdownId);\r\n\r\n // ✨ FIX: Get all descendants too\r\n const descendants = this.getDescendants(clickedDropdownId);\r\n\r\n // Close all dropdowns that are NOT:\r\n // 1. The clicked dropdown itself\r\n // 2. Ancestors of the clicked dropdown (parents)\r\n // 3. Descendants of the clicked dropdown (children) ✨ NEW\r\n const rootDropdowns = Array.from(this.dropdowns.values())\r\n .filter(d => !d.config.parentId);\r\n\r\n rootDropdowns.forEach(rootDropdown => {\r\n const rootId = rootDropdown.config.id;\r\n\r\n // Keep open if:\r\n // - This is the clicked dropdown\r\n // - This is an ancestor of the clicked dropdown\r\n // - The clicked dropdown is an ancestor of this one (descendant)\r\n const shouldKeepOpen =\r\n rootId === clickedDropdownId ||\r\n ancestors.has(rootId) ||\r\n descendants.has(rootId) || // ✨ NEW: Keep descendants open\r\n this.isDescendant(clickedDropdownId, rootId);\r\n\r\n if (!shouldKeepOpen) {\r\n // console.log(` → Closing unrelated dropdown: ${rootId}`);\r\n this.close(rootId);\r\n } else {\r\n // console.log(` → Keeping related dropdown open: ${rootId}`);\r\n }\r\n });\r\n }\r\n };\r\n\r\n document.addEventListener('click', this.clickHandler, true);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n const dropdownManager = DropdownManagerSingleton.getInstance();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Dropdown extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n public config : DropdownConfig;\r\n public isOpen = false;\r\n private mounted = false;\r\n\r\n constructor(config: DropdownConfig) {\r\n super();\r\n this.config = {\r\n closeOnItemClick: true,\r\n preventAutoClose: false,\r\n ...config\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n onMount() {\r\n this.mounted = true;\r\n dropdownManager.register(this);\r\n // console.log(`✅ Dropdown mounted: ${this.config.id}`);\r\n }\r\n\r\n onUnmount() {\r\n this.mounted = false;\r\n dropdownManager.unregister(this.config.id);\r\n // console.log(`🛑 Dropdown unmounted: ${this.config.id}`);\r\n }\r\n\r\n /**\r\n * Public method to set open state (called by manager)\r\n */\r\n public setOpen(open: boolean) {\r\n // console.log(`🔄 Dropdown ${this.config.id} setOpen(${open}), current: ${this.isOpen}`);\r\n\r\n if (this.isOpen === open) return;\r\n\r\n this.isOpen = open;\r\n\r\n if (open) {\r\n this.config.onOpen?.();\r\n } else {\r\n this.config.onClose?.();\r\n }\r\n\r\n // Manually update DOM instead of triggering Component.update()\r\n this.updateDOM();\r\n }\r\n\r\n\r\n /**\r\n * Toggle dropdown\r\n */\r\n toggle(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n // console.log(`🖱️ Dropdown ${this.config.id} toggle clicked, current state: ${this.isOpen}`);\r\n\r\n if (this.isOpen) {\r\n dropdownManager.close(this.config.id);\r\n } else {\r\n dropdownManager.open(this.config.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle item click\r\n */\r\n handleItemClick(item: DropdownItemConfig, e: Event) {\r\n if (item.disabled) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n\r\n // console.log(`🎯 Item clicked in dropdown ${this.config.id}:`, item.label);\r\n\r\n // Don't prevent propagation - let it bubble up\r\n // But stop it if we're going to close\r\n if (this.config.closeOnItemClick) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n dropdownManager.close(this.config.id);\r\n }\r\n\r\n // Call item's onclick handler\r\n item.onclick?.(e);\r\n }\r\n\r\n render() {\r\n // console.log(`🎨 Dropdown ${this.config.id} render(), isOpen: ${this.isOpen}`);\r\n\r\n const trigger = this.renderTrigger();\r\n const menu = this.isOpen ? this.renderMenu() : null;\r\n\r\n return h('div', {\r\n className: `bb_dropdown bb_dropdown--${this.config.position || 'left'} ${this.isOpen ? 'bb_dropdown--open' : ''}`,\r\n 'data-dropdown-id': this.config.id\r\n },\r\n trigger,\r\n menu\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Manually update the dropdown's DOM without triggering parent re-renders\r\n */\r\n private updateDOM() {\r\n if (!this.mounted || !this.element) return;\r\n\r\n // Update the container class\r\n if (this.isOpen) {\r\n this.element.classList.add('bb_dropdown--open');\r\n } else {\r\n this.element.classList.remove('bb_dropdown--open');\r\n }\r\n\r\n // Find the menu container (next sibling of trigger)\r\n const trigger = this.element.querySelector('.bb_dropdownTrigger');\r\n const menuContainer = trigger?.nextElementSibling;\r\n\r\n if (this.isOpen) {\r\n // Create and append menu if it doesn't exist\r\n if (!menuContainer || !menuContainer.classList.contains('bb_dropdownMenu')) {\r\n const menuVNode = this.renderMenu();\r\n const menuElement = this.createElementFromVNode(menuVNode);\r\n this.element.appendChild(menuElement);\r\n }\r\n } else {\r\n // Remove menu if it exists\r\n if (menuContainer && menuContainer.classList.contains('bb_dropdownMenu')) {\r\n menuContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create DOM element from VNode (simplified version)\r\n */\r\n private createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type === 'string') {\r\n const element = document.createElement(vnode.type);\r\n\r\n // Set properties\r\n if (vnode.props) {\r\n Object.entries(vnode.props).forEach(([key, value]) => {\r\n if (key === 'className') {\r\n element.className = value as string;\r\n } else if (key === 'onclick' && typeof value === 'function') {\r\n element.addEventListener('click', value as EventListener);\r\n } else if (key !== 'children' && key !== 'key') {\r\n element.setAttribute(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n // Add children\r\n if (vnode.children) {\r\n vnode.children.forEach((child: VNodeChild) => {\r\n if (child === null || child === undefined) return;\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object') {\r\n element.appendChild(this.createElementFromVNode(child));\r\n }\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n return document.createElement('div');\r\n }\r\n\r\n\r\n private renderTrigger() {\r\n const customElement = this.config.trigger.element?.() as VNodeChild;\r\n\r\n const triggerClassName = [\r\n 'bb_dropdownTrigger',\r\n this.config.trigger.className || ''\r\n ].filter(Boolean).join(' ');\r\n\r\n if (customElement) {\r\n return h('button', {\r\n className: triggerClassName,\r\n onclick: (e: Event) => this.toggle(e)\r\n },\r\n customElement\r\n );\r\n }\r\n\r\n return h('button', {\r\n className: triggerClassName,\r\n onclick: (e: Event) => this.toggle(e)\r\n },\r\n this.config.trigger.icon ? h('i', { className: this.config.trigger.icon }) : null,\r\n this.config.trigger.text ? h('span', {}, this.config.trigger.text) : null,\r\n h('i', {\r\n className: `bb_dropdownArrow fas fa-chevron-down ${this.isOpen ? 'bb_dropdownArrow--open' : ''}`\r\n })\r\n );\r\n }\r\n\r\n private renderMenu() {\r\n return h('div', {\r\n className: 'bb_dropdownMenu',\r\n onclick: (e: Event) => {\r\n // Only stop propagation if preventAutoClose is true\r\n if (this.config.preventAutoClose) {\r\n e.stopPropagation();\r\n }\r\n }\r\n },\r\n this.config.items.map((item, index) => {\r\n if (item === 'divider') {\r\n return h('div', {\r\n className: 'bb_dropdown__divider',\r\n key: `divider-${index}`\r\n });\r\n }\r\n\r\n const itemClassName = [\r\n 'bb_dropdownItem',\r\n item.className || '',\r\n item.disabled ? 'bb_dropdownItem--disabled' : '',\r\n item.selected ? 'bb_dropdownItem--selected' : ''\r\n ].filter(Boolean).join(' ');\r\n\r\n const buttonProps: {\r\n key: string;\r\n className: string;\r\n onclick: (e: Event) => void;\r\n disabled?: boolean;\r\n } = {\r\n key: item.id || `item-${index}`,\r\n className: itemClassName,\r\n onclick: (e: Event) => this.handleItemClick(item, e)\r\n };\r\n\r\n // Only add disabled attribute if actually true\r\n if (item.disabled) {\r\n buttonProps.disabled = true;\r\n }\r\n\r\n return h('button', buttonProps,\r\n item.icon ? h('i', { className: item.icon }) : null,\r\n h('span', {}, item.label)\r\n );\r\n })\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n /**\r\n * Create a dropdown instance\r\n */\r\n export function createDropdown(config: DropdownConfig): Dropdown {\r\n return new Dropdown(config);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/help.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { ClassValue } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Debounce function\r\n * Delays function execution until after wait time\r\n */\r\n export function debounce<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n fn(...args);\r\n }, delay);\r\n };\r\n }\r\n\r\n /**\r\n * Throttle function\r\n * Limits function execution to once per time period\r\n */\r\n export function throttle<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let lastCall = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n const now = Date.now();\r\n const timeSinceLastCall = now - lastCall;\r\n\r\n if (timeSinceLastCall >= delay) {\r\n lastCall = now;\r\n fn(...args);\r\n } else if (!timeoutId) {\r\n // Schedule execution at the end of the throttle period\r\n timeoutId = setTimeout(() => {\r\n lastCall = Date.now();\r\n timeoutId = null;\r\n fn(...args);\r\n }, delay - timeSinceLastCall);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Class names utility\r\n * Combines class names conditionally\r\n */\r\n export function classNames(...classes: ClassValue[]): string {\r\n const result: string[] = [];\r\n\r\n for (const cls of classes) {\r\n if (!cls) continue;\r\n\r\n if (typeof cls === 'string') {\r\n result.push(cls);\r\n } else if (typeof cls === 'object') {\r\n for (const [key, value] of Object.entries(cls)) {\r\n if (value) {\r\n result.push(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result.join(' ');\r\n }\r\n\r\n /**\r\n * Format date\r\n * Simple date formatting utility with validation\r\n */\r\n export function formatDate(date: Date | string | number, format: string = 'YYYY-MM-DD'): string {\r\n const d = date instanceof Date ? date : new Date(date);\r\n\r\n // Validate date\r\n if (isNaN(d.getTime())) {\r\n throw new Error('Invalid date provided to formatDate');\r\n }\r\n\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n const hours = String(d.getHours()).padStart(2, '0');\r\n const minutes = String(d.getMinutes()).padStart(2, '0');\r\n const seconds = String(d.getSeconds()).padStart(2, '0');\r\n\r\n return format\r\n .replace('YYYY', String(year))\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('HH', hours)\r\n .replace('mm', minutes)\r\n .replace('ss', seconds);\r\n }\r\n\r\n /**\r\n * Deep clone object\r\n * Handles Date, Array, and nested objects\r\n */\r\n export function deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as T;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => deepClone(item)) as T;\r\n }\r\n\r\n if (obj instanceof RegExp) {\r\n return new RegExp(obj.source, obj.flags) as T;\r\n }\r\n\r\n if (obj instanceof Map) {\r\n const clonedMap = new Map();\r\n obj.forEach((value, key) => {\r\n clonedMap.set(deepClone(key), deepClone(value));\r\n });\r\n return clonedMap as T;\r\n }\r\n\r\n if (obj instanceof Set) {\r\n const clonedSet = new Set();\r\n obj.forEach(value => {\r\n clonedSet.add(deepClone(value));\r\n });\r\n return clonedSet as T;\r\n }\r\n\r\n if (Object.prototype.toString.call(obj) === '[object Object]') {\r\n const cloned: Record<string, unknown> = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n }\r\n return cloned as T;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Merge objects deeply\r\n * Properly handles nested objects and arrays\r\n */\r\n export function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n ): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n if (!source) return target;\r\n\r\n if (isObject(target) && isObject(source)) {\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n\r\n if (sourceValue !== undefined) {\r\n if (isObject(sourceValue) && !Array.isArray(sourceValue)) {\r\n if (!targetValue || !isObject(targetValue)) {\r\n target[key] = {} as T[Extract<keyof T, string>];\r\n }\r\n deepMerge(target[key] as Record<string, unknown>, sourceValue as Record<string, unknown>);\r\n } else {\r\n target[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n }\r\n\r\n /**\r\n * Helper to check if value is a plain object\r\n */\r\n function isObject(item: unknown): item is Record<string, unknown> {\r\n return item !== null && typeof item === 'object' && !Array.isArray(item);\r\n }\r\n\r\n /**\r\n * Generate unique ID with better entropy\r\n */\r\n let uniqueIdCounter = 0;\r\n\r\n export function uniqueId(prefix: string = 'id'): string {\r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 11);\r\n uniqueIdCounter = (uniqueIdCounter || 0) + 1;\r\n const counter = uniqueIdCounter.toString(36);\r\n return `${prefix}_${timestamp}_${randomPart}_${counter}`;\r\n }\r\n\r\n /**\r\n * Sleep/delay utility\r\n */\r\n export function sleep(ms: number): Promise<void> {\r\n if (ms < 0) {\r\n throw new Error('Sleep duration must be non-negative');\r\n }\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * Check if value is empty\r\n */\r\n export function isEmpty(value: unknown): boolean {\r\n if (value == null) return true;\r\n if (typeof value === 'string') return value.trim().length === 0;\r\n if (Array.isArray(value)) return value.length === 0;\r\n if (value instanceof Map || value instanceof Set) return value.size === 0;\r\n if (typeof value === 'object') return Object.keys(value).length === 0;\r\n return false;\r\n }\r\n\r\n /**\r\n * Capitalize first letter\r\n */\r\n export function capitalize(str: string): string {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n\r\n /**\r\n * Convert to kebab-case\r\n */\r\n export function kebabCase(str: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n }\r\n\r\n /**\r\n * Convert to camelCase\r\n */\r\n export function camelCase(str: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char: string) => (char ? char.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, char => char.toLowerCase());\r\n }\r\n\r\n /**\r\n * Convert to PascalCase\r\n */\r\n export function pascalCase(str: string): string {\r\n if (!str) return '';\r\n const camel = camelCase(str);\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n }\r\n\r\n /**\r\n * Truncate string\r\n */\r\n export function truncate(str: string, length: number, suffix: string = '...'): string {\r\n if (!str || str.length <= length) return str;\r\n return str.substring(0, length - suffix.length) + suffix;\r\n }\r\n\r\n /**\r\n * Parse query string\r\n */\r\n export function parseQuery(queryString: string): Record<string, string | string[]> {\r\n const query: Record<string, string | string[]> = {};\r\n const cleaned = queryString.replace(/^\\?/, '');\r\n\r\n if (!cleaned) return query;\r\n\r\n const pairs = cleaned.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=').map(decodeURIComponent);\r\n if (!key) continue;\r\n\r\n const decodedValue = value || '';\r\n\r\n // Handle array parameters (key[]=value)\r\n if (key.endsWith('[]')) {\r\n const actualKey = key.slice(0, -2);\r\n if (!query[actualKey]) {\r\n query[actualKey] = [];\r\n }\r\n (query[actualKey] as string[]).push(decodedValue);\r\n } else {\r\n query[key] = decodedValue;\r\n }\r\n }\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * Stringify object to query string\r\n */\r\n export function stringifyQuery(obj: Record<string, unknown>): string {\r\n const pairs: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value == null) continue;\r\n\r\n if (Array.isArray(value)) {\r\n // Handle arrays\r\n for (const item of value) {\r\n if (item != null) {\r\n pairs.push(`${encodeURIComponent(key)}[]=${encodeURIComponent(String(item))}`);\r\n }\r\n }\r\n } else {\r\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\r\n }\r\n }\r\n\r\n return pairs.length > 0 ? `?${pairs.join('&')}` : '';\r\n }\r\n\r\n /**\r\n * Clamp a number between min and max\r\n */\r\n export function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n /**\r\n * Check if code is running in browser\r\n */\r\n export function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n }\r\n\r\n /**\r\n * Safe JSON parse with fallback\r\n */\r\n export function safeJsonParse<T = unknown>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n }\r\n\r\n /**\r\n * Export all utilities\r\n */\r\n export const utils = {\r\n debounce,\r\n throttle,\r\n classNames,\r\n formatDate,\r\n deepClone,\r\n deepMerge,\r\n uniqueId,\r\n sleep,\r\n isEmpty,\r\n capitalize,\r\n kebabCase,\r\n camelCase,\r\n pascalCase,\r\n truncate,\r\n parseQuery,\r\n stringifyQuery,\r\n clamp,\r\n isBrowser,\r\n safeJsonParse,\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/utils/intersection_observer.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Configuration for intersection observer\r\n */\r\n export interface IntersectionConfig {\r\n root? : Element | null;\r\n rootMargin? : string;\r\n threshold? : number | number[];\r\n onEnter? : (entry: IntersectionObserverEntry) => void;\r\n onExit? : (entry: IntersectionObserverEntry) => void;\r\n once? : boolean; // If true, unobserve after first intersection\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Simple wrapper around Intersection Observer API\r\n * Makes it easy to detect when elements become visible\r\n */\r\n export class VisibilityObserver {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private observer: IntersectionObserver | null = null;\r\n private observedElements = new Map<Element, boolean>(); // Track visibility state\r\n\r\n constructor(config: IntersectionConfig) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n const wasVisible = this.observedElements.get(entry.target) ?? false;\r\n const isNowVisible = entry.isIntersecting;\r\n\r\n // Only trigger callbacks on state change\r\n if (isNowVisible && !wasVisible) {\r\n // Element entered viewport\r\n this.observedElements.set(entry.target, true);\r\n config.onEnter?.(entry);\r\n\r\n if (config.once) {\r\n this.unobserve(entry.target);\r\n }\r\n } else if (!isNowVisible && wasVisible) {\r\n // Element left viewport\r\n this.observedElements.set(entry.target, false);\r\n config.onExit?.(entry);\r\n }\r\n });\r\n }, {\r\n root: config.root || null,\r\n rootMargin: config.rootMargin || '0px',\r\n threshold: config.threshold ?? 0.1\r\n });\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Start observing an element\r\n */\r\n observe(element: Element): void {\r\n if (this.observer) {\r\n this.observer.observe(element);\r\n this.observedElements.set(element, false);\r\n }\r\n }\r\n\r\n /**\r\n * Stop observing an element\r\n */\r\n unobserve(element: Element): void {\r\n if (this.observer) {\r\n this.observer.unobserve(element);\r\n this.observedElements.delete(element);\r\n }\r\n }\r\n\r\n /**\r\n * Disconnect the observer\r\n */\r\n disconnect(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observedElements.clear();\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Helper function to observe when element becomes visible (once)\r\n * @param element - Element to observe\r\n * @param callback - Callback when element becomes visible\r\n * @returns Function to stop observing\r\n */\r\n export function observeVisibility(\r\n element: Element,\r\n callback: (entry: IntersectionObserverEntry) => void\r\n ): () => void {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n callback(entry);\r\n observer.unobserve(element);\r\n }\r\n });\r\n }, {\r\n threshold: 0.1\r\n });\r\n\r\n observer.observe(element);\r\n\r\n return () => observer.disconnect();\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/utils/time_formatter.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Formats a timestamp into a relative time string with translation\r\n * Returns the formatted time and original ISO string as title attribute\r\n *\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Object with formatted time and original timestamp for title\r\n */\r\n export function formatRelativeTime(timestamp: string | Date) {\r\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\r\n const now = new Date();\r\n const diffMs = now.getTime() - date.getTime();\r\n const diffSecs = Math.floor(diffMs / 1000);\r\n const diffMins = Math.floor(diffSecs / 60);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n const diffWeeks = Math.floor(diffDays / 7);\r\n const diffMonths = Math.floor(diffDays / 30);\r\n const diffYears = Math.floor(diffDays / 365);\r\n\r\n let formatted = '';\r\n\r\n if (diffSecs < 0) {\r\n // Future date\r\n formatted = t('time.just_now');\r\n } else if (diffSecs < 60) {\r\n // Less than a minute\r\n formatted = t('time.just_now');\r\n } else if (diffMins < 2) {\r\n // 1 minute\r\n formatted = t('time.minute_ago');\r\n } else if (diffMins < 60) {\r\n // Multiple minutes\r\n formatted = t('time.minutes_ago', { count: diffMins.toString() });\r\n } else if (diffHours < 2) {\r\n // 1 hour\r\n formatted = t('time.hour_ago');\r\n } else if (diffHours < 24) {\r\n // Multiple hours\r\n formatted = t('time.hours_ago', { count: diffHours.toString() });\r\n } else if (diffDays < 2) {\r\n // 1 day\r\n formatted = t('time.day_ago');\r\n } else if (diffDays < 7) {\r\n // Multiple days\r\n formatted = t('time.days_ago', { count: diffDays.toString() });\r\n } else if (diffWeeks < 2) {\r\n // 1 week\r\n formatted = t('time.week_ago');\r\n } else if (diffWeeks < 4) {\r\n // Multiple weeks\r\n formatted = t('time.weeks_ago', { count: diffWeeks.toString() });\r\n } else if (diffMonths < 2) {\r\n // 1 month\r\n formatted = t('time.month_ago');\r\n } else if (diffMonths < 12) {\r\n // Multiple months\r\n formatted = t('time.months_ago', { count: diffMonths.toString() });\r\n } else if (diffYears < 2) {\r\n // 1 year\r\n formatted = t('time.year_ago');\r\n } else {\r\n // Multiple years\r\n formatted = t('time.years_ago', { count: diffYears.toString() });\r\n }\r\n\r\n return {\r\n formatted,\r\n originalDate: date.toISOString(),\r\n title: date.toLocaleString()\r\n };\r\n }\r\n\r\n /**\r\n * Creates an HTML time element with relative time and title attribute\r\n * Usage: place this directly in your component render\r\n *\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Object with text content and title for use in createElement\r\n */\r\n export function getTimeDisplay(timestamp: string | Date) {\r\n const { formatted, title } = formatRelativeTime(timestamp);\r\n return {\r\n text: formatted,\r\n title\r\n };\r\n }\r\n\r\n /**\r\n * Format time for display with full date fallback\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Formatted string like \"2 hours ago\"\r\n */\r\n export function formatTimeAgo(timestamp: string | Date): string {\r\n return formatRelativeTime(timestamp).formatted;\r\n }\r\n\r\n /**\r\n * Get the ISO string for title attribute\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Localized full date string\r\n */\r\n export function getTimeTitle(timestamp: string | Date): string {\r\n return formatRelativeTime(timestamp).title;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n // Config VDOM\r\n import { setConfig } from '@je-es/vdom';\r\n setConfig({\r\n devMode: false, // Enable warnings\r\n sanitizeHTML: true, // XSS protection\r\n // onError: (err) => { // Custom error handler\r\n // console.error('VDOM Error:', err);\r\n // }\r\n });\r\n\r\n // Types\r\n export * from './types';\r\n\r\n // Core\r\n export * from './mod/core/component';\r\n export * from './mod/core/decorators';\r\n export * from './mod/core/scheduler';\r\n export * from './mod/core/context';\r\n export * from './mod/core/hooks';\r\n export * from './mod/core/router';\r\n export * from './mod/core/store';\r\n export * from './mod/core/client';\r\n export * from './mod/core/styles';\r\n\r\n // Services\r\n export * from './mod/services/i18n';\r\n\r\n // Components\r\n export * from './mod/components/toast';\r\n export * from './mod/components/loader';\r\n export * from './mod/components/popup';\r\n export * from './mod/components/smart_form';\r\n export * from './mod/components/tabbed_view';\r\n export * from './mod/components/items_loader';\r\n export * from './mod/components/dropdown';\r\n\r\n // Utilities\r\n export * from './mod/help';\r\n export * from './mod/utils/intersection_observer';\r\n export * from './mod/utils/time_formatter';\r\n\r\n // Third-party packages\r\n export { api, http, configureApi, getApiConfig, resetApiConfig, type ApiError } from '@je-es/capi';\r\n export { createElement, html, patch, createDOMElement } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
|
|
1
|
+
{"version":3,"sources":["../src/mod/core/styles.ts","../src/mod/core/scheduler.ts","../src/mod/core/component.ts","../src/mod/core/decorators.ts","../src/mod/core/context.ts","../src/mod/core/hooks.ts","../src/mod/core/router.ts","../src/mod/core/store.ts","../src/mod/core/client.ts","../src/mod/services/i18n.ts","../src/mod/components/toast.ts","../src/mod/components/loader.ts","../src/mod/components/smart_form.ts","../src/mod/components/popup.ts","../src/mod/components/tabbed_view.ts","../src/mod/components/items_loader.ts","../src/mod/components/dropdown.ts","../src/mod/help.ts","../src/mod/utils/intersection_observer.ts","../src/mod/utils/time_formatter.ts","../src/main.ts"],"names":["StyleManager","css","componentName","id","styleElement","scopedCSS","scope","lines","scopedLines","braceCount","line","selector","rest","scopedSelector","element","strings","values","result","i","UpdateScheduler","callback","callbacks","error","scheduler","Component","props","initialState","partialState","newState","prevState","hasChanged","key","newProps","prevProps","updater","prevIsScheduled","container","unsubscribe","name","el","compute","deps","cached","subscription","fn","delay","timeoutId","args","lastCall","now","timeSinceLastCall","newVNode","parent","index","oldVDomNode","newVDomNode","patch","data","originalElement","newElement","attrs","attr","child","vnode","convertedProps","value","convertedChildren","eventName","errorInfo","prevDeps","nextDeps","dep","propertyName","newValue","oldValue","watchers","methodName","state","target","context","propertyKey","instance","initialValue","hiddenKey","inst","targetConstructor","initKey","computed","targetOrGetter","descriptor","ctx","originalGetter","cacheKey","dirtyKey","watch","decorator","targetOrMethod","Context","defaultValue","subscriber","createContext","Provider","children","html","useContext","component","CombinedContext","initialValues","createCombinedContext","currentComponent","currentHookIndex","hookStates","setHookContext","clearHookContext","getHookStates","useState","hookIndex","states","setState","nextValue","useEffect","effect","areDepsEqual","cleanup","useMemo","factory","useCallback","useRef","useReducer","reducer","dispatch","action","useLocalStorage","storedValue","setStoredValue","item","prevValue","valueToStore","useDebounce","debouncedValue","setDebouncedValue","handler","usePrevious","ref","useToggle","setValue","toggle","v","useInterval","savedCallback","useFetch","url","options","setData","loading","setLoading","setError","fetchData","response","json","e","useWindowSize","size","setSize","handleResize","useEventListener","savedHandler","eventListener","event","createFunctionalComponent","displayName","FunctionalComponent","Router","routes","mode","base","scrollBehavior","path","delta","hook","exact","createElement","r","params","route","matchedRoute","link","href","to","from","guard","resolve","nextPath","ComponentClass","ComponentCtor","proto","exp","errorMessage","normalizedPath","cleanPath","pattern","paramNames","regexPattern","_","paramName","regex","match","search","query","pair","router","navigate","replace","goBack","goForward","getCurrentPath","isCurrentPath","isCurrentPathPrefix","prefix","reloadRoute","currentPath","navigateWithQuery","getQueryParams","getQueryParam","Store","stored","update","middleware","listener","updates","prevNotify","shouldNotify","stateCopy","createStore","createComputedStore","stores","computer","computedStore","s","store","connect","mapStateToProps","client","config","_config","stylesDir","outputPath","sass","writeFileSync","existsSync","mkdirSync","join","dirname","outputDir","outputFile","mainScssFile","fullOutputPath","dir","readdirSync","statSync","extname","files","entries","entry","fullPath","stat","entryDir","eventType","filename","capiConfig","configureApi","I18nManager","lang","translations","trans","translation","param","paramValue","currentLang","htmlString","processedString","openingTag","pairedContent","selfClosingTag","textContent","tagName","updateCallback","urlPattern","urls","langCodes","fullUrl","langMatch","i18nInstance","getI18n","t","tLang","tHtml","setLanguage","setLanguageAsync","staticPath","manager","currentTranslations","baseUrl","getCurrentLanguage","loadLanguage","loadTranslations","getSupportedLanguages","hasKey","getTranslations","createTranslator","loadFromUrl","initializeI18n","setupI18n","langToLoad","langUrl","loadLanguageFile","bb_","Toast","message","type","duration","translateKey","m","msg","icons","displayMessage","__decorateClass","globalToast","initToast","toastContainer","getToast","toast","Loader","containerClasses","spinnerClass","text","progress","increment","SmartFormComponent","field","fieldName","f","validation","stringValue","isValid","errors","firstErrorField","api","labelNode","optionNodes","opt","submitButton","fieldNodes","SmartForm","Popup","popup","sizeClass","variantClass","button","_reject","wrappedFormConfig","p","lastPopup","globalPopup","initPopup","popupContainer","getPopup","TabbedView","savedTab","tabId","tab","containerClass","headerClass","isActive","tabClass","label","contentClass","activeTab","wrappedProps","wrappedVNode","createTabbedView","view","mountTabbedView","ItemsLoader","scrollTop","scrollHeight","clientHeight","scrollContainer","savedScrollTop","savedScrollHeight","nextPage","newItems","total","scrollHeightDiff","newFilters","searchQuery","updatedItems","itemIndex","itemId","shouldTrack","items","containerRect","rect","viewedItemsArray","itemIds","fragment","startIndex","actualIndex","itemElement","loadingEl","loadingVNode","emptyVNode","emptyElement","createDOMElement","triggerVNode","triggerElement","endMsgVNode","endMsgElement","tryObserve","trigger","candidates","candidate","page","separator","headers","token","createItemsLoader","loader","DropdownManagerSingleton","_DropdownManagerSingleton","dropdown","d","ancestorId","descendantId","currentId","ancestors","parentId","descendants","addChildren","childId","sibling","current","dropdownId","clickedDropdownId","rootDropdown","rootId","dropdownManager","Dropdown","open","menu","h","menuContainer","menuVNode","menuElement","customElement","triggerClassName","arrowClasses","itemClassName","buttonProps","createDropdown","debounce","throttle","classNames","classes","cls","formatDate","date","format","year","month","day","hours","minutes","seconds","deepClone","obj","clonedMap","clonedSet","cloned","deepMerge","sources","source","isObject","sourceValue","targetValue","uniqueIdCounter","uniqueId","timestamp","randomPart","counter","sleep","ms","isEmpty","capitalize","str","kebabCase","camelCase","char","pascalCase","camel","truncate","length","suffix","parseQuery","queryString","cleaned","pairs","decodedValue","actualKey","stringifyQuery","clamp","min","max","isBrowser","safeJsonParse","fallback","utils","VisibilityObserver","wasVisible","isNowVisible","observeVisibility","observer","formatRelativeTime","diffMs","diffSecs","diffMins","diffHours","diffDays","diffWeeks","diffMonths","diffYears","formatted","getTimeDisplay","title","formatTimeAgo","getTimeTitle","setConfig"],"mappings":"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","file":"main.js","sourcesContent":["// src/mod/core/styles.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Style Manager - handles CSS injection and scoping\r\n */\r\n export class StyleManager {\r\n private static styles = new Map<string, HTMLStyleElement>();\r\n private static scopeCounter = 0;\r\n\r\n /**\r\n * Inject styles into document\r\n */\r\n static inject(css: string, componentName?: string): string {\r\n const id = componentName || `style-${this.scopeCounter++}`;\r\n\r\n if (this.styles.has(id)) {\r\n return id;\r\n }\r\n\r\n const styleElement = document.createElement('style');\r\n styleElement.setAttribute('data-component', id);\r\n\r\n // Scope the CSS\r\n const scopedCSS = this.scopeStyles(css, id);\r\n styleElement.textContent = scopedCSS;\r\n\r\n document.head.appendChild(styleElement);\r\n this.styles.set(id, styleElement);\r\n\r\n return id;\r\n }\r\n\r\n /**\r\n * Remove styles from document\r\n */\r\n static remove(id: string): void {\r\n const styleElement = this.styles.get(id);\r\n if (styleElement && styleElement.parentElement) {\r\n styleElement.parentElement.removeChild(styleElement);\r\n this.styles.delete(id);\r\n }\r\n }\r\n\r\n /**\r\n * Scope CSS selectors\r\n */\r\n private static scopeStyles(css: string, scope: string): string {\r\n // Simple scoping - prefix all selectors with [data-scope=\"id\"]\r\n // This is a basic implementation. A production version would use a proper CSS parser\r\n\r\n const lines = css.split('\\n');\r\n const scopedLines: string[] = [];\r\n let inMediaQuery = false;\r\n let braceCount = 0;\r\n\r\n for (let line of lines) {\r\n line = line.trim();\r\n\r\n // Handle media queries\r\n if (line.startsWith('@media')) {\r\n inMediaQuery = true;\r\n scopedLines.push(line);\r\n continue;\r\n }\r\n\r\n // Count braces\r\n braceCount += (line.match(/{/g) || []).length;\r\n braceCount -= (line.match(/}/g) || []).length;\r\n\r\n if (inMediaQuery && braceCount === 0) {\r\n inMediaQuery = false;\r\n }\r\n\r\n // Scope selectors\r\n if (line.includes('{') && !line.startsWith('@') && !line.startsWith('}')) {\r\n const selector = line.substring(0, line.indexOf('{')).trim();\r\n const rest = line.substring(line.indexOf('{'));\r\n\r\n // Don't scope :root, *, or @-rules\r\n if (selector === ':root' || selector === '*' || line.startsWith('@')) {\r\n scopedLines.push(line);\r\n } else {\r\n const scopedSelector = `[data-scope=\"${scope}\"] ${selector}`;\r\n scopedLines.push(`${scopedSelector} ${rest}`);\r\n }\r\n } else {\r\n scopedLines.push(line);\r\n }\r\n }\r\n\r\n return scopedLines.join('\\n');\r\n }\r\n\r\n /**\r\n * Clear all styles\r\n */\r\n static clear(): void {\r\n for (const [, element] of this.styles) {\r\n if (element.parentElement) {\r\n element.parentElement.removeChild(element);\r\n }\r\n }\r\n this.styles.clear();\r\n }\r\n }\r\n\r\n /**\r\n * CSS template literal tag\r\n * Usage: css`.class { color: red; }`\r\n */\r\n export function css(\r\n strings: TemplateStringsArray,\r\n ...values: unknown[]\r\n ): string {\r\n let result = '';\r\n\r\n for (let i = 0; i < strings.length; i++) {\r\n result += strings[i];\r\n if (i < values.length) {\r\n result += values[i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/scheduler.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n type UpdateCallback = () => void;\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Update Scheduler\r\n * Batches multiple state changes into a single render\r\n */\r\n class UpdateScheduler {\r\n private queue = new Set<UpdateCallback>();\r\n private isFlushScheduled = false;\r\n private isFlushing = false;\r\n\r\n /**\r\n * Schedule a component update\r\n */\r\n schedule(callback: UpdateCallback): void {\r\n if (this.isFlushing) {\r\n // If we're currently flushing, schedule for next batch\r\n requestAnimationFrame(() => this.schedule(callback));\r\n return;\r\n }\r\n\r\n this.queue.add(callback);\r\n\r\n if (!this.isFlushScheduled) {\r\n this.isFlushScheduled = true;\r\n\r\n // Use microtask for immediate batching, then RAF for rendering\r\n Promise.resolve().then(() => {\r\n requestAnimationFrame(() => this.flush());\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Force immediate flush (for urgent updates)\r\n */\r\n flushSync(callback: UpdateCallback): void {\r\n callback();\r\n }\r\n\r\n /**\r\n * Flush all pending updates\r\n */\r\n private flush(): void {\r\n if (this.queue.size === 0) {\r\n this.isFlushScheduled = false;\r\n return;\r\n }\r\n\r\n this.isFlushing = true;\r\n this.isFlushScheduled = false;\r\n\r\n const callbacks = Array.from(this.queue);\r\n this.queue.clear();\r\n\r\n // Execute all updates\r\n for (const callback of callbacks) {\r\n try {\r\n callback();\r\n } catch (error) {\r\n console.error('Error during update:', error);\r\n }\r\n }\r\n\r\n this.isFlushing = false;\r\n\r\n // If new updates were scheduled during flush, process them\r\n if (this.queue.size > 0) {\r\n this.schedule(() => {});\r\n }\r\n }\r\n\r\n /**\r\n * Clear all pending updates\r\n */\r\n clear(): void {\r\n this.queue.clear();\r\n this.isFlushScheduled = false;\r\n }\r\n\r\n /**\r\n * Get queue size (for debugging)\r\n */\r\n get size(): number {\r\n return this.queue.size;\r\n }\r\n }\r\n\r\n // Export singleton instance\r\n export const scheduler = new UpdateScheduler();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/component.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { patch } from '@je-es/vdom';\r\n import type { VNode } from '../../types';\r\n import { StyleManager } from './styles';\r\n import { scheduler } from './scheduler';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export abstract class Component<P = Record<string, unknown>, S = Record<string, unknown>> {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n public props : P;\r\n public state : S;\r\n public _isMounted : boolean = false;\r\n\r\n private _isUnmounting : boolean = false;\r\n private _element : HTMLElement | null = null;\r\n private _vnode : VNode | null = null;\r\n private _styleId : string | null = null;\r\n private _isScheduledForUpdate : boolean = false;\r\n private _updateBatch = new Set<string>();\r\n private _refs = new Map<string, HTMLElement>();\r\n private _subscriptions : (() => void)[] = [];\r\n private _memoCache = new Map<string, { args: unknown[]; result: unknown }>();\r\n private _isInitializing : boolean = false;\r\n private _skipNextUpdate : boolean = false;\r\n private _preservedElements = new Map<Element, { parent: Element; children: Node[] }>();\r\n private _updateInProgress : boolean = false;\r\n\r\n constructor(props?: P, initialState?: S) {\r\n this.props = props || {} as P;\r\n this.state = initialState || {} as S;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n onBeforeMount?(): void | Promise<void>;\r\n onMount?(): void | Promise<void>;\r\n onBeforeUpdate?(prevProps: P, prevState: S): void | Promise<void>;\r\n onUpdate?(prevProps: P, prevState: S): void;\r\n onBeforeUnmount?(): void;\r\n onUnmount?(): void;\r\n onError?(error: Error, errorInfo: { componentStack?: string }): void;\r\n onPropsChange?(prevProps: P, newProps: P): void;\r\n onStateChange?(prevState: S, newState: S): void;\r\n shouldUpdate?(prevProps: P, prevState: S): boolean;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n abstract render(): VNode;\r\n styles?(): string;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n setState(\r\n partialState: Partial<S> | ((prevState: S) => Partial<S>),\r\n callback?: () => void\r\n ): void {\r\n // Don't trigger updates during initialization\r\n if (this._isInitializing) {\r\n const newState = typeof partialState === 'function'\r\n ? partialState(this.state)\r\n : partialState;\r\n this.state = { ...this.state, ...newState };\r\n return;\r\n }\r\n\r\n // Don't trigger updates during unmounting\r\n if (this._isUnmounting) {\r\n return;\r\n }\r\n\r\n const prevState = { ...this.state };\r\n const newState = typeof partialState === 'function'\r\n ? partialState(this.state)\r\n : partialState;\r\n\r\n // Check if state actually changed\r\n let hasChanged = false;\r\n for (const key in newState) {\r\n if (prevState[key] !== newState[key]) {\r\n hasChanged = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasChanged) {\r\n // State didn't change, just run callback if provided\r\n if (callback) {\r\n scheduler.schedule(callback);\r\n }\r\n return;\r\n }\r\n\r\n this.state = { ...this.state, ...newState };\r\n\r\n this.onStateChange?.(prevState, this.state);\r\n this.update();\r\n\r\n if (callback) {\r\n scheduler.schedule(callback);\r\n }\r\n }\r\n\r\n setProps(newProps: Partial<P>): void {\r\n if (this._isUnmounting) {\r\n return;\r\n }\r\n\r\n const prevProps = { ...this.props };\r\n\r\n // Check if props actually changed\r\n let hasChanged = false;\r\n for (const key in newProps) {\r\n if (prevProps[key] !== newProps[key]) {\r\n hasChanged = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n this.props = { ...this.props, ...newProps };\r\n\r\n this.onPropsChange?.(prevProps, this.props);\r\n this.update();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n batchUpdate(updater: () => void): void {\r\n const prevIsScheduled = this._isScheduledForUpdate;\r\n this._isScheduledForUpdate = true;\r\n\r\n try {\r\n updater();\r\n } finally {\r\n if (!prevIsScheduled) {\r\n this._isScheduledForUpdate = false;\r\n this.update();\r\n }\r\n }\r\n }\r\n\r\n update(key?: string): void {\r\n // Guard conditions\r\n if (this._skipNextUpdate) {\r\n this._skipNextUpdate = false;\r\n return;\r\n }\r\n\r\n if (this._isInitializing || this._isUnmounting || !this._isMounted) {\r\n return;\r\n }\r\n\r\n // Prevent concurrent updates\r\n if (this._updateInProgress) {\r\n return;\r\n }\r\n\r\n if (key) {\r\n this._updateBatch.add(key);\r\n }\r\n\r\n if (this._isScheduledForUpdate) {\r\n return;\r\n }\r\n\r\n this._isScheduledForUpdate = true;\r\n scheduler.schedule(() => {\r\n this._isScheduledForUpdate = false;\r\n this._updateBatch.clear();\r\n this._performUpdate();\r\n });\r\n }\r\n\r\n forceUpdate(): void {\r\n if (!this._isMounted || this._isUnmounting || this._updateInProgress) {\r\n return;\r\n }\r\n\r\n scheduler.flushSync(() => {\r\n this._performUpdate();\r\n });\r\n }\r\n\r\n skipNextUpdate(): void {\r\n this._skipNextUpdate = true;\r\n }\r\n\r\n beginInitialization(): void {\r\n this._isInitializing = true;\r\n }\r\n\r\n endInitialization(): void {\r\n this._isInitializing = false;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n async mount(container: HTMLElement): Promise<void> {\r\n if (this._isMounted) {\r\n console.warn(`Component ${this.constructor.name} is already mounted`);\r\n return;\r\n }\r\n\r\n if (!container) {\r\n throw new Error(`Cannot mount ${this.constructor.name}: container is null or undefined`);\r\n }\r\n\r\n try {\r\n this._isInitializing = true;\r\n\r\n await this.onBeforeMount?.();\r\n\r\n this._vnode = this.render();\r\n this._element = this._createElementFromVNode(this._vnode);\r\n\r\n if (this.styles) {\r\n this._styleId = StyleManager.inject(\r\n this.styles(),\r\n this.constructor.name\r\n );\r\n this._element?.setAttribute('data-scope', this.constructor.name);\r\n }\r\n\r\n container.appendChild(this._element);\r\n this._isMounted = true;\r\n this._isInitializing = false;\r\n\r\n await this.onMount?.();\r\n } catch (error) {\r\n this._isInitializing = false;\r\n this._isMounted = false;\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n throw error;\r\n }\r\n }\r\n\r\n unmount(): void {\r\n if (!this._isMounted || this._isUnmounting) {\r\n return;\r\n }\r\n\r\n this._isUnmounting = true;\r\n\r\n try {\r\n this.onBeforeUnmount?.();\r\n\r\n // Cancel pending updates\r\n this._isScheduledForUpdate = false;\r\n this._updateBatch.clear();\r\n\r\n // Remove styles\r\n if (this._styleId) {\r\n StyleManager.remove(this._styleId);\r\n this._styleId = null;\r\n }\r\n\r\n // Unsubscribe from all subscriptions\r\n this._subscriptions.forEach(unsubscribe => {\r\n try {\r\n unsubscribe();\r\n } catch (error) {\r\n console.error('Error during unsubscribe:', error);\r\n }\r\n });\r\n this._subscriptions = [];\r\n\r\n // Remove from DOM\r\n if (this._element?.parentElement) {\r\n this._element.parentElement.removeChild(this._element);\r\n }\r\n\r\n // Clear state\r\n this._isMounted = false;\r\n this._element = null;\r\n this._vnode = null;\r\n\r\n this.onUnmount?.();\r\n\r\n // Clear caches\r\n this._refs.clear();\r\n this._memoCache.clear();\r\n this._preservedElements.clear();\r\n } catch (error) {\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n } finally {\r\n this._isUnmounting = false;\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n getRef(name: string): HTMLElement | undefined {\r\n return this._refs.get(name);\r\n }\r\n\r\n createRef(name: string): (el: HTMLElement | null) => void {\r\n return (el: HTMLElement | null) => {\r\n if (el) {\r\n this._refs.set(name, el);\r\n } else {\r\n this._refs.delete(name);\r\n }\r\n };\r\n }\r\n\r\n memo<T>(key: string, compute: () => T, deps: unknown[]): T {\r\n const cached = this._memoCache.get(key);\r\n\r\n if (cached && this._areDepsEqual(cached.args, deps)) {\r\n return cached.result as T;\r\n }\r\n\r\n const result = compute();\r\n this._memoCache.set(key, { args: deps, result });\r\n return result;\r\n }\r\n\r\n subscribe(subscription: () => void): void {\r\n this._subscriptions.push(subscription);\r\n }\r\n\r\n debounce<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n fn.apply(this, args);\r\n }, delay);\r\n };\r\n }\r\n\r\n throttle<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let lastCall = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n const now = Date.now();\r\n const timeSinceLastCall = now - lastCall;\r\n\r\n if (timeSinceLastCall >= delay) {\r\n lastCall = now;\r\n fn.apply(this, args);\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n lastCall = Date.now();\r\n timeoutId = null;\r\n fn.apply(this, args);\r\n }, delay - timeSinceLastCall);\r\n }\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n get element(): HTMLElement | null {\r\n return this._element;\r\n }\r\n\r\n get isMounted(): boolean {\r\n return this._isMounted;\r\n }\r\n\r\n get isUnmounting(): boolean {\r\n return this._isUnmounting;\r\n }\r\n\r\n get isInitializing(): boolean {\r\n return this._isInitializing;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private async _performUpdate(): Promise<void> {\r\n // Guard against invalid states\r\n if (!this._isMounted || !this._element || this._isUnmounting || this._isInitializing) {\r\n return;\r\n }\r\n\r\n // Prevent concurrent updates\r\n if (this._updateInProgress) {\r\n return;\r\n }\r\n\r\n this._updateInProgress = true;\r\n\r\n const prevProps = { ...this.props };\r\n const prevState = { ...this.state };\r\n\r\n try {\r\n // Check if update should proceed\r\n if (this.shouldUpdate && !this.shouldUpdate(prevProps, prevState)) {\r\n return;\r\n }\r\n\r\n await this.onBeforeUpdate?.(prevProps, prevState);\r\n\r\n // Preserve mounted child components before patching\r\n this._preserveComponentMounts();\r\n\r\n const newVNode = this.render();\r\n const parent = this._element.parentElement;\r\n\r\n if (this._vnode && parent) {\r\n const index = Array.from(parent.childNodes).indexOf(this._element);\r\n\r\n if (index === -1) {\r\n // Element was removed from parent, skip update\r\n console.warn(`Component ${this.constructor.name} element removed from parent, skipping update`);\r\n return;\r\n }\r\n\r\n const oldVDomNode = this._convertToVDomNode(this._vnode);\r\n const newVDomNode = this._convertToVDomNode(newVNode);\r\n\r\n patch(parent, oldVDomNode, newVDomNode, index);\r\n this._element = parent.childNodes[index] as HTMLElement;\r\n }\r\n\r\n this._vnode = newVNode;\r\n\r\n // Restore preserved elements after patching\r\n this._restoreComponentMounts();\r\n\r\n this.onUpdate?.(prevProps, prevState);\r\n } catch (error) {\r\n this._handleError(error as Error, { componentStack: this.constructor.name });\r\n } finally {\r\n this._updateInProgress = false;\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _preserveComponentMounts(): void {\r\n if (!this._element) return;\r\n\r\n this._preservedElements.clear();\r\n\r\n // Selectors for elements that contain mounted components\r\n const preserveSelectors = [\r\n '[data-language-dropdown-mount]',\r\n '[data-user-dropdown-mount]',\r\n '[data-notifications-dropdown-mount]',\r\n '[data-dropdown-id]',\r\n '[data-preserve]',\r\n '[data-toast-mount]',\r\n '[data-popup-mount]',\r\n '[data-loader-mount]',\r\n '[data-navbar-notifications-list]'\r\n ];\r\n\r\n preserveSelectors.forEach(selector => {\r\n const elements = this._element!.querySelectorAll(selector);\r\n elements.forEach(el => {\r\n if (el.children.length > 0 && el.parentElement) {\r\n this._preservedElements.set(el, {\r\n parent: el,\r\n children: Array.from(el.childNodes)\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n private _restoreComponentMounts(): void {\r\n if (!this._element) return;\r\n\r\n this._preservedElements.forEach((data, originalElement) => {\r\n let newElement: Element | null = null;\r\n\r\n // Find corresponding element in updated DOM by matching attributes\r\n const attrs = Array.from(originalElement.attributes);\r\n for (const attr of attrs) {\r\n // Match by data attributes that identify mount points\r\n if (attr.name.startsWith('data-')) {\r\n const selector = `[${attr.name}=\"${attr.value}\"]`;\r\n newElement = this._element!.querySelector(selector);\r\n if (newElement) break;\r\n }\r\n }\r\n\r\n if (newElement && data.children.length > 0) {\r\n // Clear any new children added during patch\r\n while (newElement.firstChild) {\r\n newElement.removeChild(newElement.firstChild);\r\n }\r\n\r\n // Restore original children\r\n data.children.forEach(child => {\r\n newElement!.appendChild(child);\r\n });\r\n }\r\n });\r\n\r\n this._preservedElements.clear();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _convertToVDomNode(vnode: VNode): VNode {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Component VNodes cannot be converted to VDom nodes');\r\n }\r\n\r\n const convertedProps: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children') continue;\r\n\r\n if (key === 'style' && typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n convertedProps[key] = value as Record<string, string | number>;\r\n } else {\r\n convertedProps[key] = value;\r\n }\r\n }\r\n\r\n const convertedChildren = vnode.children.map(child => {\r\n if (child == null || typeof child === 'boolean') return null;\r\n if (typeof child === 'string' || typeof child === 'number') return child;\r\n return this._convertToVDomNode(child as VNode);\r\n }).filter((child): child is string | number | VNode => child !== null);\r\n\r\n return {\r\n type: vnode.type,\r\n props: convertedProps as never,\r\n children: convertedChildren\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Component VNodes not supported in _createElementFromVNode');\r\n }\r\n\r\n const element = document.createElement(vnode.type);\r\n\r\n // Set properties\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children') continue;\r\n this._setElementProperty(element, key, value);\r\n }\r\n\r\n // Add children\r\n for (const child of vnode.children) {\r\n if (child == null || child === false) continue;\r\n\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object' && 'type' in child) {\r\n element.appendChild(this._createElementFromVNode(child as VNode));\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n private _setElementProperty(element: HTMLElement, key: string, value: unknown): void {\r\n // Event handlers\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.substring(2).toLowerCase();\r\n element.addEventListener(eventName, value as EventListener);\r\n return;\r\n }\r\n\r\n // Class names\r\n if (key === 'className' && typeof value === 'string') {\r\n element.className = value;\r\n return;\r\n }\r\n\r\n // Styles\r\n if (key === 'style') {\r\n if (typeof value === 'string') {\r\n element.setAttribute('style', value);\r\n } else if (typeof value === 'object' && value !== null) {\r\n Object.assign(element.style, value);\r\n }\r\n return;\r\n }\r\n\r\n // Refs\r\n if (key === 'ref' && typeof value === 'function') {\r\n (value as (el: HTMLElement) => void)(element);\r\n return;\r\n }\r\n\r\n // Boolean attributes\r\n if (key === 'checked' || key === 'disabled' || key === 'selected') {\r\n const boolValue = value === 'true' || value === true || value === '';\r\n if (boolValue) {\r\n element.setAttribute(key, '');\r\n }\r\n return;\r\n }\r\n\r\n // Regular attributes\r\n if (value != null && value !== false) {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private _handleError(error: Error, errorInfo: { componentStack?: string }): void {\r\n console.error(`Error in component ${this.constructor.name}:`, error);\r\n console.error('Component stack:', errorInfo.componentStack);\r\n\r\n if (this.onError) {\r\n this.onError(error, errorInfo);\r\n } else {\r\n // Re-throw if no error handler\r\n throw error;\r\n }\r\n }\r\n\r\n private _areDepsEqual(prevDeps: unknown[], nextDeps: unknown[]): boolean {\r\n if (prevDeps.length !== nextDeps.length) return false;\r\n return prevDeps.every((dep, i) => Object.is(dep, nextDeps[i]));\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n _invalidateAllComputed(): void {\r\n for (const key in this) {\r\n if (key.startsWith('_computed_dirty_')) {\r\n (this as Record<string, unknown>)[key] = true;\r\n }\r\n }\r\n }\r\n\r\n _triggerWatchers(propertyName: string, newValue: unknown, oldValue: unknown): void {\r\n const watchers = (this.constructor as ComponentConstructor).__watchers__;\r\n if (!watchers?.[propertyName]) return;\r\n\r\n for (const methodName of watchers[propertyName]) {\r\n if (typeof (this as Record<string, unknown>)[methodName] === 'function') {\r\n try {\r\n ((this as Record<string, unknown>)[methodName] as (nv: unknown, ov: unknown) => void).call(this, newValue, oldValue);\r\n } catch (error) {\r\n console.error(`Watcher error in ${methodName}:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n setElement(element: HTMLElement): void {\r\n this._element = element;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export interface ComponentConstructor {\r\n __watchers__? : Record<string, string[]>;\r\n __reactiveProps__? : string[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/decorators.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n // Type for decorator context (Stage 3 decorators)\r\n interface ClassFieldDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'field';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n set(object: This, value: Value): void;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n interface ClassGetterDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'getter';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n interface ClassMethodDecoratorContext<This = unknown, Value = unknown> {\r\n kind: 'method';\r\n name: string | symbol;\r\n access: {\r\n get(object: This): Value;\r\n };\r\n addInitializer(initializer: (this: This) => void): void;\r\n }\r\n\r\n // Component metadata interface\r\n interface ComponentMetadata {\r\n __reactiveProps__?: string[];\r\n __watchers__?: Record<string, string[]>;\r\n }\r\n\r\n // Helper type for component instance\r\n type ComponentInstance = Record<string, unknown> & {\r\n constructor: ComponentMetadata;\r\n _invalidateAllComputed?: () => void;\r\n _triggerWatchers?: (key: string, newVal: unknown, oldVal: unknown) => void;\r\n _isMounted?: boolean;\r\n update?: () => void;\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * State decorator - makes property reactive\r\n * Usage: @state fields = [];\r\n *\r\n * Supports both TypeScript 5 decorators and legacy decorators\r\n */\r\n export function state<This, Value>(\r\n target: undefined,\r\n context: ClassFieldDecoratorContext<This, Value>\r\n ): (this: This, initialValue: Value) => Value;\r\n export function state(\r\n target: Record<string, unknown>,\r\n context: string\r\n ): void;\r\n export function state<This, Value>(\r\n target: Record<string, unknown> | undefined,\r\n context: string | ClassFieldDecoratorContext<This, Value>\r\n ): unknown {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n const propertyKey = context.name as string;\r\n\r\n context.addInitializer(function(this: unknown) {\r\n const instance = this as ComponentInstance;\r\n if (!instance.constructor.__reactiveProps__) {\r\n instance.constructor.__reactiveProps__ = [];\r\n }\r\n if (!instance.constructor.__reactiveProps__.includes(propertyKey)) {\r\n instance.constructor.__reactiveProps__.push(propertyKey);\r\n }\r\n });\r\n\r\n return function(this: This, initialValue: Value): Value {\r\n const instance = this as ComponentInstance;\r\n const hiddenKey = `_state_${propertyKey}`;\r\n\r\n // Store initial value\r\n instance[hiddenKey] = initialValue;\r\n\r\n // Define getter/setter\r\n Object.defineProperty(this, propertyKey, {\r\n get(this: This) {\r\n const inst = this as Record<string, unknown>;\r\n return inst[hiddenKey];\r\n },\r\n set(this: This, newValue: Value) {\r\n const inst = this as ComponentInstance;\r\n const oldValue = inst[hiddenKey];\r\n\r\n if (oldValue !== newValue) {\r\n inst[hiddenKey] = newValue;\r\n\r\n // Invalidate all computed properties\r\n if (typeof inst._invalidateAllComputed === 'function') {\r\n inst._invalidateAllComputed();\r\n }\r\n\r\n // Trigger watchers with correct old/new values\r\n if (typeof inst._triggerWatchers === 'function') {\r\n inst._triggerWatchers(propertyKey, newValue, oldValue);\r\n }\r\n\r\n // Trigger update if component is mounted\r\n if (inst._isMounted && typeof inst.update === 'function') {\r\n inst.update();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n return initialValue;\r\n };\r\n }\r\n\r\n // Legacy decorator (for backwards compatibility)\r\n const propertyKey = context as string;\r\n\r\n // Store reactive property metadata\r\n const targetConstructor = (target as { constructor: ComponentMetadata }).constructor;\r\n if (!targetConstructor.__reactiveProps__) {\r\n targetConstructor.__reactiveProps__ = [];\r\n }\r\n if (!targetConstructor.__reactiveProps__.includes(propertyKey)) {\r\n targetConstructor.__reactiveProps__.push(propertyKey);\r\n }\r\n\r\n // Create hidden property key\r\n const hiddenKey = `_state_${propertyKey}`;\r\n const initKey = `_state_init_${propertyKey}`;\r\n\r\n // Define getter/setter\r\n Object.defineProperty(target, propertyKey, {\r\n get(this: unknown) {\r\n const instance = this as Record<string, unknown>;\r\n // If not initialized yet, return undefined (don't trigger getter before init)\r\n if (!instance[initKey]) {\r\n return undefined;\r\n }\r\n return instance[hiddenKey];\r\n },\r\n set(this: unknown, newValue: unknown) {\r\n const instance = this as ComponentInstance;\r\n // On first set (during construction), just store the value\r\n if (!instance[initKey]) {\r\n instance[hiddenKey] = newValue;\r\n instance[initKey] = true;\r\n return;\r\n }\r\n\r\n const oldValue = instance[hiddenKey];\r\n\r\n if (oldValue !== newValue) {\r\n instance[hiddenKey] = newValue;\r\n\r\n // Invalidate all computed properties\r\n if (typeof instance._invalidateAllComputed === 'function') {\r\n instance._invalidateAllComputed();\r\n }\r\n\r\n // Trigger watchers with correct old/new values\r\n if (typeof instance._triggerWatchers === 'function') {\r\n instance._triggerWatchers(propertyKey, newValue, oldValue);\r\n }\r\n\r\n // Trigger update if component is mounted\r\n if (instance._isMounted && typeof instance.update === 'function') {\r\n instance.update();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n\r\n /**\r\n * Computed decorator - creates computed property\r\n * Usage: @computed get fullName() { return this.firstName + ' ' + this.lastName; }\r\n */\r\n export function computed<This, Value>(\r\n originalGetter: (this: This) => Value,\r\n context: ClassGetterDecoratorContext<This, Value>\r\n ): (this: This) => Value;\r\n export function computed(\r\n target: Record<string, unknown>,\r\n context: string,\r\n descriptor: PropertyDescriptor\r\n ): PropertyDescriptor;\r\n // Catch-all for invalid uses (like methods) to provide better error messages\r\n export function computed(\r\n targetOrGetter: unknown,\r\n context: unknown\r\n ): never;\r\n export function computed<This, Value>(\r\n targetOrGetter: Record<string, unknown> | ((this: This) => Value) | unknown,\r\n context: string | ClassGetterDecoratorContext<This, Value> | unknown,\r\n descriptor?: PropertyDescriptor\r\n ): unknown {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n const ctx = context as ClassGetterDecoratorContext<This, Value>;\r\n if (ctx.kind !== 'getter') {\r\n throw new Error('@computed can only be used on getters');\r\n }\r\n\r\n const originalGetter = targetOrGetter as (this: This) => Value;\r\n const propertyKey = ctx.name as string;\r\n const cacheKey = `_computed_cache_${propertyKey}`;\r\n const dirtyKey = `_computed_dirty_${propertyKey}`;\r\n\r\n return function(this: This): Value {\r\n const instance = this as Record<string, unknown>;\r\n // Initialize as dirty on first access\r\n if (instance[dirtyKey] === undefined) {\r\n instance[dirtyKey] = true;\r\n }\r\n\r\n // Recompute if dirty\r\n if (instance[dirtyKey] === true) {\r\n instance[cacheKey] = originalGetter.call(this);\r\n instance[dirtyKey] = false;\r\n }\r\n\r\n return instance[cacheKey] as Value;\r\n };\r\n }\r\n\r\n // Legacy decorator\r\n const propertyKey = context as string;\r\n if (!descriptor) {\r\n throw new Error('@computed requires a property descriptor');\r\n }\r\n\r\n const originalGetter = descriptor.get;\r\n\r\n if (!originalGetter) {\r\n throw new Error('@computed can only be used on getters');\r\n }\r\n\r\n const cacheKey = `_computed_cache_${propertyKey}`;\r\n const dirtyKey = `_computed_dirty_${propertyKey}`;\r\n\r\n return {\r\n get(this: unknown) {\r\n const instance = this as Record<string, unknown>;\r\n // Initialize as dirty on first access\r\n if (instance[dirtyKey] === undefined) {\r\n instance[dirtyKey] = true;\r\n }\r\n\r\n // Recompute if dirty\r\n if (instance[dirtyKey] === true) {\r\n instance[cacheKey] = originalGetter.call(this);\r\n instance[dirtyKey] = false;\r\n }\r\n\r\n return instance[cacheKey];\r\n },\r\n enumerable: descriptor.enumerable,\r\n configurable: descriptor.configurable,\r\n };\r\n }\r\n\r\n /**\r\n * Watch decorator - watches for property changes\r\n * Usage: @watch('propertyName') onPropertyChange(newValue, oldValue) {}\r\n */\r\n export function watch(propertyName: string) {\r\n function decorator<This, Args extends unknown[], Return>(\r\n originalMethod: (this: This, ...args: Args) => Return,\r\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>\r\n ): void;\r\n function decorator(\r\n target: Record<string, unknown>,\r\n context: string,\r\n descriptor: PropertyDescriptor\r\n ): PropertyDescriptor;\r\n function decorator<This, Args extends unknown[], Return>(\r\n targetOrMethod: Record<string, unknown> | ((this: This, ...args: Args) => Return),\r\n context: string | ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\r\n descriptor?: PropertyDescriptor\r\n ): PropertyDescriptor | void {\r\n // TypeScript 5+ decorator (Stage 3)\r\n if (context && typeof context === 'object' && 'kind' in context) {\r\n if (context.kind !== 'method') {\r\n throw new Error('@watch can only be used on methods');\r\n }\r\n\r\n const methodName = context.name as string;\r\n\r\n context.addInitializer(function(this: unknown) {\r\n const instance = this as ComponentInstance;\r\n if (!instance.constructor.__watchers__) {\r\n instance.constructor.__watchers__ = {};\r\n }\r\n if (!instance.constructor.__watchers__[propertyName]) {\r\n instance.constructor.__watchers__[propertyName] = [];\r\n }\r\n if (!instance.constructor.__watchers__[propertyName].includes(methodName)) {\r\n instance.constructor.__watchers__[propertyName].push(methodName);\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Legacy decorator\r\n const methodName = context as string;\r\n if (!descriptor) {\r\n throw new Error('@watch requires a property descriptor');\r\n }\r\n\r\n const target = targetOrMethod as Record<string, unknown>;\r\n const targetConstructor = (target as { constructor: ComponentMetadata }).constructor;\r\n if (!targetConstructor.__watchers__) {\r\n targetConstructor.__watchers__ = {};\r\n }\r\n if (!targetConstructor.__watchers__[propertyName]) {\r\n targetConstructor.__watchers__[propertyName] = [];\r\n }\r\n if (!targetConstructor.__watchers__[propertyName].includes(methodName)) {\r\n targetConstructor.__watchers__[propertyName].push(methodName);\r\n }\r\n\r\n return descriptor;\r\n }\r\n\r\n return decorator;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/context.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from './component';\r\n import { html, type VNode } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type ContextSubscriber<T> = (value: T) => void;\r\n\r\n export interface ProviderProps<T> {\r\n context: Context<T>;\r\n value: T;\r\n children: VNode | VNode[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Context class for sharing data across component tree\r\n */\r\n export class Context<T = unknown> {\r\n private _value: T;\r\n private _subscribers = new Set<ContextSubscriber<T>>();\r\n private _defaultValue: T;\r\n\r\n constructor(defaultValue: T) {\r\n this._value = defaultValue;\r\n this._defaultValue = defaultValue;\r\n }\r\n\r\n get value(): T {\r\n return this._value;\r\n }\r\n\r\n set value(newValue: T) {\r\n if (this._value !== newValue) {\r\n this._value = newValue;\r\n this._notify();\r\n }\r\n }\r\n\r\n subscribe(subscriber: ContextSubscriber<T>): () => void {\r\n this._subscribers.add(subscriber);\r\n\r\n // Immediately call with current value (wrapped in try-catch)\r\n try {\r\n subscriber(this._value);\r\n } catch (error) {\r\n console.error('Context subscriber error:', error);\r\n // Don't throw - the test expects this to not throw\r\n }\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this._subscribers.delete(subscriber);\r\n };\r\n }\r\n\r\n reset(): void {\r\n this.value = this._defaultValue;\r\n }\r\n\r\n update(updater: (prev: T) => T): void {\r\n this.value = updater(this._value);\r\n }\r\n\r\n private _notify(): void {\r\n for (const subscriber of this._subscribers) {\r\n try {\r\n subscriber(this._value);\r\n } catch (error) {\r\n console.error('Context subscriber error:', error);\r\n // Continue notifying other subscribers\r\n }\r\n }\r\n }\r\n\r\n get subscriberCount(): number {\r\n return this._subscribers.size;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new context\r\n */\r\n export function createContext<T>(defaultValue: T): Context<T> {\r\n return new Context(defaultValue);\r\n }\r\n\r\n export class Provider<T> extends Component<ProviderProps<T>> {\r\n onMount(): void {\r\n // Update context value\r\n this.props.context.value = this.props.value;\r\n }\r\n\r\n onUpdate(): void {\r\n // Update context when props change\r\n this.props.context.value = this.props.value;\r\n }\r\n\r\n onUnmount(): void {\r\n // Optionally reset context on unmount\r\n // this.props.context.reset();\r\n }\r\n\r\n render(): VNode {\r\n const children = Array.isArray(this.props.children)\r\n ? this.props.children\r\n : [this.props.children];\r\n\r\n return html`\r\n <div class=\"context-provider\" style=\"display: contents;\">\r\n ${children}\r\n </div>\r\n `;\r\n }\r\n }\r\n\r\n /**\r\n * Hook-like function to use context in components\r\n * Call this in your component to get context value\r\n */\r\n export function useContext<T>(context: Context<T>, component: Component): T {\r\n // Subscribe to context changes\r\n const unsubscribe = context.subscribe(() => {\r\n if (component.isMounted) {\r\n component.update();\r\n }\r\n });\r\n\r\n // Cleanup on unmount\r\n component.subscribe(() => unsubscribe);\r\n\r\n return context.value;\r\n }\r\n\r\n /**\r\n * Combined context for complex state management\r\n */\r\n export class CombinedContext<T extends Record<string, unknown>> {\r\n private contexts = new Map<keyof T, Context<T[keyof T]>>();\r\n\r\n constructor(initialValues: T) {\r\n for (const [key, value] of Object.entries(initialValues)) {\r\n this.contexts.set(key as keyof T, new Context(value) as unknown as Context<T[keyof T]>);\r\n }\r\n }\r\n\r\n get<K extends keyof T>(key: K): Context<T[K]> {\r\n const context = this.contexts.get(key);\r\n if (!context) {\r\n throw new Error(`Context key \"${String(key)}\" not found`);\r\n }\r\n return context as unknown as Context<T[K]>;\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n const context = this.contexts.get(key);\r\n if (context) {\r\n (context as unknown as Context<T[K]>).value = value;\r\n }\r\n }\r\n\r\n subscribe<K extends keyof T>(\r\n key: K,\r\n subscriber: ContextSubscriber<T[K]>\r\n ): () => void {\r\n const context = this.contexts.get(key);\r\n if (!context) {\r\n throw new Error(`Context key \"${String(key)}\" not found`);\r\n }\r\n return (context as unknown as Context<T[K]>).subscribe(subscriber);\r\n }\r\n\r\n reset(): void {\r\n for (const context of this.contexts.values()) {\r\n context.reset();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create combined context\r\n */\r\n export function createCombinedContext<T extends Record<string, unknown>>(\r\n initialValues: T\r\n ): CombinedContext<T> {\r\n return new CombinedContext(initialValues);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/hooks.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from './component';\r\n import type { VNode } from '../../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n interface HookState {\r\n value: unknown;\r\n deps?: unknown[];\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n let currentComponent: Component | null = null;\r\n let currentHookIndex: number = 0;\r\n const hookStates = new WeakMap<Component, HookState[]>();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Set current component context for hooks\r\n */\r\n export function setHookContext(component: Component): void {\r\n currentComponent = component;\r\n currentHookIndex = 0;\r\n }\r\n\r\n /**\r\n * Clear hook context\r\n */\r\n export function clearHookContext(): void {\r\n currentComponent = null;\r\n currentHookIndex = 0;\r\n }\r\n\r\n /**\r\n * Get or create hook states for component\r\n */\r\n function getHookStates(component: Component): HookState[] {\r\n if (!hookStates.has(component)) {\r\n hookStates.set(component, []);\r\n }\r\n return hookStates.get(component)!;\r\n }\r\n\r\n // ─── Core Hooks ───\r\n\r\n /**\r\n * useState hook - manages component state\r\n */\r\n export function useState<T>(initialValue: T | (() => T)): [T, (newValue: T | ((prev: T) => T)) => void] {\r\n if (!currentComponent) {\r\n throw new Error('useState must be called inside a component');\r\n }\r\n\r\n const component = currentComponent;\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(component);\r\n\r\n // Initialize state if first render\r\n if (states[hookIndex] === undefined) {\r\n states[hookIndex] = {\r\n value: typeof initialValue === 'function' ? (initialValue as () => T)() : initialValue\r\n };\r\n }\r\n\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const state = states[hookIndex];\r\n const nextValue = typeof newValue === 'function'\r\n ? (newValue as (prev: T) => T)(state.value as T)\r\n : newValue;\r\n\r\n if (state.value !== nextValue) {\r\n state.value = nextValue;\r\n component.update();\r\n }\r\n };\r\n\r\n return [states[hookIndex].value as T, setState];\r\n }\r\n\r\n /**\r\n * useEffect hook - side effects\r\n */\r\n export function useEffect(\r\n effect: () => void | (() => void),\r\n deps?: unknown[]\r\n ): void {\r\n if (!currentComponent) {\r\n throw new Error('useEffect must be called inside a component');\r\n }\r\n\r\n const component = currentComponent;\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(component);\r\n\r\n const prevState = states[hookIndex];\r\n const hasChanged = !prevState || !deps || !areDepsEqual(prevState.deps, deps);\r\n\r\n if (hasChanged) {\r\n // Cleanup previous effect\r\n if (prevState?.value && typeof prevState.value === 'function') {\r\n try {\r\n (prevState.value as () => void)();\r\n } catch (error) {\r\n console.error('Error in effect cleanup:', error);\r\n }\r\n }\r\n\r\n // Run new effect after a microtask (so it runs after render completes)\r\n Promise.resolve().then(() => {\r\n try {\r\n const cleanup = effect();\r\n\r\n // Store cleanup and deps\r\n states[hookIndex] = {\r\n value: cleanup,\r\n deps: deps ? [...deps] : undefined\r\n };\r\n } catch (error) {\r\n console.error('Error in effect:', error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * useMemo hook - memoize expensive computations\r\n */\r\n export function useMemo<T>(\r\n factory: () => T,\r\n deps: unknown[]\r\n ): T {\r\n if (!currentComponent) {\r\n throw new Error('useMemo must be called inside a component');\r\n }\r\n\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(currentComponent);\r\n\r\n const prevState = states[hookIndex];\r\n const hasChanged = !prevState || !areDepsEqual(prevState.deps, deps);\r\n\r\n if (hasChanged) {\r\n states[hookIndex] = {\r\n value: factory(),\r\n deps: [...deps]\r\n };\r\n }\r\n\r\n return states[hookIndex].value as T;\r\n }\r\n\r\n /**\r\n * useCallback hook - memoize callbacks\r\n */\r\n export function useCallback<T extends (...args: unknown[]) => unknown>(\r\n callback: T,\r\n deps: unknown[]\r\n ): T {\r\n return useMemo(() => callback, deps);\r\n }\r\n\r\n /**\r\n * useRef hook - persistent value across renders\r\n */\r\n export function useRef<T>(initialValue: T): { current: T } {\r\n if (!currentComponent) {\r\n throw new Error('useRef must be called inside a component');\r\n }\r\n\r\n const hookIndex = currentHookIndex++;\r\n const states = getHookStates(currentComponent);\r\n\r\n if (states[hookIndex] === undefined) {\r\n states[hookIndex] = {\r\n value: { current: initialValue }\r\n };\r\n }\r\n\r\n return states[hookIndex].value as { current: T };\r\n }\r\n\r\n /**\r\n * useReducer hook - complex state management\r\n */\r\n export function useReducer<S, A>(\r\n reducer: (state: S, action: A) => S,\r\n initialState: S\r\n ): [S, (action: A) => void] {\r\n const [state, setState] = useState(initialState);\r\n\r\n const dispatch = useCallback((action: unknown) => {\r\n setState(prevState => reducer(prevState, action as A));\r\n }, [reducer]) as (action: A) => void;\r\n\r\n return [state, dispatch];\r\n }\r\n\r\n // ─── Custom Hooks ───\r\n\r\n /**\r\n * useLocalStorage hook - sync state with localStorage\r\n */\r\n export function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T\r\n ): [T, (value: T | ((prev: T) => T)) => void] {\r\n // Initialize from localStorage\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n try {\r\n const item = window.localStorage.getItem(key);\r\n return item ? JSON.parse(item) as T : initialValue;\r\n } catch (error) {\r\n console.error('Error loading from localStorage:', error);\r\n return initialValue;\r\n }\r\n });\r\n\r\n // Create setValue wrapper (recreated each render, but that's okay)\r\n const setValue = (newValue: T | ((prev: T) => T)) => {\r\n setStoredValue((prevValue: T) => {\r\n const valueToStore = newValue instanceof Function\r\n ? newValue(prevValue)\r\n : newValue;\r\n\r\n // Update localStorage synchronously\r\n try {\r\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\r\n } catch (error) {\r\n console.error('Error saving to localStorage:', error);\r\n }\r\n\r\n return valueToStore;\r\n });\r\n };\r\n\r\n return [storedValue, setValue];\r\n }\r\n\r\n /**\r\n * useDebounce hook - debounce value changes\r\n */\r\n export function useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState(value);\r\n\r\n useEffect(() => {\r\n // Set up the timeout\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value);\r\n }, delay);\r\n\r\n // Cleanup function that clears the timeout\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n }\r\n\r\n /**\r\n * usePrevious hook - get previous value\r\n */\r\n export function usePrevious<T>(value: T): T | undefined {\r\n const ref = useRef<T | undefined>(undefined);\r\n\r\n // Use effect to update the ref after render\r\n useEffect(() => {\r\n ref.current = value;\r\n });\r\n\r\n // Return the previous value (what ref was BEFORE this render)\r\n const prevValue = ref.current;\r\n\r\n return prevValue;\r\n }\r\n\r\n /**\r\n * useToggle hook - boolean toggle\r\n */\r\n export function useToggle(initialValue: boolean = false): [boolean, () => void] {\r\n const [value, setValue] = useState(initialValue);\r\n\r\n const toggle = useCallback(() => {\r\n setValue(v => !v);\r\n }, []);\r\n\r\n return [value, toggle];\r\n }\r\n\r\n /**\r\n * useInterval hook - setInterval with cleanup\r\n */\r\n export function useInterval(callback: () => void, delay: number | null): void {\r\n const savedCallback = useRef(callback);\r\n\r\n useEffect(() => {\r\n savedCallback.current = callback;\r\n }, [callback]);\r\n\r\n useEffect(() => {\r\n if (delay === null) return;\r\n\r\n const id = setInterval(() => savedCallback.current(), delay);\r\n\r\n return () => clearInterval(id);\r\n }, [delay]);\r\n }\r\n\r\n /**\r\n * useFetch hook - data fetching\r\n */\r\n export function useFetch<T>(\r\n url: string,\r\n options?: RequestInit\r\n ): {\r\n data: T | null;\r\n loading: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n } {\r\n const [data, setData] = useState<T | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const fetchData = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await fetch(url, options);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const json = await response.json() as T;\r\n setData(json);\r\n } catch (e) {\r\n setError(e as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [url]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n return { data, loading, error, refetch: fetchData };\r\n }\r\n\r\n /**\r\n * useWindowSize hook - track window dimensions\r\n */\r\n export function useWindowSize(): { width: number; height: number } {\r\n const [size, setSize] = useState({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setSize({\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n });\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, []);\r\n\r\n return size;\r\n }\r\n\r\n /**\r\n * useEventListener hook - add event listener\r\n */\r\n export function useEventListener<K extends keyof WindowEventMap>(\r\n eventName: K,\r\n handler: (event: WindowEventMap[K]) => void,\r\n element: HTMLElement | Window = window\r\n ): void {\r\n const savedHandler = useRef(handler);\r\n\r\n useEffect(() => {\r\n savedHandler.current = handler;\r\n }, [handler]);\r\n\r\n useEffect(() => {\r\n const isSupported = element && 'addEventListener' in element;\r\n if (!isSupported) return;\r\n\r\n const eventListener = (event: Event) => {\r\n savedHandler.current(event as WindowEventMap[K]);\r\n };\r\n\r\n element.addEventListener(eventName, eventListener);\r\n\r\n return () => {\r\n element.removeEventListener(eventName, eventListener);\r\n };\r\n }, [eventName, element]);\r\n }\r\n\r\n /**\r\n * Create a functional component with hooks\r\n * Returns a component class that can be instantiated\r\n */\r\n export function createFunctionalComponent<P extends Record<string, unknown> = Record<string, unknown>>(\r\n fn: (props: P) => VNode,\r\n displayName?: string\r\n ): new (props?: P) => Component<P> {\r\n class FunctionalComponent extends Component<P> {\r\n render(): VNode {\r\n setHookContext(this);\r\n try {\r\n return fn(this.props) as VNode;\r\n } finally {\r\n clearHookContext();\r\n }\r\n }\r\n }\r\n\r\n if (displayName) {\r\n Object.defineProperty(FunctionalComponent, 'name', { value: displayName });\r\n }\r\n\r\n return FunctionalComponent as new (props?: P) => Component<P>;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n function areDepsEqual(prevDeps: unknown[] | undefined, nextDeps: unknown[]): boolean {\r\n if (!prevDeps || prevDeps.length !== nextDeps.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < prevDeps.length; i++) {\r\n if (prevDeps[i] !== nextDeps[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/router.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { Route, RouteConfig, NavigationGuard } from '../../types';\r\n import type { VNode } from '@je-es/vdom';\r\n import { Component, ComponentConstructor } from './component';\r\n import { createElement } from '@je-es/vdom';\r\n\r\n export type { Route, RouteConfig, NavigationGuard };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n // Type for lazy-loaded module\r\n interface LazyModule {\r\n default? : ComponentConstructor;\r\n HomePage? : ComponentConstructor;\r\n TodoPage? : ComponentConstructor;\r\n [key: string] : unknown;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Router {\r\n private routes: RouteConfig[] = [];\r\n private currentRoute: Route | null = null;\r\n private mode: 'history' | 'hash' = 'history';\r\n private base: string = '/';\r\n private beforeEachHooks: NavigationGuard[] = [];\r\n private afterEachHooks: ((to: Route, from: Route) => void)[] = [];\r\n private currentComponent: Component | null = null;\r\n private routerOutlet: HTMLElement | null = null;\r\n private isNavigating: boolean = false;\r\n private scrollBehavior: 'auto' | 'smooth' | 'instant' = 'auto';\r\n private notFoundHandler: (() => void) | null = null;\r\n private _internalPath: string | null = null;\r\n\r\n /**\r\n * Initialize router\r\n */\r\n init(\r\n routes: RouteConfig[],\r\n mode: 'history' | 'hash' = 'history',\r\n base: string = '/',\r\n scrollBehavior: 'auto' | 'smooth' | 'instant' = 'auto'\r\n ): void {\r\n this.routes = routes;\r\n this.mode = mode;\r\n this.base = base.endsWith('/') ? base.slice(0, -1) : base;\r\n this.scrollBehavior = scrollBehavior;\r\n\r\n this._initializeRouting();\r\n this._handleRoute();\r\n }\r\n\r\n /**\r\n * Navigate to a path\r\n */\r\n async push(path: string, state?: Record<string, unknown>): Promise<void> {\r\n if (this.isNavigating) {\r\n // console.warn('Navigation already in progress');\r\n this.isNavigating = false;\r\n // return;\r\n }\r\n\r\n this._internalPath = path;\r\n\r\n if (this.mode === 'history') {\r\n window.history.pushState(state || {}, '', this._buildFullPath(path));\r\n } else {\r\n window.location.hash = path;\r\n }\r\n\r\n await this._handleRoute();\r\n }\r\n\r\n /**\r\n * Replace current route\r\n */\r\n async replace(path: string, state?: Record<string, unknown>): Promise<void> {\r\n this._internalPath = path;\r\n\r\n if (this.mode === 'history') {\r\n window.history.replaceState(state || {}, '', this._buildFullPath(path));\r\n } else {\r\n window.location.hash = path;\r\n }\r\n\r\n return this._handleRoute();\r\n }\r\n\r\n back(): void { window.history.back(); }\r\n forward(): void { window.history.forward(); }\r\n go(delta: number): void { window.history.go(delta); }\r\n\r\n /**\r\n * Navigation guards\r\n */\r\n beforeEach(hook: NavigationGuard): void {\r\n this.beforeEachHooks.push(hook);\r\n }\r\n\r\n afterEach(hook: (to: Route, from: Route) => void): void {\r\n this.afterEachHooks.push(hook);\r\n }\r\n\r\n onNotFound(handler: () => void): void {\r\n this.notFoundHandler = handler;\r\n }\r\n\r\n /**\r\n * Route utilities\r\n */\r\n getCurrentRoute(): Route | null {\r\n return this.currentRoute ? { ...this.currentRoute } : null;\r\n }\r\n\r\n isActive(path: string, exact: boolean = false): boolean {\r\n if (!this.currentRoute) return false;\r\n return exact\r\n ? this.currentRoute.path === path\r\n : this.currentRoute.path.startsWith(path);\r\n }\r\n\r\n outlet(): VNode {\r\n return createElement('div', {\r\n 'data-router-outlet': 'true',\r\n style: 'display: contents;'\r\n }) as VNode;\r\n }\r\n\r\n getRoute(name: string): RouteConfig | undefined {\r\n return this.routes.find(r => r.name === name);\r\n }\r\n\r\n async pushNamed(name: string, params?: Record<string, string>): Promise<void> {\r\n const route = this.getRoute(name);\r\n if (!route) {\r\n console.error(`Route with name \"${name}\" not found`);\r\n return;\r\n }\r\n\r\n let path = route.path;\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n path = path.replace(`:${key}`, value);\r\n }\r\n }\r\n\r\n return this.push(path);\r\n }\r\n\r\n resolve(path: string): Route | null {\r\n const matchedRoute = this._matchRoute(path);\r\n if (!matchedRoute) return null;\r\n\r\n const { route, params } = matchedRoute;\r\n return {\r\n path,\r\n params,\r\n query: this._parseQuery(path),\r\n meta: route.meta || {},\r\n hash: path.includes('#') ? path.split('#')[1] : '',\r\n name: route.name,\r\n };\r\n }\r\n\r\n /**\r\n * Initialize routing handlers\r\n */\r\n private _initializeRouting(): void {\r\n // Handle browser navigation\r\n window.addEventListener('popstate', () => {\r\n this._internalPath = null;\r\n this._handleRoute();\r\n });\r\n\r\n if (this.mode === 'hash') {\r\n window.addEventListener('hashchange', () => {\r\n this._internalPath = null;\r\n this._handleRoute();\r\n });\r\n }\r\n\r\n // Intercept link clicks\r\n document.addEventListener('click', (e) => {\r\n const link = (e.target as HTMLElement).closest('a[href]') as HTMLAnchorElement | null;\r\n\r\n if (link && this._shouldInterceptLink(link)) {\r\n e.preventDefault();\r\n const href = link.getAttribute('href');\r\n if (href) {\r\n const path = this.mode === 'hash' && href.startsWith('#')\r\n ? href.substring(1)\r\n : href.replace(this.base, '');\r\n this.push(path);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _shouldInterceptLink(link: HTMLAnchorElement): boolean {\r\n const href = link.getAttribute('href');\r\n return !!(\r\n href &&\r\n link.hostname === window.location.hostname &&\r\n link.target !== '_blank' &&\r\n !link.hasAttribute('download') &&\r\n link.rel !== 'external'\r\n );\r\n }\r\n\r\n /**\r\n * Handle route change\r\n */\r\n private async _handleRoute(): Promise<void> {\r\n if (this.isNavigating) return;\r\n\r\n this.isNavigating = true;\r\n\r\n try {\r\n const path = this._getCurrentPath();\r\n const matchedRoute = this._matchRoute(path);\r\n\r\n if (!matchedRoute) {\r\n this._handleNotFound(path);\r\n return;\r\n }\r\n\r\n const { route, params } = matchedRoute;\r\n const to = this._buildRouteObject(path, params, route);\r\n const from = this.currentRoute || this._buildEmptyRoute();\r\n\r\n // Run guards\r\n const canProceed = await this._runNavigationGuards(route, to, from);\r\n if (!canProceed) return;\r\n\r\n this.currentRoute = to;\r\n\r\n await this._renderComponent(route);\r\n this._handleScrollBehavior(to, from);\r\n\r\n if (route.meta?.title && typeof route.meta.title === 'string') {\r\n document.title = route.meta.title;\r\n }\r\n\r\n // Run after hooks\r\n this.afterEachHooks.forEach(hook => hook(to, from));\r\n\r\n } catch (error) {\r\n console.error('Router error:', error);\r\n } finally {\r\n this.isNavigating = false;\r\n }\r\n }\r\n\r\n /**\r\n * Handle 404 not found\r\n */\r\n private _handleNotFound(path: string): void {\r\n console.warn(`No route matched for path: ${path}`);\r\n\r\n this.currentRoute = {\r\n path,\r\n params: {},\r\n query: this._parseQuery(),\r\n meta: {},\r\n hash: window.location.hash.substring(1),\r\n };\r\n\r\n if (this.notFoundHandler) {\r\n this.notFoundHandler();\r\n }\r\n }\r\n\r\n /**\r\n * Build route object\r\n */\r\n private _buildRouteObject(\r\n path: string,\r\n params: Record<string, string>,\r\n route: RouteConfig\r\n ): Route {\r\n return {\r\n path,\r\n params,\r\n query: this._parseQuery(),\r\n meta: route.meta || {},\r\n hash: window.location.hash.substring(1),\r\n name: route.name,\r\n };\r\n }\r\n\r\n private _buildEmptyRoute(): Route {\r\n return {\r\n path: '',\r\n params: {},\r\n query: {},\r\n meta: {},\r\n hash: '',\r\n };\r\n }\r\n\r\n /**\r\n * Run navigation guards\r\n */\r\n private async _runNavigationGuards(\r\n route: RouteConfig,\r\n to: Route,\r\n from: Route\r\n ): Promise<boolean> {\r\n // Route-specific guard\r\n if (route.beforeEnter) {\r\n const result = await this._runGuard(route.beforeEnter, to, from);\r\n if (!result) return false;\r\n }\r\n\r\n // Global guards\r\n for (const guard of this.beforeEachHooks) {\r\n const result = await this._runGuard(guard, to, from);\r\n if (!result) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _runGuard(\r\n guard: NavigationGuard,\r\n to: Route,\r\n from: Route\r\n ): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n guard(to, from, (nextPath?: string | false) => {\r\n if (nextPath === false) {\r\n resolve(false);\r\n } else if (typeof nextPath === 'string') {\r\n this.push(nextPath);\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Render component - simplified component resolution\r\n */\r\n private async _renderComponent(route: RouteConfig): Promise<void> {\r\n // Get or find outlet\r\n if (!this.routerOutlet) {\r\n this.routerOutlet = document.querySelector('[data-router-outlet=\"true\"]') as HTMLElement;\r\n if (!this.routerOutlet) {\r\n console.warn('Router outlet not found');\r\n return;\r\n }\r\n }\r\n\r\n // Unmount previous component\r\n if (this.currentComponent) {\r\n this.currentComponent.unmount();\r\n this.currentComponent = null;\r\n }\r\n\r\n // Clear outlet\r\n this.routerOutlet.innerHTML = '';\r\n\r\n try {\r\n const ComponentClass = await this._resolveComponent(route.component);\r\n\r\n if (!ComponentClass || typeof ComponentClass !== 'function') {\r\n throw new Error('Component is null or not a constructor');\r\n }\r\n\r\n const ComponentCtor = ComponentClass as new () => Component;\r\n // console.log('🎨 Mounting:', ComponentCtor.name || 'Component');\r\n this.currentComponent = new ComponentCtor();\r\n\r\n if (this.currentComponent) {\r\n await this.currentComponent.mount(this.routerOutlet);\r\n // console.log('✅ Mounted successfully!');\r\n }\r\n\r\n } catch (error) {\r\n this._renderError(route.path, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Resolve component (handle lazy loading)\r\n */\r\n private async _resolveComponent(\r\n component: ComponentConstructor | (() => Promise<LazyModule>)\r\n ): Promise<ComponentConstructor | null> {\r\n // console.log('🔍 Resolving component...');\r\n\r\n // Check if it's a class constructor\r\n if (typeof component === 'function') {\r\n // Try to determine if it's a class vs a loader function\r\n const hasPrototype = 'prototype' in component && component.prototype;\r\n const proto = hasPrototype ? (component as { prototype: unknown }).prototype : null;\r\n const hasConstructor = proto && typeof proto === 'object' && 'constructor' in proto;\r\n\r\n if (hasConstructor && (proto as { constructor: unknown }).constructor === component) {\r\n // console.log('✅ Direct component class');\r\n return component as ComponentConstructor;\r\n }\r\n\r\n // Otherwise treat as lazy loader\r\n // console.log('📦 Lazy loading...');\r\n try {\r\n const result = await (component as () => Promise<LazyModule>)();\r\n // console.log('📦 Module keys:', Object.keys(result));\r\n\r\n // Find component in module\r\n const found = result.HomePage ||\r\n result.TodoPage ||\r\n result.default ||\r\n Object.values(result).find((exp: unknown): exp is ComponentConstructor => {\r\n if (typeof exp !== 'function') return false;\r\n // Type guard: check if it's a constructor function\r\n const possibleCtor = exp as { prototype?: unknown };\r\n const proto = possibleCtor.prototype;\r\n return proto !== null && typeof proto === 'object' && proto !== undefined && 'constructor' in proto;\r\n });\r\n\r\n return found || null;\r\n } catch (error) {\r\n console.error('Failed to load lazy component:', error);\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Render error fallback\r\n */\r\n private _renderError(path: string, error: unknown): void {\r\n if (this.routerOutlet) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n this.routerOutlet.innerHTML = `\r\n <div style=\"padding: 2rem; background: #121212ff; border: 2px solid #303030ff;\r\n border-radius: 8px; margin: 2rem;\">\r\n <h2 style=\"color: rgba(208, 31, 31, 1); margin-top: 0;\">⚠️ Failed to Load Component</h2>\r\n <p style=\"color: #a3a3a3ff;\"><strong>Route:</strong> ${path}</p>\r\n <p style=\"color: #a3a3a3ff;\"><strong>Error:</strong> ${errorMessage}</p>\r\n </div>\r\n `;\r\n }\r\n }\r\n\r\n /**\r\n * Handle scroll behavior\r\n */\r\n private _handleScrollBehavior(to: Route, from: Route): void {\r\n if (to.hash) {\r\n const element = document.getElementById(to.hash);\r\n if (element) {\r\n element.scrollIntoView({ behavior: this.scrollBehavior });\r\n return;\r\n }\r\n }\r\n\r\n if (to.path !== from.path) {\r\n window.scrollTo({ top: 0, behavior: this.scrollBehavior });\r\n }\r\n }\r\n\r\n /**\r\n * Get current path (handles test environments)\r\n */\r\n private _getCurrentPath(): string {\r\n if (this._internalPath !== null) {\r\n return this._internalPath;\r\n }\r\n\r\n if (this.mode === 'hash') {\r\n return window.location.hash.substring(1).split('?')[0] || '/';\r\n }\r\n\r\n let path = window.location.pathname;\r\n\r\n // Handle test environments\r\n if (!path || path === 'blank' || path === 'about:blank') {\r\n path = '/';\r\n }\r\n\r\n if (this.base && path.startsWith(this.base)) {\r\n path = path.substring(this.base.length);\r\n }\r\n\r\n return path || '/';\r\n }\r\n\r\n private _buildFullPath(path: string): string {\r\n if (path.startsWith('http')) return path;\r\n const normalizedPath = path.startsWith('/') ? path : '/' + path;\r\n return this.base + normalizedPath;\r\n }\r\n\r\n /**\r\n * Match route pattern to path\r\n */\r\n private _matchRoute(path: string): { route: RouteConfig; params: Record<string, string> } | null {\r\n const cleanPath = path.split('?')[0].split('#')[0];\r\n\r\n for (const route of this.routes) {\r\n const params = this._matchPath(route.path, cleanPath);\r\n if (params !== null) {\r\n return { route, params };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _matchPath(pattern: string, path: string): Record<string, string> | null {\r\n if (pattern === '*') return {};\r\n if (pattern === path) return {};\r\n\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern\r\n .replace(/\\*/g, '.*')\r\n .replace(/:([^/]+)/g, (_, paramName: string) => {\r\n paramNames.push(paramName);\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n\r\n if (!match) return null;\r\n\r\n return paramNames.reduce((params, name, i) => {\r\n params[name] = decodeURIComponent(match[i + 1]);\r\n return params;\r\n }, {} as Record<string, string>);\r\n }\r\n\r\n /**\r\n * Parse query string\r\n */\r\n private _parseQuery(path?: string): Record<string, string> {\r\n const search = path\r\n ? path.includes('?') ? path.split('?')[1].split('#')[0] : ''\r\n : window.location.search.substring(1);\r\n\r\n if (!search) return {};\r\n\r\n return search.split('&').reduce((query, pair) => {\r\n const [key, value] = pair.split('=').map(decodeURIComponent);\r\n if (key) query[key] = value || '';\r\n return query;\r\n }, {} as Record<string, string>);\r\n }\r\n }\r\n\r\n export const router = new Router();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Navigate to a new route\r\n */\r\n export function navigate(path: string, replace: boolean = false): void {\r\n // console.log(`Navigating to ${path}`);\r\n if (replace) {\r\n router.replace(path);\r\n } else {\r\n router.push(path);\r\n }\r\n\r\n // Dispatch custom event for components listening to navigation\r\n window.dispatchEvent(new CustomEvent('navigation', {\r\n detail: { path }\r\n }));\r\n }\r\n\r\n /**\r\n * Navigate back in history\r\n */\r\n export function goBack(): void {\r\n router.back();\r\n }\r\n\r\n /**\r\n * Navigate forward in history\r\n */\r\n export function goForward(): void {\r\n window.history.forward();\r\n }\r\n\r\n /**\r\n * Get current path\r\n */\r\n export function getCurrentPath(): string {\r\n return window.location.pathname;\r\n }\r\n\r\n /**\r\n * Check if current path matches\r\n */\r\n export function isCurrentPath(path: string): boolean {\r\n return getCurrentPath() === path;\r\n }\r\n\r\n /**\r\n * Check if current path starts with\r\n */\r\n export function isCurrentPathPrefix(prefix: string): boolean {\r\n return getCurrentPath().startsWith(prefix);\r\n }\r\n\r\n /**\r\n * Reload current route\r\n */\r\n export function reloadRoute(): void {\r\n const currentPath = getCurrentPath();\r\n navigate(currentPath, true);\r\n }\r\n\r\n /**\r\n * Navigate with query params\r\n */\r\n export function navigateWithQuery(path: string, params: Record<string, string>): void {\r\n const query = new URLSearchParams(params).toString();\r\n navigate(`${path}?${query}`);\r\n }\r\n\r\n /**\r\n * Get query parameters\r\n */\r\n export function getQueryParams(): URLSearchParams {\r\n return new URLSearchParams(window.location.search);\r\n }\r\n\r\n /**\r\n * Get single query parameter\r\n */\r\n export function getQueryParam(key: string): string | null {\r\n return getQueryParams().get(key);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/core/store.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { StoreOptions, StoreSubscriber } from '../../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Store - Global state management with improved features\r\n */\r\n export class Store<T extends Record<string, unknown> = Record<string, unknown>> {\r\n private _state: T;\r\n private _subscribers = new Set<StoreSubscriber<T>>();\r\n private _persist: boolean;\r\n private _storage: Storage | null = null;\r\n private _storageKey: string;\r\n private _middleware: ((state: T, action?: string) => void)[] = [];\r\n private _isHydrating: boolean = false;\r\n\r\n constructor(options: StoreOptions<T>) {\r\n this._persist = options.persist ?? false;\r\n this._storageKey = options.storageKey || `store_${Date.now()}`;\r\n\r\n // Initialize storage\r\n if (this._persist && typeof window !== 'undefined') {\r\n this._storage = options.storage === 'sessionStorage'\r\n ? sessionStorage\r\n : localStorage;\r\n }\r\n\r\n // Load from storage if persisted\r\n if (this._persist && this._storage) {\r\n const stored = this._loadFromStorage();\r\n this._state = stored !== null ? stored : options.state;\r\n } else {\r\n this._state = options.state;\r\n }\r\n\r\n // Apply initial middleware\r\n if (options.middleware) {\r\n this._middleware = options.middleware;\r\n }\r\n }\r\n\r\n /**\r\n * Get current state (readonly)\r\n */\r\n get state(): Readonly<T> {\r\n return { ...this._state };\r\n }\r\n\r\n /**\r\n * Set entire state (replaces state)\r\n */\r\n set state(newState: T) {\r\n this.setState(newState);\r\n }\r\n\r\n /**\r\n * Update state (merges with existing state)\r\n */\r\n setState(update: Partial<T> | ((prevState: T) => Partial<T>), action?: string): void {\r\n const prevState = { ...this._state };\r\n\r\n const partialState = typeof update === 'function'\r\n ? update(prevState)\r\n : update;\r\n\r\n this._state = { ...prevState, ...partialState };\r\n\r\n // Apply middleware\r\n for (const middleware of this._middleware) {\r\n try {\r\n middleware(this._state, action);\r\n } catch (error) {\r\n console.error('Store middleware error:', error);\r\n }\r\n }\r\n\r\n // Persist to storage\r\n if (this._persist && !this._isHydrating) {\r\n this._saveToStorage();\r\n }\r\n\r\n // Notify subscribers\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Get a specific value from state\r\n */\r\n get<K extends keyof T>(key: K): T[K] {\r\n return this._state[key];\r\n }\r\n\r\n /**\r\n * Set a specific value in state\r\n */\r\n set<K extends keyof T>(key: K, value: T[K], action?: string): void {\r\n this.setState({ [key]: value } as unknown as Partial<T>, action);\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n * Returns unsubscribe function\r\n */\r\n subscribe(listener: StoreSubscriber<T>): () => void {\r\n this._subscribers.add(listener);\r\n\r\n // Immediately call listener with current state\r\n listener(this._state);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n this._subscribers.delete(listener);\r\n };\r\n }\r\n\r\n /**\r\n * Subscribe to specific key changes\r\n */\r\n subscribeToKey<K extends keyof T>(\r\n key: K,\r\n listener: (value: T[K]) => void\r\n ): () => void {\r\n let prevValue = this._state[key];\r\n\r\n const subscriber = (state: T) => {\r\n const newValue = state[key];\r\n if (prevValue !== newValue) {\r\n prevValue = newValue;\r\n listener(newValue);\r\n }\r\n };\r\n\r\n return this.subscribe(subscriber);\r\n }\r\n\r\n /**\r\n * Add middleware\r\n */\r\n use(middleware: (state: T, action?: string) => void): void {\r\n this._middleware.push(middleware);\r\n }\r\n\r\n /**\r\n * Clear all state\r\n */\r\n clear(): void {\r\n this._state = {} as T;\r\n\r\n if (this._persist && this._storage) {\r\n try {\r\n this._storage.removeItem(this._storageKey);\r\n } catch (error) {\r\n console.error('Failed to clear storage:', error);\r\n }\r\n }\r\n\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Reset state to initial value\r\n */\r\n reset(initialState: T): void {\r\n this._state = { ...initialState };\r\n\r\n if (this._persist) {\r\n this._saveToStorage();\r\n }\r\n\r\n this._notify();\r\n }\r\n\r\n /**\r\n * Hydrate state from storage\r\n */\r\n hydrate(): void {\r\n if (!this._persist || !this._storage) {\r\n console.warn('Cannot hydrate: persistence not enabled');\r\n return;\r\n }\r\n\r\n this._isHydrating = true;\r\n const stored = this._loadFromStorage();\r\n\r\n if (stored !== null) {\r\n this._state = stored;\r\n this._notify();\r\n }\r\n\r\n this._isHydrating = false;\r\n }\r\n\r\n /**\r\n * Get store snapshot for debugging\r\n */\r\n getSnapshot(): { state: T; subscribers: number; storageKey: string } {\r\n return {\r\n state: { ...this._state },\r\n subscribers: this._subscribers.size,\r\n storageKey: this._storageKey,\r\n };\r\n }\r\n\r\n /**\r\n * Batch multiple updates\r\n */\r\n batch(updates: () => void): void {\r\n const prevNotify = this._notify.bind(this);\r\n let shouldNotify = false;\r\n\r\n // Temporarily override notify\r\n this._notify = () => {\r\n shouldNotify = true;\r\n };\r\n\r\n try {\r\n updates();\r\n } finally {\r\n this._notify = prevNotify;\r\n if (shouldNotify) {\r\n this._notify();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Notify all subscribers\r\n */\r\n private _notify(): void {\r\n const stateCopy = { ...this._state };\r\n\r\n for (const subscriber of this._subscribers) {\r\n try {\r\n subscriber(stateCopy);\r\n } catch (error) {\r\n console.error('Store subscriber error:', error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load state from storage\r\n */\r\n private _loadFromStorage(): T | null {\r\n if (!this._storage) return null;\r\n\r\n try {\r\n const stored = this._storage.getItem(this._storageKey);\r\n return stored ? JSON.parse(stored) as T : null;\r\n } catch (error) {\r\n console.error('Failed to load from storage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Save state to storage\r\n */\r\n private _saveToStorage(): void {\r\n if (!this._storage) return;\r\n\r\n try {\r\n this._storage.setItem(this._storageKey, JSON.stringify(this._state));\r\n } catch (error) {\r\n console.error('Failed to save to storage:', error);\r\n\r\n // Handle quota exceeded\r\n if (error instanceof DOMException && error.name === 'QuotaExceededError') {\r\n console.warn('Storage quota exceeded');\r\n // Could implement cleanup strategy here\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy store and cleanup\r\n */\r\n destroy(): void {\r\n this._subscribers.clear();\r\n this._middleware = [];\r\n this._state = {} as T;\r\n }\r\n }\r\n\r\n /**\r\n * Create a store with type inference\r\n */\r\n export function createStore<T extends Record<string, unknown>>(\r\n options: StoreOptions<T>\r\n ): Store<T> {\r\n return new Store(options);\r\n }\r\n\r\n /**\r\n * Create a computed store that derives from other stores\r\n */\r\n export function createComputedStore<T, S extends Store<Record<string, unknown>>[]>(\r\n stores: S,\r\n computer: (...states: unknown[]) => T\r\n ): Store<{ value: T }> {\r\n const computedStore = createStore<{ value: T }>({\r\n state: { value: computer(...stores.map(s => s.state)) },\r\n });\r\n\r\n // Subscribe to all source stores\r\n for (const store of stores) {\r\n store.subscribe(() => {\r\n computedStore.setState({\r\n value: computer(...stores.map(s => s.state)),\r\n });\r\n });\r\n }\r\n\r\n return computedStore;\r\n }\r\n\r\n /**\r\n * Connect a component to a store\r\n */\r\n export function connect<T extends Record<string, unknown>, C extends { update?: () => void }>(\r\n store: Store<T>,\r\n component: C,\r\n mapStateToProps: (state: T) => Partial<C>\r\n ): () => void {\r\n const unsubscribe = store.subscribe((state) => {\r\n const props = mapStateToProps(state);\r\n Object.assign(component, props);\r\n\r\n // Trigger update if component has update method\r\n if (typeof component.update === 'function') {\r\n component.update();\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/core/client.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { ClientConfig } from '../../types';\r\n import type { ApiConfig as CapiConfigType } from '@je-es/capi';\r\n import { router } from './router';\r\n import { configureApi } from '@je-es/capi';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type { ClientConfig };\r\n\r\n // Bun build types\r\n interface BunBuildOptions {\r\n entrypoints: string[];\r\n outdir: string;\r\n target: string;\r\n minify?: boolean;\r\n sourcemap?: 'none' | 'external' | 'inline';\r\n splitting?: boolean;\r\n naming?: { entry?: string };\r\n external?: string[];\r\n }\r\n\r\n interface BunBuildResult {\r\n success: boolean;\r\n logs: {\r\n message: string;\r\n level: 'error' | 'warning' | 'info';\r\n }[];\r\n }\r\n\r\n declare const Bun: {\r\n build(options: BunBuildOptions): Promise<BunBuildResult>;\r\n };\r\n\r\n // Window type extension for dev tools\r\n declare global {\r\n interface Window {\r\n __JEES_DEV__?: {\r\n router: typeof router;\r\n config: ClientConfig;\r\n version: string;\r\n };\r\n }\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Client builder\r\n * Handles build process and runtime configuration\r\n */\r\n export function client(config: ClientConfig) {\r\n // Store configuration\r\n const _config = config;\r\n\r\n return {\r\n /**\r\n * Build the client application\r\n * This compiles TypeScript components to vanilla JavaScript\r\n */\r\n async build(): Promise<void> {\r\n if (!_config.build) {\r\n console.warn('No build configuration provided');\r\n return;\r\n }\r\n\r\n console.log('🔨 Building @je-es/client application...');\r\n\r\n try {\r\n // Build JavaScript\r\n await this._buildJS();\r\n\r\n // Build SCSS/CSS\r\n await this._buildStyles();\r\n\r\n console.log('✅ Build completed successfully!');\r\n\r\n } catch (error) {\r\n console.error('❌ Build error:', error);\r\n throw error;\r\n }\r\n },\r\n\r\n /**\r\n * Build JavaScript bundle\r\n */\r\n async _buildJS(): Promise<void> {\r\n if (!_config.build) return;\r\n\r\n const result = await Bun.build({\r\n entrypoints : [_config.build.entry],\r\n outdir : _config.build.output.substring(0, _config.build.output.lastIndexOf('/')),\r\n target : 'browser',\r\n minify : _config.build.minify ?? false,\r\n sourcemap : _config.build.sourcemap ? 'external' : 'none',\r\n splitting : _config.build.optimization?.splitChunks ?? false,\r\n naming : {\r\n entry : _config.build.output.substring(_config.build.output.lastIndexOf('/') + 1),\r\n },\r\n // Exclude server-side packages from browser bundle\r\n external : [\r\n 'sass',\r\n 'fs',\r\n 'path',\r\n 'url',\r\n 'util',\r\n 'stream',\r\n 'buffer',\r\n 'events',\r\n 'crypto',\r\n 'os',\r\n 'child_process',\r\n ],\r\n });\r\n\r\n if (!result.success) {\r\n console.error('❌ JS Build failed:', result.logs);\r\n throw new Error('JS Build failed');\r\n }\r\n\r\n // console.log('📦 JavaScript bundled');\r\n },\r\n\r\n /**\r\n * Build SCSS/CSS styles\r\n */\r\n async _buildStyles(): Promise<void> {\r\n const stylesDir = _config.build?.styles?.input || './app/gui/style';\r\n const outputPath = _config.build?.styles?.output || './static/client.css';\r\n\r\n // Dynamically import server-side modules only when building\r\n const sass = await import('sass');\r\n const { writeFileSync, existsSync, mkdirSync } = await import('fs');\r\n const { join, dirname } = await import('path');\r\n\r\n const outputDir = dirname(outputPath);\r\n const outputFile = outputPath.split('/').pop() || 'client.css';\r\n\r\n // Main SCSS entry file\r\n const mainScssFile = join(stylesDir, 'index.scss');\r\n\r\n // Check if main entry file exists\r\n if (!existsSync(mainScssFile)) {\r\n console.log('⚠️ No index.scss found, skipping CSS build');\r\n return;\r\n }\r\n\r\n try {\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Compile the main SCSS file (it will automatically include all @use imports)\r\n const result = sass.compile(mainScssFile, {\r\n style: _config.build?.minify ? 'compressed' : 'expanded',\r\n sourceMap: _config.build?.sourcemap ? true : false,\r\n loadPaths: [stylesDir], // Allow SCSS to resolve @use paths\r\n });\r\n\r\n // Write compiled CSS\r\n const fullOutputPath = join(outputDir, outputFile);\r\n writeFileSync(fullOutputPath, result.css, 'utf-8');\r\n\r\n // console.log(`💅 Styles compiled to ${fullOutputPath}`);\r\n\r\n // Write source map if enabled\r\n if (_config.build?.sourcemap && result.sourceMap) {\r\n writeFileSync(\r\n `${fullOutputPath}.map`,\r\n JSON.stringify(result.sourceMap),\r\n 'utf-8'\r\n );\r\n }\r\n\r\n } catch (error) {\r\n console.error('❌ CSS Build failed:', error);\r\n throw error;\r\n }\r\n },\r\n\r\n /**\r\n * Recursively collect all SCSS files (excluding .sass)\r\n */\r\n async _collectScssFiles(dir: string): Promise<string[]> {\r\n const { readdirSync, statSync, existsSync } = await import('fs');\r\n const { join, extname } = await import('path');\r\n\r\n const files: string[] = [];\r\n\r\n if (!existsSync(dir)) {\r\n return files;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n // Recursively scan subdirectories\r\n files.push(...await this._collectScssFiles(fullPath));\r\n } else if (stat.isFile()) {\r\n const ext = extname(entry);\r\n // Only include .scss files, skip partials (starting with _)\r\n if (ext === '.scss' && !entry.startsWith('_')) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n\r\n // Sort files to ensure consistent order\r\n return files.sort();\r\n },\r\n\r\n /**\r\n * Watch mode for development\r\n */\r\n async watch(): Promise<void> {\r\n console.log('👀 Watching for changes...');\r\n\r\n // Initial build\r\n await this.build();\r\n\r\n // Watch for file changes\r\n const { watch } = await import('fs');\r\n const { dirname } = await import('path');\r\n const { existsSync } = await import('fs');\r\n\r\n // Watch TypeScript files\r\n if (_config.build?.entry) {\r\n const entryDir = dirname(_config.build.entry);\r\n watch(entryDir, { recursive: true }, async (eventType, filename) => {\r\n if (filename && (filename.endsWith('.ts') || filename.endsWith('.tsx'))) {\r\n console.log(`🔄 ${filename} changed, rebuilding JS...`);\r\n try {\r\n await this._buildJS();\r\n console.log('✅ JS rebuild complete');\r\n } catch (error) {\r\n console.error('❌ JS rebuild failed:', error);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Watch SCSS files\r\n const stylesDir = './app/style';\r\n if (existsSync(stylesDir)) {\r\n watch(stylesDir, { recursive: true }, async (eventType, filename) => {\r\n if (filename && filename.endsWith('.scss')) {\r\n console.log(`🔄 ${filename} changed, rebuilding CSS...`);\r\n try {\r\n await this._buildStyles();\r\n console.log('✅ CSS rebuild complete');\r\n } catch (error) {\r\n console.error('❌ CSS rebuild failed:', error);\r\n }\r\n }\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Initialize the client runtime\r\n * This runs in the browser\r\n */\r\n async init(): Promise<void> {\r\n console.log('🚀 [client] Initializing @je-es/client...');\r\n\r\n // i18n is now auto-loaded on DOM ready, no need to do it here\r\n // But we keep this for backward compatibility if someone wants to force-reload\r\n\r\n // Configure API client\r\n if (_config.api) {\r\n // Build the capi-compatible config\r\n const capiConfig: Partial<CapiConfigType> = {\r\n baseURL: _config.api.baseURL,\r\n timeout: _config.api.timeout,\r\n headers: _config.api.headers,\r\n };\r\n\r\n // Add interceptors if they exist\r\n if (_config.api.interceptors) {\r\n capiConfig.interceptors = {\r\n request: _config.api.interceptors.request || null,\r\n response: _config.api.interceptors.response || null,\r\n error: _config.api.interceptors.error || null,\r\n };\r\n }\r\n\r\n configureApi(capiConfig);\r\n }\r\n\r\n // Configure router\r\n if (_config.router && _config.app?.routes) {\r\n router.init(\r\n _config.app.routes,\r\n _config.router.mode,\r\n _config.router.base\r\n );\r\n\r\n if (_config.router.beforeEach) {\r\n router.beforeEach(_config.router.beforeEach);\r\n }\r\n\r\n if (_config.router.afterEach) {\r\n router.afterEach(_config.router.afterEach);\r\n }\r\n }\r\n\r\n // Mount root component\r\n if (_config.app?.root) {\r\n const rootElement = document.querySelector(_config.app.root);\r\n if (rootElement) {\r\n // console.log('✅ Client initialized successfully!');\r\n } else {\r\n console.error(`❌ Root element \"${_config.app.root}\" not found`);\r\n }\r\n }\r\n\r\n // Enable dev tools\r\n if (_config.devTools?.enabled) {\r\n this._enableDevTools();\r\n }\r\n },\r\n\r\n /**\r\n * Enable development tools\r\n */\r\n _enableDevTools(): void {\r\n // console.log('🛠️ Dev tools enabled');\r\n\r\n // Add dev tools to window\r\n window.__JEES_DEV__ = {\r\n router,\r\n config: _config,\r\n version: '0.0.1',\r\n };\r\n\r\n // // Log router changes\r\n // if (_config.devTools?.showRouterInfo) {\r\n // router.afterEach((to: Route, from: Route) => {\r\n // console.log('📍 Route changed:', {\r\n // from: from.path,\r\n // to: to.path,\r\n // params: to.params,\r\n // query: to.query,\r\n // });\r\n // });\r\n // }\r\n },\r\n\r\n /**\r\n * Get configuration\r\n */\r\n getConfig(): ClientConfig {\r\n return _config;\r\n },\r\n };\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/services/i18n.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n import type { TranslationSet, LanguageCode, I18nConfig, VNode } from '../../types';\r\n import { createElement } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n class I18nManager {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private translations : TranslationSet = {};\r\n private currentLanguage : LanguageCode = 'en';\r\n private defaultLanguage : LanguageCode = 'en';\r\n private supportedLanguages : Set<LanguageCode> = new Set<LanguageCode>(['en']);\r\n private cachePath : string = '';\r\n private readyListeners : (() => void)[] = [];\r\n\r\n constructor(config?: I18nConfig) {\r\n if (config) {\r\n this.defaultLanguage = config.defaultLanguage || 'en';\r\n this.cachePath = config.staticPath || 'static/i18n';\r\n this.currentLanguage = this.getStoredLanguage() || config.defaultLanguage || 'en';\r\n\r\n if (config.supportedLanguages) {\r\n this.supportedLanguages = new Set(config.supportedLanguages);\r\n }\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Load translations for a specific language\r\n * @param lang Language code (e.g., 'en', 'ar', 'fr')\r\n * @param translations Translation object\r\n */\r\n public loadLanguage(lang: LanguageCode, translations: Record<string, string>): void {\r\n if (!this.translations[lang]) {\r\n this.translations[lang] = {};\r\n }\r\n this.translations[lang] = { ...this.translations[lang], ...translations };\r\n this.supportedLanguages.add(lang);\r\n }\r\n\r\n /**\r\n * Load all translations from static files\r\n * @param translations Object with language codes as keys and translation objects as values\r\n */\r\n public loadTranslations(translations: TranslationSet): void {\r\n Object.entries(translations).forEach(([lang, trans]) => {\r\n this.loadLanguage(lang, trans);\r\n });\r\n }\r\n\r\n /**\r\n * Set the current language\r\n * @param lang Language code\r\n */\r\n public setLanguage(lang: LanguageCode): void {\r\n if (this.supportedLanguages.has(lang)) {\r\n this.currentLanguage = lang;\r\n this.storeLanguage(lang);\r\n this.dispatchLanguageChangeEvent();\r\n } else if (this.supportedLanguages.has(this.defaultLanguage)) {\r\n this.currentLanguage = this.defaultLanguage;\r\n }\r\n }\r\n\r\n /**\r\n * Get the current language\r\n */\r\n public getLanguage(): LanguageCode {\r\n return this.currentLanguage;\r\n }\r\n\r\n /**\r\n * Get all supported languages\r\n */\r\n public getSupportedLanguages(): LanguageCode[] {\r\n return Array.from(this.supportedLanguages);\r\n }\r\n\r\n /**\r\n * Translate a key with smart parameter replacement\r\n * Supports nested translation keys as parameter values\r\n *\r\n * @example\r\n * // Simple translation\r\n * t('hello') // => \"Hello\" or \"مرحبا\" depending on current language\r\n *\r\n * @example\r\n * // With parameters\r\n * t('welcome', { app_name: 'MyApp' })\r\n * // => \"Welcome to MyApp\"\r\n *\r\n * @example\r\n * // With nested translation keys as parameters\r\n * t('greeting', { salutation: 'hello' })\r\n * // => \"Say Hello to everyone\"\r\n *\r\n * @param key Translation key\r\n * @param params Optional parameters for replacement\r\n * @param defaultValue Optional default translation key\r\n * @returns Translated string with replaced parameters\r\n */\r\n public t(key: string, params?: Record<string, string>, defaultValue?: string): string {\r\n const lang = this.currentLanguage;\r\n\r\n let translation = this.getTranslation(key, defaultValue);\r\n\r\n if (params) {\r\n Object.entries(params).forEach(([param, value]) => {\r\n const paramValue =\r\n this.translations[lang]?.[value] ||\r\n this.translations[this.defaultLanguage]?.[value] ||\r\n value;\r\n\r\n translation = translation.replace(\r\n new RegExp(`\\\\{${param}\\\\}`, 'g'),\r\n paramValue\r\n );\r\n });\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n private getTranslation(key: string, defaultValue?: string): string {\r\n const lang = this.currentLanguage;\r\n\r\n // warn if not found\r\n if (!this.translations[lang]?.[key]) {\r\n console.warn(`Translation key not found: ${key}`);\r\n\r\n return defaultValue || key;\r\n }\r\n\r\n return this.translations[lang]?.[key] || this.translations[this.defaultLanguage]?.[key];\r\n }\r\n\r\n /**\r\n * Translate with a specific language (overrides current language temporarily)\r\n *\r\n * @param key Translation key\r\n * @param lang Language code\r\n * @param params Optional parameters\r\n * @returns Translated string\r\n */\r\n public tLang(key: string, lang: LanguageCode, params?: Record<string, string>): string {\r\n const currentLang = this.currentLanguage;\r\n this.currentLanguage = lang;\r\n const result = this.t(key, params);\r\n this.currentLanguage = currentLang;\r\n return result;\r\n }\r\n\r\n /**\r\n * Translate a key and convert HTML tags in the translation to VNode elements\r\n * Supports tags like <br>, <strong>, <em>, <b>, <i>, etc.\r\n * Useful for multiline translations with formatting\r\n *\r\n * @example\r\n * // Translation: \"Hello <br> World\"\r\n * tHtml('greeting') // => [text node, br element, text node]\r\n *\r\n * @param key Translation key\r\n * @param params Optional parameters for replacement\r\n * @returns Array of VNode and string elements that can be used as children\r\n */\r\n public tHtml(key: string, params?: Record<string, string>): (VNode | string)[] {\r\n const translation = this.t(key, params);\r\n return this.parseHtmlString(translation);\r\n }\r\n\r\n /**\r\n * Parse HTML string into VNode and text elements\r\n * Converts \\n and /n sequences to <br> tags\r\n * @private\r\n */\r\n private parseHtmlString(htmlString: string): (VNode | string)[] {\r\n // Replace both \\n and /n with <br> tags\r\n const processedString = htmlString.replace(/\\\\n|\\/n/g, '<br>');\r\n\r\n const result: (VNode | string)[] = [];\r\n const regex = /<([^/>]+)>([^<]*)<\\/\\1>|<([^/>]+)\\s*\\/?>|([^<]+)/g;\r\n let match;\r\n\r\n while ((match = regex.exec(processedString)) !== null) {\r\n const openingTag = match[1]; // For paired tags like <strong>text</strong>\r\n const pairedContent = match[2];\r\n const selfClosingTag = match[3]; // For self-closing tags like <br/>\r\n const textContent = match[4];\r\n\r\n if (textContent) {\r\n // Plain text content\r\n result.push(textContent);\r\n } else if (openingTag) {\r\n // Paired tag like <strong>text</strong>\r\n const tagName = openingTag.split(/\\s+/)[0].toLowerCase();\r\n result.push(createElement(tagName, {}, pairedContent));\r\n } else if (selfClosingTag) {\r\n // Self-closing tag like <br/> or <br>\r\n const tagName = selfClosingTag.trim().toLowerCase();\r\n result.push(createElement(tagName, {}));\r\n }\r\n }\r\n\r\n return result.length > 0 ? result : [htmlString];\r\n }\r\n\r\n /**\r\n * Get all translations for current language\r\n */\r\n public getTranslations(): Record<string, string> {\r\n return this.translations[this.currentLanguage] || {};\r\n }\r\n\r\n /**\r\n * Check if a translation key exists\r\n * @param key Translation key\r\n * @returns true if key exists in current or default language\r\n */\r\n public hasKey(key: string): boolean {\r\n return !!(\r\n this.translations[this.currentLanguage]?.[key] ||\r\n this.translations[this.defaultLanguage]?.[key]\r\n );\r\n }\r\n\r\n /**\r\n * Create a reactive translation function that listens to language changes\r\n * @param updateCallback Callback function to execute when language changes\r\n * @returns Function to unsubscribe from language changes\r\n */\r\n public createTranslator(updateCallback: () => void): () => void {\r\n const handler = () => updateCallback();\r\n if (typeof window !== 'undefined') {\r\n window.addEventListener('languagechange', handler);\r\n return () => window.removeEventListener('languagechange', handler);\r\n }\r\n return () => {};\r\n }\r\n\r\n /**\r\n * Load translations from URL(s)\r\n * Supports patterns like '/static/i18n/*.json' or specific URLs\r\n *\r\n * @example\r\n * // Load from a pattern\r\n * await loadFromUrl('/static/i18n/*.json');\r\n *\r\n * @example\r\n * // Load specific language files\r\n * await loadFromUrl(['/static/i18n/en.json', '/static/i18n/ar.json']);\r\n *\r\n * @param urlPattern String pattern or array of URLs\r\n * @returns Promise that resolves when all translations are loaded\r\n */\r\n public async loadFromUrl(urlPattern: string | string[]): Promise<void> {\r\n const urls = Array.isArray(urlPattern) ? urlPattern : [urlPattern];\r\n const translations: TranslationSet = {};\r\n // let loadedCount = 0;\r\n\r\n for (const url of urls) {\r\n if (url.includes('*')) {\r\n const pattern = url.replace('*.json', '');\r\n const langCodes = this.supportedLanguages;\r\n\r\n for (const lang of langCodes) {\r\n try {\r\n let fullUrl = `${pattern}${lang}.json`;\r\n\r\n if (typeof window !== 'undefined' && !fullUrl.startsWith('http')) {\r\n // Always use domain root + path, ignoring current page path\r\n fullUrl = window.location.origin + (fullUrl.startsWith('/') ? fullUrl : '/' + fullUrl);\r\n }\r\n\r\n const response = await fetch(fullUrl);\r\n if (response.ok) {\r\n const data = await response.json();\r\n translations[lang] = data;\r\n // loadedCount++;\r\n }\r\n } catch {\r\n // Silently continue on error\r\n }\r\n }\r\n } else {\r\n try {\r\n let fullUrl = url;\r\n\r\n if (typeof window !== 'undefined' && !fullUrl.startsWith('http')) {\r\n // Always use domain root + path, ignoring current page path\r\n fullUrl = window.location.origin + (fullUrl.startsWith('/') ? fullUrl : '/' + fullUrl);\r\n }\r\n\r\n const response = await fetch(fullUrl);\r\n if (response.ok) {\r\n const data = await response.json();\r\n const langMatch = url.match(/([a-z]{2,3})\\.json$/i);\r\n const lang = langMatch ? langMatch[1].toLowerCase() : 'en';\r\n translations[lang] = data;\r\n this.supportedLanguages.add(lang);\r\n // loadedCount++;\r\n }\r\n } catch {\r\n // Silently continue on error\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(translations).length > 0) {\r\n this.loadTranslations(translations);\r\n this.notifyReady();\r\n }\r\n }\r\n\r\n /**\r\n * Register a callback for when i18n is ready\r\n */\r\n public onReady(callback: () => void): void {\r\n if (Object.keys(this.translations).length > 0) {\r\n // Already loaded, call immediately\r\n callback();\r\n } else {\r\n // Not loaded yet, add to listeners\r\n this.readyListeners.push(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Notify all listeners that i18n is ready\r\n */\r\n private notifyReady(): void {\r\n for (const listener of this.readyListeners) {\r\n listener();\r\n }\r\n this.readyListeners = [];\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Get language from localStorage\r\n */\r\n private getStoredLanguage(): LanguageCode | null {\r\n if (typeof localStorage !== 'undefined') {\r\n return (localStorage.getItem('app-language') as LanguageCode) || null;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Store language in localStorage\r\n */\r\n private storeLanguage(lang: LanguageCode): void {\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.setItem('app-language', lang);\r\n }\r\n }\r\n\r\n /**\r\n * Dispatch language change event\r\n */\r\n private dispatchLanguageChangeEvent(): void {\r\n if (typeof window !== 'undefined') {\r\n window.dispatchEvent(new CustomEvent('languagechange', { detail: { language: this.currentLanguage } }));\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n // Singleton instance\r\n let i18nInstance: I18nManager | null = null;\r\n\r\n /**\r\n * Get the global i18n instance\r\n */\r\n export function getI18n(): I18nManager {\r\n if (!i18nInstance) {\r\n i18nInstance = new I18nManager();\r\n }\r\n return i18nInstance;\r\n }\r\n\r\n export { I18nManager };\r\n\r\n export type { TranslationSet, LanguageCode, I18nConfig };\r\n\r\n /**\r\n * Global translation function\r\n * @param key Translation key\r\n * @param params Optional parameters\r\n * @param defaultValue Optional default translation key\r\n * @returns Translated string\r\n */\r\n export function t(key: string, params?: Record<string, string>, defaultValue?: string): string {\r\n return getI18n().t(key, params, defaultValue);\r\n }\r\n\r\n /**\r\n * Translate with a specific language (overrides current language temporarily)\r\n * @param key Translation key\r\n * @param lang Language code\r\n * @param params Optional parameters\r\n * @returns Translated string\r\n */\r\n export function tLang(key: string, lang: string, params?: Record<string, string>): string {\r\n return getI18n().tLang(key, lang, params);\r\n }\r\n\r\n /**\r\n * Translate a key and convert HTML tags to VNode elements\r\n * Useful for multiline translations with formatting like <br>\r\n * @param key Translation key\r\n * @param params Optional parameters\r\n * @returns Array of VNode and string elements that can be used as children\r\n */\r\n export function tHtml(key: string, params?: Record<string, string>): (VNode | string)[] {\r\n return getI18n().tHtml(key, params);\r\n }\r\n\r\n /**\r\n * Set the current language globally (synchronous)\r\n * @param lang Language code\r\n */\r\n export function setLanguage(lang: string): void {\r\n getI18n().setLanguage(lang);\r\n }\r\n\r\n /**\r\n * Set the current language globally with lazy-loading support (asynchronous)\r\n * Use this when you want to lazy-load language files on demand\r\n * @param lang Language code\r\n * @param staticPath Path to language files for lazy-loading\r\n * @returns Promise that resolves when language is loaded and set\r\n */\r\n export async function setLanguageAsync(lang: string, staticPath?: string): Promise<void> {\r\n const manager = getI18n();\r\n\r\n // Check if language is already loaded\r\n const currentTranslations = manager.getTranslations();\r\n const isLanguageLoaded = Object.keys(currentTranslations).length > 0;\r\n\r\n if (!isLanguageLoaded && staticPath) {\r\n // Language not loaded yet, try to lazy-load it\r\n const baseUrl = staticPath.endsWith('/') ? staticPath : staticPath + '/';\r\n try {\r\n await manager.loadFromUrl(baseUrl + `${lang}.json`);\r\n } catch (error) {\r\n console.warn(`Failed to lazy-load language: ${lang}`, error);\r\n }\r\n }\r\n\r\n manager.setLanguage(lang);\r\n }\r\n\r\n /**\r\n * Get the current language\r\n */\r\n export function getCurrentLanguage(): string {\r\n return getI18n().getLanguage();\r\n }\r\n\r\n /**\r\n * Load translations for a specific language\r\n * @param lang Language code\r\n * @param translations Translation object\r\n */\r\n export function loadLanguage(lang: string, translations: Record<string, string>): void {\r\n getI18n().loadLanguage(lang, translations);\r\n }\r\n\r\n /**\r\n * Load all translations\r\n * @param translations The translations object\r\n */\r\n export function loadTranslations(translations: Record<string, Record<string, string>>): void {\r\n getI18n().loadTranslations(translations);\r\n }\r\n\r\n /**\r\n * Get all supported languages\r\n */\r\n export function getSupportedLanguages(): string[] {\r\n return getI18n().getSupportedLanguages();\r\n }\r\n\r\n /**\r\n * Check if a translation key exists\r\n * @param key The translation key to check\r\n * @returns Whether the key exists\r\n */\r\n export function hasKey(key: string): boolean {\r\n return getI18n().hasKey(key);\r\n }\r\n\r\n /**\r\n * Get all translations for current language\r\n */\r\n export function getTranslations(): Record<string, string> {\r\n return getI18n().getTranslations();\r\n }\r\n\r\n /**\r\n * Create a reactive translator that listens to language changes\r\n * @param updateCallback Callback function to execute when language changes\r\n * @returns Function to unsubscribe from language changes\r\n */\r\n export function createTranslator(updateCallback: () => void): () => void {\r\n return getI18n().createTranslator(updateCallback);\r\n }\r\n\r\n /**\r\n * Load translations from URL(s)\r\n * Supports patterns like '/static/i18n/*.json' or specific URLs\r\n *\r\n * @example\r\n * // Load from a pattern\r\n * await loadFromUrl('/static/i18n/*.json');\r\n *\r\n * @example\r\n * // Load specific language files\r\n * await loadFromUrl(['/static/i18n/en.json', '/static/i18n/ar.json']);\r\n *\r\n * @param urlPattern String pattern or array of URLs\r\n * @returns Promise that resolves when all translations are loaded\r\n */\r\n export async function loadFromUrl(urlPattern: string | string[]): Promise<void> {\r\n return getI18n().loadFromUrl(urlPattern);\r\n }\r\n\r\n /**\r\n * Initialize i18n synchronously (useful for testing)\r\n * Creates a new I18nManager instance with the provided config\r\n *\r\n * @param config I18n configuration\r\n *\r\n * @example\r\n * initializeI18n({\r\n * defaultLanguage: 'en',\r\n * supportedLanguages: ['en', 'ar']\r\n * });\r\n */\r\n export function initializeI18n(config?: I18nConfig): void {\r\n i18nInstance = new I18nManager(config);\r\n }\r\n\r\n /**\r\n * Setup i18n: Initialize and load the currently selected language\r\n * Uses stored language from localStorage if available, otherwise uses default\r\n * Other languages are lazy-loaded when setLanguage is called\r\n *\r\n * @param config I18n configuration\r\n * @returns Promise that resolves when the selected language is loaded\r\n *\r\n * @example\r\n * await setupI18n({\r\n * defaultLanguage: 'en',\r\n * supportedLanguages: ['en', 'ar'],\r\n * staticPath: 'static/i18n'\r\n * });\r\n * console.log(t('hello')); // Ready to use in current language!\r\n */\r\n export async function setupI18n(config: I18nConfig): Promise<void> {\r\n // Initialize i18n with config\r\n const manager = new I18nManager(config);\r\n i18nInstance = manager;\r\n\r\n // Load the CURRENT language (stored or default)\r\n if (config.staticPath) {\r\n const baseUrl = config.staticPath.endsWith('/')\r\n ? config.staticPath\r\n : config.staticPath + '/';\r\n\r\n // Get the language to load: stored language or default\r\n const langToLoad = manager.getLanguage();\r\n const langUrl = baseUrl + `${langToLoad}.json`;\r\n\r\n await manager.loadFromUrl(langUrl);\r\n }\r\n }\r\n\r\n /**\r\n * Load a specific language file on-demand\r\n * Use this when user switches to a language that hasn't been loaded yet\r\n *\r\n * @param lang Language code (e.g., 'ar', 'fr')\r\n * @param staticPath Optional path to language files (defaults to 'static/i18n')\r\n * @returns Promise that resolves when language is loaded\r\n *\r\n * @example\r\n * // User switches to Arabic - load it first if not already loaded\r\n * await loadLanguageFile('ar');\r\n * setLanguage('ar');\r\n */\r\n export async function loadLanguageFile(lang: string, staticPath?: string): Promise<void> {\r\n const manager = getI18n();\r\n const path = staticPath || 'static/i18n';\r\n const baseUrl = path.endsWith('/') ? path : path + '/';\r\n const langUrl = baseUrl + lang + '.json';\r\n\r\n await manager.loadFromUrl(langUrl);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/components/toast.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, html } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n export type ToastType = 'success' | 'error' | 'info' | 'warning';\r\n\r\n export interface ToastMessage {\r\n id: number;\r\n message: string;\r\n type: ToastType;\r\n translateKey?: string;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n toast: 'bb_toast',\r\n container: 'bb_toastContainer',\r\n icon: 'bb_toastIcon',\r\n msg: 'bb_toastMsg'\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Toast extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state messages: ToastMessage[] = [];\r\n\r\n private nextId = 0;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Show a toast notification\r\n */\r\n show(message: string, type: ToastType = 'info', duration: number = 2000, translateKey?: string) {\r\n const id = this.nextId++;\r\n\r\n this.messages = [...this.messages, { id, message, type, translateKey }];\r\n\r\n setTimeout(() => {\r\n this.messages = this.messages.filter(m => m.id !== id);\r\n }, duration);\r\n }\r\n\r\n /**\r\n * Convenience methods\r\n */\r\n success(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'success', duration, translateKey);\r\n }\r\n\r\n error(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'error', duration, translateKey);\r\n }\r\n\r\n info(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'info', duration, translateKey);\r\n }\r\n\r\n warning(message: string, duration?: number, translateKey?: string) {\r\n this.show(message, 'warning', duration, translateKey);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n if (this.messages.length === 0) return html``;\r\n\r\n return createElement('div', {\r\n className: bb_.container\r\n },\r\n ...this.messages.map(msg => this.renderToast(msg))\r\n );\r\n }\r\n\r\n renderToast(msg: ToastMessage) {\r\n const icons = {\r\n success: 'fas fa-check-circle',\r\n error: 'fas fa-exclamation-circle',\r\n info: 'fas fa-info-circle',\r\n warning: 'fas fa-exclamation-triangle'\r\n };\r\n\r\n const displayMessage = msg.translateKey ? t(msg.translateKey) : msg.message;\r\n\r\n return createElement('div', {\r\n key: String(msg.id),\r\n className: `${bb_.toast} ${bb_.toast}--${msg.type}`,\r\n 'data-translate': msg.translateKey || undefined\r\n },\r\n createElement('i', {\r\n className: `${icons[msg.type]} ${bb_.icon}`\r\n }),\r\n createElement('span', {\r\n className: bb_.msg\r\n }, displayMessage)\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOB ════════════════════════════════════════╗\r\n\r\n let globalToast: Toast | null = null;\r\n\r\n export function initToast(container?: HTMLElement): Toast {\r\n if (globalToast) return globalToast;\r\n\r\n const toastContainer = container || document.createElement('div');\r\n if (!container) {\r\n document.body.appendChild(toastContainer);\r\n }\r\n\r\n globalToast = new Toast();\r\n globalToast.mount(toastContainer);\r\n\r\n return globalToast;\r\n }\r\n\r\n export function getToast(): Toast {\r\n if (!globalToast) {\r\n globalToast = initToast();\r\n }\r\n return globalToast;\r\n }\r\n\r\n // Convenience exports\r\n export const toast = {\r\n show: (message: string, type: ToastType = 'info', duration?: number, translateKey?: string) => {\r\n getToast().show(message, type, duration, translateKey);\r\n },\r\n success: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().success(message, duration, translateKey);\r\n },\r\n error: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().error(message, duration, translateKey);\r\n },\r\n info: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().info(message, duration, translateKey);\r\n },\r\n warning: (message: string, duration?: number, translateKey?: string) => {\r\n getToast().warning(message, duration, translateKey);\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/loader.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n export type LoaderSize = 'small' | 'medium' | 'large';\r\n export type LoaderVariant = 'spinner' | 'dots' | 'pulse';\r\n\r\n export interface LoaderOptions {\r\n message? : string;\r\n variant? : LoaderVariant;\r\n size? : LoaderSize;\r\n overlay? : boolean;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n loader: {\r\n container : 'bb_loaderContainer',\r\n containerOverlay : 'bb_loaderContainer--overlay',\r\n bg : 'bb_loaderBg',\r\n loader : 'bb_loader',\r\n },\r\n\r\n spinner: {\r\n container : 'bb_loaderSpinnerContainer',\r\n icon : 'bb_loaderSpinnerIcon',\r\n dot : 'bb_loaderSpinnerDot',\r\n pulse : 'bb_loaderSpinnerPulse',\r\n text : 'bb_loaderSpinnerText',\r\n },\r\n\r\n progress: {\r\n container : 'bb_loaderProgressContainer',\r\n bar : 'bb_loaderProgressBar',\r\n text : 'bb_loaderProgressText',\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Loader extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state visible = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state message = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state variant : LoaderVariant = 'spinner';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state size : LoaderSize = 'medium';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state overlay = true;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state progress = 0;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state showProgress = false;\r\n\r\n private animationFrame : number | null = null;\r\n private hideTimeout : number | null = null;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n this.setupKeyboardListener();\r\n this.initializeAccessibility();\r\n\r\n window.addEventListener('languagechange', () => {\r\n if (!this.message) {\r\n this.update();\r\n }\r\n });\r\n }\r\n\r\n onUnmount() {\r\n if (this.animationFrame) {\r\n cancelAnimationFrame(this.animationFrame);\r\n }\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n document.removeEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n const containerClasses = [\r\n bb_.loader.container,\r\n this.overlay ? `${bb_.loader.containerOverlay}` : '',\r\n `${bb_.loader.container}--${this.size}`\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', {\r\n className: containerClasses,\r\n 'data-status': this.visible ? 'visible' : 'hidden',\r\n role: 'status',\r\n 'aria-live': 'polite',\r\n 'aria-busy': 'true',\r\n },\r\n // bg for blur\r\n createElement('div', { className: bb_.loader.bg }),\r\n\r\n createElement('div', { className: bb_.loader.loader },\r\n this.renderSpinner(),\r\n this.renderMessage(),\r\n this.showProgress ? this.renderProgressBar() : null\r\n )\r\n );\r\n }\r\n\r\n renderSpinner() {\r\n const spinnerClass = `${bb_.spinner.container} ${bb_.spinner.container}--${this.variant}`;\r\n\r\n switch (this.variant) {\r\n case 'dots':\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.dot }),\r\n createElement('div', { className: bb_.spinner.dot }),\r\n createElement('div', { className: bb_.spinner.dot })\r\n );\r\n\r\n case 'pulse':\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.pulse })\r\n );\r\n\r\n case 'spinner':\r\n default:\r\n return createElement('div', { className: spinnerClass },\r\n createElement('div', { className: bb_.spinner.icon })\r\n );\r\n }\r\n }\r\n\r\n renderMessage() {\r\n const text = this.message || t('global.loading');\r\n\r\n return createElement('div', {\r\n className: bb_.spinner.text,\r\n 'data-translate': this.message ? undefined : 'global.loading'\r\n }, text);\r\n }\r\n\r\n renderProgressBar() {\r\n return createElement('div', { className: bb_.progress.container },\r\n createElement('div', {\r\n className: bb_.progress.bar,\r\n style: `width: ${this.progress}%`,\r\n 'aria-valuenow': this.progress.toString(),\r\n 'aria-valuemin': '0',\r\n 'aria-valuemax': '100'\r\n }),\r\n createElement('div', { className: bb_.progress.text },\r\n `${Math.round(this.progress)}%`\r\n )\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── CTRL ──────────────────────────────┐\r\n\r\n show(options?: LoaderOptions | string) {\r\n if (typeof options === 'string') {\r\n this.message = options;\r\n } else if (options) {\r\n this.message = options.message || '';\r\n this.variant = options.variant || 'spinner';\r\n this.size = options.size || 'medium';\r\n this.overlay = options.overlay !== undefined ? options.overlay : true;\r\n }\r\n\r\n this.visible = true;\r\n this.progress = 0;\r\n this.showProgress = false;\r\n\r\n this.applyBodyLock();\r\n this.update();\r\n }\r\n\r\n hide(delay: number = 0) {\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if (delay > 0) {\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.performHide();\r\n }, delay);\r\n } else {\r\n this.performHide();\r\n }\r\n }\r\n\r\n setMessage(message: string) {\r\n this.message = message;\r\n this.update();\r\n }\r\n\r\n setProgress(progress: number) {\r\n this.showProgress = true;\r\n this.progress = Math.max(0, Math.min(100, progress));\r\n this.update();\r\n }\r\n\r\n updateProgress(increment: number) {\r\n this.setProgress(this.progress + increment);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private performHide() {\r\n this.visible = false;\r\n this.message = '';\r\n this.progress = 0;\r\n this.showProgress = false;\r\n\r\n this.removeBodyLock();\r\n this.update();\r\n }\r\n\r\n private applyBodyLock() {\r\n if (this.overlay) {\r\n document.body.style.overflow = 'hidden';\r\n }\r\n }\r\n\r\n private removeBodyLock() {\r\n document.body.style.overflow = '';\r\n }\r\n\r\n private setupKeyboardListener() {\r\n this.handleKeyPress = this.handleKeyPress.bind(this);\r\n document.addEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n private handleKeyPress = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this.visible && !this.overlay) {\r\n this.hide();\r\n }\r\n };\r\n\r\n private initializeAccessibility() {\r\n const container = this.element?.querySelector(`.${bb_.spinner.container}`);\r\n if (container) {\r\n container.setAttribute('aria-label', t('loading'));\r\n }\r\n }\r\n\r\n isVisible(): boolean {\r\n return this.visible;\r\n }\r\n\r\n getStatus(): { visible: boolean; message: string; progress: number } {\r\n return {\r\n visible: this.visible,\r\n message: this.message,\r\n progress: this.progress\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/smart_form.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { Component } from '../core/component';\r\n import { html } from '@je-es/vdom';\r\n import type { FormFieldOption, VNode } from '../../types';\r\n import { css } from '../core/styles';\r\n import { state } from '../core/decorators';\r\n import { api } from '@je-es/capi';\r\n import type { FormFieldConfig, ValidationRule } from '../../types';\r\nimport { t } from '../services/i18n';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type { FormFieldConfig, ValidationRule };\r\n\r\n export interface FormConfig {\r\n fields: FormFieldConfig[];\r\n endpoint?: string;\r\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n onSubmit?: (data: Record<string, unknown>, event: Event) => void | Promise<void>;\r\n onSuccess?: (data: unknown) => void;\r\n onError?: (error: unknown) => void;\r\n onValidationError?: (errors: Record<string, string>) => void;\r\n submitButton?: {\r\n label?: string;\r\n loadingLabel?: string;\r\n className?: string;\r\n };\r\n className?: string;\r\n autoValidate?: boolean;\r\n }\r\n\r\n export interface FormField extends FormFieldConfig {\r\n error?: string;\r\n touched?: boolean;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * SmartForm Component\r\n * Auto-validation, CSRF protection, API submission\r\n */\r\n export class SmartFormComponent extends Component<FormConfig> {\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state fields: FormField[] = [];\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state formData: Record<string, unknown> = {};\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state isSubmitting = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state submitError = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state submitSuccess = false;\r\n\r\n constructor(props: FormConfig) {\r\n super(props);\r\n\r\n // Initialize fields immediately in constructor\r\n this.fields = this.props.fields.map((field: FormFieldConfig) => ({\r\n ...field,\r\n error: undefined,\r\n touched: false,\r\n })) as FormField[];\r\n\r\n // Initialize form data\r\n for (const field of this.fields) {\r\n this.formData[field.name] = field.value || '';\r\n }\r\n }\r\n\r\n onMount(): void {\r\n // console.log('📝 SmartForm mounted with', this.fields.length, 'fields');\r\n }\r\n\r\n /**\r\n * Handle field change\r\n */\r\n handleChange(fieldName: string, value: unknown): void {\r\n this.formData[fieldName] = value;\r\n\r\n // Auto-validate if enabled\r\n const field = this.fields.find(f => f.name === fieldName);\r\n if (field && this.props.autoValidate) {\r\n field.error = this.validateField(field, value);\r\n field.touched = true;\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Handle field blur\r\n */\r\n handleBlur(fieldName: string): void {\r\n const field = this.fields.find(f => f.name === fieldName);\r\n if (field) {\r\n field.touched = true;\r\n field.error = this.validateField(field, this.formData[fieldName]);\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Validate single field\r\n */\r\n validateField(field: FormField, value: unknown): string | undefined {\r\n const validation = field.validation;\r\n if (!validation) return undefined;\r\n\r\n // Required\r\n if (validation.required && !value) {\r\n return validation.message || `${field.label || field.name} is required`;\r\n }\r\n\r\n if (!value) return undefined;\r\n\r\n // Convert to string for string validations\r\n const stringValue = String(value);\r\n\r\n // Min length\r\n if (validation.minLength && stringValue.length < validation.minLength) {\r\n return validation.message || `Minimum ${validation.minLength} characters required`;\r\n }\r\n\r\n // Max length\r\n if (validation.maxLength && stringValue.length > validation.maxLength) {\r\n return validation.message || `Maximum ${validation.maxLength} characters allowed`;\r\n }\r\n\r\n // Min value\r\n if (validation.min !== undefined && Number(value) < validation.min) {\r\n return validation.message || `Minimum value is ${validation.min}`;\r\n }\r\n\r\n // Max value\r\n if (validation.max !== undefined && Number(value) > validation.max) {\r\n return validation.message || `Maximum value is ${validation.max}`;\r\n }\r\n\r\n // Pattern\r\n if (validation.pattern && !validation.pattern.test(stringValue)) {\r\n return validation.message || 'Invalid format';\r\n }\r\n\r\n // Email\r\n if (validation.email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(stringValue)) {\r\n return validation.message || 'Invalid email format';\r\n }\r\n\r\n // URL\r\n if (validation.url && !/^https?:\\/\\/.+/.test(stringValue)) {\r\n return validation.message || 'Invalid URL format';\r\n }\r\n\r\n // Custom validation\r\n if (validation.custom) {\r\n const result = validation.custom(value);\r\n if (result !== true) {\r\n return typeof result === 'string' ? result : undefined;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Validate all fields\r\n */\r\n validateForm(): boolean {\r\n let isValid = true;\r\n const errors: Record<string, string> = {};\r\n\r\n for (const field of this.fields) {\r\n const error = this.validateField(field, this.formData[field.name]);\r\n field.error = error;\r\n field.touched = true;\r\n\r\n if (error) {\r\n isValid = false;\r\n errors[field.name] = error;\r\n }\r\n }\r\n\r\n this.update();\r\n\r\n // Call validation error callback\r\n if (!isValid && this.props.onValidationError) {\r\n this.props.onValidationError(errors);\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n */\r\n async handleSubmit(event: Event): Promise<void> {\r\n event.preventDefault();\r\n\r\n // Validate form\r\n if (!this.validateForm()) {\r\n // Focus first error field\r\n const firstErrorField = this.fields.find(f => f.error);\r\n if (firstErrorField) {\r\n const element = document.querySelector(`[name=\"${firstErrorField.name}\"]`) as HTMLElement;\r\n element?.focus();\r\n }\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.submitError = '';\r\n this.submitSuccess = false;\r\n this.update();\r\n\r\n try {\r\n // Custom submit handler\r\n if (this.props.onSubmit) {\r\n await this.props.onSubmit(this.formData, event);\r\n }\r\n // API submission\r\n else if (this.props.endpoint) {\r\n const response = await api({\r\n method: this.props.method || 'POST',\r\n url: this.props.endpoint,\r\n data: this.formData,\r\n });\r\n\r\n this.submitSuccess = true;\r\n\r\n if (this.props.onSuccess) {\r\n this.props.onSuccess(response.data);\r\n }\r\n }\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : t('global.loading');\r\n this.submitError = errorMessage;\r\n\r\n if (this.props.onError) {\r\n this.props.onError(error);\r\n }\r\n } finally {\r\n this.isSubmitting = false;\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Render label with optional icon\r\n */\r\n renderLabel(field: FormField): VNode | string {\r\n if (!field.label && !field.icon) return '';\r\n\r\n if (field.icon) {\r\n return html`\r\n <label for=${field.name}>\r\n <i class=\"fa ${field.icon}\"></i>\r\n ${field.label ? html`<span>${field.label}</span>` : ''}\r\n </label>\r\n ` as VNode;\r\n }\r\n\r\n return html`<label for=${field.name}>${field.label}</label>` as VNode;\r\n }\r\n\r\n /**\r\n * Render form field\r\n */\r\n renderField(field: FormField): VNode {\r\n const value = this.formData[field.name] || '';\r\n const labelNode = this.renderLabel(field);\r\n\r\n switch (field.type) {\r\n case 'textarea': {\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <textarea\r\n id=${field.name}\r\n name=${field.name}\r\n placeholder=${field.placeholder || ''}\r\n value=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n oninput=${(e: Event) => {\r\n const target = e.target as HTMLTextAreaElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldTextarea\"\r\n ></textarea>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n case 'select': {\r\n const options = field.options || [];\r\n const optionNodes = options.map((opt: FormFieldOption) => html`\r\n <option value=${String(opt.value)}>${opt.label}</option>\r\n `);\r\n\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <select\r\n id=${field.name}\r\n name=${field.name}\r\n value=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n onchange=${(e: Event) => {\r\n const target = e.target as HTMLSelectElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldSelect\"\r\n >\r\n <option value=\"\">Select...</option>\r\n ${optionNodes}\r\n </select>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n case 'checkbox': {\r\n return html`\r\n <div class=\"bb_formField bb_formField-checkbox ${field.className || ''}\">\r\n <label>\r\n <input\r\n type=\"checkbox\"\r\n id=${field.name}\r\n name=${field.name}\r\n checked=${String(value)}\r\n disabled=${String(field.disabled || this.isSubmitting)}\r\n onchange=${(e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n this.handleChange(field.name, target.checked);\r\n }}\r\n class=\"bb_formFieldCheckbox\"\r\n />\r\n ${field.icon ? html`<i class=\"fa ${field.icon}\"></i>` : ''}\r\n ${field.label || ''}\r\n </label>\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n\r\n default: {\r\n return html`\r\n <div class=\"bb_formField ${field.className || ''}\">\r\n ${labelNode}\r\n <input\r\n type=\"${field.type || 'text'}\"\r\n id=\"${field.name}\"\r\n name=\"${field.name}\"\r\n placeholder=\"${field.placeholder || ''}\"\r\n value=\"${String(value)}\"\r\n disabled=\"${field.disabled || this.isSubmitting}\"\r\n oninput=${(e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n this.handleChange(field.name, target.value);\r\n }}\r\n onblur=${() => this.handleBlur(field.name)}\r\n class=\"bb_formFieldInput\"\r\n />\r\n ${field.error && field.touched ? html`\r\n <span class=\"field-error\">${field.error}</span>\r\n ` : ''}\r\n </div>\r\n ` as VNode;\r\n }\r\n }\r\n }\r\n\r\n render(): VNode {\r\n const submitButton = this.props.submitButton || {};\r\n\r\n // Render all fields into an array first\r\n const fieldNodes = this.fields.map((field: FormField) => this.renderField(field));\r\n\r\n return html`\r\n <form\r\n class=\"smart_form ${this.props.className || ''}\"\r\n onsubmit=${(e: Event) => this.handleSubmit(e)}\r\n >\r\n ${this.submitError ? html`\r\n <div class=\"alert alert-error\">${this.submitError}</div>\r\n ` : ''}\r\n\r\n ${this.submitSuccess ? html`\r\n <div class=\"alert alert-success\">${t('global.loading')}</div>\r\n ` : ''}\r\n\r\n ${fieldNodes}\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"submit-button ${submitButton.className || ''}\"\r\n disabled=${String(this.isSubmitting)}\r\n >\r\n ${this.isSubmitting\r\n ? (submitButton.loadingLabel || t('global.loading'))\r\n : (submitButton.label || t('global.loading'))\r\n }\r\n </button>\r\n </form>\r\n ` as VNode;\r\n }\r\n\r\n styles() { return css``; }\r\n }\r\n\r\n /**\r\n * SmartForm helper function\r\n */\r\n export function SmartForm(config: FormConfig): VNode {\r\n const form = new SmartFormComponent(config);\r\n return form.render();\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/popup.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, VNode } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t, tHtml } from \"../services/i18n\";\r\n import { FormConfig, SmartForm } from \"./smart_form\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type PopupType = 'confirm' | 'alert' | 'form' | 'custom' | 'prompt';\r\n export type PopupVariant = 'default' | 'danger' | 'warning' | 'success' | 'info';\r\n export type PopupSize = 'small' | 'medium' | 'large' | 'xlarge' | 'fullscreen';\r\n\r\n export interface PopupButton {\r\n label : string;\r\n translateKey? : string;\r\n variant? : 'primary' | 'secondary' | 'danger' | 'success';\r\n icon? : string;\r\n onClick : () => void | Promise<void>;\r\n loading? : boolean;\r\n }\r\n\r\n export interface PopupFormOptions {\r\n title : string;\r\n titleTranslateKey? : string;\r\n description? : string;\r\n descriptionTranslateKey? : string;\r\n formConfig : FormConfig;\r\n variant? : PopupVariant;\r\n icon? : string;\r\n size? : PopupSize;\r\n closeOnOverlay? : boolean;\r\n closeOnEscape? : boolean;\r\n showCloseButton? : boolean;\r\n }\r\n\r\n export interface PopupOptions {\r\n title : string;\r\n titleTranslateKey? : string;\r\n message? : string;\r\n messageTranslateKey? : string;\r\n description? : string;\r\n descriptionTranslateKey? : string;\r\n type? : PopupType;\r\n variant? : PopupVariant;\r\n size? : PopupSize;\r\n buttons? : PopupButton[];\r\n customContent? : VNode;\r\n formConfig? : FormConfig;\r\n closeOnOverlay? : boolean;\r\n closeOnEscape? : boolean;\r\n showCloseButton? : boolean;\r\n icon? : string;\r\n onConfirm? : () => void | Promise<void>;\r\n onCancel? : () => void | Promise<void>;\r\n }\r\n\r\n interface ActivePopup extends PopupOptions {\r\n id : number;\r\n resolve? : (value: boolean | string | null | unknown) => void;\r\n inputValue? : string;\r\n isSubmitting? : boolean;\r\n }\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_popupContainer',\r\n\r\n overlay : 'bb_popupOverlay',\r\n\r\n popup: {\r\n base : 'bb_popup',\r\n close : 'bb_popupClose',\r\n },\r\n\r\n header: {\r\n container : 'bb_popupHeader',\r\n icon : 'bb_popupHeaderIcon',\r\n content : 'bb_popupHeaderContent',\r\n title : 'bb_popupHeaderContentTitle',\r\n description : 'bb_popupHeaderContentDesc',\r\n },\r\n\r\n body: {\r\n container : 'bb_popupBody',\r\n message : 'bb_popupBodyMsg',\r\n input : 'bb_popupBodyInput',\r\n formContainer : 'bb_popupBodyFormContainer',\r\n },\r\n\r\n footer : 'bb_popupFooter',\r\n button : 'bb_btn',\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Popup extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state popups : ActivePopup[] = [];\r\n private nextId = 0;\r\n private handleEscapeKey? : (e: KeyboardEvent) => void;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n this.setupKeyboardListener();\r\n\r\n window.addEventListener('languagechange', () => {\r\n this.update();\r\n });\r\n }\r\n\r\n onUnmount() {\r\n if (this.handleEscapeKey) {\r\n document.removeEventListener('keydown', this.handleEscapeKey);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n if (this.popups.length === 0) {\r\n return createElement('div', { className: bb_.container });\r\n }\r\n\r\n return createElement('div', { className: bb_.container },\r\n ...this.popups.map(popup => this.renderPopup(popup))\r\n );\r\n }\r\n\r\n renderPopup(popup: ActivePopup) {\r\n const sizeClass = `bb_popup--${popup.size || 'medium'}`;\r\n const variantClass = popup.variant ? `bb_popup--${popup.variant}` : '';\r\n\r\n return createElement('div', {\r\n key: String(popup.id),\r\n className: bb_.overlay,\r\n 'data-popup-id': popup.id,\r\n onClick: (e: Event) => {\r\n if ((e.target as HTMLElement).classList.contains(bb_.overlay) &&\r\n popup.closeOnOverlay !== false) {\r\n this.closePopup(popup.id, false);\r\n }\r\n }\r\n },\r\n createElement('div', {\r\n className: `${bb_.popup.base} ${sizeClass} ${variantClass}`,\r\n role: 'dialog',\r\n 'aria-modal': 'true',\r\n 'aria-labelledby': `popup-title-${popup.id}`\r\n },\r\n // Close button\r\n popup.showCloseButton !== false ? createElement('button', {\r\n className: bb_.popup.close,\r\n onClick: () => this.closePopup(popup.id, false),\r\n 'aria-label': 'Close'\r\n },\r\n createElement('i', { className: 'fas fa-times' })\r\n ) : null,\r\n\r\n // Header\r\n createElement('div', { className: bb_.header.container },\r\n popup.icon ? createElement('div', { className: bb_.header.icon },\r\n createElement('i', { className: popup.icon })\r\n ) : null,\r\n createElement('div', { className: bb_.header.content },\r\n createElement('h2', {\r\n id: `popup-title-${popup.id}`,\r\n className: bb_.header.title,\r\n 'data-translate': popup.titleTranslateKey\r\n },\r\n popup.titleTranslateKey ? t(popup.titleTranslateKey) : popup.title\r\n ),\r\n popup.description ? createElement('p', {\r\n className: bb_.header.description,\r\n 'data-translate': popup.descriptionTranslateKey\r\n },\r\n popup.descriptionTranslateKey\r\n ? tHtml(popup.descriptionTranslateKey)\r\n : popup.description\r\n ) : null\r\n )\r\n ),\r\n\r\n // Body\r\n createElement('div', { className: bb_.body.container },\r\n popup.message ? createElement('p', {\r\n className: bb_.body.message,\r\n 'data-translate': popup.messageTranslateKey\r\n },\r\n popup.messageTranslateKey\r\n ? tHtml(popup.messageTranslateKey)\r\n : popup.message\r\n ) : null,\r\n\r\n // Prompt input\r\n popup.type === 'prompt' ? createElement('input', {\r\n type: 'text',\r\n className: bb_.body.input,\r\n value: popup.inputValue || '',\r\n placeholder: t('popup.prompt.placeholder'),\r\n 'data-translate': 'popup.prompt.placeholder',\r\n onInput: (e: Event) => {\r\n popup.inputValue = (e.target as HTMLInputElement).value;\r\n }\r\n }) : null,\r\n\r\n // Form rendering\r\n popup.type === 'form' && popup.formConfig ? createElement('div', {\r\n className: bb_.body.formContainer\r\n },\r\n SmartForm(popup.formConfig)\r\n ) : null,\r\n\r\n // Custom content\r\n popup.customContent || null\r\n ),\r\n\r\n // Footer with buttons\r\n popup.buttons && popup.buttons.length > 0 && popup.type !== 'form' ? createElement('div', {\r\n className: bb_.footer\r\n },\r\n ...popup.buttons.map(button => createElement('button', {\r\n className: `${bb_.button} ${button.variant || 'secondary'}`,\r\n 'data-translate': button.translateKey,\r\n disabled: button.loading || popup.isSubmitting,\r\n onClick: async () => {\r\n if (button.loading || popup.isSubmitting) return;\r\n await button.onClick();\r\n }\r\n },\r\n button.icon ? createElement('i', { className: button.icon }) : null,\r\n button.loading || popup.isSubmitting ?\r\n createElement('i', { className: 'fas fa-spinner fa-spin' }) : null,\r\n ' ',\r\n button.translateKey ? t(button.translateKey) : button.label\r\n ))\r\n ) : null\r\n )\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n /**\r\n * Show a custom popup\r\n */\r\n show(options: PopupOptions): Promise<boolean | string | null | unknown> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n ...options,\r\n id,\r\n resolve,\r\n type: options.type || 'custom',\r\n size: options.size || 'medium',\r\n closeOnOverlay: options.closeOnOverlay !== false,\r\n closeOnEscape: options.closeOnEscape !== false,\r\n showCloseButton: options.showCloseButton !== false,\r\n isSubmitting: false\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a form popup\r\n */\r\n showForm(options: PopupFormOptions): Promise<unknown> {\r\n return new Promise((resolve, _reject) => {\r\n const id = this.nextId++;\r\n\r\n // Wrap the form config to handle submission\r\n const wrappedFormConfig: FormConfig = {\r\n ...options.formConfig,\r\n onSubmit: async (data) => {\r\n const popup = this.popups.find(p => p.id === id);\r\n if (popup) {\r\n popup.isSubmitting = true;\r\n this.update();\r\n }\r\n\r\n try {\r\n // Call original onSubmit\r\n if (options.formConfig.onSubmit) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n await options.formConfig.onSubmit(data, undefined as any);\r\n }\r\n\r\n this.closePopup(id, data);\r\n resolve(data);\r\n } catch (error) {\r\n if (popup) {\r\n popup.isSubmitting = false;\r\n this.update();\r\n }\r\n\r\n // Don't close popup on error\r\n if (options.formConfig.onError) {\r\n options.formConfig.onError(error);\r\n }\r\n }\r\n },\r\n submitButton: {\r\n ...options.formConfig.submitButton,\r\n className: options.formConfig.submitButton?.className || `${bb_.button} primary wide`\r\n }\r\n };\r\n\r\n const popup: ActivePopup = {\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n description: options.description,\r\n descriptionTranslateKey: options.descriptionTranslateKey,\r\n type: 'form',\r\n variant: options.variant || 'default',\r\n size: options.size || 'medium',\r\n icon: options.icon,\r\n formConfig: wrappedFormConfig,\r\n closeOnOverlay: options.closeOnOverlay !== false,\r\n closeOnEscape: options.closeOnEscape !== false,\r\n showCloseButton: options.showCloseButton !== false,\r\n id,\r\n resolve,\r\n isSubmitting: false\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a confirmation dialog\r\n */\r\n confirm(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n confirmLabel?: string;\r\n confirmTranslateKey?: string;\r\n cancelLabel?: string;\r\n cancelTranslateKey?: string;\r\n variant?: PopupVariant;\r\n icon?: string;\r\n size?: PopupSize;\r\n onConfirm?: () => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n }): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'confirm',\r\n variant: options.variant || 'default',\r\n size: options.size || 'small',\r\n icon: options.icon,\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm,\r\n onCancel: options.onCancel,\r\n buttons: [\r\n {\r\n label: options.cancelLabel || 'Cancel',\r\n translateKey: options.cancelTranslateKey || 'button.cancel',\r\n variant: 'secondary',\r\n icon: 'fas fa-times',\r\n onClick: async () => {\r\n if (options.onCancel) {\r\n await options.onCancel();\r\n }\r\n this.closePopup(id, false);\r\n }\r\n },\r\n {\r\n label: options.confirmLabel || 'Confirm',\r\n translateKey: options.confirmTranslateKey || 'button.confirm',\r\n variant: options.variant === 'danger' ? 'danger' : 'primary',\r\n icon: 'fas fa-check',\r\n onClick: async () => {\r\n if (options.onConfirm) {\r\n await options.onConfirm();\r\n }\r\n this.closePopup(id, true);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show an alert dialog\r\n */\r\n alert(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n okLabel?: string;\r\n okTranslateKey?: string;\r\n variant?: PopupVariant;\r\n icon?: string;\r\n size?: PopupSize;\r\n onConfirm?: () => void | Promise<void>;\r\n }): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'alert',\r\n variant: options.variant || 'info',\r\n size: options.size || 'small',\r\n icon: options.icon,\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm,\r\n buttons: [\r\n {\r\n label: options.okLabel || 'OK',\r\n translateKey: options.okTranslateKey || 'popup.ok',\r\n variant: 'primary',\r\n icon: 'fas fa-check',\r\n onClick: async () => {\r\n if (options.onConfirm) {\r\n await options.onConfirm();\r\n }\r\n this.closePopup(id, true);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n this.update();\r\n });\r\n }\r\n\r\n /**\r\n * Show a prompt dialog\r\n */\r\n prompt(options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n messageTranslateKey?: string;\r\n defaultValue?: string;\r\n confirmLabel?: string;\r\n confirmTranslateKey?: string;\r\n cancelLabel?: string;\r\n cancelTranslateKey?: string;\r\n icon?: string;\r\n onConfirm?: (value: string) => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n }): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const id = this.nextId++;\r\n\r\n const popup: ActivePopup = {\r\n id,\r\n title: options.title,\r\n titleTranslateKey: options.titleTranslateKey,\r\n message: options.message,\r\n messageTranslateKey: options.messageTranslateKey,\r\n type: 'prompt',\r\n variant: 'default',\r\n icon: options.icon,\r\n inputValue: options.defaultValue || '',\r\n resolve: resolve as (value: boolean | string | unknown) => void,\r\n onConfirm: options.onConfirm as (() => void | Promise<void>) | undefined,\r\n onCancel: options.onCancel,\r\n buttons: [\r\n {\r\n label: options.cancelLabel || 'Cancel',\r\n translateKey: options.cancelTranslateKey || 'popup.cancel',\r\n variant: 'secondary',\r\n onClick: async () => {\r\n if (options.onCancel) {\r\n await options.onCancel();\r\n }\r\n this.closePopup(id, null);\r\n }\r\n },\r\n {\r\n label: options.confirmLabel || 'OK',\r\n translateKey: options.confirmTranslateKey || 'popup.ok',\r\n variant: 'primary',\r\n onClick: async () => {\r\n const value = popup.inputValue || '';\r\n if (options.onConfirm) {\r\n await options.onConfirm(value);\r\n }\r\n this.closePopup(id, value);\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.popups = [...this.popups, popup];\r\n this.applyBodyLock();\r\n });\r\n }\r\n\r\n /**\r\n * Close a specific popup\r\n */\r\n closePopup(id: number, result: boolean | string | null | unknown) {\r\n const popup = this.popups.find(p => p.id === id);\r\n if (popup?.resolve) {\r\n popup.resolve(result);\r\n }\r\n\r\n this.popups = this.popups.filter(p => p.id !== id);\r\n\r\n if (this.popups.length === 0) {\r\n this.removeBodyLock();\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Close all popups\r\n */\r\n closeAll() {\r\n this.popups.forEach(popup => {\r\n if (popup.resolve) {\r\n popup.resolve(false);\r\n }\r\n });\r\n this.popups = [];\r\n this.removeBodyLock();\r\n this.update();\r\n }\r\n\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n private applyBodyLock() {\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n private removeBodyLock() {\r\n document.body.style.overflow = '';\r\n }\r\n\r\n private setupKeyboardListener() {\r\n this.handleEscapeKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this.popups.length > 0) {\r\n const lastPopup = this.popups[this.popups.length - 1];\r\n if (lastPopup.closeOnEscape !== false) {\r\n this.closePopup(lastPopup.id, false);\r\n }\r\n }\r\n };\r\n document.addEventListener('keydown', this.handleEscapeKey);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOBAL ══════════════════════════════════════╗\r\n\r\n let globalPopup: Popup | null = null;\r\n\r\n export function initPopup(container?: HTMLElement): Popup {\r\n if (globalPopup) return globalPopup;\r\n\r\n const popupContainer = container || document.createElement('div');\r\n if (!container) {\r\n document.body.appendChild(popupContainer);\r\n }\r\n\r\n globalPopup = new Popup();\r\n globalPopup.mount(popupContainer);\r\n\r\n return globalPopup;\r\n }\r\n\r\n export function getPopup(): Popup {\r\n if (!globalPopup) {\r\n globalPopup = initPopup();\r\n }\r\n return globalPopup;\r\n }\r\n\r\n // Convenience exports\r\n export const popup = {\r\n show: (options: PopupOptions) => getPopup().show(options),\r\n\r\n confirm: (options: Parameters<Popup['confirm']>[0]) =>\r\n getPopup().confirm(options),\r\n\r\n alert: (options: Parameters<Popup['alert']>[0]) =>\r\n getPopup().alert(options),\r\n\r\n prompt: (options: {\r\n title: string;\r\n titleTranslateKey?: string;\r\n message: string;\r\n icon?: string;\r\n messageTranslateKey?: string;\r\n onConfirm?: () => void | Promise<void>;\r\n }) => getPopup().prompt(options),\r\n\r\n showForm: (options: PopupFormOptions) =>\r\n getPopup().showForm(options),\r\n\r\n closePopup: (id: number, result: boolean | string | null | unknown) =>\r\n getPopup().closePopup(id, result),\r\n\r\n closeLastPopup: () => getPopup().closePopup(getPopup().popups.length - 1, false),\r\n\r\n closeFirstPopup: () => getPopup().closePopup(0, false),\r\n\r\n closeAll: () => getPopup().closeAll()\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/frontend/app/gui/layout/tabbed-view.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement, VNode } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { state } from \"../core/decorators\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_tabbedview',\r\n\r\n header : 'bb_tabbedviewHeader',\r\n\r\n tab: {\r\n base : 'bb_tabbedviewTab',\r\n active : 'bb_tabbedviewTab--active',\r\n disabled : 'bb_tabbedviewTab--disabled',\r\n badge : 'bb_tabbedviewBadge',\r\n },\r\n\r\n content: {\r\n container : 'bb_tabbedviewContent',\r\n emptyState : 'bb_tabbedviewEmptyState',\r\n error : 'bb_tabbedviewError',\r\n }\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export type TabPosition = 'top' | 'side';\r\n export type TabStyle = 'default' | 'pills' | 'minimal';\r\n\r\n export interface Tab {\r\n id : string;\r\n label : string;\r\n translateKey? : string;\r\n icon? : string;\r\n badge? : number | string;\r\n disabled? : boolean;\r\n component? : Component | (() => VNode);\r\n content? : VNode;\r\n onActivate? : () => void | Promise<void>;\r\n }\r\n\r\n export interface TabbedViewOptions {\r\n tabs : Tab[];\r\n defaultTab? : string;\r\n position? : TabPosition;\r\n style? : TabStyle;\r\n className? : string;\r\n headerClassName? : string;\r\n contentClassName? : string;\r\n showTabCount? : boolean;\r\n persistState? : boolean; // Save active tab to localStorage\r\n storageKey? : string; // Key for localStorage\r\n onChange? : (tabId: string) => void | Promise<void>;\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class TabbedView extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state activeTabId : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state tabs : Tab[] = [];\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state position : TabPosition = 'top';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state style : TabStyle = 'default';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state className : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state headerClassName : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state contentClassName : string = '';\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state showTabCount : boolean = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state persistState : boolean = false;\r\n // @ts-expect-error - TypeScript decorator limitation with class property types\r\n @state storageKey : string = 'tabbedview-active';\r\n\r\n private currentTabComponent : Component | null = null;\r\n private onChange? : (tabId: string) => void | Promise<void>;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n async onMount() {\r\n // Listen for language changes\r\n window.addEventListener('languagechange', () => {\r\n this.update();\r\n });\r\n }\r\n\r\n onUnmount() {\r\n // Clean up current tab component\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onUnmount === 'function') {\r\n this.currentTabComponent.onUnmount();\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n /**\r\n * Initialize the tabbed view with options\r\n */\r\n init(options: TabbedViewOptions) {\r\n this.tabs = options.tabs;\r\n this.position = options.position || 'top';\r\n this.style = options.style || 'default';\r\n this.className = options.className || '';\r\n this.headerClassName = options.headerClassName || '';\r\n this.contentClassName = options.contentClassName || '';\r\n this.showTabCount = options.showTabCount || false;\r\n this.persistState = options.persistState || false;\r\n this.storageKey = options.storageKey || 'tabbedview-active';\r\n this.onChange = options.onChange;\r\n\r\n // Determine initial active tab\r\n if (this.persistState) {\r\n const savedTab = localStorage.getItem(this.storageKey);\r\n if (savedTab && this.tabs.find(t => t.id === savedTab)) {\r\n this.activeTabId = savedTab;\r\n }\r\n }\r\n\r\n if (!this.activeTabId) {\r\n this.activeTabId = options.defaultTab || this.tabs[0]?.id || '';\r\n }\r\n\r\n this.update();\r\n return this;\r\n }\r\n\r\n /**\r\n * Set active tab\r\n */\r\n async setActiveTab(tabId: string) {\r\n const tab = this.tabs.find(t => t.id === tabId);\r\n if (!tab || tab.disabled) return;\r\n\r\n // Clean up old tab component\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onUnmount === 'function') {\r\n this.currentTabComponent.onUnmount();\r\n }\r\n this.currentTabComponent = null;\r\n\r\n this.activeTabId = tabId;\r\n\r\n // Save to localStorage if persistence is enabled\r\n if (this.persistState) {\r\n localStorage.setItem(this.storageKey, tabId);\r\n }\r\n\r\n // Call tab's onActivate callback\r\n if (tab.onActivate) {\r\n await tab.onActivate();\r\n // (window as any).__globalLoader?.show();\r\n // TODO: better use in-container loading indicator\r\n }\r\n\r\n // Call global onChange callback\r\n if (this.onChange) {\r\n await this.onChange(tabId);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n /**\r\n * Add a new tab dynamically\r\n */\r\n addTab(tab: Tab) {\r\n this.tabs = [...this.tabs, tab];\r\n this.update();\r\n }\r\n\r\n /**\r\n * Remove a tab\r\n */\r\n removeTab(tabId: string) {\r\n this.tabs = this.tabs.filter(t => t.id !== tabId);\r\n if (this.activeTabId === tabId && this.tabs.length > 0) {\r\n this.activeTabId = this.tabs[0].id;\r\n }\r\n this.update();\r\n }\r\n\r\n /**\r\n * Update tab properties\r\n */\r\n updateTab(tabId: string, updates: Partial<Tab>) {\r\n const tab = this.tabs.find(t => t.id === tabId);\r\n if (tab) {\r\n Object.assign(tab, updates);\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Get active tab\r\n */\r\n getActiveTab(): Tab | undefined {\r\n return this.tabs.find(t => t.id === this.activeTabId);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n const containerClass = [\r\n bb_.container,\r\n `bb_tabbedview__--${this.position}`,\r\n `bb_tabbedview__--${this.style}`,\r\n this.className\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', { className: containerClass },\r\n this.renderTabList(),\r\n this.renderTabContent()\r\n );\r\n }\r\n\r\n renderTabList() {\r\n const headerClass = [\r\n bb_.header,\r\n this.headerClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n return createElement('div', { className: headerClass },\r\n ...this.tabs.map(tab => this.renderTab(tab))\r\n );\r\n }\r\n\r\n renderTab(tab: Tab) {\r\n const isActive = this.activeTabId === tab.id;\r\n\r\n const tabClass = [\r\n bb_.tab.base,\r\n isActive ? bb_.tab.active : '',\r\n tab.disabled ? bb_.tab.disabled : ''\r\n ].filter(Boolean).join(' ');\r\n\r\n const label = tab.translateKey ? t(tab.translateKey) : tab.label;\r\n\r\n return createElement('button', {\r\n key: tab.id,\r\n className: tabClass,\r\n onclick: () => this.setActiveTab(tab.id),\r\n disabled: tab.disabled,\r\n 'data-translate': tab.translateKey,\r\n 'aria-selected': isActive,\r\n role: 'tab'\r\n },\r\n tab.icon ? createElement('i', { className: tab.icon }) : null,\r\n createElement('span', {}, label),\r\n tab.badge !== undefined && tab.badge !== null && tab.badge !== 0 ?\r\n createElement('span', { className: bb_.tab.badge },\r\n typeof tab.badge === 'number' && tab.badge > 99 ? '99+' : String(tab.badge)\r\n ) : null\r\n );\r\n }\r\n\r\n renderTabContent() {\r\n const contentClass = [\r\n bb_.content.container,\r\n this.contentClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n const activeTab = this.getActiveTab();\r\n if (!activeTab) {\r\n return createElement('div', { className: contentClass },\r\n createElement('div', { className: bb_.content.emptyState },\r\n createElement('p', {}, t('global.loading'))\r\n )\r\n );\r\n }\r\n\r\n return createElement('div', {\r\n className: contentClass,\r\n role: 'tabpanel'\r\n },\r\n this.renderActiveTabContent(activeTab)\r\n );\r\n }\r\n\r\n renderActiveTabContent(tab: Tab) {\r\n // If tab has a component class/function\r\n if (tab.component) {\r\n try {\r\n // Check if it's a Component instance\r\n if (tab.component instanceof Component) {\r\n // It's already an instance, just render it\r\n this.currentTabComponent = tab.component;\r\n\r\n // Get the VNode from render()\r\n const vnode = this.currentTabComponent.render();\r\n\r\n // Wrap the VNode to set _element when it's mounted via ref callback\r\n const wrappedProps = {\r\n ...vnode.props,\r\n ref: (el: HTMLElement | null) => {\r\n if (el && this.currentTabComponent) {\r\n // Set the component's _element through the private field\r\n (this.currentTabComponent as Component<Record<string, unknown>, Record<string, unknown>>).setElement(el);\r\n // console.log('✅ TabbedView set component._element via ref');\r\n }\r\n // Call original ref if it exists\r\n if (typeof vnode.props.ref === 'function') {\r\n vnode.props.ref(el);\r\n }\r\n }\r\n };\r\n\r\n // Create a new VNode with the wrapped props\r\n const wrappedVNode = {\r\n ...vnode,\r\n props: wrappedProps\r\n };\r\n\r\n // Schedule onMount to be called after element is in DOM\r\n if (typeof this.currentTabComponent.onMount === 'function') {\r\n setTimeout(() => {\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n this.currentTabComponent.onMount();\r\n }\r\n }, 0);\r\n }\r\n\r\n return wrappedVNode;\r\n }\r\n\r\n // Check if it's a function\r\n if (typeof tab.component === 'function') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ComponentClass = tab.component as any;\r\n\r\n // Check if it's a Component class (has prototype.render)\r\n if (ComponentClass.prototype && typeof ComponentClass.prototype.render === 'function') {\r\n // It's a Component class - create new instance\r\n if (!this.currentTabComponent) {\r\n this.currentTabComponent = new ComponentClass();\r\n\r\n // Schedule onMount\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n setTimeout(() => {\r\n if (this.currentTabComponent && typeof this.currentTabComponent.onMount === 'function') {\r\n this.currentTabComponent.onMount();\r\n }\r\n }, 0);\r\n }\r\n }\r\n\r\n return this.currentTabComponent!.render();\r\n } else {\r\n // It's a function returning VNode\r\n return ComponentClass();\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error rendering tab component:', error);\r\n return createElement('div', { className: bb_.content.error },\r\n t('global.loading')\r\n );\r\n }\r\n }\r\n\r\n // If tab has direct content VNode\r\n if (tab.content) {\r\n return tab.content;\r\n }\r\n\r\n // Fallback\r\n return createElement('div', { className: bb_.content.emptyState },\r\n createElement('p', {}, t('global.loading'))\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ GLOB ════════════════════════════════════════╗\r\n\r\n /**\r\n * Create a new TabbedView instance with options\r\n */\r\n export function createTabbedView(options: TabbedViewOptions): TabbedView {\r\n const view = new TabbedView();\r\n view.init(options);\r\n return view;\r\n }\r\n\r\n /**\r\n * Helper to create a simple tabbed view and mount it\r\n */\r\n export async function mountTabbedView(\r\n container: HTMLElement,\r\n options: TabbedViewOptions\r\n ): Promise<TabbedView> {\r\n const view = createTabbedView(options);\r\n await view.mount(container);\r\n return view;\r\n }\r\n\r\n// ╚═══════════════════════════════════════════════════════════════════════════════════════╝","// src/frontend/app/gui/layout/items_loader.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createDOMElement, createElement, VNode, VNodeChild } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ INIT ════════════════════════════════════════╗\r\n\r\n // Blah Blah Style Map\r\n const bb_ = {\r\n container : 'bb_itemsLoaderContainer',\r\n list : 'bb_itemsLoaderList',\r\n searchbar : 'bb_itemsLoaderSearchbar',\r\n loading : 'bb_itemsLoaderLoading',\r\n error : 'bb_itemsLoaderError',\r\n trigger : 'bb_itemsLoaderTrigger',\r\n end : 'bb_itemsLoaderEnd',\r\n emptyState : 'bb_tabbedviewEmptyState',\r\n button : 'bb_btn',\r\n item : 'bb_itemsLoader-item',\r\n formFieldInput : 'bb_formFieldInput',\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPES ═══════════════════════════════════════╗\r\n\r\n export interface ItemsLoaderConfig<T> {\r\n // Core configuration\r\n fetchUrl : string | ((page: number, filters: Record<string, unknown>) => string);\r\n renderItem : (item: T, index: number) => HTMLElement;\r\n pageSize? : number;\r\n\r\n // Empty state\r\n emptyStateConfig?: {\r\n icon : string;\r\n title : string;\r\n description : string;\r\n };\r\n\r\n // UI text\r\n loadMoreText? : string;\r\n loadingText? : string;\r\n errorText? : string;\r\n containerClassName? : string;\r\n itemClassName? : string;\r\n\r\n // Filtering\r\n filters? : Record<string, unknown>;\r\n onFiltersChange? : (filters: Record<string, unknown>) => void;\r\n\r\n // Search\r\n enableSearch? : boolean;\r\n searchPlaceholder? : string;\r\n searchFilterKey? : string;\r\n searchDebounceMs? : number;\r\n\r\n // Callbacks\r\n onItemClick? : (item: T, index: number) => void;\r\n onLoadMore? : (page: number, items: T[]) => void;\r\n onError? : (error: Error) => void;\r\n\r\n // Data extraction\r\n initialItems? : T[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n extractItems? : (response: any) => T[];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n extractTotal? : (response: any) => number;\r\n\r\n // Authentication\r\n getAuthToken? : () => string | null;\r\n\r\n // Scroll behavior\r\n enableInfiniteScroll? : boolean;\r\n scrollThreshold? : number;\r\n\r\n // 🆕 Visibility tracking (for auto-mark-as-read, analytics, etc.)\r\n enableVisibilityTracking? : boolean;\r\n visibilityThreshold? : number;\r\n visibilityRootMargin? : string;\r\n onItemsViewed? : (viewedItems: T[]) => Promise<void>;\r\n getItemId? : (item: T) => number | string;\r\n shouldTrackItem? : (item: T) => boolean; // e.g., only track unread items\r\n\r\n // 🆕 Dropdown lifecycle (for nested dropdowns)\r\n onDropdownOpen? : () => void;\r\n onDropdownClose? : () => void;\r\n\r\n // 🆕 Batch operations\r\n onBatchAction? : (action: string, itemIds: (number | string)[]) => Promise<void>;\r\n }\r\n\r\n interface LoadState {\r\n loading : boolean;\r\n error : string | null;\r\n hasMore : boolean;\r\n page : number;\r\n total : number;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class ItemsLoader<T = unknown> extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n items : T[] = [];\r\n loadState : LoadState = {\r\n loading : false,\r\n error : null,\r\n hasMore : true,\r\n page : 0,\r\n total : 0\r\n };\r\n filters : Record<string, unknown> = {};\r\n\r\n public config! : ItemsLoaderConfig<T>;\r\n\r\n // Scroll management\r\n private scrollContainer : HTMLElement | null = null;\r\n\r\n // Infinite scroll\r\n private loadMoreObserver : IntersectionObserver | null = null;\r\n private currentLoadMoreTrigger : Element | null = null;\r\n private loadMoreMutationObserver : MutationObserver | null = null;\r\n\r\n // Visibility tracking\r\n private visibilityObserver : IntersectionObserver | null = null;\r\n private viewedItems = new Set<number | string>();\r\n private dropdownIsOpen : boolean = false;\r\n\r\n // DOM references\r\n private itemsListContainer : HTMLElement | null = null;\r\n private searchInput : HTMLInputElement | null = null;\r\n\r\n // State flags\r\n private isUpdating : boolean = false;\r\n private searchDebounceTimer : NodeJS.Timeout | null = null;\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n initialize(config: ItemsLoaderConfig<T>) {\r\n this.config = {\r\n pageSize: 10,\r\n loadMoreText: 'Load More',\r\n loadingText: 'Loading...',\r\n errorText: 'Failed to load items',\r\n containerClassName: bb_.container,\r\n itemClassName: bb_.item,\r\n enableInfiniteScroll: true,\r\n scrollThreshold: 200,\r\n enableSearch: false,\r\n searchPlaceholder: 'Search...',\r\n searchFilterKey: 'search',\r\n searchDebounceMs: 300,\r\n enableVisibilityTracking: false,\r\n visibilityThreshold: 0.5,\r\n visibilityRootMargin: '0px',\r\n extractItems: (response: { notifications?: T[]; items?: T[]; data?: T[]; logs?: T[] }) =>\r\n response.notifications || response.items || response.data || response.logs || [],\r\n extractTotal: (response: { total?: number; count?: number; pagination?: { total?: number } }) =>\r\n response.pagination?.total || response.total || response.count || 0,\r\n ...config\r\n };\r\n\r\n if (this.config.filters) {\r\n this.filters = { ...this.config.filters };\r\n }\r\n\r\n if (this.config.initialItems) {\r\n this.items = [...this.config.initialItems];\r\n }\r\n }\r\n\r\n async onMount() {\r\n if (this.items.length === 0) {\r\n await this.loadMore();\r\n }\r\n\r\n if (this.config.enableInfiniteScroll) {\r\n this.setupInfiniteScroll();\r\n }\r\n\r\n if (this.config.scrollThreshold) {\r\n this.setupScrollListener();\r\n }\r\n\r\n if (this.config.enableVisibilityTracking) {\r\n this.setupVisibilityTracking();\r\n }\r\n }\r\n\r\n onUnmount() {\r\n this.disconnectInfiniteScrollObserver();\r\n this.disconnectVisibilityObserver();\r\n\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n\r\n if (this.scrollContainer) {\r\n this.scrollContainer.removeEventListener('scroll', this.handleScroll);\r\n this.scrollContainer = null;\r\n }\r\n\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n async loadMore() {\r\n if (this.loadState.loading || !this.loadState.hasMore) {\r\n return;\r\n }\r\n\r\n try {\r\n const scrollContainer = this.scrollContainer || this.findScrollContainer();\r\n const savedScrollTop = scrollContainer?.scrollTop || 0;\r\n const savedScrollHeight = scrollContainer?.scrollHeight || 0;\r\n\r\n this.loadState = { ...this.loadState, loading: true, error: null };\r\n this.updateLoadingState();\r\n\r\n const nextPage = this.loadState.page + 1;\r\n const url = this.buildUrl(nextPage);\r\n\r\n const response = await fetch(url, {\r\n credentials: 'include',\r\n headers: this.buildHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const newItems = this.config.extractItems!(data);\r\n const total = this.config.extractTotal!(data);\r\n\r\n this.items = [...this.items, ...newItems];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: this.items.length < total,\r\n page: nextPage,\r\n total\r\n };\r\n\r\n this.updateLoadingState();\r\n this.appendNewItems(newItems);\r\n\r\n // Restore scroll position\r\n if (scrollContainer && savedScrollTop > 0) {\r\n scrollContainer.scrollTop = savedScrollTop;\r\n\r\n requestAnimationFrame(() => {\r\n const newScrollHeight = scrollContainer.scrollHeight;\r\n const scrollHeightDiff = newScrollHeight - savedScrollHeight;\r\n\r\n if (Math.abs(scrollHeightDiff) > 10) {\r\n scrollContainer.scrollTop = savedScrollTop;\r\n }\r\n });\r\n }\r\n\r\n this.reconnectInfiniteScrollObserver();\r\n this.config.onLoadMore?.(nextPage, this.items);\r\n\r\n } catch (error) {\r\n this.loadState = {\r\n ...this.loadState,\r\n loading: false,\r\n error: error instanceof Error ? error.message : this.config.errorText!\r\n };\r\n\r\n this.updateLoadingState();\r\n this.updateFooter();\r\n this.config.onError?.(error instanceof Error ? error : new Error('Unknown error'));\r\n }\r\n }\r\n\r\n async reload() {\r\n this.items = [];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: true,\r\n page: 0,\r\n total: 0\r\n };\r\n await this.loadMore();\r\n }\r\n\r\n async applyFilters(newFilters: Record<string, unknown>) {\r\n if (this.isUpdating) return;\r\n\r\n this.isUpdating = true;\r\n this.filters = { ...newFilters };\r\n\r\n this.items = [];\r\n this.loadState = {\r\n loading: true,\r\n error: null,\r\n hasMore: true,\r\n page: 0,\r\n total: 0\r\n };\r\n\r\n this.updateLoadingState();\r\n\r\n try {\r\n const url = this.buildUrl(1);\r\n const response = await fetch(url, {\r\n credentials: 'include',\r\n headers: this.buildHeaders()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const newItems = this.config.extractItems!(data);\r\n const total = this.config.extractTotal!(data);\r\n\r\n this.items = [...newItems];\r\n this.loadState = {\r\n loading: false,\r\n error: null,\r\n hasMore: this.items.length < total,\r\n page: 1,\r\n total\r\n };\r\n\r\n // Clear container\r\n if (this.itemsListContainer) {\r\n this.itemsListContainer.innerHTML = '';\r\n }\r\n\r\n if (this.element) {\r\n this.element.querySelectorAll(`.${bb_.trigger}, .${bb_.end}, .${bb_.error}, .${bb_.loading}, .${bb_.emptyState}`).forEach(el => el.remove());\r\n }\r\n\r\n // Append items or show empty state\r\n if (this.items.length > 0) {\r\n if (!this.itemsListContainer) {\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n }\r\n\r\n if (this.itemsListContainer) {\r\n this.appendNewItems(this.items);\r\n }\r\n } else {\r\n this.updateFooter();\r\n }\r\n\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n this.reconnectInfiniteScrollObserver();\r\n\r\n this.config.onLoadMore?.(1, this.items);\r\n this.config.onFiltersChange?.(this.filters);\r\n\r\n } catch (error) {\r\n this.loadState = {\r\n ...this.loadState,\r\n loading: false,\r\n error: error instanceof Error ? error.message : this.config.errorText!\r\n };\r\n\r\n this.updateLoadingState();\r\n this.config.onError?.(error instanceof Error ? error : new Error('Unknown error'));\r\n } finally {\r\n this.isUpdating = false;\r\n }\r\n }\r\n\r\n async handleSearch(searchQuery: string) {\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n\r\n this.searchDebounceTimer = setTimeout(async () => {\r\n const newFilters = { ...this.filters };\r\n\r\n if (searchQuery.trim()) {\r\n newFilters[this.config.searchFilterKey!] = searchQuery.trim();\r\n } else {\r\n delete newFilters[this.config.searchFilterKey!];\r\n }\r\n\r\n await this.applyFilters(newFilters);\r\n }, this.config.searchDebounceMs);\r\n }\r\n\r\n updateItems(updatedItems: T[]) {\r\n this.items = [...updatedItems];\r\n\r\n if (this.itemsListContainer) {\r\n this.itemsListContainer.innerHTML = '';\r\n this.appendNewItems(updatedItems);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private setupVisibilityTracking() {\r\n if (!this.config.enableVisibilityTracking) return;\r\n\r\n if (this.visibilityObserver) {\r\n this.visibilityObserver.disconnect();\r\n }\r\n\r\n const scrollContainer = this.findScrollContainer();\r\n\r\n this.visibilityObserver = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && this.dropdownIsOpen) {\r\n const element = entry.target as HTMLElement;\r\n const itemIndex = parseInt(element.getAttribute('data-item-index') || '-1');\r\n\r\n if (itemIndex >= 0 && itemIndex < this.items.length) {\r\n const item = this.items[itemIndex];\r\n const itemId = this.config.getItemId?.(item);\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n\r\n if (itemId && !this.viewedItems.has(itemId) && shouldTrack) {\r\n this.viewedItems.add(itemId);\r\n }\r\n }\r\n }\r\n });\r\n },\r\n {\r\n root: scrollContainer,\r\n rootMargin: this.config.visibilityRootMargin,\r\n threshold: this.config.visibilityThreshold\r\n }\r\n );\r\n\r\n this.observeTrackableItems();\r\n }\r\n\r\n private observeTrackableItems() {\r\n if (!this.visibilityObserver || !this.itemsListContainer) return;\r\n\r\n const items = this.itemsListContainer.querySelectorAll('[data-item-index]');\r\n items.forEach(element => {\r\n const itemIndex = parseInt((element as HTMLElement).getAttribute('data-item-index') || '-1');\r\n if (itemIndex >= 0 && itemIndex < this.items.length) {\r\n const item = this.items[itemIndex];\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n\r\n if (shouldTrack) {\r\n this.visibilityObserver!.observe(element);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private trackAlreadyVisibleItems() {\r\n if (!this.itemsListContainer) return;\r\n\r\n const scrollContainer = this.findScrollContainer();\r\n if (!scrollContainer) return;\r\n\r\n const items = this.itemsListContainer.querySelectorAll('[data-item-index]');\r\n const containerRect = scrollContainer.getBoundingClientRect();\r\n\r\n items.forEach(element => {\r\n const itemIndex = parseInt((element as HTMLElement).getAttribute('data-item-index') || '-1');\r\n if (itemIndex < 0 || itemIndex >= this.items.length) return;\r\n\r\n const item = this.items[itemIndex];\r\n const itemId = this.config.getItemId?.(item);\r\n if (!itemId || this.viewedItems.has(itemId)) return;\r\n\r\n const shouldTrack = this.config.shouldTrackItem?.(item) ?? true;\r\n if (!shouldTrack) return;\r\n\r\n const rect = (element as HTMLElement).getBoundingClientRect();\r\n const isVisible = (\r\n rect.top < containerRect.bottom &&\r\n rect.bottom > containerRect.top &&\r\n rect.top >= containerRect.top - 100 &&\r\n rect.bottom <= containerRect.bottom + 100\r\n );\r\n\r\n if (isVisible) {\r\n this.viewedItems.add(itemId);\r\n }\r\n });\r\n }\r\n\r\n private disconnectVisibilityObserver() {\r\n if (this.visibilityObserver) {\r\n this.visibilityObserver.disconnect();\r\n this.visibilityObserver = null;\r\n }\r\n }\r\n\r\n public handleDropdownOpen() {\r\n this.dropdownIsOpen = true;\r\n this.viewedItems.clear();\r\n\r\n if (this.config.enableVisibilityTracking) {\r\n this.trackAlreadyVisibleItems();\r\n this.observeTrackableItems();\r\n }\r\n\r\n this.config.onDropdownOpen?.();\r\n }\r\n\r\n public async handleDropdownClose() {\r\n this.dropdownIsOpen = false;\r\n\r\n if (this.viewedItems.size > 0 && this.config.onItemsViewed) {\r\n const viewedItemsArray = this.items.filter(item => {\r\n const itemId = this.config.getItemId?.(item);\r\n return itemId && this.viewedItems.has(itemId);\r\n });\r\n\r\n await this.config.onItemsViewed(viewedItemsArray);\r\n }\r\n\r\n this.viewedItems.clear();\r\n this.config.onDropdownClose?.();\r\n }\r\n\r\n public async performBatchAction(action: string, itemIds: (number | string)[]) {\r\n if (this.config.onBatchAction) {\r\n await this.config.onBatchAction(action, itemIds);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private appendNewItems(newItems: T[]) {\r\n if (!this.itemsListContainer) {\r\n this.itemsListContainer = this.element?.querySelector(`.${bb_.list}`) as HTMLElement;\r\n }\r\n\r\n if (!this.itemsListContainer) return;\r\n\r\n const fragment = document.createDocumentFragment();\r\n const startIndex = this.items.length - newItems.length;\r\n\r\n newItems.forEach((item, index) => {\r\n const actualIndex = startIndex + index;\r\n const itemElement = this.config.renderItem(item, actualIndex);\r\n\r\n itemElement.setAttribute('data-item-index', actualIndex.toString());\r\n\r\n if (this.config.onItemClick) {\r\n itemElement.className = `${itemElement.className} ${this.config.itemClassName} clickable`;\r\n itemElement.onclick = () => this.handleItemClick(item, actualIndex);\r\n } else {\r\n itemElement.className = `${itemElement.className} ${this.config.itemClassName}`;\r\n }\r\n\r\n fragment.appendChild(itemElement);\r\n });\r\n\r\n this.itemsListContainer.appendChild(fragment);\r\n this.updateFooter();\r\n\r\n if (this.config.enableVisibilityTracking && this.dropdownIsOpen) {\r\n setTimeout(() => this.observeTrackableItems(), 100);\r\n }\r\n }\r\n\r\n private updateLoadingState() {\r\n const container = this.element?.querySelector(`.${bb_.container}`);\r\n if (!container) return;\r\n\r\n let loadingEl = container.querySelector(`.${bb_.loading}`) as HTMLElement;\r\n\r\n if (this.loadState.loading) {\r\n if (!loadingEl) {\r\n const loadingVNode = this.renderLoading();\r\n loadingEl = this.createElementFromVNode(loadingVNode);\r\n container.appendChild(loadingEl);\r\n }\r\n } else {\r\n if (loadingEl) {\r\n loadingEl.remove();\r\n }\r\n }\r\n }\r\n\r\n public updateFooter() {\r\n const container = this.element;\r\n if (!container) return;\r\n\r\n container.querySelectorAll(`.${bb_.trigger}, .${bb_.end}, .${bb_.emptyState}`).forEach(el => {\r\n el.remove();\r\n });\r\n\r\n if (this.items.length === 0 && !this.loadState.loading && this.config.emptyStateConfig) {\r\n const emptyVNode = this.renderEmptyState();\r\n const emptyElement = createDOMElement(emptyVNode);\r\n container.appendChild(emptyElement);\r\n return;\r\n }\r\n\r\n if (this.loadState.hasMore && !this.loadState.loading && this.items.length > 0) {\r\n const triggerVNode = this.renderLoadMoreTrigger();\r\n const triggerElement = createDOMElement(triggerVNode);\r\n container.appendChild(triggerElement);\r\n }\r\n\r\n if (!this.loadState.hasMore && this.items.length > 0) {\r\n const endMsgVNode = this.renderEndMessage();\r\n const endMsgElement = createDOMElement(endMsgVNode);\r\n container.appendChild(endMsgElement);\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private setupInfiniteScroll() {\r\n if (this.loadMoreObserver) {\r\n this.loadMoreObserver.disconnect();\r\n }\r\n\r\n this.loadMoreObserver = new IntersectionObserver(\r\n (entries) => {\r\n const [entry] = entries;\r\n\r\n if (entry.isIntersecting && !this.loadState.loading && this.loadState.hasMore) {\r\n this.loadMore();\r\n }\r\n },\r\n {\r\n threshold: 0.1,\r\n rootMargin: '50px'\r\n }\r\n );\r\n\r\n this.reconnectInfiniteScrollObserver();\r\n }\r\n\r\n private reconnectInfiniteScrollObserver() {\r\n if (!this.config.enableInfiniteScroll || !this.loadMoreObserver) return;\r\n\r\n if (this.currentLoadMoreTrigger) {\r\n this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger);\r\n this.currentLoadMoreTrigger = null;\r\n }\r\n\r\n const tryObserve = () => {\r\n const trigger = this.element?.querySelector('[data-load-more-trigger=\"true\"]');\r\n\r\n if (trigger) {\r\n this.loadMoreObserver!.observe(trigger);\r\n this.currentLoadMoreTrigger = trigger;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n if (!tryObserve()) {\r\n // Use MutationObserver to wait for trigger\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n }\r\n\r\n this.loadMoreMutationObserver = new MutationObserver(() => {\r\n if (tryObserve() && this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n });\r\n\r\n if (this.element) {\r\n this.loadMoreMutationObserver.observe(this.element, {\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n setTimeout(() => {\r\n if (this.loadMoreMutationObserver) {\r\n this.loadMoreMutationObserver.disconnect();\r\n this.loadMoreMutationObserver = null;\r\n }\r\n }, 5000);\r\n }\r\n }\r\n }\r\n\r\n private disconnectInfiniteScrollObserver() {\r\n if (this.loadMoreObserver && this.currentLoadMoreTrigger) {\r\n this.loadMoreObserver.unobserve(this.currentLoadMoreTrigger);\r\n this.currentLoadMoreTrigger = null;\r\n }\r\n }\r\n\r\n private setupScrollListener() {\r\n requestAnimationFrame(() => {\r\n this.scrollContainer = this.findScrollContainer();\r\n\r\n if (this.scrollContainer) {\r\n if ('scrollRestoration' in history) {\r\n history.scrollRestoration = 'manual';\r\n }\r\n\r\n this.scrollContainer.addEventListener('scroll', this.handleScroll);\r\n }\r\n });\r\n }\r\n\r\n private handleScroll = () => {\r\n if (!this.scrollContainer || this.loadState.loading || !this.loadState.hasMore) {\r\n return;\r\n }\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n if (distanceFromBottom < this.config.scrollThreshold!) {\r\n this.loadMore();\r\n }\r\n };\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n private findScrollContainer(): HTMLElement | null {\r\n const candidates = [\r\n this.element?.closest('.bb_notificationsContent'),\r\n this.element?.closest('.bb_dropdownMenu'),\r\n this.element?.querySelector('[data-notifications-loader]'),\r\n this.element?.closest('[data-notifications-loader]'),\r\n this.element?.closest('.scrollbar-thin'),\r\n this.element?.parentElement,\r\n this.element\r\n ];\r\n\r\n for (const candidate of candidates) {\r\n if (candidate) {\r\n const el = candidate as HTMLElement;\r\n if (el.scrollHeight > el.clientHeight || el.classList.contains('scrollbar-thin')) {\r\n return el;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildUrl(page: number): string {\r\n if (typeof this.config.fetchUrl === 'function') {\r\n return this.config.fetchUrl(page, this.filters);\r\n }\r\n\r\n const separator = this.config.fetchUrl.includes('?') ? '&' : '?';\r\n const params = new URLSearchParams({\r\n page: page.toString(),\r\n limit: this.config.pageSize!.toString(),\r\n ...this.filters as Record<string, string>\r\n });\r\n\r\n return `${this.config.fetchUrl}${separator}${params}`;\r\n }\r\n\r\n private buildHeaders(): HeadersInit {\r\n const headers: HeadersInit = {\r\n 'Content-Type': 'application/json'\r\n };\r\n\r\n const token = this.config.getAuthToken?.();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private handleItemClick = (item: T, index: number) => {\r\n this.config.onItemClick?.(item, index);\r\n };\r\n\r\n private createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type !== 'string') {\r\n throw new Error('Can only create elements from string types');\r\n }\r\n\r\n const element = document.createElement(vnode.type);\r\n\r\n if (vnode.props) {\r\n Object.entries(vnode.props).forEach(([key, value]) => {\r\n if (key === 'className') {\r\n element.className = value as string;\r\n } else if (key === 'style') {\r\n if (typeof value === 'string') {\r\n element.setAttribute('style', value);\r\n } else if (typeof value === 'object' && value !== null) {\r\n Object.assign(element.style, value);\r\n }\r\n } else if (key === 'onclick' && typeof value === 'function') {\r\n element.addEventListener('click', value as EventListener);\r\n } else if (key !== 'children' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n if (vnode.children) {\r\n vnode.children.forEach((child: VNodeChild) => {\r\n if (child === null || child === undefined) return;\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object') {\r\n element.appendChild(this.createElementFromVNode(child));\r\n }\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── ──── ──────────────────────────────┐\r\n\r\n render() {\r\n return createElement('div', {\r\n className: this.config.containerClassName\r\n },\r\n this.config.enableSearch ? this.renderSearchBar() : null,\r\n createElement('div', {\r\n className: bb_.list,\r\n ref: (el: HTMLElement | null) => {\r\n if (el) {\r\n this.itemsListContainer = el;\r\n }\r\n }\r\n }),\r\n\r\n this.loadState.error ? this.renderError() : null,\r\n this.loadState.loading ? this.renderLoading() : null,\r\n this.loadState.hasMore && !this.loadState.loading && this.items.length > 0 ? this.renderLoadMoreTrigger() : null,\r\n !this.loadState.hasMore && this.items.length > 0 ? this.renderEndMessage() : null\r\n );\r\n }\r\n\r\n private renderSearchBar() {\r\n return createElement('div', { className: bb_.searchbar },\r\n createElement('div', { className: 'row gap-sm' },\r\n createElement('i', { className: 'fas fa-search' }),\r\n createElement('input', {\r\n type: 'text',\r\n className: bb_.formFieldInput,\r\n placeholder: this.config.searchPlaceholder,\r\n ref: (el: HTMLElement | null) => {\r\n if (el) {\r\n this.searchInput = el as HTMLInputElement;\r\n this.searchInput.addEventListener('input', (e) => {\r\n const query = (e.target as HTMLInputElement).value;\r\n this.handleSearch(query);\r\n });\r\n }\r\n }\r\n })\r\n )\r\n );\r\n }\r\n\r\n public renderEmptyState() {\r\n const config = this.config.emptyStateConfig!;\r\n return createElement('div', { className: bb_.emptyState },\r\n createElement('i', { className: `__icon ${config.icon}` }),\r\n createElement('h3', { className: '__title' }, config.title),\r\n createElement('p', { className: '__desc' }, config.description)\r\n );\r\n }\r\n\r\n private renderLoading() {\r\n return createElement('div', { className: bb_.loading },\r\n createElement('i', { className: 'fas fa-spinner fa-spin' }),\r\n createElement('p', {}, this.config.loadingText)\r\n );\r\n }\r\n\r\n private renderError() {\r\n return createElement('div', { className: bb_.error },\r\n createElement('i', { className: 'fas fa-exclamation-triangle' }),\r\n createElement('p', {}, this.loadState.error),\r\n createElement('button', {\r\n className: `${bb_.button} secondary`,\r\n onclick: () => this.loadMore()\r\n },\r\n createElement('i', { className: 'fas fa-redo' }),\r\n ' Retry'\r\n )\r\n );\r\n }\r\n\r\n private renderLoadMoreTrigger() {\r\n return createElement('div', {\r\n className: bb_.trigger,\r\n 'data-load-more-trigger': 'true',\r\n style: 'height: 1px; visibility: hidden;'\r\n });\r\n }\r\n\r\n private renderEndMessage() {\r\n return createElement('div', { className: bb_.end },\r\n createElement('i', { className: 'fas fa-check-circle' }),\r\n t(`All loaded`, { count: String(this.loadState.total) })\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n export function createItemsLoader<T>(config: ItemsLoaderConfig<T>): ItemsLoader<T> {\r\n const loader = new ItemsLoader<T>();\r\n loader.initialize(config);\r\n return loader;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/components/dropdown.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import { createElement as h, VNode, VNodeChild } from \"@je-es/vdom\";\r\n import { Component } from \"../core/component\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n export interface DropdownItemConfig {\r\n id? : string;\r\n icon? : string;\r\n label : string;\r\n onclick? : (e: Event) => void;\r\n className? : string;\r\n disabled? : boolean;\r\n selected? : boolean;\r\n }\r\n\r\n export interface DropdownConfig {\r\n id : string;\r\n trigger : {\r\n text? : string;\r\n icon? : string;\r\n element? : () => unknown;\r\n className? : string;\r\n };\r\n\r\n items : (DropdownItemConfig | 'divider')[];\r\n position? : 'left' | 'right';\r\n parentId? : string; // For nested dropdowns - ID of parent dropdown\r\n closeOnItemClick? : boolean; // Default: true\r\n preventAutoClose? : boolean; // Prevent closing when clicking inside menu (for interactive content)\r\n hideArrow? : boolean; // Hide the dropdown arrow\r\n asIcon? : boolean; // Apply bb_dropdown--asIcon class\r\n className? : string; // Custom classes for dropdown container\r\n\r\n onOpen? : () => void;\r\n onClose? : () => void;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Global dropdown manager - handles hierarchical dropdown system\r\n * - Only one root dropdown open at a time\r\n * - Child dropdowns can be open while parent is open\r\n * - Clicking outside closes all dropdowns\r\n * - Clicking inside a dropdown with preventAutoClose keeps it open\r\n */\r\n class DropdownManagerSingleton {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private static instance : DropdownManagerSingleton;\r\n private dropdowns = new Map<string, Dropdown>(); // id -> dropdown instance\r\n private hierarchy = new Map<string, string>(); // childId -> parentId\r\n private clickHandler? : EventListener;\r\n\r\n private constructor() {\r\n this.setupGlobalClickHandler();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n static getInstance(): DropdownManagerSingleton {\r\n if (!DropdownManagerSingleton.instance) {\r\n DropdownManagerSingleton.instance = new DropdownManagerSingleton();\r\n }\r\n return DropdownManagerSingleton.instance;\r\n }\r\n\r\n /**\r\n * Register dropdown\r\n */\r\n public register(dropdown: Dropdown): void {\r\n this.dropdowns.set(dropdown.config.id, dropdown);\r\n\r\n // Register hierarchy if has parent\r\n if (dropdown.config.parentId) {\r\n this.hierarchy.set(dropdown.config.id, dropdown.config.parentId);\r\n }\r\n }\r\n\r\n /**\r\n * Unregister dropdown\r\n */\r\n public unregister(id: string): void {\r\n this.dropdowns.delete(id);\r\n this.hierarchy.delete(id);\r\n }\r\n\r\n /**\r\n * Open dropdown and close siblings (but not ancestors or descendants)\r\n */\r\n public open(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n // console.log(`📂 Opening dropdown: ${id}`);\r\n\r\n // Close siblings (dropdowns at same level, excluding this one)\r\n this.closeSiblings(id);\r\n\r\n // Actually open the dropdown\r\n dropdown.setOpen(true);\r\n }\r\n\r\n /**\r\n * Close dropdown and all its children\r\n */\r\n public close(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n // console.log(`📁 Closing dropdown: ${id}`);\r\n\r\n // Close this dropdown\r\n dropdown.setOpen(false);\r\n\r\n // Close all children\r\n this.closeChildren(id);\r\n }\r\n\r\n /**\r\n * Close all dropdowns\r\n */\r\n public closeAll(): void {\r\n // console.log('🗂️ Closing all dropdowns');\r\n // Close all root dropdowns (those without parents)\r\n const rootDropdowns = Array.from(this.dropdowns.values())\r\n .filter(d => !d.config.parentId);\r\n\r\n rootDropdowns.forEach(d => this.close(d.config.id));\r\n }\r\n\r\n public destroy(): void {\r\n if (this.clickHandler && typeof window !== 'undefined') {\r\n document.removeEventListener('click', this.clickHandler, true);\r\n }\r\n this.dropdowns.clear();\r\n this.hierarchy.clear();\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Check if dropdown is ancestor of another\r\n */\r\n private isAncestor(ancestorId: string, descendantId: string): boolean {\r\n let currentId: string | undefined = descendantId;\r\n\r\n while (currentId) {\r\n if (currentId === ancestorId) return true;\r\n currentId = this.hierarchy.get(currentId);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if dropdown is descendant of another\r\n */\r\n private isDescendant(descendantId: string, ancestorId: string): boolean {\r\n return this.isAncestor(ancestorId, descendantId);\r\n }\r\n\r\n /**\r\n * Get all ancestor IDs of a dropdown (parent, grandparent, etc.)\r\n */\r\n private getAncestors(id: string): Set<string> {\r\n const ancestors = new Set<string>();\r\n let currentId: string | undefined = id;\r\n\r\n while (currentId) {\r\n const parentId = this.hierarchy.get(currentId);\r\n if (parentId) {\r\n ancestors.add(parentId);\r\n currentId = parentId;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return ancestors;\r\n }\r\n\r\n /**\r\n * ✨ NEW: Get all descendant IDs of a dropdown (children, grandchildren, etc.)\r\n */\r\n private getDescendants(id: string): Set<string> {\r\n const descendants = new Set<string>();\r\n\r\n const addChildren = (parentId: string) => {\r\n // Find all direct children\r\n const children = Array.from(this.hierarchy.entries())\r\n .filter(([_, parent]) => parent === parentId)\r\n .map(([childId, _]) => childId);\r\n\r\n // Add each child and recursively add their children\r\n children.forEach(childId => {\r\n descendants.add(childId);\r\n addChildren(childId); // Recursive call for grandchildren\r\n });\r\n };\r\n\r\n addChildren(id);\r\n return descendants;\r\n }\r\n\r\n /**\r\n * Close siblings (dropdowns at same hierarchy level)\r\n */\r\n private closeSiblings(id: string): void {\r\n const dropdown = this.dropdowns.get(id);\r\n if (!dropdown) return;\r\n\r\n const parentId = dropdown.config.parentId;\r\n\r\n // Get all dropdowns with same parent (siblings)\r\n const siblings = Array.from(this.dropdowns.values())\r\n .filter(d => d.config.parentId === parentId && d.config.id !== id);\r\n\r\n // console.log(`👥 Closing ${siblings.length} siblings of ${id}`);\r\n siblings.forEach(sibling => this.close(sibling.config.id));\r\n }\r\n\r\n /**\r\n * Close all children of a dropdown\r\n */\r\n private closeChildren(parentId: string): void {\r\n const children = Array.from(this.dropdowns.values())\r\n .filter(d => d.config.parentId === parentId);\r\n\r\n // console.log(`👶 Closing ${children.length} children of ${parentId}`);\r\n children.forEach(child => this.close(child.config.id));\r\n }\r\n\r\n /**\r\n * Check if there are any open dropdowns\r\n */\r\n private hasOpenDropdowns(): boolean {\r\n return Array.from(this.dropdowns.values()).some(d => d.isOpen);\r\n }\r\n\r\n /**\r\n * Find which dropdown an element belongs to (including nested)\r\n */\r\n private findDropdownForElement(element: HTMLElement): string | null {\r\n // Walk up the DOM tree looking for dropdown containers\r\n let current: HTMLElement | null = element;\r\n\r\n while (current && current !== document.body) {\r\n const dropdownId = current.getAttribute('data-dropdown-id');\r\n if (dropdownId) {\r\n return dropdownId;\r\n }\r\n current = current.parentElement;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Setup global click handler\r\n */\r\n private setupGlobalClickHandler(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n this.clickHandler = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n\r\n // console.log('🖱️ Global click detected');\r\n\r\n // No dropdowns open? Nothing to do\r\n if (!this.hasOpenDropdowns()) {\r\n // console.log(' → No open dropdowns, ignoring');\r\n return;\r\n }\r\n\r\n // Find which dropdown (if any) was clicked\r\n const clickedDropdownId = this.findDropdownForElement(target);\r\n\r\n if (!clickedDropdownId) {\r\n // Clicked completely outside all dropdowns - close all\r\n // console.log(' → Clicked outside all dropdowns, closing all');\r\n this.closeAll();\r\n return;\r\n }\r\n\r\n // console.log(` → Clicked inside dropdown: ${clickedDropdownId}`);\r\n\r\n // Check if clicked dropdown has preventAutoClose\r\n const clickedDropdown = this.dropdowns.get(clickedDropdownId);\r\n if (clickedDropdown?.config.preventAutoClose) {\r\n // console.log(' → Dropdown has preventAutoClose, keeping open');\r\n return;\r\n }\r\n\r\n // Check if clicked on a trigger button (to let toggle handle it)\r\n const clickedOnTrigger = target.closest('.bb_dropdownTrigger');\r\n if (clickedOnTrigger) {\r\n // console.log(' → Clicked on trigger, letting toggle handle it');\r\n return;\r\n }\r\n\r\n // Clicked inside a dropdown menu but not on trigger\r\n const clickedOnMenu = target.closest('.bb_dropdownMenu');\r\n if (clickedOnMenu) {\r\n // Get ancestors of clicked dropdown\r\n const ancestors = this.getAncestors(clickedDropdownId);\r\n\r\n // ✨ FIX: Get all descendants too\r\n const descendants = this.getDescendants(clickedDropdownId);\r\n\r\n // Close all dropdowns that are NOT:\r\n // 1. The clicked dropdown itself\r\n // 2. Ancestors of the clicked dropdown (parents)\r\n // 3. Descendants of the clicked dropdown (children) ✨ NEW\r\n const rootDropdowns = Array.from(this.dropdowns.values())\r\n .filter(d => !d.config.parentId);\r\n\r\n rootDropdowns.forEach(rootDropdown => {\r\n const rootId = rootDropdown.config.id;\r\n\r\n // Keep open if:\r\n // - This is the clicked dropdown\r\n // - This is an ancestor of the clicked dropdown\r\n // - The clicked dropdown is an ancestor of this one (descendant)\r\n const shouldKeepOpen =\r\n rootId === clickedDropdownId ||\r\n ancestors.has(rootId) ||\r\n descendants.has(rootId) || // ✨ NEW: Keep descendants open\r\n this.isDescendant(clickedDropdownId, rootId);\r\n\r\n if (!shouldKeepOpen) {\r\n // console.log(` → Closing unrelated dropdown: ${rootId}`);\r\n this.close(rootId);\r\n } else {\r\n // console.log(` → Keeping related dropdown open: ${rootId}`);\r\n }\r\n });\r\n }\r\n };\r\n\r\n document.addEventListener('click', this.clickHandler, true);\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n const dropdownManager = DropdownManagerSingleton.getInstance();\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n export class Dropdown extends Component {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n public config : DropdownConfig;\r\n public isOpen = false;\r\n private mounted = false;\r\n\r\n constructor(config: DropdownConfig) {\r\n super();\r\n this.config = {\r\n closeOnItemClick: true,\r\n preventAutoClose: false,\r\n ...config\r\n };\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n onMount() {\r\n this.mounted = true;\r\n dropdownManager.register(this);\r\n // console.log(`✅ Dropdown mounted: ${this.config.id}`);\r\n }\r\n\r\n onUnmount() {\r\n this.mounted = false;\r\n dropdownManager.unregister(this.config.id);\r\n // console.log(`🛑 Dropdown unmounted: ${this.config.id}`);\r\n }\r\n\r\n /**\r\n * Public method to set open state (called by manager)\r\n */\r\n public setOpen(open: boolean) {\r\n // console.log(`🔄 Dropdown ${this.config.id} setOpen(${open}), current: ${this.isOpen}`);\r\n\r\n if (this.isOpen === open) return;\r\n\r\n this.isOpen = open;\r\n\r\n if (open) {\r\n this.config.onOpen?.();\r\n } else {\r\n this.config.onClose?.();\r\n }\r\n\r\n // Manually update DOM instead of triggering Component.update()\r\n this.updateDOM();\r\n }\r\n\r\n\r\n /**\r\n * Toggle dropdown\r\n */\r\n toggle(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n // console.log(`🖱️ Dropdown ${this.config.id} toggle clicked, current state: ${this.isOpen}`);\r\n\r\n if (this.isOpen) {\r\n dropdownManager.close(this.config.id);\r\n } else {\r\n dropdownManager.open(this.config.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle item click\r\n */\r\n handleItemClick(item: DropdownItemConfig, e: Event) {\r\n if (item.disabled) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n\r\n // console.log(`🎯 Item clicked in dropdown ${this.config.id}:`, item.label);\r\n\r\n // Don't prevent propagation - let it bubble up\r\n // But stop it if we're going to close\r\n if (this.config.closeOnItemClick) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n dropdownManager.close(this.config.id);\r\n }\r\n\r\n // Call item's onclick handler\r\n item.onclick?.(e);\r\n }\r\n\r\n render() {\r\n // console.log(`🎨 Dropdown ${this.config.id} render(), isOpen: ${this.isOpen}`);\r\n\r\n const trigger = this.renderTrigger();\r\n const menu = this.isOpen ? this.renderMenu() : null;\r\n\r\n const containerClasses = [\r\n 'bb_dropdown',\r\n `bb_dropdown--${this.config.position || 'left'}`,\r\n this.isOpen ? 'bb_dropdown--open' : '',\r\n this.config.asIcon ? 'bb_dropdown--asIcon' : '',\r\n this.config.className || ''\r\n ].filter(Boolean).join(' ');\r\n\r\n return h('div', {\r\n className: containerClasses,\r\n 'data-dropdown-id': this.config.id\r\n },\r\n trigger,\r\n menu\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── HELP ──────────────────────────────┐\r\n\r\n /**\r\n * Manually update the dropdown's DOM without triggering parent re-renders\r\n */\r\n private updateDOM() {\r\n if (!this.mounted || !this.element) return;\r\n\r\n // Update the container class\r\n if (this.isOpen) {\r\n this.element.classList.add('bb_dropdown--open');\r\n } else {\r\n this.element.classList.remove('bb_dropdown--open');\r\n }\r\n\r\n // Find the menu container (next sibling of trigger)\r\n const trigger = this.element.querySelector('.bb_dropdownTrigger');\r\n const menuContainer = trigger?.nextElementSibling;\r\n\r\n if (this.isOpen) {\r\n // Create and append menu if it doesn't exist\r\n if (!menuContainer || !menuContainer.classList.contains('bb_dropdownMenu')) {\r\n const menuVNode = this.renderMenu();\r\n const menuElement = this.createElementFromVNode(menuVNode);\r\n this.element.appendChild(menuElement);\r\n }\r\n } else {\r\n // Remove menu if it exists\r\n if (menuContainer && menuContainer.classList.contains('bb_dropdownMenu')) {\r\n menuContainer.remove();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create DOM element from VNode (simplified version)\r\n */\r\n private createElementFromVNode(vnode: VNode): HTMLElement {\r\n if (typeof vnode.type === 'string') {\r\n const element = document.createElement(vnode.type);\r\n\r\n // Set properties\r\n if (vnode.props) {\r\n Object.entries(vnode.props).forEach(([key, value]) => {\r\n if (key === 'className') {\r\n element.className = value as string;\r\n } else if (key === 'onclick' && typeof value === 'function') {\r\n element.addEventListener('click', value as EventListener);\r\n } else if (key !== 'children' && key !== 'key') {\r\n element.setAttribute(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n // Add children\r\n if (vnode.children) {\r\n vnode.children.forEach((child: VNodeChild) => {\r\n if (child === null || child === undefined) return;\r\n if (typeof child === 'string' || typeof child === 'number') {\r\n element.appendChild(document.createTextNode(String(child)));\r\n } else if (typeof child === 'object') {\r\n element.appendChild(this.createElementFromVNode(child));\r\n }\r\n });\r\n }\r\n\r\n return element;\r\n }\r\n\r\n return document.createElement('div');\r\n }\r\n\r\n\r\n private renderTrigger() {\r\n const customElement = this.config.trigger.element?.() as VNodeChild;\r\n\r\n const triggerClassName = [\r\n 'bb_dropdownTrigger',\r\n this.config.trigger.className || ''\r\n ].filter(Boolean).join(' ');\r\n\r\n if (customElement) {\r\n return h('button', {\r\n className: triggerClassName,\r\n onclick: (e: Event) => this.toggle(e)\r\n },\r\n customElement\r\n );\r\n }\r\n\r\n const arrowClasses = [\r\n 'bb_dropdownArrow',\r\n 'fas',\r\n 'fa-chevron-down',\r\n this.isOpen ? 'bb_dropdownArrow--open' : '',\r\n this.config.hideArrow ? 'hidden' : ''\r\n ].filter(Boolean).join(' ');\r\n\r\n return h('button', {\r\n className: triggerClassName,\r\n onclick: (e: Event) => this.toggle(e)\r\n },\r\n this.config.trigger.icon ? h('i', { className: this.config.trigger.icon }) : null,\r\n this.config.trigger.text ? h('span', {}, this.config.trigger.text) : null,\r\n h('i', {\r\n className: arrowClasses\r\n })\r\n );\r\n }\r\n\r\n private renderMenu() {\r\n return h('div', {\r\n className: 'bb_dropdownMenu',\r\n onclick: (e: Event) => {\r\n // Only stop propagation if preventAutoClose is true\r\n if (this.config.preventAutoClose) {\r\n e.stopPropagation();\r\n }\r\n }\r\n },\r\n this.config.items.map((item, index) => {\r\n if (item === 'divider') {\r\n return h('div', {\r\n className: 'bb_dropdown__divider',\r\n key: `divider-${index}`\r\n });\r\n }\r\n\r\n const itemClassName = [\r\n 'bb_dropdownItem',\r\n item.className || '',\r\n item.disabled ? 'bb_dropdownItem--disabled' : '',\r\n item.selected ? 'bb_dropdownItem--selected' : ''\r\n ].filter(Boolean).join(' ');\r\n\r\n const buttonProps: {\r\n key: string;\r\n className: string;\r\n onclick: (e: Event) => void;\r\n disabled?: boolean;\r\n } = {\r\n key: item.id || `item-${index}`,\r\n className: itemClassName,\r\n onclick: (e: Event) => this.handleItemClick(item, e)\r\n };\r\n\r\n // Only add disabled attribute if actually true\r\n if (item.disabled) {\r\n buttonProps.disabled = true;\r\n }\r\n\r\n return h('button', buttonProps,\r\n item.icon ? h('i', { className: item.icon }) : null,\r\n h('span', {}, item.label)\r\n );\r\n })\r\n );\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n /**\r\n * Create a dropdown instance\r\n */\r\n export function createDropdown(config: DropdownConfig): Dropdown {\r\n return new Dropdown(config);\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/help.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n import type { ClassValue } from '../types';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Debounce function\r\n * Delays function execution until after wait time\r\n */\r\n export function debounce<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n timeoutId = setTimeout(() => {\r\n timeoutId = null;\r\n fn(...args);\r\n }, delay);\r\n };\r\n }\r\n\r\n /**\r\n * Throttle function\r\n * Limits function execution to once per time period\r\n */\r\n export function throttle<T extends (...args: never[]) => unknown>(\r\n fn: T,\r\n delay: number\r\n ): (...args: Parameters<T>) => void {\r\n let lastCall = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>): void => {\r\n const now = Date.now();\r\n const timeSinceLastCall = now - lastCall;\r\n\r\n if (timeSinceLastCall >= delay) {\r\n lastCall = now;\r\n fn(...args);\r\n } else if (!timeoutId) {\r\n // Schedule execution at the end of the throttle period\r\n timeoutId = setTimeout(() => {\r\n lastCall = Date.now();\r\n timeoutId = null;\r\n fn(...args);\r\n }, delay - timeSinceLastCall);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Class names utility\r\n * Combines class names conditionally\r\n */\r\n export function classNames(...classes: ClassValue[]): string {\r\n const result: string[] = [];\r\n\r\n for (const cls of classes) {\r\n if (!cls) continue;\r\n\r\n if (typeof cls === 'string') {\r\n result.push(cls);\r\n } else if (typeof cls === 'object') {\r\n for (const [key, value] of Object.entries(cls)) {\r\n if (value) {\r\n result.push(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result.join(' ');\r\n }\r\n\r\n /**\r\n * Format date\r\n * Simple date formatting utility with validation\r\n */\r\n export function formatDate(date: Date | string | number, format: string = 'YYYY-MM-DD'): string {\r\n const d = date instanceof Date ? date : new Date(date);\r\n\r\n // Validate date\r\n if (isNaN(d.getTime())) {\r\n throw new Error('Invalid date provided to formatDate');\r\n }\r\n\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n const hours = String(d.getHours()).padStart(2, '0');\r\n const minutes = String(d.getMinutes()).padStart(2, '0');\r\n const seconds = String(d.getSeconds()).padStart(2, '0');\r\n\r\n return format\r\n .replace('YYYY', String(year))\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('HH', hours)\r\n .replace('mm', minutes)\r\n .replace('ss', seconds);\r\n }\r\n\r\n /**\r\n * Deep clone object\r\n * Handles Date, Array, and nested objects\r\n */\r\n export function deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as T;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => deepClone(item)) as T;\r\n }\r\n\r\n if (obj instanceof RegExp) {\r\n return new RegExp(obj.source, obj.flags) as T;\r\n }\r\n\r\n if (obj instanceof Map) {\r\n const clonedMap = new Map();\r\n obj.forEach((value, key) => {\r\n clonedMap.set(deepClone(key), deepClone(value));\r\n });\r\n return clonedMap as T;\r\n }\r\n\r\n if (obj instanceof Set) {\r\n const clonedSet = new Set();\r\n obj.forEach(value => {\r\n clonedSet.add(deepClone(value));\r\n });\r\n return clonedSet as T;\r\n }\r\n\r\n if (Object.prototype.toString.call(obj) === '[object Object]') {\r\n const cloned: Record<string, unknown> = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n }\r\n return cloned as T;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Merge objects deeply\r\n * Properly handles nested objects and arrays\r\n */\r\n export function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n ): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n if (!source) return target;\r\n\r\n if (isObject(target) && isObject(source)) {\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n\r\n if (sourceValue !== undefined) {\r\n if (isObject(sourceValue) && !Array.isArray(sourceValue)) {\r\n if (!targetValue || !isObject(targetValue)) {\r\n target[key] = {} as T[Extract<keyof T, string>];\r\n }\r\n deepMerge(target[key] as Record<string, unknown>, sourceValue as Record<string, unknown>);\r\n } else {\r\n target[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n }\r\n\r\n /**\r\n * Helper to check if value is a plain object\r\n */\r\n function isObject(item: unknown): item is Record<string, unknown> {\r\n return item !== null && typeof item === 'object' && !Array.isArray(item);\r\n }\r\n\r\n /**\r\n * Generate unique ID with better entropy\r\n */\r\n let uniqueIdCounter = 0;\r\n\r\n export function uniqueId(prefix: string = 'id'): string {\r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 11);\r\n uniqueIdCounter = (uniqueIdCounter || 0) + 1;\r\n const counter = uniqueIdCounter.toString(36);\r\n return `${prefix}_${timestamp}_${randomPart}_${counter}`;\r\n }\r\n\r\n /**\r\n * Sleep/delay utility\r\n */\r\n export function sleep(ms: number): Promise<void> {\r\n if (ms < 0) {\r\n throw new Error('Sleep duration must be non-negative');\r\n }\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * Check if value is empty\r\n */\r\n export function isEmpty(value: unknown): boolean {\r\n if (value == null) return true;\r\n if (typeof value === 'string') return value.trim().length === 0;\r\n if (Array.isArray(value)) return value.length === 0;\r\n if (value instanceof Map || value instanceof Set) return value.size === 0;\r\n if (typeof value === 'object') return Object.keys(value).length === 0;\r\n return false;\r\n }\r\n\r\n /**\r\n * Capitalize first letter\r\n */\r\n export function capitalize(str: string): string {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n\r\n /**\r\n * Convert to kebab-case\r\n */\r\n export function kebabCase(str: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n }\r\n\r\n /**\r\n * Convert to camelCase\r\n */\r\n export function camelCase(str: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char: string) => (char ? char.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, char => char.toLowerCase());\r\n }\r\n\r\n /**\r\n * Convert to PascalCase\r\n */\r\n export function pascalCase(str: string): string {\r\n if (!str) return '';\r\n const camel = camelCase(str);\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n }\r\n\r\n /**\r\n * Truncate string\r\n */\r\n export function truncate(str: string, length: number, suffix: string = '...'): string {\r\n if (!str || str.length <= length) return str;\r\n return str.substring(0, length - suffix.length) + suffix;\r\n }\r\n\r\n /**\r\n * Parse query string\r\n */\r\n export function parseQuery(queryString: string): Record<string, string | string[]> {\r\n const query: Record<string, string | string[]> = {};\r\n const cleaned = queryString.replace(/^\\?/, '');\r\n\r\n if (!cleaned) return query;\r\n\r\n const pairs = cleaned.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=').map(decodeURIComponent);\r\n if (!key) continue;\r\n\r\n const decodedValue = value || '';\r\n\r\n // Handle array parameters (key[]=value)\r\n if (key.endsWith('[]')) {\r\n const actualKey = key.slice(0, -2);\r\n if (!query[actualKey]) {\r\n query[actualKey] = [];\r\n }\r\n (query[actualKey] as string[]).push(decodedValue);\r\n } else {\r\n query[key] = decodedValue;\r\n }\r\n }\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * Stringify object to query string\r\n */\r\n export function stringifyQuery(obj: Record<string, unknown>): string {\r\n const pairs: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value == null) continue;\r\n\r\n if (Array.isArray(value)) {\r\n // Handle arrays\r\n for (const item of value) {\r\n if (item != null) {\r\n pairs.push(`${encodeURIComponent(key)}[]=${encodeURIComponent(String(item))}`);\r\n }\r\n }\r\n } else {\r\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\r\n }\r\n }\r\n\r\n return pairs.length > 0 ? `?${pairs.join('&')}` : '';\r\n }\r\n\r\n /**\r\n * Clamp a number between min and max\r\n */\r\n export function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n /**\r\n * Check if code is running in browser\r\n */\r\n export function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n }\r\n\r\n /**\r\n * Safe JSON parse with fallback\r\n */\r\n export function safeJsonParse<T = unknown>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n }\r\n\r\n /**\r\n * Export all utilities\r\n */\r\n export const utils = {\r\n debounce,\r\n throttle,\r\n classNames,\r\n formatDate,\r\n deepClone,\r\n deepMerge,\r\n uniqueId,\r\n sleep,\r\n isEmpty,\r\n capitalize,\r\n kebabCase,\r\n camelCase,\r\n pascalCase,\r\n truncate,\r\n parseQuery,\r\n stringifyQuery,\r\n clamp,\r\n isBrowser,\r\n safeJsonParse,\r\n };\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝","// src/mod/utils/intersection_observer.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Configuration for intersection observer\r\n */\r\n export interface IntersectionConfig {\r\n root? : Element | null;\r\n rootMargin? : string;\r\n threshold? : number | number[];\r\n onEnter? : (entry: IntersectionObserverEntry) => void;\r\n onExit? : (entry: IntersectionObserverEntry) => void;\r\n once? : boolean; // If true, unobserve after first intersection\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Simple wrapper around Intersection Observer API\r\n * Makes it easy to detect when elements become visible\r\n */\r\n export class VisibilityObserver {\r\n\r\n // ┌──────────────────────────────── INIT ──────────────────────────────┐\r\n\r\n private observer: IntersectionObserver | null = null;\r\n private observedElements = new Map<Element, boolean>(); // Track visibility state\r\n\r\n constructor(config: IntersectionConfig) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n const wasVisible = this.observedElements.get(entry.target) ?? false;\r\n const isNowVisible = entry.isIntersecting;\r\n\r\n // Only trigger callbacks on state change\r\n if (isNowVisible && !wasVisible) {\r\n // Element entered viewport\r\n this.observedElements.set(entry.target, true);\r\n config.onEnter?.(entry);\r\n\r\n if (config.once) {\r\n this.unobserve(entry.target);\r\n }\r\n } else if (!isNowVisible && wasVisible) {\r\n // Element left viewport\r\n this.observedElements.set(entry.target, false);\r\n config.onExit?.(entry);\r\n }\r\n });\r\n }, {\r\n root: config.root || null,\r\n rootMargin: config.rootMargin || '0px',\r\n threshold: config.threshold ?? 0.1\r\n });\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n\r\n // ┌──────────────────────────────── MAIN ──────────────────────────────┐\r\n\r\n /**\r\n * Start observing an element\r\n */\r\n observe(element: Element): void {\r\n if (this.observer) {\r\n this.observer.observe(element);\r\n this.observedElements.set(element, false);\r\n }\r\n }\r\n\r\n /**\r\n * Stop observing an element\r\n */\r\n unobserve(element: Element): void {\r\n if (this.observer) {\r\n this.observer.unobserve(element);\r\n this.observedElements.delete(element);\r\n }\r\n }\r\n\r\n /**\r\n * Disconnect the observer\r\n */\r\n disconnect(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observedElements.clear();\r\n }\r\n }\r\n\r\n // └────────────────────────────────────────────────────────────────────┘\r\n\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ HELP ════════════════════════════════════════╗\r\n\r\n /**\r\n * Helper function to observe when element becomes visible (once)\r\n * @param element - Element to observe\r\n * @param callback - Callback when element becomes visible\r\n * @returns Function to stop observing\r\n */\r\n export function observeVisibility(\r\n element: Element,\r\n callback: (entry: IntersectionObserverEntry) => void\r\n ): () => void {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n callback(entry);\r\n observer.unobserve(element);\r\n }\r\n });\r\n }, {\r\n threshold: 0.1\r\n });\r\n\r\n observer.observe(element);\r\n\r\n return () => observer.disconnect();\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/mod/utils/time_formatter.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ TYPE ════════════════════════════════════════╗\r\n\r\n import { t } from \"../services/i18n\";\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ CORE ════════════════════════════════════════╗\r\n\r\n /**\r\n * Formats a timestamp into a relative time string with translation\r\n * Returns the formatted time and original ISO string as title attribute\r\n *\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Object with formatted time and original timestamp for title\r\n */\r\n export function formatRelativeTime(timestamp: string | Date) {\r\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\r\n const now = new Date();\r\n const diffMs = now.getTime() - date.getTime();\r\n const diffSecs = Math.floor(diffMs / 1000);\r\n const diffMins = Math.floor(diffSecs / 60);\r\n const diffHours = Math.floor(diffMins / 60);\r\n const diffDays = Math.floor(diffHours / 24);\r\n const diffWeeks = Math.floor(diffDays / 7);\r\n const diffMonths = Math.floor(diffDays / 30);\r\n const diffYears = Math.floor(diffDays / 365);\r\n\r\n let formatted = '';\r\n\r\n if (diffSecs < 0) {\r\n // Future date\r\n formatted = t('time.just_now');\r\n } else if (diffSecs < 60) {\r\n // Less than a minute\r\n formatted = t('time.just_now');\r\n } else if (diffMins < 2) {\r\n // 1 minute\r\n formatted = t('time.minute_ago');\r\n } else if (diffMins < 60) {\r\n // Multiple minutes\r\n formatted = t('time.minutes_ago', { count: diffMins.toString() });\r\n } else if (diffHours < 2) {\r\n // 1 hour\r\n formatted = t('time.hour_ago');\r\n } else if (diffHours < 24) {\r\n // Multiple hours\r\n formatted = t('time.hours_ago', { count: diffHours.toString() });\r\n } else if (diffDays < 2) {\r\n // 1 day\r\n formatted = t('time.day_ago');\r\n } else if (diffDays < 7) {\r\n // Multiple days\r\n formatted = t('time.days_ago', { count: diffDays.toString() });\r\n } else if (diffWeeks < 2) {\r\n // 1 week\r\n formatted = t('time.week_ago');\r\n } else if (diffWeeks < 4) {\r\n // Multiple weeks\r\n formatted = t('time.weeks_ago', { count: diffWeeks.toString() });\r\n } else if (diffMonths < 2) {\r\n // 1 month\r\n formatted = t('time.month_ago');\r\n } else if (diffMonths < 12) {\r\n // Multiple months\r\n formatted = t('time.months_ago', { count: diffMonths.toString() });\r\n } else if (diffYears < 2) {\r\n // 1 year\r\n formatted = t('time.year_ago');\r\n } else {\r\n // Multiple years\r\n formatted = t('time.years_ago', { count: diffYears.toString() });\r\n }\r\n\r\n return {\r\n formatted,\r\n originalDate: date.toISOString(),\r\n title: date.toLocaleString()\r\n };\r\n }\r\n\r\n /**\r\n * Creates an HTML time element with relative time and title attribute\r\n * Usage: place this directly in your component render\r\n *\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Object with text content and title for use in createElement\r\n */\r\n export function getTimeDisplay(timestamp: string | Date) {\r\n const { formatted, title } = formatRelativeTime(timestamp);\r\n return {\r\n text: formatted,\r\n title\r\n };\r\n }\r\n\r\n /**\r\n * Format time for display with full date fallback\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Formatted string like \"2 hours ago\"\r\n */\r\n export function formatTimeAgo(timestamp: string | Date): string {\r\n return formatRelativeTime(timestamp).formatted;\r\n }\r\n\r\n /**\r\n * Get the ISO string for title attribute\r\n * @param timestamp - ISO 8601 timestamp string or Date object\r\n * @returns Localized full date string\r\n */\r\n export function getTimeTitle(timestamp: string | Date): string {\r\n return formatRelativeTime(timestamp).title;\r\n }\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝\r\n","// src/main.ts\r\n//\r\n// Made with ❤️ by Maysara.\r\n\r\n\r\n\r\n// ╔════════════════════════════════════════ PACK ════════════════════════════════════════╗\r\n\r\n // Config VDOM\r\n import { setConfig } from '@je-es/vdom';\r\n setConfig({\r\n devMode: false, // Enable warnings\r\n sanitizeHTML: true, // XSS protection\r\n // onError: (err) => { // Custom error handler\r\n // console.error('VDOM Error:', err);\r\n // }\r\n });\r\n\r\n // Types\r\n export * from './types';\r\n\r\n // Core\r\n export * from './mod/core/component';\r\n export * from './mod/core/decorators';\r\n export * from './mod/core/scheduler';\r\n export * from './mod/core/context';\r\n export * from './mod/core/hooks';\r\n export * from './mod/core/router';\r\n export * from './mod/core/store';\r\n export * from './mod/core/client';\r\n export * from './mod/core/styles';\r\n\r\n // Services\r\n export * from './mod/services/i18n';\r\n\r\n // Components\r\n export * from './mod/components/toast';\r\n export * from './mod/components/loader';\r\n export * from './mod/components/popup';\r\n export * from './mod/components/smart_form';\r\n export * from './mod/components/tabbed_view';\r\n export * from './mod/components/items_loader';\r\n export * from './mod/components/dropdown';\r\n\r\n // Utilities\r\n export * from './mod/help';\r\n export * from './mod/utils/intersection_observer';\r\n export * from './mod/utils/time_formatter';\r\n\r\n // Third-party packages\r\n export { api, http, configureApi, getApiConfig, resetApiConfig, type ApiError } from '@je-es/capi';\r\n export { createElement, html, patch, createDOMElement } from '@je-es/vdom';\r\n\r\n// ╚══════════════════════════════════════════════════════════════════════════════════════╝"]}
|