@melodicdev/components 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -48
- package/assets/melodic-components.css +671 -0
- package/assets/melodic-components.js +21082 -0
- package/assets/melodic-components.js.map +1 -0
- package/assets/melodic-components.min.css +21 -0
- package/assets/melodic-components.min.js +19382 -0
- package/lib/bundle.d.ts +59 -0
- package/lib/bundle.d.ts.map +1 -0
- package/lib/bundle.js +68 -0
- package/package.json +6 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"melodic-components.js","names":["token: Token<T>","cls: INewable<T>","options: IClassBindingOptions | undefined","instance: T","dependencies: unknown[]","errorHandlers: { type: string; handler: EventListener }[]","rootElement: HTMLElement | undefined","app: IMelodicApp","globalStylesAttribute: string","globalStyleSelector: string","cachedCssSheets: CSSStyleSheet[]","loadingPromise: Promise<void> | null","styleNode: HTMLStyleElement","properties: string[]","proto: object | null","current: object | null","attributes: Record<string, string>","dependencies: unknown[]","componentWithSelector: INewable<C> & { selector?: string }","config: IRequestConfig","code?: string","response: IHttpResponse","str: string","requestConfig: IRequestConfig","cancelledResponse: IHttpResponse<T>","httpResponse: IHttpResponse<T>","baseUrl: string","chunks: Uint8Array[]","i: number","param: Rule","value: string","params: RouteMatchParams","matches: RegExpMatchArray | null","re: RegExp","result: string","type: string","match: IRouteMatch","matches: IRouteMatch[]","params: Record<string, string>","pathParts: string[]","ancestorMatches: IRouteMatch[]","accumulatedParams: Record<string, string>","context: IRouteContext","merged: Record<string, unknown>","result: AsyncGuardResult","resolvedData: Record<string, unknown>","parts: ITemplatePart[]","activeAttributeName: string | null","activeAttributeQuote: string | null","attrKey: string","attrPrefix: string","partPaths: IPartPath[]","nodeParts: ITemplatePart[]","node: Node","strings: string[]","indices: number[]","match: RegExpExecArray | null","newKeys: unknown[]","renderedNodes: Node[]","keyedValues: Array<{ key: unknown; value: unknown }>","element: Element | null","options: INavigationOptions","isActive: boolean","options: IRouterLinkOptions","isActive: boolean","navOptions: INavigationOptions","activeEffect: SignalEffect | null","execute: () => void","state: State<S>","_initState: S","_reducerConfig: ReducerConfig<S, Action>","_debug: boolean","actionEffects: ActionEffect[]","action: TypedAction<T, P>","actionEffects: ActionEffect[]","keys: (keyof S)[]","effectService: ActionEffects","attrs: Array<{ name: string; valueIndex: number | null; staticValue?: string }>","textParts: Array<{ static: string } | { valueIndex: number }>","state: RepeatState","newEntries: {\n\t\titem: RepeatItem;\n\t\toldIndex: number;\n\t\tisNew: boolean;\n\t}[]","nextSibling: Node","nodes: Node[]","container: DocumentFragment","node: Node | null","nextNode: Node | null","oldIndexSequence: number[]","sequencePositions: number[]","state: RepeatRawState","state: WhenState","state: UnsafeHTMLState","errors: ValidationErrors | null","result: Partial<FormGroupValue<T>>","errors: ValidationErrors | null","errors: ValidationErrors | null","cleanupFns: (() => void)[]","currentTheme: ThemeMode","themeListeners: Set<ThemeChangeCallback>","mediaQueryCleanup: (() => void) | null","overrides: TokenOverrides","state: MiddlewareState","opposites: Record<string, string>","ancestors: Element[]","node: Node | null","parent: Node | null","cleanups: (() => void)[]","frameId: number","arrowX: number | undefined","arrowY: number | undefined","previouslyFocused: HTMLElement | null","liveRegion: HTMLElement | null","normalized: string[]","result: CalendarDay[]","icons: Record<AlertVariant, string>","icons: Record<ToastVariant, string>","alignMap: Record<Alignment, string>","justifyMap: Record<Justify, string>","maxWidthMap: Record<ContainerSize, string>","newWidths: Record<string, number>","result: Record<string, number>","result: CalendarDayCell[]","columns: { end: number }[][]","eventColumns: Map<string, number>","groups: { events: CalendarEvent[]; totalColumns: number }[]","group: CalendarEvent[]","result: PositionedEvent[]","slots: { label: string; hour: number; minute: number }[]","VIEW_LABELS: Record<string, string>","next: Date","className: string","iconLigature: string","_dialogID: UniqueID","_dialogEl: HTMLDialogElement","dialogID: UniqueID","dialogElements: IDialogElements","dialogComponent: HTMLElement","mlDialogEl: HTMLElement","dialogEl: HTMLDialogElement","items: DropdownItemComponent[]"],"sources":["../../../src/injection/function/get-token-key.function.ts","../../../src/injection/decorators/inject.decorator.ts","../../../src/injection/decorators/injectable.decorator.ts","../../../src/injection/classes/binding.class.ts","../../../src/injection/classes/injection-engine.class.ts","../../../src/injection/decorators/service.decorator.ts","../../../src/injection/function/create-token.function.ts","../../../src/bootstrap/functions/bootstrap.function.ts","../../../src/template/functions/render.function.ts","../../../src/signals/types/signal.type.ts","../../../src/signals/functions/is-signal.function.ts","../../../src/components/styles/apply-global-styles.function.ts","../../../src/components/classes/component-base.class.ts","../../../src/components/decorators/melodic-component.decorator.ts","../../../src/http/classes/http-error.class.ts","../../../src/http/classes/request-manager.class.ts","../../../src/http/classes/http-client.class.ts","../../../src/http/functions/provide-http.function.ts","../../../src/routing/functions/create-guard.function.ts","../../../src/routing/functions/create-deactivate-guard.function.ts","../../../src/routing/functions/create-resolver.function.ts","../../../src/routing/classes/route-matcher.class.ts","../../../src/routing/classes/route-context-event.class.ts","../../../src/routing/functions/match-route-level.function.ts","../../../src/routing/functions/match-route-tree.function.ts","../../../src/routing/functions/find-route-by-name.function.ts","../../../src/routing/functions/build-path-from-route.function.ts","../../../src/routing/services/route-context.service.ts","../../../src/routing/services/router.service.ts","../../../src/template/directives/functions/attribute-directive.functions.ts","../../../src/template/directives/functions/is-directive.function.ts","../../../src/template/classes/template-result.class.ts","../../../src/template/functions/html.function.ts","../../../src/routing/components/router-outlet/router-outlet.component.ts","../../../src/routing/components/router-link/router-link.component.ts","../../../src/routing/directives/router-link.directive.ts","../../../src/signals/functions/active-effect.functions.ts","../../../src/signals/classes/signal-effect.class.ts","../../../src/signals/functions/signal.function.ts","../../../src/signals/functions/computed.function.ts","../../../src/state/functions/create-action.function.ts","../../../src/state/functions/create-reducer.function.ts","../../../src/state/functions/create-state.function.ts","../../../src/state/functions/on-action.function.ts","../../../src/state/injection.tokens.ts","../../../src/state/services/effects.base.class.ts","../../../src/state/services/component-state-base.service.ts","../../../src/state/services/signal-store.service.ts","../../../src/state/functions/provide-rx.function.ts","../../../src/template/classes/compiled-template.class.ts","../../../src/template/directives/functions/directive.function.ts","../../../src/template/directives/builtin/repeat.directive.ts","../../../src/template/directives/builtin/repeat-raw.directive.ts","../../../src/template/directives/builtin/when.directive.ts","../../../src/template/directives/builtin/class-map.directive.ts","../../../src/template/directives/builtin/style-map.directive.ts","../../../src/template/directives/builtin/unsafe-html.directive.ts","../../../src/template/directives/builtin/portal.directive.ts","../../../src/template/directives/directive.class.ts","../../../src/forms/classes/form-control.class.ts","../../../src/forms/classes/form-group.class.ts","../../../src/forms/functions/create-form-control.function.ts","../../../src/forms/functions/create-form-group.function.ts","../../../src/forms/validators/validators.ts","../../../src/forms/directives/form-control.directive.ts","../src/theme/tokens/colors.tokens.ts","../src/theme/tokens/spacing.tokens.ts","../src/theme/tokens/typography.tokens.ts","../src/theme/tokens/shadows.tokens.ts","../src/theme/tokens/borders.tokens.ts","../src/theme/tokens/transitions.tokens.ts","../src/theme/tokens/breakpoints.tokens.ts","../src/theme/tokens/all-tokens.ts","../src/theme/presets/light.preset.ts","../src/theme/presets/dark.preset.ts","../src/theme/presets/base.preset.ts","../src/theme/functions/apply-theme.function.ts","../src/theme/functions/create-theme.function.ts","../src/utils/positioning/compute-position.ts","../src/utils/positioning/auto-update.ts","../src/utils/positioning/middlewares/offset.middleware.ts","../src/utils/positioning/middlewares/flip.middleware.ts","../src/utils/positioning/middlewares/shift.middleware.ts","../src/utils/positioning/middlewares/arrow.middleware.ts","../src/utils/accessibility/focus-utils.ts","../src/utils/accessibility/focus-trap.ts","../src/utils/accessibility/focus-visible.ts","../src/utils/accessibility/live-region.ts","../src/utils/styles/reset.styles.ts","../src/utils/styles/visually-hidden.styles.ts","../src/utils/styles/component-base.styles.ts","../src/utils/directives/click-outside.directive.ts","../src/utils/virtual-scroll/index.ts","../src/functions/new-id.function.ts","../src/directives/tooltip.directive.ts","../src/components/feedback/spinner/spinner.template.ts","../src/components/feedback/spinner/spinner.styles.ts","../src/components/feedback/spinner/spinner.component.ts","../src/components/forms/button/button.template.ts","../src/components/forms/button/button.styles.ts","../src/components/forms/button/button.component.ts","../src/components/forms/button-group/button-group.template.ts","../src/components/forms/button-group/button-group.styles.ts","../src/components/forms/button-group/button-group.component.ts","../src/components/forms/button-group/button-group-item.template.ts","../src/components/forms/button-group/button-group-item.styles.ts","../src/components/forms/button-group/button-group-item.component.ts","../src/components/forms/input/input.template.ts","../src/components/forms/input/input.styles.ts","../src/components/forms/input/input.component.ts","../src/components/forms/textarea/textarea.template.ts","../src/components/forms/textarea/textarea.styles.ts","../src/components/forms/textarea/textarea.component.ts","../src/components/forms/checkbox/checkbox.template.ts","../src/components/forms/checkbox/checkbox.styles.ts","../src/components/forms/checkbox/checkbox.component.ts","../src/components/forms/radio/radio.template.ts","../src/components/forms/radio/radio.styles.ts","../src/components/forms/radio/radio.component.ts","../src/components/forms/radio/radio-group.template.ts","../src/components/forms/radio/radio-group.styles.ts","../src/components/forms/radio/radio-group.component.ts","../src/components/forms/radio-card-group/radio-card-group.template.ts","../src/components/forms/radio-card-group/radio-card-group.styles.ts","../src/components/forms/radio-card-group/radio-card-group.component.ts","../src/components/forms/radio-card-group/radio-card.template.ts","../src/components/forms/radio-card-group/radio-card.styles.ts","../src/components/forms/radio-card-group/radio-card.component.ts","../src/components/forms/toggle/toggle.template.ts","../src/components/forms/toggle/toggle.styles.ts","../src/components/forms/toggle/toggle.component.ts","../src/components/forms/select/select.template.ts","../src/components/forms/select/select.styles.ts","../src/components/forms/select/select.component.ts","../src/components/forms/slider/slider.template.ts","../src/components/forms/slider/slider.styles.ts","../src/components/forms/slider/slider.component.ts","../src/components/forms/form-field/form-field.template.ts","../src/components/forms/form-field/form-field.styles.ts","../src/components/forms/form-field/form-field.component.ts","../src/components/forms/date-picker/calendar.template.ts","../src/components/forms/date-picker/calendar.styles.ts","../src/components/forms/date-picker/calendar.component.ts","../src/components/forms/date-picker/date-picker.template.ts","../src/components/forms/date-picker/date-picker.styles.ts","../src/components/forms/date-picker/date-picker.component.ts","../src/components/feedback/alert/alert.template.ts","../src/components/feedback/alert/alert.styles.ts","../src/components/feedback/alert/alert.component.ts","../src/components/feedback/toast/toast.service.ts","../src/components/feedback/toast/toast.template.ts","../src/components/feedback/toast/toast.styles.ts","../src/components/feedback/toast/toast.component.ts","../src/components/feedback/toast/toast-container.template.ts","../src/components/feedback/toast/toast-container.styles.ts","../src/components/feedback/toast/toast-container.component.ts","../src/components/feedback/progress/progress.template.ts","../src/components/feedback/progress/progress.styles.ts","../src/components/feedback/progress/progress.component.ts","../src/components/foundation/card/card.template.ts","../src/components/foundation/card/card.styles.ts","../src/components/foundation/card/card.component.ts","../src/components/foundation/divider/divider.template.ts","../src/components/foundation/divider/divider.styles.ts","../src/components/foundation/divider/divider.component.ts","../src/components/foundation/stack/stack.template.ts","../src/components/foundation/stack/stack.styles.ts","../src/components/foundation/stack/stack.component.ts","../src/components/foundation/container/container.template.ts","../src/components/foundation/container/container.styles.ts","../src/components/foundation/container/container.component.ts","../src/components/data-display/avatar/avatar.template.ts","../src/components/data-display/avatar/avatar.styles.ts","../src/components/data-display/avatar/avatar.component.ts","../src/components/data-display/badge/badge.template.ts","../src/components/data-display/badge/badge.styles.ts","../src/components/data-display/badge/badge.component.ts","../src/components/data-display/badge-group/badge-group.template.ts","../src/components/data-display/badge-group/badge-group.styles.ts","../src/components/data-display/badge-group/badge-group.component.ts","../src/components/data-display/tag/tag.template.ts","../src/components/data-display/tag/tag.styles.ts","../src/components/data-display/tag/tag.component.ts","../src/components/data-display/list/list.template.ts","../src/components/data-display/list/list.styles.ts","../src/components/data-display/list/list.component.ts","../src/components/data-display/list/list-item.template.ts","../src/components/data-display/list/list-item.styles.ts","../src/components/data-display/list/list-item.component.ts","../src/components/data-display/activity-feed/activity-feed.template.ts","../src/components/data-display/activity-feed/activity-feed.styles.ts","../src/components/data-display/activity-feed/activity-feed.component.ts","../src/components/data-display/activity-feed/activity-feed-item.template.ts","../src/components/data-display/activity-feed/activity-feed-item.styles.ts","../src/components/data-display/activity-feed/activity-feed-item.component.ts","../src/components/data-display/table/table.template.ts","../src/components/data-display/table/table.styles.ts","../src/components/data-display/table/table.component.ts","../src/components/data-display/data-grid/data-grid.template.ts","../src/components/data-display/data-grid/data-grid.styles.ts","../src/components/data-display/data-grid/data-grid.component.ts","../src/components/data-display/calendar-view/calendar-view.utils.ts","../src/components/data-display/calendar-view/calendar-view-header.template.ts","../src/components/data-display/calendar-view/calendar-view-month.template.ts","../src/components/data-display/calendar-view/calendar-view-week.template.ts","../src/components/data-display/calendar-view/calendar-view-day.template.ts","../src/components/data-display/calendar-view/calendar-view.template.ts","../src/components/data-display/calendar-view/calendar-view.styles.ts","../src/components/data-display/calendar-view/calendar-view.component.ts","../src/components/general/icon/icon.template.ts","../src/components/general/icon/icon.styles.ts","../src/components/general/icon/icon.component.ts","../src/components/navigation/tabs/tabs.template.ts","../src/components/navigation/tabs/tabs.styles.ts","../src/components/navigation/tabs/tabs.component.ts","../src/components/navigation/tabs/tab.template.ts","../src/components/navigation/tabs/tab.styles.ts","../src/components/navigation/tabs/tab.component.ts","../src/components/navigation/tabs/tab-panel.template.ts","../src/components/navigation/tabs/tab-panel.styles.ts","../src/components/navigation/tabs/tab-panel.component.ts","../src/components/navigation/breadcrumb/breadcrumb.template.ts","../src/components/navigation/breadcrumb/breadcrumb.styles.ts","../src/components/navigation/breadcrumb/breadcrumb.component.ts","../src/components/navigation/breadcrumb/breadcrumb-item.template.ts","../src/components/navigation/breadcrumb/breadcrumb-item.styles.ts","../src/components/navigation/breadcrumb/breadcrumb-item.component.ts","../src/components/navigation/pagination/pagination.template.ts","../src/components/navigation/pagination/pagination.styles.ts","../src/components/navigation/pagination/pagination.component.ts","../src/components/navigation/sidebar/sidebar.template.ts","../src/components/navigation/sidebar/sidebar.styles.ts","../src/components/navigation/sidebar/sidebar.component.ts","../src/components/navigation/sidebar/sidebar-group.template.ts","../src/components/navigation/sidebar/sidebar-group.styles.ts","../src/components/navigation/sidebar/sidebar-group.component.ts","../src/components/navigation/sidebar/sidebar-item.template.ts","../src/components/navigation/sidebar/sidebar-item.styles.ts","../src/components/navigation/sidebar/sidebar-item.component.ts","../src/components/navigation/steps/steps.template.ts","../src/components/navigation/steps/steps.styles.ts","../src/components/navigation/steps/steps.component.ts","../src/components/navigation/steps/step.template.ts","../src/components/navigation/steps/step.styles.ts","../src/components/navigation/steps/step.component.ts","../src/components/navigation/steps/step-panel.template.ts","../src/components/navigation/steps/step-panel.styles.ts","../src/components/navigation/steps/step-panel.component.ts","../src/components/overlays/dialog/dialog.template.ts","../src/components/overlays/dialog/dialog.styles.ts","../src/components/overlays/dialog/dialog-ref.class.ts","../src/components/overlays/dialog/dialog.service.ts","../src/components/overlays/dialog/dialog.component.ts","../src/components/overlays/drawer/drawer.template.ts","../src/components/overlays/drawer/drawer.styles.ts","../src/components/overlays/drawer/drawer.component.ts","../src/components/overlays/dropdown/dropdown.template.ts","../src/components/overlays/dropdown/dropdown.styles.ts","../src/components/overlays/dropdown/dropdown.component.ts","../src/components/overlays/dropdown/dropdown-item.template.ts","../src/components/overlays/dropdown/dropdown-item.styles.ts","../src/components/overlays/dropdown/dropdown-item.component.ts","../src/components/overlays/dropdown/dropdown-separator.template.ts","../src/components/overlays/dropdown/dropdown-separator.styles.ts","../src/components/overlays/dropdown/dropdown-separator.component.ts","../src/components/overlays/dropdown/dropdown-group.template.ts","../src/components/overlays/dropdown/dropdown-group.styles.ts","../src/components/overlays/dropdown/dropdown-group.component.ts","../src/components/overlays/tooltip/tooltip.template.ts","../src/components/overlays/tooltip/tooltip.styles.ts","../src/components/overlays/tooltip/tooltip.component.ts","../src/components/overlays/popover/popover.template.ts","../src/components/overlays/popover/popover.styles.ts","../src/components/overlays/popover/popover.component.ts","../src/components/sections/app-shell/app-shell.template.ts","../src/components/sections/app-shell/app-shell.styles.ts","../src/components/sections/app-shell/app-shell.component.ts","../src/components/sections/hero/hero-section.template.ts","../src/components/sections/hero/hero-section.styles.ts","../src/components/sections/hero/hero-section.component.ts","../src/components/sections/page-header/page-header.template.ts","../src/components/sections/page-header/page-header.styles.ts","../src/components/sections/page-header/page-header.component.ts","../src/components/pages/auth/login-page.template.ts","../src/components/pages/auth/auth-layout.styles.ts","../src/components/pages/auth/login-page.styles.ts","../src/components/pages/auth/login-page.component.ts","../src/components/pages/auth/signup-page.template.ts","../src/components/pages/auth/signup-page.styles.ts","../src/components/pages/auth/signup-page.component.ts","../src/components/pages/dashboard/dashboard-page.template.ts","../src/components/pages/dashboard/dashboard-page.styles.ts","../src/components/pages/dashboard/dashboard-page.component.ts"],"sourcesContent":["import type { Token } from '../types/token.type';\n\nexport const getTokenKey = <T>(token: Token<T>): string => {\n\tif (typeof token === 'string') {\n\t\treturn token;\n\t}\n\tif (typeof token === 'symbol') {\n\t\treturn token.toString();\n\t}\n\n\treturn (token as { name: string }).name;\n};\n","import { getTokenKey } from '../function/get-token-key.function';\nimport type { Token } from '../types/token.type';\n\nexport function Inject<T>(token: Token<T>): (target: any, _: string | undefined, index: number) => void {\n\treturn function (target: any, _: string | undefined, index: number): void {\n\t\tif (!target.params) {\n\t\t\ttarget.params = [];\n\t\t}\n\n\t\ttarget.params[index] = { __injectionToken: getTokenKey(token) };\n\t};\n}\n","import type { INewable } from '../../interfaces';\nimport { getTokenKey } from '../function/get-token-key.function';\nimport { Injector } from '../';\nimport type { IInjectableMeta } from '../interfaces/iinjectable-meta.interface';\n\nexport function Injectable<T>(meta: IInjectableMeta<T> = {}): (target: INewable<T>) => void {\n\treturn function (target: INewable<T>): void {\n\t\tconst token = meta.token ?? target;\n\t\tconst dependencies = meta.dependencies?.map((dep) => getTokenKey(dep));\n\n\t\tInjector.bind(token, target, {\n\t\t\tsingleton: meta.singleton,\n\t\t\tdependencies,\n\t\t\targs: meta.args\n\t\t});\n\t};\n}\n","import type { INewable } from '../../interfaces';\nimport type { BindingType } from '../types/binding-type.type';\nimport type { Token } from '../types/token.type';\nimport { getTokenKey } from '../function/get-token-key.function';\n\nexport class Binding<T> {\n\treadonly key: string;\n\treadonly token: Token<T>;\n\treadonly type: BindingType;\n\n\tprivate _class?: INewable<T>;\n\tprivate _factory?: () => T;\n\tprivate _instance?: T;\n\tprivate _singleton: boolean = true;\n\tprivate _dependencies: string[] = [];\n\tprivate _args: unknown[] = [];\n\tprivate _resolved: boolean = false;\n\n\tconstructor(key: string, token: Token<T>, type: BindingType) {\n\t\tthis.key = key;\n\t\tthis.token = token;\n\t\tthis.type = type;\n\t}\n\n\tget isSingleton(): boolean {\n\t\treturn this._singleton;\n\t}\n\n\tget isResolved(): boolean {\n\t\treturn this._resolved;\n\t}\n\n\tget dependencies(): string[] {\n\t\treturn this._dependencies;\n\t}\n\n\tget args(): unknown[] {\n\t\treturn this._args;\n\t}\n\n\tget targetClass(): INewable<T> | undefined {\n\t\treturn this._class;\n\t}\n\n\tget factory(): (() => T) | undefined {\n\t\treturn this._factory;\n\t}\n\n\tsetClass(cls: INewable<T>): this {\n\t\tthis._class = cls;\n\t\treturn this;\n\t}\n\n\tsetFactory(factory: () => T): this {\n\t\tthis._factory = factory;\n\t\treturn this;\n\t}\n\n\tsetSingleton(value: boolean): this {\n\t\tthis._singleton = value;\n\t\treturn this;\n\t}\n\n\twithDependencies(deps: Token<unknown>[]): this {\n\t\tthis._dependencies = deps.map((dep) => getTokenKey(dep));\n\t\treturn this;\n\t}\n\n\twithArgs(args: unknown[]): this {\n\t\tthis._args = args;\n\t\treturn this;\n\t}\n\n\tgetInstance(): T | undefined {\n\t\treturn this._instance;\n\t}\n\n\tsetInstance(instance: T): this {\n\t\tthis._instance = instance;\n\t\tthis._resolved = true;\n\t\treturn this;\n\t}\n\n\tclearInstance(): this {\n\t\tthis._instance = undefined;\n\t\tthis._resolved = false;\n\t\treturn this;\n\t}\n}\n","import type { INewable } from '../../interfaces';\nimport type { Token } from '../types/token.type';\nimport { Binding } from './binding.class';\nimport { getTokenKey } from '../function/get-token-key.function';\nimport type { IClassBindingOptions } from '../interfaces/iclass-binding-options.interface';\nimport type { IFactoryBindingOptions } from '../interfaces/ifactory-binding-options.interface';\n\nexport class InjectionEngine {\n\tprivate _bindings: Map<string, Binding<unknown>> = new Map();\n\tprivate _constructionStack: Set<string> = new Set();\n\n\t/**\n\t * Bind a class to the injector\n\t * @overload bind(cls) - Use class as its own token\n\t * @overload bind(cls, options) - Use class as token with options\n\t * @overload bind(token, cls) - Use custom token with class\n\t * @overload bind(token, cls, options) - Use custom token with class and options\n\t */\n\tbind<T>(cls: INewable<T>, options?: IClassBindingOptions): Binding<T>;\n\tbind<T>(token: Token<T>, cls: INewable<T>, options?: IClassBindingOptions): Binding<T>;\n\tbind<T>(tokenOrClass: Token<T> | INewable<T>, clsOrOptions?: INewable<T> | IClassBindingOptions, maybeOptions?: IClassBindingOptions): Binding<T> {\n\t\tlet token: Token<T>;\n\t\tlet cls: INewable<T>;\n\t\tlet options: IClassBindingOptions | undefined;\n\n\t\tif (typeof clsOrOptions === 'function') {\n\t\t\t// bind(token, cls) or bind(token, cls, options)\n\t\t\ttoken = tokenOrClass as Token<T>;\n\t\t\tcls = clsOrOptions as INewable<T>;\n\t\t\toptions = maybeOptions;\n\t\t} else {\n\t\t\t// bind(cls) or bind(cls, options)\n\t\t\ttoken = tokenOrClass as INewable<T>;\n\t\t\tcls = tokenOrClass as INewable<T>;\n\t\t\toptions = clsOrOptions as IClassBindingOptions | undefined;\n\t\t}\n\n\t\tconst key = getTokenKey(token);\n\t\tconst binding = new Binding<T>(key, token, 'class');\n\t\tbinding.setClass(cls);\n\n\t\tif (options?.singleton !== undefined) {\n\t\t\tbinding.setSingleton(options.singleton);\n\t\t}\n\t\tif (options?.dependencies) {\n\t\t\tbinding.withDependencies(options.dependencies);\n\t\t}\n\t\tif (options?.args) {\n\t\t\tbinding.withArgs(options.args);\n\t\t}\n\n\t\tthis._bindings.set(key, binding as Binding<unknown>);\n\t\treturn binding;\n\t}\n\n\tbindValue<T>(token: Token<T>, value: T): Binding<T>;\n\tbindValue<T, V>(token: Token<T>, value: V): Binding<T>;\n\tbindValue<T>(token: Token<T>, value: unknown): Binding<T> {\n\t\tconst key = getTokenKey(token);\n\t\tconst binding = new Binding<T>(key, token, 'value');\n\n\t\tbinding.setInstance(value as T);\n\t\tbinding.setSingleton(true);\n\n\t\tthis._bindings.set(key, binding as Binding<unknown>);\n\n\t\treturn binding;\n\t}\n\n\tbindFactory<T>(token: Token<T>, factory: () => T, options?: IFactoryBindingOptions): Binding<T> {\n\t\tconst key = getTokenKey(token);\n\t\tconst binding = new Binding<T>(key, token, 'factory');\n\t\tbinding.setFactory(factory);\n\n\t\tif (options?.singleton !== undefined) {\n\t\t\tbinding.setSingleton(options.singleton);\n\t\t}\n\n\t\tthis._bindings.set(key, binding as Binding<unknown>);\n\n\t\treturn binding;\n\t}\n\n\tget<T>(token: Token<T>): T {\n\t\tconst key = getTokenKey(token);\n\t\tconst binding = this._bindings.get(key) as Binding<T> | undefined;\n\n\t\tif (!binding) {\n\t\t\tthrow new Error(`Dependency could not be found: ${key}`);\n\t\t}\n\n\t\treturn this.resolve(binding, key);\n\t}\n\n\thas<T>(token: Token<T>): boolean {\n\t\tconst key = getTokenKey(token);\n\t\treturn this._bindings.has(key);\n\t}\n\n\tgetBinding<T>(token: Token<T>): Binding<T> | undefined {\n\t\tconst key = getTokenKey(token);\n\t\treturn this._bindings.get(key) as Binding<T> | undefined;\n\t}\n\n\tunbind<T>(token: Token<T>): boolean {\n\t\tconst key = getTokenKey(token);\n\t\treturn this._bindings.delete(key);\n\t}\n\n\tclear(): void {\n\t\tthis._bindings.clear();\n\t}\n\n\tprivate resolve<T>(binding: Binding<T>, key: string): T {\n\t\tif (binding.type === 'value') {\n\t\t\treturn binding.getInstance()!;\n\t\t}\n\n\t\tconst existing = binding.getInstance();\n\t\tif (existing !== undefined && binding.isSingleton) {\n\t\t\treturn existing;\n\t\t}\n\n\t\t// Circular dependency detection\n\t\tif (this._constructionStack.has(key)) {\n\t\t\tconst chain = Array.from(this._constructionStack).join(' -> ') + ` -> ${key}`;\n\t\t\tthrow new Error(`Circular dependency detected: ${chain}`);\n\t\t}\n\n\t\tthis._constructionStack.add(key);\n\n\t\ttry {\n\t\t\tlet instance: T;\n\n\t\t\tif (binding.type === 'factory') {\n\t\t\t\tinstance = binding.factory!();\n\t\t\t} else {\n\t\t\t\tinstance = this.construct(binding, key);\n\t\t\t}\n\n\t\t\tif (binding.isSingleton) {\n\t\t\t\tbinding.setInstance(instance);\n\t\t\t}\n\n\t\t\treturn instance;\n\t\t} finally {\n\t\t\tthis._constructionStack.delete(key);\n\t\t}\n\t}\n\n\tprivate construct<T>(binding: Binding<T>, currentToken: string): T {\n\t\tconst cls = binding.targetClass!;\n\t\tlet dependencies: unknown[] = [];\n\n\t\t// Check for @Inject decorated parameters\n\t\tconst paramTokens = (cls as any).params;\n\n\t\tif (paramTokens && Array.isArray(paramTokens)) {\n\t\t\tfor (let i = 0; i < paramTokens.length; i++) {\n\t\t\t\tconst param = paramTokens[i];\n\t\t\t\tif (param && typeof param === 'object' && param.__injectionToken) {\n\t\t\t\t\tconst depKey = param.__injectionToken;\n\t\t\t\t\tconst depBinding = this._bindings.get(depKey);\n\n\t\t\t\t\tif (!depBinding) {\n\t\t\t\t\t\tthrow new Error(`Dependency '${depKey}' not found (required by '${currentToken}')`);\n\t\t\t\t\t}\n\n\t\t\t\t\tdependencies.push(this.resolve(depBinding as Binding<unknown>, depKey));\n\t\t\t\t} else {\n\t\t\t\t\tdependencies.push(undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (binding.dependencies.length > 0) {\n\t\t\t// Legacy token-based dependency resolution\n\t\t\tfor (const depKey of binding.dependencies) {\n\t\t\t\tconst depBinding = this._bindings.get(depKey);\n\n\t\t\t\tif (!depBinding) {\n\t\t\t\t\tthrow new Error(`Dependency '${depKey}' not found (required by '${currentToken}')`);\n\t\t\t\t}\n\n\t\t\t\tdependencies.push(this.resolve(depBinding as Binding<unknown>, depKey));\n\t\t\t}\n\t\t}\n\n\t\tif (binding.args.length > 0) {\n\t\t\tdependencies = dependencies.concat(binding.args);\n\t\t}\n\n\t\treturn Reflect.construct(cls, dependencies);\n\t}\n}\n\nexport const Injector = new InjectionEngine();\n","import { Injector } from '../classes/injection-engine.class';\nimport type { Token } from '../types/token.type';\n\nexport function Service<T>(token: Token<T>) {\n\treturn function (target: any, propertyKey: string | symbol): void {\n\t\tconst metadataKey = `__service_${String(propertyKey)}`;\n\t\ttarget[metadataKey] = token;\n\n\t\tObject.defineProperty(target, propertyKey, {\n\t\t\tget(): T {\n\t\t\t\tconst cacheKey = `__cached_${String(propertyKey)}`;\n\n\t\t\t\tif (!(this as any)[cacheKey]) {\n\t\t\t\t\t(this as any)[cacheKey] = Injector.get<T>(token);\n\t\t\t\t}\n\n\t\t\t\treturn (this as any)[cacheKey];\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true\n\t\t});\n\t};\n}\n","import type { IInjectionToken } from '../interfaces/iinjection-token.interface';\n\nexport function createToken<T>(description: string): IInjectionToken<T> {\n\t// Symbol already has a built-in description property\n\treturn Symbol(description) as unknown as IInjectionToken<T>;\n}\n","import { Injector } from '../../injection';\nimport type { IAppConfig } from '../interfaces/iapp-config.interface';\nimport type { IMelodicApp } from '../interfaces/imelodic-app.interface';\nimport type { Token } from '../../injection';\n\nexport async function bootstrap(config: IAppConfig = {}): Promise<IMelodicApp> {\n\tconst devMode = config.devMode ?? false;\n\tconst errorHandlers: { type: string; handler: EventListener }[] = [];\n\n\tif (devMode) {\n\t\tconsole.log('[Melodic] Bootstrap starting...');\n\t}\n\n\tif (config.onError) {\n\t\tconst errorHandler = (event: ErrorEvent) => {\n\t\t\tconfig.onError!(event.error, 'error');\n\t\t};\n\t\tconst rejectionHandler = (event: PromiseRejectionEvent) => {\n\t\t\tconfig.onError!(event.reason, 'unhandledrejection');\n\t\t};\n\n\t\twindow.addEventListener('error', errorHandler as EventListener);\n\t\twindow.addEventListener('unhandledrejection', rejectionHandler as EventListener);\n\n\t\terrorHandlers.push(\n\t\t\t{ type: 'error', handler: errorHandler as EventListener },\n\t\t\t{ type: 'unhandledrejection', handler: rejectionHandler as EventListener }\n\t\t);\n\t}\n\n\tif (config.onBefore) {\n\t\tif (devMode) {\n\t\t\tconsole.log('[Melodic] Running onBefore hook...');\n\t\t}\n\n\t\tawait config.onBefore();\n\t}\n\n\tif (config.providers) {\n\t\tfor (const provider of config.providers) {\n\t\t\tprovider(Injector);\n\t\t}\n\n\t\tif (devMode) {\n\t\t\tconsole.log('[Melodic] Custom providers registered');\n\t\t}\n\t}\n\n\tlet rootElement: HTMLElement | undefined;\n\tif (config.rootComponent && config.target) {\n\t\tconst targetEl = typeof config.target === 'string' ? document.querySelector<HTMLElement>(config.target) : config.target;\n\n\t\tif (!targetEl) {\n\t\t\tthrow new Error(`[Melodic] Target element not found: ${config.target}`);\n\t\t}\n\n\t\t// Check if component is registered\n\t\tif (!customElements.get(config.rootComponent)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Melodic] Component <${config.rootComponent}> is not registered. ` + `Make sure to import the component file before calling bootstrap().`\n\t\t\t);\n\t\t}\n\n\t\trootElement = document.createElement(config.rootComponent);\n\t\ttargetEl.appendChild(rootElement);\n\n\t\tif (devMode) {\n\t\t\tconsole.log('[Melodic] Mounted root component', {\n\t\t\t\tcomponent: config.rootComponent,\n\t\t\t\ttarget: config.target\n\t\t\t});\n\t\t}\n\t}\n\n\tconst app: IMelodicApp = {\n\t\tisDevMode: devMode,\n\t\trootElement,\n\n\t\tget<T>(token: Token<T>): T {\n\t\t\treturn Injector.get(token);\n\t\t},\n\n\t\tdestroy() {\n\t\t\tfor (const { type, handler } of errorHandlers) {\n\t\t\t\twindow.removeEventListener(type, handler);\n\t\t\t}\n\n\t\t\tif (rootElement?.parentNode) {\n\t\t\t\trootElement.parentNode.removeChild(rootElement);\n\t\t\t}\n\n\t\t\tif (devMode) {\n\t\t\t\tconsole.log('[Melodic] Application destroyed');\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.onReady) {\n\t\tconfig.onReady();\n\t}\n\n\tif (devMode) {\n\t\tconsole.log('[Melodic] Bootstrap complete');\n\t}\n\n\tInjector.bindValue('IMelodicApp', app);\n\n\treturn app;\n}\n","import type { TemplateResult } from '../classes/template-result.class';\n\nexport function render(result: TemplateResult, container: Element | DocumentFragment): void {\n\tresult.renderInto(container);\n}\n","import type { Subscriber } from './subscriber.type';\nimport type { Unsubscriber } from './unsubscriber.type';\n\nexport type Signal<T> = {\n\t(): T;\n\tset(value: T): void;\n\tupdate(updater: (current: T) => T): void;\n\tsubscribe(subscriber: Subscriber<T>): Unsubscriber;\n\tunsubscribe(subscriber: Subscriber<T>): void;\n\tdestroy(): void;\n};\n\nexport const SIGNAL_MARKER = Symbol('melodic.signal');\n","import { type Signal, SIGNAL_MARKER } from '../types/signal.type';\n\nexport const isSignal = <T = unknown>(value: unknown): value is Signal<T> => {\n\treturn typeof value === 'function' && SIGNAL_MARKER in value;\n};\n","const globalStylesAttribute: string = 'melodic-styles';\nconst globalStyleSelector: string = `style[${globalStylesAttribute}], link[rel=\"stylesheet\"][${globalStylesAttribute}]`;\n\nconst cachedCssSheets: CSSStyleSheet[] = [];\nlet loadingPromise: Promise<void> | null = null;\n\nexport const applyGlobalStyles = (root: ShadowRoot): void => {\n\tif (hasCachedSheets()) {\n\t\tapplyAdoptedSheets(root);\n\t\treturn;\n\t}\n\n\tif (!loadingPromise) {\n\t\tloadingPromise = loadStyles();\n\t}\n\n\tloadingPromise.then(() => applyAdoptedSheets(root));\n};\n\nconst loadStyles = async (): Promise<void> => {\n\tconst globalStyleElements = document.querySelectorAll(globalStyleSelector);\n\n\tif (globalStyleElements.length === 0) {\n\t\treturn;\n\t}\n\n\tfor (const element of globalStyleElements) {\n\t\tif (element instanceof HTMLStyleElement) {\n\t\t\tcacheCssSheet(element.textContent ?? '');\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (element instanceof HTMLLinkElement) {\n\t\t\tif (!element.sheet) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\telement.addEventListener('load', () => resolve(), { once: true });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcacheCssSheet(\n\t\t\t\tArray.from(element.sheet?.cssRules ?? [])\n\t\t\t\t\t.map((rule) => rule.cssText)\n\t\t\t\t\t.join('\\n')\n\t\t\t);\n\t\t}\n\t}\n};\n\nconst applyAdoptedSheets = (root: ShadowRoot): void => {\n\tconst adopted = root.adoptedStyleSheets ?? [];\n\tconst newSheets = cachedCssSheets.filter((sheet) => !adopted.includes(sheet));\n\n\tif (newSheets.length > 0) {\n\t\troot.adoptedStyleSheets = [...adopted, ...newSheets];\n\t}\n};\n\nconst cacheCssSheet = (text: string): void => {\n\tconst trimmedText = text.trim();\n\tif (trimmedText.length > 0) {\n\t\tconst sheet = new CSSStyleSheet();\n\t\tsheet.replaceSync(trimmedText);\n\t\tcachedCssSheets.push(sheet);\n\t}\n};\n\nconst hasCachedSheets = (): boolean => {\n\treturn cachedCssSheets.length > 0;\n};\n","import type { ComponentMeta } from '../types/component-meta.type';\nimport type { Component } from '../types/component.type';\nimport { render } from '../../template/functions/render.function';\nimport type { Unsubscriber } from '../../signals/types/unsubscriber.type';\nimport type { Signal } from '../../signals/types/signal.type';\nimport { isSignal } from '../../signals/functions/is-signal.function';\nimport type { ITemplatePart } from '../../template/interfaces/itemplate-part.interface';\nimport { applyGlobalStyles } from '../styles/apply-global-styles.function';\n\nexport abstract class ComponentBase extends HTMLElement {\n\tprivate readonly _meta: ComponentMeta;\n\tprivate readonly _component: Component;\n\tprivate readonly _root: ShadowRoot;\n\tprivate readonly _style: HTMLStyleElement;\n\tprivate _unsubscribers: Array<Unsubscriber> = [];\n\tprivate _renderScheduled = false;\n\tprivate readonly _booleanProperties: Set<string> = new Set();\n\n\tconstructor(meta: ComponentMeta, component: Component) {\n\t\tsuper();\n\n\t\tthis._meta = meta;\n\t\tthis._component = component;\n\t\tthis._component.elementRef = this;\n\t\tthis._root = this.attachShadow({ mode: 'open' });\n\t\tapplyGlobalStyles(this._root);\n\t\tthis._style = this.renderStyles();\n\n\t\tthis.observe();\n\n\t\tif (this._component.onInit) {\n\t\t\tthis._component.onInit();\n\t\t}\n\t}\n\n\tget component(): Component {\n\t\treturn this._component;\n\t}\n\n\tasync connectedCallback(): Promise<void> {\n\t\tthis.render();\n\n\t\tif (this._component.onCreate !== undefined) {\n\t\t\tthis._component.onCreate();\n\t\t}\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis._unsubscribers.forEach((unsubscribe) => unsubscribe());\n\t\tthis._unsubscribers = [];\n\n\t\tconst parts = (this._root as any).__parts as ITemplatePart[] | undefined;\n\t\tif (parts) {\n\t\t\tfor (const part of parts) {\n\t\t\t\tif (part.actionCleanup) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpart.actionCleanup();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Action directive cleanup failed:', error);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tpart.actionCleanup = undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._component.onDestroy !== undefined) {\n\t\t\tthis._component.onDestroy();\n\t\t}\n\t}\n\n\tattributeChangedCallback(attribute: string, oldVal: unknown, newVal: unknown): void {\n\t\tconst prop = attribute.replace(/-([a-z])/g, (_, ch: string) => ch.toUpperCase());\n\n\t\tif ((this._component as any)[prop] !== undefined) {\n\t\t\tlet value = newVal;\n\n\t\t\t// Convert boolean attributes: present (any value including \"\") = true, null/absent = false\n\t\t\tif (this._booleanProperties.has(prop)) {\n\t\t\t\tvalue = newVal !== null && newVal !== 'false';\n\t\t\t}\n\n\t\t\t(this._component as any)[prop] = value;\n\t\t}\n\n\t\tthis.scheduleRender();\n\n\t\tif (this._component.onAttributeChange !== undefined) {\n\t\t\tthis._component.onAttributeChange(attribute, oldVal, newVal);\n\t\t}\n\t}\n\n\tprivate renderStyles(): HTMLStyleElement {\n\t\tconst styleNode: HTMLStyleElement = document.createElement('style');\n\n\t\tif (this._meta.styles) {\n\t\t\tconst stylesResult = this._meta.styles();\n\t\t\trender(stylesResult, styleNode);\n\t\t}\n\n\t\treturn this._root.appendChild(styleNode);\n\t}\n\n\tprivate render(): void {\n\t\tif (this._meta.template) {\n\t\t\tconst templateResult = this._meta.template(this._component, this.getAttributeValues());\n\t\t\trender(templateResult, this._root);\n\n\t\t\tif (this._style.parentNode !== this._root) {\n\t\t\t\tthis._root.appendChild(this._style);\n\t\t\t}\n\t\t}\n\n\t\tif (this._component.onRender !== undefined) {\n\t\t\tthis._component.onRender();\n\t\t}\n\t}\n\n\tprivate scheduleRender(): void {\n\t\tif (this._renderScheduled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._renderScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis._renderScheduled = false;\n\t\t\tif (this.isConnected) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate observe(): void {\n\t\tconst properties: string[] = [];\n\t\tconst seen = new Set<string>();\n\t\tlet proto: object | null = this._component;\n\n\t\twhile (proto && proto !== Object.prototype) {\n\t\t\tfor (const prop of Object.getOwnPropertyNames(proto)) {\n\t\t\t\tif (!seen.has(prop)) {\n\t\t\t\t\tseen.add(prop);\n\t\t\t\t\tproperties.push(prop);\n\t\t\t\t}\n\t\t\t}\n\t\t\tproto = Object.getPrototypeOf(proto);\n\t\t}\n\n\t\tconst filtered = properties.filter((prop) => {\n\t\t\tconst value = (this._component as any)[prop];\n\n\t\t\t// Skip private properties (convention)\n\t\t\tif (prop.startsWith('_')) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (isSignal(value)) {\n\t\t\t\tthis.subscribeToSignal(value);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (typeof value === 'function') {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn prop !== 'elementRef' && prop !== 'constructor';\n\t\t});\n\n\t\tfor (const prop of filtered) {\n\t\t\tconst descriptor = this.getPropertyDescriptor(this._component, prop);\n\n\t\t\t// Check if wrapper already has a value set (from property binding before observe ran)\n\t\t\tconst wrapperValue = Object.getOwnPropertyDescriptor(this, prop)?.value;\n\t\t\tlet value = wrapperValue === undefined ? (this._component as any)[prop] : wrapperValue;\n\n\t\t\t// Track boolean properties for attribute conversion\n\t\t\tif (typeof value === 'boolean') {\n\t\t\t\tthis._booleanProperties.add(prop);\n\t\t\t}\n\n\t\t\t// Build getter/setter for the component's property\n\t\t\tlet componentGetter = () => value;\n\t\t\tlet componentSetter = (newVal: unknown) => {\n\t\t\t\tif (value !== newVal) {\n\t\t\t\t\tthis._component.onPropertyChange?.(prop, value, newVal);\n\t\t\t\t\tvalue = newVal;\n\t\t\t\t\tthis.scheduleRender();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Preserve existing getters\n\t\t\tif (descriptor?.get) {\n\t\t\t\tconst originalGetter = descriptor.get;\n\t\t\t\tcomponentGetter = () => originalGetter.call(this._component) ?? value;\n\t\t\t}\n\n\t\t\t// Preserve existing setters\n\t\t\tif (descriptor?.set) {\n\t\t\t\tconst originalSetter = descriptor.set;\n\t\t\t\tconst baseSetter = componentSetter;\n\t\t\t\tcomponentSetter = (newVal) => {\n\t\t\t\t\toriginalSetter.call(this._component, newVal);\n\t\t\t\t\tbaseSetter(newVal);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Make the component's property reactive\n\t\t\tObject.defineProperty(this._component, prop, {\n\t\t\t\tget: componentGetter,\n\t\t\t\tset: componentSetter,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\t// Expose on wrapper for property binding (.prop=${value})\n\t\t\tObject.defineProperty(this, prop, {\n\t\t\t\tget: componentGetter,\n\t\t\t\tset: componentSetter,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate getPropertyDescriptor(target: object, prop: string): PropertyDescriptor | undefined {\n\t\tlet current: object | null = target;\n\n\t\twhile (current && current !== Object.prototype) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(current, prop);\n\t\t\tif (descriptor) {\n\t\t\t\treturn descriptor;\n\t\t\t}\n\t\t\tcurrent = Object.getPrototypeOf(current);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate getAttributeValues(): Record<string, string> {\n\t\tconst attributes: Record<string, string> = {};\n\t\tthis.getAttributeNames().forEach((attrName: string) => {\n\t\t\tattributes[attrName] = this.getAttribute(attrName) ?? '';\n\t\t});\n\n\t\treturn attributes;\n\t}\n\n\tprivate subscribeToSignal<T>(signal: Signal<T>): void {\n\t\tconst unsubscriber = signal.subscribe(() => this.scheduleRender());\n\t\tthis._unsubscribers.push(unsubscriber);\n\t}\n}\n","import type { INewable } from '../../interfaces/inewable.interface';\nimport { ComponentBase } from '../classes/component-base.class';\nimport type { TypedComponentMeta } from '../types/component-meta.type';\nimport type { Component } from '../types/component.type';\nimport { Injector } from '../../injection/classes/injection-engine.class';\n\nexport function MelodicComponent<C extends Component>(meta: TypedComponentMeta<C>): (component: INewable<C>) => void {\n\treturn function (component: INewable<C>): void {\n\t\tif (customElements.get(meta.selector) === undefined) {\n\t\t\tconst webComponent = class extends ComponentBase {\n\t\t\t\tconstructor() {\n\t\t\t\t\tconst dependencies: unknown[] = [];\n\t\t\t\t\tconst paramTokens = (component as any).params;\n\n\t\t\t\t\tif (paramTokens && Array.isArray(paramTokens)) {\n\t\t\t\t\t\tfor (const i of paramTokens) {\n\t\t\t\t\t\t\tconst param = paramTokens[i];\n\t\t\t\t\t\t\tif (param && typeof param === 'object' && param.__injectionToken) {\n\t\t\t\t\t\t\t\tdependencies.push(Injector.get(param.__injectionToken));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdependencies.push(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsuper(meta, Reflect.construct(component, dependencies));\n\t\t\t\t}\n\n\t\t\t\tstatic readonly observedAttributes: string[] = meta.attributes ?? [];\n\t\t\t};\n\n\t\t\tconst componentWithSelector: INewable<C> & { selector?: string } = component as INewable<C> & { selector?: string };\n\t\t\tcomponentWithSelector.selector = meta.selector;\n\n\t\t\tcustomElements.define(meta.selector, webComponent);\n\t\t}\n\t};\n}\n","import type { IHttpResponse } from '../interfaces/ihttp-response.interface';\nimport type { IRequestConfig } from '../interfaces/irequest-config.interface';\n\nexport abstract class HttpBaseError extends Error {\n\tconstructor(message: string, public readonly config: IRequestConfig, public readonly code?: string) {\n\t\tsuper(message);\n\t\tthis.name = 'HttpBaseError';\n\t\tObject.setPrototypeOf(this, HttpBaseError.prototype);\n\t}\n}\n\nexport class HttpError extends HttpBaseError {\n\tconstructor(message: string, public readonly response: IHttpResponse, config: IRequestConfig) {\n\t\tsuper(message, config, `HTTP_${response.status}`);\n\t\tthis.name = 'HttpError';\n\t\tObject.setPrototypeOf(this, HttpError.prototype);\n\t}\n}\n\nexport class NetworkError extends HttpBaseError {\n\tconstructor(message: string, config: IRequestConfig) {\n\t\tsuper(message, config, 'NETWORK_ERROR');\n\t\tthis.name = 'NetworkError';\n\t\tObject.setPrototypeOf(this, NetworkError.prototype);\n\t}\n}\n\nexport class AbortError extends HttpBaseError {\n\tconstructor(message: string, config: IRequestConfig) {\n\t\tsuper(message, config, 'ABORTED');\n\t\tthis.name = 'AbortError';\n\t\tObject.setPrototypeOf(this, AbortError.prototype);\n\t}\n}\n","import type { IRequestConfig } from '../interfaces';\nimport type { IHttpResponse } from '../interfaces/ihttp-response.interface';\nimport type { HttpRequestBody } from '../types/http-request-body.type';\n\ninterface IPendingRequest<T = any> {\n\tpromise: Promise<IHttpResponse<T>>;\n\tabortController: AbortController;\n}\n\nexport class RequestManager {\n\tprivate _pendingRequests = new Map<string, IPendingRequest>();\n\n\tgenerateRequestKey(method: string, url: string, body?: HttpRequestBody): string {\n\t\tlet key = `${method}:${url}`;\n\n\t\tif (body) {\n\t\t\tkey += `:${this.hashBody(body)}`;\n\t\t}\n\n\t\treturn key;\n\t}\n\n\thasPendingRequest(key: string): boolean {\n\t\treturn this._pendingRequests.has(key);\n\t}\n\n\tgetPendingRequest<T = any>(key: string): Promise<IHttpResponse<T>> | null {\n\t\tconst pending = this._pendingRequests.get(key);\n\n\t\tif (!pending) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn pending.promise;\n\t}\n\n\taddPendingRequest<T = any>(requestConfig: IRequestConfig, promise: Promise<IHttpResponse<T>>): void {\n\t\tconst key = this.generateRequestKey(requestConfig.method || 'GET', requestConfig.url || '', requestConfig.body as BodyInit | null);\n\n\t\tthis._pendingRequests.set(key, {\n\t\t\tpromise,\n\t\t\tabortController: requestConfig.abortController!\n\t\t});\n\n\t\tpromise.finally(() => {\n\t\t\tthis.removePendingRequest(key);\n\t\t});\n\t}\n\n\tcancelPendingRequest(key: string, reason?: string): void {\n\t\tconst pending = this._pendingRequests.get(key);\n\n\t\tif (pending) {\n\t\t\tpending.abortController.abort(reason);\n\t\t\tthis._pendingRequests.delete(key);\n\t\t}\n\t}\n\n\tcancelAllRequests(reason?: string): void {\n\t\tthis._pendingRequests.forEach((pending) => {\n\t\t\tpending.abortController.abort(reason);\n\t\t});\n\n\t\tthis._pendingRequests.clear();\n\t}\n\n\tprivate removePendingRequest(key: string): void {\n\t\tconst pending = this._pendingRequests.get(key);\n\n\t\tif (!pending) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._pendingRequests.delete(key);\n\t}\n\n\tprivate hashBody(body: HttpRequestBody): string {\n\t\tlet str: string;\n\n\t\tif (typeof body === 'string') {\n\t\t\tstr = body;\n\t\t} else if (body instanceof FormData) {\n\t\t\tstr = '[FormData]';\n\t\t} else if (body instanceof Blob) {\n\t\t\tstr = `[Blob:${body.size}]`;\n\t\t} else if (body instanceof ArrayBuffer) {\n\t\t\tstr = `[ArrayBuffer:${body.byteLength}]`;\n\t\t} else if (body instanceof URLSearchParams) {\n\t\t\tstr = body.toString();\n\t\t} else if (typeof body === 'object' && body !== null) {\n\t\t\tstr = JSON.stringify(body);\n\t\t} else {\n\t\t\tstr = String(body);\n\t\t}\n\n\t\treturn this.hashCode(str).toString();\n\t}\n\n\tprivate hashCode(str: string): number {\n\t\tlet hash = 0;\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\tconst char = str.charCodeAt(i);\n\t\t\thash = (hash << 5) - hash + char;\n\t\t\thash = hash & hash;\n\t\t}\n\t\treturn hash;\n\t}\n}\n","import { AbortError, HttpError, NetworkError } from './http-error.class';\nimport type { IHttpClientConfig } from '../interfaces/ihttp-client-config.interface';\nimport type { IHttpRequestInterceptor } from '../interfaces/ihttp-request-interceptor.interface';\nimport type { IHttpResponseInterceptor } from '../interfaces/ihttp-response-interceptor.interface';\nimport type { IHttpResponse } from '../interfaces/ihttp-response.interface';\nimport type { IInterceptorApi } from '../interfaces/iinterceptor-api.interface';\nimport type { IProgressEvent } from '../interfaces/iprogress-event.interface';\nimport type { IRequestConfig } from '../interfaces/irequest-config.interface';\nimport type { HttpRequestBody } from '../types/http-request-body.type';\nimport { RequestManager } from './request-manager.class';\n\nexport class HttpClient {\n\tprivate _clientConfig: IHttpClientConfig;\n\tprivate _requestManager = new RequestManager();\n\tprivate _interceptors: {\n\t\trequest: IHttpRequestInterceptor[];\n\t\tresponse: IHttpResponseInterceptor[];\n\t} = {\n\t\trequest: [],\n\t\tresponse: []\n\t};\n\n\tpublic interceptors: IInterceptorApi = {\n\t\trequest: (interceptor: IHttpRequestInterceptor): void => {\n\t\t\tthis._interceptors.request.push(interceptor);\n\t\t},\n\t\tresponse: (interceptor: IHttpResponseInterceptor): void => {\n\t\t\tthis._interceptors.response.push(interceptor);\n\t\t}\n\t};\n\n\tconstructor(config?: IHttpClientConfig) {\n\t\tthis._clientConfig = {\n\t\t\tdefaultHeaders: {},\n\t\t\t...config\n\t\t};\n\t}\n\n\tpublic async get<T>(url: string, config?: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\treturn this.internalRequest<T>({ method: 'GET', ...config, url, deduplicate: config?.deduplicate ?? true });\n\t}\n\n\tpublic async post<T>(url: string, body?: HttpRequestBody, config?: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\treturn this.internalRequest<T>({ method: 'POST', ...config, url, body });\n\t}\n\n\tpublic async put<T>(url: string, body?: HttpRequestBody, config?: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\treturn this.internalRequest<T>({ method: 'PUT', ...config, url, body });\n\t}\n\n\tpublic async patch<T>(url: string, body?: HttpRequestBody, config?: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\treturn this.internalRequest<T>({ method: 'PATCH', ...config, url, body });\n\t}\n\n\tpublic async delete<T>(url: string, config?: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\treturn this.internalRequest<T>({ method: 'DELETE', ...config, url });\n\t}\n\n\tprivate async internalRequest<T>(config: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\tlet requestConfig: IRequestConfig = this.mergeConfig(config);\n\t\trequestConfig = await this.executeRequestInterceptors(requestConfig);\n\n\t\tif (requestConfig.cancel?.cancelled) {\n\t\t\tif (requestConfig.cancel.cancelReason) {\n\t\t\t\tconsole.log('[HttpClient] Request cancelled:', requestConfig.cancel.cancelReason);\n\t\t\t}\n\n\t\t\tlet cancelledResponse: IHttpResponse<T> = {\n\t\t\t\tdata: null as any,\n\t\t\t\tstatus: 0,\n\t\t\t\tstatusText: 'Request Cancelled',\n\t\t\t\theaders: new Headers(),\n\t\t\t\tconfig: requestConfig\n\t\t\t};\n\n\t\t\tif (requestConfig.cancel.cancelledResponse) {\n\t\t\t\tcancelledResponse = { ...cancelledResponse, ...(requestConfig.cancel.cancelledResponse as IHttpResponse<T>) };\n\t\t\t}\n\n\t\t\treturn Promise.resolve(cancelledResponse);\n\t\t}\n\n\t\tif (requestConfig.abortController === undefined) {\n\t\t\tconst abortController = new AbortController();\n\t\t\trequestConfig.abortController = abortController;\n\t\t}\n\n\t\tlet response = await this.executeRequest<T>(requestConfig);\n\t\tresponse = await this.executeResponseInterceptors(response);\n\n\t\treturn response;\n\t}\n\n\tprivate async executeRequest<T>(config: IRequestConfig): Promise<IHttpResponse<T>> {\n\t\tif (config.deduplicate === true) {\n\t\t\tconst requestKey = this._requestManager.generateRequestKey(config.method!, config.url!, config.body);\n\n\t\t\tif (this._requestManager.hasPendingRequest(requestKey)) {\n\t\t\t\treturn this._requestManager.getPendingRequest<T>(requestKey)!;\n\t\t\t}\n\t\t}\n\n\t\tconst fetchPromise = fetch(config.url!, {\n\t\t\tmethod: config.method,\n\t\t\theaders: config.headers,\n\t\t\tbody: this.prepareBody(config.body),\n\t\t\tcredentials: config.credentials,\n\t\t\tmode: config.mode,\n\t\t\tsignal: config.abortController?.signal\n\t\t})\n\t\t\t.then(async (response) => {\n\t\t\t\tconst data = await this.parseResponse<T>(response, config.onProgress);\n\n\t\t\t\tconst httpResponse: IHttpResponse<T> = {\n\t\t\t\t\tdata,\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t\tconfig\n\t\t\t\t};\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new HttpError(`HTTP Error: ${response.status} ${response.statusText}`, httpResponse, config);\n\t\t\t\t}\n\n\t\t\t\treturn httpResponse;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (error instanceof Error && error.name === 'AbortError') {\n\t\t\t\t\tthrow new AbortError('Request aborted', config);\n\t\t\t\t}\n\t\t\t\tconst message = error instanceof Error ? error.message : 'Network error';\n\t\t\t\tthrow new NetworkError(message || 'Network error', config);\n\t\t\t});\n\n\t\tif (config.deduplicate === true) {\n\t\t\tthis._requestManager.addPendingRequest<T>(config, fetchPromise);\n\t\t}\n\n\t\treturn await fetchPromise;\n\t}\n\n\tprivate async executeRequestInterceptors(config: IRequestConfig): Promise<IRequestConfig> {\n\t\tfor (const interceptor of this._interceptors.request) {\n\t\t\ttry {\n\t\t\t\tconfig = await interceptor.intercept(config);\n\n\t\t\t\tif (config.cancel?.cancelled) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (interceptor.error) {\n\t\t\t\t\tawait interceptor.error(error as Error);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn config;\n\t}\n\n\tprivate async executeResponseInterceptors<T>(response: IHttpResponse<T>): Promise<IHttpResponse<T>> {\n\t\tfor (const interceptor of this._interceptors.response) {\n\t\t\ttry {\n\t\t\t\tresponse = await interceptor.intercept(response);\n\t\t\t} catch (error) {\n\t\t\t\tif (interceptor.error) {\n\t\t\t\t\tawait interceptor.error(error as Error);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tprivate mergeConfig(config: IRequestConfig): IRequestConfig {\n\t\treturn {\n\t\t\t...this._clientConfig,\n\t\t\t...config,\n\t\t\theaders: {\n\t\t\t\t...this._clientConfig.defaultHeaders,\n\t\t\t\t...config.headers\n\t\t\t},\n\t\t\turl: this.buildUrl(config.url ?? '', config.params)\n\t\t};\n\t}\n\n\tprivate buildUrl(url: string, params?: Record<string, string | number | boolean>): string {\n\t\tconst baseUrl: string = this._clientConfig.baseURL || '';\n\t\tlet fullUrl = `${baseUrl}${url}`;\n\n\t\tif (params) {\n\t\t\tconst queryString = Object.entries(params)\n\t\t\t\t.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n\t\t\t\t.join('&');\n\t\t\tfullUrl += `${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n\t\t}\n\n\t\treturn fullUrl;\n\t}\n\n\tprivate prepareBody(body?: HttpRequestBody): BodyInit | null {\n\t\tif (body === null || body === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (\n\t\t\tbody instanceof FormData ||\n\t\t\tbody instanceof Blob ||\n\t\t\tbody instanceof ArrayBuffer ||\n\t\t\tbody instanceof URLSearchParams ||\n\t\t\tbody instanceof ReadableStream ||\n\t\t\ttypeof body === 'string'\n\t\t) {\n\t\t\treturn body as BodyInit;\n\t\t}\n\n\t\t// Plain object - convert to JSON\n\t\treturn JSON.stringify(body);\n\t}\n\n\tprivate async parseResponse<T>(response: Response, onProgress?: (progress: IProgressEvent) => void): Promise<T> {\n\t\tconst contentType = response.headers.get('content-type') || '';\n\t\tconst contentLength = parseInt(response.headers.get('content-length') || '0', 10);\n\n\t\tif (onProgress && response.body && contentLength > 0) {\n\t\t\tconst reader = response.body.getReader();\n\t\t\tlet loaded = 0;\n\t\t\tconst chunks: Uint8Array[] = [];\n\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\n\t\t\t\tif (done) break;\n\n\t\t\t\tchunks.push(value);\n\t\t\t\tloaded += value.length;\n\n\t\t\t\tonProgress({\n\t\t\t\t\tloaded,\n\t\t\t\t\ttotal: contentLength,\n\t\t\t\t\tpercentage: (loaded / contentLength) * 100\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst blob = new Blob(chunks as BlobPart[]);\n\n\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\tconst text = await blob.text();\n\t\t\t\treturn JSON.parse(text);\n\t\t\t}\n\n\t\t\treturn blob as T;\n\t\t}\n\n\t\tif (contentType.includes('application/json')) {\n\t\t\treturn (await response.json()) as T;\n\t\t}\n\n\t\tif (contentType.includes('text/')) {\n\t\t\treturn (await response.text()) as T;\n\t\t}\n\n\t\tif (contentType.includes('application/octet-stream') || contentType.includes('image/')) {\n\t\t\treturn (await response.blob()) as T;\n\t\t}\n\n\t\treturn (await response.text()) as T;\n\t}\n}\n","import type { Provider } from '../../bootstrap/types/provider.type';\nimport { HttpClient } from '../classes/http-client.class';\nimport type { IHttpClientConfig, IHttpRequestInterceptor, IHttpResponseInterceptor } from '../interfaces';\n\nexport function provideHttp(\n\thttpClientConfig: IHttpClientConfig,\n\tinterceptors?: { request?: IHttpRequestInterceptor[]; response?: IHttpResponseInterceptor[] }\n): Provider {\n\treturn (injector) => {\n\t\tconst httpClient = new HttpClient(httpClientConfig);\n\n\t\tinjector.bindValue(HttpClient, httpClient);\n\n\t\tif (interceptors?.request) {\n\t\t\tinterceptors.request.forEach((interceptor) => {\n\t\t\t\thttpClient.interceptors.request(interceptor);\n\t\t\t});\n\t\t}\n\n\t\tif (interceptors?.response) {\n\t\t\tinterceptors.response.forEach((interceptor) => {\n\t\t\t\thttpClient.interceptors.response(interceptor);\n\t\t\t});\n\t\t}\n\t};\n}\n","import type { IRouteGuard } from '../interfaces/iroute-guard.interface';\nimport type { GuardFunction } from '../types/guard-function.type';\n\nexport function createGuard(fn: GuardFunction): IRouteGuard {\n\treturn {\n\t\tcanActivate: fn\n\t};\n}\n","import type { IRouteGuard } from '../interfaces/iroute-guard.interface';\nimport type { GuardFunction } from '../types/guard-function.type';\n\nexport function createDeactivateGuard(fn: GuardFunction): IRouteGuard {\n\treturn {\n\t\tcanDeactivate: fn\n\t};\n}\n","import type { IRouteResolver } from '../interfaces/iroute-resolver.interface';\nimport type { ResolverFunction } from '../types/resolver-function.type';\n\nexport function createResolver<T>(fn: ResolverFunction<T>): IRouteResolver<T> {\n\treturn {\n\t\tresolve: fn\n\t};\n}\n","type RuleCheck = (value: string) => boolean;\ntype Rule = RegExp | RuleCheck | string;\ntype Rules = { [key: string]: Rule };\ntype RouteMatchParams = { [key: string]: string } | null;\n\nexport class RouteMatcher {\n\tprivate _reEscape: RegExp = /[-[\\]{}()+?.,\\\\^$|#\\s]/g;\n\tprivate _reParam: RegExp = /([:*])(\\w+)/g;\n\tprivate _names: string[] = [];\n\tprivate _route: string;\n\tprivate _routeRegex: RegExp;\n\tprivate _prefixRegex: RegExp;\n\tprivate _rules: Rules | undefined;\n\tprivate _isWildcard: boolean = false;\n\n\tconstructor(route: string, rules?: Rules) {\n\t\tthis._route = route;\n\t\tthis._rules = rules;\n\t\tthis._isWildcard = route.includes('*');\n\n\t\tlet escapedRoute = this._route.replace(this._reEscape, '\\\\$&');\n\t\tescapedRoute = escapedRoute.replace(this._reParam, (_, mode: string, name: string) => {\n\t\t\tthis._names.push(name);\n\t\t\treturn mode === ':' ? '([^/]*)' : '(.*)';\n\t\t});\n\n\t\tthis._routeRegex = new RegExp('^' + escapedRoute + '$');\n\t\tthis._prefixRegex = new RegExp('^' + escapedRoute + '(?:/|$)');\n\t}\n\n\tparse(url: string): RouteMatchParams {\n\t\tlet i: number = 0;\n\t\tlet param: Rule;\n\t\tlet value: string;\n\t\tconst params: RouteMatchParams = {};\n\t\tconst matches: RegExpMatchArray | null = url.match(this._routeRegex);\n\n\t\tif (!matches) {\n\t\t\treturn null;\n\t\t}\n\n\t\twhile (i < this._names.length) {\n\t\t\tparam = this._names[i++];\n\t\t\tvalue = matches[i];\n\n\t\t\tif (this._rules && param in this._rules && !this.validateRule(this._rules[param], value)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tparams[param] = value;\n\t\t}\n\n\t\treturn params;\n\t}\n\n\tparsePrefix(url: string): { params: RouteMatchParams; matchedPath: string; remainingPath: string } | null {\n\t\tif (this._route === '') {\n\t\t\treturn {\n\t\t\t\tparams: {},\n\t\t\t\tmatchedPath: '',\n\t\t\t\tremainingPath: url\n\t\t\t};\n\t\t}\n\n\t\tconst matches = url.match(this._prefixRegex);\n\t\tif (!matches) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst params: RouteMatchParams = {};\n\t\tfor (let i = 0; i < this._names.length; i++) {\n\t\t\tconst name = this._names[i];\n\t\t\tconst value = matches[i + 1];\n\n\t\t\tif (this._rules && name in this._rules && !this.validateRule(this._rules[name], value)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tparams[name] = value;\n\t\t}\n\n\t\tconst matchedPath = this.calculateMatchedPath(url);\n\t\tconst remainingPath = url.slice(matchedPath.length).replace(/^\\//, '');\n\n\t\treturn { params, matchedPath, remainingPath };\n\t}\n\n\tstringify(params: Record<string, string>): string {\n\t\tlet re: RegExp;\n\t\tlet result: string = this._route;\n\n\t\tfor (const param in params) {\n\t\t\tre = new RegExp('[:*]' + param + '\\\\b');\n\t\t\tresult = result.replace(re, params[param]);\n\t\t}\n\n\t\treturn result.replace(this._reParam, '');\n\t}\n\n\tprivate calculateMatchedPath(url: string): string {\n\t\tif (this._isWildcard) {\n\t\t\treturn url;\n\t\t}\n\n\t\tconst routeSegments = this._route.split('/').filter(Boolean);\n\t\tconst urlSegments = url.split('/').filter(Boolean);\n\n\t\tconst matchedSegments = urlSegments.slice(0, routeSegments.length);\n\t\treturn matchedSegments.join('/');\n\t}\n\n\tprivate validateRule(rule: Rule, value: string): boolean {\n\t\tconst type: string = Object.prototype.toString.call(rule).charAt(8);\n\t\treturn type === 'R' ? (rule as RegExp).test(value) : type === 'F' ? (rule as RuleCheck)(value) : rule === value;\n\t}\n}\n","import type { IRouteContext } from '../interfaces/iroute-context.interface';\n\nexport const ROUTE_CONTEXT_EVENT = 'melodic:route-context';\n\nexport class RouteContextEvent extends CustomEvent<IRouteContext> {\n\tconstructor(context: IRouteContext) {\n\t\tsuper(ROUTE_CONTEXT_EVENT, {\n\t\t\tbubbles: false,\n\t\t\tcomposed: true,\n\t\t\tdetail: context\n\t\t});\n\t}\n}\n","import { RouteMatcher } from '../classes/route-matcher.class';\nimport type { IRouteMatchResult } from '../interfaces/iroute-match-result.interface';\nimport type { IRouteMatch } from '../interfaces/iroute-match.interface';\nimport type { IRoute } from '../interfaces/iroute.interface';\n\nexport function matchRouteLevel(\n\troutes: IRoute[],\n\tremainingPath: string,\n\tbasePath: string,\n\taccumulatedMatches: IRouteMatch[],\n\taccumulatedParams: Record<string, string>\n): IRouteMatchResult {\n\tfor (const route of routes) {\n\t\tconst matcher = new RouteMatcher(route.path);\n\n\t\tif (route.redirectTo && route.path === remainingPath) {\n\t\t\treturn {\n\t\t\t\tmatches: accumulatedMatches,\n\t\t\t\tparams: accumulatedParams,\n\t\t\t\tisExactMatch: false,\n\t\t\t\tredirectTo: route.redirectTo\n\t\t\t};\n\t\t}\n\n\t\tconst exactMatch = matcher.parse(remainingPath);\n\n\t\tif (exactMatch !== null) {\n\t\t\tconst fullPath = basePath ? `${basePath}/${route.path}` : route.path;\n\t\t\tconst match: IRouteMatch = {\n\t\t\t\troute,\n\t\t\t\tparams: exactMatch,\n\t\t\t\tmatchedPath: route.path,\n\t\t\t\tremainingPath: '',\n\t\t\t\tfullPath,\n\t\t\t\tchildren: route.children\n\t\t\t};\n\n\t\t\tObject.assign(accumulatedParams, exactMatch);\n\t\t\taccumulatedMatches.push(match);\n\n\t\t\treturn {\n\t\t\t\tmatches: accumulatedMatches,\n\t\t\t\tparams: accumulatedParams,\n\t\t\t\tisExactMatch: true\n\t\t\t};\n\t\t}\n\n\t\tif (route.children || route.loadChildren) {\n\t\t\tconst prefixResult = matcher.parsePrefix(remainingPath);\n\n\t\t\tif (prefixResult && prefixResult.params !== null) {\n\t\t\t\tconst fullPath = basePath ? `${basePath}/${prefixResult.matchedPath}` : prefixResult.matchedPath;\n\n\t\t\t\tconst match: IRouteMatch = {\n\t\t\t\t\troute,\n\t\t\t\t\tparams: prefixResult.params,\n\t\t\t\t\tmatchedPath: prefixResult.matchedPath,\n\t\t\t\t\tremainingPath: prefixResult.remainingPath,\n\t\t\t\t\tfullPath,\n\t\t\t\t\tchildren: route.children\n\t\t\t\t};\n\n\t\t\t\tObject.assign(accumulatedParams, prefixResult.params);\n\t\t\t\taccumulatedMatches.push(match);\n\n\t\t\t\t// Recurse into children\n\t\t\t\tif (route.children && prefixResult.remainingPath) {\n\t\t\t\t\treturn matchRouteLevel(route.children, prefixResult.remainingPath, fullPath, accumulatedMatches, accumulatedParams);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tmatches: accumulatedMatches,\n\t\t\t\t\tparams: accumulatedParams,\n\t\t\t\t\tisExactMatch: prefixResult.remainingPath === ''\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tmatches: accumulatedMatches,\n\t\tparams: accumulatedParams,\n\t\tisExactMatch: false\n\t};\n}\n","import type { IRouteMatchResult } from '../interfaces/iroute-match-result.interface';\nimport type { IRouteMatch } from '../interfaces/iroute-match.interface';\nimport type { IRoute } from '../interfaces/iroute.interface';\nimport { matchRouteLevel } from './match-route-level.function';\n\n/**\n * Match a URL path against a route tree, supporting nested routes.\n */\nexport function matchRouteTree(routes: IRoute[], path: string, basePath: string = ''): IRouteMatchResult {\n\tconst normalizedPath = path.startsWith('/') ? path.slice(1) : path;\n\tconst matches: IRouteMatch[] = [];\n\tconst params: Record<string, string> = {};\n\n\tconst result = matchRouteLevel(routes, normalizedPath, basePath, matches, params);\n\n\treturn {\n\t\tmatches: result.matches,\n\t\tparams: result.params,\n\t\tisExactMatch: result.isExactMatch,\n\t\tredirectTo: result.redirectTo\n\t};\n}\n","import type { IRoute } from '../interfaces/iroute.interface';\n\nexport function findRouteByName(routes: IRoute[], name: string): IRoute | null {\n\tfor (const route of routes) {\n\t\tif (route.name === name) {\n\t\t\treturn route;\n\t\t}\n\t\tif (route.children) {\n\t\t\tconst found = findRouteByName(route.children, name);\n\t\t\tif (found) return found;\n\t\t}\n\t}\n\treturn null;\n}\n","import { RouteMatcher } from '../classes/route-matcher.class';\nimport type { IRoute } from '../interfaces/iroute.interface';\n\nexport function buildPathFromRoute(routes: IRoute[], name: string, params: Record<string, string> = {}): string | null {\n\tconst pathParts: string[] = [];\n\n\tfunction findAndBuildPath(routeList: IRoute[], targetName: string): boolean {\n\t\tfor (const route of routeList) {\n\t\t\tif (route.name === targetName) {\n\t\t\t\tconst matcher = new RouteMatcher(route.path);\n\t\t\t\tpathParts.push(matcher.stringify(params));\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (route.children) {\n\t\t\t\tconst matcher = new RouteMatcher(route.path);\n\t\t\t\tconst segment = matcher.stringify(params);\n\n\t\t\t\tif (findAndBuildPath(route.children, targetName)) {\n\t\t\t\t\tpathParts.unshift(segment);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (findAndBuildPath(routes, name)) {\n\t\treturn '/' + pathParts.filter(Boolean).join('/');\n\t}\n\n\treturn null;\n}\n","import { Injectable } from '../../injection/decorators/injectable.decorator';\nimport type { IRoute } from '../interfaces/iroute.interface';\nimport type { IRouteMatch } from '../interfaces/iroute-match.interface';\nimport type { IRouteMatchResult } from '../interfaces/iroute-match-result.interface';\nimport type { IRouteContext } from '../interfaces/iroute-context.interface';\n\n@Injectable()\nexport class RouteContextService {\n\tprivate _matchStack: IRouteMatch[] = [];\n\tprivate _contexts: Map<number, IRouteContext> = new Map();\n\tprivate _currentMatchResult: IRouteMatchResult | null = null;\n\tprivate _resolvedData: Map<number, Record<string, unknown>> = new Map();\n\n\tsetMatchResult(result: IRouteMatchResult): void {\n\t\tthis._currentMatchResult = result;\n\t\tthis._matchStack = result.matches;\n\n\t\tthis._contexts.clear();\n\n\t\tlet basePath = '';\n\t\tconst ancestorMatches: IRouteMatch[] = [];\n\t\tconst accumulatedParams: Record<string, string> = {};\n\n\t\tfor (let i = 0; i < result.matches.length; i++) {\n\t\t\tconst match = result.matches[i];\n\t\t\tancestorMatches.push(match);\n\t\t\tObject.assign(accumulatedParams, match.params);\n\n\t\t\tconst context: IRouteContext = {\n\t\t\t\tdepth: i,\n\t\t\t\troutes: match.children ?? [],\n\t\t\t\tcurrentMatch: match,\n\t\t\t\tancestorMatches: [...ancestorMatches],\n\t\t\t\tparams: { ...accumulatedParams },\n\t\t\t\tremainingPath: match.remainingPath,\n\t\t\t\tbasePath: basePath,\n\t\t\t\tparent: i > 0 ? this._contexts.get(i - 1) : undefined\n\t\t\t};\n\n\t\t\tthis._contexts.set(i, context);\n\t\t\tbasePath = match.fullPath;\n\t\t}\n\t}\n\n\tsetResolvedData(depth: number, data: Record<string, unknown>): void {\n\t\tthis._resolvedData.set(depth, data);\n\t}\n\n\tclearResolvedData(): void {\n\t\tthis._resolvedData.clear();\n\t}\n\n\tgetContextForDepth(depth: number): IRouteContext | undefined {\n\t\treturn this._contexts.get(depth);\n\t}\n\n\tgetChildRoutesForDepth(depth: number): IRoute[] {\n\t\tconst parentContext = this._contexts.get(depth - 1);\n\n\t\tif (depth === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn parentContext?.currentMatch?.children ?? [];\n\t}\n\n\tgetRemainingPathForDepth(depth: number): string {\n\t\tif (depth === 0) {\n\t\t\treturn window.location.pathname;\n\t\t}\n\n\t\tconst parentContext = this._contexts.get(depth - 1);\n\n\t\treturn parentContext?.remainingPath ?? '';\n\t}\n\n\tgetParamsForDepth(depth: number): Record<string, string> {\n\t\tconst context = this._contexts.get(depth);\n\t\treturn context?.params ?? {};\n\t}\n\n\tgetCurrentParams(): Record<string, string> {\n\t\treturn this._currentMatchResult?.params ?? {};\n\t}\n\n\tgetMatchStack(): IRouteMatch[] {\n\t\treturn [...this._matchStack];\n\t}\n\n\tgetCurrentMatchResult(): IRouteMatchResult | null {\n\t\treturn this._currentMatchResult;\n\t}\n\n\tgetMergedRouteData(depth?: number): Record<string, unknown> {\n\t\tconst maxDepth = depth ?? this._matchStack.length - 1;\n\t\tconst merged: Record<string, unknown> = {};\n\n\t\tfor (let i = 0; i <= maxDepth && i < this._matchStack.length; i++) {\n\t\t\tconst match = this._matchStack[i];\n\t\t\tif (match.route.data) {\n\t\t\t\tObject.assign(merged, match.route.data);\n\t\t\t}\n\t\t}\n\n\t\treturn merged;\n\t}\n\n\tgetMergedResolvedData(depth?: number): Record<string, unknown> {\n\t\tconst maxDepth = depth ?? this._matchStack.length - 1;\n\t\tconst merged: Record<string, unknown> = {};\n\n\t\tfor (let i = 0; i <= maxDepth; i++) {\n\t\t\tconst data = this._resolvedData.get(i);\n\t\t\tif (data) {\n\t\t\t\tObject.assign(merged, data);\n\t\t\t}\n\t\t}\n\n\t\treturn merged;\n\t}\n\n\tgetResolvedDataForDepth(depth: number): Record<string, unknown> | undefined {\n\t\treturn this._resolvedData.get(depth);\n\t}\n}\n","import { Injectable } from '../../injection/decorators/injectable.decorator';\nimport type { IRouterEventState } from '../interfaces/irouter-event-state.interface';\nimport type { IRouteGuard } from '../interfaces/iroute-guard.interface';\nimport type { IRouteResolver } from '../interfaces/iroute-resolver.interface';\nimport type { RouterStateEvent } from '../types/router-state-event.type';\nimport { RouteContextService } from './route-context.service';\nimport type { IResolverContext } from '../interfaces/iresolver-context.interface';\nimport type { AsyncGuardResult } from '../types/guard-result.type';\nimport type { IGuardContext } from '../interfaces/iguard-context.interface';\nimport type { INavigationOptions } from '../interfaces/inavigation-options.interface';\nimport type { INavigationResult } from '../interfaces/inavigation-result.interface';\nimport type { IRoute } from '../interfaces/iroute.interface';\nimport type { IRouteMatch } from '../interfaces/iroute-match.interface';\nimport type { IRouteMatchResult } from '../interfaces/iroute-match-result.interface';\nimport { matchRouteTree } from '../functions/match-route-tree.function';\nimport { buildPathFromRoute } from '../functions/build-path-from-route.function';\n\nconst routerStateEvent = (type: RouterStateEvent, data: unknown, title: string, url: string): PopStateEvent => {\n\treturn new PopStateEvent('History', {\n\t\tstate: {\n\t\t\ttype: type,\n\t\t\tdata: data,\n\t\t\turl: url,\n\t\t\thost: window.location.host,\n\t\t\thostName: window.location.hostname,\n\t\t\thref: window.location.href,\n\t\t\tpathName: window.location.pathname,\n\t\t\tport: window.location.port,\n\t\t\tprotocol: window.location.protocol,\n\t\t\tparams: new URLSearchParams(window.location.search),\n\t\t\ttitle: title\n\t\t} as IRouterEventState\n\t});\n};\n\n// monkey-patch history methods to emit NavigationEvent\nconst pushState = history.pushState;\nhistory.pushState = (data: unknown, title: string, url?: string | URL | null): void => {\n\tpushState.apply(history, [data, title, url]);\n\n\tconst navigationEvent = new CustomEvent('NavigationEvent', {\n\t\tdetail: routerStateEvent('push', data, title, url as string)\n\t});\n\twindow.dispatchEvent(navigationEvent);\n};\n\nconst replaceState = history.replaceState;\nhistory.replaceState = (data: unknown, title: string, url?: string | URL | null): void => {\n\treplaceState.apply(history, [data, title, url]);\n\n\tconst navigationEvent = new CustomEvent('NavigationEvent', {\n\t\tdetail: routerStateEvent('replace', data, title, url as string)\n\t});\n\twindow.dispatchEvent(navigationEvent);\n};\n\n@Injectable()\nexport class RouterService {\n\tprivate _route: IRouterEventState | undefined;\n\tprivate _routes: IRoute[] = [];\n\tprivate _contextService: RouteContextService;\n\tprivate _currentMatches: IRouteMatch[] = [];\n\tprivate _resolversExecutedForPath: string | null = null;\n\tprivate _currentPath: string = `${window.location.pathname}${window.location.search}`;\n\n\tconstructor() {\n\t\tthis._contextService = new RouteContextService();\n\n\t\twindow.addEventListener('NavigationEvent', (event: Event) => {\n\t\t\tthis._route = ((event as CustomEvent).detail as PopStateEvent).state;\n\t\t});\n\n\t\twindow.addEventListener('popstate', (event: PopStateEvent) => {\n\t\t\tvoid this.handlePopState(event);\n\t\t});\n\t}\n\n\tsetRoutes(routes: IRoute[]): void {\n\t\tthis._routes = routes;\n\t}\n\n\tgetRoutes(): IRoute[] {\n\t\treturn this._routes;\n\t}\n\n\tgetContextService(): RouteContextService {\n\t\treturn this._contextService;\n\t}\n\n\tgetRoute(): IRouterEventState | undefined {\n\t\treturn this._route;\n\t}\n\n\tgetParams(): Record<string, string> {\n\t\treturn this._contextService.getCurrentParams();\n\t}\n\n\tgetParam(name: string): string | undefined {\n\t\treturn this._contextService.getCurrentParams()[name];\n\t}\n\n\tgetQueryParams(): URLSearchParams {\n\t\treturn new URLSearchParams(window.location.search);\n\t}\n\n\tgetCurrentMatches(): IRouteMatch[] {\n\t\treturn [...this._currentMatches];\n\t}\n\n\tgetRouteData(depth?: number): Record<string, unknown> {\n\t\treturn this._contextService.getMergedRouteData(depth);\n\t}\n\n\tgetResolvedData(depth?: number): Record<string, unknown> {\n\t\treturn this._contextService.getMergedResolvedData(depth);\n\t}\n\n\tmatchPath(path: string): IRouteMatchResult {\n\t\treturn matchRouteTree(this._routes, path);\n\t}\n\n\tsetCurrentMatches(result: IRouteMatchResult): void {\n\t\tthis._currentMatches = result.matches;\n\t\tthis._contextService.setMatchResult(result);\n\t}\n\n\tasync runResolvers(matchResult: IRouteMatchResult): Promise<{ success: boolean; error?: string }> {\n\t\tconst currentPath = `${window.location.pathname}${window.location.search}`;\n\n\t\tif (this._resolversExecutedForPath === currentPath) {\n\t\t\tthis._resolversExecutedForPath = null; // Clear for next navigation\n\t\t\treturn { success: true };\n\t\t}\n\n\t\tconst result = await this.runResolversInternal(matchResult);\n\t\tthis._resolversExecutedForPath = null; // Clear after execution\n\t\treturn result;\n\t}\n\n\tasync navigate(path: string, options: INavigationOptions = {}): Promise<INavigationResult> {\n\t\tconst { data, replace = false, queryParams, skipGuards = false, skipResolvers = false, scrollToTop = true } = options;\n\n\t\tlet fullPath = path;\n\t\tif (queryParams && Object.keys(queryParams).length > 0) {\n\t\t\tconst params = new URLSearchParams(queryParams);\n\t\t\tfullPath = `${path}?${params.toString()}`;\n\t\t}\n\n\t\tif (!skipGuards && this._currentMatches.length > 0) {\n\t\t\tconst deactivateResult = await this.runDeactivationGuards(fullPath);\n\t\t\tif (deactivateResult !== true) {\n\t\t\t\tif (typeof deactivateResult === 'string') {\n\t\t\t\t\treturn this.navigate(deactivateResult, { ...options, skipGuards: true });\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: 'Navigation blocked by guard'\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst matchResult = this.matchPath(path);\n\n\t\tif (matchResult.redirectTo) {\n\t\t\treturn this.navigate(matchResult.redirectTo, { ...options, replace: true });\n\t\t}\n\n\t\tif (!skipGuards && matchResult.matches.length > 0) {\n\t\t\tconst guardResult = await this.runGuards(matchResult);\n\n\t\t\tif (guardResult !== true) {\n\t\t\t\tif (typeof guardResult === 'string') {\n\t\t\t\t\treturn this.navigate(guardResult, { ...options, skipGuards: true });\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: 'Navigation blocked by guard'\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!skipResolvers && matchResult.matches.length > 0) {\n\t\t\tconst resolverResult = await this.runResolversInternal(matchResult);\n\n\t\t\tif (!resolverResult.success) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: resolverResult.error ?? 'Navigation blocked by resolver'\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis._resolversExecutedForPath = fullPath;\n\t\t}\n\n\t\tif (replace) {\n\t\t\thistory.replaceState(data, '', fullPath);\n\t\t} else {\n\t\t\thistory.pushState(data, '', fullPath);\n\t\t}\n\t\tthis._currentPath = fullPath;\n\n\t\tif (scrollToTop) {\n\t\t\tconst hash = fullPath.includes('#') ? fullPath.split('#')[1] : null;\n\t\t\tif (hash) {\n\t\t\t\tconst element = document.getElementById(hash);\n\t\t\t\tif (element) {\n\t\t\t\t\telement.scrollIntoView();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twindow.scrollTo(0, 0);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\turl: fullPath\n\t\t};\n\t}\n\n\tasync navigateByName(name: string, params: Record<string, string> = {}, options: INavigationOptions = {}): Promise<INavigationResult> {\n\t\tconst path = buildPathFromRoute(this._routes, name, params);\n\n\t\tif (!path) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Route with name '${name}' not found`\n\t\t\t};\n\t\t}\n\n\t\treturn this.navigate(path, options);\n\t}\n\n\treplace(path: string, data?: unknown): void {\n\t\thistory.replaceState(data, '', path);\n\t\tthis._currentPath = `${window.location.pathname}${window.location.search}`;\n\t}\n\n\tback(): void {\n\t\thistory.back();\n\t}\n\n\tforward(): void {\n\t\thistory.forward();\n\t}\n\n\tgo(delta: number): void {\n\t\thistory.go(delta);\n\t}\n\n\tasync runDeactivationGuards(targetPath: string): Promise<boolean | string> {\n\t\tfor (const match of this._currentMatches) {\n\t\t\tconst guards = match.route.canDeactivate ?? [];\n\n\t\t\tfor (const guard of guards) {\n\t\t\t\tconst context = this.createGuardContext(match, {\n\t\t\t\t\tmatches: this._currentMatches,\n\t\t\t\t\tparams: this._contextService.getCurrentParams(),\n\t\t\t\t\tisExactMatch: true\n\t\t\t\t});\n\t\t\t\tcontext.targetPath = targetPath;\n\n\t\t\t\tconst result = await this.executeGuard(guard, 'canDeactivate', context);\n\n\t\t\t\tif (result !== true) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate async runGuards(matchResult: IRouteMatchResult): Promise<boolean | string> {\n\t\tfor (const match of matchResult.matches) {\n\t\t\tconst guards = match.route.canActivate ?? [];\n\n\t\t\tfor (const guard of guards) {\n\t\t\t\tconst context = this.createGuardContext(match, matchResult);\n\t\t\t\tconst result = await this.executeGuard(guard, 'canActivate', context);\n\n\t\t\t\tif (result !== true) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate async executeGuard(guard: IRouteGuard, method: 'canActivate' | 'canDeactivate', context: IGuardContext): Promise<boolean | string> {\n\t\tconst fn = guard[method];\n\t\tif (!fn) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result: AsyncGuardResult = fn.call(guard, context);\n\t\t\treturn result instanceof Promise ? await result : result;\n\t\t} catch (error) {\n\t\t\tconsole.error(`Guard error:`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate createGuardContext(match: IRouteMatch, matchResult: IRouteMatchResult): IGuardContext {\n\t\treturn {\n\t\t\troute: match,\n\t\t\tmatchedRoutes: matchResult.matches,\n\t\t\tparams: matchResult.params,\n\t\t\tqueryParams: new URLSearchParams(window.location.search),\n\t\t\ttargetPath: window.location.pathname,\n\t\t\tcurrentPath: window.location.pathname,\n\t\t\tdata: match.route.data\n\t\t};\n\t}\n\n\tprivate async runResolversInternal(matchResult: IRouteMatchResult): Promise<{ success: boolean; error?: string }> {\n\t\tthis._contextService.clearResolvedData();\n\n\t\tfor (let depth = 0; depth < matchResult.matches.length; depth++) {\n\t\t\tconst match = matchResult.matches[depth];\n\t\t\tconst resolvers = match.route.resolve;\n\n\t\t\tif (!resolvers) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst resolvedData: Record<string, unknown> = {};\n\t\t\tconst context = this.createResolverContext(match, matchResult);\n\n\t\t\tfor (const [key, resolver] of Object.entries(resolvers)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this.executeResolver(resolver, context);\n\t\t\t\t\tresolvedData[key] = result;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Resolver '${key}' failed:`, error);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: `Resolver '${key}' failed: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._contextService.setResolvedData(depth, resolvedData);\n\t\t}\n\n\t\treturn { success: true };\n\t}\n\n\tprivate async handlePopState(event: PopStateEvent): Promise<void> {\n\t\tconst targetPath = `${window.location.pathname}${window.location.search}`;\n\t\tconst guardResult = await this.runDeactivationGuards(targetPath);\n\n\t\tif (guardResult !== true) {\n\t\t\tif (typeof guardResult === 'string') {\n\t\t\t\tawait this.navigate(guardResult, { replace: true, skipGuards: true });\n\t\t\t} else {\n\t\t\t\thistory.replaceState(event.state, '', this._currentPath);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._currentPath = targetPath;\n\t\tconst navigationEvent = new CustomEvent('NavigationEvent', {\n\t\t\tdetail: routerStateEvent('push', event.state, '', window.location.pathname)\n\t\t});\n\t\twindow.dispatchEvent(navigationEvent);\n\t}\n\n\tprivate async executeResolver(resolver: IRouteResolver, context: IResolverContext): Promise<unknown> {\n\t\tconst result = resolver.resolve(context);\n\t\treturn result instanceof Promise ? await result : result;\n\t}\n\n\tprivate createResolverContext(match: IRouteMatch, matchResult: IRouteMatchResult): IResolverContext {\n\t\treturn {\n\t\t\troute: match,\n\t\t\tmatchedRoutes: matchResult.matches,\n\t\t\tparams: matchResult.params,\n\t\t\tqueryParams: new URLSearchParams(window.location.search),\n\t\t\ttargetPath: window.location.pathname\n\t\t};\n\t}\n}\n","import type { AttributeDirectiveFunction } from '../types/attribute-directive-function.type';\n\nconst directiveRegistry = new Map<string, AttributeDirectiveFunction>();\n\nconst findAttributeDirective = (name: string): AttributeDirectiveFunction | undefined => {\n\tif (directiveRegistry.has(name)) {\n\t\treturn directiveRegistry.get(name);\n\t}\n\n\tconst lowerName = name.toLowerCase();\n\tfor (const [key, value] of directiveRegistry) {\n\t\tif (key.toLowerCase() === lowerName) {\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport function registerAttributeDirective(name: string, directive: AttributeDirectiveFunction): void {\n\tdirectiveRegistry.set(name, directive);\n}\n\nexport function getAttributeDirective(name: string): AttributeDirectiveFunction | undefined {\n\treturn findAttributeDirective(name);\n}\n\nexport function hasAttributeDirective(name: string): boolean {\n\treturn findAttributeDirective(name) !== undefined;\n}\n\nexport function unregisterAttributeDirective(name: string): boolean {\n\treturn directiveRegistry.delete(name);\n}\n\nexport function getRegisteredDirectives(): string[] {\n\treturn Array.from(directiveRegistry.keys());\n}\n","import type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\nexport function isDirective(value: unknown): value is IDirectiveResult {\n\treturn typeof value === 'object' && value !== null && '__directive' in value;\n}\n","import { getAttributeDirective } from '../directives/functions/attribute-directive.functions';\nimport type { ITemplatePart } from '../interfaces/itemplate-part.interface';\nimport type { ITemplateCache, IPartPath } from '../interfaces/itemplate-cache.interface';\nimport { isDirective } from '../directives/functions/is-directive.function';\n\n// Unique marker for identifying dynamic positions\nconst MARKER = `m${Math.random().toString(36).slice(2, 9)}`;\nconst COMMENT_NODE_MARKER = `<!--${MARKER}-->`;\nconst ATTRIBUTE_MARKER_PREFIX = `__${MARKER}_`;\nconst ATTRIBUTE_MARKER_REGEX = new RegExp(`${ATTRIBUTE_MARKER_PREFIX}(\\\\d+)__`, 'g');\n\nconst createAttributeMarker = (index: number): string => `${ATTRIBUTE_MARKER_PREFIX}${index}__`;\n\nconst templateCache = new Map<string, ITemplateCache>();\n\n// Cache template keys by TemplateStringsArray identity to avoid repeated string joins\nconst templateKeyCache = new WeakMap<TemplateStringsArray, string>();\n\n/**\n * Get or create a cache key for the template strings array.\n * Uses WeakMap to cache by object identity, avoiding expensive string joins on repeated renders.\n */\nfunction getTemplateKey(strings: TemplateStringsArray): string {\n\tlet key = templateKeyCache.get(strings);\n\tif (key === undefined) {\n\t\tkey = strings.join(MARKER);\n\t\ttemplateKeyCache.set(strings, key);\n\t}\n\treturn key;\n}\n\nexport class TemplateResult {\n\tstrings: TemplateStringsArray;\n\tvalues: unknown[];\n\n\tconstructor(strings: TemplateStringsArray, values: unknown[]) {\n\t\tthis.strings = strings;\n\t\tthis.values = values;\n\t}\n\n\t/**\n\t * Optimized render for single-use containers (like repeat items).\n\t * Returns the rendered nodes directly.\n\t */\n\trenderOnce(container: DocumentFragment): Node[] {\n\t\tconst templateKey = getTemplateKey(this.strings);\n\t\tconst cache = this.getTemplate(templateKey);\n\t\tconst clone = cache.element.content.cloneNode(true);\n\t\tconst parts = this.prepareParts(clone, cache);\n\n\t\tthis.commit(parts);\n\t\tcontainer.appendChild(clone);\n\n\t\t(container as any).__parts = parts;\n\t\t(container as any).__templateKey = templateKey;\n\n\t\treturn Array.from(container.childNodes);\n\t}\n\n\trenderInto(container: Element | DocumentFragment): void {\n\t\tconst templateKey = getTemplateKey(this.strings);\n\n\t\t// Get or create template\n\t\tconst { element: template } = this.getTemplate(templateKey);\n\n\t\t// First render - clone and prepare\n\t\tconst existingKey = (container as any).__templateKey as string | undefined;\n\t\tif (existingKey && existingKey !== templateKey) {\n\t\t\tconst existingParts = (container as any).__parts as ITemplatePart[] | undefined;\n\t\t\tif (existingParts) {\n\t\t\t\tthis.cleanupParts(existingParts);\n\t\t\t}\n\t\t\tdelete (container as any).__parts;\n\t\t}\n\n\t\tif (!(container as any).__parts) {\n\t\t\tconst clone = template.content.cloneNode(true);\n\t\t\tconst parts = this.prepareParts(clone, this.getTemplate(templateKey));\n\n\t\t\t(container as any).__parts = parts;\n\t\t\t(container as any).__templateKey = templateKey;\n\n\t\t\t// Commit values BEFORE appending to DOM so attributes are set\n\t\t\t// before connectedCallback fires on child custom elements\n\t\t\tthis.commit(parts);\n\n\t\t\tcontainer.textContent = '';\n\t\t\tcontainer.appendChild(clone);\n\t\t\treturn;\n\t\t}\n\n\t\t// Update values\n\t\tif (!(container as any).__templateKey) {\n\t\t\t(container as any).__templateKey = templateKey;\n\t\t}\n\t\tconst parts = (container as any).__parts as ITemplatePart[];\n\t\tthis.commit(parts);\n\t}\n\n\tprivate getTemplate(key: string): ITemplateCache {\n\t\tlet cached = templateCache.get(key);\n\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst parts: ITemplatePart[] = [];\n\t\tlet html = this.strings[0];\n\n\t\tconst attrPreProcessor = this.getAttributePreProcessor(parts);\n\t\tlet activeAttributeName: string | null = null;\n\t\tlet activeAttributeQuote: string | null = null;\n\n\t\tfor (let i = 1; i < this.strings.length; i++) {\n\t\t\tconst s = this.strings[i];\n\t\t\tconst valueIndex = i - 1;\n\n\t\t\tconst match = /([@.:]?[\\w:-]+)\\s*=\\s*[\"']?$/.exec(html);\n\t\t\tconst quotedAttrMatch = /([@.:]?[\\w:-]+)\\s*=\\s*([\"'])([^\"']*)$/.exec(html);\n\t\t\tlet attrKey: string = '___';\n\n\t\t\tif (activeAttributeName) {\n\t\t\t\thtml += createAttributeMarker(valueIndex);\n\t\t\t} else {\n\t\t\t\tconst quotedName = quotedAttrMatch?.[1];\n\t\t\t\tconst quotedPrefix = quotedName?.charAt(0);\n\t\t\t\tconst hasSpecialPrefix = quotedPrefix !== undefined && Object.keys(attrPreProcessor).includes(quotedPrefix);\n\n\t\t\t\tif (quotedAttrMatch && !hasSpecialPrefix) {\n\t\t\t\t\thtml += createAttributeMarker(valueIndex);\n\t\t\t\t\tactiveAttributeName = quotedAttrMatch[1];\n\t\t\t\t\tactiveAttributeQuote = quotedAttrMatch[2];\n\t\t\t\t} else {\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tattrKey = '__';\n\t\t\t\t\t\tconst attrPrefix: string = match[1].charAt(0);\n\n\t\t\t\t\t\tif (Object.keys(attrPreProcessor).includes(attrPrefix)) {\n\t\t\t\t\t\t\tattrKey = attrPrefix;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attrKey === '__' && match) {\n\t\t\t\t\t\thtml += createAttributeMarker(valueIndex);\n\t\t\t\t\t\tactiveAttributeName = match[1];\n\t\t\t\t\t\tconst quoteMatch = /([\"'])$/.exec(match[0]);\n\t\t\t\t\t\tactiveAttributeQuote = quoteMatch ? quoteMatch[1] : null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml = attrPreProcessor[attrKey](valueIndex, html, match ? match[1] : undefined, match);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\thtml += s;\n\n\t\t\tif (activeAttributeName) {\n\t\t\t\tif (activeAttributeQuote) {\n\t\t\t\t\tif (s.includes(activeAttributeQuote)) {\n\t\t\t\t\t\tactiveAttributeName = null;\n\t\t\t\t\t\tactiveAttributeQuote = null;\n\t\t\t\t\t}\n\t\t\t\t} else if (/[\\s>]/.test(s)) {\n\t\t\t\t\tactiveAttributeName = null;\n\t\t\t\t\tactiveAttributeQuote = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst element = document.createElement('template');\n\t\telement.innerHTML = html;\n\n\t\t// Pre-compute part paths by walking template DOM once\n\t\tconst partPaths: IPartPath[] = [];\n\t\tlet nodePartCursor = 0;\n\n\t\t// Build lookup for node parts by index order\n\t\tconst nodeParts: ITemplatePart[] = [];\n\t\tconst eventPartsByIndex = new Map<number, ITemplatePart>();\n\t\tconst propertyPartsByIndex = new Map<number, ITemplatePart>();\n\t\tconst actionPartsByIndex = new Map<number, ITemplatePart>();\n\n\t\tfor (const part of parts) {\n\t\t\tswitch (part.type) {\n\t\t\t\tcase 'event':\n\t\t\t\t\teventPartsByIndex.set(part.index, part);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'property':\n\t\t\t\t\tpropertyPartsByIndex.set(part.index, part);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'action':\n\t\t\t\t\tactionPartsByIndex.set(part.index, part);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'node':\n\t\t\t\t\tnodeParts.push(part);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Walk template content once to record paths\n\t\tconst walkTemplate = (node: Node, path: number[]) => {\n\t\t\tif (node.nodeType === Node.COMMENT_NODE) {\n\t\t\t\tconst comment = node as Comment;\n\t\t\t\tif (comment.data === MARKER) {\n\t\t\t\t\tconst part = nodeParts[nodePartCursor++];\n\t\t\t\t\tif (part) {\n\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\ttype: 'node',\n\t\t\t\t\t\t\tindex: part.index\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst el = node as Element;\n\n\t\t\t\t// Check attributes for markers\n\t\t\t\tfor (let i = el.attributes.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst attr = el.attributes[i];\n\n\t\t\t\t\tif (attr.name.startsWith('__event-')) {\n\t\t\t\t\t\tconst index = parseInt(attr.name.match(/__event-(\\d+)__/)?.[1] || '0');\n\t\t\t\t\t\tconst part = eventPartsByIndex.get(index);\n\t\t\t\t\t\tif (part) {\n\t\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\t\ttype: 'event',\n\t\t\t\t\t\t\t\tindex: part.index,\n\t\t\t\t\t\t\t\tname: part.name\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (attr.name.startsWith('__prop-')) {\n\t\t\t\t\t\tconst index = parseInt(attr.name.match(/__prop-(\\d+)__/)?.[1] || '0');\n\t\t\t\t\t\tconst part = propertyPartsByIndex.get(index);\n\t\t\t\t\t\tif (part) {\n\t\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\t\ttype: 'property',\n\t\t\t\t\t\t\t\tindex: part.index,\n\t\t\t\t\t\t\t\tname: part.name\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (attr.name.startsWith('__action-')) {\n\t\t\t\t\t\tconst index = parseInt(attr.name.match(/__action-(\\d+)__/)?.[1] || '0');\n\t\t\t\t\t\tconst part = actionPartsByIndex.get(index);\n\t\t\t\t\t\tif (part) {\n\t\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\t\ttype: 'action',\n\t\t\t\t\t\t\t\tindex: part.index,\n\t\t\t\t\t\t\t\tname: part.name\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (attr.name.startsWith(':')) {\n\t\t\t\t\t\t// Static action directive\n\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\ttype: 'action',\n\t\t\t\t\t\t\tindex: -1,\n\t\t\t\t\t\t\tname: attr.name.slice(1),\n\t\t\t\t\t\t\tstaticValue: attr.value\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (attr.value.includes(ATTRIBUTE_MARKER_PREFIX)) {\n\t\t\t\t\t\tconst attributeInfo = this.parseAttributeValue(attr.value);\n\t\t\t\t\t\tif (attributeInfo) {\n\t\t\t\t\t\t\tconst isComposite = attributeInfo.indices.length > 1 || attributeInfo.strings.some((s) => s.length > 0);\n\t\t\t\t\t\t\tpartPaths.push({\n\t\t\t\t\t\t\t\tpath: [...path],\n\t\t\t\t\t\t\t\ttype: 'attribute',\n\t\t\t\t\t\t\t\tindex: attributeInfo.indices[0],\n\t\t\t\t\t\t\t\tname: attr.name,\n\t\t\t\t\t\t\t\tattributeStrings: isComposite ? attributeInfo.strings : undefined,\n\t\t\t\t\t\t\t\tattributeIndices: isComposite ? attributeInfo.indices : undefined\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Walk children\n\t\t\tconst children = node.childNodes;\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tpath.push(i);\n\t\t\t\twalkTemplate(children[i], path);\n\t\t\t\tpath.pop();\n\t\t\t}\n\t\t};\n\n\t\twalkTemplate(element.content, []);\n\n\t\tcached = { element, parts, partPaths };\n\t\tif (templateCache.size >= 500) {\n\t\t\tconst oldestKey = templateCache.keys().next().value;\n\t\t\tif (oldestKey) {\n\t\t\t\ttemplateCache.delete(oldestKey);\n\t\t\t}\n\t\t}\n\t\ttemplateCache.set(key, cached);\n\n\t\treturn cached;\n\t}\n\n\tprivate getAttributePreProcessor(\n\t\tparts: ITemplatePart[]\n\t): Record<string, (index: number, html: string, attrName?: string, match?: RegExpExecArray | null) => string> {\n\t\treturn {\n\t\t\t'@': (index: number, html: string, attrName?: string, match?: RegExpExecArray | null) => {\n\t\t\t\t// Event binding\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'event',\n\t\t\t\t\tindex: index,\n\t\t\t\t\tname: attrName?.slice(1)\n\t\t\t\t});\n\t\t\t\treturn html.slice(0, -(match?.[0].length ?? 0)) + `__event-${index}__=\"\"`;\n\t\t\t},\n\t\t\t'.': (index: number, html: string, attrName?: string, match?: RegExpExecArray | null) => {\n\t\t\t\t// Property binding\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'property',\n\t\t\t\t\tindex: index,\n\t\t\t\t\tname: attrName?.slice(1)\n\t\t\t\t});\n\t\t\t\treturn html.slice(0, -(match?.[0].length ?? 0)) + `__prop-${index}__=\"\"`;\n\t\t\t},\n\t\t\t':': (index: number, html: string, attrName?: string, match?: RegExpExecArray | null) => {\n\t\t\t\t// Action directive binding\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'action',\n\t\t\t\t\tindex: index,\n\t\t\t\t\tname: attrName?.slice(1)\n\t\t\t\t});\n\t\t\t\treturn html.slice(0, -(match?.[0].length ?? 0)) + `__action-${index}__=\"\"`;\n\t\t\t},\n\t\t\t'__': (index: number, html: string, _?: string) => {\n\t\t\t\t// Regular attribute\n\t\t\t\treturn html + createAttributeMarker(index);\n\t\t\t},\n\t\t\t'___': (index: number, html: string) => {\n\t\t\t\t// Text position\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'node',\n\t\t\t\t\tindex: index\n\t\t\t\t});\n\t\t\t\treturn html + COMMENT_NODE_MARKER;\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate prepareParts(clone: Node, cache: ITemplateCache): ITemplatePart[] {\n\t\tconst parts: ITemplatePart[] = [];\n\t\tconst { partPaths } = cache;\n\n\t\t// Navigate directly to each part using pre-computed paths\n\t\tfor (const partPath of partPaths) {\n\t\t\t// Navigate to the node using the path\n\t\t\tlet node: Node = clone;\n\t\t\tfor (const index of partPath.path) {\n\t\t\t\tnode = node.childNodes[index];\n\t\t\t}\n\n\t\t\tif (partPath.type === 'node') {\n\t\t\t\t// Replace comment marker with text node\n\t\t\t\tconst textNode = document.createTextNode('');\n\t\t\t\tnode.parentNode!.replaceChild(textNode, node);\n\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'node',\n\t\t\t\t\tindex: partPath.index,\n\t\t\t\t\tnode: textNode\n\t\t\t\t});\n\t\t\t} else if (partPath.type === 'event') {\n\t\t\t\tconst element = node as Element;\n\t\t\t\telement.removeAttribute(`__event-${partPath.index}__`);\n\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'event',\n\t\t\t\t\tindex: partPath.index,\n\t\t\t\t\tname: partPath.name,\n\t\t\t\t\tnode: element\n\t\t\t\t});\n\t\t\t} else if (partPath.type === 'property') {\n\t\t\t\tconst element = node as Element;\n\t\t\t\telement.removeAttribute(`__prop-${partPath.index}__`);\n\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'property',\n\t\t\t\t\tindex: partPath.index,\n\t\t\t\t\tname: partPath.name,\n\t\t\t\t\tnode: element\n\t\t\t\t});\n\t\t\t} else if (partPath.type === 'action') {\n\t\t\t\tconst element = node as Element;\n\n\t\t\t\tif (partPath.index >= 0) {\n\t\t\t\t\telement.removeAttribute(`__action-${partPath.index}__`);\n\t\t\t\t} else {\n\t\t\t\t\t// Static action directive\n\t\t\t\t\telement.removeAttribute(`:${partPath.name}`);\n\t\t\t\t}\n\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'action',\n\t\t\t\t\tindex: partPath.index,\n\t\t\t\t\tname: partPath.name,\n\t\t\t\t\tnode: element,\n\t\t\t\t\tstaticValue: partPath.staticValue\n\t\t\t\t});\n\t\t\t} else if (partPath.type === 'attribute') {\n\t\t\t\tconst element = node as Element;\n\t\t\t\telement.removeAttribute(partPath.name!);\n\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: 'attribute',\n\t\t\t\t\tindex: partPath.index,\n\t\t\t\t\tname: partPath.name,\n\t\t\t\t\tnode: element,\n\t\t\t\t\tattributeStrings: partPath.attributeStrings,\n\t\t\t\t\tattributeIndices: partPath.attributeIndices\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\tprivate parseAttributeValue(value: string): { strings: string[]; indices: number[] } | null {\n\t\tconst strings: string[] = [];\n\t\tconst indices: number[] = [];\n\t\tlet lastIndex = 0;\n\t\tlet match: RegExpExecArray | null;\n\n\t\tATTRIBUTE_MARKER_REGEX.lastIndex = 0;\n\t\twhile ((match = ATTRIBUTE_MARKER_REGEX.exec(value)) !== null) {\n\t\t\tstrings.push(value.slice(lastIndex, match.index));\n\t\t\tindices.push(Number(match[1]));\n\t\t\tlastIndex = match.index + match[0].length;\n\t\t}\n\n\t\tif (indices.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tstrings.push(value.slice(lastIndex));\n\t\treturn { strings, indices };\n\t}\n\n\t/**\n\t * Sets up markers for a node part to enable complex content rendering\n\t */\n\tprivate ensureMarkers(part: ITemplatePart): void {\n\t\tif (part.startMarker) return; // Already set up\n\n\t\tconst parent = part.node!.parentNode;\n\t\tif (!parent) return;\n\n\t\tconst startMarker = document.createComment('part-start');\n\t\tconst endMarker = document.createComment('part-end');\n\n\t\tparent.insertBefore(startMarker, part.node!);\n\t\tparent.insertBefore(endMarker, part.node!.nextSibling);\n\n\t\tpart.startMarker = startMarker;\n\t\tpart.endMarker = endMarker;\n\t}\n\n\t/**\n\t * Clears previously rendered nodes between markers\n\t */\n\tprivate clearRenderedNodes(part: ITemplatePart): void {\n\t\tif (!part.renderedNodes || part.renderedNodes.length === 0) return;\n\n\t\tfor (const node of part.renderedNodes) {\n\t\t\tnode.parentNode?.removeChild(node);\n\t\t}\n\t\tpart.renderedNodes = [];\n\t\tpart.arrayState = undefined;\n\t}\n\n\tprivate cleanupParts(parts: ITemplatePart[]): void {\n\t\tfor (const part of parts) {\n\t\t\tif (part.actionCleanup) {\n\t\t\t\ttry {\n\t\t\t\t\tpart.actionCleanup();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Action directive cleanup failed:', error);\n\t\t\t\t} finally {\n\t\t\t\t\tpart.actionCleanup = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (part.renderedNodes && part.renderedNodes.length > 0) {\n\t\t\t\tthis.clearRenderedNodes(part);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders a nested TemplateResult into a node part\n\t */\n\tprivate renderNestedTemplate(part: ITemplatePart, template: TemplateResult): void {\n\t\tthis.ensureMarkers(part);\n\t\tthis.clearRenderedNodes(part);\n\n\t\t// Hide the original text node\n\t\tpart.node!.textContent = '';\n\n\t\tconst fragment = document.createDocumentFragment();\n\t\ttemplate.renderInto(fragment);\n\n\t\tconst nodes = Array.from(fragment.childNodes);\n\t\tpart.renderedNodes = nodes;\n\n\t\tconst parent = part.endMarker!.parentNode!;\n\t\tparent.insertBefore(fragment, part.endMarker!);\n\t}\n\n\t/**\n\t * Renders a DOM Node into a node part\n\t */\n\tprivate renderNode(part: ITemplatePart, node: Node): void {\n\t\tthis.ensureMarkers(part);\n\t\tthis.clearRenderedNodes(part);\n\n\t\t// Hide the original text node\n\t\tpart.node!.textContent = '';\n\n\t\tpart.renderedNodes = [node];\n\n\t\tconst parent = part.endMarker!.parentNode!;\n\t\tparent.insertBefore(node, part.endMarker!);\n\t}\n\n\t/**\n\t * Renders an array of values into a node part\n\t */\n\tprivate renderArray(part: ITemplatePart, values: unknown[]): void {\n\t\tthis.ensureMarkers(part);\n\n\t\t// Hide the original text node\n\t\tpart.node!.textContent = '';\n\n\t\tconst parent = part.endMarker!.parentNode!;\n\t\tconst keyedValues = this.getKeyedValues(values);\n\n\t\tif (keyedValues) {\n\t\t\tconst state = part.arrayState ?? {\n\t\t\t\titems: new Map<unknown, { key: unknown; value: unknown; container: DocumentFragment; nodes: Node[] }>(),\n\t\t\t\tkeys: []\n\t\t\t};\n\n\t\t\tconst newItems = new Map<unknown, { key: unknown; value: unknown; container: DocumentFragment; nodes: Node[] }>();\n\t\t\tconst newKeys: unknown[] = [];\n\n\t\t\tfor (const item of keyedValues) {\n\t\t\t\tconst existing = state.items.get(item.key);\n\t\t\t\tif (existing) {\n\t\t\t\t\tthis.updateArrayItem(existing, item.value, parent, part.endMarker!);\n\t\t\t\t\tnewItems.set(item.key, existing);\n\t\t\t\t} else {\n\t\t\t\t\tconst created = this.createArrayItem(item.value, parent, part.endMarker!);\n\t\t\t\t\tnewItems.set(item.key, {\n\t\t\t\t\t\tkey: item.key,\n\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\tcontainer: created.container,\n\t\t\t\t\t\tnodes: created.nodes\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tnewKeys.push(item.key);\n\t\t\t}\n\n\t\t\tfor (const [key, oldItem] of state.items.entries()) {\n\t\t\t\tif (!newItems.has(key)) {\n\t\t\t\t\tfor (const node of oldItem.nodes) {\n\t\t\t\t\t\tnode.parentNode?.removeChild(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet referenceNode = part.startMarker!.nextSibling;\n\t\t\tfor (const key of newKeys) {\n\t\t\t\tconst item = newItems.get(key)!;\n\t\t\t\tfor (const node of item.nodes) {\n\t\t\t\t\tif (node === referenceNode) {\n\t\t\t\t\t\treferenceNode = referenceNode?.nextSibling ?? null;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tparent.insertBefore(node, referenceNode ?? part.endMarker!);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpart.arrayState = {\n\t\t\t\titems: newItems,\n\t\t\t\tkeys: newKeys\n\t\t\t};\n\t\t\tpart.renderedNodes = newKeys.flatMap((key) => newItems.get(key)!.nodes);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearRenderedNodes(part);\n\t\tconst renderedNodes: Node[] = [];\n\n\t\tfor (const value of values) {\n\t\t\tif (value instanceof TemplateResult) {\n\t\t\t\tconst fragment = document.createDocumentFragment();\n\t\t\t\tvalue.renderInto(fragment);\n\t\t\t\tconst nodes = Array.from(fragment.childNodes);\n\t\t\t\trenderedNodes.push(...nodes);\n\t\t\t\tparent.insertBefore(fragment, part.endMarker!);\n\t\t\t} else if (value instanceof Node) {\n\t\t\t\trenderedNodes.push(value);\n\t\t\t\tparent.insertBefore(value, part.endMarker!);\n\t\t\t} else if (value !== null && value !== undefined) {\n\t\t\t\tconst textNode = document.createTextNode(String(value));\n\t\t\t\trenderedNodes.push(textNode);\n\t\t\t\tparent.insertBefore(textNode, part.endMarker!);\n\t\t\t}\n\t\t}\n\n\t\tpart.renderedNodes = renderedNodes;\n\t}\n\n\tprivate getKeyedValues(values: unknown[]): Array<{ key: unknown; value: unknown }> | null {\n\t\tif (values.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst keyedValues: Array<{ key: unknown; value: unknown }> = [];\n\t\tfor (const value of values) {\n\t\t\tif (value && typeof value === 'object' && (value as { __keyed?: boolean }).__keyed === true) {\n\t\t\t\tconst keyed = value as { key: unknown; value: unknown };\n\t\t\t\tkeyedValues.push({ key: keyed.key, value: keyed.value });\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn keyedValues;\n\t}\n\n\tprivate createArrayItem(value: unknown, parent: Node, endMarker: Comment): { container: DocumentFragment; nodes: Node[] } {\n\t\tconst container = document.createDocumentFragment();\n\t\tif (value instanceof TemplateResult) {\n\t\t\tvalue.renderInto(container);\n\t\t} else if (value instanceof Node) {\n\t\t\tcontainer.appendChild(value);\n\t\t} else if (value !== null && value !== undefined) {\n\t\t\tcontainer.appendChild(document.createTextNode(String(value)));\n\t\t}\n\n\t\tconst nodes = Array.from(container.childNodes);\n\t\tparent.insertBefore(container, endMarker);\n\t\treturn { container, nodes };\n\t}\n\n\tprivate updateArrayItem(\n\t\titem: { key: unknown; value: unknown; container: DocumentFragment; nodes: Node[] },\n\t\tvalue: unknown,\n\t\tparent: Node,\n\t\tendMarker: Comment\n\t): void {\n\t\tif (value instanceof TemplateResult) {\n\t\t\tvalue.renderInto(item.container);\n\t\t\titem.value = value;\n\t\t\titem.nodes = Array.from(item.container.childNodes);\n\t\t\treturn;\n\t\t}\n\n\t\tif (value === item.value) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const node of item.nodes) {\n\t\t\tnode.parentNode?.removeChild(node);\n\t\t}\n\n\t\titem.container = document.createDocumentFragment();\n\t\tif (value instanceof Node) {\n\t\t\titem.container.appendChild(value);\n\t\t} else if (value !== null && value !== undefined) {\n\t\t\titem.container.appendChild(document.createTextNode(String(value)));\n\t\t}\n\n\t\titem.nodes = Array.from(item.container.childNodes);\n\t\tparent.insertBefore(item.container, endMarker);\n\t\titem.value = value;\n\t}\n\n\tprivate commit(parts: ITemplatePart[]): void {\n\t\tfor (const part of parts) {\n\t\t\tconst value = this.values[part.index];\n\t\t\tconst isCompositeAttribute = part.type === 'attribute' && part.attributeIndices && part.attributeStrings;\n\n\t\t\t// Skip unchanged values (but not for directives or action parts - they manage their own state)\n\t\t\t// Action parts with index < 0 are static and have their own skip logic\n\t\t\tif (!isCompositeAttribute && !isDirective(value) && part.type !== 'action' && part.previousValue === value) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tswitch (part.type) {\n\t\t\t\tcase 'node':\n\t\t\t\t\tif (part.node) {\n\t\t\t\t\t\t// Handle directives\n\t\t\t\t\t\tif (isDirective(value)) {\n\t\t\t\t\t\t\tpart.directiveState = value.render(part.node, part.directiveState);\n\t\t\t\t\t\t} else if (value instanceof TemplateResult) {\n\t\t\t\t\t\t\t// Handle nested TemplateResult\n\t\t\t\t\t\t\tthis.renderNestedTemplate(part, value);\n\t\t\t\t\t\t} else if (value instanceof Node) {\n\t\t\t\t\t\t\t// Handle DOM Node\n\t\t\t\t\t\t\tthis.renderNode(part, value);\n\t\t\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\t\t\t// Handle arrays of values\n\t\t\t\t\t\t\tthis.renderArray(part, value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Clear any previously rendered complex content\n\t\t\t\t\t\t\tthis.clearRenderedNodes(part);\n\t\t\t\t\t\t\tpart.node.textContent = String(value ?? '');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'attribute':\n\t\t\t\t\tif (part.node && part.name) {\n\t\t\t\t\t\tconst element = part.node as Element;\n\t\t\t\t\t\t// Handle directives\n\t\t\t\t\t\tif (isDirective(value)) {\n\t\t\t\t\t\t\tpart.directiveState = value.render(element, part.directiveState);\n\t\t\t\t\t\t} else if (isCompositeAttribute) {\n\t\t\t\t\t\t\tconst strings = part.attributeStrings as string[];\n\t\t\t\t\t\t\tconst indices = part.attributeIndices as number[];\n\t\t\t\t\t\t\tlet composed = strings[0] ?? '';\n\n\t\t\t\t\t\t\tfor (let i = 0; i < indices.length; i++) {\n\t\t\t\t\t\t\t\tconst segmentValue = this.values[indices[i]];\n\t\t\t\t\t\t\t\tcomposed += `${segmentValue ?? ''}${strings[i + 1] ?? ''}`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (part.previousValue === composed) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (composed === '' && strings.every((segment) => segment === '')) {\n\t\t\t\t\t\t\t\telement.removeAttribute(part.name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telement.setAttribute(part.name, composed);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpart.previousValue = composed;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else if (value === null || value === undefined || value === false) {\n\t\t\t\t\t\t\t// Remove attribute for null, undefined, or false (boolean attributes)\n\t\t\t\t\t\t\telement.removeAttribute(part.name);\n\t\t\t\t\t\t} else if (value === true) {\n\t\t\t\t\t\t\t// Boolean true sets empty attribute (e.g., disabled=\"\")\n\t\t\t\t\t\t\telement.setAttribute(part.name, '');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telement.setAttribute(part.name, String(value));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'property':\n\t\t\t\t\tif (part.node && part.name) {\n\t\t\t\t\t\t// Handle directives\n\t\t\t\t\t\tif (isDirective(value)) {\n\t\t\t\t\t\t\tpart.directiveState = value.render(part.node as Element, part.directiveState);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t(part.node as any)[part.name] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'event':\n\t\t\t\t\tif (part.node && part.name) {\n\t\t\t\t\t\tconst element = part.node as Element;\n\n\t\t\t\t\t\tif (part.previousValue === value) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Remove old listener\n\t\t\t\t\t\tif (part.previousValue && typeof part.previousValue === 'function') {\n\t\t\t\t\t\t\telement.removeEventListener(part.name, part.previousValue as EventListener);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Add new listener\n\t\t\t\t\t\tif (typeof value === 'function') {\n\t\t\t\t\t\t\telement.addEventListener(part.name, value as EventListener);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'action':\n\t\t\t\t\tif (part.node && part.name) {\n\t\t\t\t\t\tconst element = part.node as Element;\n\n\t\t\t\t\t\t// Get directive value: dynamic (from values array) or static (from attribute)\n\t\t\t\t\t\tconst directiveValue = part.index >= 0 ? value : part.staticValue;\n\n\t\t\t\t\t\t// Skip if value hasn't changed (for dynamic values)\n\t\t\t\t\t\tif (part.index >= 0 && part.previousValue === directiveValue) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// For static directives, only run once (when actionCleanup is undefined)\n\t\t\t\t\t\tif (part.index < 0 && part.actionCleanup !== undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call previous cleanup if exists\n\t\t\t\t\t\tif (part.actionCleanup) {\n\t\t\t\t\t\t\tpart.actionCleanup();\n\t\t\t\t\t\t\tpart.actionCleanup = undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Look up directive from registry\n\t\t\t\t\t\tconst directive = getAttributeDirective(part.name);\n\t\t\t\t\t\tif (directive) {\n\t\t\t\t\t\t\tconst cleanup = directive(element, directiveValue, part.name);\n\t\t\t\t\t\t\tif (typeof cleanup === 'function') {\n\t\t\t\t\t\t\t\tpart.actionCleanup = cleanup;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Mark as initialized even without cleanup\n\t\t\t\t\t\t\t\tpart.actionCleanup = () => {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn(`Attribute directive ':${part.name}' not found in registry`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpart.previousValue = value;\n\t\t}\n\t}\n}\n","import { TemplateResult } from '../classes/template-result.class';\n\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult {\n\treturn new TemplateResult(strings, values);\n}\n\nexport const css = html;\n","import { MelodicComponent } from '../../../components/decorators/melodic-component.decorator';\nimport { Service } from '../../../injection/decorators/service.decorator';\nimport { RouterService } from '../../services/router.service';\nimport type { IRoute } from '../../interfaces/iroute.interface';\nimport type { IRouteContext } from '../../interfaces/iroute-context.interface';\nimport { html } from '../../../template/functions/html.function';\nimport { matchRouteTree } from '../../functions/match-route-tree.function';\nimport type { IRouteMatch } from '../../interfaces/iroute-match.interface';\nimport type { IRouteMatchResult } from '../../interfaces/iroute-match-result.interface';\n\n/**\n * Custom event for child outlets to request their context from parent.\n */\nconst OUTLET_REGISTER_EVENT = 'melodic:outlet-register';\n\n/**\n * Data passed when an outlet registers with its parent.\n */\ninterface IOutletRegistration {\n\toutlet: RouterOutletComponent;\n\tcallback: (context: IRouteContext) => void;\n}\n\n@MelodicComponent({\n\tselector: 'router-outlet',\n\ttemplate: () => html`<slot></slot>`\n})\nexport class RouterOutletComponent {\n\t@Service(RouterService) private _router!: RouterService;\n\n\tprivate _depth: number = 0;\n\tprivate _context: IRouteContext | null = null;\n\tprivate _currentComponent: string | null = null;\n\tprivate _currentElement: HTMLElement | null = null;\n\tprivate _childOutlets: Map<string, RouterOutletComponent> = new Map();\n\tprivate _parentOutlet: RouterOutletComponent | null = null;\n\tprivate _initialized = false;\n\tprivate _navigationCleanup: (() => void) | null = null;\n\n\tpublic routes: IRoute[] = [];\n\tpublic name: string = 'primary';\n\tpublic elementRef!: HTMLElement;\n\n\tonInit(): void {\n\t\tconst handler = () => this.onNavigate();\n\t\twindow.addEventListener('NavigationEvent', handler);\n\t\tthis._navigationCleanup = () => window.removeEventListener('NavigationEvent', handler);\n\n\t\tthis.elementRef.addEventListener(OUTLET_REGISTER_EVENT, ((event: CustomEvent<IOutletRegistration>) => {\n\t\t\tif (event.detail.outlet === this) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.stopPropagation();\n\t\t\tthis.registerChildOutlet(event.detail);\n\t\t}) as EventListener);\n\t}\n\n\tonCreate(): void {\n\t\tthis.findParentOutlet();\n\n\t\t// Defer initial render to allow property binding to complete\n\t\tqueueMicrotask(() => {\n\t\t\tthis._initialized = true;\n\n\t\t\t// If root outlet, register routes with router\n\t\t\tif (this._depth === 0 && this.routes.length > 0) {\n\t\t\t\tthis._router.setRoutes(this.routes);\n\t\t\t}\n\n\t\t\t// Register with parent if nested\n\t\t\tif (this._parentOutlet) {\n\t\t\t\tthis.requestContextFromParent();\n\t\t\t} else {\n\t\t\t\t// Root outlet - initiate routing\n\t\t\t\tthis.onNavigate();\n\t\t\t}\n\t\t});\n\t}\n\n\tonDestroy(): void {\n\t\tthis._navigationCleanup?.();\n\n\t\tif (this._parentOutlet) {\n\t\t\tthis._parentOutlet.unregisterChildOutlet(this.name);\n\t\t}\n\t}\n\n\tonPropertyChange(name: string): void {\n\t\tif (name === 'routes' && this._initialized) {\n\t\t\t// Routes changed - update router if root and re-render\n\t\t\tif (this._depth === 0) {\n\t\t\t\tthis._router.setRoutes(this.routes);\n\t\t\t}\n\t\t\tthis._currentComponent = null;\n\t\t\tthis.onNavigate();\n\t\t}\n\t}\n\n\tgetDepth(): number {\n\t\treturn this._depth;\n\t}\n\n\tgetContext(): IRouteContext | null {\n\t\treturn this._context;\n\t}\n\n\tprivate findParentOutlet(): void {\n\t\tlet element: Element | null = this.elementRef;\n\n\t\twhile (element) {\n\t\t\t// Check shadow DOM host\n\t\t\tconst root = element.getRootNode() as ShadowRoot;\n\t\t\tif (root instanceof ShadowRoot) {\n\t\t\t\telement = root.host;\n\n\t\t\t\t// Check if host contains a router-outlet (the parent)\n\t\t\t\tif (element.tagName.toLowerCase() !== 'router-outlet') {\n\t\t\t\t\tconst parentOutlet = element.shadowRoot?.querySelector('router-outlet');\n\t\t\t\t\tif (parentOutlet && parentOutlet !== this.elementRef) {\n\t\t\t\t\t\tthis._parentOutlet = (parentOutlet as any).component as RouterOutletComponent;\n\t\t\t\t\t\tthis._depth = (this._parentOutlet?._depth ?? -1) + 1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Regular DOM - look for parent outlet\n\t\t\t\tconst parentOutlet = element.closest?.('router-outlet');\n\t\t\t\tif (parentOutlet && parentOutlet !== this.elementRef) {\n\t\t\t\t\tthis._parentOutlet = (parentOutlet as any).component as RouterOutletComponent;\n\t\t\t\t\tthis._depth = (this._parentOutlet?._depth ?? -1) + 1;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// No parent found - this is root\n\t\tthis._depth = 0;\n\t}\n\n\t/**\n\t * Request context from parent outlet.\n\t */\n\tprivate requestContextFromParent(): void {\n\t\tconst event = new CustomEvent<IOutletRegistration>(OUTLET_REGISTER_EVENT, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toutlet: this,\n\t\t\t\tcallback: (context: IRouteContext) => this.receiveContext(context)\n\t\t\t}\n\t\t});\n\n\t\tthis.elementRef.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Register a child outlet.\n\t */\n\tprivate registerChildOutlet(registration: IOutletRegistration): void {\n\t\tthis._childOutlets.set(registration.outlet.name, registration.outlet);\n\n\t\t// Provide context to child if we have it\n\t\tif (this._context?.currentMatch?.children) {\n\t\t\tconst childContext = this.createChildContext();\n\t\t\tif (childContext) {\n\t\t\t\tregistration.callback(childContext);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate unregisterChildOutlet(name: string): void {\n\t\tthis._childOutlets.delete(name);\n\t}\n\n\tprivate receiveContext(context: IRouteContext): void {\n\t\tthis._context = context;\n\t\tthis.routes = context.routes;\n\t\tthis.renderFromContext();\n\t}\n\n\tprivate createChildContext(): IRouteContext | null {\n\t\tif (!this._context?.currentMatch) return null;\n\n\t\tconst match = this._context.currentMatch;\n\n\t\treturn {\n\t\t\tdepth: this._depth + 1,\n\t\t\troutes: match.children ?? [],\n\t\t\tcurrentMatch: undefined, // Will be set when child matches\n\t\t\tancestorMatches: [...this._context.ancestorMatches],\n\t\t\tparams: { ...this._context.params },\n\t\t\tremainingPath: match.remainingPath,\n\t\t\tbasePath: match.fullPath,\n\t\t\tparent: this._context\n\t\t};\n\t}\n\n\tprivate onNavigate(): void {\n\t\tif (!this._initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._depth === 0) {\n\t\t\t// Root outlet - perform full route matching\n\t\t\tthis.matchAndRender(window.location.pathname);\n\t\t}\n\n\t\t// Nested outlets wait for context from parent\n\t}\n\n\t/**\n\t * Match the current path and render (root outlet only).\n\t */\n\tprivate async matchAndRender(fullPath: string): Promise<void> {\n\t\tconst routes = this.routes.length > 0 ? this.routes : this._router.getRoutes();\n\n\t\tif (routes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst matchResult = matchRouteTree(routes, fullPath);\n\n\t\tif (matchResult.redirectTo) {\n\t\t\tif (window.location.pathname !== matchResult.redirectTo) {\n\t\t\t\tthis._router.navigate(matchResult.redirectTo, { replace: true });\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Run resolvers before rendering (for initial page load)\n\t\tif (matchResult.matches.length > 0) {\n\t\t\tconst resolverResult = await this._router.runResolvers(matchResult);\n\t\t\tif (!resolverResult.success) {\n\t\t\t\tconsole.error('Resolver failed:', resolverResult.error);\n\t\t\t\tawait this.render404();\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis._router.setCurrentMatches(matchResult);\n\n\t\tif (matchResult.matches.length > 0) {\n\t\t\tconst match = matchResult.matches[0];\n\n\t\t\tthis._context = {\n\t\t\t\tdepth: 0,\n\t\t\t\troutes: routes,\n\t\t\t\tcurrentMatch: match,\n\t\t\t\tancestorMatches: [match],\n\t\t\t\tparams: match.params,\n\t\t\t\tremainingPath: match.remainingPath,\n\t\t\t\tbasePath: '',\n\t\t\t\tparent: undefined\n\t\t\t};\n\n\t\t\tawait this.renderMatch(match, matchResult);\n\t\t} else {\n\t\t\tawait this.render404();\n\t\t}\n\t}\n\n\tprivate async renderFromContext(): Promise<void> {\n\t\tif (!this._context || this.routes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst remainingPath = this._context.remainingPath;\n\n\t\tconst matchResult = matchRouteTree(this.routes, remainingPath, this._context.basePath);\n\n\t\tif (matchResult.redirectTo) {\n\t\t\tconst fullRedirect = this._context.basePath ? `/${this._context.basePath}/${matchResult.redirectTo}`.replace(/\\/+/g, '/') : matchResult.redirectTo;\n\n\t\t\tif (window.location.pathname !== fullRedirect) {\n\t\t\t\tthis._router.navigate(fullRedirect, { replace: true });\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchResult.matches.length > 0) {\n\t\t\tconst match = matchResult.matches[0];\n\n\t\t\tthis._context = {\n\t\t\t\t...this._context,\n\t\t\t\tcurrentMatch: match,\n\t\t\t\tancestorMatches: [...this._context.ancestorMatches, match],\n\t\t\t\tparams: { ...this._context.params, ...match.params }\n\t\t\t};\n\n\t\t\tawait this.renderMatch(match, matchResult);\n\t\t} else {\n\t\t\tawait this.render404();\n\t\t}\n\t}\n\n\tprivate async renderMatch(match: IRouteMatch, _: IRouteMatchResult): Promise<void> {\n\t\tconst route = match.route;\n\n\t\tif (route.component === this._currentComponent) {\n\t\t\tthis.updateChildOutlets();\n\t\t\treturn;\n\t\t}\n\n\t\tif (route.loadChildren && !match.children) {\n\t\t\ttry {\n\t\t\t\tconst module = await route.loadChildren();\n\t\t\t\tmatch.children = module.routes;\n\t\t\t\troute.children = module.routes;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to load child routes:', error);\n\t\t\t\tawait this.render404();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (route.loadComponent) {\n\t\t\ttry {\n\t\t\t\tawait route.loadComponent();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to load component:', error);\n\t\t\t\tawait this.render404();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (route.component) {\n\t\t\tawait this.renderComponent(route.component);\n\t\t}\n\t}\n\n\tprivate async renderComponent(componentTag: string): Promise<void> {\n\t\tconst shadowRoot = this.elementRef.shadowRoot;\n\n\t\tif (!shadowRoot) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._currentElement) {\n\t\t\tthis._currentElement.remove();\n\t\t\tthis._currentElement = null;\n\t\t}\n\n\t\tthis._currentComponent = componentTag;\n\n\t\tconst component = document.createElement(componentTag);\n\n\t\t(component as any).__parentOutlet = this;\n\n\t\tshadowRoot.appendChild(component);\n\t\tthis._currentElement = component;\n\n\t\tqueueMicrotask(() => this.updateChildOutlets());\n\t}\n\n\tprivate updateChildOutlets(): void {\n\t\tconst childContext = this.createChildContext();\n\n\t\tif (!childContext) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [, childOutlet] of this._childOutlets) {\n\t\t\tchildOutlet.receiveContext(childContext);\n\t\t}\n\t}\n\n\tprivate async render404(): Promise<void> {\n\t\tconst notFoundRoute = this.routes.find((r) => r.path === '404' || r.path === '**');\n\n\t\tif (notFoundRoute?.component) {\n\t\t\tawait this.renderComponent(notFoundRoute.component);\n\t\t} else if (this._depth === 0) {\n\t\t\tthis._router.navigate('/404', { replace: true });\n\t\t}\n\t}\n}\n","import { MelodicComponent } from '../../../components/decorators/melodic-component.decorator';\nimport { Service } from '../../../injection/decorators/service.decorator';\nimport { css, html } from '../../../template/functions/html.function';\nimport type { INavigationOptions } from '../../interfaces/inavigation-options.interface';\nimport { RouterService } from '../../services/router.service';\n\n@MelodicComponent({\n\tselector: 'router-link',\n\ttemplate: () => html`<a part=\"link\"><slot></slot></a>`,\n\tstyles: () => css`\n\t\t:host {\n\t\t\tdisplay: inline-block;\n\t\t\tcursor: pointer;\n\t\t}\n\t\ta {\n\t\t\tcolor: inherit;\n\t\t\ttext-decoration: inherit;\n\t\t\tfont: inherit;\n\t\t\tdisplay: block;\n\t\t}\n\t`,\n\tattributes: ['href', 'active-class']\n})\nexport class RouterLinkComponent {\n\t@Service(RouterService) private _router!: RouterService;\n\n\tprivate _anchorElement: HTMLAnchorElement | null = null;\n\tprivate _navigationCleanup: (() => void) | null = null;\n\n\tpublic href: string = '';\n\tpublic data: unknown = null;\n\tpublic queryParams: Record<string, string> = {};\n\tpublic activeClass: string = 'active';\n\tpublic exactMatch: boolean = false;\n\tpublic replace: boolean = false;\n\tpublic elementRef!: HTMLElement;\n\n\tonCreate(): void {\n\t\tthis._anchorElement = this.elementRef.shadowRoot?.querySelector('a') ?? null;\n\n\t\tconst initialHref = this.elementRef.getAttribute('href');\n\t\tif (initialHref) {\n\t\t\tthis.href = initialHref;\n\t\t}\n\n\t\tconst initialActiveClass = this.elementRef.getAttribute('active-class');\n\t\tif (initialActiveClass) {\n\t\t\tthis.activeClass = initialActiveClass;\n\t\t}\n\n\t\tthis.updateAnchorHref();\n\n\t\tthis.elementRef.addEventListener(\n\t\t\t'click',\n\t\t\t(e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Don't navigate if modifier keys are pressed (allow new tab, etc.)\n\t\t\t\tif (e.ctrlKey || e.metaKey || e.shiftKey) {\n\t\t\t\t\twindow.open(this.buildFullPath(), '_blank');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.navigate();\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\n\t\tconst handler = () => this.updateActiveState();\n\t\twindow.addEventListener('NavigationEvent', handler);\n\t\tthis._navigationCleanup = () => window.removeEventListener('NavigationEvent', handler);\n\n\t\tthis.updateActiveState();\n\t}\n\n\tonDestroy(): void {\n\t\tthis._navigationCleanup?.();\n\t}\n\n\tonAttributeChange(attribute: string, _: unknown, newVal: unknown): void {\n\t\tif (attribute === 'href') {\n\t\t\tthis.href = newVal as string;\n\t\t\tthis.updateAnchorHref();\n\t\t\tthis.updateActiveState();\n\t\t} else if (attribute === 'active-class') {\n\t\t\tthis.activeClass = newVal as string;\n\t\t\tthis.updateActiveState();\n\t\t}\n\t}\n\n\tonPropertyChange(name: string): void {\n\t\tif (name === 'href' || name === 'queryParams') {\n\t\t\tthis.updateAnchorHref();\n\t\t\tthis.updateActiveState();\n\t\t}\n\t}\n\n\tisActive(): boolean {\n\t\tconst currentPath = window.location.pathname;\n\t\tconst linkPath = this.href.startsWith('/') ? this.href : `/${this.href}`;\n\n\t\tif (this.exactMatch) {\n\t\t\treturn currentPath === linkPath;\n\t\t}\n\n\t\treturn currentPath.startsWith(linkPath);\n\t}\n\n\tprivate buildFullPath(): string {\n\t\tlet path = this.href;\n\n\t\tif (this.queryParams && Object.keys(this.queryParams).length > 0) {\n\t\t\tconst params = new URLSearchParams(this.queryParams);\n\t\t\tpath = `${path}?${params.toString()}`;\n\t\t}\n\n\t\treturn path;\n\t}\n\n\tprivate updateAnchorHref(): void {\n\t\tif (this._anchorElement) {\n\t\t\tthis._anchorElement.href = this.buildFullPath();\n\t\t}\n\t}\n\n\tprivate async navigate(): Promise<void> {\n\t\tconst options: INavigationOptions = {\n\t\t\tdata: this.data,\n\t\t\treplace: this.replace,\n\t\t\tqueryParams: this.queryParams\n\t\t};\n\n\t\tawait this._router.navigate(this.href, options);\n\t}\n\n\tprivate updateActiveState(): void {\n\t\tconst currentPath = window.location.pathname;\n\t\tconst linkPath = this.href.startsWith('/') ? this.href : `/${this.href}`;\n\t\tconst normalizedCurrentPath = currentPath.replace(/\\/$/, '') || '/';\n\t\tconst normalizedLinkPath = linkPath.replace(/\\/$/, '') || '/';\n\n\t\tlet isActive: boolean;\n\n\t\tif (this.exactMatch) {\n\t\t\tisActive = normalizedCurrentPath === normalizedLinkPath;\n\t\t} else {\n\t\t\tisActive = normalizedCurrentPath === normalizedLinkPath || normalizedCurrentPath.startsWith(normalizedLinkPath + '/');\n\t\t}\n\n\t\tif (isActive) {\n\t\t\tthis.elementRef.classList.add(this.activeClass);\n\t\t\tthis._anchorElement?.setAttribute('aria-current', 'page');\n\t\t} else {\n\t\t\tthis.elementRef.classList.remove(this.activeClass);\n\t\t\tthis._anchorElement?.removeAttribute('aria-current');\n\t\t}\n\t}\n}\n","import { Injector } from '../../injection';\nimport { registerAttributeDirective } from '../../template/directives/functions/attribute-directive.functions';\nimport type { AttributeDirectiveCleanupFunction } from '../../template/directives/types/attribute-directive-cleanup-function.type';\nimport { RouterService } from '../services/router.service';\nimport type { INavigationOptions } from '../interfaces/inavigation-options.interface';\n\n/**\n * Options for the routerLink directive when using object syntax.\n */\nexport interface IRouterLinkOptions {\n\t/** Target path for navigation */\n\thref: string;\n\n\t/** CSS class to apply when this link is active (default: 'active') */\n\tactiveClass?: string;\n\n\t/** Whether to match exact path or prefix (default: false) */\n\texactMatch?: boolean;\n\n\t/** Whether to replace history instead of push (default: false) */\n\treplace?: boolean;\n\n\t/** Custom data to pass with navigation */\n\tdata?: unknown;\n\n\t/** Query parameters to append */\n\tqueryParams?: Record<string, string>;\n}\n\n/**\n * Router link attribute directive.\n *\n * Usage:\n * ```html\n * <!-- Static string value -->\n * <a :routerLink=\"/home\">Home</a>\n * <button :routerLink=\"/admin\">Admin</button>\n *\n * <!-- Dynamic string value -->\n * <a :routerLink=${currentPath}>Dynamic</a>\n *\n * <!-- Object with options -->\n * <a :routerLink=${{ href: '/about', exactMatch: true }}>About</a>\n * ```\n *\n * The directive:\n * - Sets href attribute on anchor elements (for accessibility)\n * - Handles click events with preventDefault and navigation\n * - Supports modifier keys (ctrl/cmd opens in new tab)\n * - Manages active class based on current route\n * - Listens for navigation events to update active state\n */\nfunction routerLinkDirective(element: Element, value: unknown, _: string): (() => void) | void {\n\t// Parse value - can be string or options object\n\tlet options: IRouterLinkOptions;\n\n\tif (typeof value === 'string') {\n\t\toptions = { href: value };\n\t} else if (value && typeof value === 'object' && 'href' in value) {\n\t\toptions = value as IRouterLinkOptions;\n\t} else {\n\t\tconsole.warn('routerLink: Invalid value. Expected string or { href: string, ... }');\n\t\treturn;\n\t}\n\n\tconst { href, activeClass = 'active', exactMatch = false, replace = false, data = null, queryParams = {} } = options;\n\n\tconst router = Injector.get<RouterService>(RouterService);\n\n\t// Build full path with query params\n\tconst buildFullPath = (): string => {\n\t\tlet path = href;\n\t\tif (queryParams && Object.keys(queryParams).length > 0) {\n\t\t\tconst params = new URLSearchParams(queryParams);\n\t\t\tpath = `${path}?${params.toString()}`;\n\t\t}\n\t\treturn path;\n\t};\n\n\t// Set href on anchor elements for accessibility\n\tif (element.tagName.toLowerCase() === 'a') {\n\t\t(element as HTMLAnchorElement).href = buildFullPath();\n\t}\n\n\t// Update active state\n\tconst updateActiveState = (): void => {\n\t\tconst currentPath = window.location.pathname;\n\t\tconst linkPath = href.startsWith('/') ? href : `/${href}`;\n\t\tconst normalizedCurrentPath = currentPath.replace(/\\/$/, '') || '/';\n\t\tconst normalizedLinkPath = linkPath.replace(/\\/$/, '') || '/';\n\n\t\tlet isActive: boolean;\n\n\t\tif (exactMatch) {\n\t\t\tisActive = normalizedCurrentPath === normalizedLinkPath;\n\t\t} else {\n\t\t\tisActive = normalizedCurrentPath === normalizedLinkPath || normalizedCurrentPath.startsWith(normalizedLinkPath + '/');\n\t\t}\n\n\t\tif (isActive) {\n\t\t\telement.classList.add(activeClass);\n\t\t\tif (element.tagName.toLowerCase() === 'a') {\n\t\t\t\telement.setAttribute('aria-current', 'page');\n\t\t\t}\n\t\t} else {\n\t\t\telement.classList.remove(activeClass);\n\t\t\telement.removeAttribute('aria-current');\n\t\t}\n\n\t\telement.setAttribute('router-link', '');\n\t};\n\n\t// Click handler\n\tconst handleClick = (e: Event): void => {\n\t\tconst mouseEvent = e as MouseEvent;\n\n\t\t// Don't navigate if modifier keys are pressed (allow new tab, etc.)\n\t\tif (mouseEvent.ctrlKey || mouseEvent.metaKey || mouseEvent.shiftKey) {\n\t\t\tif (element.tagName.toLowerCase() === 'a') {\n\t\t\t\t// Let the browser handle it naturally for anchors\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For non-anchor elements, open in new tab\n\t\t\twindow.open(buildFullPath(), '_blank');\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tconst navOptions: INavigationOptions = {\n\t\t\tdata,\n\t\t\treplace,\n\t\t\tqueryParams\n\t\t};\n\n\t\trouter.navigate(href, navOptions);\n\t};\n\n\t// Navigation event handler\n\tconst handleNavigation = (): void => {\n\t\tupdateActiveState();\n\t};\n\n\t// Add event listeners\n\telement.addEventListener('click', handleClick);\n\twindow.addEventListener('NavigationEvent', handleNavigation);\n\n\t// Initial active state\n\tupdateActiveState();\n\n\t// Return cleanup function\n\treturn (() => {\n\t\telement.removeEventListener('click', handleClick);\n\t\twindow.removeEventListener('NavigationEvent', handleNavigation);\n\t}) as AttributeDirectiveCleanupFunction;\n}\n\n// Auto-register the directive\nregisterAttributeDirective('routerLink', routerLinkDirective);\n\n// Export for manual registration if needed\nexport { routerLinkDirective };\n","import type { SignalEffect } from '../classes/signal-effect.class';\n\nlet activeEffect: SignalEffect | null = null;\n\nexport const setActiveEffect = (effect: SignalEffect | null): void => {\n\tactiveEffect = effect;\n};\n\nexport const getActiveEffect = (): SignalEffect | null => activeEffect;\n","import type { Signal } from '../types/signal.type';\nimport { getActiveEffect, setActiveEffect } from '../functions/active-effect.functions';\n\nexport class SignalEffect {\n\tprivate _dependencies = new Set<Signal<unknown>>();\n\tprivate _isRunning = false;\n\tprivate _needsRerun = false;\n\n\treadonly run: () => void;\n\n\tconstructor(public execute: () => void) {\n\t\tthis.run = () => {\n\t\t\tif (this._isRunning) {\n\t\t\t\tthis._needsRerun = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._isRunning = true;\n\n\t\t\tdo {\n\t\t\t\tthis._needsRerun = false;\n\n\t\t\t\tthis._dependencies.forEach((signal) => {\n\t\t\t\t\tsignal.unsubscribe(this.run);\n\t\t\t\t});\n\n\t\t\t\tthis._dependencies.clear();\n\n\t\t\t\tconst prevEffect = getActiveEffect();\n\t\t\t\tsetActiveEffect(this);\n\n\t\t\t\tthis.execute();\n\n\t\t\t\tsetActiveEffect(prevEffect);\n\t\t\t} while (this._needsRerun);\n\n\t\t\tthis._isRunning = false;\n\t\t};\n\t}\n\n\taddDependency<T>(signal: Signal<T>): void {\n\t\tthis._dependencies.add(signal);\n\t}\n\n\tdestroy(): void {\n\t\tthis._dependencies.forEach((signal) => {\n\t\t\tsignal.unsubscribe(this.run);\n\t\t});\n\n\t\tthis._dependencies.clear();\n\t}\n}\n","import { SIGNAL_MARKER, type Signal } from '../types/signal.type';\nimport type { Subscriber } from '../types/subscriber.type';\nimport { getActiveEffect } from './active-effect.functions';\n\nexport function signal<T>(initialValue: T): Signal<T>;\nexport function signal<T>(): Signal<T | undefined>;\nexport function signal<T>(initialValue?: T): Signal<T | undefined> {\n\tlet value = initialValue;\n\tconst subscribers = new Set<Subscriber<T | undefined>>();\n\n\tconst notify = (): void => {\n\t\tconst subscribersToNotify = [...subscribers];\n\t\tsubscribersToNotify.forEach((subscriber) => subscriber(value));\n\t};\n\n\tconst read = (() => {\n\t\tconst activeEffect = getActiveEffect();\n\t\tif (activeEffect) {\n\t\t\tactiveEffect.addDependency<T | undefined>(read);\n\t\t\tsubscribers.add(activeEffect.run);\n\t\t}\n\n\t\treturn value;\n\t}) as Signal<T | undefined>;\n\n\tread.set = (newValue: T | undefined): void => {\n\t\tif (value !== newValue) {\n\t\t\tvalue = newValue;\n\t\t\tnotify();\n\t\t}\n\t};\n\n\tread.update = (updater: (current: T | undefined) => T | undefined): void => {\n\t\tread.set(updater(value));\n\t};\n\n\tread.subscribe = (subscriber: Subscriber<T | undefined>): (() => void) => {\n\t\tsubscribers.add(subscriber);\n\t\treturn () => subscribers.delete(subscriber);\n\t};\n\n\tread.unsubscribe = (subscriber: Subscriber<T | undefined>): void => {\n\t\tsubscribers.delete(subscriber);\n\t};\n\n\tread.destroy = (): void => {\n\t\tsubscribers.clear();\n\t};\n\n\tObject.defineProperty(read, SIGNAL_MARKER, {\n\t\tvalue: true,\n\t\tenumerable: false,\n\t\tconfigurable: false\n\t});\n\n\treturn read;\n}\n","import { signal } from '../functions/signal.function';\nimport { SignalEffect } from '../classes/signal-effect.class';\nimport type { Signal } from '../types/signal.type';\n\nexport function computed<T>(computation: () => T): Signal<T> {\n\tconst computedSignal = signal<T>(undefined as T);\n\n\tconst effect = new SignalEffect(() => {\n\t\tcomputedSignal.set(computation());\n\t});\n\n\teffect.run();\n\n\tconst originalDestroy = computedSignal.destroy;\n\n\tcomputedSignal.destroy = () => {\n\t\teffect.destroy();\n\t\toriginalDestroy();\n\t};\n\n\treturn computedSignal;\n}\n","import type { ActionIdentifier, ActionIdentifierPattern, ActionPayload, TypedActionRef } from '../types/action.type';\n\nexport const props = <P extends ActionPayload>(): (() => P) => {\n\treturn () => ({} as P);\n};\n\nexport const createAction = <T extends ActionIdentifierPattern, P extends ActionPayload>(\n\ttype: ActionIdentifier<T>,\n\tpayloadFn?: () => P\n): TypedActionRef<T, P> => {\n\treturn ((payload?: P) => ({ type, payload: payload ?? (payloadFn ? payloadFn() : undefined) })) as TypedActionRef<T, P>;\n};\n","import type { ActionReducer, Action, ReducerConfig } from '../types';\n\n// Overload for flat state (component state)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createReducer<S>(...actionReducers: ActionReducer<S, any>[]): ReducerConfig<S, Action>;\n\n// Overload for sliced state (global state)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createReducer<S, K extends keyof S>(...actionReducers: ActionReducer<S[K], any>[]): ReducerConfig<S[K], Action>;\n\n// Implementation\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createReducer<S, K extends keyof S = never>(...actionReducers: ActionReducer<S | S[K], any>[]): ReducerConfig<S | S[K], Action> {\n\treturn { reducers: actionReducers as ActionReducer<S | S[K], Action>[] };\n}\n","import { signal } from '../../signals';\nimport type { State } from '../types/state.type';\n\nexport const createState = <S>(initState: S): State<S> => {\n\tconst state: State<S> = {} as State<S>;\n\n\tObject.keys(initState as object).forEach((key) => {\n\t\tstate[key as keyof S] = signal(initState[key as keyof S]);\n\t});\n\n\treturn state;\n};\n","import type { ActionReducer, ActionPayload, TypedAction, TypedActionRef, ActionIdentifier } from '../types';\n\nexport const onAction = <S, T extends ActionIdentifier, P extends ActionPayload>(\n\taction: TypedActionRef<T, P>,\n\treducer: (state: S, action: TypedAction<T, P>) => S\n): ActionReducer<S, TypedAction<T, P>> => {\n\treturn {\n\t\taction: action() as TypedAction<T, P>,\n\t\treducer\n\t};\n};\n","import { createToken } from '../injection';\nimport type { ActionEffectsMap, ActionReducerMap, State } from './types';\n\nexport const RX_INIT_STATE = createToken<State<{ [key: string]: unknown }>>('RX_INIT_STATE');\nexport const RX_ACTION_PROVIDERS = createToken<ActionReducerMap<{ [key: string]: unknown }>>('RX_ACTION_PROVIDERS');\nexport const RX_EFFECTS_PROVIDERS = createToken<ActionEffectsMap<{ [key: string]: unknown }>>('RX_EFFECTS_PROVIDERS');\nexport const RX_STATE_DEBUG = createToken<boolean>('RX_STATE_DEBUG');\n","import type { ActionEffect, ActionEffects } from '../types/action-effect.type';\nimport type { Action, ActionIdentifier, ActionPayload, ActionRef, TypedAction, TypedActionRef } from '../types/action.type';\n\nexport abstract class EffectsBase implements ActionEffects {\n\tprivate readonly _effects: ActionEffect[] = [];\n\n\tprotected addEffect<T extends ActionIdentifier, P extends ActionPayload>(\n\t\tactions: TypedActionRef<T, P>[],\n\t\teffect: (action: TypedAction<T, P>) => Promise<Action | Action[] | void>\n\t): void {\n\t\tthis._effects.push({\n\t\t\tactions: actions as ActionRef[],\n\t\t\teffect: effect as (action: Action) => Promise<Action | Action[] | void>\n\t\t});\n\t}\n\n\tpublic getEffects(): ActionEffect[] {\n\t\treturn this._effects;\n\t}\n}\n","import type { ActionPayload, TypedAction, ActionEffect, ReducerConfig, Action, ActionIdentifier } from '../types';\nimport { EffectsBase } from './effects.base.class';\nimport { type Signal, signal, computed } from '../../signals';\n\nexport abstract class ComponentStateBaseService<S extends object> extends EffectsBase {\n\tprivate readonly _state: Signal<S>;\n\n\tconstructor(\n\t\tprivate readonly _initState: S,\n\t\tprivate readonly _reducerConfig: ReducerConfig<S, Action> = { reducers: [] },\n\t\tprivate readonly _debug: boolean = false\n\t) {\n\t\tsuper();\n\t\tthis._state = signal(_initState);\n\t}\n\n\tprotected get state(): S {\n\t\treturn this._state();\n\t}\n\n\tresetState(): void {\n\t\tthis._state.set(this._initState);\n\t}\n\n\tselect<T>(selectFn: (state: S) => T): Signal<T> {\n\t\treturn computed(() => selectFn(this._state()));\n\t}\n\n\tdispatch<T extends ActionIdentifier, P extends ActionPayload>(action: TypedAction<T, P>): void {\n\t\tif (this._debug) {\n\t\t\tconsole.log(`[ComponentState] Action: ${action.type}`);\n\t\t\tconsole.log(`[ComponentState] Payload:`, action.payload);\n\t\t\tconsole.log(`[ComponentState] Before:`, this._state());\n\t\t}\n\n\t\t// Find and execute reducer\n\t\tconst reducer = this._reducerConfig.reducers.find((r) => r.action.type === action.type);\n\t\tif (reducer) {\n\t\t\tthis._state.update((state) => reducer.reducer(state, action));\n\n\t\t\tif (this._debug) {\n\t\t\t\tconsole.log(`[ComponentState] After:`, this._state());\n\t\t\t}\n\t\t}\n\n\t\t// Execute effects\n\t\tthis.executeEffects(action);\n\t}\n\n\tprotected patchState(partial: Partial<S>): void {\n\t\tthis._state.update((state) => ({ ...state, ...partial }));\n\t}\n\n\tprivate executeEffects<T extends ActionIdentifier, P extends ActionPayload>(action: TypedAction<T, P>): void {\n\t\tconst actionEffects: ActionEffect[] = this.getEffects().filter((effect) => effect.actions.some((a) => a().type === action.type));\n\n\t\tactionEffects.forEach((effect) => {\n\t\t\teffect.effect(action).then((newAction) => {\n\t\t\t\tif (newAction === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst actions = Array.isArray(newAction) ? newAction : [newAction];\n\t\t\t\tactions.forEach((na) => this.dispatch(na as TypedAction<T, P>));\n\t\t\t});\n\t\t});\n\t}\n}\n","import type { State } from '../types/state.type';\nimport type { Action, ActionIdentifier, ActionPayload, TypedAction } from '../types/action.type';\nimport type { ActionEffect, ActionEffects, ActionEffectsMap } from '../types/action-effect.type';\nimport type { ActionReducerMap } from '../types/reducer-config.type';\nimport { RX_INIT_STATE, RX_ACTION_PROVIDERS, RX_EFFECTS_PROVIDERS, RX_STATE_DEBUG } from '../injection.tokens';\nimport type { ActionReducer } from '../types/action-reducer.type';\nimport { Injectable, Injector, Service } from '../../injection';\nimport { type Signal, computed } from '../../signals';\n\n@Injectable()\nexport class SignalStoreService<S> {\n\t@Service(RX_INIT_STATE) private readonly _state!: State<S>;\n\t@Service(RX_ACTION_PROVIDERS) private readonly _reducerMap!: ActionReducerMap<S>;\n\t@Service(RX_EFFECTS_PROVIDERS) private readonly _effectMap!: ActionEffectsMap<S>;\n\t@Service(RX_STATE_DEBUG) private readonly _debug!: boolean;\n\n\tconstructor() {\n\t\tif (this._debug) {\n\t\t\tconsole.info('RX State Debugging: Enabled');\n\t\t}\n\t}\n\n\tselect<T, K extends keyof S>(key: K, selectFn: (state: S[K]) => T): Signal<T> {\n\t\treturn computed(() => {\n\t\t\treturn selectFn(this._state[key]());\n\t\t});\n\t}\n\n\tlogState(): void {\n\t\tconsole.log(this.getCurrentState());\n\t}\n\n\tdispatch<T extends ActionIdentifier, P extends ActionPayload>(action: TypedAction<T, P>): void;\n\tdispatch<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(key: K, action: TypedAction<T, P>): void;\n\tdispatch<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(x: K | TypedAction<T, P>, y?: TypedAction<T, P>): void {\n\t\tconst key = typeof x === 'string' ? x : undefined;\n\t\tconst action: TypedAction<T, P> = (typeof x === 'string' ? y : x) as TypedAction<T, P>;\n\n\t\tif (this._debug) {\n\t\t\tconsole.log(`Action: ${action.type}`);\n\t\t\tconsole.log(`Payload:`, action.payload);\n\t\t\tconsole.log(`Current State:`, this.getCurrentState());\n\t\t}\n\n\t\tif (key) {\n\t\t\tthis.dispatchWithKey(key, action);\n\t\t} else {\n\t\t\tthis.dispatchWithoutKey(action);\n\t\t}\n\t}\n\n\tprivate dispatchWithKey<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(key: K, action: TypedAction<T, P>): void {\n\t\tif (!this._reducerMap[key]) {\n\t\t\tthrow new Error(`Reducer not found for key: ${key as string}`);\n\t\t}\n\n\t\tconst reducers = this._reducerMap[key].reducers;\n\n\t\tconst reducer = reducers.find((reducer) => reducer.action.type === action.type);\n\t\tif (reducer !== undefined) {\n\t\t\tconst newState = reducer.reducer(this._state[key](), action);\n\t\t\t(this._state[key] as Signal<S[K]>).set(newState);\n\n\t\t\tif (this._debug) {\n\t\t\t\tconsole.log(`New State:`, this.getCurrentState());\n\t\t\t}\n\t\t}\n\n\t\tconst actionEffects: ActionEffect[] = this.getEffectsForAction(key, action);\n\t\tactionEffects.forEach((effect) => {\n\t\t\teffect.effect(action).then((newAction) => {\n\t\t\t\tif (newAction === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(newAction)) {\n\t\t\t\t\tnewAction = [newAction];\n\t\t\t\t}\n\n\t\t\t\tnewAction.forEach((na) => {\n\t\t\t\t\tthis.dispatch(na as TypedAction<T, P>);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate dispatchWithoutKey<T extends ActionIdentifier, P extends ActionPayload>(action: TypedAction<T, P>): void {\n\t\tconst reducerWithKey = this.getReducerForAction(action);\n\t\tif (reducerWithKey !== undefined) {\n\t\t\tconst newState = reducerWithKey.actionReducer.reducer(this._state[reducerWithKey.key](), action);\n\t\t\t(this._state[reducerWithKey.key] as Signal<S[keyof S]>).set(newState);\n\n\t\t\tif (this._debug) {\n\t\t\t\tconsole.log(`New State:`, this.getCurrentState());\n\t\t\t}\n\t\t}\n\n\t\tconst effectsWithKey = this.getEffectsForAction(action);\n\t\tif (effectsWithKey !== undefined) {\n\t\t\teffectsWithKey.actionEffects.forEach((effect) => {\n\t\t\t\teffect.effect(action).then((newAction) => {\n\t\t\t\t\tif (newAction === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!Array.isArray(newAction)) {\n\t\t\t\t\t\tnewAction = [newAction];\n\t\t\t\t\t}\n\n\t\t\t\t\tnewAction.forEach((na) => {\n\t\t\t\t\t\tthis.dispatch(na as TypedAction<T, P>);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate getReducerForAction<T extends ActionIdentifier, P extends ActionPayload>(\n\t\taction: TypedAction<T, P>\n\t): { key: keyof S; actionReducer: ActionReducer<S[keyof S], Action> } | undefined {\n\t\tconst keys: (keyof S)[] = Object.keys(this._reducerMap) as (keyof S)[];\n\n\t\tfor (const key of keys) {\n\t\t\tconst reducers = this._reducerMap[key]?.reducers || [];\n\t\t\tconst reducer = reducers.find((reducer) => reducer.action.type === action.type);\n\n\t\t\tif (reducer) {\n\t\t\t\treturn { key, actionReducer: reducer };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate getEffectsForAction<T extends ActionIdentifier, P extends ActionPayload>(\n\t\taction: TypedAction<T, P>\n\t): { key: keyof S; actionEffects: ActionEffect[] } | undefined;\n\tprivate getEffectsForAction<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(key: K, action: TypedAction<T, P>): ActionEffect[];\n\tprivate getEffectsForAction<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(\n\t\tkey: K | TypedAction<T, P>,\n\t\taction?: TypedAction<T, P>\n\t): ActionEffect[] | { key: keyof S; actionEffects: ActionEffect[] } | undefined {\n\t\tif (typeof key === 'string') {\n\t\t\treturn this.getEffectsForActionWithKey(key as K, action as TypedAction<T, P>);\n\t\t} else {\n\t\t\treturn this.getEffectsForActionWithoutKey(key as TypedAction<T, P>);\n\t\t}\n\t}\n\n\tprivate getEffectsForActionWithoutKey<T extends ActionIdentifier, P extends ActionPayload>(\n\t\taction: TypedAction<T, P>\n\t): { key: keyof S; actionEffects: ActionEffect[] } | undefined {\n\t\tconst keys: (keyof S)[] = Object.keys(this._reducerMap) as (keyof S)[];\n\n\t\tfor (const key of keys) {\n\t\t\tconst effectClass = this._effectMap[key];\n\n\t\t\tif (effectClass) {\n\t\t\t\tconst effectService: ActionEffects = Injector.get(effectClass);\n\t\t\t\tconst effects = effectService.getEffects().filter((effect) => effect.actions.some((a) => a().type === action.type));\n\n\t\t\t\tif (effects.length > 0) {\n\t\t\t\t\treturn { key, actionEffects: effects };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate getEffectsForActionWithKey<K extends keyof S, T extends ActionIdentifier, P extends ActionPayload>(\n\t\tkey: K,\n\t\taction: TypedAction<T, P>\n\t): ActionEffect[] {\n\t\tconst effectClass = this._effectMap[key as keyof S];\n\t\tif (effectClass) {\n\t\t\tconst effectService: ActionEffects = Injector.get(effectClass);\n\t\t\treturn effectService.getEffects().filter((effect) => effect.actions.some((a) => a().type === action.type));\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tprivate getCurrentState(): S {\n\t\treturn Object.keys(this._state).reduce((acc, key) => {\n\t\t\tacc[key as keyof S] = this._state[key as keyof S]();\n\t\t\treturn acc;\n\t\t}, {} as S);\n\t}\n}\n","import type { Provider } from '../../bootstrap/types/provider.type';\nimport type { InjectionEngine } from '../../injection';\nimport { RX_INIT_STATE, RX_ACTION_PROVIDERS, RX_EFFECTS_PROVIDERS, RX_STATE_DEBUG } from '../injection.tokens';\nimport { SignalStoreService } from '../services';\nimport type { State, ActionReducerMap, ActionEffectsMap } from '../types';\n\nexport function provideRX<S>(initState: State<S>, actionReducers: ActionReducerMap<S>, effects: ActionEffectsMap<S>, debug: boolean = false): Provider {\n\treturn (injector: InjectionEngine) => {\n\t\tinjector.bindValue(RX_INIT_STATE, initState);\n\t\tinjector.bindValue(RX_ACTION_PROVIDERS, actionReducers);\n\t\tinjector.bindValue(RX_EFFECTS_PROVIDERS, effects);\n\t\tinjector.bindValue(RX_STATE_DEBUG, debug);\n\t\tinjector.bind(SignalStoreService, SignalStoreService, { dependencies: [RX_INIT_STATE, RX_ACTION_PROVIDERS, RX_EFFECTS_PROVIDERS] });\n\t};\n}\n","/**\n * Compiled Template - Fast DOM creation using createElement instead of cloneNode\n *\n * For simple single-element templates (like repeat items), generates an optimized\n * factory function that creates DOM directly without any parsing overhead.\n */\n\n// Cache compiled factories by template strings identity\nconst compiledCache = new WeakMap<TemplateStringsArray, CompiledTemplate>();\n\ntype FastFactory = (values: unknown[]) => Node;\n\ninterface CompiledResult {\n\tnodes: Node[];\n\teventTargets: Array<{ element: Element; event: string; valueIndex: number }>;\n}\n\nexport class CompiledTemplate {\n\tprivate _factory: FastFactory | null = null;\n\tprivate _hasEvents: boolean = false;\n\tprivate _canCompile: boolean = false;\n\n\tprivate constructor(strings: TemplateStringsArray) {\n\t\tthis.analyzeAndCompile(strings);\n\t}\n\n\tstatic compile(strings: TemplateStringsArray): CompiledTemplate {\n\t\tlet compiled = compiledCache.get(strings);\n\t\tif (!compiled) {\n\t\t\tcompiled = new CompiledTemplate(strings);\n\t\t\tcompiledCache.set(strings, compiled);\n\t\t}\n\t\treturn compiled;\n\t}\n\n\t/**\n\t * Check if this template can use the fast path\n\t */\n\tcanUseFastPath(): boolean {\n\t\treturn this._canCompile && !this._hasEvents;\n\t}\n\n\t/**\n\t * Create DOM nodes using the compiled factory\n\t */\n\tcreate(values: unknown[]): CompiledResult {\n\t\tif (this._factory) {\n\t\t\treturn { nodes: [this._factory(values)], eventTargets: [] };\n\t\t}\n\t\treturn { nodes: [], eventTargets: [] };\n\t}\n\n\t/**\n\t * Directly create a single node - faster than create() for single-element templates\n\t */\n\tcreateDirect(values: unknown[]): Node | null {\n\t\treturn this._factory ? this._factory(values) : null;\n\t}\n\n\t/**\n\t * Analyze template and generate optimized factory for simple cases\n\t *\n\t * Template strings format for: html`<li class=\"${val}\">${text}</li>`\n\t * strings = ['<li class=\"', '\">', '</li>']\n\t * values[0] goes between strings[0] and strings[1]\n\t * values[1] goes between strings[1] and strings[2]\n\t */\n\tprivate analyzeAndCompile(strings: TemplateStringsArray): void {\n\t\tif (strings.length < 2) return;\n\n\t\t// Check for events\n\t\tfor (const s of strings) {\n\t\t\tif (s.includes('@')) {\n\t\t\t\tthis._hasEvents = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Join strings with placeholders to analyze structure\n\t\tlet html = strings[0];\n\t\tfor (let i = 1; i < strings.length; i++) {\n\t\t\thtml += `\\${${i - 1}}` + strings[i];\n\t\t}\n\n\t\t// Must be a simple single element: <tag ...>...</tag>\n\t\tconst fullMatch = html.match(/^<([\\w-]+)([^>]*)>(.*)$/s);\n\t\tif (!fullMatch) return;\n\n\t\tconst [, tag, attrString, rest] = fullMatch;\n\n\t\t// Must end with closing tag\n\t\tconst closingTag = `</${tag}>`;\n\t\tif (!rest.endsWith(closingTag)) return;\n\n\t\tconst textContent = rest.slice(0, -closingTag.length);\n\n\t\t// Parse attributes - both static and dynamic\n\t\tconst attrs: Array<{ name: string; valueIndex: number | null; staticValue?: string }> = [];\n\n\t\t// Match all attributes including dynamic ones\n\t\tconst attrRegex = /([\\w-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|\\$\\{(\\d+)\\})/g;\n\t\tlet attrMatch;\n\t\twhile ((attrMatch = attrRegex.exec(attrString)) !== null) {\n\t\t\tconst name = attrMatch[1];\n\t\t\tconst staticVal = attrMatch[2] ?? attrMatch[3];\n\t\t\tconst dynamicIndex = attrMatch[4];\n\n\t\t\tif (dynamicIndex !== undefined) {\n\t\t\t\tattrs.push({ name, valueIndex: parseInt(dynamicIndex, 10) });\n\t\t\t} else if (staticVal !== undefined) {\n\t\t\t\t// Check if static value contains a placeholder\n\t\t\t\tconst placeholderMatch = staticVal.match(/\\$\\{(\\d+)\\}/);\n\t\t\t\tif (placeholderMatch) {\n\t\t\t\t\tattrs.push({ name, valueIndex: parseInt(placeholderMatch[1], 10) });\n\t\t\t\t} else {\n\t\t\t\t\tattrs.push({ name, valueIndex: null, staticValue: staticVal });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Parse text content for placeholders\n\t\tconst textParts: Array<{ static: string } | { valueIndex: number }> = [];\n\t\tconst remaining = textContent;\n\t\tconst placeholderRegex = /\\$\\{(\\d+)\\}/g;\n\t\tlet lastIndex = 0;\n\t\tlet textMatch;\n\n\t\tplaceholderRegex.lastIndex = 0;\n\t\twhile ((textMatch = placeholderRegex.exec(remaining)) !== null) {\n\t\t\tif (textMatch.index > lastIndex) {\n\t\t\t\ttextParts.push({ static: remaining.slice(lastIndex, textMatch.index) });\n\t\t\t}\n\t\t\ttextParts.push({ valueIndex: parseInt(textMatch[1], 10) });\n\t\t\tlastIndex = textMatch.index + textMatch[0].length;\n\t\t}\n\t\tif (lastIndex < remaining.length) {\n\t\t\ttextParts.push({ static: remaining.slice(lastIndex) });\n\t\t}\n\n\t\t// Generate factory function\n\t\tthis._factory = (values: unknown[]): Node => {\n\t\t\tconst el = document.createElement(tag);\n\n\t\t\t// Set attributes\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tif (attr.valueIndex !== null) {\n\t\t\t\t\tconst value = values[attr.valueIndex];\n\t\t\t\t\tif (value !== null && value !== undefined && value !== false) {\n\t\t\t\t\t\tel.setAttribute(attr.name, value === true ? '' : String(value));\n\t\t\t\t\t}\n\t\t\t\t} else if (attr.staticValue !== undefined) {\n\t\t\t\t\tel.setAttribute(attr.name, attr.staticValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Build text content\n\t\t\tlet text = '';\n\t\t\tfor (const part of textParts) {\n\t\t\t\tif ('static' in part) {\n\t\t\t\t\ttext += part.static;\n\t\t\t\t} else {\n\t\t\t\t\ttext += values[part.valueIndex] ?? '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tel.textContent = text;\n\n\t\t\treturn el;\n\t\t};\n\n\t\tthis._canCompile = true;\n\t}\n}\n","import type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\n/**\n * Helper function to create a simple directive without a class.\n *\n * Example:\n * ```typescript\n * const myDirective = directive((container, previousState) => {\n * container.textContent = 'Hello!';\n * return null;\n * });\n * ```\n *\n * @param renderFn - Function that handles rendering\n */\n\nexport function directive(renderFn: (container: Node, previousState?: any) => any): IDirectiveResult {\n\treturn {\n\t\t__directive: true,\n\t\trender: renderFn\n\t};\n}\n","/**\n * Repeat directive - Efficient keyed list rendering\n */\n\nimport type { TemplateResult } from '../../classes/template-result.class';\nimport { CompiledTemplate } from '../../classes/compiled-template.class';\nimport { directive } from '../functions/directive.function';\nimport type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\ninterface RepeatState {\n\tkeyToIndex: Map<unknown, number>;\n\titems: RepeatItem[];\n\tstartMarker: Comment;\n\tendMarker: Comment;\n\tcompiledTemplate?: CompiledTemplate;\n\tuseCompiledPath?: boolean;\n}\n\ninterface RepeatItem {\n\tkey: unknown;\n\tvalue: any;\n\tcontainer: DocumentFragment;\n\tnodes: Node[];\n\tstart: Comment;\n\tend: Comment;\n}\n\n/**\n * Efficiently renders lists with minimal DOM operations\n *\n * Usage:\n * repeat(items, item => item.id, item => html`<li>${item.name}</li>`)\n *\n * @param items - Array of items to render\n * @param keyFn - Function to extract unique key from each item\n * @param template - Template function to render each item\n */\nexport function repeat<T>(items: T[], keyFn: (item: T, index: number) => unknown, template: (item: T, index: number) => TemplateResult): IDirectiveResult {\n\treturn directive((container: Node, previousState?: RepeatState): RepeatState => {\n\t\t// First render - setup markers\n\t\tif (!previousState) {\n\t\t\tconst parent = container.parentNode;\n\t\t\tif (!parent) {\n\t\t\t\tthrow new Error('repeat() directive: container must be attached to a parent node');\n\t\t\t}\n\n\t\t\tconst startMarker = document.createComment('repeat-start');\n\t\t\tconst endMarker = document.createComment('repeat-end');\n\n\t\t\tparent.replaceChild(startMarker, container);\n\t\t\tparent.insertBefore(endMarker, startMarker.nextSibling);\n\n\t\t\tconst state: RepeatState = {\n\t\t\t\tkeyToIndex: new Map(),\n\t\t\t\titems: [],\n\t\t\t\tstartMarker,\n\t\t\t\tendMarker\n\t\t\t};\n\n\t\t\t// Initial render\n\t\t\tupdateList(items, keyFn, template, state);\n\t\t\treturn state;\n\t\t}\n\n\t\t// Update existing list\n\t\tupdateList(items, keyFn, template, previousState);\n\t\treturn previousState;\n\t});\n}\n\nfunction updateList<T>(\n\tnewItems: T[],\n\tkeyFn: (item: T, index: number) => unknown,\n\ttemplate: (item: T, index: number) => TemplateResult,\n\tstate: RepeatState\n): void {\n\tconst oldItems = state.items;\n\tconst newKeyToIndex = new Map<unknown, number>();\n\tconst newEntries: {\n\t\titem: RepeatItem;\n\t\toldIndex: number;\n\t\tisNew: boolean;\n\t}[] = [];\n\n\t// Build new key map\n\tfor (let i = 0; i < newItems.length; i++) {\n\t\tconst key = keyFn(newItems[i], i);\n\t\tnewKeyToIndex.set(key, i);\n\t}\n\n\t// Quick check: if length and all keys are the same, skip expensive reconciliation\n\tif (oldItems.length === newItems.length) {\n\t\tlet allKeysMatch = true;\n\t\tfor (let i = 0; i < newItems.length; i++) {\n\t\t\tconst key = keyFn(newItems[i], i);\n\t\t\tif (i >= oldItems.length || oldItems[i].key !== key) {\n\t\t\t\tallKeysMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (allKeysMatch) {\n\t\t\t// Items are in same order with same keys - just update templates in place\n\t\t\tfor (let i = 0; i < newItems.length; i++) {\n\t\t\t\tconst templateResult = template(newItems[i], i);\n\t\t\t\ttemplateResult.renderInto(oldItems[i].container);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// On first render, check if we can use compiled fast path\n\tif (state.useCompiledPath === undefined && newItems.length > 0) {\n\t\tconst sampleTemplate = template(newItems[0], 0);\n\t\tconst compiled = CompiledTemplate.compile(sampleTemplate.strings);\n\t\tstate.useCompiledPath = compiled.canUseFastPath();\n\t\tif (state.useCompiledPath) {\n\t\t\tstate.compiledTemplate = compiled;\n\t\t}\n\t}\n\n\t// Track old items by key so we can reuse and remove efficiently\n\tconst oldItemsByKey = new Map<unknown, RepeatItem>();\n\tconst oldIndexByKey = new Map<unknown, number>();\n\tfor (const oldItem of oldItems) {\n\t\toldItemsByKey.set(oldItem.key, oldItem);\n\t\toldIndexByKey.set(oldItem.key, oldIndexByKey.size);\n\t}\n\n\t// Build new items list, reusing when possible\n\tfor (let i = 0; i < newItems.length; i++) {\n\t\tconst item = newItems[i];\n\t\tconst key = keyFn(item, i);\n\n\t\tif (oldItemsByKey.has(key)) {\n\t\t\t// Reuse existing item\n\t\t\tconst oldItem = oldItemsByKey.get(key)!;\n\t\t\toldItemsByKey.delete(key); // Mark as used\n\n\t\t\t// Re-render with new data\n\t\t\tconst templateResult = template(item, i);\n\t\t\ttemplateResult.renderInto(oldItem.container);\n\n\t\t\tnewEntries.push({\n\t\t\t\titem: oldItem,\n\t\t\t\toldIndex: oldIndexByKey.get(key) ?? -1,\n\t\t\t\tisNew: false\n\t\t\t});\n\t\t} else {\n\t\t\t// Create new item\n\t\t\tconst repeatItem = createRepeatItem(item, i, key, template, state);\n\t\t\tnewEntries.push({\n\t\t\t\titem: repeatItem,\n\t\t\t\toldIndex: -1,\n\t\t\t\tisNew: true\n\t\t\t});\n\t\t}\n\t}\n\n\t// Remove old items that are no longer needed\n\tfor (const oldItem of oldItemsByKey.values()) {\n\t\tremoveItemRange(oldItem);\n\t}\n\n\tif (newEntries.length === 0) {\n\t\tstate.keyToIndex = newKeyToIndex;\n\t\tstate.items = [];\n\t\treturn;\n\t}\n\n\tconst lisPositions = getLisPositions(newEntries);\n\tconst parent = state.startMarker.parentElement!;\n\tlet nextSibling: Node = state.endMarker;\n\n\tfor (let i = newEntries.length - 1; i >= 0; i--) {\n\t\tconst entry = newEntries[i];\n\t\tif (entry.isNew) {\n\t\t\tinsertItemRange(entry.item, parent, nextSibling);\n\t\t} else if (!lisPositions.has(i)) {\n\t\t\tmoveItemRange(entry.item, nextSibling);\n\t\t}\n\t\tnextSibling = entry.item.start;\n\t}\n\n\t// Update state\n\tstate.keyToIndex = newKeyToIndex;\n\tstate.items = newEntries.map((entry) => entry.item);\n}\n\nfunction createRepeatItem<T>(item: T, index: number, key: unknown, template: (item: T, index: number) => TemplateResult, state: RepeatState): RepeatItem {\n\tconst templateResult = template(item, index);\n\n\tlet nodes: Node[];\n\tlet container: DocumentFragment;\n\n\t// Use compiled fast path if available\n\tif (state.useCompiledPath && state.compiledTemplate) {\n\t\t// Fast path: directly create element without DocumentFragment overhead\n\t\tconst node = state.compiledTemplate.createDirect(templateResult.values);\n\t\tif (node) {\n\t\t\tnodes = [node];\n\t\t\tcontainer = document.createDocumentFragment();\n\t\t\tcontainer.appendChild(node);\n\t\t} else {\n\t\t\t// Fallback if createDirect fails\n\t\t\tcontainer = document.createDocumentFragment();\n\t\t\tnodes = templateResult.renderOnce(container);\n\t\t}\n\t} else {\n\t\tcontainer = document.createDocumentFragment();\n\t\tnodes = templateResult.renderOnce(container);\n\t}\n\n\treturn {\n\t\tkey,\n\t\tvalue: item,\n\t\tcontainer,\n\t\tnodes,\n\t\tstart: document.createComment('repeat-item-start'),\n\t\tend: document.createComment('repeat-item-end')\n\t};\n}\n\nfunction insertItemRange(item: RepeatItem, parent: Node, referenceNode: Node): void {\n\tconst fragment = document.createDocumentFragment();\n\tfragment.appendChild(item.start);\n\tfor (const node of item.nodes) {\n\t\tfragment.appendChild(node);\n\t}\n\tfragment.appendChild(item.end);\n\tparent.insertBefore(fragment, referenceNode);\n}\n\nfunction moveItemRange(item: RepeatItem, referenceNode: Node): void {\n\tconst parent = referenceNode.parentNode;\n\tif (!parent) {\n\t\treturn;\n\t}\n\n\tconst fragment = document.createDocumentFragment();\n\tlet node: Node | null = item.start;\n\tconst end = item.end;\n\n\twhile (node) {\n\t\tconst nextNode: Node | null = node.nextSibling;\n\t\tfragment.appendChild(node);\n\t\tif (node === end) {\n\t\t\tbreak;\n\t\t}\n\t\tnode = nextNode;\n\t}\n\n\tparent.insertBefore(fragment, referenceNode);\n}\n\nfunction removeItemRange(item: RepeatItem): void {\n\tlet node: Node | null = item.start;\n\tconst end = item.end;\n\n\twhile (node) {\n\t\tconst nextNode: Node | null = node.nextSibling;\n\t\tnode.parentNode?.removeChild(node);\n\t\tif (node === end) {\n\t\t\tbreak;\n\t\t}\n\t\tnode = nextNode;\n\t}\n}\n\nfunction getLisPositions(\n\tentries: {\n\t\titem: RepeatItem;\n\t\toldIndex: number;\n\t\tisNew: boolean;\n\t}[]\n): Set<number> {\n\tconst oldIndexSequence: number[] = [];\n\tconst sequencePositions: number[] = [];\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tif (entries[i].oldIndex >= 0) {\n\t\t\toldIndexSequence.push(entries[i].oldIndex);\n\t\t\tsequencePositions.push(i);\n\t\t}\n\t}\n\n\tconst lisIndices = longestIncreasingSubsequence(oldIndexSequence);\n\tconst lisPositions = new Set<number>();\n\n\tfor (const seqIndex of lisIndices) {\n\t\tconst position = sequencePositions[seqIndex];\n\t\tif (position !== undefined) {\n\t\t\tlisPositions.add(position);\n\t\t}\n\t}\n\n\treturn lisPositions;\n}\n\nfunction longestIncreasingSubsequence(sequence: number[]): number[] {\n\tif (sequence.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst predecessors = new Array<number>(sequence.length).fill(-1);\n\tconst positions = new Array<number>(sequence.length).fill(0);\n\tlet length = 0;\n\n\tfor (let i = 0; i < sequence.length; i++) {\n\t\tconst value = sequence[i];\n\t\tlet low = 0;\n\t\tlet high = length;\n\n\t\twhile (low < high) {\n\t\t\tconst mid = (low + high) >> 1;\n\t\t\tif (sequence[positions[mid]] < value) {\n\t\t\t\tlow = mid + 1;\n\t\t\t} else {\n\t\t\t\thigh = mid;\n\t\t\t}\n\t\t}\n\n\t\tif (low > 0) {\n\t\t\tpredecessors[i] = positions[low - 1];\n\t\t}\n\n\t\tpositions[low] = i;\n\n\t\tif (low === length) {\n\t\t\tlength++;\n\t\t}\n\t}\n\n\tconst result = new Array<number>(length);\n\tlet k = positions[length - 1];\n\tfor (let i = length - 1; i >= 0; i--) {\n\t\tresult[i] = k;\n\t\tk = predecessors[k];\n\t}\n\n\treturn result;\n}\n","/**\n * RepeatRaw directive - Maximum performance list rendering\n *\n * Bypasses the template system entirely for cases where raw DOM\n * performance is critical. Uses createElement instead of template cloning.\n */\n\nimport { directive } from '../functions/directive.function';\nimport type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\ninterface RepeatRawState {\n\tkeyToItem: Map<unknown, { key: unknown; element: Element }>;\n\tstartMarker: Comment;\n\tendMarker: Comment;\n}\n\n/**\n * High-performance list rendering using raw DOM APIs\n *\n * Usage:\n * repeatRaw(items, item => item.id, item => {\n * const li = document.createElement('li');\n * li.className = item.active ? 'active' : '';\n * li.textContent = `${item.text}: ${item.value}`;\n * return li;\n * })\n *\n * @param items - Array of items to render\n * @param keyFn - Function to extract unique key from each item\n * @param factory - Factory function that creates a DOM element for each item\n */\nexport function repeatRaw<T>(\n\titems: T[],\n\tkeyFn: (item: T, index: number) => unknown,\n\tfactory: (item: T, index: number) => Element\n): IDirectiveResult {\n\treturn directive((container: Node, previousState?: RepeatRawState): RepeatRawState => {\n\t\t// First render - setup markers\n\t\tif (!previousState) {\n\t\t\tconst parent = container.parentNode;\n\t\t\tif (!parent) {\n\t\t\t\tthrow new Error('repeatRaw() directive: container must be attached to a parent node');\n\t\t\t}\n\n\t\t\tconst startMarker = document.createComment('repeat-raw-start');\n\t\t\tconst endMarker = document.createComment('repeat-raw-end');\n\n\t\t\tparent.replaceChild(startMarker, container);\n\t\t\tparent.insertBefore(endMarker, startMarker.nextSibling);\n\n\t\t\tconst state: RepeatRawState = {\n\t\t\t\tkeyToItem: new Map(),\n\t\t\t\tstartMarker,\n\t\t\t\tendMarker\n\t\t\t};\n\n\t\t\t// Initial render - create all elements\n\t\t\tconst fragment = document.createDocumentFragment();\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\tconst item = items[i];\n\t\t\t\tconst key = keyFn(item, i);\n\t\t\t\tconst element = factory(item, i);\n\t\t\t\tstate.keyToItem.set(key, { key, element });\n\t\t\t\tfragment.appendChild(element);\n\t\t\t}\n\t\t\tparent.insertBefore(fragment, endMarker);\n\n\t\t\treturn state;\n\t\t}\n\n\t\t// Update existing list\n\t\tupdateList(items, keyFn, factory, previousState);\n\t\treturn previousState;\n\t});\n}\n\nfunction updateList<T>(\n\tnewItems: T[],\n\tkeyFn: (item: T, index: number) => unknown,\n\tfactory: (item: T, index: number) => Element,\n\tstate: RepeatRawState\n): void {\n\tconst oldItems = state.keyToItem;\n\tconst newKeyToItem = new Map<unknown, { key: unknown; element: Element }>();\n\tconst parent = state.startMarker.parentElement!;\n\tconst endMarker = state.endMarker;\n\n\t// Quick path: same length, same keys in order - just update in place\n\tif (oldItems.size === newItems.length) {\n\t\tlet allMatch = true;\n\t\tlet i = 0;\n\t\tfor (const [key] of oldItems) {\n\t\t\tif (key !== keyFn(newItems[i], i)) {\n\t\t\t\tallMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tif (allMatch) {\n\t\t\t// Update elements in place\n\t\t\ti = 0;\n\t\t\tfor (const [key, { element }] of oldItems) {\n\t\t\t\tconst item = newItems[i];\n\t\t\t\t// Re-create element with new data (factory handles updates)\n\t\t\t\tconst newElement = factory(item, i);\n\t\t\t\tif (element !== newElement) {\n\t\t\t\t\telement.replaceWith(newElement);\n\t\t\t\t\tnewKeyToItem.set(key, { key, element: newElement });\n\t\t\t\t} else {\n\t\t\t\t\tnewKeyToItem.set(key, { key, element });\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tstate.keyToItem = newKeyToItem;\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Full reconciliation\n\tconst fragment = document.createDocumentFragment();\n\tconst usedKeys = new Set<unknown>();\n\n\tfor (let i = 0; i < newItems.length; i++) {\n\t\tconst item = newItems[i];\n\t\tconst key = keyFn(item, i);\n\t\tusedKeys.add(key);\n\n\t\tconst existing = oldItems.get(key);\n\t\tif (existing) {\n\t\t\t// Update existing element\n\t\t\tconst newElement = factory(item, i);\n\t\t\tif (existing.element !== newElement) {\n\t\t\t\t// Factory returned a new element, use it\n\t\t\t\tnewKeyToItem.set(key, { key, element: newElement });\n\t\t\t\tfragment.appendChild(newElement);\n\t\t\t} else {\n\t\t\t\tnewKeyToItem.set(key, existing);\n\t\t\t\tfragment.appendChild(existing.element);\n\t\t\t}\n\t\t} else {\n\t\t\t// Create new element\n\t\t\tconst element = factory(item, i);\n\t\t\tnewKeyToItem.set(key, { key, element });\n\t\t\tfragment.appendChild(element);\n\t\t}\n\t}\n\n\t// Remove unused elements\n\tfor (const [key, { element }] of oldItems) {\n\t\tif (!usedKeys.has(key)) {\n\t\t\telement.remove();\n\t\t}\n\t}\n\n\t// Replace all content\n\tparent.insertBefore(fragment, endMarker);\n\n\tstate.keyToItem = newKeyToItem;\n}\n","/**\n * When directive - Conditional rendering\n *\n * Efficiently shows/hides content based on a condition.\n * Removes from DOM when false, adds back when true.\n */\n\nimport type { TemplateResult } from '../../classes/template-result.class';\nimport { directive } from '../functions/directive.function';\nimport { type IDirectiveResult } from '../interfaces/idirective-result.interface';\n\ninterface WhenState {\n\tcondition: boolean;\n\ttemplate: TemplateResult;\n\tfalseTemplate: TemplateResult | null;\n\tcontainer: DocumentFragment | null;\n\tstartMarker: Comment;\n\tendMarker: Comment;\n\tnodes: Node[];\n}\n\n/**\n * Conditionally renders a template.\n *\n * Usage:\n * when(isLoggedIn, () => html`<div>Welcome!</div>`)\n * when(isLoggedIn, () => html`<div>Welcome!</div>`, () => html`<div>Please log in</div>`)\n *\n * @param condition - When true, renders the template. When false, removes from DOM (or renders falseTemplate if provided).\n * @param template - Template function to render when condition is true\n * @param falseTemplate - Optional template function to render when condition is false\n */\nexport function when(\n\tcondition: boolean,\n\ttemplate: () => TemplateResult,\n\tfalseTemplate?: () => TemplateResult\n): IDirectiveResult {\n\treturn directive((container: Node, previousState?: WhenState): WhenState => {\n\t\t// First render - setup markers\n\t\tif (!previousState) {\n\t\t\tconst parent = container.parentNode;\n\t\t\tif (!parent) {\n\t\t\t\tthrow new Error('when() directive: container must be attached to a parent node');\n\t\t\t}\n\n\t\t\tconst startMarker = document.createComment('when-start');\n\t\t\tconst endMarker = document.createComment('when-end');\n\n\t\t\tparent.replaceChild(startMarker, container);\n\t\t\tparent.insertBefore(endMarker, startMarker.nextSibling);\n\n\t\t\tconst state: WhenState = {\n\t\t\t\tcondition: false,\n\t\t\t\ttemplate: template(),\n\t\t\t\tfalseTemplate: falseTemplate ? falseTemplate() : null,\n\t\t\t\tcontainer: null,\n\t\t\t\tstartMarker,\n\t\t\t\tendMarker,\n\t\t\t\tnodes: []\n\t\t\t};\n\n\t\t\tif (condition) {\n\t\t\t\trenderContent(state, true);\n\t\t\t} else if (state.falseTemplate) {\n\t\t\t\trenderContent(state, false);\n\t\t\t}\n\n\t\t\tstate.condition = condition;\n\t\t\treturn state;\n\t\t}\n\n\t\t// Get parent from the markers (which are still in the DOM)\n\t\tconst parent = previousState.startMarker.parentNode;\n\t\tif (!parent) {\n\t\t\tthrow new Error('when() directive: markers were removed from DOM');\n\t\t}\n\n\t\t// Condition changed from false to true\n\t\tif (condition && !previousState.condition) {\n\t\t\tremoveContent(previousState);\n\t\t\tpreviousState.template = template();\n\t\t\trenderContent(previousState, true);\n\t\t}\n\t\t// Condition changed from true to false\n\t\telse if (!condition && previousState.condition) {\n\t\t\tremoveContent(previousState);\n\t\t\tif (falseTemplate) {\n\t\t\t\tpreviousState.falseTemplate = falseTemplate();\n\t\t\t\trenderContent(previousState, false);\n\t\t\t}\n\t\t}\n\t\t// Condition still true - update template\n\t\telse if (condition && previousState.condition) {\n\t\t\tconst newTemplate = template();\n\t\t\tif (previousState.container) {\n\t\t\t\tnewTemplate.renderInto(previousState.container);\n\t\t\t}\n\t\t\tpreviousState.template = newTemplate;\n\t\t}\n\t\t// Condition still false - update false template if provided\n\t\telse if (!condition && !previousState.condition && falseTemplate) {\n\t\t\tconst newFalseTemplate = falseTemplate();\n\t\t\tif (previousState.container) {\n\t\t\t\tnewFalseTemplate.renderInto(previousState.container);\n\t\t\t}\n\t\t\tpreviousState.falseTemplate = newFalseTemplate;\n\t\t}\n\n\t\tpreviousState.condition = condition;\n\t\treturn previousState;\n\t});\n}\n\nfunction renderContent(state: WhenState, useTrueTemplate: boolean): void {\n\tconst parent = state.startMarker.parentNode;\n\tif (!parent) {\n\t\tthrow new Error('when() directive: markers not in DOM');\n\t}\n\n\tconst templateToRender = useTrueTemplate ? state.template : state.falseTemplate;\n\tif (!templateToRender) return;\n\n\tconst container = document.createDocumentFragment();\n\ttemplateToRender.renderInto(container);\n\tstate.container = container;\n\n\t// Insert nodes between markers\n\tstate.nodes = Array.from(container.childNodes);\n\tfor (const node of state.nodes) {\n\t\tparent.insertBefore(node, state.endMarker);\n\t}\n}\n\nfunction removeContent(state: WhenState): void {\n\tfor (const node of state.nodes) {\n\t\tnode.parentNode?.removeChild(node);\n\t}\n\tstate.nodes = [];\n\tstate.container = null;\n}\n","/**\n * ClassMap directive - Conditional CSS classes\n *\n * Efficiently applies CSS classes based on an object of conditions.\n */\n\nimport { directive } from '../functions/directive.function';\nimport type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\n/**\n * Applies CSS classes based on an object mapping.\n *\n * Usage:\n * <div class=${classMap({ active: isActive, disabled: isDisabled })}></div>\n *\n * Only classes with truthy values are applied.\n *\n * @param classes - Object mapping class names to boolean conditions\n */\nexport function classMap(classes: Record<string, boolean | undefined>): IDirectiveResult {\n\treturn directive((container: Node, previousClasses?: Set<string>) => {\n\t\tconst element = container as Element;\n\t\tconst currentClasses = new Set<string>();\n\n\t\t// Apply new classes\n\t\tfor (const [className, shouldApply] of Object.entries(classes)) {\n\t\t\tif (shouldApply) {\n\t\t\t\telement.classList.add(className);\n\t\t\t\tcurrentClasses.add(className);\n\t\t\t}\n\t\t}\n\n\t\t// Remove old classes that are no longer present\n\t\tif (previousClasses) {\n\t\t\tfor (const className of previousClasses) {\n\t\t\t\tif (!currentClasses.has(className)) {\n\t\t\t\t\telement.classList.remove(className);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn currentClasses;\n\t});\n}\n","/**\n * StyleMap directive - Dynamic inline styles\n *\n * Efficiently applies inline styles based on an object.\n */\n\nimport { directive } from '../functions/directive.function';\nimport type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\n/**\n * Applies inline styles based on an object mapping.\n *\n * Usage:\n * <div style=${styleMap({ color: 'red', fontSize: '16px' })}></div>\n *\n * @param styles - Object mapping CSS property names to values\n */\nexport function styleMap(styles: Record<string, string | number | undefined>): IDirectiveResult {\n\treturn directive((container: Node, previousStyles?: Set<string>) => {\n\t\tconst element = container as HTMLElement;\n\t\tconst currentStyles = new Set<string>();\n\n\t\t// Apply new styles\n\t\tfor (const [property, value] of Object.entries(styles)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\telement.style.setProperty(\n\t\t\t\t\t// Convert camelCase to kebab-case\n\t\t\t\t\tproperty.replace(/([A-Z])/g, '-$1').toLowerCase(),\n\t\t\t\t\tString(value)\n\t\t\t\t);\n\t\t\t\tcurrentStyles.add(property);\n\t\t\t}\n\t\t}\n\n\t\t// Remove old styles that are no longer present\n\t\tif (previousStyles) {\n\t\t\tfor (const property of previousStyles) {\n\t\t\t\tif (!currentStyles.has(property)) {\n\t\t\t\t\telement.style.removeProperty(property.replace(/([A-Z])/g, '-$1').toLowerCase());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn currentStyles;\n\t});\n}\n","/**\n * UnsafeHTML directive - Render raw HTML\n *\n * ⚠️ WARNING: Only use with trusted content! This can expose you to XSS attacks.\n */\n\nimport { directive } from '../functions/directive.function';\nimport type { IDirectiveResult } from '../interfaces/idirective-result.interface';\n\n/**\n * Renders raw HTML string into the DOM.\n *\n * ⚠️ SECURITY WARNING: Only use with trusted, sanitized HTML!\n * Never use with user-generated content without sanitization.\n *\n * Usage:\n * <div>${unsafeHTML('<strong>Bold text</strong>')}</div>\n *\n * @param html - Raw HTML string to render\n */\ninterface UnsafeHTMLState {\n\thtml: string;\n\tstartMarker: Comment;\n\tendMarker: Comment;\n\tnodes: Node[];\n}\n\nexport function unsafeHTML(html: string): IDirectiveResult {\n\treturn directive((container: Node, previousState?: UnsafeHTMLState) => {\n\t\t// First render - setup markers\n\t\tif (!previousState) {\n\t\t\tconst parent = container.parentNode;\n\t\t\tif (!parent) {\n\t\t\t\tthrow new Error('unsafeHTML() directive: container must be attached to a parent node');\n\t\t\t}\n\n\t\t\tconst startMarker = document.createComment('unsafeHTML-start');\n\t\t\tconst endMarker = document.createComment('unsafeHTML-end');\n\n\t\t\tparent.replaceChild(startMarker, container);\n\t\t\tparent.insertBefore(endMarker, startMarker.nextSibling);\n\n\t\t\tconst state: UnsafeHTMLState = {\n\t\t\t\thtml: '',\n\t\t\t\tstartMarker,\n\t\t\t\tendMarker,\n\t\t\t\tnodes: []\n\t\t\t};\n\n\t\t\trenderHTML(html, state);\n\t\t\treturn state;\n\t\t}\n\n\t\t// Skip if HTML hasn't changed\n\t\tif (previousState.html === html) {\n\t\t\treturn previousState;\n\t\t}\n\n\t\t// Update HTML\n\t\trenderHTML(html, previousState);\n\t\treturn previousState;\n\t});\n}\n\nfunction renderHTML(html: string, state: UnsafeHTMLState): void {\n\tconst parent = state.startMarker.parentNode;\n\tif (!parent) {\n\t\tthrow new Error('unsafeHTML() directive: markers not in DOM');\n\t}\n\n\t// Remove old nodes\n\tfor (const node of state.nodes) {\n\t\tnode.parentNode?.removeChild(node);\n\t}\n\n\t// Create new nodes from HTML\n\tconst temp = document.createElement('div');\n\ttemp.innerHTML = html;\n\n\tconst fragment = document.createDocumentFragment();\n\twhile (temp.firstChild) {\n\t\tfragment.appendChild(temp.firstChild);\n\t}\n\n\t// Insert new nodes between markers\n\tstate.nodes = Array.from(fragment.childNodes);\n\tfor (const node of state.nodes) {\n\t\tparent.insertBefore(node, state.endMarker);\n\t}\n\n\tstate.html = html;\n}\n","import { registerAttributeDirective } from '../functions/attribute-directive.functions';\nimport type { AttributeDirectiveCleanupFunction } from '../types/attribute-directive-cleanup-function.type';\n\n/**\n * Options for the portal directive when using object syntax\n */\nexport interface PortalOptions {\n\t/** Target element or selector where content will be teleported */\n\ttarget: string | Element;\n\n\t/** Keep content in target after source component unmounts (default: false) */\n\tpersist?: boolean;\n}\n\n/**\n * Portal directive value - can be string selector, Element, or options object\n */\nexport type PortalValue = string | Element | PortalOptions;\n\n/**\n * Resolve target from string selector or Element\n */\nfunction resolveTarget(target: string | Element): Element | null {\n\tif (typeof target === 'string') {\n\t\treturn document.querySelector(target);\n\t}\n\treturn target;\n}\n\n/**\n * Parse portal value into normalized options\n */\nfunction parsePortalValue(value: PortalValue): PortalOptions {\n\tif (typeof value === 'string') {\n\t\treturn { target: value, persist: false };\n\t}\n\n\tif (value instanceof Element) {\n\t\treturn { target: value, persist: false };\n\t}\n\n\treturn {\n\t\ttarget: value.target,\n\t\tpersist: value.persist ?? false\n\t};\n}\n\n/**\n * Portal attribute directive - Teleports an element to a different location in the DOM\n *\n * Usage:\n * ```html\n * <!-- Basic - teleport to body -->\n * <div class=\"modal\" :portal=\"body\">...</div>\n *\n * <!-- Teleport to specific container -->\n * <div class=\"tooltip\" :portal=\"#tooltip-root\">...</div>\n *\n * <!-- Dynamic target -->\n * <div class=\"dropdown\" :portal=${this.container}>...</div>\n *\n * <!-- With options (persist after unmount) -->\n * <div class=\"toast\" :portal=${{ target: '#notifications', persist: true }}>...</div>\n * ```\n */\nfunction portalDirective(element: Element, value: unknown, _: string): AttributeDirectiveCleanupFunction | void {\n\tif (!value) {\n\t\tconsole.warn('portal directive: value is required');\n\t\treturn;\n\t}\n\n\tconst options = parsePortalValue(value as PortalValue);\n\tconst targetElement = resolveTarget(options.target);\n\n\tif (!targetElement) {\n\t\tconsole.warn(`portal directive: target \"${options.target}\" not found`);\n\t\treturn;\n\t}\n\n\t// Don't teleport if already in target\n\tif (element.parentNode === targetElement) {\n\t\treturn;\n\t}\n\n\t// Create placeholder comment at original position\n\tconst placeholder = document.createComment('portal-placeholder');\n\telement.parentNode?.insertBefore(placeholder, element);\n\n\t// Remove portal attribute to avoid re-processing\n\telement.removeAttribute(':portal');\n\n\t// Move element to target\n\ttargetElement.appendChild(element);\n\n\t// Return cleanup function\n\treturn () => {\n\t\tif (!options.persist) {\n\t\t\t// Remove from target\n\t\t\telement.remove();\n\t\t}\n\n\t\t// Remove placeholder\n\t\tplaceholder.remove();\n\t};\n}\n\n// Register the directive\nregisterAttributeDirective('portal', portalDirective);\n\nexport { portalDirective };\n","import type { IDirectiveResult } from './interfaces/idirective-result.interface';\n\nexport abstract class Directive implements IDirectiveResult {\n\tabstract render(container: Node, previousState?: any): any;\n\n\t__directive = true as const;\n}\n","import { signal, computed } from '../../signals';\nimport type { Signal } from '../../signals';\nimport type { IFormControl, FormControlOptions, FormControlState } from '../types/form-control.types';\nimport type { ValidatorFn, AsyncValidatorFn, ValidationErrors, ValidationError } from '../types/validation.types';\n\nexport const FORM_CONTROL_MARKER = Symbol('melodic.formControl');\n\nexport class FormControl<T = unknown> implements IFormControl<T> {\n\treadonly [FORM_CONTROL_MARKER] = true;\n\n\treadonly value: Signal<T>;\n\treadonly initialValue: T;\n\treadonly errors: Signal<ValidationErrors | null>;\n\treadonly updateOn: 'input' | 'blur' | 'submit';\n\n\tprivate _validators: ValidatorFn<T>[] = [];\n\tprivate _asyncValidators: AsyncValidatorFn<T>[] = [];\n\tprivate readonly _touched = signal<boolean>(false);\n\tprivate readonly _dirty = signal<boolean>(false);\n\tprivate readonly _pending = signal<boolean>(false);\n\tprivate readonly _disabled = signal<boolean>(false);\n\tprivate _asyncValidationId = 0;\n\n\treadonly dirty: Signal<boolean>;\n\treadonly touched: Signal<boolean>;\n\treadonly pristine: Signal<boolean>;\n\treadonly valid: Signal<boolean>;\n\treadonly invalid: Signal<boolean>;\n\treadonly pending: Signal<boolean>;\n\treadonly disabled: Signal<boolean>;\n\treadonly state: Signal<FormControlState>;\n\n\tconstructor(initialValue: T, options: FormControlOptions<T> = {}) {\n\t\tthis.initialValue = initialValue;\n\t\tthis.value = signal<T>(initialValue);\n\t\tthis.errors = signal<ValidationErrors | null>(null);\n\n\t\tthis._validators = options.validators ?? [];\n\t\tthis._asyncValidators = options.asyncValidators ?? [];\n\t\tthis._disabled.set(options.disabled ?? false);\n\t\tthis.updateOn = options.updateOn ?? 'input';\n\n\t\t// Computed state signals\n\t\tthis.dirty = computed(() => this._dirty());\n\t\tthis.touched = computed(() => this._touched());\n\t\tthis.pristine = computed(() => !this._dirty());\n\t\tthis.pending = computed(() => this._pending());\n\t\tthis.disabled = computed(() => this._disabled());\n\n\t\tthis.valid = computed(() => this.errors() === null && !this._pending());\n\t\tthis.invalid = computed(() => this.errors() !== null);\n\n\t\tthis.state = computed<FormControlState>(() => ({\n\t\t\tdirty: this._dirty(),\n\t\t\ttouched: this._touched(),\n\t\t\tpristine: !this._dirty(),\n\t\t\tuntouched: !this._touched(),\n\t\t\tvalid: this.errors() === null && !this._pending(),\n\t\t\tinvalid: this.errors() !== null,\n\t\t\tpending: this._pending(),\n\t\t\tdisabled: this._disabled(),\n\t\t\tenabled: !this._disabled()\n\t\t}));\n\n\t\t// Run initial validation\n\t\tthis.runValidation();\n\t}\n\n\tsetValue(value: T): void {\n\t\tif (this._disabled()) return;\n\n\t\tthis.value.set(value);\n\t\tthis._dirty.set(true);\n\n\t\tif (this.updateOn === 'input') {\n\t\t\tthis.runValidation();\n\t\t}\n\t}\n\n\tpatchValue(value: Partial<T>): void {\n\t\tif (typeof this.value() === 'object' && this.value() !== null) {\n\t\t\tthis.setValue({ ...this.value(), ...value });\n\t\t} else {\n\t\t\tthis.setValue(value as T);\n\t\t}\n\t}\n\n\treset(value?: T): void {\n\t\tthis.value.set(value ?? this.initialValue);\n\t\tthis._dirty.set(false);\n\t\tthis._touched.set(false);\n\t\tthis.errors.set(null);\n\t\tthis.runValidation();\n\t}\n\n\tmarkAsTouched(): void {\n\t\tthis._touched.set(true);\n\n\t\tif (this.updateOn === 'blur') {\n\t\t\tthis.runValidation();\n\t\t}\n\t}\n\n\tmarkAsUntouched(): void {\n\t\tthis._touched.set(false);\n\t}\n\n\tmarkAsDirty(): void {\n\t\tthis._dirty.set(true);\n\t}\n\n\tmarkAsPristine(): void {\n\t\tthis._dirty.set(false);\n\t}\n\n\tdisable(): void {\n\t\tthis._disabled.set(true);\n\t}\n\n\tenable(): void {\n\t\tthis._disabled.set(false);\n\t}\n\n\tsetValidators(validators: ValidatorFn<T>[]): void {\n\t\tthis._validators = validators;\n\t\tthis.runValidation();\n\t}\n\n\tsetAsyncValidators(validators: AsyncValidatorFn<T>[]): void {\n\t\tthis._asyncValidators = validators;\n\t\tthis.runValidation();\n\t}\n\n\taddValidators(validators: ValidatorFn<T>[]): void {\n\t\tthis._validators = [...this._validators, ...validators];\n\t\tthis.runValidation();\n\t}\n\n\tremoveValidators(validators: ValidatorFn<T>[]): void {\n\t\tthis._validators = this._validators.filter((v) => !validators.includes(v));\n\t\tthis.runValidation();\n\t}\n\n\tasync validate(): Promise<void> {\n\t\tawait this.runValidation();\n\t}\n\n\tgetError(code: string): ValidationError | null {\n\t\treturn this.errors()?.[code] ?? null;\n\t}\n\n\thasError(code: string): boolean {\n\t\treturn this.errors()?.[code] !== undefined;\n\t}\n\n\tdestroy(): void {\n\t\tthis.value.destroy();\n\t\tthis.errors.destroy();\n\t\tthis._touched.destroy();\n\t\tthis._dirty.destroy();\n\t\tthis._pending.destroy();\n\t\tthis._disabled.destroy();\n\t}\n\n\tprivate async runValidation(): Promise<void> {\n\t\tconst value = this.value();\n\n\t\t// Run sync validators\n\t\tlet errors: ValidationErrors | null = null;\n\n\t\tfor (const validator of this._validators) {\n\t\t\tconst result = validator(value);\n\t\t\tif (result !== null) {\n\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t}\n\t\t}\n\n\t\t// If sync validation fails, set errors and skip async\n\t\tif (errors !== null) {\n\t\t\tthis.errors.set(errors);\n\t\t\treturn;\n\t\t}\n\n\t\t// Run async validators if any\n\t\tif (this._asyncValidators.length > 0) {\n\t\t\tconst validationId = ++this._asyncValidationId;\n\t\t\tthis._pending.set(true);\n\n\t\t\ttry {\n\t\t\t\tconst asyncResults = await Promise.all(this._asyncValidators.map((v) => v(value)));\n\n\t\t\t\t// Check if this is still the latest validation\n\t\t\t\tif (validationId !== this._asyncValidationId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (const result of asyncResults) {\n\t\t\t\t\tif (result !== null) {\n\t\t\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (validationId === this._asyncValidationId) {\n\t\t\t\t\tthis._pending.set(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.errors.set(errors);\n\t}\n}\n","import { signal, computed, SignalEffect } from '../../signals';\nimport type { Signal } from '../../signals';\nimport type { IFormGroup, FormGroupControls, FormGroupValue, FormGroupOptions } from '../types/form-group.types';\nimport type { IFormControl } from '../types/form-control.types';\nimport type { ValidatorFn, AsyncValidatorFn, ValidationErrors, ValidationError } from '../types/validation.types';\n\nexport const FORM_GROUP_MARKER = Symbol('melodic.formGroup');\n\nexport class FormGroup<T extends Record<string, unknown> = Record<string, unknown>> implements IFormGroup<T> {\n\treadonly [FORM_GROUP_MARKER] = true;\n\n\treadonly controls: FormGroupControls<T>;\n\treadonly value: Signal<FormGroupValue<T>>;\n\treadonly errors: Signal<ValidationErrors | null>;\n\n\tprivate _validators: ValidatorFn<FormGroupValue<T>>[] = [];\n\tprivate readonly _asyncValidators: AsyncValidatorFn<FormGroupValue<T>>[] = [];\n\tprivate readonly _disabled = signal<boolean>(false);\n\tprivate readonly _controlEffects: SignalEffect[] = [];\n\n\treadonly valid: Signal<boolean>;\n\treadonly invalid: Signal<boolean>;\n\treadonly pending: Signal<boolean>;\n\treadonly dirty: Signal<boolean>;\n\treadonly touched: Signal<boolean>;\n\treadonly pristine: Signal<boolean>;\n\treadonly disabled: Signal<boolean>;\n\n\tconstructor(controls: FormGroupControls<T>, options: FormGroupOptions<T> = {}) {\n\t\tthis.controls = controls;\n\t\tthis._validators = options.validators ?? [];\n\t\tthis._asyncValidators = options.asyncValidators ?? [];\n\t\tthis._disabled.set(options.disabled ?? false);\n\n\t\t// Create value signal that computes from all controls\n\t\tthis.value = computed(() => this.computeValue());\n\t\tthis.errors = signal<ValidationErrors | null>(null);\n\n\t\t// Setup child control watchers\n\t\tthis.setupControlWatchers();\n\n\t\t// Computed aggregate state\n\t\tthis.valid = computed(() => {\n\t\t\tconst groupErrors = this.errors();\n\t\t\tif (groupErrors !== null) return false;\n\n\t\t\treturn Object.values(this.controls).every((control) => (control as IFormControl).valid());\n\t\t});\n\n\t\tthis.invalid = computed(() => !this.valid());\n\n\t\tthis.pending = computed(() => {\n\t\t\treturn Object.values(this.controls).some((control) => (control as IFormControl).pending());\n\t\t});\n\n\t\tthis.dirty = computed(() => {\n\t\t\treturn Object.values(this.controls).some((control) => (control as IFormControl).dirty());\n\t\t});\n\n\t\tthis.touched = computed(() => {\n\t\t\treturn Object.values(this.controls).some((control) => (control as IFormControl).touched());\n\t\t});\n\n\t\tthis.pristine = computed(() => !this.dirty());\n\t\tthis.disabled = computed(() => this._disabled());\n\n\t\t// Run initial validation\n\t\tthis.runGroupValidation();\n\t}\n\n\tget<K extends keyof T>(name: K): IFormControl<T[K]> {\n\t\treturn this.controls[name];\n\t}\n\n\taddControl<K extends string, V>(name: K, control: IFormControl<V>): void {\n\t\t(this.controls as Record<string, IFormControl<unknown>>)[name] = control;\n\t\tthis.setupControlWatcher(control);\n\t}\n\n\tremoveControl<K extends keyof T>(name: K): void {\n\t\tdelete (this.controls as Record<string, IFormControl<unknown>>)[name as string];\n\t}\n\n\tcontains<K extends keyof T>(name: K): boolean {\n\t\treturn name in this.controls;\n\t}\n\n\tsetValue(value: FormGroupValue<T>): void {\n\t\tObject.keys(value).forEach((key) => {\n\t\t\tconst control = this.controls[key as keyof T];\n\t\t\tif (control) {\n\t\t\t\tcontrol.setValue(value[key as keyof T]);\n\t\t\t}\n\t\t});\n\t}\n\n\tpatchValue(value: Partial<FormGroupValue<T>>): void {\n\t\tObject.keys(value).forEach((key) => {\n\t\t\tconst control = this.controls[key as keyof T];\n\t\t\tif (control && value[key as keyof T] !== undefined) {\n\t\t\t\tcontrol.setValue(value[key as keyof T]!);\n\t\t\t}\n\t\t});\n\t}\n\n\treset(value?: Partial<FormGroupValue<T>>): void {\n\t\tObject.keys(this.controls).forEach((key) => {\n\t\t\tconst control = this.controls[key as keyof T];\n\t\t\tconst resetValue = value?.[key as keyof T];\n\t\t\tcontrol.reset(resetValue);\n\t\t});\n\t}\n\n\tmarkAllAsTouched(): void {\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).markAsTouched();\n\t\t});\n\t}\n\n\tmarkAllAsUntouched(): void {\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).markAsUntouched();\n\t\t});\n\t}\n\n\tmarkAllAsDirty(): void {\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).markAsDirty();\n\t\t});\n\t}\n\n\tmarkAllAsPristine(): void {\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).markAsPristine();\n\t\t});\n\t}\n\n\tdisable(): void {\n\t\tthis._disabled.set(true);\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).disable();\n\t\t});\n\t}\n\n\tenable(): void {\n\t\tthis._disabled.set(false);\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).enable();\n\t\t});\n\t}\n\n\tasync validate(): Promise<void> {\n\t\tawait Promise.all(Object.values(this.controls).map((control) => (control as IFormControl).validate()));\n\t\tawait this.runGroupValidation();\n\t}\n\n\tsetValidators(validators: ValidatorFn<FormGroupValue<T>>[]): void {\n\t\tthis._validators = validators;\n\t\tthis.runGroupValidation();\n\t}\n\n\tgetError(code: string): ValidationError | null {\n\t\treturn this.errors()?.[code] ?? null;\n\t}\n\n\thasError(code: string): boolean {\n\t\treturn this.errors()?.[code] !== undefined;\n\t}\n\n\tdestroy(): void {\n\t\tthis._controlEffects.forEach((effect) => effect.destroy());\n\t\tObject.values(this.controls).forEach((control) => {\n\t\t\t(control as IFormControl).destroy();\n\t\t});\n\t}\n\n\tprivate computeValue(): FormGroupValue<T> {\n\t\tconst result: Partial<FormGroupValue<T>> = {};\n\t\tObject.keys(this.controls).forEach((key) => {\n\t\t\tconst control = this.controls[key as keyof T];\n\t\t\tresult[key as keyof T] = control.value();\n\t\t});\n\t\treturn result as FormGroupValue<T>;\n\t}\n\n\tprivate setupControlWatchers(): void {\n\t\tObject.keys(this.controls).forEach((key) => {\n\t\t\tthis.setupControlWatcher(this.controls[key as keyof T]);\n\t\t});\n\t}\n\n\tprivate setupControlWatcher(control: IFormControl<unknown>): void {\n\t\tconst effect = new SignalEffect(() => {\n\t\t\tcontrol.value();\n\t\t\tthis.runGroupValidation();\n\t\t});\n\t\teffect.run();\n\t\tthis._controlEffects.push(effect);\n\t}\n\n\tprivate async runGroupValidation(): Promise<void> {\n\t\tconst value = this.computeValue();\n\t\tlet errors: ValidationErrors | null = null;\n\n\t\tfor (const validator of this._validators) {\n\t\t\tconst result = validator(value);\n\t\t\tif (result !== null) {\n\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t}\n\t\t}\n\n\t\t// Run async group validators\n\t\tif (this._asyncValidators.length > 0 && errors === null) {\n\t\t\tconst asyncResults = await Promise.all(this._asyncValidators.map((v) => v(value)));\n\n\t\t\tfor (const result of asyncResults) {\n\t\t\t\tif (result !== null) {\n\t\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.errors.set(errors);\n\t}\n}\n","import { FormControl } from '../classes/form-control.class';\nimport type { IFormControl, FormControlOptions } from '../types/form-control.types';\n\n/**\n * Creates a new form control with the given initial value and options.\n *\n * @example\n * ```typescript\n * const nameControl = createFormControl('', {\n * validators: [Validators.required, Validators.minLength(3)]\n * });\n *\n * const emailControl = createFormControl('', {\n * validators: [Validators.required, Validators.email],\n * asyncValidators: [uniqueEmailValidator]\n * });\n * ```\n */\nexport function createFormControl<T>(initialValue: T, options?: FormControlOptions<T>): IFormControl<T> {\n\treturn new FormControl(initialValue, options);\n}\n","import { FormGroup } from '../classes/form-group.class';\nimport type { FormGroupControls, FormGroupOptions, IFormGroup } from '../types/form-group.types';\n\n/**\n * Creates a new form group with the given controls and options.\n *\n * @example\n * ```typescript\n * const form = createFormGroup({\n * name: createFormControl('', { validators: [Validators.required] }),\n * email: createFormControl('', { validators: [Validators.email] }),\n * age: createFormControl<number | null>(null, { validators: [Validators.min(18)] })\n * });\n * ```\n */\nexport function createFormGroup<T extends Record<string, unknown>>(controls: FormGroupControls<T>, options?: FormGroupOptions<T>): IFormGroup<T> {\n\treturn new FormGroup(controls, options);\n}\n","import type { ValidatorFn, AsyncValidatorFn, ValidationErrors } from '../types/validation.types';\n\n/**\n * Built-in validators for form controls\n */\nexport const Validators = {\n\t/**\n\t * Requires the control to have a non-empty value\n\t */\n\trequired: <T>(value: T): ValidationErrors | null => {\n\t\tconst isEmpty = value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0);\n\n\t\treturn isEmpty\n\t\t\t? {\n\t\t\t\t\trequired: {\n\t\t\t\t\t\tcode: 'required',\n\t\t\t\t\t\tmessage: 'This field is required'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: null;\n\t},\n\n\t/**\n\t * Requires the control value to have a minimum length\n\t */\n\tminLength: (min: number): ValidatorFn<string> => {\n\t\treturn (value: string): ValidationErrors | null => {\n\t\t\tif (!value || value.length === 0) return null;\n\n\t\t\treturn value.length < min\n\t\t\t\t? {\n\t\t\t\t\t\tminLength: {\n\t\t\t\t\t\t\tcode: 'minLength',\n\t\t\t\t\t\t\tmessage: `Minimum length is ${min} characters`,\n\t\t\t\t\t\t\tparams: { min, actual: value.length }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\t};\n\t},\n\n\t/**\n\t * Requires the control value to have a maximum length\n\t */\n\tmaxLength: (max: number): ValidatorFn<string> => {\n\t\treturn (value: string): ValidationErrors | null => {\n\t\t\tif (!value) return null;\n\n\t\t\treturn value.length > max\n\t\t\t\t? {\n\t\t\t\t\t\tmaxLength: {\n\t\t\t\t\t\t\tcode: 'maxLength',\n\t\t\t\t\t\t\tmessage: `Maximum length is ${max} characters`,\n\t\t\t\t\t\t\tparams: { max, actual: value.length }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\t};\n\t},\n\n\t/**\n\t * Requires the control value to match a regex pattern\n\t */\n\tpattern: (regex: RegExp): ValidatorFn<string> => {\n\t\treturn (value: string): ValidationErrors | null => {\n\t\t\tif (!value) return null;\n\n\t\t\treturn !regex.test(value)\n\t\t\t\t? {\n\t\t\t\t\t\tpattern: {\n\t\t\t\t\t\t\tcode: 'pattern',\n\t\t\t\t\t\t\tmessage: 'Value does not match required pattern',\n\t\t\t\t\t\t\tparams: { pattern: regex.toString() }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\t};\n\t},\n\n\t/**\n\t * Requires the control value to be a valid email\n\t */\n\temail: (value: string): ValidationErrors | null => {\n\t\tif (!value) return null;\n\n\t\tconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\n\n\t\treturn !emailRegex.test(value)\n\t\t\t? {\n\t\t\t\t\temail: {\n\t\t\t\t\t\tcode: 'email',\n\t\t\t\t\t\tmessage: 'Please enter a valid email address'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: null;\n\t},\n\n\t/**\n\t * Requires the control value to be at least a minimum number\n\t */\n\tmin: (minValue: number): ValidatorFn<number> => {\n\t\treturn (value: number): ValidationErrors | null => {\n\t\t\tif (value === null || value === undefined) return null;\n\n\t\t\treturn value < minValue\n\t\t\t\t? {\n\t\t\t\t\t\tmin: {\n\t\t\t\t\t\t\tcode: 'min',\n\t\t\t\t\t\t\tmessage: `Value must be at least ${minValue}`,\n\t\t\t\t\t\t\tparams: { min: minValue, actual: value }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\t};\n\t},\n\n\t/**\n\t * Requires the control value to be at most a maximum number\n\t */\n\tmax: (maxValue: number): ValidatorFn<number> => {\n\t\treturn (value: number): ValidationErrors | null => {\n\t\t\tif (value === null || value === undefined) return null;\n\n\t\t\treturn value > maxValue\n\t\t\t\t? {\n\t\t\t\t\t\tmax: {\n\t\t\t\t\t\t\tcode: 'max',\n\t\t\t\t\t\t\tmessage: `Value must be at most ${maxValue}`,\n\t\t\t\t\t\t\tparams: { max: maxValue, actual: value }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\t};\n\t},\n\n\t/**\n\t * Requires the control value to be within a range\n\t */\n\trange: (minValue: number, maxValue: number): ValidatorFn<number> => {\n\t\treturn (value: number): ValidationErrors | null => {\n\t\t\tif (value === null || value === undefined) return null;\n\n\t\t\tif (value < minValue || value > maxValue) {\n\t\t\t\treturn {\n\t\t\t\t\trange: {\n\t\t\t\t\t\tcode: 'range',\n\t\t\t\t\t\tmessage: `Value must be between ${minValue} and ${maxValue}`,\n\t\t\t\t\t\tparams: { min: minValue, max: maxValue, actual: value }\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t},\n\n\t/**\n\t * Compose multiple validators into one\n\t */\n\tcompose: <T>(...validators: ValidatorFn<T>[]): ValidatorFn<T> => {\n\t\treturn (value: T): ValidationErrors | null => {\n\t\t\tlet errors: ValidationErrors | null = null;\n\n\t\t\tfor (const validator of validators) {\n\t\t\t\tconst result = validator(value);\n\t\t\t\tif (result !== null) {\n\t\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn errors;\n\t\t};\n\t},\n\n\t/**\n\t * Compose async validators into one\n\t */\n\tcomposeAsync: <T>(...validators: AsyncValidatorFn<T>[]): AsyncValidatorFn<T> => {\n\t\treturn async (value: T): Promise<ValidationErrors | null> => {\n\t\t\tconst results = await Promise.all(validators.map((v) => v(value)));\n\t\t\tlet errors: ValidationErrors | null = null;\n\n\t\t\tfor (const result of results) {\n\t\t\t\tif (result !== null) {\n\t\t\t\t\terrors = { ...(errors ?? {}), ...result };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn errors;\n\t\t};\n\t}\n};\n\n/**\n * Factory for creating custom validators\n */\nexport function createValidator<T>(code: string, validationFn: (value: T) => boolean, message: string | ((value: T) => string)): ValidatorFn<T> {\n\treturn (value: T): ValidationErrors | null => {\n\t\tif (validationFn(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\t[code]: {\n\t\t\t\tcode,\n\t\t\t\tmessage: typeof message === 'function' ? message(value) : message\n\t\t\t}\n\t\t};\n\t};\n}\n\n/**\n * Factory for creating async validators\n */\nexport function createAsyncValidator<T>(\n\tcode: string,\n\tvalidationFn: (value: T) => Promise<boolean>,\n\tmessage: string | ((value: T) => string)\n): AsyncValidatorFn<T> {\n\treturn async (value: T): Promise<ValidationErrors | null> => {\n\t\tconst isValid = await validationFn(value);\n\n\t\tif (isValid) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\t[code]: {\n\t\t\t\tcode,\n\t\t\t\tmessage: typeof message === 'function' ? message(value) : message\n\t\t\t}\n\t\t};\n\t};\n}\n","import { registerAttributeDirective } from '../../template/directives/functions/attribute-directive.functions';\nimport type { AttributeDirectiveCleanupFunction } from '../../template/directives/types/attribute-directive-cleanup-function.type';\nimport type { IFormControl } from '../types/form-control.types';\nimport { FORM_CONTROL_MARKER } from '../classes/form-control.class';\n\n/**\n * Check if value is a FormControl\n */\nfunction isFormControl(value: unknown): value is IFormControl {\n\treturn value !== null && typeof value === 'object' && FORM_CONTROL_MARKER in value;\n}\n\n/**\n * Get input type for different form elements\n */\nfunction getInputType(element: Element): 'text' | 'checkbox' | 'radio' | 'select' | 'textarea' {\n\tconst tagName = element.tagName.toLowerCase();\n\n\tif (tagName === 'select') return 'select';\n\tif (tagName === 'textarea') return 'textarea';\n\n\tif (tagName === 'input') {\n\t\tconst type = (element as HTMLInputElement).type.toLowerCase();\n\t\tif (type === 'checkbox') return 'checkbox';\n\t\tif (type === 'radio') return 'radio';\n\t}\n\n\treturn 'text';\n}\n\n/**\n * formControl directive - Binds a FormControl to an input element\n *\n * Usage:\n * ```html\n * <input type=\"text\" :formControl=${this.nameControl} />\n * <input type=\"checkbox\" :formControl=${this.acceptedControl} />\n * <select :formControl=${this.countryControl}>...</select>\n * <textarea :formControl=${this.bioControl}></textarea>\n * ```\n */\nfunction formControlDirective(element: Element, value: unknown, _: string): AttributeDirectiveCleanupFunction | void {\n\tif (!isFormControl(value)) {\n\t\tconsole.warn('formControl directive: value must be a FormControl');\n\t\treturn;\n\t}\n\n\tconst control = value as IFormControl<unknown>;\n\tconst inputType = getInputType(element);\n\n\t// Cleanup functions storage\n\tconst cleanupFns: (() => void)[] = [];\n\n\t// Set element value based on input type\n\tconst setElementValue = (val: unknown): void => {\n\t\tif (inputType === 'checkbox') {\n\t\t\t(element as HTMLInputElement).checked = Boolean(val);\n\t\t} else if (inputType === 'radio') {\n\t\t\t(element as HTMLInputElement).checked = (element as HTMLInputElement).value === val;\n\t\t} else {\n\t\t\t(element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).value =\n\t\t\t\tval !== null && val !== undefined ? String(val) : '';\n\t\t}\n\t};\n\n\t// Set element disabled state\n\tconst setElementDisabled = (disabled: boolean): void => {\n\t\tif (disabled) {\n\t\t\telement.setAttribute('disabled', '');\n\t\t} else {\n\t\t\telement.removeAttribute('disabled');\n\t\t}\n\t};\n\n\t// Update validation CSS classes\n\tconst updateValidationClasses = (): void => {\n\t\telement.classList.toggle('mf-valid', control.valid());\n\t\telement.classList.toggle('mf-invalid', control.invalid());\n\t\telement.classList.toggle('mf-dirty', control.dirty());\n\t\telement.classList.toggle('mf-pristine', control.pristine());\n\t\telement.classList.toggle('mf-touched', control.touched());\n\t\telement.classList.toggle('mf-pending', control.pending());\n\t\telement.classList.toggle('mf-disabled', control.disabled());\n\t};\n\n\t// Input event handler\n\tconst handleInput = (e: Event): void => {\n\t\tconst target = e.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n\t\tif (inputType === 'checkbox') {\n\t\t\tcontrol.setValue((target as HTMLInputElement).checked);\n\t\t} else if (inputType === 'radio') {\n\t\t\tif ((target as HTMLInputElement).checked) {\n\t\t\t\tcontrol.setValue(target.value);\n\t\t\t}\n\t\t} else {\n\t\t\tcontrol.setValue(target.value);\n\t\t}\n\t};\n\n\t// Blur event handler\n\tconst handleBlur = (): void => {\n\t\tcontrol.markAsTouched();\n\t};\n\n\t// Set initial value\n\tsetElementValue(control.value());\n\n\t// Subscribe to value changes\n\tconst unsubscribeValue = control.value.subscribe((newValue) => {\n\t\tsetElementValue(newValue);\n\t});\n\tcleanupFns.push(unsubscribeValue);\n\n\t// Set initial disabled state\n\tsetElementDisabled(control.disabled());\n\n\t// Subscribe to disabled state\n\tconst unsubscribeDisabled = control.disabled.subscribe((disabled) => {\n\t\tsetElementDisabled(disabled);\n\t});\n\tcleanupFns.push(unsubscribeDisabled);\n\n\t// Subscribe to state for CSS classes\n\tconst unsubscribeState = control.state.subscribe(() => {\n\t\tupdateValidationClasses();\n\t});\n\tcleanupFns.push(unsubscribeState);\n\n\t// Initial CSS classes\n\tupdateValidationClasses();\n\n\t// Add event listeners\n\tconst eventType = control.updateOn === 'blur' ? 'change' : 'input';\n\telement.addEventListener(eventType, handleInput);\n\telement.addEventListener('blur', handleBlur);\n\n\t// Mark as form control element\n\telement.setAttribute('data-form-control', '');\n\n\t// Return cleanup function\n\treturn () => {\n\t\telement.removeEventListener(eventType, handleInput);\n\t\telement.removeEventListener('blur', handleBlur);\n\t\telement.removeAttribute('data-form-control');\n\t\tcleanupFns.forEach((fn) => fn());\n\t};\n}\n\n// Auto-register the directive\nregisterAttributeDirective('formControl', formControlDirective);\n\nexport { formControlDirective };\n","/**\n * Primitive color palette - these are the raw color values\n * Soft neutrals and refined colors inspired by modern UI design\n */\nexport const primitiveColors = {\n\t// White & Black\n\t'--ml-white': '#ffffff',\n\t'--ml-black': '#000000',\n\n\t// Gray scale - Softer, warmer neutrals\n\t'--ml-gray-25': '#fcfcfd',\n\t'--ml-gray-50': '#f9fafb',\n\t'--ml-gray-100': '#f2f4f7',\n\t'--ml-gray-200': '#eaecf0',\n\t'--ml-gray-300': '#d0d5dd',\n\t'--ml-gray-400': '#98a2b3',\n\t'--ml-gray-500': '#667085',\n\t'--ml-gray-600': '#475467',\n\t'--ml-gray-700': '#344054',\n\t'--ml-gray-800': '#182230',\n\t'--ml-gray-900': '#101828',\n\t'--ml-gray-950': '#0c111d',\n\n\t// Blue - Primary brand color, softer and more refined\n\t'--ml-blue-25': '#f5f8ff',\n\t'--ml-blue-50': '#eff4ff',\n\t'--ml-blue-100': '#d1e0ff',\n\t'--ml-blue-200': '#b2ccff',\n\t'--ml-blue-300': '#84adff',\n\t'--ml-blue-400': '#528bff',\n\t'--ml-blue-500': '#2970ff',\n\t'--ml-blue-600': '#155eef',\n\t'--ml-blue-700': '#004eeb',\n\t'--ml-blue-800': '#0040c1',\n\t'--ml-blue-900': '#00359e',\n\t'--ml-blue-950': '#002266',\n\n\t// Green - Success color, balanced and calming\n\t'--ml-green-25': '#f6fef9',\n\t'--ml-green-50': '#ecfdf3',\n\t'--ml-green-100': '#dcfae6',\n\t'--ml-green-200': '#abefc6',\n\t'--ml-green-300': '#75e0a7',\n\t'--ml-green-400': '#47cd89',\n\t'--ml-green-500': '#17b26a',\n\t'--ml-green-600': '#079455',\n\t'--ml-green-700': '#067647',\n\t'--ml-green-800': '#085d3a',\n\t'--ml-green-900': '#074d31',\n\t'--ml-green-950': '#053321',\n\n\t// Red - Error/danger color, refined\n\t'--ml-red-25': '#fffbfa',\n\t'--ml-red-50': '#fef3f2',\n\t'--ml-red-100': '#fee4e2',\n\t'--ml-red-200': '#fecdca',\n\t'--ml-red-300': '#fda29b',\n\t'--ml-red-400': '#f97066',\n\t'--ml-red-500': '#f04438',\n\t'--ml-red-600': '#d92d20',\n\t'--ml-red-700': '#b42318',\n\t'--ml-red-800': '#912018',\n\t'--ml-red-900': '#7a271a',\n\t'--ml-red-950': '#55160c',\n\n\t// Amber/Warning - Warm and attention-grabbing\n\t'--ml-amber-25': '#fffcf5',\n\t'--ml-amber-50': '#fffaeb',\n\t'--ml-amber-100': '#fef0c7',\n\t'--ml-amber-200': '#fedf89',\n\t'--ml-amber-300': '#fec84b',\n\t'--ml-amber-400': '#fdb022',\n\t'--ml-amber-500': '#f79009',\n\t'--ml-amber-600': '#dc6803',\n\t'--ml-amber-700': '#b54708',\n\t'--ml-amber-800': '#93370d',\n\t'--ml-amber-900': '#7a2e0e',\n\t'--ml-amber-950': '#4e1d09',\n\n\t// Cyan - Info color, cool and professional\n\t'--ml-cyan-25': '#f5feff',\n\t'--ml-cyan-50': '#ecfdff',\n\t'--ml-cyan-100': '#cff9fe',\n\t'--ml-cyan-200': '#a5f0fc',\n\t'--ml-cyan-300': '#67e3f9',\n\t'--ml-cyan-400': '#22ccee',\n\t'--ml-cyan-500': '#06aed4',\n\t'--ml-cyan-600': '#088ab2',\n\t'--ml-cyan-700': '#0e7090',\n\t'--ml-cyan-800': '#155b75',\n\t'--ml-cyan-900': '#164c63',\n\t'--ml-cyan-950': '#0d2d3a',\n\n\t// Purple - Accent color\n\t'--ml-purple-25': '#fcfaff',\n\t'--ml-purple-50': '#f9f5ff',\n\t'--ml-purple-100': '#f4ebff',\n\t'--ml-purple-200': '#e9d7fe',\n\t'--ml-purple-300': '#d6bbfb',\n\t'--ml-purple-400': '#b692f6',\n\t'--ml-purple-500': '#9e77ed',\n\t'--ml-purple-600': '#7f56d9',\n\t'--ml-purple-700': '#6941c6',\n\t'--ml-purple-800': '#53389e',\n\t'--ml-purple-900': '#42307d',\n\t'--ml-purple-950': '#2c1c5f'\n} as const;\n\n/**\n * Semantic color tokens - these reference the primitives and provide meaning\n */\nexport const colorTokens = {\n\t// Primary brand colors\n\t'--ml-color-primary': 'var(--ml-blue-600)',\n\t'--ml-color-primary-hover': 'var(--ml-blue-700)',\n\t'--ml-color-primary-active': 'var(--ml-blue-800)',\n\t'--ml-color-primary-subtle': 'var(--ml-blue-50)',\n\n\t// Secondary\n\t'--ml-color-secondary': 'var(--ml-gray-600)',\n\t'--ml-color-secondary-hover': 'var(--ml-gray-700)',\n\t'--ml-color-secondary-active': 'var(--ml-gray-800)',\n\t'--ml-color-secondary-subtle': 'var(--ml-gray-100)',\n\n\t// Success\n\t'--ml-color-success': 'var(--ml-green-600)',\n\t'--ml-color-success-hover': 'var(--ml-green-700)',\n\t'--ml-color-success-subtle': 'var(--ml-green-50)',\n\n\t// Warning\n\t'--ml-color-warning': 'var(--ml-amber-500)',\n\t'--ml-color-warning-hover': 'var(--ml-amber-600)',\n\t'--ml-color-warning-subtle': 'var(--ml-amber-50)',\n\n\t// Danger/Error\n\t'--ml-color-danger': 'var(--ml-red-600)',\n\t'--ml-color-danger-hover': 'var(--ml-red-700)',\n\t'--ml-color-danger-subtle': 'var(--ml-red-50)',\n\n\t// Info\n\t'--ml-color-info': 'var(--ml-cyan-600)',\n\t'--ml-color-info-hover': 'var(--ml-cyan-700)',\n\t'--ml-color-info-subtle': 'var(--ml-cyan-50)',\n\n\t// Surface colors (backgrounds)\n\t'--ml-color-background': 'var(--ml-white)',\n\t'--ml-color-surface': 'var(--ml-white)',\n\t'--ml-color-surface-raised': 'var(--ml-gray-50)',\n\t'--ml-color-surface-overlay': 'var(--ml-white)',\n\t'--ml-color-surface-sunken': 'var(--ml-gray-100)',\n\n\t// Text colors\n\t'--ml-color-text': 'var(--ml-gray-900)',\n\t'--ml-color-text-secondary': 'var(--ml-gray-700)',\n\t'--ml-color-text-muted': 'var(--ml-gray-500)',\n\t'--ml-color-text-subtle': 'var(--ml-gray-400)',\n\t'--ml-color-text-inverse': 'var(--ml-white)',\n\t'--ml-color-text-link': 'var(--ml-blue-600)',\n\t'--ml-color-text-link-hover': 'var(--ml-blue-700)',\n\n\t// Border colors\n\t'--ml-color-border': 'var(--ml-gray-200)',\n\t'--ml-color-border-strong': 'var(--ml-gray-300)',\n\t'--ml-color-border-muted': 'var(--ml-gray-100)',\n\t'--ml-color-border-focus': 'var(--ml-blue-500)',\n\n\t// Focus ring\n\t'--ml-color-focus-ring': 'var(--ml-blue-500)',\n\t'--ml-focus-ring-width': '4px',\n\t'--ml-focus-ring-offset': '1px',\n\n\t// Component-specific semantic tokens\n\t'--ml-color-toggle-off': 'var(--ml-gray-200)',\n\t'--ml-color-toggle-off-hover': 'var(--ml-gray-300)',\n\t'--ml-color-input-bg': 'var(--ml-white)',\n\t'--ml-color-input-disabled-bg': 'var(--ml-gray-50)',\n\n\t// Badge colors (light mode defaults)\n\t'--ml-badge-default-bg': 'var(--ml-gray-100)',\n\t'--ml-badge-default-border': 'var(--ml-gray-200)',\n\t'--ml-badge-default-text': 'var(--ml-gray-700)',\n\n\t'--ml-badge-primary-bg': 'var(--ml-blue-50)',\n\t'--ml-badge-primary-border': 'var(--ml-blue-200)',\n\t'--ml-badge-primary-text': 'var(--ml-blue-700)',\n\n\t'--ml-badge-success-bg': 'var(--ml-green-50)',\n\t'--ml-badge-success-border': 'var(--ml-green-200)',\n\t'--ml-badge-success-text': 'var(--ml-green-700)',\n\n\t'--ml-badge-warning-bg': 'var(--ml-amber-50)',\n\t'--ml-badge-warning-border': 'var(--ml-amber-200)',\n\t'--ml-badge-warning-text': 'var(--ml-amber-700)',\n\n\t'--ml-badge-error-bg': 'var(--ml-red-50)',\n\t'--ml-badge-error-border': 'var(--ml-red-200)',\n\t'--ml-badge-error-text': 'var(--ml-red-700)',\n\n\t// Alert colors (light mode defaults)\n\t'--ml-alert-info-bg': 'var(--ml-blue-50)',\n\t'--ml-alert-info-border': 'var(--ml-blue-200)',\n\t'--ml-alert-info-text': 'var(--ml-blue-700)',\n\t'--ml-alert-info-icon': 'var(--ml-blue-600)',\n\n\t'--ml-alert-success-bg': 'var(--ml-green-50)',\n\t'--ml-alert-success-border': 'var(--ml-green-200)',\n\t'--ml-alert-success-text': 'var(--ml-green-700)',\n\t'--ml-alert-success-icon': 'var(--ml-green-600)',\n\n\t'--ml-alert-warning-bg': 'var(--ml-amber-50)',\n\t'--ml-alert-warning-border': 'var(--ml-amber-200)',\n\t'--ml-alert-warning-text': 'var(--ml-amber-700)',\n\t'--ml-alert-warning-icon': 'var(--ml-amber-600)',\n\n\t'--ml-alert-error-bg': 'var(--ml-red-50)',\n\t'--ml-alert-error-border': 'var(--ml-red-200)',\n\t'--ml-alert-error-text': 'var(--ml-red-700)',\n\t'--ml-alert-error-icon': 'var(--ml-red-600)',\n\n\t// Tooltip colors\n\t'--ml-tooltip-bg': 'var(--ml-gray-900)',\n\t'--ml-tooltip-text': 'var(--ml-white)',\n\n\t// Card footer\n\t'--ml-card-footer-bg': 'var(--ml-gray-50)'\n} as const;\n","/**\n * Spacing tokens - consistent spacing scale based on 4px (0.25rem)\n */\nexport const spacingTokens = {\n\t'--ml-space-0': '0',\n\t'--ml-space-px': '1px',\n\t'--ml-space-0-5': '0.125rem', // 2px\n\t'--ml-space-1': '0.25rem', // 4px\n\t'--ml-space-1-5': '0.375rem', // 6px\n\t'--ml-space-2': '0.5rem', // 8px\n\t'--ml-space-2-5': '0.625rem', // 10px\n\t'--ml-space-3': '0.75rem', // 12px\n\t'--ml-space-3-5': '0.875rem', // 14px\n\t'--ml-space-4': '1rem', // 16px\n\t'--ml-space-5': '1.25rem', // 20px\n\t'--ml-space-6': '1.5rem', // 24px\n\t'--ml-space-7': '1.75rem', // 28px\n\t'--ml-space-8': '2rem', // 32px\n\t'--ml-space-9': '2.25rem', // 36px\n\t'--ml-space-10': '2.5rem', // 40px\n\t'--ml-space-11': '2.75rem', // 44px\n\t'--ml-space-12': '3rem', // 48px\n\t'--ml-space-14': '3.5rem', // 56px\n\t'--ml-space-16': '4rem', // 64px\n\t'--ml-space-20': '5rem', // 80px\n\t'--ml-space-24': '6rem', // 96px\n\t'--ml-space-28': '7rem', // 112px\n\t'--ml-space-32': '8rem', // 128px\n\t'--ml-space-36': '9rem', // 144px\n\t'--ml-space-40': '10rem', // 160px\n\t'--ml-space-44': '11rem', // 176px\n\t'--ml-space-48': '12rem', // 192px\n\t'--ml-space-52': '13rem', // 208px\n\t'--ml-space-56': '14rem', // 224px\n\t'--ml-space-60': '15rem', // 240px\n\t'--ml-space-64': '16rem', // 256px\n\t'--ml-space-72': '18rem', // 288px\n\t'--ml-space-80': '20rem', // 320px\n\t'--ml-space-96': '24rem' // 384px\n} as const;\n","/**\n * Typography tokens - font families, sizes, weights, and line heights\n */\nexport const typographyTokens = {\n\t// Font families\n\t'--ml-font-sans':\n\t\t\"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'\",\n\t'--ml-font-serif': \"Georgia, Cambria, 'Times New Roman', Times, serif\",\n\t'--ml-font-mono': \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n\n\t// Font sizes\n\t'--ml-text-xs': '0.75rem', // 12px\n\t'--ml-text-sm': '0.875rem', // 14px\n\t'--ml-text-base': '1rem', // 16px\n\t'--ml-text-lg': '1.125rem', // 18px\n\t'--ml-text-xl': '1.25rem', // 20px\n\t'--ml-text-2xl': '1.5rem', // 24px\n\t'--ml-text-3xl': '1.875rem', // 30px\n\t'--ml-text-4xl': '2.25rem', // 36px\n\t'--ml-text-5xl': '3rem', // 48px\n\t'--ml-text-6xl': '3.75rem', // 60px\n\t'--ml-text-7xl': '4.5rem', // 72px\n\t'--ml-text-8xl': '6rem', // 96px\n\t'--ml-text-9xl': '8rem', // 128px\n\n\t// Font weights\n\t'--ml-font-thin': '100',\n\t'--ml-font-extralight': '200',\n\t'--ml-font-light': '300',\n\t'--ml-font-normal': '400',\n\t'--ml-font-medium': '500',\n\t'--ml-font-semibold': '600',\n\t'--ml-font-bold': '700',\n\t'--ml-font-extrabold': '800',\n\t'--ml-font-black': '900',\n\n\t// Line heights\n\t'--ml-leading-none': '1',\n\t'--ml-leading-tight': '1.25',\n\t'--ml-leading-snug': '1.375',\n\t'--ml-leading-normal': '1.5',\n\t'--ml-leading-relaxed': '1.625',\n\t'--ml-leading-loose': '2',\n\n\t// Letter spacing\n\t'--ml-tracking-tighter': '-0.05em',\n\t'--ml-tracking-tight': '-0.025em',\n\t'--ml-tracking-normal': '0em',\n\t'--ml-tracking-wide': '0.025em',\n\t'--ml-tracking-wider': '0.05em',\n\t'--ml-tracking-widest': '0.1em'\n} as const;\n","/**\n * Shadow tokens - elevation and depth effects\n * Soft, subtle shadows for a clean modern look\n */\nexport const shadowTokens = {\n\t'--ml-shadow-none': 'none',\n\t'--ml-shadow-xs': '0 1px 2px 0 rgb(16 24 40 / 0.05)',\n\t'--ml-shadow-sm': '0 1px 2px 0 rgb(16 24 40 / 0.06), 0 1px 3px 0 rgb(16 24 40 / 0.1)',\n\t'--ml-shadow': '0 1px 2px 0 rgb(16 24 40 / 0.06), 0 1px 3px 0 rgb(16 24 40 / 0.1)',\n\t'--ml-shadow-md': '0 2px 4px -2px rgb(16 24 40 / 0.06), 0 4px 8px -2px rgb(16 24 40 / 0.1)',\n\t'--ml-shadow-lg': '0 4px 6px -2px rgb(16 24 40 / 0.03), 0 12px 16px -4px rgb(16 24 40 / 0.08)',\n\t'--ml-shadow-xl': '0 8px 8px -4px rgb(16 24 40 / 0.03), 0 20px 24px -4px rgb(16 24 40 / 0.08)',\n\t'--ml-shadow-2xl': '0 24px 48px -12px rgb(16 24 40 / 0.18)',\n\t'--ml-shadow-3xl': '0 32px 64px -12px rgb(16 24 40 / 0.14)',\n\t'--ml-shadow-inner': 'inset 0 2px 4px 0 rgb(16 24 40 / 0.05)',\n\n\t// Ring shadow for focus states - semantic tokens that can be themed\n\t'--ml-shadow-ring-color': 'var(--ml-blue-100)',\n\t'--ml-shadow-ring-error-color': 'var(--ml-red-100)',\n\t'--ml-shadow-ring-success-color': 'var(--ml-green-100)',\n\t'--ml-shadow-ring-warning-color': 'var(--ml-amber-100)',\n\t'--ml-shadow-ring-gray-color': 'var(--ml-gray-100)',\n\n\t'--ml-shadow-ring': '0 0 0 4px var(--ml-shadow-ring-color)',\n\t'--ml-shadow-ring-error': '0 0 0 4px var(--ml-shadow-ring-error-color)',\n\t'--ml-shadow-ring-success': '0 0 0 4px var(--ml-shadow-ring-success-color)',\n\t'--ml-shadow-ring-warning': '0 0 0 4px var(--ml-shadow-ring-warning-color)',\n\t'--ml-shadow-ring-gray': '0 0 0 4px var(--ml-shadow-ring-gray-color)',\n\t'--ml-shadow-focus-ring': '0 1px 2px 0 rgb(16 24 40 / 0.05), 0 0 0 4px var(--ml-shadow-ring-color)',\n\n\t// Colored shadows for buttons/cards - softer variants\n\t'--ml-shadow-primary': '0 1px 2px 0 rgb(21 94 239 / 0.05)',\n\t'--ml-shadow-success': '0 1px 2px 0 rgb(7 148 85 / 0.05)',\n\t'--ml-shadow-danger': '0 1px 2px 0 rgb(217 45 32 / 0.05)'\n} as const;\n","/**\n * Border tokens - radii and widths\n * Consistent, modern border radii for a polished look\n */\nexport const borderTokens = {\n\t// Border radii - slightly larger defaults for softer appearance\n\t'--ml-radius-none': '0',\n\t'--ml-radius-xxs': '0.125rem', // 2px\n\t'--ml-radius-xs': '0.25rem', // 4px\n\t'--ml-radius-sm': '0.375rem', // 6px\n\t'--ml-radius': '0.5rem', // 8px - default\n\t'--ml-radius-md': '0.5rem', // 8px\n\t'--ml-radius-lg': '0.75rem', // 12px\n\t'--ml-radius-xl': '1rem', // 16px\n\t'--ml-radius-2xl': '1.25rem', // 20px\n\t'--ml-radius-3xl': '1.5rem', // 24px\n\t'--ml-radius-4xl': '2rem', // 32px\n\t'--ml-radius-full': '9999px',\n\n\t// Border widths\n\t'--ml-border-0': '0',\n\t'--ml-border': '1px',\n\t'--ml-border-2': '2px',\n\t'--ml-border-4': '4px',\n\t'--ml-border-8': '8px'\n} as const;\n","/**\n * Transition tokens - durations and easing functions\n */\nexport const transitionTokens = {\n\t// Durations\n\t'--ml-duration-0': '0ms',\n\t'--ml-duration-75': '75ms',\n\t'--ml-duration-100': '100ms',\n\t'--ml-duration-150': '150ms',\n\t'--ml-duration-200': '200ms',\n\t'--ml-duration-300': '300ms',\n\t'--ml-duration-500': '500ms',\n\t'--ml-duration-700': '700ms',\n\t'--ml-duration-1000': '1000ms',\n\n\t// Easing functions\n\t'--ml-ease-linear': 'linear',\n\t'--ml-ease-in': 'cubic-bezier(0.4, 0, 1, 1)',\n\t'--ml-ease-out': 'cubic-bezier(0, 0, 0.2, 1)',\n\t'--ml-ease-in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n\t'--ml-ease-bounce': 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n\n\t// Common transition presets\n\t'--ml-transition-none': 'none',\n\t'--ml-transition-all': 'all var(--ml-duration-150) var(--ml-ease-in-out)',\n\t'--ml-transition-colors':\n\t\t'color var(--ml-duration-150) var(--ml-ease-in-out), background-color var(--ml-duration-150) var(--ml-ease-in-out), border-color var(--ml-duration-150) var(--ml-ease-in-out)',\n\t'--ml-transition-opacity': 'opacity var(--ml-duration-150) var(--ml-ease-in-out)',\n\t'--ml-transition-shadow': 'box-shadow var(--ml-duration-150) var(--ml-ease-in-out)',\n\t'--ml-transition-transform': 'transform var(--ml-duration-150) var(--ml-ease-in-out)'\n} as const;\n","/**\n * Breakpoint tokens - responsive design breakpoints\n */\nexport const breakpointTokens = {\n\t'--ml-screen-xs': '320px',\n\t'--ml-screen-sm': '640px',\n\t'--ml-screen-md': '768px',\n\t'--ml-screen-lg': '1024px',\n\t'--ml-screen-xl': '1280px',\n\t'--ml-screen-2xl': '1536px'\n} as const;\n\n/**\n * Media query helpers (for use in JavaScript)\n */\nexport const breakpoints = {\n\txs: 320,\n\tsm: 640,\n\tmd: 768,\n\tlg: 1024,\n\txl: 1280,\n\t'2xl': 1536\n} as const;\n\nexport type Breakpoint = keyof typeof breakpoints;\n","import { colorTokens, primitiveColors } from './colors.tokens.js';\nimport { spacingTokens } from './spacing.tokens.js';\nimport { typographyTokens } from './typography.tokens.js';\nimport { shadowTokens } from './shadows.tokens.js';\nimport { borderTokens } from './borders.tokens.js';\nimport { transitionTokens } from './transitions.tokens.js';\nimport { breakpointTokens } from './breakpoints.tokens.js';\n\n/**\n * All design tokens combined\n */\nexport const allTokens = {\n\t...primitiveColors,\n\t...colorTokens,\n\t...spacingTokens,\n\t...typographyTokens,\n\t...shadowTokens,\n\t...borderTokens,\n\t...transitionTokens,\n\t...breakpointTokens\n} as const;\n\n/**\n * Convert tokens object to CSS custom properties string\n */\nexport function tokensToCss(tokens: Record<string, string>): string {\n\treturn Object.entries(tokens)\n\t\t.map(([key, value]) => `${key}: ${value};`)\n\t\t.join('\\n\\t');\n}\n\n/**\n * Generate a complete CSS string with all tokens\n */\nexport function generateTokensCss(): string {\n\treturn `:root {\\n\\t${tokensToCss(allTokens)}\\n}`;\n}\n","/**\n * Light theme overrides\n * These are the default values, so mostly just confirms the base theme\n */\nexport const lightTheme = {\n\t// Surface colors\n\t'--ml-color-background': 'var(--ml-white)',\n\t'--ml-color-surface': 'var(--ml-white)',\n\t'--ml-color-surface-raised': 'var(--ml-gray-50)',\n\t'--ml-color-surface-overlay': 'var(--ml-white)',\n\t'--ml-color-surface-sunken': 'var(--ml-gray-100)',\n\n\t// Text colors\n\t'--ml-color-text': 'var(--ml-gray-900)',\n\t'--ml-color-text-secondary': 'var(--ml-gray-700)',\n\t'--ml-color-text-muted': 'var(--ml-gray-500)',\n\t'--ml-color-text-subtle': 'var(--ml-gray-400)',\n\t'--ml-color-text-inverse': 'var(--ml-white)',\n\n\t// Border colors\n\t'--ml-color-border': 'var(--ml-gray-200)',\n\t'--ml-color-border-strong': 'var(--ml-gray-300)',\n\t'--ml-color-border-muted': 'var(--ml-gray-100)'\n} as const;\n\n/**\n * Light theme CSS\n */\nexport const lightThemeCss = `:root, [data-theme=\"light\"] {\n\t${Object.entries(lightTheme)\n\t\t.map(([key, value]) => `${key}: ${value};`)\n\t\t.join('\\n\\t')}\n\n\tcolor-scheme: light;\n}`;\n","/**\n * Dark theme overrides\n */\nexport const darkTheme = {\n\t// Surface colors - darker backgrounds\n\t'--ml-color-background': 'var(--ml-gray-950)',\n\t'--ml-color-surface': 'var(--ml-gray-900)',\n\t'--ml-color-surface-raised': 'var(--ml-gray-800)',\n\t'--ml-color-surface-overlay': 'var(--ml-gray-800)',\n\t'--ml-color-surface-sunken': 'var(--ml-gray-950)',\n\n\t// Text colors - lighter text for dark backgrounds\n\t'--ml-color-text': 'var(--ml-gray-50)',\n\t'--ml-color-text-secondary': 'var(--ml-gray-300)',\n\t'--ml-color-text-muted': 'var(--ml-gray-400)',\n\t'--ml-color-text-subtle': 'var(--ml-gray-500)',\n\t'--ml-color-text-inverse': 'var(--ml-gray-900)',\n\n\t// Border colors - more visible on dark\n\t'--ml-color-border': 'var(--ml-gray-700)',\n\t'--ml-color-border-strong': 'var(--ml-gray-600)',\n\t'--ml-color-border-muted': 'var(--ml-gray-800)',\n\n\t// Adjusted primary colors for better contrast\n\t'--ml-color-primary': 'var(--ml-blue-500)',\n\t'--ml-color-primary-hover': 'var(--ml-blue-400)',\n\t'--ml-color-primary-active': 'var(--ml-blue-300)',\n\t'--ml-color-primary-subtle': 'var(--ml-blue-950)',\n\n\t// Adjusted semantic colors\n\t'--ml-color-success': 'var(--ml-green-500)',\n\t'--ml-color-success-subtle': 'var(--ml-green-950)',\n\t'--ml-color-warning': 'var(--ml-amber-400)',\n\t'--ml-color-warning-subtle': 'var(--ml-amber-950)',\n\t'--ml-color-danger': 'var(--ml-red-500)',\n\t'--ml-color-danger-subtle': 'var(--ml-red-950)',\n\t'--ml-color-info': 'var(--ml-cyan-400)',\n\t'--ml-color-info-subtle': 'var(--ml-cyan-950)',\n\n\t// Input colors for dark mode\n\t'--ml-color-input-bg': 'var(--ml-gray-900)',\n\t'--ml-color-input-disabled-bg': 'var(--ml-gray-800)',\n\t'--ml-color-toggle-off': 'var(--ml-gray-600)',\n\t'--ml-color-toggle-off-hover': 'var(--ml-gray-500)',\n\n\t// Focus ring colors for dark mode (more subtle)\n\t'--ml-shadow-ring-color': 'rgb(59 130 246 / 0.25)',\n\t'--ml-shadow-ring-error-color': 'rgb(239 68 68 / 0.25)',\n\t'--ml-shadow-ring-success-color': 'rgb(34 197 94 / 0.25)',\n\t'--ml-shadow-ring-warning-color': 'rgb(245 158 11 / 0.25)',\n\t'--ml-shadow-ring-gray-color': 'rgb(107 114 128 / 0.25)',\n\n\t// Badge colors for dark mode\n\t'--ml-badge-default-bg': 'var(--ml-gray-800)',\n\t'--ml-badge-default-border': 'var(--ml-gray-700)',\n\t'--ml-badge-default-text': 'var(--ml-gray-300)',\n\n\t'--ml-badge-primary-bg': 'rgb(59 130 246 / 0.15)',\n\t'--ml-badge-primary-border': 'rgb(59 130 246 / 0.3)',\n\t'--ml-badge-primary-text': 'var(--ml-blue-400)',\n\n\t'--ml-badge-success-bg': 'rgb(34 197 94 / 0.15)',\n\t'--ml-badge-success-border': 'rgb(34 197 94 / 0.3)',\n\t'--ml-badge-success-text': 'var(--ml-green-400)',\n\n\t'--ml-badge-warning-bg': 'rgb(245 158 11 / 0.15)',\n\t'--ml-badge-warning-border': 'rgb(245 158 11 / 0.3)',\n\t'--ml-badge-warning-text': 'var(--ml-amber-400)',\n\n\t'--ml-badge-error-bg': 'rgb(239 68 68 / 0.15)',\n\t'--ml-badge-error-border': 'rgb(239 68 68 / 0.3)',\n\t'--ml-badge-error-text': 'var(--ml-red-400)',\n\n\t// Alert colors for dark mode\n\t'--ml-alert-info-bg': 'rgb(59 130 246 / 0.1)',\n\t'--ml-alert-info-border': 'rgb(59 130 246 / 0.2)',\n\t'--ml-alert-info-text': 'var(--ml-blue-300)',\n\t'--ml-alert-info-icon': 'var(--ml-blue-400)',\n\n\t'--ml-alert-success-bg': 'rgb(34 197 94 / 0.1)',\n\t'--ml-alert-success-border': 'rgb(34 197 94 / 0.2)',\n\t'--ml-alert-success-text': 'var(--ml-green-300)',\n\t'--ml-alert-success-icon': 'var(--ml-green-400)',\n\n\t'--ml-alert-warning-bg': 'rgb(245 158 11 / 0.1)',\n\t'--ml-alert-warning-border': 'rgb(245 158 11 / 0.2)',\n\t'--ml-alert-warning-text': 'var(--ml-amber-300)',\n\t'--ml-alert-warning-icon': 'var(--ml-amber-400)',\n\n\t'--ml-alert-error-bg': 'rgb(239 68 68 / 0.1)',\n\t'--ml-alert-error-border': 'rgb(239 68 68 / 0.2)',\n\t'--ml-alert-error-text': 'var(--ml-red-300)',\n\t'--ml-alert-error-icon': 'var(--ml-red-400)',\n\n\t// Tooltip colors for dark mode (inverted)\n\t'--ml-tooltip-bg': 'var(--ml-gray-100)',\n\t'--ml-tooltip-text': 'var(--ml-gray-900)',\n\n\t// Card footer\n\t'--ml-card-footer-bg': 'var(--ml-gray-800)'\n} as const;\n\n/**\n * Dark theme CSS\n */\nexport const darkThemeCss = `[data-theme=\"dark\"] {\n\t${Object.entries(darkTheme)\n\t\t.map(([key, value]) => `${key}: ${value};`)\n\t\t.join('\\n\\t')}\n\n\tcolor-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n\t:root:not([data-theme=\"light\"]) {\n\t\t${Object.entries(darkTheme)\n\t\t\t.map(([key, value]) => `${key}: ${value};`)\n\t\t\t.join('\\n\\t\\t')}\n\n\t\tcolor-scheme: dark;\n\t}\n}`;\n","import { allTokens, tokensToCss } from '../tokens/all-tokens.js';\n\n/**\n * Base theme - includes all primitive tokens\n * Applied to :root for both light and dark themes\n */\nexport const baseThemeCss = `:root {\n\t${tokensToCss(allTokens)}\n\n\t/* Default to light color scheme */\n\tcolor-scheme: light;\n}`;\n","import type { ThemeMode } from '../../types/index.js';\n\ntype ThemeChangeCallback = (theme: ThemeMode, resolvedTheme: 'light' | 'dark') => void;\n\nlet currentTheme: ThemeMode = 'system';\nconst themeListeners: Set<ThemeChangeCallback> = new Set();\nlet mediaQueryCleanup: (() => void) | null = null;\n\n/**\n * Get the currently applied theme mode\n */\nexport function getTheme(): ThemeMode {\n\treturn currentTheme;\n}\n\n/**\n * Get the resolved theme (light or dark) based on current mode\n */\nexport function getResolvedTheme(): 'light' | 'dark' {\n\tif (currentTheme === 'system') {\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n\t}\n\treturn currentTheme;\n}\n\n/**\n * Apply a theme mode to the document\n * @param theme - 'light', 'dark', or 'system' (follows OS preference)\n */\nexport function applyTheme(theme: ThemeMode): void {\n\t// Clean up previous system listener\n\tif (mediaQueryCleanup) {\n\t\tmediaQueryCleanup();\n\t\tmediaQueryCleanup = null;\n\t}\n\n\tcurrentTheme = theme;\n\n\tif (theme === 'system') {\n\t\t// Listen for system preference changes\n\t\tconst mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\t\tconst handleChange = () => {\n\t\t\tconst resolved = mediaQuery.matches ? 'dark' : 'light';\n\t\t\tdocument.documentElement.setAttribute('data-theme', resolved);\n\t\t\tnotifyListeners('system', resolved);\n\t\t};\n\n\t\tmediaQuery.addEventListener('change', handleChange);\n\t\tmediaQueryCleanup = () => mediaQuery.removeEventListener('change', handleChange);\n\n\t\t// Apply current system preference\n\t\tconst resolved = mediaQuery.matches ? 'dark' : 'light';\n\t\tdocument.documentElement.setAttribute('data-theme', resolved);\n\t\tnotifyListeners('system', resolved);\n\t} else {\n\t\tdocument.documentElement.setAttribute('data-theme', theme);\n\t\tnotifyListeners(theme, theme);\n\t}\n}\n\n/**\n * Subscribe to theme changes\n * @param callback - Function called when theme changes\n * @returns Unsubscribe function\n */\nexport function onThemeChange(callback: ThemeChangeCallback): () => void {\n\tthemeListeners.add(callback);\n\treturn () => themeListeners.delete(callback);\n}\n\nfunction notifyListeners(theme: ThemeMode, resolved: 'light' | 'dark'): void {\n\tthemeListeners.forEach((callback) => callback(theme, resolved));\n}\n\n/**\n * Toggle between light and dark themes\n * If currently on 'system', will switch to the opposite of current resolved theme\n */\nexport function toggleTheme(): void {\n\tconst resolved = getResolvedTheme();\n\tapplyTheme(resolved === 'light' ? 'dark' : 'light');\n}\n","type TokenOverrides = Partial<Record<string, string>>;\n\n/**\n * Create a custom theme by overriding default tokens\n * @param name - Theme name (used in data-theme attribute)\n * @param overrides - Token values to override\n * @returns CSS string to inject into document\n */\nexport function createTheme(name: string, overrides: TokenOverrides): string {\n\tconst cssProperties = Object.entries(overrides)\n\t\t.map(([key, value]) => `${key}: ${value};`)\n\t\t.join('\\n\\t');\n\n\treturn `[data-theme=\"${name}\"] {\\n\\t${cssProperties}\\n}`;\n}\n\n/**\n * Create and inject a custom theme into the document\n * @param name - Theme name\n * @param overrides - Token values to override\n * @returns Style element that was injected (can be removed to unload theme)\n */\nexport function injectTheme(name: string, overrides: TokenOverrides): HTMLStyleElement {\n\tconst css = createTheme(name, overrides);\n\tconst style = document.createElement('style');\n\tstyle.id = `ml-theme-${name}`;\n\tstyle.textContent = css;\n\n\t// Remove existing theme with same name if present\n\tconst existing = document.getElementById(style.id);\n\tif (existing) {\n\t\texisting.remove();\n\t}\n\n\tdocument.head.appendChild(style);\n\treturn style;\n}\n\n/**\n * Create a brand theme with a primary color\n * Automatically generates color variations\n */\nexport function createBrandTheme(\n\tname: string,\n\toptions: {\n\t\tprimary?: string;\n\t\tsecondary?: string;\n\t\tsuccess?: string;\n\t\twarning?: string;\n\t\tdanger?: string;\n\t}\n): string {\n\tconst overrides: TokenOverrides = {};\n\n\tif (options.primary) {\n\t\toverrides['--ml-color-primary'] = options.primary;\n\t}\n\tif (options.secondary) {\n\t\toverrides['--ml-color-secondary'] = options.secondary;\n\t}\n\tif (options.success) {\n\t\toverrides['--ml-color-success'] = options.success;\n\t}\n\tif (options.warning) {\n\t\toverrides['--ml-color-warning'] = options.warning;\n\t}\n\tif (options.danger) {\n\t\toverrides['--ml-color-danger'] = options.danger;\n\t}\n\n\treturn createTheme(name, overrides);\n}\n","import type { Placement, Position, ComputePositionConfig, ComputePositionReturn, MiddlewareState } from './types.js';\n\n/**\n * Get the base position for a given placement\n */\nfunction getBasePlacement(reference: DOMRect, floating: DOMRect, placement: Placement): Position {\n\tconst [side, alignment = 'center'] = placement.split('-') as [string, string?];\n\n\tlet x = 0;\n\tlet y = 0;\n\n\t// Main axis positioning\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\ty = reference.top - floating.height;\n\t\t\tbreak;\n\t\tcase 'bottom':\n\t\t\ty = reference.bottom;\n\t\t\tbreak;\n\t\tcase 'left':\n\t\t\tx = reference.left - floating.width;\n\t\t\tbreak;\n\t\tcase 'right':\n\t\t\tx = reference.right;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t// Cross axis alignment\n\tif (side === 'top' || side === 'bottom') {\n\t\tswitch (alignment) {\n\t\t\tcase 'start':\n\t\t\t\tx = reference.left;\n\t\t\t\tbreak;\n\t\t\tcase 'end':\n\t\t\t\tx = reference.right - floating.width;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// center\n\t\t\t\tx = reference.left + (reference.width - floating.width) / 2;\n\t\t}\n\t} else {\n\t\tswitch (alignment) {\n\t\t\tcase 'start':\n\t\t\t\ty = reference.top;\n\t\t\t\tbreak;\n\t\t\tcase 'end':\n\t\t\t\ty = reference.bottom - floating.height;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// center\n\t\t\t\ty = reference.top + (reference.height - floating.height) / 2;\n\t\t}\n\t}\n\n\treturn { x, y };\n}\n\n/**\n * Compute the position of a floating element relative to a reference element\n */\nexport function computePosition(reference: Element, floating: HTMLElement, config: ComputePositionConfig = {}): ComputePositionReturn {\n\tconst { placement = 'bottom', middleware = [] } = config;\n\n\tconst referenceRect = reference.getBoundingClientRect();\n\tconst floatingRect = floating.getBoundingClientRect();\n\n\t// Calculate base position from placement\n\tconst { x, y } = getBasePlacement(referenceRect, floatingRect, placement);\n\n\t// Apply middlewares\n\tlet state: MiddlewareState = {\n\t\tx,\n\t\ty,\n\t\tplacement,\n\t\trects: { reference: referenceRect, floating: floatingRect },\n\t\telements: { reference, floating },\n\t\tmiddlewareData: {}\n\t};\n\n\tfor (const mw of middleware) {\n\t\tconst result = mw.fn(state);\n\t\tif (result) {\n\t\t\tstate = { ...state, ...result };\n\t\t\tif (result.middlewareData) {\n\t\t\t\tstate.middlewareData = { ...state.middlewareData, ...result.middlewareData };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tx: state.x,\n\t\ty: state.y,\n\t\tplacement: state.placement,\n\t\tmiddlewareData: state.middlewareData\n\t};\n}\n\n/**\n * Get the opposite placement\n */\nexport function getOppositePlacement(placement: Placement): Placement {\n\tconst opposites: Record<string, string> = {\n\t\ttop: 'bottom',\n\t\tbottom: 'top',\n\t\tleft: 'right',\n\t\tright: 'left'\n\t};\n\n\treturn placement.replace(/top|bottom|left|right/g, (match) => opposites[match]) as Placement;\n}\n\n/**\n * Get the side from a placement\n */\nexport function getSide(placement: Placement): 'top' | 'right' | 'bottom' | 'left' {\n\treturn placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left';\n}\n","/**\n * Options for auto-update behavior\n */\nexport interface AutoUpdateOptions {\n\t/** Update on ancestor scroll events (default: true) */\n\tancestorScroll?: boolean;\n\t/** Update on ancestor resize events (default: true) */\n\tancestorResize?: boolean;\n\t/** Update on element resize events (default: true) */\n\telementResize?: boolean;\n\t/** Update on layout shift / animation frames (default: false) */\n\tanimationFrame?: boolean;\n}\n\n/**\n * Get all scrollable ancestor elements\n */\nfunction getScrollAncestors(element: Element): Element[] {\n\tconst ancestors: Element[] = [];\n\tlet node: Node | null = element;\n\n\twhile (node) {\n\t\tconst parent: Node | null = node.parentNode;\n\n\t\tif (parent instanceof ShadowRoot) {\n\t\t\t// Cross shadow DOM boundary — continue from the host element\n\t\t\tnode = parent.host;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (parent instanceof Element) {\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent);\n\t\t\tif (/auto|scroll|overlay|hidden/.test(overflow + overflowX + overflowY)) {\n\t\t\t\tancestors.push(parent);\n\t\t\t}\n\t\t\tnode = parent;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn ancestors;\n}\n\n/**\n * Automatically update floating element position on scroll, resize, etc.\n * Returns a cleanup function to stop watching.\n */\nexport function autoUpdate(reference: Element, floating: HTMLElement, update: () => void, options: AutoUpdateOptions = {}): () => void {\n\tconst { ancestorScroll = true, ancestorResize = true, elementResize = true, animationFrame = false } = options;\n\n\tconst cleanups: (() => void)[] = [];\n\n\t// Update on scroll (ancestors + window for viewport scroll)\n\tif (ancestorScroll) {\n\t\tconst ancestors = getScrollAncestors(reference);\n\t\tfor (const ancestor of ancestors) {\n\t\t\tancestor.addEventListener('scroll', update, { passive: true });\n\t\t\tcleanups.push(() => ancestor.removeEventListener('scroll', update));\n\t\t}\n\t\twindow.addEventListener('scroll', update, { passive: true });\n\t\tcleanups.push(() => window.removeEventListener('scroll', update));\n\t}\n\n\t// Update on window resize\n\tif (ancestorResize) {\n\t\twindow.addEventListener('resize', update);\n\t\tcleanups.push(() => window.removeEventListener('resize', update));\n\t}\n\n\t// Update on element resize using ResizeObserver\n\tif (elementResize && typeof ResizeObserver !== 'undefined') {\n\t\tconst observer = new ResizeObserver(() => {\n\t\t\tupdate();\n\t\t});\n\t\tobserver.observe(reference);\n\t\tobserver.observe(floating);\n\t\tcleanups.push(() => observer.disconnect());\n\t}\n\n\t// Update on animation frame (for animations/transitions)\n\tif (animationFrame) {\n\t\tlet frameId: number;\n\t\tconst frameLoop = () => {\n\t\t\tupdate();\n\t\t\tframeId = requestAnimationFrame(frameLoop);\n\t\t};\n\t\tframeId = requestAnimationFrame(frameLoop);\n\t\tcleanups.push(() => cancelAnimationFrame(frameId));\n\t}\n\n\t// Return cleanup function\n\treturn () => {\n\t\tcleanups.forEach((fn) => fn());\n\t};\n}\n","import type { Middleware } from '../types.js';\nimport { getSide } from '../compute-position.js';\n\nexport interface OffsetOptions {\n\t/** Distance from the reference element along the main axis */\n\tmainAxis?: number;\n\t/** Distance from the reference element along the cross axis */\n\tcrossAxis?: number;\n}\n\n/**\n * Offset middleware - adds distance between reference and floating elements\n */\nexport function offset(options: number | OffsetOptions = 0): Middleware {\n\tconst mainAxis = typeof options === 'number' ? options : (options.mainAxis ?? 0);\n\tconst crossAxis = typeof options === 'number' ? 0 : (options.crossAxis ?? 0);\n\n\treturn {\n\t\tname: 'offset',\n\t\tfn(state) {\n\t\t\tconst { x, y, placement } = state;\n\t\t\tconst side = getSide(placement);\n\n\t\t\tlet newX = x;\n\t\t\tlet newY = y;\n\n\t\t\tswitch (side) {\n\t\t\t\tcase 'top':\n\t\t\t\t\tnewY -= mainAxis;\n\t\t\t\t\tnewX += crossAxis;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'bottom':\n\t\t\t\t\tnewY += mainAxis;\n\t\t\t\t\tnewX += crossAxis;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'left':\n\t\t\t\t\tnewX -= mainAxis;\n\t\t\t\t\tnewY += crossAxis;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'right':\n\t\t\t\t\tnewX += mainAxis;\n\t\t\t\t\tnewY += crossAxis;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn { x: newX, y: newY };\n\t\t}\n\t};\n}\n","import type { Middleware, Placement } from '../types.js';\nimport { getOppositePlacement, getSide } from '../compute-position.js';\n\nexport interface FlipOptions {\n\t/** Custom fallback placements to try */\n\tfallbackPlacements?: Placement[];\n\t/** Padding from viewport edges */\n\tpadding?: number;\n}\n\ninterface Overflow {\n\ttop: number;\n\tright: number;\n\tbottom: number;\n\tleft: number;\n}\n\n/**\n * Detect overflow relative to viewport\n */\nfunction detectOverflow(x: number, y: number, floating: DOMRect, padding: number): Overflow {\n\tconst viewport = {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight\n\t};\n\n\treturn {\n\t\ttop: padding - y,\n\t\tright: x + floating.width - viewport.width + padding,\n\t\tbottom: y + floating.height - viewport.height + padding,\n\t\tleft: padding - x\n\t};\n}\n\n/**\n * Check if there's any overflow on the main side\n */\nfunction hasOverflow(overflow: Overflow, side: string): boolean {\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn overflow.top > 0;\n\t\tcase 'bottom':\n\t\t\treturn overflow.bottom > 0;\n\t\tcase 'left':\n\t\t\treturn overflow.left > 0;\n\t\tcase 'right':\n\t\t\treturn overflow.right > 0;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Flip middleware - flips placement when there's overflow\n */\nexport function flip(options: FlipOptions = {}): Middleware {\n\tconst { padding = 0 } = options;\n\n\treturn {\n\t\tname: 'flip',\n\t\tfn(state) {\n\t\t\tconst { x, y, placement, rects } = state;\n\t\t\tconst side = getSide(placement);\n\t\t\tconst overflow = detectOverflow(x, y, rects.floating, padding);\n\n\t\t\t// Check if current placement has overflow\n\t\t\tif (!hasOverflow(overflow, side)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Try opposite placement\n\t\t\tconst oppositePlacement = getOppositePlacement(placement);\n\t\t\tconst fallbacks = options.fallbackPlacements ?? [oppositePlacement];\n\n\t\t\tfor (const fallback of fallbacks) {\n\t\t\t\t// Calculate position for fallback placement\n\t\t\t\tconst newPos = getBasePlacementForFlip(rects.reference, rects.floating, fallback);\n\t\t\t\tconst newOverflow = detectOverflow(newPos.x, newPos.y, rects.floating, padding);\n\t\t\t\tconst newSide = getSide(fallback);\n\n\t\t\t\tif (!hasOverflow(newOverflow, newSide)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: newPos.x,\n\t\t\t\t\t\ty: newPos.y,\n\t\t\t\t\t\tplacement: fallback\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If no fallback works, keep original\n\t\t\treturn;\n\t\t}\n\t};\n}\n\n/**\n * Calculate base position for a placement (used internally by flip)\n */\nfunction getBasePlacementForFlip(reference: DOMRect, floating: DOMRect, placement: Placement): { x: number; y: number } {\n\tconst [side, alignment = 'center'] = placement.split('-') as [string, string?];\n\n\tlet x = 0;\n\tlet y = 0;\n\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\ty = reference.top - floating.height;\n\t\t\tbreak;\n\t\tcase 'bottom':\n\t\t\ty = reference.bottom;\n\t\t\tbreak;\n\t\tcase 'left':\n\t\t\tx = reference.left - floating.width;\n\t\t\tbreak;\n\t\tcase 'right':\n\t\t\tx = reference.right;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (side === 'top' || side === 'bottom') {\n\t\tswitch (alignment) {\n\t\t\tcase 'start':\n\t\t\t\tx = reference.left;\n\t\t\t\tbreak;\n\t\t\tcase 'end':\n\t\t\t\tx = reference.right - floating.width;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tx = reference.left + (reference.width - floating.width) / 2;\n\t\t}\n\t} else {\n\t\tswitch (alignment) {\n\t\t\tcase 'start':\n\t\t\t\ty = reference.top;\n\t\t\t\tbreak;\n\t\t\tcase 'end':\n\t\t\t\ty = reference.bottom - floating.height;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ty = reference.top + (reference.height - floating.height) / 2;\n\t\t}\n\t}\n\n\treturn { x, y };\n}\n","import type { Middleware } from '../types.js';\n\nexport interface ShiftOptions {\n\t/** Padding from viewport edges */\n\tpadding?: number;\n\t/** Limit shifting to main axis only */\n\tmainAxis?: boolean;\n\t/** Limit shifting to cross axis only */\n\tcrossAxis?: boolean;\n}\n\n/**\n * Shift middleware - shifts the floating element to keep it in view\n */\nexport function shift(options: ShiftOptions = {}): Middleware {\n\tconst { padding = 0, mainAxis = true, crossAxis = true } = options;\n\n\treturn {\n\t\tname: 'shift',\n\t\tfn(state) {\n\t\t\tconst { x, y, rects } = state;\n\t\t\tconst viewport = {\n\t\t\t\twidth: window.innerWidth,\n\t\t\t\theight: window.innerHeight\n\t\t\t};\n\n\t\t\tlet newX = x;\n\t\t\tlet newY = y;\n\n\t\t\t// Clamp X position\n\t\t\tif (crossAxis || mainAxis) {\n\t\t\t\tconst minX = padding;\n\t\t\t\tconst maxX = viewport.width - rects.floating.width - padding;\n\t\t\t\tnewX = Math.max(minX, Math.min(newX, maxX));\n\t\t\t}\n\n\t\t\t// Clamp Y position\n\t\t\tif (crossAxis || mainAxis) {\n\t\t\t\tconst minY = padding;\n\t\t\t\tconst maxY = viewport.height - rects.floating.height - padding;\n\t\t\t\tnewY = Math.max(minY, Math.min(newY, maxY));\n\t\t\t}\n\n\t\t\treturn { x: newX, y: newY };\n\t\t}\n\t};\n}\n","import type { Middleware } from '../types.js';\nimport { getSide } from '../compute-position.js';\n\nexport interface ArrowOptions {\n\t/** The arrow element */\n\telement: HTMLElement;\n\t/** Padding from the edges of the floating element */\n\tpadding?: number;\n}\n\n/**\n * Arrow middleware - positions an arrow element\n */\nexport function arrow(options: ArrowOptions): Middleware {\n\tconst { element, padding = 0 } = options;\n\n\treturn {\n\t\tname: 'arrow',\n\t\tfn(state) {\n\t\t\tconst { rects, placement } = state;\n\t\t\tconst side = getSide(placement);\n\n\t\t\t// Get arrow dimensions\n\t\t\tconst arrowRect = element.getBoundingClientRect();\n\t\t\tconst arrowWidth = arrowRect.width;\n\t\t\tconst arrowHeight = arrowRect.height;\n\n\t\t\t// Calculate arrow position\n\t\t\tlet arrowX: number | undefined;\n\t\t\tlet arrowY: number | undefined;\n\n\t\t\tif (side === 'top' || side === 'bottom') {\n\t\t\t\t// Horizontal positioning for top/bottom placements\n\t\t\t\tconst referenceCenter = rects.reference.left + rects.reference.width / 2;\n\t\t\t\tconst floatingLeft = state.x;\n\t\t\t\tarrowX = referenceCenter - floatingLeft - arrowWidth / 2;\n\n\t\t\t\t// Clamp to floating element bounds\n\t\t\t\tconst minX = padding;\n\t\t\t\tconst maxX = rects.floating.width - arrowWidth - padding;\n\t\t\t\tarrowX = Math.max(minX, Math.min(arrowX, maxX));\n\t\t\t} else {\n\t\t\t\t// Vertical positioning for left/right placements\n\t\t\t\tconst referenceCenter = rects.reference.top + rects.reference.height / 2;\n\t\t\t\tconst floatingTop = state.y;\n\t\t\t\tarrowY = referenceCenter - floatingTop - arrowHeight / 2;\n\n\t\t\t\t// Clamp to floating element bounds\n\t\t\t\tconst minY = padding;\n\t\t\t\tconst maxY = rects.floating.height - arrowHeight - padding;\n\t\t\t\tarrowY = Math.max(minY, Math.min(arrowY, maxY));\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tmiddlewareData: {\n\t\t\t\t\tarrow: {\n\t\t\t\t\t\tx: arrowX,\n\t\t\t\t\t\ty: arrowY,\n\t\t\t\t\t\tcenterOffset: 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n}\n","const FOCUSABLE_SELECTOR = [\n\t'a[href]',\n\t'area[href]',\n\t'input:not([disabled]):not([type=\"hidden\"])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'button:not([disabled])',\n\t'iframe',\n\t'object',\n\t'embed',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex=\"-1\"])'\n].join(', ');\n\n/**\n * Get all focusable elements within a container\n */\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n\tconst elements = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n\n\treturn elements.filter((element) => {\n\t\t// Filter out elements that are hidden or have display: none\n\t\tif (element.offsetParent === null && element.style.position !== 'fixed') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Filter out elements with visibility: hidden\n\t\tconst style = getComputedStyle(element);\n\t\tif (style.visibility === 'hidden') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n/**\n * Get the first focusable element within a container\n */\nexport function getFirstFocusable(container: HTMLElement): HTMLElement | null {\n\tconst elements = getFocusableElements(container);\n\treturn elements[0] ?? null;\n}\n\n/**\n * Get the last focusable element within a container\n */\nexport function getLastFocusable(container: HTMLElement): HTMLElement | null {\n\tconst elements = getFocusableElements(container);\n\treturn elements[elements.length - 1] ?? null;\n}\n\n/**\n * Focus the first focusable element within a container\n */\nexport function focusFirst(container: HTMLElement): boolean {\n\tconst first = getFirstFocusable(container);\n\tif (first) {\n\t\tfirst.focus();\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Focus the last focusable element within a container\n */\nexport function focusLast(container: HTMLElement): boolean {\n\tconst last = getLastFocusable(container);\n\tif (last) {\n\t\tlast.focus();\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Check if an element is focusable\n */\nexport function isFocusable(element: HTMLElement): boolean {\n\treturn element.matches(FOCUSABLE_SELECTOR) && element.offsetParent !== null;\n}\n","import { getFocusableElements, getFirstFocusable } from './focus-utils.js';\n\nexport interface FocusTrapOptions {\n\t/** Element to focus when trap is activated */\n\tinitialFocus?: HTMLElement | null;\n\t/** Element to return focus to when trap is deactivated */\n\treturnFocus?: HTMLElement | null;\n\t/** Whether to auto-focus first element if initialFocus not provided */\n\tautoFocus?: boolean;\n}\n\nexport interface FocusTrap {\n\tactivate(): void;\n\tdeactivate(): void;\n\tisActive(): boolean;\n}\n\n/**\n * Create a focus trap within a container element\n */\nexport function createFocusTrap(container: HTMLElement, options: FocusTrapOptions = {}): FocusTrap {\n\tconst { initialFocus = null, returnFocus = null, autoFocus = true } = options;\n\n\tlet active = false;\n\tlet previouslyFocused: HTMLElement | null = null;\n\n\tfunction handleKeydown(event: KeyboardEvent): void {\n\t\tif (event.key !== 'Tab' || !active) return;\n\n\t\tconst focusables = getFocusableElements(container);\n\t\tif (focusables.length === 0) return;\n\n\t\tconst first = focusables[0];\n\t\tconst last = focusables[focusables.length - 1];\n\n\t\tif (event.shiftKey) {\n\t\t\t// Shift + Tab: going backwards\n\t\t\tif (document.activeElement === first) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tlast.focus();\n\t\t\t}\n\t\t} else {\n\t\t\t// Tab: going forwards\n\t\t\tif (document.activeElement === last) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfirst.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction activate(): void {\n\t\tif (active) return;\n\n\t\tactive = true;\n\t\tpreviouslyFocused = document.activeElement as HTMLElement;\n\n\t\t// Add keydown listener\n\t\tcontainer.addEventListener('keydown', handleKeydown);\n\n\t\t// Focus initial element\n\t\tif (initialFocus) {\n\t\t\tinitialFocus.focus();\n\t\t} else if (autoFocus) {\n\t\t\tconst first = getFirstFocusable(container);\n\t\t\tif (first) {\n\t\t\t\tfirst.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction deactivate(): void {\n\t\tif (!active) return;\n\n\t\tactive = false;\n\t\tcontainer.removeEventListener('keydown', handleKeydown);\n\n\t\t// Return focus\n\t\tconst focusTarget = returnFocus ?? previouslyFocused;\n\t\tif (focusTarget && typeof focusTarget.focus === 'function') {\n\t\t\tfocusTarget.focus();\n\t\t}\n\t}\n\n\tfunction isActive(): boolean {\n\t\treturn active;\n\t}\n\n\treturn { activate, deactivate, isActive };\n}\n\n/**\n * Simple focus trap function for one-off use\n */\nexport function focusTrap(container: HTMLElement, options?: FocusTrapOptions): () => void {\n\tconst trap = createFocusTrap(container, options);\n\ttrap.activate();\n\treturn () => trap.deactivate();\n}\n","let hadKeyboardEvent = false;\nlet isInitialized = false;\n\n/**\n * Initialize focus-visible detection\n * Tracks whether the last interaction was keyboard or mouse\n */\nfunction initFocusVisible(): void {\n\tif (isInitialized) return;\n\tisInitialized = true;\n\n\tdocument.addEventListener(\n\t\t'keydown',\n\t\t() => {\n\t\t\thadKeyboardEvent = true;\n\t\t},\n\t\ttrue\n\t);\n\n\tdocument.addEventListener(\n\t\t'mousedown',\n\t\t() => {\n\t\t\thadKeyboardEvent = false;\n\t\t},\n\t\ttrue\n\t);\n\n\tdocument.addEventListener(\n\t\t'pointerdown',\n\t\t() => {\n\t\t\thadKeyboardEvent = false;\n\t\t},\n\t\ttrue\n\t);\n}\n\n/**\n * Check if the current focus should show a visible focus ring\n * Returns true if the last interaction was keyboard-based\n */\nexport function isFocusVisible(): boolean {\n\tinitFocusVisible();\n\treturn hadKeyboardEvent;\n}\n\n/**\n * Add focus-visible class to an element when focused via keyboard\n */\nexport function focusVisible(element: HTMLElement, className = 'focus-visible'): () => void {\n\tinitFocusVisible();\n\n\tfunction handleFocus(): void {\n\t\tif (hadKeyboardEvent) {\n\t\t\telement.classList.add(className);\n\t\t}\n\t}\n\n\tfunction handleBlur(): void {\n\t\telement.classList.remove(className);\n\t}\n\n\telement.addEventListener('focus', handleFocus);\n\telement.addEventListener('blur', handleBlur);\n\n\treturn () => {\n\t\telement.removeEventListener('focus', handleFocus);\n\t\telement.removeEventListener('blur', handleBlur);\n\t\telement.classList.remove(className);\n\t};\n}\n","let liveRegion: HTMLElement | null = null;\n\n/**\n * Get or create the global live region element\n */\nfunction getLiveRegion(): HTMLElement {\n\tif (liveRegion && document.body.contains(liveRegion)) {\n\t\treturn liveRegion;\n\t}\n\n\tliveRegion = document.createElement('div');\n\tliveRegion.id = 'ml-live-region';\n\tliveRegion.setAttribute('aria-live', 'polite');\n\tliveRegion.setAttribute('aria-atomic', 'true');\n\tliveRegion.setAttribute('role', 'status');\n\n\t// Visually hidden but accessible to screen readers\n\tObject.assign(liveRegion.style, {\n\t\tposition: 'absolute',\n\t\twidth: '1px',\n\t\theight: '1px',\n\t\tpadding: '0',\n\t\tmargin: '-1px',\n\t\toverflow: 'hidden',\n\t\tclip: 'rect(0, 0, 0, 0)',\n\t\twhiteSpace: 'nowrap',\n\t\tborder: '0'\n\t});\n\n\tdocument.body.appendChild(liveRegion);\n\treturn liveRegion;\n}\n\n/**\n * Announce a message to screen readers\n * @param message - The message to announce\n * @param priority - 'polite' waits for silence, 'assertive' interrupts\n */\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\n\tconst region = getLiveRegion();\n\tregion.setAttribute('aria-live', priority);\n\n\t// Clear and set message (screen readers need this pattern to re-announce)\n\tregion.textContent = '';\n\n\t// Use setTimeout to ensure the clear is processed first\n\tsetTimeout(() => {\n\t\tregion.textContent = message;\n\t}, 50);\n}\n\n/**\n * Create a custom live region with specific options\n */\nexport function createLiveRegion(options: { id?: string; priority?: 'polite' | 'assertive'; atomic?: boolean } = {}): HTMLElement {\n\tconst { id, priority = 'polite', atomic = true } = options;\n\n\tconst region = document.createElement('div');\n\tif (id) region.id = id;\n\tregion.setAttribute('aria-live', priority);\n\tregion.setAttribute('aria-atomic', atomic.toString());\n\tregion.setAttribute('role', 'status');\n\n\t// Visually hidden\n\tObject.assign(region.style, {\n\t\tposition: 'absolute',\n\t\twidth: '1px',\n\t\theight: '1px',\n\t\tpadding: '0',\n\t\tmargin: '-1px',\n\t\toverflow: 'hidden',\n\t\tclip: 'rect(0, 0, 0, 0)',\n\t\twhiteSpace: 'nowrap',\n\t\tborder: '0'\n\t});\n\n\treturn region;\n}\n","/**\n * CSS reset for component shadow DOM\n * Normalizes default browser styles\n */\nexport const resetStyles = `\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t* {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\tbutton {\n\t\tfont: inherit;\n\t\tcolor: inherit;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t}\n\n\tbutton:disabled {\n\t\tcursor: not-allowed;\n\t}\n\n\tinput,\n\ttextarea,\n\tselect {\n\t\tfont: inherit;\n\t\tcolor: inherit;\n\t}\n\n\ta {\n\t\tcolor: inherit;\n\t\ttext-decoration: inherit;\n\t}\n\n\timg,\n\tsvg {\n\t\tdisplay: block;\n\t\tmax-width: 100%;\n\t}\n\n\t[hidden] {\n\t\tdisplay: none !important;\n\t}\n`;\n","/**\n * Visually hidden styles - hides content visually but keeps it accessible to screen readers\n */\nexport const visuallyHiddenStyles = `\n\t.visually-hidden {\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\tpadding: 0;\n\t\tmargin: -1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0, 0, 0, 0);\n\t\twhite-space: nowrap;\n\t\tborder: 0;\n\t}\n\n\t.visually-hidden:focus,\n\t.visually-hidden:active {\n\t\tposition: static;\n\t\twidth: auto;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\toverflow: visible;\n\t\tclip: auto;\n\t\twhite-space: normal;\n\t}\n`;\n\n/**\n * CSS string for visually hidden content (inline use)\n */\nexport const visuallyHiddenCss = `\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\tpadding: 0;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(0, 0, 0, 0);\n\twhite-space: nowrap;\n\tborder: 0;\n`;\n","/**\n * Base styles shared by all ml-* components\n * Provides consistent focus states, transitions, and theming\n */\nexport const componentBaseStyles = `\n\t:host {\n\t\t/* Inherit font from parent by default */\n\t\tfont-family: var(--ml-font-sans);\n\n\t\t/* Consistent box sizing */\n\t\tbox-sizing: border-box;\n\t}\n\n\t:host *,\n\t:host *::before,\n\t:host *::after {\n\t\tbox-sizing: inherit;\n\t}\n\n\t/* Focus visible styles */\n\t:host(:focus-visible) {\n\t\toutline: var(--ml-focus-ring-width) solid var(--ml-color-focus-ring);\n\t\toutline-offset: var(--ml-focus-ring-offset);\n\t}\n\n\t/* Disabled state */\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t/* Hidden state */\n\t:host([hidden]) {\n\t\tdisplay: none !important;\n\t}\n`;\n\n/**\n * Focus ring mixin - apply to interactive elements\n */\nexport const focusRingStyles = `\n\t&:focus {\n\t\toutline: none;\n\t}\n\n\t&:focus-visible {\n\t\toutline: var(--ml-focus-ring-width) solid var(--ml-color-focus-ring);\n\t\toutline-offset: var(--ml-focus-ring-offset);\n\t}\n`;\n\n/**\n * Interactive element base styles\n */\nexport const interactiveStyles = `\n\tcursor: pointer;\n\tuser-select: none;\n\t-webkit-tap-highlight-color: transparent;\n\n\t&:disabled,\n\t&[aria-disabled=\"true\"] {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n`;\n","/**\n * Detect clicks outside of an element\n * @param element - The element to watch\n * @param callback - Function to call when clicked outside\n * @returns Cleanup function to remove the listener\n */\nexport function clickOutside(element: HTMLElement, callback: (event: MouseEvent) => void): () => void {\n\tfunction handleClick(event: MouseEvent): void {\n\t\tconst target = event.target as Node;\n\n\t\t// Check if click is outside the element\n\t\tif (!element.contains(target)) {\n\t\t\tcallback(event);\n\t\t}\n\t}\n\n\t// Use capture phase to catch events before they bubble\n\tdocument.addEventListener('click', handleClick, true);\n\n\treturn () => {\n\t\tdocument.removeEventListener('click', handleClick, true);\n\t};\n}\n\n/**\n * Directive-style click outside for use with Melodic templates\n */\nexport function createClickOutsideHandler(callback: (event: MouseEvent) => void): (element: HTMLElement) => () => void {\n\treturn (element: HTMLElement) => clickOutside(element, callback);\n}\n","export interface VirtualScrollOptions {\n\t/** Returns the height of a single row in pixels (function because it can change with size variants) */\n\trowHeight: () => number;\n\t/** Returns the total number of items (function because data can change) */\n\titemCount: () => number;\n\t/** Called whenever the visible range changes */\n\tonUpdate: (startIndex: number, endIndex: number) => void;\n\t/** When returns false, shows all rows (default: always enabled) */\n\tenabled?: () => boolean;\n\t/** Overscan rows above/below visible area (default: 3) */\n\tbuffer?: number;\n}\n\nexport class VirtualScroller {\n\tprivate _viewport: HTMLElement | null = null;\n\tprivate _resizeObserver: ResizeObserver | null = null;\n\tprivate _options: VirtualScrollOptions | null = null;\n\n\t/** Attach to a scrollable viewport element and begin observing */\n\tattach(viewport: HTMLElement, options: VirtualScrollOptions): void {\n\t\tthis._viewport = viewport;\n\t\tthis._options = options;\n\n\t\tthis._resizeObserver = new ResizeObserver(entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tthis._compute(entry.contentRect.height);\n\t\t\t}\n\t\t});\n\t\tthis._resizeObserver.observe(viewport);\n\t\tviewport.addEventListener('scroll', this._handleScroll);\n\t}\n\n\t/** Tear down observers and event listeners */\n\tdetach(): void {\n\t\tthis._resizeObserver?.disconnect();\n\t\tthis._resizeObserver = null;\n\t\tif (this._viewport) {\n\t\t\tthis._viewport.removeEventListener('scroll', this._handleScroll);\n\t\t}\n\t\tthis._viewport = null;\n\t\tthis._options = null;\n\t}\n\n\t/** Call after item count or row height changes (e.g. after sort/filter/page change) */\n\tinvalidate(): void {\n\t\tif (!this._viewport) return;\n\t\tthis._compute(this._viewport.clientHeight);\n\t}\n\n\tprivate _handleScroll = (): void => {\n\t\tthis._compute(this._viewport!.clientHeight);\n\t};\n\n\tprivate _compute(viewportHeight: number): void {\n\t\tif (!this._viewport || !this._options) return;\n\t\tconst { rowHeight, itemCount, onUpdate, enabled, buffer = 3 } = this._options;\n\n\t\tconst count = itemCount();\n\n\t\tif (enabled && !enabled()) {\n\t\t\tonUpdate(0, count);\n\t\t\treturn;\n\t\t}\n\n\t\tconst scrollTop = this._viewport.scrollTop;\n\t\tconst rowH = rowHeight();\n\t\tconst newStart = Math.max(0, Math.floor(scrollTop / rowH) - buffer);\n\t\tconst newEnd = Math.min(count, Math.ceil((scrollTop + viewportHeight) / rowH) + buffer);\n\t\tonUpdate(newStart, newEnd);\n\t}\n}\n","export type UniqueID = string & { readonly __brand: 'UniqueID' };\n\n// http://byronsalau.com/blog/how-to-create-a-guid-uuid-in-javascript/\nexport const newID = (): UniqueID => {\n\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replaceAll(/[xy]/g, function (c) {\n\t\t// tslint:disable-next-line:no-bitwise\n\t\tconst r = Math.trunc(Math.random() * 16);\n\t\tconst v = c === 'x' ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t}) as UniqueID;\n};\n","import { registerAttributeDirective } from '@melodicdev/core/template';\nimport type { AttributeDirectiveCleanupFunction } from '@melodicdev/core/template';\n\n/**\n * Tooltip attribute directive - Wraps an element with an ml-tooltip component\n *\n * Usage:\n * ```html\n * <!-- Static content -->\n * <div :tooltip=\"Helpful tip\">Hover me</div>\n *\n * <!-- Dynamic content -->\n * <ml-button :tooltip=${this.helpText}>Help</ml-button>\n *\n * <!-- With placement (defaults to \"top\") -->\n * <span :tooltip=${{ content: 'Info', placement: 'bottom' }}>Info</span>\n * ```\n */\n\nexport interface TooltipDirectiveOptions {\n\tcontent: string;\n\tplacement?: string;\n}\n\nfunction parseValue(value: unknown): TooltipDirectiveOptions {\n\tif (typeof value === 'string') {\n\t\treturn { content: value };\n\t}\n\n\tif (value && typeof value === 'object' && 'content' in value) {\n\t\treturn value as TooltipDirectiveOptions;\n\t}\n\n\treturn { content: String(value ?? '') };\n}\n\nfunction tooltipDirective(element: Element, value: unknown): AttributeDirectiveCleanupFunction | void {\n\tif (!value) return;\n\n\tconst { content, placement } = parseValue(value);\n\tif (!content) return;\n\n\t// Create ml-tooltip wrapper and move element into it\n\tconst tooltip = document.createElement('ml-tooltip');\n\ttooltip.setAttribute('content', content);\n\tif (placement) {\n\t\ttooltip.setAttribute('placement', placement);\n\t}\n\n\telement.parentNode?.insertBefore(tooltip, element);\n\ttooltip.appendChild(element);\n\n\treturn () => {\n\t\ttooltip.parentNode?.insertBefore(element, tooltip);\n\t\ttooltip.remove();\n\t};\n}\n\nregisterAttributeDirective('tooltip', tooltipDirective);\n\nexport { tooltipDirective };\n","import { html, classMap } from '@melodicdev/core';\nimport type { SpinnerComponent } from './spinner.component.js';\n\nexport function spinnerTemplate(c: SpinnerComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\tspinner: true,\n\t\t\t\t[`spinner--${c.size}`]: true\n\t\t\t})}\n\t\t\trole=\"status\"\n\t\t\taria-label=${c.label}\n\t\t>\n\t\t\t<svg class=\"spinner__svg\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t<circle class=\"spinner__track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" />\n\t\t\t\t<path\n\t\t\t\t\tclass=\"spinner__indicator\"\n\t\t\t\t\td=\"M12 2C6.47715 2 2 6.47715 2 12\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t${c.label ? html`<span class=\"visually-hidden\">${c.label}</span>` : ''}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const spinnerStyles = () => css`\n\t:host {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.spinner {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.spinner__svg {\n\t\tanimation: spin 0.75s linear infinite;\n\t}\n\n\t.spinner__track {\n\t\topacity: 0.25;\n\t}\n\n\t.spinner__indicator {\n\t\topacity: 1;\n\t}\n\n\t.spinner--xs .spinner__svg {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t}\n\n\t.spinner--sm .spinner__svg {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t.spinner--md .spinner__svg {\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t}\n\n\t.spinner--lg .spinner__svg {\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t}\n\n\t.spinner--xl .spinner__svg {\n\t\twidth: 2.5rem;\n\t\theight: 2.5rem;\n\t}\n\n\t@keyframes spin {\n\t\tfrom {\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\t\tto {\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t.visually-hidden {\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\tpadding: 0;\n\t\tmargin: -1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0, 0, 0, 0);\n\t\twhite-space: nowrap;\n\t\tborder: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { spinnerTemplate } from './spinner.template.js';\nimport { spinnerStyles } from './spinner.styles.js';\n\n/**\n * ml-spinner - Loading spinner component\n *\n * @example\n * ```html\n * <ml-spinner></ml-spinner>\n * <ml-spinner size=\"lg\"></ml-spinner>\n * <ml-spinner label=\"Loading data...\"></ml-spinner>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-spinner',\n\ttemplate: spinnerTemplate,\n\tstyles: spinnerStyles,\n\tattributes: ['size', 'label']\n})\nexport class SpinnerComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Size of the spinner */\n\tsize: Size = 'md';\n\n\t/** Accessible label for screen readers */\n\tlabel = 'Loading';\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { ButtonComponent } from './button.component.js';\n\nexport function buttonTemplate(c: ButtonComponent) {\n\treturn html`\n\t\t<button\n\t\t\ttype=\"${c.type}\"\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-button': true,\n\t\t\t\t[`ml-button--${c.variant}`]: true,\n\t\t\t\t[`ml-button--${c.size}`]: true,\n\t\t\t\t'ml-button--disabled': c.isDisabled,\n\t\t\t\t'ml-button--loading': c.loading,\n\t\t\t\t'ml-button--full-width': c.fullWidth\n\t\t\t})}\n\t\t\t?disabled=${c.isDisabled}\n\t\t\t@click=${c.handleClick}\n\t\t\taria-disabled=${c.isDisabled ? 'true' : 'false'}\n\t\t\taria-busy=${c.loading ? 'true' : 'false'}\n\t\t>\n\t\t\t${when(\n\t\t\t\tc.loading,\n\t\t\t\t() => html`\n\t\t\t\t\t<span class=\"ml-button__spinner\">\n\t\t\t\t\t\t<ml-spinner size=\"sm\"></ml-spinner>\n\t\t\t\t\t</span>\n\t\t\t\t`\n\t\t\t)}\n\t\t\t<span class=\"ml-button__content\">\n\t\t\t\t<slot name=\"icon-start\"></slot>\n\t\t\t\t<slot></slot>\n\t\t\t\t<slot name=\"icon-end\"></slot>\n\t\t\t</span>\n\t\t</button>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const buttonStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t:host([full-width]) {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.ml-button {\n\t\tappearance: none;\n\t\tborder: none;\n\t\tbackground: none;\n\t\tcursor: pointer;\n\t\ttext-decoration: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: var(--ml-space-2);\n\t\tposition: relative;\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tline-height: var(--ml-leading-tight);\n\t\twhite-space: nowrap;\n\t\ttext-align: center;\n\t\tborder: var(--ml-border) solid transparent;\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-button:focus {\n\t\toutline: none;\n\t}\n\n\t.ml-button:focus-visible {\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-button--xs {\n\t\theight: 2rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tfont-size: var(--ml-text-xs);\n\t\tborder-radius: var(--ml-radius-sm);\n\t}\n\n\t.ml-button--sm {\n\t\theight: 2.25rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t.ml-button--md {\n\t\theight: 2.5rem;\n\t\tpadding: 0 var(--ml-space-3-5);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-button--lg {\n\t\theight: 2.75rem;\n\t\tpadding: 0 var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-button--xl {\n\t\theight: 3rem;\n\t\tpadding: 0 var(--ml-space-5);\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t.ml-button--2xl {\n\t\theight: 3.75rem;\n\t\tpadding: 0 var(--ml-space-7);\n\t\tfont-size: var(--ml-text-lg);\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-button--primary {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-button--primary:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tborder-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-button--primary:active:not(:disabled) {\n\t\tbackground-color: var(--ml-color-primary-active);\n\t\tborder-color: var(--ml-color-primary-active);\n\t}\n\n\t.ml-button--secondary {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder-color: var(--ml-color-border-strong);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-button--secondary:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-button--secondary:active:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-button--secondary:focus-visible {\n\t\tbox-shadow: var(--ml-shadow-ring-gray);\n\t}\n\n\t.ml-button--outline {\n\t\tbackground-color: transparent;\n\t\tborder-color: var(--ml-color-border-strong);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbox-shadow: none;\n\t}\n\n\t.ml-button--outline:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-button--outline:active:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-button--ghost {\n\t\tbackground-color: transparent;\n\t\tborder-color: transparent;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tbox-shadow: none;\n\t}\n\n\t.ml-button--ghost:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-button--ghost:active:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-button--danger {\n\t\tbackground-color: var(--ml-color-danger);\n\t\tborder-color: var(--ml-color-danger);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-button--danger:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-danger-hover);\n\t\tborder-color: var(--ml-color-danger-hover);\n\t}\n\n\t.ml-button--danger:active:not(:disabled) {\n\t\tbackground-color: var(--ml-red-800);\n\t\tborder-color: var(--ml-red-800);\n\t}\n\n\t.ml-button--danger:focus-visible {\n\t\tbox-shadow: var(--ml-shadow-ring-error);\n\t}\n\n\t.ml-button--link {\n\t\tbackground-color: transparent;\n\t\tborder-color: transparent;\n\t\tcolor: var(--ml-color-text-link);\n\t\tpadding: 0;\n\t\theight: auto;\n\t\tbox-shadow: none;\n\t\tfont-weight: var(--ml-font-medium);\n\t}\n\n\t.ml-button--link:hover:not(:disabled) {\n\t\tcolor: var(--ml-color-text-link-hover);\n\t\ttext-decoration: underline;\n\t}\n\n\t.ml-button--disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t\tpointer-events: none;\n\t\tbox-shadow: none;\n\t}\n\n\t.ml-button--loading .ml-button__content {\n\t\tvisibility: hidden;\n\t}\n\n\t.ml-button--full-width {\n\t\twidth: 100%;\n\t}\n\n\t.ml-button__spinner {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-button__content {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t::slotted([slot='icon-start']),\n\t::slotted([slot='icon-end']) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1.25em;\n\t\theight: 1.25em;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { ButtonVariant, ButtonType } from './button.types.js';\n// Import spinner so it's registered\nimport '../../feedback/spinner/spinner.component.js';\nimport { buttonTemplate } from './button.template.js';\nimport { buttonStyles } from './button.styles.js';\n\n/**\n * ml-button - A versatile button component with multiple variants and sizes\n *\n * @example\n * ```html\n * <ml-button>Click me</ml-button>\n * <ml-button variant=\"secondary\">Secondary</ml-button>\n * <ml-button variant=\"outline\" size=\"lg\">Large Outline</ml-button>\n * <ml-button loading>Loading...</ml-button>\n * <ml-button disabled>Disabled</ml-button>\n * ```\n *\n * @slot default - Button label content\n * @slot icon-start - Icon before the label\n * @slot icon-end - Icon after the label\n *\n * @fires ml:click - Emitted when button is clicked (not disabled/loading)\n */\n@MelodicComponent({\n\tselector: 'ml-button',\n\ttemplate: buttonTemplate,\n\tstyles: buttonStyles,\n\tattributes: ['variant', 'size', 'type', 'disabled', 'loading', 'full-width']\n})\nexport class ButtonComponent implements IElementRef, OnInit {\n\telementRef!: HTMLElement;\n\n\t/** Button variant style */\n\tvariant: ButtonVariant = 'primary';\n\n\t/** Button size */\n\tsize: Size = 'md';\n\n\t/** HTML button type */\n\ttype: ButtonType = 'button';\n\n\t/** Disable the button */\n\tdisabled = false;\n\n\t/** Show loading state */\n\tloading = false;\n\n\t/** Make button full width */\n\tfullWidth = false;\n\n\tonInit(): void {\n\t\t// Ensure proper ARIA role\n\t\tif (!this.elementRef.hasAttribute('role')) {\n\t\t\tthis.elementRef.setAttribute('role', 'button');\n\t\t}\n\t}\n\n\t/** Whether the button is effectively disabled */\n\tget isDisabled(): boolean {\n\t\treturn this.disabled || this.loading;\n\t}\n\n\t/** Handle click events */\n\thandleClick = (event: MouseEvent): void => {\n\t\tif (this.isDisabled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn;\n\t\t}\n\n\t\t// Dispatch custom event\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { originalEvent: event }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { ButtonGroupComponent } from './button-group.component.js';\n\nexport function buttonGroupTemplate(c: ButtonGroupComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-button-group': true,\n\t\t\t\t'ml-button-group--disabled': c.disabled\n\t\t\t})}\n\t\t\trole=\"group\"\n\t\t>\n\t\t\t<slot @slotchange=${c.handleSlotChange}></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const buttonGroupStyles = () => css`\n\t:host {\n\t\tdisplay: inline-flex;\n\t}\n\n\t.ml-button-group {\n\t\tdisplay: inline-flex;\n\t\talign-items: stretch;\n\t}\n\n\t.ml-button-group--disabled {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t::slotted(ml-button-group-item) {\n\t\tmargin-left: -1px;\n\t}\n\n\t::slotted(ml-button-group-item:first-child) {\n\t\tmargin-left: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { buttonGroupTemplate } from './button-group.template.js';\nimport { buttonGroupStyles } from './button-group.styles.js';\n\n/**\n * ml-button-group - A group of connected toggle buttons\n *\n * @example Single selection:\n * ```html\n * <ml-button-group value=\"list\">\n * <ml-button-group-item value=\"list\" icon=\"list\">List</ml-button-group-item>\n * <ml-button-group-item value=\"grid\" icon=\"grid-four\">Grid</ml-button-group-item>\n * </ml-button-group>\n * ```\n *\n * @example Multiple selection:\n * ```html\n * <ml-button-group multiple>\n * <ml-button-group-item value=\"bold\" icon=\"text-bolder\"></ml-button-group-item>\n * <ml-button-group-item value=\"italic\" icon=\"text-italic\"></ml-button-group-item>\n * <ml-button-group-item value=\"underline\" icon=\"text-underline\"></ml-button-group-item>\n * </ml-button-group>\n * ```\n *\n * @fires ml:change - Emitted when selection changes. Detail: { value: string } or { values: string[] }\n */\n@MelodicComponent({\n\tselector: 'ml-button-group',\n\ttemplate: buttonGroupTemplate,\n\tstyles: buttonGroupStyles,\n\tattributes: ['value', 'variant', 'size', 'disabled', 'multiple']\n})\nexport class ButtonGroupComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Currently selected value (single selection mode) */\n\tvalue = '';\n\n\t/** Active state style: 'outline' (gray) or 'solid' (primary color) */\n\tvariant: 'outline' | 'solid' = 'outline';\n\n\t/** Size variant */\n\tsize: Size = 'md';\n\n\t/** Disable the entire group */\n\tdisabled = false;\n\n\t/** Allow multiple selections */\n\tmultiple = false;\n\n\t/** Selected values (multiple mode) */\n\tvalues: string[] = [];\n\n\tonCreate(): void {\n\t\tthis.elementRef.addEventListener('ml:item-click', this._handleItemClick as EventListener);\n\t\tthis.syncItems();\n\t}\n\n\tonDestroy(): void {\n\t\tthis.elementRef.removeEventListener('ml:item-click', this._handleItemClick as EventListener);\n\t}\n\n\t/** Handle slot changes to sync initial state */\n\thandleSlotChange = (): void => {\n\t\tthis.syncItems();\n\t};\n\n\tprivate readonly _handleItemClick = (event: CustomEvent<{ value: string }>): void => {\n\t\tevent.stopPropagation();\n\t\tconst itemValue = event.detail.value;\n\n\t\tif (this.multiple) {\n\t\t\tconst idx = this.values.indexOf(itemValue);\n\t\t\tif (idx >= 0) {\n\t\t\t\tthis.values = this.values.filter((v) => v !== itemValue);\n\t\t\t} else {\n\t\t\t\tthis.values = [...this.values, itemValue];\n\t\t\t}\n\t\t\tthis.syncItems();\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { values: this.values }\n\t\t\t\t})\n\t\t\t);\n\t\t} else {\n\t\t\tthis.value = itemValue;\n\t\t\tthis.syncItems();\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { value: this.value }\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n\n\tprivate syncItems(): void {\n\t\tconst items = this.elementRef.querySelectorAll('ml-button-group-item');\n\t\titems.forEach((item) => {\n\t\t\tconst itemValue = item.getAttribute('value') ?? '';\n\t\t\tconst isActive = this.multiple ? this.values.includes(itemValue) : itemValue === this.value;\n\n\t\t\titem.toggleAttribute('active', isActive);\n\t\t\titem.toggleAttribute('group-disabled', this.disabled);\n\t\t\titem.setAttribute('group-size', this.size);\n\t\t\titem.setAttribute('group-variant', this.variant);\n\t\t});\n\t}\n}\n","import { html, when } from '@melodicdev/core';\nimport type { ButtonGroupItemComponent } from './button-group-item.component.js';\n\nexport function buttonGroupItemTemplate(c: ButtonGroupItemComponent) {\n\treturn html`\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"ml-button-group-item\"\n\t\t\t?disabled=${c.isDisabled}\n\t\t\taria-pressed=${c.active ? 'true' : 'false'}\n\t\t\t@click=${c.handleClick}\n\t\t>\n\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t<slot></slot>\n\t\t</button>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const buttonGroupItemStyles = () => css`\n\t:host {\n\t\tdisplay: inline-flex;\n\t}\n\n\t.ml-button-group-item {\n\t\tappearance: none;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: var(--ml-space-2);\n\t\theight: 2.5rem;\n\t\tpadding: 0 var(--ml-space-3-5);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\twhite-space: nowrap;\n\t\tcursor: pointer;\n\t\tborder: 1px solid var(--ml-color-border-strong);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* Sizes */\n\t:host([group-size=\"sm\"]) .ml-button-group-item {\n\t\theight: 2.25rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t:host([group-size=\"lg\"]) .ml-button-group-item {\n\t\theight: 2.75rem;\n\t\tpadding: 0 var(--ml-space-4);\n\t}\n\n\t/* Border radius */\n\t:host(:first-child) .ml-button-group-item {\n\t\tborder-radius: var(--ml-radius) 0 0 var(--ml-radius);\n\t}\n\n\t:host(:last-child) .ml-button-group-item {\n\t\tborder-radius: 0 var(--ml-radius) var(--ml-radius) 0;\n\t}\n\n\t:host(:only-child) .ml-button-group-item {\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t:host(:not(:first-child):not(:last-child)) .ml-button-group-item {\n\t\tborder-radius: 0;\n\t}\n\n\t/* Hover */\n\t.ml-button-group-item:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Focus */\n\t.ml-button-group-item:focus {\n\t\toutline: none;\n\t}\n\n\t.ml-button-group-item:focus-visible {\n\t\tz-index: 1;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t/* Active / Selected - outline variant (default) */\n\t:host([active]) .ml-button-group-item {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t\tcolor: var(--ml-color-text);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tz-index: 1;\n\t}\n\n\t:host([active]) .ml-button-group-item:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Active / Selected - solid variant */\n\t:host([active][group-variant=\"solid\"]) .ml-button-group-item {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tborder-color: var(--ml-color-primary);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tz-index: 1;\n\t}\n\n\t:host([active][group-variant=\"solid\"]) .ml-button-group-item:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tborder-color: var(--ml-color-primary-hover);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t/* Disabled */\n\t:host([group-disabled]) .ml-button-group-item,\n\t:host([disabled]) .ml-button-group-item {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { buttonGroupItemTemplate } from './button-group-item.template.js';\nimport { buttonGroupItemStyles } from './button-group-item.styles.js';\n\n/**\n * ml-button-group-item - Individual item within a button group\n *\n * @example\n * ```html\n * <ml-button-group-item value=\"list\" icon=\"list\">List View</ml-button-group-item>\n * ```\n *\n * @slot default - Button label content\n */\n@MelodicComponent({\n\tselector: 'ml-button-group-item',\n\ttemplate: buttonGroupItemTemplate,\n\tstyles: buttonGroupItemStyles,\n\tattributes: ['value', 'icon', 'disabled', 'active', 'group-disabled', 'group-size']\n})\nexport class ButtonGroupItemComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Item value identifier */\n\tvalue = '';\n\n\t/** Optional icon name */\n\ticon = '';\n\n\t/** Disable this item */\n\tdisabled = false;\n\n\t/** Active state (managed by parent via attribute) */\n\tactive = false;\n\n\t/** Disabled state from parent group */\n\tgroupDisabled = false;\n\n\t/** Size from parent group */\n\tgroupSize: Size = 'md';\n\n\tget isDisabled(): boolean {\n\t\treturn this.disabled || this.groupDisabled;\n\t}\n\n\thandleClick = (): void => {\n\t\tif (this.isDisabled) return;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:item-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { InputComponent } from './input.component.js';\n\nexport function inputTemplate(c: InputComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-input': true,\n\t\t\t\t[`ml-input--${c.size}`]: true,\n\t\t\t\t'ml-input--disabled': c.disabled,\n\t\t\t\t'ml-input--readonly': c.readonly,\n\t\t\t\t'ml-input--error': !!c.error,\n\t\t\t\t'ml-input--focused': c._focused\n\t\t\t})}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<label class=\"ml-input__label\" for=\"input\">\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-input__required\">*</span>`)}\n\t\t\t\t\t</label>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=\"ml-input__wrapper\">\n\t\t\t\t<slot name=\"prefix\"></slot>\n\t\t\t\t<input\n\t\t\t\t\tid=\"input\"\n\t\t\t\t\tclass=\"ml-input__field\"\n\t\t\t\t\ttype=\"${c.type}\"\n\t\t\t\t\t.value=${c.value}\n\t\t\t\t\tplaceholder=\"${c.placeholder}\"\n\t\t\t\t\t?disabled=${c.disabled}\n\t\t\t\t\t?readonly=${c.readonly}\n\t\t\t\t\t?required=${c.required}\n\t\t\t\t\tautocomplete=\"${c.autocomplete}\"\n\t\t\t\t\taria-invalid=${c.error ? 'true' : 'false'}\n\t\t\t\t\taria-describedby=${c.error ? 'error' : c.hint ? 'hint' : ''}\n\t\t\t\t\t@input=${c.handleInput}\n\t\t\t\t\t@change=${c.handleChange}\n\t\t\t\t\t@focus=${c.handleFocus}\n\t\t\t\t\t@blur=${c.handleBlur}\n\t\t\t\t/>\n\t\t\t\t<slot name=\"suffix\"></slot>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span id=\"error\" class=\"ml-input__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span id=\"hint\" class=\"ml-input__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const inputStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-input {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1-5);\n\t}\n\n\t.ml-input__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-input__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t.ml-input__wrapper {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-input__wrapper:hover:not(.ml-input--disabled .ml-input__wrapper) {\n\t\tborder-color: var(--ml-color-border);\n\t}\n\n\t.ml-input__field {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: var(--ml-color-text);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: inherit;\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t.ml-input__field:focus {\n\t\toutline: none;\n\t}\n\n\t.ml-input__field::placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-input__field:disabled {\n\t\tcursor: not-allowed;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-input__hint,\n\t.ml-input__error {\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-input__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-input__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n\n\t.ml-input--focused .ml-input__wrapper {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-input--error .ml-input__wrapper {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t.ml-input--error.ml-input--focused .ml-input__wrapper {\n\t\tbox-shadow: var(--ml-shadow-ring-error);\n\t}\n\n\t.ml-input--disabled .ml-input__wrapper {\n\t\tbackground-color: var(--ml-color-input-disabled-bg);\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-input--sm .ml-input__wrapper {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t}\n\n\t.ml-input--sm .ml-input__field {\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-input--md .ml-input__wrapper {\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-3-5);\n\t}\n\n\t.ml-input--md .ml-input__field {\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-input--lg .ml-input__wrapper {\n\t\tpadding: var(--ml-space-3) var(--ml-space-3-5);\n\t}\n\n\t.ml-input--lg .ml-input__field {\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t::slotted([slot='prefix']),\n\t::slotted([slot='suffix']) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tflex-shrink: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { InputType } from './input.types.js';\nimport { inputTemplate } from './input.template.js';\nimport { inputStyles } from './input.styles.js';\n\n/**\n * ml-input - Text input component with label, hint, and error states\n *\n * @example\n * ```html\n * <ml-input label=\"Email\" type=\"email\" placeholder=\"Enter email\"></ml-input>\n * <ml-input label=\"Password\" type=\"password\" required></ml-input>\n * <ml-input label=\"Name\" hint=\"Enter your full name\"></ml-input>\n * <ml-input label=\"Username\" error=\"Username is taken\"></ml-input>\n * ```\n *\n * @slot prefix - Content before the input (icon, text)\n * @slot suffix - Content after the input (icon, button)\n *\n * @fires ml:input - Emitted on input\n * @fires ml:change - Emitted on change (blur)\n * @fires ml:focus - Emitted on focus\n * @fires ml:blur - Emitted on blur\n */\n@MelodicComponent({\n\tselector: 'ml-input',\n\ttemplate: inputTemplate,\n\tstyles: inputStyles,\n\tattributes: ['type', 'value', 'placeholder', 'label', 'hint', 'error', 'size', 'disabled', 'readonly', 'required', 'autocomplete']\n})\nexport class InputComponent implements IElementRef, OnInit {\n\telementRef!: HTMLElement;\n\n\t/** Input type */\n\ttype: InputType = 'text';\n\n\t/** Current value */\n\tvalue = '';\n\n\t/** Placeholder text */\n\tplaceholder = '';\n\n\t/** Label text */\n\tlabel = '';\n\n\t/** Hint text shown below input */\n\thint = '';\n\n\t/** Error message (shows error state when set) */\n\terror = '';\n\n\t/** Input size */\n\tsize: Size = 'md';\n\n\t/** Disable the input */\n\tdisabled = false;\n\n\t/** Make input readonly */\n\treadonly = false;\n\n\t/** Mark as required */\n\trequired = false;\n\n\t/** Autocomplete attribute */\n\tautocomplete = 'off';\n\n\t/** Internal focus state */\n\t_focused = false;\n\n\tonInit(): void {\n\t\t// Set up aria-label if no label provided\n\t\tif (!this.label && this.placeholder) {\n\t\t\tthis.elementRef.setAttribute('aria-label', this.placeholder);\n\t\t}\n\t}\n\n\thandleInput = (event: Event): void => {\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.value = target.value;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:input', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleChange = (event: Event): void => {\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.value = target.value;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleFocus = (): void => {\n\t\tthis._focused = true;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:focus', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n\n\thandleBlur = (): void => {\n\t\tthis._focused = false;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:blur', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { TextareaComponent } from './textarea.component.js';\n\nexport function textareaTemplate(c: TextareaComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-textarea': true,\n\t\t\t\t[`ml-textarea--${c.size}`]: true,\n\t\t\t\t'ml-textarea--disabled': c.disabled,\n\t\t\t\t'ml-textarea--readonly': c.readonly,\n\t\t\t\t'ml-textarea--error': !!c.error,\n\t\t\t\t'ml-textarea--focused': c._focused,\n\t\t\t\t'ml-textarea--resize': c.resize\n\t\t\t})}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<label class=\"ml-textarea__label\" for=\"textarea\">\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-textarea__required\">*</span>`)}\n\t\t\t\t\t</label>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<textarea\n\t\t\t\tid=\"textarea\"\n\t\t\t\tclass=\"ml-textarea__field\"\n\t\t\t\t.value=${c.value}\n\t\t\t\tplaceholder=\"${c.placeholder}\"\n\t\t\t\trows=\"${c.rows}\"\n\t\t\t\t?disabled=${c.disabled}\n\t\t\t\t?readonly=${c.readonly}\n\t\t\t\t?required=${c.required}\n\t\t\t\tmaxlength=\"${c.maxLength || ''}\"\n\t\t\t\taria-invalid=${c.error ? 'true' : 'false'}\n\t\t\t\taria-describedby=${c.error ? 'error' : c.hint ? 'hint' : ''}\n\t\t\t\t@input=${c.handleInput}\n\t\t\t\t@change=${c.handleChange}\n\t\t\t\t@focus=${c.handleFocus}\n\t\t\t\t@blur=${c.handleBlur}\n\t\t\t></textarea>\n\n\t\t\t<div class=\"ml-textarea__footer\">\n\t\t\t\t${when(\n\t\t\t\t\t!!c.error,\n\t\t\t\t\t() => html`<span id=\"error\" class=\"ml-textarea__error\">${c.error}</span>`,\n\t\t\t\t\t() => html`${when(!!c.hint, () => html`<span id=\"hint\" class=\"ml-textarea__hint\">${c.hint}</span>`)}`\n\t\t\t\t)}\n\t\t\t\t${when(\n\t\t\t\t\tc.maxLength > 0,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<span class=\"ml-textarea__counter\"> ${c.value.length} / ${c.maxLength} </span>\n\t\t\t\t\t`\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const textareaStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-textarea {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1-5);\n\t}\n\n\t.ml-textarea__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-textarea__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t.ml-textarea__field {\n\t\tbox-sizing: border-box;\n\t\twidth: 100%;\n\t\tmin-height: 80px;\n\t\tpadding: var(--ml-space-3) var(--ml-space-3-5);\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t\tcolor: var(--ml-color-text);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-normal);\n\t\tresize: none;\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-textarea__field:hover:not(:disabled) {\n\t\tborder-color: var(--ml-color-border);\n\t}\n\n\t.ml-textarea__field:focus {\n\t\toutline: none;\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-textarea__field::placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-textarea__field:disabled {\n\t\tbackground-color: var(--ml-color-input-disabled-bg);\n\t\tcursor: not-allowed;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-textarea__footer {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tmin-height: 1.25rem;\n\t}\n\n\t.ml-textarea__error,\n\t.ml-textarea__hint {\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-textarea__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n\n\t.ml-textarea__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-textarea__counter {\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tmargin-left: auto;\n\t}\n\n\t.ml-textarea--resize .ml-textarea__field {\n\t\tresize: vertical;\n\t}\n\n\t.ml-textarea--error .ml-textarea__field {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t.ml-textarea--error .ml-textarea__field:focus {\n\t\tbox-shadow: var(--ml-shadow-ring-error);\n\t}\n\n\t.ml-textarea--sm .ml-textarea__field {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-textarea--lg .ml-textarea__field {\n\t\tpadding: var(--ml-space-3-5) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-base);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { textareaTemplate } from './textarea.template.js';\nimport { textareaStyles } from './textarea.styles.js';\n\n/**\n * ml-textarea - Multi-line text input component\n *\n * @example\n * ```html\n * <ml-textarea label=\"Description\" placeholder=\"Enter description\"></ml-textarea>\n * <ml-textarea label=\"Bio\" rows=\"5\" max-length=\"500\"></ml-textarea>\n * <ml-textarea label=\"Notes\" auto-resize></ml-textarea>\n * ```\n *\n * @fires ml:input - Emitted on input\n * @fires ml:change - Emitted on change (blur)\n * @fires ml:focus - Emitted on focus\n * @fires ml:blur - Emitted on blur\n */\n@MelodicComponent({\n\tselector: 'ml-textarea',\n\ttemplate: textareaTemplate,\n\tstyles: textareaStyles,\n\tattributes: ['value', 'placeholder', 'label', 'hint', 'error', 'size', 'rows', 'max-length', 'disabled', 'readonly', 'required', 'resize']\n})\nexport class TextareaComponent implements IElementRef, OnInit {\n\telementRef!: HTMLElement;\n\n\t/** Current value */\n\tvalue = '';\n\n\t/** Placeholder text */\n\tplaceholder = '';\n\n\t/** Label text */\n\tlabel = '';\n\n\t/** Hint text shown below textarea */\n\thint = '';\n\n\t/** Error message (shows error state when set) */\n\terror = '';\n\n\t/** Input size */\n\tsize: Size = 'md';\n\n\t/** Number of visible text lines */\n\trows = 3;\n\n\t/** Maximum character length */\n\tmaxLength = 0;\n\n\t/** Disable the textarea */\n\tdisabled = false;\n\n\t/** Make textarea readonly */\n\treadonly = false;\n\n\t/** Mark as required */\n\trequired = false;\n\n\t/** Allow vertical resize */\n\tresize = false;\n\n\t/** Internal focus state */\n\t_focused = false;\n\n\tonInit(): void {\n\t\tif (!this.label && this.placeholder) {\n\t\t\tthis.elementRef.setAttribute('aria-label', this.placeholder);\n\t\t}\n\t}\n\n\thandleInput = (event: Event): void => {\n\t\tconst target = event.target as HTMLTextAreaElement;\n\t\tthis.value = target.value;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:input', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleChange = (event: Event): void => {\n\t\tconst target = event.target as HTMLTextAreaElement;\n\t\tthis.value = target.value;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleFocus = (): void => {\n\t\tthis._focused = true;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:focus', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n\n\thandleBlur = (): void => {\n\t\tthis._focused = false;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:blur', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { CheckboxComponent } from './checkbox.component.js';\n\nexport function checkboxTemplate(c: CheckboxComponent) {\n\treturn html`\n\t\t<label\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-checkbox': true,\n\t\t\t\t[`ml-checkbox--${c.size}`]: true,\n\t\t\t\t'ml-checkbox--checked': c.checked,\n\t\t\t\t'ml-checkbox--indeterminate': c.indeterminate,\n\t\t\t\t'ml-checkbox--disabled': c.disabled\n\t\t\t})}\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"ml-checkbox__input\"\n\t\t\t\t.checked=${c.checked}\n\t\t\t\t.indeterminate=${c.indeterminate}\n\t\t\t\t?disabled=${c.disabled}\n\t\t\t\t@change=${c.handleChange}\n\t\t\t/>\n\t\t\t<span class=\"ml-checkbox__box\">\n\t\t\t\t${when(\n\t\t\t\t\tc.checked && !c.indeterminate,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<svg class=\"ml-checkbox__check\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`\n\t\t\t\t)}\n\t\t\t\t${when(\n\t\t\t\t\tc.indeterminate,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<svg class=\"ml-checkbox__minus\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M2.5 6H9.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`\n\t\t\t\t)}\n\t\t\t</span>\n\t\t\t${when(!!c.label, () => html`<span class=\"ml-checkbox__label\">${c.label}</span>`)}\n\t\t</label>\n\t\t${when(!!c.hint, () => html`<span class=\"ml-checkbox__hint\">${c.hint}</span>`)}\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const checkboxStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-checkbox {\n\t\tdisplay: inline-flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-3);\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t}\n\n\t.ml-checkbox:hover:not(.ml-checkbox--disabled) .ml-checkbox__box {\n\t\tborder-color: var(--ml-color-primary);\n\t}\n\n\t.ml-checkbox__input {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\n\t.ml-checkbox__input:focus-visible + .ml-checkbox__box {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-checkbox__box {\n\t\tposition: relative;\n\t\tflex-shrink: 0;\n\t\tdisplay: block;\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius-xs);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-checkbox__check,\n\t.ml-checkbox__minus {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\twidth: 75%;\n\t\theight: 75%;\n\t}\n\n\t.ml-checkbox__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: 1.25rem;\n\t}\n\n\t.ml-checkbox__hint {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-0-5);\n\t\tmargin-left: calc(1.25rem + var(--ml-space-3));\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-checkbox--disabled {\n\t\tcursor: not-allowed;\n\t\tpointer-events: none;\n\t}\n\n\t.ml-checkbox--disabled .ml-checkbox__box,\n\t.ml-checkbox--disabled .ml-checkbox__label {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-checkbox--checked .ml-checkbox__box,\n\t.ml-checkbox--indeterminate .ml-checkbox__box {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder-color: var(--ml-color-primary);\n\t}\n\n\t.ml-checkbox--checked:hover:not(.ml-checkbox--disabled) .ml-checkbox__box,\n\t.ml-checkbox--indeterminate:hover:not(.ml-checkbox--disabled) .ml-checkbox__box {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tborder-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-checkbox--sm .ml-checkbox__box {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t}\n\n\t.ml-checkbox--md .ml-checkbox__box {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t.ml-checkbox--lg .ml-checkbox__box {\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t}\n\n\t.ml-checkbox--lg .ml-checkbox__label {\n\t\tfont-size: var(--ml-text-base);\n\t\tline-height: 1.5rem;\n\t}\n\n\t.ml-checkbox--lg + .ml-checkbox__hint {\n\t\tmargin-left: calc(1.5rem + var(--ml-space-3));\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { checkboxTemplate } from './checkbox.template.js';\nimport { checkboxStyles } from './checkbox.styles.js';\n\n/**\n * ml-checkbox - Checkbox input component\n *\n * @example\n * ```html\n * <ml-checkbox label=\"Accept terms\"></ml-checkbox>\n * <ml-checkbox label=\"Subscribe\" checked></ml-checkbox>\n * <ml-checkbox label=\"Indeterminate\" indeterminate></ml-checkbox>\n * ```\n *\n * @fires ml:change - Emitted when checked state changes\n */\n@MelodicComponent({\n\tselector: 'ml-checkbox',\n\ttemplate: checkboxTemplate,\n\tstyles: checkboxStyles,\n\tattributes: ['label', 'hint', 'size', 'checked', 'indeterminate', 'disabled']\n})\nexport class CheckboxComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Checkbox label */\n\tlabel = '';\n\n\t/** Hint text below the checkbox */\n\thint = '';\n\n\t/** Checkbox size */\n\tsize: Size = 'md';\n\n\t/** Checked state */\n\tchecked = false;\n\n\t/** Indeterminate state */\n\tindeterminate = false;\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\thandleChange = (event: Event): void => {\n\t\tif (this.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.checked = target.checked;\n\t\tthis.indeterminate = false;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { checked: this.checked }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { RadioComponent } from './radio.component.js';\n\nexport function radioTemplate(c: RadioComponent) {\n\treturn html`\n\t\t<label\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-radio': true,\n\t\t\t\t[`ml-radio--${c.size}`]: true,\n\t\t\t\t'ml-radio--checked': c.checked,\n\t\t\t\t'ml-radio--disabled': c.disabled\n\t\t\t})}\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"radio\"\n\t\t\t\tclass=\"ml-radio__input\"\n\t\t\t\tname=\"${c.name}\"\n\t\t\t\tvalue=\"${c.value}\"\n\t\t\t\t.checked=${c.checked}\n\t\t\t\t?disabled=${c.disabled}\n\t\t\t\t@change=${c.handleChange}\n\t\t\t/>\n\t\t\t<span class=\"ml-radio__circle\">\n\t\t\t\t<span class=\"ml-radio__dot\"></span>\n\t\t\t</span>\n\t\t\t${when(!!c.label, () => html`<span class=\"ml-radio__label\">${c.label}</span>`)}\n\t\t</label>\n\t\t${when(!!c.hint, () => html`<span class=\"ml-radio__hint\">${c.hint}</span>`)}\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const radioStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-radio {\n\t\tdisplay: inline-flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-3);\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t}\n\n\t.ml-radio--disabled {\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-radio--disabled .ml-radio__circle,\n\t.ml-radio--disabled .ml-radio__label {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-radio__input {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\n\t.ml-radio__circle {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius-full);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-radio__input:focus-visible + .ml-radio__circle {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-radio--checked .ml-radio__circle {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t}\n\n\t.ml-radio:hover:not(.ml-radio--disabled) .ml-radio__circle {\n\t\tborder-color: var(--ml-color-primary);\n\t}\n\n\t.ml-radio--checked:hover:not(.ml-radio--disabled) .ml-radio__circle {\n\t\tborder-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-radio__dot {\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-primary);\n\t\ttransform: scale(0);\n\t\ttransition: transform var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-radio--checked .ml-radio__dot {\n\t\ttransform: scale(1);\n\t}\n\n\t.ml-radio--checked:hover:not(.ml-radio--disabled) .ml-radio__dot {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-radio--sm .ml-radio__circle {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t}\n\n\t.ml-radio--sm .ml-radio__dot {\n\t\twidth: 0.375rem;\n\t\theight: 0.375rem;\n\t}\n\n\t.ml-radio--md .ml-radio__circle {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t.ml-radio--md .ml-radio__dot {\n\t\twidth: 0.5rem;\n\t\theight: 0.5rem;\n\t}\n\n\t.ml-radio--lg .ml-radio__circle {\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t}\n\n\t.ml-radio--lg .ml-radio__dot {\n\t\twidth: 0.625rem;\n\t\theight: 0.625rem;\n\t}\n\n\t.ml-radio__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: 1.25rem;\n\t}\n\n\t.ml-radio--lg .ml-radio__label {\n\t\tfont-size: var(--ml-text-base);\n\t\tline-height: 1.5rem;\n\t}\n\n\t.ml-radio__hint {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-0-5);\n\t\tmargin-left: calc(1.25rem + var(--ml-space-3));\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { radioTemplate } from './radio.template.js';\nimport { radioStyles } from './radio.styles.js';\n\n/**\n * ml-radio - Radio input component\n *\n * @example\n * ```html\n * <ml-radio name=\"choice\" value=\"a\" label=\"Option A\"></ml-radio>\n * <ml-radio name=\"choice\" value=\"b\" label=\"Option B\" checked></ml-radio>\n * ```\n *\n * @fires ml:change - Emitted when selected\n */\n@MelodicComponent({\n\tselector: 'ml-radio',\n\ttemplate: radioTemplate,\n\tstyles: radioStyles,\n\tattributes: ['name', 'value', 'label', 'hint', 'size', 'checked', 'disabled']\n})\nexport class RadioComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Radio group name */\n\tname = '';\n\n\t/** Radio value */\n\tvalue = '';\n\n\t/** Radio label */\n\tlabel = '';\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Radio size */\n\tsize: Size = 'md';\n\n\t/** Checked state */\n\tchecked = false;\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\thandleChange = (): void => {\n\t\tthis.checked = true;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, checked: true }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { RadioGroupComponent } from './radio-group.component.js';\n\nexport function radioGroupTemplate(c: RadioGroupComponent) {\n\treturn html`\n\t\t<fieldset\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-radio-group': true,\n\t\t\t\t[`ml-radio-group--${c.orientation}`]: true,\n\t\t\t\t'ml-radio-group--disabled': c.disabled,\n\t\t\t\t'ml-radio-group--error': !!c.error\n\t\t\t})}\n\t\t\trole=\"radiogroup\"\n\t\t\taria-labelledby=${c.label ? 'legend' : ''}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<legend id=\"legend\" class=\"ml-radio-group__legend\">\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-radio-group__required\">*</span>`)}\n\t\t\t\t\t</legend>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=\"ml-radio-group__options\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span class=\"ml-radio-group__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span class=\"ml-radio-group__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</fieldset>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const radioGroupStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-radio-group {\n\t\tborder: none;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t}\n\n\t.ml-radio-group__legend {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tmargin-bottom: var(--ml-space-3);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-radio-group__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t.ml-radio-group__options {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-radio-group--horizontal .ml-radio-group__options {\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: var(--ml-space-6);\n\t}\n\n\t.ml-radio-group--disabled {\n\t\tpointer-events: none;\n\t}\n\n\t.ml-radio-group--disabled .ml-radio-group__legend {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-radio-group__hint,\n\t.ml-radio-group__error {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-2);\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-radio-group__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-radio-group__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit } from '@melodicdev/core';\nimport type { Orientation } from '../../../types/index.js';\nimport { radioGroupTemplate } from './radio-group.template.js';\nimport { radioGroupStyles } from './radio-group.styles.js';\n\n/**\n * ml-radio-group - Container for radio buttons\n *\n * @example\n * ```html\n * <ml-radio-group label=\"Select option\" name=\"options\">\n * <ml-radio value=\"a\" label=\"Option A\"></ml-radio>\n * <ml-radio value=\"b\" label=\"Option B\"></ml-radio>\n * </ml-radio-group>\n * ```\n *\n * @fires ml:change - Emitted when selection changes\n */\n@MelodicComponent({\n\tselector: 'ml-radio-group',\n\ttemplate: radioGroupTemplate,\n\tstyles: radioGroupStyles,\n\tattributes: ['label', 'name', 'value', 'hint', 'error', 'orientation', 'disabled', 'required']\n})\nexport class RadioGroupComponent implements IElementRef, OnInit {\n\telementRef!: HTMLElement;\n\n\t/** Group label */\n\tlabel = '';\n\n\t/** Form field name */\n\tname = '';\n\n\t/** Current selected value */\n\tvalue = '';\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Error message */\n\terror = '';\n\n\t/** Layout orientation */\n\torientation: Orientation = 'vertical';\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Required state */\n\trequired = false;\n\n\tonInit(): void {\n\t\t// Listen for changes from child radios\n\t\tthis.elementRef.addEventListener('ml:change', this.handleChildChange as EventListener);\n\n\t\t// Set initial name on child radios\n\t\tthis.updateChildRadios();\n\t}\n\n\tprivate handleChildChange = (event: CustomEvent): void => {\n\t\tif (event.target === this.elementRef) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst detail = event.detail as { value: string };\n\t\tthis.value = detail.value;\n\n\t\t// Update checked state on all child radios\n\t\tthis.updateChildRadios();\n\n\t\t// Re-emit the event\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\tprivate updateChildRadios(): void {\n\t\tconst radios = this.elementRef.querySelectorAll('ml-radio');\n\t\tif (this.value === '') {\n\t\t\tfor (const radio of radios) {\n\t\t\t\tconst isChecked = (radio as any).checked === true || radio.hasAttribute('checked');\n\t\t\t\tif (isChecked) {\n\t\t\t\t\tthis.value = (radio as any).value ?? radio.getAttribute('value') ?? '';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tradios.forEach((radio) => {\n\t\t\tif (this.name) {\n\t\t\t\t(radio as any).name = this.name;\n\t\t\t}\n\n\t\t\t(radio as any).disabled = this.disabled;\n\n\t\t\tconst radioValue = (radio as any).value ?? radio.getAttribute('value') ?? '';\n\t\t\t(radio as any).checked = this.value !== '' && radioValue === this.value;\n\t\t});\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { RadioCardGroupComponent } from './radio-card-group.component.js';\n\nexport function radioCardGroupTemplate(c: RadioCardGroupComponent) {\n\treturn html`\n\t\t<fieldset\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-radio-card-group': true,\n\t\t\t\t'ml-radio-card-group--disabled': c.disabled,\n\t\t\t\t'ml-radio-card-group--error': !!c.error\n\t\t\t})}\n\t\t\trole=\"radiogroup\"\n\t\t\taria-labelledby=${c.label ? 'legend' : ''}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<legend id=\"legend\" class=\"ml-radio-card-group__legend\">\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-radio-card-group__required\">*</span>`)}\n\t\t\t\t\t</legend>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=${classMap({\n\t\t\t\t'ml-radio-card-group__options': true,\n\t\t\t\t[`ml-radio-card-group__options--${c.orientation}`]: true\n\t\t\t})}>\n\t\t\t\t<slot @slotchange=${c.handleSlotChange}></slot>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span class=\"ml-radio-card-group__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span class=\"ml-radio-card-group__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</fieldset>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const radioCardGroupStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-radio-card-group {\n\t\tborder: none;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t}\n\n\t.ml-radio-card-group__legend {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tmargin-bottom: var(--ml-space-3);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-radio-card-group__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t.ml-radio-card-group__options {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-radio-card-group__options--vertical {\n\t\tflex-direction: column;\n\t}\n\n\t.ml-radio-card-group__options--horizontal {\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.ml-radio-card-group__options--horizontal ::slotted(ml-radio-card) {\n\t\tflex: 1 1 0%;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-radio-card-group--disabled {\n\t\tpointer-events: none;\n\t}\n\n\t.ml-radio-card-group--disabled .ml-radio-card-group__legend {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-radio-card-group__hint,\n\t.ml-radio-card-group__error {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-2);\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-radio-card-group__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-radio-card-group__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport { radioCardGroupTemplate } from './radio-card-group.template.js';\nimport { radioCardGroupStyles } from './radio-card-group.styles.js';\n\n/**\n * ml-radio-card-group - A group of selectable card-style radio options\n *\n * @example\n * ```html\n * <ml-radio-card-group value=\"basic\" label=\"Select a plan\">\n * <ml-radio-card value=\"basic\" label=\"Basic\" description=\"Up to 5 users\" detail=\"$10/mo\"></ml-radio-card>\n * <ml-radio-card value=\"pro\" label=\"Business\" description=\"Up to 50 users\" detail=\"$25/mo\"></ml-radio-card>\n * </ml-radio-card-group>\n * ```\n *\n * @fires ml:change - Emitted when selection changes. Detail: { value: string }\n */\n@MelodicComponent({\n\tselector: 'ml-radio-card-group',\n\ttemplate: radioCardGroupTemplate,\n\tstyles: radioCardGroupStyles,\n\tattributes: ['value', 'label', 'hint', 'error', 'orientation', 'disabled', 'required']\n})\nexport class RadioCardGroupComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Currently selected value */\n\tvalue = '';\n\n\t/** Group label */\n\tlabel = '';\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Error message */\n\terror = '';\n\n\t/** Layout orientation */\n\torientation: 'vertical' | 'horizontal' = 'vertical';\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Required state */\n\trequired = false;\n\n\tonCreate(): void {\n\t\tthis.elementRef.addEventListener('ml:card-select', this._handleCardSelect as EventListener);\n\t\tthis.syncCards();\n\t}\n\n\tonDestroy(): void {\n\t\tthis.elementRef.removeEventListener('ml:card-select', this._handleCardSelect as EventListener);\n\t}\n\n\thandleSlotChange = (): void => {\n\t\tthis.syncCards();\n\t};\n\n\tprivate readonly _handleCardSelect = (event: CustomEvent<{ value: string }>): void => {\n\t\tevent.stopPropagation();\n\t\tthis.value = event.detail.value;\n\t\tthis.syncCards();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\tprivate syncCards(): void {\n\t\tconst cards = this.elementRef.querySelectorAll('ml-radio-card');\n\n\t\t// If no value set, check for initially-selected card\n\t\tif (this.value === '') {\n\t\t\tfor (const card of cards) {\n\t\t\t\tif (card.hasAttribute('selected')) {\n\t\t\t\t\tthis.value = card.getAttribute('value') ?? '';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcards.forEach((card) => {\n\t\t\tconst cardValue = card.getAttribute('value') ?? '';\n\t\t\tconst isSelected = cardValue === this.value;\n\t\t\tcard.toggleAttribute('selected', isSelected);\n\t\t\tcard.toggleAttribute('group-disabled', this.disabled);\n\t\t});\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { RadioCardComponent } from './radio-card.component.js';\n\nexport function radioCardTemplate(c: RadioCardComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-radio-card': true,\n\t\t\t\t'ml-radio-card--selected': c.selected,\n\t\t\t\t'ml-radio-card--disabled': c.isDisabled\n\t\t\t})}\n\t\t\trole=\"radio\"\n\t\t\taria-checked=${c.selected ? 'true' : 'false'}\n\t\t\taria-disabled=${c.isDisabled ? 'true' : 'false'}\n\t\t\ttabindex=${c.isDisabled ? '-1' : '0'}\n\t\t\t@click=${c.handleClick}\n\t\t\t@keydown=${(e: KeyboardEvent) => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); c.handleClick(); } }}\n\t\t>\n\t\t\t<div class=\"ml-radio-card__radio\">\n\t\t\t\t<span class=\"ml-radio-card__circle\">\n\t\t\t\t\t<span class=\"ml-radio-card__dot\"></span>\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-radio-card__content\">\n\t\t\t\t${when(!!c.icon, () => html`\n\t\t\t\t\t<ml-icon icon=${c.icon} size=\"md\" class=\"ml-radio-card__icon\"></ml-icon>\n\t\t\t\t`)}\n\t\t\t\t<div class=\"ml-radio-card__text\">\n\t\t\t\t\t${when(!!c.label, () => html`<span class=\"ml-radio-card__label\">${c.label}</span>`)}\n\t\t\t\t\t${when(!!c.description, () => html`<span class=\"ml-radio-card__description\">${c.description}</span>`)}\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${when(!!c.detail, () => html`\n\t\t\t\t<span class=\"ml-radio-card__detail\">${c.detail}</span>\n\t\t\t`)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const radioCardStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-radio-card {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-radio-card:hover:not(.ml-radio-card--disabled) {\n\t\tborder-color: var(--ml-color-border-strong);\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-radio-card--selected {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tbox-shadow: 0 0 0 1px var(--ml-color-primary);\n\t}\n\n\t.ml-radio-card--selected:hover:not(.ml-radio-card--disabled) {\n\t\tborder-color: var(--ml-color-primary-hover);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tbox-shadow: 0 0 0 1px var(--ml-color-primary-hover);\n\t}\n\n\t.ml-radio-card:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-radio-card--selected:focus-visible {\n\t\tbox-shadow: 0 0 0 1px var(--ml-color-primary), var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-radio-card--disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n\n\t/* Radio indicator */\n\t.ml-radio-card__radio {\n\t\tflex-shrink: 0;\n\t\tpadding-top: var(--ml-space-0-5);\n\t}\n\n\t.ml-radio-card__circle {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-radio-card--selected .ml-radio-card__circle {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t}\n\n\t.ml-radio-card__dot {\n\t\twidth: 0.5rem;\n\t\theight: 0.5rem;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-primary);\n\t\ttransform: scale(0);\n\t\ttransition: transform var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-radio-card--selected .ml-radio-card__dot {\n\t\ttransform: scale(1);\n\t}\n\n\t/* Content area */\n\t.ml-radio-card__content {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-3);\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-radio-card__icon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-radio-card--selected .ml-radio-card__icon {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-radio-card__text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t\tmin-width: 0;\n\t}\n\n\t.ml-radio-card__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-radio-card__description {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t/* Detail (e.g. price) */\n\t.ml-radio-card__detail {\n\t\tflex-shrink: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t\tpadding-top: var(--ml-space-0-5);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { radioCardTemplate } from './radio-card.template.js';\nimport { radioCardStyles } from './radio-card.styles.js';\n\n/**\n * ml-radio-card - A card-style radio option for use within ml-radio-card-group\n *\n * @example\n * ```html\n * <ml-radio-card value=\"basic\" label=\"Basic plan\" description=\"Up to 5 users\" detail=\"$10/mo\" icon=\"user\"></ml-radio-card>\n * ```\n *\n * @slot default - Additional content below label/description\n */\n@MelodicComponent({\n\tselector: 'ml-radio-card',\n\ttemplate: radioCardTemplate,\n\tstyles: radioCardStyles,\n\tattributes: ['value', 'label', 'description', 'detail', 'icon', 'selected', 'disabled', 'group-disabled']\n})\nexport class RadioCardComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Card value identifier */\n\tvalue = '';\n\n\t/** Primary label */\n\tlabel = '';\n\n\t/** Description text below label */\n\tdescription = '';\n\n\t/** Secondary detail text (e.g. price), shown on the right */\n\tdetail = '';\n\n\t/** Optional icon name */\n\ticon = '';\n\n\t/** Selected state (managed by parent via attribute) */\n\tselected = false;\n\n\t/** Disabled state on this card */\n\tdisabled = false;\n\n\t/** Disabled state from parent group */\n\tgroupDisabled = false;\n\n\tget isDisabled(): boolean {\n\t\treturn this.disabled || this.groupDisabled;\n\t}\n\n\thandleClick = (): void => {\n\t\tif (this.isDisabled) return;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:card-select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { ToggleComponent } from './toggle.component.js';\n\nexport function toggleTemplate(c: ToggleComponent) {\n\treturn html`\n\t\t<label\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-toggle': true,\n\t\t\t\t[`ml-toggle--${c.size}`]: true,\n\t\t\t\t'ml-toggle--checked': c.checked,\n\t\t\t\t'ml-toggle--disabled': c.disabled\n\t\t\t})}\n\t\t>\n\t\t\t<input type=\"checkbox\" class=\"ml-toggle__input\" .checked=${c.checked} ?disabled=${c.disabled} @change=${c.handleChange} />\n\t\t\t<span class=\"ml-toggle__track\">\n\t\t\t\t<span class=\"ml-toggle__thumb\"></span>\n\t\t\t</span>\n\t\t\t${when(!!c.label, () => html`<span class=\"ml-toggle__label\">${c.label}</span>`)}\n\t\t</label>\n\t\t${when(!!c.hint, () => html`<span class=\"ml-toggle__hint\">${c.hint}</span>`)}\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const toggleStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-toggle {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t}\n\n\t.ml-toggle--disabled {\n\t\tcursor: not-allowed;\n\t\tpointer-events: none;\n\t}\n\n\t.ml-toggle--disabled .ml-toggle__track,\n\t.ml-toggle--disabled .ml-toggle__label {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-toggle__input {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\n\t.ml-toggle__track {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tbackground-color: var(--ml-color-toggle-off);\n\t\tborder-radius: var(--ml-radius-full);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-200) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-toggle__input:focus-visible + .ml-toggle__track {\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-toggle--checked .ml-toggle__track {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-toggle:hover:not(.ml-toggle--disabled) .ml-toggle__track {\n\t\tbackground-color: var(--ml-color-toggle-off-hover);\n\t}\n\n\t.ml-toggle--checked:hover:not(.ml-toggle--disabled) .ml-toggle__track {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-toggle__thumb {\n\t\tposition: absolute;\n\t\tbackground-color: var(--ml-white);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbox-shadow: var(--ml-shadow-sm);\n\t\ttransition: transform var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-toggle--sm .ml-toggle__track {\n\t\twidth: 2.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t.ml-toggle--sm .ml-toggle__thumb {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tleft: 0.125rem;\n\t}\n\n\t.ml-toggle--sm.ml-toggle--checked .ml-toggle__thumb {\n\t\ttransform: translateX(1rem);\n\t}\n\n\t.ml-toggle--md .ml-toggle__track {\n\t\twidth: 2.75rem;\n\t\theight: 1.5rem;\n\t}\n\n\t.ml-toggle--md .ml-toggle__thumb {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t\tleft: 0.125rem;\n\t}\n\n\t.ml-toggle--md.ml-toggle--checked .ml-toggle__thumb {\n\t\ttransform: translateX(1.25rem);\n\t}\n\n\t.ml-toggle--lg .ml-toggle__track {\n\t\twidth: 3rem;\n\t\theight: 1.75rem;\n\t}\n\n\t.ml-toggle--lg .ml-toggle__thumb {\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t\tleft: 0.125rem;\n\t}\n\n\t.ml-toggle--lg.ml-toggle--checked .ml-toggle__thumb {\n\t\ttransform: translateX(1.25rem);\n\t}\n\n\t.ml-toggle__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-toggle--lg .ml-toggle__label {\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t.ml-toggle__hint {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-1);\n\t\tmargin-left: calc(2.75rem + var(--ml-space-3));\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { toggleTemplate } from './toggle.template.js';\nimport { toggleStyles } from './toggle.styles.js';\n\n/**\n * ml-toggle - Toggle/switch component\n *\n * @example\n * ```html\n * <ml-toggle label=\"Enable notifications\"></ml-toggle>\n * <ml-toggle label=\"Dark mode\" checked></ml-toggle>\n * <ml-toggle size=\"lg\" label=\"Large toggle\"></ml-toggle>\n * ```\n *\n * @fires ml:change - Emitted when toggled\n */\n@MelodicComponent({\n\tselector: 'ml-toggle',\n\ttemplate: toggleTemplate,\n\tstyles: toggleStyles,\n\tattributes: ['label', 'hint', 'size', 'checked', 'disabled']\n})\nexport class ToggleComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Toggle label */\n\tlabel = '';\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Toggle size */\n\tsize: Size = 'md';\n\n\t/** Checked state */\n\tchecked = false;\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\thandleChange = (event: Event): void => {\n\t\tif (this.disabled) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.checked = target.checked;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { checked: this.checked }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when, repeat } from '@melodicdev/core';\nimport type { SelectComponent } from './select.component.js';\nimport type { SelectOption } from './select.types.js';\n\nexport function selectTemplate(c: SelectComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-select': true,\n\t\t\t\t[`ml-select--${c.size}`]: true,\n\t\t\t\t'ml-select--open': c.isOpen,\n\t\t\t\t'ml-select--disabled': c.disabled,\n\t\t\t\t'ml-select--error': !!c.error,\n\t\t\t\t'ml-select--has-value': c.hasValue,\n\t\t\t\t'ml-select--multiple': c.multiple\n\t\t\t})}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<label class=\"ml-select__label\">\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-select__required\">*</span>`)}\n\t\t\t\t\t</label>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=\"ml-select__control\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"ml-select__trigger\"\n\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\ttabindex=${c.disabled ? '-1' : '0'}\n\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\taria-expanded=${c.isOpen}\n\t\t\t\t\taria-labelledby=${c.label ? 'label' : ''}\n\t\t\t\t\t@click=${c.toggle}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"ml-select__value\">\n\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\tc.multiple,\n\t\t\t\t\t\t\t() => renderMultiValue(c),\n\t\t\t\t\t\t\t() => renderSingleValue(c)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ml-icon icon=\"caret-down\" size=\"sm\" format=\"regular\" class=\"ml-select__chevron\"></ml-icon>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t'ml-select__dropdown': true,\n\t\t\t\t\t\t'ml-select__dropdown--open': c.isOpen\n\t\t\t\t\t})}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${c.multiple || false}\n\t\t\t\t>\n\t\t\t\t\t${c.filteredOptions.length\n\t\t\t\t\t\t? repeat(\n\t\t\t\t\t\t\t\tc.filteredOptions,\n\t\t\t\t\t\t\t\t(option) => `${option.value}-${c.multiple ? c.values.includes(option.value) : c.value === option.value}`,\n\t\t\t\t\t\t\t\t(option, index) => renderOption(c, option, index)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: html`<div class=\"ml-select__empty\">No results found</div>`}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span class=\"ml-select__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span class=\"ml-select__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n\nfunction renderSingleValue(c: SelectComponent) {\n\treturn html`\n\t\t${when(\n\t\t\t!!c.selectedOption?.icon,\n\t\t\t() => html`<ml-icon icon=\"${c.selectedOption?.icon ?? ''}\" size=\"sm\" class=\"ml-select__value-icon\"></ml-icon>`\n\t\t)}\n\t\t${c.displayText\n\t\t\t? html`<span class=\"ml-select__value-text\">${c.displayText}</span>`\n\t\t\t: html`<span class=\"ml-select__placeholder\">${c.placeholder}</span>`}\n\t`;\n}\n\nfunction renderMultiValue(c: SelectComponent) {\n\treturn html`\n\t\t<ml-icon icon=\"magnifying-glass\" size=\"sm\" format=\"regular\" class=\"ml-select__search-icon\"></ml-icon>\n\t\t<span class=\"ml-select__tags\">\n\t\t\t${repeat(\n\t\t\t\tc.selectedOptions,\n\t\t\t\t(option) => option.value,\n\t\t\t\t(option) => html`\n\t\t\t\t\t<span class=\"ml-select__tag\">\n\t\t\t\t\t\t${option.avatarUrl\n\t\t\t\t\t\t\t? html`<img class=\"ml-select__tag-avatar\" src=\"${option.avatarUrl}\" alt=\"${option.avatarAlt || option.label}\" />`\n\t\t\t\t\t\t\t: html``}\n\t\t\t\t\t\t<span class=\"ml-select__tag-label\">${option.label}</span>\n\t\t\t\t\t\t<button type=\"button\" class=\"ml-select__tag-remove\" aria-label=\"Remove ${option.label}\" @click=${(event: Event) => c.handleTagRemove(event, option.value)}>\n\t\t\t\t\t\t\t<ml-icon icon=\"x\" size=\"sm\" format=\"bold\"></ml-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t`\n\t\t\t)}\n\t\t</span>\n\t\t<input\n\t\t\tclass=\"ml-select__search\"\n\t\t\ttype=\"text\"\n\t\t\tplaceholder=${c.values.length ? '' : c.placeholder}\n\t\t\taria-label=${c.placeholder || 'Search'}\n\t\t\t.value=${c.search}\n\t\t\t@input=${c.handleSearchInput}\n\t\t\t@click=${c.handleSearchClick}\n\t\t/>\n\t`;\n}\n\nfunction renderOption(c: SelectComponent, option: SelectOption, index: number) {\n\tconst isSelected = c.multiple ? c.values.includes(option.value) : c.value === option.value;\n\tconst isFocused = c.focusedIndex === index;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-select__option': true,\n\t\t\t\t'ml-select__option--selected': isSelected,\n\t\t\t\t'ml-select__option--focused': isFocused,\n\t\t\t\t'ml-select__option--disabled': !!option.disabled\n\t\t\t})}\n\t\t\trole=\"option\"\n\t\t\taria-selected=${isSelected}\n\t\t\taria-disabled=${option.disabled || false}\n\t\t\t@click=${(e: Event) => c.handleOptionClick(e, option)}\n\t\t>\n\t\t\t${when(!!option.avatarUrl, () => html`<img class=\"ml-select__option-avatar\" src=\"${option.avatarUrl}\" alt=\"${option.avatarAlt || option.label}\" />`)}\n\t\t\t${when(!option.avatarUrl && !!option.icon, () => html`<ml-icon icon=\"${option.icon}\" size=\"sm\" class=\"ml-select__option-icon\"></ml-icon>`)}\n\t\t\t<span class=\"ml-select__option-label\">${option.label}</span>\n\t\t\t${when(isSelected, () => html`<ml-icon icon=\"check\" size=\"sm\" format=\"regular\" class=\"ml-select__option-check\"></ml-icon>`)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const selectStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmin-width: 0;\n\t\tbox-sizing: border-box;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t.ml-select {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1-5);\n\t\tmax-width: 100%;\n\t}\n\n\t.ml-select__control {\n\t\tposition: relative;\n\t\tmax-width: 100%;\n\t}\n\n\t.ml-select--open .ml-select__control {\n\t\tz-index: 100;\n\t}\n\n\t.ml-select__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-select__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t.ml-select__trigger {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-2);\n\t\twidth: 100%;\n\t\tmax-width: 100%;\n\t\toverflow: hidden;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: none;\n\t\tcolor: var(--ml-color-text);\n\t\tfont-family: var(--ml-font-sans);\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-select:not(.ml-select--disabled) .ml-select__trigger:hover {\n\t\tborder-color: var(--ml-color-border-strong);\n\t}\n\n\t.ml-select__trigger:focus,\n\t.ml-select__trigger:focus-within {\n\t\toutline: none;\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-select--disabled .ml-select__trigger {\n\t\tbackground-color: var(--ml-color-input-disabled-bg);\n\t\tcursor: not-allowed;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select--disabled .ml-select__search {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__value {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-select--multiple .ml-select__value {\n\t\tflex-wrap: wrap;\n\t\twhite-space: normal;\n\t\tgap: var(--ml-space-1-5);\n\t}\n\n\t.ml-select__value-text {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-select__search-icon {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tflex-shrink: 0;\n\t\theight: 20px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.ml-select__search {\n\t\tflex: 1 1 20px;\n\t\tmin-width: 20px;\n\t\theight: 20px;\n\t\tborder: none;\n\t\toutline: none;\n\t\tbackground: transparent;\n\t\tfont: inherit;\n\t\tcolor: var(--ml-color-text);\n\t\tpadding: 0;\n\t\tline-height: 20px;\n\t}\n\n\t.ml-select__search::placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__value-icon {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-select__tags {\n\t\tdisplay: contents;\n\t}\n\n\t.ml-select__tag {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t\tpadding: 0 var(--ml-space-1-5);\n\t\theight: 20px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t\twhite-space: nowrap;\n\t\tmax-width: 100%;\n\t\toverflow: hidden;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.ml-select__tag-label {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tline-height: inherit;\n\t}\n\n\t.ml-select__tag-avatar {\n\t\twidth: 14px;\n\t\theight: 14px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tobject-fit: cover;\n\t\tmargin-left: -2px;\n\t}\n\n\t.ml-select__tag-remove {\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tpadding: 2px;\n\t\tmargin-left: var(--ml-space-0-5);\n\t\tmargin-right: -4px;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tcursor: pointer;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tborder-radius: var(--ml-radius-full);\n\t\ttransition: color var(--ml-duration-100) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-100) var(--ml-ease-in-out);\n\t}\n\n\t.ml-select__tag-remove:hover {\n\t\tcolor: var(--ml-color-text);\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-select__chevron {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttransition: transform var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-select--open .ml-select__chevron {\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.ml-select--multiple .ml-select__trigger {\n\t\talign-items: center;\n\t\tpadding-top: var(--ml-space-2);\n\t\tpadding-bottom: var(--ml-space-2);\n\t}\n\n\t.ml-select__dropdown {\n\t\tposition: absolute;\n\t\ttop: 100%;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tz-index: 50;\n\t\tmargin-top: var(--ml-space-1);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tmax-height: 280px;\n\t\toverflow-y: auto;\n\t\tpadding: var(--ml-space-1-5);\n\t\tdisplay: none;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-select__dropdown--open {\n\t\tdisplay: flex;\n\t}\n\n\t.ml-select__empty {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__option {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tcursor: pointer;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\ttransition: background-color var(--ml-duration-100) var(--ml-ease-in-out);\n\t}\n\n\t.ml-select__option:hover:not(.ml-select__option--disabled) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-select__option--focused {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-select__option--selected {\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t}\n\n\t.ml-select__option--selected:hover:not(.ml-select__option--disabled) {\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t}\n\n\t.ml-select__option--disabled {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-select__option-icon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__option-avatar {\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tobject-fit: cover;\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-select__option--selected .ml-select__option-icon {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-select__option-label {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-select__option-check {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-primary);\n\t\tmargin-left: auto;\n\t}\n\n\t.ml-select__hint,\n\t.ml-select__error {\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-select__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-select__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n\n\t.ml-select--error .ml-select__trigger {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t.ml-select--error .ml-select__trigger:focus {\n\t\tbox-shadow: var(--ml-shadow-ring-error);\n\t}\n\n\t/* Size variants */\n\t.ml-select--sm .ml-select__trigger {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-select--md .ml-select__trigger {\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-3-5);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-select--lg .ml-select__trigger {\n\t\tpadding: var(--ml-space-3) var(--ml-space-3-5);\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t/* Disabled state */\n\t.ml-select--disabled {\n\t\tpointer-events: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { SelectOption } from './select.types.js';\nimport { selectTemplate } from './select.template.js';\nimport { selectStyles } from './select.styles.js';\n\n/**\n * ml-select - Custom select/dropdown component\n *\n * @example\n * ```html\n * <ml-select\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * .options=${[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'mx', label: 'Mexico' }\n * ]}\n * ></ml-select>\n *\n * <ml-select\n * label=\"Countries\"\n * placeholder=\"Select countries\"\n * multiple\n * .values=${['us', 'ca']}\n * .options=${[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'mx', label: 'Mexico' }\n * ]}\n * ></ml-select>\n * ```\n *\n * @fires ml:change - Emitted when selection changes\n * @fires ml:open - Emitted when dropdown opens\n * @fires ml:close - Emitted when dropdown closes\n */\n@MelodicComponent({\n\tselector: 'ml-select',\n\ttemplate: selectTemplate,\n\tstyles: selectStyles,\n\tattributes: ['label', 'placeholder', 'hint', 'error', 'size', 'disabled', 'required', 'value', 'multiple']\n})\nexport class SelectComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Label text */\n\tlabel = '';\n\n\t/** Placeholder text when no selection */\n\tplaceholder = 'Select an option';\n\n\t/** Hint text shown below select */\n\thint = '';\n\n\t/** Error message (shows error state when set) */\n\terror = '';\n\n\t/** Select size */\n\tsize: Size = 'md';\n\n\t/** Disable the select */\n\tdisabled = false;\n\n\t/** Mark as required */\n\trequired = false;\n\n\t/** Enable multi-select mode */\n\tmultiple = false;\n\n\t/** Currently selected value */\n\tvalue = '';\n\n\t/** Currently selected values (multi-select) */\n\tvalues: string[] = [];\n\n\t/** Available options */\n\toptions: SelectOption[] = [];\n\n\t/** Search query for inline filtering */\n\tsearch = '';\n\n\t/** Whether dropdown is open */\n\tisOpen = false;\n\n\t/** Currently focused option index for keyboard navigation */\n\tfocusedIndex = -1;\n\n\t/** Bound event handlers for cleanup */\n\tprivate readonly _handleDocumentClick = this.onDocumentClick.bind(this);\n\tprivate readonly _handleKeyDown = this.onKeyDown.bind(this);\n\tprivate _syncingValues = false;\n\n\tonCreate(): void {\n\t\tdocument.addEventListener('click', this._handleDocumentClick);\n\t\tthis.elementRef.addEventListener('keydown', this._handleKeyDown);\n\t}\n\n\tonDestroy(): void {\n\t\tdocument.removeEventListener('click', this._handleDocumentClick);\n\t\tthis.elementRef.removeEventListener('keydown', this._handleKeyDown);\n\t}\n\n\tonPropertyChange(name: string): void {\n\t\tif (this._syncingValues) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === 'multiple') {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (!this.values.length && this.value) {\n\t\t\t\t\tthis.updateValues([this.value]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.values.length) {\n\t\t\t\tthis.value = this.values[0] ?? '';\n\t\t\t}\n\t\t\tthis.updateValues([]);\n\t\t\tthis.search = '';\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === 'values') {\n\t\t\tconst rawValues = this.values as unknown;\n\t\t\tlet normalized: string[] = [];\n\t\t\tif (typeof rawValues === 'string') {\n\t\t\t\tnormalized = rawValues\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => value.trim())\n\t\t\t\t\t.filter((value) => value.length > 0);\n\t\t\t} else if (Array.isArray(rawValues)) {\n\t\t\t\tnormalized = rawValues.filter((value) => typeof value === 'string');\n\t\t\t}\n\n\t\t\tnormalized = Array.from(new Set(normalized));\n\t\t\tif (!this.areValuesEqual(this.values, normalized)) {\n\t\t\t\tthis.updateValues(normalized);\n\t\t\t}\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.value = normalized[0] ?? '';\n\t\t\t\tthis.updateValues([]);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === 'value' && this.multiple) {\n\t\t\tif (this.value) {\n\t\t\t\tconst nextValues = Array.from(new Set([...this.values, this.value]));\n\t\t\t\tif (!this.areValuesEqual(this.values, nextValues)) {\n\t\t\t\t\tthis.updateValues(nextValues);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Get the currently selected option */\n\tget selectedOption(): SelectOption | undefined {\n\t\treturn this.options.find((opt) => opt.value === this.value);\n\t}\n\n\t/** Get the currently selected options (multi-select) */\n\tget selectedOptions(): SelectOption[] {\n\t\tif (!this.multiple) {\n\t\t\treturn this.selectedOption ? [this.selectedOption] : [];\n\t\t}\n\n\t\treturn this.options.filter((opt) => this.values.includes(opt.value));\n\t}\n\n\t/** Get display text for trigger */\n\tget displayText(): string {\n\t\tif (this.multiple) {\n\t\t\treturn this.selectedOptions.map((option) => option.label).join(', ');\n\t\t}\n\n\t\treturn this.selectedOption?.label || '';\n\t}\n\n\tget filteredOptions(): SelectOption[] {\n\t\tconst query = this.search.trim().toLowerCase();\n\t\tif (!query) return this.options;\n\n\t\treturn this.options.filter((option) => {\n\t\t\tconst labelMatch = option.label.toLowerCase().includes(query);\n\t\t\tconst valueMatch = option.value.toLowerCase().includes(query);\n\t\t\treturn labelMatch || valueMatch;\n\t\t});\n\t}\n\n\tget hasValue(): boolean {\n\t\treturn this.multiple ? this.values.length > 0 : !!this.value;\n\t}\n\n\t/** Toggle dropdown open/close */\n\ttoggle = (): void => {\n\t\tif (this.disabled) return;\n\n\t\tif (this.multiple) {\n\t\t\tif (!this.isOpen) {\n\t\t\t\tthis.open();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isOpen) {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.open();\n\t};\n\n\t/** Open the dropdown */\n\topen = (): void => {\n\t\tif (this.disabled || this.isOpen) return;\n\n\t\tthis.isOpen = true;\n\t\tthis.focusedIndex = this.getInitialFocusIndex();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:open', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Close the dropdown */\n\tclose = (): void => {\n\t\tif (!this.isOpen) return;\n\n\t\tthis.isOpen = false;\n\t\tthis.focusedIndex = -1;\n\t\tthis.search = '';\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:close', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Select an option */\n\tselectOption = (option: SelectOption): void => {\n\t\tif (option.disabled) return;\n\n\t\tif (this.multiple) {\n\t\t\tthis.toggleOption(option);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.value = option.value;\n\t\tthis.close();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, option }\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Toggle a value in multi-select mode */\n\tprivate toggleOption(option: SelectOption): void {\n\t\tconst exists = this.values.includes(option.value);\n\t\tthis.values = exists ? this.values.filter((value) => value !== option.value) : [...this.values, option.value];\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { values: [...this.values], options: this.selectedOptions, option }\n\t\t\t})\n\t\t);\n\t}\n\n\t/** Handle click on option */\n\thandleOptionClick = (event: Event, option: SelectOption): void => {\n\t\tevent.stopPropagation();\n\t\tthis.selectOption(option);\n\t};\n\n\thandleTagRemove = (event: Event, value: string): void => {\n\t\tevent.stopPropagation();\n\t\tif (this.disabled) return;\n\n\t\tthis.values = this.values.filter((item) => item !== value);\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { values: [...this.values], options: this.selectedOptions }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleSearchInput = (event: Event): void => {\n\t\tif (this.disabled) return;\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.search = target.value;\n\t\tthis.focusedIndex = this.findFirstEnabledIndex();\n\t\tif (!this.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t};\n\n\thandleSearchClick = (event: Event): void => {\n\t\tevent.stopPropagation();\n\t\tif (!this.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t};\n\n\t/** Handle clicks outside to close dropdown */\n\tprivate onDocumentClick(event: Event): void {\n\t\tconst path = event.composedPath();\n\t\tif (!path.includes(this.elementRef)) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/** Handle keyboard navigation */\n\tprivate onKeyDown(event: KeyboardEvent): void {\n\t\tif (this.disabled) return;\n\n\t\tconst target = event.target as HTMLElement | null;\n\t\tconst isSearchInput = target?.classList?.contains('ml-select__search') ?? false;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tif (isSearchInput) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.isOpen && this.focusedIndex >= 0) {\n\t\t\t\t\tconst option = this.getActiveOptions()[this.focusedIndex];\n\t\t\t\t\tif (option && !option.disabled) {\n\t\t\t\t\t\tthis.selectOption(option);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.toggle();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (!this.isOpen) {\n\t\t\t\t\tthis.open();\n\t\t\t\t} else {\n\t\t\t\t\tthis.focusNextOption();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.isOpen) {\n\t\t\t\t\tthis.focusPreviousOption();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.isOpen) {\n\t\t\t\t\tthis.focusedIndex = this.findFirstEnabledIndex();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.isOpen) {\n\t\t\t\t\tthis.focusedIndex = this.findLastEnabledIndex();\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Tab':\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Move focus to next enabled option */\n\tprivate focusNextOption(): void {\n\t\tconst startIndex = this.focusedIndex;\n\t\tlet index = startIndex + 1;\n\t\tconst options = this.getActiveOptions();\n\n\t\twhile (index < options.length) {\n\t\t\tif (!options[index].disabled) {\n\t\t\t\tthis.focusedIndex = index;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t}\n\n\t/** Move focus to previous enabled option */\n\tprivate focusPreviousOption(): void {\n\t\tconst startIndex = this.focusedIndex;\n\t\tlet index = startIndex - 1;\n\t\tconst options = this.getActiveOptions();\n\n\t\twhile (index >= 0) {\n\t\t\tif (!options[index].disabled) {\n\t\t\t\tthis.focusedIndex = index;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tindex--;\n\t\t}\n\t}\n\n\t/** Find first enabled option index */\n\tprivate findFirstEnabledIndex(): number {\n\t\treturn this.getActiveOptions().findIndex((opt) => !opt.disabled);\n\t}\n\n\t/** Find last enabled option index */\n\tprivate findLastEnabledIndex(): number {\n\t\tconst options = this.getActiveOptions();\n\t\tfor (let i = options.length - 1; i >= 0; i--) {\n\t\t\tif (!options[i].disabled) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate getInitialFocusIndex(): number {\n\t\tconst options = this.getActiveOptions();\n\n\t\tif (this.multiple && this.values.length > 0) {\n\t\t\tconst selectedIndex = options.findIndex((opt) => this.values.includes(opt.value) && !opt.disabled);\n\t\t\tif (selectedIndex >= 0) {\n\t\t\t\treturn selectedIndex;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.multiple && this.value) {\n\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === this.value && !opt.disabled);\n\t\t\tif (selectedIndex >= 0) {\n\t\t\t\treturn selectedIndex;\n\t\t\t}\n\t\t}\n\n\t\treturn this.findFirstEnabledIndex();\n\t}\n\n\tprivate getActiveOptions(): SelectOption[] {\n\t\treturn this.filteredOptions;\n\t}\n\n\tprivate updateValues(values: string[]): void {\n\t\tthis._syncingValues = true;\n\t\tthis.values = values;\n\t\tthis._syncingValues = false;\n\t}\n\n\tprivate areValuesEqual(left: string[], right: string[]): boolean {\n\t\tif (left.length !== right.length) return false;\n\t\tfor (let i = 0; i < left.length; i++) {\n\t\t\tif (left[i] !== right[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import { html, classMap, styleMap, when } from '@melodicdev/core';\nimport type { SliderComponent } from './slider.component.js';\n\nexport function sliderTemplate(c: SliderComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-slider': true,\n\t\t\t\t[`ml-slider--${c.size}`]: true,\n\t\t\t\t'ml-slider--disabled': c.disabled,\n\t\t\t\t'ml-slider--error': !!c.error\n\t\t\t})}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label || c.showValue,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-slider__header\">\n\t\t\t\t\t\t${when(!!c.label, () => html`<label class=\"ml-slider__label\">${c.label}</label>`)}\n\t\t\t\t\t\t${when(c.showValue, () => html`<span class=\"ml-slider__value\">${c.value}</span>`)}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=\"ml-slider__track-wrapper\">\n\t\t\t\t<div class=\"ml-slider__track\">\n\t\t\t\t\t<div class=\"ml-slider__fill\" style=${styleMap({ width: c.fillWidth })}></div>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"ml-slider__input\"\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t.value=${String(c.value)}\n\t\t\t\t\tmin=${c.min}\n\t\t\t\t\tmax=${c.max}\n\t\t\t\t\tstep=${c.step}\n\t\t\t\t\tdisabled=${c.disabled}\n\t\t\t\t\taria-label=${c.label || 'Slider'}\n\t\t\t\t\t@input=${c.handleInput}\n\t\t\t\t\t@change=${c.handleChange}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span class=\"ml-slider__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span class=\"ml-slider__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const sliderStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-slider__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: var(--ml-space-2);\n\t}\n\n\t.ml-slider__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-slider__value {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-slider__track-wrapper {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.ml-slider__track {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpointer-events: none;\n\t}\n\n\t.ml-slider__track::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\tbackground-color: var(--ml-color-surface-hover);\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-slider--sm .ml-slider__track::before {\n\t\theight: 4px;\n\t}\n\n\t.ml-slider--md .ml-slider__track::before {\n\t\theight: 6px;\n\t}\n\n\t.ml-slider--lg .ml-slider__track::before {\n\t\theight: 8px;\n\t}\n\n\t.ml-slider__fill {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tpointer-events: none;\n\t}\n\n\t.ml-slider--sm .ml-slider__fill {\n\t\theight: 4px;\n\t}\n\n\t.ml-slider--md .ml-slider__fill {\n\t\theight: 6px;\n\t}\n\n\t.ml-slider--lg .ml-slider__fill {\n\t\theight: 8px;\n\t}\n\n\t.ml-slider--error .ml-slider__fill {\n\t\tbackground-color: var(--ml-color-danger);\n\t}\n\n\t/* Native range input - overlays the track */\n\t.ml-slider__input {\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t\t-webkit-appearance: none;\n\t\tappearance: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\tposition: relative;\n\t\tz-index: 1;\n\t}\n\n\t.ml-slider__input:disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n\n\t/* Webkit thumb */\n\t.ml-slider__input::-webkit-slider-thumb {\n\t\t-webkit-appearance: none;\n\t\tappearance: none;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: white;\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-sm);\n\t\ttransition:\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-slider__input:hover::-webkit-slider-thumb {\n\t\tbox-shadow: var(--ml-shadow-md);\n\t\ttransform: scale(1.1);\n\t}\n\n\t.ml-slider__input:focus-visible::-webkit-slider-thumb {\n\t\tbox-shadow: 0 0 0 3px var(--ml-color-primary-subtle);\n\t}\n\n\t.ml-slider--error .ml-slider__input::-webkit-slider-thumb {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t/* Firefox thumb */\n\t.ml-slider__input::-moz-range-thumb {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: white;\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-sm);\n\t}\n\n\t.ml-slider--error .ml-slider__input::-moz-range-thumb {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t/* Hide browser track (we use custom track) */\n\t.ml-slider__input::-webkit-slider-runnable-track {\n\t\theight: 20px;\n\t\tbackground: transparent;\n\t}\n\n\t.ml-slider__input::-moz-range-track {\n\t\theight: 20px;\n\t\tbackground: transparent;\n\t\tborder: none;\n\t}\n\n\t.ml-slider__hint {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-2);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n\n\t.ml-slider__error {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-2);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-danger);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { sliderTemplate } from './slider.template.js';\nimport { sliderStyles } from './slider.styles.js';\n\n/**\n * ml-slider - Range slider input\n *\n * @example\n * ```html\n * <ml-slider label=\"Volume\" value=\"50\"></ml-slider>\n * <ml-slider label=\"Price\" min=\"0\" max=\"1000\" step=\"10\" show-value></ml-slider>\n * ```\n *\n * @fires ml:input - Emitted on each input change\n * @fires ml:change - Emitted on final change (mouseup/touchend)\n */\n@MelodicComponent({\n\tselector: 'ml-slider',\n\ttemplate: sliderTemplate,\n\tstyles: sliderStyles,\n\tattributes: ['label', 'value', 'min', 'max', 'step', 'size', 'disabled', 'show-value', 'hint', 'error']\n})\nexport class SliderComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Label text */\n\tlabel = '';\n\n\t/** Current value */\n\tvalue = 50;\n\n\t/** Minimum value */\n\tmin = 0;\n\n\t/** Maximum value */\n\tmax = 100;\n\n\t/** Step increment */\n\tstep = 1;\n\n\t/** Slider size */\n\tsize: Size = 'md';\n\n\t/** Disable the slider */\n\tdisabled = false;\n\n\t/** Show current value */\n\tshowValue = false;\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Error message */\n\terror = '';\n\n\t/** Ratio 0–1 for fill track */\n\tget ratio(): number {\n\t\tconst range = this.max - this.min;\n\t\tif (range <= 0) return 0;\n\t\treturn (this.value - this.min) / range;\n\t}\n\n\t/** CSS width for fill that matches native thumb position */\n\tget fillWidth(): string {\n\t\tconst p = this.ratio;\n\t\treturn `calc(${p * 100}% + ${10 - p * 20}px)`;\n\t}\n\n\thandleInput = (event: Event): void => {\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.value = Number(target.value);\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:input', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleChange = (event: Event): void => {\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.value = Number(target.value);\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { FormFieldComponent } from './form-field.component.js';\n\nexport function formFieldTemplate(c: FormFieldComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-form-field': true,\n\t\t\t\t[`ml-form-field--${c.size}`]: true,\n\t\t\t\t[`ml-form-field--${c.orientation}`]: true,\n\t\t\t\t'ml-form-field--disabled': c.disabled,\n\t\t\t\t'ml-form-field--error': !!c.error\n\t\t\t})}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`\n\t\t\t\t\t<label class=\"ml-form-field__label\" for=${c.fieldId}>\n\t\t\t\t\t\t${c.label}\n\t\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-form-field__required\">*</span>`)}\n\t\t\t\t\t</label>\n\t\t\t\t`\n\t\t\t)}\n\n\t\t\t<div class=\"ml-form-field__control\">\n\t\t\t\t<slot @slotchange=${c.handleSlotChange}></slot>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span id=${c.errorId} class=\"ml-form-field__error\">${c.error}</span>`\n\t\t\t)}\n\t\t\t${when(\n\t\t\t\t!c.error && !!c.hint,\n\t\t\t\t() => html`<span id=${c.hintId} class=\"ml-form-field__hint\">${c.hint}</span>`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const formFieldStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.ml-form-field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1-5);\n\t}\n\n\t/* Horizontal orientation */\n\t.ml-form-field--horizontal {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: minmax(100px, auto) 1fr;\n\t\tgrid-template-rows: auto auto;\n\t\tgap: var(--ml-space-1-5) var(--ml-space-4);\n\t\talign-items: start;\n\t}\n\n\t.ml-form-field--horizontal .ml-form-field__label {\n\t\tgrid-column: 1;\n\t\tgrid-row: 1;\n\t\tpadding-top: var(--ml-space-2-5);\n\t\ttext-align: right;\n\t}\n\n\t.ml-form-field--horizontal .ml-form-field__control {\n\t\tgrid-column: 2;\n\t\tgrid-row: 1;\n\t}\n\n\t.ml-form-field--horizontal .ml-form-field__hint,\n\t.ml-form-field--horizontal .ml-form-field__error {\n\t\tgrid-column: 2;\n\t\tgrid-row: 2;\n\t}\n\n\t/* Label */\n\t.ml-form-field__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-form-field__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t/* Control wrapper */\n\t.ml-form-field__control {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* Hint and error messages */\n\t.ml-form-field__hint,\n\t.ml-form-field__error {\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-form-field__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-form-field__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n\n\t/* Disabled state */\n\t.ml-form-field--disabled .ml-form-field__label {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Size variants - Labels */\n\t.ml-form-field--sm .ml-form-field__label {\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-form-field--sm .ml-form-field__hint,\n\t.ml-form-field--sm .ml-form-field__error {\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-form-field--lg .ml-form-field__label {\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t.ml-form-field--lg .ml-form-field__hint,\n\t.ml-form-field--lg .ml-form-field__error {\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t/* Slotted native input styling */\n\t::slotted(input),\n\t::slotted(select),\n\t::slotted(textarea) {\n\t\twidth: 100%;\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-3-5);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-family: var(--ml-font-sans);\n\t\tcolor: var(--ml-color-text);\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t\tbox-sizing: border-box;\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t::slotted(input:focus),\n\t::slotted(select:focus),\n\t::slotted(textarea:focus) {\n\t\toutline: none;\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t::slotted(input::placeholder),\n\t::slotted(textarea::placeholder) {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t::slotted(input:disabled),\n\t::slotted(select:disabled),\n\t::slotted(textarea:disabled) {\n\t\tbackground-color: var(--ml-color-input-disabled-bg);\n\t\tcursor: not-allowed;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Error state for slotted inputs */\n\t.ml-form-field--error ::slotted(input),\n\t.ml-form-field--error ::slotted(select),\n\t.ml-form-field--error ::slotted(textarea) {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t.ml-form-field--error ::slotted(input:focus),\n\t.ml-form-field--error ::slotted(select:focus),\n\t.ml-form-field--error ::slotted(textarea:focus) {\n\t\tbox-shadow: var(--ml-shadow-ring-error);\n\t}\n\n\t/* Size variants for slotted inputs */\n\t.ml-form-field--sm ::slotted(input),\n\t.ml-form-field--sm ::slotted(select),\n\t.ml-form-field--sm ::slotted(textarea) {\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-2-5);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-form-field--lg ::slotted(input),\n\t.ml-form-field--lg ::slotted(select),\n\t.ml-form-field--lg ::slotted(textarea) {\n\t\tpadding: var(--ml-space-3-5) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t/* Horizontal size adjustments */\n\t.ml-form-field--horizontal.ml-form-field--sm .ml-form-field__label {\n\t\tpadding-top: var(--ml-space-2);\n\t}\n\n\t.ml-form-field--horizontal.ml-form-field--lg .ml-form-field__label {\n\t\tpadding-top: var(--ml-space-3-5);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { FormFieldOrientation } from './form-field.types.js';\nimport { formFieldTemplate } from './form-field.template.js';\nimport { formFieldStyles } from './form-field.styles.js';\n\n/**\n * ml-form-field - Wrapper component that adds label, hint, and error to any form control\n *\n * @example\n * ```html\n * <ml-form-field label=\"Username\" hint=\"Choose a unique username\" required>\n * <input type=\"text\" />\n * </ml-form-field>\n *\n * <ml-form-field label=\"Email\" error=\"Invalid email address\">\n * <input type=\"email\" />\n * </ml-form-field>\n *\n * <ml-form-field label=\"Agree to terms\" orientation=\"horizontal\">\n * <ml-checkbox></ml-checkbox>\n * </ml-form-field>\n * ```\n *\n * @slot default - The form control element\n */\n@MelodicComponent({\n\tselector: 'ml-form-field',\n\ttemplate: formFieldTemplate,\n\tstyles: formFieldStyles,\n\tattributes: ['label', 'hint', 'error', 'size', 'orientation', 'disabled', 'required']\n})\nexport class FormFieldComponent implements IElementRef, OnCreate {\n\telementRef!: HTMLElement;\n\n\t/** Label text */\n\tlabel = '';\n\n\t/** Hint text shown below the control */\n\thint = '';\n\n\t/** Error message (shows error state when set) */\n\terror = '';\n\n\t/** Field size */\n\tsize: Size = 'md';\n\n\t/** Layout orientation */\n\torientation: FormFieldOrientation = 'vertical';\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Required field indicator */\n\trequired = false;\n\n\t/** Unique ID for connecting label to control */\n\tprivate readonly _fieldId = `ml-form-field-${Math.random().toString(36).slice(2, 9)}`;\n\n\tget fieldId(): string {\n\t\treturn this._fieldId;\n\t}\n\n\tget hintId(): string {\n\t\treturn `${this._fieldId}-hint`;\n\t}\n\n\tget errorId(): string {\n\t\treturn `${this._fieldId}-error`;\n\t}\n\n\tget describedBy(): string {\n\t\tif (this.error) return this.errorId;\n\t\tif (this.hint) return this.hintId;\n\t\treturn '';\n\t}\n\n\tonCreate(): void {\n\t\tthis.connectSlottedControl();\n\t}\n\n\thandleSlotChange = (): void => {\n\t\tthis.connectSlottedControl();\n\t};\n\n\tprivate connectSlottedControl(): void {\n\t\tconst slot = this.elementRef.shadowRoot?.querySelector('slot:not([name])') as HTMLSlotElement | null;\n\t\tif (!slot) return;\n\n\t\tconst elements = slot.assignedElements({ flatten: true });\n\t\tconst control = this.findFormControl(elements);\n\n\t\tif (control) {\n\t\t\t// Set ID if not present\n\t\t\tif (!control.id) {\n\t\t\t\tcontrol.id = this.fieldId;\n\t\t\t}\n\n\t\t\t// Connect aria-describedby for hint/error\n\t\t\tif (this.describedBy) {\n\t\t\t\tcontrol.setAttribute('aria-describedby', this.describedBy);\n\t\t\t}\n\n\t\t\t// Set aria-invalid for error state\n\t\t\tif (this.error) {\n\t\t\t\tcontrol.setAttribute('aria-invalid', 'true');\n\t\t\t} else {\n\t\t\t\tcontrol.removeAttribute('aria-invalid');\n\t\t\t}\n\n\t\t\t// Set aria-required\n\t\t\tif (this.required) {\n\t\t\t\tcontrol.setAttribute('aria-required', 'true');\n\t\t\t}\n\n\t\t\t// Set disabled if applicable\n\t\t\tif (this.disabled && 'disabled' in control) {\n\t\t\t\t(control as HTMLInputElement).disabled = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate findFormControl(elements: Element[]): HTMLElement | null {\n\t\tfor (const element of elements) {\n\t\t\t// Check if it's a native form control\n\t\t\tif (\n\t\t\t\telement instanceof HTMLInputElement ||\n\t\t\t\telement instanceof HTMLSelectElement ||\n\t\t\t\telement instanceof HTMLTextAreaElement\n\t\t\t) {\n\t\t\t\treturn element;\n\t\t\t}\n\n\t\t\t// Check if it's a custom element form control (has role or is focusable)\n\t\t\tif (element instanceof HTMLElement) {\n\t\t\t\tconst role = element.getAttribute('role');\n\t\t\t\tif (\n\t\t\t\t\trole === 'textbox' ||\n\t\t\t\t\trole === 'combobox' ||\n\t\t\t\t\trole === 'checkbox' ||\n\t\t\t\t\trole === 'radio' ||\n\t\t\t\t\trole === 'switch' ||\n\t\t\t\t\trole === 'slider'\n\t\t\t\t) {\n\t\t\t\t\treturn element;\n\t\t\t\t}\n\n\t\t\t\t// Check for Melodic components\n\t\t\t\tif (element.tagName.toLowerCase().startsWith('ml-')) {\n\t\t\t\t\treturn element;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Recursively check children\n\t\t\tconst nested = this.findFormControl(Array.from(element.children));\n\t\t\tif (nested) return nested;\n\t\t}\n\t\treturn null;\n\t}\n}\n","import { html, classMap, repeat } from '@melodicdev/core';\nimport type { CalendarComponent, CalendarDay } from './calendar.component.js';\n\nexport function calendarTemplate(c: CalendarComponent) {\n\treturn html`\n\t\t<div class=\"ml-calendar\" role=\"grid\" aria-label=${c.monthLabel}>\n\t\t\t<div class=\"ml-calendar__header\">\n\t\t\t\t<div class=\"ml-calendar__nav-group\">\n\t\t\t\t\t<button type=\"button\" class=\"ml-calendar__nav\" aria-label=\"Previous year\" @click=${c.prevYear}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-double-left\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button type=\"button\" class=\"ml-calendar__nav\" aria-label=\"Previous month\" @click=${c.prevMonth}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-left\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"ml-calendar__month-label\">${c.monthLabel}</span>\n\t\t\t\t<div class=\"ml-calendar__nav-group\">\n\t\t\t\t\t<button type=\"button\" class=\"ml-calendar__nav\" aria-label=\"Next month\" @click=${c.nextMonth}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-right\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button type=\"button\" class=\"ml-calendar__nav\" aria-label=\"Next year\" @click=${c.nextYear}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-double-right\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-calendar__weekdays\" role=\"row\">\n\t\t\t\t${repeat(c.weekdays, (d: string) => d, (d: string) => html`\n\t\t\t\t\t<span class=\"ml-calendar__weekday\" role=\"columnheader\">${d}</span>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-calendar__grid\">\n\t\t\t\t${repeat(c.days, (day: CalendarDay) => day.iso, (day: CalendarDay) => html`\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t'ml-calendar__day': true,\n\t\t\t\t\t\t\t'ml-calendar__day--other-month': !day.isCurrentMonth,\n\t\t\t\t\t\t\t'ml-calendar__day--today': day.isToday,\n\t\t\t\t\t\t\t'ml-calendar__day--selected': day.isSelected,\n\t\t\t\t\t\t\t'ml-calendar__day--disabled': day.isDisabled\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t?disabled=${day.isDisabled || !day.isCurrentMonth}\n\t\t\t\t\t\ttabindex=${day.isCurrentMonth ? '0' : '-1'}\n\t\t\t\t\t\taria-selected=${day.isSelected ? 'true' : 'false'}\n\t\t\t\t\t\taria-label=${day.iso}\n\t\t\t\t\t\t@click=${() => c.selectDay(day)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"ml-calendar__day-number\">${day.date}</span>\n\t\t\t\t\t\t${day.isToday ? html`<span class=\"ml-calendar__today-dot\"></span>` : ''}\n\t\t\t\t\t</button>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-calendar__footer\">\n\t\t\t\t<button type=\"button\" class=\"ml-calendar__today-btn\" @click=${c.goToToday}>Today</button>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const calendarStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-calendar {\n\t\twidth: 280px;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* Header with nav */\n\t.ml-calendar__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tpadding: 0 0 var(--ml-space-3) 0;\n\t}\n\n\t.ml-calendar__nav-group {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 0;\n\t}\n\n\t.ml-calendar__month-label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-calendar__nav {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground: none;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out), color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-calendar__nav:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-calendar__nav:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t/* Weekday headers */\n\t.ml-calendar__weekdays {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, 1fr);\n\t\tgap: 0;\n\t\tmargin-bottom: var(--ml-space-1);\n\t}\n\n\t.ml-calendar__weekday {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: 2.25rem;\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Day grid */\n\t.ml-calendar__grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, 1fr);\n\t\tgap: 0;\n\t}\n\n\t.ml-calendar__day {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\taspect-ratio: 1;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground: none;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-regular);\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\tpadding: 0;\n\t\tgap: 1px;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-calendar__day:hover:not(:disabled):not(.ml-calendar__day--selected) {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-calendar__day:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t\tz-index: 1;\n\t}\n\n\t/* Other month days - hidden */\n\t.ml-calendar__day--other-month {\n\t\tvisibility: hidden;\n\t\tpointer-events: none;\n\t}\n\n\t/* Today */\n\t.ml-calendar__day--today {\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-calendar__day-number {\n\t\tline-height: 1;\n\t}\n\n\t/* Today dot indicator */\n\t.ml-calendar__today-dot {\n\t\twidth: 4px;\n\t\theight: 4px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-calendar__day--selected .ml-calendar__today-dot {\n\t\tbackground-color: var(--ml-color-text-inverse);\n\t}\n\n\t/* Selected */\n\t.ml-calendar__day--selected {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-calendar__day--selected:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t}\n\n\t/* Disabled */\n\t.ml-calendar__day--disabled:not(.ml-calendar__day--other-month) {\n\t\topacity: 0.3;\n\t\tcursor: not-allowed;\n\t}\n\n\t/* Footer */\n\t.ml-calendar__footer {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tpadding-top: var(--ml-space-3);\n\t}\n\n\t.ml-calendar__today-btn {\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-3);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out), border-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-calendar__today-btn:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tborder-color: var(--ml-color-border-strong);\n\t}\n\n\t.ml-calendar__today-btn:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit, OnAttributeChange } from '@melodicdev/core';\nimport { calendarTemplate } from './calendar.template.js';\nimport { calendarStyles } from './calendar.styles.js';\n\nexport interface CalendarDay {\n\tdate: number;\n\tmonth: number;\n\tyear: number;\n\tiso: string;\n\tisCurrentMonth: boolean;\n\tisToday: boolean;\n\tisSelected: boolean;\n\tisDisabled: boolean;\n}\n\nconst MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\nfunction toIso(year: number, month: number, day: number): string {\n\treturn `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n}\n\nfunction todayIso(): string {\n\tconst d = new Date();\n\treturn toIso(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/**\n * ml-calendar - Standalone calendar grid\n *\n * @example\n * ```html\n * <ml-calendar value=\"2026-02-08\"></ml-calendar>\n * <ml-calendar min=\"2026-01-01\" max=\"2026-12-31\"></ml-calendar>\n * ```\n *\n * @fires ml:select - Emitted when a date is selected. Detail: { value: string }\n */\n@MelodicComponent({\n\tselector: 'ml-calendar',\n\ttemplate: calendarTemplate,\n\tstyles: calendarStyles,\n\tattributes: ['value', 'min', 'max']\n})\nexport class CalendarComponent implements IElementRef, OnInit, OnAttributeChange {\n\telementRef!: HTMLElement;\n\n\t/** Selected date in ISO format (YYYY-MM-DD) */\n\tvalue = '';\n\n\t/** Minimum selectable date (YYYY-MM-DD) */\n\tmin = '';\n\n\t/** Maximum selectable date (YYYY-MM-DD) */\n\tmax = '';\n\n\t/** Currently viewed month (0-11) */\n\tviewMonth = new Date().getMonth();\n\n\t/** Currently viewed year */\n\tviewYear = new Date().getFullYear();\n\n\tonInit(): void {\n\t\tthis.navigateToValue();\n\t}\n\n\tonAttributeChange(name: string, _: unknown, newVal: unknown): void {\n\t\tif (name === 'value' && newVal) {\n\t\t\tthis.navigateToValue();\n\t\t}\n\t}\n\n\tprivate navigateToValue(): void {\n\t\tif (!this.value) return;\n\t\tconst parts = this.value.split('-');\n\t\tif (parts.length === 3) {\n\t\t\tthis.viewYear = Number.parseInt(parts[0], 10);\n\t\t\tthis.viewMonth = Number.parseInt(parts[1], 10) - 1;\n\t\t}\n\t}\n\n\tget monthLabel(): string {\n\t\treturn `${MONTH_NAMES[this.viewMonth]} ${this.viewYear}`;\n\t}\n\n\tget weekdays(): string[] {\n\t\treturn WEEKDAYS;\n\t}\n\n\tget days(): CalendarDay[] {\n\t\tconst year = this.viewYear;\n\t\tconst month = this.viewMonth;\n\t\tconst firstDayOfWeek = new Date(year, month, 1).getDay();\n\t\tconst daysInMonth = new Date(year, month + 1, 0).getDate();\n\t\tconst daysInPrevMonth = new Date(year, month, 0).getDate();\n\t\tconst today = todayIso();\n\n\t\tconst result: CalendarDay[] = [];\n\n\t\t// Leading days from previous month\n\t\tconst prevMonth = month === 0 ? 11 : month - 1;\n\t\tconst prevYear = month === 0 ? year - 1 : year;\n\t\tfor (let i = firstDayOfWeek - 1; i >= 0; i--) {\n\t\t\tconst d = daysInPrevMonth - i;\n\t\t\tconst iso = toIso(prevYear, prevMonth, d);\n\t\t\tresult.push({\n\t\t\t\tdate: d,\n\t\t\t\tmonth: prevMonth,\n\t\t\t\tyear: prevYear,\n\t\t\t\tiso,\n\t\t\t\tisCurrentMonth: false,\n\t\t\t\tisToday: iso === today,\n\t\t\t\tisSelected: iso === this.value,\n\t\t\t\tisDisabled: this.isDisabled(iso)\n\t\t\t});\n\t\t}\n\n\t\t// Current month days\n\t\tfor (let d = 1; d <= daysInMonth; d++) {\n\t\t\tconst iso = toIso(year, month, d);\n\t\t\tresult.push({\n\t\t\t\tdate: d,\n\t\t\t\tmonth,\n\t\t\t\tyear,\n\t\t\t\tiso,\n\t\t\t\tisCurrentMonth: true,\n\t\t\t\tisToday: iso === today,\n\t\t\t\tisSelected: iso === this.value,\n\t\t\t\tisDisabled: this.isDisabled(iso)\n\t\t\t});\n\t\t}\n\n\t\t// Trailing days to complete the last row only\n\t\tconst nextMonth = month === 11 ? 0 : month + 1;\n\t\tconst nextYear = month === 11 ? year + 1 : year;\n\t\tconst remainder = result.length % 7;\n\t\tif (remainder > 0) {\n\t\t\tconst trailingCount = 7 - remainder;\n\t\t\tfor (let t = 1; t <= trailingCount; t++) {\n\t\t\t\tconst iso = toIso(nextYear, nextMonth, t);\n\t\t\t\tresult.push({\n\t\t\t\t\tdate: t,\n\t\t\t\t\tmonth: nextMonth,\n\t\t\t\t\tyear: nextYear,\n\t\t\t\t\tiso,\n\t\t\t\t\tisCurrentMonth: false,\n\t\t\t\t\tisToday: iso === today,\n\t\t\t\t\tisSelected: iso === this.value,\n\t\t\t\t\tisDisabled: this.isDisabled(iso)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprevYear = (): void => {\n\t\tthis.viewYear--;\n\t};\n\n\tnextYear = (): void => {\n\t\tthis.viewYear++;\n\t};\n\n\tprevMonth = (): void => {\n\t\tif (this.viewMonth === 0) {\n\t\t\tthis.viewMonth = 11;\n\t\t\tthis.viewYear--;\n\t\t} else {\n\t\t\tthis.viewMonth--;\n\t\t}\n\t};\n\n\tnextMonth = (): void => {\n\t\tif (this.viewMonth === 11) {\n\t\t\tthis.viewMonth = 0;\n\t\t\tthis.viewYear++;\n\t\t} else {\n\t\t\tthis.viewMonth++;\n\t\t}\n\t};\n\n\tselectDay = (day: CalendarDay): void => {\n\t\tif (day.isDisabled) return;\n\t\tthis.value = day.iso;\n\t\t// Navigate to the selected day's month if it's not the current view\n\t\tthis.viewMonth = day.month;\n\t\tthis.viewYear = day.year;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: day.iso }\n\t\t\t})\n\t\t);\n\t};\n\n\tgoToToday = (): void => {\n\t\tconst now = new Date();\n\t\tthis.viewMonth = now.getMonth();\n\t\tthis.viewYear = now.getFullYear();\n\t\tconst iso = todayIso();\n\t\tif (!this.isDisabled(iso)) {\n\t\t\tthis.value = iso;\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:select', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { value: iso }\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n\n\tprivate isDisabled(iso: string): boolean {\n\t\tif (this.min && iso < this.min) return true;\n\t\tif (this.max && iso > this.max) return true;\n\t\treturn false;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { DatePickerComponent } from './date-picker.component.js';\n\nexport function datePickerTemplate(c: DatePickerComponent) {\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-date-picker': true,\n\t\t\t[`ml-date-picker--${c.size}`]: true,\n\t\t\t'ml-date-picker--error': !!c.error,\n\t\t\t'ml-date-picker--disabled': c.disabled,\n\t\t\t'ml-date-picker--open': c.isOpen\n\t\t})}>\n\t\t\t${when(!!c.label, () => html`\n\t\t\t\t<label class=\"ml-date-picker__label\">\n\t\t\t\t\t${c.label}\n\t\t\t\t\t${when(c.required, () => html`<span class=\"ml-date-picker__required\">*</span>`)}\n\t\t\t\t</label>\n\t\t\t`)}\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"ml-date-picker__trigger\"\n\t\t\t\t?disabled=${c.disabled}\n\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t\taria-expanded=${c.isOpen ? 'true' : 'false'}\n\t\t\t\t@click=${c.toggleCalendar}\n\t\t\t\t@keydown=${c.handleKeyDown}\n\t\t\t>\n\t\t\t\t<ml-icon icon=\"calendar-blank\" size=\"sm\" class=\"ml-date-picker__icon\"></ml-icon>\n\t\t\t\t<span class=${classMap({\n\t\t\t\t\t'ml-date-picker__value': true,\n\t\t\t\t\t'ml-date-picker__value--placeholder': !c.value\n\t\t\t\t})}>\n\t\t\t\t\t${c.value ? c.displayValue : c.placeholder}\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t<div class=\"ml-date-picker__popover\" popover=\"auto\">\n\t\t\t\t<ml-calendar\n\t\t\t\t\tvalue=${c.value}\n\t\t\t\t\tmin=${c.min}\n\t\t\t\t\tmax=${c.max}\n\t\t\t\t\t@ml:select=${c.handleDateSelect}\n\t\t\t\t></ml-calendar>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\t!!c.error,\n\t\t\t\t() => html`<span class=\"ml-date-picker__error\">${c.error}</span>`,\n\t\t\t\t() => html`${when(!!c.hint, () => html`<span class=\"ml-date-picker__hint\">${c.hint}</span>`)}`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const datePickerStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t/* Label */\n\t.ml-date-picker__label {\n\t\tdisplay: block;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tmargin-bottom: var(--ml-space-1-5);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-date-picker__required {\n\t\tcolor: var(--ml-color-danger);\n\t\tmargin-left: var(--ml-space-0-5);\n\t}\n\n\t/* Trigger button */\n\t.ml-date-picker__trigger {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\twidth: 100%;\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground-color: var(--ml-color-input-bg);\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\tfont-family: var(--ml-font-sans);\n\t\ttext-align: left;\n\t\ttransition:\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbox-shadow var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-date-picker__trigger:hover:not(:disabled) {\n\t\tborder-color: var(--ml-color-border-strong);\n\t}\n\n\t.ml-date-picker__trigger:focus-visible {\n\t\toutline: none;\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-date-picker--open .ml-date-picker__trigger {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-date-picker--error .ml-date-picker__trigger {\n\t\tborder-color: var(--ml-color-danger);\n\t}\n\n\t.ml-date-picker--error .ml-date-picker__trigger:focus-visible,\n\t.ml-date-picker--error.ml-date-picker--open .ml-date-picker__trigger {\n\t\tbox-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n\t}\n\n\t.ml-date-picker--disabled .ml-date-picker__trigger {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t/* Sizes */\n\t.ml-date-picker--sm .ml-date-picker__trigger {\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-2-5);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-date-picker--md .ml-date-picker__trigger {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-date-picker--lg .ml-date-picker__trigger {\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-3-5);\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t/* Icon */\n\t.ml-date-picker__icon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Value */\n\t.ml-date-picker__value {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-date-picker__value--placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Popover */\n\t.ml-date-picker__popover {\n\t\tposition: fixed;\n\t\tinset: unset;\n\t\tmargin: 0;\n\t\tpadding: var(--ml-space-4);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tz-index: 50;\n\n\t\topacity: 0;\n\t\ttransform: scale(0.95);\n\t\ttransition:\n\t\t\topacity var(--ml-duration-150) var(--ml-ease-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-out),\n\t\t\tdisplay var(--ml-duration-150) allow-discrete;\n\t}\n\n\t.ml-date-picker__popover:popover-open {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\t@starting-style {\n\t\t.ml-date-picker__popover:popover-open {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t}\n\n\t/* Hint / Error */\n\t.ml-date-picker__hint,\n\t.ml-date-picker__error {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-1-5);\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-date-picker__hint {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-date-picker__error {\n\t\tcolor: var(--ml-color-danger);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport { computePosition, autoUpdate, offset, flip, shift } from '../../../utils/positioning/index.js';\nimport { datePickerTemplate } from './date-picker.template.js';\nimport { datePickerStyles } from './date-picker.styles.js';\n\nconst MONTH_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction formatDisplay(iso: string): string {\n\tif (!iso) return '';\n\tconst parts = iso.split('-');\n\tif (parts.length !== 3) return iso;\n\tconst month = parseInt(parts[1], 10) - 1;\n\tconst day = parseInt(parts[2], 10);\n\tconst year = parseInt(parts[0], 10);\n\treturn `${MONTH_SHORT[month]} ${day}, ${year}`;\n}\n\n/**\n * ml-date-picker - Date input with calendar dropdown\n *\n * @example\n * ```html\n * <ml-date-picker label=\"Start date\" value=\"2026-02-08\"></ml-date-picker>\n * <ml-date-picker placeholder=\"Select date\" min=\"2026-01-01\" max=\"2026-12-31\"></ml-date-picker>\n * ```\n *\n * @fires ml:change - Emitted when a date is selected. Detail: { value: string }\n */\n@MelodicComponent({\n\tselector: 'ml-date-picker',\n\ttemplate: datePickerTemplate,\n\tstyles: datePickerStyles,\n\tattributes: ['value', 'placeholder', 'label', 'hint', 'error', 'size', 'disabled', 'required', 'min', 'max']\n})\nexport class DatePickerComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Selected date in ISO format (YYYY-MM-DD) */\n\tvalue = '';\n\n\t/** Placeholder text */\n\tplaceholder = 'Select date';\n\n\t/** Field label */\n\tlabel = '';\n\n\t/** Hint text */\n\thint = '';\n\n\t/** Error message */\n\terror = '';\n\n\t/** Input size */\n\tsize: 'sm' | 'md' | 'lg' = 'md';\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Required state */\n\trequired = false;\n\n\t/** Minimum selectable date (YYYY-MM-DD) */\n\tmin = '';\n\n\t/** Maximum selectable date (YYYY-MM-DD) */\n\tmax = '';\n\n\t/** Whether the calendar popover is open */\n\tisOpen = false;\n\n\tprivate _cleanupAutoUpdate: (() => void) | null = null;\n\n\tget displayValue(): string {\n\t\treturn formatDisplay(this.value);\n\t}\n\n\tonCreate(): void {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.addEventListener('toggle', this._handleToggle);\n\t\t}\n\t}\n\n\tonDestroy(): void {\n\t\tthis._cleanupAutoUpdate?.();\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.removeEventListener('toggle', this._handleToggle);\n\t\t}\n\t}\n\n\ttoggleCalendar = (): void => {\n\t\tif (this.disabled) return;\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.togglePopover();\n\t\t}\n\t};\n\n\t/** Called when a day is clicked - selects immediately and closes */\n\thandleDateSelect = (event: Event): void => {\n\t\tevent.stopPropagation();\n\t\tconst detail = (event as CustomEvent).detail as { value: string };\n\t\tthis.commitValue(detail.value);\n\t\tthis.closePopover();\n\t};\n\n\thandleKeyDown = (event: KeyboardEvent): void => {\n\t\tif (event.key === 'Escape' && this.isOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closePopover();\n\t\t} else if ((event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') && !this.isOpen) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.toggleCalendar();\n\t\t}\n\t};\n\n\tprivate commitValue(iso: string): void {\n\t\tthis.value = iso;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: iso }\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate readonly _handleToggle = (event: Event): void => {\n\t\tconst toggleEvent = event as ToggleEvent;\n\t\tif (toggleEvent.newState === 'open') {\n\t\t\tthis.isOpen = true;\n\t\t\tthis.startPositioning();\n\t\t} else {\n\t\t\tthis.isOpen = false;\n\t\t\tthis._cleanupAutoUpdate?.();\n\t\t\tthis._cleanupAutoUpdate = null;\n\t\t\tthis.returnFocus();\n\t\t}\n\t};\n\n\tprivate closePopover(): void {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl && this.isOpen) {\n\t\t\tpopoverEl.hidePopover();\n\t\t}\n\t}\n\n\tprivate startPositioning(): void {\n\t\tconst triggerEl = this.getTriggerEl();\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (!triggerEl || !popoverEl) return;\n\n\t\tconst update = () => this.updatePosition(triggerEl, popoverEl);\n\t\tthis._cleanupAutoUpdate?.();\n\t\tthis._cleanupAutoUpdate = autoUpdate(triggerEl, popoverEl, update);\n\t}\n\n\tprivate updatePosition(triggerEl: HTMLElement, popoverEl: HTMLElement): void {\n\t\tconst middleware = [offset(4), flip(), shift({ padding: 8 })];\n\t\tconst { x, y } = computePosition(triggerEl, popoverEl, {\n\t\t\tplacement: 'bottom-start',\n\t\t\tmiddleware\n\t\t});\n\t\tpopoverEl.style.left = `${x}px`;\n\t\tpopoverEl.style.top = `${y}px`;\n\t}\n\n\tprivate returnFocus(): void {\n\t\tconst triggerEl = this.getTriggerEl();\n\t\tif (triggerEl) {\n\t\t\ttriggerEl.focus();\n\t\t}\n\t}\n\n\tprivate getTriggerEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-date-picker__trigger') as HTMLElement | null;\n\t}\n\n\tprivate getPopoverEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-date-picker__popover') as HTMLElement | null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { AlertComponent } from './alert.component.js';\n\nexport function alertTemplate(c: AlertComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-alert': true,\n\t\t\t\t[`ml-alert--${c.variant}`]: true\n\t\t\t})}\n\t\t\trole=\"alert\"\n\t\t>\n\t\t\t<div class=\"ml-alert__icon\">\n\t\t\t\t<slot name=\"icon\">${c.renderDefaultIcon()}</slot>\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-alert__content\">\n\t\t\t\t${when(!!c.title, () => html`<div class=\"ml-alert__title\">${c.title}</div>`)}\n\t\t\t\t<div class=\"ml-alert__message\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${when(\n\t\t\t\tc.dismissible,\n\t\t\t\t() => html`\n\t\t\t\t\t<button class=\"ml-alert__dismiss\" @click=${c.handleDismiss} aria-label=\"Dismiss\">\n\t\t\t\t\t\t<ml-icon icon=\"x\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const alertStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-alert {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tborder: var(--ml-border) solid transparent;\n\t}\n\n\t.ml-alert--info {\n\t\tbackground-color: var(--ml-alert-info-bg);\n\t\tborder-color: var(--ml-alert-info-border);\n\t\tcolor: var(--ml-alert-info-text);\n\t}\n\n\t.ml-alert--info .ml-alert__icon {\n\t\tcolor: var(--ml-alert-info-icon);\n\t}\n\n\t.ml-alert--success {\n\t\tbackground-color: var(--ml-alert-success-bg);\n\t\tborder-color: var(--ml-alert-success-border);\n\t\tcolor: var(--ml-alert-success-text);\n\t}\n\n\t.ml-alert--success .ml-alert__icon {\n\t\tcolor: var(--ml-alert-success-icon);\n\t}\n\n\t.ml-alert--warning {\n\t\tbackground-color: var(--ml-alert-warning-bg);\n\t\tborder-color: var(--ml-alert-warning-border);\n\t\tcolor: var(--ml-alert-warning-text);\n\t}\n\n\t.ml-alert--warning .ml-alert__icon {\n\t\tcolor: var(--ml-alert-warning-icon);\n\t}\n\n\t.ml-alert--error {\n\t\tbackground-color: var(--ml-alert-error-bg);\n\t\tborder-color: var(--ml-alert-error-border);\n\t\tcolor: var(--ml-alert-error-text);\n\t}\n\n\t.ml-alert--error .ml-alert__icon {\n\t\tcolor: var(--ml-alert-error-icon);\n\t}\n\n\t.ml-alert__icon {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tmargin-top: -3px;\n\t}\n\n\t.ml-alert__icon ml-icon {\n\t\tfont-size: 1.25rem;\n\t}\n\n\t.ml-alert__icon svg {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t.ml-alert__content {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-alert__title {\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tfont-size: var(--ml-text-sm);\n\t\tmargin-bottom: var(--ml-space-1);\n\t}\n\n\t.ml-alert__message {\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-relaxed);\n\t}\n\n\t.ml-alert__dismiss {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tcursor: pointer;\n\t\tcolor: currentColor;\n\t\topacity: 0.5;\n\t\ttransition:\n\t\t\topacity var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-alert__dismiss:hover {\n\t\topacity: 1;\n\t}\n\n\t.ml-alert__dismiss:focus-visible {\n\t\toutline: none;\n\t\topacity: 1;\n\t}\n`;\n","import { MelodicComponent, html } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { AlertVariant } from './alert.types.js';\nimport { alertTemplate } from './alert.template.js';\nimport { alertStyles } from './alert.styles.js';\n\n/**\n * ml-alert - Alert/notification banner component\n *\n * @example\n * ```html\n * <ml-alert variant=\"info\" title=\"Information\">\n * This is an informational message.\n * </ml-alert>\n *\n * <ml-alert variant=\"success\" dismissible>\n * Your changes have been saved.\n * </ml-alert>\n * ```\n *\n * @slot default - Alert message content\n * @slot icon - Custom icon (optional)\n * @fires ml:dismiss - Emitted when dismiss button is clicked\n */\n@MelodicComponent({\n\tselector: 'ml-alert',\n\ttemplate: alertTemplate,\n\tstyles: alertStyles,\n\tattributes: ['variant', 'title', 'dismissible']\n})\nexport class AlertComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Alert variant/type */\n\tvariant: AlertVariant = 'info';\n\n\t/** Optional title */\n\ttitle = '';\n\n\t/** Show dismiss button */\n\tdismissible = false;\n\n\thandleDismiss = (): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:dismiss', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t\t// Optionally hide the alert\n\t\tthis.elementRef.setAttribute('hidden', '');\n\t};\n\n\trenderDefaultIcon = () => {\n\t\tconst icons: Record<AlertVariant, string> = {\n\t\t\tinfo: 'info',\n\t\t\tsuccess: 'check-circle',\n\t\t\twarning: 'warning',\n\t\t\terror: 'x-circle'\n\t\t};\n\n\t\treturn html`<ml-icon icon=\"${icons[this.variant]}\"></ml-icon>`;\n\t};\n}\n","import { Injectable } from '@melodicdev/core';\nimport type { IToastConfig, ToastPosition } from './toast-config.interface.js';\n\n/**\n * ToastService - Injectable singleton for showing toast notifications from anywhere\n *\n * @example\n * ```typescript\n * @Service(ToastService)\n * private readonly _toastService!: ToastService;\n *\n * this._toastService.success('Saved', 'Your changes have been saved.');\n * this._toastService.error('Error', 'Something went wrong.');\n * this._toastService.show({ variant: 'warning', title: 'Warning', message: '...' });\n * ```\n */\n@Injectable()\nexport class ToastService {\n\tprivate _containerEl: HTMLElement | null = null;\n\tprivate _position: ToastPosition = 'top-right';\n\n\t/** Set the default position for all toasts */\n\tsetPosition(position: ToastPosition): void {\n\t\tthis._position = position;\n\n\t\tif (this._containerEl) {\n\t\t\tthis._containerEl.setAttribute('position', position);\n\t\t}\n\t}\n\n\t/** Show a toast with full configuration */\n\tshow(config: IToastConfig): void {\n\t\tconst container = this.ensureContainer();\n\t\tconst toast = document.createElement('ml-toast');\n\n\t\tif (config.variant) toast.setAttribute('variant', config.variant);\n\t\tif (config.title) toast.setAttribute('title', config.title);\n\t\tif (config.message) toast.setAttribute('message', config.message);\n\t\tif (config.duration !== undefined) toast.setAttribute('duration', String(config.duration));\n\t\tif (config.dismissible === false) toast.setAttribute('dismissible', 'false');\n\n\t\tcontainer.appendChild(toast);\n\t}\n\n\t/** Show an info toast */\n\tinfo(title: string, message?: string): void {\n\t\tthis.show({ variant: 'info', title, message });\n\t}\n\n\t/** Show a success toast */\n\tsuccess(title: string, message?: string): void {\n\t\tthis.show({ variant: 'success', title, message });\n\t}\n\n\t/** Show a warning toast */\n\twarning(title: string, message?: string): void {\n\t\tthis.show({ variant: 'warning', title, message });\n\t}\n\n\t/** Show an error toast */\n\terror(title: string, message?: string): void {\n\t\tthis.show({ variant: 'error', title, message });\n\t}\n\n\tprivate ensureContainer(): HTMLElement {\n\t\tif (this._containerEl && document.body.contains(this._containerEl)) {\n\t\t\treturn this._containerEl;\n\t\t}\n\n\t\tthis._containerEl = document.createElement('ml-toast-container');\n\t\tthis._containerEl.setAttribute('position', this._position);\n\t\tdocument.body.appendChild(this._containerEl);\n\n\t\treturn this._containerEl;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { ToastComponent } from './toast.component.js';\n\nexport function toastTemplate(c: ToastComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-toast': true,\n\t\t\t\t[`ml-toast--${c.variant}`]: true\n\t\t\t})}\n\t\t\trole=\"alert\"\n\t\t>\n\t\t\t<div class=\"ml-toast__icon\">\n\t\t\t\t${c.renderIcon()}\n\t\t\t</div>\n\t\t\t<div class=\"ml-toast__content\">\n\t\t\t\t${when(!!c.title, () => html`<div class=\"ml-toast__title\">${c.title}</div>`)}\n\t\t\t\t${when(!!c.message, () => html`<div class=\"ml-toast__message\">${c.message}</div>`)}\n\t\t\t</div>\n\t\t\t${when(\n\t\t\t\tc.dismissible,\n\t\t\t\t() => html`\n\t\t\t\t\t<button class=\"ml-toast__dismiss\" @click=${c.dismiss} aria-label=\"Dismiss\">\n\t\t\t\t\t\t<ml-icon icon=\"x\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const toastStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-toast {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: 1px solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tmin-width: 320px;\n\t\tmax-width: 420px;\n\t\tanimation: ml-toast-in var(--ml-duration-300) var(--ml-ease-out);\n\t}\n\n\t@keyframes ml-toast-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(-8px) scale(0.96);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0) scale(1);\n\t\t}\n\t}\n\n\t.ml-toast__icon {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.ml-toast--info .ml-toast__icon {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-toast--success .ml-toast__icon {\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t.ml-toast--warning .ml-toast__icon {\n\t\tcolor: var(--ml-color-warning);\n\t}\n\n\t.ml-toast--error .ml-toast__icon {\n\t\tcolor: var(--ml-color-danger);\n\t}\n\n\t.ml-toast__content {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-toast__title {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-toast__message {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t\tmargin-top: var(--ml-space-1);\n\t}\n\n\t.ml-toast__title + .ml-toast__message {\n\t\tmargin-top: var(--ml-space-1);\n\t}\n\n\t.ml-toast__dismiss {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tcursor: pointer;\n\t\tcolor: var(--ml-color-text-tertiary);\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-toast__dismiss:hover {\n\t\tcolor: var(--ml-color-text);\n\t}\n`;\n","import { MelodicComponent, html } from '@melodicdev/core';\nimport type { IElementRef, OnCreate } from '@melodicdev/core';\nimport type { ToastVariant } from './toast-config.interface.js';\nimport { toastTemplate } from './toast.template.js';\nimport { toastStyles } from './toast.styles.js';\n\n/**\n * ml-toast - Individual toast notification\n *\n * @example\n * ```html\n * <ml-toast variant=\"success\" title=\"Saved\" message=\"Your changes have been saved.\"></ml-toast>\n * ```\n *\n * @fires ml:dismiss - Emitted when the toast is dismissed\n */\n@MelodicComponent({\n\tselector: 'ml-toast',\n\ttemplate: toastTemplate,\n\tstyles: toastStyles,\n\tattributes: ['variant', 'title', 'message', 'duration', 'dismissible']\n})\nexport class ToastComponent implements IElementRef, OnCreate {\n\telementRef!: HTMLElement;\n\n\t/** Toast variant */\n\tvariant: ToastVariant = 'info';\n\n\t/** Toast title */\n\ttitle = '';\n\n\t/** Toast message */\n\tmessage = '';\n\n\t/** Auto-dismiss duration in ms (0 = no auto-dismiss) */\n\tduration = 5000;\n\n\t/** Show dismiss button */\n\tdismissible = true;\n\n\tprivate _timer: ReturnType<typeof setTimeout> | null = null;\n\n\tonCreate(): void {\n\t\tif (this.duration > 0) {\n\t\t\tthis._timer = setTimeout(() => this.dismiss(), this.duration);\n\t\t}\n\t}\n\n\tdismiss = (): void => {\n\t\tif (this._timer) {\n\t\t\tclearTimeout(this._timer);\n\t\t\tthis._timer = null;\n\t\t}\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:dismiss', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\n\t\tthis.elementRef.remove();\n\t};\n\n\trenderIcon = () => {\n\t\tconst icons: Record<ToastVariant, string> = {\n\t\t\tinfo: 'info',\n\t\t\tsuccess: 'check-circle',\n\t\t\twarning: 'warning',\n\t\t\terror: 'x-circle'\n\t\t};\n\n\t\treturn html`<ml-icon icon=\"${icons[this.variant]}\"></ml-icon>`;\n\t};\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { ToastContainerComponent } from './toast-container.component.js';\n\nexport function toastContainerTemplate(c: ToastContainerComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-toast-container': true,\n\t\t\t\t[`ml-toast-container--${c.position}`]: true\n\t\t\t})}\n\t\t>\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const toastContainerStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-toast-container {\n\t\tposition: fixed;\n\t\tz-index: 9999;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4);\n\t\tpointer-events: none;\n\t}\n\n\t.ml-toast-container ::slotted(*) {\n\t\tpointer-events: auto;\n\t}\n\n\t/* Top positions */\n\t.ml-toast-container--top-right {\n\t\ttop: 0;\n\t\tright: 0;\n\t\talign-items: flex-end;\n\t}\n\n\t.ml-toast-container--top-left {\n\t\ttop: 0;\n\t\tleft: 0;\n\t\talign-items: flex-start;\n\t}\n\n\t.ml-toast-container--top-center {\n\t\ttop: 0;\n\t\tleft: 50%;\n\t\ttransform: translateX(-50%);\n\t\talign-items: center;\n\t}\n\n\t/* Bottom positions */\n\t.ml-toast-container--bottom-right {\n\t\tbottom: 0;\n\t\tright: 0;\n\t\talign-items: flex-end;\n\t\tflex-direction: column-reverse;\n\t}\n\n\t.ml-toast-container--bottom-left {\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\talign-items: flex-start;\n\t\tflex-direction: column-reverse;\n\t}\n\n\t.ml-toast-container--bottom-center {\n\t\tbottom: 0;\n\t\tleft: 50%;\n\t\ttransform: translateX(-50%);\n\t\talign-items: center;\n\t\tflex-direction: column-reverse;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { ToastPosition } from './toast-config.interface.js';\nimport { toastContainerTemplate } from './toast-container.template.js';\nimport { toastContainerStyles } from './toast-container.styles.js';\n\n/**\n * ml-toast-container - Fixed-position container for stacking toasts\n *\n * Managed automatically by ToastService. You should not need to\n * place this component manually.\n */\n@MelodicComponent({\n\tselector: 'ml-toast-container',\n\ttemplate: toastContainerTemplate,\n\tstyles: toastContainerStyles,\n\tattributes: ['position']\n})\nexport class ToastContainerComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Fixed position on screen */\n\tposition: ToastPosition = 'top-right';\n}\n","import { html, classMap, styleMap, when } from '@melodicdev/core';\nimport type { ProgressComponent } from './progress.component.js';\n\nfunction linearTemplate(c: ProgressComponent) {\n\tconst showHeader = c.labelPosition === 'top' && (!!c.label || c.showValue);\n\tconst showRight = c.labelPosition === 'right' && c.showValue;\n\tconst showBottom = c.labelPosition === 'bottom' && c.showValue;\n\tconst showFloatingTop = c.labelPosition === 'floating-top' && c.showValue;\n\tconst showFloatingBottom = c.labelPosition === 'floating-bottom' && c.showValue;\n\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-progress': true,\n\t\t\t[`ml-progress--${c.variant}`]: true,\n\t\t\t[`ml-progress--${c.size}`]: true,\n\t\t\t'ml-progress--label-right': showRight\n\t\t})}>\n\t\t\t${when(showHeader, () => html`\n\t\t\t\t<div class=\"ml-progress__header\">\n\t\t\t\t\t${when(!!c.label, () => html`<span class=\"ml-progress__label\">${c.label}</span>`)}\n\t\t\t\t\t${when(c.showValue, () => html`<span class=\"ml-progress__value\">${c.displayValue}</span>`)}\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-progress__bar-row\">\n\t\t\t\t<div class=\"ml-progress__track-wrapper\">\n\t\t\t\t\t${when(showFloatingTop, () => html`\n\t\t\t\t\t\t<div class=\"ml-progress__floating ml-progress__floating--top\" style=${styleMap({ left: `${c.percentage}%` })}>\n\t\t\t\t\t\t\t<span class=\"ml-progress__floating-value\">${c.displayValue}</span>\n\t\t\t\t\t\t\t<span class=\"ml-progress__floating-arrow ml-progress__floating-arrow--down\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<div class=\"ml-progress__track\" role=\"progressbar\" aria-valuenow=${c.value} aria-valuemin=\"0\" aria-valuemax=${c.max} aria-label=${c.label || 'Progress'}>\n\t\t\t\t\t\t<div class=\"ml-progress__fill\" style=${styleMap({ width: `${c.percentage}%` })}></div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${when(showFloatingBottom, () => html`\n\t\t\t\t\t\t<div class=\"ml-progress__floating ml-progress__floating--bottom\" style=${styleMap({ left: `${c.percentage}%` })}>\n\t\t\t\t\t\t\t<span class=\"ml-progress__floating-arrow ml-progress__floating-arrow--up\"></span>\n\t\t\t\t\t\t\t<span class=\"ml-progress__floating-value\">${c.displayValue}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\n\t\t\t\t${when(showRight, () => html`<span class=\"ml-progress__value\">${c.displayValue}</span>`)}\n\t\t\t</div>\n\n\t\t\t${when(showBottom, () => html`<span class=\"ml-progress__value ml-progress__value--bottom\">${c.displayValue}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction circleTemplate(c: ProgressComponent) {\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-progress-circle': true,\n\t\t\t[`ml-progress-circle--${c.variant}`]: true,\n\t\t\t[`ml-progress-circle--${c.size}`]: true\n\t\t})}>\n\t\t\t<svg\n\t\t\t\twidth=${c.svgSize}\n\t\t\t\theight=${c.svgSize}\n\t\t\t\tviewBox=\"0 0 ${c.svgSize} ${c.svgSize}\"\n\t\t\t\tclass=\"ml-progress-circle__svg\"\n\t\t\t>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"ml-progress-circle__track\"\n\t\t\t\t\tcx=${c.svgCenter}\n\t\t\t\t\tcy=${c.svgCenter}\n\t\t\t\t\tr=${c.circleRadius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke-width=${c.circleStroke}\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"ml-progress-circle__fill\"\n\t\t\t\t\tcx=${c.svgCenter}\n\t\t\t\t\tcy=${c.svgCenter}\n\t\t\t\t\tr=${c.circleRadius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke-width=${c.circleStroke}\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-dasharray=${c.circumference}\n\t\t\t\t\tstroke-dashoffset=${c.circleDashOffset}\n\t\t\t\t\ttransform=\"rotate(-90 ${c.svgCenter} ${c.svgCenter})\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t${when(c.showValue || !!c.label, () => html`\n\t\t\t\t<div class=\"ml-progress-circle__center\">\n\t\t\t\t\t${when(c.showValue, () => html`<span class=\"ml-progress-circle__value\">${c.displayValue}</span>`)}\n\t\t\t\t\t${when(!!c.label, () => html`<span class=\"ml-progress-circle__label\">${c.label}</span>`)}\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</div>\n\t`;\n}\n\nfunction halfCircleTemplate(c: ProgressComponent) {\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-progress-half': true,\n\t\t\t[`ml-progress-half--${c.variant}`]: true,\n\t\t\t[`ml-progress-half--${c.size}`]: true\n\t\t})}>\n\t\t\t<svg\n\t\t\t\twidth=${c.svgSize}\n\t\t\t\theight=${c.svgCenter + c.circleStroke}\n\t\t\t\tviewBox=\"0 0 ${c.svgSize} ${c.svgCenter + c.circleStroke}\"\n\t\t\t\tclass=\"ml-progress-half__svg\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tclass=\"ml-progress-half__track\"\n\t\t\t\t\td=\"M ${c.circleStroke} ${c.svgCenter} A ${c.circleRadius} ${c.circleRadius} 0 0 1 ${c.svgSize - c.circleStroke} ${c.svgCenter}\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke-width=${c.circleStroke}\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\tclass=\"ml-progress-half__fill\"\n\t\t\t\t\td=\"M ${c.circleStroke} ${c.svgCenter} A ${c.circleRadius} ${c.circleRadius} 0 0 1 ${c.svgSize - c.circleStroke} ${c.svgCenter}\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke-width=${c.circleStroke}\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-dasharray=${c.halfCircumference}\n\t\t\t\t\tstroke-dashoffset=${c.halfCircleDashOffset}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t${when(c.showValue || !!c.label, () => html`\n\t\t\t\t<div class=\"ml-progress-half__center\">\n\t\t\t\t\t${when(c.showValue, () => html`<span class=\"ml-progress-half__value\">${c.displayValue}</span>`)}\n\t\t\t\t\t${when(!!c.label, () => html`<span class=\"ml-progress-half__label\">${c.label}</span>`)}\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</div>\n\t`;\n}\n\nexport function progressTemplate(c: ProgressComponent) {\n\tif (c.shape === 'circle') return circleTemplate(c);\n\tif (c.shape === 'half-circle') return halfCircleTemplate(c);\n\treturn linearTemplate(c);\n}\n","import { css } from '@melodicdev/core';\n\nexport const progressStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t/* ===================== LINEAR ===================== */\n\n\t.ml-progress__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: var(--ml-space-2);\n\t}\n\n\t.ml-progress__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-progress__value {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-progress__value--bottom {\n\t\tdisplay: block;\n\t\tmargin-top: var(--ml-space-2);\n\t}\n\n\t/* Bar row for label-right layout */\n\t.ml-progress__bar-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-progress__track-wrapper {\n\t\tposition: relative;\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-progress__track {\n\t\twidth: 100%;\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t\tborder-radius: var(--ml-radius-full);\n\t\toverflow: hidden;\n\t}\n\n\t.ml-progress--sm .ml-progress__track {\n\t\theight: 4px;\n\t}\n\n\t.ml-progress--md .ml-progress__track {\n\t\theight: 8px;\n\t}\n\n\t.ml-progress--lg .ml-progress__track {\n\t\theight: 12px;\n\t}\n\n\t.ml-progress__fill {\n\t\theight: 100%;\n\t\tborder-radius: var(--ml-radius-full);\n\t\ttransition: width var(--ml-duration-300) var(--ml-ease-out);\n\t}\n\n\t/* Floating label */\n\t.ml-progress__floating {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttransform: translateX(-50%);\n\t\tpointer-events: none;\n\t\tz-index: 1;\n\t}\n\n\t.ml-progress__floating--top {\n\t\tbottom: calc(100% + var(--ml-space-2));\n\t}\n\n\t.ml-progress__floating--bottom {\n\t\ttop: calc(100% + var(--ml-space-2));\n\t}\n\n\t.ml-progress__floating-value {\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tbackground-color: var(--ml-color-text);\n\t\tpadding: var(--ml-space-1) var(--ml-space-2);\n\t\tborder-radius: var(--ml-radius-md);\n\t\twhite-space: nowrap;\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress__floating-arrow {\n\t\twidth: 0;\n\t\theight: 0;\n\t\tborder-left: 5px solid transparent;\n\t\tborder-right: 5px solid transparent;\n\t}\n\n\t.ml-progress__floating-arrow--down {\n\t\tborder-top: 5px solid var(--ml-color-text);\n\t}\n\n\t.ml-progress__floating-arrow--up {\n\t\tborder-bottom: 5px solid var(--ml-color-text);\n\t}\n\n\t/* Linear color variants */\n\t.ml-progress--primary .ml-progress__fill {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-progress--success .ml-progress__fill {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t.ml-progress--warning .ml-progress__fill {\n\t\tbackground-color: var(--ml-color-warning);\n\t}\n\n\t.ml-progress--error .ml-progress__fill {\n\t\tbackground-color: var(--ml-color-error);\n\t}\n\n\t/* ===================== CIRCLE ===================== */\n\n\t.ml-progress-circle {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-progress-circle__svg {\n\t\tdisplay: block;\n\t}\n\n\t.ml-progress-circle__track {\n\t\tstroke: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-progress-circle__fill {\n\t\ttransition: stroke-dashoffset var(--ml-duration-300) var(--ml-ease-out);\n\t}\n\n\t.ml-progress-circle__center {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t}\n\n\t.ml-progress-circle--sm .ml-progress-circle__value {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-circle--md .ml-progress-circle__value {\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-circle--lg .ml-progress-circle__value {\n\t\tfont-size: var(--ml-text-2xl);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-circle__label {\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tmargin-top: var(--ml-space-0-5);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-circle--lg .ml-progress-circle__label {\n\t\tfont-size: var(--ml-text-sm);\n\t\tmargin-top: var(--ml-space-1);\n\t}\n\n\t/* Circle color variants */\n\t.ml-progress-circle--primary .ml-progress-circle__fill {\n\t\tstroke: var(--ml-color-primary);\n\t}\n\n\t.ml-progress-circle--success .ml-progress-circle__fill {\n\t\tstroke: var(--ml-color-success);\n\t}\n\n\t.ml-progress-circle--warning .ml-progress-circle__fill {\n\t\tstroke: var(--ml-color-warning);\n\t}\n\n\t.ml-progress-circle--error .ml-progress-circle__fill {\n\t\tstroke: var(--ml-color-error);\n\t}\n\n\t/* ===================== HALF CIRCLE ===================== */\n\n\t.ml-progress-half {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: flex-end;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-progress-half__svg {\n\t\tdisplay: block;\n\t}\n\n\t.ml-progress-half__track {\n\t\tstroke: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-progress-half__fill {\n\t\ttransition: stroke-dashoffset var(--ml-duration-300) var(--ml-ease-out);\n\t}\n\n\t.ml-progress-half__center {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: flex-end;\n\t\ttext-align: center;\n\t\tpadding-bottom: var(--ml-space-1);\n\t}\n\n\t.ml-progress-half--sm .ml-progress-half__value {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-half--md .ml-progress-half__value {\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-half--lg .ml-progress-half__value {\n\t\tfont-size: var(--ml-text-2xl);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-half__label {\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tmargin-top: var(--ml-space-0-5);\n\t\tline-height: 1;\n\t}\n\n\t.ml-progress-half--lg .ml-progress-half__label {\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t/* Half circle color variants */\n\t.ml-progress-half--primary .ml-progress-half__fill {\n\t\tstroke: var(--ml-color-primary);\n\t}\n\n\t.ml-progress-half--success .ml-progress-half__fill {\n\t\tstroke: var(--ml-color-success);\n\t}\n\n\t.ml-progress-half--warning .ml-progress-half__fill {\n\t\tstroke: var(--ml-color-warning);\n\t}\n\n\t.ml-progress-half--error .ml-progress-half__fill {\n\t\tstroke: var(--ml-color-error);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { progressTemplate } from './progress.template.js';\nimport { progressStyles } from './progress.styles.js';\n\ntype ProgressVariant = 'primary' | 'success' | 'warning' | 'error';\ntype ProgressSize = 'sm' | 'md' | 'lg';\ntype ProgressShape = 'linear' | 'circle' | 'half-circle';\ntype ProgressLabelPosition = 'top' | 'right' | 'bottom' | 'floating-top' | 'floating-bottom' | 'none';\n\n/**\n * ml-progress - Progress indicator with linear, circle, and half-circle shapes\n *\n * @example\n * ```html\n * <ml-progress value=\"60\"></ml-progress>\n * <ml-progress value=\"80\" label=\"Upload\" show-value label-position=\"right\"></ml-progress>\n * <ml-progress value=\"40\" shape=\"circle\" show-value></ml-progress>\n * <ml-progress value=\"60\" shape=\"half-circle\" show-value></ml-progress>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-progress',\n\ttemplate: progressTemplate,\n\tstyles: progressStyles,\n\tattributes: ['value', 'max', 'variant', 'size', 'label', 'show-value', 'shape', 'label-position']\n})\nexport class ProgressComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Current value (0-max) */\n\tvalue = 0;\n\n\t/** Maximum value */\n\tmax = 100;\n\n\t/** Color variant */\n\tvariant: ProgressVariant = 'primary';\n\n\t/** Bar height / circle size */\n\tsize: ProgressSize = 'md';\n\n\t/** Optional label */\n\tlabel = '';\n\n\t/** Show percentage text */\n\tshowValue = false;\n\n\t/** Shape: linear bar, full circle, or half circle */\n\tshape: ProgressShape = 'linear';\n\n\t/** Label position for linear bars */\n\tlabelPosition: ProgressLabelPosition = 'top';\n\n\tget percentage(): number {\n\t\tconst max = Math.max(this.max, 1);\n\t\treturn Math.min(Math.max((this.value / max) * 100, 0), 100);\n\t}\n\n\tget displayValue(): string {\n\t\treturn `${Math.round(this.percentage)}%`;\n\t}\n\n\t/** SVG circle radius based on size */\n\tget circleRadius(): number {\n\t\tif (this.size === 'sm') return 28;\n\t\tif (this.size === 'lg') return 52;\n\t\treturn 40;\n\t}\n\n\t/** SVG stroke width based on size */\n\tget circleStroke(): number {\n\t\tif (this.size === 'sm') return 4;\n\t\tif (this.size === 'lg') return 8;\n\t\treturn 6;\n\t}\n\n\t/** Full circumference for stroke-dasharray */\n\tget circumference(): number {\n\t\treturn 2 * Math.PI * this.circleRadius;\n\t}\n\n\t/** Half circumference for half-circle */\n\tget halfCircumference(): number {\n\t\treturn Math.PI * this.circleRadius;\n\t}\n\n\t/** Dash offset for full circle */\n\tget circleDashOffset(): number {\n\t\treturn this.circumference - (this.percentage / 100) * this.circumference;\n\t}\n\n\t/** Dash offset for half circle */\n\tget halfCircleDashOffset(): number {\n\t\treturn this.halfCircumference - (this.percentage / 100) * this.halfCircumference;\n\t}\n\n\t/** SVG viewBox size */\n\tget svgSize(): number {\n\t\treturn (this.circleRadius + this.circleStroke) * 2;\n\t}\n\n\t/** SVG center point */\n\tget svgCenter(): number {\n\t\treturn this.circleRadius + this.circleStroke;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { CardComponent } from './card.component.js';\n\nexport function cardTemplate(c: CardComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-card': true,\n\t\t\t\t[`ml-card--${c.variant}`]: true,\n\t\t\t\t'ml-card--hoverable': c.hoverable,\n\t\t\t\t'ml-card--clickable': c.clickable\n\t\t\t})}\n\t\t\t@click=${c.handleClick}\n\t\t>\n\t\t\t${when(\n\t\t\t\tc.hasHeader,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-card__header\">\n\t\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t\t<div class=\"ml-card__body\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t\t${when(\n\t\t\t\tc.hasFooter,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-card__footer\">\n\t\t\t\t\t\t<slot name=\"footer\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const cardStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-card {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\toverflow: hidden;\n\t}\n\n\t.ml-card--default {\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t}\n\n\t.ml-card--outlined {\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-card--elevated {\n\t\tborder: var(--ml-border) solid var(--ml-color-border-muted);\n\t\tbox-shadow: var(--ml-shadow-md);\n\t}\n\n\t.ml-card--filled {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tborder: var(--ml-border) solid transparent;\n\t}\n\n\t.ml-card--hoverable {\n\t\ttransition:\n\t\t\tbox-shadow var(--ml-duration-200) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-card--hoverable:hover {\n\t\tborder-color: var(--ml-color-border-strong);\n\t\tbox-shadow: var(--ml-shadow-md);\n\t}\n\n\t.ml-card--clickable {\n\t\tcursor: pointer;\n\t}\n\n\t.ml-card--clickable:focus-visible {\n\t\toutline: none;\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-card__header {\n\t\tpadding: var(--ml-space-4) var(--ml-space-5);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-card__header ::slotted(*) {\n\t\tmargin: 0;\n\t}\n\n\t.ml-card__body {\n\t\tpadding: var(--ml-space-5);\n\t}\n\n\t.ml-card__footer {\n\t\tpadding: var(--ml-space-4) var(--ml-space-5);\n\t\tborder-top: var(--ml-border) solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-card-footer-bg);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { cardTemplate } from './card.template.js';\nimport { cardStyles } from './card.styles.js';\n\ntype CardVariant = 'default' | 'outlined' | 'elevated' | 'filled';\n\n/**\n * ml-card - Container component for grouping content\n *\n * @example\n * ```html\n * <ml-card>\n * <h3 slot=\"header\">Card Title</h3>\n * <p>Card content goes here</p>\n * <div slot=\"footer\">Card footer</div>\n * </ml-card>\n * ```\n *\n * @slot header - Card header content\n * @slot default - Main card content\n * @slot footer - Card footer content\n */\n@MelodicComponent({\n\tselector: 'ml-card',\n\ttemplate: cardTemplate,\n\tstyles: cardStyles,\n\tattributes: ['variant', 'hoverable', 'clickable']\n})\nexport class CardComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Card visual style */\n\tvariant: CardVariant = 'default';\n\n\t/** Add hover effect */\n\thoverable = false;\n\n\t/** Make card clickable */\n\tclickable = false;\n\n\t/** Internal: check if header slot has content */\n\tget hasHeader(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header\"]') !== null;\n\t}\n\n\t/** Internal: check if footer slot has content */\n\tget hasFooter(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"footer\"]') !== null;\n\t}\n\n\thandleClick = (event: MouseEvent): void => {\n\t\tif (this.clickable) {\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:click', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { originalEvent: event }\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { DividerComponent } from './divider.component.js';\n\nexport function dividerTemplate(c: DividerComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-divider': true,\n\t\t\t\t[`ml-divider--${c.orientation}`]: true,\n\t\t\t\t'ml-divider--with-label': c.hasLabel\n\t\t\t})}\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=${c.orientation}\n\t\t>\n\t\t\t${when(\n\t\t\t\tc.hasLabel,\n\t\t\t\t() => html`\n\t\t\t\t\t<span class=\"ml-divider__label\">\n\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t</span>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dividerStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t:host([orientation='vertical']) {\n\t\tdisplay: inline-block;\n\t\theight: 100%;\n\t}\n\n\t.ml-divider {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.ml-divider--horizontal {\n\t\twidth: 100%;\n\t\theight: 1px;\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-divider--horizontal.ml-divider--with-label {\n\t\theight: auto;\n\t\tbackground-color: transparent;\n\t}\n\n\t.ml-divider--horizontal.ml-divider--with-label::before,\n\t.ml-divider--horizontal.ml-divider--with-label::after {\n\t\tcontent: '';\n\t\tflex: 1;\n\t\theight: 1px;\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-divider--horizontal .ml-divider__label {\n\t\tpadding: 0 var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-divider--vertical {\n\t\tflex-direction: column;\n\t\twidth: 1px;\n\t\tmin-height: 1rem;\n\t\theight: 100%;\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-divider--vertical.ml-divider--with-label {\n\t\twidth: auto;\n\t\tbackground-color: transparent;\n\t}\n\n\t.ml-divider--vertical.ml-divider--with-label::before,\n\t.ml-divider--vertical.ml-divider--with-label::after {\n\t\tcontent: '';\n\t\tflex: 1;\n\t\twidth: 1px;\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-divider--vertical .ml-divider__label {\n\t\tpadding: var(--ml-space-3) 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\twriting-mode: vertical-rl;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Orientation } from '../../../types/index.js';\nimport { dividerTemplate } from './divider.template.js';\nimport { dividerStyles } from './divider.styles.js';\n\n/**\n * ml-divider - Visual separator between content\n *\n * @example\n * ```html\n * <ml-divider></ml-divider>\n * <ml-divider orientation=\"vertical\"></ml-divider>\n * <ml-divider>OR</ml-divider>\n * ```\n *\n * @slot default - Optional label text to display in the divider\n */\n@MelodicComponent({\n\tselector: 'ml-divider',\n\ttemplate: dividerTemplate,\n\tstyles: dividerStyles,\n\tattributes: ['orientation']\n})\nexport class DividerComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Divider orientation */\n\torientation: Orientation = 'horizontal';\n\n\t/** Check if there's label content */\n\tget hasLabel(): boolean {\n\t\treturn this.elementRef?.textContent?.trim() !== '';\n\t}\n}\n","import { html, styleMap } from '@melodicdev/core';\nimport type { StackComponent } from './stack.component.js';\n\nexport function stackTemplate(c: StackComponent) {\n\treturn html`\n\t\t<div class=\"ml-stack\" style=${styleMap(c.getStyles())}>\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const stackStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-stack {\n\t\tdisplay: flex;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Orientation } from '../../../types/index.js';\nimport { stackTemplate } from './stack.template.js';\nimport { stackStyles } from './stack.styles.js';\n\ntype Alignment = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\ntype Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n\n/**\n * ml-stack - Flexbox layout component for stacking elements\n *\n * @example\n * ```html\n * <ml-stack gap=\"4\">\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </ml-stack>\n *\n * <ml-stack direction=\"horizontal\" gap=\"2\" align=\"center\">\n * <ml-button>Save</ml-button>\n * <ml-button variant=\"outline\">Cancel</ml-button>\n * </ml-stack>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-stack',\n\ttemplate: stackTemplate,\n\tstyles: stackStyles,\n\tattributes: ['direction', 'gap', 'align', 'justify', 'wrap']\n})\nexport class StackComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Stack direction */\n\tdirection: Orientation = 'vertical';\n\n\t/** Gap between items (uses spacing scale: 1-12) */\n\tgap: string = '4';\n\n\t/** Cross-axis alignment */\n\talign: Alignment = 'stretch';\n\n\t/** Main-axis justification */\n\tjustify: Justify = 'start';\n\n\t/** Allow items to wrap */\n\twrap = false;\n\n\tgetStyles(): Record<string, string> {\n\t\tconst alignMap: Record<Alignment, string> = {\n\t\t\tstart: 'flex-start',\n\t\t\tcenter: 'center',\n\t\t\tend: 'flex-end',\n\t\t\tstretch: 'stretch',\n\t\t\tbaseline: 'baseline'\n\t\t};\n\n\t\tconst justifyMap: Record<Justify, string> = {\n\t\t\tstart: 'flex-start',\n\t\t\tcenter: 'center',\n\t\t\tend: 'flex-end',\n\t\t\tbetween: 'space-between',\n\t\t\taround: 'space-around',\n\t\t\tevenly: 'space-evenly'\n\t\t};\n\n\t\treturn {\n\t\t\t'flex-direction': this.direction === 'vertical' ? 'column' : 'row',\n\t\t\tgap: `var(--ml-space-${this.gap})`,\n\t\t\t'align-items': alignMap[this.align],\n\t\t\t'justify-content': justifyMap[this.justify],\n\t\t\t'flex-wrap': this.wrap ? 'wrap' : 'nowrap'\n\t\t};\n\t}\n}\n","import { html, styleMap } from '@melodicdev/core';\nimport type { ContainerComponent } from './container.component.js';\n\nexport function containerTemplate(c: ContainerComponent) {\n\treturn html`\n\t\t<div class=\"ml-container\" style=${styleMap(c.getStyles())}>\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const containerStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.ml-container {\n\t\twidth: 100%;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { containerTemplate } from './container.template.js';\nimport { containerStyles } from './container.styles.js';\n\ntype ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * ml-container - Content width constraint wrapper\n *\n * @example\n * ```html\n * <ml-container>\n * <p>Centered content with max-width</p>\n * </ml-container>\n *\n * <ml-container size=\"sm\" padding=\"6\">\n * <p>Narrow container with extra padding</p>\n * </ml-container>\n * ```\n *\n * @slot default - Container content\n */\n@MelodicComponent({\n\tselector: 'ml-container',\n\ttemplate: containerTemplate,\n\tstyles: containerStyles,\n\tattributes: ['size', 'padding', 'centered']\n})\nexport class ContainerComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Max-width preset */\n\tsize: ContainerSize = 'lg';\n\n\t/** Horizontal padding (spacing scale: 1-12) */\n\tpadding: string = '4';\n\n\t/** Center the container with auto margins */\n\tcentered = true;\n\n\tgetStyles(): Record<string, string> {\n\t\tconst maxWidthMap: Record<ContainerSize, string> = {\n\t\t\tsm: '640px',\n\t\t\tmd: '768px',\n\t\t\tlg: '1024px',\n\t\t\txl: '1280px',\n\t\t\tfull: '100%'\n\t\t};\n\n\t\treturn {\n\t\t\t'max-width': maxWidthMap[this.size],\n\t\t\t'padding-left': `var(--ml-space-${this.padding})`,\n\t\t\t'padding-right': `var(--ml-space-${this.padding})`,\n\t\t\t'margin-left': this.centered ? 'auto' : '0',\n\t\t\t'margin-right': this.centered ? 'auto' : '0'\n\t\t};\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { AvatarComponent } from './avatar.component.js';\n\nexport function avatarTemplate(c: AvatarComponent) {\n\treturn html`\n\t\t<span\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-avatar': true,\n\t\t\t\t[`ml-avatar--${c.size}`]: true,\n\t\t\t\t'ml-avatar--rounded': c.rounded\n\t\t\t})}\n\t\t\trole=\"img\"\n\t\t\taria-label=${c.alt || c.initials || 'Avatar'}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.src && !c._imageError,\n\t\t\t\t() => html` <img class=\"ml-avatar__image\" src=\"${c.src}\" alt=\"${c.alt}\" @error=${c.handleImageError} /> `,\n\t\t\t\t() => html`${when(\n\t\t\t\t\t\t!!c.initials,\n\t\t\t\t\t\t() => html`<span class=\"ml-avatar__initials\">${c.getInitials()}</span>`,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<span class=\"ml-avatar__fallback\">\n\t\t\t\t\t\t\t\t<slot>\n\t\t\t\t\t\t\t\t\t<ml-icon icon=\"user\" format=\"fill\"></ml-icon>\n\t\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}`\n\t\t\t)}\n\t\t</span>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const avatarStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-avatar {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\toverflow: hidden;\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tvertical-align: middle;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tborder: 2px solid var(--ml-color-surface);\n\t\tbox-shadow: var(--ml-shadow-xs);\n\t}\n\n\t.ml-avatar--rounded {\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t.ml-avatar--xs {\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t\tfont-size: 0.625rem;\n\t\tborder-width: 1px;\n\t}\n\n\t.ml-avatar--sm {\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tfont-size: var(--ml-text-xs);\n\t\tborder-width: 1.5px;\n\t}\n\n\t.ml-avatar--md {\n\t\twidth: 2.5rem;\n\t\theight: 2.5rem;\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-avatar--lg {\n\t\twidth: 3rem;\n\t\theight: 3rem;\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t.ml-avatar--xl {\n\t\twidth: 4rem;\n\t\theight: 4rem;\n\t\tfont-size: var(--ml-text-xl);\n\t\tborder-width: 3px;\n\t}\n\n\t.ml-avatar--2xl {\n\t\twidth: 5rem;\n\t\theight: 5rem;\n\t\tfont-size: var(--ml-text-2xl);\n\t\tborder-width: 3px;\n\t}\n\n\t.ml-avatar__image {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: cover;\n\t}\n\n\t.ml-avatar__initials {\n\t\ttext-transform: uppercase;\n\t\tuser-select: none;\n\t\tletter-spacing: -0.025em;\n\t}\n\n\t.ml-avatar__fallback {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 60%;\n\t\theight: 60%;\n\t\tcolor: var(--ml-color-text-subtle);\n\t}\n\n\t.ml-avatar__fallback svg {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { avatarTemplate } from './avatar.template.js';\nimport { avatarStyles } from './avatar.styles.js';\n\n/**\n * ml-avatar - User avatar with image, initials, or icon fallback\n *\n * @example\n * ```html\n * <ml-avatar src=\"/images/user.jpg\" alt=\"John Doe\"></ml-avatar>\n * <ml-avatar initials=\"JD\"></ml-avatar>\n * <ml-avatar initials=\"JD\" size=\"lg\"></ml-avatar>\n * ```\n *\n * @slot default - Custom fallback content (icon)\n */\n@MelodicComponent({\n\tselector: 'ml-avatar',\n\ttemplate: avatarTemplate,\n\tstyles: avatarStyles,\n\tattributes: ['src', 'alt', 'initials', 'size', 'rounded']\n})\nexport class AvatarComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Image source URL */\n\tsrc = '';\n\n\t/** Alt text for image */\n\talt = '';\n\n\t/** Initials to display (fallback if no image) */\n\tinitials = '';\n\n\t/** Avatar size */\n\tsize: Size = 'md';\n\n\t/** Use rounded square instead of circle */\n\trounded = false;\n\n\t/** Internal: track image load errors */\n\t_imageError = false;\n\n\thandleImageError = (): void => {\n\t\tthis._imageError = true;\n\t};\n\n\tgetInitials(): string {\n\t\t// Return at most 2 characters\n\t\treturn this.initials.slice(0, 2).toUpperCase();\n\t}\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { BadgeComponent } from './badge.component.js';\n\nexport function badgeTemplate(c: BadgeComponent) {\n\treturn html`\n\t\t<span\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-badge': true,\n\t\t\t\t[`ml-badge--${c.variant}`]: true,\n\t\t\t\t[`ml-badge--${c.size}`]: true,\n\t\t\t\t'ml-badge--dot': c.dot,\n\t\t\t\t'ml-badge--pill': c.pill\n\t\t\t})}\n\t\t>\n\t\t\t${c.dot ? html`<span class=\"ml-badge__dot\"></span>` : ''}\n\t\t\t<slot></slot>\n\t\t</span>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const badgeStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-badge {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1-5);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\twhite-space: nowrap;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tborder: var(--ml-border) solid transparent;\n\t}\n\n\t.ml-badge--pill {\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-badge__dot {\n\t\twidth: 0.375rem;\n\t\theight: 0.375rem;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: currentColor;\n\t}\n\n\t.ml-badge--lg .ml-badge__dot {\n\t\twidth: 0.5rem;\n\t\theight: 0.5rem;\n\t}\n\n\t.ml-badge--sm {\n\t\tpadding: 2px var(--ml-space-2);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-badge--md {\n\t\tpadding: var(--ml-space-1) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-badge--lg {\n\t\tpadding: var(--ml-space-1) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-badge--default {\n\t\tbackground-color: var(--ml-badge-default-bg);\n\t\tborder-color: var(--ml-badge-default-border);\n\t\tcolor: var(--ml-badge-default-text);\n\t}\n\n\t.ml-badge--primary {\n\t\tbackground-color: var(--ml-badge-primary-bg);\n\t\tborder-color: var(--ml-badge-primary-border);\n\t\tcolor: var(--ml-badge-primary-text);\n\t}\n\n\t.ml-badge--secondary {\n\t\tbackground-color: var(--ml-badge-default-bg);\n\t\tborder-color: var(--ml-badge-default-border);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-badge--success {\n\t\tbackground-color: var(--ml-badge-success-bg);\n\t\tborder-color: var(--ml-badge-success-border);\n\t\tcolor: var(--ml-badge-success-text);\n\t}\n\n\t.ml-badge--warning {\n\t\tbackground-color: var(--ml-badge-warning-bg);\n\t\tborder-color: var(--ml-badge-warning-border);\n\t\tcolor: var(--ml-badge-warning-text);\n\t}\n\n\t.ml-badge--error {\n\t\tbackground-color: var(--ml-badge-error-bg);\n\t\tborder-color: var(--ml-badge-error-border);\n\t\tcolor: var(--ml-badge-error-text);\n\t}\n\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { BadgeVariant } from './badge.types.js';\nimport { badgeTemplate } from './badge.template.js';\nimport { badgeStyles } from './badge.styles.js';\n\n/**\n * ml-badge - Badge/tag component for status indicators\n *\n * @example\n * ```html\n * <ml-badge>Default</ml-badge>\n * <ml-badge variant=\"success\">Active</ml-badge>\n * <ml-badge variant=\"error\" dot>Offline</ml-badge>\n * ```\n *\n * @slot default - Badge label content\n */\n@MelodicComponent({\n\tselector: 'ml-badge',\n\ttemplate: badgeTemplate,\n\tstyles: badgeStyles,\n\tattributes: ['variant', 'size', 'dot', 'pill']\n})\nexport class BadgeComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Badge variant */\n\tvariant: BadgeVariant = 'default';\n\n\t/** Badge size */\n\tsize: Size = 'md';\n\n\t/** Show dot indicator */\n\tdot = false;\n\n\t/** Use pill (rounded) shape */\n\tpill = false;\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { BadgeGroupComponent } from './badge-group.component.js';\n\nexport function badgeGroupTemplate(c: BadgeGroupComponent) {\n\tconst isTrailing = c.badgePosition === 'trailing';\n\n\treturn html`\n\t\t<span\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-badge-group': true,\n\t\t\t\t'ml-badge-group--pill': c.theme === 'pill',\n\t\t\t\t'ml-badge-group--modern': c.theme === 'modern',\n\t\t\t\t'ml-badge-group--sm': c.size === 'sm',\n\t\t\t\t'ml-badge-group--md': c.size === 'md',\n\t\t\t\t'ml-badge-group--lg': c.size === 'lg',\n\t\t\t\t[`ml-badge-group--${c.variant}`]: true\n\t\t\t})}\n\t\t>\n\t\t\t${when(!isTrailing && !!c.label, () => html`<span class=\"ml-badge-group__label ml-badge-group__label--${c.variant}\">${c.label}</span>`)}\n\t\t\t<span class=\"ml-badge-group__text\">\n\t\t\t\t<slot></slot>\n\t\t\t</span>\n\t\t\t${when(isTrailing && !!c.label, () => html`<span class=\"ml-badge-group__label ml-badge-group__label--${c.variant}\">${c.label}</span>`)}\n\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\" class=\"ml-badge-group__icon\"></ml-icon>`)}\n\t\t</span>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const badgeGroupStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-badge-group {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\twhite-space: nowrap;\n\t\tborder: var(--ml-border) solid transparent;\n\t}\n\n\t/* Themes */\n\t.ml-badge-group--pill {\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-badge-group--modern {\n\t\tborder-radius: var(--ml-radius-md);\n\t}\n\n\t/* Sizes */\n\t.ml-badge-group--sm {\n\t\tpadding: 3px 8px 3px 3px;\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-badge-group--md {\n\t\tpadding: 4px 10px 4px 4px;\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-badge-group--lg {\n\t\tpadding: 4px 12px 4px 4px;\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t/* Outer container colors */\n\t.ml-badge-group--default {\n\t\tbackground-color: var(--ml-badge-default-bg);\n\t\tborder-color: var(--ml-badge-default-border);\n\t\tcolor: var(--ml-badge-default-text);\n\t}\n\n\t.ml-badge-group--primary {\n\t\tbackground-color: var(--ml-badge-primary-bg);\n\t\tborder-color: var(--ml-badge-primary-border);\n\t\tcolor: var(--ml-badge-primary-text);\n\t}\n\n\t.ml-badge-group--success {\n\t\tbackground-color: var(--ml-badge-success-bg);\n\t\tborder-color: var(--ml-badge-success-border);\n\t\tcolor: var(--ml-badge-success-text);\n\t}\n\n\t.ml-badge-group--warning {\n\t\tbackground-color: var(--ml-badge-warning-bg);\n\t\tborder-color: var(--ml-badge-warning-border);\n\t\tcolor: var(--ml-badge-warning-text);\n\t}\n\n\t.ml-badge-group--error {\n\t\tbackground-color: var(--ml-badge-error-bg);\n\t\tborder-color: var(--ml-badge-error-border);\n\t\tcolor: var(--ml-badge-error-text);\n\t}\n\n\t/* Inner label badge */\n\t.ml-badge-group__label {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tpadding: 2px var(--ml-space-2);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\twhite-space: nowrap;\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-badge-group--modern .ml-badge-group__label {\n\t\tborder-radius: var(--ml-radius-sm);\n\t}\n\n\t/* Inner label colors - slightly stronger than the outer bg */\n\t.ml-badge-group__label--default {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-badge-default-text);\n\t\tborder: 1px solid var(--ml-badge-default-border);\n\t}\n\n\t.ml-badge-group__label--primary {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-badge-primary-text);\n\t\tborder: 1px solid var(--ml-badge-primary-border);\n\t}\n\n\t.ml-badge-group__label--success {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-badge-success-text);\n\t\tborder: 1px solid var(--ml-badge-success-border);\n\t}\n\n\t.ml-badge-group__label--warning {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-badge-warning-text);\n\t\tborder: 1px solid var(--ml-badge-warning-border);\n\t}\n\n\t.ml-badge-group__label--error {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-badge-error-text);\n\t\tborder: 1px solid var(--ml-badge-error-border);\n\t}\n\n\t/* Text */\n\t.ml-badge-group__text {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t/* Icon */\n\t.ml-badge-group__icon {\n\t\tdisplay: inline-flex;\n\t\tflex-shrink: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { BadgeVariant } from '../badge/badge.types.js';\nimport { badgeGroupTemplate } from './badge-group.template.js';\nimport { badgeGroupStyles } from './badge-group.styles.js';\n\ntype BadgeGroupTheme = 'pill' | 'modern';\ntype BadgePosition = 'leading' | 'trailing';\n\n/**\n * ml-badge-group - Compound badge pairing a label badge with descriptive text\n *\n * @example\n * ```html\n * <ml-badge-group label=\"New\" variant=\"primary\">We've just released a new feature</ml-badge-group>\n * <ml-badge-group label=\"Release\" variant=\"success\" icon=\"arrow-right\">Check out the latest updates</ml-badge-group>\n * <ml-badge-group label=\"v2.0\" variant=\"primary\" badge-position=\"trailing\">Latest release</ml-badge-group>\n * ```\n *\n * @slot default - Message text content\n */\n@MelodicComponent({\n\tselector: 'ml-badge-group',\n\ttemplate: badgeGroupTemplate,\n\tstyles: badgeGroupStyles,\n\tattributes: ['label', 'variant', 'theme', 'size', 'badge-position', 'icon']\n})\nexport class BadgeGroupComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Inner badge label text */\n\tlabel = '';\n\n\t/** Color variant */\n\tvariant: BadgeVariant = 'default';\n\n\t/** Visual theme */\n\ttheme: BadgeGroupTheme = 'pill';\n\n\t/** Size */\n\tsize: 'sm' | 'md' | 'lg' = 'md';\n\n\t/** Position of the inner badge */\n\tbadgePosition: BadgePosition = 'leading';\n\n\t/** Optional trailing icon name */\n\ticon = '';\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { TagComponent } from './tag.component.js';\n\nexport function tagTemplate(c: TagComponent) {\n\tconst avatarSrc = c['avatar-src'];\n\tconst dotColor = c['dot-color'];\n\n\treturn html`\n\t\t<span\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-tag': true,\n\t\t\t\t[`ml-tag--${c.size}`]: true,\n\t\t\t\t'ml-tag--disabled': c.disabled\n\t\t\t})}\n\t\t>\n\t\t\t${c.checkable ? html`\n\t\t\t\t<button\n\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t'ml-tag__checkbox': true,\n\t\t\t\t\t\t'ml-tag__checkbox--checked': c.checked\n\t\t\t\t\t})}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"checkbox\"\n\t\t\t\t\taria-checked=${c.checked ? 'true' : 'false'}\n\t\t\t\t\t.disabled=${c.disabled}\n\t\t\t\t\t@click=${c.handleCheck}\n\t\t\t\t>\n\t\t\t\t\t${c.checked ? html`\n\t\t\t\t\t\t<svg viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t` : ''}\n\t\t\t\t</button>\n\t\t\t` : ''}\n\t\t\t${c.icon ? html`<ml-icon class=\"ml-tag__icon\" icon=${c.icon} size=\"sm\"></ml-icon>` : ''}\n\t\t\t${avatarSrc ? html`<img class=\"ml-tag__avatar\" src=${avatarSrc} alt=\"\" />` : ''}\n\t\t\t${c.dot ? html`<span class=${classMap({\n\t\t\t\t'ml-tag__dot': true,\n\t\t\t\t[`ml-tag__dot--${dotColor}`]: true\n\t\t\t})}></span>` : ''}\n\t\t\t<span class=\"ml-tag__content\"><slot></slot></span>\n\t\t\t${c.count ? html`<span class=\"ml-tag__count\">${c.count}</span>` : ''}\n\t\t\t${c.closable ? html`\n\t\t\t\t<button\n\t\t\t\t\tclass=\"ml-tag__close\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Remove\"\n\t\t\t\t\t.disabled=${c.disabled}\n\t\t\t\t\t@click=${c.handleClose}\n\t\t\t\t>\n\t\t\t\t\t<ml-icon icon=\"x\" size=\"sm\"></ml-icon>\n\t\t\t\t</button>\n\t\t\t` : ''}\n\t\t</span>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tagStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-tag {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1-5);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\twhite-space: nowrap;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Sizes */\n\t.ml-tag--sm {\n\t\tpadding: var(--ml-space-0-5) var(--ml-space-2);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-tag--md {\n\t\tpadding: var(--ml-space-1) var(--ml-space-2-5);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-tag--lg {\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t/* Dot indicator */\n\t.ml-tag__dot {\n\t\twidth: 0.5rem;\n\t\theight: 0.5rem;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-tag--sm .ml-tag__dot {\n\t\twidth: 0.375rem;\n\t\theight: 0.375rem;\n\t}\n\n\t.ml-tag__dot--success {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t.ml-tag__dot--warning {\n\t\tbackground-color: var(--ml-color-warning);\n\t}\n\n\t.ml-tag__dot--danger {\n\t\tbackground-color: var(--ml-color-danger);\n\t}\n\n\t.ml-tag__dot--info {\n\t\tbackground-color: var(--ml-color-info);\n\t}\n\n\t.ml-tag__dot--primary {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-tag__dot--secondary {\n\t\tbackground-color: var(--ml-color-secondary);\n\t}\n\n\t/* Avatar */\n\t.ml-tag__avatar {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tobject-fit: cover;\n\t\tflex-shrink: 0;\n\t\tmargin-left: calc(var(--ml-space-0-5) * -1);\n\t}\n\n\t.ml-tag--sm .ml-tag__avatar {\n\t\twidth: 0.875rem;\n\t\theight: 0.875rem;\n\t}\n\n\t.ml-tag--lg .ml-tag__avatar {\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t}\n\n\t/* Icon */\n\t.ml-tag__icon {\n\t\tflex-shrink: 0;\n\t\tmargin-left: calc(var(--ml-space-0-5) * -1);\n\t}\n\n\t/* Content */\n\t.ml-tag__content {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t/* Count */\n\t.ml-tag__count {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: inherit;\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t/* Close button */\n\t.ml-tag__close {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tmargin-right: calc(var(--ml-space-1) * -1);\n\t\tborder: none;\n\t\tbackground: none;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\ttransition: color 0.15s ease;\n\t\tline-height: 0;\n\t}\n\n\t.ml-tag__close:hover {\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-tag__close:active {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Checkbox */\n\t.ml-tag__checkbox {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tmargin-left: calc(var(--ml-space-0-5) * -1);\n\t\tborder: var(--ml-border) solid var(--ml-color-border-strong);\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tbackground: var(--ml-color-surface);\n\t\tcursor: pointer;\n\t\tflex-shrink: 0;\n\t\ttransition: background-color 0.15s ease, border-color 0.15s ease;\n\t\tcolor: white;\n\t}\n\n\t.ml-tag--sm .ml-tag__checkbox {\n\t\twidth: 0.875rem;\n\t\theight: 0.875rem;\n\t}\n\n\t.ml-tag--lg .ml-tag__checkbox {\n\t\twidth: 1.125rem;\n\t\theight: 1.125rem;\n\t}\n\n\t.ml-tag__checkbox svg {\n\t\twidth: 0.75rem;\n\t\theight: 0.75rem;\n\t}\n\n\t.ml-tag__checkbox--checked {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder-color: var(--ml-color-primary);\n\t}\n\n\t.ml-tag__checkbox:hover {\n\t\tborder-color: var(--ml-color-primary);\n\t}\n\n\t.ml-tag__checkbox--checked:hover {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tborder-color: var(--ml-color-primary-hover);\n\t}\n\n\t/* Disabled state */\n\t.ml-tag--disabled {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { TagDotColor } from './tag.types.js';\nimport { tagTemplate } from './tag.template.js';\nimport { tagStyles } from './tag.styles.js';\n\n/**\n * ml-tag - Compact element for labeling, categorizing, and organizing items\n *\n * @example\n * ```html\n * <ml-tag>Label</ml-tag>\n * <ml-tag avatar-src=\"photo.jpg\">Label</ml-tag>\n * <ml-tag dot closable>Label</ml-tag>\n * <ml-tag count=\"5\">Label</ml-tag>\n * <ml-tag checkable>Label</ml-tag>\n * ```\n *\n * @slot default - Tag label content\n * @fires ml:close - Fired when the close button is clicked\n * @fires ml:change - Fired when checkbox state changes (when checkable)\n */\n@MelodicComponent({\n\tselector: 'ml-tag',\n\ttemplate: tagTemplate,\n\tstyles: tagStyles,\n\tattributes: ['size', 'dot', 'dot-color', 'closable', 'avatar-src', 'icon', 'count', 'checkable', 'checked', 'disabled']\n})\nexport class TagComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Tag size */\n\tsize: Size = 'md';\n\n\t/** Show dot indicator */\n\tdot = false;\n\n\t/** Dot color */\n\t'dot-color': TagDotColor = 'success';\n\n\t/** Show close button */\n\tclosable = false;\n\n\t/** Avatar image source */\n\t'avatar-src' = '';\n\n\t/** Icon name (Phosphor icon) */\n\ticon = '';\n\n\t/** Count value displayed on the right */\n\tcount = '';\n\n\t/** Show checkbox */\n\tcheckable = false;\n\n\t/** Checkbox checked state */\n\tchecked = false;\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Handle close button click */\n\thandleClose = (event: Event): void => {\n\t\tevent.stopPropagation();\n\t\tif (this.disabled) return;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:close', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Handle checkbox change */\n\thandleCheck = (event: Event): void => {\n\t\tevent.stopPropagation();\n\t\tif (this.disabled) return;\n\n\t\tthis.checked = !this.checked;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { checked: this.checked }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { ListComponent } from './list.component.js';\n\nexport function listTemplate(c: ListComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-list': true,\n\t\t\t\t[`ml-list--${c.variant}`]: true,\n\t\t\t\t[`ml-list--${c.size}`]: true\n\t\t\t})}\n\t\t\trole=\"list\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const listStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* Size variants — set CSS variable consumed by ml-list-item */\n\t.ml-list--sm {\n\t\t--_ml-list-padding: var(--ml-space-2) 0;\n\t}\n\n\t.ml-list--md {\n\t\t--_ml-list-padding: var(--ml-space-3) 0;\n\t}\n\n\t.ml-list--lg {\n\t\t--_ml-list-padding: var(--ml-space-4) 0;\n\t}\n\n\t/* Default variant: dividers between items */\n\t.ml-list--default ::slotted(ml-list-item:not(:last-of-type)) {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { listTemplate } from './list.template.js';\nimport { listStyles } from './list.styles.js';\n\ntype ListVariant = 'default' | 'plain';\ntype ListSize = 'sm' | 'md' | 'lg';\n\n/**\n * ml-list - Container for displaying a list of items\n *\n * @example\n * ```html\n * <ml-list variant=\"default\" size=\"md\">\n * <ml-list-item primary=\"Jane Doe\" secondary=\"Developer\">\n * <ml-avatar slot=\"leading\" initials=\"JD\"></ml-avatar>\n * </ml-list-item>\n * </ml-list>\n * ```\n *\n * @slot default - List items\n */\n@MelodicComponent({\n\tselector: 'ml-list',\n\ttemplate: listTemplate,\n\tstyles: listStyles,\n\tattributes: ['variant', 'size']\n})\nexport class ListComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** List display variant */\n\tvariant: ListVariant = 'default';\n\n\t/** List size (controls item padding) */\n\tsize: ListSize = 'md';\n}\n","import { html, when } from '@melodicdev/core';\nimport type { ListItemComponent } from './list-item.component.js';\n\nexport function listItemTemplate(c: ListItemComponent) {\n\treturn html`\n\t\t<div class=\"ml-li\" role=\"listitem\">\n\t\t\t${when(\n\t\t\t\tc.hasLeadingSlot,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-li__leading\">\n\t\t\t\t\t\t<slot name=\"leading\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t\t<div class=\"ml-li__content\">\n\t\t\t\t${when(!!c.primary, () => html`<span class=\"ml-li__primary\">${c.primary}</span>`)}\n\t\t\t\t${when(!!c.secondary, () => html`<span class=\"ml-li__secondary\">${c.secondary}</span>`)}\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t\t${when(\n\t\t\t\tc.hasTrailingSlot,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-li__trailing\">\n\t\t\t\t\t\t<slot name=\"trailing\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const listItemStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding: var(--_ml-list-padding, var(--ml-space-3) 0);\n\t}\n\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t:host([interactive]) {\n\t\tcursor: pointer;\n\t}\n\n\t:host([interactive]:hover) {\n\t\tbackground-color: var(--ml-color-bg-secondary);\n\t}\n\n\t:host([interactive]:focus-visible) {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: -2px;\n\t\tborder-radius: var(--ml-radius-md);\n\t}\n\n\t:host([interactive]) .ml-li {\n\t\tpadding-inline: var(--ml-space-3);\n\t}\n\n\t.ml-li {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-li__leading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-li__content {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t}\n\n\t.ml-li__primary {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t.ml-li__secondary {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t.ml-li__trailing {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tmargin-left: auto;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { listItemTemplate } from './list-item.template.js';\nimport { listItemStyles } from './list-item.styles.js';\n\n/**\n * ml-list-item - Individual item within a list\n *\n * @example\n * ```html\n * <ml-list-item primary=\"Phoenix Baker\" secondary=\"Member since Feb 2025\">\n * <ml-avatar slot=\"leading\" initials=\"PB\"></ml-avatar>\n * <ml-badge slot=\"trailing\" variant=\"pill\" color=\"success\">Active</ml-badge>\n * </ml-list-item>\n * ```\n *\n * @slot leading - Left side content (avatars, icons, images)\n * @slot default - Main content (overrides primary/secondary text)\n * @slot trailing - Right side content (badges, indicators, actions)\n */\n@MelodicComponent({\n\tselector: 'ml-list-item',\n\ttemplate: listItemTemplate,\n\tstyles: listItemStyles,\n\tattributes: ['primary', 'secondary', 'disabled', 'interactive']\n})\nexport class ListItemComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Primary text */\n\tprimary = '';\n\n\t/** Secondary text */\n\tsecondary = '';\n\n\t/** Disable the item */\n\tdisabled = false;\n\n\t/** Enable hover/focus states for clickable items */\n\tinteractive = false;\n\n\t/** Check if leading slot has content */\n\tget hasLeadingSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"leading\"]') !== null;\n\t}\n\n\t/** Check if trailing slot has content */\n\tget hasTrailingSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"trailing\"]') !== null;\n\t}\n\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { ActivityFeedComponent } from './activity-feed.component.js';\n\nexport function activityFeedTemplate(c: ActivityFeedComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-activity-feed': true,\n\t\t\t\t[`ml-activity-feed--${c.variant}`]: true\n\t\t\t})}\n\t\t\trole=\"feed\"\n\t\t>\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const activityFeedStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-activity-feed {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* List variant: dividers between items */\n\t.ml-activity-feed--list ::slotted(ml-activity-feed-item:not(:last-of-type)) {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t/* Timeline variant: connector line, no dividers */\n\t.ml-activity-feed--timeline {\n\t\t--_ml-af-line-display: block;\n\t}\n\n\t.ml-activity-feed--timeline ::slotted(ml-activity-feed-item:last-of-type) {\n\t\t--_ml-af-line-display: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { activityFeedTemplate } from './activity-feed.template.js';\nimport { activityFeedStyles } from './activity-feed.styles.js';\n\ntype ActivityFeedVariant = 'list' | 'timeline';\n\n/**\n * ml-activity-feed - Container for displaying chronological user activities\n *\n * @example\n * ```html\n * <ml-activity-feed variant=\"list\">\n * <ml-activity-feed-item name=\"Jane Doe\" timestamp=\"2 hours ago\">\n * Updated the project status\n * </ml-activity-feed-item>\n * </ml-activity-feed>\n * ```\n *\n * @slot default - Activity feed items\n */\n@MelodicComponent({\n\tselector: 'ml-activity-feed',\n\ttemplate: activityFeedTemplate,\n\tstyles: activityFeedStyles,\n\tattributes: ['variant']\n})\nexport class ActivityFeedComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Feed display variant */\n\tvariant: ActivityFeedVariant = 'list';\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { ActivityFeedItemComponent } from './activity-feed-item.component.js';\n\nexport function activityFeedItemTemplate(c: ActivityFeedItemComponent) {\n\treturn html`\n\t\t<article class=\"ml-afi\">\n\t\t\t<div class=\"ml-afi__left\">\n\t\t\t\t<div class=\"ml-afi__avatar\">\n\t\t\t\t\t${when(\n\t\t\t\t\t\tc.hasAvatarSlot,\n\t\t\t\t\t\t() => html`<slot name=\"avatar\"></slot>`,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<ml-avatar\n\t\t\t\t\t\t\t\tsize=${c['avatar-size']}\n\t\t\t\t\t\t\t\tsrc=${c['avatar-src']}\n\t\t\t\t\t\t\t\tinitials=${c['avatar-initials']}\n\t\t\t\t\t\t\t></ml-avatar>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"ml-afi__connector\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"ml-afi__body\">\n\t\t\t\t<div class=\"ml-afi__header\">\n\t\t\t\t\t<div class=\"ml-afi__meta\">\n\t\t\t\t\t\t${when(!!c.name, () => html`<span class=\"ml-afi__name\">${c.name}</span>`)}\n\t\t\t\t\t\t${when(!!c.timestamp, () => html`<span class=\"ml-afi__timestamp\">${c.timestamp}</span>`)}\n\t\t\t\t\t</div>\n\t\t\t\t\t${when(\n\t\t\t\t\t\tc.indicator,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t'ml-afi__indicator': true,\n\t\t\t\t\t\t\t\t\t[`ml-afi__indicator--${c['indicator-color']}`]: true\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t${when(!!c.subtitle, () => html`<div class=\"ml-afi__subtitle\">${c.subtitle}</div>`)}\n\t\t\t\t<div class=\"ml-afi__description\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t\t${when(\n\t\t\t\t\tc.hasContentSlot,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<div class=\"ml-afi__content\">\n\t\t\t\t\t\t\t<slot name=\"content\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</article>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const activityFeedItemStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding: var(--ml-space-4) 0;\n\t}\n\n\t.ml-afi {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t/* Left column: avatar + connector */\n\t.ml-afi__left {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-afi__avatar {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t}\n\n\t.ml-afi__connector {\n\t\tflex: 1;\n\t\twidth: 2px;\n\t\tmargin-top: var(--ml-space-2);\n\t\tbackground-color: var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tdisplay: var(--_ml-af-line-display, none);\n\t}\n\n\t/* Body */\n\t.ml-afi__body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-afi__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t.ml-afi__meta {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tflex-wrap: wrap;\n\t}\n\n\t.ml-afi__name {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-afi__timestamp {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n\n\t.ml-afi__subtitle {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tmargin-top: var(--ml-space-0-5);\n\t}\n\n\t.ml-afi__description {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t\tmargin-top: var(--ml-space-1);\n\t}\n\n\t.ml-afi__description ::slotted(a) {\n\t\tcolor: var(--ml-color-primary);\n\t\ttext-decoration: none;\n\t\tfont-weight: var(--ml-font-medium);\n\t}\n\n\t.ml-afi__description ::slotted(a:hover) {\n\t\ttext-decoration: underline;\n\t}\n\n\t.ml-afi__description ::slotted(strong) {\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-afi__content {\n\t\tmargin-top: var(--ml-space-2);\n\t}\n\n\t/* Indicator dot */\n\t.ml-afi__indicator {\n\t\twidth: 8px;\n\t\theight: 8px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-afi__indicator--gray {\n\t\tbackground-color: var(--ml-color-text-tertiary);\n\t}\n\n\t.ml-afi__indicator--primary {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-afi__indicator--success {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t.ml-afi__indicator--warning {\n\t\tbackground-color: var(--ml-color-warning);\n\t}\n\n\t.ml-afi__indicator--error {\n\t\tbackground-color: var(--ml-color-error);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport { activityFeedItemTemplate } from './activity-feed-item.template.js';\nimport { activityFeedItemStyles } from './activity-feed-item.styles.js';\n\ntype IndicatorColor = 'success' | 'warning' | 'error' | 'primary' | 'gray';\n\n/**\n * ml-activity-feed-item - Individual activity entry within a feed\n *\n * @example\n * ```html\n * <ml-activity-feed-item name=\"Jane Doe\" timestamp=\"2 hours ago\" avatar-initials=\"JD\">\n * Updated the project status\n * </ml-activity-feed-item>\n * ```\n *\n * @slot default - Activity description\n * @slot avatar - Custom avatar or icon (replaces default ml-avatar)\n * @slot content - Extra content below the description\n */\n@MelodicComponent({\n\tselector: 'ml-activity-feed-item',\n\ttemplate: activityFeedItemTemplate,\n\tstyles: activityFeedItemStyles,\n\tattributes: ['name', 'timestamp', 'avatar-src', 'avatar-initials', 'avatar-size', 'subtitle', 'indicator', 'indicator-color']\n})\nexport class ActivityFeedItemComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** User display name */\n\tname = '';\n\n\t/** Timestamp text */\n\ttimestamp = '';\n\n\t/** Avatar image source */\n\t'avatar-src' = '';\n\n\t/** Avatar initials fallback */\n\t'avatar-initials' = '';\n\n\t/** Avatar size */\n\t'avatar-size': Size = 'sm';\n\n\t/** Subtitle text (e.g. @handle) */\n\tsubtitle = '';\n\n\t/** Show indicator dot */\n\tindicator = false;\n\n\t/** Indicator dot color */\n\t'indicator-color': IndicatorColor = 'gray';\n\n\t/** Check if avatar slot has content */\n\tget hasAvatarSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"avatar\"]') !== null;\n\t}\n\n\t/** Check if content slot has content */\n\tget hasContentSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"content\"]') !== null;\n\t}\n}\n","import { html, classMap, when, repeat } from '@melodicdev/core';\nimport type { TableComponent } from './table.component.js';\nimport type { TableColumn } from './table.types.js';\n\nfunction renderCell(column: TableColumn, row: Record<string, unknown>, index: number) {\n\tif (column.render) {\n\t\treturn column.render(row[column.key], row, index);\n\t}\n\treturn row[column.key] ?? '';\n}\n\nexport function tableTemplate(c: TableComponent) {\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-table': true,\n\t\t\t[`ml-table--${c.size}`]: true,\n\t\t\t'ml-table--striped': c.striped,\n\t\t\t'ml-table--hoverable': c.hoverable,\n\t\t\t'ml-table--sticky-header': c.stickyHeader,\n\t\t\t'ml-table--virtual': c.virtual\n\t\t})}>\n\t\t\t${when(!!c.tableTitle || !!c.description, () => html`\n\t\t\t\t<div class=\"ml-table__header\">\n\t\t\t\t\t<div class=\"ml-table__header-text\">\n\t\t\t\t\t\t${when(!!c.tableTitle, () => html`<h3 class=\"ml-table__title\">${c.tableTitle}</h3>`)}\n\t\t\t\t\t\t${when(!!c.description, () => html`<p class=\"ml-table__description\">${c.description}</p>`)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<slot name=\"header-actions\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-table__wrapper\">\n\t\t\t\t<table role=\"grid\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t${when(c.selectable, () => html`\n\t\t\t\t\t\t\t\t<th class=\"ml-table__check-cell\">\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-table__checkbox\"\n\t\t\t\t\t\t\t\t\t\t.checked=${c.allSelected}\n\t\t\t\t\t\t\t\t\t\t.indeterminate=${c.someSelected}\n\t\t\t\t\t\t\t\t\t\t@change=${c.handleSelectAll}\n\t\t\t\t\t\t\t\t\t\taria-label=\"Select all rows\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t${repeat(c.columns, (col: TableColumn) => col.key, (col: TableColumn) => html`\n\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t\t'ml-table__th': true,\n\t\t\t\t\t\t\t\t\t\t'ml-table__th--sortable': !!col.sortable,\n\t\t\t\t\t\t\t\t\t\t'ml-table__th--sorted': c.sortKey === col.key,\n\t\t\t\t\t\t\t\t\t\t[`ml-table__th--${col.align ?? 'left'}`]: true\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\tstyle=${col.width ? `width: ${col.width}` : ''}\n\t\t\t\t\t\t\t\t\t@click=${() => c.handleSort(col)}\n\t\t\t\t\t\t\t\t\taria-sort=${c.sortKey === col.key ? (c.sortDirection === 'asc' ? 'ascending' : 'descending') : 'none'}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"ml-table__th-content\">\n\t\t\t\t\t\t\t\t\t\t${col.label}\n\t\t\t\t\t\t\t\t\t\t${when(!!col.sortable, () => html`\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"ml-table__sort-icon\">\n\t\t\t\t\t\t\t\t\t\t\t\t${c.sortKey === col.key\n\t\t\t\t\t\t\t\t\t\t\t\t\t? (c.sortDirection === 'asc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<ml-icon icon=\"caret-up\" size=\"xs\"></ml-icon>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: html`<ml-icon icon=\"caret-down\" size=\"xs\"></ml-icon>`)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: html`<ml-icon icon=\"caret-up-down\" size=\"xs\"></ml-icon>`\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t${when(c.virtual && c.topSpacerHeight > 0, () => html`\n\t\t\t\t\t\t\t<tr class=\"ml-table__spacer\">\n\t\t\t\t\t\t\t\t<td colspan=\"${c.colCount}\" style=\"height: ${c.topSpacerHeight}px\"></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t\t${repeat(c.visibleRows, (_: Record<string, unknown>, i: number) => c.startIndex + i, (row: Record<string, unknown>, i: number) => {\n\t\t\t\t\t\t\tconst absoluteIndex = c.startIndex + i;\n\t\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t\t'ml-table__row': true,\n\t\t\t\t\t\t\t\t\t\t'ml-table__row--selected': c.isRowSelected(absoluteIndex)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t@click=${() => c.handleRowClick(row, absoluteIndex)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${when(c.selectable, () => html`\n\t\t\t\t\t\t\t\t\t\t<td class=\"ml-table__check-cell\">\n\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"ml-table__checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t.checked=${c.isRowSelected(absoluteIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t@change=${(e: Event) => c.handleSelectRow(absoluteIndex, e)}\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => e.stopPropagation()}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=${`Select row ${absoluteIndex + 1}`}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t\t${repeat(c.columns, (col: TableColumn) => col.key, (col: TableColumn) => html`\n\t\t\t\t\t\t\t\t\t\t<td class=${classMap({\n\t\t\t\t\t\t\t\t\t\t\t'ml-table__td': true,\n\t\t\t\t\t\t\t\t\t\t\t[`ml-table__td--${col.align ?? 'left'}`]: true\n\t\t\t\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t\t\t\t\t${renderCell(col, row, absoluteIndex)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t${when(c.virtual && c.bottomSpacerHeight > 0, () => html`\n\t\t\t\t\t\t\t<tr class=\"ml-table__spacer\">\n\t\t\t\t\t\t\t\t<td colspan=\"${c.colCount}\" style=\"height: ${c.bottomSpacerHeight}px\"></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\n\t\t\t<div class=${classMap({\n\t\t\t\t'ml-table__footer': true,\n\t\t\t\t'ml-table__footer--visible': c.hasFooter\n\t\t\t})}>\n\t\t\t\t<slot name=\"footer\"></slot>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tableStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-table {\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\toverflow: hidden;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* ── Header ── */\n\t.ml-table__header {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-5) var(--ml-space-6);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-table__header-text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-table__title {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-table__description {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t/* ── Table wrapper ── */\n\t.ml-table__wrapper {\n\t\toverflow-x: auto;\n\t}\n\n\ttable {\n\t\twidth: 100%;\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\t}\n\n\t/* ── Header cells ── */\n\tthead {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-table--sticky-header thead {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\t}\n\n\tthead tr {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-table__th {\n\t\tpadding: var(--ml-space-3) var(--ml-space-6);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t\ttext-align: left;\n\t\twhite-space: nowrap;\n\t\tuser-select: none;\n\t}\n\n\t.ml-table--sm .ml-table__th {\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t}\n\n\t.ml-table__th--center { text-align: center; }\n\t.ml-table__th--right { text-align: right; }\n\n\t.ml-table__th--sortable {\n\t\tcursor: pointer;\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-table__th--sortable:hover {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-table__th--sorted {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-table__th-content {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-table__sort-icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-table__th--sorted .ml-table__sort-icon {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t/* ── Body rows ── */\n\t.ml-table__row {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-table__row:last-child {\n\t\tborder-bottom: none;\n\t}\n\n\t.ml-table--hoverable .ml-table__row:hover {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-table__row--selected {\n\t\tbackground-color: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.04));\n\t}\n\n\t.ml-table--hoverable .ml-table__row--selected:hover {\n\t\tbackground-color: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.06));\n\t}\n\n\t/* Striped */\n\t.ml-table--striped .ml-table__row:nth-child(even) {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-table--striped.ml-table--hoverable .ml-table__row:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t/* ── Body cells ── */\n\t.ml-table__td {\n\t\tpadding: var(--ml-space-4) var(--ml-space-6);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text);\n\t\tvertical-align: middle;\n\t}\n\n\t.ml-table--sm .ml-table__td {\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-table__td--center { text-align: center; }\n\t.ml-table__td--right { text-align: right; }\n\n\t/* ── Checkbox column ── */\n\t.ml-table__check-cell {\n\t\twidth: 2.5rem;\n\t\tpadding: var(--ml-space-3) var(--ml-space-3) var(--ml-space-3) var(--ml-space-6);\n\t\tvertical-align: middle;\n\t\ttext-align: center;\n\t}\n\n\t.ml-table--sm .ml-table__check-cell {\n\t\tpadding: var(--ml-space-2) var(--ml-space-2) var(--ml-space-2) var(--ml-space-4);\n\t}\n\n\t.ml-table__checkbox {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\taccent-color: var(--ml-color-primary);\n\t\tcursor: pointer;\n\t\tmargin: 0;\n\t\tvertical-align: middle;\n\t}\n\n\t/* ── Virtual scroll ── */\n\t/* Host fills parent container so height: 100% resolves correctly */\n\t:host([virtual]) {\n\t\theight: 100%;\n\t}\n\n\t/* Flex column so the wrapper can take remaining space after header/footer */\n\t.ml-table--virtual {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t}\n\n\t.ml-table--virtual .ml-table__wrapper {\n\t\tflex: 1;\n\t\tmin-height: 0; /* lets flex child shrink below content height */\n\t\toverflow-y: auto;\n\t}\n\n\t.ml-table--virtual .ml-table__td {\n\t\theight: 44px;\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.ml-table--virtual.ml-table--sm .ml-table__td {\n\t\theight: 36px;\n\t}\n\n\t.ml-table__spacer td {\n\t\tpadding: 0;\n\t\tborder: none;\n\t}\n\n\t/* ── Footer ── */\n\t.ml-table__footer {\n\t\tdisplay: none;\n\t}\n\n\t.ml-table__footer--visible {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tpadding: var(--ml-space-3) var(--ml-space-6);\n\t\tborder-top: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-table--sm .ml-table__footer--visible {\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender, OnPropertyChange } from '@melodicdev/core';\nimport type { TableColumn, SortDirection } from './table.types.js';\nimport { tableTemplate } from './table.template.js';\nimport { tableStyles } from './table.styles.js';\nimport { VirtualScroller } from '../../../utils/virtual-scroll/index.js';\n\n/**\n * ml-table - Data table with sorting, selection, and custom cell rendering\n *\n * @example\n * ```html\n * <ml-table .columns=${columns} .rows=${rows} striped hoverable></ml-table>\n * ```\n *\n * @fires ml:sort - Emitted when a sortable column header is clicked. Detail: { key, direction }\n * @fires ml:select - Emitted when row selection changes. Detail: { selectedRows, allSelected }\n * @fires ml:row-click - Emitted when a row is clicked. Detail: { row, index }\n *\n * @slot footer - Content for the table footer area (e.g. pagination)\n * @slot header-actions - Actions placed in the header next to title/description\n */\n@MelodicComponent({\n\tselector: 'ml-table',\n\ttemplate: tableTemplate,\n\tstyles: tableStyles,\n\tattributes: ['selectable', 'striped', 'hoverable', 'size', 'table-title', 'description', 'sticky-header', 'virtual']\n})\nexport class TableComponent implements IElementRef, OnCreate, OnDestroy, OnRender, OnPropertyChange {\n\telementRef!: HTMLElement;\n\n\t/** Whether the footer slot has content */\n\thasFooter = false;\n\n\t/** Whether the header-actions slot has content */\n\thasHeaderActions = false;\n\n\t/** Enable row selection via checkboxes */\n\tselectable = false;\n\n\t/** Alternating row backgrounds */\n\tstriped = false;\n\n\t/** Highlight rows on hover */\n\thoverable = true;\n\n\t/** Sticky table header */\n\tstickyHeader = false;\n\n\t/** Table size */\n\tsize: 'sm' | 'md' = 'md';\n\n\t/** Table header title */\n\ttableTitle = '';\n\n\t/** Table header description */\n\tdescription = '';\n\n\t/** Enable virtual scrolling (renders only visible rows) */\n\tvirtual = false;\n\n\t/** Column definitions */\n\tcolumns: TableColumn[] = [];\n\n\t/** Row data */\n\trows: Record<string, unknown>[] = [];\n\n\t/** Currently sorted column key */\n\tsortKey = '';\n\n\t/** Current sort direction */\n\tsortDirection: SortDirection = 'asc';\n\n\t/** Indices of selected rows */\n\tselectedIndices: number[] = [];\n\n\t// ── Virtual scroll state ─────────────────────────────────────────────────────\n\n\tstartIndex = 0;\n\tendIndex = 50;\n\n\t// ── Private ──────────────────────────────────────────────────────────────────\n\n\tprivate _scroller = new VirtualScroller();\n\tprivate _viewport: HTMLElement | null = null;\n\n\t// ── Row height by size ────────────────────────────────────────────────────────\n\n\tget rowHeight(): number {\n\t\treturn this.size === 'sm' ? 36 : 44;\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────────\n\n\tonPropertyChange(name: string, _oldVal: unknown, _newVal: unknown): void {\n\t\tif (name === 'rows' || name === 'columns') {\n\t\t\tthis._scroller.invalidate();\n\t\t}\n\t}\n\n\tonCreate(): void {\n\t\tconst shadow = this.elementRef.shadowRoot;\n\t\tif (!shadow) return;\n\t\tshadow.querySelectorAll('slot').forEach(slot => {\n\t\t\tslot.addEventListener('slotchange', () => {\n\t\t\t\tconst name = slot.getAttribute('name');\n\t\t\t\tif (name === 'footer') {\n\t\t\t\t\tthis.hasFooter = slot.assignedNodes().length > 0;\n\t\t\t\t} else if (name === 'header-actions') {\n\t\t\t\t\tthis.hasHeaderActions = slot.assignedNodes().length > 0;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._attachScroller();\n\t}\n\n\tonRender(): void {\n\t\tthis._attachScroller();\n\n\t\t// Compute initial end index when viewport height not yet known\n\t\tif (this.virtual && this._viewport && this._viewport.clientHeight === 0 && this.sortedRows.length > 0) {\n\t\t\tconst approxEnd = Math.min(this.sortedRows.length, Math.ceil(600 / this.rowHeight) + 6);\n\t\t\tif (approxEnd !== this.endIndex) {\n\t\t\t\tthis.endIndex = approxEnd;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.virtual) {\n\t\t\tconst total = this.sortedRows.length;\n\t\t\tif (this.endIndex !== total) this.endIndex = total;\n\t\t}\n\t}\n\n\tonDestroy(): void {\n\t\tthis._scroller.detach();\n\t\tthis._viewport = null;\n\t}\n\n\t// ── Private helpers ───────────────────────────────────────────────────────────\n\n\tprivate _attachScroller(): void {\n\t\tif (this._viewport) return; // already attached\n\t\tconst shadow = this.elementRef.shadowRoot;\n\t\tif (!shadow) return;\n\t\tthis._viewport = shadow.querySelector('.ml-table__wrapper') as HTMLElement | null;\n\t\tif (!this._viewport) return;\n\t\tthis._scroller.attach(this._viewport, {\n\t\t\trowHeight: () => this.rowHeight,\n\t\t\titemCount: () => this.sortedRows.length,\n\t\t\tonUpdate: (start, end) => { this.startIndex = start; this.endIndex = end; },\n\t\t\tenabled: () => this.virtual,\n\t\t});\n\t}\n\n\t// ── Data ──────────────────────────────────────────────────────────────────────\n\n\t/** Rows sorted by current sort key/direction */\n\tget sortedRows(): Record<string, unknown>[] {\n\t\tif (!this.sortKey) return this.rows;\n\t\tconst key = this.sortKey;\n\t\tconst dir = this.sortDirection === 'asc' ? 1 : -1;\n\t\treturn [...this.rows].sort((a, b) => {\n\t\t\tconst aVal = a[key];\n\t\t\tconst bVal = b[key];\n\t\t\tif (aVal === undefined || aVal === null) {\n\t\t\t\treturn (bVal === undefined || bVal === null) ? 0 : 1;\n\t\t\t}\n\t\t\tif (bVal === undefined || bVal === null) return -1;\n\t\t\tif (typeof aVal === 'number' && typeof bVal === 'number') return (aVal - bVal) * dir;\n\t\t\treturn String(aVal).localeCompare(String(bVal)) * dir;\n\t\t});\n\t}\n\n\tget visibleRows(): Record<string, unknown>[] {\n\t\tif (!this.virtual) return this.sortedRows;\n\t\treturn this.sortedRows.slice(this.startIndex, this.endIndex);\n\t}\n\n\tget topSpacerHeight(): number {\n\t\treturn this.virtual ? this.startIndex * this.rowHeight : 0;\n\t}\n\n\tget bottomSpacerHeight(): number {\n\t\tif (!this.virtual) return 0;\n\t\treturn Math.max(0, (this.sortedRows.length - this.endIndex) * this.rowHeight);\n\t}\n\n\tget colCount(): number {\n\t\treturn this.columns.length + (this.selectable ? 1 : 0);\n\t}\n\n\tget allSelected(): boolean {\n\t\treturn this.rows.length > 0 && this.selectedIndices.length === this.rows.length;\n\t}\n\n\tget someSelected(): boolean {\n\t\treturn this.selectedIndices.length > 0 && !this.allSelected;\n\t}\n\n\tisRowSelected = (index: number): boolean => {\n\t\treturn this.selectedIndices.includes(index);\n\t};\n\n\t// ── Event handlers ────────────────────────────────────────────────────────────\n\n\thandleSort = (column: TableColumn): void => {\n\t\tif (!column.sortable) return;\n\t\tif (this.sortKey === column.key) {\n\t\t\tthis.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n\t\t} else {\n\t\t\tthis.sortKey = column.key;\n\t\t\tthis.sortDirection = 'asc';\n\t\t}\n\t\tthis.selectedIndices = [];\n\t\tthis._scroller.invalidate();\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:sort', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { key: this.sortKey, direction: this.sortDirection }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleSelectAll = (): void => {\n\t\tif (this.allSelected) {\n\t\t\tthis.selectedIndices = [];\n\t\t} else {\n\t\t\tthis.selectedIndices = this.rows.map((_, i) => i);\n\t\t}\n\t\tthis.emitSelect();\n\t};\n\n\thandleSelectRow = (index: number, event: Event): void => {\n\t\tevent.stopPropagation();\n\t\tif (this.selectedIndices.includes(index)) {\n\t\t\tthis.selectedIndices = this.selectedIndices.filter(i => i !== index);\n\t\t} else {\n\t\t\tthis.selectedIndices = [...this.selectedIndices, index];\n\t\t}\n\t\tthis.emitSelect();\n\t};\n\n\thandleRowClick = (row: Record<string, unknown>, index: number): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:row-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { row, index }\n\t\t\t})\n\t\t);\n\t};\n\n\tprivate emitSelect(): void {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { selectedRows: this.selectedIndices, allSelected: this.allSelected }\n\t\t\t})\n\t\t);\n\t}\n}\n","import { html, classMap, when, repeat } from '@melodicdev/core';\nimport type { DataGridComponent } from './data-grid.component.js';\nimport type { DataGridColumn } from './data-grid.types.js';\n\nfunction renderCell(col: DataGridColumn, row: Record<string, unknown>, index: number) {\n\tif (col.render) return col.render(row[col.key], row, index);\n\tconst val = row[col.key];\n\treturn val == null ? '' : val;\n}\n\nexport function dataGridTemplate(c: DataGridComponent) {\n\tconst gtc = c.gridTemplateColumns;\n\tconst totalW = c.totalGridWidth;\n\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-data-grid': true,\n\t\t\t[`ml-data-grid--${c.size}`]: true,\n\t\t\t'ml-data-grid--striped': c.striped,\n\t\t\t'ml-data-grid--hoverable': c.hoverable,\n\t\t\t'ml-data-grid--selectable': c.selectable,\n\t\t\t'ml-data-grid--virtual': c.virtual\n\t\t})}>\n\n\t\t\t${when(!!c.gridTitle || !!c.description, () => html`\n\t\t\t\t<div class=\"ml-data-grid__toolbar\">\n\t\t\t\t\t<div class=\"ml-data-grid__toolbar-text\">\n\t\t\t\t\t\t${when(!!c.gridTitle, () => html`<h3 class=\"ml-data-grid__title\">${c.gridTitle}</h3>`)}\n\t\t\t\t\t\t${when(!!c.description, () => html`<p class=\"ml-data-grid__description\">${c.description}</p>`)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<slot name=\"toolbar-actions\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-data-grid__viewport\">\n\t\t\t\t<div class=\"ml-data-grid__inner\" style=\"min-width: ${totalW}px\">\n\n\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t<div class=\"ml-data-grid__header-row\" style=\"grid-template-columns: ${gtc}\">\n\t\t\t\t\t\t${when(c.selectable, () => html`\n\t\t\t\t\t\t\t<div class=\"ml-data-grid__th ml-data-grid__check-cell\">\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\tclass=\"ml-data-grid__checkbox\"\n\t\t\t\t\t\t\t\t\t.checked=${c.allSelected}\n\t\t\t\t\t\t\t\t\t.indeterminate=${c.someSelected}\n\t\t\t\t\t\t\t\t\t@change=${c.handleSelectAll}\n\t\t\t\t\t\t\t\t\taria-label=\"Select all rows\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t\t${repeat(c.orderedColumns, (col: DataGridColumn) => col.key, (col: DataGridColumn) => html`\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th': true,\n\t\t\t\t\t\t\t\t\t[`ml-data-grid__th--${col.align ?? 'left'}`]: true,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--sortable': !!col.sortable,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--sorted': c.sortKey === col.key,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--pinned-left': col.pinned === 'left',\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--pinned-right': col.pinned === 'right',\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--drag-over': c.dragOverKey === col.key,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--dragging': c.draggingKey === col.key,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__th--resizing': c.resizingKey === col.key\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\tstyle=${col.pinned === 'left' ? `left: ${c.getPinnedLeftOffset(col.key)}px` : ''}\n\t\t\t\t\t\t\t\tdraggable=${col.reorderable !== false ? 'true' : 'false'}\n\t\t\t\t\t\t\t\t@dragstart=${(e: DragEvent) => c.handleDragStart(col.key, e)}\n\t\t\t\t\t\t\t\t@dragover=${(e: DragEvent) => c.handleDragOver(col.key, e)}\n\t\t\t\t\t\t\t\t@dragend=${c.handleDragEnd}\n\t\t\t\t\t\t\t\t@drop=${() => c.handleDrop(col.key)}\n\t\t\t\t\t\t\t\t@click=${() => c.handleSort(col)}\n\t\t\t\t\t\t\t\taria-sort=${c.sortKey === col.key\n\t\t\t\t\t\t\t\t\t? (c.sortDirection === 'asc' ? 'ascending' : 'descending')\n\t\t\t\t\t\t\t\t\t: 'none'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class=\"ml-data-grid__th-content\">\n\t\t\t\t\t\t\t\t\t${col.label}\n\t\t\t\t\t\t\t\t\t${when(!!col.sortable, () => html`\n\t\t\t\t\t\t\t\t\t\t<span class=\"ml-data-grid__sort-icon\">\n\t\t\t\t\t\t\t\t\t\t\t${c.sortKey === col.key\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.sortDirection === 'asc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<ml-icon icon=\"caret-up\" size=\"xs\"></ml-icon>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: html`<ml-icon icon=\"caret-down\" size=\"xs\"></ml-icon>`)\n\t\t\t\t\t\t\t\t\t\t\t\t: html`<ml-icon icon=\"caret-up-down\" size=\"xs\"></ml-icon>`\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t${when(col.resizable !== false, () => html`\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-data-grid__resize-handle\"\n\t\t\t\t\t\t\t\t\t\t@pointerdown=${(e: PointerEvent) => c.handleResizeStart(col.key, e)}\n\t\t\t\t\t\t\t\t\t\t@pointermove=${(e: PointerEvent) => c.handleResizeMove(col.key, e)}\n\t\t\t\t\t\t\t\t\t\t@pointerup=${c.handleResizeEnd}\n\t\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Filter row -->\n\t\t\t\t\t${when(c.showFilterRow, () => html`\n\t\t\t\t\t\t<div class=\"ml-data-grid__filter-row\" style=\"grid-template-columns: ${gtc}\">\n\t\t\t\t\t\t\t${when(c.selectable, () => html`\n\t\t\t\t\t\t\t\t<div class=\"ml-data-grid__filter-cell ml-data-grid__check-cell\"></div>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t${repeat(c.orderedColumns, (col: DataGridColumn) => col.key, (col: DataGridColumn) => html`\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t\t'ml-data-grid__filter-cell': true,\n\t\t\t\t\t\t\t\t\t\t'ml-data-grid__filter-cell--pinned-left': col.pinned === 'left'\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\tstyle=${col.pinned === 'left' ? `left: ${c.getPinnedLeftOffset(col.key)}px` : ''}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${when(!!col.filterable, () => html`\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"ml-data-grid__filter-input\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Filter...\"\n\t\t\t\t\t\t\t\t\t\t\t.value=${c.filters[col.key] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t@input=${(e: Event) => c.handleFilterInput(col.key, e)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<!-- Virtual top spacer -->\n\t\t\t\t\t${when(c.virtual && c.topSpacerHeight > 0, () => html`\n\t\t\t\t\t\t<div class=\"ml-data-grid__top-spacer\" style=\"height: ${c.topSpacerHeight}px\"></div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<!-- Data rows -->\n\t\t\t\t\t${repeat(\n\t\t\t\t\t\tc.visibleRows,\n\t\t\t\t\t\t(_: Record<string, unknown>, i: number) => c.startIndex + i,\n\t\t\t\t\t\t(row: Record<string, unknown>, i: number) => html`\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t'ml-data-grid__row': true,\n\t\t\t\t\t\t\t\t\t'ml-data-grid__row--selected': c.isRowSelected(c.startIndex + i),\n\t\t\t\t\t\t\t\t\t'ml-data-grid__row--even': (c.startIndex + i) % 2 === 1\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\tstyle=\"grid-template-columns: ${gtc}\"\n\t\t\t\t\t\t\t\t@click=${() => c.handleRowClick(row, c.startIndex + i)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${when(c.selectable, () => html`\n\t\t\t\t\t\t\t\t\t<div class=\"ml-data-grid__td ml-data-grid__check-cell\">\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"ml-data-grid__checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t.checked=${c.isRowSelected(c.startIndex + i)}\n\t\t\t\t\t\t\t\t\t\t\t@change=${(e: Event) => c.handleSelectRow(c.startIndex + i, e)}\n\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => e.stopPropagation()}\n\t\t\t\t\t\t\t\t\t\t\taria-label=${`Select row ${c.startIndex + i + 1}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t${repeat(c.orderedColumns, (col: DataGridColumn) => col.key, (col: DataGridColumn) => html`\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t\t\t'ml-data-grid__td': true,\n\t\t\t\t\t\t\t\t\t\t\t[`ml-data-grid__td--${col.align ?? 'left'}`]: true,\n\t\t\t\t\t\t\t\t\t\t\t'ml-data-grid__td--pinned-left': col.pinned === 'left',\n\t\t\t\t\t\t\t\t\t\t\t'ml-data-grid__td--pinned-right': col.pinned === 'right'\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\tstyle=${col.pinned === 'left' ? `left: ${c.getPinnedLeftOffset(col.key)}px` : ''}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${renderCell(col, row, c.startIndex + i)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\n\t\t\t\t\t<!-- Virtual bottom spacer -->\n\t\t\t\t\t${when(c.virtual && c.bottomSpacerHeight > 0, () => html`\n\t\t\t\t\t\t<div class=\"ml-data-grid__bottom-spacer\" style=\"height: ${c.bottomSpacerHeight}px\"></div>\n\t\t\t\t\t`)}\n\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Footer / Pagination -->\n\t\t\t<div class=\"ml-data-grid__footer\">\n\t\t\t\t<span class=\"ml-data-grid__footer-count\">\n\t\t\t\t\t${when(\n\t\t\t\t\t\tc.selectable && c.selectedIndices.length > 0,\n\t\t\t\t\t\t() => html`${c.selectedIndices.length} of ${c.totalRows} rows selected`,\n\t\t\t\t\t\t() => html`${c.totalRows} rows`\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t<div class=\"ml-data-grid__footer-pagination\">\n\t\t\t\t\t${when(c.totalPages > 1, () => html`\n\t\t\t\t\t\t<span class=\"ml-data-grid__page-info\">Page ${c.currentPage} of ${c.totalPages}</span>\n\t\t\t\t\t\t<div class=\"ml-data-grid__page-controls\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"ml-data-grid__page-btn\"\n\t\t\t\t\t\t\t\t.disabled=${c.currentPage === 1}\n\t\t\t\t\t\t\t\t@click=${() => c.goToPage(1)}\n\t\t\t\t\t\t\t\taria-label=\"First page\"\n\t\t\t\t\t\t\t><ml-icon icon=\"caret-double-left\" size=\"xs\"></ml-icon></button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"ml-data-grid__page-btn\"\n\t\t\t\t\t\t\t\t.disabled=${c.currentPage === 1}\n\t\t\t\t\t\t\t\t@click=${() => c.goToPage(c.currentPage - 1)}\n\t\t\t\t\t\t\t\taria-label=\"Previous page\"\n\t\t\t\t\t\t\t><ml-icon icon=\"caret-left\" size=\"xs\"></ml-icon></button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"ml-data-grid__page-btn\"\n\t\t\t\t\t\t\t\t.disabled=${c.currentPage === c.totalPages}\n\t\t\t\t\t\t\t\t@click=${() => c.goToPage(c.currentPage + 1)}\n\t\t\t\t\t\t\t\taria-label=\"Next page\"\n\t\t\t\t\t\t\t><ml-icon icon=\"caret-right\" size=\"xs\"></ml-icon></button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"ml-data-grid__page-btn\"\n\t\t\t\t\t\t\t\t.disabled=${c.currentPage === c.totalPages}\n\t\t\t\t\t\t\t\t@click=${() => c.goToPage(c.totalPages)}\n\t\t\t\t\t\t\t\taria-label=\"Last page\"\n\t\t\t\t\t\t\t><ml-icon icon=\"caret-double-right\" size=\"xs\"></ml-icon></button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dataGridStyles = () => css`\n\t:host {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* ── Root container ── */\n\t.ml-data-grid {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\toverflow: hidden;\n\t}\n\n\t/* ── Toolbar ── */\n\t.ml-data-grid__toolbar {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-5) var(--ml-space-6);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-data-grid__toolbar-text {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-data-grid__title {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-data-grid__description {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t/* ── Scrollable viewport — single scroll container ── */\n\t.ml-data-grid__viewport {\n\t\tflex: 1;\n\t\toverflow: auto;\n\t\tposition: relative;\n\t\tmin-height: 0;\n\t}\n\n\t.ml-data-grid__viewport::-webkit-scrollbar {\n\t\twidth: 6px;\n\t\theight: 6px;\n\t}\n\n\t.ml-data-grid__viewport::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\n\t.ml-data-grid__viewport::-webkit-scrollbar-thumb {\n\t\tbackground: var(--ml-color-border);\n\t\tborder-radius: 3px;\n\t}\n\n\t.ml-data-grid__viewport::-webkit-scrollbar-thumb:hover {\n\t\tbackground: var(--ml-color-text-muted);\n\t}\n\n\t.ml-data-grid__viewport::-webkit-scrollbar-corner {\n\t\tbackground: transparent;\n\t}\n\n\t/* ── Inner wrapper — forces horizontal scroll via min-width ── */\n\t.ml-data-grid__inner {\n\t\tposition: relative;\n\t}\n\n\t/* ── Header row — sticky at top ── */\n\t.ml-data-grid__header-row {\n\t\tdisplay: grid;\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 2;\n\t\tbackground: var(--ml-color-surface-sunken);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t/* ── Filter row — sticky below header ── */\n\t.ml-data-grid__filter-row {\n\t\tdisplay: grid;\n\t\tposition: sticky;\n\t\ttop: var(--ml-grid-header-h, 40px);\n\t\tz-index: 2;\n\t\tbackground: var(--ml-color-surface);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tpadding: var(--ml-space-2) 0;\n\t}\n\n\t/* ── Header cells ── */\n\t.ml-data-grid__th {\n\t\tposition: relative;\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tuser-select: none;\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__th {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: calc(var(--ml-text-xs) * 0.9);\n\t}\n\n\t.ml-data-grid__th--left { text-align: left; }\n\t.ml-data-grid__th--center { text-align: center; }\n\t.ml-data-grid__th--right { text-align: right; }\n\n\t.ml-data-grid__th--sortable {\n\t\tcursor: pointer;\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-data-grid__th--sortable:hover {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-data-grid__th--sorted {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-data-grid__th--drag-over {\n\t\tbackground: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.08));\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-data-grid__th--dragging {\n\t\topacity: 0.5;\n\t}\n\n\t.ml-data-grid__th-content {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\n\t.ml-data-grid__sort-icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-data-grid__th--sorted .ml-data-grid__sort-icon {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t/* ── Resize handle ── */\n\t.ml-data-grid__resize-handle {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\twidth: 4px;\n\t\tcursor: col-resize;\n\t\tbackground: transparent;\n\t\ttransition: background var(--ml-duration-150);\n\t\tz-index: 1;\n\t}\n\n\t.ml-data-grid__resize-handle:hover,\n\t.ml-data-grid__th--resizing .ml-data-grid__resize-handle {\n\t\tbackground: var(--ml-color-primary);\n\t}\n\n\t/* ── Filter cells ── */\n\t/* All cells are position: relative so they're \"positioned\" within the */\n\t/* filter row's stacking context — mirrors .ml-data-grid__th behaviour. */\n\t.ml-data-grid__filter-cell {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: 0 var(--ml-space-2);\n\t\tbackground: var(--ml-color-surface);\n\t\tposition: relative;\n\t}\n\n\t.ml-data-grid__filter-cell--pinned-left {\n\t\tposition: sticky;\n\t\tz-index: 3;\n\t\tbackground: var(--ml-color-surface);\n\t}\n\n\t.ml-data-grid__filter-input {\n\t\twidth: 100%;\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-2);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-family: var(--ml-font-sans);\n\t\tcolor: var(--ml-color-text);\n\t\tbackground: var(--ml-color-surface-sunken);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-sm);\n\t\toutline: none;\n\t\ttransition: border-color var(--ml-duration-150);\n\t}\n\n\t.ml-data-grid__filter-input::placeholder {\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-data-grid__filter-input:focus {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbox-shadow: 0 0 0 2px var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.12));\n\t}\n\n\t/* ── Virtual scroll spacers ── */\n\t.ml-data-grid__top-spacer,\n\t.ml-data-grid__bottom-spacer {\n\t\tdisplay: block;\n\t}\n\n\t/* ── Data rows ── */\n\t.ml-data-grid__row {\n\t\tdisplay: grid;\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t\tcursor: default;\n\t}\n\n\t.ml-data-grid__row:last-child {\n\t\tborder-bottom: none;\n\t}\n\n\t.ml-data-grid--hoverable .ml-data-grid__row:hover {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid__row--selected {\n\t\tbackground-color: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.04));\n\t}\n\n\t.ml-data-grid--hoverable .ml-data-grid__row--selected:hover {\n\t\tbackground-color: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.07));\n\t}\n\n\t.ml-data-grid--striped .ml-data-grid__row--even {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid--striped.ml-data-grid--hoverable .ml-data-grid__row--even:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t/* ── Data cells ── */\n\t.ml-data-grid__td {\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text);\n\t\tvertical-align: middle;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tbackground: inherit;\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__td {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-data-grid__td--left { text-align: left; }\n\t.ml-data-grid__td--center { text-align: center; }\n\t.ml-data-grid__td--right { text-align: right; }\n\n\t/* ── Checkbox column ── */\n\t.ml-data-grid__check-cell {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: var(--ml-space-3);\n\t\tposition: sticky;\n\t\tleft: 0;\n\t\tz-index: 1;\n\t\tbackground: var(--ml-color-surface);\n\t}\n\n\t.ml-data-grid__header-row .ml-data-grid__check-cell {\n\t\tz-index: 3;\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid__filter-row .ml-data-grid__check-cell {\n\t\tz-index: 3;\n\t\tbackground: var(--ml-color-surface);\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__check-cell {\n\t\tpadding: var(--ml-space-2);\n\t}\n\n\t.ml-data-grid__checkbox {\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\taccent-color: var(--ml-color-primary);\n\t\tcursor: pointer;\n\t\tmargin: 0;\n\t\tflex-shrink: 0;\n\t}\n\n\t/* ── Pinned columns ── */\n\t.ml-data-grid__th--pinned-left,\n\t.ml-data-grid__td--pinned-left {\n\t\tposition: sticky;\n\t\tz-index: 1;\n\t\tbackground: var(--ml-color-surface);\n\t}\n\n\t.ml-data-grid__header-row .ml-data-grid__th--pinned-left {\n\t\tz-index: 3;\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t/* Pinned left shadow */\n\t.ml-data-grid__th--pinned-left::after,\n\t.ml-data-grid__td--pinned-left::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: -4px;\n\t\tbottom: 0;\n\t\twidth: 4px;\n\t\tbackground: linear-gradient(to right, rgba(0, 0, 0, 0.06), transparent);\n\t\tpointer-events: none;\n\t}\n\n\t.ml-data-grid__th--pinned-right,\n\t.ml-data-grid__td--pinned-right {\n\t\tposition: sticky;\n\t\tright: 0;\n\t\tz-index: 1;\n\t\tbackground: var(--ml-color-surface);\n\t}\n\n\t.ml-data-grid__header-row .ml-data-grid__th--pinned-right {\n\t\tz-index: 3;\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t/* Pinned right shadow */\n\t.ml-data-grid__th--pinned-right::before,\n\t.ml-data-grid__td--pinned-right::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: -4px;\n\t\tbottom: 0;\n\t\twidth: 4px;\n\t\tbackground: linear-gradient(to left, rgba(0, 0, 0, 0.06), transparent);\n\t\tpointer-events: none;\n\t}\n\n\t/* Row-state backgrounds for pinned + check cells */\n\t.ml-data-grid--striped .ml-data-grid__row--even .ml-data-grid__td--pinned-left,\n\t.ml-data-grid--striped .ml-data-grid__row--even .ml-data-grid__td--pinned-right,\n\t.ml-data-grid--striped .ml-data-grid__row--even .ml-data-grid__check-cell {\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid--hoverable .ml-data-grid__row:hover .ml-data-grid__td--pinned-left,\n\t.ml-data-grid--hoverable .ml-data-grid__row:hover .ml-data-grid__td--pinned-right,\n\t.ml-data-grid--hoverable .ml-data-grid__row:hover .ml-data-grid__check-cell {\n\t\tbackground: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-data-grid__row--selected .ml-data-grid__td--pinned-left,\n\t.ml-data-grid__row--selected .ml-data-grid__td--pinned-right,\n\t.ml-data-grid__row--selected .ml-data-grid__check-cell {\n\t\tbackground: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.04));\n\t}\n\n\t.ml-data-grid--hoverable .ml-data-grid__row--selected:hover .ml-data-grid__td--pinned-left,\n\t.ml-data-grid--hoverable .ml-data-grid__row--selected:hover .ml-data-grid__td--pinned-right,\n\t.ml-data-grid--hoverable .ml-data-grid__row--selected:hover .ml-data-grid__check-cell {\n\t\tbackground: var(--ml-color-primary-subtle, rgba(99, 102, 241, 0.07));\n\t}\n\n\t.ml-data-grid--striped.ml-data-grid--hoverable .ml-data-grid__row--even:hover .ml-data-grid__td--pinned-left,\n\t.ml-data-grid--striped.ml-data-grid--hoverable .ml-data-grid__row--even:hover .ml-data-grid__td--pinned-right,\n\t.ml-data-grid--striped.ml-data-grid--hoverable .ml-data-grid__row--even:hover .ml-data-grid__check-cell {\n\t\tbackground: var(--ml-color-surface-raised);\n\t}\n\n\t/* ── Footer / Pagination ── */\n\t.ml-data-grid__footer {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-3) var(--ml-space-6);\n\t\tborder-top: var(--ml-border) solid var(--ml-color-border);\n\t\tbackground: var(--ml-color-surface);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__footer {\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t}\n\n\t.ml-data-grid__footer-count {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__footer-count {\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-data-grid__footer-pagination {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-data-grid__page-info {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\twhite-space: nowrap;\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__page-info {\n\t\tfont-size: var(--ml-text-xs);\n\t}\n\n\t.ml-data-grid__page-controls {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-data-grid__page-btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tpadding: 0;\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150),\n\t\t\tcolor var(--ml-duration-150),\n\t\t\tborder-color var(--ml-duration-150);\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t.ml-data-grid--sm .ml-data-grid__page-btn {\n\t\twidth: 1.75rem;\n\t\theight: 1.75rem;\n\t}\n\n\t.ml-data-grid__page-btn:hover:not(:disabled) {\n\t\tbackground: var(--ml-color-surface-sunken);\n\t\tcolor: var(--ml-color-text);\n\t\tborder-color: var(--ml-color-border-strong);\n\t}\n\n\t.ml-data-grid__page-btn:disabled {\n\t\topacity: 0.4;\n\t\tcursor: not-allowed;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender, OnPropertyChange } from '@melodicdev/core';\nimport type { DataGridColumn, SortDirection } from './data-grid.types.js';\nimport { dataGridTemplate } from './data-grid.template.js';\nimport { dataGridStyles } from './data-grid.styles.js';\nimport { VirtualScroller } from '../../../utils/virtual-scroll/index.js';\n\n/**\n * ml-data-grid — Full-featured data grid with virtual scrolling, sorting, filtering,\n * selection, column resizing, column reordering, pinned columns, and pagination.\n *\n * @example\n * ```html\n * <ml-data-grid\n * .columns=${columns}\n * .rows=${rows}\n * selectable\n * virtual\n * show-filter-row\n * grid-title=\"Users\"\n * page-size=\"50\"\n * ></ml-data-grid>\n * ```\n *\n * @fires ml:sort - { key, direction }\n * @fires ml:filter - { filters: Record<string, string> }\n * @fires ml:select - { selectedRows: number[], allSelected: boolean }\n * @fires ml:row-click - { row, index }\n * @fires ml:column-resize - { key, width }\n * @fires ml:column-reorder - { order: string[] }\n * @fires ml:page-change - { page, pageSize }\n *\n * @slot toolbar-actions — Actions placed in the toolbar next to title/description\n */\n@MelodicComponent({\n\tselector: 'ml-data-grid',\n\ttemplate: dataGridTemplate,\n\tstyles: dataGridStyles,\n\tattributes: [\n\t\t'selectable',\n\t\t'striped',\n\t\t'hoverable',\n\t\t'size',\n\t\t'grid-title',\n\t\t'description',\n\t\t'server-side',\n\t\t'page-size',\n\t\t'virtual',\n\t\t'show-filter-row'\n\t]\n})\nexport class DataGridComponent implements IElementRef, OnCreate, OnDestroy, OnRender, OnPropertyChange {\n\telementRef!: HTMLElement;\n\n\t// ── Attributes ───────────────────────────────────────────────────────────────\n\n\t/** Enable row selection via checkboxes */\n\tselectable = false;\n\n\t/** Alternating row backgrounds */\n\tstriped = false;\n\n\t/** Highlight rows on hover */\n\thoverable = true;\n\n\t/** Grid size variant */\n\tsize: 'sm' | 'md' = 'md';\n\n\t/** Optional grid title shown in toolbar */\n\tgridTitle = '';\n\n\t/** Optional grid description shown in toolbar */\n\tdescription = '';\n\n\t/** When true, the grid renders rows as-is without sorting/filtering/pagination */\n\tserverSide = false;\n\n\t/** Number of rows per page */\n\tpageSize = 50;\n\n\t/** Enable virtual scrolling (renders only visible rows) */\n\tvirtual = true;\n\n\t/** Show per-column filter inputs below the header row */\n\tshowFilterRow = false;\n\n\t// ── Properties ───────────────────────────────────────────────────────────────\n\n\t/** Column definitions */\n\tcolumns: DataGridColumn[] = [];\n\n\t/** Row data */\n\trows: Record<string, unknown>[] = [];\n\n\t// ── Sort state ───────────────────────────────────────────────────────────────\n\n\tsortKey = '';\n\tsortDirection: SortDirection = 'asc';\n\n\t// ── Filter state ─────────────────────────────────────────────────────────────\n\n\tfilters: Record<string, string> = {};\n\n\t// ── Selection state ──────────────────────────────────────────────────────────\n\n\tselectedIndices: number[] = [];\n\n\t// ── Pagination state ─────────────────────────────────────────────────────────\n\n\tcurrentPage = 1;\n\n\t// ── Virtual scroll state (reactive — no _ prefix) ────────────────────────────\n\n\tstartIndex = 0;\n\tendIndex = 50;\n\n\t// ── Column sizing / order (reactive — no _ prefix) ───────────────────────────\n\n\tcolWidths: Record<string, number> = {};\n\tcolOrder: string[] = [];\n\n\t// ── Resize drag state (reactive for visual feedback) ─────────────────────────\n\n\tresizingKey: string | null = null;\n\n\t// ── Reorder drag state (reactive) ────────────────────────────────────────────\n\n\tdraggingKey: string | null = null;\n\tdragOverKey: string | null = null;\n\n\t// ── Private (non-reactive) DOM refs and drag intermediates ───────────────────\n\t// Properties starting with _ are intentionally excluded from reactivity.\n\n\tprivate _scroller = new VirtualScroller();\n\tprivate _viewport: HTMLElement | null = null;\n\tprivate _resizeStartX = 0;\n\tprivate _resizeStartWidth = 0;\n\n\t// ── Row height by size ────────────────────────────────────────────────────────\n\n\tget rowHeight(): number {\n\t\treturn this.size === 'sm' ? 36 : 44;\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────────\n\n\tonPropertyChange(name: string, _oldVal: unknown, newVal: unknown): void {\n\t\tif (name === 'columns' && Array.isArray(newVal)) {\n\t\t\tthis._syncColumnState(newVal as DataGridColumn[]);\n\t\t}\n\t}\n\n\tonCreate(): void {\n\t\tthis._syncColumnState(this.columns);\n\t\tthis._attachScroller();\n\t}\n\n\tonRender(): void {\n\t\tthis._attachScroller();\n\n\t\t// Update CSS variable for filter row sticky offset\n\t\tconst shadow = this.elementRef.shadowRoot;\n\t\tif (shadow) {\n\t\t\tconst headerRow = shadow.querySelector('.ml-data-grid__header-row') as HTMLElement | null;\n\t\t\tif (headerRow) {\n\t\t\t\tconst h = headerRow.getBoundingClientRect().height;\n\t\t\t\tif (h > 0) {\n\t\t\t\t\tthis.elementRef.style.setProperty('--ml-grid-header-h', `${h}px`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Compute initial end index when viewport height not yet known\n\t\tif (this._viewport && this._viewport.clientHeight === 0 && this.processedRows.length > 0) {\n\t\t\tconst approxEnd = Math.min(this.processedRows.length, Math.ceil(600 / this.rowHeight) + 6);\n\t\t\tif (approxEnd !== this.endIndex) {\n\t\t\t\tthis.endIndex = approxEnd;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.virtual) {\n\t\t\tconst total = this.processedRows.length;\n\t\t\tif (this.endIndex !== total) this.endIndex = total;\n\t\t}\n\t}\n\n\tonDestroy(): void {\n\t\tthis._scroller.detach();\n\t\tthis._viewport = null;\n\t}\n\n\t// ── Private helpers ───────────────────────────────────────────────────────────\n\n\tprivate _attachScroller(): void {\n\t\tif (this._viewport) return; // already attached\n\t\tconst shadow = this.elementRef.shadowRoot;\n\t\tif (!shadow) return;\n\t\tthis._viewport = shadow.querySelector('.ml-data-grid__viewport') as HTMLElement | null;\n\t\tif (!this._viewport) return;\n\t\tthis._scroller.attach(this._viewport, {\n\t\t\trowHeight: () => this.rowHeight,\n\t\t\titemCount: () => this.processedRows.length,\n\t\t\tonUpdate: (start, end) => { this.startIndex = start; this.endIndex = end; },\n\t\t\tenabled: () => this.virtual,\n\t\t});\n\t}\n\n\tprivate _syncColumnState(cols: DataGridColumn[]): void {\n\t\tthis.colOrder = cols.map(c => c.key);\n\t\tconst newWidths: Record<string, number> = {};\n\t\tfor (const col of cols) {\n\t\t\tnewWidths[col.key] = this.colWidths[col.key] ?? col.width ?? 150;\n\t\t}\n\t\tthis.colWidths = newWidths;\n\t}\n\n\t// ── Data pipeline ─────────────────────────────────────────────────────────────\n\n\tget filteredRows(): Record<string, unknown>[] {\n\t\tif (this.serverSide) return this.rows;\n\t\tconst entries = Object.entries(this.filters).filter(([, v]) => v !== '');\n\t\tif (!entries.length) return this.rows;\n\t\treturn this.rows.filter(row =>\n\t\t\tentries.every(([key, val]) =>\n\t\t\t\tString(row[key] ?? '').toLowerCase().includes(val.toLowerCase())\n\t\t\t)\n\t\t);\n\t}\n\n\tget sortedRows(): Record<string, unknown>[] {\n\t\tif (this.serverSide || !this.sortKey) return this.filteredRows;\n\t\tconst key = this.sortKey;\n\t\tconst dir = this.sortDirection === 'asc' ? 1 : -1;\n\t\treturn [...this.filteredRows].sort((a, b) => {\n\t\t\tconst aVal = a[key];\n\t\t\tconst bVal = b[key];\n\t\t\tif (aVal == null) return bVal == null ? 0 : 1;\n\t\t\tif (bVal == null) return -1;\n\t\t\tif (typeof aVal === 'number' && typeof bVal === 'number') return (aVal - bVal) * dir;\n\t\t\treturn String(aVal).localeCompare(String(bVal)) * dir;\n\t\t});\n\t}\n\n\tget pagedRows(): Record<string, unknown>[] {\n\t\tif (this.serverSide) return this.rows;\n\t\tconst start = (this.currentPage - 1) * this.pageSize;\n\t\treturn this.sortedRows.slice(start, start + this.pageSize);\n\t}\n\n\tget processedRows(): Record<string, unknown>[] {\n\t\treturn this.pagedRows;\n\t}\n\n\tget visibleRows(): Record<string, unknown>[] {\n\t\tif (!this.virtual) return this.processedRows;\n\t\treturn this.processedRows.slice(this.startIndex, this.endIndex);\n\t}\n\n\tget totalRows(): number {\n\t\treturn this.serverSide ? this.rows.length : this.filteredRows.length;\n\t}\n\n\tget totalPages(): number {\n\t\treturn Math.max(1, Math.ceil(this.totalRows / this.pageSize));\n\t}\n\n\t// ── Column helpers ────────────────────────────────────────────────────────────\n\n\tget orderedColumns(): DataGridColumn[] {\n\t\tif (!this.colOrder.length) return this.columns;\n\t\tconst colMap = new Map(this.columns.map(c => [c.key, c]));\n\t\treturn this.colOrder\n\t\t\t.filter(k => colMap.has(k))\n\t\t\t.map(k => colMap.get(k)!);\n\t}\n\n\tget columnWidths(): Record<string, number> {\n\t\tconst result: Record<string, number> = {};\n\t\tfor (const col of this.columns) {\n\t\t\tresult[col.key] = this.colWidths[col.key] ?? col.width ?? 150;\n\t\t}\n\t\treturn result;\n\t}\n\n\tget totalGridWidth(): number {\n\t\tconst colTotal = this.orderedColumns.reduce(\n\t\t\t(sum, col) => sum + (this.columnWidths[col.key] ?? 150),\n\t\t\t0\n\t\t);\n\t\treturn colTotal + (this.selectable ? 44 : 0);\n\t}\n\n\tget gridTemplateColumns(): string {\n\t\tconst cols = this.orderedColumns\n\t\t\t.map(col => `${this.columnWidths[col.key] ?? 150}px`)\n\t\t\t.join(' ');\n\t\treturn this.selectable ? `44px ${cols}` : cols;\n\t}\n\n\tgetPinnedLeftOffset(key: string): number {\n\t\tlet offset = this.selectable ? 44 : 0;\n\t\tfor (const col of this.orderedColumns) {\n\t\t\tif (col.key === key) return offset;\n\t\t\tif (col.pinned === 'left') {\n\t\t\t\toffset += this.columnWidths[col.key] ?? 150;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\tget topSpacerHeight(): number {\n\t\treturn this.virtual ? this.startIndex * this.rowHeight : 0;\n\t}\n\n\tget bottomSpacerHeight(): number {\n\t\tif (!this.virtual) return 0;\n\t\treturn Math.max(0, (this.processedRows.length - this.endIndex) * this.rowHeight);\n\t}\n\n\t// ── Selection ─────────────────────────────────────────────────────────────────\n\n\tget allSelected(): boolean {\n\t\treturn this.processedRows.length > 0 && this.selectedIndices.length === this.processedRows.length;\n\t}\n\n\tget someSelected(): boolean {\n\t\treturn this.selectedIndices.length > 0 && !this.allSelected;\n\t}\n\n\tisRowSelected = (index: number): boolean => this.selectedIndices.includes(index);\n\n\t// ── Event handlers ────────────────────────────────────────────────────────────\n\n\thandleSort = (col: DataGridColumn): void => {\n\t\tif (!col.sortable) return;\n\t\tif (this.sortKey === col.key) {\n\t\t\tthis.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n\t\t} else {\n\t\t\tthis.sortKey = col.key;\n\t\t\tthis.sortDirection = 'asc';\n\t\t}\n\t\tthis.currentPage = 1;\n\t\tthis._scroller.invalidate();\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:sort', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { key: this.sortKey, direction: this.sortDirection }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleFilterInput = (key: string, e: Event): void => {\n\t\tconst val = (e.target as HTMLInputElement).value;\n\t\tthis.filters = { ...this.filters, [key]: val };\n\t\tthis.currentPage = 1;\n\t\tthis._scroller.invalidate();\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:filter', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { filters: this.filters }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleSelectAll = (): void => {\n\t\tthis.selectedIndices = this.allSelected ? [] : this.processedRows.map((_, i) => i);\n\t\tthis._emitSelect();\n\t};\n\n\thandleSelectRow = (index: number, e: Event): void => {\n\t\te.stopPropagation();\n\t\tthis.selectedIndices = this.selectedIndices.includes(index)\n\t\t\t? this.selectedIndices.filter(i => i !== index)\n\t\t\t: [...this.selectedIndices, index];\n\t\tthis._emitSelect();\n\t};\n\n\thandleRowClick = (row: Record<string, unknown>, index: number): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:row-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { row, index }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleResizeStart = (key: string, e: PointerEvent): void => {\n\t\tthis.resizingKey = key;\n\t\tthis._resizeStartX = e.clientX;\n\t\tthis._resizeStartWidth = this.columnWidths[key] ?? 150;\n\t\t(e.target as HTMLElement).setPointerCapture(e.pointerId);\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t};\n\n\thandleResizeMove = (key: string, e: PointerEvent): void => {\n\t\tif (this.resizingKey !== key) return;\n\t\tconst delta = e.clientX - this._resizeStartX;\n\t\tconst col = this.columns.find(c => c.key === key);\n\t\tconst minW = col?.minWidth ?? 80;\n\t\tthis.colWidths = {\n\t\t\t...this.colWidths,\n\t\t\t[key]: Math.max(minW, this._resizeStartWidth + delta)\n\t\t};\n\t};\n\n\thandleResizeEnd = (): void => {\n\t\tif (!this.resizingKey) return;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:column-resize', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { key: this.resizingKey, width: this.colWidths[this.resizingKey] }\n\t\t\t})\n\t\t);\n\t\tthis.resizingKey = null;\n\t};\n\n\thandleDragStart = (key: string, e: DragEvent): void => {\n\t\tthis.draggingKey = key;\n\t\tif (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n\t};\n\n\thandleDragOver = (key: string, e: DragEvent): void => {\n\t\te.preventDefault();\n\t\tif (this.dragOverKey !== key) this.dragOverKey = key;\n\t};\n\n\thandleDragEnd = (): void => {\n\t\tthis.draggingKey = null;\n\t\tthis.dragOverKey = null;\n\t};\n\n\thandleDrop = (targetKey: string): void => {\n\t\tif (!this.draggingKey || this.draggingKey === targetKey) {\n\t\t\tthis.draggingKey = null;\n\t\t\tthis.dragOverKey = null;\n\t\t\treturn;\n\t\t}\n\t\tconst base = this.colOrder.length ? this.colOrder : this.columns.map(c => c.key);\n\t\tconst order = [...base];\n\t\tconst fromIdx = order.indexOf(this.draggingKey);\n\t\tconst toIdx = order.indexOf(targetKey);\n\t\tif (fromIdx !== -1 && toIdx !== -1) {\n\t\t\torder.splice(fromIdx, 1);\n\t\t\torder.splice(toIdx, 0, this.draggingKey);\n\t\t}\n\t\tthis.colOrder = order;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:column-reorder', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { order: this.colOrder }\n\t\t\t})\n\t\t);\n\t\tthis.draggingKey = null;\n\t\tthis.dragOverKey = null;\n\t};\n\n\tgoToPage = (page: number): void => {\n\t\tif (page < 1 || page > this.totalPages) return;\n\t\tthis.currentPage = page;\n\t\tif (this._viewport) this._viewport.scrollTop = 0;\n\t\tthis._scroller.invalidate();\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:page-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { page: this.currentPage, pageSize: this.pageSize }\n\t\t\t})\n\t\t);\n\t};\n\n\tprivate _emitSelect(): void {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { selectedRows: this.selectedIndices, allSelected: this.allSelected }\n\t\t\t})\n\t\t);\n\t}\n}\n","import type { CalendarEvent, CalendarDayCell, CalendarTimeColumn, PositionedEvent } from './calendar-view.types.js';\n\nconst MONTH_NAMES = [\n\t'January', 'February', 'March', 'April', 'May', 'June',\n\t'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nconst MONTH_ABBREVS = [\n\t'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n];\n\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst DAY_ABBREVS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/** 30-minute time slots = 48 rows for 24 hours */\nexport const TIME_INCREMENT = 30;\nexport const TOTAL_ROWS = 48;\n\nexport function toIsoDate(year: number, month: number, day: number): string {\n\treturn `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n}\n\nexport function parseDate(iso: string): Date {\n\tconst [y, m, d] = iso.split('T')[0].split('-').map(Number);\n\treturn new Date(y, m - 1, d);\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n\treturn a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function isToday(date: Date): boolean {\n\treturn isSameDay(date, new Date());\n}\n\nexport function addDays(date: Date, days: number): Date {\n\tconst result = new Date(date);\n\tresult.setDate(result.getDate() + days);\n\treturn result;\n}\n\nexport function addMonths(date: Date, months: number): Date {\n\tconst result = new Date(date);\n\tresult.setMonth(result.getMonth() + months);\n\treturn result;\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: number = 0): Date {\n\tconst d = new Date(date);\n\tconst day = d.getDay();\n\tconst diff = (day - weekStartsOn + 7) % 7;\n\td.setDate(d.getDate() - diff);\n\treturn d;\n}\n\nexport function startOfMonth(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function endOfMonth(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nexport function getISOWeekNumber(date: Date): number {\n\tconst d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n\td.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n\tconst yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n\treturn Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\nexport function formatTime(iso: string): string {\n\tconst date = new Date(iso);\n\tconst h = date.getHours();\n\tconst m = date.getMinutes();\n\tconst ampm = h >= 12 ? 'PM' : 'AM';\n\tconst hour = h % 12 || 12;\n\treturn m === 0 ? `${hour} ${ampm}` : `${hour}:${String(m).padStart(2, '0')} ${ampm}`;\n}\n\nexport function formatMonthYear(date: Date): string {\n\treturn `${MONTH_NAMES[date.getMonth()]} ${date.getFullYear()}`;\n}\n\nexport function formatDateRange(start: Date, end: Date): string {\n\tconst sMonth = MONTH_ABBREVS[start.getMonth()];\n\tconst eMonth = MONTH_ABBREVS[end.getMonth()];\n\tif (start.getMonth() === end.getMonth() && start.getFullYear() === end.getFullYear()) {\n\t\treturn `${sMonth} ${start.getDate()} – ${end.getDate()}, ${start.getFullYear()}`;\n\t}\n\tif (start.getFullYear() === end.getFullYear()) {\n\t\treturn `${sMonth} ${start.getDate()} – ${eMonth} ${end.getDate()}, ${start.getFullYear()}`;\n\t}\n\treturn `${sMonth} ${start.getDate()}, ${start.getFullYear()} – ${eMonth} ${end.getDate()}, ${end.getFullYear()}`;\n}\n\nexport function getMonthGrid(year: number, month: number, weekStartsOn: number = 0): CalendarDayCell[] {\n\tconst firstDay = new Date(year, month, 1);\n\tconst firstDayOfWeek = firstDay.getDay();\n\tconst daysInMonth = new Date(year, month + 1, 0).getDate();\n\tconst daysInPrevMonth = new Date(year, month, 0).getDate();\n\tconst today = new Date();\n\tconst todayIso = toIsoDate(today.getFullYear(), today.getMonth(), today.getDate());\n\n\tconst result: CalendarDayCell[] = [];\n\n\t// Leading days from previous month\n\tconst offset = (firstDayOfWeek - weekStartsOn + 7) % 7;\n\tconst prevMonth = month === 0 ? 11 : month - 1;\n\tconst prevYear = month === 0 ? year - 1 : year;\n\tfor (let i = offset - 1; i >= 0; i--) {\n\t\tconst d = daysInPrevMonth - i;\n\t\tconst iso = toIsoDate(prevYear, prevMonth, d);\n\t\tresult.push({\n\t\t\tdate: d, month: prevMonth, year: prevYear, iso,\n\t\t\tisCurrentMonth: false,\n\t\t\tisToday: iso === todayIso,\n\t\t\tevents: []\n\t\t});\n\t}\n\n\t// Current month days\n\tfor (let d = 1; d <= daysInMonth; d++) {\n\t\tconst iso = toIsoDate(year, month, d);\n\t\tresult.push({\n\t\t\tdate: d, month, year, iso,\n\t\t\tisCurrentMonth: true,\n\t\t\tisToday: iso === todayIso,\n\t\t\tevents: []\n\t\t});\n\t}\n\n\t// Trailing days to complete rows\n\tconst totalNeeded = Math.ceil(result.length / 7) * 7;\n\tconst nextMonth = month === 11 ? 0 : month + 1;\n\tconst nextYear = month === 11 ? year + 1 : year;\n\tfor (let t = 1; result.length < totalNeeded; t++) {\n\t\tconst iso = toIsoDate(nextYear, nextMonth, t);\n\t\tresult.push({\n\t\t\tdate: t, month: nextMonth, year: nextYear, iso,\n\t\t\tisCurrentMonth: false,\n\t\t\tisToday: iso === todayIso,\n\t\t\tevents: []\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport function getWeekDays(date: Date, weekStartsOn: number = 0): Date[] {\n\tconst start = startOfWeek(date, weekStartsOn);\n\treturn Array.from({ length: 7 }, (_, i) => addDays(start, i));\n}\n\nexport function getWeekdayHeaders(weekStartsOn: number = 0): { short: string; full: string }[] {\n\treturn Array.from({ length: 7 }, (_, i) => {\n\t\tconst idx = (weekStartsOn + i) % 7;\n\t\treturn { short: DAY_ABBREVS[idx], full: DAY_NAMES[idx] };\n\t});\n}\n\nexport function getEventsForDate(events: CalendarEvent[], iso: string): CalendarEvent[] {\n\treturn events.filter(e => {\n\t\tconst eventDate = e.start.split('T')[0];\n\t\treturn eventDate === iso;\n\t});\n}\n\nexport function getMonthAbbrev(date: Date): string {\n\treturn MONTH_ABBREVS[date.getMonth()];\n}\n\nexport function getDayAbbrev(date: Date): string {\n\treturn DAY_ABBREVS[date.getDay()];\n}\n\nexport function getDayName(date: Date): string {\n\treturn DAY_NAMES[date.getDay()];\n}\n\nfunction getMinutesFromMidnight(iso: string): number {\n\tconst date = new Date(iso);\n\treturn date.getHours() * 60 + date.getMinutes();\n}\n\n/** Convert minutes from midnight to a 1-based grid row (30-min increments, 48 rows) */\nfunction minutesToGridRow(minutes: number): number {\n\treturn Math.floor(minutes / TIME_INCREMENT) + 1;\n}\n\nexport function layoutOverlappingEvents(events: CalendarEvent[]): PositionedEvent[] {\n\tif (events.length === 0) return [];\n\n\tconst sorted = [...events].sort((a, b) => {\n\t\tconst aStart = getMinutesFromMidnight(a.start);\n\t\tconst bStart = getMinutesFromMidnight(b.start);\n\t\tif (aStart !== bStart) return aStart - bStart;\n\t\tconst aDuration = getMinutesFromMidnight(a.end) - aStart;\n\t\tconst bDuration = getMinutesFromMidnight(b.end) - bStart;\n\t\treturn bDuration - aDuration;\n\t});\n\n\tconst columns: { end: number }[][] = [];\n\tconst eventColumns: Map<string, number> = new Map();\n\n\tfor (const event of sorted) {\n\t\tconst start = getMinutesFromMidnight(event.start);\n\t\tconst end = getMinutesFromMidnight(event.end);\n\n\t\tlet placed = false;\n\t\tfor (let col = 0; col < columns.length; col++) {\n\t\t\tconst lastInCol = columns[col][columns[col].length - 1];\n\t\t\tif (lastInCol.end <= start) {\n\t\t\t\tcolumns[col].push({ end });\n\t\t\t\teventColumns.set(event.id, col);\n\t\t\t\tplaced = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!placed) {\n\t\t\tcolumns.push([{ end }]);\n\t\t\teventColumns.set(event.id, columns.length - 1);\n\t\t}\n\t}\n\n\t// Group overlapping events to determine totalColumns per group\n\tconst groups: { events: CalendarEvent[]; totalColumns: number }[] = [];\n\tconst visited = new Set<string>();\n\n\tfor (const event of sorted) {\n\t\tif (visited.has(event.id)) continue;\n\n\t\tconst group: CalendarEvent[] = [event];\n\t\tvisited.add(event.id);\n\t\tlet groupEnd = getMinutesFromMidnight(event.end);\n\t\tlet maxCol = eventColumns.get(event.id)! + 1;\n\n\t\tfor (const other of sorted) {\n\t\t\tif (visited.has(other.id)) continue;\n\t\t\tconst otherStart = getMinutesFromMidnight(other.start);\n\t\t\tif (otherStart < groupEnd) {\n\t\t\t\tgroup.push(other);\n\t\t\t\tvisited.add(other.id);\n\t\t\t\tgroupEnd = Math.max(groupEnd, getMinutesFromMidnight(other.end));\n\t\t\t\tmaxCol = Math.max(maxCol, eventColumns.get(other.id)! + 1);\n\t\t\t}\n\t\t}\n\n\t\tgroups.push({ events: group, totalColumns: maxCol });\n\t}\n\n\tconst result: PositionedEvent[] = [];\n\n\tfor (const group of groups) {\n\t\tfor (const event of group.events) {\n\t\t\tconst start = getMinutesFromMidnight(event.start);\n\t\t\tconst end = getMinutesFromMidnight(event.end);\n\t\t\tconst col = eventColumns.get(event.id)!;\n\t\t\tconst total = group.totalColumns;\n\n\t\t\tresult.push({\n\t\t\t\tevent,\n\t\t\t\tgridRowStart: minutesToGridRow(start),\n\t\t\t\tgridRowEnd: minutesToGridRow(end),\n\t\t\t\tleft: col / total,\n\t\t\t\twidth: 1 / total\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function getTimeSlots(): { label: string; hour: number; minute: number }[] {\n\tconst slots: { label: string; hour: number; minute: number }[] = [];\n\tfor (let h = 0; h < 24; h++) {\n\t\tfor (let m = 0; m < 60; m += TIME_INCREMENT) {\n\t\t\tconst ampm = h >= 12 ? 'PM' : 'AM';\n\t\t\tconst hour = h % 12 || 12;\n\t\t\tconst label = m === 0 ? `${hour} ${ampm}` : '';\n\t\t\tslots.push({ label, hour: h, minute: m });\n\t\t}\n\t}\n\treturn slots;\n}\n\nexport function getWeekColumns(date: Date, weekStartsOn: number, events: CalendarEvent[]): CalendarTimeColumn[] {\n\tconst days = getWeekDays(date, weekStartsOn);\n\treturn days.map(d => {\n\t\tconst iso = toIsoDate(d.getFullYear(), d.getMonth(), d.getDate());\n\t\tconst dayEvents = getEventsForDate(events, iso).filter(e => !e.allDay);\n\t\treturn {\n\t\t\tdate: iso,\n\t\t\tdayLabel: DAY_ABBREVS[d.getDay()],\n\t\t\tdayNumber: d.getDate(),\n\t\t\tisToday: isToday(d),\n\t\t\tevents: layoutOverlappingEvents(dayEvents)\n\t\t};\n\t});\n}\n\nexport function getDayColumn(date: Date, events: CalendarEvent[]): CalendarTimeColumn {\n\tconst iso = toIsoDate(date.getFullYear(), date.getMonth(), date.getDate());\n\tconst dayEvents = getEventsForDate(events, iso).filter(e => !e.allDay);\n\treturn {\n\t\tdate: iso,\n\t\tdayLabel: DAY_ABBREVS[date.getDay()],\n\t\tdayNumber: date.getDate(),\n\t\tisToday: isToday(date),\n\t\tevents: layoutOverlappingEvents(dayEvents)\n\t};\n}\n\nexport function getMiniCalendarDots(year: number, month: number, events: CalendarEvent[]): Set<string> {\n\tconst dots = new Set<string>();\n\tconst daysInMonth = new Date(year, month + 1, 0).getDate();\n\tfor (let d = 1; d <= daysInMonth; d++) {\n\t\tconst iso = toIsoDate(year, month, d);\n\t\tif (events.some(e => e.start.split('T')[0] === iso)) {\n\t\t\tdots.add(iso);\n\t\t}\n\t}\n\treturn dots;\n}\n","import { html, when, classMap } from '@melodicdev/core';\nimport type { CalendarViewComponent } from './calendar-view.component.js';\n\nconst VIEW_LABELS: Record<string, string> = {\n\tmonth: 'Month view',\n\tweek: 'Week view',\n\tday: 'Day view'\n};\n\nfunction renderDefaultHeaderLeft(c: CalendarViewComponent) {\n\treturn html`\n\t\t<div class=\"ml-cv__today-badge\">\n\t\t\t<span class=\"ml-cv__today-badge-month\">${c.todayMonthAbbrev}</span>\n\t\t\t<span class=\"ml-cv__today-badge-day\">${c.todayDayNumber}</span>\n\t\t</div>\n\t\t<div class=\"ml-cv__title-group\">\n\t\t\t<div class=\"ml-cv__title-row\">\n\t\t\t\t<h2 class=\"ml-cv__title\">${c.headerTitle}</h2>\n\t\t\t\t${when(c.view !== 'day', () => html` <span class=\"ml-cv__week-badge\">Week ${c.weekNumber}</span> `)}\n\t\t\t</div>\n\t\t\t<span class=\"ml-cv__subtitle\">${c.headerSubtitle}</span>\n\t\t</div>\n\t`;\n}\n\nfunction renderDefaultHeaderActions(c: CalendarViewComponent) {\n\treturn html`\n\t\t${when(\n\t\t\t!c.hideNav,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-cv__nav-group\">\n\t\t\t\t\t<button type=\"button\" class=\"ml-cv__nav-btn\" aria-label=\"Previous\" @click=${c.navigatePrev}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-left\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button type=\"button\" class=\"ml-cv__nav-btn\" aria-label=\"Next\" @click=${c.navigateNext}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-right\" size=\"sm\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t`\n\t\t)}\n\n\t\t${when(\n\t\t\t!c.hideTodayButton,\n\t\t\t() => html`<button type=\"button\" class=\"ml-cv__today-btn\" @click=${c.goToToday}>Today</button>`\n\t\t)}\n\n\t\t${when(\n\t\t\t!c.hideViewSelector,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-cv__view-dropdown\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t'ml-cv__view-trigger': true,\n\t\t\t\t\t\t\t'ml-cv__view-trigger--open': c.isViewDropdownOpen\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t@click=${c.toggleViewDropdown}\n\t\t\t\t\t>\n\t\t\t\t\t\t${VIEW_LABELS[c.view]}\n\t\t\t\t\t\t<ml-icon icon=\"caret-down\" size=\"xs\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t${when(\n\t\t\t\t\t\tc.isViewDropdownOpen,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<div class=\"ml-cv__view-menu\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=${classMap({ 'ml-cv__view-option': true, 'ml-cv__view-option--active': c.view === 'month' })}\n\t\t\t\t\t\t\t\t\t@click=${() => c.setView('month')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tMonth view\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=${classMap({ 'ml-cv__view-option': true, 'ml-cv__view-option--active': c.view === 'week' })}\n\t\t\t\t\t\t\t\t\t@click=${() => c.setView('week')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tWeek view\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=${classMap({ 'ml-cv__view-option': true, 'ml-cv__view-option--active': c.view === 'day' })}\n\t\t\t\t\t\t\t\t\t@click=${() => c.setView('day')}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tDay view\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t`\n\t\t)}\n\n\t\t${when(\n\t\t\t!c.hideAddButton,\n\t\t\t() => html`\n\t\t\t\t<button type=\"button\" class=\"ml-cv__add-btn\" @click=${c.handleAddEvent}>\n\t\t\t\t\t<ml-icon icon=\"plus\" size=\"xs\"></ml-icon>\n\t\t\t\t\t${c.addButtonText}\n\t\t\t\t</button>\n\t\t\t`\n\t\t)}\n\t`;\n}\n\nexport function renderHeader(c: CalendarViewComponent) {\n\treturn html`\n\t\t<div class=\"ml-cv__header\">\n\t\t\t<div class=\"ml-cv__header-left\">\n\t\t\t\t${when(c.hasHeaderLeftSlot, () => html`<slot name=\"header-left\"></slot>`, () => renderDefaultHeaderLeft(c))}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__header-right\">\n\t\t\t\t${when(c.hasHeaderActionsSlot, () => html`<slot name=\"header-actions\"></slot>`, () => renderDefaultHeaderActions(c))}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { html, repeat, when, classMap } from '@melodicdev/core';\nimport type { CalendarViewComponent } from './calendar-view.component.js';\nimport type { CalendarDayCell, CalendarEvent } from './calendar-view.types.js';\nimport { formatTime } from './calendar-view.utils.js';\n\nfunction renderEventPill(c: CalendarViewComponent, event: CalendarEvent) {\n\tconst color = event.color || 'blue';\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-cv__event-pill': true,\n\t\t\t\t[`ml-cv__event-pill--${color}`]: true\n\t\t\t})}\n\t\t\t@click=${(e: Event) => { e.stopPropagation(); c.handleEventClick(event); }}\n\t\t>\n\t\t\t${when(!event.allDay, () => html`\n\t\t\t\t<span class=\"ml-cv__event-pill-time\">${formatTime(event.start)}</span>\n\t\t\t`)}\n\t\t\t<span class=\"ml-cv__event-pill-title\">${event.title}</span>\n\t\t</div>\n\t`;\n}\n\nexport function renderMonthView(c: CalendarViewComponent) {\n\tconst headers = c.weekdayHeaders;\n\tconst grid = c.monthGrid;\n\tconst today = new Date();\n\tconst todayDayIndex = today.getDay();\n\tconst weekStartsOn = c.weekStartsOn;\n\n\treturn html`\n\t\t<div class=\"ml-cv__month\">\n\t\t\t<div class=\"ml-cv__weekday-header\">\n\t\t\t\t${repeat(headers, (h: { short: string; full: string }) => h.short, (h: { short: string; full: string }, i: number) => {\n\t\t\t\t\tconst dayIndex = (weekStartsOn + i) % 7;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=${classMap({\n\t\t\t\t\t\t\t'ml-cv__weekday': true,\n\t\t\t\t\t\t\t'ml-cv__weekday--today': dayIndex === todayDayIndex\n\t\t\t\t\t\t})}>${h.short}</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__month-grid\">\n\t\t\t\t${repeat(grid, (day: CalendarDayCell) => day.iso, (day: CalendarDayCell) => {\n\t\t\t\t\tconst visible = day.events.slice(0, c.maxVisibleEvents);\n\t\t\t\t\tconst overflow = day.events.length - c.maxVisibleEvents;\n\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t'ml-cv__day-cell': true,\n\t\t\t\t\t\t\t\t'ml-cv__day-cell--other-month': !day.isCurrentMonth\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t@click=${() => c.handleDateClick(day.iso)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=${classMap({\n\t\t\t\t\t\t\t\t'ml-cv__day-number': true,\n\t\t\t\t\t\t\t\t'ml-cv__day-number--today': day.isToday\n\t\t\t\t\t\t\t})}>${day.date}</div>\n\n\t\t\t\t\t\t\t<div class=\"ml-cv__day-events\">\n\t\t\t\t\t\t\t\t${repeat(visible, (e: CalendarEvent) => e.id, (e: CalendarEvent) => renderEventPill(c, e))}\n\t\t\t\t\t\t\t\t${when(overflow > 0, () => html`\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"ml-cv__more-link\"\n\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => { e.stopPropagation(); c.showMoreEvents(day.iso); }}\n\t\t\t\t\t\t\t\t\t>${overflow} more...</button>\n\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"ml-cv__day-add\"\n\t\t\t\t\t\t\t\taria-label=\"Add event\"\n\t\t\t\t\t\t\t\t@click=${(e: Event) => { e.stopPropagation(); c.handleAddEventOnDate(day.iso); }}\n\t\t\t\t\t\t\t>+</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { html, repeat, classMap } from '@melodicdev/core';\nimport type { CalendarViewComponent } from './calendar-view.component.js';\nimport type { CalendarTimeColumn, PositionedEvent } from './calendar-view.types.js';\nimport { formatTime, TOTAL_ROWS } from './calendar-view.utils.js';\n\nfunction renderTimeEvent(c: CalendarViewComponent, pe: PositionedEvent, colIndex: number) {\n\tconst color = pe.event.color || 'blue';\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-cv__time-event': true,\n\t\t\t\t[`ml-cv__time-event--${color}`]: true\n\t\t\t})}\n\t\t\tstyle=\"grid-row: ${pe.gridRowStart} / ${pe.gridRowEnd}; grid-column: ${colIndex + 2}; margin-left: ${pe.left * 100}%; width: ${pe.width * 100}%;\"\n\t\t\t@click=${(e: Event) => { e.stopPropagation(); c.handleEventClick(pe.event); }}\n\t\t>\n\t\t\t<div class=\"ml-cv__time-event-title\">${pe.event.title}</div>\n\t\t\t<div class=\"ml-cv__time-event-time\">${formatTime(pe.event.start)} – ${formatTime(pe.event.end)}</div>\n\t\t</div>\n\t`;\n}\n\nexport function renderWeekView(c: CalendarViewComponent) {\n\tconst columns = c.weekColumns;\n\tconst timeSlots = c.timeSlots;\n\n\treturn html`\n\t\t<div class=\"ml-cv__time-layout\">\n\t\t\t<div class=\"ml-cv__time-header ml-cv__time-header--week\">\n\t\t\t\t<div class=\"ml-cv__time-header-gutter\"></div>\n\t\t\t\t${repeat(columns, (col: CalendarTimeColumn) => col.date, (col: CalendarTimeColumn) => html`\n\t\t\t\t\t<div class=${classMap({\n\t\t\t\t\t\t'ml-cv__time-header-day': true,\n\t\t\t\t\t\t'ml-cv__time-header-day--today': col.isToday\n\t\t\t\t\t})}>\n\t\t\t\t\t\t<span class=\"ml-cv__time-header-label\">${col.dayLabel}</span>\n\t\t\t\t\t\t<span class=\"ml-cv__time-header-number\">${col.dayNumber}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__time-scroll\">\n\t\t\t\t<div class=\"ml-cv__time-body ml-cv__time-body--week\" style=\"--cv-rows: ${TOTAL_ROWS};\">\n\t\t\t\t\t<!-- Time gutter column -->\n\t\t\t\t\t<div class=\"ml-cv__time-gutter\" style=\"grid-row: 1 / ${TOTAL_ROWS + 1}; grid-column: 1;\"></div>\n\n\t\t\t\t\t<!-- Day columns (background grid lines) -->\n\t\t\t\t\t${repeat(columns, (col: CalendarTimeColumn) => col.date, (_col: CalendarTimeColumn, colIdx: number) => html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=${classMap({ 'ml-cv__time-column': true, 'ml-cv__time-column--last': colIdx === 6 })}\n\t\t\t\t\t\t\tstyle=\"grid-row: 1 / ${TOTAL_ROWS + 1}; grid-column: ${colIdx + 2};\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<!-- Row grid lines -->\n\t\t\t\t\t${repeat(timeSlots, (_slot: { label: string; hour: number; minute: number }, i: number) => `row-${i}`, (_: { label: string; hour: number; minute: number }, i: number) => html`\n\t\t\t\t\t\t<div class=\"ml-cv__time-row\" style=\"grid-row: ${i + 1}; grid-column: 1 / ${columns.length + 2};\"></div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<!-- Time slot labels in gutter -->\n\t\t\t\t\t${repeat(timeSlots, (_slot: { label: string; hour: number; minute: number }, i: number) => `label-${i}`, (slot: { label: string; hour: number; minute: number }, i: number) => html`\n\t\t\t\t\t\t<div class=\"ml-cv__time-label\" style=\"grid-row: ${i + 1}; grid-column: 1;\">${slot.label}</div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t<!-- Events placed on the grid -->\n\t\t\t\t\t${repeat(\n\t\t\t\t\t\tcolumns.flatMap((col: CalendarTimeColumn, colIdx: number) =>\n\t\t\t\t\t\t\tcol.events.map((pe: PositionedEvent) => ({ pe, colIdx }))\n\t\t\t\t\t\t),\n\t\t\t\t\t\t(entry: { pe: PositionedEvent; colIdx: number }) => entry.pe.event.id,\n\t\t\t\t\t\t(entry: { pe: PositionedEvent; colIdx: number }) => renderTimeEvent(c, entry.pe, entry.colIdx)\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { html, repeat, when, classMap } from '@melodicdev/core';\nimport type { CalendarViewComponent } from './calendar-view.component.js';\nimport type { CalendarDayCell, CalendarEvent, PositionedEvent } from './calendar-view.types.js';\nimport { formatTime, TOTAL_ROWS } from './calendar-view.utils.js';\n\nfunction renderTimeEvent(c: CalendarViewComponent, pe: PositionedEvent) {\n\tconst color = pe.event.color || 'blue';\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-cv__time-event': true,\n\t\t\t\t[`ml-cv__time-event--${color}`]: true\n\t\t\t})}\n\t\t\tstyle=\"grid-row: ${pe.gridRowStart} / ${pe.gridRowEnd}; grid-column: 2; margin-left: ${pe.left * 100}%; width: ${pe.width * 100}%;\"\n\t\t\t@click=${(e: Event) => { e.stopPropagation(); c.handleEventClick(pe.event); }}\n\t\t>\n\t\t\t<div class=\"ml-cv__time-event-title\">${pe.event.title}</div>\n\t\t\t<div class=\"ml-cv__time-event-time\">${formatTime(pe.event.start)} – ${formatTime(pe.event.end)}</div>\n\t\t</div>\n\t`;\n}\n\nfunction renderMiniCalendar(c: CalendarViewComponent) {\n\tconst miniGrid = c.miniCalendarGrid;\n\tconst miniHeaders = c.miniCalendarWeekdays;\n\tconst dots = c.miniCalendarDots;\n\tconst selectedIso = c.currentIsoDate;\n\n\treturn html`\n\t\t<div class=\"ml-cv__mini-cal\">\n\t\t\t<div class=\"ml-cv__mini-cal-header\">\n\t\t\t\t<span class=\"ml-cv__mini-cal-title\">${c.miniCalendarTitle}</span>\n\t\t\t\t<div class=\"ml-cv__mini-cal-nav\">\n\t\t\t\t\t<button type=\"button\" class=\"ml-cv__mini-cal-btn\" aria-label=\"Previous month\" @click=${c.miniCalPrevMonth}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-left\" size=\"xs\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button type=\"button\" class=\"ml-cv__mini-cal-btn\" aria-label=\"Next month\" @click=${c.miniCalNextMonth}>\n\t\t\t\t\t\t<ml-icon icon=\"caret-right\" size=\"xs\"></ml-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__mini-cal-weekdays\">\n\t\t\t\t${repeat(miniHeaders, (h: string) => h, (h: string) => html`\n\t\t\t\t\t<div class=\"ml-cv__mini-cal-weekday\">${h}</div>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__mini-cal-grid\">\n\t\t\t\t${repeat(miniGrid, (day: CalendarDayCell) => day.iso, (day: CalendarDayCell) => html`\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t'ml-cv__mini-cal-day': true,\n\t\t\t\t\t\t\t'ml-cv__mini-cal-day--other': !day.isCurrentMonth,\n\t\t\t\t\t\t\t'ml-cv__mini-cal-day--today': day.isToday,\n\t\t\t\t\t\t\t'ml-cv__mini-cal-day--selected': day.iso === selectedIso\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t@click=${() => c.handleMiniCalSelect(day.iso)}\n\t\t\t\t\t>\n\t\t\t\t\t\t${day.date}\n\t\t\t\t\t\t${when(dots.has(day.iso), () => html`<span class=\"ml-cv__mini-cal-dot\"></span>`)}\n\t\t\t\t\t</button>\n\t\t\t\t`)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\nfunction renderSidebarEvents(c: CalendarViewComponent) {\n\tconst events = c.dayEvents;\n\n\treturn html`\n\t\t<div class=\"ml-cv__sidebar-title\">Events for ${c.dayViewDateLabel}</div>\n\t\t${when(events.length === 0, () => html`\n\t\t\t<div class=\"ml-cv__sidebar-empty\">No events scheduled</div>\n\t\t`)}\n\t\t${when(events.length > 0, () => html`\n\t\t\t<div class=\"ml-cv__sidebar-events\">\n\t\t\t\t${repeat(events, (e: CalendarEvent) => e.id, (e: CalendarEvent) => {\n\t\t\t\t\tconst color = e.color || 'blue';\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"ml-cv__sidebar-event\" @click=${() => c.handleEventClick(e)}>\n\t\t\t\t\t\t\t<div class=${`ml-cv__sidebar-event-bar ml-cv__sidebar-event-bar--${color}`}></div>\n\t\t\t\t\t\t\t<div class=\"ml-cv__sidebar-event-content\">\n\t\t\t\t\t\t\t\t<div class=\"ml-cv__sidebar-event-title\">${e.title}</div>\n\t\t\t\t\t\t\t\t<div class=\"ml-cv__sidebar-event-time\">\n\t\t\t\t\t\t\t\t\t${e.allDay ? 'All day' : `${formatTime(e.start)} – ${formatTime(e.end)}`}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t`)}\n\t`;\n}\n\nexport function renderDayView(c: CalendarViewComponent) {\n\tconst column = c.dayColumn;\n\tconst timeSlots = c.timeSlots;\n\n\treturn html`\n\t\t<div class=\"ml-cv__day-layout\">\n\t\t\t<div class=\"ml-cv__day-main\">\n\t\t\t\t<div class=\"ml-cv__time-layout\">\n\t\t\t\t\t<div class=\"ml-cv__time-header ml-cv__time-header--day\">\n\t\t\t\t\t\t<div class=\"ml-cv__time-header-gutter\"></div>\n\t\t\t\t\t\t<div class=${classMap({\n\t\t\t\t\t\t\t'ml-cv__time-header-day': true,\n\t\t\t\t\t\t\t'ml-cv__time-header-day--today': column.isToday\n\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<span class=\"ml-cv__time-header-label\">${column.dayLabel}</span>\n\t\t\t\t\t\t\t<span class=\"ml-cv__time-header-number\">${column.dayNumber}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"ml-cv__time-scroll\">\n\t\t\t\t\t\t<div class=\"ml-cv__time-body ml-cv__time-body--day\" style=\"--cv-rows: ${TOTAL_ROWS};\">\n\t\t\t\t\t\t\t<!-- Time gutter column -->\n\t\t\t\t\t\t\t<div class=\"ml-cv__time-gutter\" style=\"grid-row: 1 / ${TOTAL_ROWS + 1}; grid-column: 1;\"></div>\n\n\t\t\t\t\t\t\t<!-- Day column background -->\n\t\t\t\t\t\t\t<div class=\"ml-cv__time-column\" style=\"grid-row: 1 / ${TOTAL_ROWS + 1}; grid-column: 2;\"></div>\n\n\t\t\t\t\t\t\t<!-- Row grid lines -->\n\t\t\t\t\t\t\t${repeat(timeSlots, (_slot: { label: string; hour: number; minute: number }, i: number) => `row-${i}`, (_: { label: string; hour: number; minute: number }, i: number) => html`\n\t\t\t\t\t\t\t\t<div class=\"ml-cv__time-row\" style=\"grid-row: ${i + 1}; grid-column: 1 / 3;\"></div>\n\t\t\t\t\t\t\t`)}\n\n\t\t\t\t\t\t\t<!-- Time slot labels -->\n\t\t\t\t\t\t\t${repeat(timeSlots, (_slot: { label: string; hour: number; minute: number }, i: number) => `label-${i}`, (slot: { label: string; hour: number; minute: number }, i: number) => html`\n\t\t\t\t\t\t\t\t<div class=\"ml-cv__time-label\" style=\"grid-row: ${i + 1}; grid-column: 1;\">${slot.label}</div>\n\t\t\t\t\t\t\t`)}\n\n\t\t\t\t\t\t\t<!-- Events -->\n\t\t\t\t\t\t\t${repeat(column.events, (pe: PositionedEvent) => pe.event.id, (pe: PositionedEvent) => renderTimeEvent(c, pe))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-cv__day-sidebar\">\n\t\t\t\t${renderMiniCalendar(c)}\n\t\t\t\t${renderSidebarEvents(c)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { html, when } from '@melodicdev/core';\nimport type { CalendarViewComponent } from './calendar-view.component.js';\nimport { renderHeader } from './calendar-view-header.template.js';\nimport { renderMonthView } from './calendar-view-month.template.js';\nimport { renderWeekView } from './calendar-view-week.template.js';\nimport { renderDayView } from './calendar-view-day.template.js';\n\nexport function calendarViewTemplate(c: CalendarViewComponent) {\n\treturn html`\n\t\t<div class=\"ml-cv\">\n\t\t\t${renderHeader(c)}\n\t\t\t${when(c.view === 'month', () => renderMonthView(c))}\n\t\t\t${when(c.view === 'week', () => renderWeekView(c))}\n\t\t\t${when(c.view === 'day', () => renderDayView(c))}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const calendarViewStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t.ml-cv {\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\toverflow: hidden;\n\t}\n\n\t/* ── Header ── */\n\t.ml-cv__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-4) var(--ml-space-5);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__header-left {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-cv__today-badge {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2.75rem;\n\t\theight: 2.75rem;\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tline-height: 1;\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-cv__today-badge-month {\n\t\tfont-size: 0.5625rem;\n\t\tfont-weight: var(--ml-font-semibold);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.02em;\n\t}\n\n\t.ml-cv__today-badge-day {\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-bold);\n\t}\n\n\t.ml-cv__title-group {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t}\n\n\t.ml-cv__title-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t.ml-cv__title {\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tmargin: 0;\n\t}\n\n\t.ml-cv__week-badge {\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-purple-50);\n\t\tpadding: var(--ml-space-0-5) var(--ml-space-2);\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-cv__subtitle {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-cv__header-right {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t/* Slotted header content */\n\t::slotted([slot=\"header-left\"]) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t::slotted([slot=\"header-actions\"]) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t.ml-cv__nav-group {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\toverflow: hidden;\n\t}\n\n\t.ml-cv__nav-btn {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2.25rem;\n\t\theight: 2.25rem;\n\t\tborder: none;\n\t\tbackground: none;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out), color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__nav-btn:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-cv__nav-btn:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t\tz-index: 1;\n\t}\n\n\t.ml-cv__nav-btn + .ml-cv__nav-btn {\n\t\tborder-left: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__today-btn {\n\t\theight: 2.25rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground: none;\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__today-btn:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-cv__today-btn:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t/* View dropdown */\n\t.ml-cv__view-dropdown {\n\t\tposition: relative;\n\t}\n\n\t.ml-cv__view-trigger {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1-5);\n\t\theight: 2.25rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground: none;\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__view-trigger:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-cv__view-trigger:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t.ml-cv__view-trigger ml-icon {\n\t\ttransition: transform var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__view-trigger--open ml-icon {\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.ml-cv__view-menu {\n\t\tposition: absolute;\n\t\ttop: calc(100% + 4px);\n\t\tright: 0;\n\t\tmin-width: 140px;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tpadding: var(--ml-space-1);\n\t\tz-index: 10;\n\t}\n\n\t.ml-cv__view-option {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tbackground: none;\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__view-option:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-cv__view-option--active {\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-cv__add-btn {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1-5);\n\t\theight: 2.25rem;\n\t\tpadding: 0 var(--ml-space-3);\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tbackground-color: var(--ml-color-primary);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__add-btn:hover {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-cv__add-btn:focus-visible {\n\t\toutline: none;\n\t\tbox-shadow: var(--ml-shadow-focus-ring);\n\t}\n\n\t/* ── Month View ── */\n\t.ml-cv__month {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.ml-cv__weekday-header {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, minmax(0, 1fr));\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__weekday {\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-align: center;\n\t}\n\n\t.ml-cv__weekday--today {\n\t\tcolor: var(--ml-color-primary);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-cv__month-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, minmax(0, 1fr));\n\t}\n\n\t.ml-cv__day-cell {\n\t\tposition: relative;\n\t\tmin-height: 120px;\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tpadding: var(--ml-space-1);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__day-cell:nth-child(7n) {\n\t\tborder-right: none;\n\t}\n\n\t.ml-cv__day-cell:hover {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-cv__day-cell--other-month {\n\t\tbackground-color: var(--ml-color-surface-sunken);\n\t}\n\n\t.ml-cv__day-cell--other-month .ml-cv__day-number {\n\t\tcolor: var(--ml-color-text-disabled);\n\t}\n\n\t.ml-cv__day-number {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1.75rem;\n\t\theight: 1.75rem;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text);\n\t\tmargin-bottom: var(--ml-space-0-5);\n\t}\n\n\t.ml-cv__day-number--today {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-cv__day-events {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 1px;\n\t}\n\n\t.ml-cv__event-pill {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t\tpadding: 1px var(--ml-space-1-5);\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tborder-left: 3px solid;\n\t\tfont-size: 0.6875rem;\n\t\tline-height: 1.45;\n\t\tcursor: pointer;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttransition: opacity var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__event-pill:hover {\n\t\topacity: 0.85;\n\t}\n\n\t.ml-cv__event-pill-time {\n\t\tflex-shrink: 0;\n\t\tfont-weight: var(--ml-font-medium);\n\t}\n\n\t.ml-cv__event-pill-title {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t/* Event pill colors */\n\t.ml-cv__event-pill--gray { background-color: var(--ml-gray-50); border-left-color: var(--ml-gray-400); color: var(--ml-gray-700); }\n\t.ml-cv__event-pill--blue { background-color: var(--ml-blue-50); border-left-color: var(--ml-blue-500); color: var(--ml-blue-700); }\n\t.ml-cv__event-pill--purple { background-color: var(--ml-purple-50); border-left-color: var(--ml-purple-500); color: var(--ml-purple-700); }\n\t.ml-cv__event-pill--green { background-color: var(--ml-green-50); border-left-color: var(--ml-green-500); color: var(--ml-green-700); }\n\t.ml-cv__event-pill--pink { background-color: var(--ml-red-50); border-left-color: var(--ml-red-400); color: var(--ml-red-700); }\n\t.ml-cv__event-pill--orange { background-color: var(--ml-amber-50); border-left-color: var(--ml-amber-500); color: var(--ml-amber-700); }\n\t.ml-cv__event-pill--yellow { background-color: var(--ml-amber-25, var(--ml-amber-50)); border-left-color: var(--ml-amber-400); color: var(--ml-amber-700); }\n\n\t.ml-cv__more-link {\n\t\tfont-size: 0.6875rem;\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tpadding: 1px var(--ml-space-1-5);\n\t\tcursor: pointer;\n\t\tborder: none;\n\t\tbackground: none;\n\t\ttext-align: left;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t.ml-cv__more-link:hover {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-cv__day-add {\n\t\tposition: absolute;\n\t\tbottom: var(--ml-space-1);\n\t\tright: var(--ml-space-1);\n\t\tdisplay: none;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1.25rem;\n\t\theight: 1.25rem;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tfont-size: var(--ml-text-sm);\n\t\tcursor: pointer;\n\t\tline-height: 1;\n\t}\n\n\t.ml-cv__day-cell:hover .ml-cv__day-add {\n\t\tdisplay: flex;\n\t}\n\n\t/* ── Time Grid (Week & Day views) — CSS Grid layout ── */\n\t.ml-cv__time-layout {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t.ml-cv__time-header {\n\t\tdisplay: grid;\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__time-header--week {\n\t\tgrid-template-columns: 60px repeat(7, 1fr);\n\t}\n\n\t.ml-cv__time-header--day {\n\t\tgrid-template-columns: 60px 1fr;\n\t}\n\n\t.ml-cv__time-header-gutter {\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__time-header-day {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tpadding: var(--ml-space-2) 0;\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__time-header-day:last-child {\n\t\tborder-right: none;\n\t}\n\n\t.ml-cv__time-header-label {\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-cv__time-header-number {\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-cv__time-header-day--today .ml-cv__time-header-label {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-cv__time-header-day--today .ml-cv__time-header-number {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t.ml-cv__time-scroll {\n\t\toverflow-y: auto;\n\t\tmax-height: 720px;\n\t}\n\n\t/* CSS Grid body: columns + rows for time grid */\n\t.ml-cv__time-body {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: repeat(var(--cv-rows), 40px);\n\t}\n\n\t.ml-cv__time-body--week {\n\t\tgrid-template-columns: 60px repeat(7, 1fr);\n\t}\n\n\t.ml-cv__time-body--day {\n\t\tgrid-template-columns: 60px 1fr;\n\t}\n\n\t.ml-cv__time-gutter {\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__time-column {\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-cv__time-column--last {\n\t\tborder-right: none;\n\t}\n\n\t.ml-cv__time-row {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tpointer-events: none;\n\t}\n\n\t.ml-cv__time-label {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tjustify-content: flex-end;\n\t\tpadding: var(--ml-space-1) var(--ml-space-2) 0;\n\t\tfont-size: 0.625rem;\n\t\tcolor: var(--ml-color-text-muted);\n\t\twhite-space: nowrap;\n\t\tpointer-events: none;\n\t}\n\n\t/* Events placed via grid-row on the CSS grid */\n\t.ml-cv__time-event {\n\t\tbox-sizing: border-box;\n\t\tmin-width: 0;\n\t\tmin-height: 0;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tborder-left: 3px solid;\n\t\tpadding: var(--ml-space-1) var(--ml-space-1-5);\n\t\tfont-size: 0.6875rem;\n\t\toverflow: hidden;\n\t\tcursor: pointer;\n\t\tz-index: 1;\n\t\ttransition: opacity var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__time-event:hover {\n\t\topacity: 0.85;\n\t}\n\n\t.ml-cv__time-event-title {\n\t\tfont-weight: var(--ml-font-medium);\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t.ml-cv__time-event-time {\n\t\tfont-size: 0.625rem;\n\t\topacity: 0.8;\n\t}\n\n\t/* Time event colors */\n\t.ml-cv__time-event--gray { background-color: var(--ml-gray-50); border-left-color: var(--ml-gray-400); color: var(--ml-gray-700); }\n\t.ml-cv__time-event--blue { background-color: var(--ml-blue-50); border-left-color: var(--ml-blue-500); color: var(--ml-blue-700); }\n\t.ml-cv__time-event--purple { background-color: var(--ml-purple-50); border-left-color: var(--ml-purple-500); color: var(--ml-purple-700); }\n\t.ml-cv__time-event--green { background-color: var(--ml-green-50); border-left-color: var(--ml-green-500); color: var(--ml-green-700); }\n\t.ml-cv__time-event--pink { background-color: var(--ml-red-50); border-left-color: var(--ml-red-400); color: var(--ml-red-700); }\n\t.ml-cv__time-event--orange { background-color: var(--ml-amber-50); border-left-color: var(--ml-amber-500); color: var(--ml-amber-700); }\n\t.ml-cv__time-event--yellow { background-color: var(--ml-amber-25, var(--ml-amber-50)); border-left-color: var(--ml-amber-400); color: var(--ml-amber-700); }\n\n\t/* ── Day View with sidebar ── */\n\t.ml-cv__day-layout {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr 280px;\n\t}\n\n\t.ml-cv__day-main {\n\t\toverflow: hidden;\n\t}\n\n\t.ml-cv__day-sidebar {\n\t\tborder-left: var(--ml-border) solid var(--ml-color-border);\n\t\tpadding: var(--ml-space-4);\n\t\toverflow-y: auto;\n\t\tmax-height: 780px;\n\t}\n\n\t/* Mini calendar in sidebar */\n\t.ml-cv__mini-cal {\n\t\tmargin-bottom: var(--ml-space-4);\n\t}\n\n\t.ml-cv__mini-cal-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: var(--ml-space-2);\n\t}\n\n\t.ml-cv__mini-cal-title {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-cv__mini-cal-nav {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 0;\n\t}\n\n\t.ml-cv__mini-cal-btn {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tbackground: none;\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: pointer;\n\t}\n\n\t.ml-cv__mini-cal-btn:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-cv__mini-cal-weekdays {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, 1fr);\n\t\tmargin-bottom: var(--ml-space-1);\n\t}\n\n\t.ml-cv__mini-cal-weekday {\n\t\tfont-size: 0.625rem;\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-align: center;\n\t\tpadding: var(--ml-space-0-5) 0;\n\t}\n\n\t.ml-cv__mini-cal-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(7, 1fr);\n\t}\n\n\t.ml-cv__mini-cal-day {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\taspect-ratio: 1;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground: none;\n\t\tfont-size: 0.6875rem;\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\tpadding: 0;\n\t\tgap: 1px;\n\t}\n\n\t.ml-cv__mini-cal-day:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-cv__mini-cal-day--other {\n\t\tcolor: var(--ml-color-text-disabled);\n\t}\n\n\t.ml-cv__mini-cal-day--today {\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-cv__mini-cal-day--selected {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-cv__mini-cal-day--selected:hover {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t}\n\n\t.ml-cv__mini-cal-dot {\n\t\twidth: 3px;\n\t\theight: 3px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-cv__mini-cal-day--selected .ml-cv__mini-cal-dot {\n\t\tbackground-color: var(--ml-color-text-inverse);\n\t}\n\n\t/* Sidebar event list */\n\t.ml-cv__sidebar-title {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tmargin-bottom: var(--ml-space-3);\n\t}\n\n\t.ml-cv__sidebar-events {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-2);\n\t}\n\n\t.ml-cv__sidebar-event {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-cv__sidebar-event:hover {\n\t\tbackground-color: var(--ml-color-surface-raised);\n\t}\n\n\t.ml-cv__sidebar-event-bar {\n\t\twidth: 3px;\n\t\tborder-radius: var(--ml-radius-full);\n\t\tflex-shrink: 0;\n\t}\n\n\t.ml-cv__sidebar-event-bar--gray { background-color: var(--ml-gray-400); }\n\t.ml-cv__sidebar-event-bar--blue { background-color: var(--ml-blue-500); }\n\t.ml-cv__sidebar-event-bar--purple { background-color: var(--ml-purple-500); }\n\t.ml-cv__sidebar-event-bar--green { background-color: var(--ml-green-500); }\n\t.ml-cv__sidebar-event-bar--pink { background-color: var(--ml-red-400); }\n\t.ml-cv__sidebar-event-bar--orange { background-color: var(--ml-amber-500); }\n\t.ml-cv__sidebar-event-bar--yellow { background-color: var(--ml-amber-400); }\n\n\t.ml-cv__sidebar-event-content {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-cv__sidebar-event-title {\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t.ml-cv__sidebar-event-time {\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-cv__sidebar-empty {\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-align: center;\n\t\tpadding: var(--ml-space-6) 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender } from '@melodicdev/core';\nimport type { CalendarViewMode, CalendarEvent, CalendarDayCell, CalendarTimeColumn } from './calendar-view.types.js';\nimport {\n\ttoIsoDate,\n\tparseDate,\n\taddDays,\n\taddMonths,\n\tstartOfWeek,\n\tgetMonthGrid,\n\tgetWeekColumns,\n\tgetDayColumn,\n\tgetWeekdayHeaders,\n\tgetISOWeekNumber,\n\tformatMonthYear,\n\tformatDateRange,\n\tgetMonthAbbrev,\n\tgetDayName,\n\tgetEventsForDate,\n\tgetTimeSlots,\n\tgetMonthGrid as getMiniGrid,\n\tgetMiniCalendarDots\n} from './calendar-view.utils.js';\nimport { calendarViewTemplate } from './calendar-view.template.js';\nimport { calendarViewStyles } from './calendar-view.styles.js';\n\n/**\n * ml-calendar-view - Full-featured calendar component with month, week, and day views\n *\n * @example\n * ```html\n * <ml-calendar-view .events=${events} view=\"month\"></ml-calendar-view>\n * ```\n *\n * @fires ml:view-change - Emitted when the view mode changes. Detail: { view }\n * @fires ml:date-change - Emitted when the navigated date changes. Detail: { date }\n * @fires ml:event-click - Emitted when a calendar event is clicked. Detail: { event }\n * @fires ml:date-click - Emitted when a date cell is clicked. Detail: { date }\n * @fires ml:add-event - Emitted when the add event button is clicked. Detail: { date? }\n */\n@MelodicComponent({\n\tselector: 'ml-calendar-view',\n\ttemplate: calendarViewTemplate,\n\tstyles: calendarViewStyles,\n\tattributes: [\n\t\t'view',\n\t\t'date',\n\t\t'week-starts-on',\n\t\t'max-visible-events',\n\t\t'add-button-text',\n\t\t'hide-nav',\n\t\t'hide-today-button',\n\t\t'hide-view-selector',\n\t\t'hide-add-button'\n\t]\n})\nexport class CalendarViewComponent implements IElementRef, OnCreate, OnDestroy, OnRender {\n\telementRef!: HTMLElement;\n\n\t/** Current view mode */\n\tview: CalendarViewMode = 'month';\n\n\t/** Navigated date (ISO date string) */\n\tdate = '';\n\n\t/** Day the week starts on (0=Sunday, 1=Monday) */\n\tweekStartsOn = 0;\n\n\t/** Maximum visible events per day cell in month view */\n\tmaxVisibleEvents = 3;\n\n\t/** Label for the add event button */\n\taddButtonText = 'Add event';\n\n\t/** Hide prev/next navigation arrows */\n\thideNav = false;\n\n\t/** Hide the \"Today\" button */\n\thideTodayButton = false;\n\n\t/** Hide the view dropdown */\n\thideViewSelector = false;\n\n\t/** Hide the add event button */\n\thideAddButton = false;\n\n\t/** Calendar events (property-only) */\n\tevents: CalendarEvent[] = [];\n\n\t/** Whether the view dropdown is open */\n\tisViewDropdownOpen = false;\n\n\t/** Check if header-left slot has consumer content */\n\tget hasHeaderLeftSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header-left\"]') !== null;\n\t}\n\n\t/** Check if header-actions slot has consumer content */\n\tget hasHeaderActionsSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header-actions\"]') !== null;\n\t}\n\n\t/** Mini calendar state for day view sidebar */\n\tprivate _miniCalYear = 0;\n\tprivate _miniCalMonth = 0;\n\tprivate _hasScrolledToTime = false;\n\n\tprivate _boundCloseDropdown: ((e: Event) => void) | null = null;\n\n\t// Current date object derived from the `date` attribute\n\tprivate get _currentDate(): Date {\n\t\tif (this.date) return parseDate(this.date);\n\t\treturn new Date();\n\t}\n\n\tonCreate(): void {\n\t\t// Initialize date if not set\n\t\tif (!this.date) {\n\t\t\tconst now = new Date();\n\t\t\tthis.date = toIsoDate(now.getFullYear(), now.getMonth(), now.getDate());\n\t\t}\n\t\t// Init mini cal to current date's month\n\t\tconst d = this._currentDate;\n\t\tthis._miniCalYear = d.getFullYear();\n\t\tthis._miniCalMonth = d.getMonth();\n\n\t\t// Close dropdown on outside click\n\t\tthis._boundCloseDropdown = (e: Event) => {\n\t\t\tif (!this.isViewDropdownOpen) return;\n\t\t\tconst path = e.composedPath();\n\t\t\tconst shadow = this.elementRef.shadowRoot;\n\t\t\tif (!shadow) return;\n\t\t\tconst dropdown = shadow.querySelector('.ml-cv__view-dropdown');\n\t\t\tif (dropdown && !path.includes(dropdown)) {\n\t\t\t\tthis.isViewDropdownOpen = false;\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('click', this._boundCloseDropdown, true);\n\t}\n\n\tonDestroy(): void {\n\t\tif (this._boundCloseDropdown) {\n\t\t\tdocument.removeEventListener('click', this._boundCloseDropdown, true);\n\t\t}\n\t}\n\n\tonRender(): void {\n\t\t// Auto-scroll time grid to ~6 AM on initial load\n\t\tif ((this.view === 'week' || this.view === 'day') && !this._hasScrolledToTime) {\n\t\t\tconst shadow = this.elementRef.shadowRoot;\n\t\t\tif (!shadow) return;\n\t\t\tconst scrollEl = shadow.querySelector('.ml-cv__time-scroll');\n\t\t\tif (scrollEl) {\n\t\t\t\t// 6 AM = row 12 (at 30-min increments), each row is 40px\n\t\t\t\tscrollEl.scrollTop = 12 * 40;\n\t\t\t\tthis._hasScrolledToTime = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* ── Header computed getters ── */\n\n\tget todayMonthAbbrev(): string {\n\t\treturn getMonthAbbrev(new Date());\n\t}\n\n\tget todayDayNumber(): number {\n\t\treturn new Date().getDate();\n\t}\n\n\tget headerTitle(): string {\n\t\treturn formatMonthYear(this._currentDate);\n\t}\n\n\tget weekNumber(): number {\n\t\treturn getISOWeekNumber(this._currentDate);\n\t}\n\n\tget headerSubtitle(): string {\n\t\tif (this.view === 'month') {\n\t\t\treturn `Week ${this.weekNumber}`;\n\t\t}\n\t\tif (this.view === 'week') {\n\t\t\tconst start = startOfWeek(this._currentDate, this.weekStartsOn);\n\t\t\tconst end = addDays(start, 6);\n\t\t\treturn formatDateRange(start, end);\n\t\t}\n\t\t// day view\n\t\treturn getDayName(this._currentDate);\n\t}\n\n\tget currentIsoDate(): string {\n\t\tconst d = this._currentDate;\n\t\treturn toIsoDate(d.getFullYear(), d.getMonth(), d.getDate());\n\t}\n\n\t/* ── Month view getters ── */\n\n\tget weekdayHeaders(): { short: string; full: string }[] {\n\t\treturn getWeekdayHeaders(this.weekStartsOn);\n\t}\n\n\tget monthGrid(): CalendarDayCell[] {\n\t\tconst d = this._currentDate;\n\t\tconst grid = getMonthGrid(d.getFullYear(), d.getMonth(), this.weekStartsOn);\n\t\t// Populate events for each day cell\n\t\tfor (const cell of grid) {\n\t\t\tcell.events = getEventsForDate(this.events, cell.iso);\n\t\t}\n\t\treturn grid;\n\t}\n\n\t/* ── Week view getters ── */\n\n\tget weekColumns(): CalendarTimeColumn[] {\n\t\treturn getWeekColumns(this._currentDate, this.weekStartsOn, this.events);\n\t}\n\n\tget timeSlots(): { label: string; hour: number; minute: number }[] {\n\t\treturn getTimeSlots();\n\t}\n\n\t/* ── Day view getters ── */\n\n\tget dayColumn(): CalendarTimeColumn {\n\t\treturn getDayColumn(this._currentDate, this.events);\n\t}\n\n\tget dayEvents(): CalendarEvent[] {\n\t\treturn getEventsForDate(this.events, this.currentIsoDate);\n\t}\n\n\tget dayViewDateLabel(): string {\n\t\tconst d = this._currentDate;\n\t\treturn d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' });\n\t}\n\n\t/* ── Mini calendar getters (day view sidebar) ── */\n\n\tget miniCalendarTitle(): string {\n\t\treturn formatMonthYear(new Date(this._miniCalYear, this._miniCalMonth, 1));\n\t}\n\n\tget miniCalendarWeekdays(): string[] {\n\t\treturn getWeekdayHeaders(this.weekStartsOn).map((h) => h.short.charAt(0));\n\t}\n\n\tget miniCalendarGrid(): CalendarDayCell[] {\n\t\treturn getMiniGrid(this._miniCalYear, this._miniCalMonth, this.weekStartsOn);\n\t}\n\n\tget miniCalendarDots(): Set<string> {\n\t\treturn getMiniCalendarDots(this._miniCalYear, this._miniCalMonth, this.events);\n\t}\n\n\t/* ── Navigation handlers ── */\n\n\tnavigatePrev = (): void => {\n\t\tconst d = this._currentDate;\n\t\tlet next: Date;\n\t\tif (this.view === 'month') {\n\t\t\tnext = addMonths(d, -1);\n\t\t} else if (this.view === 'week') {\n\t\t\tnext = addDays(d, -7);\n\t\t} else {\n\t\t\tnext = addDays(d, -1);\n\t\t}\n\t\tthis.setDate(next);\n\t};\n\n\tnavigateNext = (): void => {\n\t\tconst d = this._currentDate;\n\t\tlet next: Date;\n\t\tif (this.view === 'month') {\n\t\t\tnext = addMonths(d, 1);\n\t\t} else if (this.view === 'week') {\n\t\t\tnext = addDays(d, 7);\n\t\t} else {\n\t\t\tnext = addDays(d, 1);\n\t\t}\n\t\tthis.setDate(next);\n\t};\n\n\tgoToToday = (): void => {\n\t\tthis.setDate(new Date());\n\t};\n\n\t/* ── View dropdown ── */\n\n\ttoggleViewDropdown = (): void => {\n\t\tthis.isViewDropdownOpen = !this.isViewDropdownOpen;\n\t};\n\n\tsetView = (view: CalendarViewMode): void => {\n\t\tthis.view = view;\n\t\tthis.isViewDropdownOpen = false;\n\t\tthis._hasScrolledToTime = false;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:view-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { view }\n\t\t\t})\n\t\t);\n\t};\n\n\t/* ── Event handlers ── */\n\n\thandleEventClick = (event: CalendarEvent): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:event-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { event }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleDateClick = (iso: string): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:date-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { date: iso }\n\t\t\t})\n\t\t);\n\t};\n\n\thandleAddEvent = (): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:add-event', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: {}\n\t\t\t})\n\t\t);\n\t};\n\n\thandleAddEventOnDate = (iso: string): void => {\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:add-event', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { date: iso }\n\t\t\t})\n\t\t);\n\t};\n\n\tshowMoreEvents = (iso: string): void => {\n\t\t// Switch to day view for the date\n\t\tthis.date = iso;\n\t\tthis.setView('day');\n\t};\n\n\t/* ── Mini calendar handlers ── */\n\n\tminiCalPrevMonth = (): void => {\n\t\tif (this._miniCalMonth === 0) {\n\t\t\tthis._miniCalMonth = 11;\n\t\t\tthis._miniCalYear--;\n\t\t} else {\n\t\t\tthis._miniCalMonth--;\n\t\t}\n\t};\n\n\tminiCalNextMonth = (): void => {\n\t\tif (this._miniCalMonth === 11) {\n\t\t\tthis._miniCalMonth = 0;\n\t\t\tthis._miniCalYear++;\n\t\t} else {\n\t\t\tthis._miniCalMonth++;\n\t\t}\n\t};\n\n\thandleMiniCalSelect = (iso: string): void => {\n\t\tthis.setDate(parseDate(iso));\n\t};\n\n\t/* ── Private helpers ── */\n\n\tprivate setDate(d: Date): void {\n\t\tthis.date = toIsoDate(d.getFullYear(), d.getMonth(), d.getDate());\n\t\tthis._miniCalYear = d.getFullYear();\n\t\tthis._miniCalMonth = d.getMonth();\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:date-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { date: this.date }\n\t\t\t})\n\t\t);\n\t}\n}\n","import { html } from '@melodicdev/core';\nimport type { IconComponent } from './icon.component.js';\n\nexport const iconTemplate = (c: IconComponent) => {\n\tconst className: string = c.format === 'regular' ? 'ph' : `ph-${c.format}`;\n\tconst iconLigature: string = c.format === 'regular' ? c.icon : `${c.icon}-${c.format}`;\n\n\treturn html`<i class=\"${className}\">${iconLigature}</i>`;\n};\n","import { css } from '@melodicdev/core';\n\nexport const iconStyles = () => css`\n\t:host {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcolor: var(--ml-icon-color, currentColor);\n\t}\n\n\t:host([size='xs']) {\n\t\t--ml-icon-size: 12px;\n\t}\n\t:host([size='sm']) {\n\t\t--ml-icon-size: 16px;\n\t}\n\t:host([size='md']) {\n\t\t--ml-icon-size: 24px;\n\t}\n\t:host([size='lg']) {\n\t\t--ml-icon-size: 32px;\n\t}\n\t:host([size='xl']) {\n\t\t--ml-icon-size: 48px;\n\t}\n\n\ti {\n\t\tfont-size: var(--ml-icon-size, 24px);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport { iconTemplate } from './icon.template.js';\nimport { iconStyles } from './icon.styles.js';\n\n/**\n * ml-icon - Icon component for displaying vector icons\n *\n * This component uses the Phosphor Icons library to render icons via ligatures by default.\n * https://phosphoricons.com/\n *\n * @example\n * ```typescript\n *\n * html`<ml-icon .icon=${'arrow-left'} size=\"md\"></ml-icon>`\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-icon',\n\ttemplate: iconTemplate,\n\tstyles: iconStyles,\n\tattributes: ['icon', 'format', 'size']\n})\nexport class IconComponent {\n\t/** phosphor icon ligature */\n\ticon: string = '';\n\n\t/** phosphor icon format */\n\tformat: 'bold' | 'fill' | 'light' | 'regular' | 'thin' = 'regular';\n}\n","import { html, classMap, repeat, when } from '@melodicdev/core';\nimport type { TabsComponent } from './tabs.component.js';\nimport type { TabConfig } from './tabs.types.js';\n\nexport function tabsTemplate(c: TabsComponent) {\n\tconst hasTabs = c.tabs.length > 0;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-tabs': true,\n\t\t\t\t[`ml-tabs--${c.variant}`]: true,\n\t\t\t\t[`ml-tabs--${c.size}`]: true,\n\t\t\t\t[`ml-tabs--${c.orientation}`]: true\n\t\t\t})}\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"ml-tabs__list\"\n\t\t\t\trole=\"tablist\"\n\t\t\t\taria-orientation=${c.orientation}\n\t\t\t\t@keydown=${c.handleKeyDown}\n\t\t\t>\n\t\t\t\t${hasTabs\n\t\t\t\t\t? repeat(\n\t\t\t\t\t\t\tc.tabs,\n\t\t\t\t\t\t\t(tab) => `${tab.value}-${c.value === tab.value}`,\n\t\t\t\t\t\t\t(tab) => renderTabButton(c, tab)\n\t\t\t\t\t\t)\n\t\t\t\t\t: html`<slot name=\"tab\" @slotchange=${c.handleTabSlotChange}></slot>`}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-tabs__panels\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\nfunction renderTabButton(c: TabsComponent, tab: TabConfig) {\n\tconst isActive = c.value === tab.value;\n\n\treturn html`\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"tab\"\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-tabs__tab': true,\n\t\t\t\t'ml-tabs__tab--active': isActive,\n\t\t\t\t'ml-tabs__tab--disabled': !!tab.disabled\n\t\t\t})}\n\t\t\tdata-value=${tab.value}\n\t\t\taria-selected=${isActive}\n\t\t\taria-disabled=${tab.disabled || false}\n\t\t\ttabindex=${isActive ? '0' : '-1'}\n\t\t\t?disabled=${tab.disabled}\n\t\t\t@click=${() => c.handleTabClick(tab.value, tab.href)}\n\t\t>\n\t\t\t${when(!!tab.icon, () => html`<ml-icon icon=${tab.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t<span class=\"ml-tabs__tab-label\">${tab.label}</span>\n\t\t</button>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tabsStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.ml-tabs {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* Vertical orientation */\n\t.ml-tabs--vertical {\n\t\tflex-direction: row;\n\t}\n\n\t.ml-tabs--vertical .ml-tabs__list {\n\t\tflex-direction: column;\n\t\tborder-bottom: none;\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t\tpadding-right: var(--ml-space-2);\n\t\tmargin-right: var(--ml-space-4);\n\t}\n\n\t.ml-tabs--vertical .ml-tabs__panels {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t/* Tab list */\n\t.ml-tabs__list {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-1);\n\t\tposition: relative;\n\t}\n\n\t/* Tab button base */\n\t.ml-tabs__tab {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-tabs__tab:hover:not(:disabled) {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-tabs__tab:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: 2px;\n\t}\n\n\t.ml-tabs__tab--active {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-tabs__tab--disabled {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t\topacity: 0.6;\n\t}\n\n\t.ml-tabs__tab-label {\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t/* Panels */\n\t.ml-tabs__panels {\n\t\tpadding-top: var(--ml-space-4);\n\t}\n\n\t.ml-tabs--vertical .ml-tabs__panels {\n\t\tpadding-top: 0;\n\t}\n\n\t/* ============================================\n\t VARIANT: Line (underline style)\n\t ============================================ */\n\t.ml-tabs--line .ml-tabs__list {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tgap: 0;\n\t}\n\n\t.ml-tabs--line .ml-tabs__tab {\n\t\tposition: relative;\n\t\tpadding-bottom: calc(var(--ml-space-2) + 2px);\n\t\tmargin-bottom: -1px;\n\t}\n\n\t.ml-tabs--line .ml-tabs__tab::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 2px;\n\t\tbackground-color: transparent;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-tabs--line .ml-tabs__tab--active::after {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-tabs--line.ml-tabs--vertical .ml-tabs__list {\n\t\tborder-bottom: none;\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-tabs--line.ml-tabs--vertical .ml-tabs__tab {\n\t\tpadding-bottom: var(--ml-space-2);\n\t\tpadding-right: calc(var(--ml-space-4) + 2px);\n\t\tmargin-bottom: 0;\n\t\tmargin-right: -1px;\n\t}\n\n\t.ml-tabs--line.ml-tabs--vertical .ml-tabs__tab::after {\n\t\tbottom: auto;\n\t\tleft: auto;\n\t\ttop: 0;\n\t\tright: 0;\n\t\twidth: 2px;\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t VARIANT: Enclosed (bordered tab style)\n\t ============================================ */\n\t.ml-tabs--enclosed .ml-tabs__list {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tgap: 0;\n\t}\n\n\t.ml-tabs--enclosed .ml-tabs__tab {\n\t\tposition: relative;\n\t\tborder: var(--ml-border) solid transparent;\n\t\tborder-bottom: none;\n\t\tborder-radius: var(--ml-radius) var(--ml-radius) 0 0;\n\t\tmargin-bottom: -1px;\n\t\tbackground-color: transparent;\n\t}\n\n\t.ml-tabs--enclosed .ml-tabs__tab:hover:not(:disabled):not(.ml-tabs__tab--active) {\n\t\tbackground-color: var(--ml-color-surface-secondary);\n\t}\n\n\t.ml-tabs--enclosed .ml-tabs__tab--active {\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder-color: var(--ml-color-border);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-tabs--enclosed .ml-tabs__tab--active::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tbottom: -1px;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 1px;\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t/* ============================================\n\t VARIANT: Pills (soft rounded style)\n\t ============================================ */\n\t.ml-tabs--pills .ml-tabs__list {\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-tabs--pills .ml-tabs__tab {\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t.ml-tabs--pills .ml-tabs__tab:hover:not(:disabled):not(.ml-tabs__tab--active) {\n\t\tbackground-color: var(--ml-color-surface-secondary);\n\t}\n\n\t.ml-tabs--pills .ml-tabs__tab--active {\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t/* ============================================\n\t SIZE VARIANTS\n\t ============================================ */\n\t.ml-tabs--sm .ml-tabs__tab {\n\t\tpadding: var(--ml-space-1-5) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-tabs--md .ml-tabs__tab {\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t}\n\n\t.ml-tabs--lg .ml-tabs__tab {\n\t\tpadding: var(--ml-space-2-5) var(--ml-space-5);\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t/* ============================================\n\t SLOTTED TAB STYLING\n\t ============================================ */\n\t::slotted(ml-tab) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t::slotted(ml-tab:hover) {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t::slotted(ml-tab[active]) {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t::slotted(ml-tab[disabled]) {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender } from '@melodicdev/core';\nimport type { Size } from '../../../types/index.js';\nimport type { TabsVariant, TabsOrientation, TabConfig } from './tabs.types.js';\nimport { tabsTemplate } from './tabs.template.js';\nimport { tabsStyles } from './tabs.styles.js';\n\n/**\n * ml-tabs - Tabbed interface component with optional router integration\n *\n * @example Simple mode with slotted panels:\n * ```html\n * <ml-tabs value=\"tab1\">\n * <ml-tab slot=\"tab\" value=\"tab1\" label=\"First\"></ml-tab>\n * <ml-tab slot=\"tab\" value=\"tab2\" label=\"Second\"></ml-tab>\n * <ml-tab-panel value=\"tab1\">Content 1</ml-tab-panel>\n * <ml-tab-panel value=\"tab2\">Content 2</ml-tab-panel>\n * </ml-tabs>\n * ```\n *\n * @example With tab configs:\n * ```html\n * <ml-tabs .tabs=${tabs} value=\"users\">\n * <ml-tab-panel value=\"users\">Users content</ml-tab-panel>\n * <ml-tab-panel value=\"settings\">Settings content</ml-tab-panel>\n * </ml-tabs>\n * ```\n *\n * @example Routed mode with child routes:\n * ```html\n * <ml-tabs routed .tabs=${[\n * { value: 'users', label: 'Users', href: '/admin/users' },\n * { value: 'settings', label: 'Settings', href: '/admin/settings' }\n * ]}>\n * <router-outlet></router-outlet>\n * </ml-tabs>\n * ```\n *\n * @slot tab - Tab header elements (ml-tab)\n * @slot default - Tab panel content or router-outlet\n *\n * @fires ml:change - Emitted when active tab changes\n */\n@MelodicComponent({\n\tselector: 'ml-tabs',\n\ttemplate: tabsTemplate,\n\tstyles: tabsStyles,\n\tattributes: ['value', 'variant', 'size', 'orientation', 'routed']\n})\nexport class TabsComponent implements IElementRef, OnCreate, OnDestroy, OnRender {\n\telementRef!: HTMLElement;\n\n\t/** Currently active tab value */\n\tvalue = '';\n\n\t/** Visual variant */\n\tvariant: TabsVariant = 'line';\n\n\t/** Size variant */\n\tsize: Size = 'md';\n\n\t/** Tab orientation */\n\torientation: TabsOrientation = 'horizontal';\n\n\t/** Enable router integration */\n\trouted = false;\n\n\t/** Tab configurations (alternative to slotted ml-tab elements) */\n\ttabs: TabConfig[] = [];\n\n\t/** Internal tracking of slotted tabs */\n\t_slottedTabs: HTMLElement[] = [];\n\n\t/** Navigation event listener for routed mode */\n\tprivate readonly _handleNavigation = this.onNavigation.bind(this);\n\n\t/** Listener for ml:tab-click from slotted ml-tab elements */\n\tprivate readonly _handleTabClick = (event: Event): void => {\n\t\tconst { value, href } = (event as CustomEvent<{ value: string; href: string }>).detail;\n\t\tthis.handleTabClick(value, href);\n\t};\n\n\tonCreate(): void {\n\t\tthis.elementRef.addEventListener('ml:tab-click', this._handleTabClick);\n\n\t\tif (this.routed) {\n\t\t\twindow.addEventListener('NavigationEvent', this._handleNavigation);\n\t\t\tthis.syncWithRoute();\n\t\t}\n\t}\n\n\tonRender(): void {\n\t\t// Ensure panels are correctly shown/hidden after each render\n\t\tthis.updatePanelVisibility();\n\t}\n\n\tonDestroy(): void {\n\t\tthis.elementRef.removeEventListener('ml:tab-click', this._handleTabClick);\n\n\t\tif (this.routed) {\n\t\t\twindow.removeEventListener('NavigationEvent', this._handleNavigation);\n\t\t}\n\t}\n\n\t/** Handle tab slot changes */\n\thandleTabSlotChange = (event: Event): void => {\n\t\tconst slot = event.target as HTMLSlotElement;\n\t\tthis._slottedTabs = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n\t\t// Set initial value if not set\n\t\tif (!this.value && this._slottedTabs.length > 0) {\n\t\t\tconst firstTab = this._slottedTabs.find((tab) => !tab.hasAttribute('disabled'));\n\t\t\tif (firstTab) {\n\t\t\t\tthis.value = firstTab.getAttribute('value') || '';\n\t\t\t}\n\t\t}\n\n\t\tthis.updateTabStates();\n\t\tthis.updatePanelVisibility();\n\t};\n\n\t/** Handle tab click */\n\thandleTabClick = (tabValue: string, href?: string): void => {\n\t\tconst tab = this.getTabByValue(tabValue);\n\t\tif (tab?.disabled) return;\n\n\t\tif (this.routed && href) {\n\t\t\twindow.history.pushState({}, '', href);\n\t\t\twindow.dispatchEvent(new PopStateEvent('popstate'));\n\t\t}\n\n\t\tthis.value = tabValue;\n\t\tthis.updateTabStates();\n\t\tthis.updatePanelVisibility();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: tabValue }\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Handle keyboard navigation */\n\thandleKeyDown = (event: KeyboardEvent): void => {\n\t\tconst allTabs = this.getAllTabs();\n\t\tconst enabledTabs = allTabs.filter((t) => !t.disabled);\n\t\tconst currentIndex = enabledTabs.findIndex((t) => t.value === this.value);\n\n\t\tlet newIndex = currentIndex;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabs.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex < enabledTabs.length - 1 ? currentIndex + 1 : 0;\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = enabledTabs.length - 1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (newIndex !== currentIndex && enabledTabs[newIndex]) {\n\t\t\tconst tab = enabledTabs[newIndex];\n\t\t\tthis.handleTabClick(tab.value, tab.href);\n\t\t\tthis.focusTab(tab.value);\n\t\t}\n\t};\n\n\t/** Get all tabs (from config or slotted) */\n\tgetAllTabs(): TabConfig[] {\n\t\tif (this.tabs.length > 0) {\n\t\t\treturn this.tabs;\n\t\t}\n\n\t\treturn this._slottedTabs.map((el) => ({\n\t\t\tvalue: el.getAttribute('value') || '',\n\t\t\tlabel: el.getAttribute('label') || el.textContent || '',\n\t\t\ticon: el.getAttribute('icon') || undefined,\n\t\t\tdisabled: el.hasAttribute('disabled'),\n\t\t\thref: el.getAttribute('href') || undefined\n\t\t}));\n\t}\n\n\t/** Get tab by value */\n\tprivate getTabByValue(value: string): TabConfig | undefined {\n\t\treturn this.getAllTabs().find((t) => t.value === value);\n\t}\n\n\t/** Update active state on slotted tabs */\n\tprivate updateTabStates(): void {\n\t\tthis._slottedTabs.forEach((tab) => {\n\t\t\tconst isActive = tab.getAttribute('value') === this.value;\n\t\t\ttab.toggleAttribute('active', isActive);\n\t\t});\n\t}\n\n\t/** Update panel visibility */\n\tprivate updatePanelVisibility(): void {\n\t\tif (this.routed) return;\n\n\t\tconst panels = this.elementRef.querySelectorAll('ml-tab-panel');\n\t\tpanels.forEach((panel) => {\n\t\t\tconst isActive = panel.getAttribute('value') === this.value;\n\t\t\t(panel as HTMLElement).style.display = isActive ? '' : 'none';\n\t\t});\n\t}\n\n\t/** Focus a specific tab */\n\tprivate focusTab(value: string): void {\n\t\tconst tabList = this.elementRef.shadowRoot?.querySelector('.ml-tabs__list');\n\t\tconst button = tabList?.querySelector(`[data-value=\"${value}\"]`) as HTMLElement;\n\t\tbutton?.focus();\n\t}\n\n\t/** Sync active tab with current route (for routed mode) */\n\tprivate syncWithRoute(): void {\n\t\tconst path = window.location.pathname;\n\t\tconst matchingTab = this.getAllTabs().find((tab) => tab.href && path.startsWith(tab.href));\n\t\tif (matchingTab) {\n\t\t\tthis.value = matchingTab.value;\n\t\t\tthis.updateTabStates();\n\t\t}\n\t}\n\n\t/** Handle navigation events (routed mode) */\n\tprivate onNavigation(): void {\n\t\tthis.syncWithRoute();\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { TabComponent } from './tab.component.js';\n\nexport function tabTemplate(c: TabComponent) {\n\treturn html`\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"tab\"\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-tab': true,\n\t\t\t\t'ml-tab--active': c.active,\n\t\t\t\t'ml-tab--disabled': c.disabled\n\t\t\t})}\n\t\t\taria-selected=${c.active}\n\t\t\taria-disabled=${c.disabled}\n\t\t\ttabindex=${c.active ? '0' : '-1'}\n\t\t\t?disabled=${c.disabled}\n\t\t\t@click=${c.handleClick}\n\t\t>\n\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t<span class=\"ml-tab__label\">${c.label}</span>\n\t\t\t<slot></slot>\n\t\t</button>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tabStyles = () => css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.ml-tab {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tfont-size: inherit;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-tab:hover:not(:disabled) {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-tab:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: 2px;\n\t}\n\n\t.ml-tab--active {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-tab--disabled {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-tab__label {\n\t\tline-height: var(--ml-leading-tight);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { tabTemplate } from './tab.template.js';\nimport { tabStyles } from './tab.styles.js';\n\n/**\n * ml-tab - Individual tab header for use within ml-tabs\n *\n * @example\n * ```html\n * <ml-tabs>\n * <ml-tab slot=\"tab\" value=\"tab1\" label=\"First Tab\"></ml-tab>\n * <ml-tab slot=\"tab\" value=\"tab2\" label=\"Second Tab\" icon=\"gear\"></ml-tab>\n * <ml-tab slot=\"tab\" value=\"tab3\" label=\"Disabled\" disabled></ml-tab>\n * </ml-tabs>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-tab',\n\ttemplate: tabTemplate,\n\tstyles: tabStyles,\n\tattributes: ['value', 'label', 'icon', 'disabled', 'active', 'href']\n})\nexport class TabComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Tab identifier (must match ml-tab-panel value) */\n\tvalue = '';\n\n\t/** Tab label text */\n\tlabel = '';\n\n\t/** Optional icon name */\n\ticon = '';\n\n\t/** Disable this tab */\n\tdisabled = false;\n\n\t/** Active state (managed by parent ml-tabs) */\n\tactive = false;\n\n\t/** URL for routed tabs */\n\thref = '';\n\n\t/** Handle click on tab */\n\thandleClick = (): void => {\n\t\tif (this.disabled) return;\n\n\t\t// Dispatch event for parent ml-tabs to handle\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:tab-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, href: this.href }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html } from '@melodicdev/core';\nimport type { TabPanelComponent } from './tab-panel.component.js';\n\nexport function tabPanelTemplate(_c: TabPanelComponent) {\n\treturn html`\n\t\t<div class=\"ml-tab-panel\" role=\"tabpanel\">\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tabPanelStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-tab-panel {\n\t\toutline: none;\n\t}\n\n\t.ml-tab-panel:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: 2px;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { tabPanelTemplate } from './tab-panel.template.js';\nimport { tabPanelStyles } from './tab-panel.styles.js';\n\n/**\n * ml-tab-panel - Tab panel content for use within ml-tabs\n *\n * @example\n * ```html\n * <ml-tabs value=\"tab1\">\n * <ml-tab slot=\"tab\" value=\"tab1\" label=\"First\"></ml-tab>\n * <ml-tab slot=\"tab\" value=\"tab2\" label=\"Second\"></ml-tab>\n * <ml-tab-panel value=\"tab1\">First panel content</ml-tab-panel>\n * <ml-tab-panel value=\"tab2\">Second panel content</ml-tab-panel>\n * </ml-tabs>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-tab-panel',\n\ttemplate: tabPanelTemplate,\n\tstyles: tabPanelStyles,\n\tattributes: ['value']\n})\nexport class TabPanelComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Panel identifier (must match ml-tab value) */\n\tvalue = '';\n}\n","import { html } from '@melodicdev/core';\nimport type { BreadcrumbComponent } from './breadcrumb.component.js';\n\nexport function breadcrumbTemplate(_c: BreadcrumbComponent) {\n\treturn html`\n\t\t<nav class=\"ml-breadcrumb\" aria-label=\"Breadcrumb\">\n\t\t\t<ol class=\"ml-breadcrumb__list\">\n\t\t\t\t<slot></slot>\n\t\t\t</ol>\n\t\t</nav>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const breadcrumbStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-breadcrumb__list {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-wrap: wrap;\n\t\tgap: var(--ml-space-1);\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { breadcrumbTemplate } from './breadcrumb.template.js';\nimport { breadcrumbStyles } from './breadcrumb.styles.js';\n\ntype BreadcrumbSeparator = 'slash' | 'chevron';\n\n/**\n * ml-breadcrumb - Breadcrumb navigation container\n *\n * @example\n * ```html\n * <ml-breadcrumb>\n * <ml-breadcrumb-item href=\"/\">Home</ml-breadcrumb-item>\n * <ml-breadcrumb-item href=\"/settings\">Settings</ml-breadcrumb-item>\n * <ml-breadcrumb-item current>Profile</ml-breadcrumb-item>\n * </ml-breadcrumb>\n * ```\n *\n * @slot default - Breadcrumb items\n */\n@MelodicComponent({\n\tselector: 'ml-breadcrumb',\n\ttemplate: breadcrumbTemplate,\n\tstyles: breadcrumbStyles,\n\tattributes: ['separator']\n})\nexport class BreadcrumbComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Separator style between items */\n\tseparator: BreadcrumbSeparator = 'chevron';\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { BreadcrumbItemComponent } from './breadcrumb-item.component.js';\n\nexport function breadcrumbItemTemplate(c: BreadcrumbItemComponent) {\n\tconst separatorIcon = c.separator === 'slash' ? 'slash-forward' : 'caret-right';\n\n\treturn html`\n\t\t<li\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-breadcrumb-item': true,\n\t\t\t\t'ml-breadcrumb-item--current': c.current\n\t\t\t})}\n\t\t>\n\t\t\t<span class=\"ml-breadcrumb-item__separator\">\n\t\t\t\t<ml-icon icon=${separatorIcon} size=\"sm\"></ml-icon>\n\t\t\t</span>\n\t\t\t${when(\n\t\t\t\t!!c.href && !c.current,\n\t\t\t\t() => html`\n\t\t\t\t\t<a class=\"ml-breadcrumb-item__link\" href=${c.href}>\n\t\t\t\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t</a>\n\t\t\t\t`,\n\t\t\t\t() => html`\n\t\t\t\t\t<span class=\"ml-breadcrumb-item__text\" aria-current=${c.current ? 'page' : false}>\n\t\t\t\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t</span>\n\t\t\t\t`\n\t\t\t)}\n\t\t</li>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const breadcrumbItemStyles = () => css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.ml-breadcrumb-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-breadcrumb-item__separator {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n\n\t/* Hide separator on first item */\n\t:host(:first-child) .ml-breadcrumb-item__separator {\n\t\tdisplay: none;\n\t}\n\n\t.ml-breadcrumb-item__link {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\ttext-decoration: none;\n\t\tborder-radius: var(--ml-radius-sm);\n\t\tpadding: var(--ml-space-1) var(--ml-space-1);\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-breadcrumb-item__link:hover {\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-breadcrumb-item__text {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tpadding: var(--ml-space-1) var(--ml-space-1);\n\t}\n\n\t.ml-breadcrumb-item--current .ml-breadcrumb-item__text {\n\t\tcolor: var(--ml-color-text);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate } from '@melodicdev/core';\nimport { breadcrumbItemTemplate } from './breadcrumb-item.template.js';\nimport { breadcrumbItemStyles } from './breadcrumb-item.styles.js';\n\n/**\n * ml-breadcrumb-item - Individual breadcrumb link or label\n *\n * @example\n * ```html\n * <ml-breadcrumb-item href=\"/settings\" icon=\"gear\">Settings</ml-breadcrumb-item>\n * <ml-breadcrumb-item current>Profile</ml-breadcrumb-item>\n * ```\n *\n * @slot default - Item label text\n */\n@MelodicComponent({\n\tselector: 'ml-breadcrumb-item',\n\ttemplate: breadcrumbItemTemplate,\n\tstyles: breadcrumbItemStyles,\n\tattributes: ['href', 'icon', 'current', 'separator']\n})\nexport class BreadcrumbItemComponent implements IElementRef, OnCreate {\n\telementRef!: HTMLElement;\n\n\t/** Link URL (omit for current/non-clickable page) */\n\thref = '';\n\n\t/** Optional left icon */\n\ticon = '';\n\n\t/** Marks as the current/active page */\n\tcurrent = false;\n\n\t/** Separator type inherited from parent (set via CSS/attribute) */\n\tseparator: 'slash' | 'chevron' = 'chevron';\n\n\tonCreate(): void {\n\t\tconst parent = this.elementRef.closest('ml-breadcrumb');\n\t\tif (parent) {\n\t\t\tconst sep = parent.getAttribute('separator');\n\t\t\tif (sep === 'slash' || sep === 'chevron') {\n\t\t\t\tthis.separator = sep;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { html, classMap, repeat } from '@melodicdev/core';\nimport type { PaginationComponent, PaginationPage } from './pagination.component.js';\n\nexport function paginationTemplate(c: PaginationComponent) {\n\treturn html`\n\t\t<nav class=\"ml-pagination\" aria-label=\"Pagination\">\n\t\t\t<button\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'ml-pagination__btn': true,\n\t\t\t\t\t'ml-pagination__btn--nav': true,\n\t\t\t\t\t'ml-pagination__btn--disabled': !c.hasPrevious\n\t\t\t\t})}\n\t\t\t\taria-label=\"Previous page\"\n\t\t\t\tdisabled=${!c.hasPrevious}\n\t\t\t\t@click=${c.previous}\n\t\t\t>\n\t\t\t\t<ml-icon icon=\"arrow-left\" size=\"sm\"></ml-icon>\n\t\t\t\tPrevious\n\t\t\t</button>\n\n\t\t\t<div class=\"ml-pagination__pages\">\n\t\t\t\t${repeat(\n\t\t\t\t\tc.pages,\n\t\t\t\t\t(p: PaginationPage, i: number) => p.type === 'page' ? `page-${p.value}` : `ellipsis-${i}`,\n\t\t\t\t\t(p: PaginationPage) => {\n\t\t\t\t\t\tif (p.type === 'ellipsis') {\n\t\t\t\t\t\t\treturn html`<span class=\"ml-pagination__ellipsis\">...</span>`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn html`\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t\t\t\t'ml-pagination__btn': true,\n\t\t\t\t\t\t\t\t\t'ml-pagination__btn--page': true,\n\t\t\t\t\t\t\t\t\t'ml-pagination__btn--active': p.value === Number(c.page)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\taria-label=${`Page ${p.value}`}\n\t\t\t\t\t\t\t\taria-current=${p.value === Number(c.page) ? 'page' : false}\n\t\t\t\t\t\t\t\t@click=${() => c.goToPage(p.value)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${p.value}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t`;\n\t\t\t\t\t}\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<button\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'ml-pagination__btn': true,\n\t\t\t\t\t'ml-pagination__btn--nav': true,\n\t\t\t\t\t'ml-pagination__btn--disabled': !c.hasNext\n\t\t\t\t})}\n\t\t\t\taria-label=\"Next page\"\n\t\t\t\tdisabled=${!c.hasNext}\n\t\t\t\t@click=${c.next}\n\t\t\t>\n\t\t\t\tNext\n\t\t\t\t<ml-icon icon=\"arrow-right\" size=\"sm\"></ml-icon>\n\t\t\t</button>\n\t\t</nav>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const paginationStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-pagination {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-3);\n\t}\n\n\t.ml-pagination__pages {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-1);\n\t}\n\n\t.ml-pagination__btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-pagination__btn:hover:not(:disabled) {\n\t\tbackground-color: var(--ml-color-surface-hover);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-pagination__btn--nav {\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-pagination__btn--page {\n\t\tmin-width: 40px;\n\t\theight: 40px;\n\t\tpadding: 0;\n\t}\n\n\t.ml-pagination__btn--active,\n\t.ml-pagination__btn--active:hover {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tfont-weight: var(--ml-font-semibold);\n\t}\n\n\t.ml-pagination__btn--disabled,\n\t.ml-pagination__btn:disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-pagination__ellipsis {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-width: 40px;\n\t\theight: 40px;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { paginationTemplate } from './pagination.template.js';\nimport { paginationStyles } from './pagination.styles.js';\n\nexport type PaginationPage = { type: 'page'; value: number } | { type: 'ellipsis' };\n\n/**\n * ml-pagination - Page navigation controls\n *\n * @example\n * ```html\n * <ml-pagination page=\"1\" total-pages=\"10\"></ml-pagination>\n * <ml-pagination page=\"5\" total-pages=\"20\" siblings=\"2\"></ml-pagination>\n * ```\n *\n * @fires ml:page-change - Emitted when page changes, detail: { page }\n */\n@MelodicComponent({\n\tselector: 'ml-pagination',\n\ttemplate: paginationTemplate,\n\tstyles: paginationStyles,\n\tattributes: ['page', 'total-pages', 'siblings']\n})\nexport class PaginationComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Current active page (1-based) */\n\tpage = 1;\n\n\t/** Total number of pages */\n\ttotalPages = 1;\n\n\t/** Number of sibling pages to show around current */\n\tsiblings = 1;\n\n\tget pages(): PaginationPage[] {\n\t\tconst total = Math.max(1, Number(this.totalPages));\n\t\tconst current = Math.min(Math.max(1, Number(this.page)), total);\n\t\tconst siblings = Math.max(0, Number(this.siblings));\n\n\t\tconst range = (start: number, end: number) =>\n\t\t\tArray.from({ length: end - start + 1 }, (_, i): PaginationPage => ({ type: 'page', value: start + i }));\n\n\t\tconst leftSibling = Math.max(current - siblings, 1);\n\t\tconst rightSibling = Math.min(current + siblings, total);\n\n\t\tconst showLeftEllipsis = leftSibling > 2;\n\t\tconst showRightEllipsis = rightSibling < total - 1;\n\n\t\tif (!showLeftEllipsis && !showRightEllipsis) {\n\t\t\treturn range(1, total);\n\t\t}\n\n\t\tif (!showLeftEllipsis && showRightEllipsis) {\n\t\t\tconst leftRange = range(1, Math.max(rightSibling, 3 + siblings));\n\t\t\treturn [...leftRange, { type: 'ellipsis' }, { type: 'page', value: total }];\n\t\t}\n\n\t\tif (showLeftEllipsis && !showRightEllipsis) {\n\t\t\tconst rightRange = range(Math.min(leftSibling, total - 2 - siblings), total);\n\t\t\treturn [{ type: 'page', value: 1 }, { type: 'ellipsis' }, ...rightRange];\n\t\t}\n\n\t\treturn [\n\t\t\t{ type: 'page', value: 1 },\n\t\t\t{ type: 'ellipsis' },\n\t\t\t...range(leftSibling, rightSibling),\n\t\t\t{ type: 'ellipsis' },\n\t\t\t{ type: 'page', value: total }\n\t\t];\n\t}\n\n\tget hasPrevious(): boolean {\n\t\treturn Number(this.page) > 1;\n\t}\n\n\tget hasNext(): boolean {\n\t\treturn Number(this.page) < Number(this.totalPages);\n\t}\n\n\tgoToPage = (page: number): void => {\n\t\tconst currentPage = Number(this.page);\n\t\tconst total = Number(this.totalPages);\n\t\tif (page < 1 || page > total || page === currentPage) return;\n\n\t\tthis.page = page;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:page-change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { page: this.page }\n\t\t\t})\n\t\t);\n\t};\n\n\tprevious = (): void => {\n\t\tthis.goToPage(Number(this.page) - 1);\n\t};\n\n\tnext = (): void => {\n\t\tthis.goToPage(Number(this.page) + 1);\n\t};\n}\n","import { html, classMap, repeat, when } from '@melodicdev/core';\nimport type { TemplateResult } from '@melodicdev/core';\nimport type { SidebarComponent } from './sidebar.component.js';\nimport type { SidebarNavGroup, SidebarNavItem } from './sidebar.types.js';\n\nexport function sidebarTemplate(c: SidebarComponent) {\n\tconst hasNavConfig = c.navigation.length > 0;\n\tconst hasFooterConfig = c.footerNavigation.length > 0;\n\tconst isCollapsed = c.collapsed;\n\n\treturn html`\n\t\t<aside\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-sidebar': true,\n\t\t\t\t[`ml-sidebar--${c.variant}`]: true,\n\t\t\t\t'ml-sidebar--collapsed': isCollapsed\n\t\t\t})}\n\t\t\trole=\"navigation\"\n\t\t\t@keydown=${c.handleKeyDown}\n\t\t>\n\t\t\t<div class=\"ml-sidebar__header\">\n\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t</div>\n\n\t\t\t${when(c.hasSearch && !isCollapsed, () => html`\n\t\t\t\t<div class=\"ml-sidebar__search\">\n\t\t\t\t\t<slot name=\"search\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-sidebar__main\">\n\t\t\t\t${hasNavConfig\n\t\t\t\t\t? repeat(\n\t\t\t\t\t\t\tc.navigation,\n\t\t\t\t\t\t\t(_group, index) => `nav-group-${index}`,\n\t\t\t\t\t\t\t(group) => renderNavGroup(c, group)\n\t\t\t\t\t\t)\n\t\t\t\t\t: html`<slot @slotchange=${c.handleDefaultSlotChange}></slot>`}\n\t\t\t</div>\n\n\t\t\t<div class=\"ml-sidebar__footer\">\n\t\t\t\t${hasFooterConfig\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"ml-sidebar__footer-nav\">\n\t\t\t\t\t\t\t${repeat(\n\t\t\t\t\t\t\t\tc.footerNavigation,\n\t\t\t\t\t\t\t\t(item) => item.value,\n\t\t\t\t\t\t\t\t(item) => renderNavItem(c, item, 0)\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div class=\"ml-sidebar__footer-nav\">\n\t\t\t\t\t\t\t<slot name=\"footer-nav\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\n\t\t\t\t${when(c.hasFeature && !isCollapsed, () => html`\n\t\t\t\t\t<div class=\"ml-sidebar__feature\">\n\t\t\t\t\t\t<slot name=\"feature\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\n\t\t\t\t${when(c.hasUser, () => html`\n\t\t\t\t\t<div class=\"ml-sidebar__user\">\n\t\t\t\t\t\t<slot name=\"user\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\t\t\t</div>\n\t\t</aside>\n\t`;\n}\n\nfunction renderNavGroup(c: SidebarComponent, group: SidebarNavGroup) {\n\tconst isCollapsed = c.collapsed;\n\n\treturn html`\n\t\t<div class=\"ml-sidebar__group\">\n\t\t\t${when(!!group.label && !isCollapsed, () => html`\n\t\t\t\t<span class=\"ml-sidebar__group-label\">${group.label}</span>\n\t\t\t`)}\n\t\t\t<div class=\"ml-sidebar__group-items\">\n\t\t\t\t${repeat(\n\t\t\t\t\tgroup.items,\n\t\t\t\t\t(item) => item.value,\n\t\t\t\t\t(item) => renderNavItem(c, item, 0)\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\nfunction renderNavItem(c: SidebarComponent, item: SidebarNavItem, level: number): TemplateResult {\n\tconst isActive = c.active === item.value;\n\tconst hasChildren = !!item.children && item.children.length > 0;\n\tconst isExpanded = c._expandedItems.has(item.value);\n\tconst isCollapsed = c.collapsed;\n\n\tconst linkClasses = classMap({\n\t\t'ml-sidebar__item-link': true,\n\t\t'ml-sidebar__item-link--active': isActive,\n\t\t'ml-sidebar__item-link--disabled': !!item.disabled,\n\t\t'ml-sidebar__item-link--expanded': isExpanded,\n\t\t'ml-sidebar__item-link--collapsed': isCollapsed,\n\t\t'ml-sidebar__item-link--has-children': hasChildren\n\t});\n\n\tconst handleClick = (event: Event) => {\n\t\tif (item.disabled) return;\n\t\tif (hasChildren) {\n\t\t\tevent.preventDefault();\n\t\t\tc.handleConfigToggle(item, c._expandedItems);\n\t\t\treturn;\n\t\t}\n\t\tc.handleConfigItemClick(item.value, item.href);\n\t};\n\n\tconst content = html`\n\t\t<div class=\"ml-sidebar__item-leading\">\n\t\t\t${when(!!item.icon, () => html`<ml-icon icon=${item.icon} size=\"sm\"></ml-icon>`)}\n\t\t</div>\n\t\t${when(!isCollapsed, () => html`\n\t\t\t<span class=\"ml-sidebar__item-label\">${item.label}</span>\n\t\t\t<div class=\"ml-sidebar__item-trailing\">\n\t\t\t\t${when(!!item.badge, () => html`\n\t\t\t\t\t<span class=${classMap({\n\t\t\t\t\t\t'ml-sidebar__item-badge': true,\n\t\t\t\t\t\t[`ml-sidebar__item-badge--${item.badgeColor || 'default'}`]: true\n\t\t\t\t\t})}>${item.badge}</span>\n\t\t\t\t`)}\n\t\t\t\t${when(!!item.external, () => html`<ml-icon icon=\"arrow-square-out\" size=\"xs\"></ml-icon>`)}\n\t\t\t\t${when(hasChildren, () => html`\n\t\t\t\t\t<ml-icon\n\t\t\t\t\t\tclass=\"ml-sidebar__item-chevron\"\n\t\t\t\t\t\ticon=\"caret-right\"\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t></ml-icon>\n\t\t\t\t`)}\n\t\t\t</div>\n\t\t`)}\n\t`;\n\n\treturn html`\n\t\t<div class=\"ml-sidebar__item\" style=\"--level: ${level}\">\n\t\t\t${when(\n\t\t\t\t!!item.href && !hasChildren,\n\t\t\t\t() => html`\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=${linkClasses}\n\t\t\t\t\t\thref=${item.href}\n\t\t\t\t\t\t?target=${item.external ? '_blank' : null}\n\t\t\t\t\t\t?rel=${item.external ? 'noopener noreferrer' : null}\n\t\t\t\t\t\t@click=${handleClick}\n\t\t\t\t\t>\n\t\t\t\t\t\t${content}\n\t\t\t\t\t</a>\n\t\t\t\t`,\n\t\t\t\t() => html`\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=${linkClasses}\n\t\t\t\t\t\t?disabled=${item.disabled}\n\t\t\t\t\t\t@click=${handleClick}\n\t\t\t\t\t>\n\t\t\t\t\t\t${content}\n\t\t\t\t\t</button>\n\t\t\t\t`\n\t\t\t)}\n\t\t\t${when(hasChildren && isExpanded && !isCollapsed, () => html`\n\t\t\t\t<div class=\"ml-sidebar__item-submenu\">\n\t\t\t\t\t${repeat(\n\t\t\t\t\t\titem.children!,\n\t\t\t\t\t\t(child) => child.value,\n\t\t\t\t\t\t(child) => renderNavItem(c, child, level + 1)\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const sidebarStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t SIDEBAR CONTAINER\n\t ============================================ */\n\t.ml-sidebar {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\twidth: var(--ml-sidebar-width, 280px);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t\ttransition: width var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t/* Slim variant - collapsed (icons only) */\n\t.ml-sidebar--slim {\n\t\t--ml-sidebar-width: 64px;\n\t\toverflow: hidden;\n\t}\n\n\t/* Slim variant - expanded on hover */\n\t.ml-sidebar--slim:not(.ml-sidebar--collapsed) {\n\t\t--ml-sidebar-width: 280px;\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tz-index: 50;\n\t\tposition: relative;\n\t}\n\n\t/* ============================================\n\t HEADER\n\t ============================================ */\n\t.ml-sidebar__header {\n\t\tflex-shrink: 0;\n\t\tpadding: var(--ml-space-4);\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-sidebar__header:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t SEARCH\n\t ============================================ */\n\t.ml-sidebar__search {\n\t\tflex-shrink: 0;\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t}\n\n\t/* ============================================\n\t MAIN NAV AREA\n\t ============================================ */\n\t.ml-sidebar__main {\n\t\tflex: 1;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tpadding: var(--ml-space-2) 0;\n\t}\n\n\t/* Scrollbar styling */\n\t.ml-sidebar__main::-webkit-scrollbar {\n\t\twidth: 4px;\n\t}\n\n\t.ml-sidebar__main::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\n\t.ml-sidebar__main::-webkit-scrollbar-thumb {\n\t\tbackground-color: var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t/* ============================================\n\t FOOTER\n\t ============================================ */\n\t.ml-sidebar__footer {\n\t\tflex-shrink: 0;\n\t\tmargin-top: auto;\n\t\tborder-top: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t.ml-sidebar__footer-nav {\n\t\tpadding: var(--ml-space-2);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t}\n\n\t.ml-sidebar__footer-nav:empty {\n\t\tdisplay: none;\n\t}\n\n\t.ml-sidebar__feature {\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t}\n\n\t.ml-sidebar__user {\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t\tborder-top: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t/* ============================================\n\t CONFIG-RENDERED GROUPS\n\t ============================================ */\n\t.ml-sidebar__group {\n\t\tpadding: var(--ml-space-1) 0;\n\t}\n\n\t.ml-sidebar__group-label {\n\t\tdisplay: block;\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-sidebar__group-items {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t\tpadding: 0 var(--ml-space-2);\n\t}\n\n\t/* ============================================\n\t CONFIG-RENDERED ITEMS\n\t ============================================ */\n\t.ml-sidebar__item {\n\t\t--level: 0;\n\t}\n\n\t.ml-sidebar__item-link {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t\tbox-sizing: border-box;\n\t\twidth: 100%;\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tpadding-left: calc(var(--ml-space-3) + (var(--level) * var(--ml-space-5)));\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius);\n\t\tbackground: transparent;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: var(--ml-leading-tight);\n\t\ttext-align: left;\n\t\ttext-decoration: none;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-sidebar__item-link:hover:not(.ml-sidebar__item-link--disabled):not(.ml-sidebar__item-link--active) {\n\t\tbackground-color: var(--ml-gray-100);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-sidebar__item-link:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: -2px;\n\t}\n\n\t.ml-sidebar__item-link--active {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-sidebar__item-link--active:hover {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-sidebar__item-link--disabled {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t\topacity: 0.6;\n\t}\n\n\t.ml-sidebar__item-link--collapsed {\n\t\tjustify-content: center;\n\t\tpadding: var(--ml-space-2);\n\t}\n\n\t/* Leading area (icon) */\n\t.ml-sidebar__item-leading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tcolor: inherit;\n\t}\n\n\t/* Label */\n\t.ml-sidebar__item-label {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t/* Trailing area */\n\t.ml-sidebar__item-trailing {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tflex-shrink: 0;\n\t}\n\n\t/* Badge */\n\t.ml-sidebar__item-badge {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-width: 20px;\n\t\theight: 20px;\n\t\tpadding: 0 var(--ml-space-1-5);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\tbackground-color: var(--ml-color-surface-tertiary);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-sidebar__item-badge--primary {\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-sidebar__item-badge--success {\n\t\tbackground-color: var(--ml-color-success-subtle);\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t.ml-sidebar__item-badge--warning {\n\t\tbackground-color: var(--ml-color-warning-subtle);\n\t\tcolor: var(--ml-color-warning);\n\t}\n\n\t.ml-sidebar__item-badge--error {\n\t\tbackground-color: var(--ml-color-error-subtle);\n\t\tcolor: var(--ml-color-error);\n\t}\n\n\t/* Chevron for expandable items */\n\t.ml-sidebar__item-chevron {\n\t\ttransition: transform var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-sidebar__item-link--expanded .ml-sidebar__item-chevron {\n\t\ttransform: rotate(90deg);\n\t}\n\n\t/* Submenu */\n\t.ml-sidebar__item-submenu {\n\t\toverflow: hidden;\n\t}\n\n\t/* ============================================\n\t COLLAPSED STATE (slim + collapsed)\n\t ============================================ */\n\t.ml-sidebar--collapsed .ml-sidebar__search,\n\t.ml-sidebar--collapsed .ml-sidebar__feature,\n\t.ml-sidebar--collapsed .ml-sidebar__group-label {\n\t\tdisplay: none;\n\t}\n\n\t/* Slotted elements in collapsed state */\n\t::slotted([slot=\"search\"]),\n\t::slotted([slot=\"feature\"]) {\n\t\ttransition: opacity var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender } from '@melodicdev/core';\nimport type { SidebarVariant, SidebarNavGroup, SidebarNavItem } from './sidebar.types.js';\nimport { sidebarTemplate } from './sidebar.template.js';\nimport { sidebarStyles } from './sidebar.styles.js';\n\n/**\n * ml-sidebar - App-level sidebar navigation component\n *\n * @example Slotted mode:\n * ```html\n * <ml-sidebar active=\"home\">\n * <div slot=\"header\">Logo</div>\n * <ml-sidebar-group label=\"GENERAL\">\n * <ml-sidebar-item icon=\"house\" label=\"Home\" value=\"home\"></ml-sidebar-item>\n * </ml-sidebar-group>\n * </ml-sidebar>\n * ```\n *\n * @example Config mode:\n * ```html\n * <ml-sidebar active=\"home\" .navigation=${navGroups}></ml-sidebar>\n * ```\n *\n * @slot header - Logo/branding area\n * @slot search - Search input area\n * @slot default - Navigation content (groups and items)\n * @slot footer-nav - Footer navigation items\n * @slot feature - Feature promotion card\n * @slot user - User profile area\n *\n * @fires ml:change - Emitted when active item changes\n * @fires ml:item-click - Emitted when any item is clicked\n */\n@MelodicComponent({\n\tselector: 'ml-sidebar',\n\ttemplate: sidebarTemplate,\n\tstyles: sidebarStyles,\n\tattributes: ['variant', 'active']\n})\nexport class SidebarComponent implements IElementRef, OnCreate, OnDestroy, OnRender {\n\telementRef!: HTMLElement;\n\n\t/** Visual variant */\n\tvariant: SidebarVariant = 'default';\n\n\t/** Currently active item value */\n\tactive = '';\n\n\t/** Collapsed state (controlled by slim variant hover) */\n\tcollapsed = false;\n\n\t/** Navigation config (alternative to slotted content) */\n\tnavigation: SidebarNavGroup[] = [];\n\n\t/** Footer navigation config */\n\tfooterNavigation: SidebarNavItem[] = [];\n\n\t/** Internal tracking of slotted items */\n\t_slottedItems: HTMLElement[] = [];\n\n\t/** Debounce timer for hover */\n\tprivate _hoverTimer: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Bound event handlers */\n\tprivate readonly _handleItemClick = this.onItemClick.bind(this);\n\tprivate readonly _handleMouseEnter = this.onMouseEnter.bind(this);\n\tprivate readonly _handleMouseLeave = this.onMouseLeave.bind(this);\n\n\t/** Check if search slot has content */\n\tget hasSearch(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"search\"]') !== null;\n\t}\n\n\t/** Check if feature slot has content */\n\tget hasFeature(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"feature\"]') !== null;\n\t}\n\n\t/** Check if user slot has content */\n\tget hasUser(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"user\"]') !== null;\n\t}\n\n\tonCreate(): void {\n\t\t// Set initial collapsed state based on variant\n\t\tif (this.variant === 'slim') {\n\t\t\tthis.collapsed = true;\n\t\t}\n\n\t\t// Listen for item click events from children\n\t\tthis.elementRef.addEventListener('ml:sidebar-item-click', this._handleItemClick as EventListener);\n\n\t\t// Set up hover for slim variant\n\t\tif (this.variant === 'slim') {\n\t\t\tthis.elementRef.addEventListener('mouseenter', this._handleMouseEnter);\n\t\t\tthis.elementRef.addEventListener('mouseleave', this._handleMouseLeave);\n\t\t}\n\t}\n\n\tonRender(): void {\n\t\tthis.updateItemStates();\n\t}\n\n\tonDestroy(): void {\n\t\tthis.elementRef.removeEventListener('ml:sidebar-item-click', this._handleItemClick as EventListener);\n\t\tthis.elementRef.removeEventListener('mouseenter', this._handleMouseEnter);\n\t\tthis.elementRef.removeEventListener('mouseleave', this._handleMouseLeave);\n\n\t\tif (this._hoverTimer) {\n\t\t\tclearTimeout(this._hoverTimer);\n\t\t}\n\t}\n\n\t/** Handle slotted items change */\n\thandleDefaultSlotChange = (event: Event): void => {\n\t\tconst slot = event.target as HTMLSlotElement;\n\t\tthis._slottedItems = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\t\tthis.updateItemStates();\n\t};\n\n\t/** Handle config item click */\n\thandleConfigItemClick = (value: string, href?: string): void => {\n\t\tthis.activateItem(value, href);\n\t};\n\n\t/** Handle config submenu toggle */\n\thandleConfigToggle = (item: SidebarNavItem, expandedItems: Set<string>): void => {\n\t\tif (expandedItems.has(item.value)) {\n\t\t\texpandedItems.delete(item.value);\n\t\t} else {\n\t\t\texpandedItems.add(item.value);\n\t\t}\n\t\t// Trigger re-render\n\t\tthis.elementRef.dispatchEvent(new Event('ml:internal-update'));\n\t};\n\n\t/** Keyboard navigation */\n\thandleKeyDown = (event: KeyboardEvent): void => {\n\t\tconst sidebar = this.elementRef.shadowRoot?.querySelector('.ml-sidebar__main');\n\t\tif (!sidebar) return;\n\n\t\tconst focusable = Array.from(\n\t\t\tsidebar.querySelectorAll<HTMLElement>('.ml-sidebar__item-link:not([disabled]), button:not([disabled]), a')\n\t\t);\n\t\tconst currentIndex = focusable.indexOf(event.target as HTMLElement);\n\n\t\tlet newIndex = currentIndex;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex > 0 ? currentIndex - 1 : focusable.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex < focusable.length - 1 ? currentIndex + 1 : 0;\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = focusable.length - 1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (newIndex !== currentIndex && focusable[newIndex]) {\n\t\t\tfocusable[newIndex].focus();\n\t\t}\n\t};\n\n\t/** Track expanded config items */\n\t_expandedItems = new Set<string>();\n\n\t/** Activate an item */\n\tprivate activateItem(value: string, href?: string): void {\n\t\tthis.active = value;\n\t\tthis.updateItemStates();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value }\n\t\t\t})\n\t\t);\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:item-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value, href }\n\t\t\t})\n\t\t);\n\t}\n\n\t/** Handle item click from slotted children */\n\tprivate onItemClick(event: CustomEvent): void {\n\t\tconst { value, href } = event.detail;\n\t\tthis.activateItem(value, href);\n\t}\n\n\t/** Handle mouse enter for slim variant */\n\tprivate onMouseEnter(): void {\n\t\tif (this.variant !== 'slim') return;\n\t\tif (this._hoverTimer) clearTimeout(this._hoverTimer);\n\t\tthis._hoverTimer = setTimeout(() => {\n\t\t\tthis.collapsed = false;\n\t\t\tthis.updateItemStates();\n\t\t}, 150);\n\t}\n\n\t/** Handle mouse leave for slim variant */\n\tprivate onMouseLeave(): void {\n\t\tif (this.variant !== 'slim') return;\n\t\tif (this._hoverTimer) clearTimeout(this._hoverTimer);\n\t\tthis._hoverTimer = setTimeout(() => {\n\t\t\tthis.collapsed = true;\n\t\t\tthis.updateItemStates();\n\t\t}, 150);\n\t}\n\n\t/** Propagate active/collapsed state to slotted children */\n\tprivate updateItemStates(): void {\n\t\t// Update slotted sidebar items\n\t\tconst items = this.elementRef.querySelectorAll('ml-sidebar-item');\n\t\titems.forEach((item) => {\n\t\t\tconst value = item.getAttribute('value') || '';\n\t\t\titem.toggleAttribute('active', value === this.active);\n\t\t\titem.toggleAttribute('collapsed', this.collapsed);\n\t\t});\n\n\t\t// Update slotted sidebar groups\n\t\tconst groups = this.elementRef.querySelectorAll('ml-sidebar-group');\n\t\tgroups.forEach((group) => {\n\t\t\tgroup.toggleAttribute('collapsed', this.collapsed);\n\t\t});\n\t}\n}\n","import { html, when } from '@melodicdev/core';\nimport type { SidebarGroupComponent } from './sidebar-group.component.js';\n\nexport function sidebarGroupTemplate(c: SidebarGroupComponent) {\n\treturn html`\n\t\t<div class=\"ml-sidebar-group\">\n\t\t\t${when(!!c.label && !c.collapsed, () => html`\n\t\t\t\t<span class=\"ml-sidebar-group__label\">${c.label}</span>\n\t\t\t`)}\n\t\t\t<div class=\"ml-sidebar-group__items\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const sidebarGroupStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-sidebar-group {\n\t\tpadding: var(--ml-space-1) 0;\n\t}\n\n\t.ml-sidebar-group__label {\n\t\tdisplay: block;\n\t\tpadding: var(--ml-space-2) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text-muted);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-sidebar-group__items {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-0-5);\n\t\tpadding: 0 var(--ml-space-2);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { sidebarGroupTemplate } from './sidebar-group.template.js';\nimport { sidebarGroupStyles } from './sidebar-group.styles.js';\n\n/**\n * ml-sidebar-group - Section group with optional heading for sidebar navigation\n *\n * @example\n * ```html\n * <ml-sidebar-group label=\"GENERAL\">\n * <ml-sidebar-item icon=\"house\" label=\"Home\" value=\"home\"></ml-sidebar-item>\n * <ml-sidebar-item icon=\"chart-bar\" label=\"Dashboard\" value=\"dashboard\"></ml-sidebar-item>\n * </ml-sidebar-group>\n * ```\n *\n * @slot default - Sidebar items\n */\n@MelodicComponent({\n\tselector: 'ml-sidebar-group',\n\ttemplate: sidebarGroupTemplate,\n\tstyles: sidebarGroupStyles,\n\tattributes: ['label', 'collapsed']\n})\nexport class SidebarGroupComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Group heading label */\n\tlabel = '';\n\n\t/** Collapsed state (set by parent sidebar) */\n\tcollapsed = false;\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { SidebarItemComponent } from './sidebar-item.component.js';\n\nexport function sidebarItemTemplate(c: SidebarItemComponent) {\n\tconst level = parseInt(c.level, 10) || 0;\n\tconst isCollapsed = c.collapsed;\n\n\tconst content = html`\n\t\t<div class=\"ml-sidebar-item__leading\">\n\t\t\t<slot name=\"leading\">\n\t\t\t\t${when(!!c.icon, () => html`<ml-icon icon=${c.icon} size=\"sm\"></ml-icon>`)}\n\t\t\t</slot>\n\t\t</div>\n\t\t${when(!isCollapsed, () => html`\n\t\t\t<span class=\"ml-sidebar-item__label\">${c.label}</span>\n\t\t\t<div class=\"ml-sidebar-item__trailing\">\n\t\t\t\t<slot name=\"trailing\">\n\t\t\t\t\t${when(!!c.badge, () => html`\n\t\t\t\t\t\t<span class=${classMap({\n\t\t\t\t\t\t\t'ml-sidebar-item__badge': true,\n\t\t\t\t\t\t\t[`ml-sidebar-item__badge--${c['badge-color']}`]: true\n\t\t\t\t\t\t})}>${c.badge}</span>\n\t\t\t\t\t`)}\n\t\t\t\t\t${when(c.external, () => html`<ml-icon icon=\"arrow-square-out\" size=\"xs\"></ml-icon>`)}\n\t\t\t\t</slot>\n\t\t\t\t${when(c.hasChildren, () => html`\n\t\t\t\t\t<ml-icon\n\t\t\t\t\t\tclass=\"ml-sidebar-item__chevron\"\n\t\t\t\t\t\ticon=\"caret-right\"\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t></ml-icon>\n\t\t\t\t`)}\n\t\t\t</div>\n\t\t`)}\n\t`;\n\n\tconst linkClasses = classMap({\n\t\t'ml-sidebar-item__link': true,\n\t\t'ml-sidebar-item__link--active': c.active,\n\t\t'ml-sidebar-item__link--disabled': c.disabled,\n\t\t'ml-sidebar-item__link--expanded': c.expanded,\n\t\t'ml-sidebar-item__link--collapsed': isCollapsed,\n\t\t'ml-sidebar-item__link--has-children': c.hasChildren\n\t});\n\n\treturn html`\n\t\t<div class=\"ml-sidebar-item\" style=\"--level: ${level}\">\n\t\t\t${when(\n\t\t\t\t!!c.href && !c.hasChildren,\n\t\t\t\t() => html`\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=${linkClasses}\n\t\t\t\t\t\thref=${c.href}\n\t\t\t\t\t\t?target=${c.external ? '_blank' : null}\n\t\t\t\t\t\t?rel=${c.external ? 'noopener noreferrer' : null}\n\t\t\t\t\t\t@click=${c.handleClick}\n\t\t\t\t\t>\n\t\t\t\t\t\t${content}\n\t\t\t\t\t</a>\n\t\t\t\t`,\n\t\t\t\t() => html`\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=${linkClasses}\n\t\t\t\t\t\t?disabled=${c.disabled}\n\t\t\t\t\t\t@click=${c.handleClick}\n\t\t\t\t\t>\n\t\t\t\t\t\t${content}\n\t\t\t\t\t</button>\n\t\t\t\t`\n\t\t\t)}\n\t\t\t${when(c.hasChildren && c.expanded && !isCollapsed, () => html`\n\t\t\t\t<div class=\"ml-sidebar-item__submenu\">\n\t\t\t\t\t<slot @slotchange=${c.handleSlotChange}></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t\t${when(!c.hasChildren || !c.expanded || isCollapsed, () => html`\n\t\t\t\t<div style=\"display: none\">\n\t\t\t\t\t<slot @slotchange=${c.handleSlotChange}></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const sidebarItemStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-sidebar-item {\n\t\t--level: 0;\n\t}\n\n\t.ml-sidebar-item__link {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-3);\n\t\tbox-sizing: border-box;\n\t\twidth: 100%;\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tpadding-left: calc(var(--ml-space-3) + (var(--level) * var(--ml-space-5)));\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius);\n\t\tbackground: transparent;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: var(--ml-leading-tight);\n\t\ttext-align: left;\n\t\ttext-decoration: none;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-sidebar-item__link:hover:not(.ml-sidebar-item__link--disabled):not(.ml-sidebar-item__link--active) {\n\t\tbackground-color: var(--ml-gray-100);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-sidebar-item__link:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: -2px;\n\t}\n\n\t.ml-sidebar-item__link--active {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-sidebar-item__link--active:hover {\n\t\tbackground-color: var(--ml-color-primary-hover);\n\t\tcolor: var(--ml-color-text-inverse);\n\t}\n\n\t.ml-sidebar-item__link--disabled {\n\t\tcolor: var(--ml-color-text-muted);\n\t\tcursor: not-allowed;\n\t\topacity: 0.6;\n\t}\n\n\t.ml-sidebar-item__link--collapsed {\n\t\tjustify-content: center;\n\t\tpadding: var(--ml-space-2);\n\t}\n\n\t/* Leading area (icon) */\n\t.ml-sidebar-item__leading {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tcolor: inherit;\n\t}\n\n\t/* Label */\n\t.ml-sidebar-item__label {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t:host([collapsed]) .ml-sidebar-item__label {\n\t\tdisplay: none;\n\t}\n\n\t/* Trailing area */\n\t.ml-sidebar-item__trailing {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tflex-shrink: 0;\n\t}\n\n\t:host([collapsed]) .ml-sidebar-item__trailing {\n\t\tdisplay: none;\n\t}\n\n\t/* Badge */\n\t.ml-sidebar-item__badge {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-width: 20px;\n\t\theight: 20px;\n\t\tpadding: 0 var(--ml-space-1-5);\n\t\tborder-radius: var(--ml-radius-full);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: 1;\n\t\tbackground-color: var(--ml-color-surface-tertiary);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-sidebar-item__badge--primary {\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-sidebar-item__badge--success {\n\t\tbackground-color: var(--ml-color-success-subtle);\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t.ml-sidebar-item__badge--warning {\n\t\tbackground-color: var(--ml-color-warning-subtle);\n\t\tcolor: var(--ml-color-warning);\n\t}\n\n\t.ml-sidebar-item__badge--error {\n\t\tbackground-color: var(--ml-color-error-subtle);\n\t\tcolor: var(--ml-color-error);\n\t}\n\n\t/* Chevron for expandable items */\n\t.ml-sidebar-item__chevron {\n\t\ttransition: transform var(--ml-duration-200) var(--ml-ease-in-out);\n\t}\n\n\t.ml-sidebar-item__link--expanded .ml-sidebar-item__chevron {\n\t\ttransform: rotate(90deg);\n\t}\n\n\t/* Submenu */\n\t.ml-sidebar-item__submenu {\n\t\toverflow: hidden;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport type { BadgeColor } from './sidebar.types.js';\nimport { sidebarItemTemplate } from './sidebar-item.template.js';\nimport { sidebarItemStyles } from './sidebar-item.styles.js';\n\n/**\n * ml-sidebar-item - Navigation link for use within ml-sidebar\n *\n * @example\n * ```html\n * <ml-sidebar-item icon=\"house\" label=\"Home\" value=\"home\" active></ml-sidebar-item>\n * <ml-sidebar-item icon=\"folder\" label=\"Projects\" value=\"projects\" badge=\"5\">\n * <ml-sidebar-item label=\"Active\" value=\"active\" level=\"1\"></ml-sidebar-item>\n * <ml-sidebar-item label=\"Archived\" value=\"archived\" level=\"1\"></ml-sidebar-item>\n * </ml-sidebar-item>\n * ```\n *\n * @slot leading - Custom icon/avatar override\n * @slot trailing - Custom trailing content\n * @slot default - Sub-items for expandable menu\n *\n * @fires ml:sidebar-item-click - Emitted when item is clicked (bubbles to parent sidebar)\n */\n@MelodicComponent({\n\tselector: 'ml-sidebar-item',\n\ttemplate: sidebarItemTemplate,\n\tstyles: sidebarItemStyles,\n\tattributes: ['icon', 'label', 'value', 'href', 'active', 'disabled', 'badge', 'badge-color', 'external', 'expanded', 'collapsed', 'level']\n})\nexport class SidebarItemComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Icon name */\n\ticon = '';\n\n\t/** Display label */\n\tlabel = '';\n\n\t/** Unique value identifier */\n\tvalue = '';\n\n\t/** Navigation URL */\n\thref = '';\n\n\t/** Active state (managed by parent sidebar) */\n\tactive = false;\n\n\t/** Disabled state */\n\tdisabled = false;\n\n\t/** Badge text */\n\tbadge = '';\n\n\t/** Badge color variant */\n\t'badge-color': BadgeColor = 'default';\n\n\t/** External link */\n\texternal = false;\n\n\t/** Submenu expanded state */\n\texpanded = false;\n\n\t/** Collapsed state (set by parent sidebar in slim mode) */\n\tcollapsed = false;\n\n\t/** Indentation level for nested items */\n\tlevel = '0';\n\n\t/** Track slotted children */\n\t_hasChildren = false;\n\n\t/** Check if default slot has children */\n\tget hasChildren(): boolean {\n\t\treturn this._hasChildren;\n\t}\n\n\tonCreate(): void {\n\t\t// Check for slotted children\n\t\tthis._hasChildren = this.elementRef.querySelector('ml-sidebar-item') !== null;\n\t}\n\n\tonDestroy(): void {\n\t\t// cleanup if needed\n\t}\n\n\t/** Handle default slot change to detect children */\n\thandleSlotChange = (event: Event): void => {\n\t\tconst slot = event.target as HTMLSlotElement;\n\t\tconst assigned = slot.assignedElements({ flatten: true });\n\t\tthis._hasChildren = assigned.some((el) => el.tagName === 'ML-SIDEBAR-ITEM');\n\t};\n\n\t/** Handle click on item */\n\thandleClick = (event: Event): void => {\n\t\tif (this.disabled) return;\n\n\t\tif (this.hasChildren) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.expanded = !this.expanded;\n\t\t\tthis.elementRef.toggleAttribute('expanded', this.expanded);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:sidebar-item-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, href: this.href }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html, classMap, repeat, when } from '@melodicdev/core';\nimport type { StepsComponent } from './steps.component.js';\nimport type { StepConfig } from './steps.types.js';\n\nexport function stepsTemplate(c: StepsComponent) {\n\tconst hasSteps = c.steps.length > 0;\n\tconst isCompact = c.compact;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-steps': true,\n\t\t\t\t[`ml-steps--${c.variant}`]: true,\n\t\t\t\t[`ml-steps--${c.orientation}`]: true,\n\t\t\t\t'ml-steps--compact': isCompact\n\t\t\t})}\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"ml-steps__list\"\n\t\t\t\trole=\"tablist\"\n\t\t\t\taria-orientation=${c.orientation}\n\t\t\t\t@keydown=${c.handleKeyDown}\n\t\t\t>\n\t\t\t\t${hasSteps\n\t\t\t\t\t? repeat(\n\t\t\t\t\t\t\tc.steps,\n\t\t\t\t\t\t\t(step) => `${step.value}-${c.active === step.value}`,\n\t\t\t\t\t\t\t(step, index) => renderConfigStep(c, step, index)\n\t\t\t\t\t\t)\n\t\t\t\t\t: html`<slot name=\"step\" @slotchange=${c.handleStepSlotChange}></slot>`}\n\t\t\t</div>\n\n\t\t\t${when(isCompact, () => html`\n\t\t\t\t<div class=\"ml-steps__compact-label\">\n\t\t\t\t\tStep ${c.getCurrentStepNumber()} of ${c.getTotalSteps()}\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-steps__panels\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\nfunction renderConfigStep(c: StepsComponent, step: StepConfig, index: number) {\n\tconst allSteps = c.steps;\n\tconst isFirst = index === 0;\n\tconst isLast = index === allSteps.length - 1;\n\tconst status = c.getStepStatus(step.value);\n\tconst isBar = c.variant === 'bar';\n\tconst isCompact = c.compact;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-step': true,\n\t\t\t\t[`ml-step--${status}`]: true,\n\t\t\t\t[`ml-step--${c.variant}`]: true,\n\t\t\t\t[`ml-step--${c.orientation}`]: true,\n\t\t\t\t[`ml-step--${c.color}`]: true,\n\t\t\t\t'ml-step--first': isFirst,\n\t\t\t\t'ml-step--last': isLast,\n\t\t\t\t'ml-step--disabled': !!step.disabled,\n\t\t\t\t'ml-step--compact': isCompact\n\t\t\t})}\n\t\t\trole=\"tab\"\n\t\t\tdata-value=${step.value}\n\t\t\taria-selected=${status === 'current'}\n\t\t\taria-disabled=${step.disabled || false}\n\t\t\ttabindex=${status === 'current' ? '0' : '-1'}\n\t\t\t@click=${() => c.handleStepClick(step.value, step.href)}\n\t\t>\n\t\t\t${when(isBar, () => renderBarStep(c, step))}\n\t\t\t${when(!isBar && !isCompact, () => renderStandardStep(c, step, index, isFirst, isLast, status))}\n\t\t\t${when(!isBar && isCompact, () => renderCompactDot(c, status))}\n\t\t</div>\n\t`;\n}\n\nfunction renderBarStep(_c: StepsComponent, step: StepConfig) {\n\treturn html`\n\t\t<div class=\"ml-step__bar\"></div>\n\t\t<div class=\"ml-step__content\">\n\t\t\t<span class=\"ml-step__label\">${step.label}</span>\n\t\t\t${when(!!step.description, () => html`<span class=\"ml-step__description\">${step.description}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderStandardStep(c: StepsComponent, step: StepConfig, index: number, isFirst: boolean, isLast: boolean, status: string) {\n\treturn html`\n\t\t<div class=\"ml-step__track\">\n\t\t\t<div class=\"ml-step__connector-before ${isFirst ? 'ml-step__connector--hidden' : `ml-step__connector--${c.connector}`}\"></div>\n\t\t\t<div class=\"ml-step__indicator\">\n\t\t\t\t${renderConfigIndicator(c, step, index, status)}\n\t\t\t</div>\n\t\t\t<div class=\"ml-step__connector-after ${isLast ? 'ml-step__connector--hidden' : `ml-step__connector--${c.connector}`}\"></div>\n\t\t</div>\n\t\t<div class=\"ml-step__content\">\n\t\t\t<span class=\"ml-step__label\">${step.label}</span>\n\t\t\t${when(!!step.description, () => html`<span class=\"ml-step__description\">${step.description}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderCompactDot(_c: StepsComponent, _status: string) {\n\treturn html`<div class=\"ml-step__dot\"></div>`;\n}\n\nfunction renderConfigIndicator(c: StepsComponent, step: StepConfig, index: number, status: string) {\n\tswitch (c.variant) {\n\t\tcase 'numbered':\n\t\t\treturn html`\n\t\t\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--numbered\">\n\t\t\t\t\t${when(status === 'completed', () => html`<ml-icon icon=\"check\" size=\"sm\"></ml-icon>`)}\n\t\t\t\t\t${when(status !== 'completed', () => html`<span>${index + 1}</span>`)}\n\t\t\t\t</div>\n\t\t\t`;\n\t\tcase 'circles':\n\t\t\treturn html`\n\t\t\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--circles\">\n\t\t\t\t\t${when(status === 'completed', () => html`<ml-icon icon=\"check\" size=\"sm\"></ml-icon>`)}\n\t\t\t\t\t${when(status !== 'completed', () => html`<div class=\"ml-step__indicator-dot\"></div>`)}\n\t\t\t\t</div>\n\t\t\t`;\n\t\tcase 'icons':\n\t\t\treturn html`\n\t\t\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--icons\">\n\t\t\t\t\t<ml-icon icon=${step.icon || 'circle'} size=\"sm\"></ml-icon>\n\t\t\t\t</div>\n\t\t\t`;\n\t\tdefault:\n\t\t\treturn html``;\n\t}\n}\n","import { css } from '@melodicdev/core';\n\nexport const stepsStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.ml-steps {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* ============================================\n\t STEP LIST\n\t ============================================ */\n\t.ml-steps__list {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t.ml-steps--horizontal .ml-steps__list {\n\t\tflex-direction: row;\n\t}\n\n\t.ml-steps--vertical .ml-steps__list {\n\t\tflex-direction: column;\n\t}\n\n\t/* ============================================\n\t COMPACT LABEL (Step X of Y)\n\t ============================================ */\n\t.ml-steps--compact .ml-steps__list {\n\t\tgap: var(--ml-space-3);\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t}\n\n\t.ml-steps__compact-label {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\ttext-align: center;\n\t\tmargin-top: var(--ml-space-3);\n\t}\n\n\t/* ============================================\n\t PANELS\n\t ============================================ */\n\t.ml-steps__panels {\n\t\tpadding-top: var(--ml-space-6);\n\t}\n\n\t.ml-steps--compact .ml-steps__panels {\n\t\tpadding-top: var(--ml-space-4);\n\t}\n\n\t/* ============================================\n\t INLINE STEP STYLES (for config-mode rendering)\n\t These mirror step.styles.ts for config-rendered steps\n\t ============================================ */\n\n\t/* Base step */\n\t.ml-step {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tcursor: pointer;\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-step--disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n\n\t.ml-step:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: 2px;\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t/* Horizontal layout */\n\t.ml-step--horizontal {\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\n\t.ml-step--horizontal .ml-step__track {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin-bottom: var(--ml-space-3);\n\t}\n\n\t.ml-step--horizontal .ml-step__connector-before,\n\t.ml-step--horizontal .ml-step__connector-after {\n\t\tflex: 1;\n\t\theight: 2px;\n\t}\n\n\t.ml-step--horizontal .ml-step__connector--hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t/* Vertical layout */\n\t.ml-step--vertical {\n\t\tflex-direction: row;\n\t\talign-items: stretch;\n\t\ttext-align: left;\n\t}\n\n\t.ml-step--vertical .ml-step__track {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tmargin-right: var(--ml-space-3);\n\t}\n\n\t.ml-step--vertical .ml-step__connector-before,\n\t.ml-step--vertical .ml-step__connector-after {\n\t\tflex: 1;\n\t\twidth: 2px;\n\t\tmin-height: 12px;\n\t}\n\n\t.ml-step--vertical .ml-step__connector--hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t.ml-step--vertical .ml-step__content {\n\t\tpadding-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-step--vertical.ml-step--last .ml-step__content {\n\t\tpadding-bottom: 0;\n\t}\n\n\t/* Connectors */\n\t.ml-step__connector-before,\n\t.ml-step__connector-after {\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-step__connector--dotted {\n\t\tbackground-color: transparent !important;\n\t}\n\n\t.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-border) 0,\n\t\t\tvar(--ml-color-border) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t\tbackground-size: 100% 2px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\n\t.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-border) 0,\n\t\t\tvar(--ml-color-border) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t\tbackground-size: 2px 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\n\t/* Connector coloring - completed */\n\t.ml-step--completed.ml-step--primary .ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--completed.ml-step--success .ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\t.ml-step--completed.ml-step--primary.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--success.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--primary.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--success.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\n\t/* Connector coloring - current (before colored, after gray) */\n\t.ml-step--current.ml-step--primary .ml-step__connector-before.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--current.ml-step--success .ml-step__connector-before.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\t.ml-step--current.ml-step--primary.ml-step--horizontal .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--success.ml-step--horizontal .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--primary.ml-step--vertical .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--success.ml-step--vertical .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\n\t/* ============================================\n\t INDICATOR\n\t ============================================ */\n\t.ml-step__indicator {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-step__indicator-inner {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* Numbered */\n\t.ml-step__indicator-inner--numbered {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 50%;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t.ml-step--upcoming .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-border);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-step--current.ml-step--primary .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-step--current.ml-step--success .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--numbered {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: #fff;\n\t}\n\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--numbered {\n\t\tbackground-color: var(--ml-color-success);\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: #fff;\n\t}\n\n\t/* Circles */\n\t.ml-step__indicator-inner--circles {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 50%;\n\t}\n\n\t.ml-step__indicator-dot {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t\tborder-radius: 50%;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--upcoming .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--upcoming .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t.ml-step--current.ml-step--primary .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--current.ml-step--primary .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-step--current.ml-step--success .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--current.ml-step--success .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--circles {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: #fff;\n\t}\n\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--circles {\n\t\tbackground-color: var(--ml-color-success);\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: #fff;\n\t}\n\n\t/* Icons */\n\t.ml-step__indicator-inner--icons {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tborder: 2px solid var(--ml-color-border);\n\t}\n\n\t.ml-step--upcoming .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-step--current .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-text);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-success-subtle);\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t/* ============================================\n\t BAR VARIANT\n\t ============================================ */\n\t.ml-step--bar {\n\t\tflex-direction: column;\n\t\tgap: 0;\n\t}\n\n\t.ml-step--bar .ml-step__bar {\n\t\twidth: 100%;\n\t\theight: 4px;\n\t\tborder-radius: 2px;\n\t\tbackground-color: var(--ml-color-border);\n\t\tmargin-bottom: var(--ml-space-3);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--bar.ml-step--current.ml-step--primary .ml-step__bar,\n\t.ml-step--bar.ml-step--completed.ml-step--primary .ml-step__bar {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-step--bar.ml-step--current.ml-step--success .ml-step__bar,\n\t.ml-step--bar.ml-step--completed.ml-step--success .ml-step__bar {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t.ml-step--bar.ml-step--vertical {\n\t\tflex-direction: row;\n\t}\n\n\t.ml-step--bar.ml-step--vertical .ml-step__bar {\n\t\twidth: 4px;\n\t\theight: auto;\n\t\tmin-height: 40px;\n\t\tmargin-bottom: 0;\n\t\tmargin-right: var(--ml-space-3);\n\t}\n\n\t.ml-step--bar.ml-step--vertical .ml-step__content {\n\t\tpadding-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-step--bar.ml-step--vertical.ml-step--last .ml-step__content {\n\t\tpadding-bottom: 0;\n\t}\n\n\t/* ============================================\n\t COMPACT / DOTS\n\t ============================================ */\n\t.ml-step--compact {\n\t\tflex: 0 0 auto;\n\t\tmin-width: auto;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-step__dot {\n\t\twidth: 12px;\n\t\theight: 12px;\n\t\tborder-radius: 50%;\n\t\tbackground-color: var(--ml-color-border);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--compact.ml-step--current.ml-step--primary .ml-step__dot,\n\t.ml-step--compact.ml-step--completed.ml-step--primary .ml-step__dot {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t.ml-step--compact.ml-step--current.ml-step--success .ml-step__dot,\n\t.ml-step--compact.ml-step--completed.ml-step--success .ml-step__dot {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t/* ============================================\n\t CONTENT\n\t ============================================ */\n\t.ml-step__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t\tmin-width: 0;\n\t}\n\n\t.ml-step__label {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--upcoming .ml-step__label {\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-step--current.ml-step--primary .ml-step__label {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-step--current.ml-step--success .ml-step__label {\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t.ml-step__description {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t/* ============================================\n\t SLOTTED STEP STYLING\n\t ============================================ */\n\t::slotted(ml-step) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy, OnRender } from '@melodicdev/core';\nimport type { StepsVariant, StepsOrientation, StepsConnector, StepsColor, StepConfig, StepStatus } from './steps.types.js';\nimport { stepsTemplate } from './steps.template.js';\nimport { stepsStyles } from './steps.styles.js';\n\n/**\n * ml-steps - Multi-step progress/wizard component\n *\n * @example Config array mode:\n * ```html\n * <ml-steps active=\"company\" variant=\"circles\" .steps=${stepConfigs}>\n * <ml-step-panel value=\"details\">Step 1 content</ml-step-panel>\n * <ml-step-panel value=\"company\">Step 2 content</ml-step-panel>\n * </ml-steps>\n * ```\n *\n * @example Slotted mode:\n * ```html\n * <ml-steps active=\"company\" variant=\"numbered\">\n * <ml-step slot=\"step\" value=\"details\" label=\"Your details\"></ml-step>\n * <ml-step slot=\"step\" value=\"company\" label=\"Company\"></ml-step>\n * <ml-step-panel value=\"details\">Content 1</ml-step-panel>\n * <ml-step-panel value=\"company\">Content 2</ml-step-panel>\n * </ml-steps>\n * ```\n *\n * @slot step - Step header elements (ml-step)\n * @slot default - Step panel content or router-outlet\n *\n * @fires ml:change - Emitted when active step changes\n */\n@MelodicComponent({\n\tselector: 'ml-steps',\n\ttemplate: stepsTemplate,\n\tstyles: stepsStyles,\n\tattributes: ['active', 'variant', 'orientation', 'connector', 'color', 'compact', 'routed']\n})\nexport class StepsComponent implements IElementRef, OnCreate, OnDestroy, OnRender {\n\telementRef!: HTMLElement;\n\n\t/** Currently active step value */\n\tactive = '';\n\n\t/** Visual variant */\n\tvariant: StepsVariant = 'numbered';\n\n\t/** Layout orientation */\n\torientation: StepsOrientation = 'horizontal';\n\n\t/** Connector line style */\n\tconnector: StepsConnector = 'solid';\n\n\t/** Accent color */\n\tcolor: StepsColor = 'primary';\n\n\t/** Compact dots mode */\n\tcompact = false;\n\n\t/** Enable router integration */\n\trouted = false;\n\n\t/** Step configurations (alternative to slotted ml-step elements) */\n\tsteps: StepConfig[] = [];\n\n\t/** Internal tracking of slotted steps */\n\t_slottedSteps: HTMLElement[] = [];\n\n\t/** Navigation event listener for routed mode */\n\tprivate readonly _handleNavigation = this.onNavigation.bind(this);\n\n\tonCreate(): void {\n\t\t// Listen for step click events from slotted ml-step elements\n\t\tthis.elementRef.addEventListener('ml:step-click', this.handleSlottedStepClick as EventListener);\n\n\t\tif (this.routed) {\n\t\t\twindow.addEventListener('NavigationEvent', this._handleNavigation);\n\t\t\tthis.syncWithRoute();\n\t\t}\n\t}\n\n\tonRender(): void {\n\t\tthis.updatePanelVisibility();\n\t}\n\n\tonDestroy(): void {\n\t\tthis.elementRef.removeEventListener('ml:step-click', this.handleSlottedStepClick as EventListener);\n\n\t\tif (this.routed) {\n\t\t\twindow.removeEventListener('NavigationEvent', this._handleNavigation);\n\t\t}\n\t}\n\n\t/** Handle step slot changes */\n\thandleStepSlotChange = (event: Event): void => {\n\t\tconst slot = event.target as HTMLSlotElement;\n\t\tthis._slottedSteps = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n\t\t// Set initial value if not set\n\t\tif (!this.active && this._slottedSteps.length > 0) {\n\t\t\tconst firstStep = this._slottedSteps.find((step) => !step.hasAttribute('disabled'));\n\t\t\tif (firstStep) {\n\t\t\t\tthis.active = firstStep.getAttribute('value') || '';\n\t\t\t}\n\t\t}\n\n\t\tthis.updateSlottedStepStates();\n\t\tthis.updatePanelVisibility();\n\t};\n\n\t/** Handle step click (config mode) */\n\thandleStepClick = (stepValue: string, href?: string): void => {\n\t\tconst step = this.getStepByValue(stepValue);\n\t\tif (step?.disabled) return;\n\n\t\tif (this.routed && href) {\n\t\t\twindow.history.pushState({}, '', href);\n\t\t\twindow.dispatchEvent(new PopStateEvent('popstate'));\n\t\t}\n\n\t\tthis.active = stepValue;\n\t\tthis.updateSlottedStepStates();\n\t\tthis.updatePanelVisibility();\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:change', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: stepValue }\n\t\t\t})\n\t\t);\n\t};\n\n\t/** Handle slotted step click event */\n\tprivate handleSlottedStepClick = (event: CustomEvent): void => {\n\t\tconst { value, href } = event.detail;\n\t\tthis.handleStepClick(value, href);\n\t};\n\n\t/** Handle keyboard navigation */\n\thandleKeyDown = (event: KeyboardEvent): void => {\n\t\tconst allSteps = this.getAllSteps();\n\t\tconst enabledSteps = allSteps.filter((s) => !s.disabled);\n\t\tconst currentIndex = enabledSteps.findIndex((s) => s.value === this.active);\n\n\t\tlet newIndex = currentIndex;\n\t\tconst isVertical = this.orientation === 'vertical';\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tif (isVertical) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex > 0 ? currentIndex - 1 : enabledSteps.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowRight':\n\t\t\t\tif (isVertical) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex < enabledSteps.length - 1 ? currentIndex + 1 : 0;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (!isVertical) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex > 0 ? currentIndex - 1 : enabledSteps.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (!isVertical) return;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = currentIndex < enabledSteps.length - 1 ? currentIndex + 1 : 0;\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnewIndex = enabledSteps.length - 1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (newIndex !== currentIndex && enabledSteps[newIndex]) {\n\t\t\tconst step = enabledSteps[newIndex];\n\t\t\tthis.handleStepClick(step.value, step.href);\n\t\t\tthis.focusStep(step.value);\n\t\t}\n\t};\n\n\t/** Get status for a step based on its position relative to active */\n\tgetStepStatus(stepValue: string): StepStatus {\n\t\tconst allSteps = this.getAllSteps();\n\t\tconst activeIndex = allSteps.findIndex((s) => s.value === this.active);\n\t\tconst stepIndex = allSteps.findIndex((s) => s.value === stepValue);\n\n\t\tif (stepIndex < activeIndex) return 'completed';\n\t\tif (stepIndex === activeIndex) return 'current';\n\t\treturn 'upcoming';\n\t}\n\n\t/** Get current step index (1-based, for compact label) */\n\tgetCurrentStepNumber(): number {\n\t\tconst allSteps = this.getAllSteps();\n\t\tconst index = allSteps.findIndex((s) => s.value === this.active);\n\t\treturn index + 1;\n\t}\n\n\t/** Get total step count */\n\tgetTotalSteps(): number {\n\t\treturn this.getAllSteps().length;\n\t}\n\n\t/** Get all steps (from config or slotted) */\n\tgetAllSteps(): StepConfig[] {\n\t\tif (this.steps.length > 0) {\n\t\t\treturn this.steps;\n\t\t}\n\n\t\treturn this._slottedSteps.map((el) => ({\n\t\t\tvalue: el.getAttribute('value') || '',\n\t\t\tlabel: el.getAttribute('label') || el.textContent || '',\n\t\t\tdescription: el.getAttribute('description') || undefined,\n\t\t\ticon: el.getAttribute('icon') || undefined,\n\t\t\tdisabled: el.hasAttribute('disabled'),\n\t\t\thref: el.getAttribute('href') || undefined\n\t\t}));\n\t}\n\n\t/** Get step by value */\n\tprivate getStepByValue(value: string): StepConfig | undefined {\n\t\treturn this.getAllSteps().find((s) => s.value === value);\n\t}\n\n\t/** Update attributes on slotted steps */\n\tprivate updateSlottedStepStates(): void {\n\t\tconst allSteps = this.getAllSteps();\n\t\tthis._slottedSteps.forEach((step, index) => {\n\t\t\tconst value = step.getAttribute('value') || '';\n\t\t\tconst status = this.getStepStatus(value);\n\t\t\tstep.setAttribute('status', status);\n\t\t\tstep.setAttribute('variant', this.variant);\n\t\t\tstep.setAttribute('connector', this.connector);\n\t\t\tstep.setAttribute('color', this.color);\n\t\t\tstep.setAttribute('orientation', this.orientation);\n\t\t\tstep.setAttribute('step-number', String(index + 1));\n\t\t\tstep.toggleAttribute('first', index === 0);\n\t\t\tstep.toggleAttribute('last', index === allSteps.length - 1);\n\t\t\tstep.toggleAttribute('compact', this.compact);\n\t\t});\n\t}\n\n\t/** Update panel visibility */\n\tprivate updatePanelVisibility(): void {\n\t\tif (this.routed) return;\n\n\t\tconst panels = this.elementRef.querySelectorAll('ml-step-panel');\n\t\tpanels.forEach((panel) => {\n\t\t\tconst isActive = panel.getAttribute('value') === this.active;\n\t\t\t(panel as HTMLElement).style.display = isActive ? '' : 'none';\n\t\t});\n\t}\n\n\t/** Focus a specific step button */\n\tprivate focusStep(value: string): void {\n\t\tconst stepList = this.elementRef.shadowRoot?.querySelector('.ml-steps__list');\n\t\tconst button = stepList?.querySelector(`[data-value=\"${value}\"]`) as HTMLElement;\n\t\tbutton?.focus();\n\t}\n\n\t/** Sync active step with current route */\n\tprivate syncWithRoute(): void {\n\t\tconst path = window.location.pathname;\n\t\tconst matchingStep = this.getAllSteps().find((step) => step.href && path.startsWith(step.href));\n\t\tif (matchingStep) {\n\t\t\tthis.active = matchingStep.value;\n\t\t\tthis.updateSlottedStepStates();\n\t\t}\n\t}\n\n\t/** Handle navigation events (routed mode) */\n\tprivate onNavigation(): void {\n\t\tthis.syncWithRoute();\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { StepComponent } from './step.component.js';\n\nexport function stepTemplate(c: StepComponent) {\n\tconst isBar = c.variant === 'bar';\n\tconst isCompact = c.compact;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-step': true,\n\t\t\t\t[`ml-step--${c.status}`]: true,\n\t\t\t\t[`ml-step--${c.variant}`]: true,\n\t\t\t\t[`ml-step--${c.orientation}`]: true,\n\t\t\t\t[`ml-step--${c.color}`]: true,\n\t\t\t\t'ml-step--first': c.first,\n\t\t\t\t'ml-step--last': c.last,\n\t\t\t\t'ml-step--disabled': c.disabled,\n\t\t\t\t'ml-step--compact': isCompact\n\t\t\t})}\n\t\t\trole=\"tab\"\n\t\t\taria-selected=${c.status === 'current'}\n\t\t\taria-disabled=${c.disabled}\n\t\t\ttabindex=${c.status === 'current' ? '0' : '-1'}\n\t\t\t@click=${c.handleClick}\n\t\t>\n\t\t\t${when(isBar, () => renderBarStep(c))}\n\t\t\t${when(!isBar && !isCompact, () => renderStandardStep(c))}\n\t\t\t${when(!isBar && isCompact, () => renderCompactStep(c))}\n\t\t</div>\n\t`;\n}\n\nfunction renderBarStep(c: StepComponent) {\n\treturn html`\n\t\t<div class=\"ml-step__bar\"></div>\n\t\t<div class=\"ml-step__content\">\n\t\t\t<span class=\"ml-step__label\">${c.label}</span>\n\t\t\t${when(!!c.description, () => html`<span class=\"ml-step__description\">${c.description}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderStandardStep(c: StepComponent) {\n\treturn html`\n\t\t<div class=\"ml-step__track\">\n\t\t\t<div class=\"ml-step__connector-before ${c.first ? 'ml-step__connector--hidden' : `ml-step__connector--${c.connector}`}\"></div>\n\t\t\t<div class=\"ml-step__indicator\">\n\t\t\t\t${renderIndicator(c)}\n\t\t\t</div>\n\t\t\t<div class=\"ml-step__connector-after ${c.last ? 'ml-step__connector--hidden' : `ml-step__connector--${c.connector}`}\"></div>\n\t\t</div>\n\t\t<div class=\"ml-step__content\">\n\t\t\t<span class=\"ml-step__label\">${c.label}</span>\n\t\t\t${when(!!c.description, () => html`<span class=\"ml-step__description\">${c.description}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderCompactStep(_c: StepComponent) {\n\treturn html`\n\t\t<div class=\"ml-step__dot\"></div>\n\t`;\n}\n\nfunction renderIndicator(c: StepComponent) {\n\tswitch (c.variant) {\n\t\tcase 'numbered':\n\t\t\treturn renderNumberedIndicator(c);\n\t\tcase 'circles':\n\t\t\treturn renderCirclesIndicator(c);\n\t\tcase 'icons':\n\t\t\treturn renderIconsIndicator(c);\n\t\tdefault:\n\t\t\treturn renderNumberedIndicator(c);\n\t}\n}\n\nfunction renderNumberedIndicator(c: StepComponent) {\n\tconst isCompleted = c.status === 'completed';\n\treturn html`\n\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--numbered\">\n\t\t\t${when(isCompleted, () => html`<ml-icon icon=\"check\" size=\"sm\"></ml-icon>`)}\n\t\t\t${when(!isCompleted, () => html`<span>${c['step-number']}</span>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderCirclesIndicator(c: StepComponent) {\n\tconst isCompleted = c.status === 'completed';\n\treturn html`\n\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--circles\">\n\t\t\t${when(isCompleted, () => html`<ml-icon icon=\"check\" size=\"sm\"></ml-icon>`)}\n\t\t\t${when(!isCompleted, () => html`<div class=\"ml-step__indicator-dot\"></div>`)}\n\t\t</div>\n\t`;\n}\n\nfunction renderIconsIndicator(c: StepComponent) {\n\treturn html`\n\t\t<div class=\"ml-step__indicator-inner ml-step__indicator-inner--icons\">\n\t\t\t<ml-icon icon=${c.icon || 'circle'} size=\"sm\"></ml-icon>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const stepStyles = () => css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t/* ============================================\n\t BASE STEP\n\t ============================================ */\n\t.ml-step {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tcursor: pointer;\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-step--disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n\n\t.ml-step:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: 2px;\n\t\tborder-radius: var(--ml-radius);\n\t}\n\n\t/* ============================================\n\t HORIZONTAL LAYOUT\n\t ============================================ */\n\t.ml-step--horizontal {\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t}\n\n\t.ml-step--horizontal .ml-step__track {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin-bottom: var(--ml-space-3);\n\t}\n\n\t.ml-step--horizontal .ml-step__connector-before,\n\t.ml-step--horizontal .ml-step__connector-after {\n\t\tflex: 1;\n\t\theight: 2px;\n\t}\n\n\t.ml-step--horizontal .ml-step__connector--hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t/* ============================================\n\t VERTICAL LAYOUT\n\t ============================================ */\n\t.ml-step--vertical {\n\t\tflex-direction: row;\n\t\talign-items: stretch;\n\t\ttext-align: left;\n\t}\n\n\t.ml-step--vertical .ml-step__track {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tmargin-right: var(--ml-space-3);\n\t}\n\n\t.ml-step--vertical .ml-step__connector-before,\n\t.ml-step--vertical .ml-step__connector-after {\n\t\tflex: 1;\n\t\twidth: 2px;\n\t\tmin-height: 12px;\n\t}\n\n\t.ml-step--vertical .ml-step__connector--hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t.ml-step--vertical .ml-step__content {\n\t\tpadding-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-step--vertical.ml-step--last .ml-step__content {\n\t\tpadding-bottom: 0;\n\t}\n\n\t/* ============================================\n\t CONNECTORS\n\t ============================================ */\n\t.ml-step__connector-before,\n\t.ml-step__connector-after {\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* Solid connector */\n\t.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t/* Dotted connector */\n\t.ml-step__connector--dotted {\n\t\tbackground-color: transparent !important;\n\t}\n\n\t/* Horizontal dotted */\n\t.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-border) 0,\n\t\t\tvar(--ml-color-border) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t\tbackground-size: 100% 2px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\n\t/* Vertical dotted */\n\t.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-border) 0,\n\t\t\tvar(--ml-color-border) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t\tbackground-size: 2px 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\n\t/* Connector coloring - Completed: both halves colored */\n\t.ml-step--completed.ml-step--primary .ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--completed.ml-step--success .ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\t.ml-step--completed.ml-step--primary .ml-step--horizontal .ml-step__connector--dotted,\n\t.ml-step--completed.ml-step--primary.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--success.ml-step--horizontal .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--primary.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--completed.ml-step--success.ml-step--vertical .ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\n\t/* Current: before-connector colored, after-connector gray */\n\t.ml-step--current.ml-step--primary .ml-step__connector-before.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--current.ml-step--success .ml-step__connector-before.ml-step__connector--solid {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\t.ml-step--current.ml-step--primary.ml-step--horizontal .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--success.ml-step--horizontal .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto right,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--primary.ml-step--vertical .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-primary) 0,\n\t\t\tvar(--ml-color-primary) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\t.ml-step--current.ml-step--success.ml-step--vertical .ml-step__connector-before.ml-step__connector--dotted {\n\t\tbackground-image: repeating-linear-gradient(\n\t\t\tto bottom,\n\t\t\tvar(--ml-color-success) 0,\n\t\t\tvar(--ml-color-success) 4px,\n\t\t\ttransparent 4px,\n\t\t\ttransparent 8px\n\t\t);\n\t}\n\n\t/* ============================================\n\t INDICATOR BASE\n\t ============================================ */\n\t.ml-step__indicator {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-step__indicator-inner {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tborder-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* ============================================\n\t NUMBERED VARIANT\n\t ============================================ */\n\t.ml-step__indicator-inner--numbered {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 50%;\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* Numbered - Upcoming */\n\t.ml-step--upcoming .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-border);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t/* Numbered - Current (primary) */\n\t.ml-step--current.ml-step--primary .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t/* Numbered - Current (success) */\n\t.ml-step--current.ml-step--success .ml-step__indicator-inner--numbered {\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t/* Numbered - Completed (primary) */\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--numbered {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: #fff;\n\t}\n\n\t/* Numbered - Completed (success) */\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--numbered {\n\t\tbackground-color: var(--ml-color-success);\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: #fff;\n\t}\n\n\t/* ============================================\n\t CIRCLES VARIANT\n\t ============================================ */\n\t.ml-step__indicator-inner--circles {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 50%;\n\t}\n\n\t.ml-step__indicator-dot {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t\tborder-radius: 50%;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* Circles - Upcoming */\n\t.ml-step--upcoming .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--upcoming .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-border);\n\t}\n\n\t/* Circles - Current (primary) */\n\t.ml-step--current.ml-step--primary .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--current.ml-step--primary .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t/* Circles - Current (success) */\n\t.ml-step--current.ml-step--success .ml-step__indicator-inner--circles {\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\t.ml-step--current.ml-step--success .ml-step__indicator-dot {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t/* Circles - Completed (primary) */\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--circles {\n\t\tbackground-color: var(--ml-color-primary);\n\t\tborder: 2px solid var(--ml-color-primary);\n\t\tcolor: #fff;\n\t}\n\n\t/* Circles - Completed (success) */\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--circles {\n\t\tbackground-color: var(--ml-color-success);\n\t\tborder: 2px solid var(--ml-color-success);\n\t\tcolor: #fff;\n\t}\n\n\t/* ============================================\n\t ICONS VARIANT\n\t ============================================ */\n\t.ml-step__indicator-inner--icons {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tborder: 2px solid var(--ml-color-border);\n\t}\n\n\t/* Icons - Upcoming */\n\t.ml-step--upcoming .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t/* Icons - Current */\n\t.ml-step--current .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-text);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Icons - Completed (primary) */\n\t.ml-step--completed.ml-step--primary .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-primary);\n\t\tbackground-color: var(--ml-color-primary-subtle);\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t/* Icons - Completed (success) */\n\t.ml-step--completed.ml-step--success .ml-step__indicator-inner--icons {\n\t\tborder-color: var(--ml-color-success);\n\t\tbackground-color: var(--ml-color-success-subtle);\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t/* ============================================\n\t BAR VARIANT\n\t ============================================ */\n\t.ml-step--bar {\n\t\tflex-direction: column;\n\t\tgap: 0;\n\t}\n\n\t.ml-step--bar .ml-step__bar {\n\t\twidth: 100%;\n\t\theight: 4px;\n\t\tborder-radius: 2px;\n\t\tbackground-color: var(--ml-color-border);\n\t\tmargin-bottom: var(--ml-space-3);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t/* Bar - Current & Completed (primary) */\n\t.ml-step--bar.ml-step--current.ml-step--primary .ml-step__bar,\n\t.ml-step--bar.ml-step--completed.ml-step--primary .ml-step__bar {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\n\t/* Bar - Current & Completed (success) */\n\t.ml-step--bar.ml-step--current.ml-step--success .ml-step__bar,\n\t.ml-step--bar.ml-step--completed.ml-step--success .ml-step__bar {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t/* Bar - Vertical */\n\t.ml-step--bar.ml-step--vertical {\n\t\tflex-direction: row;\n\t}\n\n\t.ml-step--bar.ml-step--vertical .ml-step__bar {\n\t\twidth: 4px;\n\t\theight: auto;\n\t\tmin-height: 40px;\n\t\tmargin-bottom: 0;\n\t\tmargin-right: var(--ml-space-3);\n\t}\n\n\t.ml-step--bar.ml-step--vertical .ml-step__content {\n\t\tpadding-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-step--bar.ml-step--vertical.ml-step--last .ml-step__content {\n\t\tpadding-bottom: 0;\n\t}\n\n\t/* ============================================\n\t COMPACT / DOTS MODE\n\t ============================================ */\n\t.ml-step--compact {\n\t\tflex: 0 0 auto;\n\t\tmin-width: auto;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-step__dot {\n\t\twidth: 12px;\n\t\theight: 12px;\n\t\tborder-radius: 50%;\n\t\tbackground-color: var(--ml-color-border);\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--compact.ml-step--current.ml-step--primary .ml-step__dot {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--compact.ml-step--current.ml-step--success .ml-step__dot {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\t.ml-step--compact.ml-step--completed.ml-step--primary .ml-step__dot {\n\t\tbackground-color: var(--ml-color-primary);\n\t}\n\t.ml-step--compact.ml-step--completed.ml-step--success .ml-step__dot {\n\t\tbackground-color: var(--ml-color-success);\n\t}\n\n\t/* ============================================\n\t CONTENT (LABEL + DESCRIPTION)\n\t ============================================ */\n\t.ml-step__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t\tmin-width: 0;\n\t}\n\n\t.ml-step__label {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t\ttransition: color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-step--upcoming .ml-step__label {\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-step--current.ml-step--primary .ml-step__label {\n\t\tcolor: var(--ml-color-primary);\n\t}\n\n\t.ml-step--current.ml-step--success .ml-step__label {\n\t\tcolor: var(--ml-color-success);\n\t}\n\n\t.ml-step__description {\n\t\tfont-family: var(--ml-font-sans);\n\t\tfont-size: var(--ml-text-xs);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport type { StepStatus, StepsVariant, StepsConnector, StepsColor, StepsOrientation } from './steps.types.js';\nimport { stepTemplate } from './step.template.js';\nimport { stepStyles } from './step.styles.js';\n\n/**\n * ml-step - Individual step header for use within ml-steps\n *\n * @example\n * ```html\n * <ml-steps active=\"step1\">\n * <ml-step slot=\"step\" value=\"step1\" label=\"Your details\" description=\"Name and email\"></ml-step>\n * <ml-step slot=\"step\" value=\"step2\" label=\"Company\" description=\"Your company details\"></ml-step>\n * </ml-steps>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-step',\n\ttemplate: stepTemplate,\n\tstyles: stepStyles,\n\tattributes: ['value', 'label', 'description', 'icon', 'disabled', 'status', 'variant', 'connector', 'color', 'orientation', 'step-number', 'first', 'last', 'compact']\n})\nexport class StepComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Step identifier */\n\tvalue = '';\n\n\t/** Step title */\n\tlabel = '';\n\n\t/** Secondary description text */\n\tdescription = '';\n\n\t/** Icon name (for icons variant) */\n\ticon = '';\n\n\t/** URL for routed mode */\n\thref = '';\n\n\t/** Disable this step */\n\tdisabled = false;\n\n\t/** Step status (managed by parent) */\n\tstatus: StepStatus = 'upcoming';\n\n\t/** Visual variant (managed by parent) */\n\tvariant: StepsVariant = 'numbered';\n\n\t/** Connector style (managed by parent) */\n\tconnector: StepsConnector = 'solid';\n\n\t/** Accent color (managed by parent) */\n\tcolor: StepsColor = 'primary';\n\n\t/** Layout orientation (managed by parent) */\n\torientation: StepsOrientation = 'horizontal';\n\n\t/** Step number (managed by parent) */\n\t'step-number' = '1';\n\n\t/** First step flag (managed by parent) */\n\tfirst = false;\n\n\t/** Last step flag (managed by parent) */\n\tlast = false;\n\n\t/** Compact/dots mode (managed by parent) */\n\tcompact = false;\n\n\t/** Handle click on step */\n\thandleClick = (): void => {\n\t\tif (this.disabled) return;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:step-click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value, href: this.href }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html } from '@melodicdev/core';\nimport type { StepPanelComponent } from './step-panel.component.js';\n\nexport function stepPanelTemplate(_c: StepPanelComponent) {\n\treturn html`\n\t\t<div class=\"ml-step-panel\" role=\"tabpanel\">\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const stepPanelStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-step-panel {\n\t\toutline: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { stepPanelTemplate } from './step-panel.template.js';\nimport { stepPanelStyles } from './step-panel.styles.js';\n\n/**\n * ml-step-panel - Step panel content for use within ml-steps\n *\n * @example\n * ```html\n * <ml-steps active=\"step1\">\n * <ml-step-panel value=\"step1\">Step 1 content</ml-step-panel>\n * <ml-step-panel value=\"step2\">Step 2 content</ml-step-panel>\n * </ml-steps>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-step-panel',\n\ttemplate: stepPanelTemplate,\n\tstyles: stepPanelStyles,\n\tattributes: ['value']\n})\nexport class StepPanelComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Panel identifier (must match ml-step value) */\n\tvalue = '';\n}\n","import { html } from '@melodicdev/core';\n\nexport const dialogTemplate = () =>\n\thtml`<dialog class=\"ml-dialog\">\n\t\t<div class=\"ml-dialog-header\">\n\t\t\t<slot name=\"dialog-header\"></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-dialog-body\">\n\t\t\t<slot></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-dialog-footer\">\n\t\t\t<slot name=\"dialog-footer\"></slot>\n\t\t</div>\n\t</dialog> `;\n","import { css } from '@melodicdev/core';\n\nexport const dialogStyles = () => css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t/* Dialog base */\n\tdialog.ml-dialog {\n\t\tposition: fixed;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\t\tmax-width: 500px;\n\t\tmax-height: calc(100vh - var(--ml-space-8));\n\t\tmargin: auto;\n\t\tpadding: 0;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-xl);\n\t\tbox-shadow: var(--ml-shadow-xl);\n\t\toutline: none;\n\t\toverflow: hidden;\n\t\ttransform: scale(0.95) translateY(10px);\n\t\topacity: 0;\n\t\ttransition:\n\t\t\ttransform var(--ml-transition-normal),\n\t\t\topacity var(--ml-transition-normal),\n\t\t\toverlay var(--ml-transition-normal) allow-discrete,\n\t\t\tdisplay var(--ml-transition-normal) allow-discrete;\n\t}\n\n\tdialog.ml-dialog[open] {\n\t\ttransform: scale(1) translateY(0);\n\t\topacity: 1;\n\t}\n\n\t@starting-style {\n\t\tdialog.ml-dialog[open] {\n\t\t\ttransform: scale(0.95) translateY(10px);\n\t\t\topacity: 0;\n\t\t}\n\t}\n\n\t/* Backdrop */\n\tdialog.ml-dialog::backdrop {\n\t\tbackground-color: rgba(0, 0, 0, 0);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-transition-normal),\n\t\t\toverlay var(--ml-transition-normal) allow-discrete,\n\t\t\tdisplay var(--ml-transition-normal) allow-discrete;\n\t}\n\n\tdialog.ml-dialog[open]::backdrop {\n\t\tbackground-color: rgba(0, 0, 0, 0.5);\n\t}\n\n\t@starting-style {\n\t\tdialog.ml-dialog[open]::backdrop {\n\t\t\tbackground-color: rgba(0, 0, 0, 0);\n\t\t}\n\t}\n\n\t/* Size variants */\n\tdialog.ml-dialog--sm {\n\t\tmax-width: 400px;\n\t}\n\n\tdialog.ml-dialog--md {\n\t\tmax-width: 500px;\n\t}\n\n\tdialog.ml-dialog--lg {\n\t\tmax-width: 640px;\n\t}\n\n\tdialog.ml-dialog--xl {\n\t\tmax-width: 800px;\n\t}\n\n\tdialog.ml-dialog--full {\n\t\tmax-width: calc(100vw - var(--ml-space-8));\n\t\tmax-height: calc(100vh - var(--ml-space-8));\n\t}\n\n\t/* Header */\n\t.ml-dialog-header {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-6);\n\t\tpadding-bottom: 0;\n\t}\n\n\t.ml-dialog-header:not(:has(*)) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-dialog-header ::slotted(*) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-dialog-header ::slotted(h1),\n\t.ml-dialog-header ::slotted(h2),\n\t.ml-dialog-header ::slotted(h3),\n\t.ml-dialog-header ::slotted(h4) {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-dialog-header ::slotted(p) {\n\t\tmargin: var(--ml-space-1) 0 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t}\n\n\t/* Body */\n\t.ml-dialog-body {\n\t\tflex: 1;\n\t\tpadding: var(--ml-space-6);\n\t\toverflow-y: auto;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t}\n\n\t.ml-dialog-body ::slotted(p) {\n\t\tmargin: 0;\n\t}\n\n\t.ml-dialog-body ::slotted(p + p) {\n\t\tmargin-top: var(--ml-space-4);\n\t}\n\n\t/* Footer */\n\t.ml-dialog-footer {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: flex-end;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4) var(--ml-space-6);\n\t\tborder-top: 1px solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-dialog-footer:not(:has(*)) {\n\t\tdisplay: none;\n\t}\n\n\t/* Responsive */\n\t@media (max-width: 640px) {\n\t\tdialog.ml-dialog {\n\t\t\tmax-width: 100%;\n\t\t\tmax-height: 90vh;\n\t\t\tmargin: auto auto 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\tdialog.ml-dialog--full {\n\t\t\tmax-height: 100vh;\n\t\t\tborder-radius: 0;\n\t\t}\n\n\t\t.ml-dialog-header,\n\t\t.ml-dialog-body,\n\t\t.ml-dialog-footer {\n\t\t\tpadding-left: var(--ml-space-4);\n\t\t\tpadding-right: var(--ml-space-4);\n\t\t}\n\n\t\t.ml-dialog-footer {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\t}\n`;\n","import type { UniqueID } from '../../../functions';\nimport type { IDialogConfig } from './dialog-config.interface';\n\nexport class DialogRef<TResult = unknown, TData = unknown> {\n\tprivate _afterOpenedCallback: (() => void) | null = null;\n\tprivate _afterClosedCallback: ((result: TResult | undefined) => void) | null = null;\n\tprivate _data: TData | undefined;\n\tprivate _disableClose = false;\n\tprivate readonly _handleCancel = this.onCancel.bind(this);\n\tprivate readonly _handleBackdropClick = this.onBackdropClick.bind(this);\n\n\tconstructor(\n\t\tprivate readonly _dialogID: UniqueID,\n\t\tprivate readonly _dialogEl: HTMLDialogElement\n\t) {\n\t\tthis._dialogEl.addEventListener('cancel', this._handleCancel);\n\t\tthis._dialogEl.addEventListener('click', this._handleBackdropClick);\n\t}\n\n\tget dialogID(): UniqueID {\n\t\treturn this._dialogID;\n\t}\n\n\tget data(): TData | undefined {\n\t\treturn this._data;\n\t}\n\n\tget disableClose(): boolean {\n\t\treturn this._disableClose;\n\t}\n\n\tapplyConfig(config: IDialogConfig<TData>): this {\n\t\tif (config.data !== undefined) {\n\t\t\tthis._data = config.data;\n\t\t}\n\n\t\tif (config.disableClose !== undefined) {\n\t\t\tthis._disableClose = config.disableClose;\n\t\t}\n\n\t\tif (config.size && config.size !== 'auto') {\n\t\t\tthis._dialogEl.classList.add(`ml-dialog--${config.size}`);\n\t\t}\n\n\t\tif (config.width) {\n\t\t\tthis._dialogEl.style.maxWidth = config.width;\n\t\t}\n\n\t\tif (config.panelClass) {\n\t\t\tconst classes = Array.isArray(config.panelClass) ? config.panelClass : [config.panelClass];\n\t\t\tthis._dialogEl.classList.add(...classes);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\topen(): void {\n\t\tthis._dialogEl.showModal();\n\t\tthis._afterOpenedCallback?.();\n\t}\n\n\tclose(result?: TResult): void {\n\t\tthis._dialogEl.close();\n\t\tthis._afterClosedCallback?.(result);\n\t}\n\n\tafterOpened(callback: () => void): void {\n\t\tthis._afterOpenedCallback = callback;\n\t}\n\n\tafterClosed(callback: (result: TResult | undefined) => void): void {\n\t\tthis._afterClosedCallback = callback;\n\t}\n\n\tprivate onCancel(event: Event): void {\n\t\tif (this._disableClose) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tprivate onBackdropClick(event: MouseEvent): void {\n\t\tif (event.target === this._dialogEl && !this._disableClose) {\n\t\t\tthis.close();\n\t\t}\n\t}\n}\n","import { Injectable } from '@melodicdev/core';\nimport type { UniqueID } from '../../../functions/new-id.function';\nimport { DialogRef } from './dialog-ref.class';\nimport type { DialogComponentLoader } from './dialog-loader.type';\nimport type { ComponentBase } from '@melodicdev/core';\nimport type { IDialogRef } from './idialog-ref.interface';\nimport type { IDialogConfig } from './dialog-config.interface';\n\ninterface IDialogComponentElement<T = unknown> extends HTMLElement {\n\tcomponent: ComponentBase & Partial<IDialogRef<T>>;\n}\n\ninterface IDialogElements<T = unknown> {\n\tdialogRef: DialogRef<T>;\n\tdialogComponent?: IDialogComponentElement<T>;\n}\n\n@Injectable()\nexport class DialogService {\n\tprivate readonly _dialogs = new Map<UniqueID, IDialogElements>();\n\n\taddDialog(dialogID: UniqueID, dialogEl: HTMLDialogElement): DialogRef {\n\t\tconst dialogRef = new DialogRef(dialogID, dialogEl);\n\t\tthis._dialogs.set(dialogID, {\n\t\t\tdialogRef,\n\t\t\tdialogComponent: undefined\n\t\t});\n\n\t\tdialogEl.addEventListener('close', () => {\n\t\t\tconst elements = this._dialogs.get(dialogID);\n\t\t\tthis.cleanUpDialog(dialogID, elements?.dialogComponent);\n\t\t});\n\n\t\treturn dialogRef;\n\t}\n\n\tremoveDialog(dialogID: UniqueID): void {\n\t\tthis._dialogs.delete(dialogID);\n\t}\n\n\topen<TResult = unknown, TData = unknown>(dialogComponentOrID: UniqueID | DialogComponentLoader, config?: IDialogConfig<TData>): DialogRef<TResult, TData> {\n\t\tlet dialogID: UniqueID = dialogComponentOrID as UniqueID;\n\t\tlet dialogElements: IDialogElements = this._dialogs.get(dialogID)!;\n\n\t\tif (typeof dialogComponentOrID !== 'string') {\n\t\t\tconst dialogComponent: HTMLElement = this.mountDialog(dialogComponentOrID);\n\t\t\tconst mlDialogEl: HTMLElement = dialogComponent.shadowRoot?.querySelector('ml-dialog') as HTMLElement;\n\t\t\tconst dialogEl: HTMLDialogElement = mlDialogEl.shadowRoot?.querySelector('dialog') as HTMLDialogElement;\n\n\t\t\tdialogID = dialogEl.id as UniqueID;\n\t\t\tdialogElements = this._dialogs.get(dialogID)!;\n\n\t\t\tdialogElements.dialogComponent = dialogComponent as IDialogComponentElement;\n\n\t\t\tif (config) {\n\t\t\t\tdialogElements.dialogRef.applyConfig(config);\n\t\t\t}\n\n\t\t\t(dialogComponent as IDialogComponentElement).component.onDialogRefSet?.(dialogElements.dialogRef);\n\t\t}\n\n\t\tdialogElements.dialogRef.open();\n\n\t\treturn dialogElements.dialogRef as DialogRef<TResult, TData>;\n\t}\n\n\tclose<T = unknown>(dialogID: UniqueID, result?: T): void {\n\t\tif (this._dialogs.has(dialogID)) {\n\t\t\tconst dialogElements: IDialogElements = this._dialogs.get(dialogID)!;\n\t\t\tdialogElements.dialogRef.close(result);\n\t\t}\n\t}\n\n\tprivate cleanUpDialog(dialogID: UniqueID, dialogComponent?: IDialogComponentElement<unknown>): void {\n\t\tif (dialogComponent) {\n\t\t\tthis.unmountDialog(dialogComponent);\n\t\t\tthis.removeDialog(dialogID);\n\t\t}\n\t}\n\n\tprivate mountDialog(component: DialogComponentLoader): HTMLElement {\n\t\tconst dialogElement = document.createElement(component.selector);\n\t\tdocument.body.appendChild(dialogElement);\n\t\treturn dialogElement;\n\t}\n\n\tprivate unmountDialog(component: HTMLElement): void {\n\t\tcomponent.remove();\n\t}\n}\n","import { MelodicComponent, Service } from '@melodicdev/core';\nimport { dialogTemplate } from './dialog.template';\nimport { dialogStyles } from './dialog.styles';\nimport type { OnCreate, OnDestroy, IElementRef } from '@melodicdev/core';\nimport { newID, type UniqueID } from '../../../functions/new-id.function';\nimport { DialogService } from './dialog.service';\nimport type { DialogRef } from './dialog-ref.class';\n\n@MelodicComponent({\n\tselector: 'ml-dialog',\n\ttemplate: dialogTemplate,\n\tstyles: dialogStyles,\n\tattributes: []\n})\nexport class DialogComponent implements IElementRef, OnCreate, OnDestroy {\n\tpublic elementRef!: HTMLElement;\n\n\t@Service(DialogService)\n\tprivate readonly _dialogService!: DialogService;\n\n\tprivate _dialogID: UniqueID = newID();\n\tprivate _dialogEl!: HTMLDialogElement;\n\tprivate _dialogRef!: DialogRef;\n\n\tonCreate(): void {\n\t\tthis._dialogEl = this.elementRef.shadowRoot?.querySelector('dialog') as HTMLDialogElement;\n\t\tthis._dialogID = this.createDialogID();\n\t\tthis._dialogEl.id = this._dialogID;\n\n\t\tthis._dialogRef = this._dialogService.addDialog(this._dialogID, this._dialogEl);\n\t}\n\n\tonDestroy(): void {\n\t\tthis._dialogService.removeDialog(this._dialogID);\n\t}\n\n\topen(): void {\n\t\tthis._dialogRef.open();\n\t}\n\n\tclose<T = unknown>(result?: T): void {\n\t\tthis._dialogRef.close(result);\n\t}\n\n\tprivate createDialogID(): UniqueID {\n\t\treturn (\n\t\t\t(this.elementRef\n\t\t\t\t.getAttributeNames()\n\t\t\t\t.find((attr) => attr.startsWith('#'))\n\t\t\t\t?.slice(1) as UniqueID) ?? this._dialogID\n\t\t);\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { DrawerComponent } from './drawer.component.js';\n\nexport function drawerTemplate(c: DrawerComponent) {\n\tconst side = c.side === 'left' ? 'left' : 'right';\n\tconst size = c.size === 'sm' || c.size === 'md' || c.size === 'lg' || c.size === 'xl' ? c.size : 'md';\n\n\treturn html`\n\t\t<dialog\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-drawer': true,\n\t\t\t\t'ml-drawer--left': side === 'left',\n\t\t\t\t'ml-drawer--right': side === 'right',\n\t\t\t\t'ml-drawer--sm': size === 'sm',\n\t\t\t\t'ml-drawer--md': size === 'md',\n\t\t\t\t'ml-drawer--lg': size === 'lg',\n\t\t\t\t'ml-drawer--xl': size === 'xl'\n\t\t\t})}\n\t\t>\n\t\t\t<div class=\"ml-drawer__panel\">\n\t\t\t\t<div class=\"ml-drawer__header\">\n\t\t\t\t\t<div class=\"ml-drawer__header-content\">\n\t\t\t\t\t\t<slot name=\"drawer-header\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t\t${when(\n\t\t\t\t\t\tc.showClose,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<button class=\"ml-drawer__close\" @click=${c.close} aria-label=\"Close\">\n\t\t\t\t\t\t\t\t<ml-icon icon=\"x\" size=\"sm\" format=\"bold\"></ml-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"ml-drawer__body\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"ml-drawer__footer\">\n\t\t\t\t\t<slot name=\"drawer-footer\"></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</dialog>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const drawerStyles = () => css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\tdialog.ml-drawer {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\n\tdialog.ml-drawer:not([open]) {\n\t\tdisplay: none;\n\t}\n\n\t/* Backdrop */\n\tdialog.ml-drawer::backdrop {\n\t\tbackground-color: rgba(0, 0, 0, 0);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-300) var(--ml-ease-out),\n\t\t\toverlay var(--ml-duration-300) var(--ml-ease-out) allow-discrete,\n\t\t\tdisplay var(--ml-duration-300) var(--ml-ease-out) allow-discrete;\n\t}\n\n\tdialog.ml-drawer[open]::backdrop {\n\t\tbackground-color: rgba(0, 0, 0, 0.5);\n\t}\n\n\t@starting-style {\n\t\tdialog.ml-drawer[open]::backdrop {\n\t\t\tbackground-color: rgba(0, 0, 0, 0);\n\t\t}\n\t}\n\n\t/* Panel */\n\t.ml-drawer__panel {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tbox-shadow: var(--ml-shadow-xl);\n\t}\n\n\t/* Side variants - panel is off-screen by default */\n\tdialog.ml-drawer--right .ml-drawer__panel {\n\t\tright: 0;\n\t}\n\n\tdialog.ml-drawer--left .ml-drawer__panel {\n\t\tleft: 0;\n\t}\n\n\t/* Size variants */\n\t.ml-drawer--sm .ml-drawer__panel {\n\t\twidth: 320px;\n\t}\n\n\t.ml-drawer--md .ml-drawer__panel {\n\t\twidth: 480px;\n\t}\n\n\t.ml-drawer--lg .ml-drawer__panel {\n\t\twidth: 640px;\n\t}\n\n\t.ml-drawer--xl .ml-drawer__panel {\n\t\twidth: 800px;\n\t}\n\n\t/* Header */\n\t.ml-drawer__header {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: var(--ml-space-4);\n\t\tpadding: var(--ml-space-6);\n\t\tpadding-bottom: 0;\n\t}\n\n\t.ml-drawer__header:not(:has(slot[name=\"drawer-header\"] *)) {\n\t\tpadding-bottom: 0;\n\t}\n\n\t.ml-drawer__header-content {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-drawer__header-content ::slotted(h1),\n\t.ml-drawer__header-content ::slotted(h2),\n\t.ml-drawer__header-content ::slotted(h3),\n\t.ml-drawer__header-content ::slotted(h4) {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-lg);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-drawer__header-content ::slotted(p) {\n\t\tmargin: var(--ml-space-1) 0 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-drawer__close {\n\t\tflex-shrink: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius-md);\n\t\tcursor: pointer;\n\t\tcolor: var(--ml-color-text-tertiary);\n\t\ttransition:\n\t\t\tbackground-color var(--ml-duration-150) var(--ml-ease-in-out),\n\t\t\tcolor var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-drawer__close:hover {\n\t\tbackground-color: var(--ml-color-surface-hover);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* Body */\n\t.ml-drawer__body {\n\t\tflex: 1;\n\t\tpadding: var(--ml-space-6);\n\t\toverflow-y: auto;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t}\n\n\t/* Footer */\n\t.ml-drawer__footer {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: flex-end;\n\t\tgap: var(--ml-space-3);\n\t\tpadding: var(--ml-space-4) var(--ml-space-6);\n\t\tborder-top: 1px solid var(--ml-color-border);\n\t}\n\n\t.ml-drawer__footer:not(:has(*)) {\n\t\tdisplay: none;\n\t}\n\n\t/* Responsive */\n\t@media (max-width: 640px) {\n\t\t.ml-drawer__panel {\n\t\t\twidth: 100% !important;\n\t\t}\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport { drawerTemplate } from './drawer.template.js';\nimport { drawerStyles } from './drawer.styles.js';\n\ntype DrawerSide = 'left' | 'right';\ntype DrawerSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * ml-drawer - Slide-out panel overlay\n *\n * @example\n * ```html\n * <ml-drawer side=\"right\">\n * <div slot=\"drawer-header\">Settings</div>\n * <p>Drawer content here</p>\n * <div slot=\"drawer-footer\">\n * <ml-button>Save</ml-button>\n * </div>\n * </ml-drawer>\n * ```\n *\n * @slot drawer-header - Header content (title)\n * @slot default - Body content\n * @slot drawer-footer - Footer content (actions)\n * @fires ml:open - Emitted when opened\n * @fires ml:close - Emitted when closed\n */\n@MelodicComponent({\n\tselector: 'ml-drawer',\n\ttemplate: drawerTemplate,\n\tstyles: drawerStyles,\n\tattributes: ['side', 'size', 'show-close']\n})\nexport class DrawerComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Which side the drawer slides from */\n\tside: DrawerSide = 'right';\n\n\t/** Width preset */\n\tsize: DrawerSize = 'md';\n\n\t/** Show close button in header */\n\tshowClose = true;\n\n\tprivate _dialogEl!: HTMLDialogElement;\n\tprivate _panelEl!: HTMLElement;\n\n\tprivate get _positionProp(): 'left' | 'right' {\n\t\treturn this.side === 'left' ? 'left' : 'right';\n\t}\n\n\tprivate cancelAnimations(): void {\n\t\tfor (const anim of this._panelEl.getAnimations()) {\n\t\t\tanim.cancel();\n\t\t}\n\t}\n\n\tonCreate(): void {\n\t\tthis._dialogEl = this.elementRef.shadowRoot?.querySelector('dialog') as HTMLDialogElement;\n\t\tthis._panelEl = this._dialogEl?.querySelector('.ml-drawer__panel') as HTMLElement;\n\t\tthis._dialogEl?.addEventListener('click', this.handleBackdropClick);\n\t\tthis._dialogEl?.addEventListener('cancel', this.handleDialogCancel);\n\t}\n\n\tonDestroy(): void {\n\t\tthis._dialogEl?.removeEventListener('click', this.handleBackdropClick);\n\t\tthis._dialogEl?.removeEventListener('cancel', this.handleDialogCancel);\n\t}\n\n\t/** Open the drawer */\n\topen(): void {\n\t\tif (this._dialogEl?.open) return;\n\t\tthis.cancelAnimations();\n\t\tthis._dialogEl.showModal();\n\t\tconst prop = this._positionProp;\n\t\tconst width = this._panelEl.offsetWidth;\n\t\tthis._panelEl.style[prop] = `${-width}px`;\n\t\tthis._panelEl.getBoundingClientRect();\n\t\tconst anim = this._panelEl.animate(\n\t\t\t[{ [prop]: `${-width}px` }, { [prop]: '0px' }],\n\t\t\t{ duration: 300, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', fill: 'forwards' }\n\t\t);\n\t\tanim.onfinish = () => {\n\t\t\tthis._panelEl.style[prop] = '0px';\n\t\t};\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:open', { bubbles: true, composed: true })\n\t\t);\n\t}\n\n\t/** Close the drawer */\n\tclose = (): void => {\n\t\tif (!this._dialogEl?.open) return;\n\t\tthis.cancelAnimations();\n\t\tconst prop = this._positionProp;\n\t\tconst width = this._panelEl.offsetWidth;\n\t\tconst anim = this._panelEl.animate(\n\t\t\t[{ [prop]: '0px' }, { [prop]: `${-width}px` }],\n\t\t\t{ duration: 300, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', fill: 'forwards' }\n\t\t);\n\t\tanim.onfinish = () => {\n\t\t\tthis._panelEl.style[prop] = '';\n\t\t\tthis._dialogEl.close();\n\t\t};\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:close', { bubbles: true, composed: true })\n\t\t);\n\t};\n\n\tprivate readonly handleBackdropClick = (event: Event): void => {\n\t\tif (event.target === this._dialogEl) {\n\t\t\tthis.close();\n\t\t}\n\t};\n\n\tprivate readonly handleDialogCancel = (event: Event): void => {\n\t\tevent.preventDefault();\n\t\tthis.close();\n\t};\n}\n","import { html, when } from '@melodicdev/core';\nimport type { DropdownComponent } from './dropdown.component.js';\n\nexport function dropdownTemplate(c: DropdownComponent) {\n\treturn html`\n\t\t<div class=\"ml-dropdown\">\n\t\t\t<div class=\"ml-dropdown__trigger\" @click=${c.toggle}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"ml-dropdown__menu\"\n\t\t\t\trole=\"menu\"\n\t\t\t\tpopover=\"auto\"\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t\t${when(\n\t\t\t\t\tc.arrow,\n\t\t\t\t\t() => html`<div class=\"ml-dropdown__arrow\"></div>`\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dropdownStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-dropdown {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-dropdown__trigger {\n\t\tdisplay: inline-block;\n\t\tcursor: pointer;\n\t}\n\n\t.ml-dropdown__menu {\n\t\tposition: fixed;\n\t\tinset: unset;\n\t\tmargin: 0;\n\t\tpadding: var(--ml-space-1);\n\t\tborder: 1px solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tmin-width: 180px;\n\t\toverflow: visible;\n\t\topacity: 0;\n\t\ttransform: scale(0.95);\n\t\ttransition:\n\t\t\topacity var(--ml-duration-150) var(--ml-ease-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-out),\n\t\t\toverlay var(--ml-duration-150) var(--ml-ease-out) allow-discrete,\n\t\t\tdisplay var(--ml-duration-150) var(--ml-ease-out) allow-discrete;\n\t}\n\n\t.ml-dropdown__menu:not(:popover-open) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-dropdown__menu:popover-open {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\t@starting-style {\n\t\t.ml-dropdown__menu:popover-open {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t}\n\n\t.ml-dropdown__arrow {\n\t\tposition: absolute;\n\t\twidth: 8px;\n\t\theight: 8px;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: 1px solid var(--ml-color-border);\n\t\ttransform: rotate(45deg);\n\t}\n\n\t.ml-dropdown__menu[data-placement^='top'] .ml-dropdown__arrow {\n\t\tborder-top: none;\n\t\tborder-left: none;\n\t}\n\n\t.ml-dropdown__menu[data-placement^='bottom'] .ml-dropdown__arrow {\n\t\tborder-bottom: none;\n\t\tborder-right: none;\n\t}\n\n\t.ml-dropdown__menu[data-placement^='left'] .ml-dropdown__arrow {\n\t\tborder-bottom: none;\n\t\tborder-left: none;\n\t}\n\n\t.ml-dropdown__menu[data-placement^='right'] .ml-dropdown__arrow {\n\t\tborder-top: none;\n\t\tborder-right: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport type { Placement } from '../../../types/index.js';\nimport type { DropdownItemComponent } from './dropdown-item.component.js';\nimport { computePosition, autoUpdate, offset, flip, shift, arrow as arrowMiddleware } from '../../../utils/positioning/index.js';\nimport { dropdownTemplate } from './dropdown.template.js';\nimport { dropdownStyles } from './dropdown.styles.js';\n\n/**\n * ml-dropdown - Dropdown menu component\n *\n * @example\n * ```html\n * <ml-dropdown>\n * <ml-button slot=\"trigger\">Options</ml-button>\n * <ml-dropdown-item value=\"edit\" icon=\"pencil\">Edit</ml-dropdown-item>\n * <ml-dropdown-item value=\"delete\" icon=\"trash\" destructive>Delete</ml-dropdown-item>\n * </ml-dropdown>\n * ```\n *\n * @slot trigger - The element that toggles the dropdown\n * @slot default - Menu items, groups, and separators\n * @fires ml:select - Emitted when an item is selected, detail: { value }\n * @fires ml:open - Emitted when the menu opens\n * @fires ml:close - Emitted when the menu closes\n */\n@MelodicComponent({\n\tselector: 'ml-dropdown',\n\ttemplate: dropdownTemplate,\n\tstyles: dropdownStyles,\n\tattributes: ['placement', 'offset', 'arrow']\n})\nexport class DropdownComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Menu placement relative to trigger */\n\tplacement: Placement = 'bottom-start';\n\n\t/** Gap between trigger and menu in px */\n\toffset = 4;\n\n\t/** Show arrow pointing to trigger */\n\tarrow = false;\n\n\t/** Current open state */\n\tisOpen = false;\n\n\tprivate _focusedIndex = -1;\n\tprivate _cleanupAutoUpdate: (() => void) | null = null;\n\n\tonCreate(): void {\n\t\tconst menuEl = this.getMenuEl();\n\t\tif (menuEl) {\n\t\t\tmenuEl.addEventListener('toggle', this.handleToggle);\n\t\t}\n\n\t\tthis.elementRef.addEventListener('ml:item-select', this.handleItemSelect as EventListener);\n\t\tthis.elementRef.addEventListener('keydown', this.handleKeyDown);\n\t}\n\n\tonDestroy(): void {\n\t\tthis._cleanupAutoUpdate?.();\n\t\tconst menuEl = this.getMenuEl();\n\t\tif (menuEl) {\n\t\t\tmenuEl.removeEventListener('toggle', this.handleToggle);\n\t\t}\n\t\tthis.elementRef.removeEventListener('ml:item-select', this.handleItemSelect as EventListener);\n\t\tthis.elementRef.removeEventListener('keydown', this.handleKeyDown);\n\t}\n\n\t/** Open the menu */\n\topen(): void {\n\t\tconst menuEl = this.getMenuEl();\n\t\tif (menuEl && !this.isOpen) {\n\t\t\tmenuEl.showPopover();\n\t\t}\n\t}\n\n\t/** Close the menu */\n\tclose(): void {\n\t\tconst menuEl = this.getMenuEl();\n\t\tif (menuEl && this.isOpen) {\n\t\t\tmenuEl.hidePopover();\n\t\t}\n\t}\n\n\t/** Toggle the menu */\n\ttoggle = (): void => {\n\t\tconst menuEl = this.getMenuEl();\n\t\tif (menuEl) {\n\t\t\tmenuEl.togglePopover();\n\t\t}\n\t};\n\n\tprivate readonly handleToggle = (event: Event): void => {\n\t\tconst toggleEvent = event as ToggleEvent;\n\t\tif (toggleEvent.newState === 'open') {\n\t\t\tthis.isOpen = true;\n\t\t\tthis.startPositioning();\n\t\t\tthis.focusFirstItem();\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:open', { bubbles: true, composed: true })\n\t\t\t);\n\t\t} else {\n\t\t\tthis.isOpen = false;\n\t\t\tthis.clearFocus();\n\t\t\tthis._cleanupAutoUpdate?.();\n\t\t\tthis._cleanupAutoUpdate = null;\n\t\t\tthis.returnFocusToTrigger();\n\t\t\tthis.elementRef.dispatchEvent(\n\t\t\t\tnew CustomEvent('ml:close', { bubbles: true, composed: true })\n\t\t\t);\n\t\t}\n\t};\n\n\tprivate readonly handleItemSelect = (event: CustomEvent): void => {\n\t\tevent.stopPropagation();\n\t\tconst { value } = event.detail;\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value }\n\t\t\t})\n\t\t);\n\t\tthis.close();\n\t};\n\n\tprivate readonly handleKeyDown = (event: KeyboardEvent): void => {\n\t\tif (!this.isOpen) {\n\t\t\tif (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.open();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = this.getNavigableItems();\n\t\tif (!items.length) return;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusNextItem(items);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusPreviousItem(items);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this._focusedIndex >= 0 && this._focusedIndex < items.length) {\n\t\t\t\t\tconst item = items[this._focusedIndex];\n\t\t\t\t\tif (!item.disabled) {\n\t\t\t\t\t\titem.handleClick();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Tab':\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusItemAtIndex(items, this.findFirstEnabled(items));\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.focusItemAtIndex(items, this.findLastEnabled(items));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tprivate getNavigableItems(): DropdownItemComponent[] {\n\t\tconst slot = this.elementRef.shadowRoot?.querySelector('.ml-dropdown__menu slot:not([name])') as HTMLSlotElement | null;\n\t\tif (!slot) return [];\n\n\t\tconst items: DropdownItemComponent[] = [];\n\t\tconst assigned = slot.assignedElements();\n\n\t\tfor (const el of assigned) {\n\t\t\tif (el.tagName === 'ML-DROPDOWN-ITEM') {\n\t\t\t\titems.push(el as unknown as DropdownItemComponent);\n\t\t\t} else if (el.tagName === 'ML-DROPDOWN-GROUP') {\n\t\t\t\tconst groupSlot = el.shadowRoot?.querySelector('slot:not([name])') as HTMLSlotElement | null;\n\t\t\t\tif (groupSlot) {\n\t\t\t\t\tfor (const child of groupSlot.assignedElements()) {\n\t\t\t\t\t\tif (child.tagName === 'ML-DROPDOWN-ITEM') {\n\t\t\t\t\t\t\titems.push(child as unknown as DropdownItemComponent);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t}\n\n\tprivate focusFirstItem(): void {\n\t\tconst items = this.getNavigableItems();\n\t\tconst index = this.findFirstEnabled(items);\n\t\tthis.focusItemAtIndex(items, index);\n\t}\n\n\tprivate focusNextItem(items: DropdownItemComponent[]): void {\n\t\tlet index = this._focusedIndex + 1;\n\t\twhile (index < items.length) {\n\t\t\tif (!items[index].disabled) {\n\t\t\t\tthis.focusItemAtIndex(items, index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tprivate focusPreviousItem(items: DropdownItemComponent[]): void {\n\t\tlet index = this._focusedIndex - 1;\n\t\twhile (index >= 0) {\n\t\t\tif (!items[index].disabled) {\n\t\t\t\tthis.focusItemAtIndex(items, index);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tindex--;\n\t\t}\n\t}\n\n\tprivate focusItemAtIndex(items: DropdownItemComponent[], index: number): void {\n\t\tif (index < 0) return;\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\titems[i].focused = i === index;\n\t\t}\n\t\tthis._focusedIndex = index;\n\t}\n\n\tprivate clearFocus(): void {\n\t\tconst items = this.getNavigableItems();\n\t\tfor (const item of items) {\n\t\t\titem.focused = false;\n\t\t}\n\t\tthis._focusedIndex = -1;\n\t}\n\n\tprivate findFirstEnabled(items: DropdownItemComponent[]): number {\n\t\treturn items.findIndex((item) => !item.disabled);\n\t}\n\n\tprivate findLastEnabled(items: DropdownItemComponent[]): number {\n\t\tfor (let i = items.length - 1; i >= 0; i--) {\n\t\t\tif (!items[i].disabled) return i;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate returnFocusToTrigger(): void {\n\t\tconst triggerSlot = this.elementRef.shadowRoot?.querySelector('slot[name=\"trigger\"]') as HTMLSlotElement | null;\n\t\tif (triggerSlot) {\n\t\t\tconst assigned = triggerSlot.assignedElements();\n\t\t\tif (assigned.length > 0) {\n\t\t\t\t(assigned[0] as HTMLElement).focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startPositioning(): void {\n\t\tconst triggerEl = this.getTriggerEl();\n\t\tconst menuEl = this.getMenuEl();\n\n\t\tif (!triggerEl || !menuEl) return;\n\n\t\tconst update = () => this.updatePosition(triggerEl, menuEl);\n\n\t\tthis._cleanupAutoUpdate?.();\n\t\tthis._cleanupAutoUpdate = autoUpdate(triggerEl, menuEl, update);\n\t}\n\n\tprivate updatePosition(triggerEl: HTMLElement, menuEl: HTMLElement): void {\n\t\tconst arrowEl = this.arrow ? (this.elementRef.shadowRoot?.querySelector('.ml-dropdown__arrow') as HTMLElement) : null;\n\n\t\tconst middleware = [offset(this.offset), flip(), shift({ padding: 8 })];\n\n\t\tif (arrowEl) {\n\t\t\tmiddleware.push(arrowMiddleware({ element: arrowEl, padding: 8 }));\n\t\t}\n\n\t\tconst { x, y, placement, middlewareData } = computePosition(triggerEl, menuEl, {\n\t\t\tplacement: this.placement,\n\t\t\tmiddleware\n\t\t});\n\n\t\tmenuEl.style.left = `${x}px`;\n\t\tmenuEl.style.top = `${y}px`;\n\t\tmenuEl.dataset.placement = placement;\n\n\t\tif (arrowEl && middlewareData.arrow) {\n\t\t\tthis.positionArrow(arrowEl, placement, middlewareData.arrow as { x?: number; y?: number });\n\t\t}\n\t}\n\n\tprivate positionArrow(arrowEl: HTMLElement, placement: string, arrowData: { x?: number; y?: number }): void {\n\t\tconst side = placement.split('-')[0];\n\n\t\tarrowEl.style.left = arrowData.x === undefined ? '' : `${arrowData.x}px`;\n\t\tarrowEl.style.right = '';\n\t\tarrowEl.style.top = arrowData.y === undefined ? '' : `${arrowData.y}px`;\n\t\tarrowEl.style.bottom = '';\n\n\t\tif (side === 'top') {\n\t\t\tarrowEl.style.bottom = '-4px';\n\t\t}\n\t\tif (side === 'bottom') {\n\t\t\tarrowEl.style.top = '-4px';\n\t\t}\n\t\tif (side === 'left') {\n\t\t\tarrowEl.style.right = '-4px';\n\t\t}\n\t\tif (side === 'right') {\n\t\t\tarrowEl.style.left = '-4px';\n\t\t}\n\t}\n\n\tprivate getTriggerEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-dropdown__trigger') as HTMLElement | null;\n\t}\n\n\tprivate getMenuEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-dropdown__menu') as HTMLElement | null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { DropdownItemComponent } from './dropdown-item.component.js';\n\nexport function dropdownItemTemplate(c: DropdownItemComponent) {\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-dropdown-item': true,\n\t\t\t\t'ml-dropdown-item--focused': c.focused,\n\t\t\t\t'ml-dropdown-item--disabled': c.disabled,\n\t\t\t\t'ml-dropdown-item--destructive': c.destructive\n\t\t\t})}\n\t\t\trole=\"menuitem\"\n\t\t\ttabindex=\"-1\"\n\t\t\taria-disabled=${c.disabled || false}\n\t\t\t@click=${c.handleClick}\n\t\t>\n\t\t\t${when(\n\t\t\t\t!!c.icon,\n\t\t\t\t() => html`<ml-icon class=\"ml-dropdown-item__icon\" icon=${c.icon} size=\"sm\"></ml-icon>`\n\t\t\t)}\n\t\t\t<span class=\"ml-dropdown-item__label\"><slot></slot></span>\n\t\t\t${when(\n\t\t\t\t!!c.addon,\n\t\t\t\t() => html`<span class=\"ml-dropdown-item__addon\">${c.addon}</span>`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dropdownItemStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-dropdown-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tpadding: var(--ml-space-2) var(--ml-space-2);\n\t\tborder-radius: var(--ml-radius-md);\n\t\tfont-size: 14px;\n\t\tline-height: 20px;\n\t\tcolor: var(--ml-color-text);\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\ttransition: background-color var(--ml-duration-100) var(--ml-ease-out);\n\t}\n\n\t.ml-dropdown-item:hover {\n\t\tbackground-color: var(--ml-color-surface-hover);\n\t}\n\n\t.ml-dropdown-item--focused {\n\t\tbackground-color: var(--ml-color-surface-hover);\n\t}\n\n\t.ml-dropdown-item--disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n\n\t.ml-dropdown-item--disabled:hover {\n\t\tbackground-color: transparent;\n\t}\n\n\t.ml-dropdown-item--destructive {\n\t\tcolor: var(--ml-color-error);\n\t}\n\n\t.ml-dropdown-item--destructive:hover {\n\t\tbackground-color: var(--ml-color-error-subtle);\n\t}\n\n\t.ml-dropdown-item--destructive.ml-dropdown-item--focused {\n\t\tbackground-color: var(--ml-color-error-subtle);\n\t}\n\n\t.ml-dropdown-item__icon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-dropdown-item--destructive .ml-dropdown-item__icon {\n\t\tcolor: var(--ml-color-error);\n\t}\n\n\t.ml-dropdown-item__label {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.ml-dropdown-item__addon {\n\t\tflex-shrink: 0;\n\t\tfont-size: 12px;\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { dropdownItemTemplate } from './dropdown-item.template.js';\nimport { dropdownItemStyles } from './dropdown-item.styles.js';\n\n/**\n * ml-dropdown-item - Individual menu item within a dropdown\n *\n * @example\n * ```html\n * <ml-dropdown-item value=\"edit\" icon=\"pencil\">Edit</ml-dropdown-item>\n * <ml-dropdown-item value=\"delete\" icon=\"trash\" destructive>Delete</ml-dropdown-item>\n * ```\n *\n * @slot default - The item label text\n * @fires ml:item-select - Internal event caught by parent dropdown\n */\n@MelodicComponent({\n\tselector: 'ml-dropdown-item',\n\ttemplate: dropdownItemTemplate,\n\tstyles: dropdownItemStyles,\n\tattributes: ['value', 'icon', 'addon', 'disabled', 'destructive']\n})\nexport class DropdownItemComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Selection value emitted on click */\n\tvalue = '';\n\n\t/** Left icon name (Phosphor) */\n\ticon = '';\n\n\t/** Right addon text (e.g. keyboard shortcut) */\n\taddon = '';\n\n\t/** Non-interactive state */\n\tdisabled = false;\n\n\t/** Red/danger styling */\n\tdestructive = false;\n\n\t/** Set by parent dropdown for keyboard navigation highlight */\n\tfocused = false;\n\n\thandleClick = (): void => {\n\t\tif (this.disabled) return;\n\n\t\tthis.elementRef.dispatchEvent(\n\t\t\tnew CustomEvent('ml:item-select', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { value: this.value }\n\t\t\t})\n\t\t);\n\t};\n}\n","import { html } from '@melodicdev/core';\n\nexport function dropdownSeparatorTemplate() {\n\treturn html`<div class=\"ml-dropdown-separator\" role=\"separator\"></div>`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dropdownSeparatorStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-dropdown-separator {\n\t\theight: 1px;\n\t\tmargin: var(--ml-space-1) 0;\n\t\tbackground-color: var(--ml-color-border);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport { dropdownSeparatorTemplate } from './dropdown-separator.template.js';\nimport { dropdownSeparatorStyles } from './dropdown-separator.styles.js';\n\n/**\n * ml-dropdown-separator - Divider line between dropdown items\n *\n * @example\n * ```html\n * <ml-dropdown-item value=\"edit\">Edit</ml-dropdown-item>\n * <ml-dropdown-separator></ml-dropdown-separator>\n * <ml-dropdown-item value=\"delete\" destructive>Delete</ml-dropdown-item>\n * ```\n */\n@MelodicComponent({\n\tselector: 'ml-dropdown-separator',\n\ttemplate: dropdownSeparatorTemplate,\n\tstyles: dropdownSeparatorStyles\n})\nexport class DropdownSeparatorComponent {}\n","import { html, when } from '@melodicdev/core';\nimport type { DropdownGroupComponent } from './dropdown-group.component.js';\n\nexport function dropdownGroupTemplate(c: DropdownGroupComponent) {\n\treturn html`\n\t\t<div class=\"ml-dropdown-group\" role=\"group\">\n\t\t\t${when(\n\t\t\t\t!!c.label,\n\t\t\t\t() => html`<div class=\"ml-dropdown-group__label\">${c.label}</div>`\n\t\t\t)}\n\t\t\t<slot></slot>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dropdownGroupStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t.ml-dropdown-group__label {\n\t\tpadding: var(--ml-space-2) var(--ml-space-2) var(--ml-space-1);\n\t\tfont-size: 12px;\n\t\tfont-weight: 500;\n\t\tline-height: 16px;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t\tcolor: var(--ml-color-text-tertiary);\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport { dropdownGroupTemplate } from './dropdown-group.template.js';\nimport { dropdownGroupStyles } from './dropdown-group.styles.js';\n\n/**\n * ml-dropdown-group - Groups dropdown items with an optional label header\n *\n * @example\n * ```html\n * <ml-dropdown-group label=\"Account\">\n * <ml-dropdown-item value=\"profile\" icon=\"user\">Profile</ml-dropdown-item>\n * <ml-dropdown-item value=\"settings\" icon=\"gear\">Settings</ml-dropdown-item>\n * </ml-dropdown-group>\n * ```\n *\n * @slot default - The items within this group\n */\n@MelodicComponent({\n\tselector: 'ml-dropdown-group',\n\ttemplate: dropdownGroupTemplate,\n\tstyles: dropdownGroupStyles,\n\tattributes: ['label']\n})\nexport class DropdownGroupComponent {\n\t/** Optional uppercase muted header label */\n\tlabel = '';\n}\n","import { html, classMap } from '@melodicdev/core';\nimport type { TooltipComponent } from './tooltip.component.js';\n\nexport function tooltipTemplate(c: TooltipComponent) {\n\treturn html`\n\t\t<div class=\"ml-tooltip\">\n\t\t\t<div\n\t\t\t\tclass=\"ml-tooltip__trigger\"\n\t\t\t\t@mouseenter=${c.show}\n\t\t\t\t@mouseleave=${c.hide}\n\t\t\t\t@focus=${c.show}\n\t\t\t\t@blur=${c.hide}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'ml-tooltip__content': true,\n\t\t\t\t\t'ml-tooltip__content--visible': c.isVisible\n\t\t\t\t})}\n\t\t\t\trole=\"tooltip\"\n\t\t\t\taria-hidden=${!c.isVisible}\n\t\t\t>\n\t\t\t\t${c.content}\n\t\t\t\t<div class=\"ml-tooltip__arrow\"></div>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const tooltipStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-tooltip {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-tooltip__trigger {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-tooltip__content {\n\t\tposition: fixed;\n\t\tz-index: 9999;\n\t\tmax-width: 320px;\n\t\tpadding: var(--ml-space-2) var(--ml-space-3);\n\t\tbackground-color: var(--ml-tooltip-bg);\n\t\tcolor: var(--ml-tooltip-text);\n\t\tfont-size: var(--ml-text-xs);\n\t\tfont-weight: var(--ml-font-medium);\n\t\tline-height: var(--ml-leading-snug);\n\t\tborder-radius: var(--ml-radius);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\ttext-align: center;\n\t\tword-wrap: break-word;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransform: scale(0.95);\n\t\ttransition:\n\t\t\topacity var(--ml-duration-150) var(--ml-ease-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-out);\n\t}\n\n\t.ml-tooltip__content--visible {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\t.ml-tooltip__arrow {\n\t\tposition: absolute;\n\t\twidth: 8px;\n\t\theight: 8px;\n\t\tbackground-color: var(--ml-tooltip-bg);\n\t\ttransform: rotate(45deg);\n\t}\n\n\t.ml-tooltip__content[data-placement^='top'] .ml-tooltip__arrow {\n\t\tbottom: -4px;\n\t}\n\n\t.ml-tooltip__content[data-placement^='bottom'] .ml-tooltip__arrow {\n\t\ttop: -4px;\n\t}\n\n\t.ml-tooltip__content[data-placement^='left'] .ml-tooltip__arrow {\n\t\tright: -4px;\n\t}\n\n\t.ml-tooltip__content[data-placement^='right'] .ml-tooltip__arrow {\n\t\tleft: -4px;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnInit, OnDestroy } from '@melodicdev/core';\nimport type { Placement } from '../../../types/index.js';\nimport { computePosition, offset, flip, shift } from '../../../utils/positioning/index.js';\nimport { tooltipTemplate } from './tooltip.template.js';\nimport { tooltipStyles } from './tooltip.styles.js';\n\n/**\n * ml-tooltip - Tooltip component that shows on hover/focus\n *\n * @example\n * ```html\n * <ml-tooltip content=\"This is a tooltip\">\n * <ml-button>Hover me</ml-button>\n * </ml-tooltip>\n *\n * <ml-tooltip content=\"Bottom tooltip\" placement=\"bottom\">\n * <span>Hover for info</span>\n * </ml-tooltip>\n * ```\n *\n * @slot default - The trigger element\n */\n@MelodicComponent({\n\tselector: 'ml-tooltip',\n\ttemplate: tooltipTemplate,\n\tstyles: tooltipStyles,\n\tattributes: ['content', 'placement', 'delay']\n})\nexport class TooltipComponent implements IElementRef, OnInit, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Tooltip content text */\n\tcontent = '';\n\n\t/** Tooltip placement */\n\tplacement: Placement = 'top';\n\n\t/** Delay before showing (ms) */\n\tdelay = 200;\n\n\t/** Internal: visibility state */\n\tisVisible = false;\n\n\tprivate _showTimeout: number | null = null;\n\tprivate _hideTimeout: number | null = null;\n\n\tonInit(): void {\n\t\t// Initial setup if needed\n\t}\n\n\tonDestroy(): void {\n\t\tif (this._showTimeout) clearTimeout(this._showTimeout);\n\t\tif (this._hideTimeout) clearTimeout(this._hideTimeout);\n\t}\n\n\tshow = (): void => {\n\t\tif (this._hideTimeout) {\n\t\t\tclearTimeout(this._hideTimeout);\n\t\t\tthis._hideTimeout = null;\n\t\t}\n\n\t\tthis._showTimeout = window.setTimeout(() => {\n\t\t\tthis.isVisible = true;\n\t\t\tthis.updatePosition();\n\t\t}, this.delay);\n\t};\n\n\thide = (): void => {\n\t\tif (this._showTimeout) {\n\t\t\tclearTimeout(this._showTimeout);\n\t\t\tthis._showTimeout = null;\n\t\t}\n\n\t\tthis._hideTimeout = window.setTimeout(() => {\n\t\t\tthis.isVisible = false;\n\t\t}, 100);\n\t};\n\n\tprivate updatePosition(): void {\n\t\tconst trigger = this.elementRef.shadowRoot?.querySelector('.ml-tooltip__trigger') as HTMLElement;\n\t\tconst tooltip = this.elementRef.shadowRoot?.querySelector('.ml-tooltip__content') as HTMLElement;\n\t\tconst arrow = this.elementRef.shadowRoot?.querySelector('.ml-tooltip__arrow') as HTMLElement;\n\n\t\tif (!trigger || !tooltip) return;\n\n\t\tconst { x, y, placement } = computePosition(trigger, tooltip, {\n\t\t\tplacement: this.placement,\n\t\t\tmiddleware: [offset(8), flip(), shift({ padding: 8 })]\n\t\t});\n\n\t\ttooltip.style.left = `${x}px`;\n\t\ttooltip.style.top = `${y}px`;\n\t\ttooltip.setAttribute('data-placement', placement);\n\n\t\t// Position arrow\n\t\tif (arrow) {\n\t\t\tconst side = placement.split('-')[0];\n\t\t\tarrow.style.left = '';\n\t\t\tarrow.style.right = '';\n\t\t\tarrow.style.top = '';\n\t\t\tarrow.style.bottom = '';\n\n\t\t\tif (side === 'top' || side === 'bottom') {\n\t\t\t\tarrow.style.left = '50%';\n\t\t\t\tarrow.style.marginLeft = '-4px';\n\t\t\t} else {\n\t\t\t\tarrow.style.top = '50%';\n\t\t\t\tarrow.style.marginTop = '-4px';\n\t\t\t}\n\t\t}\n\t}\n}\n","import { html, when } from '@melodicdev/core';\nimport type { PopoverComponent } from './popover.component.js';\n\nexport function popoverTemplate(c: PopoverComponent) {\n\treturn html`\n\t\t<div class=\"ml-popover\">\n\t\t\t<div class=\"ml-popover__trigger\" @click=${c.toggle}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"ml-popover__content\"\n\t\t\t\tpopover=${c.manual ? 'manual' : 'auto'}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t\t${when(\n\t\t\t\t\tc.arrow,\n\t\t\t\t\t() => html`<div class=\"ml-popover__arrow\"></div>`\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const popoverStyles = () => css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-popover {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n\n\t.ml-popover__trigger {\n\t\tdisplay: inline-block;\n\t\tcursor: pointer;\n\t}\n\n\t.ml-popover__content {\n\t\tposition: fixed;\n\t\tinset: unset;\n\t\tmargin: 0;\n\t\tpadding: var(--ml-space-3) var(--ml-space-4);\n\t\tborder: 1px solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-lg);\n\t\tbackground-color: var(--ml-color-surface);\n\t\tcolor: var(--ml-color-text);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\toverflow: visible;\n\t\topacity: 0;\n\t\ttransform: scale(0.95);\n\t\ttransition:\n\t\t\topacity var(--ml-duration-150) var(--ml-ease-out),\n\t\t\ttransform var(--ml-duration-150) var(--ml-ease-out),\n\t\t\toverlay var(--ml-duration-150) var(--ml-ease-out) allow-discrete,\n\t\t\tdisplay var(--ml-duration-150) var(--ml-ease-out) allow-discrete;\n\t}\n\n\t.ml-popover__content:not(:popover-open) {\n\t\tdisplay: none;\n\t}\n\n\t.ml-popover__content:popover-open {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\t@starting-style {\n\t\t.ml-popover__content:popover-open {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t}\n\n\t.ml-popover__arrow {\n\t\tposition: absolute;\n\t\twidth: 8px;\n\t\theight: 8px;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: 1px solid var(--ml-color-border);\n\t\ttransform: rotate(45deg);\n\t}\n\n\t.ml-popover__content[data-placement^='top'] .ml-popover__arrow {\n\t\tborder-top: none;\n\t\tborder-left: none;\n\t}\n\n\t.ml-popover__content[data-placement^='bottom'] .ml-popover__arrow {\n\t\tborder-bottom: none;\n\t\tborder-right: none;\n\t}\n\n\t.ml-popover__content[data-placement^='left'] .ml-popover__arrow {\n\t\tborder-bottom: none;\n\t\tborder-left: none;\n\t}\n\n\t.ml-popover__content[data-placement^='right'] .ml-popover__arrow {\n\t\tborder-top: none;\n\t\tborder-right: none;\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport type { Placement } from '../../../types/index.js';\nimport { computePosition, autoUpdate, offset, flip, shift, arrow as arrowMiddleware } from '../../../utils/positioning/index.js';\nimport { popoverTemplate } from './popover.template.js';\nimport { popoverStyles } from './popover.styles.js';\n\n/**\n * ml-popover - Popover component that shows on trigger click\n *\n * @example\n * ```html\n * <ml-popover placement=\"bottom\">\n * <button slot=\"trigger\">Open</button>\n * <p>Popover content here</p>\n * </ml-popover>\n *\n * <ml-popover placement=\"bottom-start\" manual>\n * <button slot=\"trigger\">Open</button>\n * <div>\n * <p>Locked content</p>\n * <button>Close me manually</button>\n * </div>\n * </ml-popover>\n * ```\n *\n * @slot trigger - The element that toggles the popover\n * @slot default - The popover content\n */\n@MelodicComponent({\n\tselector: 'ml-popover',\n\ttemplate: popoverTemplate,\n\tstyles: popoverStyles,\n\tattributes: ['placement', 'offset', 'manual', 'arrow']\n})\nexport class PopoverComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Popover placement relative to trigger */\n\tplacement: Placement = 'bottom';\n\n\t/** Gap between trigger and popover in px */\n\toffset = 8;\n\n\t/** When true, uses popover=\"manual\" (no light-dismiss) */\n\tmanual = false;\n\n\t/** When true, shows an arrow pointing to the trigger */\n\tarrow = false;\n\n\t/** Current open state */\n\tisOpen = false;\n\n\tprivate _cleanupAutoUpdate: (() => void) | null = null;\n\n\tonCreate(): void {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.addEventListener('toggle', this.handleToggle);\n\t\t}\n\t}\n\n\tonDestroy(): void {\n\t\tthis._cleanupAutoUpdate?.();\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.removeEventListener('toggle', this.handleToggle);\n\t\t}\n\t}\n\n\t/** Open the popover */\n\topen(): void {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl && !this.isOpen) {\n\t\t\tpopoverEl.showPopover();\n\t\t}\n\t}\n\n\t/** Close the popover */\n\tclose(): void {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl && this.isOpen) {\n\t\t\tpopoverEl.hidePopover();\n\t\t}\n\t}\n\n\t/** Toggle the popover */\n\ttoggle = (): void => {\n\t\tconst popoverEl = this.getPopoverEl();\n\t\tif (popoverEl) {\n\t\t\tpopoverEl.togglePopover();\n\t\t}\n\t};\n\n\tprivate readonly handleToggle = (event: Event): void => {\n\t\tconst toggleEvent = event as ToggleEvent;\n\t\tif (toggleEvent.newState === 'open') {\n\t\t\tthis.isOpen = true;\n\t\t\tthis.startPositioning();\n\t\t} else {\n\t\t\tthis.isOpen = false;\n\t\t\tthis._cleanupAutoUpdate?.();\n\t\t\tthis._cleanupAutoUpdate = null;\n\t\t}\n\t};\n\n\tprivate startPositioning(): void {\n\t\tconst triggerEl = this.getTriggerEl();\n\t\tconst popoverEl = this.getPopoverEl();\n\n\t\tif (!triggerEl || !popoverEl) return;\n\n\t\tconst update = () => this.updatePosition(triggerEl, popoverEl);\n\n\t\tthis._cleanupAutoUpdate?.();\n\t\tthis._cleanupAutoUpdate = autoUpdate(triggerEl, popoverEl, update);\n\t}\n\n\tprivate updatePosition(triggerEl: HTMLElement, popoverEl: HTMLElement): void {\n\t\tconst arrowEl = this.arrow ? (this.elementRef.shadowRoot?.querySelector('.ml-popover__arrow') as HTMLElement) : null;\n\n\t\tconst middleware = [offset(this.offset), flip(), shift({ padding: 8 })];\n\n\t\tif (arrowEl) {\n\t\t\tmiddleware.push(arrowMiddleware({ element: arrowEl, padding: 8 }));\n\t\t}\n\n\t\tconst { x, y, placement, middlewareData } = computePosition(triggerEl, popoverEl, {\n\t\t\tplacement: this.placement,\n\t\t\tmiddleware\n\t\t});\n\n\t\tpopoverEl.style.left = `${x}px`;\n\t\tpopoverEl.style.top = `${y}px`;\n\t\tpopoverEl.dataset.placement = placement;\n\n\t\tif (arrowEl && middlewareData.arrow) {\n\t\t\tthis.positionArrow(arrowEl, placement, middlewareData.arrow as { x?: number; y?: number });\n\t\t}\n\t}\n\n\tprivate positionArrow(arrowEl: HTMLElement, placement: string, arrowData: { x?: number; y?: number }): void {\n\t\tconst side = placement.split('-')[0];\n\n\t\tarrowEl.style.left = arrowData.x === undefined ? '' : `${arrowData.x}px`;\n\t\tarrowEl.style.right = '';\n\t\tarrowEl.style.top = arrowData.y === undefined ? '' : `${arrowData.y}px`;\n\t\tarrowEl.style.bottom = '';\n\n\t\tif (side === 'top') {\n\t\t\tarrowEl.style.bottom = '-4px';\n\t\t}\n\t\tif (side === 'bottom') {\n\t\t\tarrowEl.style.top = '-4px';\n\t\t}\n\t\tif (side === 'left') {\n\t\t\tarrowEl.style.right = '-4px';\n\t\t}\n\t\tif (side === 'right') {\n\t\t\tarrowEl.style.left = '-4px';\n\t\t}\n\t}\n\n\tprivate getTriggerEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-popover__trigger') as HTMLElement | null;\n\t}\n\n\tprivate getPopoverEl(): HTMLElement | null {\n\t\treturn this.elementRef.shadowRoot?.querySelector('.ml-popover__content') as HTMLElement | null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { AppShellComponent } from './app-shell.component.js';\n\nexport function appShellTemplate(c: AppShellComponent) {\n\tconst sidebarRight = c['sidebar-position'] === 'right';\n\tconst collapsed = c['sidebar-collapsed'];\n\tconst headerFixed = c['header-fixed'];\n\tconst mobileOpen = c._mobileOpen;\n\tconst isMobile = c.isMobile;\n\n\treturn html`\n\t\t<div\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-app-shell': true,\n\t\t\t\t'ml-app-shell--sidebar-right': sidebarRight,\n\t\t\t\t'ml-app-shell--sidebar-collapsed': collapsed,\n\t\t\t\t'ml-app-shell--header-fixed': headerFixed,\n\t\t\t\t'ml-app-shell--mobile-open': mobileOpen\n\t\t\t})}\n\t\t>\n\t\t\t${when(isMobile, () => html`\n\t\t\t\t<div\n\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t'ml-app-shell__backdrop': true,\n\t\t\t\t\t\t'ml-app-shell__backdrop--visible': mobileOpen\n\t\t\t\t\t})}\n\t\t\t\t\t@click=${c.closeMobileSidebar}\n\t\t\t\t></div>\n\t\t\t`)}\n\n\t\t\t<aside\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'ml-app-shell__sidebar': true,\n\t\t\t\t\t'ml-app-shell__sidebar--mobile-open': mobileOpen\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<slot name=\"sidebar\"></slot>\n\t\t\t</aside>\n\n\t\t\t<div class=\"ml-app-shell__main\">\n\t\t\t\t<header class=\"ml-app-shell__header\">\n\t\t\t\t\t${when(isMobile, () => html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"ml-app-shell__menu-btn\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label=\"Toggle navigation\"\n\t\t\t\t\t\t\t@click=${c.toggleMobileSidebar}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path d=\"M3 5h14M3 10h14M3 15h14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`)}\n\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t</header>\n\n\t\t\t\t<div class=\"ml-app-shell__content\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const appShellStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t SHELL GRID LAYOUT\n\t ============================================ */\n\t.ml-app-shell {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: auto 1fr;\n\t\tgrid-template-rows: 1fr;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\n\t/* Sidebar on the right */\n\t.ml-app-shell--sidebar-right {\n\t\tgrid-template-columns: 1fr auto;\n\t}\n\n\t.ml-app-shell--sidebar-right .ml-app-shell__sidebar {\n\t\torder: 2;\n\t\tborder-left: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-right: none;\n\t}\n\n\t.ml-app-shell--sidebar-right .ml-app-shell__main {\n\t\torder: 1;\n\t}\n\n\t/* ============================================\n\t SIDEBAR\n\t ============================================ */\n\t.ml-app-shell__sidebar {\n\t\tgrid-row: 1 / -1;\n\t\toverflow: hidden;\n\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t::slotted([slot=\"sidebar\"]) {\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t MAIN AREA\n\t ============================================ */\n\t.ml-app-shell__main {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\n\t/* ============================================\n\t HEADER\n\t ============================================ */\n\t.ml-app-shell__header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-app-shell__header:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* Fixed/sticky header */\n\t.ml-app-shell--header-fixed .ml-app-shell__header {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 10;\n\t}\n\n\t/* ============================================\n\t CONTENT\n\t ============================================ */\n\t.ml-app-shell__content {\n\t\tflex: 1;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t}\n\n\t/* Scrollbar styling */\n\t.ml-app-shell__content::-webkit-scrollbar {\n\t\twidth: 6px;\n\t}\n\n\t.ml-app-shell__content::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\n\t.ml-app-shell__content::-webkit-scrollbar-thumb {\n\t\tbackground-color: var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-full);\n\t}\n\n\t/* ============================================\n\t MOBILE MENU BUTTON\n\t ============================================ */\n\t.ml-app-shell__menu-btn {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 36px;\n\t\theight: 36px;\n\t\tmargin-left: var(--ml-space-3);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tborder-radius: var(--ml-radius);\n\t\tbackground: transparent;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--ml-duration-150) var(--ml-ease-in-out);\n\t}\n\n\t.ml-app-shell__menu-btn:hover {\n\t\tbackground-color: var(--ml-color-surface-secondary);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-app-shell__menu-btn:focus-visible {\n\t\toutline: 2px solid var(--ml-color-primary);\n\t\toutline-offset: -2px;\n\t}\n\n\t/* ============================================\n\t MOBILE BACKDROP\n\t ============================================ */\n\t.ml-app-shell__backdrop {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t RESPONSIVE: MOBILE (<768px)\n\t ============================================ */\n\t@media (max-width: 767px) {\n\t\t.ml-app-shell {\n\t\t\tgrid-template-columns: 1fr;\n\t\t}\n\n\t\t.ml-app-shell__sidebar {\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tbottom: 0;\n\t\t\tz-index: 50;\n\t\t\twidth: var(--ml-sidebar-width, 280px);\n\t\t\ttransform: translateX(-100%);\n\t\t\ttransition: transform var(--ml-duration-200) var(--ml-ease-in-out);\n\t\t\tborder-right: var(--ml-border) solid var(--ml-color-border);\n\t\t\tbackground-color: var(--ml-color-surface);\n\t\t}\n\n\t\t.ml-app-shell--sidebar-right .ml-app-shell__sidebar {\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t\ttransform: translateX(100%);\n\t\t\tborder-left: var(--ml-border) solid var(--ml-color-border);\n\t\t\tborder-right: none;\n\t\t}\n\n\t\t.ml-app-shell__sidebar--mobile-open {\n\t\t\ttransform: translateX(0);\n\t\t}\n\n\t\t/* Backdrop */\n\t\t.ml-app-shell__backdrop {\n\t\t\tdisplay: block;\n\t\t\tposition: fixed;\n\t\t\tinset: 0;\n\t\t\tz-index: 40;\n\t\t\tbackground-color: rgba(0, 0, 0, 0.4);\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t\ttransition: opacity var(--ml-duration-200) var(--ml-ease-in-out);\n\t\t}\n\n\t\t.ml-app-shell__backdrop--visible {\n\t\t\topacity: 1;\n\t\t\tpointer-events: auto;\n\t\t}\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef, OnCreate, OnDestroy } from '@melodicdev/core';\nimport { appShellTemplate } from './app-shell.template.js';\nimport { appShellStyles } from './app-shell.styles.js';\n\nexport type SidebarPosition = 'left' | 'right';\n\n/**\n * ml-app-shell - Application shell layout component\n *\n * Provides a sidebar + header + content area layout using CSS Grid.\n *\n * @example\n * ```html\n * <ml-app-shell>\n * <ml-sidebar slot=\"sidebar\">...</ml-sidebar>\n * <div slot=\"header\">Page Header</div>\n * <main>Content</main>\n * </ml-app-shell>\n * ```\n *\n * @slot sidebar - Sidebar navigation area (full height)\n * @slot header - Top header bar in the main area\n * @slot default - Main content area (scrolls independently)\n */\n@MelodicComponent({\n\tselector: 'ml-app-shell',\n\ttemplate: appShellTemplate,\n\tstyles: appShellStyles,\n\tattributes: ['sidebar-position', 'sidebar-collapsed', 'header-fixed']\n})\nexport class AppShellComponent implements IElementRef, OnCreate, OnDestroy {\n\telementRef!: HTMLElement;\n\n\t/** Position of the sidebar: 'left' or 'right' */\n\t'sidebar-position': SidebarPosition = 'left';\n\n\t/** Whether the sidebar is collapsed */\n\t'sidebar-collapsed' = false;\n\n\t/** Whether the header is fixed/sticky */\n\t'header-fixed' = false;\n\n\t/** Internal: tracks if mobile drawer is open */\n\t_mobileOpen = false;\n\n\t/** Media query for responsive behavior */\n\tprivate _mediaQuery: MediaQueryList | null = null;\n\tprivate readonly _handleMediaChange = this.onMediaChange.bind(this);\n\n\tget isMobile(): boolean {\n\t\treturn this._mediaQuery?.matches === false;\n\t}\n\n\tonCreate(): void {\n\t\tthis._mediaQuery = window.matchMedia('(min-width: 768px)');\n\t\tthis._mediaQuery.addEventListener('change', this._handleMediaChange);\n\n\t\t// Close mobile drawer on initial desktop\n\t\tif (!this.isMobile) {\n\t\t\tthis._mobileOpen = false;\n\t\t}\n\t}\n\n\tonDestroy(): void {\n\t\tthis._mediaQuery?.removeEventListener('change', this._handleMediaChange);\n\t}\n\n\t/** Toggle mobile sidebar drawer */\n\ttoggleMobileSidebar = (): void => {\n\t\tthis._mobileOpen = !this._mobileOpen;\n\t};\n\n\t/** Close mobile sidebar */\n\tcloseMobileSidebar = (): void => {\n\t\tthis._mobileOpen = false;\n\t};\n\n\tprivate onMediaChange(event: MediaQueryListEvent): void {\n\t\tif (event.matches) {\n\t\t\t// Switched to desktop: close mobile drawer\n\t\t\tthis._mobileOpen = false;\n\t\t}\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { HeroSectionComponent } from './hero-section.component.js';\n\nexport function heroSectionTemplate(c: HeroSectionComponent) {\n\tconst isSplit = c.variant === 'split' || c.variant === 'split-reverse';\n\n\treturn html`\n\t\t<section\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-hero': true,\n\t\t\t\t[`ml-hero--${c.variant}`]: true,\n\t\t\t\t[`ml-hero--${c.size}`]: true,\n\t\t\t\t[`ml-hero--bg-${c.background}`]: c.background !== 'none'\n\t\t\t})}\n\t\t>\n\t\t\t<div class=\"ml-hero__container\">\n\t\t\t\t<div class=\"ml-hero__content\">\n\t\t\t\t\t<slot name=\"eyebrow\">\n\t\t\t\t\t\t${when(false, () => html``)}\n\t\t\t\t\t</slot>\n\n\t\t\t\t\t<slot name=\"title\">\n\t\t\t\t\t\t${when(!!c.title, () => html`\n\t\t\t\t\t\t\t<h1 class=\"ml-hero__title\">${c.title}</h1>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</slot>\n\n\t\t\t\t\t<slot name=\"description\">\n\t\t\t\t\t\t${when(!!c.description, () => html`\n\t\t\t\t\t\t\t<p class=\"ml-hero__description\">${c.description}</p>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</slot>\n\n\t\t\t\t\t<div class=\"ml-hero__actions\">\n\t\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${when(!isSplit, () => html`\n\t\t\t\t\t\t<div class=\"ml-hero__social-proof\">\n\t\t\t\t\t\t\t<slot name=\"social-proof\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\n\t\t\t\t${when(isSplit, () => html`\n\t\t\t\t\t<div class=\"ml-hero__media\">\n\t\t\t\t\t\t<slot name=\"media\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\n\t\t\t\t${when(!isSplit, () => html`\n\t\t\t\t\t<div class=\"ml-hero__media ml-hero__media--below\">\n\t\t\t\t\t\t<slot name=\"media\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t${when(isSplit, () => html`\n\t\t\t\t<div class=\"ml-hero__social-proof\">\n\t\t\t\t\t<slot name=\"social-proof\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</section>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const heroSectionStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t/* ============================================\n\t HERO CONTAINER\n\t ============================================ */\n\t.ml-hero {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* ============================================\n\t SIZE VARIANTS (padding & font sizes)\n\t ============================================ */\n\t.ml-hero--sm {\n\t\tpadding: var(--ml-space-12) var(--ml-space-6);\n\t}\n\n\t.ml-hero--md {\n\t\tpadding: var(--ml-space-20) var(--ml-space-6);\n\t}\n\n\t.ml-hero--lg {\n\t\tpadding: calc(var(--ml-space-20) + var(--ml-space-10)) var(--ml-space-6);\n\t}\n\n\t.ml-hero--sm .ml-hero__title,\n\t.ml-hero--sm ::slotted([slot=\"title\"]) {\n\t\tfont-size: var(--ml-text-3xl);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-hero--md .ml-hero__title,\n\t.ml-hero--md ::slotted([slot=\"title\"]) {\n\t\tfont-size: var(--ml-text-4xl);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-hero--lg .ml-hero__title,\n\t.ml-hero--lg ::slotted([slot=\"title\"]) {\n\t\tfont-size: var(--ml-text-5xl);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-hero--sm .ml-hero__description,\n\t.ml-hero--sm ::slotted([slot=\"description\"]) {\n\t\tfont-size: var(--ml-text-base);\n\t}\n\n\t.ml-hero--md .ml-hero__description,\n\t.ml-hero--md ::slotted([slot=\"description\"]) {\n\t\tfont-size: var(--ml-text-lg);\n\t}\n\n\t.ml-hero--lg .ml-hero__description,\n\t.ml-hero--lg ::slotted([slot=\"description\"]) {\n\t\tfont-size: var(--ml-text-xl);\n\t}\n\n\t/* ============================================\n\t BACKGROUND VARIANTS\n\t ============================================ */\n\t.ml-hero--bg-subtle {\n\t\tbackground-color: var(--ml-color-surface-secondary);\n\t}\n\n\t.ml-hero--bg-gradient {\n\t\tbackground: linear-gradient(\n\t\t\t135deg,\n\t\t\tvar(--ml-color-primary-subtle) 0%,\n\t\t\tvar(--ml-color-surface) 50%,\n\t\t\tvar(--ml-color-success-subtle, var(--ml-color-surface-secondary)) 100%\n\t\t);\n\t}\n\n\t/* ============================================\n\t LAYOUT: CONTAINER\n\t ============================================ */\n\t.ml-hero__container {\n\t\tmax-width: var(--ml-container-xl, 1280px);\n\t\tmargin: 0 auto;\n\t\twidth: 100%;\n\t}\n\n\t/* ============================================\n\t LAYOUT: CENTERED\n\t ============================================ */\n\t.ml-hero--centered .ml-hero__container {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t}\n\n\t.ml-hero--centered .ml-hero__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\ttext-align: center;\n\t\tmax-width: 800px;\n\t}\n\n\t.ml-hero--centered .ml-hero__media--below {\n\t\tmargin-top: var(--ml-space-10);\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t}\n\n\t/* ============================================\n\t LAYOUT: SPLIT\n\t ============================================ */\n\t.ml-hero--split .ml-hero__container,\n\t.ml-hero--split-reverse .ml-hero__container {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr 1fr;\n\t\tgap: var(--ml-space-12);\n\t\talign-items: center;\n\t}\n\n\t.ml-hero--split-reverse .ml-hero__content {\n\t\torder: 2;\n\t}\n\n\t.ml-hero--split-reverse .ml-hero__media {\n\t\torder: 1;\n\t}\n\n\t.ml-hero--split .ml-hero__content,\n\t.ml-hero--split-reverse .ml-hero__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* ============================================\n\t CONTENT ELEMENTS\n\t ============================================ */\n\n\t/* Eyebrow */\n\t::slotted([slot=\"eyebrow\"]) {\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: var(--ml-space-4);\n\t\tfont-size: var(--ml-text-sm);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tcolor: var(--ml-color-primary);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t}\n\n\t/* Title */\n\t.ml-hero__title,\n\t::slotted([slot=\"title\"]) {\n\t\tmargin: 0 0 var(--ml-space-4) 0;\n\t\tfont-weight: var(--ml-font-bold);\n\t\tcolor: var(--ml-color-text);\n\t\tletter-spacing: -0.025em;\n\t}\n\n\t/* Description */\n\t.ml-hero__description,\n\t::slotted([slot=\"description\"]) {\n\t\tmargin: 0 0 var(--ml-space-8) 0;\n\t\tcolor: var(--ml-color-text-secondary);\n\t\tline-height: var(--ml-leading-relaxed);\n\t\tmax-width: 640px;\n\t}\n\n\t/* Actions */\n\t.ml-hero__actions {\n\t\tdisplay: flex;\n\t\tgap: var(--ml-space-3);\n\t\tflex-wrap: wrap;\n\t}\n\n\t.ml-hero--centered .ml-hero__actions {\n\t\tjustify-content: center;\n\t}\n\n\t.ml-hero__actions:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* Media */\n\t.ml-hero__media {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.ml-hero__media:empty {\n\t\tdisplay: none;\n\t}\n\n\t::slotted([slot=\"media\"]) {\n\t\tmax-width: 100%;\n\t\theight: auto;\n\t\tborder-radius: var(--ml-radius-lg);\n\t}\n\n\t/* Social proof */\n\t.ml-hero__social-proof {\n\t\tmargin-top: var(--ml-space-10);\n\t\twidth: 100%;\n\t}\n\n\t.ml-hero--centered .ml-hero__social-proof {\n\t\ttext-align: center;\n\t}\n\n\t.ml-hero__social-proof:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t RESPONSIVE: collapse split to stacked\n\t ============================================ */\n\t@media (max-width: 768px) {\n\t\t.ml-hero--split .ml-hero__container,\n\t\t.ml-hero--split-reverse .ml-hero__container {\n\t\t\tgrid-template-columns: 1fr;\n\t\t}\n\n\t\t.ml-hero--split .ml-hero__content,\n\t\t.ml-hero--split-reverse .ml-hero__content {\n\t\t\torder: 1;\n\t\t\ttext-align: center;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t.ml-hero--split .ml-hero__media,\n\t\t.ml-hero--split-reverse .ml-hero__media {\n\t\t\torder: 2;\n\t\t}\n\n\t\t.ml-hero--split .ml-hero__actions,\n\t\t.ml-hero--split-reverse .ml-hero__actions {\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t.ml-hero--lg {\n\t\t\tpadding: var(--ml-space-16) var(--ml-space-4);\n\t\t}\n\n\t\t.ml-hero--md {\n\t\t\tpadding: var(--ml-space-12) var(--ml-space-4);\n\t\t}\n\n\t\t.ml-hero--sm {\n\t\t\tpadding: var(--ml-space-8) var(--ml-space-4);\n\t\t}\n\n\t\t.ml-hero--lg .ml-hero__title,\n\t\t.ml-hero--lg ::slotted([slot=\"title\"]) {\n\t\t\tfont-size: var(--ml-text-3xl);\n\t\t}\n\n\t\t.ml-hero--md .ml-hero__title,\n\t\t.ml-hero--md ::slotted([slot=\"title\"]) {\n\t\t\tfont-size: var(--ml-text-2xl);\n\t\t}\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { heroSectionTemplate } from './hero-section.template.js';\nimport { heroSectionStyles } from './hero-section.styles.js';\n\nexport type HeroVariant = 'centered' | 'split' | 'split-reverse';\nexport type HeroSize = 'sm' | 'md' | 'lg';\nexport type HeroBackground = 'none' | 'subtle' | 'gradient';\n\n/**\n * ml-hero-section - Marketing hero/header section\n *\n * @example\n * ```html\n * <ml-hero-section variant=\"centered\" size=\"lg\">\n * <span slot=\"eyebrow\">New Release</span>\n * <span slot=\"title\">Build better apps</span>\n * <span slot=\"description\">A modern framework for the modern web.</span>\n * <div slot=\"actions\">\n * <ml-button variant=\"primary\">Get Started</ml-button>\n * </div>\n * </ml-hero-section>\n * ```\n *\n * @slot eyebrow - Small text/badge above the title\n * @slot title - Main headline (or use `title` property)\n * @slot description - Supporting text (or use `description` property)\n * @slot actions - CTA buttons\n * @slot media - Image, video, or illustration\n * @slot social-proof - Logos, testimonials, stats below CTA\n */\n@MelodicComponent({\n\tselector: 'ml-hero-section',\n\ttemplate: heroSectionTemplate,\n\tstyles: heroSectionStyles,\n\tattributes: ['variant', 'size', 'background', 'title', 'description']\n})\nexport class HeroSectionComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Layout variant */\n\tvariant: HeroVariant = 'centered';\n\n\t/** Size controls padding and font sizes */\n\tsize: HeroSize = 'lg';\n\n\t/** Background style */\n\tbackground: HeroBackground = 'none';\n\n\t/** Headline text (alternative to title slot) */\n\ttitle = '';\n\n\t/** Supporting text (alternative to description slot) */\n\tdescription = '';\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { PageHeaderComponent } from './page-header.component.js';\n\nexport function pageHeaderTemplate(c: PageHeaderComponent) {\n\tconst hasTitle = !!(c.title || c.hasTitleSlot);\n\tconst hasDescription = !!(c.description || c.hasDescriptionSlot);\n\n\treturn html`\n\t\t<header\n\t\t\tclass=${classMap({\n\t\t\t\t'ml-page-header': true,\n\t\t\t\t[`ml-page-header--${c.variant}`]: true,\n\t\t\t\t'ml-page-header--divider': c.divider\n\t\t\t})}\n\t\t>\n\t\t\t${when(c.hasBreadcrumb, () => html`\n\t\t\t\t<div class=\"ml-page-header__breadcrumb\">\n\t\t\t\t\t<slot name=\"breadcrumb\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<div class=\"ml-page-header__main\">\n\t\t\t\t<div class=\"ml-page-header__content\">\n\t\t\t\t\t${when(hasTitle, () => html`\n\t\t\t\t\t\t<div class=\"ml-page-header__title\">\n\t\t\t\t\t\t\t${when(c.hasTitleSlot,\n\t\t\t\t\t\t\t\t() => html`<slot name=\"title\"></slot>`,\n\t\t\t\t\t\t\t\t() => html`<h1>${c.title}</h1>`\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t${when(hasDescription, () => html`\n\t\t\t\t\t\t<div class=\"ml-page-header__description\">\n\t\t\t\t\t\t\t${when(c.hasDescriptionSlot,\n\t\t\t\t\t\t\t\t() => html`<slot name=\"description\"></slot>`,\n\t\t\t\t\t\t\t\t() => html`<p>${c.description}</p>`\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\n\t\t\t\t\t${when(c.hasMeta, () => html`\n\t\t\t\t\t\t<div class=\"ml-page-header__meta\">\n\t\t\t\t\t\t\t<slot name=\"meta\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\n\t\t\t\t${when(c.hasActions, () => html`\n\t\t\t\t\t<div class=\"ml-page-header__actions\">\n\t\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t${when(c.hasTabs, () => html`\n\t\t\t\t<div class=\"ml-page-header__tabs\">\n\t\t\t\t\t<slot name=\"tabs\"></slot>\n\t\t\t\t</div>\n\t\t\t`)}\n\t\t</header>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const pageHeaderStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t/* ============================================\n\t PAGE HEADER CONTAINER\n\t ============================================ */\n\t.ml-page-header {\n\t\tpadding: var(--ml-space-6) var(--ml-space-6) var(--ml-space-4);\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t.ml-page-header--divider {\n\t\tborder-bottom: var(--ml-border) solid var(--ml-color-border);\n\t}\n\n\t/* ============================================\n\t COMPACT VARIANT\n\t ============================================ */\n\t.ml-page-header--compact {\n\t\tpadding: var(--ml-space-4) var(--ml-space-6) var(--ml-space-3);\n\t}\n\n\t.ml-page-header--compact .ml-page-header__title h1 {\n\t\tfont-size: var(--ml-text-lg);\n\t}\n\n\t/* ============================================\n\t CENTERED VARIANT\n\t ============================================ */\n\t.ml-page-header--centered {\n\t\ttext-align: center;\n\t}\n\n\t.ml-page-header--centered .ml-page-header__main {\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t}\n\n\t.ml-page-header--centered .ml-page-header__content {\n\t\talign-items: center;\n\t}\n\n\t.ml-page-header--centered .ml-page-header__actions {\n\t\tmargin-top: var(--ml-space-4);\n\t}\n\n\t.ml-page-header--centered .ml-page-header__breadcrumb {\n\t\tjustify-content: center;\n\t}\n\n\t/* ============================================\n\t BREADCRUMB\n\t ============================================ */\n\t.ml-page-header__breadcrumb {\n\t\tdisplay: flex;\n\t\tmargin-bottom: var(--ml-space-3);\n\t}\n\n\t/* ============================================\n\t MAIN (title row + actions)\n\t ============================================ */\n\t.ml-page-header__main {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tjustify-content: space-between;\n\t\tgap: var(--ml-space-4);\n\t}\n\n\t/* ============================================\n\t CONTENT (title + description + meta)\n\t ============================================ */\n\t.ml-page-header__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-1);\n\t\tmin-width: 0;\n\t\tflex: 1;\n\t}\n\n\t/* ============================================\n\t TITLE\n\t ============================================ */\n\t.ml-page-header__title h1 {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-2xl);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tline-height: var(--ml-leading-tight);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t.ml-page-header__title ::slotted(*) {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-2xl);\n\t\tfont-weight: var(--ml-font-semibold);\n\t\tline-height: var(--ml-leading-tight);\n\t\tcolor: var(--ml-color-text);\n\t}\n\n\t/* ============================================\n\t DESCRIPTION\n\t ============================================ */\n\t.ml-page-header__description p {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-normal);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t.ml-page-header__description ::slotted(*) {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tline-height: var(--ml-leading-normal);\n\t\tcolor: var(--ml-color-text-secondary);\n\t}\n\n\t/* ============================================\n\t META\n\t ============================================ */\n\t.ml-page-header__meta {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tmargin-top: var(--ml-space-2);\n\t}\n\n\t/* ============================================\n\t ACTIONS\n\t ============================================ */\n\t.ml-page-header__actions {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ml-space-2);\n\t\tflex-shrink: 0;\n\t}\n\n\t/* ============================================\n\t TABS\n\t ============================================ */\n\t.ml-page-header__tabs {\n\t\tmargin-top: var(--ml-space-4);\n\t}\n\n\t/* ============================================\n\t RESPONSIVE\n\t ============================================ */\n\t@media (max-width: 640px) {\n\t\t.ml-page-header {\n\t\t\tpadding: var(--ml-space-4);\n\t\t}\n\n\t\t.ml-page-header__main {\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t.ml-page-header__actions {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.ml-page-header__actions ::slotted(*) {\n\t\t\tflex: 1;\n\t\t}\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { pageHeaderTemplate } from './page-header.template.js';\nimport { pageHeaderStyles } from './page-header.styles.js';\n\nexport type PageHeaderVariant = 'default' | 'compact' | 'centered';\n\n/**\n * ml-page-header - Section component for page titles with breadcrumb, description, and actions\n *\n * @example\n * ```html\n * <ml-page-header title=\"Dashboard\" description=\"Overview of your account\">\n * <ml-breadcrumb slot=\"breadcrumb\">\n * <ml-breadcrumb-item href=\"/\">Home</ml-breadcrumb-item>\n * <ml-breadcrumb-item>Dashboard</ml-breadcrumb-item>\n * </ml-breadcrumb>\n * <ml-button slot=\"actions\" variant=\"primary\">Create New</ml-button>\n * </ml-page-header>\n * ```\n *\n * @slot breadcrumb - For ml-breadcrumb component\n * @slot title - Page title (alternative to title property)\n * @slot description - Supporting text below title\n * @slot actions - Action buttons (right-aligned)\n * @slot tabs - Optional tab navigation below the header\n * @slot meta - Optional metadata area (badges, status, etc.)\n */\n@MelodicComponent({\n\tselector: 'ml-page-header',\n\ttemplate: pageHeaderTemplate,\n\tstyles: pageHeaderStyles,\n\tattributes: ['variant', 'divider', 'title', 'description']\n})\nexport class PageHeaderComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Page title text */\n\ttitle = '';\n\n\t/** Page description text */\n\tdescription = '';\n\n\t/** Visual variant */\n\tvariant: PageHeaderVariant = 'default';\n\n\t/** Show bottom border */\n\tdivider = true;\n\n\t/** Check if breadcrumb slot has content */\n\tget hasBreadcrumb(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"breadcrumb\"]') !== null;\n\t}\n\n\t/** Check if title slot has content */\n\tget hasTitleSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"title\"]') !== null;\n\t}\n\n\t/** Check if description slot has content */\n\tget hasDescriptionSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"description\"]') !== null;\n\t}\n\n\t/** Check if actions slot has content */\n\tget hasActions(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"actions\"]') !== null;\n\t}\n\n\t/** Check if tabs slot has content */\n\tget hasTabs(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"tabs\"]') !== null;\n\t}\n\n\t/** Check if meta slot has content */\n\tget hasMeta(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"meta\"]') !== null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { LoginPageComponent } from './login-page.component.js';\n\nexport function loginPageTemplate(c: LoginPageComponent) {\n\tconst isSplit = c.variant === 'split';\n\n\tconst cardContent = html`\n\t\t<div class=\"ml-auth__logo\">\n\t\t\t<slot name=\"logo\"></slot>\n\t\t</div>\n\n\t\t${when(\n\t\t\tc.hasHeaderSlot,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-auth__header\">\n\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t</div>\n\t\t\t`,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-auth__header\">\n\t\t\t\t\t<h1 class=\"ml-auth__title\">${c.title}</h1>\n\t\t\t\t\t<p class=\"ml-auth__description\">${c.description}</p>\n\t\t\t\t</div>\n\t\t\t`\n\t\t)}\n\n\t\t<div class=\"ml-auth__social\">\n\t\t\t<slot name=\"social\"></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-auth__form\">\n\t\t\t<slot name=\"form\"></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-auth__footer\">\n\t\t\t<slot name=\"footer\"></slot>\n\t\t</div>\n\t`;\n\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-auth': true,\n\t\t\t'ml-auth--centered': !isSplit,\n\t\t\t'ml-auth--split': isSplit\n\t\t})}>\n\t\t\t${when(\n\t\t\t\tisSplit,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-auth__form-side\">\n\t\t\t\t\t\t<div class=\"ml-auth__card\">\n\t\t\t\t\t\t\t${cardContent}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"ml-auth__brand-side\">\n\t\t\t\t\t\t<div class=\"ml-auth__brand-content\">\n\t\t\t\t\t\t\t<slot name=\"brand\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-auth__card\">\n\t\t\t\t\t\t${cardContent}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","export const authLayoutCss = `\n\t/* ============================================\n\t AUTH LAYOUT - SHARED STYLES\n\t ============================================ */\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t BASE WRAPPER\n\t ============================================ */\n\t.ml-auth {\n\t\tdisplay: flex;\n\t\tmin-height: 100%;\n\t\theight: 100%;\n\t\tfont-family: var(--ml-font-sans);\n\t\tbackground-color: var(--ml-color-surface-secondary);\n\t}\n\n\t/* ============================================\n\t CENTERED VARIANT\n\t ============================================ */\n\t.ml-auth--centered {\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: var(--ml-space-6);\n\t}\n\n\t.ml-auth--centered .ml-auth__card {\n\t\twidth: 100%;\n\t\tmax-width: 440px;\n\t\tbackground-color: var(--ml-color-surface);\n\t\tborder: var(--ml-border) solid var(--ml-color-border);\n\t\tborder-radius: var(--ml-radius-xl);\n\t\tbox-shadow: var(--ml-shadow-lg);\n\t\tpadding: var(--ml-space-10);\n\t}\n\n\t/* ============================================\n\t SPLIT VARIANT\n\t ============================================ */\n\t.ml-auth--split {\n\t\tflex-direction: row;\n\t}\n\n\t.ml-auth--split .ml-auth__form-side {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: 1;\n\t\tpadding: var(--ml-space-10);\n\t\tbackground-color: var(--ml-color-surface);\n\t}\n\n\t.ml-auth--split .ml-auth__card {\n\t\twidth: 100%;\n\t\tmax-width: 440px;\n\t}\n\n\t.ml-auth--split .ml-auth__brand-side {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: 1;\n\t\tpadding: var(--ml-space-10);\n\t\tbackground-color: var(--ml-color-primary);\n\t\tcolor: var(--ml-color-text-inverse);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t}\n\n\t.ml-auth__brand-content {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t\ttext-align: center;\n\t\tmax-width: 480px;\n\t}\n\n\t.ml-auth__brand-content ::slotted(*) {\n\t\tcolor: inherit;\n\t}\n\n\t/* ============================================\n\t LOGO AREA\n\t ============================================ */\n\t.ml-auth__logo {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tmargin-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-auth__logo:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t HEADER\n\t ============================================ */\n\t.ml-auth__header {\n\t\ttext-align: center;\n\t\tmargin-bottom: var(--ml-space-8);\n\t}\n\n\t.ml-auth__title {\n\t\tmargin: 0 0 var(--ml-space-2) 0;\n\t\tfont-size: var(--ml-text-2xl);\n\t\tfont-weight: var(--ml-font-bold);\n\t\tcolor: var(--ml-color-text);\n\t\tline-height: var(--ml-leading-tight);\n\t}\n\n\t.ml-auth__description {\n\t\tmargin: 0;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t\tline-height: var(--ml-leading-normal);\n\t}\n\n\t/* ============================================\n\t FORM AREA\n\t ============================================ */\n\t.ml-auth__form {\n\t\tmargin-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-auth__form:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t SOCIAL LOGIN\n\t ============================================ */\n\t.ml-auth__social {\n\t\tmargin-bottom: var(--ml-space-6);\n\t}\n\n\t.ml-auth__social:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t FOOTER\n\t ============================================ */\n\t.ml-auth__footer {\n\t\ttext-align: center;\n\t\tfont-size: var(--ml-text-sm);\n\t\tcolor: var(--ml-color-text-muted);\n\t}\n\n\t.ml-auth__footer:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* ============================================\n\t RESPONSIVE - SPLIT COLLAPSE\n\t ============================================ */\n\t@media (max-width: 768px) {\n\t\t.ml-auth--split {\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t.ml-auth--split .ml-auth__brand-side {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t.ml-auth--split .ml-auth__form-side {\n\t\t\tmin-height: 100%;\n\t\t\tpadding: var(--ml-space-6);\n\t\t}\n\t}\n`;\n","import { css } from '@melodicdev/core';\nimport { authLayoutCss } from './auth-layout.styles.js';\n\nexport const loginPageStyles = () => css`\n\t${authLayoutCss}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { loginPageTemplate } from './login-page.template.js';\nimport { loginPageStyles } from './login-page.styles.js';\n\n/**\n * ml-login-page - A full-page login component\n *\n * @example Centered:\n * ```html\n * <ml-login-page>\n * <div slot=\"logo\"><img src=\"logo.svg\" alt=\"Logo\" /></div>\n * <form slot=\"form\">...</form>\n * <div slot=\"footer\">\n * <a href=\"/forgot\">Forgot password?</a>\n * <a href=\"/signup\">Sign up</a>\n * </div>\n * </ml-login-page>\n * ```\n *\n * @example Split variant:\n * ```html\n * <ml-login-page variant=\"split\">\n * <form slot=\"form\">...</form>\n * <div slot=\"brand\">Welcome back to our platform</div>\n * </ml-login-page>\n * ```\n *\n * @slot logo - Brand logo area\n * @slot header - Custom header content (overrides title/description props)\n * @slot form - The login form\n * @slot footer - Links like \"Forgot password?\", \"Sign up\"\n * @slot social - Social login buttons\n * @slot brand - Content for the brand side (split variant only)\n */\n@MelodicComponent({\n\tselector: 'ml-login-page',\n\ttemplate: loginPageTemplate,\n\tstyles: loginPageStyles,\n\tattributes: ['variant', 'title', 'description']\n})\nexport class LoginPageComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Layout variant */\n\tvariant: 'centered' | 'split' = 'centered';\n\n\t/** Page title */\n\ttitle = 'Log in to your account';\n\n\t/** Page description */\n\tdescription = 'Welcome back! Please enter your details.';\n\n\t/** Check if header slot has content */\n\tget hasHeaderSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header\"]') !== null;\n\t}\n\n\t/** Check if brand slot has content */\n\tget hasBrandSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"brand\"]') !== null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { SignupPageComponent } from './signup-page.component.js';\n\nexport function signupPageTemplate(c: SignupPageComponent) {\n\tconst isSplit = c.variant === 'split';\n\n\tconst cardContent = html`\n\t\t<div class=\"ml-auth__logo\">\n\t\t\t<slot name=\"logo\"></slot>\n\t\t</div>\n\n\t\t${when(\n\t\t\tc.hasHeaderSlot,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-auth__header\">\n\t\t\t\t\t<slot name=\"header\"></slot>\n\t\t\t\t</div>\n\t\t\t`,\n\t\t\t() => html`\n\t\t\t\t<div class=\"ml-auth__header\">\n\t\t\t\t\t<h1 class=\"ml-auth__title\">${c.title}</h1>\n\t\t\t\t\t<p class=\"ml-auth__description\">${c.description}</p>\n\t\t\t\t</div>\n\t\t\t`\n\t\t)}\n\n\t\t<div class=\"ml-auth__social\">\n\t\t\t<slot name=\"social\"></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-auth__form\">\n\t\t\t<slot name=\"form\"></slot>\n\t\t</div>\n\n\t\t<div class=\"ml-auth__footer\">\n\t\t\t<slot name=\"footer\"></slot>\n\t\t</div>\n\t`;\n\n\treturn html`\n\t\t<div class=${classMap({\n\t\t\t'ml-auth': true,\n\t\t\t'ml-auth--centered': !isSplit,\n\t\t\t'ml-auth--split': isSplit\n\t\t})}>\n\t\t\t${when(\n\t\t\t\tisSplit,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-auth__form-side\">\n\t\t\t\t\t\t<div class=\"ml-auth__card\">\n\t\t\t\t\t\t\t${cardContent}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"ml-auth__brand-side\">\n\t\t\t\t\t\t<div class=\"ml-auth__brand-content\">\n\t\t\t\t\t\t\t<slot name=\"brand\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t\t() => html`\n\t\t\t\t\t<div class=\"ml-auth__card\">\n\t\t\t\t\t\t${cardContent}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t)}\n\t\t</div>\n\t`;\n}\n","import { css } from '@melodicdev/core';\nimport { authLayoutCss } from './auth-layout.styles.js';\n\nexport const signupPageStyles = () => css`\n\t${authLayoutCss}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { signupPageTemplate } from './signup-page.template.js';\nimport { signupPageStyles } from './signup-page.styles.js';\n\n/**\n * ml-signup-page - A full-page signup/registration component\n *\n * @example Centered:\n * ```html\n * <ml-signup-page>\n * <div slot=\"logo\"><img src=\"logo.svg\" alt=\"Logo\" /></div>\n * <form slot=\"form\">...</form>\n * <div slot=\"footer\">\n * <a href=\"/login\">Already have an account? Log in</a>\n * </div>\n * </ml-signup-page>\n * ```\n *\n * @example Split variant:\n * ```html\n * <ml-signup-page variant=\"split\">\n * <form slot=\"form\">...</form>\n * <div slot=\"brand\">Join thousands of users</div>\n * </ml-signup-page>\n * ```\n *\n * @slot logo - Brand logo area\n * @slot header - Custom header content (overrides title/description props)\n * @slot form - The signup form\n * @slot footer - Links like \"Already have an account?\"\n * @slot social - Social signup buttons\n * @slot brand - Content for the brand side (split variant only)\n */\n@MelodicComponent({\n\tselector: 'ml-signup-page',\n\ttemplate: signupPageTemplate,\n\tstyles: signupPageStyles,\n\tattributes: ['variant', 'title', 'description']\n})\nexport class SignupPageComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Layout variant */\n\tvariant: 'centered' | 'split' = 'centered';\n\n\t/** Page title */\n\ttitle = 'Create an account';\n\n\t/** Page description */\n\tdescription = 'Start your journey today.';\n\n\t/** Check if header slot has content */\n\tget hasHeaderSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header\"]') !== null;\n\t}\n\n\t/** Check if brand slot has content */\n\tget hasBrandSlot(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"brand\"]') !== null;\n\t}\n}\n","import { html, classMap, when } from '@melodicdev/core';\nimport type { DashboardPageComponent } from './dashboard-page.component.js';\n\nexport function dashboardPageTemplate(c: DashboardPageComponent) {\n\tconst showAside = c.layout === 'default' && c.hasAside;\n\n\treturn html`\n\t\t<ml-app-shell>\n\t\t\t<slot name=\"sidebar\" slot=\"sidebar\"></slot>\n\n\t\t\t<ml-page-header\n\t\t\t\tslot=\"header\"\n\t\t\t\ttitle=${c.title}\n\t\t\t\tdescription=${c.description}\n\t\t\t>\n\t\t\t\t${when(c.hasHeaderActions, () => html`\n\t\t\t\t\t<slot name=\"header-actions\" slot=\"actions\"></slot>\n\t\t\t\t`)}\n\t\t\t</ml-page-header>\n\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'ml-dashboard': true,\n\t\t\t\t\t[`ml-dashboard--${c.layout}`]: true\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t${when(c.hasMetrics, () => html`\n\t\t\t\t\t<div class=\"ml-dashboard__metrics\">\n\t\t\t\t\t\t<slot name=\"metrics\"></slot>\n\t\t\t\t\t</div>\n\t\t\t\t`)}\n\n\t\t\t\t<div class=\"ml-dashboard__body\">\n\t\t\t\t\t<div class=\"ml-dashboard__main\">\n\t\t\t\t\t\t<slot name=\"main\"></slot>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${when(showAside, () => html`\n\t\t\t\t\t\t<div class=\"ml-dashboard__aside\">\n\t\t\t\t\t\t\t<slot name=\"aside\"></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ml-app-shell>\n\t`;\n}\n","import { css } from '@melodicdev/core';\n\nexport const dashboardPageStyles = () => css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n\n\t/* ============================================\n\t DASHBOARD CONTENT AREA\n\t ============================================ */\n\t.ml-dashboard {\n\t\tpadding: var(--ml-space-6);\n\t\tfont-family: var(--ml-font-sans);\n\t}\n\n\t/* ============================================\n\t METRICS ROW\n\t ============================================ */\n\t.ml-dashboard__metrics {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\t\tgap: var(--ml-space-4);\n\t\tmargin-bottom: var(--ml-space-6);\n\t}\n\n\t/* ============================================\n\t BODY (MAIN + ASIDE GRID)\n\t ============================================ */\n\t.ml-dashboard__body {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr;\n\t\tgap: var(--ml-space-6);\n\t}\n\n\t/* Default layout: 2/3 main + 1/3 aside */\n\t.ml-dashboard--default .ml-dashboard__body {\n\t\tgrid-template-columns: 2fr 1fr;\n\t}\n\n\t/* Wide layout: full-width main, aside below */\n\t.ml-dashboard--wide .ml-dashboard__body {\n\t\tgrid-template-columns: 1fr;\n\t}\n\n\t/* Full layout: main only, no aside */\n\t.ml-dashboard--full .ml-dashboard__body {\n\t\tgrid-template-columns: 1fr;\n\t}\n\n\t/* ============================================\n\t MAIN CONTENT\n\t ============================================ */\n\t.ml-dashboard__main {\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-6);\n\t}\n\n\t/* ============================================\n\t ASIDE\n\t ============================================ */\n\t.ml-dashboard__aside {\n\t\tmin-width: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ml-space-6);\n\t}\n\n\t/* ============================================\n\t RESPONSIVE\n\t ============================================ */\n\t@media (max-width: 1024px) {\n\t\t.ml-dashboard--default .ml-dashboard__body {\n\t\t\tgrid-template-columns: 1fr;\n\t\t}\n\t}\n\n\t@media (max-width: 640px) {\n\t\t.ml-dashboard {\n\t\t\tpadding: var(--ml-space-4);\n\t\t}\n\n\t\t.ml-dashboard__metrics {\n\t\t\tgrid-template-columns: 1fr;\n\t\t\tgap: var(--ml-space-3);\n\t\t\tmargin-bottom: var(--ml-space-4);\n\t\t}\n\n\t\t.ml-dashboard__body {\n\t\t\tgap: var(--ml-space-4);\n\t\t}\n\t}\n`;\n","import { MelodicComponent } from '@melodicdev/core';\nimport type { IElementRef } from '@melodicdev/core';\nimport { dashboardPageTemplate } from './dashboard-page.template.js';\nimport { dashboardPageStyles } from './dashboard-page.styles.js';\n\nexport type DashboardLayout = 'default' | 'wide' | 'full';\n\n/**\n * ml-dashboard-page - Composite dashboard layout component\n *\n * Composes ml-app-shell with ml-page-header to provide a complete\n * dashboard page with sidebar, header, metrics row, main content,\n * and optional aside column.\n *\n * @example\n * ```html\n * <ml-dashboard-page title=\"Dashboard\" description=\"Overview of your account\">\n * <ml-sidebar slot=\"sidebar\">...</ml-sidebar>\n * <ml-button slot=\"header-actions\" variant=\"primary\">Create</ml-button>\n * <ml-stat slot=\"metrics\">...</ml-stat>\n * <div slot=\"main\">Main content</div>\n * <div slot=\"aside\">Activity feed</div>\n * </ml-dashboard-page>\n * ```\n *\n * @slot sidebar - Sidebar content (passed through to app shell)\n * @slot header-actions - Action buttons for the page header\n * @slot metrics - Stat/metric cards row\n * @slot main - Primary content area (tables, charts)\n * @slot aside - Secondary content (activity feed, notifications)\n */\n@MelodicComponent({\n\tselector: 'ml-dashboard-page',\n\ttemplate: dashboardPageTemplate,\n\tstyles: dashboardPageStyles,\n\tattributes: ['title', 'description', 'layout']\n})\nexport class DashboardPageComponent implements IElementRef {\n\telementRef!: HTMLElement;\n\n\t/** Page title */\n\ttitle = '';\n\n\t/** Page description */\n\tdescription = '';\n\n\t/** Content layout variant */\n\tlayout: DashboardLayout = 'default';\n\n\t/** Check if metrics slot has content */\n\tget hasMetrics(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"metrics\"]') !== null;\n\t}\n\n\t/** Check if aside slot has content */\n\tget hasAside(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"aside\"]') !== null;\n\t}\n\n\t/** Check if header-actions slot has content */\n\tget hasHeaderActions(): boolean {\n\t\treturn this.elementRef?.querySelector('[slot=\"header-actions\"]') !== null;\n\t}\n}\n"],"mappings":"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"}
|