@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/CHANGELOG.md +28 -0
- package/dist/freddy-plugins.css +1 -1
- package/dist/{icons-tCQ-O4_0.js → icons-BeZGWK3s.js} +519 -389
- package/dist/{icons-tCQ-O4_0.js.map → icons-BeZGWK3s.js.map} +1 -1
- package/dist/icons-DQqi52kz.cjs +2 -0
- package/dist/{icons-DaAdlBbv.cjs.map → icons-DQqi52kz.cjs.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +362 -0
- package/dist/index.js +874 -728
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/icons-DaAdlBbv.cjs +0 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</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","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.cjs","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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")}</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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"}
|