@aitronos/freddy-plugins 0.4.50 → 0.4.52

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/plugins/icon-style.ts","../src/plugins/theme-service.global.ts","../src/directives/frSanitize.ts","../src/plugin.ts","../src/plugins/index.ts","../src/animations/AnimeSpaceman.vue","../src/components/AdvancedModal.vue","../src/components/Tooltip.vue","../src/components/Buttons/BaseButton.vue","../src/components/Buttons/SocialButtons.vue","../src/components/CodeBlock.vue","../src/components/CustomCheckbox.vue","../src/components/DiffTextarea.vue","../src/components/Switch.vue","../src/components/Dropdown.vue","../src/components/EmailCodeVerification.vue","../src/components/InputField/BaseInput.vue","../src/components/InputField/CardInput.vue","../src/components/InputField/DefaultInput.vue","../src/components/InputField/PhoneInput.vue","../src/components/InputField/InputField.vue","../src/components/ModalBox.vue","../src/components/Instructions/InstructionsModal.vue","../src/components/Instructions/InstructiontextArea.vue","../src/components/ModalOverlay.vue","../src/components/Spinner.vue","../src/components/SearchInput.vue","../src/components/ModelDropdown.vue","../src/components/Pagination.vue","../src/components/SendButton.vue","../src/components/SkeletonLoader.vue","../src/components/Slider.vue","../src/components/SnackBar.vue","../src/components/SwitchSlot.vue","../src/components/TabList.vue","../src/components/Tabs/BaseTabButton.vue","../src/components/ToastMessage.vue","../src/components/TooltipV2.vue","../src/composables/useErrorHandler.ts","../src/composables/usePerformance.ts"],"sourcesContent":["// src/plugins/icon-style.ts\n\nimport type { Directive } from \"vue\";\n\nconst IconStyleDirective: Directive = {\n mounted(el: HTMLElement) {\n if (!el.getAttribute(\"class\")) {\n el.setAttribute(\"class\", \"base-fallback-style\");\n }\n },\n};\n\nexport default IconStyleDirective;\n","import type { App } from 'vue'\nimport { useThemeService } from '../services/ThemeService'\n\n// Global theme service plugin\nexport const themeServicePlugin = {\n install(app: App) {\n // Make theme service available globally\n app.config.globalProperties.$themeService = useThemeService()\n \n // Provide theme service to all components\n app.provide('themeService', useThemeService())\n \n // Add theme service to component properties\n app.config.globalProperties.$theme = useThemeService()\n }\n}\n\n// Auto-import helper for components\nexport const useGlobalTheme = () => {\n return useThemeService()\n}\n\n// Declare global properties for TypeScript\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties {\n $themeService: ReturnType<typeof useThemeService>\n $theme: ReturnType<typeof useThemeService>\n }\n} ","import type { DirectiveBinding } from \"vue\";\n\n// Optional dependency - handle gracefully if not installed\nlet DOMPurify: any = null;\n\n// Load DOMPurify asynchronously\nconst loadDOMPurify = async () => {\n try {\n const dompurifyModule = await import('dompurify');\n DOMPurify = dompurifyModule.default;\n } catch {\n // DOMPurify not available - will use basic sanitization\n }\n};\n\n// Load on module initialization\nloadDOMPurify();\n\nconst SAFE_TAGS = [\n \"a\",\n \"abbr\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"div\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"i\",\n \"img\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"th\",\n \"thead\",\n \"tr\",\n \"u\",\n \"ul\",\n];\n\nconst SAFE_ATTRS = [\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"width\",\n \"height\",\n \"align\",\n \"class\",\n \"id\",\n \"colspan\",\n \"rowspan\",\n];\n\n// Basic sanitization fallback\nconst basicSanitize = (html: string): string => {\n return html\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n .replace(/<iframe\\b[^<]*(?:(?!<\\/iframe>)<[^<]*)*<\\/iframe>/gi, '')\n .replace(/on\\w+=\"[^\"]*\"/gi, '')\n .replace(/javascript:/gi, '');\n};\n\nconst sanitizeContent = (content: string): string => {\n if (!DOMPurify) {\n return basicSanitize(content);\n }\n \n try {\n return DOMPurify.sanitize(content, {\n ALLOWED_TAGS: SAFE_TAGS,\n ALLOWED_ATTR: SAFE_ATTRS,\n USE_PROFILES: { html: true },\n });\n } catch {\n return basicSanitize(content);\n }\n};\n\nexport const vFrSanitize = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n el.innerHTML = sanitizeContent(binding.value || \"\");\n },\n updated(el: HTMLElement, binding: DirectiveBinding) {\n el.innerHTML = sanitizeContent(binding.value || \"\");\n },\n};\n","// plugin.ts\nimport type { App } from 'vue';\nimport IconStyleDirective from './plugins/icon-style';\nimport { themeServicePlugin } from './plugins/theme-service.global';\nimport { vFrSanitize } from './directives/frSanitize';\n\nconst FreddyPlugin = {\n install(app: App) {\n // ✅ Register theme service plugin\n themeServicePlugin.install(app);\n\n // ✅ Register directives\n app.directive('icon-style', IconStyleDirective);\n app.directive('fr-sanitize', vFrSanitize);\n\n // ✅ Auto-register icon components\n const components = import.meta.glob('./icons/**/*.vue', {\n eager: true,\n });\n\n for (const path in components) {\n const component: any = components[path];\n const name =\n component.default.name || path.split('/').pop()?.replace('.vue', '')!;\n app.component(name, component.default);\n }\n },\n};\n\nexport default FreddyPlugin;\n","// src/plugins/index.ts\nimport type { App } from \"vue\";\nimport { vFrSanitize } from \"../directives/frSanitize\";\nimport IconStyleDirective from \"./icon-style\";\n\n// Plugin that installs fr-sanitize directive\nexport const frSanitizePlugin = {\n install(app: App) {\n app.directive(\"fr-sanitize\", vFrSanitize);\n },\n};\n\n// Plugin that installs icon-style directive\nexport const iconStylePlugin = {\n install(app: App) {\n app.directive(\"icon-style\", IconStyleDirective);\n },\n};\n\n// Combined plugin that installs both directives\nexport default {\n install(app: App) {\n frSanitizePlugin.install(app);\n iconStylePlugin.install(app);\n },\n};\n","<template>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 800 600\"\n class=\"spaceman-logo\"\n :class=\"customClass\"\n :style=\"customStyle\"\n >\n <g>\n <defs>\n <clipPath id=\"GlassClip\">\n <path\n d=\"M380.857,346.164c-1.247,4.651-4.668,8.421-9.196,10.06c-9.332,3.377-26.2,7.817-42.301,3.5\n s-28.485-16.599-34.877-24.192c-3.101-3.684-4.177-8.66-2.93-13.311l7.453-27.798c0.756-2.82,3.181-4.868,6.088-5.13\n c6.755-0.61,20.546-0.608,41.785,5.087s33.181,12.591,38.725,16.498c2.387,1.682,3.461,4.668,2.705,7.488L380.857,346.164z\"\n />\n </clipPath>\n <clipPath id=\"cordClip\">\n <rect width=\"800\" height=\"600\" />\n </clipPath>\n </defs>\n\n <g id=\"planet\">\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"572.859\"\n cy=\"108.803\"\n r=\"90.788\"\n />\n\n <circle\n id=\"craterBig\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"548.891\"\n cy=\"62.319\"\n r=\"13.074\"\n />\n\n <circle\n id=\"craterSmall\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"591.743\"\n cy=\"158.918\"\n r=\"7.989\"\n />\n <path\n id=\"ring\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M476.562,101.461c-30.404,2.164-49.691,4.221-49.691,8.007c0,6.853,63.166,12.408,141.085,12.408s141.085-5.555,141.085-12.408\n c0-3.378-15.347-4.988-40.243-7.225\"\n />\n\n <path\n id=\"ringShadow\"\n opacity=\"0.5\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M483.985,127.43c23.462,1.531,52.515,2.436,83.972,2.436c36.069,0,68.978-1.19,93.922-3.149\"\n />\n </g>\n <g id=\"stars\">\n <g id=\"starsBig\">\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"518.07\"\n y1=\"245.375\"\n x2=\"518.07\"\n y2=\"266.581\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"508.129\"\n y1=\"255.978\"\n x2=\"528.01\"\n y2=\"255.978\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"154.55\"\n y1=\"231.391\"\n x2=\"154.55\"\n y2=\"252.598\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"144.609\"\n y1=\"241.995\"\n x2=\"164.49\"\n y2=\"241.995\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"320.135\"\n y1=\"132.746\"\n x2=\"320.135\"\n y2=\"153.952\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"310.194\"\n y1=\"143.349\"\n x2=\"330.075\"\n y2=\"143.349\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"200.67\"\n y1=\"483.11\"\n x2=\"200.67\"\n y2=\"504.316\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"210.611\"\n y1=\"493.713\"\n x2=\"190.73\"\n y2=\"493.713\"\n />\n </g>\n </g>\n <g id=\"starsSmall\">\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"432.173\"\n y1=\"380.52\"\n x2=\"432.173\"\n y2=\"391.83\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"426.871\"\n y1=\"386.175\"\n x2=\"437.474\"\n y2=\"386.175\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"489.555\"\n y1=\"299.765\"\n x2=\"489.555\"\n y2=\"308.124\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"485.636\"\n y1=\"303.945\"\n x2=\"493.473\"\n y2=\"303.945\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"231.468\"\n y1=\"291.009\"\n x2=\"231.468\"\n y2=\"299.369\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"227.55\"\n y1=\"295.189\"\n x2=\"235.387\"\n y2=\"295.189\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"244.032\"\n y1=\"547.539\"\n x2=\"244.032\"\n y2=\"555.898\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"247.95\"\n y1=\"551.719\"\n x2=\"240.113\"\n y2=\"551.719\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"186.359\"\n y1=\"406.967\"\n x2=\"186.359\"\n y2=\"415.326\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"190.277\"\n y1=\"411.146\"\n x2=\"182.44\"\n y2=\"411.146\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"480.296\"\n y1=\"406.967\"\n x2=\"480.296\"\n y2=\"415.326\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"484.215\"\n y1=\"411.146\"\n x2=\"476.378\"\n y2=\"411.146\"\n />\n </g>\n </g>\n <g id=\"circlesBig\">\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"588.977\"\n cy=\"255.978\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"450.066\"\n cy=\"320.259\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"168.303\"\n cy=\"353.753\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"429.522\"\n cy=\"201.185\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"200.67\"\n cy=\"176.313\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"133.343\"\n cy=\"477.014\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"283.521\"\n cy=\"568.033\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"413.618\"\n cy=\"482.387\"\n r=\"7.952\"\n />\n </g>\n <g id=\"circlesSmall\">\n <circle fill=\"#ffffff\" cx=\"549.879\" cy=\"296.402\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"253.29\" cy=\"229.24\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"434.824\" cy=\"263.931\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"183.708\" cy=\"544.176\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"382.515\" cy=\"530.923\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"130.693\" cy=\"305.608\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"480.296\" cy=\"477.014\" r=\"2.651\" />\n </g>\n </g>\n <g id=\"spaceman\" clip-path=\"url(cordClip)\">\n <path\n id=\"cord\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M273.813,410.969c0,0-54.527,39.501-115.34,38.218c-2.28-0.048-4.926-0.241-7.841-0.548\n c-68.038-7.178-134.288-43.963-167.33-103.87c-0.908-1.646-1.793-3.3-2.654-4.964c-18.395-35.511-37.259-83.385-32.075-118.817\"\n />\n\n <path\n id=\"backpack\"\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M338.164,454.689l-64.726-17.353c-11.086-2.972-17.664-14.369-14.692-25.455l15.694-58.537\n c3.889-14.504,18.799-23.11,33.303-19.221l52.349,14.035c14.504,3.889,23.11,18.799,19.221,33.303l-15.694,58.537\n C360.647,451.083,349.251,457.661,338.164,454.689z\"\n />\n <g id=\"antenna\">\n <line\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"323.396\"\n y1=\"236.625\"\n x2=\"295.285\"\n y2=\"353.753\"\n />\n <circle\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"323.666\"\n cy=\"235.617\"\n r=\"6.375\"\n />\n </g>\n <g id=\"armR\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M360.633,363.039c1.352,1.061,4.91,5.056,5.824,6.634l27.874,47.634c3.855,6.649,1.59,15.164-5.059,19.02l0,0\n c-6.649,3.855-15.164,1.59-19.02-5.059l-5.603-9.663\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M388.762,434.677c5.234-3.039,7.731-8.966,6.678-14.594c2.344,1.343,4.383,3.289,5.837,5.793\n c4.411,7.596,1.829,17.33-5.767,21.741c-7.596,4.411-17.33,1.829-21.741-5.767c-1.754-3.021-2.817-5.818-2.484-9.046\n C375.625,437.355,383.087,437.973,388.762,434.677z\"\n />\n </g>\n <g id=\"armL\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M301.301,347.66c-1.702,0.242-5.91,1.627-7.492,2.536l-47.965,27.301c-6.664,3.829-8.963,12.335-5.134,18.999h0\n c3.829,6.664,12.335,8.963,18.999,5.134l9.685-5.564\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M241.978,395.324c-3.012-5.25-2.209-11.631,1.518-15.977c-2.701-0.009-5.44,0.656-7.952,2.096\n c-7.619,4.371-10.253,14.09-5.883,21.71c4.371,7.619,14.09,10.253,21.709,5.883c3.03-1.738,5.35-3.628,6.676-6.59\n C252.013,404.214,245.243,401.017,241.978,395.324z\"\n />\n </g>\n <g id=\"body\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M353.351,365.387c-7.948,1.263-16.249,0.929-24.48-1.278c-8.232-2.207-15.586-6.07-21.836-11.14\n c-17.004,4.207-31.269,17.289-36.128,35.411l-1.374,5.123c-7.112,26.525,8.617,53.791,35.13,60.899l0,0\n c26.513,7.108,53.771-8.632,60.883-35.158l1.374-5.123C371.778,395.999,365.971,377.536,353.351,365.387z\"\n />\n <path\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M269.678,394.912L269.678,394.912c26.3,20.643,59.654,29.585,93.106,25.724l2.419-0.114\"\n />\n </g>\n <g id=\"legs\">\n <g id=\"legR\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M312.957,456.734l-14.315,53.395c-1.896,7.07,2.299,14.338,9.37,16.234l0,0c7.07,1.896,14.338-2.299,16.234-9.37l17.838-66.534\n C333.451,455.886,323.526,457.387,312.957,456.734z\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"304.883\"\n y1=\"486.849\"\n x2=\"330.487\"\n y2=\"493.713\"\n />\n </g>\n <g id=\"legL\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M296.315,452.273L282,505.667c-1.896,7.07-9.164,11.265-16.234,9.37l0,0c-7.07-1.896-11.265-9.164-9.37-16.234l17.838-66.534\n C278.993,441.286,286.836,447.55,296.315,452.273z\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"262.638\"\n y1=\"475.522\"\n x2=\"288.241\"\n y2=\"482.387\"\n />\n </g>\n </g>\n <g id=\"head\">\n <ellipse\n transform=\"matrix(0.259 -0.9659 0.9659 0.259 -51.5445 563.2371)\"\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"341.295\"\n cy=\"315.211\"\n rx=\"61.961\"\n ry=\"60.305\"\n />\n <path\n id=\"headStripe\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M330.868,261.338c-7.929,1.72-15.381,5.246-21.799,10.246\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M380.857,346.164c-1.247,4.651-4.668,8.421-9.196,10.06c-9.332,3.377-26.2,7.817-42.301,3.5s-28.485-16.599-34.877-24.192\n c-3.101-3.684-4.177-8.66-2.93-13.311l7.453-27.798c0.756-2.82,3.181-4.868,6.088-5.13c6.755-0.61,20.546-0.608,41.785,5.087\n s33.181,12.591,38.725,16.498c2.387,1.682,3.461,4.668,2.705,7.488L380.857,346.164z\"\n />\n <g clip-path=\"url(#GlassClip)\">\n <polygon\n id=\"glassShine\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n points=\"\n 278.436,375.599 383.003,264.076 364.393,251.618 264.807,364.928 \t\t\t\t\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface SpacemanLogoProps {\n /** Custom CSS class to apply to the component */\n customClass?: string;\n /** Custom inline styles to apply */\n customStyle?: string | Record<string, string>;\n}\n\ndefineProps<SpacemanLogoProps>();\n</script>\n\n<style>\n/* Spaceman animations */\n@keyframes float {\n 0%,\n 100% {\n transform: translateY(0px);\n }\n 50% {\n transform: translateY(-10px);\n }\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.spaceman-logo {\n animation: float 3s ease-in-out infinite;\n}\n\n.spaceman-logo #planet {\n animation: rotate 20s linear infinite;\n}\n\n.spaceman-logo #stars {\n animation: float 4s ease-in-out infinite reverse;\n}\n</style>\n","<template>\n <Transition name=\"modal\">\n <div\n v-if=\"isVisible\"\n class=\"fixed z-[9998] top-0 left-0 w-full h-full bg-modalBackgroundBlur flex justify-center items-center\"\n >\n <div class=\"flex justify-center items-center\">\n <div\n :class=\"{\n 'p-8 bg-background rounded-[2.5rem] overflow-hidden text-white 2xl:w-[56.25rem] xl:w-[56.25rem] lg:w-[56.25rem] md:w-[45.625rem] sm:w-[31.25rem] xs:w-auto':\n largeModel,\n }\"\n >\n <div class=\"modal-header\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"modal-body\">\n <slot name=\"body\" />\n </div>\n\n <div class=\"modal-footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n isVisible: boolean;\n largeModel: boolean;\n}>();\n</script>\n","<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport { ref } from \"vue\";\n\ninterface TooltipProps {\n /** The text content to display in the tooltip */\n text?: string;\n /** The placement of the tooltip relative to the trigger element */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Whether to render the text as HTML */\n html?: boolean;\n /** Custom CSS class to apply to the tooltip content */\n contentClass?: string;\n}\n\ndefineProps<TooltipProps>();\n\nconst show = ref(false);\nconst shouldShowBelow = ref(false);\nconst tooltipWrapper = ref<HTMLElement | null>(null);\nlet showTimeout: ReturnType<typeof setTimeout> | null = null;\n\nfunction open() {\n if (showTimeout) clearTimeout(showTimeout);\n showTimeout = setTimeout(() => {\n // Check if there's enough space above the element\n if (tooltipWrapper.value) {\n const rect = tooltipWrapper.value.getBoundingClientRect();\n shouldShowBelow.value = rect.top < 150; // If less than 150px from top, show below\n }\n show.value = true;\n }, 200); // 200ms delay for better responsiveness\n}\nfunction close() {\n if (showTimeout) clearTimeout(showTimeout);\n show.value = false;\n}\n</script>\n\n<template>\n <div\n ref=\"tooltipWrapper\"\n class=\"tooltip-wrapper\"\n @mouseenter=\"open\"\n @mouseleave=\"close\"\n @focusin=\"open\"\n @focusout=\"close\"\n tabindex=\"0\"\n >\n <slot />\n <transition name=\"fade\">\n <div\n v-if=\"show\"\n class=\"tooltip-content\"\n :class=\"[\n placement,\n shouldShowBelow ? 'force-bottom' : '',\n contentClass,\n ]\"\n >\n <slot name=\"content\">\n <span v-if=\"html\" v-html=\"text\"></span>\n <span v-else>{{ text }}</span>\n </slot>\n </div>\n </transition>\n </div>\n</template>\n\n<style>\n.tooltip-wrapper {\n display: inline-block;\n position: relative;\n}\n.tooltip-content {\n position: absolute;\n z-index: 1000;\n background: #212529;\n color: #ffffff;\n font-size: 13px;\n padding: 8px 12px;\n border-radius: 6px;\n white-space: normal;\n max-width: 300px;\n pointer-events: none;\n opacity: 0.95;\n box-shadow: 0 4px 12px var(--freddy-border-color);\n left: 50%;\n transform: translateX(-50%);\n bottom: 120%;\n line-height: 1.4;\n /* Ensure tooltip is always visible */\n min-width: 200px;\n /* Ensure tooltip doesn't get clipped */\n word-wrap: break-word;\n word-break: break-word;\n}\n.tooltip-content.bottom {\n top: 120%;\n bottom: auto;\n}\n.tooltip-content.left {\n left: auto;\n right: 120%;\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n}\n.tooltip-content.right {\n left: 120%;\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n}\n\n.tooltip-content.force-bottom {\n top: 120%;\n bottom: auto;\n}\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s;\n}\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","<template>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <button\n :class=\"buttonClasses\"\n :disabled=\"disabled || loading\"\n :aria-disabled=\"disabled || loading\"\n :aria-label=\"iconOnly ? label : undefined\"\n role=\"button\"\n @click=\"handleClick\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Loading state with spinner and optional text -->\n <template v-if=\"loading\">\n <span class=\"freddy-plugins-button-spinner\" aria-hidden=\"true\"></span>\n <span v-if=\"loadingText || label\" class=\"freddy-plugins-button-label\">\n {{ loadingText || label }}\n </span>\n </template>\n\n <!-- Icon only mode -->\n <template v-else-if=\"iconOnly\">\n <component\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-center\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n />\n </template>\n\n <!-- Normal mode: Left Icon, Label, Right Icon -->\n <template v-else>\n <component\n v-if=\"leftIcon\"\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-left\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleLeftIconClick\"\n />\n\n <span v-if=\"label\" class=\"freddy-plugins-button-label\">\n {{ label }}\n </span>\n\n <component\n v-if=\"rightIcon\"\n :is=\"RightIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-right\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleRightIconClick\"\n />\n </template>\n </button>\n </Tooltip>\n\n <button\n v-else\n :class=\"buttonClasses\"\n :disabled=\"disabled || loading\"\n :aria-disabled=\"disabled || loading\"\n :aria-label=\"iconOnly ? label : undefined\"\n role=\"button\"\n @click=\"handleClick\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Loading state with spinner and optional text -->\n <template v-if=\"loading\">\n <span class=\"freddy-plugins-button-spinner\" aria-hidden=\"true\"></span>\n <span v-if=\"loadingText || label\" class=\"freddy-plugins-button-label\">\n {{ loadingText || label }}\n </span>\n </template>\n\n <!-- Icon only mode -->\n <template v-else-if=\"iconOnly\">\n <component\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-center\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n />\n </template>\n\n <!-- Normal mode: Left Icon, Label, Right Icon -->\n <template v-else>\n <component\n v-if=\"leftIcon\"\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-left\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleLeftIconClick\"\n />\n\n <span v-if=\"label\" class=\"freddy-plugins-button-label\">\n {{ label }}\n </span>\n\n <component\n v-if=\"rightIcon\"\n :is=\"RightIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-right\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleRightIconClick\"\n />\n </template>\n </button>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, defineAsyncComponent } from 'vue';\n import type {\n BaseButtonProps,\n BaseButtonEmits,\n } from '@/interfaces/base-button.interfaces';\n import Tooltip from '../Tooltip.vue';\n\n const props = withDefaults(defineProps<BaseButtonProps>(), {\n size: 'md',\n hierarchy: 'primary',\n state: 'default',\n errorState: false,\n iconOnly: false,\n leftIcon: undefined,\n rightIcon: undefined,\n label: 'Button',\n loadingText: undefined,\n disabled: false,\n loading: false,\n tooltip: undefined,\n tooltipPlacement: 'top',\n });\n\n // Icon component mapping - only include icons that actually exist\n const iconComponents: Record<string, any> = {\n IconSearch: defineAsyncComponent(() => import('@/icons/IconSearch.vue')),\n IconUser: defineAsyncComponent(() => import('@/icons/IconUser.vue')),\n IconDelete: defineAsyncComponent(() => import('@/icons/IconDelete.vue')),\n IconSend: defineAsyncComponent(() => import('@/icons/IconSend.vue')),\n IconPlus: defineAsyncComponent(() => import('@/icons/IconPlus.vue')),\n IconEdit: defineAsyncComponent(() => import('@/icons/IconEdit.vue')),\n IconCross: defineAsyncComponent(() => import('@/icons/IconCross.vue')),\n IconTick: defineAsyncComponent(() => import('@/icons/IconTick.vue')),\n IconArrowLeft: defineAsyncComponent(\n () => import('@/icons/IconArrowLeft.vue')\n ),\n IconArrowDown: defineAsyncComponent(\n () => import('@/icons/IconArrowDown.vue')\n ),\n IconArrowUp: defineAsyncComponent(() => import('@/icons/IconArrowUp.vue')),\n IconChevronDown: defineAsyncComponent(\n () => import('@/icons/IconChevronDown.vue')\n ),\n IconChevronUp: defineAsyncComponent(\n () => import('@/icons/IconChevronUp.vue')\n ),\n IconChevronLeft: defineAsyncComponent(\n () => import('@/icons/IconChevronLeft.vue')\n ),\n IconChevronRight: defineAsyncComponent(\n () => import('@/icons/IconChevronRight.vue')\n ),\n IconSettings: defineAsyncComponent(\n () => import('@/icons/IconSettings.vue')\n ),\n IconHome: defineAsyncComponent(() => import('@/icons/IconHome.vue')),\n IconDownload: defineAsyncComponent(\n () => import('@/icons/IconDownload.vue')\n ),\n IconRefresh: defineAsyncComponent(() => import('@/icons/IconRefresh.vue')),\n IconCopy: defineAsyncComponent(() => import('@/icons/IconCopy.vue')),\n IconEye: defineAsyncComponent(() => import('@/icons/IconEye.vue')),\n IconLock: defineAsyncComponent(() => import('@/icons/IconLock.vue')),\n IconStar: defineAsyncComponent(() => import('@/icons/IconStar.vue')),\n IconFilter: defineAsyncComponent(() => import('@/icons/IconFilter.vue')),\n IconFile: defineAsyncComponent(() => import('@/icons/IconFile.vue')),\n IconFolder: defineAsyncComponent(() => import('@/icons/IconFolder.vue')),\n IconText: defineAsyncComponent(() => import('@/icons/IconText.vue')),\n IconLink04: defineAsyncComponent(() => import('@/icons/IconLink04.vue')),\n };\n\n const LeftIconComponent = computed(() => {\n if (!props.leftIcon) return null;\n return iconComponents[props.leftIcon] || null;\n });\n\n const RightIconComponent = computed(() => {\n if (!props.rightIcon) return null;\n return iconComponents[props.rightIcon] || null;\n });\n\n const emit = defineEmits<BaseButtonEmits>();\n\n const isHovered = ref(false);\n\n const buttonClasses = computed(() => [\n 'freddy-plugins-base-button',\n `freddy-plugins-base-button--${props.size}`,\n `freddy-plugins-base-button--${props.hierarchy}`,\n {\n 'freddy-plugins-base-button--disabled': props.disabled,\n 'freddy-plugins-base-button--loading': props.loading,\n 'freddy-plugins-base-button--icon-only': props.iconOnly,\n 'freddy-plugins-base-button--error': props.errorState,\n 'freddy-plugins-base-button--hover':\n isHovered.value && !props.disabled && !props.loading,\n 'freddy-plugins-base-button--focused': props.state === 'focused',\n },\n ]);\n\n const handleClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('click', event);\n }\n };\n\n const handleLeftIconClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('leftIconClick', event);\n }\n };\n\n const handleRightIconClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('rightIconClick', event);\n }\n };\n\n const handleMouseEnter = () => {\n isHovered.value = true;\n };\n\n const handleMouseLeave = () => {\n isHovered.value = false;\n };\n</script>\n\n<style scoped>\n .freddy-plugins-base-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n cursor: pointer;\n transition: all 0.2s ease;\n box-sizing: border-box;\n position: relative;\n outline: none;\n }\n\n /* Size specifications from Figma */\n .freddy-plugins-base-button--s {\n height: 20px;\n min-width: 20px;\n font-size: 14px;\n font-weight: 500;\n gap: 2px;\n border-radius: 4px;\n padding: 2px;\n }\n\n .freddy-plugins-base-button--sm {\n height: 28px;\n min-width: 28px;\n font-size: 14px;\n font-weight: 500;\n gap: 4px;\n border-radius: 8px;\n padding: 4px;\n }\n\n .freddy-plugins-base-button--md {\n height: 40px;\n min-width: 40px;\n font-size: 16px;\n font-weight: 500;\n gap: 4px;\n border-radius: 8px;\n padding: 4px;\n }\n\n .freddy-plugins-base-button--lg {\n height: 48px;\n min-width: 48px;\n font-size: 16px;\n font-weight: 500;\n gap: 8px;\n border-radius: 8px;\n padding: 8px;\n }\n\n .freddy-plugins-base-button--xl {\n height: 52px;\n min-width: 52px;\n font-size: 18px;\n font-weight: 500;\n gap: 10px;\n border-radius: 8px;\n padding: 12px;\n }\n\n /* Hierarchy styles */\n .freddy-plugins-base-button--primary {\n background: var(--color-primary-500, #7ba8ef);\n color: var(--text-inverse);\n border: 2px solid rgba(255, 255, 255, 0.12);\n box-shadow: inset 0px 0px 0px 1px rgba(10, 13, 18, 0.18),\n inset 0px -2px 0px 0px rgba(10, 13, 18, 0.05);\n }\n\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error {\n background: var(--color-destructive-700, #d92d20) !important;\n border-color: rgba(255, 255, 255, 0.12) !important;\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--secondary {\n background: transparent;\n color: var(--color-primary-500, #7ba8ef);\n border: 2px solid var(--color-primary-500, #7ba8ef);\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error {\n background: #000000 !important;\n color: var(--color-destructive-400, #f97066) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--tertiary {\n background: transparent;\n color: var(--text-600, #4b5563);\n border: 1px solid var(--border-200, #e5e7eb);\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error {\n background: #000000 !important;\n color: var(--color-destructive-400, #f97066) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--link {\n background: none;\n color: var(--color-primary-600, #2563eb);\n border: none;\n padding: 0;\n min-width: 0;\n min-height: 0;\n }\n\n .freddy-plugins-base-button--link.freddy-plugins-base-button--error {\n color: var(--color-destructive-500, #ef4444) !important;\n }\n\n /* Hover states */\n .freddy-plugins-base-button--primary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-primary-600, #2563eb);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-base-button--secondary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-primary-50, #eff6ff);\n }\n\n .freddy-plugins-base-button--tertiary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--bg-100, #f3f4f6);\n }\n\n .freddy-plugins-base-button--link:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n text-decoration: underline;\n }\n\n /* Error state hover styles */\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-800, #b91c1c) !important;\n border-color: rgba(255, 255, 255, 0.12) !important;\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-900, #55160c) !important;\n color: var(--color-destructive-300, #fda29b) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-900, #55160c) !important;\n color: var(--color-destructive-300, #fda29b) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n /* Focus states */\n .freddy-plugins-base-button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--text-inverse),\n 0 0 0 4px var(--color-primary-500, #7ba8ef);\n }\n\n .freddy-plugins-base-button--error:focus-visible {\n box-shadow: 0 0 0 2px var(--text-inverse),\n 0 0 0 4px var(--color-destructive-500, #ef4444);\n }\n\n /* Disabled state */\n .freddy-plugins-base-button--disabled {\n opacity: 1;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n background: rgba(42, 57, 71, 0.73) !important;\n color: #55585e !important;\n border-color: #35414b !important;\n }\n\n .freddy-plugins-base-button--disabled:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Loading state */\n .freddy-plugins-base-button--loading {\n cursor: wait;\n }\n\n .freddy-plugins-base-button--loading:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Icon only mode */\n .freddy-plugins-base-button--icon-only {\n justify-content: center;\n align-items: center;\n padding: 0;\n gap: 0;\n aspect-ratio: 1;\n }\n\n /* Icon styles */\n .freddy-plugins-button-icon {\n flex-shrink: 0;\n color: currentColor;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .freddy-plugins-button-icon-left {\n margin-right: 0;\n }\n\n .freddy-plugins-button-icon-right {\n margin-left: 0;\n }\n\n .freddy-plugins-button-icon-center {\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n /* Icon sizes based on button size */\n .freddy-plugins-button-icon--s {\n width: 16px !important;\n height: 16px !important;\n }\n\n .freddy-plugins-button-icon--sm {\n width: 20px !important;\n height: 20px !important;\n }\n\n .freddy-plugins-button-icon--md {\n width: 20px !important;\n height: 20px !important;\n }\n\n .freddy-plugins-button-icon--lg {\n width: 24px !important;\n height: 24px !important;\n }\n\n .freddy-plugins-button-icon--xl {\n width: 24px !important;\n height: 24px !important;\n }\n\n /* Icon color based on button state and hierarchy */\n .freddy-plugins-base-button--primary .freddy-plugins-button-icon {\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--secondary .freddy-plugins-button-icon {\n color: var(--color-primary-500, #7ba8ef) !important;\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-400, #f97066) !important;\n }\n\n .freddy-plugins-base-button--tertiary .freddy-plugins-button-icon {\n color: var(--text-600, #4b5563) !important;\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-400, #f97066) !important;\n }\n\n .freddy-plugins-base-button--link .freddy-plugins-button-icon {\n color: var(--color-primary-600, #2563eb) !important;\n }\n\n .freddy-plugins-base-button--link.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-500, #ef4444) !important;\n }\n\n .freddy-plugins-base-button--disabled .freddy-plugins-button-icon {\n color: var(--text-400, #9ca3af) !important;\n }\n\n .freddy-plugins-button-label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .freddy-plugins-button-spinner {\n display: inline-block;\n width: 1em;\n height: 1em;\n min-width: 16px;\n min-height: 16px;\n border: 2px solid rgba(0, 0, 0, 0.08);\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: freddy-plugins-base-button-spin 1s linear infinite;\n margin-right: 8px;\n vertical-align: middle;\n }\n\n @keyframes freddy-plugins-base-button-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n</style>\n","<template>\n <div :class=\"containerClasses\" :style=\"style\">\n <button\n v-for=\"provider in providers\"\n :key=\"provider\"\n :class=\"getButtonClasses(provider)\"\n :disabled=\"disabled\"\n :aria-label=\"iconOnly ? getProviderLabel(provider) : undefined\"\n role=\"button\"\n @click=\"handleClick(provider, $event)\"\n >\n <component\n :is=\"getProviderIcon(provider)\"\n class=\"freddy-plugins-social-button-icon\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!iconOnly\" class=\"freddy-plugins-social-button-label\">\n {{ getProviderLabel(provider) }}\n </span>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type {\n SocialButtonGroupProps,\n SocialButtonEmits,\n SocialProvider,\n SocialProviderConfig,\n } from '@/interfaces/social-buttons.interfaces';\n import {\n IconGoogle,\n IconFacebook,\n IconApple,\n IconX,\n IconFigma,\n IconDribbble,\n } from '@/icons';\n\n const props = withDefaults(defineProps<SocialButtonGroupProps>(), {\n variant: 'filled',\n size: 'md',\n disabled: false,\n iconOnly: false,\n layout: 'horizontal',\n });\n\n const emit = defineEmits<SocialButtonEmits>();\n\n // Provider configuration mapping\n const providerConfigs: Record<SocialProvider, SocialProviderConfig> = {\n google: {\n icon: IconGoogle,\n label: 'Sign in with Google',\n colors: {\n filled: {\n background: '#ffffff',\n color: '#1f2937',\n border: '#d1d5db',\n },\n outlined: {\n background: '#ffffff',\n color: '#1f2937',\n border: '#10b981',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n facebook: {\n icon: IconFacebook,\n label: 'Sign in with Facebook',\n colors: {\n filled: {\n background: '#1877f2',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#1877f2',\n border: '#1877f2',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n apple: {\n icon: IconApple,\n label: 'Sign in with Apple',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n x: {\n icon: IconX,\n label: 'Sign in with X',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n figma: {\n icon: IconFigma,\n label: 'Sign in with Figma',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n dribbble: {\n icon: IconDribbble,\n label: 'Sign in with Dribbble',\n colors: {\n filled: {\n background: '#ea4c89',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#ea4c89',\n border: '#ea4c89',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n };\n\n const containerClasses = computed(() => [\n 'freddy-plugins-social-buttons',\n `freddy-plugins-social-buttons--${props.layout}`,\n `freddy-plugins-social-buttons--${props.size}`,\n {\n 'freddy-plugins-social-buttons--disabled': props.disabled,\n },\n props.class,\n ]);\n\n const getProviderIcon = (provider: SocialProvider) => {\n return providerConfigs[provider].icon;\n };\n\n const getProviderLabel = (provider: SocialProvider) => {\n return providerConfigs[provider].label;\n };\n\n const getButtonClasses = (provider: SocialProvider) => {\n return [\n 'freddy-plugins-social-button',\n `freddy-plugins-social-button--${props.variant}`,\n `freddy-plugins-social-button--${props.size}`,\n `freddy-plugins-social-button--${provider}`,\n {\n 'freddy-plugins-social-button--disabled': props.disabled,\n 'freddy-plugins-social-button--icon-only': props.iconOnly,\n },\n ];\n };\n\n const handleClick = (provider: SocialProvider, event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', provider, event);\n }\n };\n</script>\n\n<style scoped>\n .freddy-plugins-social-buttons {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .freddy-plugins-social-buttons--vertical {\n flex-direction: column;\n align-items: stretch;\n }\n\n .freddy-plugins-social-buttons--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .freddy-plugins-social-buttons--sm {\n gap: 8px;\n }\n\n .freddy-plugins-social-buttons--md {\n gap: 12px;\n }\n\n .freddy-plugins-social-buttons--lg {\n gap: 16px;\n }\n\n .freddy-plugins-social-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n box-sizing: border-box;\n position: relative;\n outline: none;\n text-decoration: none;\n white-space: nowrap;\n }\n\n /* Size styles */\n .freddy-plugins-social-button--sm {\n height: 32px;\n min-width: 32px;\n font-size: 14px;\n padding: 6px 12px;\n border-radius: 6px;\n gap: 6px;\n }\n\n .freddy-plugins-social-button--md {\n height: 40px;\n min-width: 40px;\n font-size: 16px;\n padding: 8px 16px;\n border-radius: 8px;\n gap: 8px;\n }\n\n .freddy-plugins-social-button--lg {\n height: 48px;\n min-width: 48px;\n font-size: 18px;\n padding: 12px 20px;\n border-radius: 8px;\n gap: 10px;\n }\n\n /* Icon only styles */\n .freddy-plugins-social-button--icon-only {\n aspect-ratio: 1;\n padding: 0;\n min-width: auto;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--sm {\n width: 32px;\n height: 32px;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--md {\n width: 40px;\n height: 40px;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--lg {\n width: 48px;\n height: 48px;\n }\n\n /* Provider-specific filled styles */\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--google {\n background: #ffffff;\n color: #1f2937;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--facebook {\n background: #1877f2;\n color: #ffffff;\n border-color: #1877f2;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--apple {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--x {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--figma {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--dribbble {\n background: #ea4c89;\n color: #ffffff;\n border-color: #ea4c89;\n }\n\n /* Provider-specific outlined styles */\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--google {\n background: #ffffff;\n color: #1f2937;\n border-color: #10b981;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--facebook {\n background: #ffffff;\n color: #1877f2;\n border-color: #1877f2;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--apple {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--x {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--figma {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--dribbble {\n background: #ffffff;\n color: #ea4c89;\n border-color: #ea4c89;\n }\n\n /* Provider-specific ghost styles */\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--google {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--facebook {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--apple {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--x {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--figma {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--dribbble {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n /* Hover states */\n .freddy-plugins-social-button:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--google:hover:not(\n .social-button--disabled\n ) {\n background: #f9fafb;\n border-color: #9ca3af;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--facebook:hover:not(\n .social-button--disabled\n ) {\n background: #166fe5;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--apple:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--x:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--figma:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--dribbble:hover:not(\n .social-button--disabled\n ) {\n background: #e91e63;\n }\n\n .freddy-plugins-social-button--outlined:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n background: #f9fafb;\n }\n\n .freddy-plugins-social-button--ghost:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n background: #f9fafb;\n color: #6b7280;\n }\n\n /* Focus states */\n .freddy-plugins-social-button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #3b82f6;\n }\n\n /* Disabled state */\n .freddy-plugins-social-button--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n }\n\n .freddy-plugins-social-button--disabled:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Icon styles */\n .freddy-plugins-social-button-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: currentColor;\n }\n\n /* Icon sizes based on button size */\n .freddy-plugins-social-button--sm .freddy-plugins-social-button-icon {\n width: 16px;\n height: 16px;\n }\n\n .freddy-plugins-social-button--md .freddy-plugins-social-button-icon {\n width: 20px;\n height: 20px;\n }\n\n .freddy-plugins-social-button--lg .freddy-plugins-social-button-icon {\n width: 24px;\n height: 24px;\n }\n\n .freddy-plugins-social-button-label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n /* Responsive behavior */\n @media (max-width: 640px) {\n .freddy-plugins-social-buttons--horizontal {\n flex-direction: column;\n align-items: stretch;\n }\n }\n</style>\n","<template>\n <pre><code v-html=\"highlighted\"></code></pre>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from \"vue\";\n\nconst props = defineProps<{\n code: string;\n language: string;\n}>();\n\nconst theme = \"nord\";\nconst highlighted = ref(\"\");\nlet highlighter: any = null;\nlet createHighlighter: any = null;\n\n// Load shiki dependency asynchronously\nconst loadShiki = async () => {\n try {\n // Check if shiki is available globally first\n if (typeof window !== \"undefined\" && (window as any).shiki) {\n createHighlighter = (window as any).shiki.createHighlighter;\n return;\n }\n\n // For web components, shiki should be provided externally\n // Don't use dynamic import as it causes bundling issues\n console.warn(\"Shiki not available - using plain text fallback\");\n } catch {\n // shiki not available - will use plain text fallback\n }\n};\n\nconst supportedLangs = [\n \"js\",\n \"ts\",\n \"json\",\n \"python\",\n \"vue\",\n \"html\",\n \"css\",\n \"scss\",\n \"bash\",\n \"yaml\",\n \"markdown\",\n \"c\",\n \"cpp\",\n \"java\",\n \"go\",\n \"php\",\n \"ruby\",\n \"rust\",\n \"swift\",\n \"kotlin\",\n];\n\nconst highlightCode = async () => {\n // Ensure shiki is loaded\n if (!createHighlighter) {\n await loadShiki();\n }\n\n // If shiki is still not available, use plain text\n if (!createHighlighter) {\n highlighted.value = `<pre><code>${props.code\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")}</code></pre>`;\n return;\n }\n\n try {\n if (!highlighter) {\n highlighter = await createHighlighter({\n themes: [theme],\n langs: supportedLangs,\n });\n }\n highlighted.value = highlighter.codeToHtml(props.code, {\n lang: props.language,\n theme,\n });\n } catch (e) {\n // fallback: plain text\n highlighted.value = `<pre><code>${props.code\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")}</code></pre>`;\n }\n};\n\nwatch(() => [props.code, props.language], highlightCode, { immediate: true });\nonMounted(highlightCode);\n</script>\n\n<style>\npre,\ncode,\n.shiki {\n background: transparent !important;\n}\npre {\n font-family: \"Fira Mono\", \"Menlo\", \"Monaco\", \"Consolas\", \"Liberation Mono\",\n \"Courier New\", monospace;\n font-size: 14px;\n line-height: 1.6;\n padding: 16px;\n border-radius: 8px;\n overflow-x: auto;\n}\n</style>\n","<template>\n <label\n class=\"freddy-plugins-base-checkbox\"\n :class=\"{\n 'freddy-plugins-checked': isChecked && !blueCheckbox,\n 'freddy-plugins-checked-blue': isChecked && blueCheckbox,\n 'freddy-plugins-not-checked': !isChecked,\n 'freddy-plugins-is-disabled': disabled,\n }\"\n :aria-checked=\"isChecked\"\n :aria-disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"checkbox\"\n >\n <input\n id=\"checkbox-input\"\n type=\"checkbox\"\n class=\"freddy-plugins-checkbox-input\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <span v-if=\"isDashInput && isChecked\" class=\"freddy-plugins-checkbox-dash\"></span>\n <svg\n v-else-if=\"isChecked && !isDashInput\"\n class=\"freddy-plugins-checkbox-icon\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n :stroke=\"blueCheckbox ? 'var(--text-50, var(--text-inverse))' : '#000'\"\n stroke-width=\"1.6666\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nconst props = defineProps<{\n isChecked: boolean;\n isDashInput?: boolean;\n blueCheckbox?: boolean;\n disabled?: boolean;\n ariaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:isChecked\", value: boolean): void;\n}>();\n\nfunction onChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (!props.disabled) {\n emit(\"update:isChecked\", target.checked);\n }\n}\n</script>\n\n<style>\n.freddy-plugins-base-checkbox {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 4px;\n border: 2px solid currentColor;\n cursor: pointer;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n user-select: none;\n}\n\n.freddy-plugins-checked {\n background-color: var(--freddy-text-primary);\n border-color: transparent;\n}\n\n.freddy-plugins-checked-blue {\n background-color: #7ba8ef;\n border-color: transparent;\n}\n\n.freddy-plugins-not-checked {\n background-color: transparent;\n border-color: currentColor;\n}\n\n.freddy-plugins-checkbox-input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n\n.freddy-plugins-checkbox-dash {\n width: 8px;\n height: 2px;\n background-color: var(--freddy-text-primary);\n border-radius: 1px;\n}\n\n.freddy-plugins-checkbox-icon {\n width: 16px;\n height: 16px;\n pointer-events: none;\n}\n\n.freddy-plugins-is-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n","<template>\n <div class=\"freddy-plugins-diff-container\">\n <div\n v-if=\"showDiff && diffContent\"\n class=\"freddy-plugins-diff-preview\"\n v-html=\"diffContent\"\n ></div>\n <textarea\n v-else\n ref=\"textareaRef\"\n v-model=\"localContent\"\n class=\"freddy-plugins-diff-textarea\"\n :placeholder=\"placeholder\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch } from 'vue';\n\n interface DiffProps {\n modelValue: string;\n placeholder?: string;\n originalText?: string;\n improvedText?: string;\n showDiff?: boolean;\n }\n\n const props = withDefaults(defineProps<DiffProps>(), {\n placeholder: 'Enter your text...',\n showDiff: false,\n });\n\n const emit = defineEmits<{\n 'update:modelValue': [value: string];\n }>();\n\n const textareaRef = ref<HTMLTextAreaElement | null>(null);\n const localContent = ref(props.modelValue);\n\n // Watch for external changes to modelValue\n watch(\n () => props.modelValue,\n newValue => {\n localContent.value = newValue;\n }\n );\n\n const handleInput = () => {\n emit('update:modelValue', localContent.value);\n };\n\n // Generate diff HTML with red/green highlighting\n const diffContent = computed(() => {\n if (!props.originalText || !props.improvedText) return '';\n\n // Simple diff algorithm - split by words for better granularity\n const originalWords = props.originalText.split(/(\\s+)/);\n const improvedWords = props.improvedText.split(/(\\s+)/);\n\n // For simplicity, we'll show the full diff with additions and removals\n let diffHtml = '';\n\n // Show removed text in red\n const removedText = originalWords\n .filter(word => !improvedWords.includes(word) && word.trim())\n .join(' ');\n\n if (removedText) {\n diffHtml += `<span class=\"freddy-plugins-diff-removed\">${removedText}</span>`;\n }\n\n // Show added text in green\n const addedText = improvedWords\n .filter(word => !originalWords.includes(word) && word.trim())\n .join(' ');\n\n if (addedText) {\n if (diffHtml) diffHtml += '<br>';\n diffHtml += `<span class=\"freddy-plugins-diff-added\">${addedText}</span>`;\n }\n\n // If no significant changes, show the improved text\n if (!diffHtml) {\n diffHtml = `<span class=\"freddy-plugins-diff-improved\">${props.improvedText}</span>`;\n }\n\n return diffHtml;\n });\n\n // Expose methods for parent component\n defineExpose({\n focus: () => textareaRef.value?.focus(),\n blur: () => textareaRef.value?.blur(),\n });\n</script>\n\n<style scoped>\n .freddy-plugins-diff-container {\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n .freddy-plugins-diff-textarea {\n width: 100%;\n min-height: 200px;\n padding: 16px;\n border: 1px solid var(--freddy-border-secondary, #35414b);\n border-radius: 8px;\n background-color: var(--freddy-text-action-button, #031525);\n color: var(--freddy-text-primary, #ffffff);\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n line-height: 24px;\n resize: none;\n outline: none;\n transition: border-color 0.2s ease;\n }\n\n .freddy-plugins-diff-textarea:focus {\n border-color: var(--freddy-border-primary, #cbd6e3);\n }\n\n .freddy-plugins-diff-textarea::placeholder {\n color: var(--freddy-text-secondary, #94979c);\n }\n\n .freddy-plugins-diff-preview {\n width: 100%;\n height: 100%;\n min-height: 200px;\n padding: 16px;\n border: 1px solid var(--freddy-border-secondary, #35414b);\n border-radius: 8px;\n background-color: var(--freddy-bg-secondary, #071a2b);\n color: var(--freddy-text-primary, #ffffff);\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n line-height: 24px;\n overflow-y: auto;\n white-space: pre-wrap;\n }\n\n :deep(.freddy-plugins-diff-removed) {\n background-color: #d92d20;\n color: #ffffff;\n padding: 2px 4px;\n border-radius: 4px;\n margin: 0 2px;\n }\n\n :deep(.freddy-plugins-diff-added) {\n background-color: #067647;\n color: #ffffff;\n padding: 2px 4px;\n border-radius: 4px;\n margin: 0 2px;\n }\n\n :deep(.freddy-plugins-diff-improved) {\n background-color: #68c57c;\n color: #031525;\n padding: 2px 4px;\n border-radius: 4px;\n }\n</style>\n","\n<template>\n <button\n class=\"freddy-plugins-switch\"\n :class=\"{ \n 'freddy-plugins-switch--on': modelValue, \n 'freddy-plugins-switch--disabled': disabled,\n [`freddy-plugins-switch--${size}`]: true\n }\"\n :aria-checked=\"modelValue\"\n role=\"switch\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n :disabled=\"disabled\"\n >\n <span class=\"freddy-plugins-switch__track\"></span>\n <span class=\"freddy-plugins-switch__thumb\"></span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nconst props = defineProps<{\n modelValue: boolean;\n disabled?: boolean;\n size?: 's' | 'sm' | 'md' | 'lg' | 'xl';\n}>();\nconst emit = defineEmits(['update:modelValue']);\nfunction toggle(event: Event) {\n event.stopPropagation();\n if (!props.disabled) {\n emit('update:modelValue', !props.modelValue);\n }\n}\n</script>\n\n<style>\n.freddy-plugins-switch {\n position: relative;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n outline: none;\n display: inline-flex;\n align-items: center;\n transition: opacity 0.2s;\n}\n\n/* Size variants */\n.freddy-plugins-switch--s {\n width: 28px;\n height: 16px;\n}\n\n.freddy-plugins-switch--sm {\n width: 32px;\n height: 18px;\n}\n\n.freddy-plugins-switch--md {\n width: 40px;\n height: 22px;\n}\n\n.freddy-plugins-switch--lg {\n width: 48px;\n height: 26px;\n}\n\n.freddy-plugins-switch--xl {\n width: 56px;\n height: 30px;\n}\n.freddy-plugins-switch--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.freddy-plugins-switch__track {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background: var(--freddy-border-color);\n border-radius: 999px;\n transition: background 0.2s;\n}\n.freddy-plugins-switch--on .freddy-plugins-switch__track {\n background: var(--freddy-primary-color);\n}\n.freddy-plugins-switch__thumb {\n position: absolute;\n background: var(--text-50, var(--text-inverse));\n border-radius: 50%;\n box-shadow: 0 1px 3px var(--freddy-border-color);\n transition: left 0.2s;\n}\n\n/* Size-specific thumb positioning */\n.freddy-plugins-switch--s .freddy-plugins-switch__thumb {\n top: 1px;\n left: 1px;\n width: 14px;\n height: 14px;\n}\n.freddy-plugins-switch--s.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 13px;\n}\n\n.freddy-plugins-switch--sm .freddy-plugins-switch__thumb {\n top: 1px;\n left: 1px;\n width: 16px;\n height: 16px;\n}\n.freddy-plugins-switch--sm.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 15px;\n}\n\n.freddy-plugins-switch--md .freddy-plugins-switch__thumb {\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n}\n.freddy-plugins-switch--md.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 20px;\n}\n\n.freddy-plugins-switch--lg .freddy-plugins-switch__thumb {\n top: 2px;\n left: 2px;\n width: 22px;\n height: 22px;\n}\n.freddy-plugins-switch--lg.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 24px;\n}\n\n.freddy-plugins-switch--xl .freddy-plugins-switch__thumb {\n top: 3px;\n left: 3px;\n width: 24px;\n height: 24px;\n}\n.freddy-plugins-switch--xl.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 29px;\n}\n</style> ","<template>\n <div\n class=\"freddy-plugins-dropdown-wrapper\"\n @keydown.esc=\"closeDropdown\"\n tabindex=\"0\"\n >\n <BaseButton\n class=\"freddy-plugins-dropdown-trigger\"\n :label=\"displayLabel\"\n :iconOnly=\"iconOnly\"\n :rightIcon=\"chevronRight && showIcon ? iconToShow : undefined\"\n :leftIcon=\"!chevronRight && showIcon ? iconToShow : undefined\"\n :size=\"size\"\n hierarchy=\"tertiary\"\n @click=\"toggleDropdown\"\n :aria-expanded=\"open\"\n :aria-haspopup=\"true\"\n type=\"button\"\n >\n <template #default>\n <slot name=\"button\">\n {{ displayLabel }}\n </slot>\n </template>\n </BaseButton>\n <div\n v-if=\"open\"\n class=\"freddy-plugins-dropdown-menu\"\n :class=\"{\n 'freddy-plugins-dropdown-menu--up': openUp,\n 'freddy-plugins-dropdown-menu--down': !openUp,\n }\"\n >\n <div v-if=\"searchable\" class=\"freddy-plugins-dropdown-search-bar\">\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"freddy-plugins-dropdown-search-input\"\n :placeholder=\"searchPlaceholder\"\n />\n </div>\n <ul class=\"freddy-plugins-dropdown-options\">\n <li\n v-for=\"option in filteredOptions\"\n :key=\"option.value\"\n class=\"freddy-plugins-dropdown-option\"\n :class=\"{\n 'freddy-plugins-dropdown-option--toggle': option.type === 'toggle',\n }\"\n @click=\"event => handleOptionClick(option, event)\"\n >\n <span class=\"freddy-plugins-dropdown-option-label\">\n <template v-if=\"!optionIconRight && option.icon\">\n <component\n :is=\"option.icon\"\n class=\"freddy-plugins-dropdown-option-icon\"\n />\n </template>\n <span>{{ option.label }}</span>\n <template v-if=\"showShortcut && option.shortcut\">\n <span class=\"freddy-plugins-dropdown-option-shortcut\">{{\n option.shortcut\n }}</span>\n </template>\n <template v-if=\"optionIconRight && option.icon\">\n <component\n :is=\"option.icon\"\n class=\"freddy-plugins-dropdown-option-icon freddy-plugins-dropdown-option-icon--right\"\n />\n </template>\n </span>\n <template v-if=\"option.type === 'toggle'\">\n <Switch\n :modelValue=\"option.checked ?? false\"\n :size=\"props.size\"\n @update:modelValue=\"\n val => {\n handleToggle(option, val);\n }\n \"\n @click.stop\n />\n </template>\n </li>\n <li\n v-if=\"filteredOptions.length === 0\"\n class=\"freddy-plugins-dropdown-no-options\"\n >\n <slot name=\"no-options\">No options</slot>\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, type Component, shallowRef } from 'vue';\n import IconChevronDown from '@/icons/IconChevronDown.vue';\n import IconChevronUp from '@/icons/IconChevronUp.vue';\n import Switch from '@/components/Switch.vue';\n import BaseButton from './Buttons/BaseButton.vue';\n\n interface Option {\n label: string;\n value: string | number;\n icon?: Component;\n shortcut?: string;\n type?: 'option' | 'toggle';\n checked?: boolean;\n default?: boolean;\n refData?: any;\n }\n\n interface Props {\n label?: string;\n size?: 's' | 'sm' | 'md' | 'lg' | 'xl';\n iconOnly?: boolean;\n options?: Option[];\n searchable?: boolean;\n searchPlaceholder?: string;\n openUp?: boolean;\n chevronRight?: boolean;\n showIcon?: boolean;\n customIcon?: any;\n optionIconRight?: boolean;\n showShortcut?: boolean;\n background?: string;\n borderRadius?: string;\n activeBackground?: string;\n openBackground?: string;\n variant?: 'primary' | 'secondary' | 'blanc';\n stayOpen?: boolean;\n }\n\n export type { Option, Props };\n\n const props = withDefaults(defineProps<Props>(), {\n label: 'Select',\n size: 'sm',\n iconOnly: false,\n options: () => [],\n searchable: false,\n searchPlaceholder: 'Search...',\n openUp: false,\n chevronRight: true,\n showIcon: true,\n customIcon: null,\n optionIconRight: false,\n showShortcut: false,\n background: 'transparent',\n borderRadius: '8px',\n activeBackground: 'var(--freddy-bg-tertiary)',\n openBackground: 'var(--freddy-bg-tertiary)',\n variant: 'primary',\n stayOpen: false,\n });\n\n const emit = defineEmits<{\n (event: 'select', value: Option): void;\n (event: 'toggle', value: Option): void;\n }>();\n\n const open = ref(false);\n const searchQuery = ref('');\n // const isHovered = ref(false);\n\n // Internal selected state\n const selected = ref<Option | null>(null);\n\n // Local shallow copy of options for toggles to avoid deep reactivity\n const localOptions = shallowRef<Option[]>([...props.options]);\n\n watch(\n () => props.options,\n newOptions => {\n localOptions.value = [...newOptions];\n }\n );\n\n // Initialize selected option\n const initializeSelected = () => {\n if (selected.value) return;\n const def = localOptions.value.find((opt: Option) => opt.default);\n if (def) {\n selected.value = def;\n }\n };\n\n watch(\n localOptions,\n () => {\n initializeSelected();\n },\n { immediate: true }\n );\n\n const displayLabel = computed(() => {\n if (props.label !== 'Select') return props.label;\n if (selected.value) return selected.value.label;\n return 'Select';\n });\n\n // const computedBackground = computed(() => {\n // if (props.variant === \"primary\") return \"var(--border-light)\";\n // return props.background;\n // });\n\n // const computedActiveBackground = computed(() => {\n // if (props.variant === \"primary\") return \"#d0d0d0\";\n // return props.activeBackground;\n // });\n\n // const computedOpenBackground = computed(() => {\n // if (props.variant === \"primary\") return \"#d8d8d8\";\n // return props.openBackground;\n // });\n\n // const computedBorderRadius = computed(() => {\n // if (props.variant === \"primary\") return \"8px\";\n // return props.borderRadius;\n // });\n\n const iconToShow = computed(() => {\n if (!props.showIcon) return null;\n if (props.customIcon) return props.customIcon;\n return props.openUp ? IconChevronUp : IconChevronDown;\n });\n\n const toggleDropdown = () => {\n open.value = !open.value;\n if (!open.value) searchQuery.value = '';\n };\n\n const closeDropdown = () => {\n open.value = false;\n searchQuery.value = '';\n };\n\n const filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) return localOptions.value;\n return localOptions.value.filter((option: Option) =>\n option.label.toLowerCase().includes(searchQuery.value.toLowerCase())\n );\n });\n\n const handleOptionClick = (option: Option, event?: Event) => {\n if (event) {\n }\n if (option.type !== 'toggle') {\n selectOption(option);\n } else {\n }\n };\n\n const selectOption = (option: Option) => {\n selected.value = option;\n emit('select', option);\n if (!props.stayOpen) {\n closeDropdown();\n }\n };\n\n const handleToggle = (option: Option, val: boolean) => {\n const idx = localOptions.value.findIndex(\n (o: Option) => o.value === option.value\n );\n if (idx !== -1) localOptions.value[idx].checked = val;\n emit('toggle', { ...option, checked: val });\n };\n\n // Close dropdown on outside click\n const onClickOutside = (event: MouseEvent) => {\n const el = event.target as HTMLElement;\n if (!el.closest('.freddy-plugins-dropdown-wrapper')) {\n closeDropdown();\n }\n };\n\n watch(open, val => {\n if (val) {\n // Use a small delay to ensure the dropdown is rendered\n setTimeout(() => {\n document.addEventListener('click', onClickOutside);\n }, 0);\n } else {\n document.removeEventListener('click', onClickOutside);\n }\n });\n</script>\n\n<style>\n .freddy-plugins-dropdown-wrapper {\n position: relative;\n display: inline-block;\n }\n\n .freddy-plugins-dropdown-chevron {\n width: 16px;\n height: 16px;\n }\n\n .freddy-plugins-dropdown-menu {\n position: absolute;\n left: 0;\n min-width: 200px;\n width: fit-content;\n max-width: 360px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n z-index: 1000;\n padding: 4px 0;\n overflow: visible;\n background: var(--freddy-bg-secondary);\n pointer-events: auto;\n }\n\n .freddy-plugins-dropdown-menu--down {\n top: 100%;\n margin-top: 4px;\n }\n\n .freddy-plugins-dropdown-menu--up {\n bottom: 100%;\n margin-bottom: 4px;\n }\n\n .freddy-plugins-dropdown-search-bar {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n padding: 4px 8px;\n border-bottom: 1px solid var(--freddy-border-secondary);\n }\n\n .freddy-plugins-dropdown-search-input {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n padding: 4px 6px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 4px;\n font-size: 13px;\n background: var(--freddy-bg-primary);\n color: var(--freddy-text-primary);\n }\n\n .freddy-plugins-dropdown-options {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 280px;\n overflow-y: auto;\n }\n\n .freddy-plugins-dropdown-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 14px;\n border-radius: 4px;\n transition: all 0.2s ease;\n background: var(--freddy-bg-secondary) !important;\n pointer-events: auto;\n user-select: none;\n color: var(--freddy-text-primary);\n border: 2px solid transparent;\n }\n\n .freddy-plugins-dropdown-option-label {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1 1 0;\n min-width: 0;\n white-space: normal;\n word-break: break-word;\n }\n\n .freddy-plugins-dropdown-option-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n\n .freddy-plugins-dropdown-option-icon--right {\n margin-left: auto;\n }\n\n .freddy-plugins-dropdown-option-shortcut {\n margin-left: auto;\n font-size: 12px;\n color: var(--freddy-text-tertiary);\n background: var(--freddy-bg-tertiary);\n border-radius: 4px;\n padding: 1px 6px;\n font-family: monospace;\n }\n\n .freddy-plugins-dropdown-option:hover {\n background: var(--freddy-bg-tertiary) !important;\n border-color: var(--freddy-border-secondary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-dropdown-no-options {\n padding: 8px 12px;\n color: var(--freddy-text-tertiary);\n font-size: 13px;\n }\n\n .freddy-plugins-dropdown-toggle-checkbox {\n width: 16px;\n height: 16px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n\n .freddy-plugins-dropdown-toggle-inner {\n width: 12px;\n height: 12px;\n background-color: var(--freddy-bg-primary);\n border-radius: 2px;\n }\n\n .freddy-plugins-checked {\n background-color: var(--freddy-primary-color);\n border-color: var(--freddy-primary-color);\n }\n\n .freddy-plugins-checked .freddy-plugins-dropdown-toggle-inner {\n display: none;\n }\n\n .freddy-plugins-dropdown-option > .freddy-plugins-switch {\n flex-shrink: 0;\n }\n</style>\n","<template>\n <div class=\"email-verification\" :class=\"`email-verification--${brand}`\">\n <div class=\"verification-container\">\n <div class=\"verification-header\">\n <h2 class=\"verification-title\">Verify Your Email</h2>\n <p class=\"verification-subtitle\">\n We've sent a 4-digit verification code to <strong>{{ email }}</strong>\n </p>\n </div>\n\n <form @submit.prevent=\"handleSubmit\" class=\"verification-form\">\n <div class=\"code-input-container\">\n <div class=\"code-inputs\">\n <input\n v-for=\"(_, index) in 4\"\n :key=\"index\"\n :ref=\"(el: any) => inputRefs[index] = el as HTMLInputElement | null\"\n v-model=\"codeDigits[index]\"\n type=\"text\"\n maxlength=\"1\"\n class=\"code-input\"\n :class=\"`code-input--${brand}`\"\n @input=\"handleDigitInput(index, $event)\"\n @keydown=\"handleKeydown(index, $event)\"\n @paste=\"handlePaste\"\n :disabled=\"loading\"\n autocomplete=\"one-time-code\"\n />\n </div>\n </div>\n\n <div class=\"verification-actions\">\n <BaseButton\n type=\"submit\"\n :label=\"loading ? 'Verifying...' : 'Verify Code'\"\n hierarchy=\"primary\"\n size=\"lg\"\n :loading=\"loading\"\n :disabled=\"!isCodeComplete || loading\"\n :class=\"`verify-button verify-button--${brand}`\"\n />\n </div>\n\n <div v-if=\"error\" class=\"error-message\">\n {{ error }}\n </div>\n\n <div class=\"verification-footer\">\n <p class=\"resend-text\">\n Didn't receive the code?\n <button\n type=\"button\"\n class=\"resend-button\"\n :disabled=\"resendCooldown > 0\"\n @click=\"handleResend\"\n >\n {{\n resendCooldown > 0\n ? `Resend in ${resendCooldown}s`\n : 'Resend code'\n }}\n </button>\n </p>\n </div>\n </form>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, onMounted, nextTick } from 'vue';\n import BaseButton from './Buttons/BaseButton.vue';\n\n interface Props {\n email: string;\n brand?: 'contentplate' | 'flowplate' | 'freddy';\n loading?: boolean;\n error?: string;\n resendCooldown?: number;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n brand: 'contentplate',\n loading: false,\n error: '',\n resendCooldown: 0,\n });\n\n // Use props to avoid unused variable warning\n const { brand, loading, error, resendCooldown } = props;\n\n const emit = defineEmits<{\n verify: [code: string];\n resend: [];\n }>();\n\n // Reactive state\n const codeDigits = ref(['', '', '', '']);\n const inputRefs = ref<(HTMLInputElement | null)[]>([]);\n\n // Computed\n const isCodeComplete = computed(() => {\n return codeDigits.value.every(digit => digit !== '');\n });\n\n const verificationCode = computed(() => {\n return codeDigits.value.join('');\n });\n\n // Methods\n const handleDigitInput = (index: number, event: Event) => {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n\n // Only allow digits\n if (!/^\\d*$/.test(value)) {\n target.value = '';\n return;\n }\n\n codeDigits.value[index] = value;\n\n // Move to next input if digit entered\n if (value && index < 3) {\n nextTick(() => {\n inputRefs.value[index + 1]?.focus();\n });\n }\n };\n\n const handleKeydown = (index: number, event: KeyboardEvent) => {\n // Handle backspace\n if (event.key === 'Backspace' && !codeDigits.value[index] && index > 0) {\n nextTick(() => {\n inputRefs.value[index - 1]?.focus();\n });\n }\n };\n\n const handlePaste = (event: ClipboardEvent) => {\n event.preventDefault();\n const pastedData = event.clipboardData?.getData('text');\n if (!pastedData) return;\n\n const digits = pastedData.replace(/\\D/g, '').slice(0, 4).split('');\n codeDigits.value = [...digits, '', '', '', ''].slice(0, 4);\n\n // Focus the next empty input or the last one\n const nextEmptyIndex = codeDigits.value.findIndex(digit => digit === '');\n const focusIndex = nextEmptyIndex === -1 ? 3 : nextEmptyIndex;\n nextTick(() => {\n inputRefs.value[focusIndex]?.focus();\n });\n };\n\n const handleSubmit = () => {\n if (isCodeComplete.value) {\n emit('verify', verificationCode.value);\n }\n };\n\n const handleResend = () => {\n emit('resend');\n };\n\n // Focus first input on mount\n onMounted(() => {\n nextTick(() => {\n inputRefs.value[0]?.focus();\n });\n });\n</script>\n\n<style>\n .email-verification {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 2rem;\n }\n\n .verification-container {\n max-width: 400px;\n width: 100%;\n text-align: center;\n }\n\n .verification-header {\n margin-bottom: 2rem;\n }\n\n .verification-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin-bottom: 0.5rem;\n }\n\n .verification-subtitle {\n color: var(--text-500, var(--freddy-text-secondary));\n font-size: 0.875rem;\n }\n\n .verification-form {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n\n .code-input-container {\n display: flex;\n justify-content: center;\n }\n\n .code-inputs {\n display: flex;\n gap: 0.75rem;\n }\n\n .code-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n font-weight: 600;\n border: 2px solid var(--freddy-border-color);\n border-radius: 0.5rem;\n background: transparent;\n transition: all 0.2s ease;\n }\n\n .code-input:focus {\n outline: none;\n border-color: var(--color-primary-500, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n .code-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Disable browser autofill styling for code inputs */\n .code-input:-webkit-autofill,\n .code-input:-webkit-autofill:hover,\n .code-input:-webkit-autofill:focus,\n .code-input:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: inherit !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n }\n\n .code-input:-moz-autofill,\n .code-input:-moz-autofill:focus {\n background-color: transparent !important;\n color: inherit !important;\n border: none !important;\n box-shadow: none !important;\n }\n\n .code-input:-ms-autofill,\n .code-input:-ms-autofill:focus {\n background-color: transparent !important;\n color: inherit !important;\n border: none !important;\n box-shadow: none !important;\n }\n\n /* Brand-specific styles */\n .code-input--contentplate {\n border-color: var(--color-purple-500, var(--freddy-primary-color));\n }\n\n .code-input--contentplate:focus {\n border-color: var(--color-purple-600, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);\n }\n\n .code-input--flowplate {\n border-color: var(--color-indigo-500, var(--freddy-primary-color));\n background: rgba(99, 102, 241, 0.05);\n }\n\n .code-input--flowplate:focus {\n border-color: var(--color-indigo-600, #4f46e5);\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n }\n\n .code-input--freddy {\n border-color: var(--freddy-primary-color);\n }\n\n .code-input--freddy:focus {\n border-color: var(--color-primary-600, #0099cc);\n box-shadow: 0 0 0 3px rgba(0, 174, 239, 0.1);\n }\n\n .verification-actions {\n display: flex;\n justify-content: center;\n }\n\n .verify-button {\n min-width: 200px;\n }\n\n .error-message {\n color: var(--color-destructive-500, var(--freddy-error-color));\n font-size: 0.875rem;\n margin-top: 0.5rem;\n }\n\n .verification-footer {\n margin-top: 1rem;\n }\n\n .resend-text {\n font-size: 0.875rem;\n color: var(--text-500, var(--freddy-text-secondary));\n }\n\n .resend-button {\n background: none;\n border: none;\n color: var(--color-primary-500, var(--freddy-primary-color));\n cursor: pointer;\n font-size: 0.875rem;\n text-decoration: underline;\n }\n\n .resend-button:hover:not(:disabled) {\n color: var(--color-primary-600, var(--freddy-primary-color));\n }\n\n .resend-button:disabled {\n color: var(--border-300, #9ca3af);\n cursor: not-allowed;\n text-decoration: none;\n }\n\n /* Brand-specific button styles */\n .verify-button--contentplate {\n background: var(--color-purple-500, var(--freddy-primary-color)) !important;\n border-color: var(\n --color-purple-500,\n var(--freddy-primary-color)\n ) !important;\n }\n\n .verify-button--flowplate {\n background: var(--color-indigo-500, var(--freddy-primary-color)) !important;\n border-color: var(\n --color-indigo-500,\n var(--freddy-primary-color)\n ) !important;\n }\n\n .verify-button--freddy {\n background: var(--freddy-primary-color) !important;\n border-color: var(--freddy-primary-color) !important;\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-input-field-wrapper\">\n <!-- Label -->\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"freddy-plugins-input-field-label\"\n :class=\"`freddy-plugins-input-field-label--${colorStyle}`\"\n >\n {{ label }}\n <span v-if=\"required\" class=\"freddy-plugins-required-asterisk\">*</span>\n </label>\n\n <!-- Input Container -->\n <div\n class=\"freddy-plugins-input-field-container\"\n :class=\"containerClasses\"\n @click=\"focusInput\"\n >\n <slot />\n </div>\n\n <!-- Hint Text -->\n <p\n v-if=\"hintText\"\n class=\"freddy-plugins-input-hint-text\"\n :class=\"`freddy-plugins-input-hint-text--${colorStyle}`\"\n >\n {{ hintText }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type { BaseInputProps } from '@/interfaces/input-field.interfaces';\n\n interface Props extends BaseInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n disabled: false,\n });\n\n const emit = defineEmits<{\n focus: [event: FocusEvent];\n blur: [event: FocusEvent];\n }>();\n\n // Generate unique input ID\n const inputId = computed(\n () => `input-${Math.random().toString(36).substr(2, 9)}`\n );\n\n // Container classes\n const containerClasses = computed(() => ({\n [`freddy-plugins-input-field-container--${props.size}`]: true,\n [`freddy-plugins-input-field-container--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field-container--destructive':\n props.destructive || props.state === 'error',\n 'freddy-plugins-input-field-container--focused': props.state === 'focused',\n 'freddy-plugins-input-field-container--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field-container--loading': props.state === 'loading',\n 'freddy-plugins-input-field-container--success': props.state === 'success',\n }));\n\n const focusInput = () => {\n if (props.state !== 'disabled') {\n emit('focus', new FocusEvent('focus'));\n }\n };\n\n defineExpose({\n inputId,\n containerClasses,\n focusInput,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-input-field-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n position: relative;\n }\n\n .freddy-plugins-input-field-label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n }\n\n .freddy-plugins-input-field-label--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-input-field-label--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-required-asterisk {\n color: var(--freddy-fg-error-primary);\n margin-left: 0.125rem;\n }\n\n .freddy-plugins-input-field-container {\n position: relative;\n display: flex;\n align-items: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: text;\n overflow: visible;\n }\n\n /* Freddy color style (dark theme) */\n .freddy-plugins-input-field-container--freddy {\n background-color: #1d2e47;\n border: 2px solid #475569;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n }\n\n .freddy-plugins-input-field-container--freddy:hover:not(.freddy-plugins-input-field-container--disabled) {\n border-color: var(--freddy-text-secondary);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),\n 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--freddy.freddy-plugins-input-field-container--focused {\n background-color: #1d2e47;\n border: 2px solid #7ba8ef;\n box-shadow: 0 0 0 3px rgba(123, 168, 239, 0.1),\n 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--freddy.freddy-plugins-input-field-container--destructive {\n border-color: var(--freddy-fg-error-primary);\n }\n\n /* Contentplate color style (light theme) */\n .freddy-plugins-input-field-container--contentplate {\n background-color: var(--bg-50, var(--freddy-bg-primary));\n border: 2px solid var(--border-200, var(--freddy-border-color));\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n }\n\n .freddy-plugins-input-field-container--contentplate:hover:not(\n .freddy-plugins-input-field-container--disabled\n ) {\n border-color: var(--border-300, #9ca3af);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--contentplate.freddy-plugins-input-field-container--focused {\n border: 2px solid var(--color-primary-500, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1),\n 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--contentplate.freddy-plugins-input-field-container--destructive {\n border-color: var(--freddy-fg-error-primary);\n }\n\n .freddy-plugins-input-field-container--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Size variants */\n .freddy-plugins-input-field-container--sm {\n height: 40px;\n border-radius: 8px;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-input-field-container--md {\n height: 44px;\n border-radius: 12px;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-input-field-container--lg {\n height: 48px;\n border-radius: 16px;\n font-size: 1rem;\n }\n\n /* Success state */\n .freddy-plugins-input-field-container--success {\n border-color: #10b981 !important;\n }\n\n .freddy-plugins-input-field-container--success.freddy-plugins-input-field-container--focused {\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1) !important;\n }\n\n /* Loading state */\n .freddy-plugins-input-field-container--loading {\n position: relative;\n }\n\n .freddy-plugins-input-field-container--loading::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.1),\n transparent\n );\n animation: freddy-plugins-shimmer 1.5s infinite;\n }\n\n @keyframes freddy-plugins-shimmer {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n\n /* Hint text */\n .freddy-plugins-input-hint-text {\n font-size: 0.75rem;\n line-height: 1rem;\n margin: 0;\n }\n\n .freddy-plugins-input-hint-text--freddy {\n color: var(--text-muted);\n }\n\n .freddy-plugins-input-hint-text--contentplate {\n color: var(--freddy-text-secondary);\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Card Type Icon -->\n <div\n v-if=\"showCardIcon && detectedCardType !== 'unknown'\"\n class=\"freddy-plugins-card-type-icon\"\n :class=\"`freddy-plugins-card-type-icon--${colorStyle}`\"\n >\n <img\n :src=\"getCardTypeIcon(detectedCardType)\"\n :alt=\"`${detectedCardType} card`\"\n class=\"freddy-plugins-card-icon-image\"\n />\n </div>\n\n <!-- Card Input -->\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"displayValue\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :maxlength=\"cardNumberMaxLength\"\n class=\"freddy-plugins-input-field freddy-plugins-card-input-field\"\n :class=\"inputClasses\"\n @input=\"handleCardInput\"\n @keydown=\"handleCardKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Trailing Icon -->\n <component\n v-if=\"resolvedTrailingIcon\"\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n @click=\"handleTrailingIconClick\"\n />\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, defineAsyncComponent } from 'vue';\n import BaseInput from './BaseInput.vue';\n import type {\n CardInputProps,\n CardInputEvents,\n CardType,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends CardInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '1234 5678 9012 3456',\n cardNumber: '',\n cardType: 'unknown',\n maskInput: true,\n showCardIcon: true,\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<CardInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const rawValue = ref('');\n const displayValue = ref('');\n const detectedCardType = ref<CardType>('unknown');\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n // Dynamic icon resolution\n const resolveIcon = (iconName: any) => {\n if (!iconName) return null;\n\n if (typeof iconName === 'object') {\n return iconName;\n }\n\n if (typeof iconName === 'string') {\n return defineAsyncComponent(() =>\n import(`@/icons/${iconName}.vue`).catch(() => {\n console.warn(`Icon \"${iconName}\" not found`);\n return { template: '<div></div>' };\n })\n );\n }\n\n return null;\n };\n\n const resolvedTrailingIcon = computed(() => resolveIcon(props.trailingIcon));\n\n // Card number max length based on card type\n const cardNumberMaxLength = computed(() => {\n switch (detectedCardType.value) {\n case 'amex':\n return 17; // 15 digits + 2 spaces\n default:\n return 19; // 16 digits + 3 spaces\n }\n });\n\n const inputClasses = computed(() => ({\n [`freddy-plugins-input-field--${props.size}`]: true,\n [`freddy-plugins-input-field--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field--destructive': props.destructive,\n 'freddy-plugins-input-field--focused': props.state === 'focused',\n 'freddy-plugins-input-field--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field--with-leading':\n props.showCardIcon && detectedCardType.value !== 'unknown',\n 'freddy-plugins-input-field--with-trailing': !!resolvedTrailingIcon.value,\n }));\n\n // Card type detection\n const detectCardType = (number: string): CardType => {\n const cleanNumber = number.replace(/\\D/g, '');\n\n if (/^4/.test(cleanNumber)) {\n return 'visa';\n } else if (/^5[1-5]/.test(cleanNumber) || /^2[2-7]/.test(cleanNumber)) {\n return 'mastercard';\n } else if (/^3[47]/.test(cleanNumber)) {\n return 'amex';\n } else if (/^6/.test(cleanNumber)) {\n return 'discover';\n }\n\n return 'unknown';\n };\n\n // Card number formatting with proper spacing\n const formatCardNumber = (value: string): string => {\n const cleanValue = value.replace(/\\D/g, '');\n const cardType = detectCardType(cleanValue);\n\n if (cardType === 'amex') {\n // American Express: 4-6-5 format (XXXX XXXXXX XXXXX)\n return cleanValue\n .replace(/(\\d{4})(\\d{6})(\\d{5})/, '$1 $2 $3')\n .replace(/(\\d{4})(\\d{1,6})/, '$1 $2')\n .substring(0, 17);\n } else {\n // Visa, Mastercard, Discover: 4-4-4-4 format (XXXX XXXX XXXX XXXX)\n return cleanValue\n .replace(/(\\d{4})(\\d{4})(\\d{4})(\\d{4})/, '$1 $2 $3 $4')\n .replace(/(\\d{4})(\\d{4})(\\d{4})/, '$1 $2 $3')\n .replace(/(\\d{4})(\\d{4})/, '$1 $2')\n .replace(/(\\d{4})/, '$1')\n .substring(0, 19);\n }\n };\n\n // Card type icons\n const getCardTypeIcon = (cardType: CardType): string => {\n const icons = {\n visa: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwNTFBNSIvPgo8cGF0aCBkPSJNMTYuNzUgN0wxNC4yNSAxN0gxMS43NUwxMy41IDEwLjVMMTIuMjUgOC41SDEwLjc1TDEyLjc1IDdIMTYuNzVaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjkuMjUgN0wyNi43NSAxN0gyNC4yNUwyNi43NSA3SDI5LjI1WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+',\n mastercard:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iI0VCMDAxQiIvPgo8Y2lyY2xlIGN4PSIxNSIgY3k9IjEyIiByPSI3IiBmaWxsPSIjRkY1RjAwIi8+CjxjaXJjbGUgY3g9IjI1IiBjeT0iMTIiIHI9IjciIGZpbGw9IiNGRkY1RjAiLz4KPC9zdmc+',\n amex: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwNkZDRiIvPgo8cGF0aCBkPSJNMTAgOEgxNEwxNiAxMkwxOCA4SDIyTDE4IDE2SDE0TDEyIDEyTDEwIDE2SDZMMTAgOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0yNCA4SDMwVjEwSDI2VjEySDI5VjE0SDI2VjE2SDMwVjE4SDI0VjhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=',\n discover:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iI0ZGNjAwMCIvPgo8cGF0aCBkPSJNOCA4SDE2VjE2SDhWOFoiIGZpbGw9IndoaXRlIi8+CjxjaXJjbGUgY3g9IjI4IiBjeT0iMTIiIHI9IjYiIGZpbGw9IndoaXRlIi8+CjwvdXZnPg==',\n unknown: '',\n };\n\n return icons[cardType] || icons.unknown;\n };\n\n // Methods\n const handleCardInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n\n // Store raw value (digits only)\n rawValue.value = inputValue.replace(/\\D/g, '');\n\n // Always format for display with proper spacing\n displayValue.value = formatCardNumber(inputValue);\n\n // Detect card type\n const newCardType = detectCardType(rawValue.value);\n if (newCardType !== detectedCardType.value) {\n detectedCardType.value = newCardType;\n emit('card-type-detected', newCardType);\n }\n\n emit('update:modelValue', displayValue.value);\n emit('update:cardNumber', rawValue.value);\n emit('input', displayValue.value);\n };\n\n const handleCardKeydown = (event: KeyboardEvent) => {\n // Allow backspace, delete, tab, escape, enter\n if (\n [8, 9, 27, 13, 46].indexOf(event.keyCode) !== -1 ||\n // Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\n (event.keyCode === 65 && event.ctrlKey === true) ||\n (event.keyCode === 67 && event.ctrlKey === true) ||\n (event.keyCode === 86 && event.ctrlKey === true) ||\n (event.keyCode === 88 && event.ctrlKey === true) ||\n // Allow home, end, left, right\n (event.keyCode >= 35 && event.keyCode <= 39)\n ) {\n return;\n }\n\n // Only allow numbers\n if (\n (event.shiftKey || event.keyCode < 48 || event.keyCode > 57) &&\n (event.keyCode < 96 || event.keyCode > 105)\n ) {\n event.preventDefault();\n }\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Watch for external card number changes\n watch(\n () => props.cardNumber,\n newValue => {\n if (newValue !== rawValue.value) {\n rawValue.value = newValue;\n displayValue.value = formatCardNumber(newValue);\n detectedCardType.value = detectCardType(newValue);\n }\n },\n { immediate: true }\n );\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-card-type-icon {\n display: flex;\n align-items: center;\n padding: 0 0.75rem;\n margin-right: 8px;\n }\n\n .freddy-plugins-card-type-icon--freddy {\n border-right: 1px solid var(--border-600, #475569);\n }\n\n .freddy-plugins-card-type-icon--contentplate {\n border-right: 1px solid var(--border-200, var(--freddy-border-color));\n }\n\n .freddy-plugins-card-icon-image {\n width: 32px;\n height: 20px;\n object-fit: contain;\n border-radius: 2px;\n }\n\n .freddy-plugins-card-input-field {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n padding: 0 0.75rem;\n height: 100%;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono',\n 'Courier New', monospace;\n letter-spacing: 0.05em;\n }\n\n .freddy-plugins-card-input-field--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-card-input-field--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-card-input-field--freddy::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n }\n\n .freddy-plugins-card-input-field--contentplate::placeholder {\n color: #9ca3af;\n opacity: 0.7;\n }\n\n .freddy-plugins-card-input-field--disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-input-trailing-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-right: 0.75rem;\n margin-left: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-trailing-icon--freddy,\n .freddy-plugins-input-trailing-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-trailing-icon:hover {\n transform: scale(1.1);\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Leading Icon -->\n <component\n v-if=\"resolvedLeadingIcon\"\n :is=\"resolvedLeadingIcon\"\n class=\"freddy-plugins-input-leading-icon\"\n :class=\"`freddy-plugins-input-leading-icon--${colorStyle}`\"\n @click=\"handleLeadingIconClick\"\n />\n\n <!-- Main Input -->\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"inputValue\"\n :type=\"inputType\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n class=\"freddy-plugins-input-field\"\n :class=\"inputClasses\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeydown\"\n />\n\n <!-- Trailing Icon with Tooltip -->\n <Tooltip\n v-if=\"trailingIcon === 'IconQuestion' && tooltipText\"\n :text=\"tooltipText\"\n placement=\"top\"\n >\n <component\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n />\n </Tooltip>\n <component\n v-else-if=\"resolvedTrailingIcon\"\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n @click=\"handleTrailingIconClick\"\n />\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, defineAsyncComponent } from 'vue';\n import BaseInput from './BaseInput.vue';\n import Tooltip from '../Tooltip.vue';\n import type {\n DefaultInputProps,\n DefaultInputEvents,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends DefaultInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '',\n inputType: 'text',\n modelValue: '',\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<DefaultInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const inputValue = ref(props.modelValue || '');\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n // Dynamic icon resolution with lazy loading for better performance\n const resolveIcon = (iconName: any) => {\n if (!iconName) return null;\n\n // If it's already a component, return it\n if (typeof iconName === 'object') {\n return iconName;\n }\n\n // If it's a string, create an async component that dynamically imports the icon\n if (typeof iconName === 'string') {\n return defineAsyncComponent(() =>\n import(`@/icons/${iconName}.vue`).catch(() => {\n console.warn(`Icon \"${iconName}\" not found`);\n return { template: '<div></div>' }; // Return empty component as fallback\n })\n );\n }\n\n return null;\n };\n\n const resolvedLeadingIcon = computed(() => resolveIcon(props.leadingIcon));\n const resolvedTrailingIcon = computed(() => resolveIcon(props.trailingIcon));\n\n const inputClasses = computed(() => ({\n [`freddy-plugins-input-field--${props.size}`]: true,\n [`freddy-plugins-input-field--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field--destructive': props.destructive,\n 'freddy-plugins-input-field--focused': props.state === 'focused',\n 'freddy-plugins-input-field--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field--with-leading': !!resolvedLeadingIcon.value,\n 'freddy-plugins-input-field--with-trailing': !!resolvedTrailingIcon.value,\n }));\n\n // Methods\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n inputValue.value = target.value;\n emit('update:modelValue', target.value);\n emit('input', target.value);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n const handleLeadingIconClick = (event: MouseEvent) => {\n emit('leading-icon-click', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Watch for external value changes\n watch(\n () => props.modelValue,\n newValue => {\n if (newValue !== undefined) {\n inputValue.value = newValue;\n }\n }\n );\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-input-leading-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.75rem;\n margin-right: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-leading-icon--freddy,\n .freddy-plugins-input-leading-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-leading-icon:hover {\n transform: scale(1.1);\n }\n\n .freddy-plugins-input-trailing-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-right: 0.75rem;\n margin-left: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-trailing-icon--freddy,\n .freddy-plugins-input-trailing-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-trailing-icon:hover {\n transform: scale(1.1);\n }\n\n .freddy-plugins-input-field {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n padding: 0 0.75rem;\n height: 100%;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-field--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-input-field--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-input-field--freddy::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n }\n\n .freddy-plugins-input-field--contentplate::placeholder {\n color: #9ca3af;\n opacity: 0.7;\n }\n\n .freddy-plugins-input-field--disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-input-field--with-leading {\n padding-left: 0;\n }\n\n .freddy-plugins-input-field--with-trailing {\n padding-right: 0;\n }\n\n /* Disable browser autofill styling */\n .freddy-plugins-input-field:-webkit-autofill,\n .freddy-plugins-input-field:-webkit-autofill:hover,\n .freddy-plugins-input-field:-webkit-autofill:focus,\n .freddy-plugins-input-field:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: inherit !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Country Code Dropdown -->\n <div\n class=\"freddy-plugins-figma-dropdown\"\n :class=\"`freddy-plugins-figma-dropdown--${colorStyle}`\"\n @click=\"toggleCountryDropdown\"\n >\n <span class=\"freddy-plugins-figma-dropdown-text\">{{ selectedCountry.code }}</span>\n <IconChevronDown class=\"freddy-plugins-figma-dropdown-icon\" />\n </div>\n\n <!-- Country Options Dropdown -->\n <div\n v-if=\"showCountryDropdown\"\n class=\"freddy-plugins-country-options-dropdown\"\n :class=\"`freddy-plugins-country-options-dropdown--${colorStyle}`\"\n >\n <div\n v-for=\"country in countryOptions\"\n :key=\"country.code\"\n class=\"freddy-plugins-country-option\"\n :class=\"`freddy-plugins-country-option--${colorStyle}`\"\n @click=\"selectCountry(country)\"\n >\n <span class=\"freddy-plugins-country-flag\">{{ country.flag }}</span>\n <span class=\"freddy-plugins-country-name\">{{ country.name }}</span>\n <span class=\"freddy-plugins-country-dial-code\">{{ country.dialCode }}</span>\n </div>\n </div>\n\n <!-- Phone Input Section -->\n <div class=\"freddy-plugins-figma-text-input\" :class=\"`freddy-plugins-figma-text-input--${colorStyle}`\">\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"phoneNumberValue\"\n type=\"tel\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n class=\"freddy-plugins-figma-phone-input\"\n @input=\"handlePhoneInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Help Icon -->\n <div v-if=\"trailingIcon === 'IconQuestion'\" class=\"freddy-plugins-figma-help-icon\">\n <Tooltip v-if=\"tooltipText\" :text=\"tooltipText\" placement=\"top\">\n <IconQuestion class=\"freddy-plugins-figma-help-icon-svg\" />\n </Tooltip>\n <IconQuestion v-else class=\"freddy-plugins-figma-help-icon-svg\" />\n </div>\n </div>\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, onMounted, onUnmounted } from 'vue';\n import BaseInput from './BaseInput.vue';\n import Tooltip from '../Tooltip.vue';\n import { IconChevronDown, IconQuestion } from '@/icons/';\n import type {\n PhoneInputProps,\n PhoneInputEvents,\n CountryOption,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends PhoneInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: 'Enter phone number',\n countryCode: 'US',\n phoneNumber: '',\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<PhoneInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const phoneNumberValue = ref(props.phoneNumber || '');\n const showCountryDropdown = ref(false);\n const localCountryCode = ref(props.countryCode || 'US');\n\n // Default country options\n const defaultCountryOptions: CountryOption[] = [\n { code: 'US', name: 'United States', flag: '🇺🇸', dialCode: '+1' },\n { code: 'GB', name: 'United Kingdom', flag: '🇬🇧', dialCode: '+44' },\n { code: 'CA', name: 'Canada', flag: '🇨🇦', dialCode: '+1' },\n { code: 'AU', name: 'Australia', flag: '🇦🇺', dialCode: '+61' },\n { code: 'DE', name: 'Germany', flag: '🇩🇪', dialCode: '+49' },\n { code: 'FR', name: 'France', flag: '🇫🇷', dialCode: '+33' },\n { code: 'IT', name: 'Italy', flag: '🇮🇹', dialCode: '+39' },\n { code: 'ES', name: 'Spain', flag: '🇪🇸', dialCode: '+34' },\n { code: 'JP', name: 'Japan', flag: '🇯🇵', dialCode: '+81' },\n { code: 'IN', name: 'India', flag: '🇮🇳', dialCode: '+91' },\n ];\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n const countryOptions = computed(\n () => props.countryOptions || defaultCountryOptions\n );\n\n const selectedCountry = computed(() => {\n return (\n countryOptions.value.find(\n country => country.code === localCountryCode.value\n ) || countryOptions.value[0]\n );\n });\n\n // Methods\n const toggleCountryDropdown = () => {\n if (!props.disabled) {\n showCountryDropdown.value = !showCountryDropdown.value;\n }\n };\n\n const selectCountry = (country: CountryOption) => {\n localCountryCode.value = country.code;\n emit('update:countryCode', country.code);\n emit('country-change', country);\n\n // Update phone number format when country changes\n const currentNumber = phoneNumberValue.value.replace(/^\\+\\d+\\s*/, '');\n const newFormattedNumber = `${country.dialCode} ${currentNumber}`.trim();\n\n phoneNumberValue.value = newFormattedNumber;\n emit('update:phoneNumber', newFormattedNumber);\n emit('update:modelValue', newFormattedNumber);\n\n showCountryDropdown.value = false;\n };\n\n const handlePhoneInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n phoneNumberValue.value = target.value;\n\n const fullNumber = `${selectedCountry.value.dialCode} ${target.value}`;\n emit('update:modelValue', fullNumber);\n emit('update:phoneNumber', target.value);\n emit('input', fullNumber);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Close dropdown when clicking outside\n const handleClickOutside = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target.closest('.freddy-plugins-input-field-container')) {\n showCountryDropdown.value = false;\n }\n };\n\n // Watch for prop changes\n watch(\n () => props.countryCode,\n newCode => {\n if (newCode && newCode !== localCountryCode.value) {\n localCountryCode.value = newCode;\n }\n },\n { immediate: true }\n );\n\n watch(\n () => props.phoneNumber,\n newValue => {\n if (newValue !== undefined) {\n phoneNumberValue.value = newValue;\n }\n }\n );\n\n onMounted(() => {\n document.addEventListener('click', handleClickOutside);\n });\n\n onUnmounted(() => {\n document.removeEventListener('click', handleClickOutside);\n });\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-figma-dropdown {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 8px 12px;\n cursor: pointer;\n position: relative;\n box-sizing: border-box;\n border-right: 1px solid transparent;\n }\n\n .freddy-plugins-figma-dropdown--freddy {\n border-right-color: #475569;\n }\n\n .freddy-plugins-figma-dropdown--contentplate {\n border-right-color: #e5e7eb;\n }\n\n .freddy-plugins-figma-dropdown-text {\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n color: #717680;\n white-space: nowrap;\n }\n\n .freddy-plugins-figma-dropdown-icon {\n width: 16px;\n height: 16px;\n stroke: var(--freddy-fg-tertiary);\n cursor: pointer;\n }\n\n .freddy-plugins-country-options-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 50;\n max-height: 200px;\n overflow-y: auto;\n border-radius: 8px;\n margin-top: 4px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n\n .freddy-plugins-country-options-dropdown--freddy {\n background-color: var(--bg-800, var(--freddy-bg-primary));\n border: 1px solid var(--border-600, #475569);\n }\n\n .freddy-plugins-country-options-dropdown--contentplate {\n background-color: var(--bg-50, var(--freddy-bg-primary));\n border: 1px solid var(--border-200, var(--freddy-border-color));\n }\n\n .freddy-plugins-country-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-country-option--freddy:hover {\n background-color: var(--bg-700, #374151);\n }\n\n .freddy-plugins-country-option--contentplate:hover {\n background-color: var(--bg-100, #f3f4f6);\n }\n\n .freddy-plugins-country-flag {\n font-size: 1rem;\n }\n\n .freddy-plugins-country-name {\n flex: 1;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-country-dial-code {\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .freddy-plugins-figma-text-input {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 8px 10px;\n flex: 1;\n box-sizing: border-box;\n min-height: 1px;\n min-width: 1px;\n }\n\n .freddy-plugins-figma-phone-input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n color: #ffffff;\n min-height: 1px;\n min-width: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .freddy-plugins-figma-phone-input::placeholder {\n color: #717680;\n }\n\n .freddy-plugins-figma-help-icon {\n width: 16px;\n height: 16px;\n position: relative;\n flex-shrink: 0;\n }\n\n .freddy-plugins-figma-help-icon-svg {\n width: 16px;\n height: 16px;\n stroke: var(--freddy-fg-tertiary);\n cursor: pointer;\n }\n</style>\n","<template>\n <!-- Phone Variant -->\n <PhoneInput\n v-if=\"variant === 'phone'\"\n v-bind=\"phoneProps\"\n @update:modelValue=\"handleUpdate\"\n @update:countryCode=\"handleCountryCodeUpdate\"\n @update:phoneNumber=\"handlePhoneNumberUpdate\"\n @country-change=\"handleCountryChange\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Card Variant -->\n <CardInput\n v-else-if=\"variant === 'card'\"\n v-bind=\"cardProps\"\n @update:modelValue=\"handleUpdate\"\n @update:cardNumber=\"handleCardNumberUpdate\"\n @card-type-detected=\"handleCardTypeDetected\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @trailing-icon-click=\"handleTrailingIconClick\"\n />\n\n <!-- Default/Other Variants -->\n <DefaultInput\n v-else\n v-bind=\"defaultProps\"\n @update:modelValue=\"handleUpdate\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeydown\"\n @leading-icon-click=\"handleLeadingIconClick\"\n @trailing-icon-click=\"handleTrailingIconClick\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import PhoneInput from './PhoneInput.vue';\n import CardInput from './CardInput.vue';\n import DefaultInput from './DefaultInput.vue';\n import type {\n UnifiedInputFieldProps,\n UnifiedInputFieldEvents,\n CountryOption,\n CardType,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends UnifiedInputFieldProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n variant: 'default',\n type: 'default',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '',\n inputType: 'text',\n modelValue: '',\n disabled: false,\n readonly: false,\n countryCode: 'US',\n phoneNumber: '',\n });\n\n const emit = defineEmits<UnifiedInputFieldEvents>();\n\n // Determine the actual variant to use\n const variant = computed(() => props.variant || props.type || 'default');\n\n // Props for PhoneInput\n const phoneProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n countryCode: props.countryCode,\n phoneNumber: props.phoneNumber,\n countryOptions: props.countryOptions,\n trailingIcon: props.trailingIcon,\n tooltipText: props.tooltipText,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Props for CardInput\n const cardProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n cardNumber: props.cardNumber,\n cardType: props.cardType,\n maskInput: props.maskInput,\n showCardIcon: props.showCardIcon,\n trailingIcon: props.trailingIcon,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Props for DefaultInput\n const defaultProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n inputType: props.inputType,\n modelValue: props.modelValue,\n leadingIcon: props.leadingIcon,\n trailingIcon: props.trailingIcon,\n tooltipText: props.tooltipText,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Event handlers\n const handleUpdate = (value: string) => {\n emit('update:modelValue', value);\n };\n\n const handleInput = (value: string) => {\n emit('input', value);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n const handleLeadingIconClick = (event: MouseEvent) => {\n emit('leading-icon-click', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n // Phone-specific event handlers\n const handleCountryCodeUpdate = (code: string) => {\n emit('update:countryCode', code);\n };\n\n const handlePhoneNumberUpdate = (number: string) => {\n emit('update:phoneNumber', number);\n };\n\n const handleCountryChange = (country: CountryOption) => {\n emit('country-change', country);\n };\n\n // Card-specific event handlers\n const handleCardNumberUpdate = (number: string) => {\n emit('update:cardNumber', number);\n };\n\n const handleCardTypeDetected = (cardType: CardType) => {\n emit('card-type-detected', cardType);\n };\n</script>\n\n<style scoped>\n /* No styles needed - all styling is handled by child components */\n</style>\n","<template>\n <transition name=\"modal\">\n <div\n v-if=\"isVisible\"\n class=\"fixed z-[9998] top-0 left-0 w-full h-full bg-modalBackgroundBlur flex justify-center items-center\"\n >\n <div class=\"flex justify-center items-center\">\n <div\n :class=\"{\n 'p-8 bg-background rounded-[2.5rem] overflow-hidden text-white':\n largeModel,\n 'freddy-plugins-modal-container-large': largeModel,\n }\"\n >\n <div class=\"freddy-plugins-modal-header\">\n <slot name=\"header\"></slot>\n </div>\n\n <div class=\"freddy-plugins-modal-body\">\n <slot name=\"body\"></slot>\n </div>\n\n <div class=\"freddy-plugins-modal-footer\">\n <slot name=\"footer\">\n <!-- <button class=\"modal-default-button\" @click=\"$emit('close')\">\n OK\n </button> -->\n </slot>\n </div>\n </div>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n name: \"ModalBox\",\n props: {\n isVisible: {\n type: Boolean,\n default: true,\n },\n largeModel: {\n type: Boolean,\n default: true,\n },\n },\n methods: {\n closeModal() {\n this.$emit(\"close\");\n },\n },\n};\n</script>\n\n<style>\n/* Modal background blur */\n.bg-modalBackgroundBlur {\n background-color: rgba(29, 46, 71, 0.9);\n backdrop-filter: blur(4px);\n}\n\n/* Background color */\n.bg-background {\n background-color: #0f172a;\n}\n\n/* Modal container */\n.freddy-plugins-modal-container {\n background-color: var(--bg-900, var(--freddy-bg-primary)); /* background */\n padding: 2rem; /* p-8 */\n border-radius: 2.5rem; /* rounded-[2.5rem] */\n overflow: hidden;\n color: white;\n}\n\n.freddy-plugins-modal-header:last-child,\n.freddy-plugins-modal-body:last-child,\n.freddy-plugins-modal-footer:last-child {\n margin-bottom: 0;\n}\n\n/* Modal transition animations */\n.modal-enter-active,\n.modal-leave-active {\n transition: all 0.3s ease;\n}\n\n.modal-enter-from,\n.modal-leave-to {\n opacity: 0;\n transform: scale(0.9);\n}\n\n.modal-enter-to,\n.modal-leave-from {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Responsive width utilities - using proper CSS instead of escaped class names */\n@media (min-width: 1280px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 1279px) and (min-width: 1024px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 1023px) and (min-width: 768px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 767px) and (min-width: 640px) {\n .freddy-plugins-modal-container-large {\n width: 45.625rem;\n }\n}\n\n@media (max-width: 639px) and (min-width: 480px) {\n .freddy-plugins-modal-container-large {\n width: 31.25rem;\n }\n}\n\n@media (max-width: 479px) {\n .freddy-plugins-modal-container-large {\n width: auto;\n max-width: 90%;\n }\n}\n</style>\n","<template>\n <ModalBox :isVisible=\"isVisible\" >\n <template #header>\n <h2>Instructions</h2>\n </template>\n <template #body>\n <p>Instructions</p>\n </template>\n </ModalBox>\n</template>\n\n<script setup lang=\"ts\">\nimport ModalBox from '@/components/ModalBox.vue'\n\ndefineProps({\n isVisible: {\n type: Boolean,\n required: true\n }\n})\n</script>","<template>\n <input\n type=\"text\"\n :value=\"inputValue\"\n :placeholder=\"placeholder\"\n :style=\"{ width: '100%', height: height }\"\n @input=\"handleInput\"\n class=\"instruction-text-input\"\n aria-label=\"Instruction input\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n\n const props = defineProps<{\n inputValue: string;\n placeholder: string;\n height?: string;\n }>();\n\n const emit = defineEmits<{\n (e: 'update:inputValue', value: string): void;\n }>();\n\n const height = computed(() => props.height || '40px');\n\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n emit('update:inputValue', target.value);\n };\n</script>\n\n<style scoped>\n .instruction-text-input {\n box-sizing: border-box;\n font-size: 1rem;\n padding: 0.5rem 1rem;\n border-radius: var(--radius-md, 8px);\n border: 1px solid var(--freddy-border-secondary, #35414b);\n background: var(--freddy-bg-primary, #031525);\n color: #222;\n width: 100%;\n outline: none;\n box-shadow: 0 1px 2px 0 var(--freddy-shadow-sm, rgba(255, 255, 255, 0));\n transition: border-color 0.2s;\n }\n .instruction-text-input:focus {\n border-color: #888;\n }\n</style>\n","<template>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"freddy-plugins-modal-overlay\"\n @click=\"clickOutside\"\n >\n <div class=\"freddy-plugins-modal-content\" @click.stop>\n <header class=\"freddy-plugins-modal-header\">\n <h2 class=\"freddy-plugins-modal-title\" :class=\"headerClass\">\n {{ modalTitle }}\n </h2>\n <button class=\"freddy-plugins-modal-close\" @click=\"closeModal\">\n <IconLightCross class=\"freddy-plugins-modal-close-icon\" />\n </button>\n </header>\n <div class=\"freddy-plugins-modal-body\">\n <slot name=\"content\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nimport IconLightCross from \"@/icons/IconLightCross.vue\";\n\nconst props = defineProps<{\n modalTitle: string;\n headerClass: string;\n disableClickOutside?: boolean;\n}>();\n\nconst emits = defineEmits([\"close\"]);\n\nconst closeModal = () => {\n emits(\"close\");\n};\n\nconst clickOutside = () => {\n if (!props.disableClickOutside) {\n closeModal();\n }\n};\n</script>\n\n<style>\n.freddy-plugins-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(3, 21, 37, 0.77);\n backdrop-filter: blur(4px);\n z-index: 1000;\n overflow: auto;\n}\n\n.freddy-plugins-modal-content {\n background-color: var(--text-900, var(--freddy-bg-primary));\n border-radius: 40px;\n box-shadow: 0 0 10px 2px rgba(255, 255, 255, 0.25);\n padding: 30px;\n position: relative;\n margin: auto;\n min-width: 370px;\n max-width: 90%;\n width: auto;\n}\n\n.freddy-plugins-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 28px;\n gap: 8px;\n}\n\n.freddy-plugins-modal-title {\n font-size: 29px;\n line-height: 35px;\n font-weight: 600;\n margin: 0;\n}\n\n.freddy-plugins-modal-close {\n background: none;\n border: none;\n font-size: 35px;\n font-weight: 400;\n color: white;\n padding: 0;\n line-height: 1;\n cursor: pointer;\n}\n\n.freddy-plugins-modal-close-icon {\n width: 16px;\n height: 16px;\n stroke-width: 2px;\n}\n\n.freddy-plugins-modal-body {\n /* optional: wrap content styles */\n}\n</style>\n","<!-- Spinner.vue -->\n<template>\n <div class=\"freddy-plugin-spinner\" :class=\"customClass\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\ndefineProps<{\n customClass?: string;\n}>();\n</script>\n\n<style>\n.freddy-plugin-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid #f3f3f3;\n border-top-color: transparent;\n border-radius: 50%;\n animation: freddy-plugin-spin 1s linear infinite;\n}\n\n@keyframes freddy-plugin-spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<template>\n <div\n ref=\"dropdownRef\"\n class=\"freddy-search-wrapper\"\n :class=\"attrs.class\"\n @click=\"focusInput\"\n >\n <IconSearch class=\"freddy-search-icon\" />\n <input\n type=\"text\"\n id=\"search-input\"\n class=\"freddy-search-input\"\n ref=\"searchInput\"\n v-model=\"inputValue\"\n @input=\"handleInput\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxCharLimit\"\n />\n <Spinner class=\"freddy-search-spinner\" v-if=\"showLoaderForSearch\" />\n <IconCross\n class=\"freddy-search-close\"\n v-if=\"showCloseButton && !showLoaderForSearch && inputValue?.length\"\n @click=\"handleClear\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\nimport IconCross from \"@/icons/IconCross.vue\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport { ref, useAttrs } from \"vue\";\nimport Spinner from \"@/components/Spinner.vue\";\nimport { IconSearch } from \"@/icons/\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst inputValue = ref<string | null>(null);\nconst searchInput = ref<HTMLInputElement | null>(null);\nconst dropdownRef = ref<HTMLElement | null>(null);\n\ninterface SearchInputProps {\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Whether to show a loading spinner */\n showLoaderForSearch?: boolean;\n /** Maximum number of characters allowed in the input */\n maxCharLimit?: number;\n /** Whether to show a close button */\n showCloseButton?: boolean;\n}\n\nwithDefaults(defineProps<SearchInputProps>(), {\n placeholder: \"Search here...\",\n showLoaderForSearch: false,\n maxCharLimit: undefined,\n showCloseButton: false,\n});\n\nconst emit = defineEmits<{\n (event: \"update:searchInput\", inputValue: string | null): void;\n (event: \"clear\"): void;\n}>();\n\nconst focusInput = () => {\n searchInput.value?.focus();\n};\n\nconst handleInput = () => {\n emit(\"update:searchInput\", inputValue.value);\n};\n\nconst handleClear = () => {\n emit(\"clear\");\n};\n</script>\n\n<style>\n.freddy-search-wrapper {\n display: flex;\n box-sizing: border-box;\n align-items: flex-start;\n gap: 0.5rem; /* gap-2 */\n height: 37px;\n width: 100%;\n border: 2px solid var(--freddy-border-color);\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n border-radius: 0.5rem;\n cursor: text;\n}\n\n.freddy-search-icon {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n align-self: center;\n stroke: var(--text-muted);\n}\n\n.freddy-search-input {\n flex: 1 1 auto;\n width: 100%;\n font-size: 14px;\n font-weight: 500;\n line-height: 16px;\n background: transparent;\n border: none;\n outline: none;\n color: var(--text-300, var(--text-muted));\n align-self: center;\n}\n\n.freddy-search-input::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n}\n\n/* Disable browser autofill styling for search input */\n.freddy-search-input:-webkit-autofill,\n.freddy-search-input:-webkit-autofill:hover,\n.freddy-search-input:-webkit-autofill:focus,\n.freddy-search-input:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: var(--text-300, var(--text-muted)) !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n}\n\n.freddy-search-input:-moz-autofill,\n.freddy-search-input:-moz-autofill:focus {\n background-color: transparent !important;\n color: var(--text-300, var(--text-muted)) !important;\n border: none !important;\n box-shadow: none !important;\n}\n\n.freddy-search-input:-ms-autofill,\n.freddy-search-input:-ms-autofill:focus {\n background-color: transparent !important;\n color: var(--text-300, var(--text-muted)) !important;\n border: none !important;\n box-shadow: none !important;\n}\n\n.freddy-search-spinner {\n width: 21px !important;\n align-self: center;\n}\n\n.freddy-search-close {\n width: 12px;\n height: 12p;\n align-self: center;\n color: var(--freddy-text-quaternary);\n}\n</style>\n","<template>\n <div class=\"model-dropdown-wrapper\" @keydown.esc=\"closeDropdown\">\n <div\n class=\"model-dropdown-trigger\"\n :class=\"[\n `model-dropdown-trigger--${size}`,\n { 'model-dropdown-trigger--open': open },\n ]\"\n @click=\"toggleDropdown\"\n >\n <div class=\"model-dropdown-selected-content\">\n <img\n v-if=\"selectedOption?.imageSrc\"\n :src=\"selectedOption.imageSrc\"\n :alt=\"selectedOption.value\"\n class=\"model-dropdown-selected-image\"\n />\n <span class=\"model-dropdown-placeholder\">\n {{ selectedOption?.value || modelPlaceholder }}\n </span>\n </div>\n <IconChevronDown v-if=\"!open\" class=\"model-dropdown-chevron\" />\n <IconChevronUp v-else class=\"model-dropdown-chevron\" />\n </div>\n\n <!-- Dropdown Menu -->\n <div v-if=\"open\" class=\"model-dropdown-menu\">\n <div v-if=\"searchable\" class=\"model-dropdown-search\">\n <SearchInput\n v-model=\"searchQuery\"\n :placeholder=\"searchPlaceholder\"\n :showCloseButton=\"true\"\n />\n </div>\n\n <ul class=\"model-dropdown-options\">\n <li\n v-for=\"option in filteredOptions\"\n :key=\"option.id\"\n class=\"model-dropdown-option\"\n :class=\"{\n 'model-dropdown-option--selected': selectedOption?.id === option.id,\n }\"\n @click=\"selectOption(option)\"\n >\n <img\n v-if=\"option.imageSrc\"\n :src=\"option.imageSrc\"\n :alt=\"option.value\"\n class=\"model-dropdown-option-image\"\n />\n <span class=\"model-dropdown-option-value\">{{ option.value }}</span>\n </li>\n\n <li\n v-if=\"filteredOptions.length === 0\"\n class=\"model-dropdown-no-options\"\n >\n No providers found\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from \"vue\";\nimport IconChevronDown from \"@/icons/IconChevronDown.vue\";\nimport IconChevronUp from \"@/icons/IconChevronUp.vue\";\nimport SearchInput from \"./SearchInput.vue\";\n\nexport interface ModelOption {\n id: string | number;\n value: string;\n imageSrc?: string;\n}\n\nexport interface ModelDropdownProps {\n options: ModelOption[];\n searchable?: boolean;\n searchPlaceholder?: string;\n modelPlaceholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst props = withDefaults(defineProps<ModelDropdownProps>(), {\n searchable: false,\n searchPlaceholder: \"Search providers...\",\n modelPlaceholder: \"Select a model\",\n size: \"md\",\n});\n\nconst emit = defineEmits<{\n (event: \"select\", option: ModelOption): void;\n}>();\n\nconst open = ref(false);\nconst searchQuery = ref(\"\");\nconst selectedOption = ref<ModelOption | null>(null);\n\n// Computed properties\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) return props.options;\n return props.options.filter((option) =>\n option.value.toLowerCase().includes(searchQuery.value.toLowerCase())\n );\n});\n\n// Methods\nconst toggleDropdown = () => {\n open.value = !open.value;\n if (!open.value) searchQuery.value = \"\";\n};\n\nconst closeDropdown = () => {\n open.value = false;\n searchQuery.value = \"\";\n};\n\nconst selectOption = (option: ModelOption) => {\n selectedOption.value = option;\n emit(\"select\", option);\n closeDropdown();\n};\n\n// Outside click handler\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!target.closest(\".model-dropdown-wrapper\")) {\n closeDropdown();\n }\n};\n\n// Watch for dropdown state changes\nwatch(open, (isOpen) => {\n if (isOpen) {\n setTimeout(() => {\n document.addEventListener(\"click\", handleClickOutside);\n }, 0);\n } else {\n document.removeEventListener(\"click\", handleClickOutside);\n }\n});\n\nonUnmounted(() => {\n document.removeEventListener(\"click\", handleClickOutside);\n});\n</script>\n\n<style scoped>\n.model-dropdown-wrapper {\n position: relative;\n width: 100%;\n}\n\n.model-dropdown-trigger {\n gap: 40px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--Colors-Border-border-secondary, #35414b);\n border-radius: 8px;\n background: var(--freddy-bg-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.model-dropdown-trigger:hover {\n border-color: var(--freddy-primary-color);\n}\n\n.model-dropdown-trigger--open {\n border-color: var(--freddy-primary-color);\n}\n\n/* Size variants */\n.model-dropdown-trigger--sm {\n height: 36px;\n}\n\n.model-dropdown-trigger--md {\n height: 40px;\n}\n\n.model-dropdown-trigger--lg {\n height: 42px;\n}\n\n.model-dropdown-selected-content {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n}\n\n.model-dropdown-selected-image {\n width: 20px;\n height: 20px;\n object-fit: contain;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.model-dropdown-placeholder {\n font-size: 14px;\n color: var(--freddy-text-primary);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-dropdown-chevron {\n width: 16px;\n height: 16px;\n color: var(--freddy-text-tertiary);\n}\n\n/* Dropdown Menu */\n.model-dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 4px;\n background: var(--freddy-bg-primary);\n border: 2px solid var(--freddy-border-color);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n overflow: hidden;\n}\n\n.model-dropdown-search {\n padding: 8px;\n border-bottom: 1px solid var(--freddy-border-secondary);\n}\n\n.model-dropdown-options {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n max-height: 280px;\n overflow-y: auto;\n}\n\n.model-dropdown-search .freddy-search-wrapper {\n width: 100%;\n background: var(--freddy-bg-secondary);\n border: 1px solid var(--freddy-border-color);\n border-radius: 4px;\n}\n\n.model-dropdown-search .freddy-search-input {\n color: var(--freddy-text-primary);\n font-size: 13px;\n}\n\n.model-dropdown-search .freddy-search-wrapper:focus-within {\n border-color: var(--freddy-primary-color);\n}\n\n.model-dropdown-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n\n.model-dropdown-option:hover {\n background: var(--freddy-bg-secondary);\n}\n\n.model-dropdown-option--selected {\n background: var(--freddy-bg-tertiary);\n}\n\n.model-dropdown-option-image {\n width: 20px;\n height: 20px;\n object-fit: contain;\n border-radius: 4px;\n}\n\n.model-dropdown-option-value {\n font-size: 14px;\n color: var(--freddy-text-primary);\n}\n\n.model-dropdown-no-options {\n padding: 12px;\n text-align: center;\n color: var(--freddy-text-tertiary);\n font-size: 13px;\n}\n</style>\n","<template>\n <nav\n v-if=\"totalPages > 0\"\n class=\"freddy-pagination-nav\"\n aria-label=\"Pagination\"\n >\n <button\n class=\"freddy-pagination-end-button\"\n :class=\"{ 'freddy-pagination-hover-enabled': currentPage !== 1 }\"\n @click=\"goToPage(currentPage - 1)\"\n :disabled=\"currentPage === 1\"\n >\n Previous\n </button>\n\n <div class=\"freddy-pagination-dynamic-container\">\n <button\n v-for=\"page in pages\"\n :key=\"String(page)\"\n class=\"freddy-pagination-number-button\"\n :class=\"{ active: page === currentPage }\"\n @click=\"goToPage(page)\"\n :disabled=\"page === '...' || page === currentPage\"\n >\n {{ page }}\n </button>\n\n <button\n class=\"freddy-pagination-end-button\"\n :class=\"{\n 'freddy-pagination-hover-enabled': currentPage !== totalPages,\n }\"\n @click=\"goToPage(currentPage + 1)\"\n :disabled=\"currentPage === totalPages || totalPages === 0\"\n >\n Next\n </button>\n </div>\n </nav>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nconst props = defineProps({\n totalItems: { type: Number, required: true, default: 0 },\n itemsPerPage: { type: Number, required: true, default: 10 },\n currentPage: { type: Number, required: true, default: 1 },\n});\n\nconst emit = defineEmits([\"update:currentPage\"]);\n\nconst totalPages = computed(() => {\n if (!props.totalItems || isNaN(props.totalItems)) return 0;\n return Math.ceil(props.totalItems / props.itemsPerPage);\n});\n\nconst pages = computed(() => {\n const result: (number | string)[] = [];\n const tp = totalPages.value;\n const cp = props.currentPage;\n\n if (tp <= 7) {\n for (let i = 1; i <= tp; i++) {\n result.push(i);\n }\n } else {\n result.push(1);\n\n if (cp > 4) {\n result.push(\"...\");\n } else {\n result.push(2, 3);\n }\n\n for (let i = Math.max(4, cp - 1); i <= Math.min(tp - 3, cp + 1); i++) {\n result.push(i);\n }\n\n if (cp < tp - 4) {\n result.push(\"...\");\n }\n\n result.push(tp - 2, tp - 1, tp);\n }\n\n return result;\n});\n\nfunction goToPage(page: number | string) {\n if (page === \"...\" || page === props.currentPage) return;\n if (typeof page === \"number\" && page >= 1 && page <= totalPages.value) {\n emit(\"update:currentPage\", page);\n }\n}\n</script>\n\n<style>\n.freddy-pagination-nav {\n width: 100%;\n display: flex;\n gap: 0.25rem;\n justify-content: space-between;\n}\n\n.freddy-pagination-number-button {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--text-500, var(--freddy-text-secondary));\n cursor: pointer;\n padding: 0.5rem 0.75rem;\n height: auto;\n background: transparent;\n border: none;\n transition: background-color 0.2s, color 0.2s;\n}\n\n/* Active Page Button Style */\n.freddy-pagination-number-button.active,\n.freddy-pagination-number-button.bg-white {\n background-color: var(--bg-surface);\n color: white;\n}\n\n.freddy-pagination-dynamic-container {\n display: flex;\n gap: 0.25rem;\n}\n\n.freddy-pagination-end-button {\n margin-left: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 1rem;\n height: 2.5rem;\n margin-inline-start: 0;\n line-height: 1.25rem;\n color: var(--text-500, var(--freddy-text-secondary));\n background-color: var(--text-900, var(--freddy-bg-primary));\n border: 2px solid var(--border-light);\n border-radius: 0.5rem;\n cursor: pointer;\n transition: background-color 0.2s, color 0.2s;\n}\n\n/* Hover Enabled State */\n.freddy-pagination-hover-enabled:hover {\n background-color: var(--bg-surface);\n color: var(--text-300, var(--text-muted));\n cursor: pointer;\n}\n</style>\n","<template>\n <button\n class=\"chat-bar-send-btn\"\n :class=\"{ active: active, [`chat-bar-send-btn--${size}`]: true }\"\n :disabled=\"disabled\"\n @click=\"$emit('click')\"\n >\n <component :is=\"IconSend\" class=\"chat-bar-send-icon\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport IconSend from \"@/icons/IconSend.vue\";\nimport IconStopCircle from \"@/icons/IconStopCircle.vue\";\ndefineProps<{\n disabled?: boolean;\n active?: boolean;\n size?: \"s\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n}>();\n</script>\n\n<style>\n.chat-bar-send-btn {\n background: var(--color-primary-500, var(--freddy-primary-color));\n border: none;\n padding: 0;\n margin-bottom: 4px;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--text-inverse); /* Default icon color */\n transition: color 0.2s, background 0.2s;\n}\n\n/* Size variants */\n.chat-bar-send-btn--s {\n width: 24px;\n height: 24px;\n}\n\n.chat-bar-send-btn--sm {\n width: 28px;\n height: 28px;\n}\n\n.chat-bar-send-btn--md {\n width: 32px;\n height: 32px;\n}\n\n.chat-bar-send-btn--lg {\n width: 36px;\n height: 36px;\n}\n\n.chat-bar-send-btn--xl {\n width: 40px;\n height: 40px;\n}\n\n.chat-bar-send-btn.active {\n color: var(--text-300, #cbd6e3); /* Active icon color */\n}\n\n.chat-bar-send-btn:disabled {\n background: var(--bg-300, var(--freddy-border-color));\n cursor: not-allowed;\n color: var(--text-400, var(--text-muted)); /* Disabled icon color */\n}\n\n.chat-bar-send-icon {\n width: 20px;\n height: 20px;\n}\n\n/* Adjust icon size for different button sizes */\n.chat-bar-send-btn--s .chat-bar-send-icon {\n width: 14px;\n height: 14px;\n}\n\n.chat-bar-send-btn--sm .chat-bar-send-icon {\n width: 16px;\n height: 16px;\n}\n\n.chat-bar-send-btn--lg .chat-bar-send-icon {\n width: 22px;\n height: 22px;\n}\n\n.chat-bar-send-btn--xl .chat-bar-send-icon {\n width: 24px;\n height: 24px;\n}\n</style>\n","<script setup lang=\"ts\">\n import type { ISkeletonType } from '@/interfaces';\n\n const props = defineProps<{\n type: ISkeletonType;\n hasHeader?: boolean;\n count?: number;\n }>();\n\n const { type, hasHeader = false, count = 5 } = props;\n</script>\n\n<template>\n <!-- Card Skeleton -->\n <template v-if=\"type === 'card'\">\n <div class=\"skeleton-card\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-w-32 skeleton-h-6 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-3-4\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-5-6\"\n ></div>\n </div>\n </template>\n\n <!-- Paragraph Skeleton -->\n <template v-else-if=\"type === 'paragraph'\">\n <div class=\"skeleton-paragraph\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-5-6\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-3-4\"\n ></div>\n </div>\n </template>\n\n <!-- Single Box Skeleton -->\n <template v-else-if=\"type === 'single-box'\">\n <div class=\"skeleton-single-box\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n </div>\n </template>\n\n <!-- Table Skeleton -->\n <template v-else-if=\"type === 'table'\">\n <div class=\"skeleton-table\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40\"\n ></div>\n <table class=\"table-full\">\n <tbody>\n <tr v-for=\"i in count\" :key=\"i\">\n <td class=\"td-padding\">\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-8 skeleton-w-full\"\n ></div>\n </td>\n <td class=\"td-padding\">\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-8 skeleton-w-full\"\n ></div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </template>\n</template>\n\n<style>\n /* Main container styles */\n .skeleton-card {\n background-color: var(--freddy-bg-primary) a8;\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.5rem;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .skeleton-paragraph,\n .skeleton-single-box,\n .skeleton-single-paragraph {\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.75rem;\n background-color: var(--freddy-bg-primary) a8;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .skeleton-single-box {\n padding: 8px;\n }\n\n .skeleton-table {\n background-color: var(--freddy-bg-primary) a8;\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.5rem;\n overflow: hidden;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n /* Skeleton shimmer */\n .skeleton-wave {\n position: relative;\n overflow: hidden;\n background-color: var(--text-900, var(--freddy-bg-primary));\n }\n .skeleton-wave::after {\n content: '';\n position: absolute;\n top: 0;\n left: -150%;\n height: 100%;\n width: 150%;\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0) 0%,\n rgba(255, 255, 255, 0.7) 50%,\n rgba(255, 255, 255, 0) 100%\n );\n animation: wave 3s ease-in-out infinite;\n }\n @keyframes wave {\n 0% {\n left: -150%;\n }\n 50% {\n left: 100%;\n }\n 100% {\n left: 100%;\n }\n }\n\n /* Skeleton line sizes */\n .skeleton-line {\n background-color: var(--text-50, var(--text-inverse)) fff17;\n border-radius: 0.25rem;\n }\n .skeleton-h-4 {\n height: 1rem;\n }\n .skeleton-h-6 {\n height: 1.5rem;\n }\n .skeleton-h-8 {\n height: 2rem;\n }\n\n .skeleton-w-full {\n width: 100%;\n }\n .skeleton-w-5-6 {\n width: 83.333333%;\n }\n .skeleton-w-3-4 {\n width: 75%;\n }\n .skeleton-w-40 {\n width: 10rem;\n }\n .skeleton-w-32 {\n width: 8rem;\n }\n\n /* Table styles */\n .table-full {\n min-width: 100%;\n border-collapse: collapse;\n }\n .td-padding {\n padding: 0.5rem 1.5rem;\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-slider-container\">\n <!-- Header row with label/tooltip and value display -->\n <div v-if=\"label || showValue\" class=\"freddy-plugins-slider-header\">\n <div v-if=\"label\" class=\"freddy-plugins-slider-label-section\">\n <span class=\"freddy-plugins-slider-label\">{{ label }}</span>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <IconInfoRounded class=\"freddy-plugins-slider-tooltip-icon\" />\n </Tooltip>\n </div>\n <div v-if=\"showValue\" class=\"freddy-plugins-slider-value-badge\">\n {{ displayValue }}\n </div>\n </div>\n\n <!-- Slider track -->\n <div\n class=\"freddy-plugins-slider-track-container\"\n :class=\"{ 'freddy-plugins-slider-disabled': disabled }\"\n @click=\"handleTrackClick\"\n @keydown=\"handleKeyDown\"\n :tabindex=\"disabled ? -1 : 0\"\n role=\"slider\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled\"\n :aria-label=\"label || 'Slider'\"\n >\n <!-- Background track -->\n <div ref=\"sliderTrack\" class=\"freddy-plugins-slider-track-background\"></div>\n\n <!-- Progress fill -->\n <div\n class=\"freddy-plugins-slider-track-progress\"\n :style=\"{ width: progressPercentage + '%' }\"\n ></div>\n\n <!-- Thumb -->\n <div\n class=\"freddy-plugins-slider-thumb\"\n :class=\"{\n 'freddy-plugins-slider-thumb-dragging': isDragging,\n 'freddy-plugins-slider-thumb-disabled': disabled,\n }\"\n :style=\"{ left: thumbPosition + '%' }\"\n @mousedown=\"handleMouseDown\"\n @touchstart=\"handleTouchStart\"\n ></div>\n </div>\n\n <!-- Hint text -->\n <p v-if=\"hint\" class=\"freddy-plugins-slider-hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import IconInfoRounded from '@/icons/IconInfoRounded.vue';\n import Tooltip from './Tooltip.vue';\n import type { SliderProps } from '@/interfaces/slider.interfaces';\n\n const props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n disabled: false,\n showValue: true,\n range: false,\n tooltipPlacement: 'top',\n });\n\n const emit = defineEmits<{\n 'update:modelValue': [value: number];\n 'update:rangeValue': [range: [number, number]];\n }>();\n\n // Refs\n const isDragging = ref(false);\n const sliderTrack = ref<HTMLElement | null>(null);\n\n // Computed values\n const displayValue = computed(() => {\n return Math.round(props.modelValue);\n });\n\n const progressPercentage = computed(() => {\n const range = props.max - props.min;\n const value = props.modelValue - props.min;\n return Math.min(100, Math.max(0, (value / range) * 100));\n });\n\n const thumbPosition = computed(() => {\n return progressPercentage.value;\n });\n\n // Methods\n const clampValue = (value: number): number => {\n const stepped = Math.round(value / props.step) * props.step;\n return Math.min(props.max, Math.max(props.min, stepped));\n };\n\n const calculateValueFromPosition = (clientX: number): number => {\n if (!sliderTrack.value) return props.modelValue;\n\n const rect = sliderTrack.value.getBoundingClientRect();\n const percentage = Math.max(\n 0,\n Math.min(1, (clientX - rect.left) / rect.width)\n );\n const rawValue = props.min + percentage * (props.max - props.min);\n\n // Apply step rounding\n const steppedValue = Math.round(rawValue / props.step) * props.step;\n return Math.min(props.max, Math.max(props.min, steppedValue));\n };\n\n const updateValue = (newValue: number) => {\n const clampedValue = clampValue(newValue);\n if (clampedValue !== props.modelValue) {\n emit('update:modelValue', clampedValue);\n }\n };\n\n // Mouse handlers\n const handleMouseDown = (event: MouseEvent) => {\n if (props.disabled) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging.value = true;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging.value) return;\n e.preventDefault();\n const newValue = calculateValueFromPosition(e.clientX);\n updateValue(newValue);\n };\n\n const handleMouseUp = () => {\n isDragging.value = false;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n };\n\n // Touch handlers\n const handleTouchStart = (event: TouchEvent) => {\n if (props.disabled) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging.value = true;\n\n const handleTouchMove = (e: TouchEvent) => {\n if (!isDragging.value || !e.touches[0]) return;\n e.preventDefault();\n updateValue(calculateValueFromPosition(e.touches[0].clientX));\n };\n\n const handleTouchEnd = () => {\n isDragging.value = false;\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n };\n\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleTouchEnd);\n };\n\n // Track click handler\n const handleTrackClick = (event: MouseEvent) => {\n if (props.disabled || isDragging.value) return;\n event.preventDefault();\n event.stopPropagation();\n const newValue = calculateValueFromPosition(event.clientX);\n updateValue(newValue);\n };\n\n // Keyboard handler\n const handleKeyDown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n let newValue = props.modelValue;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n event.preventDefault();\n newValue = props.modelValue - props.step;\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n event.preventDefault();\n newValue = props.modelValue + props.step;\n break;\n case 'Home':\n event.preventDefault();\n newValue = props.min;\n break;\n case 'End':\n event.preventDefault();\n newValue = props.max;\n break;\n case 'PageDown':\n event.preventDefault();\n newValue = props.modelValue - props.step * 10;\n break;\n case 'PageUp':\n event.preventDefault();\n newValue = props.modelValue + props.step * 10;\n break;\n default:\n return;\n }\n\n updateValue(newValue);\n };\n</script>\n\n<style scoped>\n .freddy-plugins-slider-container {\n display: flex;\n flex-direction: column;\n gap: 5px;\n width: 100%;\n }\n\n .freddy-plugins-slider-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .freddy-plugins-slider-label-section {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .freddy-plugins-slider-label {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n }\n\n .freddy-plugins-slider-tooltip-icon {\n width: 16px;\n height: 16px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n cursor: pointer;\n }\n\n .freddy-plugins-slider-value-badge {\n border: 1px solid var(--colors-border-border-secondary, #35414b);\n border-radius: 4px;\n padding: 0 3px;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n text-align: center;\n min-width: 20px;\n }\n\n .freddy-plugins-slider-track-container {\n position: relative;\n height: 24px;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: opacity 0.2s ease;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n }\n\n .freddy-plugins-slider-track-container:focus-visible {\n outline: 2px solid var(--colors-texts-text-action, #7ba8ef);\n outline-offset: 2px;\n }\n\n .freddy-plugins-slider-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .freddy-plugins-slider-track-background {\n position: absolute;\n top: 8px;\n left: 0;\n right: 0;\n height: 8px;\n background-color: var(--colors-texts-text-tetriary, #cbd6e3);\n border-radius: 9999px;\n }\n\n .freddy-plugins-slider-track-progress {\n position: absolute;\n top: 8px;\n left: 0;\n height: 8px;\n background-color: var(--colors-texts-text-action, #7ba8ef);\n border-radius: 9999px;\n transition: width 0.2s ease;\n }\n\n .freddy-plugins-slider-thumb {\n position: absolute;\n top: 0;\n width: 24px;\n height: 24px;\n background-color: #ffffff;\n border: 2px solid var(--colors-texts-text-action, #7ba8ef);\n border-radius: 50%;\n cursor: grab;\n transform: translateX(-50%);\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n touch-action: none;\n }\n\n .freddy-plugins-slider-thumb:hover:not(.freddy-plugins-slider-thumb-disabled) {\n transform: translateX(-50%) scale(1.1);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n\n .freddy-plugins-slider-thumb-dragging {\n transform: translateX(-50%) scale(1.15);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);\n cursor: grabbing;\n }\n\n .freddy-plugins-slider-thumb-disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-slider-hint {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n margin: 0;\n }\n</style>\n","<template>\n <div\n class=\"freddy-plugins-snackbar-container\"\n :class=\"`freddy-plugins-snackbar-container--${getContainerSize}`\"\n >\n <div\n v-for=\"(toast, index) in snackQueue\"\n :key=\"index\"\n class=\"freddy-plugins-snackbar\"\n :class=\"`freddy-plugins-snackbar--${toast.toastType}`\"\n >\n <div class=\"freddy-plugins-snackbar-content\">\n <div class=\"freddy-plugins-snackbar-left\">\n <component\n :is=\"getToastIcon(toast.toastType)\"\n class=\"freddy-plugins-snackbar-icon\"\n :class=\"[\n toast.toastType === 'info' && 'freddy-plugins-snackbar-icon--info',\n toast.toastType === 'danger' &&\n 'freddy-plugins-snackbar-icon--danger',\n toast.toastType === 'success' &&\n 'freddy-plugins-snackbar-icon--success',\n ]\"\n />\n\n <div class=\"freddy-plugins-snackbar-text\">\n <p class=\"freddy-plugins-snackbar-title\" v-html=\"toast.title\" />\n <p class=\"freddy-plugins-snackbar-message\" v-html=\"toast.message\" />\n </div>\n </div>\n\n <button\n class=\"freddy-plugins-snackbar-close-btn\"\n @click=\"closeToast(index)\"\n >\n <IconLightCross class=\"freddy-plugins-snackbar-close-icon\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nimport { useSnackBar } from \"@/utility\";\nimport { computed } from \"vue\";\nimport IconLightCross from \"@/icons/IconLightCross.vue\";\nimport { IconCross, IconInfoRounded, IconCheckInCircle } from \"@/icons\";\n\nconst { snackQueue } = useSnackBar();\n\nconst getToastIcon = (toastType: string) => {\n switch (toastType) {\n case \"success\":\n return IconCheckInCircle;\n case \"danger\":\n return IconCross;\n case \"info\":\n return IconInfoRounded;\n default:\n return IconCheckInCircle;\n }\n};\n\nconst getContainerSize = computed(() => {\n const lastToast = snackQueue.value[snackQueue.value.length - 1];\n if (!lastToast) return \"side70\";\n switch (lastToast.toastContainerSize) {\n case \"half\":\n return \"half\";\n case \"full\":\n return \"full\";\n default:\n return \"side70\";\n }\n});\n\nconst closeToast = (index: number) => {\n snackQueue.value.splice(index, 1);\n};\n</script>\n\n<style>\n@keyframes fade-in-right {\n 0% {\n opacity: 0;\n transform: translateX(100%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.freddy-plugins-snackbar-container {\n position: fixed;\n right: 1.25rem; /* 20px */\n bottom: 0.5rem; /* 8px */\n padding-bottom: 17px;\n z-index: 50;\n}\n\n.freddy-plugins-snackbar-container--side70 {\n width: 78%;\n}\n\n.freddy-plugins-snackbar-container--half {\n width: 50%;\n}\n\n.freddy-plugins-snackbar-container--full {\n width: 100%;\n padding-left: 2.5rem; /* 40px */\n}\n\n.freddy-plugins-snackbar {\n margin-top: 0.75rem; /* 12px */\n padding: 1rem; /* 16px */\n border-radius: 1.5rem; /* 24px */\n background-color: var(--text-900, var(--freddy-bg-primary));\n animation: fade-in-right 0.5s ease-out;\n}\n\n.freddy-plugins-snackbar--info {\n border: 2px solid var(--text-50, var(--text-inverse))fff;\n box-shadow: 0 0 0 1px var(--text-50, var(--text-inverse));\n}\n\n.freddy-plugins-snackbar--danger {\n border: 2px solid var(--color-warning-500, var(--freddy-warning-color));\n box-shadow: 0 0 0 1px var(--color-warning-500, var(--freddy-warning-color));\n}\n\n.freddy-plugins-snackbar--success {\n border: 2px solid var(--color-success-500, var(--freddy-success-color));\n box-shadow: 0 0 0 1px var(--color-success-500, var(--freddy-success-color));\n}\n\n.freddy-plugins-snackbar-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n}\n\n.freddy-plugins-snackbar-left {\n display: flex;\n gap: 1rem; /* 16px */\n}\n\n.freddy-plugins-snackbar-icon {\n height: 16px; /* 32px */\n width: 16px;\n stroke-width: 2;\n color: var(--text-50, var(--text-inverse))fff;\n border-radius: 9999px;\n padding: 0.25rem; /* 4px */\n border: 4px solid transparent;\n box-sizing: content-box;\n}\n\n.freddy-plugins-snackbar-icon--info {\n border-color: var(--text-50, var(--text-inverse))fff33;\n background-color: var(--text-50, var(--text-inverse))fff17;\n}\n\n.freddy-plugins-snackbar-icon--danger {\n border-color: var(--color-warning-500, var(--freddy-warning-color));\n background-color: var(--color-warning-500, var(--freddy-warning-color));\n}\n\n.freddy-plugins-snackbar-icon--success {\n border-color: var(--color-success-500, var(--freddy-success-color));\n background-color: var(--color-success-400, var(--freddy-success-color));\n}\n\n.freddy-plugins-snackbar-text {\n display: flex;\n flex-direction: column;\n gap: 0.375rem; /* 6px */\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-title {\n font-size: 0.875rem; /* 14px */\n font-weight: 600;\n margin: 0;\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-message {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: normal;\n margin: 0;\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-close-btn {\n position: absolute;\n right: 0.5rem;\n top: 0;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.freddy-plugins-snackbar-close-icon {\n height: 10px; /* 16px */\n width: 10px;\n stroke-width: 1.67;\n color: white;\n}\n</style>\n","<template>\n <div\n class=\"freddy-plugins-switch-slot\"\n :class=\"{\n 'freddy-plugins-switch-slot--bordered': variant === 'bordered',\n 'freddy-plugins-switch-slot--disabled': disabled,\n }\"\n >\n <!-- Header row with label/tooltip and switch -->\n <div class=\"freddy-plugins-switch-slot__header\">\n <div v-if=\"label || tooltip\" class=\"freddy-plugins-switch-slot__label-section\">\n <span v-if=\"label\" class=\"freddy-plugins-switch-slot__label\">{{ label }}</span>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <IconInfoRounded class=\"freddy-plugins-switch-slot__tooltip-icon\" />\n </Tooltip>\n </div>\n\n <!-- Switch control -->\n <button\n class=\"freddy-plugins-switch-slot__switch\"\n :class=\"{ 'freddy-plugins-switch-slot__switch--on': modelValue }\"\n :aria-checked=\"modelValue\"\n role=\"switch\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleToggle\"\n @keydown.space.prevent=\"handleToggle\"\n @keydown.enter.prevent=\"handleToggle\"\n :disabled=\"disabled\"\n >\n <span class=\"freddy-plugins-switch-slot__track\"></span>\n <span class=\"freddy-plugins-switch-slot__thumb\"></span>\n </button>\n </div>\n\n <!-- Slot content section (appears when showSlotContent is true) -->\n <div v-if=\"showSlotContent\" class=\"freddy-plugins-switch-slot__content\">\n <slot name=\"content\" />\n </div>\n\n <!-- Hint text -->\n <p v-if=\"hint\" class=\"freddy-plugins-switch-slot__hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import IconInfoRounded from '@/icons/IconInfoRounded.vue';\n import Tooltip from './Tooltip.vue';\n import type {\n SwitchSlotProps,\n SwitchSlotEmits,\n } from '@/interfaces/switch-slot.interfaces';\n\n const props = defineProps<SwitchSlotProps>();\n\n const emit = defineEmits<SwitchSlotEmits>();\n\n const handleToggle = (event: Event) => {\n event.stopPropagation();\n if (!props.disabled) {\n emit('update:modelValue', !props.modelValue);\n }\n };\n</script>\n\n<style scoped>\n .freddy-plugins-switch-slot {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n }\n\n .freddy-plugins-switch-slot--bordered {\n border: 1px solid var(--colors-border-border-secondary, #35414b);\n border-radius: 8px;\n padding: 6px;\n }\n\n .freddy-plugins-switch-slot--disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .freddy-plugins-switch-slot__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .freddy-plugins-switch-slot__label-section {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .freddy-plugins-switch-slot__label {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n }\n\n .freddy-plugins-switch-slot__tooltip-icon {\n width: 16px;\n height: 16px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n cursor: pointer;\n }\n\n .freddy-plugins-switch-slot__switch {\n position: relative;\n width: 56px;\n height: 30px;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n outline: none;\n display: inline-flex;\n align-items: center;\n transition: opacity 0.2s;\n }\n\n .freddy-plugins-switch-slot__switch:focus-visible {\n outline: 2px solid var(--colors-texts-text-action, #7ba8ef);\n outline-offset: 2px;\n }\n\n .freddy-plugins-switch-slot__switch:disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-switch-slot__track {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background: var(--colors-background-bg-transparent-grey, #555555);\n border-radius: 100px;\n transition: background 0.2s;\n }\n\n .freddy-plugins-switch-slot__switch--on .freddy-plugins-switch-slot__track {\n background: var(--colors-texts-text-action, #7ba8ef);\n }\n\n .freddy-plugins-switch-slot__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 26px;\n height: 26px;\n background: #ffffff;\n border-radius: 50%;\n transition: left 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-switch-slot__switch--on .freddy-plugins-switch-slot__thumb {\n left: 28px;\n }\n\n .freddy-plugins-switch-slot__content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n gap: 8px;\n }\n\n .freddy-plugins-switch-slot__hint {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n margin: 0;\n }\n</style>\n","<template>\n <div class=\"freddy-plugin-nav-bar\">\n <button\n class=\"freddy-plugin-menu-button\"\n v-for=\"(tab, index) in tabList\"\n :key=\"index\"\n @click=\"handleTabSwitch(tab)\"\n >\n {{ tab.title }}\n <span\n :class=\"{ 'freddy-plugin-active-tab': activeTab === tab.id }\"\n ></span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { ref } from 'vue';\n import type { ITabList, IMenuListItem } from '@/interfaces';\n\n // props and emits\n const props = withDefaults(defineProps<ITabList>(), {\n currentTab: 0,\n });\n const emits = defineEmits(['tabSwitch']);\n\n // variables\n const activeTab = ref<number>(props.currentTab);\n\n // click event\n const handleTabSwitch = (tab: IMenuListItem): void => {\n if (activeTab.value === tab.id) return;\n activeTab.value = tab.id;\n emits('tabSwitch', tab.id);\n };\n</script>\n\n<style lang=\"css\">\n .freddy-plugin-nav-bar {\n display: flex;\n width: 100%;\n gap: 24px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.09); /* #FFFFFF17 */\n padding-right: 10px; /* pr-2.5 = 2.5 * 4px */\n font-family: 'Inter', sans-serif;\n font-size: 0.875rem; /* text-sm = 14px */\n font-weight: 600; /* font-semibold */\n }\n\n .freddy-plugin-menu-button {\n all: unset; /* unset-all */\n display: flex;\n flex-direction: column;\n padding-top: 8px; /* pt-2 = 0.5rem = 8px */\n cursor: pointer;\n }\n\n .freddy-plugin-active-tab {\n width: 100%;\n background-color: #fff;\n height: 2px; /* h-0.5 = 0.125rem = 2px */\n border-top-left-radius: 0.375rem; /* rounded-t-md */\n border-top-right-radius: 0.375rem;\n }\n</style>\n","<template>\n <div\n :class=\"[\n 'freddy-plugin-nav-bar',\n `freddy-plugin-nav-bar--${orientation}`,\n `freddy-plugin-nav-bar--${computedActiveStateType}`,\n { 'freddy-plugin-nav-bar--full-width': props.fullWidth },\n ]\"\n >\n <button\n :class=\"[\n 'freddy-plugin-menu-button',\n `freddy-plugin-menu-button--${computedActiveStateType}`,\n { 'freddy-plugin-menu-button--active': activeTab === tab.id },\n { 'freddy-plugin-menu-button--full-width': props.fullWidth },\n ]\"\n v-for=\"(tab, index) in props.tabList\"\n :key=\"index\"\n @click=\"handleTabSwitch(tab)\"\n :aria-selected=\"activeTab === tab.id\"\n role=\"tab\"\n tabindex=\"0\"\n @keydown.enter=\"handleTabSwitch(tab)\"\n @keydown.space.prevent=\"handleTabSwitch(tab)\"\n >\n <span class=\"freddy-plugin-menu-button-label\">{{ tab.title }}</span>\n <span\n v-if=\"tab.badge !== undefined\"\n class=\"freddy-plugin-menu-button-badge\"\n >\n {{ tab.badge }}\n </span>\n <span\n v-if=\"computedActiveStateType === 'bottom-dash' && activeTab === tab.id\"\n :class=\"{ 'freddy-plugin-active-tab-bottom': activeTab === tab.id }\"\n ></span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { ref, watch, computed } from 'vue';\n import type { ITabList, IMenuListItem } from '@/interfaces';\n\n // props and emits\n const props = withDefaults(defineProps<ITabList>(), {\n currentTab: 0,\n activeStateType: 'bottom-dash',\n orientation: 'horizontal',\n fullWidth: false,\n });\n const emits = defineEmits(['tabSwitch']);\n\n // computed properties\n const activeStateType = computed(\n () => props.activeStateType || 'bottom-dash'\n );\n const orientation = computed(() => props.orientation || 'horizontal');\n\n // Auto-convert bottom-dash to left-dash for vertical orientation\n const computedActiveStateType = computed(() => {\n const currentOrientation = orientation.value;\n const currentStateType = activeStateType.value;\n\n // If vertical and bottom-dash, convert to left-dash\n if (\n currentOrientation === 'vertical' &&\n currentStateType === 'bottom-dash'\n ) {\n return 'left-dash';\n }\n\n // Map new activeStateType values to existing CSS class names\n const stateTypeMap: Record<string, string> = {\n 'bottom-dash': 'bottom-dash',\n 'bg-primary-active': 'background-21404F8F',\n 'primary-active': 'background-031525',\n 'bg-primary-active-bordered': 'background-border',\n };\n\n return stateTypeMap[currentStateType] || currentStateType;\n });\n\n // variables\n const activeTab = ref<number>(props.currentTab);\n\n // watch for prop changes\n watch(\n () => props.currentTab,\n newValue => {\n activeTab.value = newValue;\n }\n );\n\n // click event\n const handleTabSwitch = (tab: IMenuListItem): void => {\n if (activeTab.value === tab.id) return;\n activeTab.value = tab.id;\n emits('tabSwitch', tab.id);\n };\n</script>\n\n<style lang=\"css\">\n .freddy-plugin-nav-bar {\n display: flex;\n width: 100%;\n gap: 24px;\n font-family: 'Inter', sans-serif;\n font-size: 0.875rem; /* text-sm = 14px */\n font-weight: 600; /* font-semibold */\n }\n\n /* Horizontal orientation (default) */\n .freddy-plugin-nav-bar--horizontal {\n flex-direction: row;\n border-bottom: 1px solid #22262f;\n padding-right: 10px; /* pr-2.5 = 2.5 * 4px */\n }\n\n /* Vertical orientation */\n .freddy-plugin-nav-bar--vertical {\n flex-direction: column !important;\n gap: 8px;\n border-bottom: none;\n padding-right: 0;\n width: auto;\n }\n\n .freddy-plugin-nav-bar--vertical .freddy-plugin-menu-button {\n width: 100%;\n }\n\n .freddy-plugin-menu-button {\n all: unset; /* unset-all */\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n position: relative;\n transition: all 0.2s ease;\n color: var(--freddy-text-tertiary, #cbd6e3);\n outline: none;\n }\n\n .freddy-plugin-menu-button:focus-visible {\n outline: 2px solid var(--text-action, #7babef);\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .freddy-plugin-menu-button:focus:not(:focus-visible) {\n outline: none;\n }\n\n .freddy-plugin-menu-button-label {\n white-space: nowrap;\n }\n\n .freddy-plugin-menu-button-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--component-colors-utility-gray-blue-100, #eaecf5);\n border: 1px solid var(--text-gray, #717680);\n border-radius: 6px;\n padding: 2px 6px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n color: var(--freddy-text-secondary, #9597a7);\n min-width: 20px;\n text-align: center;\n flex-shrink: 0;\n }\n\n /* Bottom Dash Style (Horizontal) */\n .freddy-plugin-nav-bar--bottom-dash {\n border-bottom: 1px solid #22262f;\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 4px 4px 12px 4px;\n }\n\n .freddy-plugin-active-tab-bottom {\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n width: 100%;\n background-color: #9597a7;\n height: 2px; /* h-0.5 = 0.125rem = 2px */\n border-top-left-radius: 0.375rem; /* rounded-t-md */\n border-top-right-radius: 0.375rem;\n }\n\n /* For text-width underlines (not full-width), ensure underline matches content */\n .freddy-plugin-nav-bar--bottom-dash:not(.freddy-plugin-nav-bar--full-width)\n .freddy-plugin-menu-button {\n width: auto;\n }\n\n /* Text-width underline should match content area (excluding padding) */\n .freddy-plugin-nav-bar--bottom-dash:not(.freddy-plugin-nav-bar--full-width)\n .freddy-plugin-active-tab-bottom {\n left: 4px;\n right: 4px;\n width: auto;\n }\n\n /* Full width styles */\n .freddy-plugin-nav-bar--full-width {\n width: 100%;\n }\n\n .freddy-plugin-nav-bar--full-width .freddy-plugin-menu-button {\n flex: 1;\n justify-content: center;\n min-width: 0; /* Allow flex items to shrink below content size */\n }\n\n .freddy-plugin-nav-bar--full-width .freddy-plugin-active-tab-bottom {\n width: 100%;\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button--active {\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--bottom-dash\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n .freddy-plugin-nav-bar--bottom-dash\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Left Dash Style (Vertical) */\n .freddy-plugin-nav-bar--left-dash {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 2px 12px;\n height: 24px;\n border-left: 2px solid transparent;\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button--active {\n border-left: 2px solid #9597a7;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--left-dash\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n .freddy-plugin-nav-bar--left-dash\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Background Border Style */\n .freddy-plugin-nav-bar--background-border .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 36px;\n background: transparent;\n border: 1px solid transparent;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-border {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-border .freddy-plugin-menu-button--active {\n background: var(--freddy-bg-primary-hover, rgba(42, 57, 71, 0.73));\n border: 1px solid var(--text-gray, #717680);\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-border\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-border\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Background 031525 Style (Vertical) */\n .freddy-plugin-nav-bar--background-031525 {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-031525 {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-031525 .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 44px;\n background: transparent;\n border: none;\n }\n\n .freddy-plugin-nav-bar--background-031525 .freddy-plugin-menu-button--active {\n background: #031525;\n border: none;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-tertiary, #cbd6e3);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n /* Background 21404F8F Style (Vertical) */\n .freddy-plugin-nav-bar--background-21404F8F {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-21404F8F {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-21404F8F .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 44px;\n background: transparent;\n border: none;\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active {\n background: rgba(33, 64, 79, 0.561);\n border: none;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-tertiary, #cbd6e3);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n /* Hover states */\n .freddy-plugin-menu-button:hover:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-primary, #ffffff);\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-toast-wrapper\">\n <div\n v-for=\"(toast, index) in toastQueue\"\n :key=\"index\"\n :class=\"['freddy-plugins-toast-item', getToastClass(toast.toastType)]\"\n >\n <div class=\"freddy-plugins-toast-icon-wrapper\">\n <component :is=\"getToastIcon(toast.toastType)\" class=\"freddy-plugins-toast-icon\" />\n </div>\n\n <span class=\"freddy-plugins-toast-message\">\n {{ toast.message }}\n </span>\n\n <button class=\"freddy-plugins-toast-close-button\" @click=\"closeToast(index)\">\n <IconCross class=\"freddy-plugins-toast-close-icon\" />\n </button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useToast } from \"@/utility/useToast\";\nimport { IconTick, IconInfoRounded, IconCross } from \"@/icons\";\n\nconst { toastQueue } = useToast();\n\ntype ToastType = \"success\" | \"danger\" | \"info\";\n\nconst toastTypeMap: Record<ToastType, string> = {\n success: \"freddy-plugins-toast-success\",\n danger: \"freddy-plugins-toast-danger\",\n info: \"freddy-plugins-toast-info\",\n};\n\nconst getToastClass = (toastType: ToastType): string => toastTypeMap[toastType];\n\nconst getToastIcon = (toastType: string) => {\n switch (toastType) {\n case \"success\":\n return IconTick;\n case \"danger\":\n return IconCross;\n case \"info\":\n return IconInfoRounded;\n default:\n return IconTick;\n }\n};\n\nconst closeToast = (index: number) => {\n toastQueue.value.splice(index, 1);\n};\n</script>\n\n<style>\n.freddy-plugins-toast-wrapper {\n position: fixed;\n right: 10px;\n bottom: 10px;\n display: flex;\n flex-direction: column;\n gap: 0.5rem; /* 2px spacing (Tailwind space-y-2) */\n}\n\n.freddy-plugins-toast-item {\n display: flex;\n align-items: center;\n padding: 0.625rem; /* Tailwind p-2.5 */\n gap: 0.625rem; /* Tailwind gap-2.5 */\n border-radius: 10px;\n box-shadow: 0 1px 3px var(--border-light);\n animation: fadeIn 0.3s ease;\n}\n\n.freddy-plugins-toast-success {\n background-color: var(--color-success-500, var(--freddy-success-color));\n --toast-icon-color: var(--color-success-500, var(--freddy-success-color));\n}\n\n.freddy-plugins-toast-danger {\n background-color: var(--color-destructive-500, var(--freddy-error-color));\n --toast-icon-color: var(--color-destructive-500, var(--freddy-error-color));\n}\n\n.freddy-plugins-toast-info {\n background-color: var(--color-primary-500, var(--freddy-primary-color));\n --toast-icon-color: var(--color-primary-500, var(--freddy-primary-color));\n}\n\n.freddy-plugins-toast-icon-wrapper {\n width: 1.25rem; /* Tailwind w-5 */\n height: 1.25rem; /* Tailwind h-5 */\n background-color: var(--freddy-bg-secondary);\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.freddy-plugins-toast-icon {\n width: 100%;\n height: 100%;\n padding: 0.25rem; /* Tailwind p-1 */\n color: var(--toast-icon-color);\n}\n\n.freddy-plugins-toast-message {\n min-width: 16rem; /* Tailwind min-w-64 */\n max-width: 420px; /* Tailwind max-w-[420px] */\n flex: 1 1 auto; /* Tailwind flex-1 */\n font-size: 1rem; /* Tailwind text-[16px] */\n font-weight: 500; /* Tailwind font-medium */\n color: white;\n}\n\n.freddy-plugins-toast-close-button {\n width: 1rem; /* Tailwind w-4 */\n height: 1rem; /* Tailwind h-4 */\n background: transparent;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.freddy-plugins-toast-close-icon {\n width: 100%;\n height: 100%;\n padding: 0.125rem; /* Tailwind p-0.5 */\n color: white;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n</style>\n","<template>\n <div\n ref=\"tooltipWrapper\"\n class=\"freddy-plugins-tooltip-v2-wrapper\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @focusin=\"handleFocusIn\"\n @focusout=\"handleFocusOut\"\n tabindex=\"0\"\n >\n <slot />\n <transition name=\"fade\">\n <div\n v-if=\"show\"\n class=\"freddy-plugins-tooltip-v2-content\"\n :class=\"[\n placement,\n shouldShowBelow ? 'force-bottom' : '',\n contentClass,\n ]\"\n role=\"tooltip\"\n :aria-label=\"text\"\n >\n <slot name=\"content\">\n <span v-if=\"html\" v-html=\"text\"></span>\n <span v-else>{{ text }}</span>\n </slot>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n interface TooltipV2Props {\n /** The text content to display in the tooltip */\n text?: string;\n /** The placement of the tooltip relative to the trigger element */\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Whether to render the text as HTML */\n html?: boolean;\n /** Custom CSS class to apply to the tooltip content */\n contentClass?: string;\n /** Delay before showing the tooltip (in milliseconds) */\n delay?: number;\n /** Delay before hiding the tooltip (in milliseconds) */\n hideDelay?: number;\n }\n\n const props = withDefaults(defineProps<TooltipV2Props>(), {\n placement: 'top',\n delay: 200,\n hideDelay: 0,\n html: false,\n });\n\n const show = ref(false);\n const shouldShowBelow = ref(false);\n const tooltipWrapper = ref<HTMLElement | null>(null);\n let showTimeout: ReturnType<typeof setTimeout> | null = null;\n let hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const handleMouseEnter = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n if (showTimeout) clearTimeout(showTimeout);\n showTimeout = setTimeout(() => {\n // Check if there's enough space above the element\n if (tooltipWrapper.value) {\n const rect = tooltipWrapper.value.getBoundingClientRect();\n shouldShowBelow.value = rect.top < 150; // If less than 150px from top, show below\n }\n show.value = true;\n }, props.delay);\n };\n\n const handleMouseLeave = () => {\n if (showTimeout) {\n clearTimeout(showTimeout);\n showTimeout = null;\n }\n hideTimeout = setTimeout(() => {\n show.value = false;\n }, props.hideDelay);\n };\n\n const handleFocusIn = () => {\n handleMouseEnter();\n };\n\n const handleFocusOut = () => {\n handleMouseLeave();\n };\n</script>\n\n<style scoped>\n .freddy-plugins-tooltip-v2-wrapper {\n display: inline-block;\n position: relative;\n }\n\n .freddy-plugins-tooltip-v2-content {\n position: absolute;\n z-index: 1000;\n background-color: var(--freddy-bg-secondary);\n color: var(--freddy-text-primary);\n font-size: var(--freddy-font-size-sm);\n padding: var(--freddy-spacing-sm) var(--freddy-spacing-md);\n border-radius: var(--freddy-radius-md);\n border: 1px solid var(--freddy-border-secondary);\n box-shadow: var(--freddy-shadow-lg);\n white-space: normal;\n max-width: 300px;\n min-width: 120px;\n pointer-events: none;\n line-height: 1.4;\n word-wrap: break-word;\n word-break: break-word;\n left: 50%;\n transform: translateX(-50%);\n bottom: calc(100% + 8px);\n }\n\n .freddy-plugins-tooltip-v2-content.bottom {\n top: calc(100% + 8px);\n bottom: auto;\n }\n\n .freddy-plugins-tooltip-v2-content.left {\n left: auto;\n right: calc(100% + 8px);\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n }\n\n .freddy-plugins-tooltip-v2-content.right {\n left: calc(100% + 8px);\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n }\n\n .freddy-plugins-tooltip-v2-content.force-bottom {\n top: calc(100% + 8px);\n bottom: auto;\n }\n\n .fade-enter-active,\n .fade-leave-active {\n transition: opacity 0.15s ease-in-out;\n }\n\n .fade-enter-from,\n .fade-leave-to {\n opacity: 0;\n }\n</style>\n","import { ref, computed } from 'vue';\n\nexport interface ErrorDetails {\n message: string;\n code?: string | number;\n stack?: string;\n timestamp: string;\n context?: Record<string, unknown>;\n}\n\nexport interface UseErrorHandlerOptions {\n logErrors?: boolean;\n throwOnCritical?: boolean;\n maxRetries?: number;\n}\n\n/**\n * Composable for centralized error handling\n */\nexport function useErrorHandler(options: UseErrorHandlerOptions = {}) {\n const {\n logErrors = true,\n throwOnCritical = false,\n maxRetries = 3\n } = options;\n\n const errors = ref<ErrorDetails[]>([]);\n const isLoading = ref(false);\n const retryCount = ref(0);\n\n const hasErrors = computed(() => errors.value.length > 0);\n const latestError = computed(() => errors.value[errors.value.length - 1] || null);\n\n /**\n * Handle an error with enhanced context\n */\n const handleError = (\n error: unknown,\n context?: Record<string, unknown>\n ): ErrorDetails => {\n const errorDetails: ErrorDetails = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n context: {\n ...context,\n retryCount: retryCount.value,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Unknown'\n }\n };\n\n // Add HTTP status code if available\n if (error && typeof error === 'object' && 'status' in error) {\n errorDetails.code = (error as { status: number }).status;\n }\n\n errors.value.push(errorDetails);\n\n // Log in development\n if (logErrors && process.env.NODE_ENV === 'development') {\n // Error logging - implement proper error reporting in production\n // Error: error, Context: context, Details: errorDetails\n }\n\n // Throw critical errors if configured\n if (throwOnCritical && isCriticalError(error)) {\n throw error;\n }\n\n return errorDetails;\n };\n\n /**\n * Handle async operations with error catching\n */\n const handleAsync = async <T>(\n operation: () => Promise<T>,\n context?: Record<string, unknown>\n ): Promise<{ data: T | null; error: ErrorDetails | null }> => {\n isLoading.value = true;\n \n try {\n const data = await operation();\n retryCount.value = 0; // Reset on success\n return { data, error: null };\n } catch (error) {\n const errorDetails = handleError(error, context);\n return { data: null, error: errorDetails };\n } finally {\n isLoading.value = false;\n }\n };\n\n /**\n * Retry an async operation with exponential backoff\n */\n const retryAsync = async <T>(\n operation: () => Promise<T>,\n context?: Record<string, unknown>\n ): Promise<{ data: T | null; error: ErrorDetails | null }> => {\n let lastError: ErrorDetails | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n retryCount.value = attempt - 1;\n \n const result = await handleAsync(operation, {\n ...context,\n attempt,\n maxRetries\n });\n\n if (result.data !== null) {\n return result;\n }\n\n lastError = result.error;\n\n // Don't retry on client errors (4xx)\n if (lastError?.code && typeof lastError.code === 'number' && \n lastError.code >= 400 && lastError.code < 500) {\n break;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < maxRetries) {\n await new Promise(resolve => \n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n\n return { data: null, error: lastError };\n };\n\n /**\n * Clear all errors\n */\n const clearErrors = () => {\n errors.value = [];\n retryCount.value = 0;\n };\n\n /**\n * Clear specific error by index\n */\n const clearError = (index: number) => {\n if (index >= 0 && index < errors.value.length) {\n errors.value.splice(index, 1);\n }\n };\n\n /**\n * Check if error is critical (should stop execution)\n */\n const isCriticalError = (error: unknown): boolean => {\n if (error instanceof Error) {\n // Network errors are usually not critical\n if (error.name === 'NetworkError' || error.name === 'TypeError') {\n return false;\n }\n \n // Syntax errors are critical\n if (error.name === 'SyntaxError') {\n return true;\n }\n }\n\n // HTTP 5xx errors are critical\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n return status >= 500;\n }\n\n return false;\n };\n\n return {\n // State\n errors: computed(() => errors.value),\n hasErrors,\n latestError,\n isLoading: computed(() => isLoading.value),\n retryCount: computed(() => retryCount.value),\n\n // Methods\n handleError,\n handleAsync,\n retryAsync,\n clearErrors,\n clearError,\n isCriticalError\n };\n}\n","import { ref, computed, onMounted, nextTick } from 'vue';\n\nexport interface PerformanceMetrics {\n renderTime: number;\n componentCount: number;\n memoryUsage?: number;\n timestamp: string;\n}\n\nexport interface UsePerformanceOptions {\n enableMetrics?: boolean;\n trackMemory?: boolean;\n sampleRate?: number; // 0-1, percentage of operations to track\n}\n\n/**\n * Composable for performance monitoring and optimization\n */\nexport function usePerformance(options: UsePerformanceOptions = {}) {\n const {\n enableMetrics = process.env.NODE_ENV === 'development',\n trackMemory = false,\n sampleRate = 0.1\n } = options;\n\n const metrics = ref<PerformanceMetrics[]>([]);\n const isTracking = ref(false);\n const startTime = ref(0);\n\n const averageRenderTime = computed(() => {\n if (metrics.value.length === 0) return 0;\n const total = metrics.value.reduce((sum, m) => sum + m.renderTime, 0);\n return total / metrics.value.length;\n });\n\n const maxRenderTime = computed(() => {\n if (metrics.value.length === 0) return 0;\n return Math.max(...metrics.value.map(m => m.renderTime));\n });\n\n /**\n * Start performance tracking\n */\n const startTracking = (label?: string) => {\n if (!enableMetrics || Math.random() > sampleRate) return;\n \n isTracking.value = true;\n startTime.value = performance.now();\n \n if (label && process.env.NODE_ENV === 'development') {\n }\n };\n\n /**\n * End performance tracking and record metrics\n */\n const endTracking = (label?: string, componentCount = 1) => {\n if (!isTracking.value || !enableMetrics) return;\n \n const endTime = performance.now();\n const renderTime = endTime - startTime.value;\n \n const metric: PerformanceMetrics = {\n renderTime,\n componentCount,\n timestamp: new Date().toISOString()\n };\n\n // Add memory usage if tracking is enabled\n if (trackMemory && 'memory' in performance) {\n const memory = (performance as any).memory;\n metric.memoryUsage = memory.usedJSHeapSize;\n }\n\n metrics.value.push(metric);\n \n // Keep only last 100 metrics to prevent memory leaks\n if (metrics.value.length > 100) {\n metrics.value.shift();\n }\n\n isTracking.value = false;\n \n if (label && process.env.NODE_ENV === 'development') {\n \n // Warn about slow renders\n if (renderTime > 16) { // 60fps threshold\n // Slow render detected - implement performance monitoring in production\n }\n }\n\n return metric;\n };\n\n /**\n * Measure async operation performance\n */\n const measureAsync = async <T>(\n operation: () => Promise<T>,\n label?: string\n ): Promise<{ result: T; metrics: PerformanceMetrics }> => {\n startTracking(label);\n \n try {\n const result = await operation();\n const metrics = endTracking(label) || {\n renderTime: 0,\n componentCount: 1,\n timestamp: new Date().toISOString()\n };\n \n return { result, metrics };\n } catch (error) {\n endTracking(label);\n throw error;\n }\n };\n\n /**\n * Debounce function for performance optimization\n */\n const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n ): ((...args: Parameters<T>) => void) => {\n let timeout: ReturnType<typeof setTimeout>;\n \n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n };\n\n /**\n * Throttle function for performance optimization\n */\n const throttle = <T extends (...args: any[]) => any>(\n func: T,\n limit: number\n ): ((...args: Parameters<T>) => void) => {\n let inThrottle: boolean;\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n };\n\n /**\n * Optimize heavy computations with requestIdleCallback\n */\n const scheduleWork = (callback: () => void, timeout = 5000) => {\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(callback, { timeout });\n } else {\n // Fallback for browsers without requestIdleCallback\n setTimeout(callback, 0);\n }\n };\n\n /**\n * Lazy load components or data\n */\n const lazyLoad = async <T>(\n loader: () => Promise<T>,\n delay = 0\n ): Promise<T> => {\n if (delay > 0) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n \n return new Promise((resolve) => {\n scheduleWork(async () => {\n try {\n const result = await loader();\n resolve(result);\n } catch (error) {\n throw error;\n }\n });\n });\n };\n\n /**\n * Virtual scrolling helper for large lists\n */\n const createVirtualList = <T>(\n items: T[],\n itemHeight: number,\n containerHeight: number\n ) => {\n const visibleCount = Math.ceil(containerHeight / itemHeight);\n const buffer = Math.ceil(visibleCount * 0.5); // 50% buffer\n \n return (scrollTop: number) => {\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - buffer);\n const endIndex = Math.min(items.length, startIndex + visibleCount + buffer * 2);\n \n return {\n visibleItems: items.slice(startIndex, endIndex),\n startIndex,\n endIndex,\n totalHeight: items.length * itemHeight,\n offsetY: startIndex * itemHeight\n };\n };\n };\n\n /**\n * Clear all metrics\n */\n const clearMetrics = () => {\n metrics.value = [];\n };\n\n /**\n * Get performance summary\n */\n const getSummary = () => {\n return {\n totalMeasurements: metrics.value.length,\n averageRenderTime: averageRenderTime.value,\n maxRenderTime: maxRenderTime.value,\n recentMetrics: metrics.value.slice(-10)\n };\n };\n\n // Auto-track component lifecycle in development\n if (enableMetrics && process.env.NODE_ENV === 'development') {\n onMounted(() => {\n startTracking('Component Mount');\n nextTick(() => {\n endTracking('Component Mount');\n });\n });\n }\n\n return {\n // State\n metrics: computed(() => metrics.value),\n isTracking: computed(() => isTracking.value),\n averageRenderTime,\n maxRenderTime,\n\n // Performance tracking\n startTracking,\n endTracking,\n measureAsync,\n\n // Optimization utilities\n debounce,\n throttle,\n scheduleWork,\n lazyLoad,\n createVirtualList,\n\n // Management\n clearMetrics,\n getSummary\n };\n}\n"],"names":["IconStyleDirective","el","themeServicePlugin","app","useThemeService","DOMPurify","loadDOMPurify","SAFE_TAGS","SAFE_ATTRS","basicSanitize","html","sanitizeContent","content","vFrSanitize","binding","FreddyPlugin","components","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","__vite_glob_0_18","__vite_glob_0_19","__vite_glob_0_20","__vite_glob_0_21","__vite_glob_0_22","__vite_glob_0_23","__vite_glob_0_24","__vite_glob_0_25","__vite_glob_0_26","__vite_glob_0_27","__vite_glob_0_28","__vite_glob_0_29","__vite_glob_0_30","__vite_glob_0_31","__vite_glob_0_32","__vite_glob_0_33","__vite_glob_0_34","__vite_glob_0_35","__vite_glob_0_36","__vite_glob_0_37","__vite_glob_0_38","__vite_glob_0_39","__vite_glob_0_40","__vite_glob_0_41","__vite_glob_0_42","__vite_glob_0_43","__vite_glob_0_44","__vite_glob_0_45","__vite_glob_0_46","__vite_glob_0_47","__vite_glob_0_48","__vite_glob_0_49","__vite_glob_0_50","__vite_glob_0_51","__vite_glob_0_52","__vite_glob_0_53","__vite_glob_0_54","__vite_glob_0_55","__vite_glob_0_56","__vite_glob_0_57","__vite_glob_0_58","__vite_glob_0_59","__vite_glob_0_60","__vite_glob_0_61","__vite_glob_0_62","__vite_glob_0_63","__vite_glob_0_64","__vite_glob_0_65","__vite_glob_0_66","__vite_glob_0_67","__vite_glob_0_68","__vite_glob_0_69","__vite_glob_0_70","__vite_glob_0_71","__vite_glob_0_72","__vite_glob_0_73","__vite_glob_0_74","__vite_glob_0_75","__vite_glob_0_76","__vite_glob_0_77","__vite_glob_0_78","__vite_glob_0_79","__vite_glob_0_80","__vite_glob_0_81","__vite_glob_0_82","__vite_glob_0_83","__vite_glob_0_84","__vite_glob_0_85","__vite_glob_0_86","__vite_glob_0_87","__vite_glob_0_88","__vite_glob_0_89","__vite_glob_0_90","__vite_glob_0_91","__vite_glob_0_92","__vite_glob_0_93","__vite_glob_0_94","__vite_glob_0_95","__vite_glob_0_96","__vite_glob_0_97","__vite_glob_0_98","__vite_glob_0_99","__vite_glob_0_100","__vite_glob_0_101","__vite_glob_0_102","__vite_glob_0_103","__vite_glob_0_104","__vite_glob_0_105","__vite_glob_0_106","__vite_glob_0_107","__vite_glob_0_108","__vite_glob_0_109","__vite_glob_0_110","__vite_glob_0_111","__vite_glob_0_112","__vite_glob_0_113","__vite_glob_0_114","__vite_glob_0_115","__vite_glob_0_116","__vite_glob_0_117","__vite_glob_0_118","__vite_glob_0_119","__vite_glob_0_120","__vite_glob_0_121","__vite_glob_0_122","__vite_glob_0_123","__vite_glob_0_124","__vite_glob_0_125","__vite_glob_0_126","__vite_glob_0_127","__vite_glob_0_128","__vite_glob_0_129","__vite_glob_0_130","__vite_glob_0_131","__vite_glob_0_132","__vite_glob_0_133","__vite_glob_0_134","__vite_glob_0_135","__vite_glob_0_136","__vite_glob_0_137","__vite_glob_0_138","__vite_glob_0_139","__vite_glob_0_140","__vite_glob_0_141","__vite_glob_0_142","__vite_glob_0_143","__vite_glob_0_144","__vite_glob_0_145","path","component","name","_a","frSanitizePlugin","iconStylePlugin","_createElementBlock","_normalizeClass","customClass","customStyle","_createBlock","_Transition","isVisible","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","largeModel","_hoisted_3","_renderSlot","_ctx","_hoisted_4","_hoisted_5","currentProject","currentColorMode","useTheme","show","ref","shouldShowBelow","tooltipWrapper","showTimeout","open","rect","close","_createVNode","placement","contentClass","text","props","__props","iconComponents","defineAsyncComponent","n","LeftIconComponent","computed","RightIconComponent","emit","__emit","isHovered","buttonClasses","handleClick","event","handleLeftIconClick","handleRightIconClick","handleMouseEnter","handleMouseLeave","tooltip","Tooltip","tooltipPlacement","disabled","loading","iconOnly","label","_Fragment","loadingText","_toDisplayString","_resolveDynamicComponent","size","leftIcon","rightIcon","_hoisted_6","providerConfigs","IconGoogle","IconFacebook","IconApple","IconX","IconFigma","IconDribbble","containerClasses","getProviderIcon","provider","getProviderLabel","getButtonClasses","style","_renderList","providers","$event","theme","highlighted","highlighter","createHighlighter","loadShiki","supportedLangs","highlightCode","watch","onMounted","onChange","target","isChecked","blueCheckbox","ariaLabel","isDashInput","textareaRef","localContent","newValue","handleInput","diffContent","originalWords","improvedWords","diffHtml","removedText","word","addedText","__expose","showDiff","placeholder","toggle","modelValue","searchQuery","selected","localOptions","shallowRef","newOptions","initializeSelected","def","opt","displayLabel","iconToShow","IconChevronUp","IconChevronDown","toggleDropdown","closeDropdown","filteredOptions","option","handleOptionClick","selectOption","handleToggle","val","idx","o","onClickOutside","BaseButton","chevronRight","showIcon","openUp","searchable","searchPlaceholder","optionIconRight","showShortcut","Switch","_hoisted_7","brand","error","resendCooldown","codeDigits","inputRefs","isCodeComplete","digit","verificationCode","handleDigitInput","index","value","nextTick","handleKeydown","handlePaste","pastedData","digits","nextEmptyIndex","focusIndex","handleSubmit","handleResend","_unref","_cache","email","_","_vModelText","_hoisted_8","_hoisted_9","_hoisted_10","inputId","focusInput","colorStyle","required","hintText","inputRef","baseInputRef","rawValue","displayValue","detectedCardType","baseProps","resolveIcon","iconName","__variableDynamicImportRuntimeHelper","resolvedTrailingIcon","cardNumberMaxLength","inputClasses","detectCardType","number","cleanNumber","formatCardNumber","cleanValue","getCardTypeIcon","cardType","icons","handleCardInput","inputValue","newCardType","handleCardKeydown","handleFocus","handleBlur","handleTrailingIconClick","focus","BaseInput","_mergeProps","showCardIcon","readonly","resolvedLeadingIcon","handleLeadingIconClick","inputType","trailingIcon","tooltipText","phoneNumberValue","showCountryDropdown","localCountryCode","defaultCountryOptions","countryOptions","selectedCountry","country","toggleCountryDropdown","selectCountry","currentNumber","newFormattedNumber","handlePhoneInput","fullNumber","handleClickOutside","newCode","onUnmounted","IconQuestion","variant","phoneProps","cardProps","defaultProps","handleUpdate","handleCountryCodeUpdate","code","handlePhoneNumberUpdate","handleCountryChange","handleCardNumberUpdate","handleCardTypeDetected","PhoneInput","CardInput","DefaultInput","_sfc_main","$props","ModalBox","height","emits","closeModal","clickOutside","headerClass","modalTitle","IconLightCross","attrs","useAttrs","searchInput","dropdownRef","handleClear","IconSearch","maxCharLimit","showLoaderForSearch","Spinner","showCloseButton","IconCross","selectedOption","isOpen","_b","modelPlaceholder","SearchInput","totalPages","pages","result","tp","cp","i","goToPage","page","active","$emit","IconSend","type","hasHeader","count","isDragging","sliderTrack","progressPercentage","range","thumbPosition","clampValue","stepped","calculateValueFromPosition","clientX","percentage","steppedValue","updateValue","clampedValue","handleMouseDown","handleMouseMove","e","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","handleTrackClick","handleKeyDown","showValue","IconInfoRounded","min","max","hint","snackQueue","useSnackBar","getToastIcon","toastType","IconCheckInCircle","getContainerSize","lastToast","closeToast","toast","showSlotContent","activeTab","handleTabSwitch","tab","tabList","activeStateType","orientation","computedActiveStateType","currentOrientation","currentStateType","_withKeys","_withModifiers","toastQueue","useToast","toastTypeMap","getToastClass","IconTick","hideTimeout","handleFocusIn","handleFocusOut","useErrorHandler","options","logErrors","throwOnCritical","maxRetries","errors","isLoading","retryCount","hasErrors","latestError","handleError","context","errorDetails","isCriticalError","handleAsync","operation","data","retryAsync","lastError","attempt","resolve","clearErrors","clearError","usePerformance","enableMetrics","trackMemory","sampleRate","metrics","isTracking","startTime","averageRenderTime","sum","m","maxRenderTime","startTracking","endTracking","componentCount","metric","memory","measureAsync","debounce","func","wait","timeout","args","throttle","limit","inThrottle","scheduleWork","callback","lazyLoad","loader","delay","createVirtualList","items","itemHeight","containerHeight","visibleCount","buffer","scrollTop","startIndex","endIndex","clearMetrics","getSummary"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/plugins/icon-style.ts","../src/plugins/theme-service.global.ts","../src/directives/frSanitize.ts","../src/plugin.ts","../src/plugins/index.ts","../src/animations/AnimeSpaceman.vue","../src/components/AdvancedModal.vue","../src/components/Tooltip.vue","../src/components/Buttons/BaseButton.vue","../src/components/Buttons/SocialButtons.vue","../src/components/CodeBlock.vue","../src/components/CustomCheckbox.vue","../src/components/DiffTextarea.vue","../src/components/Switch.vue","../src/components/Dropdown.vue","../src/components/EmailCodeVerification.vue","../src/components/InputField/BaseInput.vue","../src/components/InputField/CardInput.vue","../src/components/InputField/DefaultInput.vue","../src/components/InputField/PhoneInput.vue","../src/components/InputField/InputField.vue","../src/components/ModalBox.vue","../src/components/Instructions/InstructionsModal.vue","../src/components/Instructions/InstructiontextArea.vue","../src/components/ModalOverlay.vue","../src/components/Spinner.vue","../src/components/SearchInput.vue","../src/components/ModelDropdown.vue","../src/components/Pagination.vue","../src/components/SendButton.vue","../src/components/SkeletonLoader.vue","../src/components/Slider.vue","../src/components/SnackBar.vue","../src/components/SwitchSlot.vue","../src/components/TabList.vue","../src/components/Tabs/BaseTabButton.vue","../src/components/ToastMessage.vue","../src/components/TooltipV2.vue","../src/composables/useErrorHandler.ts","../src/composables/usePerformance.ts"],"sourcesContent":["// src/plugins/icon-style.ts\n\nimport type { Directive } from \"vue\";\n\nconst IconStyleDirective: Directive = {\n mounted(el: HTMLElement) {\n if (!el.getAttribute(\"class\")) {\n el.setAttribute(\"class\", \"base-fallback-style\");\n }\n },\n};\n\nexport default IconStyleDirective;\n","import type { App } from 'vue'\nimport { useThemeService } from '../services/ThemeService'\n\n// Global theme service plugin\nexport const themeServicePlugin = {\n install(app: App) {\n // Make theme service available globally\n app.config.globalProperties.$themeService = useThemeService()\n \n // Provide theme service to all components\n app.provide('themeService', useThemeService())\n \n // Add theme service to component properties\n app.config.globalProperties.$theme = useThemeService()\n }\n}\n\n// Auto-import helper for components\nexport const useGlobalTheme = () => {\n return useThemeService()\n}\n\n// Declare global properties for TypeScript\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties {\n $themeService: ReturnType<typeof useThemeService>\n $theme: ReturnType<typeof useThemeService>\n }\n} ","import type { DirectiveBinding } from \"vue\";\n\n// Optional dependency - handle gracefully if not installed\nlet DOMPurify: any = null;\n\n// Load DOMPurify asynchronously\nconst loadDOMPurify = async () => {\n try {\n const dompurifyModule = await import('dompurify');\n DOMPurify = dompurifyModule.default;\n } catch {\n // DOMPurify not available - will use basic sanitization\n }\n};\n\n// Load on module initialization\nloadDOMPurify();\n\nconst SAFE_TAGS = [\n \"a\",\n \"abbr\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"div\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"i\",\n \"img\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"th\",\n \"thead\",\n \"tr\",\n \"u\",\n \"ul\",\n];\n\nconst SAFE_ATTRS = [\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"width\",\n \"height\",\n \"align\",\n \"class\",\n \"id\",\n \"colspan\",\n \"rowspan\",\n];\n\n// Basic sanitization fallback\nconst basicSanitize = (html: string): string => {\n return html\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n .replace(/<iframe\\b[^<]*(?:(?!<\\/iframe>)<[^<]*)*<\\/iframe>/gi, '')\n .replace(/on\\w+=\"[^\"]*\"/gi, '')\n .replace(/javascript:/gi, '');\n};\n\nconst sanitizeContent = (content: string): string => {\n if (!DOMPurify) {\n return basicSanitize(content);\n }\n \n try {\n return DOMPurify.sanitize(content, {\n ALLOWED_TAGS: SAFE_TAGS,\n ALLOWED_ATTR: SAFE_ATTRS,\n USE_PROFILES: { html: true },\n });\n } catch {\n return basicSanitize(content);\n }\n};\n\nexport const vFrSanitize = {\n mounted(el: HTMLElement, binding: DirectiveBinding) {\n el.innerHTML = sanitizeContent(binding.value || \"\");\n },\n updated(el: HTMLElement, binding: DirectiveBinding) {\n el.innerHTML = sanitizeContent(binding.value || \"\");\n },\n};\n","// plugin.ts\nimport type { App } from 'vue';\nimport IconStyleDirective from './plugins/icon-style';\nimport { themeServicePlugin } from './plugins/theme-service.global';\nimport { vFrSanitize } from './directives/frSanitize';\n\nconst FreddyPlugin = {\n install(app: App) {\n // ✅ Register theme service plugin\n themeServicePlugin.install(app);\n\n // ✅ Register directives\n app.directive('icon-style', IconStyleDirective);\n app.directive('fr-sanitize', vFrSanitize);\n\n // ✅ Auto-register icon components\n const components = import.meta.glob('./icons/**/*.vue', {\n eager: true,\n });\n\n for (const path in components) {\n const component: any = components[path];\n const name =\n component.default.name || path.split('/').pop()?.replace('.vue', '')!;\n app.component(name, component.default);\n }\n },\n};\n\nexport default FreddyPlugin;\n","// src/plugins/index.ts\nimport type { App } from \"vue\";\nimport { vFrSanitize } from \"../directives/frSanitize\";\nimport IconStyleDirective from \"./icon-style\";\n\n// Plugin that installs fr-sanitize directive\nexport const frSanitizePlugin = {\n install(app: App) {\n app.directive(\"fr-sanitize\", vFrSanitize);\n },\n};\n\n// Plugin that installs icon-style directive\nexport const iconStylePlugin = {\n install(app: App) {\n app.directive(\"icon-style\", IconStyleDirective);\n },\n};\n\n// Combined plugin that installs both directives\nexport default {\n install(app: App) {\n frSanitizePlugin.install(app);\n iconStylePlugin.install(app);\n },\n};\n","<template>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 800 600\"\n class=\"spaceman-logo\"\n :class=\"customClass\"\n :style=\"customStyle\"\n >\n <g>\n <defs>\n <clipPath id=\"GlassClip\">\n <path\n d=\"M380.857,346.164c-1.247,4.651-4.668,8.421-9.196,10.06c-9.332,3.377-26.2,7.817-42.301,3.5\n s-28.485-16.599-34.877-24.192c-3.101-3.684-4.177-8.66-2.93-13.311l7.453-27.798c0.756-2.82,3.181-4.868,6.088-5.13\n c6.755-0.61,20.546-0.608,41.785,5.087s33.181,12.591,38.725,16.498c2.387,1.682,3.461,4.668,2.705,7.488L380.857,346.164z\"\n />\n </clipPath>\n <clipPath id=\"cordClip\">\n <rect width=\"800\" height=\"600\" />\n </clipPath>\n </defs>\n\n <g id=\"planet\">\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"572.859\"\n cy=\"108.803\"\n r=\"90.788\"\n />\n\n <circle\n id=\"craterBig\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"548.891\"\n cy=\"62.319\"\n r=\"13.074\"\n />\n\n <circle\n id=\"craterSmall\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n cx=\"591.743\"\n cy=\"158.918\"\n r=\"7.989\"\n />\n <path\n id=\"ring\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M476.562,101.461c-30.404,2.164-49.691,4.221-49.691,8.007c0,6.853,63.166,12.408,141.085,12.408s141.085-5.555,141.085-12.408\n c0-3.378-15.347-4.988-40.243-7.225\"\n />\n\n <path\n id=\"ringShadow\"\n opacity=\"0.5\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M483.985,127.43c23.462,1.531,52.515,2.436,83.972,2.436c36.069,0,68.978-1.19,93.922-3.149\"\n />\n </g>\n <g id=\"stars\">\n <g id=\"starsBig\">\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"518.07\"\n y1=\"245.375\"\n x2=\"518.07\"\n y2=\"266.581\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"508.129\"\n y1=\"255.978\"\n x2=\"528.01\"\n y2=\"255.978\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"154.55\"\n y1=\"231.391\"\n x2=\"154.55\"\n y2=\"252.598\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"144.609\"\n y1=\"241.995\"\n x2=\"164.49\"\n y2=\"241.995\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"320.135\"\n y1=\"132.746\"\n x2=\"320.135\"\n y2=\"153.952\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"310.194\"\n y1=\"143.349\"\n x2=\"330.075\"\n y2=\"143.349\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"200.67\"\n y1=\"483.11\"\n x2=\"200.67\"\n y2=\"504.316\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"210.611\"\n y1=\"493.713\"\n x2=\"190.73\"\n y2=\"493.713\"\n />\n </g>\n </g>\n <g id=\"starsSmall\">\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"432.173\"\n y1=\"380.52\"\n x2=\"432.173\"\n y2=\"391.83\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"426.871\"\n y1=\"386.175\"\n x2=\"437.474\"\n y2=\"386.175\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"489.555\"\n y1=\"299.765\"\n x2=\"489.555\"\n y2=\"308.124\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"485.636\"\n y1=\"303.945\"\n x2=\"493.473\"\n y2=\"303.945\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"231.468\"\n y1=\"291.009\"\n x2=\"231.468\"\n y2=\"299.369\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"227.55\"\n y1=\"295.189\"\n x2=\"235.387\"\n y2=\"295.189\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"244.032\"\n y1=\"547.539\"\n x2=\"244.032\"\n y2=\"555.898\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"247.95\"\n y1=\"551.719\"\n x2=\"240.113\"\n y2=\"551.719\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"186.359\"\n y1=\"406.967\"\n x2=\"186.359\"\n y2=\"415.326\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"190.277\"\n y1=\"411.146\"\n x2=\"182.44\"\n y2=\"411.146\"\n />\n </g>\n <g>\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"480.296\"\n y1=\"406.967\"\n x2=\"480.296\"\n y2=\"415.326\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"484.215\"\n y1=\"411.146\"\n x2=\"476.378\"\n y2=\"411.146\"\n />\n </g>\n </g>\n <g id=\"circlesBig\">\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"588.977\"\n cy=\"255.978\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"450.066\"\n cy=\"320.259\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"168.303\"\n cy=\"353.753\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"429.522\"\n cy=\"201.185\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"200.67\"\n cy=\"176.313\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"133.343\"\n cy=\"477.014\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"283.521\"\n cy=\"568.033\"\n r=\"7.952\"\n />\n\n <circle\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"413.618\"\n cy=\"482.387\"\n r=\"7.952\"\n />\n </g>\n <g id=\"circlesSmall\">\n <circle fill=\"#ffffff\" cx=\"549.879\" cy=\"296.402\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"253.29\" cy=\"229.24\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"434.824\" cy=\"263.931\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"183.708\" cy=\"544.176\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"382.515\" cy=\"530.923\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"130.693\" cy=\"305.608\" r=\"2.651\" />\n <circle fill=\"#ffffff\" cx=\"480.296\" cy=\"477.014\" r=\"2.651\" />\n </g>\n </g>\n <g id=\"spaceman\" clip-path=\"url(cordClip)\">\n <path\n id=\"cord\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M273.813,410.969c0,0-54.527,39.501-115.34,38.218c-2.28-0.048-4.926-0.241-7.841-0.548\n c-68.038-7.178-134.288-43.963-167.33-103.87c-0.908-1.646-1.793-3.3-2.654-4.964c-18.395-35.511-37.259-83.385-32.075-118.817\"\n />\n\n <path\n id=\"backpack\"\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M338.164,454.689l-64.726-17.353c-11.086-2.972-17.664-14.369-14.692-25.455l15.694-58.537\n c3.889-14.504,18.799-23.11,33.303-19.221l52.349,14.035c14.504,3.889,23.11,18.799,19.221,33.303l-15.694,58.537\n C360.647,451.083,349.251,457.661,338.164,454.689z\"\n />\n <g id=\"antenna\">\n <line\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"323.396\"\n y1=\"236.625\"\n x2=\"295.285\"\n y2=\"353.753\"\n />\n <circle\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"323.666\"\n cy=\"235.617\"\n r=\"6.375\"\n />\n </g>\n <g id=\"armR\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M360.633,363.039c1.352,1.061,4.91,5.056,5.824,6.634l27.874,47.634c3.855,6.649,1.59,15.164-5.059,19.02l0,0\n c-6.649,3.855-15.164,1.59-19.02-5.059l-5.603-9.663\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M388.762,434.677c5.234-3.039,7.731-8.966,6.678-14.594c2.344,1.343,4.383,3.289,5.837,5.793\n c4.411,7.596,1.829,17.33-5.767,21.741c-7.596,4.411-17.33,1.829-21.741-5.767c-1.754-3.021-2.817-5.818-2.484-9.046\n C375.625,437.355,383.087,437.973,388.762,434.677z\"\n />\n </g>\n <g id=\"armL\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M301.301,347.66c-1.702,0.242-5.91,1.627-7.492,2.536l-47.965,27.301c-6.664,3.829-8.963,12.335-5.134,18.999h0\n c3.829,6.664,12.335,8.963,18.999,5.134l9.685-5.564\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M241.978,395.324c-3.012-5.25-2.209-11.631,1.518-15.977c-2.701-0.009-5.44,0.656-7.952,2.096\n c-7.619,4.371-10.253,14.09-5.883,21.71c4.371,7.619,14.09,10.253,21.709,5.883c3.03-1.738,5.35-3.628,6.676-6.59\n C252.013,404.214,245.243,401.017,241.978,395.324z\"\n />\n </g>\n <g id=\"body\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M353.351,365.387c-7.948,1.263-16.249,0.929-24.48-1.278c-8.232-2.207-15.586-6.07-21.836-11.14\n c-17.004,4.207-31.269,17.289-36.128,35.411l-1.374,5.123c-7.112,26.525,8.617,53.791,35.13,60.899l0,0\n c26.513,7.108,53.771-8.632,60.883-35.158l1.374-5.123C371.778,395.999,365.971,377.536,353.351,365.387z\"\n />\n <path\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M269.678,394.912L269.678,394.912c26.3,20.643,59.654,29.585,93.106,25.724l2.419-0.114\"\n />\n </g>\n <g id=\"legs\">\n <g id=\"legR\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M312.957,456.734l-14.315,53.395c-1.896,7.07,2.299,14.338,9.37,16.234l0,0c7.07,1.896,14.338-2.299,16.234-9.37l17.838-66.534\n C333.451,455.886,323.526,457.387,312.957,456.734z\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"304.883\"\n y1=\"486.849\"\n x2=\"330.487\"\n y2=\"493.713\"\n />\n </g>\n <g id=\"legL\">\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M296.315,452.273L282,505.667c-1.896,7.07-9.164,11.265-16.234,9.37l0,0c-7.07-1.896-11.265-9.164-9.37-16.234l17.838-66.534\n C278.993,441.286,286.836,447.55,296.315,452.273z\"\n />\n\n <line\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n x1=\"262.638\"\n y1=\"475.522\"\n x2=\"288.241\"\n y2=\"482.387\"\n />\n </g>\n </g>\n <g id=\"head\">\n <ellipse\n transform=\"matrix(0.259 -0.9659 0.9659 0.259 -51.5445 563.2371)\"\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n cx=\"341.295\"\n cy=\"315.211\"\n rx=\"61.961\"\n ry=\"60.305\"\n />\n <path\n id=\"headStripe\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M330.868,261.338c-7.929,1.72-15.381,5.246-21.799,10.246\"\n />\n\n <path\n fill=\"#FFFFFF\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-miterlimit=\"10\"\n d=\"\n M380.857,346.164c-1.247,4.651-4.668,8.421-9.196,10.06c-9.332,3.377-26.2,7.817-42.301,3.5s-28.485-16.599-34.877-24.192\n c-3.101-3.684-4.177-8.66-2.93-13.311l7.453-27.798c0.756-2.82,3.181-4.868,6.088-5.13c6.755-0.61,20.546-0.608,41.785,5.087\n s33.181,12.591,38.725,16.498c2.387,1.682,3.461,4.668,2.705,7.488L380.857,346.164z\"\n />\n <g clip-path=\"url(#GlassClip)\">\n <polygon\n id=\"glassShine\"\n fill=\"none\"\n stroke=\"#ffffff\"\n stroke-width=\"3\"\n stroke-miterlimit=\"10\"\n points=\"\n 278.436,375.599 383.003,264.076 364.393,251.618 264.807,364.928 \t\t\t\t\"\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface SpacemanLogoProps {\n /** Custom CSS class to apply to the component */\n customClass?: string;\n /** Custom inline styles to apply */\n customStyle?: string | Record<string, string>;\n}\n\ndefineProps<SpacemanLogoProps>();\n</script>\n\n<style>\n/* Spaceman animations */\n@keyframes float {\n 0%,\n 100% {\n transform: translateY(0px);\n }\n 50% {\n transform: translateY(-10px);\n }\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.spaceman-logo {\n animation: float 3s ease-in-out infinite;\n}\n\n.spaceman-logo #planet {\n animation: rotate 20s linear infinite;\n}\n\n.spaceman-logo #stars {\n animation: float 4s ease-in-out infinite reverse;\n}\n</style>\n","<template>\n <Transition name=\"modal\">\n <div\n v-if=\"isVisible\"\n class=\"fixed z-[9998] top-0 left-0 w-full h-full bg-modalBackgroundBlur flex justify-center items-center\"\n >\n <div class=\"flex justify-center items-center\">\n <div\n :class=\"{\n 'p-8 bg-background rounded-[2.5rem] overflow-hidden text-white 2xl:w-[56.25rem] xl:w-[56.25rem] lg:w-[56.25rem] md:w-[45.625rem] sm:w-[31.25rem] xs:w-auto':\n largeModel,\n }\"\n >\n <div class=\"modal-header\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"modal-body\">\n <slot name=\"body\" />\n </div>\n\n <div class=\"modal-footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n isVisible: boolean;\n largeModel: boolean;\n}>();\n</script>\n","<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport { ref } from \"vue\";\n\ninterface TooltipProps {\n /** The text content to display in the tooltip */\n text?: string;\n /** The placement of the tooltip relative to the trigger element */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Whether to render the text as HTML */\n html?: boolean;\n /** Custom CSS class to apply to the tooltip content */\n contentClass?: string;\n}\n\ndefineProps<TooltipProps>();\n\nconst show = ref(false);\nconst shouldShowBelow = ref(false);\nconst tooltipWrapper = ref<HTMLElement | null>(null);\nlet showTimeout: ReturnType<typeof setTimeout> | null = null;\n\nfunction open() {\n if (showTimeout) clearTimeout(showTimeout);\n showTimeout = setTimeout(() => {\n // Check if there's enough space above the element\n if (tooltipWrapper.value) {\n const rect = tooltipWrapper.value.getBoundingClientRect();\n shouldShowBelow.value = rect.top < 150; // If less than 150px from top, show below\n }\n show.value = true;\n }, 200); // 200ms delay for better responsiveness\n}\nfunction close() {\n if (showTimeout) clearTimeout(showTimeout);\n show.value = false;\n}\n</script>\n\n<template>\n <div\n ref=\"tooltipWrapper\"\n class=\"tooltip-wrapper\"\n @mouseenter=\"open\"\n @mouseleave=\"close\"\n @focusin=\"open\"\n @focusout=\"close\"\n tabindex=\"0\"\n >\n <slot />\n <transition name=\"fade\">\n <div\n v-if=\"show\"\n class=\"tooltip-content\"\n :class=\"[\n placement,\n shouldShowBelow ? 'force-bottom' : '',\n contentClass,\n ]\"\n >\n <slot name=\"content\">\n <span v-if=\"html\" v-html=\"text\"></span>\n <span v-else>{{ text }}</span>\n </slot>\n </div>\n </transition>\n </div>\n</template>\n\n<style>\n.tooltip-wrapper {\n display: inline-block;\n position: relative;\n}\n.tooltip-content {\n position: absolute;\n z-index: 1000;\n background: #212529;\n color: #ffffff;\n font-size: 13px;\n padding: 8px 12px;\n border-radius: 6px;\n white-space: normal;\n max-width: 300px;\n pointer-events: none;\n opacity: 0.95;\n box-shadow: 0 4px 12px var(--freddy-border-color);\n left: 50%;\n transform: translateX(-50%);\n bottom: 120%;\n line-height: 1.4;\n /* Ensure tooltip is always visible */\n min-width: 200px;\n /* Ensure tooltip doesn't get clipped */\n word-wrap: break-word;\n word-break: break-word;\n}\n.tooltip-content.bottom {\n top: 120%;\n bottom: auto;\n}\n.tooltip-content.left {\n left: auto;\n right: 120%;\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n}\n.tooltip-content.right {\n left: 120%;\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n}\n\n.tooltip-content.force-bottom {\n top: 120%;\n bottom: auto;\n}\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s;\n}\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","<template>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <button\n :class=\"buttonClasses\"\n :disabled=\"disabled || loading\"\n :aria-disabled=\"disabled || loading\"\n :aria-label=\"iconOnly ? label : undefined\"\n role=\"button\"\n @click=\"handleClick\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Loading state with spinner and optional text -->\n <template v-if=\"loading\">\n <span class=\"freddy-plugins-button-spinner\" aria-hidden=\"true\"></span>\n <span v-if=\"loadingText || label\" class=\"freddy-plugins-button-label\">\n {{ loadingText || label }}\n </span>\n </template>\n\n <!-- Icon only mode -->\n <template v-else-if=\"iconOnly\">\n <component\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-center\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n />\n </template>\n\n <!-- Normal mode: Left Icon, Label, Right Icon -->\n <template v-else>\n <component\n v-if=\"leftIcon\"\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-left\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleLeftIconClick\"\n />\n\n <span v-if=\"label\" class=\"freddy-plugins-button-label\">\n {{ label }}\n </span>\n\n <component\n v-if=\"rightIcon\"\n :is=\"RightIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-right\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleRightIconClick\"\n />\n </template>\n </button>\n </Tooltip>\n\n <button\n v-else\n :class=\"buttonClasses\"\n :disabled=\"disabled || loading\"\n :aria-disabled=\"disabled || loading\"\n :aria-label=\"iconOnly ? label : undefined\"\n role=\"button\"\n @click=\"handleClick\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <!-- Loading state with spinner and optional text -->\n <template v-if=\"loading\">\n <span class=\"freddy-plugins-button-spinner\" aria-hidden=\"true\"></span>\n <span v-if=\"loadingText || label\" class=\"freddy-plugins-button-label\">\n {{ loadingText || label }}\n </span>\n </template>\n\n <!-- Icon only mode -->\n <template v-else-if=\"iconOnly\">\n <component\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-center\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n />\n </template>\n\n <!-- Normal mode: Left Icon, Label, Right Icon -->\n <template v-else>\n <component\n v-if=\"leftIcon\"\n :is=\"LeftIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-left\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleLeftIconClick\"\n />\n\n <span v-if=\"label\" class=\"freddy-plugins-button-label\">\n {{ label }}\n </span>\n\n <component\n v-if=\"rightIcon\"\n :is=\"RightIconComponent\"\n class=\"freddy-plugins-button-icon freddy-plugins-button-icon-right\"\n :class=\"`freddy-plugins-button-icon--${size}`\"\n aria-hidden=\"true\"\n @click.stop=\"handleRightIconClick\"\n />\n </template>\n </button>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, defineAsyncComponent } from 'vue';\n import type {\n BaseButtonProps,\n BaseButtonEmits,\n } from '@/interfaces/base-button.interfaces';\n import Tooltip from '../Tooltip.vue';\n\n const props = withDefaults(defineProps<BaseButtonProps>(), {\n size: 'md',\n hierarchy: 'primary',\n state: 'default',\n errorState: false,\n iconOnly: false,\n leftIcon: undefined,\n rightIcon: undefined,\n label: 'Button',\n loadingText: undefined,\n disabled: false,\n loading: false,\n tooltip: undefined,\n tooltipPlacement: 'top',\n });\n\n // Icon component mapping - only include icons that actually exist\n const iconComponents: Record<string, any> = {\n IconSearch: defineAsyncComponent(() => import('@/icons/IconSearch.vue')),\n IconUser: defineAsyncComponent(() => import('@/icons/IconUser.vue')),\n IconDelete: defineAsyncComponent(() => import('@/icons/IconDelete.vue')),\n IconSend: defineAsyncComponent(() => import('@/icons/IconSend.vue')),\n IconPlus: defineAsyncComponent(() => import('@/icons/IconPlus.vue')),\n IconEdit: defineAsyncComponent(() => import('@/icons/IconEdit.vue')),\n IconCross: defineAsyncComponent(() => import('@/icons/IconCross.vue')),\n IconTick: defineAsyncComponent(() => import('@/icons/IconTick.vue')),\n IconArrowLeft: defineAsyncComponent(\n () => import('@/icons/IconArrowLeft.vue')\n ),\n IconArrowDown: defineAsyncComponent(\n () => import('@/icons/IconArrowDown.vue')\n ),\n IconArrowUp: defineAsyncComponent(() => import('@/icons/IconArrowUp.vue')),\n IconChevronDown: defineAsyncComponent(\n () => import('@/icons/IconChevronDown.vue')\n ),\n IconChevronUp: defineAsyncComponent(\n () => import('@/icons/IconChevronUp.vue')\n ),\n IconChevronLeft: defineAsyncComponent(\n () => import('@/icons/IconChevronLeft.vue')\n ),\n IconChevronRight: defineAsyncComponent(\n () => import('@/icons/IconChevronRight.vue')\n ),\n IconSettings: defineAsyncComponent(\n () => import('@/icons/IconSettings.vue')\n ),\n IconHome: defineAsyncComponent(() => import('@/icons/IconHome.vue')),\n IconDownload: defineAsyncComponent(\n () => import('@/icons/IconDownload.vue')\n ),\n IconRefresh: defineAsyncComponent(() => import('@/icons/IconRefresh.vue')),\n IconCopy: defineAsyncComponent(() => import('@/icons/IconCopy.vue')),\n IconEye: defineAsyncComponent(() => import('@/icons/IconEye.vue')),\n IconLock: defineAsyncComponent(() => import('@/icons/IconLock.vue')),\n IconStar: defineAsyncComponent(() => import('@/icons/IconStar.vue')),\n IconFilter: defineAsyncComponent(() => import('@/icons/IconFilter.vue')),\n IconFile: defineAsyncComponent(() => import('@/icons/IconFile.vue')),\n IconFolder: defineAsyncComponent(() => import('@/icons/IconFolder.vue')),\n IconText: defineAsyncComponent(() => import('@/icons/IconText.vue')),\n IconLink04: defineAsyncComponent(() => import('@/icons/IconLink04.vue')),\n };\n\n const LeftIconComponent = computed(() => {\n if (!props.leftIcon) return null;\n return iconComponents[props.leftIcon] || null;\n });\n\n const RightIconComponent = computed(() => {\n if (!props.rightIcon) return null;\n return iconComponents[props.rightIcon] || null;\n });\n\n const emit = defineEmits<BaseButtonEmits>();\n\n const isHovered = ref(false);\n\n const buttonClasses = computed(() => [\n 'freddy-plugins-base-button',\n `freddy-plugins-base-button--${props.size}`,\n `freddy-plugins-base-button--${props.hierarchy}`,\n {\n 'freddy-plugins-base-button--disabled': props.disabled,\n 'freddy-plugins-base-button--loading': props.loading,\n 'freddy-plugins-base-button--icon-only': props.iconOnly,\n 'freddy-plugins-base-button--error': props.errorState,\n 'freddy-plugins-base-button--hover':\n isHovered.value && !props.disabled && !props.loading,\n 'freddy-plugins-base-button--focused': props.state === 'focused',\n },\n ]);\n\n const handleClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('click', event);\n }\n };\n\n const handleLeftIconClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('leftIconClick', event);\n }\n };\n\n const handleRightIconClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('rightIconClick', event);\n }\n };\n\n const handleMouseEnter = () => {\n isHovered.value = true;\n };\n\n const handleMouseLeave = () => {\n isHovered.value = false;\n };\n</script>\n\n<style scoped>\n .freddy-plugins-base-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n cursor: pointer;\n transition: all 0.2s ease;\n box-sizing: border-box;\n position: relative;\n outline: none;\n }\n\n /* Size specifications from Figma */\n .freddy-plugins-base-button--s {\n height: 20px;\n min-width: 20px;\n font-size: 14px;\n font-weight: 500;\n gap: 2px;\n border-radius: 4px;\n padding: 2px;\n }\n\n .freddy-plugins-base-button--sm {\n height: 28px;\n min-width: 28px;\n font-size: 14px;\n font-weight: 500;\n gap: 4px;\n border-radius: 8px;\n padding: 4px;\n }\n\n .freddy-plugins-base-button--md {\n height: 40px;\n min-width: 40px;\n font-size: 16px;\n font-weight: 500;\n gap: 4px;\n border-radius: 8px;\n padding: 4px;\n }\n\n .freddy-plugins-base-button--lg {\n height: 48px;\n min-width: 48px;\n font-size: 16px;\n font-weight: 500;\n gap: 8px;\n border-radius: 8px;\n padding: 8px;\n }\n\n .freddy-plugins-base-button--xl {\n height: 52px;\n min-width: 52px;\n font-size: 18px;\n font-weight: 500;\n gap: 10px;\n border-radius: 8px;\n padding: 12px;\n }\n\n /* Hierarchy styles */\n .freddy-plugins-base-button--primary {\n background: var(--color-primary-500, #7ba8ef);\n color: var(--text-inverse);\n border: 2px solid rgba(255, 255, 255, 0.12);\n box-shadow: inset 0px 0px 0px 1px rgba(10, 13, 18, 0.18),\n inset 0px -2px 0px 0px rgba(10, 13, 18, 0.05);\n }\n\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error {\n background: var(--color-destructive-700, #d92d20) !important;\n border-color: rgba(255, 255, 255, 0.12) !important;\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--secondary {\n background: transparent;\n color: var(--color-primary-500, #7ba8ef);\n border: 2px solid var(--color-primary-500, #7ba8ef);\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error {\n background: #000000 !important;\n color: var(--color-destructive-400, #f97066) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--tertiary {\n background: transparent;\n color: var(--text-600, #4b5563);\n border: 1px solid var(--border-200, #e5e7eb);\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error {\n background: #000000 !important;\n color: var(--color-destructive-400, #f97066) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--link {\n background: none;\n color: var(--color-primary-600, #2563eb);\n border: none;\n padding: 0;\n min-width: 0;\n min-height: 0;\n }\n\n .freddy-plugins-base-button--link.freddy-plugins-base-button--error {\n color: var(--color-destructive-500, #ef4444) !important;\n }\n\n /* Hover states */\n .freddy-plugins-base-button--primary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-primary-600, #2563eb);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-base-button--secondary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-primary-50, #eff6ff);\n }\n\n .freddy-plugins-base-button--tertiary:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--bg-100, #f3f4f6);\n }\n\n .freddy-plugins-base-button--link:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n text-decoration: underline;\n }\n\n /* Error state hover styles */\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-800, #b91c1c) !important;\n border-color: rgba(255, 255, 255, 0.12) !important;\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-900, #55160c) !important;\n color: var(--color-destructive-300, #fda29b) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error:hover:not(\n .freddy-plugins-base-button--disabled\n ):not(.freddy-plugins-base-button--loading) {\n background: var(--color-destructive-900, #55160c) !important;\n color: var(--color-destructive-300, #fda29b) !important;\n border-color: var(--color-destructive-500, #f04438) !important;\n }\n\n /* Focus states */\n .freddy-plugins-base-button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--text-inverse),\n 0 0 0 4px var(--color-primary-500, #7ba8ef);\n }\n\n .freddy-plugins-base-button--error:focus-visible {\n box-shadow: 0 0 0 2px var(--text-inverse),\n 0 0 0 4px var(--color-destructive-500, #ef4444);\n }\n\n /* Disabled state */\n .freddy-plugins-base-button--disabled {\n opacity: 1;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n background: rgba(42, 57, 71, 0.73) !important;\n color: #55585e !important;\n border-color: #35414b !important;\n }\n\n .freddy-plugins-base-button--disabled:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Loading state */\n .freddy-plugins-base-button--loading {\n cursor: wait;\n }\n\n .freddy-plugins-base-button--loading:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Icon only mode */\n .freddy-plugins-base-button--icon-only {\n justify-content: center;\n align-items: center;\n padding: 0;\n gap: 0;\n aspect-ratio: 1;\n }\n\n /* Icon styles */\n .freddy-plugins-button-icon {\n flex-shrink: 0;\n color: currentColor;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .freddy-plugins-button-icon-left {\n margin-right: 0;\n }\n\n .freddy-plugins-button-icon-right {\n margin-left: 0;\n }\n\n .freddy-plugins-button-icon-center {\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n /* Icon sizes based on button size */\n .freddy-plugins-button-icon--s {\n width: 16px !important;\n height: 16px !important;\n }\n\n .freddy-plugins-button-icon--sm {\n width: 20px !important;\n height: 20px !important;\n }\n\n .freddy-plugins-button-icon--md {\n width: 20px !important;\n height: 20px !important;\n }\n\n .freddy-plugins-button-icon--lg {\n width: 24px !important;\n height: 24px !important;\n }\n\n .freddy-plugins-button-icon--xl {\n width: 24px !important;\n height: 24px !important;\n }\n\n /* Icon color based on button state and hierarchy */\n .freddy-plugins-base-button--primary .freddy-plugins-button-icon {\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--primary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--text-inverse) !important;\n }\n\n .freddy-plugins-base-button--secondary .freddy-plugins-button-icon {\n color: var(--color-primary-500, #7ba8ef) !important;\n }\n\n .freddy-plugins-base-button--secondary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-400, #f97066) !important;\n }\n\n .freddy-plugins-base-button--tertiary .freddy-plugins-button-icon {\n color: var(--text-600, #4b5563) !important;\n }\n\n .freddy-plugins-base-button--tertiary.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-400, #f97066) !important;\n }\n\n .freddy-plugins-base-button--link .freddy-plugins-button-icon {\n color: var(--color-primary-600, #2563eb) !important;\n }\n\n .freddy-plugins-base-button--link.freddy-plugins-base-button--error\n .freddy-plugins-button-icon {\n color: var(--color-destructive-500, #ef4444) !important;\n }\n\n .freddy-plugins-base-button--disabled .freddy-plugins-button-icon {\n color: var(--text-400, #9ca3af) !important;\n }\n\n .freddy-plugins-button-label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .freddy-plugins-button-spinner {\n display: inline-block;\n width: 1em;\n height: 1em;\n min-width: 16px;\n min-height: 16px;\n border: 2px solid rgba(0, 0, 0, 0.08);\n border-top: 2px solid currentColor;\n border-radius: 50%;\n animation: freddy-plugins-base-button-spin 1s linear infinite;\n margin-right: 8px;\n vertical-align: middle;\n }\n\n @keyframes freddy-plugins-base-button-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n</style>\n","<template>\n <div :class=\"containerClasses\" :style=\"style\">\n <button\n v-for=\"provider in providers\"\n :key=\"provider\"\n :class=\"getButtonClasses(provider)\"\n :disabled=\"disabled\"\n :aria-label=\"iconOnly ? getProviderLabel(provider) : undefined\"\n role=\"button\"\n @click=\"handleClick(provider, $event)\"\n >\n <component\n :is=\"getProviderIcon(provider)\"\n class=\"freddy-plugins-social-button-icon\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!iconOnly\" class=\"freddy-plugins-social-button-label\">\n {{ getProviderLabel(provider) }}\n </span>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type {\n SocialButtonGroupProps,\n SocialButtonEmits,\n SocialProvider,\n SocialProviderConfig,\n } from '@/interfaces/social-buttons.interfaces';\n import {\n IconGoogle,\n IconFacebook,\n IconApple,\n IconX,\n IconFigma,\n IconDribbble,\n } from '@/icons';\n\n const props = withDefaults(defineProps<SocialButtonGroupProps>(), {\n variant: 'filled',\n size: 'md',\n disabled: false,\n iconOnly: false,\n layout: 'horizontal',\n });\n\n const emit = defineEmits<SocialButtonEmits>();\n\n // Provider configuration mapping\n const providerConfigs: Record<SocialProvider, SocialProviderConfig> = {\n google: {\n icon: IconGoogle,\n label: 'Sign in with Google',\n colors: {\n filled: {\n background: '#ffffff',\n color: '#1f2937',\n border: '#d1d5db',\n },\n outlined: {\n background: '#ffffff',\n color: '#1f2937',\n border: '#10b981',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n facebook: {\n icon: IconFacebook,\n label: 'Sign in with Facebook',\n colors: {\n filled: {\n background: '#1877f2',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#1877f2',\n border: '#1877f2',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n apple: {\n icon: IconApple,\n label: 'Sign in with Apple',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n x: {\n icon: IconX,\n label: 'Sign in with X',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n figma: {\n icon: IconFigma,\n label: 'Sign in with Figma',\n colors: {\n filled: {\n background: '#000000',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#000000',\n border: '#000000',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n dribbble: {\n icon: IconDribbble,\n label: 'Sign in with Dribbble',\n colors: {\n filled: {\n background: '#ea4c89',\n color: '#ffffff',\n },\n outlined: {\n background: '#ffffff',\n color: '#ea4c89',\n border: '#ea4c89',\n },\n ghost: {\n background: 'transparent',\n color: '#9ca3af',\n border: '#d1d5db',\n },\n },\n },\n };\n\n const containerClasses = computed(() => [\n 'freddy-plugins-social-buttons',\n `freddy-plugins-social-buttons--${props.layout}`,\n `freddy-plugins-social-buttons--${props.size}`,\n {\n 'freddy-plugins-social-buttons--disabled': props.disabled,\n },\n props.class,\n ]);\n\n const getProviderIcon = (provider: SocialProvider) => {\n return providerConfigs[provider].icon;\n };\n\n const getProviderLabel = (provider: SocialProvider) => {\n return providerConfigs[provider].label;\n };\n\n const getButtonClasses = (provider: SocialProvider) => {\n return [\n 'freddy-plugins-social-button',\n `freddy-plugins-social-button--${props.variant}`,\n `freddy-plugins-social-button--${props.size}`,\n `freddy-plugins-social-button--${provider}`,\n {\n 'freddy-plugins-social-button--disabled': props.disabled,\n 'freddy-plugins-social-button--icon-only': props.iconOnly,\n },\n ];\n };\n\n const handleClick = (provider: SocialProvider, event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', provider, event);\n }\n };\n</script>\n\n<style scoped>\n .freddy-plugins-social-buttons {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .freddy-plugins-social-buttons--vertical {\n flex-direction: column;\n align-items: stretch;\n }\n\n .freddy-plugins-social-buttons--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .freddy-plugins-social-buttons--sm {\n gap: 8px;\n }\n\n .freddy-plugins-social-buttons--md {\n gap: 12px;\n }\n\n .freddy-plugins-social-buttons--lg {\n gap: 16px;\n }\n\n .freddy-plugins-social-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n box-sizing: border-box;\n position: relative;\n outline: none;\n text-decoration: none;\n white-space: nowrap;\n }\n\n /* Size styles */\n .freddy-plugins-social-button--sm {\n height: 32px;\n min-width: 32px;\n font-size: 14px;\n padding: 6px 12px;\n border-radius: 6px;\n gap: 6px;\n }\n\n .freddy-plugins-social-button--md {\n height: 40px;\n min-width: 40px;\n font-size: 16px;\n padding: 8px 16px;\n border-radius: 8px;\n gap: 8px;\n }\n\n .freddy-plugins-social-button--lg {\n height: 48px;\n min-width: 48px;\n font-size: 18px;\n padding: 12px 20px;\n border-radius: 8px;\n gap: 10px;\n }\n\n /* Icon only styles */\n .freddy-plugins-social-button--icon-only {\n aspect-ratio: 1;\n padding: 0;\n min-width: auto;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--sm {\n width: 32px;\n height: 32px;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--md {\n width: 40px;\n height: 40px;\n }\n\n .freddy-plugins-social-button--icon-only.freddy-plugins-social-button--lg {\n width: 48px;\n height: 48px;\n }\n\n /* Provider-specific filled styles */\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--google {\n background: #ffffff;\n color: #1f2937;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--facebook {\n background: #1877f2;\n color: #ffffff;\n border-color: #1877f2;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--apple {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--x {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--figma {\n background: #000000;\n color: #ffffff;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--dribbble {\n background: #ea4c89;\n color: #ffffff;\n border-color: #ea4c89;\n }\n\n /* Provider-specific outlined styles */\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--google {\n background: #ffffff;\n color: #1f2937;\n border-color: #10b981;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--facebook {\n background: #ffffff;\n color: #1877f2;\n border-color: #1877f2;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--apple {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--x {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--figma {\n background: #ffffff;\n color: #000000;\n border-color: #000000;\n }\n\n .freddy-plugins-social-button--outlined.freddy-plugins-social-button--dribbble {\n background: #ffffff;\n color: #ea4c89;\n border-color: #ea4c89;\n }\n\n /* Provider-specific ghost styles */\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--google {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--facebook {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--apple {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--x {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--figma {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n .freddy-plugins-social-button--ghost.freddy-plugins-social-button--dribbble {\n background: transparent;\n color: #9ca3af;\n border-color: #d1d5db;\n }\n\n /* Hover states */\n .freddy-plugins-social-button:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--google:hover:not(\n .social-button--disabled\n ) {\n background: #f9fafb;\n border-color: #9ca3af;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--facebook:hover:not(\n .social-button--disabled\n ) {\n background: #166fe5;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--apple:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--x:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--figma:hover:not(\n .social-button--disabled\n ) {\n background: #1a1a1a;\n }\n\n .freddy-plugins-social-button--filled.freddy-plugins-social-button--dribbble:hover:not(\n .social-button--disabled\n ) {\n background: #e91e63;\n }\n\n .freddy-plugins-social-button--outlined:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n background: #f9fafb;\n }\n\n .freddy-plugins-social-button--ghost:hover:not(\n .freddy-plugins-social-button--disabled\n ) {\n background: #f9fafb;\n color: #6b7280;\n }\n\n /* Focus states */\n .freddy-plugins-social-button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #3b82f6;\n }\n\n /* Disabled state */\n .freddy-plugins-social-button--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n }\n\n .freddy-plugins-social-button--disabled:hover {\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Icon styles */\n .freddy-plugins-social-button-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: currentColor;\n }\n\n /* Icon sizes based on button size */\n .freddy-plugins-social-button--sm .freddy-plugins-social-button-icon {\n width: 16px;\n height: 16px;\n }\n\n .freddy-plugins-social-button--md .freddy-plugins-social-button-icon {\n width: 20px;\n height: 20px;\n }\n\n .freddy-plugins-social-button--lg .freddy-plugins-social-button-icon {\n width: 24px;\n height: 24px;\n }\n\n .freddy-plugins-social-button-label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n /* Responsive behavior */\n @media (max-width: 640px) {\n .freddy-plugins-social-buttons--horizontal {\n flex-direction: column;\n align-items: stretch;\n }\n }\n</style>\n","<template>\n <pre><code v-html=\"highlighted\"></code></pre>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from \"vue\";\n\nconst props = defineProps<{\n code: string;\n language: string;\n}>();\n\nconst theme = \"nord\";\nconst highlighted = ref(\"\");\nlet highlighter: any = null;\nlet createHighlighter: any = null;\n\n// Load shiki dependency asynchronously\nconst loadShiki = async () => {\n try {\n // Check if shiki is available globally first\n if (typeof window !== \"undefined\" && (window as any).shiki) {\n createHighlighter = (window as any).shiki.createHighlighter;\n return;\n }\n\n // For web components, shiki should be provided externally\n // Don't use dynamic import as it causes bundling issues\n console.warn(\"Shiki not available - using plain text fallback\");\n } catch {\n // shiki not available - will use plain text fallback\n }\n};\n\nconst supportedLangs = [\n \"js\",\n \"ts\",\n \"json\",\n \"python\",\n \"vue\",\n \"html\",\n \"css\",\n \"scss\",\n \"bash\",\n \"yaml\",\n \"markdown\",\n \"c\",\n \"cpp\",\n \"java\",\n \"go\",\n \"php\",\n \"ruby\",\n \"rust\",\n \"swift\",\n \"kotlin\",\n];\n\nconst highlightCode = async () => {\n // Ensure shiki is loaded\n if (!createHighlighter) {\n await loadShiki();\n }\n\n // If shiki is still not available, use plain text\n if (!createHighlighter) {\n highlighted.value = `<pre><code>${props.code\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")}</code></pre>`;\n return;\n }\n\n try {\n if (!highlighter) {\n highlighter = await createHighlighter({\n themes: [theme],\n langs: supportedLangs,\n });\n }\n highlighted.value = highlighter.codeToHtml(props.code, {\n lang: props.language,\n theme,\n });\n } catch (e) {\n // fallback: plain text\n highlighted.value = `<pre><code>${props.code\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")}</code></pre>`;\n }\n};\n\nwatch(() => [props.code, props.language], highlightCode, { immediate: true });\nonMounted(highlightCode);\n</script>\n\n<style>\npre,\ncode,\n.shiki {\n background: transparent !important;\n}\npre {\n font-family: \"Fira Mono\", \"Menlo\", \"Monaco\", \"Consolas\", \"Liberation Mono\",\n \"Courier New\", monospace;\n font-size: 14px;\n line-height: 1.6;\n padding: 16px;\n border-radius: 8px;\n overflow-x: auto;\n}\n</style>\n","<template>\n <label\n class=\"freddy-plugins-base-checkbox\"\n :class=\"{\n 'freddy-plugins-checked': isChecked && !blueCheckbox,\n 'freddy-plugins-checked-blue': isChecked && blueCheckbox,\n 'freddy-plugins-not-checked': !isChecked,\n 'freddy-plugins-is-disabled': disabled,\n }\"\n :aria-checked=\"isChecked\"\n :aria-disabled=\"disabled\"\n :aria-label=\"ariaLabel\"\n role=\"checkbox\"\n >\n <input\n id=\"checkbox-input\"\n type=\"checkbox\"\n class=\"freddy-plugins-checkbox-input\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <span v-if=\"isDashInput && isChecked\" class=\"freddy-plugins-checkbox-dash\"></span>\n <svg\n v-else-if=\"isChecked && !isDashInput\"\n class=\"freddy-plugins-checkbox-icon\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n :stroke=\"blueCheckbox ? 'var(--text-50, var(--text-inverse))' : '#000'\"\n stroke-width=\"1.6666\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nconst props = defineProps<{\n isChecked: boolean;\n isDashInput?: boolean;\n blueCheckbox?: boolean;\n disabled?: boolean;\n ariaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:isChecked\", value: boolean): void;\n}>();\n\nfunction onChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (!props.disabled) {\n emit(\"update:isChecked\", target.checked);\n }\n}\n</script>\n\n<style>\n.freddy-plugins-base-checkbox {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 4px;\n border: 2px solid currentColor;\n cursor: pointer;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n user-select: none;\n}\n\n.freddy-plugins-checked {\n background-color: var(--freddy-text-primary);\n border-color: transparent;\n}\n\n.freddy-plugins-checked-blue {\n background-color: #7ba8ef;\n border-color: transparent;\n}\n\n.freddy-plugins-not-checked {\n background-color: transparent;\n border-color: currentColor;\n}\n\n.freddy-plugins-checkbox-input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n\n.freddy-plugins-checkbox-dash {\n width: 8px;\n height: 2px;\n background-color: var(--freddy-text-primary);\n border-radius: 1px;\n}\n\n.freddy-plugins-checkbox-icon {\n width: 16px;\n height: 16px;\n pointer-events: none;\n}\n\n.freddy-plugins-is-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n","<template>\n <div class=\"freddy-plugins-diff-container\">\n <div\n v-if=\"showDiff && diffContent\"\n class=\"freddy-plugins-diff-preview\"\n v-html=\"diffContent\"\n ></div>\n <textarea\n v-else\n ref=\"textareaRef\"\n v-model=\"localContent\"\n class=\"freddy-plugins-diff-textarea\"\n :placeholder=\"placeholder\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch } from 'vue';\n\n interface DiffProps {\n modelValue: string;\n placeholder?: string;\n originalText?: string;\n improvedText?: string;\n showDiff?: boolean;\n }\n\n const props = withDefaults(defineProps<DiffProps>(), {\n placeholder: 'Enter your text...',\n showDiff: false,\n });\n\n const emit = defineEmits<{\n 'update:modelValue': [value: string];\n }>();\n\n const textareaRef = ref<HTMLTextAreaElement | null>(null);\n const localContent = ref(props.modelValue);\n\n // Watch for external changes to modelValue\n watch(\n () => props.modelValue,\n newValue => {\n localContent.value = newValue;\n }\n );\n\n const handleInput = () => {\n emit('update:modelValue', localContent.value);\n };\n\n // Generate diff HTML with red/green highlighting\n const diffContent = computed(() => {\n if (!props.originalText || !props.improvedText) return '';\n\n // Simple diff algorithm - split by words for better granularity\n const originalWords = props.originalText.split(/(\\s+)/);\n const improvedWords = props.improvedText.split(/(\\s+)/);\n\n // For simplicity, we'll show the full diff with additions and removals\n let diffHtml = '';\n\n // Show removed text in red\n const removedText = originalWords\n .filter(word => !improvedWords.includes(word) && word.trim())\n .join(' ');\n\n if (removedText) {\n diffHtml += `<span class=\"freddy-plugins-diff-removed\">${removedText}</span>`;\n }\n\n // Show added text in green\n const addedText = improvedWords\n .filter(word => !originalWords.includes(word) && word.trim())\n .join(' ');\n\n if (addedText) {\n if (diffHtml) diffHtml += '<br>';\n diffHtml += `<span class=\"freddy-plugins-diff-added\">${addedText}</span>`;\n }\n\n // If no significant changes, show the improved text\n if (!diffHtml) {\n diffHtml = `<span class=\"freddy-plugins-diff-improved\">${props.improvedText}</span>`;\n }\n\n return diffHtml;\n });\n\n // Expose methods for parent component\n defineExpose({\n focus: () => textareaRef.value?.focus(),\n blur: () => textareaRef.value?.blur(),\n });\n</script>\n\n<style scoped>\n .freddy-plugins-diff-container {\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n .freddy-plugins-diff-textarea {\n width: 100%;\n min-height: 200px;\n padding: 16px;\n border: 1px solid var(--freddy-border-secondary, #35414b);\n border-radius: 8px;\n background-color: var(--freddy-text-action-button, #031525);\n color: var(--freddy-text-primary, #ffffff);\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n line-height: 24px;\n resize: none;\n outline: none;\n transition: border-color 0.2s ease;\n }\n\n .freddy-plugins-diff-textarea:focus {\n border-color: var(--freddy-border-primary, #cbd6e3);\n }\n\n .freddy-plugins-diff-textarea::placeholder {\n color: var(--freddy-text-secondary, #94979c);\n }\n\n .freddy-plugins-diff-preview {\n width: 100%;\n height: 100%;\n min-height: 200px;\n padding: 16px;\n border: 1px solid var(--freddy-border-secondary, #35414b);\n border-radius: 8px;\n background-color: var(--freddy-bg-secondary, #071a2b);\n color: var(--freddy-text-primary, #ffffff);\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n line-height: 24px;\n overflow-y: auto;\n white-space: pre-wrap;\n }\n\n :deep(.freddy-plugins-diff-removed) {\n background-color: #d92d20;\n color: #ffffff;\n padding: 2px 4px;\n border-radius: 4px;\n margin: 0 2px;\n }\n\n :deep(.freddy-plugins-diff-added) {\n background-color: #067647;\n color: #ffffff;\n padding: 2px 4px;\n border-radius: 4px;\n margin: 0 2px;\n }\n\n :deep(.freddy-plugins-diff-improved) {\n background-color: #68c57c;\n color: #031525;\n padding: 2px 4px;\n border-radius: 4px;\n }\n</style>\n","\n<template>\n <button\n class=\"freddy-plugins-switch\"\n :class=\"{ \n 'freddy-plugins-switch--on': modelValue, \n 'freddy-plugins-switch--disabled': disabled,\n [`freddy-plugins-switch--${size}`]: true\n }\"\n :aria-checked=\"modelValue\"\n role=\"switch\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n :disabled=\"disabled\"\n >\n <span class=\"freddy-plugins-switch__track\"></span>\n <span class=\"freddy-plugins-switch__thumb\"></span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nconst props = defineProps<{\n modelValue: boolean;\n disabled?: boolean;\n size?: 's' | 'sm' | 'md' | 'lg' | 'xl';\n}>();\nconst emit = defineEmits(['update:modelValue']);\nfunction toggle(event: Event) {\n event.stopPropagation();\n if (!props.disabled) {\n emit('update:modelValue', !props.modelValue);\n }\n}\n</script>\n\n<style>\n.freddy-plugins-switch {\n position: relative;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n outline: none;\n display: inline-flex;\n align-items: center;\n transition: opacity 0.2s;\n}\n\n/* Size variants */\n.freddy-plugins-switch--s {\n width: 28px;\n height: 16px;\n}\n\n.freddy-plugins-switch--sm {\n width: 32px;\n height: 18px;\n}\n\n.freddy-plugins-switch--md {\n width: 40px;\n height: 22px;\n}\n\n.freddy-plugins-switch--lg {\n width: 48px;\n height: 26px;\n}\n\n.freddy-plugins-switch--xl {\n width: 56px;\n height: 30px;\n}\n.freddy-plugins-switch--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.freddy-plugins-switch__track {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background: var(--freddy-border-color);\n border-radius: 999px;\n transition: background 0.2s;\n}\n.freddy-plugins-switch--on .freddy-plugins-switch__track {\n background: var(--freddy-primary-color);\n}\n.freddy-plugins-switch__thumb {\n position: absolute;\n background: var(--text-50, var(--text-inverse));\n border-radius: 50%;\n box-shadow: 0 1px 3px var(--freddy-border-color);\n transition: left 0.2s;\n}\n\n/* Size-specific thumb positioning */\n.freddy-plugins-switch--s .freddy-plugins-switch__thumb {\n top: 1px;\n left: 1px;\n width: 14px;\n height: 14px;\n}\n.freddy-plugins-switch--s.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 13px;\n}\n\n.freddy-plugins-switch--sm .freddy-plugins-switch__thumb {\n top: 1px;\n left: 1px;\n width: 16px;\n height: 16px;\n}\n.freddy-plugins-switch--sm.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 15px;\n}\n\n.freddy-plugins-switch--md .freddy-plugins-switch__thumb {\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n}\n.freddy-plugins-switch--md.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 20px;\n}\n\n.freddy-plugins-switch--lg .freddy-plugins-switch__thumb {\n top: 2px;\n left: 2px;\n width: 22px;\n height: 22px;\n}\n.freddy-plugins-switch--lg.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 24px;\n}\n\n.freddy-plugins-switch--xl .freddy-plugins-switch__thumb {\n top: 3px;\n left: 3px;\n width: 24px;\n height: 24px;\n}\n.freddy-plugins-switch--xl.freddy-plugins-switch--on .freddy-plugins-switch__thumb {\n left: 29px;\n}\n</style> ","<template>\n <div\n class=\"freddy-plugins-dropdown-wrapper\"\n @keydown.esc=\"closeDropdown\"\n tabindex=\"0\"\n >\n <BaseButton\n class=\"freddy-plugins-dropdown-trigger\"\n :label=\"displayLabel\"\n :iconOnly=\"iconOnly\"\n :rightIcon=\"chevronRight && showIcon ? iconToShow : undefined\"\n :leftIcon=\"!chevronRight && showIcon ? iconToShow : undefined\"\n :size=\"size\"\n hierarchy=\"tertiary\"\n @click=\"toggleDropdown\"\n :aria-expanded=\"open\"\n :aria-haspopup=\"true\"\n type=\"button\"\n >\n <template #default>\n <slot name=\"button\">\n {{ displayLabel }}\n </slot>\n </template>\n </BaseButton>\n <div\n v-if=\"open\"\n class=\"freddy-plugins-dropdown-menu\"\n :class=\"{\n 'freddy-plugins-dropdown-menu--up': openUp,\n 'freddy-plugins-dropdown-menu--down': !openUp,\n }\"\n >\n <div v-if=\"searchable\" class=\"freddy-plugins-dropdown-search-bar\">\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"freddy-plugins-dropdown-search-input\"\n :placeholder=\"searchPlaceholder\"\n />\n </div>\n <ul class=\"freddy-plugins-dropdown-options\">\n <li\n v-for=\"option in filteredOptions\"\n :key=\"option.value\"\n class=\"freddy-plugins-dropdown-option\"\n :class=\"{\n 'freddy-plugins-dropdown-option--toggle': option.type === 'toggle',\n }\"\n @click=\"event => handleOptionClick(option, event)\"\n >\n <span class=\"freddy-plugins-dropdown-option-label\">\n <template v-if=\"!optionIconRight && option.icon\">\n <component\n :is=\"option.icon\"\n class=\"freddy-plugins-dropdown-option-icon\"\n />\n </template>\n <span>{{ option.label }}</span>\n <template v-if=\"showShortcut && option.shortcut\">\n <span class=\"freddy-plugins-dropdown-option-shortcut\">{{\n option.shortcut\n }}</span>\n </template>\n <template v-if=\"optionIconRight && option.icon\">\n <component\n :is=\"option.icon\"\n class=\"freddy-plugins-dropdown-option-icon freddy-plugins-dropdown-option-icon--right\"\n />\n </template>\n </span>\n <template v-if=\"option.type === 'toggle'\">\n <Switch\n :modelValue=\"option.checked ?? false\"\n :size=\"props.size\"\n @update:modelValue=\"\n val => {\n handleToggle(option, val);\n }\n \"\n @click.stop\n />\n </template>\n </li>\n <li\n v-if=\"filteredOptions.length === 0\"\n class=\"freddy-plugins-dropdown-no-options\"\n >\n <slot name=\"no-options\">No options</slot>\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, type Component, shallowRef } from 'vue';\n import IconChevronDown from '@/icons/IconChevronDown.vue';\n import IconChevronUp from '@/icons/IconChevronUp.vue';\n import Switch from '@/components/Switch.vue';\n import BaseButton from './Buttons/BaseButton.vue';\n\n interface Option {\n label: string;\n value: string | number;\n icon?: Component;\n shortcut?: string;\n type?: 'option' | 'toggle';\n checked?: boolean;\n default?: boolean;\n refData?: any;\n }\n\n interface Props {\n label?: string;\n size?: 's' | 'sm' | 'md' | 'lg' | 'xl';\n iconOnly?: boolean;\n options?: Option[];\n searchable?: boolean;\n searchPlaceholder?: string;\n openUp?: boolean;\n chevronRight?: boolean;\n showIcon?: boolean;\n customIcon?: any;\n optionIconRight?: boolean;\n showShortcut?: boolean;\n background?: string;\n borderRadius?: string;\n activeBackground?: string;\n openBackground?: string;\n variant?: 'primary' | 'secondary' | 'blanc';\n stayOpen?: boolean;\n }\n\n export type { Option, Props };\n\n const props = withDefaults(defineProps<Props>(), {\n label: 'Select',\n size: 'sm',\n iconOnly: false,\n options: () => [],\n searchable: false,\n searchPlaceholder: 'Search...',\n openUp: false,\n chevronRight: true,\n showIcon: true,\n customIcon: null,\n optionIconRight: false,\n showShortcut: false,\n background: 'transparent',\n borderRadius: '8px',\n activeBackground: 'var(--freddy-bg-tertiary)',\n openBackground: 'var(--freddy-bg-tertiary)',\n variant: 'primary',\n stayOpen: false,\n });\n\n const emit = defineEmits<{\n (event: 'select', value: Option): void;\n (event: 'toggle', value: Option): void;\n }>();\n\n const open = ref(false);\n const searchQuery = ref('');\n // const isHovered = ref(false);\n\n // Internal selected state\n const selected = ref<Option | null>(null);\n\n // Local shallow copy of options for toggles to avoid deep reactivity\n const localOptions = shallowRef<Option[]>([...props.options]);\n\n watch(\n () => props.options,\n newOptions => {\n localOptions.value = [...newOptions];\n }\n );\n\n // Initialize selected option\n const initializeSelected = () => {\n if (selected.value) return;\n const def = localOptions.value.find((opt: Option) => opt.default);\n if (def) {\n selected.value = def;\n }\n };\n\n watch(\n localOptions,\n () => {\n initializeSelected();\n },\n { immediate: true }\n );\n\n const displayLabel = computed(() => {\n if (props.label !== 'Select') return props.label;\n if (selected.value) return selected.value.label;\n return 'Select';\n });\n\n // const computedBackground = computed(() => {\n // if (props.variant === \"primary\") return \"var(--border-light)\";\n // return props.background;\n // });\n\n // const computedActiveBackground = computed(() => {\n // if (props.variant === \"primary\") return \"#d0d0d0\";\n // return props.activeBackground;\n // });\n\n // const computedOpenBackground = computed(() => {\n // if (props.variant === \"primary\") return \"#d8d8d8\";\n // return props.openBackground;\n // });\n\n // const computedBorderRadius = computed(() => {\n // if (props.variant === \"primary\") return \"8px\";\n // return props.borderRadius;\n // });\n\n const iconToShow = computed(() => {\n if (!props.showIcon) return null;\n if (props.customIcon) return props.customIcon;\n return props.openUp ? IconChevronUp : IconChevronDown;\n });\n\n const toggleDropdown = () => {\n open.value = !open.value;\n if (!open.value) searchQuery.value = '';\n };\n\n const closeDropdown = () => {\n open.value = false;\n searchQuery.value = '';\n };\n\n const filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) return localOptions.value;\n return localOptions.value.filter((option: Option) =>\n option.label.toLowerCase().includes(searchQuery.value.toLowerCase())\n );\n });\n\n const handleOptionClick = (option: Option, event?: Event) => {\n if (event) {\n }\n if (option.type !== 'toggle') {\n selectOption(option);\n } else {\n }\n };\n\n const selectOption = (option: Option) => {\n selected.value = option;\n emit('select', option);\n if (!props.stayOpen) {\n closeDropdown();\n }\n };\n\n const handleToggle = (option: Option, val: boolean) => {\n const idx = localOptions.value.findIndex(\n (o: Option) => o.value === option.value\n );\n if (idx !== -1) localOptions.value[idx].checked = val;\n emit('toggle', { ...option, checked: val });\n };\n\n // Close dropdown on outside click\n const onClickOutside = (event: MouseEvent) => {\n const el = event.target as HTMLElement;\n if (!el.closest('.freddy-plugins-dropdown-wrapper')) {\n closeDropdown();\n }\n };\n\n watch(open, val => {\n if (val) {\n // Use a small delay to ensure the dropdown is rendered\n setTimeout(() => {\n document.addEventListener('click', onClickOutside);\n }, 0);\n } else {\n document.removeEventListener('click', onClickOutside);\n }\n });\n</script>\n\n<style>\n .freddy-plugins-dropdown-wrapper {\n position: relative;\n display: inline-block;\n }\n\n .freddy-plugins-dropdown-chevron {\n width: 16px;\n height: 16px;\n }\n\n .freddy-plugins-dropdown-menu {\n position: absolute;\n left: 0;\n min-width: 200px;\n width: fit-content;\n max-width: 360px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n z-index: 1000;\n padding: 4px 0;\n overflow: visible;\n background: var(--freddy-bg-secondary);\n pointer-events: auto;\n }\n\n .freddy-plugins-dropdown-menu--down {\n top: 100%;\n margin-top: 4px;\n }\n\n .freddy-plugins-dropdown-menu--up {\n bottom: 100%;\n margin-bottom: 4px;\n }\n\n .freddy-plugins-dropdown-search-bar {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n padding: 4px 8px;\n border-bottom: 1px solid var(--freddy-border-secondary);\n }\n\n .freddy-plugins-dropdown-search-input {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n padding: 4px 6px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 4px;\n font-size: 13px;\n background: var(--freddy-bg-primary);\n color: var(--freddy-text-primary);\n }\n\n .freddy-plugins-dropdown-options {\n list-style: none;\n margin: 0;\n padding: 0;\n max-height: 280px;\n overflow-y: auto;\n }\n\n .freddy-plugins-dropdown-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 14px;\n border-radius: 4px;\n transition: all 0.2s ease;\n background: var(--freddy-bg-secondary) !important;\n pointer-events: auto;\n user-select: none;\n color: var(--freddy-text-primary);\n border: 2px solid transparent;\n }\n\n .freddy-plugins-dropdown-option-label {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1 1 0;\n min-width: 0;\n white-space: normal;\n word-break: break-word;\n }\n\n .freddy-plugins-dropdown-option-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n\n .freddy-plugins-dropdown-option-icon--right {\n margin-left: auto;\n }\n\n .freddy-plugins-dropdown-option-shortcut {\n margin-left: auto;\n font-size: 12px;\n color: var(--freddy-text-tertiary);\n background: var(--freddy-bg-tertiary);\n border-radius: 4px;\n padding: 1px 6px;\n font-family: monospace;\n }\n\n .freddy-plugins-dropdown-option:hover {\n background: var(--freddy-bg-tertiary) !important;\n border-color: var(--freddy-border-secondary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-dropdown-no-options {\n padding: 8px 12px;\n color: var(--freddy-text-tertiary);\n font-size: 13px;\n }\n\n .freddy-plugins-dropdown-toggle-checkbox {\n width: 16px;\n height: 16px;\n border: 2px solid var(--freddy-border-color);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n\n .freddy-plugins-dropdown-toggle-inner {\n width: 12px;\n height: 12px;\n background-color: var(--freddy-bg-primary);\n border-radius: 2px;\n }\n\n .freddy-plugins-checked {\n background-color: var(--freddy-primary-color);\n border-color: var(--freddy-primary-color);\n }\n\n .freddy-plugins-checked .freddy-plugins-dropdown-toggle-inner {\n display: none;\n }\n\n .freddy-plugins-dropdown-option > .freddy-plugins-switch {\n flex-shrink: 0;\n }\n</style>\n","<template>\n <div class=\"email-verification\" :class=\"`email-verification--${brand}`\">\n <div class=\"verification-container\">\n <div class=\"verification-header\">\n <h2 class=\"verification-title\">Verify Your Email</h2>\n <p class=\"verification-subtitle\">\n We've sent a 4-digit verification code to <strong>{{ email }}</strong>\n </p>\n </div>\n\n <form @submit.prevent=\"handleSubmit\" class=\"verification-form\">\n <div class=\"code-input-container\">\n <div class=\"code-inputs\">\n <input\n v-for=\"(_, index) in 4\"\n :key=\"index\"\n :ref=\"(el: any) => inputRefs[index] = el as HTMLInputElement | null\"\n v-model=\"codeDigits[index]\"\n type=\"text\"\n maxlength=\"1\"\n class=\"code-input\"\n :class=\"`code-input--${brand}`\"\n @input=\"handleDigitInput(index, $event)\"\n @keydown=\"handleKeydown(index, $event)\"\n @paste=\"handlePaste\"\n :disabled=\"loading\"\n autocomplete=\"one-time-code\"\n />\n </div>\n </div>\n\n <div class=\"verification-actions\">\n <BaseButton\n type=\"submit\"\n :label=\"loading ? 'Verifying...' : 'Verify Code'\"\n hierarchy=\"primary\"\n size=\"lg\"\n :loading=\"loading\"\n :disabled=\"!isCodeComplete || loading\"\n :class=\"`verify-button verify-button--${brand}`\"\n />\n </div>\n\n <div v-if=\"error\" class=\"error-message\">\n {{ error }}\n </div>\n\n <div class=\"verification-footer\">\n <p class=\"resend-text\">\n Didn't receive the code?\n <button\n type=\"button\"\n class=\"resend-button\"\n :disabled=\"resendCooldown > 0\"\n @click=\"handleResend\"\n >\n {{\n resendCooldown > 0\n ? `Resend in ${resendCooldown}s`\n : 'Resend code'\n }}\n </button>\n </p>\n </div>\n </form>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, onMounted, nextTick } from 'vue';\n import BaseButton from './Buttons/BaseButton.vue';\n\n interface Props {\n email: string;\n brand?: 'contentplate' | 'flowplate' | 'freddy';\n loading?: boolean;\n error?: string;\n resendCooldown?: number;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n brand: 'contentplate',\n loading: false,\n error: '',\n resendCooldown: 0,\n });\n\n // Use props to avoid unused variable warning\n const { brand, loading, error, resendCooldown } = props;\n\n const emit = defineEmits<{\n verify: [code: string];\n resend: [];\n }>();\n\n // Reactive state\n const codeDigits = ref(['', '', '', '']);\n const inputRefs = ref<(HTMLInputElement | null)[]>([]);\n\n // Computed\n const isCodeComplete = computed(() => {\n return codeDigits.value.every(digit => digit !== '');\n });\n\n const verificationCode = computed(() => {\n return codeDigits.value.join('');\n });\n\n // Methods\n const handleDigitInput = (index: number, event: Event) => {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n\n // Only allow digits\n if (!/^\\d*$/.test(value)) {\n target.value = '';\n return;\n }\n\n codeDigits.value[index] = value;\n\n // Move to next input if digit entered\n if (value && index < 3) {\n nextTick(() => {\n inputRefs.value[index + 1]?.focus();\n });\n }\n };\n\n const handleKeydown = (index: number, event: KeyboardEvent) => {\n // Handle backspace\n if (event.key === 'Backspace' && !codeDigits.value[index] && index > 0) {\n nextTick(() => {\n inputRefs.value[index - 1]?.focus();\n });\n }\n };\n\n const handlePaste = (event: ClipboardEvent) => {\n event.preventDefault();\n const pastedData = event.clipboardData?.getData('text');\n if (!pastedData) return;\n\n const digits = pastedData.replace(/\\D/g, '').slice(0, 4).split('');\n codeDigits.value = [...digits, '', '', '', ''].slice(0, 4);\n\n // Focus the next empty input or the last one\n const nextEmptyIndex = codeDigits.value.findIndex(digit => digit === '');\n const focusIndex = nextEmptyIndex === -1 ? 3 : nextEmptyIndex;\n nextTick(() => {\n inputRefs.value[focusIndex]?.focus();\n });\n };\n\n const handleSubmit = () => {\n if (isCodeComplete.value) {\n emit('verify', verificationCode.value);\n }\n };\n\n const handleResend = () => {\n emit('resend');\n };\n\n // Focus first input on mount\n onMounted(() => {\n nextTick(() => {\n inputRefs.value[0]?.focus();\n });\n });\n</script>\n\n<style>\n .email-verification {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 2rem;\n }\n\n .verification-container {\n max-width: 400px;\n width: 100%;\n text-align: center;\n }\n\n .verification-header {\n margin-bottom: 2rem;\n }\n\n .verification-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin-bottom: 0.5rem;\n }\n\n .verification-subtitle {\n color: var(--text-500, var(--freddy-text-secondary));\n font-size: 0.875rem;\n }\n\n .verification-form {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n\n .code-input-container {\n display: flex;\n justify-content: center;\n }\n\n .code-inputs {\n display: flex;\n gap: 0.75rem;\n }\n\n .code-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: 1.25rem;\n font-weight: 600;\n border: 2px solid var(--freddy-border-color);\n border-radius: 0.5rem;\n background: transparent;\n transition: all 0.2s ease;\n }\n\n .code-input:focus {\n outline: none;\n border-color: var(--color-primary-500, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n\n .code-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Disable browser autofill styling for code inputs */\n .code-input:-webkit-autofill,\n .code-input:-webkit-autofill:hover,\n .code-input:-webkit-autofill:focus,\n .code-input:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: inherit !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n }\n\n .code-input:-moz-autofill,\n .code-input:-moz-autofill:focus {\n background-color: transparent !important;\n color: inherit !important;\n border: none !important;\n box-shadow: none !important;\n }\n\n .code-input:-ms-autofill,\n .code-input:-ms-autofill:focus {\n background-color: transparent !important;\n color: inherit !important;\n border: none !important;\n box-shadow: none !important;\n }\n\n /* Brand-specific styles */\n .code-input--contentplate {\n border-color: var(--color-purple-500, var(--freddy-primary-color));\n }\n\n .code-input--contentplate:focus {\n border-color: var(--color-purple-600, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);\n }\n\n .code-input--flowplate {\n border-color: var(--color-indigo-500, var(--freddy-primary-color));\n background: rgba(99, 102, 241, 0.05);\n }\n\n .code-input--flowplate:focus {\n border-color: var(--color-indigo-600, #4f46e5);\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n }\n\n .code-input--freddy {\n border-color: var(--freddy-primary-color);\n }\n\n .code-input--freddy:focus {\n border-color: var(--color-primary-600, #0099cc);\n box-shadow: 0 0 0 3px rgba(0, 174, 239, 0.1);\n }\n\n .verification-actions {\n display: flex;\n justify-content: center;\n }\n\n .verify-button {\n min-width: 200px;\n }\n\n .error-message {\n color: var(--color-destructive-500, var(--freddy-error-color));\n font-size: 0.875rem;\n margin-top: 0.5rem;\n }\n\n .verification-footer {\n margin-top: 1rem;\n }\n\n .resend-text {\n font-size: 0.875rem;\n color: var(--text-500, var(--freddy-text-secondary));\n }\n\n .resend-button {\n background: none;\n border: none;\n color: var(--color-primary-500, var(--freddy-primary-color));\n cursor: pointer;\n font-size: 0.875rem;\n text-decoration: underline;\n }\n\n .resend-button:hover:not(:disabled) {\n color: var(--color-primary-600, var(--freddy-primary-color));\n }\n\n .resend-button:disabled {\n color: var(--border-300, #9ca3af);\n cursor: not-allowed;\n text-decoration: none;\n }\n\n /* Brand-specific button styles */\n .verify-button--contentplate {\n background: var(--color-purple-500, var(--freddy-primary-color)) !important;\n border-color: var(\n --color-purple-500,\n var(--freddy-primary-color)\n ) !important;\n }\n\n .verify-button--flowplate {\n background: var(--color-indigo-500, var(--freddy-primary-color)) !important;\n border-color: var(\n --color-indigo-500,\n var(--freddy-primary-color)\n ) !important;\n }\n\n .verify-button--freddy {\n background: var(--freddy-primary-color) !important;\n border-color: var(--freddy-primary-color) !important;\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-input-field-wrapper\">\n <!-- Label -->\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"freddy-plugins-input-field-label\"\n :class=\"`freddy-plugins-input-field-label--${colorStyle}`\"\n >\n {{ label }}\n <span v-if=\"required\" class=\"freddy-plugins-required-asterisk\">*</span>\n </label>\n\n <!-- Input Container -->\n <div\n class=\"freddy-plugins-input-field-container\"\n :class=\"containerClasses\"\n @click=\"focusInput\"\n >\n <slot />\n </div>\n\n <!-- Hint Text -->\n <p\n v-if=\"hintText\"\n class=\"freddy-plugins-input-hint-text\"\n :class=\"`freddy-plugins-input-hint-text--${colorStyle}`\"\n >\n {{ hintText }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import type { BaseInputProps } from '@/interfaces/input-field.interfaces';\n\n interface Props extends BaseInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n disabled: false,\n });\n\n const emit = defineEmits<{\n focus: [event: FocusEvent];\n blur: [event: FocusEvent];\n }>();\n\n // Generate unique input ID\n const inputId = computed(\n () => `input-${Math.random().toString(36).substr(2, 9)}`\n );\n\n // Container classes\n const containerClasses = computed(() => ({\n [`freddy-plugins-input-field-container--${props.size}`]: true,\n [`freddy-plugins-input-field-container--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field-container--destructive':\n props.destructive || props.state === 'error',\n 'freddy-plugins-input-field-container--focused': props.state === 'focused',\n 'freddy-plugins-input-field-container--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field-container--loading': props.state === 'loading',\n 'freddy-plugins-input-field-container--success': props.state === 'success',\n }));\n\n const focusInput = () => {\n if (props.state !== 'disabled') {\n emit('focus', new FocusEvent('focus'));\n }\n };\n\n defineExpose({\n inputId,\n containerClasses,\n focusInput,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-input-field-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n position: relative;\n }\n\n .freddy-plugins-input-field-label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n }\n\n .freddy-plugins-input-field-label--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-input-field-label--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-required-asterisk {\n color: var(--freddy-fg-error-primary);\n margin-left: 0.125rem;\n }\n\n .freddy-plugins-input-field-container {\n position: relative;\n display: flex;\n align-items: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: text;\n overflow: visible;\n }\n\n /* Freddy color style (dark theme) */\n .freddy-plugins-input-field-container--freddy {\n background-color: #1d2e47;\n border: 2px solid #475569;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n }\n\n .freddy-plugins-input-field-container--freddy:hover:not(.freddy-plugins-input-field-container--disabled) {\n border-color: var(--freddy-text-secondary);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),\n 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--freddy.freddy-plugins-input-field-container--focused {\n background-color: #1d2e47;\n border: 2px solid #7ba8ef;\n box-shadow: 0 0 0 3px rgba(123, 168, 239, 0.1),\n 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--freddy.freddy-plugins-input-field-container--destructive {\n border-color: var(--freddy-fg-error-primary);\n }\n\n /* Contentplate color style (light theme) */\n .freddy-plugins-input-field-container--contentplate {\n background-color: var(--bg-50, var(--freddy-bg-primary));\n border: 2px solid var(--border-200, var(--freddy-border-color));\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n }\n\n .freddy-plugins-input-field-container--contentplate:hover:not(\n .freddy-plugins-input-field-container--disabled\n ) {\n border-color: var(--border-300, #9ca3af);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--contentplate.freddy-plugins-input-field-container--focused {\n border: 2px solid var(--color-primary-500, var(--freddy-primary-color));\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1),\n 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n }\n\n .freddy-plugins-input-field-container--contentplate.freddy-plugins-input-field-container--destructive {\n border-color: var(--freddy-fg-error-primary);\n }\n\n .freddy-plugins-input-field-container--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n box-shadow: none !important;\n }\n\n /* Size variants */\n .freddy-plugins-input-field-container--sm {\n height: 40px;\n border-radius: 8px;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-input-field-container--md {\n height: 44px;\n border-radius: 12px;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-input-field-container--lg {\n height: 48px;\n border-radius: 16px;\n font-size: 1rem;\n }\n\n /* Success state */\n .freddy-plugins-input-field-container--success {\n border-color: #10b981 !important;\n }\n\n .freddy-plugins-input-field-container--success.freddy-plugins-input-field-container--focused {\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1) !important;\n }\n\n /* Loading state */\n .freddy-plugins-input-field-container--loading {\n position: relative;\n }\n\n .freddy-plugins-input-field-container--loading::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(\n 90deg,\n transparent,\n rgba(255, 255, 255, 0.1),\n transparent\n );\n animation: freddy-plugins-shimmer 1.5s infinite;\n }\n\n @keyframes freddy-plugins-shimmer {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n\n /* Hint text */\n .freddy-plugins-input-hint-text {\n font-size: 0.75rem;\n line-height: 1rem;\n margin: 0;\n }\n\n .freddy-plugins-input-hint-text--freddy {\n color: var(--text-muted);\n }\n\n .freddy-plugins-input-hint-text--contentplate {\n color: var(--freddy-text-secondary);\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Card Type Icon -->\n <div\n v-if=\"showCardIcon && detectedCardType !== 'unknown'\"\n class=\"freddy-plugins-card-type-icon\"\n :class=\"`freddy-plugins-card-type-icon--${colorStyle}`\"\n >\n <img\n :src=\"getCardTypeIcon(detectedCardType)\"\n :alt=\"`${detectedCardType} card`\"\n class=\"freddy-plugins-card-icon-image\"\n />\n </div>\n\n <!-- Card Input -->\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"displayValue\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :maxlength=\"cardNumberMaxLength\"\n class=\"freddy-plugins-input-field freddy-plugins-card-input-field\"\n :class=\"inputClasses\"\n @input=\"handleCardInput\"\n @keydown=\"handleCardKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Trailing Icon -->\n <component\n v-if=\"resolvedTrailingIcon\"\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n @click=\"handleTrailingIconClick\"\n />\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, defineAsyncComponent } from 'vue';\n import BaseInput from './BaseInput.vue';\n import type {\n CardInputProps,\n CardInputEvents,\n CardType,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends CardInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '1234 5678 9012 3456',\n cardNumber: '',\n cardType: 'unknown',\n maskInput: true,\n showCardIcon: true,\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<CardInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const rawValue = ref('');\n const displayValue = ref('');\n const detectedCardType = ref<CardType>('unknown');\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n // Dynamic icon resolution\n const resolveIcon = (iconName: any) => {\n if (!iconName) return null;\n\n if (typeof iconName === 'object') {\n return iconName;\n }\n\n if (typeof iconName === 'string') {\n return defineAsyncComponent(() =>\n import(`@/icons/${iconName}.vue`).catch(() => {\n console.warn(`Icon \"${iconName}\" not found`);\n return { template: '<div></div>' };\n })\n );\n }\n\n return null;\n };\n\n const resolvedTrailingIcon = computed(() => resolveIcon(props.trailingIcon));\n\n // Card number max length based on card type\n const cardNumberMaxLength = computed(() => {\n switch (detectedCardType.value) {\n case 'amex':\n return 17; // 15 digits + 2 spaces\n default:\n return 19; // 16 digits + 3 spaces\n }\n });\n\n const inputClasses = computed(() => ({\n [`freddy-plugins-input-field--${props.size}`]: true,\n [`freddy-plugins-input-field--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field--destructive': props.destructive,\n 'freddy-plugins-input-field--focused': props.state === 'focused',\n 'freddy-plugins-input-field--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field--with-leading':\n props.showCardIcon && detectedCardType.value !== 'unknown',\n 'freddy-plugins-input-field--with-trailing': !!resolvedTrailingIcon.value,\n }));\n\n // Card type detection\n const detectCardType = (number: string): CardType => {\n const cleanNumber = number.replace(/\\D/g, '');\n\n if (/^4/.test(cleanNumber)) {\n return 'visa';\n } else if (/^5[1-5]/.test(cleanNumber) || /^2[2-7]/.test(cleanNumber)) {\n return 'mastercard';\n } else if (/^3[47]/.test(cleanNumber)) {\n return 'amex';\n } else if (/^6/.test(cleanNumber)) {\n return 'discover';\n }\n\n return 'unknown';\n };\n\n // Card number formatting with proper spacing\n const formatCardNumber = (value: string): string => {\n const cleanValue = value.replace(/\\D/g, '');\n const cardType = detectCardType(cleanValue);\n\n if (cardType === 'amex') {\n // American Express: 4-6-5 format (XXXX XXXXXX XXXXX)\n return cleanValue\n .replace(/(\\d{4})(\\d{6})(\\d{5})/, '$1 $2 $3')\n .replace(/(\\d{4})(\\d{1,6})/, '$1 $2')\n .substring(0, 17);\n } else {\n // Visa, Mastercard, Discover: 4-4-4-4 format (XXXX XXXX XXXX XXXX)\n return cleanValue\n .replace(/(\\d{4})(\\d{4})(\\d{4})(\\d{4})/, '$1 $2 $3 $4')\n .replace(/(\\d{4})(\\d{4})(\\d{4})/, '$1 $2 $3')\n .replace(/(\\d{4})(\\d{4})/, '$1 $2')\n .replace(/(\\d{4})/, '$1')\n .substring(0, 19);\n }\n };\n\n // Card type icons\n const getCardTypeIcon = (cardType: CardType): string => {\n const icons = {\n visa: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwNTFBNSIvPgo8cGF0aCBkPSJNMTYuNzUgN0wxNC4yNSAxN0gxMS43NUwxMy41IDEwLjVMMTIuMjUgOC41SDEwLjc1TDEyLjc1IDdIMTYuNzVaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjkuMjUgN0wyNi43NSAxN0gyNC4yNUwyNi43NSA3SDI5LjI1WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+',\n mastercard:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iI0VCMDAxQiIvPgo8Y2lyY2xlIGN4PSIxNSIgY3k9IjEyIiByPSI3IiBmaWxsPSIjRkY1RjAwIi8+CjxjaXJjbGUgY3g9IjI1IiBjeT0iMTIiIHI9IjciIGZpbGw9IiNGRkY1RjAiLz4KPC9zdmc+',\n amex: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iIzAwNkZDRiIvPgo8cGF0aCBkPSJNMTAgOEgxNEwxNiAxMkwxOCA4SDIyTDE4IDE2SDE0TDEyIDEyTDEwIDE2SDZMMTAgOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0yNCA4SDMwVjEwSDI2VjEySDI5VjE0SDI2VjE2SDMwVjE4SDI0VjhaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4=',\n discover:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA0MCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNCIgZmlsbD0iI0ZGNjAwMCIvPgo8cGF0aCBkPSJNOCA4SDE2VjE2SDhWOFoiIGZpbGw9IndoaXRlIi8+CjxjaXJjbGUgY3g9IjI4IiBjeT0iMTIiIHI9IjYiIGZpbGw9IndoaXRlIi8+CjwvdXZnPg==',\n unknown: '',\n };\n\n return icons[cardType] || icons.unknown;\n };\n\n // Methods\n const handleCardInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n const inputValue = target.value;\n\n // Store raw value (digits only)\n rawValue.value = inputValue.replace(/\\D/g, '');\n\n // Always format for display with proper spacing\n displayValue.value = formatCardNumber(inputValue);\n\n // Detect card type\n const newCardType = detectCardType(rawValue.value);\n if (newCardType !== detectedCardType.value) {\n detectedCardType.value = newCardType;\n emit('card-type-detected', newCardType);\n }\n\n emit('update:modelValue', displayValue.value);\n emit('update:cardNumber', rawValue.value);\n emit('input', displayValue.value);\n };\n\n const handleCardKeydown = (event: KeyboardEvent) => {\n // Allow backspace, delete, tab, escape, enter\n if (\n [8, 9, 27, 13, 46].indexOf(event.keyCode) !== -1 ||\n // Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\n (event.keyCode === 65 && event.ctrlKey === true) ||\n (event.keyCode === 67 && event.ctrlKey === true) ||\n (event.keyCode === 86 && event.ctrlKey === true) ||\n (event.keyCode === 88 && event.ctrlKey === true) ||\n // Allow home, end, left, right\n (event.keyCode >= 35 && event.keyCode <= 39)\n ) {\n return;\n }\n\n // Only allow numbers\n if (\n (event.shiftKey || event.keyCode < 48 || event.keyCode > 57) &&\n (event.keyCode < 96 || event.keyCode > 105)\n ) {\n event.preventDefault();\n }\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Watch for external card number changes\n watch(\n () => props.cardNumber,\n newValue => {\n if (newValue !== rawValue.value) {\n rawValue.value = newValue;\n displayValue.value = formatCardNumber(newValue);\n detectedCardType.value = detectCardType(newValue);\n }\n },\n { immediate: true }\n );\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-card-type-icon {\n display: flex;\n align-items: center;\n padding: 0 0.75rem;\n margin-right: 8px;\n }\n\n .freddy-plugins-card-type-icon--freddy {\n border-right: 1px solid var(--border-600, #475569);\n }\n\n .freddy-plugins-card-type-icon--contentplate {\n border-right: 1px solid var(--border-200, var(--freddy-border-color));\n }\n\n .freddy-plugins-card-icon-image {\n width: 32px;\n height: 20px;\n object-fit: contain;\n border-radius: 2px;\n }\n\n .freddy-plugins-card-input-field {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n padding: 0 0.75rem;\n height: 100%;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono',\n 'Courier New', monospace;\n letter-spacing: 0.05em;\n }\n\n .freddy-plugins-card-input-field--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-card-input-field--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-card-input-field--freddy::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n }\n\n .freddy-plugins-card-input-field--contentplate::placeholder {\n color: #9ca3af;\n opacity: 0.7;\n }\n\n .freddy-plugins-card-input-field--disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-input-trailing-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-right: 0.75rem;\n margin-left: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-trailing-icon--freddy,\n .freddy-plugins-input-trailing-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-trailing-icon:hover {\n transform: scale(1.1);\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Leading Icon -->\n <component\n v-if=\"resolvedLeadingIcon\"\n :is=\"resolvedLeadingIcon\"\n class=\"freddy-plugins-input-leading-icon\"\n :class=\"`freddy-plugins-input-leading-icon--${colorStyle}`\"\n @click=\"handleLeadingIconClick\"\n />\n\n <!-- Main Input -->\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"inputValue\"\n :type=\"inputType\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n class=\"freddy-plugins-input-field\"\n :class=\"inputClasses\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeydown\"\n />\n\n <!-- Trailing Icon with Tooltip -->\n <Tooltip\n v-if=\"trailingIcon === 'IconQuestion' && tooltipText\"\n :text=\"tooltipText\"\n placement=\"top\"\n >\n <component\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n />\n </Tooltip>\n <component\n v-else-if=\"resolvedTrailingIcon\"\n :is=\"resolvedTrailingIcon\"\n class=\"freddy-plugins-input-trailing-icon\"\n :class=\"`freddy-plugins-input-trailing-icon--${colorStyle}`\"\n @click=\"handleTrailingIconClick\"\n />\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, defineAsyncComponent } from 'vue';\n import BaseInput from './BaseInput.vue';\n import Tooltip from '../Tooltip.vue';\n import type {\n DefaultInputProps,\n DefaultInputEvents,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends DefaultInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '',\n inputType: 'text',\n modelValue: '',\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<DefaultInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const inputValue = ref(props.modelValue || '');\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n // Dynamic icon resolution with lazy loading for better performance\n const resolveIcon = (iconName: any) => {\n if (!iconName) return null;\n\n // If it's already a component, return it\n if (typeof iconName === 'object') {\n return iconName;\n }\n\n // If it's a string, create an async component that dynamically imports the icon\n if (typeof iconName === 'string') {\n return defineAsyncComponent(() =>\n import(`@/icons/${iconName}.vue`).catch(() => {\n console.warn(`Icon \"${iconName}\" not found`);\n return { template: '<div></div>' }; // Return empty component as fallback\n })\n );\n }\n\n return null;\n };\n\n const resolvedLeadingIcon = computed(() => resolveIcon(props.leadingIcon));\n const resolvedTrailingIcon = computed(() => resolveIcon(props.trailingIcon));\n\n const inputClasses = computed(() => ({\n [`freddy-plugins-input-field--${props.size}`]: true,\n [`freddy-plugins-input-field--${props.colorStyle}`]: true,\n 'freddy-plugins-input-field--destructive': props.destructive,\n 'freddy-plugins-input-field--focused': props.state === 'focused',\n 'freddy-plugins-input-field--disabled': props.state === 'disabled',\n 'freddy-plugins-input-field--with-leading': !!resolvedLeadingIcon.value,\n 'freddy-plugins-input-field--with-trailing': !!resolvedTrailingIcon.value,\n }));\n\n // Methods\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n inputValue.value = target.value;\n emit('update:modelValue', target.value);\n emit('input', target.value);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n const handleLeadingIconClick = (event: MouseEvent) => {\n emit('leading-icon-click', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Watch for external value changes\n watch(\n () => props.modelValue,\n newValue => {\n if (newValue !== undefined) {\n inputValue.value = newValue;\n }\n }\n );\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-input-leading-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.75rem;\n margin-right: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-leading-icon--freddy,\n .freddy-plugins-input-leading-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-leading-icon:hover {\n transform: scale(1.1);\n }\n\n .freddy-plugins-input-trailing-icon {\n width: 1.25rem;\n height: 1.25rem;\n margin-right: 0.75rem;\n margin-left: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-trailing-icon--freddy,\n .freddy-plugins-input-trailing-icon--contentplate {\n stroke: var(--freddy-fg-tertiary);\n }\n\n .freddy-plugins-input-trailing-icon:hover {\n transform: scale(1.1);\n }\n\n .freddy-plugins-input-field {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.25rem;\n padding: 0 0.75rem;\n height: 100%;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-input-field--freddy {\n color: var(--text-300, var(--text-muted));\n }\n\n .freddy-plugins-input-field--contentplate {\n color: var(--text-700, var(--freddy-text-primary));\n }\n\n .freddy-plugins-input-field--freddy::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n }\n\n .freddy-plugins-input-field--contentplate::placeholder {\n color: #9ca3af;\n opacity: 0.7;\n }\n\n .freddy-plugins-input-field--disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-input-field--with-leading {\n padding-left: 0;\n }\n\n .freddy-plugins-input-field--with-trailing {\n padding-right: 0;\n }\n\n /* Disable browser autofill styling */\n .freddy-plugins-input-field:-webkit-autofill,\n .freddy-plugins-input-field:-webkit-autofill:hover,\n .freddy-plugins-input-field:-webkit-autofill:focus,\n .freddy-plugins-input-field:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: inherit !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n }\n</style>\n","<template>\n <BaseInput v-bind=\"baseProps\" @focus=\"handleFocus\" @blur=\"handleBlur\">\n <!-- Country Code Dropdown -->\n <div\n class=\"freddy-plugins-figma-dropdown\"\n :class=\"`freddy-plugins-figma-dropdown--${colorStyle}`\"\n @click=\"toggleCountryDropdown\"\n >\n <span class=\"freddy-plugins-figma-dropdown-text\">{{ selectedCountry.code }}</span>\n <IconChevronDown class=\"freddy-plugins-figma-dropdown-icon\" />\n </div>\n\n <!-- Country Options Dropdown -->\n <div\n v-if=\"showCountryDropdown\"\n class=\"freddy-plugins-country-options-dropdown\"\n :class=\"`freddy-plugins-country-options-dropdown--${colorStyle}`\"\n >\n <div\n v-for=\"country in countryOptions\"\n :key=\"country.code\"\n class=\"freddy-plugins-country-option\"\n :class=\"`freddy-plugins-country-option--${colorStyle}`\"\n @click=\"selectCountry(country)\"\n >\n <span class=\"freddy-plugins-country-flag\">{{ country.flag }}</span>\n <span class=\"freddy-plugins-country-name\">{{ country.name }}</span>\n <span class=\"freddy-plugins-country-dial-code\">{{ country.dialCode }}</span>\n </div>\n </div>\n\n <!-- Phone Input Section -->\n <div class=\"freddy-plugins-figma-text-input\" :class=\"`freddy-plugins-figma-text-input--${colorStyle}`\">\n <input\n :id=\"baseInputRef?.inputId\"\n ref=\"inputRef\"\n v-model=\"phoneNumberValue\"\n type=\"tel\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n class=\"freddy-plugins-figma-phone-input\"\n @input=\"handlePhoneInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Help Icon -->\n <div v-if=\"trailingIcon === 'IconQuestion'\" class=\"freddy-plugins-figma-help-icon\">\n <Tooltip v-if=\"tooltipText\" :text=\"tooltipText\" placement=\"top\">\n <IconQuestion class=\"freddy-plugins-figma-help-icon-svg\" />\n </Tooltip>\n <IconQuestion v-else class=\"freddy-plugins-figma-help-icon-svg\" />\n </div>\n </div>\n </BaseInput>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref, watch, onMounted, onUnmounted } from 'vue';\n import BaseInput from './BaseInput.vue';\n import Tooltip from '../Tooltip.vue';\n import { IconChevronDown, IconQuestion } from '@/icons/';\n import type {\n PhoneInputProps,\n PhoneInputEvents,\n CountryOption,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends PhoneInputProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: 'Enter phone number',\n countryCode: 'US',\n phoneNumber: '',\n disabled: false,\n readonly: false,\n });\n\n const emit = defineEmits<PhoneInputEvents>();\n\n // Refs\n const inputRef = ref<HTMLInputElement | null>(null);\n const baseInputRef = ref<InstanceType<typeof BaseInput> | null>(null);\n const phoneNumberValue = ref(props.phoneNumber || '');\n const showCountryDropdown = ref(false);\n const localCountryCode = ref(props.countryCode || 'US');\n\n // Default country options\n const defaultCountryOptions: CountryOption[] = [\n { code: 'US', name: 'United States', flag: '🇺🇸', dialCode: '+1' },\n { code: 'GB', name: 'United Kingdom', flag: '🇬🇧', dialCode: '+44' },\n { code: 'CA', name: 'Canada', flag: '🇨🇦', dialCode: '+1' },\n { code: 'AU', name: 'Australia', flag: '🇦🇺', dialCode: '+61' },\n { code: 'DE', name: 'Germany', flag: '🇩🇪', dialCode: '+49' },\n { code: 'FR', name: 'France', flag: '🇫🇷', dialCode: '+33' },\n { code: 'IT', name: 'Italy', flag: '🇮🇹', dialCode: '+39' },\n { code: 'ES', name: 'Spain', flag: '🇪🇸', dialCode: '+34' },\n { code: 'JP', name: 'Japan', flag: '🇯🇵', dialCode: '+81' },\n { code: 'IN', name: 'India', flag: '🇮🇳', dialCode: '+91' },\n ];\n\n // Computed properties\n const baseProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n disabled: props.disabled,\n }));\n\n const countryOptions = computed(\n () => props.countryOptions || defaultCountryOptions\n );\n\n const selectedCountry = computed(() => {\n return (\n countryOptions.value.find(\n country => country.code === localCountryCode.value\n ) || countryOptions.value[0]\n );\n });\n\n // Methods\n const toggleCountryDropdown = () => {\n if (!props.disabled) {\n showCountryDropdown.value = !showCountryDropdown.value;\n }\n };\n\n const selectCountry = (country: CountryOption) => {\n localCountryCode.value = country.code;\n emit('update:countryCode', country.code);\n emit('country-change', country);\n\n // Update phone number format when country changes\n const currentNumber = phoneNumberValue.value.replace(/^\\+\\d+\\s*/, '');\n const newFormattedNumber = `${country.dialCode} ${currentNumber}`.trim();\n\n phoneNumberValue.value = newFormattedNumber;\n emit('update:phoneNumber', newFormattedNumber);\n emit('update:modelValue', newFormattedNumber);\n\n showCountryDropdown.value = false;\n };\n\n const handlePhoneInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n phoneNumberValue.value = target.value;\n\n const fullNumber = `${selectedCountry.value.dialCode} ${target.value}`;\n emit('update:modelValue', fullNumber);\n emit('update:phoneNumber', target.value);\n emit('input', fullNumber);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const focus = () => {\n inputRef.value?.focus();\n };\n\n // Close dropdown when clicking outside\n const handleClickOutside = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target.closest('.freddy-plugins-input-field-container')) {\n showCountryDropdown.value = false;\n }\n };\n\n // Watch for prop changes\n watch(\n () => props.countryCode,\n newCode => {\n if (newCode && newCode !== localCountryCode.value) {\n localCountryCode.value = newCode;\n }\n },\n { immediate: true }\n );\n\n watch(\n () => props.phoneNumber,\n newValue => {\n if (newValue !== undefined) {\n phoneNumberValue.value = newValue;\n }\n }\n );\n\n onMounted(() => {\n document.addEventListener('click', handleClickOutside);\n });\n\n onUnmounted(() => {\n document.removeEventListener('click', handleClickOutside);\n });\n\n defineExpose({\n focus,\n inputRef,\n });\n</script>\n\n<style scoped>\n .freddy-plugins-figma-dropdown {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 8px 12px;\n cursor: pointer;\n position: relative;\n box-sizing: border-box;\n border-right: 1px solid transparent;\n }\n\n .freddy-plugins-figma-dropdown--freddy {\n border-right-color: #475569;\n }\n\n .freddy-plugins-figma-dropdown--contentplate {\n border-right-color: #e5e7eb;\n }\n\n .freddy-plugins-figma-dropdown-text {\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n color: #717680;\n white-space: nowrap;\n }\n\n .freddy-plugins-figma-dropdown-icon {\n width: 16px;\n height: 16px;\n stroke: var(--freddy-fg-tertiary);\n cursor: pointer;\n }\n\n .freddy-plugins-country-options-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 50;\n max-height: 200px;\n overflow-y: auto;\n border-radius: 8px;\n margin-top: 4px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n\n .freddy-plugins-country-options-dropdown--freddy {\n background-color: var(--bg-800, var(--freddy-bg-primary));\n border: 1px solid var(--border-600, #475569);\n }\n\n .freddy-plugins-country-options-dropdown--contentplate {\n background-color: var(--bg-50, var(--freddy-bg-primary));\n border: 1px solid var(--border-200, var(--freddy-border-color));\n }\n\n .freddy-plugins-country-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .freddy-plugins-country-option--freddy:hover {\n background-color: var(--bg-700, #374151);\n }\n\n .freddy-plugins-country-option--contentplate:hover {\n background-color: var(--bg-100, #f3f4f6);\n }\n\n .freddy-plugins-country-flag {\n font-size: 1rem;\n }\n\n .freddy-plugins-country-name {\n flex: 1;\n font-size: 0.875rem;\n }\n\n .freddy-plugins-country-dial-code {\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .freddy-plugins-figma-text-input {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 8px 10px;\n flex: 1;\n box-sizing: border-box;\n min-height: 1px;\n min-width: 1px;\n }\n\n .freddy-plugins-figma-phone-input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-family: 'Inter', sans-serif;\n font-size: 16px;\n font-weight: 400;\n line-height: 24px;\n color: #ffffff;\n min-height: 1px;\n min-width: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .freddy-plugins-figma-phone-input::placeholder {\n color: #717680;\n }\n\n .freddy-plugins-figma-help-icon {\n width: 16px;\n height: 16px;\n position: relative;\n flex-shrink: 0;\n }\n\n .freddy-plugins-figma-help-icon-svg {\n width: 16px;\n height: 16px;\n stroke: var(--freddy-fg-tertiary);\n cursor: pointer;\n }\n</style>\n","<template>\n <!-- Phone Variant -->\n <PhoneInput\n v-if=\"variant === 'phone'\"\n v-bind=\"phoneProps\"\n @update:modelValue=\"handleUpdate\"\n @update:countryCode=\"handleCountryCodeUpdate\"\n @update:phoneNumber=\"handlePhoneNumberUpdate\"\n @country-change=\"handleCountryChange\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n\n <!-- Card Variant -->\n <CardInput\n v-else-if=\"variant === 'card'\"\n v-bind=\"cardProps\"\n @update:modelValue=\"handleUpdate\"\n @update:cardNumber=\"handleCardNumberUpdate\"\n @card-type-detected=\"handleCardTypeDetected\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @trailing-icon-click=\"handleTrailingIconClick\"\n />\n\n <!-- Default/Other Variants -->\n <DefaultInput\n v-else\n v-bind=\"defaultProps\"\n @update:modelValue=\"handleUpdate\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeydown\"\n @leading-icon-click=\"handleLeadingIconClick\"\n @trailing-icon-click=\"handleTrailingIconClick\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import PhoneInput from './PhoneInput.vue';\n import CardInput from './CardInput.vue';\n import DefaultInput from './DefaultInput.vue';\n import type {\n UnifiedInputFieldProps,\n UnifiedInputFieldEvents,\n CountryOption,\n CardType,\n } from '@/interfaces/input-field.interfaces';\n\n interface Props extends UnifiedInputFieldProps {}\n\n const props = withDefaults(defineProps<Props>(), {\n size: 'md',\n colorStyle: 'freddy',\n variant: 'default',\n type: 'default',\n state: 'placeholder',\n destructive: false,\n required: false,\n label: '',\n hintText: '',\n placeholder: '',\n inputType: 'text',\n modelValue: '',\n disabled: false,\n readonly: false,\n countryCode: 'US',\n phoneNumber: '',\n });\n\n const emit = defineEmits<UnifiedInputFieldEvents>();\n\n // Determine the actual variant to use\n const variant = computed(() => props.variant || props.type || 'default');\n\n // Props for PhoneInput\n const phoneProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n countryCode: props.countryCode,\n phoneNumber: props.phoneNumber,\n countryOptions: props.countryOptions,\n trailingIcon: props.trailingIcon,\n tooltipText: props.tooltipText,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Props for CardInput\n const cardProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n cardNumber: props.cardNumber,\n cardType: props.cardType,\n maskInput: props.maskInput,\n showCardIcon: props.showCardIcon,\n trailingIcon: props.trailingIcon,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Props for DefaultInput\n const defaultProps = computed(() => ({\n size: props.size,\n colorStyle: props.colorStyle,\n state: props.state,\n destructive: props.destructive,\n required: props.required,\n label: props.label,\n hintText: props.hintText,\n placeholder: props.placeholder,\n inputType: props.inputType,\n modelValue: props.modelValue,\n leadingIcon: props.leadingIcon,\n trailingIcon: props.trailingIcon,\n tooltipText: props.tooltipText,\n disabled: props.disabled,\n readonly: props.readonly,\n }));\n\n // Event handlers\n const handleUpdate = (value: string) => {\n emit('update:modelValue', value);\n };\n\n const handleInput = (value: string) => {\n emit('input', value);\n };\n\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event);\n };\n\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n const handleLeadingIconClick = (event: MouseEvent) => {\n emit('leading-icon-click', event);\n };\n\n const handleTrailingIconClick = (event: MouseEvent) => {\n emit('trailing-icon-click', event);\n };\n\n // Phone-specific event handlers\n const handleCountryCodeUpdate = (code: string) => {\n emit('update:countryCode', code);\n };\n\n const handlePhoneNumberUpdate = (number: string) => {\n emit('update:phoneNumber', number);\n };\n\n const handleCountryChange = (country: CountryOption) => {\n emit('country-change', country);\n };\n\n // Card-specific event handlers\n const handleCardNumberUpdate = (number: string) => {\n emit('update:cardNumber', number);\n };\n\n const handleCardTypeDetected = (cardType: CardType) => {\n emit('card-type-detected', cardType);\n };\n</script>\n\n<style scoped>\n /* No styles needed - all styling is handled by child components */\n</style>\n","<template>\n <transition name=\"modal\">\n <div\n v-if=\"isVisible\"\n class=\"fixed z-[9998] top-0 left-0 w-full h-full bg-modalBackgroundBlur flex justify-center items-center\"\n >\n <div class=\"flex justify-center items-center\">\n <div\n :class=\"{\n 'p-8 bg-background rounded-[2.5rem] overflow-hidden text-white':\n largeModel,\n 'freddy-plugins-modal-container-large': largeModel,\n }\"\n >\n <div class=\"freddy-plugins-modal-header\">\n <slot name=\"header\"></slot>\n </div>\n\n <div class=\"freddy-plugins-modal-body\">\n <slot name=\"body\"></slot>\n </div>\n\n <div class=\"freddy-plugins-modal-footer\">\n <slot name=\"footer\">\n <!-- <button class=\"modal-default-button\" @click=\"$emit('close')\">\n OK\n </button> -->\n </slot>\n </div>\n </div>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n name: \"ModalBox\",\n props: {\n isVisible: {\n type: Boolean,\n default: true,\n },\n largeModel: {\n type: Boolean,\n default: true,\n },\n },\n methods: {\n closeModal() {\n this.$emit(\"close\");\n },\n },\n};\n</script>\n\n<style>\n/* Modal background blur */\n.bg-modalBackgroundBlur {\n background-color: rgba(29, 46, 71, 0.9);\n backdrop-filter: blur(4px);\n}\n\n/* Background color */\n.bg-background {\n background-color: #0f172a;\n}\n\n/* Modal container */\n.freddy-plugins-modal-container {\n background-color: var(--bg-900, var(--freddy-bg-primary)); /* background */\n padding: 2rem; /* p-8 */\n border-radius: 2.5rem; /* rounded-[2.5rem] */\n overflow: hidden;\n color: white;\n}\n\n.freddy-plugins-modal-header:last-child,\n.freddy-plugins-modal-body:last-child,\n.freddy-plugins-modal-footer:last-child {\n margin-bottom: 0;\n}\n\n/* Modal transition animations */\n.modal-enter-active,\n.modal-leave-active {\n transition: all 0.3s ease;\n}\n\n.modal-enter-from,\n.modal-leave-to {\n opacity: 0;\n transform: scale(0.9);\n}\n\n.modal-enter-to,\n.modal-leave-from {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Responsive width utilities - using proper CSS instead of escaped class names */\n@media (min-width: 1280px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 1279px) and (min-width: 1024px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 1023px) and (min-width: 768px) {\n .freddy-plugins-modal-container-large {\n width: 56.25rem;\n }\n}\n\n@media (max-width: 767px) and (min-width: 640px) {\n .freddy-plugins-modal-container-large {\n width: 45.625rem;\n }\n}\n\n@media (max-width: 639px) and (min-width: 480px) {\n .freddy-plugins-modal-container-large {\n width: 31.25rem;\n }\n}\n\n@media (max-width: 479px) {\n .freddy-plugins-modal-container-large {\n width: auto;\n max-width: 90%;\n }\n}\n</style>\n","<template>\n <ModalBox :isVisible=\"isVisible\" >\n <template #header>\n <h2>Instructions</h2>\n </template>\n <template #body>\n <p>Instructions</p>\n </template>\n </ModalBox>\n</template>\n\n<script setup lang=\"ts\">\nimport ModalBox from '@/components/ModalBox.vue'\n\ndefineProps({\n isVisible: {\n type: Boolean,\n required: true\n }\n})\n</script>","<template>\n <input\n type=\"text\"\n :value=\"inputValue\"\n :placeholder=\"placeholder\"\n :style=\"{ width: '100%', height: height }\"\n @input=\"handleInput\"\n class=\"instruction-text-input\"\n aria-label=\"Instruction input\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n\n const props = defineProps<{\n inputValue: string;\n placeholder: string;\n height?: string;\n }>();\n\n const emit = defineEmits<{\n (e: 'update:inputValue', value: string): void;\n }>();\n\n const height = computed(() => props.height || '40px');\n\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement;\n emit('update:inputValue', target.value);\n };\n</script>\n\n<style scoped>\n .instruction-text-input {\n box-sizing: border-box;\n font-size: 1rem;\n padding: 0.5rem 1rem;\n border-radius: var(--radius-md, 8px);\n border: 1px solid var(--freddy-border-secondary, #35414b);\n background: var(--freddy-bg-primary, #031525);\n color: #222;\n width: 100%;\n outline: none;\n box-shadow: 0 1px 2px 0 var(--freddy-shadow-sm, rgba(255, 255, 255, 0));\n transition: border-color 0.2s;\n }\n .instruction-text-input:focus {\n border-color: #888;\n }\n</style>\n","<template>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"freddy-plugins-modal-overlay\"\n @click=\"clickOutside\"\n >\n <div class=\"freddy-plugins-modal-content\" @click.stop>\n <header class=\"freddy-plugins-modal-header\">\n <h2 class=\"freddy-plugins-modal-title\" :class=\"headerClass\">\n {{ modalTitle }}\n </h2>\n <button class=\"freddy-plugins-modal-close\" @click=\"closeModal\">\n <IconLightCross class=\"freddy-plugins-modal-close-icon\" />\n </button>\n </header>\n <div class=\"freddy-plugins-modal-body\">\n <slot name=\"content\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nimport IconLightCross from \"@/icons/IconLightCross.vue\";\n\nconst props = defineProps<{\n modalTitle: string;\n headerClass: string;\n disableClickOutside?: boolean;\n}>();\n\nconst emits = defineEmits([\"close\"]);\n\nconst closeModal = () => {\n emits(\"close\");\n};\n\nconst clickOutside = () => {\n if (!props.disableClickOutside) {\n closeModal();\n }\n};\n</script>\n\n<style>\n.freddy-plugins-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(3, 21, 37, 0.77);\n backdrop-filter: blur(4px);\n z-index: 1000;\n overflow: auto;\n}\n\n.freddy-plugins-modal-content {\n background-color: var(--text-900, var(--freddy-bg-primary));\n border-radius: 40px;\n box-shadow: 0 0 10px 2px rgba(255, 255, 255, 0.25);\n padding: 30px;\n position: relative;\n margin: auto;\n min-width: 370px;\n max-width: 90%;\n width: auto;\n}\n\n.freddy-plugins-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 28px;\n gap: 8px;\n}\n\n.freddy-plugins-modal-title {\n font-size: 29px;\n line-height: 35px;\n font-weight: 600;\n margin: 0;\n}\n\n.freddy-plugins-modal-close {\n background: none;\n border: none;\n font-size: 35px;\n font-weight: 400;\n color: white;\n padding: 0;\n line-height: 1;\n cursor: pointer;\n}\n\n.freddy-plugins-modal-close-icon {\n width: 16px;\n height: 16px;\n stroke-width: 2px;\n}\n\n.freddy-plugins-modal-body {\n /* optional: wrap content styles */\n}\n</style>\n","<!-- Spinner.vue -->\n<template>\n <div class=\"freddy-plugin-spinner\" :class=\"customClass\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\ndefineProps<{\n customClass?: string;\n}>();\n</script>\n\n<style>\n.freddy-plugin-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid #f3f3f3;\n border-top-color: transparent;\n border-radius: 50%;\n animation: freddy-plugin-spin 1s linear infinite;\n}\n\n@keyframes freddy-plugin-spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<template>\n <div\n ref=\"dropdownRef\"\n class=\"freddy-search-wrapper\"\n :class=\"attrs.class\"\n @click=\"focusInput\"\n >\n <IconSearch class=\"freddy-search-icon\" />\n <input\n type=\"text\"\n id=\"search-input\"\n class=\"freddy-search-input\"\n ref=\"searchInput\"\n v-model=\"inputValue\"\n @input=\"handleInput\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxCharLimit\"\n />\n <Spinner class=\"freddy-search-spinner\" v-if=\"showLoaderForSearch\" />\n <IconCross\n class=\"freddy-search-close\"\n v-if=\"showCloseButton && !showLoaderForSearch && inputValue?.length\"\n @click=\"handleClear\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\nimport IconCross from \"@/icons/IconCross.vue\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport { ref, useAttrs } from \"vue\";\nimport Spinner from \"@/components/Spinner.vue\";\nimport { IconSearch } from \"@/icons/\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst attrs = useAttrs();\n\nconst inputValue = ref<string | null>(null);\nconst searchInput = ref<HTMLInputElement | null>(null);\nconst dropdownRef = ref<HTMLElement | null>(null);\n\ninterface SearchInputProps {\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Whether to show a loading spinner */\n showLoaderForSearch?: boolean;\n /** Maximum number of characters allowed in the input */\n maxCharLimit?: number;\n /** Whether to show a close button */\n showCloseButton?: boolean;\n}\n\nwithDefaults(defineProps<SearchInputProps>(), {\n placeholder: \"Search here...\",\n showLoaderForSearch: false,\n maxCharLimit: undefined,\n showCloseButton: false,\n});\n\nconst emit = defineEmits<{\n (event: \"update:searchInput\", inputValue: string | null): void;\n (event: \"clear\"): void;\n}>();\n\nconst focusInput = () => {\n searchInput.value?.focus();\n};\n\nconst handleInput = () => {\n emit(\"update:searchInput\", inputValue.value);\n};\n\nconst handleClear = () => {\n emit(\"clear\");\n};\n</script>\n\n<style>\n.freddy-search-wrapper {\n display: flex;\n box-sizing: border-box;\n align-items: flex-start;\n gap: 0.5rem; /* gap-2 */\n height: 37px;\n width: 100%;\n border: 2px solid var(--freddy-border-color);\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n border-radius: 0.5rem;\n cursor: text;\n}\n\n.freddy-search-icon {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n align-self: center;\n stroke: var(--text-muted);\n}\n\n.freddy-search-input {\n flex: 1 1 auto;\n width: 100%;\n font-size: 14px;\n font-weight: 500;\n line-height: 16px;\n background: transparent;\n border: none;\n outline: none;\n color: var(--text-300, var(--text-muted));\n align-self: center;\n}\n\n.freddy-search-input::placeholder {\n color: var(--text-muted);\n opacity: 0.7;\n}\n\n/* Disable browser autofill styling for search input */\n.freddy-search-input:-webkit-autofill,\n.freddy-search-input:-webkit-autofill:hover,\n.freddy-search-input:-webkit-autofill:focus,\n.freddy-search-input:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px transparent inset !important;\n -webkit-text-fill-color: var(--text-300, var(--text-muted)) !important;\n transition: background-color 5000s ease-in-out 0s;\n background-color: transparent !important;\n background-image: none !important;\n}\n\n.freddy-search-input:-moz-autofill,\n.freddy-search-input:-moz-autofill:focus {\n background-color: transparent !important;\n color: var(--text-300, var(--text-muted)) !important;\n border: none !important;\n box-shadow: none !important;\n}\n\n.freddy-search-input:-ms-autofill,\n.freddy-search-input:-ms-autofill:focus {\n background-color: transparent !important;\n color: var(--text-300, var(--text-muted)) !important;\n border: none !important;\n box-shadow: none !important;\n}\n\n.freddy-search-spinner {\n width: 21px !important;\n align-self: center;\n}\n\n.freddy-search-close {\n width: 12px;\n height: 12p;\n align-self: center;\n color: var(--freddy-text-quaternary);\n}\n</style>\n","<template>\n <div class=\"model-dropdown-wrapper\" @keydown.esc=\"closeDropdown\">\n <div\n class=\"model-dropdown-trigger\"\n :class=\"[\n `model-dropdown-trigger--${size}`,\n { 'model-dropdown-trigger--open': open },\n ]\"\n @click=\"toggleDropdown\"\n >\n <div class=\"model-dropdown-selected-content\">\n <img\n v-if=\"selectedOption?.imageSrc\"\n :src=\"selectedOption.imageSrc\"\n :alt=\"selectedOption.value\"\n class=\"model-dropdown-selected-image\"\n />\n <span class=\"model-dropdown-placeholder\">\n {{ selectedOption?.value || modelPlaceholder }}\n </span>\n </div>\n <IconChevronDown v-if=\"!open\" class=\"model-dropdown-chevron\" />\n <IconChevronUp v-else class=\"model-dropdown-chevron\" />\n </div>\n\n <!-- Dropdown Menu -->\n <div v-if=\"open\" class=\"model-dropdown-menu\">\n <div v-if=\"searchable\" class=\"model-dropdown-search\">\n <SearchInput\n v-model=\"searchQuery\"\n :placeholder=\"searchPlaceholder\"\n :showCloseButton=\"true\"\n />\n </div>\n\n <ul class=\"model-dropdown-options\">\n <li\n v-for=\"option in filteredOptions\"\n :key=\"option.id\"\n class=\"model-dropdown-option\"\n :class=\"{\n 'model-dropdown-option--selected': selectedOption?.id === option.id,\n }\"\n @click=\"selectOption(option)\"\n >\n <img\n v-if=\"option.imageSrc\"\n :src=\"option.imageSrc\"\n :alt=\"option.value\"\n class=\"model-dropdown-option-image\"\n />\n <span class=\"model-dropdown-option-value\">{{ option.value }}</span>\n </li>\n\n <li\n v-if=\"filteredOptions.length === 0\"\n class=\"model-dropdown-no-options\"\n >\n No providers found\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from \"vue\";\nimport IconChevronDown from \"@/icons/IconChevronDown.vue\";\nimport IconChevronUp from \"@/icons/IconChevronUp.vue\";\nimport SearchInput from \"./SearchInput.vue\";\n\nexport interface ModelOption {\n id: string | number;\n value: string;\n imageSrc?: string;\n}\n\nexport interface ModelDropdownProps {\n options: ModelOption[];\n searchable?: boolean;\n searchPlaceholder?: string;\n modelPlaceholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst props = withDefaults(defineProps<ModelDropdownProps>(), {\n searchable: false,\n searchPlaceholder: \"Search providers...\",\n modelPlaceholder: \"Select a model\",\n size: \"md\",\n});\n\nconst emit = defineEmits<{\n (event: \"select\", option: ModelOption): void;\n}>();\n\nconst open = ref(false);\nconst searchQuery = ref(\"\");\nconst selectedOption = ref<ModelOption | null>(null);\n\n// Computed properties\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) return props.options;\n return props.options.filter((option) =>\n option.value.toLowerCase().includes(searchQuery.value.toLowerCase())\n );\n});\n\n// Methods\nconst toggleDropdown = () => {\n open.value = !open.value;\n if (!open.value) searchQuery.value = \"\";\n};\n\nconst closeDropdown = () => {\n open.value = false;\n searchQuery.value = \"\";\n};\n\nconst selectOption = (option: ModelOption) => {\n selectedOption.value = option;\n emit(\"select\", option);\n closeDropdown();\n};\n\n// Outside click handler\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!target.closest(\".model-dropdown-wrapper\")) {\n closeDropdown();\n }\n};\n\n// Watch for dropdown state changes\nwatch(open, (isOpen) => {\n if (isOpen) {\n setTimeout(() => {\n document.addEventListener(\"click\", handleClickOutside);\n }, 0);\n } else {\n document.removeEventListener(\"click\", handleClickOutside);\n }\n});\n\nonUnmounted(() => {\n document.removeEventListener(\"click\", handleClickOutside);\n});\n</script>\n\n<style scoped>\n.model-dropdown-wrapper {\n position: relative;\n width: 100%;\n}\n\n.model-dropdown-trigger {\n gap: 40px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--Colors-Border-border-secondary, #35414b);\n border-radius: 8px;\n background: var(--freddy-bg-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.model-dropdown-trigger:hover {\n border-color: var(--freddy-primary-color);\n}\n\n.model-dropdown-trigger--open {\n border-color: var(--freddy-primary-color);\n}\n\n/* Size variants */\n.model-dropdown-trigger--sm {\n height: 36px;\n}\n\n.model-dropdown-trigger--md {\n height: 40px;\n}\n\n.model-dropdown-trigger--lg {\n height: 42px;\n}\n\n.model-dropdown-selected-content {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n}\n\n.model-dropdown-selected-image {\n width: 20px;\n height: 20px;\n object-fit: contain;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.model-dropdown-placeholder {\n font-size: 14px;\n color: var(--freddy-text-primary);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-dropdown-chevron {\n width: 16px;\n height: 16px;\n color: var(--freddy-text-tertiary);\n}\n\n/* Dropdown Menu */\n.model-dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 4px;\n background: var(--freddy-bg-primary);\n border: 2px solid var(--freddy-border-color);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n overflow: hidden;\n}\n\n.model-dropdown-search {\n padding: 8px;\n border-bottom: 1px solid var(--freddy-border-secondary);\n}\n\n.model-dropdown-options {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n max-height: 280px;\n overflow-y: auto;\n}\n\n.model-dropdown-search .freddy-search-wrapper {\n width: 100%;\n background: var(--freddy-bg-secondary);\n border: 1px solid var(--freddy-border-color);\n border-radius: 4px;\n}\n\n.model-dropdown-search .freddy-search-input {\n color: var(--freddy-text-primary);\n font-size: 13px;\n}\n\n.model-dropdown-search .freddy-search-wrapper:focus-within {\n border-color: var(--freddy-primary-color);\n}\n\n.model-dropdown-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n\n.model-dropdown-option:hover {\n background: var(--freddy-bg-secondary);\n}\n\n.model-dropdown-option--selected {\n background: var(--freddy-bg-tertiary);\n}\n\n.model-dropdown-option-image {\n width: 20px;\n height: 20px;\n object-fit: contain;\n border-radius: 4px;\n}\n\n.model-dropdown-option-value {\n font-size: 14px;\n color: var(--freddy-text-primary);\n}\n\n.model-dropdown-no-options {\n padding: 12px;\n text-align: center;\n color: var(--freddy-text-tertiary);\n font-size: 13px;\n}\n</style>\n","<template>\n <nav\n v-if=\"totalPages > 0\"\n class=\"freddy-pagination-nav\"\n aria-label=\"Pagination\"\n >\n <button\n class=\"freddy-pagination-end-button\"\n :class=\"{ 'freddy-pagination-hover-enabled': currentPage !== 1 }\"\n @click=\"goToPage(currentPage - 1)\"\n :disabled=\"currentPage === 1\"\n >\n Previous\n </button>\n\n <div class=\"freddy-pagination-dynamic-container\">\n <button\n v-for=\"page in pages\"\n :key=\"String(page)\"\n class=\"freddy-pagination-number-button\"\n :class=\"{ active: page === currentPage }\"\n @click=\"goToPage(page)\"\n :disabled=\"page === '...' || page === currentPage\"\n >\n {{ page }}\n </button>\n\n <button\n class=\"freddy-pagination-end-button\"\n :class=\"{\n 'freddy-pagination-hover-enabled': currentPage !== totalPages,\n }\"\n @click=\"goToPage(currentPage + 1)\"\n :disabled=\"currentPage === totalPages || totalPages === 0\"\n >\n Next\n </button>\n </div>\n </nav>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nconst props = defineProps({\n totalItems: { type: Number, required: true, default: 0 },\n itemsPerPage: { type: Number, required: true, default: 10 },\n currentPage: { type: Number, required: true, default: 1 },\n});\n\nconst emit = defineEmits([\"update:currentPage\"]);\n\nconst totalPages = computed(() => {\n if (!props.totalItems || isNaN(props.totalItems)) return 0;\n return Math.ceil(props.totalItems / props.itemsPerPage);\n});\n\nconst pages = computed(() => {\n const result: (number | string)[] = [];\n const tp = totalPages.value;\n const cp = props.currentPage;\n\n if (tp <= 7) {\n for (let i = 1; i <= tp; i++) {\n result.push(i);\n }\n } else {\n result.push(1);\n\n if (cp > 4) {\n result.push(\"...\");\n } else {\n result.push(2, 3);\n }\n\n for (let i = Math.max(4, cp - 1); i <= Math.min(tp - 3, cp + 1); i++) {\n result.push(i);\n }\n\n if (cp < tp - 4) {\n result.push(\"...\");\n }\n\n result.push(tp - 2, tp - 1, tp);\n }\n\n return result;\n});\n\nfunction goToPage(page: number | string) {\n if (page === \"...\" || page === props.currentPage) return;\n if (typeof page === \"number\" && page >= 1 && page <= totalPages.value) {\n emit(\"update:currentPage\", page);\n }\n}\n</script>\n\n<style>\n.freddy-pagination-nav {\n width: 100%;\n display: flex;\n gap: 0.25rem;\n justify-content: space-between;\n}\n\n.freddy-pagination-number-button {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--text-500, var(--freddy-text-secondary));\n cursor: pointer;\n padding: 0.5rem 0.75rem;\n height: auto;\n background: transparent;\n border: none;\n transition: background-color 0.2s, color 0.2s;\n}\n\n/* Active Page Button Style */\n.freddy-pagination-number-button.active,\n.freddy-pagination-number-button.bg-white {\n background-color: var(--bg-surface);\n color: white;\n}\n\n.freddy-pagination-dynamic-container {\n display: flex;\n gap: 0.25rem;\n}\n\n.freddy-pagination-end-button {\n margin-left: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 1rem;\n height: 2.5rem;\n margin-inline-start: 0;\n line-height: 1.25rem;\n color: var(--text-500, var(--freddy-text-secondary));\n background-color: var(--text-900, var(--freddy-bg-primary));\n border: 2px solid var(--border-light);\n border-radius: 0.5rem;\n cursor: pointer;\n transition: background-color 0.2s, color 0.2s;\n}\n\n/* Hover Enabled State */\n.freddy-pagination-hover-enabled:hover {\n background-color: var(--bg-surface);\n color: var(--text-300, var(--text-muted));\n cursor: pointer;\n}\n</style>\n","<template>\n <button\n class=\"chat-bar-send-btn\"\n :class=\"{ active: active, [`chat-bar-send-btn--${size}`]: true }\"\n :disabled=\"disabled\"\n @click=\"$emit('click')\"\n >\n <component :is=\"IconSend\" class=\"chat-bar-send-icon\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from \"@/composables/useTheme\";\n\nconst { currentProject, currentColorMode } = useTheme();\n\nimport IconSend from \"@/icons/IconSend.vue\";\nimport IconStopCircle from \"@/icons/IconStopCircle.vue\";\ndefineProps<{\n disabled?: boolean;\n active?: boolean;\n size?: \"s\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n}>();\n</script>\n\n<style>\n.chat-bar-send-btn {\n background: var(--color-primary-500, var(--freddy-primary-color));\n border: none;\n padding: 0;\n margin-bottom: 4px;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--text-inverse); /* Default icon color */\n transition: color 0.2s, background 0.2s;\n}\n\n/* Size variants */\n.chat-bar-send-btn--s {\n width: 24px;\n height: 24px;\n}\n\n.chat-bar-send-btn--sm {\n width: 28px;\n height: 28px;\n}\n\n.chat-bar-send-btn--md {\n width: 32px;\n height: 32px;\n}\n\n.chat-bar-send-btn--lg {\n width: 36px;\n height: 36px;\n}\n\n.chat-bar-send-btn--xl {\n width: 40px;\n height: 40px;\n}\n\n.chat-bar-send-btn.active {\n color: var(--text-300, #cbd6e3); /* Active icon color */\n}\n\n.chat-bar-send-btn:disabled {\n background: var(--bg-300, var(--freddy-border-color));\n cursor: not-allowed;\n color: var(--text-400, var(--text-muted)); /* Disabled icon color */\n}\n\n.chat-bar-send-icon {\n width: 20px;\n height: 20px;\n}\n\n/* Adjust icon size for different button sizes */\n.chat-bar-send-btn--s .chat-bar-send-icon {\n width: 14px;\n height: 14px;\n}\n\n.chat-bar-send-btn--sm .chat-bar-send-icon {\n width: 16px;\n height: 16px;\n}\n\n.chat-bar-send-btn--lg .chat-bar-send-icon {\n width: 22px;\n height: 22px;\n}\n\n.chat-bar-send-btn--xl .chat-bar-send-icon {\n width: 24px;\n height: 24px;\n}\n</style>\n","<script setup lang=\"ts\">\n import type { ISkeletonType } from '@/interfaces';\n\n const props = defineProps<{\n type: ISkeletonType;\n hasHeader?: boolean;\n count?: number;\n }>();\n\n const { type, hasHeader = false, count = 5 } = props;\n</script>\n\n<template>\n <!-- Card Skeleton -->\n <template v-if=\"type === 'card'\">\n <div class=\"skeleton-card\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-w-32 skeleton-h-6 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-3-4\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-5-6\"\n ></div>\n </div>\n </template>\n\n <!-- Paragraph Skeleton -->\n <template v-else-if=\"type === 'paragraph'\">\n <div class=\"skeleton-paragraph\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-5-6\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-3-4\"\n ></div>\n </div>\n </template>\n\n <!-- Single Box Skeleton -->\n <template v-else-if=\"type === 'single-box'\">\n <div class=\"skeleton-single-box\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40 mb-2\"\n ></div>\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-4 skeleton-w-full\"\n ></div>\n </div>\n </template>\n\n <!-- Table Skeleton -->\n <template v-else-if=\"type === 'table'\">\n <div class=\"skeleton-table\">\n <div\n v-if=\"hasHeader\"\n class=\"skeleton-line skeleton-wave skeleton-h-6 skeleton-w-40\"\n ></div>\n <table class=\"table-full\">\n <tbody>\n <tr v-for=\"i in count\" :key=\"i\">\n <td class=\"td-padding\">\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-8 skeleton-w-full\"\n ></div>\n </td>\n <td class=\"td-padding\">\n <div\n class=\"skeleton-line skeleton-wave skeleton-h-8 skeleton-w-full\"\n ></div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </template>\n</template>\n\n<style>\n /* Main container styles */\n .skeleton-card {\n background-color: var(--freddy-bg-primary) a8;\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.5rem;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .skeleton-paragraph,\n .skeleton-single-box,\n .skeleton-single-paragraph {\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.75rem;\n background-color: var(--freddy-bg-primary) a8;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .skeleton-single-box {\n padding: 8px;\n }\n\n .skeleton-table {\n background-color: var(--freddy-bg-primary) a8;\n padding: 1rem;\n border: 2px solid var(--text-50, var(--text-inverse)) fff0a;\n border-radius: 0.5rem;\n overflow: hidden;\n box-shadow: 4px 7px 27px -13px #fdfdff0f;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n /* Skeleton shimmer */\n .skeleton-wave {\n position: relative;\n overflow: hidden;\n background-color: var(--text-900, var(--freddy-bg-primary));\n }\n .skeleton-wave::after {\n content: '';\n position: absolute;\n top: 0;\n left: -150%;\n height: 100%;\n width: 150%;\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0) 0%,\n rgba(255, 255, 255, 0.7) 50%,\n rgba(255, 255, 255, 0) 100%\n );\n animation: wave 3s ease-in-out infinite;\n }\n @keyframes wave {\n 0% {\n left: -150%;\n }\n 50% {\n left: 100%;\n }\n 100% {\n left: 100%;\n }\n }\n\n /* Skeleton line sizes */\n .skeleton-line {\n background-color: var(--text-50, var(--text-inverse)) fff17;\n border-radius: 0.25rem;\n }\n .skeleton-h-4 {\n height: 1rem;\n }\n .skeleton-h-6 {\n height: 1.5rem;\n }\n .skeleton-h-8 {\n height: 2rem;\n }\n\n .skeleton-w-full {\n width: 100%;\n }\n .skeleton-w-5-6 {\n width: 83.333333%;\n }\n .skeleton-w-3-4 {\n width: 75%;\n }\n .skeleton-w-40 {\n width: 10rem;\n }\n .skeleton-w-32 {\n width: 8rem;\n }\n\n /* Table styles */\n .table-full {\n min-width: 100%;\n border-collapse: collapse;\n }\n .td-padding {\n padding: 0.5rem 1.5rem;\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-slider-container\">\n <!-- Header row with label/tooltip and value display -->\n <div v-if=\"label || showValue\" class=\"freddy-plugins-slider-header\">\n <div v-if=\"label\" class=\"freddy-plugins-slider-label-section\">\n <span class=\"freddy-plugins-slider-label\">{{ label }}</span>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <IconInfoRounded class=\"freddy-plugins-slider-tooltip-icon\" />\n </Tooltip>\n </div>\n <div v-if=\"showValue\" class=\"freddy-plugins-slider-value-badge\">\n {{ displayValue }}\n </div>\n </div>\n\n <!-- Slider track -->\n <div\n class=\"freddy-plugins-slider-track-container\"\n :class=\"{ 'freddy-plugins-slider-disabled': disabled }\"\n @click=\"handleTrackClick\"\n @keydown=\"handleKeyDown\"\n :tabindex=\"disabled ? -1 : 0\"\n role=\"slider\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"modelValue\"\n :aria-disabled=\"disabled\"\n :aria-label=\"label || 'Slider'\"\n >\n <!-- Background track -->\n <div ref=\"sliderTrack\" class=\"freddy-plugins-slider-track-background\"></div>\n\n <!-- Progress fill -->\n <div\n class=\"freddy-plugins-slider-track-progress\"\n :style=\"{ width: progressPercentage + '%' }\"\n ></div>\n\n <!-- Thumb -->\n <div\n class=\"freddy-plugins-slider-thumb\"\n :class=\"{\n 'freddy-plugins-slider-thumb-dragging': isDragging,\n 'freddy-plugins-slider-thumb-disabled': disabled,\n }\"\n :style=\"{ left: thumbPosition + '%' }\"\n @mousedown=\"handleMouseDown\"\n @touchstart=\"handleTouchStart\"\n ></div>\n </div>\n\n <!-- Hint text -->\n <p v-if=\"hint\" class=\"freddy-plugins-slider-hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import IconInfoRounded from '@/icons/IconInfoRounded.vue';\n import Tooltip from './Tooltip.vue';\n import type { SliderProps } from '@/interfaces/slider.interfaces';\n\n const props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n disabled: false,\n showValue: true,\n range: false,\n tooltipPlacement: 'top',\n });\n\n const emit = defineEmits<{\n 'update:modelValue': [value: number];\n 'update:rangeValue': [range: [number, number]];\n }>();\n\n // Refs\n const isDragging = ref(false);\n const sliderTrack = ref<HTMLElement | null>(null);\n\n // Computed values\n const displayValue = computed(() => {\n return Math.round(props.modelValue);\n });\n\n const progressPercentage = computed(() => {\n const range = props.max - props.min;\n const value = props.modelValue - props.min;\n return Math.min(100, Math.max(0, (value / range) * 100));\n });\n\n const thumbPosition = computed(() => {\n return progressPercentage.value;\n });\n\n // Methods\n const clampValue = (value: number): number => {\n const stepped = Math.round(value / props.step) * props.step;\n return Math.min(props.max, Math.max(props.min, stepped));\n };\n\n const calculateValueFromPosition = (clientX: number): number => {\n if (!sliderTrack.value) return props.modelValue;\n\n const rect = sliderTrack.value.getBoundingClientRect();\n const percentage = Math.max(\n 0,\n Math.min(1, (clientX - rect.left) / rect.width)\n );\n const rawValue = props.min + percentage * (props.max - props.min);\n\n // Apply step rounding\n const steppedValue = Math.round(rawValue / props.step) * props.step;\n return Math.min(props.max, Math.max(props.min, steppedValue));\n };\n\n const updateValue = (newValue: number) => {\n const clampedValue = clampValue(newValue);\n if (clampedValue !== props.modelValue) {\n emit('update:modelValue', clampedValue);\n }\n };\n\n // Mouse handlers\n const handleMouseDown = (event: MouseEvent) => {\n if (props.disabled) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging.value = true;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging.value) return;\n e.preventDefault();\n const newValue = calculateValueFromPosition(e.clientX);\n updateValue(newValue);\n };\n\n const handleMouseUp = () => {\n isDragging.value = false;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n };\n\n // Touch handlers\n const handleTouchStart = (event: TouchEvent) => {\n if (props.disabled) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging.value = true;\n\n const handleTouchMove = (e: TouchEvent) => {\n if (!isDragging.value || !e.touches[0]) return;\n e.preventDefault();\n updateValue(calculateValueFromPosition(e.touches[0].clientX));\n };\n\n const handleTouchEnd = () => {\n isDragging.value = false;\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n };\n\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleTouchEnd);\n };\n\n // Track click handler\n const handleTrackClick = (event: MouseEvent) => {\n if (props.disabled || isDragging.value) return;\n event.preventDefault();\n event.stopPropagation();\n const newValue = calculateValueFromPosition(event.clientX);\n updateValue(newValue);\n };\n\n // Keyboard handler\n const handleKeyDown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n\n let newValue = props.modelValue;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n event.preventDefault();\n newValue = props.modelValue - props.step;\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n event.preventDefault();\n newValue = props.modelValue + props.step;\n break;\n case 'Home':\n event.preventDefault();\n newValue = props.min;\n break;\n case 'End':\n event.preventDefault();\n newValue = props.max;\n break;\n case 'PageDown':\n event.preventDefault();\n newValue = props.modelValue - props.step * 10;\n break;\n case 'PageUp':\n event.preventDefault();\n newValue = props.modelValue + props.step * 10;\n break;\n default:\n return;\n }\n\n updateValue(newValue);\n };\n</script>\n\n<style scoped>\n .freddy-plugins-slider-container {\n display: flex;\n flex-direction: column;\n gap: 5px;\n width: 100%;\n }\n\n .freddy-plugins-slider-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .freddy-plugins-slider-label-section {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .freddy-plugins-slider-label {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n }\n\n .freddy-plugins-slider-tooltip-icon {\n width: 16px;\n height: 16px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n cursor: pointer;\n }\n\n .freddy-plugins-slider-value-badge {\n border: 1px solid var(--colors-border-border-secondary, #35414b);\n border-radius: 4px;\n padding: 0 3px;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n text-align: center;\n min-width: 20px;\n }\n\n .freddy-plugins-slider-track-container {\n position: relative;\n height: 24px;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: opacity 0.2s ease;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n }\n\n .freddy-plugins-slider-track-container:focus-visible {\n outline: 2px solid var(--colors-texts-text-action, #7ba8ef);\n outline-offset: 2px;\n }\n\n .freddy-plugins-slider-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .freddy-plugins-slider-track-background {\n position: absolute;\n top: 8px;\n left: 0;\n right: 0;\n height: 8px;\n background-color: var(--colors-texts-text-tetriary, #cbd6e3);\n border-radius: 9999px;\n }\n\n .freddy-plugins-slider-track-progress {\n position: absolute;\n top: 8px;\n left: 0;\n height: 8px;\n background-color: var(--colors-texts-text-action, #7ba8ef);\n border-radius: 9999px;\n transition: width 0.2s ease;\n }\n\n .freddy-plugins-slider-thumb {\n position: absolute;\n top: 0;\n width: 24px;\n height: 24px;\n background-color: #ffffff;\n border: 2px solid var(--colors-texts-text-action, #7ba8ef);\n border-radius: 50%;\n cursor: grab;\n transform: translateX(-50%);\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n touch-action: none;\n }\n\n .freddy-plugins-slider-thumb:hover:not(.freddy-plugins-slider-thumb-disabled) {\n transform: translateX(-50%) scale(1.1);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n\n .freddy-plugins-slider-thumb-dragging {\n transform: translateX(-50%) scale(1.15);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);\n cursor: grabbing;\n }\n\n .freddy-plugins-slider-thumb-disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-slider-hint {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n margin: 0;\n }\n</style>\n","<template>\n <div\n class=\"freddy-plugins-snackbar-container\"\n :class=\"`freddy-plugins-snackbar-container--${getContainerSize}`\"\n >\n <div\n v-for=\"(toast, index) in snackQueue\"\n :key=\"index\"\n class=\"freddy-plugins-snackbar\"\n :class=\"`freddy-plugins-snackbar--${toast.toastType}`\"\n >\n <div class=\"freddy-plugins-snackbar-content\">\n <div class=\"freddy-plugins-snackbar-left\">\n <component\n :is=\"getToastIcon(toast.toastType)\"\n class=\"freddy-plugins-snackbar-icon\"\n :class=\"[\n toast.toastType === 'info' && 'freddy-plugins-snackbar-icon--info',\n toast.toastType === 'danger' &&\n 'freddy-plugins-snackbar-icon--danger',\n toast.toastType === 'success' &&\n 'freddy-plugins-snackbar-icon--success',\n ]\"\n />\n\n <div class=\"freddy-plugins-snackbar-text\">\n <p class=\"freddy-plugins-snackbar-title\" v-html=\"toast.title\" />\n <p class=\"freddy-plugins-snackbar-message\" v-html=\"toast.message\" />\n </div>\n </div>\n\n <button\n class=\"freddy-plugins-snackbar-close-btn\"\n @click=\"closeToast(index)\"\n >\n <IconLightCross class=\"freddy-plugins-snackbar-close-icon\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTheme } from '@/composables/useTheme'\n\nconst { currentProject, currentColorMode } = useTheme()\n\n\nimport { useSnackBar } from \"@/utility\";\nimport { computed } from \"vue\";\nimport IconLightCross from \"@/icons/IconLightCross.vue\";\nimport { IconCross, IconInfoRounded, IconCheckInCircle } from \"@/icons\";\n\nconst { snackQueue } = useSnackBar();\n\nconst getToastIcon = (toastType: string) => {\n switch (toastType) {\n case \"success\":\n return IconCheckInCircle;\n case \"danger\":\n return IconCross;\n case \"info\":\n return IconInfoRounded;\n default:\n return IconCheckInCircle;\n }\n};\n\nconst getContainerSize = computed(() => {\n const lastToast = snackQueue.value[snackQueue.value.length - 1];\n if (!lastToast) return \"side70\";\n switch (lastToast.toastContainerSize) {\n case \"half\":\n return \"half\";\n case \"full\":\n return \"full\";\n default:\n return \"side70\";\n }\n});\n\nconst closeToast = (index: number) => {\n snackQueue.value.splice(index, 1);\n};\n</script>\n\n<style>\n@keyframes fade-in-right {\n 0% {\n opacity: 0;\n transform: translateX(100%);\n }\n 100% {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.freddy-plugins-snackbar-container {\n position: fixed;\n right: 1.25rem; /* 20px */\n bottom: 0.5rem; /* 8px */\n padding-bottom: 17px;\n z-index: 50;\n}\n\n.freddy-plugins-snackbar-container--side70 {\n width: 78%;\n}\n\n.freddy-plugins-snackbar-container--half {\n width: 50%;\n}\n\n.freddy-plugins-snackbar-container--full {\n width: 100%;\n padding-left: 2.5rem; /* 40px */\n}\n\n.freddy-plugins-snackbar {\n margin-top: 0.75rem; /* 12px */\n padding: 1rem; /* 16px */\n border-radius: 1.5rem; /* 24px */\n background-color: var(--text-900, var(--freddy-bg-primary));\n animation: fade-in-right 0.5s ease-out;\n}\n\n.freddy-plugins-snackbar--info {\n border: 2px solid var(--text-50, var(--text-inverse))fff;\n box-shadow: 0 0 0 1px var(--text-50, var(--text-inverse));\n}\n\n.freddy-plugins-snackbar--danger {\n border: 2px solid var(--color-warning-500, var(--freddy-warning-color));\n box-shadow: 0 0 0 1px var(--color-warning-500, var(--freddy-warning-color));\n}\n\n.freddy-plugins-snackbar--success {\n border: 2px solid var(--color-success-500, var(--freddy-success-color));\n box-shadow: 0 0 0 1px var(--color-success-500, var(--freddy-success-color));\n}\n\n.freddy-plugins-snackbar-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n}\n\n.freddy-plugins-snackbar-left {\n display: flex;\n gap: 1rem; /* 16px */\n}\n\n.freddy-plugins-snackbar-icon {\n height: 16px; /* 32px */\n width: 16px;\n stroke-width: 2;\n color: var(--text-50, var(--text-inverse))fff;\n border-radius: 9999px;\n padding: 0.25rem; /* 4px */\n border: 4px solid transparent;\n box-sizing: content-box;\n}\n\n.freddy-plugins-snackbar-icon--info {\n border-color: var(--text-50, var(--text-inverse))fff33;\n background-color: var(--text-50, var(--text-inverse))fff17;\n}\n\n.freddy-plugins-snackbar-icon--danger {\n border-color: var(--color-warning-500, var(--freddy-warning-color));\n background-color: var(--color-warning-500, var(--freddy-warning-color));\n}\n\n.freddy-plugins-snackbar-icon--success {\n border-color: var(--color-success-500, var(--freddy-success-color));\n background-color: var(--color-success-400, var(--freddy-success-color));\n}\n\n.freddy-plugins-snackbar-text {\n display: flex;\n flex-direction: column;\n gap: 0.375rem; /* 6px */\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-title {\n font-size: 0.875rem; /* 14px */\n font-weight: 600;\n margin: 0;\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-message {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: normal;\n margin: 0;\n color: var(--text-50, var(--text-inverse))fff;\n}\n\n.freddy-plugins-snackbar-close-btn {\n position: absolute;\n right: 0.5rem;\n top: 0;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.freddy-plugins-snackbar-close-icon {\n height: 10px; /* 16px */\n width: 10px;\n stroke-width: 1.67;\n color: white;\n}\n</style>\n","<template>\n <div\n class=\"freddy-plugins-switch-slot\"\n :class=\"{\n 'freddy-plugins-switch-slot--bordered': variant === 'bordered',\n 'freddy-plugins-switch-slot--disabled': disabled,\n }\"\n >\n <!-- Header row with label/tooltip and switch -->\n <div class=\"freddy-plugins-switch-slot__header\">\n <div v-if=\"label || tooltip\" class=\"freddy-plugins-switch-slot__label-section\">\n <span v-if=\"label\" class=\"freddy-plugins-switch-slot__label\">{{ label }}</span>\n <Tooltip v-if=\"tooltip\" :text=\"tooltip\" :placement=\"tooltipPlacement\">\n <IconInfoRounded class=\"freddy-plugins-switch-slot__tooltip-icon\" />\n </Tooltip>\n </div>\n\n <!-- Switch control -->\n <button\n class=\"freddy-plugins-switch-slot__switch\"\n :class=\"{ 'freddy-plugins-switch-slot__switch--on': modelValue }\"\n :aria-checked=\"modelValue\"\n role=\"switch\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleToggle\"\n @keydown.space.prevent=\"handleToggle\"\n @keydown.enter.prevent=\"handleToggle\"\n :disabled=\"disabled\"\n >\n <span class=\"freddy-plugins-switch-slot__track\"></span>\n <span class=\"freddy-plugins-switch-slot__thumb\"></span>\n </button>\n </div>\n\n <!-- Slot content section (appears when showSlotContent is true) -->\n <div v-if=\"showSlotContent\" class=\"freddy-plugins-switch-slot__content\">\n <slot name=\"content\" />\n </div>\n\n <!-- Hint text -->\n <p v-if=\"hint\" class=\"freddy-plugins-switch-slot__hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import IconInfoRounded from '@/icons/IconInfoRounded.vue';\n import Tooltip from './Tooltip.vue';\n import type {\n SwitchSlotProps,\n SwitchSlotEmits,\n } from '@/interfaces/switch-slot.interfaces';\n\n const props = defineProps<SwitchSlotProps>();\n\n const emit = defineEmits<SwitchSlotEmits>();\n\n const handleToggle = (event: Event) => {\n event.stopPropagation();\n if (!props.disabled) {\n emit('update:modelValue', !props.modelValue);\n }\n };\n</script>\n\n<style scoped>\n .freddy-plugins-switch-slot {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n }\n\n .freddy-plugins-switch-slot--bordered {\n border: 1px solid var(--colors-border-border-secondary, #35414b);\n border-radius: 8px;\n padding: 6px;\n }\n\n .freddy-plugins-switch-slot--disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .freddy-plugins-switch-slot__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .freddy-plugins-switch-slot__label-section {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .freddy-plugins-switch-slot__label {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n }\n\n .freddy-plugins-switch-slot__tooltip-icon {\n width: 16px;\n height: 16px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n cursor: pointer;\n }\n\n .freddy-plugins-switch-slot__switch {\n position: relative;\n width: 56px;\n height: 30px;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n outline: none;\n display: inline-flex;\n align-items: center;\n transition: opacity 0.2s;\n }\n\n .freddy-plugins-switch-slot__switch:focus-visible {\n outline: 2px solid var(--colors-texts-text-action, #7ba8ef);\n outline-offset: 2px;\n }\n\n .freddy-plugins-switch-slot__switch:disabled {\n cursor: not-allowed;\n }\n\n .freddy-plugins-switch-slot__track {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background: var(--colors-background-bg-transparent-grey, #555555);\n border-radius: 100px;\n transition: background 0.2s;\n }\n\n .freddy-plugins-switch-slot__switch--on .freddy-plugins-switch-slot__track {\n background: var(--colors-texts-text-action, #7ba8ef);\n }\n\n .freddy-plugins-switch-slot__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 26px;\n height: 26px;\n background: #ffffff;\n border-radius: 50%;\n transition: left 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .freddy-plugins-switch-slot__switch--on .freddy-plugins-switch-slot__thumb {\n left: 28px;\n }\n\n .freddy-plugins-switch-slot__content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n gap: 8px;\n }\n\n .freddy-plugins-switch-slot__hint {\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n color: var(--colors-texts-text-tetriary, #cbd6e3);\n margin: 0;\n }\n</style>\n","<template>\n <div class=\"freddy-plugin-nav-bar\">\n <button\n class=\"freddy-plugin-tab-list-menu-button\"\n v-for=\"(tab, index) in tabList\"\n :key=\"index\"\n @click=\"handleTabSwitch(tab)\"\n >\n {{ tab.title }}\n <span\n :class=\"{ 'freddy-plugin-active-tab': activeTab === tab.id }\"\n ></span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { ref } from 'vue';\n import type { ITabList, IMenuListItem } from '@/interfaces';\n\n // props and emits\n const props = withDefaults(defineProps<ITabList>(), {\n currentTab: 0,\n });\n const emits = defineEmits(['tabSwitch']);\n\n // variables\n const activeTab = ref<number>(props.currentTab);\n\n // click event\n const handleTabSwitch = (tab: IMenuListItem): void => {\n if (activeTab.value === tab.id) return;\n activeTab.value = tab.id;\n emits('tabSwitch', tab.id);\n };\n</script>\n\n<style lang=\"css\">\n .freddy-plugin-nav-bar {\n display: flex;\n width: 100%;\n gap: 24px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.09); /* #FFFFFF17 */\n padding-right: 10px; /* pr-2.5 = 2.5 * 4px */\n font-family: 'Inter', sans-serif;\n font-size: 0.875rem; /* text-sm = 14px */\n font-weight: 600; /* font-semibold */\n }\n\n .freddy-plugin-tab-list-menu-button {\n all: unset; /* unset-all */\n display: flex;\n flex-direction: column;\n padding-top: 8px; /* pt-2 = 0.5rem = 8px */\n cursor: pointer;\n }\n\n .freddy-plugin-active-tab {\n width: 100%;\n background-color: #fff;\n height: 2px; /* h-0.5 = 0.125rem = 2px */\n border-top-left-radius: 0.375rem; /* rounded-t-md */\n border-top-right-radius: 0.375rem;\n }\n</style>\n","<template>\n <div\n :class=\"[\n 'freddy-plugin-nav-bar',\n `freddy-plugin-nav-bar--${orientation}`,\n `freddy-plugin-nav-bar--${computedActiveStateType}`,\n { 'freddy-plugin-nav-bar--full-width': props.fullWidth },\n ]\"\n >\n <button\n :class=\"[\n 'freddy-plugin-menu-button',\n `freddy-plugin-menu-button--${computedActiveStateType}`,\n { 'freddy-plugin-menu-button--active': activeTab === tab.id },\n { 'freddy-plugin-menu-button--full-width': props.fullWidth },\n ]\"\n v-for=\"(tab, index) in props.tabList\"\n :key=\"index\"\n @click=\"handleTabSwitch(tab)\"\n :aria-selected=\"activeTab === tab.id\"\n role=\"tab\"\n tabindex=\"0\"\n @keydown.enter=\"handleTabSwitch(tab)\"\n @keydown.space.prevent=\"handleTabSwitch(tab)\"\n >\n <span class=\"freddy-plugin-menu-button-label\">{{ tab.title }}</span>\n <span\n v-if=\"tab.badge !== undefined\"\n class=\"freddy-plugin-menu-button-badge\"\n >\n {{ tab.badge }}\n </span>\n <span\n v-if=\"computedActiveStateType === 'bottom-dash' && activeTab === tab.id\"\n :class=\"{ 'freddy-plugin-active-tab-bottom': activeTab === tab.id }\"\n ></span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { ref, watch, computed } from 'vue';\n import type { ITabList, IMenuListItem } from '@/interfaces';\n\n // props and emits\n const props = withDefaults(defineProps<ITabList>(), {\n currentTab: 0,\n activeStateType: 'bottom-dash',\n orientation: 'horizontal',\n fullWidth: false,\n });\n const emits = defineEmits(['tabSwitch']);\n\n // computed properties\n const activeStateType = computed(\n () => props.activeStateType || 'bottom-dash'\n );\n const orientation = computed(() => props.orientation || 'horizontal');\n\n // Auto-convert bottom-dash to left-dash for vertical orientation\n const computedActiveStateType = computed(() => {\n const currentOrientation = orientation.value;\n const currentStateType = activeStateType.value;\n\n // If vertical and bottom-dash, convert to left-dash\n if (\n currentOrientation === 'vertical' &&\n currentStateType === 'bottom-dash'\n ) {\n return 'left-dash';\n }\n\n // Map new activeStateType values to existing CSS class names\n const stateTypeMap: Record<string, string> = {\n 'bottom-dash': 'bottom-dash',\n 'bg-primary-active': 'background-21404F8F',\n 'primary-active': 'background-031525',\n 'bg-primary-active-bordered': 'background-border',\n };\n\n return stateTypeMap[currentStateType] || currentStateType;\n });\n\n // variables\n const activeTab = ref<number>(props.currentTab);\n\n // watch for prop changes\n watch(\n () => props.currentTab,\n newValue => {\n activeTab.value = newValue;\n }\n );\n\n // click event\n const handleTabSwitch = (tab: IMenuListItem): void => {\n if (activeTab.value === tab.id) return;\n activeTab.value = tab.id;\n emits('tabSwitch', tab.id);\n };\n</script>\n\n<style lang=\"css\">\n .freddy-plugin-nav-bar {\n display: flex;\n width: 100%;\n gap: 24px;\n font-family: 'Inter', sans-serif;\n font-size: 0.875rem; /* text-sm = 14px */\n font-weight: 600; /* font-semibold */\n }\n\n /* Horizontal orientation (default) */\n .freddy-plugin-nav-bar--horizontal {\n flex-direction: row;\n border-bottom: 1px solid #22262f;\n padding-right: 10px; /* pr-2.5 = 2.5 * 4px */\n }\n\n /* Vertical orientation */\n .freddy-plugin-nav-bar--vertical {\n flex-direction: column !important;\n gap: 8px;\n border-bottom: none;\n padding-right: 0;\n width: auto;\n }\n\n .freddy-plugin-nav-bar--vertical .freddy-plugin-menu-button {\n width: 100%;\n }\n\n .freddy-plugin-menu-button {\n all: unset; /* unset-all */\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n position: relative;\n transition: all 0.2s ease;\n color: var(--freddy-text-tertiary, #cbd6e3);\n outline: none;\n }\n\n .freddy-plugin-menu-button:focus-visible {\n outline: 2px solid var(--text-action, #7babef);\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .freddy-plugin-menu-button:focus:not(:focus-visible) {\n outline: none;\n }\n\n .freddy-plugin-menu-button-label {\n white-space: nowrap;\n }\n\n .freddy-plugin-menu-button-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--component-colors-utility-gray-blue-100, #eaecf5);\n border: 1px solid var(--text-gray, #717680);\n border-radius: 6px;\n padding: 2px 6px;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n color: var(--freddy-text-secondary, #9597a7);\n min-width: 20px;\n text-align: center;\n flex-shrink: 0;\n }\n\n /* Bottom Dash Style (Horizontal) */\n .freddy-plugin-nav-bar--bottom-dash {\n border-bottom: 1px solid #22262f;\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 4px 4px 12px 4px;\n }\n\n .freddy-plugin-active-tab-bottom {\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n width: 100%;\n background-color: #9597a7;\n height: 2px; /* h-0.5 = 0.125rem = 2px */\n border-top-left-radius: 0.375rem; /* rounded-t-md */\n border-top-right-radius: 0.375rem;\n }\n\n /* For text-width underlines (not full-width), ensure underline matches content */\n .freddy-plugin-nav-bar--bottom-dash:not(.freddy-plugin-nav-bar--full-width)\n .freddy-plugin-menu-button {\n width: auto;\n }\n\n /* Text-width underline should match content area (excluding padding) */\n .freddy-plugin-nav-bar--bottom-dash:not(.freddy-plugin-nav-bar--full-width)\n .freddy-plugin-active-tab-bottom {\n left: 4px;\n right: 4px;\n width: auto;\n }\n\n /* Full width styles */\n .freddy-plugin-nav-bar--full-width {\n width: 100%;\n }\n\n .freddy-plugin-nav-bar--full-width .freddy-plugin-menu-button {\n flex: 1;\n justify-content: center;\n min-width: 0; /* Allow flex items to shrink below content size */\n }\n\n .freddy-plugin-nav-bar--full-width .freddy-plugin-active-tab-bottom {\n width: 100%;\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button--active {\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--bottom-dash .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--bottom-dash\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n .freddy-plugin-nav-bar--bottom-dash\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Left Dash Style (Vertical) */\n .freddy-plugin-nav-bar--left-dash {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 2px 12px;\n height: 24px;\n border-left: 2px solid transparent;\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button--active {\n border-left: 2px solid #9597a7;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--left-dash .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--left-dash\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n .freddy-plugin-nav-bar--left-dash\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Background Border Style */\n .freddy-plugin-nav-bar--background-border .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 36px;\n background: transparent;\n border: 1px solid transparent;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-border {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-border .freddy-plugin-menu-button--active {\n background: var(--freddy-bg-primary-hover, rgba(42, 57, 71, 0.73));\n border: 1px solid var(--text-gray, #717680);\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-border\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-border\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n /* Background 031525 Style (Vertical) */\n .freddy-plugin-nav-bar--background-031525 {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-031525 {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-031525 .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 44px;\n background: transparent;\n border: none;\n }\n\n .freddy-plugin-nav-bar--background-031525 .freddy-plugin-menu-button--active {\n background: #031525;\n border: none;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-tertiary, #cbd6e3);\n }\n\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--background-031525\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n /* Background 21404F8F Style (Vertical) */\n .freddy-plugin-nav-bar--background-21404F8F {\n border-bottom: none;\n }\n\n .freddy-plugin-nav-bar--vertical.freddy-plugin-nav-bar--background-21404F8F {\n flex-direction: column;\n }\n\n .freddy-plugin-nav-bar--background-21404F8F .freddy-plugin-menu-button {\n flex-direction: row;\n padding: 8px 12px;\n border-radius: 8px;\n height: 44px;\n background: transparent;\n border: none;\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active {\n background: rgba(33, 64, 79, 0.561);\n border: none;\n color: var(--freddy-text-primary, #ffffff);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active\n .freddy-plugin-menu-button-badge {\n color: var(--freddy-text-secondary, #9597a7);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-tertiary, #cbd6e3);\n }\n\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active:focus,\n .freddy-plugin-nav-bar--background-21404F8F\n .freddy-plugin-menu-button--active:focus-visible {\n outline: none;\n }\n\n /* Hover states */\n .freddy-plugin-menu-button:hover:not(.freddy-plugin-menu-button--active) {\n color: var(--freddy-text-primary, #ffffff);\n }\n</style>\n","<template>\n <div class=\"freddy-plugins-toast-wrapper\">\n <div\n v-for=\"(toast, index) in toastQueue\"\n :key=\"index\"\n :class=\"['freddy-plugins-toast-item', getToastClass(toast.toastType)]\"\n >\n <div class=\"freddy-plugins-toast-icon-wrapper\">\n <component :is=\"getToastIcon(toast.toastType)\" class=\"freddy-plugins-toast-icon\" />\n </div>\n\n <span class=\"freddy-plugins-toast-message\">\n {{ toast.message }}\n </span>\n\n <button class=\"freddy-plugins-toast-close-button\" @click=\"closeToast(index)\">\n <IconCross class=\"freddy-plugins-toast-close-icon\" />\n </button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useToast } from \"@/utility/useToast\";\nimport { IconTick, IconInfoRounded, IconCross } from \"@/icons\";\n\nconst { toastQueue } = useToast();\n\ntype ToastType = \"success\" | \"danger\" | \"info\";\n\nconst toastTypeMap: Record<ToastType, string> = {\n success: \"freddy-plugins-toast-success\",\n danger: \"freddy-plugins-toast-danger\",\n info: \"freddy-plugins-toast-info\",\n};\n\nconst getToastClass = (toastType: ToastType): string => toastTypeMap[toastType];\n\nconst getToastIcon = (toastType: string) => {\n switch (toastType) {\n case \"success\":\n return IconTick;\n case \"danger\":\n return IconCross;\n case \"info\":\n return IconInfoRounded;\n default:\n return IconTick;\n }\n};\n\nconst closeToast = (index: number) => {\n toastQueue.value.splice(index, 1);\n};\n</script>\n\n<style>\n.freddy-plugins-toast-wrapper {\n position: fixed;\n right: 10px;\n bottom: 10px;\n display: flex;\n flex-direction: column;\n gap: 0.5rem; /* 2px spacing (Tailwind space-y-2) */\n}\n\n.freddy-plugins-toast-item {\n display: flex;\n align-items: center;\n padding: 0.625rem; /* Tailwind p-2.5 */\n gap: 0.625rem; /* Tailwind gap-2.5 */\n border-radius: 10px;\n box-shadow: 0 1px 3px var(--border-light);\n animation: fadeIn 0.3s ease;\n}\n\n.freddy-plugins-toast-success {\n background-color: var(--color-success-500, var(--freddy-success-color));\n --toast-icon-color: var(--color-success-500, var(--freddy-success-color));\n}\n\n.freddy-plugins-toast-danger {\n background-color: var(--color-destructive-500, var(--freddy-error-color));\n --toast-icon-color: var(--color-destructive-500, var(--freddy-error-color));\n}\n\n.freddy-plugins-toast-info {\n background-color: var(--color-primary-500, var(--freddy-primary-color));\n --toast-icon-color: var(--color-primary-500, var(--freddy-primary-color));\n}\n\n.freddy-plugins-toast-icon-wrapper {\n width: 1.25rem; /* Tailwind w-5 */\n height: 1.25rem; /* Tailwind h-5 */\n background-color: var(--freddy-bg-secondary);\n border-radius: 9999px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.freddy-plugins-toast-icon {\n width: 100%;\n height: 100%;\n padding: 0.25rem; /* Tailwind p-1 */\n color: var(--toast-icon-color);\n}\n\n.freddy-plugins-toast-message {\n min-width: 16rem; /* Tailwind min-w-64 */\n max-width: 420px; /* Tailwind max-w-[420px] */\n flex: 1 1 auto; /* Tailwind flex-1 */\n font-size: 1rem; /* Tailwind text-[16px] */\n font-weight: 500; /* Tailwind font-medium */\n color: white;\n}\n\n.freddy-plugins-toast-close-button {\n width: 1rem; /* Tailwind w-4 */\n height: 1rem; /* Tailwind h-4 */\n background: transparent;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.freddy-plugins-toast-close-icon {\n width: 100%;\n height: 100%;\n padding: 0.125rem; /* Tailwind p-0.5 */\n color: white;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n</style>\n","<template>\n <div\n ref=\"tooltipWrapper\"\n class=\"freddy-plugins-tooltip-v2-wrapper\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @focusin=\"handleFocusIn\"\n @focusout=\"handleFocusOut\"\n tabindex=\"0\"\n >\n <slot />\n <transition name=\"fade\">\n <div\n v-if=\"show\"\n class=\"freddy-plugins-tooltip-v2-content\"\n :class=\"[\n placement,\n shouldShowBelow ? 'force-bottom' : '',\n contentClass,\n ]\"\n role=\"tooltip\"\n :aria-label=\"text\"\n >\n <slot name=\"content\">\n <span v-if=\"html\" v-html=\"text\"></span>\n <span v-else>{{ text }}</span>\n </slot>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n interface TooltipV2Props {\n /** The text content to display in the tooltip */\n text?: string;\n /** The placement of the tooltip relative to the trigger element */\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Whether to render the text as HTML */\n html?: boolean;\n /** Custom CSS class to apply to the tooltip content */\n contentClass?: string;\n /** Delay before showing the tooltip (in milliseconds) */\n delay?: number;\n /** Delay before hiding the tooltip (in milliseconds) */\n hideDelay?: number;\n }\n\n const props = withDefaults(defineProps<TooltipV2Props>(), {\n placement: 'top',\n delay: 200,\n hideDelay: 0,\n html: false,\n });\n\n const show = ref(false);\n const shouldShowBelow = ref(false);\n const tooltipWrapper = ref<HTMLElement | null>(null);\n let showTimeout: ReturnType<typeof setTimeout> | null = null;\n let hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const handleMouseEnter = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n if (showTimeout) clearTimeout(showTimeout);\n showTimeout = setTimeout(() => {\n // Check if there's enough space above the element\n if (tooltipWrapper.value) {\n const rect = tooltipWrapper.value.getBoundingClientRect();\n shouldShowBelow.value = rect.top < 150; // If less than 150px from top, show below\n }\n show.value = true;\n }, props.delay);\n };\n\n const handleMouseLeave = () => {\n if (showTimeout) {\n clearTimeout(showTimeout);\n showTimeout = null;\n }\n hideTimeout = setTimeout(() => {\n show.value = false;\n }, props.hideDelay);\n };\n\n const handleFocusIn = () => {\n handleMouseEnter();\n };\n\n const handleFocusOut = () => {\n handleMouseLeave();\n };\n</script>\n\n<style scoped>\n .freddy-plugins-tooltip-v2-wrapper {\n display: inline-block;\n position: relative;\n }\n\n .freddy-plugins-tooltip-v2-content {\n position: absolute;\n z-index: 1000;\n background-color: var(--freddy-bg-secondary);\n color: var(--freddy-text-primary);\n font-size: var(--freddy-font-size-sm);\n padding: var(--freddy-spacing-sm) var(--freddy-spacing-md);\n border-radius: var(--freddy-radius-md);\n border: 1px solid var(--freddy-border-secondary);\n box-shadow: var(--freddy-shadow-lg);\n white-space: normal;\n max-width: 300px;\n min-width: 120px;\n pointer-events: none;\n line-height: 1.4;\n word-wrap: break-word;\n word-break: break-word;\n left: 50%;\n transform: translateX(-50%);\n bottom: calc(100% + 8px);\n }\n\n .freddy-plugins-tooltip-v2-content.bottom {\n top: calc(100% + 8px);\n bottom: auto;\n }\n\n .freddy-plugins-tooltip-v2-content.left {\n left: auto;\n right: calc(100% + 8px);\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n }\n\n .freddy-plugins-tooltip-v2-content.right {\n left: calc(100% + 8px);\n top: 50%;\n bottom: auto;\n transform: translateY(-50%);\n }\n\n .freddy-plugins-tooltip-v2-content.force-bottom {\n top: calc(100% + 8px);\n bottom: auto;\n }\n\n .fade-enter-active,\n .fade-leave-active {\n transition: opacity 0.15s ease-in-out;\n }\n\n .fade-enter-from,\n .fade-leave-to {\n opacity: 0;\n }\n</style>\n","import { ref, computed } from 'vue';\n\nexport interface ErrorDetails {\n message: string;\n code?: string | number;\n stack?: string;\n timestamp: string;\n context?: Record<string, unknown>;\n}\n\nexport interface UseErrorHandlerOptions {\n logErrors?: boolean;\n throwOnCritical?: boolean;\n maxRetries?: number;\n}\n\n/**\n * Composable for centralized error handling\n */\nexport function useErrorHandler(options: UseErrorHandlerOptions = {}) {\n const {\n logErrors = true,\n throwOnCritical = false,\n maxRetries = 3\n } = options;\n\n const errors = ref<ErrorDetails[]>([]);\n const isLoading = ref(false);\n const retryCount = ref(0);\n\n const hasErrors = computed(() => errors.value.length > 0);\n const latestError = computed(() => errors.value[errors.value.length - 1] || null);\n\n /**\n * Handle an error with enhanced context\n */\n const handleError = (\n error: unknown,\n context?: Record<string, unknown>\n ): ErrorDetails => {\n const errorDetails: ErrorDetails = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n timestamp: new Date().toISOString(),\n context: {\n ...context,\n retryCount: retryCount.value,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Unknown'\n }\n };\n\n // Add HTTP status code if available\n if (error && typeof error === 'object' && 'status' in error) {\n errorDetails.code = (error as { status: number }).status;\n }\n\n errors.value.push(errorDetails);\n\n // Log in development\n if (logErrors && process.env.NODE_ENV === 'development') {\n // Error logging - implement proper error reporting in production\n // Error: error, Context: context, Details: errorDetails\n }\n\n // Throw critical errors if configured\n if (throwOnCritical && isCriticalError(error)) {\n throw error;\n }\n\n return errorDetails;\n };\n\n /**\n * Handle async operations with error catching\n */\n const handleAsync = async <T>(\n operation: () => Promise<T>,\n context?: Record<string, unknown>\n ): Promise<{ data: T | null; error: ErrorDetails | null }> => {\n isLoading.value = true;\n \n try {\n const data = await operation();\n retryCount.value = 0; // Reset on success\n return { data, error: null };\n } catch (error) {\n const errorDetails = handleError(error, context);\n return { data: null, error: errorDetails };\n } finally {\n isLoading.value = false;\n }\n };\n\n /**\n * Retry an async operation with exponential backoff\n */\n const retryAsync = async <T>(\n operation: () => Promise<T>,\n context?: Record<string, unknown>\n ): Promise<{ data: T | null; error: ErrorDetails | null }> => {\n let lastError: ErrorDetails | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n retryCount.value = attempt - 1;\n \n const result = await handleAsync(operation, {\n ...context,\n attempt,\n maxRetries\n });\n\n if (result.data !== null) {\n return result;\n }\n\n lastError = result.error;\n\n // Don't retry on client errors (4xx)\n if (lastError?.code && typeof lastError.code === 'number' && \n lastError.code >= 400 && lastError.code < 500) {\n break;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < maxRetries) {\n await new Promise(resolve => \n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n\n return { data: null, error: lastError };\n };\n\n /**\n * Clear all errors\n */\n const clearErrors = () => {\n errors.value = [];\n retryCount.value = 0;\n };\n\n /**\n * Clear specific error by index\n */\n const clearError = (index: number) => {\n if (index >= 0 && index < errors.value.length) {\n errors.value.splice(index, 1);\n }\n };\n\n /**\n * Check if error is critical (should stop execution)\n */\n const isCriticalError = (error: unknown): boolean => {\n if (error instanceof Error) {\n // Network errors are usually not critical\n if (error.name === 'NetworkError' || error.name === 'TypeError') {\n return false;\n }\n \n // Syntax errors are critical\n if (error.name === 'SyntaxError') {\n return true;\n }\n }\n\n // HTTP 5xx errors are critical\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n return status >= 500;\n }\n\n return false;\n };\n\n return {\n // State\n errors: computed(() => errors.value),\n hasErrors,\n latestError,\n isLoading: computed(() => isLoading.value),\n retryCount: computed(() => retryCount.value),\n\n // Methods\n handleError,\n handleAsync,\n retryAsync,\n clearErrors,\n clearError,\n isCriticalError\n };\n}\n","import { ref, computed, onMounted, nextTick } from 'vue';\n\nexport interface PerformanceMetrics {\n renderTime: number;\n componentCount: number;\n memoryUsage?: number;\n timestamp: string;\n}\n\nexport interface UsePerformanceOptions {\n enableMetrics?: boolean;\n trackMemory?: boolean;\n sampleRate?: number; // 0-1, percentage of operations to track\n}\n\n/**\n * Composable for performance monitoring and optimization\n */\nexport function usePerformance(options: UsePerformanceOptions = {}) {\n const {\n enableMetrics = process.env.NODE_ENV === 'development',\n trackMemory = false,\n sampleRate = 0.1\n } = options;\n\n const metrics = ref<PerformanceMetrics[]>([]);\n const isTracking = ref(false);\n const startTime = ref(0);\n\n const averageRenderTime = computed(() => {\n if (metrics.value.length === 0) return 0;\n const total = metrics.value.reduce((sum, m) => sum + m.renderTime, 0);\n return total / metrics.value.length;\n });\n\n const maxRenderTime = computed(() => {\n if (metrics.value.length === 0) return 0;\n return Math.max(...metrics.value.map(m => m.renderTime));\n });\n\n /**\n * Start performance tracking\n */\n const startTracking = (label?: string) => {\n if (!enableMetrics || Math.random() > sampleRate) return;\n \n isTracking.value = true;\n startTime.value = performance.now();\n \n if (label && process.env.NODE_ENV === 'development') {\n }\n };\n\n /**\n * End performance tracking and record metrics\n */\n const endTracking = (label?: string, componentCount = 1) => {\n if (!isTracking.value || !enableMetrics) return;\n \n const endTime = performance.now();\n const renderTime = endTime - startTime.value;\n \n const metric: PerformanceMetrics = {\n renderTime,\n componentCount,\n timestamp: new Date().toISOString()\n };\n\n // Add memory usage if tracking is enabled\n if (trackMemory && 'memory' in performance) {\n const memory = (performance as any).memory;\n metric.memoryUsage = memory.usedJSHeapSize;\n }\n\n metrics.value.push(metric);\n \n // Keep only last 100 metrics to prevent memory leaks\n if (metrics.value.length > 100) {\n metrics.value.shift();\n }\n\n isTracking.value = false;\n \n if (label && process.env.NODE_ENV === 'development') {\n \n // Warn about slow renders\n if (renderTime > 16) { // 60fps threshold\n // Slow render detected - implement performance monitoring in production\n }\n }\n\n return metric;\n };\n\n /**\n * Measure async operation performance\n */\n const measureAsync = async <T>(\n operation: () => Promise<T>,\n label?: string\n ): Promise<{ result: T; metrics: PerformanceMetrics }> => {\n startTracking(label);\n \n try {\n const result = await operation();\n const metrics = endTracking(label) || {\n renderTime: 0,\n componentCount: 1,\n timestamp: new Date().toISOString()\n };\n \n return { result, metrics };\n } catch (error) {\n endTracking(label);\n throw error;\n }\n };\n\n /**\n * Debounce function for performance optimization\n */\n const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n ): ((...args: Parameters<T>) => void) => {\n let timeout: ReturnType<typeof setTimeout>;\n \n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n };\n\n /**\n * Throttle function for performance optimization\n */\n const throttle = <T extends (...args: any[]) => any>(\n func: T,\n limit: number\n ): ((...args: Parameters<T>) => void) => {\n let inThrottle: boolean;\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n };\n\n /**\n * Optimize heavy computations with requestIdleCallback\n */\n const scheduleWork = (callback: () => void, timeout = 5000) => {\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(callback, { timeout });\n } else {\n // Fallback for browsers without requestIdleCallback\n setTimeout(callback, 0);\n }\n };\n\n /**\n * Lazy load components or data\n */\n const lazyLoad = async <T>(\n loader: () => Promise<T>,\n delay = 0\n ): Promise<T> => {\n if (delay > 0) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n \n return new Promise((resolve) => {\n scheduleWork(async () => {\n try {\n const result = await loader();\n resolve(result);\n } catch (error) {\n throw error;\n }\n });\n });\n };\n\n /**\n * Virtual scrolling helper for large lists\n */\n const createVirtualList = <T>(\n items: T[],\n itemHeight: number,\n containerHeight: number\n ) => {\n const visibleCount = Math.ceil(containerHeight / itemHeight);\n const buffer = Math.ceil(visibleCount * 0.5); // 50% buffer\n \n return (scrollTop: number) => {\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - buffer);\n const endIndex = Math.min(items.length, startIndex + visibleCount + buffer * 2);\n \n return {\n visibleItems: items.slice(startIndex, endIndex),\n startIndex,\n endIndex,\n totalHeight: items.length * itemHeight,\n offsetY: startIndex * itemHeight\n };\n };\n };\n\n /**\n * Clear all metrics\n */\n const clearMetrics = () => {\n metrics.value = [];\n };\n\n /**\n * Get performance summary\n */\n const getSummary = () => {\n return {\n totalMeasurements: metrics.value.length,\n averageRenderTime: averageRenderTime.value,\n maxRenderTime: maxRenderTime.value,\n recentMetrics: metrics.value.slice(-10)\n };\n };\n\n // Auto-track component lifecycle in development\n if (enableMetrics && process.env.NODE_ENV === 'development') {\n onMounted(() => {\n startTracking('Component Mount');\n nextTick(() => {\n endTracking('Component Mount');\n });\n });\n }\n\n return {\n // State\n metrics: computed(() => metrics.value),\n isTracking: computed(() => isTracking.value),\n averageRenderTime,\n maxRenderTime,\n\n // Performance tracking\n startTracking,\n endTracking,\n measureAsync,\n\n // Optimization utilities\n debounce,\n throttle,\n scheduleWork,\n lazyLoad,\n createVirtualList,\n\n // Management\n clearMetrics,\n getSummary\n };\n}\n"],"names":["IconStyleDirective","el","themeServicePlugin","app","useThemeService","DOMPurify","loadDOMPurify","SAFE_TAGS","SAFE_ATTRS","basicSanitize","html","sanitizeContent","content","vFrSanitize","binding","FreddyPlugin","components","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","__vite_glob_0_18","__vite_glob_0_19","__vite_glob_0_20","__vite_glob_0_21","__vite_glob_0_22","__vite_glob_0_23","__vite_glob_0_24","__vite_glob_0_25","__vite_glob_0_26","__vite_glob_0_27","__vite_glob_0_28","__vite_glob_0_29","__vite_glob_0_30","__vite_glob_0_31","__vite_glob_0_32","__vite_glob_0_33","__vite_glob_0_34","__vite_glob_0_35","__vite_glob_0_36","__vite_glob_0_37","__vite_glob_0_38","__vite_glob_0_39","__vite_glob_0_40","__vite_glob_0_41","__vite_glob_0_42","__vite_glob_0_43","__vite_glob_0_44","__vite_glob_0_45","__vite_glob_0_46","__vite_glob_0_47","__vite_glob_0_48","__vite_glob_0_49","__vite_glob_0_50","__vite_glob_0_51","__vite_glob_0_52","__vite_glob_0_53","__vite_glob_0_54","__vite_glob_0_55","__vite_glob_0_56","__vite_glob_0_57","__vite_glob_0_58","__vite_glob_0_59","__vite_glob_0_60","__vite_glob_0_61","__vite_glob_0_62","__vite_glob_0_63","__vite_glob_0_64","__vite_glob_0_65","__vite_glob_0_66","__vite_glob_0_67","__vite_glob_0_68","__vite_glob_0_69","__vite_glob_0_70","__vite_glob_0_71","__vite_glob_0_72","__vite_glob_0_73","__vite_glob_0_74","__vite_glob_0_75","__vite_glob_0_76","__vite_glob_0_77","__vite_glob_0_78","__vite_glob_0_79","__vite_glob_0_80","__vite_glob_0_81","__vite_glob_0_82","__vite_glob_0_83","__vite_glob_0_84","__vite_glob_0_85","__vite_glob_0_86","__vite_glob_0_87","__vite_glob_0_88","__vite_glob_0_89","__vite_glob_0_90","__vite_glob_0_91","__vite_glob_0_92","__vite_glob_0_93","__vite_glob_0_94","__vite_glob_0_95","__vite_glob_0_96","__vite_glob_0_97","__vite_glob_0_98","__vite_glob_0_99","__vite_glob_0_100","__vite_glob_0_101","__vite_glob_0_102","__vite_glob_0_103","__vite_glob_0_104","__vite_glob_0_105","__vite_glob_0_106","__vite_glob_0_107","__vite_glob_0_108","__vite_glob_0_109","__vite_glob_0_110","__vite_glob_0_111","__vite_glob_0_112","__vite_glob_0_113","__vite_glob_0_114","__vite_glob_0_115","__vite_glob_0_116","__vite_glob_0_117","__vite_glob_0_118","__vite_glob_0_119","__vite_glob_0_120","__vite_glob_0_121","__vite_glob_0_122","__vite_glob_0_123","__vite_glob_0_124","__vite_glob_0_125","__vite_glob_0_126","__vite_glob_0_127","__vite_glob_0_128","__vite_glob_0_129","__vite_glob_0_130","__vite_glob_0_131","__vite_glob_0_132","__vite_glob_0_133","__vite_glob_0_134","__vite_glob_0_135","__vite_glob_0_136","__vite_glob_0_137","__vite_glob_0_138","__vite_glob_0_139","__vite_glob_0_140","__vite_glob_0_141","__vite_glob_0_142","__vite_glob_0_143","__vite_glob_0_144","__vite_glob_0_145","path","component","name","_a","frSanitizePlugin","iconStylePlugin","_createElementBlock","_normalizeClass","customClass","customStyle","_createBlock","_Transition","isVisible","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","largeModel","_hoisted_3","_renderSlot","_ctx","_hoisted_4","_hoisted_5","currentProject","currentColorMode","useTheme","show","ref","shouldShowBelow","tooltipWrapper","showTimeout","open","rect","close","_createVNode","placement","contentClass","text","props","__props","iconComponents","defineAsyncComponent","n","LeftIconComponent","computed","RightIconComponent","emit","__emit","isHovered","buttonClasses","handleClick","event","handleLeftIconClick","handleRightIconClick","handleMouseEnter","handleMouseLeave","tooltip","Tooltip","tooltipPlacement","disabled","loading","iconOnly","label","_Fragment","loadingText","_toDisplayString","_resolveDynamicComponent","size","leftIcon","rightIcon","_hoisted_6","providerConfigs","IconGoogle","IconFacebook","IconApple","IconX","IconFigma","IconDribbble","containerClasses","getProviderIcon","provider","getProviderLabel","getButtonClasses","style","_renderList","providers","$event","theme","highlighted","highlighter","createHighlighter","loadShiki","supportedLangs","highlightCode","watch","onMounted","onChange","target","isChecked","blueCheckbox","ariaLabel","isDashInput","textareaRef","localContent","newValue","handleInput","diffContent","originalWords","improvedWords","diffHtml","removedText","word","addedText","__expose","showDiff","placeholder","toggle","modelValue","searchQuery","selected","localOptions","shallowRef","newOptions","initializeSelected","def","opt","displayLabel","iconToShow","IconChevronUp","IconChevronDown","toggleDropdown","closeDropdown","filteredOptions","option","handleOptionClick","selectOption","handleToggle","val","idx","o","onClickOutside","BaseButton","chevronRight","showIcon","openUp","searchable","searchPlaceholder","optionIconRight","showShortcut","Switch","_hoisted_7","brand","error","resendCooldown","codeDigits","inputRefs","isCodeComplete","digit","verificationCode","handleDigitInput","index","value","nextTick","handleKeydown","handlePaste","pastedData","digits","nextEmptyIndex","focusIndex","handleSubmit","handleResend","_unref","_cache","email","_","_vModelText","_hoisted_8","_hoisted_9","_hoisted_10","inputId","focusInput","colorStyle","required","hintText","inputRef","baseInputRef","rawValue","displayValue","detectedCardType","baseProps","resolveIcon","iconName","__variableDynamicImportRuntimeHelper","resolvedTrailingIcon","cardNumberMaxLength","inputClasses","detectCardType","number","cleanNumber","formatCardNumber","cleanValue","getCardTypeIcon","cardType","icons","handleCardInput","inputValue","newCardType","handleCardKeydown","handleFocus","handleBlur","handleTrailingIconClick","focus","BaseInput","_mergeProps","showCardIcon","readonly","resolvedLeadingIcon","handleLeadingIconClick","inputType","trailingIcon","tooltipText","phoneNumberValue","showCountryDropdown","localCountryCode","defaultCountryOptions","countryOptions","selectedCountry","country","toggleCountryDropdown","selectCountry","currentNumber","newFormattedNumber","handlePhoneInput","fullNumber","handleClickOutside","newCode","onUnmounted","IconQuestion","variant","phoneProps","cardProps","defaultProps","handleUpdate","handleCountryCodeUpdate","code","handlePhoneNumberUpdate","handleCountryChange","handleCardNumberUpdate","handleCardTypeDetected","PhoneInput","CardInput","DefaultInput","_sfc_main","$props","ModalBox","height","emits","closeModal","clickOutside","headerClass","modalTitle","IconLightCross","attrs","useAttrs","searchInput","dropdownRef","handleClear","IconSearch","maxCharLimit","showLoaderForSearch","Spinner","showCloseButton","IconCross","selectedOption","isOpen","_b","modelPlaceholder","SearchInput","totalPages","pages","result","tp","cp","i","goToPage","page","active","$emit","IconSend","type","hasHeader","count","isDragging","sliderTrack","progressPercentage","range","thumbPosition","clampValue","stepped","calculateValueFromPosition","clientX","percentage","steppedValue","updateValue","clampedValue","handleMouseDown","handleMouseMove","e","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","handleTrackClick","handleKeyDown","showValue","IconInfoRounded","min","max","hint","snackQueue","useSnackBar","getToastIcon","toastType","IconCheckInCircle","getContainerSize","lastToast","closeToast","toast","showSlotContent","activeTab","handleTabSwitch","tab","tabList","activeStateType","orientation","computedActiveStateType","currentOrientation","currentStateType","_withKeys","_withModifiers","toastQueue","useToast","toastTypeMap","getToastClass","IconTick","hideTimeout","handleFocusIn","handleFocusOut","useErrorHandler","options","logErrors","throwOnCritical","maxRetries","errors","isLoading","retryCount","hasErrors","latestError","handleError","context","errorDetails","isCriticalError","handleAsync","operation","data","retryAsync","lastError","attempt","resolve","clearErrors","clearError","usePerformance","enableMetrics","trackMemory","sampleRate","metrics","isTracking","startTime","averageRenderTime","sum","m","maxRenderTime","startTracking","endTracking","componentCount","metric","memory","measureAsync","debounce","func","wait","timeout","args","throttle","limit","inThrottle","scheduleWork","callback","lazyLoad","loader","delay","createVirtualList","items","itemHeight","containerHeight","visibleCount","buffer","scrollTop","startIndex","endIndex","clearMetrics","getSummary"],"mappings":"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"}