From a20fceed2bbaf153d60b053bf997e79f039e39b0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Feb 2026 23:08:37 +0000 Subject: [PATCH 1/3] Initial plan From b024d02a043ce6451cb0529449bbe6a8cf6194a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Feb 2026 23:19:27 +0000 Subject: [PATCH 2/3] Fix Advanced Authentication cleanups: external URL, forgot password dialog, edit user modal, info box, i18n Co-authored-by: cadtoolbox <12723486+cadtoolbox@users.noreply.github.com> --- backend/app/api/routes/auth.py | 19 +- backend/app/api/routes/users.py | 9 +- .../CreateUserAdvancedAuthModal.tsx | 3 +- frontend/src/i18n/locales/de.ts | 3 + frontend/src/i18n/locales/en.ts | 3 + frontend/src/i18n/locales/ja.ts | 3 + frontend/src/pages/LoginPage.tsx | 178 ++++++++--------- frontend/src/pages/SettingsPage.tsx | 123 ++++++++---- static/assets/index-DbCAeYz5.css | 1 - .../{index-C0uTHy_F.js => index-NgO9xbrN.js} | 180 +++++++++--------- static/assets/index-RuMjImbZ.css | 1 + static/index.html | 4 +- 12 files changed, 311 insertions(+), 216 deletions(-) delete mode 100644 static/assets/index-DbCAeYz5.css rename static/assets/{index-C0uTHy_F.js => index-NgO9xbrN.js} (79%) create mode 100644 static/assets/index-RuMjImbZ.css diff --git a/backend/app/api/routes/auth.py b/backend/app/api/routes/auth.py index f7f56a4e6..b942c972a 100644 --- a/backend/app/api/routes/auth.py +++ b/backend/app/api/routes/auth.py @@ -41,6 +41,7 @@ from backend.app.services.email_service import ( save_smtp_settings, send_email, ) +from backend.app.api.routes.settings import get_setting def _user_to_response(user: User) -> UserResponse: @@ -556,8 +557,13 @@ async def forgot_password(request: ForgotPasswordRequest, db: AsyncSession = Dep user.password_hash = get_password_hash(new_password) await db.commit() - # Get login URL from environment or use default - login_url = os.environ.get("APP_URL", "http://localhost:5173") + "/login" + # Use external_url from settings if available, otherwise fall back to APP_URL env var + external_url = await get_setting(db, "external_url") + if external_url: + external_url = external_url.rstrip("/") + else: + external_url = os.environ.get("APP_URL", "http://localhost:5173") + login_url = external_url + "/login" # Send password reset email subject, text_body, html_body = create_password_reset_email(user.username, new_password, login_url) @@ -632,8 +638,13 @@ async def reset_user_password( user.password_hash = get_password_hash(new_password) await db.commit() - # Get login URL from environment or use default - login_url = os.environ.get("APP_URL", "http://localhost:5173") + "/login" + # Use external_url from settings if available, otherwise fall back to APP_URL env var + external_url = await get_setting(db, "external_url") + if external_url: + external_url = external_url.rstrip("/") + else: + external_url = os.environ.get("APP_URL", "http://localhost:5173") + login_url = external_url + "/login" # Send password reset email subject, text_body, html_body = create_password_reset_email(user.username, new_password, login_url) diff --git a/backend/app/api/routes/users.py b/backend/app/api/routes/users.py index 4a82ca776..376809dd9 100644 --- a/backend/app/api/routes/users.py +++ b/backend/app/api/routes/users.py @@ -24,6 +24,7 @@ from backend.app.services.email_service import ( get_smtp_settings, send_email, ) +from backend.app.api.routes.settings import get_setting router = APIRouter(prefix="/users", tags=["users"]) @@ -152,7 +153,13 @@ async def create_user( try: smtp_settings = await get_smtp_settings(db) if smtp_settings: - login_url = os.environ.get("APP_URL", "http://localhost:5173") + "/login" + # Use external_url from settings if available, otherwise fall back to APP_URL env var + external_url = await get_setting(db, "external_url") + if external_url: + external_url = external_url.rstrip("/") + else: + external_url = os.environ.get("APP_URL", "http://localhost:5173") + login_url = external_url + "/login" subject, text_body, html_body = create_welcome_email(new_user.username, password, login_url) send_email(smtp_settings, new_user.email, subject, text_body, html_body) logger.info(f"Welcome email sent to {new_user.email}") diff --git a/frontend/src/components/CreateUserAdvancedAuthModal.tsx b/frontend/src/components/CreateUserAdvancedAuthModal.tsx index 929806998..140f58c58 100644 --- a/frontend/src/components/CreateUserAdvancedAuthModal.tsx +++ b/frontend/src/components/CreateUserAdvancedAuthModal.tsx @@ -84,7 +84,7 @@ export function CreateUserAdvancedAuthModal({ {/* Username Field */}
diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts index c6f93832f..9465be18e 100644 --- a/frontend/src/i18n/locales/de.ts +++ b/frontend/src/i18n/locales/de.ts @@ -1021,6 +1021,7 @@ export default { saving: 'Wird gespeichert...', advancedAuth: 'Erweiterte Authentifizierung', advancedAuthEnabled: 'Erweiterte Authentifizierung ist aktiviert', + advancedAuthEnabledDesc: 'E-Mail-basierte Benutzerverwaltungsfunktionen sind aktiv. Neue Benutzer erhalten automatisch generierte Passwörter per E-Mail und können ihr Passwort über die Passwort vergessen Funktion zurücksetzen.', advancedAuthDisabled: 'Erweiterte Authentifizierung ist deaktiviert', advancedAuthDisabledDesc: 'Aktivieren Sie die erweiterte Authentifizierung, um E-Mail-basierte Funktionen für die Benutzerverwaltung zu aktivieren.', enable: 'Aktivieren', @@ -1623,6 +1624,7 @@ export default { creating: 'Erstellen...', saving: 'Speichern...', saveChanges: 'Änderungen speichern', + advancedAuthSubtitle: 'mit erweiterter Authentifizierung', }, form: { username: 'Benutzername', @@ -1639,6 +1641,7 @@ export default { groups: 'Gruppen', optional: 'optional', autoGeneratedPassword: 'Ein sicheres Passwort wird automatisch generiert und per E-Mail an den Benutzer gesendet.', + passwordManagedByAdvancedAuth: 'Das Passwort wird durch erweiterte Authentifizierung verwaltet. Verwenden Sie "Passwort zurücksetzen", um ein neues Passwort per E-Mail an den Benutzer zu senden.', }, deleteModal: { title: 'Benutzer löschen', diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index b25287ffd..a17a9159e 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -1021,6 +1021,7 @@ export default { saving: 'Saving...', advancedAuth: 'Advanced Authentication', advancedAuthEnabled: 'Advanced Authentication is enabled', + advancedAuthEnabledDesc: 'Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature.', advancedAuthDisabled: 'Advanced Authentication is disabled', advancedAuthDisabledDesc: 'Enable advanced authentication to activate email-based features for user management.', enable: 'Enable', @@ -1623,6 +1624,7 @@ export default { creating: 'Creating...', saving: 'Saving...', saveChanges: 'Save Changes', + advancedAuthSubtitle: 'with Advanced Authentication', }, form: { username: 'Username', @@ -1639,6 +1641,7 @@ export default { groups: 'Groups', optional: 'optional', autoGeneratedPassword: 'A secure password will be automatically generated and emailed to the user.', + passwordManagedByAdvancedAuth: 'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.', }, deleteModal: { title: 'Delete User', diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index 937684ca8..8bac7f4b2 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -1173,6 +1173,7 @@ export default { saving: '保存中...', advancedAuth: '高度な認証', advancedAuthEnabled: '高度な認証が有効です', + advancedAuthEnabledDesc: 'メールベースのユーザー管理機能が有効になっています。新規ユーザーには自動生成されたパスワードがメールで送信され、ユーザーはパスワード忘れ機能でパスワードをリセットできます。', advancedAuthDisabled: '高度な認証が無効です', advancedAuthDisabledDesc: '高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。', enable: '有効にする', @@ -2172,6 +2173,7 @@ export default { groups: 'グループ', optional: 'オプション', autoGeneratedPassword: '安全なパスワードが自動的に生成され、ユーザーにメールで送信されます。', + passwordManagedByAdvancedAuth: 'パスワードは高度な認証によって管理されています。「パスワードのリセット」を使用して、メールで新しいパスワードをユーザーに送信してください。', }, modal: { createUser: 'ユーザーを作成', @@ -2180,6 +2182,7 @@ export default { creating: '作成中...', saving: '保存中...', saveChanges: '変更を保存', + advancedAuthSubtitle: '高度な認証を使用', }, deleteModal: { title: 'ユーザーを削除', diff --git a/frontend/src/pages/LoginPage.tsx b/frontend/src/pages/LoginPage.tsx index d461c2672..1709c09a7 100644 --- a/frontend/src/pages/LoginPage.tsx +++ b/frontend/src/pages/LoginPage.tsx @@ -7,6 +7,8 @@ import { useToast } from '../contexts/ToastContext'; import { useTheme } from '../contexts/ThemeContext'; import { X, Mail } from 'lucide-react'; import { api } from '../api/client'; +import { Card, CardHeader, CardContent } from '../components/Card'; +import { Button } from '../components/Button'; export function LoginPage() { const navigate = useNavigate(); @@ -151,97 +153,103 @@ export function LoginPage() { {/* Forgot Password Modal */} {showForgotPassword && (
setShowForgotPassword(false)} > -
e.stopPropagation()} + e.stopPropagation()} > -
-
- -

{t('login.forgotPasswordTitle')}

-
- -
- - {advancedAuthStatus?.advanced_auth_enabled ? ( -
-

- {t('login.forgotPasswordEmailMessage') || 'Enter your email address and we\'ll send you a new password.'} -

- -
- - setForgotEmail(e.target.value)} - className="block w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" - placeholder={t('login.emailPlaceholder') || 'your.email@example.com'} - /> + +
+
+ +

{t('login.forgotPasswordTitle')}

- -
- - -
- - ) : ( -
-

- {t('login.forgotPasswordMessage')} -

- -
-

{t('login.howToReset')}

-
    -
  1. {t('login.resetStep1')}
  2. -
  3. {t('login.resetStep2')}
  4. -
  5. {t('login.resetStep3')}
  6. -
  7. {t('login.resetStep4')}
  8. -
-
- - + +
- )} -
+
+ + {advancedAuthStatus?.advanced_auth_enabled ? ( +
+

+ {t('login.forgotPasswordEmailMessage') || 'Enter your email address and we\'ll send you a new password.'} +

+ +
+ + setForgotEmail(e.target.value)} + className="block w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" + placeholder={t('login.emailPlaceholder') || 'your.email@example.com'} + /> +
+ +
+ + +
+
+ ) : ( +
+

+ {t('login.forgotPasswordMessage')} +

+ +
+

{t('login.howToReset')}

+
    +
  1. {t('login.resetStep1')}
  2. +
  3. {t('login.resetStep2')}
  4. +
  5. {t('login.resetStep3')}
  6. +
  7. {t('login.resetStep4')}
  8. +
+
+ + +
+ )} +
+
)}
diff --git a/frontend/src/pages/SettingsPage.tsx b/frontend/src/pages/SettingsPage.tsx index 8e2eed4c5..b21b61e98 100644 --- a/frontend/src/pages/SettingsPage.tsx +++ b/frontend/src/pages/SettingsPage.tsx @@ -3426,6 +3426,25 @@ export function SettingsPage() { + {/* Advanced Authentication Notice Box */} + {advancedAuthStatus?.advanced_auth_enabled && ( + + +
+
+ +
+
+

{t('settings.email.advancedAuthEnabled') || 'Advanced Authentication is enabled'}

+

+ {t('settings.email.advancedAuthEnabledDesc') || 'Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature.'} +

+
+
+
+
+ )} + {authEnabled && (
{/* Left Column: Current User + User List */} @@ -3860,8 +3879,11 @@ export function SettingsPage() {
+ {/* Username Field */}
- +
+ + {/* Email Field */}
setUserFormData({ ...userFormData, password: e.target.value, confirmPassword: '' })} + type="email" + value={userFormData.email} + onChange={(e) => setUserFormData({ ...userFormData, email: e.target.value })} className="w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" - placeholder={t('settings.enterNewPassword')} - autoComplete="new-password" - minLength={6} + placeholder={t('users.form.emailPlaceholder') || 'user@example.com'} + required={advancedAuthStatus?.advanced_auth_enabled} />
- {userFormData.password && ( -
- - setUserFormData({ ...userFormData, confirmPassword: e.target.value })} - className={`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${ - userFormData.confirmPassword && userFormData.password !== userFormData.confirmPassword - ? 'border-red-500' - : 'border-bambu-dark-tertiary' - }`} - placeholder={t('settings.confirmNewPassword')} - autoComplete="new-password" - minLength={6} - /> - {userFormData.confirmPassword && userFormData.password !== userFormData.confirmPassword && ( -

{t('settings.passwordsDoNotMatch')}

+ + {/* Password Fields - only show when Advanced Auth is disabled */} + {!advancedAuthStatus?.advanced_auth_enabled && ( + <> +
+ + setUserFormData({ ...userFormData, password: e.target.value, confirmPassword: '' })} + className="w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" + placeholder={t('settings.enterNewPassword')} + autoComplete="new-password" + minLength={6} + /> +
+ {userFormData.password && ( +
+ + setUserFormData({ ...userFormData, confirmPassword: e.target.value })} + className={`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${ + userFormData.confirmPassword && userFormData.password !== userFormData.confirmPassword + ? 'border-red-500' + : 'border-bambu-dark-tertiary' + }`} + placeholder={t('settings.confirmNewPassword')} + autoComplete="new-password" + minLength={6} + /> + {userFormData.confirmPassword && userFormData.password !== userFormData.confirmPassword && ( +

{t('settings.passwordsDoNotMatch')}

+ )} +
)} + + )} + + {/* Info box about auto-generated password when Advanced Auth is enabled */} + {advancedAuthStatus?.advanced_auth_enabled && ( +
+

+ {t('users.form.passwordManagedByAdvancedAuth') || 'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.'} +

)} + + {/* Groups Field */}
- +
{groupsData.map(group => ( ))} @@ -3938,21 +3992,26 @@ export function SettingsPage() { setUserFormData({ username: '', password: '', email: '', confirmPassword: '', role: 'user', group_ids: [] }); }} > - Cancel + {t('users.modal.cancel') || 'Cancel'} diff --git a/static/assets/index-DbCAeYz5.css b/static/assets/index-DbCAeYz5.css deleted file mode 100644 index 1a3d6da6c..000000000 --- a/static/assets/index-DbCAeYz5.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer properties,theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--drop-shadow-md:0 3px 3px #0000001f;--drop-shadow-lg:0 4px 4px #00000026;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bambu-green:var(--accent);--color-bambu-green-light:var(--accent-light);--color-bambu-green-dark:var(--accent-dark);--color-status-ok:var(--status-ok);--color-status-error:var(--status-error);--color-status-warning:var(--status-warning);--color-bambu-dark:var(--bg-primary);--color-bambu-dark-secondary:var(--bg-secondary);--color-bambu-dark-tertiary:var(--bg-tertiary);--color-bambu-gray:var(--text-muted);--color-bambu-gray-light:var(--text-secondary);--color-bambu-gray-dark:var(--text-tertiary)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-8{top:calc(var(--spacing)*8)}.top-\[2px\]{top:2px}.top-\[3px\]{top:3px}.top-\[52px\]{top:52px}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-6{right:calc(var(--spacing)*6)}.right-12{right:calc(var(--spacing)*12)}.right-full{right:100%}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-8{bottom:calc(var(--spacing)*8)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-10{left:calc(var(--spacing)*10)}.left-12{left:calc(var(--spacing)*12)}.left-\[2px\]{left:2px}.left-\[3px\]{left:3px}.left-full{left:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-60,.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-8{margin-block:calc(var(--spacing)*8)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-14{margin-top:calc(var(--spacing)*14)}.mt-auto{margin-top:auto}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-7{margin-left:calc(var(--spacing)*7)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-64{margin-left:calc(var(--spacing)*64)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-0{height:calc(var(--spacing)*0)}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-64{height:calc(var(--spacing)*64)}.h-80{height:calc(var(--spacing)*80)}.h-\[18px\]{height:18px}.h-\[80vh\]{height:80vh}.h-\[160px\]{height:160px}.h-\[300px\]{height:300px}.h-\[calc\(100\%-40px\)\]{height:calc(100% - 40px)}.h-full{height:100%}.h-px{height:1px}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[500px\]{max-height:500px}.max-h-\[calc\(90vh-80px\)\]{max-height:calc(90vh - 80px)}.max-h-\[calc\(100vh-320px\)\]{max-height:calc(100vh - 320px)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[44px\]{min-height:44px}.min-h-\[48px\]{min-height:48px}.min-h-\[120px\]{min-height:120px}.min-h-\[300px\]{min-height:300px}.min-h-\[400px\]{min-height:400px}.min-h-\[calc\(100vh-64px\)\]{min-height:calc(100vh - 64px)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-4\.5{width:calc(var(--spacing)*4.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-44{width:calc(var(--spacing)*44)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[560px\]{width:560px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-32{max-width:calc(var(--spacing)*32)}.max-w-\[40\%\]{max-width:40%}.max-w-\[80px\]{max-width:80px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-\[16px\]{min-width:16px}.min-w-\[18px\]{min-width:18px}.min-w-\[32px\]{min-width:32px}.min-w-\[48px\]{min-width:48px}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[150px\]{min-width:150px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing)*3.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.-rotate-90{rotate:-90deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.cursor-se-resize{cursor:se-resize}.touch-manipulation{touch-action:manipulation}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[auto_1fr_100px_100px_100px_80px\]{grid-template-columns:auto 1fr 100px 100px 100px 80px}.grid-cols-\[auto_1fr_120px_100px_100px_100px_80px\]{grid-template-columns:auto 1fr 120px 100px 100px 100px 80px}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-3{row-gap:calc(var(--spacing)*3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-bambu-dark-tertiary>:not(:last-child)),:where(.divide-bambu-dark-tertiary\/30>:not(:last-child)){border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){:where(.divide-bambu-dark-tertiary\/30>:not(:last-child)){border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.\!rounded-l-none{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-tl{border-top-left-radius:.25rem}.\!rounded-r-none{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-\[5px\]{border-top-style:var(--tw-border-style);border-top-width:5px}.border-t-\[6px\]{border-top-style:var(--tw-border-style);border-top-width:6px}.\!border-r-0{border-right-style:var(--tw-border-style)!important;border-right-width:0!important}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-\[5px\]{border-right-style:var(--tw-border-style);border-right-width:5px}.border-r-\[6px\]{border-right-style:var(--tw-border-style);border-right-width:6px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[6px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:6px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[5px\]{border-left-style:var(--tw-border-style);border-left-width:5px}.border-l-\[6px\]{border-left-style:var(--tw-border-style);border-left-width:6px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-green-500{border-color:var(--color-green-500)!important}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-bambu-dark-tertiary,.border-bambu-dark-tertiary\/30{border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-bambu-dark-tertiary\/30{border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.border-bambu-dark-tertiary\/50{border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-bambu-dark-tertiary\/50{border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.border-bambu-gray,.border-bambu-gray\/30{border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.border-bambu-gray\/30{border-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.border-bambu-gray\/50{border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.border-bambu-gray\/50{border-color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.border-bambu-green,.border-bambu-green\/20{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/20{border-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.border-bambu-green\/30{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/30{border-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.border-bambu-green\/50{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/50{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.border-blue-400\/20{border-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/20{border-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-500\/20{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-blue-500\/50{border-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/50{border-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400\/20{border-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.border-gray-400\/20{border-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.border-gray-500\/20{border-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.border-gray-500\/20{border-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-green-300{border-color:var(--color-green-300)}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.border-green-500\/50{border-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.border-green-500\/50{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.border-orange-400\/20{border-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/20{border-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.border-orange-400\/50{border-color:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/50{border-color:color-mix(in oklab,var(--color-orange-400)50%,transparent)}}.border-orange-500\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/20{border-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500)30%,transparent)}}.border-purple-400\/20{border-color:#c07eff33}@supports (color:color-mix(in lab,red,red)){.border-purple-400\/20{border-color:color-mix(in oklab,var(--color-purple-400)20%,transparent)}}.border-purple-500\/20{border-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/20{border-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500)30%,transparent)}}.border-red-300{border-color:var(--color-red-300)}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.border-status-error\/20{border-color:var(--color-status-error)}@supports (color:color-mix(in lab,red,red)){.border-status-error\/20{border-color:color-mix(in oklab,var(--color-status-error)20%,transparent)}}.border-status-ok,.border-status-ok\/20{border-color:var(--color-status-ok)}@supports (color:color-mix(in lab,red,red)){.border-status-ok\/20{border-color:color-mix(in oklab,var(--color-status-ok)20%,transparent)}}.border-status-warning\/20{border-color:var(--color-status-warning)}@supports (color:color-mix(in lab,red,red)){.border-status-warning\/20{border-color:color-mix(in oklab,var(--color-status-warning)20%,transparent)}}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.border-yellow-400\/20{border-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.border-yellow-400\/20{border-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.border-yellow-400\/50{border-color:#fac80080}@supports (color:color-mix(in lab,red,red)){.border-yellow-400\/50{border-color:color-mix(in oklab,var(--color-yellow-400)50%,transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-500\/20{border-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/20{border-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.border-yellow-500\/50{border-color:#edb20080}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/50{border-color:color-mix(in oklab,var(--color-yellow-500)50%,transparent)}}.border-t-bambu-dark-tertiary{border-top-color:var(--color-bambu-dark-tertiary)}.border-t-transparent{border-top-color:#0000}.border-r-transparent{border-right-color:#0000}.border-b-bambu-dark-tertiary{border-bottom-color:var(--color-bambu-dark-tertiary)}.border-l-transparent{border-left-color:#0000}.border-l-yellow-500{border-left-color:var(--color-yellow-500)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-600\/20{background-color:#dd740033}@supports (color:color-mix(in lab,red,red)){.bg-amber-600\/20{background-color:color-mix(in oklab,var(--color-amber-600)20%,transparent)}}.bg-bambu-dark{background-color:var(--color-bambu-dark)}.bg-bambu-dark-secondary,.bg-bambu-dark-secondary\/30{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/30{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)30%,transparent)}}.bg-bambu-dark-secondary\/50{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)50%,transparent)}}.bg-bambu-dark-secondary\/60{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/60{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)60%,transparent)}}.bg-bambu-dark-secondary\/90{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/90{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)90%,transparent)}}.bg-bambu-dark-secondary\/95{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/95{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)95%,transparent)}}.bg-bambu-dark-tertiary,.bg-bambu-dark-tertiary\/30{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/30{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.bg-bambu-dark-tertiary\/50{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.bg-bambu-dark-tertiary\/70{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/70{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)70%,transparent)}}.bg-bambu-dark-tertiary\/80{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/80{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.bg-bambu-dark\/20{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/20{background-color:color-mix(in oklab,var(--color-bambu-dark)20%,transparent)}}.bg-bambu-dark\/30{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/30{background-color:color-mix(in oklab,var(--color-bambu-dark)30%,transparent)}}.bg-bambu-dark\/50{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/50{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.bg-bambu-dark\/80{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/80{background-color:color-mix(in oklab,var(--color-bambu-dark)80%,transparent)}}.bg-bambu-dark\/90{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/90{background-color:color-mix(in oklab,var(--color-bambu-dark)90%,transparent)}}.bg-bambu-gray\/10{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/10{background-color:color-mix(in oklab,var(--color-bambu-gray)10%,transparent)}}.bg-bambu-gray\/20{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/20{background-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.bg-bambu-gray\/30{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/30{background-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.bg-bambu-gray\/50{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/50{background-color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.bg-bambu-gray\/90{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/90{background-color:color-mix(in oklab,var(--color-bambu-gray)90%,transparent)}}.bg-bambu-green,.bg-bambu-green\/5{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/5{background-color:color-mix(in oklab,var(--color-bambu-green)5%,transparent)}}.bg-bambu-green\/10{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/10{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.bg-bambu-green\/20{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/20{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.bg-bambu-green\/30{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/30{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.bg-bambu-green\/50{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/50{background-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.bg-bambu-green\/75{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/75{background-color:color-mix(in oklab,var(--color-bambu-green)75%,transparent)}}.bg-bambu-green\/90{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/90{background-color:color-mix(in oklab,var(--color-bambu-green)90%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-500\/30{background-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/30{background-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.bg-blue-500\/90{background-color:#3080ffe6}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/90{background-color:color-mix(in oklab,var(--color-blue-500)90%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500)10%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500)20%,transparent)}}.bg-cyan-600\/20{background-color:#0092b533}@supports (color:color-mix(in lab,red,red)){.bg-cyan-600\/20{background-color:color-mix(in oklab,var(--color-cyan-600)20%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-400\/10{background-color:#99a1af1a}@supports (color:color-mix(in lab,red,red)){.bg-gray-400\/10{background-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-orange-400\/10{background-color:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/10{background-color:color-mix(in oklab,var(--color-orange-400)10%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.bg-purple-400\/10{background-color:#c07eff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-400\/10{background-color:color-mix(in oklab,var(--color-purple-400)10%,transparent)}}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-purple-500\/90{background-color:#ac4bffe6}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/90{background-color:color-mix(in oklab,var(--color-purple-500)90%,transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-500\/30{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/30{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.bg-red-500\/40{background-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/40{background-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500)80%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-500\/20{background-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/20{background-color:color-mix(in oklab,var(--color-rose-500)20%,transparent)}}.bg-rose-600\/20{background-color:#e7004433}@supports (color:color-mix(in lab,red,red)){.bg-rose-600\/20{background-color:color-mix(in oklab,var(--color-rose-600)20%,transparent)}}.bg-status-error,.bg-status-error\/10{background-color:var(--color-status-error)}@supports (color:color-mix(in lab,red,red)){.bg-status-error\/10{background-color:color-mix(in oklab,var(--color-status-error)10%,transparent)}}.bg-status-error\/20{background-color:var(--color-status-error)}@supports (color:color-mix(in lab,red,red)){.bg-status-error\/20{background-color:color-mix(in oklab,var(--color-status-error)20%,transparent)}}.bg-status-error\/80{background-color:var(--color-status-error)}@supports (color:color-mix(in lab,red,red)){.bg-status-error\/80{background-color:color-mix(in oklab,var(--color-status-error)80%,transparent)}}.bg-status-ok,.bg-status-ok\/10{background-color:var(--color-status-ok)}@supports (color:color-mix(in lab,red,red)){.bg-status-ok\/10{background-color:color-mix(in oklab,var(--color-status-ok)10%,transparent)}}.bg-status-ok\/20{background-color:var(--color-status-ok)}@supports (color:color-mix(in lab,red,red)){.bg-status-ok\/20{background-color:color-mix(in oklab,var(--color-status-ok)20%,transparent)}}.bg-status-warning\/10{background-color:var(--color-status-warning)}@supports (color:color-mix(in lab,red,red)){.bg-status-warning\/10{background-color:color-mix(in oklab,var(--color-status-warning)10%,transparent)}}.bg-status-warning\/20{background-color:var(--color-status-warning)}@supports (color:color-mix(in lab,red,red)){.bg-status-warning\/20{background-color:color-mix(in oklab,var(--color-status-warning)20%,transparent)}}.bg-teal-500\/20{background-color:#00baa733}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/20{background-color:color-mix(in oklab,var(--color-teal-500)20%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.bg-white\/70{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white)90%,transparent)}}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.bg-yellow-400\/20{background-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/20{background-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/5{background-color:#edb2000d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/5{background-color:color-mix(in oklab,var(--color-yellow-500)5%,transparent)}}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-bambu-green\/10{--tw-gradient-from:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.from-bambu-green\/10{--tw-gradient-from:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.from-bambu-green\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-black\/80{--tw-gradient-from:#000c}@supports (color:color-mix(in lab,red,red)){.from-black\/80{--tw-gradient-from:color-mix(in oklab,var(--color-black)80%,transparent)}}.from-black\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500\/5{--tw-gradient-from:#3080ff0d}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/5{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.from-blue-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-white\/10{--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.from-white\/10{--tw-gradient-from:color-mix(in oklab,var(--color-white)10%,transparent)}}.from-white\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-black\/60{--tw-gradient-via:#0009}@supports (color:color-mix(in lab,red,red)){.via-black\/60{--tw-gradient-via:color-mix(in oklab,var(--color-black)60%,transparent)}}.via-black\/60{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-bambu-dark-secondary{--tw-gradient-to:var(--color-bambu-dark-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-400{--tw-gradient-to:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-cover{background-size:cover}.bg-center{background-position:50%}.fill-yellow-400{fill:var(--color-yellow-400)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-left{object-position:left}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.\!px-1\.5{padding-inline:calc(var(--spacing)*1.5)!important}.\!px-3{padding-inline:calc(var(--spacing)*3)!important}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.py-24{padding-block:calc(var(--spacing)*24)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-7{padding-right:calc(var(--spacing)*7)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-9{padding-left:calc(var(--spacing)*9)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-green-400{color:var(--color-green-400)!important}.text-amber-200{color:var(--color-amber-200)}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/60{color:#ffd23699}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/60{color:color-mix(in oklab,var(--color-amber-300)60%,transparent)}}.text-amber-300\/70{color:#ffd236b3}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/70{color:color-mix(in oklab,var(--color-amber-300)70%,transparent)}}.text-amber-300\/80{color:#ffd236cc}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/80{color:color-mix(in oklab,var(--color-amber-300)80%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-amber-500\/80{color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-500\/80{color:color-mix(in oklab,var(--color-amber-500)80%,transparent)}}.text-amber-600{color:var(--color-amber-600)}.text-bambu-dark-tertiary{color:var(--color-bambu-dark-tertiary)}.text-bambu-gray{color:var(--color-bambu-gray)}.text-bambu-gray-dark{color:var(--color-bambu-gray-dark)}.text-bambu-gray-light{color:var(--color-bambu-gray-light)}.text-bambu-gray\/30{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/30{color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.text-bambu-gray\/40{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/40{color:color-mix(in oklab,var(--color-bambu-gray)40%,transparent)}}.text-bambu-gray\/50{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/50{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.text-bambu-gray\/60{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/60{color:color-mix(in oklab,var(--color-bambu-gray)60%,transparent)}}.text-bambu-gray\/70{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/70{color:color-mix(in oklab,var(--color-bambu-gray)70%,transparent)}}.text-bambu-gray\/80{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/80{color:color-mix(in oklab,var(--color-bambu-gray)80%,transparent)}}.text-bambu-green,.text-bambu-green\/70{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.text-bambu-green\/70{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.text-black{color:var(--color-black)}.text-black\/80{color:#000c}@supports (color:color-mix(in lab,red,red)){.text-black\/80{color:color-mix(in oklab,var(--color-black)80%,transparent)}}.text-blue-300{color:var(--color-blue-300)}.text-blue-300\/70{color:#90c5ffb3}@supports (color:color-mix(in lab,red,red)){.text-blue-300\/70{color:color-mix(in oklab,var(--color-blue-300)70%,transparent)}}.text-blue-300\/80{color:#90c5ffcc}@supports (color:color-mix(in lab,red,red)){.text-blue-300\/80{color:color-mix(in oklab,var(--color-blue-300)80%,transparent)}}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-500\/70{color:#3080ffb3}@supports (color:color-mix(in lab,red,red)){.text-blue-500\/70{color:color-mix(in oklab,var(--color-blue-500)70%,transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-200{color:var(--color-green-200)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-500\/60{color:#00c75899}@supports (color:color-mix(in lab,red,red)){.text-green-500\/60{color:color-mix(in oklab,var(--color-green-500)60%,transparent)}}.text-green-600{color:var(--color-green-600)}.text-indigo-400{color:var(--color-indigo-400)}.text-orange-200{color:var(--color-orange-200)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-300{color:var(--color-purple-300)}.text-purple-300\/70{color:#d9b3ffb3}@supports (color:color-mix(in lab,red,red)){.text-purple-300\/70{color:color-mix(in oklab,var(--color-purple-300)70%,transparent)}}.text-purple-400{color:var(--color-purple-400)}.text-purple-400\/80{color:#c07effcc}@supports (color:color-mix(in lab,red,red)){.text-purple-400\/80{color:color-mix(in oklab,var(--color-purple-400)80%,transparent)}}.text-red-200{color:var(--color-red-200)}.text-red-300{color:var(--color-red-300)}.text-red-300\/80{color:#ffa3a3cc}@supports (color:color-mix(in lab,red,red)){.text-red-300\/80{color:color-mix(in oklab,var(--color-red-300)80%,transparent)}}.text-red-400{color:var(--color-red-400)}.text-red-400\/50{color:#ff656880}@supports (color:color-mix(in lab,red,red)){.text-red-400\/50{color:color-mix(in oklab,var(--color-red-400)50%,transparent)}}.text-red-400\/60{color:#ff656899}@supports (color:color-mix(in lab,red,red)){.text-red-400\/60{color:color-mix(in oklab,var(--color-red-400)60%,transparent)}}.text-red-400\/70{color:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.text-red-400\/70{color:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-status-error{color:var(--color-status-error)}.text-status-ok{color:var(--color-status-ok)}.text-status-warning{color:var(--color-status-warning)}.text-teal-400{color:var(--color-teal-400)}.text-white{color:var(--color-white)}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white)90%,transparent)}}.text-yellow-200{color:var(--color-yellow-200)}.text-yellow-200\/70{color:#fff085b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-200\/70{color:color-mix(in oklab,var(--color-yellow-200)70%,transparent)}}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-500\/70{color:#edb200b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-500\/70{color:color-mix(in oklab,var(--color-yellow-500)70%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-bambu-gray::placeholder{color:var(--color-bambu-gray)}.placeholder-bambu-gray-dark::placeholder{color:var(--color-bambu-gray-dark)}.placeholder-bambu-gray\/50::placeholder{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.placeholder-bambu-gray\/50::placeholder{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.accent-bambu-green{accent-color:var(--color-bambu-green)}.accent-green-500{accent-color:var(--color-green-500)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.opacity-\[0\.65\]{opacity:.65}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-bambu-green\/20{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.shadow-bambu-green\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)20%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-bambu-green\/25{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.shadow-bambu-green\/25{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)25%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-bambu-green{--tw-ring-color:var(--color-bambu-green)}.ring-blue-400\/50{--tw-ring-color:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.ring-blue-400\/50{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)50%,transparent)}}.ring-green-500{--tw-ring-color:var(--color-green-500)}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-bambu-dark{--tw-ring-offset-color:var(--color-bambu-dark)}.ring-offset-bambu-dark-secondary{--tw-ring-offset-color:var(--color-bambu-dark-secondary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.group-hover\:text-bambu-gray:is(:where(.group):hover *){color:var(--color-bambu-gray)}.group-hover\:text-bambu-green:is(:where(.group):hover *){color:var(--color-bambu-green)}.group-hover\:opacity-50:is(:where(.group):hover *){opacity:.5}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/resize\:opacity-100:is(:where(.group\/resize):hover *){opacity:1}.group-hover\/thumb\:block:is(:where(.group\/thumb):hover *){display:block}}.peer-checked\:bg-bambu-green:is(:where(.peer):checked~*){background-color:var(--color-bambu-green)}.peer-focus\:outline-none:is(:where(.peer):focus~*){--tw-outline-style:none;outline-style:none}.placeholder\:text-bambu-gray::placeholder{color:var(--color-bambu-gray)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:right-0:before{content:var(--tw-content);right:calc(var(--spacing)*0)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:h-0\.5:before{content:var(--tw-content);height:calc(var(--spacing)*.5)}.before\:bg-bambu-green:before{content:var(--tw-content);background-color:var(--color-bambu-green)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:h-5:after{content:var(--tw-content);height:calc(var(--spacing)*5)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:w-5:after{content:var(--tw-content);width:calc(var(--spacing)*5)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);border-color:var(--color-gray-300)}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.peer-checked\:after\:translate-x-full:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:after\:border-white:is(:where(.peer):checked~*):after{content:var(--tw-content);border-color:var(--color-white)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-bambu-dark-tertiary\/80:hover{border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-dark-tertiary\/80:hover{border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:border-bambu-gray:hover{border-color:var(--color-bambu-gray)}.hover\:border-bambu-gray-dark:hover{border-color:var(--color-bambu-gray-dark)}.hover\:border-bambu-green:hover,.hover\:border-bambu-green\/50:hover{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-green\/50:hover{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-white\/40:hover{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/40:hover{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.hover\:\!bg-green-500\/20:hover{background-color:#00c75833!important}@supports (color:color-mix(in lab,red,red)){.hover\:\!bg-green-500\/20:hover{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)!important}}.hover\:bg-amber-500\/30:hover{background-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/30:hover{background-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.hover\:bg-bambu-dark:hover{background-color:var(--color-bambu-dark)}.hover\:bg-bambu-dark-secondary:hover,.hover\:bg-bambu-dark-secondary\/50:hover{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-secondary\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)50%,transparent)}}.hover\:bg-bambu-dark-tertiary:hover,.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)70%,transparent)}}.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:bg-bambu-dark\/50:hover{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.hover\:bg-bambu-gray-dark:hover{background-color:var(--color-bambu-gray-dark)}.hover\:bg-bambu-green:hover{background-color:var(--color-bambu-green)}.hover\:bg-bambu-green-dark:hover{background-color:var(--color-bambu-green-dark)}.hover\:bg-bambu-green-light:hover{background-color:var(--color-bambu-green-light)}.hover\:bg-bambu-green\/10:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/10:hover{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.hover\:bg-bambu-green\/20:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/20:hover{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.hover\:bg-bambu-green\/30:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.hover\:bg-bambu-green\/50:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.hover\:bg-bambu-green\/80:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:bg-black\/40:hover{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/40:hover{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:bg-blue-500\/30:hover{background-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-500\/30:hover{background-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-orange-400\/20:hover{background-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-orange-400\/20:hover{background-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-400\/10:hover{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-400\/10:hover{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\:bg-red-500\/30:hover{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/30:hover{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\:bg-white\/80:hover{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/80:hover{background-color:color-mix(in oklab,var(--color-white)80%,transparent)}}.hover\:bg-yellow-500\/30:hover{background-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-yellow-500\/30:hover{background-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-amber-300:hover{color:var(--color-amber-300)}.hover\:text-bambu-gray:hover{color:var(--color-bambu-gray)}.hover\:text-bambu-green:hover{color:var(--color-bambu-green)}.hover\:text-bambu-green-light:hover{color:var(--color-bambu-green-light)}.hover\:text-bambu-green\/70:hover{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/70:hover{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.hover\:text-bambu-green\/80:hover{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/80:hover{color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-orange-300:hover{color:var(--color-orange-300)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-white\/80:hover{color:#fffc}@supports (color:color-mix(in lab,red,red)){.hover\:text-white\/80:hover{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)5%,transparent)var(--tw-shadow-alpha),transparent)}}.hover\:shadow-bambu-green\/30:hover{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-bambu-green\/30:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)30%,transparent)var(--tw-shadow-alpha),transparent)}}}.focus\:border-bambu-green:focus{border-color:var(--color-bambu-green)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-bambu-gray:focus{--tw-ring-color:var(--color-bambu-gray)}.focus\:ring-bambu-green:focus,.focus\:ring-bambu-green\/50:focus{--tw-ring-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-bambu-green\/50:focus{--tw-ring-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-bambu-dark:focus{--tw-ring-offset-color:var(--color-bambu-dark)}.focus\:ring-offset-bambu-dark-secondary:focus{--tw-ring-offset-color:var(--color-bambu-dark-secondary)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(hover:hover){.disabled\:hover\:bg-bambu-green:disabled:hover{background-color:var(--color-bambu-green)}}@media(min-width:40rem){.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:mr-1{margin-right:calc(var(--spacing)*1)}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:grid{display:grid}.sm\:inline{display:inline}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:w-40{width:calc(var(--spacing)*40)}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}.sm\:p-3{padding:calc(var(--spacing)*3)}}@media(min-width:48rem){.md\:top-\[2px\]{top:2px}.md\:left-\[2px\]{left:2px}.md\:mx-0{margin-inline:calc(var(--spacing)*0)}.md\:block{display:block}.md\:inline{display:inline}.md\:h-4{height:calc(var(--spacing)*4)}.md\:h-5{height:calc(var(--spacing)*5)}.md\:h-8{height:calc(var(--spacing)*8)}.md\:min-h-0{min-height:calc(var(--spacing)*0)}.md\:w-4{width:calc(var(--spacing)*4)}.md\:w-8{width:calc(var(--spacing)*8)}.md\:w-9{width:calc(var(--spacing)*9)}.md\:min-w-\[200px\]{min-width:200px}.md\:flex-1{flex:1}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-wrap{flex-wrap:wrap}.md\:items-center{align-items:center}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:pb-0{padding-bottom:calc(var(--spacing)*0)}}@media(min-width:64rem){.lg\:static{position:static}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-\[calc\(100vh-64px\)\]{height:calc(100vh - 64px)}.lg\:w-80{width:calc(var(--spacing)*80)}.lg\:w-\[480px\]{width:480px}.lg\:max-w-md{max-width:var(--container-md)}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:max-w-xl{max-width:var(--container-xl)}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:gap-6{gap:calc(var(--spacing)*6)}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:overflow-y-auto{overflow-y:auto}.lg\:p-8{padding:calc(var(--spacing)*8)}}@media(min-width:80rem){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(min-width:96rem){.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.dark\:border-bambu-dark-tertiary:where(.dark,.dark *),.dark\:border-bambu-dark-tertiary\/50:where(.dark,.dark *){border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-bambu-dark-tertiary\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.dark\:border-bambu-green\/40:where(.dark,.dark *){border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.dark\:border-bambu-green\/40:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-bambu-green)40%,transparent)}}.dark\:border-gray-600:where(.dark,.dark *){border-color:var(--color-gray-600)}.dark\:border-red-500\/30:where(.dark,.dark *){border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.dark\:border-red-500\/40:where(.dark,.dark *){border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-500\/40:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.dark\:bg-bambu-dark:where(.dark,.dark *){background-color:var(--color-bambu-dark)}.dark\:bg-bambu-dark-secondary:where(.dark,.dark *){background-color:var(--color-bambu-dark-secondary)}.dark\:bg-bambu-green\/20:where(.dark,.dark *){background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-bambu-green\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.dark\:bg-black\/80:where(.dark,.dark *){background-color:#000c}@supports (color:color-mix(in lab,red,red)){.dark\:bg-black\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.dark\:bg-blue-500\/10:where(.dark,.dark *){background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark\:bg-blue-500\/20:where(.dark,.dark *){background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark\:bg-gray-500\/40:where(.dark,.dark *){background-color:#6a728266}@supports (color:color-mix(in lab,red,red)){.dark\:bg-gray-500\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-gray-500)40%,transparent)}}.dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--color-gray-900)}.dark\:bg-red-500\/10:where(.dark,.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark\:bg-red-500\/20:where(.dark,.dark *){background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-bambu-gray:where(.dark,.dark *),.dark\:text-bambu-gray\/30:where(.dark,.dark *){color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.dark\:text-bambu-gray\/30:where(.dark,.dark *){color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.dark\:text-bambu-gray\/50:where(.dark,.dark *){color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.dark\:text-bambu-gray\/50:where(.dark,.dark *){color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.dark\:text-bambu-green:where(.dark,.dark *),.dark\:text-bambu-green\/60:where(.dark,.dark *){color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.dark\:text-bambu-green\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-bambu-green)60%,transparent)}}.dark\:text-blue-200:where(.dark,.dark *){color:var(--color-blue-200)}.dark\:text-blue-200\/80:where(.dark,.dark *){color:#bedbffcc}@supports (color:color-mix(in lab,red,red)){.dark\:text-blue-200\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-blue-200)80%,transparent)}}.dark\:text-blue-300:where(.dark,.dark *){color:var(--color-blue-300)}.dark\:text-blue-300\/60:where(.dark,.dark *){color:#90c5ff99}@supports (color:color-mix(in lab,red,red)){.dark\:text-blue-300\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-blue-300)60%,transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-orange-200:where(.dark,.dark *){color:var(--color-orange-200)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-red-400\/70:where(.dark,.dark *){color:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.dark\:text-red-400\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-200:where(.dark,.dark *){color:var(--color-yellow-200)}.dark\:text-yellow-200\/70:where(.dark,.dark *){color:#fff085b3}@supports (color:color-mix(in lab,red,red)){.dark\:text-yellow-200\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-yellow-200)70%,transparent)}}@media(hover:hover){.dark\:hover\:bg-bambu-dark-tertiary:where(.dark,.dark *):hover{background-color:var(--color-bambu-dark-tertiary)}.dark\:hover\:bg-bambu-dark\/50:where(.dark,.dark *):hover{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-bambu-dark\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.dark\:hover\:bg-red-500\/30:where(.dark,.dark *):hover{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-500\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-bambu-green::-webkit-slider-thumb{background-color:var(--color-bambu-green)}}:root{--accent:#00ae42;--accent-light:#00c64d;--accent-dark:#009438;--status-ok:#22c55e;--status-error:#ef4444;--status-warning:#f59e0b;--bg-primary:#f5f5f5;--bg-secondary:#fff;--bg-tertiary:#e5e5e5;--text-primary:#1a1a1a;--text-secondary:#4a4a4a;--text-muted:#6b6b6b;--text-tertiary:gray;--border-color:#d4d4d4;--card-shadow:0 2px 8px #00000014;--glow-color:transparent;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,sans-serif;font-weight:400;line-height:1.5}.dark{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d;--card-shadow:0 4px 16px #0006}.bg-warm{--bg-primary:#faf8f5;--bg-secondary:#fffefa;--bg-tertiary:#e8e4dd;--text-primary:#2d2a26;--text-secondary:#5c5750;--text-muted:#7a756c;--text-tertiary:#9a9590;--border-color:#d8d4cc}.bg-cool{--bg-primary:#f0f4f8;--bg-secondary:#fff;--bg-tertiary:#dce4ec;--text-primary:#1a2530;--text-secondary:#4a5568;--text-muted:#6b7a8a;--text-tertiary:#8a9aaa;--border-color:#c8d4e0}.dark.bg-neutral{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d}.dark.bg-warm{--bg-primary:#1c1a18;--bg-secondary:#2e2a26;--bg-tertiary:#3e3a36;--text-primary:#f5f0ea;--text-secondary:#b0a898;--text-muted:#8a8278;--text-tertiary:#5a5248;--border-color:#3e3a36}.dark.bg-cool{--bg-primary:#181c20;--bg-secondary:#262c32;--bg-tertiary:#363e46;--text-primary:#f0f4f8;--text-secondary:#98a8b8;--text-muted:#788898;--text-tertiary:#4a5a6a;--border-color:#363e46}.dark.bg-oled{--bg-primary:#000;--bg-secondary:#141414;--bg-tertiary:#1f1f1f;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:#707070;--text-tertiary:#404040;--border-color:#2a2a2a}.dark.bg-slate{--bg-primary:#0f172a;--bg-secondary:#1e293b;--bg-tertiary:#334155;--text-primary:#f1f5f9;--text-secondary:#94a3b8;--text-muted:#64748b;--text-tertiary:#475569;--border-color:#334155}.dark.bg-forest{--bg-primary:#121a16;--bg-secondary:#1c2a22;--bg-tertiary:#2a3d30;--text-primary:#e8f5ec;--text-secondary:#8aa894;--text-muted:#6a8874;--text-tertiary:#4a6854;--border-color:#2a3d30}.style-glow{--card-shadow:0 2px 8px #00000014,0 0 25px var(--accent)}@supports (color:color-mix(in lab,red,red)){.style-glow{--card-shadow:0 2px 8px #00000014,0 0 25px color-mix(in srgb,var(--accent)12%,transparent)}}.dark.style-glow{--card-shadow:0 4px 20px #00000080,0 0 40px var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark.style-glow{--card-shadow:0 4px 20px #00000080,0 0 40px color-mix(in srgb,var(--accent)15%,transparent)}}.style-vibrant{--card-shadow:0 8px 30px #00000026,0 2px 8px #0000001a}.dark.style-vibrant{--card-shadow:0 10px 40px #0009,0 4px 12px #0006}.accent-green{--accent:#00ae42;--accent-light:#00c64d;--accent-dark:#009438}.accent-teal{--accent:#14b8a6;--accent-light:#2dd4bf;--accent-dark:#0d9488}.accent-blue{--accent:#3b82f6;--accent-light:#60a5fa;--accent-dark:#2563eb}.accent-orange{--accent:#f97316;--accent-light:#fb923c;--accent-dark:#ea580c}.accent-purple{--accent:#8b5cf6;--accent-light:#a78bfa;--accent-dark:#7c3aed}.accent-red{--accent:#ef4444;--accent-light:#f87171;--accent-dark:#dc2626}body{background-color:var(--bg-primary);color:var(--text-primary);min-height:100vh;margin:0;transition:background-color .2s,color .2s}#root{min-height:100vh}.text-white{color:var(--text-primary)}.bg-bambu-dark,.bg-bambu-dark-secondary,.bg-bambu-dark-tertiary,.border-bambu-dark-tertiary{transition:background-color .2s,border-color .2s}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}.icon-theme{opacity:.5}.dark .icon-theme{filter:invert();opacity:.4}.icon-green{filter:invert(48%)sepia(89%)saturate(459%)hue-rotate(93deg)brightness(95%)contrast(92%);opacity:1}.icon-heating{filter:invert(50%)sepia()saturate(1000%)hue-rotate(360deg)brightness()contrast();opacity:1}.dark .jogpad-theme{filter:brightness(.35)contrast(1.2)}.ams-empty-slot{background:repeating-linear-gradient(45deg,#444,#444 2px,#222 2px 4px)}.dark .ams-empty-slot{background:repeating-linear-gradient(45deg,#555,#555 2px,#333 2px 4px)}.touch-manipulation{touch-action:manipulation}.safe-area-bottom{padding-bottom:env(safe-area-inset-bottom,0)}.safe-area-top{padding-top:env(safe-area-inset-top,0)}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}@keyframes slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-slide-in-left{animation:.3s ease-out slide-in-left}.card-shadow{box-shadow:var(--card-shadow)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}} diff --git a/static/assets/index-C0uTHy_F.js b/static/assets/index-NgO9xbrN.js similarity index 79% rename from static/assets/index-C0uTHy_F.js rename to static/assets/index-NgO9xbrN.js index 0bf124499..2459a9135 100644 --- a/static/assets/index-C0uTHy_F.js +++ b/static/assets/index-NgO9xbrN.js @@ -1,18 +1,18 @@ -function noe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var Hw=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Hl(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var gT={exports:{}},Ix={};var gz;function roe(){if(gz)return Ix;gz=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return Ix.Fragment=e,Ix.jsx=n,Ix.jsxs=n,Ix}var bz;function ioe(){return bz||(bz=1,gT.exports=roe()),gT.exports}var a=ioe(),bT={exports:{}},_n={};var xz;function aoe(){if(xz)return _n;xz=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),m=Symbol.iterator;function p(H){return H===null||typeof H!="object"?null:(H=m&&H[m]||H["@@iterator"],typeof H=="function"?H:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,x={};function y(H,K,ne){this.props=H,this.context=K,this.refs=x,this.updater=ne||b}y.prototype.isReactComponent={},y.prototype.setState=function(H,K){if(typeof H!="object"&&typeof H!="function"&&H!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,H,K,"setState")},y.prototype.forceUpdate=function(H){this.updater.enqueueForceUpdate(this,H,"forceUpdate")};function S(){}S.prototype=y.prototype;function N(H,K,ne){this.props=H,this.context=K,this.refs=x,this.updater=ne||b}var T=N.prototype=new S;T.constructor=N,v(T,y.prototype),T.isPureReactComponent=!0;var k=Array.isArray;function C(){}var E={H:null,A:null,T:null,S:null},P=Object.prototype.hasOwnProperty;function A(H,K,ne){var ie=ne.ref;return{$$typeof:t,type:H,key:K,ref:ie!==void 0?ie:null,props:ne}}function j(H,K){return A(H.type,K,H.props)}function z(H){return typeof H=="object"&&H!==null&&H.$$typeof===t}function L(H){var K={"=":"=0",":":"=2"};return"$"+H.replace(/[=:]/g,function(ne){return K[ne]})}var B=/\/+/g;function R(H,K){return typeof H=="object"&&H!==null&&H.key!=null?L(""+H.key):K.toString(36)}function $(H){switch(H.status){case"fulfilled":return H.value;case"rejected":throw H.reason;default:switch(typeof H.status=="string"?H.then(C,C):(H.status="pending",H.then(function(K){H.status==="pending"&&(H.status="fulfilled",H.value=K)},function(K){H.status==="pending"&&(H.status="rejected",H.reason=K)})),H.status){case"fulfilled":return H.value;case"rejected":throw H.reason}}throw H}function q(H,K,ne,ie,be){var pe=typeof H;(pe==="undefined"||pe==="boolean")&&(H=null);var de=!1;if(H===null)de=!0;else switch(pe){case"bigint":case"string":case"number":de=!0;break;case"object":switch(H.$$typeof){case t:case e:de=!0;break;case d:return de=H._init,q(de(H._payload),K,ne,ie,be)}}if(de)return be=be(H),de=ie===""?"."+R(H,0):ie,k(be)?(ne="",de!=null&&(ne=de.replace(B,"$&/")+"/"),q(be,K,ne,"",function(Te){return Te})):be!=null&&(z(be)&&(be=j(be,ne+(be.key==null||H&&H.key===be.key?"":(""+be.key).replace(B,"$&/")+"/")+de)),K.push(be)),1;de=0;var Ce=ie===""?".":ie+":";if(k(H))for(var ae=0;ae>>1,re=q[Y];if(0>>1;Yi(ne,G))iei(be,ne)?(q[Y]=be,q[ie]=G,Y=ie):(q[Y]=ne,q[K]=G,Y=K);else if(iei(be,G))q[Y]=be,q[ie]=G,Y=ie;else break e}}return I}function i(q,I){var G=q.sortIndex-I.sortIndex;return G!==0?G:q.id-I.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,m=3,p=!1,b=!1,v=!1,x=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function T(q){for(var I=n(u);I!==null;){if(I.callback===null)r(u);else if(I.startTime<=q)r(u),I.sortIndex=I.expirationTime,e(c,I);else break;I=n(u)}}function k(q){if(v=!1,T(q),!b)if(n(c)!==null)b=!0,C||(C=!0,L());else{var I=n(u);I!==null&&$(k,I.startTime-q)}}var C=!1,E=-1,P=5,A=-1;function j(){return x?!0:!(t.unstable_now()-Aq&&j());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,m=h.priorityLevel;var re=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof re=="function"){h.callback=re,T(q),I=!0;break t}h===n(c)&&r(c),T(q)}else r(c);h=n(c)}if(h!==null)I=!0;else{var H=n(u);H!==null&&$(k,H.startTime-q),I=!1}}break e}finally{h=null,m=G,p=!1}I=void 0}}finally{I?L():C=!1}}}var L;if(typeof N=="function")L=function(){N(z)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=z,L=function(){R.postMessage(null)}}else L=function(){y(z,0)};function $(q,I){E=y(function(){q(t.unstable_now())},I)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=G,e(u,q),n(c)===null&&q===n(u)&&(v?(S(E),E=-1):v=!0,$(k,G-Y))):(q.sortIndex=re,e(c,q),b||p||(b=!0,C||(C=!0,L()))),q},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(q){var I=m;return function(){var G=m;m=I;try{return q.apply(this,arguments)}finally{m=G}}}})(vT)),vT}var wz;function loe(){return wz||(wz=1,yT.exports=ooe()),yT.exports}var wT={exports:{}},Ga={};var _z;function coe(){if(_z)return Ga;_z=1;var t=Tb();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),wT.exports=coe(),wT.exports}var Nz;function uoe(){if(Nz)return Ux;Nz=1;var t=loe(),e=Tb(),n=zW();function r(f){var g="https://react.dev/errors/"+f;if(1re||(f.current=Y[re],Y[re]=null,re--)}function ne(f,g){re++,Y[re]=f.current,f.current=g}var ie=H(null),be=H(null),pe=H(null),de=H(null);function Ce(f,g){switch(ne(pe,g),ne(be,f),ne(ie,null),g.nodeType){case 9:case 11:f=(f=g.documentElement)&&(f=f.namespaceURI)?UU(f):0;break;default:if(f=g.tagName,g=g.namespaceURI)g=UU(g),f=zU(g,f);else switch(f){case"svg":f=1;break;case"math":f=2;break;default:f=0}}K(ie),ne(ie,f)}function ae(){K(ie),K(be),K(pe)}function Te(f){f.memoizedState!==null&&ne(de,f);var g=ie.current,w=zU(g,f.type);g!==w&&(ne(be,f),ne(ie,w))}function Le(f){be.current===f&&(K(ie),K(be)),de.current===f&&(K(de),Rx._currentValue=G)}var fe,Xe;function W(f){if(fe===void 0)try{throw Error()}catch(w){var g=w.stack.trim().match(/\n( *(at )?)/);fe=g&&g[1]||"",Xe=-1r[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var $w=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Hl(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var gA={exports:{}},Ix={};var gz;function roe(){if(gz)return Ix;gz=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return Ix.Fragment=e,Ix.jsx=n,Ix.jsxs=n,Ix}var bz;function ioe(){return bz||(bz=1,gA.exports=roe()),gA.exports}var a=ioe(),bA={exports:{}},_n={};var xz;function aoe(){if(xz)return _n;xz=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),m=Symbol.iterator;function p(H){return H===null||typeof H!="object"?null:(H=m&&H[m]||H["@@iterator"],typeof H=="function"?H:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,x={};function y(H,K,ne){this.props=H,this.context=K,this.refs=x,this.updater=ne||b}y.prototype.isReactComponent={},y.prototype.setState=function(H,K){if(typeof H!="object"&&typeof H!="function"&&H!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,H,K,"setState")},y.prototype.forceUpdate=function(H){this.updater.enqueueForceUpdate(this,H,"forceUpdate")};function S(){}S.prototype=y.prototype;function N(H,K,ne){this.props=H,this.context=K,this.refs=x,this.updater=ne||b}var A=N.prototype=new S;A.constructor=N,v(A,y.prototype),A.isPureReactComponent=!0;var k=Array.isArray;function C(){}var E={H:null,A:null,T:null,S:null},P=Object.prototype.hasOwnProperty;function T(H,K,ne){var ie=ne.ref;return{$$typeof:t,type:H,key:K,ref:ie!==void 0?ie:null,props:ne}}function j(H,K){return T(H.type,K,H.props)}function z(H){return typeof H=="object"&&H!==null&&H.$$typeof===t}function L(H){var K={"=":"=0",":":"=2"};return"$"+H.replace(/[=:]/g,function(ne){return K[ne]})}var B=/\/+/g;function R(H,K){return typeof H=="object"&&H!==null&&H.key!=null?L(""+H.key):K.toString(36)}function $(H){switch(H.status){case"fulfilled":return H.value;case"rejected":throw H.reason;default:switch(typeof H.status=="string"?H.then(C,C):(H.status="pending",H.then(function(K){H.status==="pending"&&(H.status="fulfilled",H.value=K)},function(K){H.status==="pending"&&(H.status="rejected",H.reason=K)})),H.status){case"fulfilled":return H.value;case"rejected":throw H.reason}}throw H}function q(H,K,ne,ie,be){var pe=typeof H;(pe==="undefined"||pe==="boolean")&&(H=null);var de=!1;if(H===null)de=!0;else switch(pe){case"bigint":case"string":case"number":de=!0;break;case"object":switch(H.$$typeof){case t:case e:de=!0;break;case d:return de=H._init,q(de(H._payload),K,ne,ie,be)}}if(de)return be=be(H),de=ie===""?"."+R(H,0):ie,k(be)?(ne="",de!=null&&(ne=de.replace(B,"$&/")+"/"),q(be,K,ne,"",function(Ae){return Ae})):be!=null&&(z(be)&&(be=j(be,ne+(be.key==null||H&&H.key===be.key?"":(""+be.key).replace(B,"$&/")+"/")+de)),K.push(be)),1;de=0;var Ce=ie===""?".":ie+":";if(k(H))for(var ae=0;ae>>1,re=q[Y];if(0>>1;Yi(ne,G))iei(be,ne)?(q[Y]=be,q[ie]=G,Y=ie):(q[Y]=ne,q[K]=G,Y=K);else if(iei(be,G))q[Y]=be,q[ie]=G,Y=ie;else break e}}return I}function i(q,I){var G=q.sortIndex-I.sortIndex;return G!==0?G:q.id-I.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,m=3,p=!1,b=!1,v=!1,x=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function A(q){for(var I=n(u);I!==null;){if(I.callback===null)r(u);else if(I.startTime<=q)r(u),I.sortIndex=I.expirationTime,e(c,I);else break;I=n(u)}}function k(q){if(v=!1,A(q),!b)if(n(c)!==null)b=!0,C||(C=!0,L());else{var I=n(u);I!==null&&$(k,I.startTime-q)}}var C=!1,E=-1,P=5,T=-1;function j(){return x?!0:!(t.unstable_now()-Tq&&j());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,m=h.priorityLevel;var re=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof re=="function"){h.callback=re,A(q),I=!0;break t}h===n(c)&&r(c),A(q)}else r(c);h=n(c)}if(h!==null)I=!0;else{var H=n(u);H!==null&&$(k,H.startTime-q),I=!1}}break e}finally{h=null,m=G,p=!1}I=void 0}}finally{I?L():C=!1}}}var L;if(typeof N=="function")L=function(){N(z)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=z,L=function(){R.postMessage(null)}}else L=function(){y(z,0)};function $(q,I){E=y(function(){q(t.unstable_now())},I)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=G,e(u,q),n(c)===null&&q===n(u)&&(v?(S(E),E=-1):v=!0,$(k,G-Y))):(q.sortIndex=re,e(c,q),b||p||(b=!0,C||(C=!0,L()))),q},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(q){var I=m;return function(){var G=m;m=I;try{return q.apply(this,arguments)}finally{m=G}}}})(vA)),vA}var wz;function loe(){return wz||(wz=1,yA.exports=ooe()),yA.exports}var wA={exports:{}},Ga={};var _z;function coe(){if(_z)return Ga;_z=1;var t=Ab();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),wA.exports=coe(),wA.exports}var Nz;function uoe(){if(Nz)return Ux;Nz=1;var t=loe(),e=Ab(),n=zW();function r(f){var g="https://react.dev/errors/"+f;if(1re||(f.current=Y[re],Y[re]=null,re--)}function ne(f,g){re++,Y[re]=f.current,f.current=g}var ie=H(null),be=H(null),pe=H(null),de=H(null);function Ce(f,g){switch(ne(pe,g),ne(be,f),ne(ie,null),g.nodeType){case 9:case 11:f=(f=g.documentElement)&&(f=f.namespaceURI)?UU(f):0;break;default:if(f=g.tagName,g=g.namespaceURI)g=UU(g),f=zU(g,f);else switch(f){case"svg":f=1;break;case"math":f=2;break;default:f=0}}K(ie),ne(ie,f)}function ae(){K(ie),K(be),K(pe)}function Ae(f){f.memoizedState!==null&&ne(de,f);var g=ie.current,w=zU(g,f.type);g!==w&&(ne(be,f),ne(ie,w))}function Le(f){be.current===f&&(K(ie),K(be)),de.current===f&&(K(de),Rx._currentValue=G)}var fe,Xe;function W(f){if(fe===void 0)try{throw Error()}catch(w){var g=w.stack.trim().match(/\n( *(at )?)/);fe=g&&g[1]||"",Xe=-1)":-1D||ze[M]!==lt[D]){var yt=` `+ze[M].replace(" at new "," at ");return f.displayName&&yt.includes("")&&(yt=yt.replace("",f.displayName)),yt}while(1<=M&&0<=D);break}}}finally{Q=!1,Error.prepareStackTrace=w}return(w=f?f.displayName||f.name:"")?W(w):""}function X(f,g){switch(f.tag){case 26:case 27:case 5:return W(f.type);case 16:return W("Lazy");case 13:return f.child!==g&&g!==null?W("Suspense Fallback"):W("Suspense");case 19:return W("SuspenseList");case 0:case 15:return me(f.type,!1);case 11:return me(f.type.render,!1);case 1:return me(f.type,!0);case 31:return W("Activity");default:return""}}function te(f){try{var g="",w=null;do g+=X(f,w),w=f,f=f.return;while(f);return g}catch(M){return` Error generating stack: `+M.message+` -`+M.stack}}var V=Object.prototype.hasOwnProperty,ge=t.unstable_scheduleCallback,Se=t.unstable_cancelCallback,ee=t.unstable_shouldYield,U=t.unstable_requestPaint,O=t.unstable_now,Z=t.unstable_getCurrentPriorityLevel,le=t.unstable_ImmediatePriority,we=t.unstable_UserBlockingPriority,ye=t.unstable_NormalPriority,se=t.unstable_LowPriority,Oe=t.unstable_IdlePriority,He=t.log,tt=t.unstable_setDisableYieldValue,Ue=null,xe=null;function Ae(f){if(typeof He=="function"&&tt(f),xe&&typeof xe.setStrictMode=="function")try{xe.setStrictMode(Ue,f)}catch{}}var Ie=Math.clz32?Math.clz32:Me,Ne=Math.log,Ge=Math.LN2;function Me(f){return f>>>=0,f===0?32:31-(Ne(f)/Ge|0)|0}var rt=256,ke=262144,Ke=4194304;function Be(f){var g=f&42;if(g!==0)return g;switch(f&-f){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return f&261888;case 262144:case 524288:case 1048576:case 2097152:return f&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return f&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return f}}function ue(f,g,w){var M=f.pendingLanes;if(M===0)return 0;var D=0,F=f.suspendedLanes,J=f.pingedLanes;f=f.warmLanes;var ve=M&134217727;return ve!==0?(M=ve&~F,M!==0?D=Be(M):(J&=ve,J!==0?D=Be(J):w||(w=ve&~f,w!==0&&(D=Be(w))))):(ve=M&~F,ve!==0?D=Be(ve):J!==0?D=Be(J):w||(w=M&~f,w!==0&&(D=Be(w)))),D===0?0:g!==0&&g!==D&&(g&F)===0&&(F=D&-D,w=g&-g,F>=w||F===32&&(w&4194048)!==0)?g:D}function $e(f,g){return(f.pendingLanes&~(f.suspendedLanes&~f.pingedLanes)&g)===0}function at(f,g){switch(f){case 1:case 2:case 4:case 8:case 64:return g+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return g+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function kt(){var f=Ke;return Ke<<=1,(Ke&62914560)===0&&(Ke=4194304),f}function gt(f){for(var g=[],w=0;31>w;w++)g.push(f);return g}function zt(f,g){f.pendingLanes|=g,g!==268435456&&(f.suspendedLanes=0,f.pingedLanes=0,f.warmLanes=0)}function Ft(f,g,w,M,D,F){var J=f.pendingLanes;f.pendingLanes=w,f.suspendedLanes=0,f.pingedLanes=0,f.warmLanes=0,f.expiredLanes&=w,f.entangledLanes&=w,f.errorRecoveryDisabledLanes&=w,f.shellSuspendCounter=0;var ve=f.entanglements,ze=f.expirationTimes,lt=f.hiddenUpdates;for(w=J&~w;0"u")return null;try{return f.activeElement||f.body}catch{return f.body}}var ir=/[\n"\\]/g;function In(f){return f.replace(ir,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function ai(f,g,w,M,D,F,J,ve){f.name="",J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"?f.type=J:f.removeAttribute("type"),g!=null?J==="number"?(g===0&&f.value===""||f.value!=g)&&(f.value=""+fn(g)):f.value!==""+fn(g)&&(f.value=""+fn(g)):J!=="submit"&&J!=="reset"||f.removeAttribute("value"),g!=null?fr(f,J,fn(g)):w!=null?fr(f,J,fn(w)):M!=null&&f.removeAttribute("value"),D==null&&F!=null&&(f.defaultChecked=!!F),D!=null&&(f.checked=D&&typeof D!="function"&&typeof D!="symbol"),ve!=null&&typeof ve!="function"&&typeof ve!="symbol"&&typeof ve!="boolean"?f.name=""+fn(ve):f.removeAttribute("name")}function ar(f,g,w,M,D,F,J,ve){if(F!=null&&typeof F!="function"&&typeof F!="symbol"&&typeof F!="boolean"&&(f.type=F),g!=null||w!=null){if(!(F!=="submit"&&F!=="reset"||g!=null)){dn(f);return}w=w!=null?""+fn(w):"",g=g!=null?""+fn(g):w,ve||g===f.value||(f.value=g),f.defaultValue=g}M=M??D,M=typeof M!="function"&&typeof M!="symbol"&&!!M,f.checked=ve?f.checked:!!M,f.defaultChecked=!!M,J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"&&(f.name=J),dn(f)}function fr(f,g,w){g==="number"&&en(f.ownerDocument)===f||f.defaultValue===""+w||(f.defaultValue=""+w)}function nt(f,g,w,M){if(f=f.options,g){g={};for(var D=0;D"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Zb=!1;if(pr)try{var tf={};Object.defineProperty(tf,"passive",{get:function(){Zb=!0}}),window.addEventListener("test",tf,tf),window.removeEventListener("test",tf,tf)}catch{Zb=!1}var ql=null,Jb=null,Ym=null;function Ov(){if(Ym)return Ym;var f,g=Jb,w=g.length,M,D="value"in ql?ql.value:ql.textContent,F=D.length;for(f=0;f=tx),qF=" ",WF=!1;function KF(f,g){switch(f){case"keyup":return Nae.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function XF(f){return f=f.detail,typeof f=="object"&&"data"in f?f.data:null}var Jm=!1;function kae(f,g){switch(f){case"compositionend":return XF(g);case"keypress":return g.which!==32?null:(WF=!0,qF);case"textInput":return f=g.data,f===qF&&WF?null:f;default:return null}}function Eae(f,g){if(Jm)return f==="compositionend"||!_k&&KF(f,g)?(f=Ov(),Ym=Jb=ql=null,Jm=!1,f):null;switch(f){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:w,offset:g-f};f=M}e:{for(;w;){if(w.nextSibling){w=w.nextSibling;break e}w=w.parentNode}w=void 0}w=rI(w)}}function aI(f,g){return f&&g?f===g?!0:f&&f.nodeType===3?!1:g&&g.nodeType===3?aI(f,g.parentNode):"contains"in f?f.contains(g):f.compareDocumentPosition?!!(f.compareDocumentPosition(g)&16):!1:!1}function sI(f){f=f!=null&&f.ownerDocument!=null&&f.ownerDocument.defaultView!=null?f.ownerDocument.defaultView:window;for(var g=en(f.document);g instanceof f.HTMLIFrameElement;){try{var w=typeof g.contentWindow.location.href=="string"}catch{w=!1}if(w)f=g.contentWindow;else break;g=en(f.document)}return g}function Mk(f){var g=f&&f.nodeName&&f.nodeName.toLowerCase();return g&&(g==="input"&&(f.type==="text"||f.type==="search"||f.type==="tel"||f.type==="url"||f.type==="password")||g==="textarea"||f.contentEditable==="true")}var Oae=pr&&"documentMode"in document&&11>=document.documentMode,ep=null,kk=null,ax=null,Ek=!1;function oI(f,g,w){var M=w.window===w?w.document:w.nodeType===9?w:w.ownerDocument;Ek||ep==null||ep!==en(M)||(M=ep,"selectionStart"in M&&Mk(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),ax&&ix(ax,M)||(ax=M,M=Ew(kk,"onSelect"),0>=J,D-=J,Wl=1<<32-Ie(g)+D|w<jn?(Yn=Xt,Xt=null):Yn=Xt.sibling;var cr=ft(Ze,Xt,ot[jn],wt);if(cr===null){Xt===null&&(Xt=Yn);break}f&&Xt&&cr.alternate===null&&g(Ze,Xt),qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr,Xt=Yn}if(jn===ot.length)return w(Ze,Xt),Zn&&Uc(Ze,jn),Jt;if(Xt===null){for(;jnjn?(Yn=Xt,Xt=null):Yn=Xt.sibling;var jd=ft(Ze,Xt,cr.value,wt);if(jd===null){Xt===null&&(Xt=Yn);break}f&&Xt&&jd.alternate===null&&g(Ze,Xt),qe=F(jd,qe,jn),lr===null?Jt=jd:lr.sibling=jd,lr=jd,Xt=Yn}if(cr.done)return w(Ze,Xt),Zn&&Uc(Ze,jn),Jt;if(Xt===null){for(;!cr.done;jn++,cr=ot.next())cr=_t(Ze,cr.value,wt),cr!==null&&(qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr);return Zn&&Uc(Ze,jn),Jt}for(Xt=M(Xt);!cr.done;jn++,cr=ot.next())cr=bt(Xt,Ze,jn,cr.value,wt),cr!==null&&(f&&cr.alternate!==null&&Xt.delete(cr.key===null?jn:cr.key),qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr);return f&&Xt.forEach(function(toe){return g(Ze,toe)}),Zn&&Uc(Ze,jn),Jt}function Tr(Ze,qe,ot,wt){if(typeof ot=="object"&&ot!==null&&ot.type===v&&ot.key===null&&(ot=ot.props.children),typeof ot=="object"&&ot!==null){switch(ot.$$typeof){case p:e:{for(var Jt=ot.key;qe!==null;){if(qe.key===Jt){if(Jt=ot.type,Jt===v){if(qe.tag===7){w(Ze,qe.sibling),wt=D(qe,ot.props.children),wt.return=Ze,Ze=wt;break e}}else if(qe.elementType===Jt||typeof Jt=="object"&&Jt!==null&&Jt.$$typeof===P&&pf(Jt)===qe.type){w(Ze,qe.sibling),wt=D(qe,ot.props),dx(wt,ot),wt.return=Ze,Ze=wt;break e}w(Ze,qe);break}else g(Ze,qe);qe=qe.sibling}ot.type===v?(wt=uf(ot.props.children,Ze.mode,wt,ot.key),wt.return=Ze,Ze=wt):(wt=Vv(ot.type,ot.key,ot.props,null,Ze.mode,wt),dx(wt,ot),wt.return=Ze,Ze=wt)}return J(Ze);case b:e:{for(Jt=ot.key;qe!==null;){if(qe.key===Jt)if(qe.tag===4&&qe.stateNode.containerInfo===ot.containerInfo&&qe.stateNode.implementation===ot.implementation){w(Ze,qe.sibling),wt=D(qe,ot.children||[]),wt.return=Ze,Ze=wt;break e}else{w(Ze,qe);break}else g(Ze,qe);qe=qe.sibling}wt=Rk(ot,Ze.mode,wt),wt.return=Ze,Ze=wt}return J(Ze);case P:return ot=pf(ot),Tr(Ze,qe,ot,wt)}if($(ot))return qt(Ze,qe,ot,wt);if(L(ot)){if(Jt=L(ot),typeof Jt!="function")throw Error(r(150));return ot=Jt.call(ot),ln(Ze,qe,ot,wt)}if(typeof ot.then=="function")return Tr(Ze,qe,Qv(ot),wt);if(ot.$$typeof===N)return Tr(Ze,qe,Wv(Ze,ot),wt);Zv(Ze,ot)}return typeof ot=="string"&&ot!==""||typeof ot=="number"||typeof ot=="bigint"?(ot=""+ot,qe!==null&&qe.tag===6?(w(Ze,qe.sibling),wt=D(qe,ot),wt.return=Ze,Ze=wt):(w(Ze,qe),wt=Dk(ot,Ze.mode,wt),wt.return=Ze,Ze=wt),J(Ze)):w(Ze,qe)}return function(Ze,qe,ot,wt){try{ux=0;var Jt=Tr(Ze,qe,ot,wt);return dp=null,Jt}catch(Xt){if(Xt===up||Xt===Xv)throw Xt;var lr=Qs(29,Xt,null,Ze.mode);return lr.lanes=wt,lr.return=Ze,lr}}}var bf=CI(!0),jI=CI(!1),md=!1;function qk(f){f.updateQueue={baseState:f.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wk(f,g){f=f.updateQueue,g.updateQueue===f&&(g.updateQueue={baseState:f.baseState,firstBaseUpdate:f.firstBaseUpdate,lastBaseUpdate:f.lastBaseUpdate,shared:f.shared,callbacks:null})}function pd(f){return{lane:f,tag:0,payload:null,callback:null,next:null}}function gd(f,g,w){var M=f.updateQueue;if(M===null)return null;if(M=M.shared,(mr&2)!==0){var D=M.pending;return D===null?g.next=g:(g.next=D.next,D.next=g),M.pending=g,g=$v(f),mI(f,null,w),g}return Hv(f,M,g,w),$v(f)}function hx(f,g,w){if(g=g.updateQueue,g!==null&&(g=g.shared,(w&4194048)!==0)){var M=g.lanes;M&=f.pendingLanes,w|=M,g.lanes=w,xt(f,w)}}function Kk(f,g){var w=f.updateQueue,M=f.alternate;if(M!==null&&(M=M.updateQueue,w===M)){var D=null,F=null;if(w=w.firstBaseUpdate,w!==null){do{var J={lane:w.lane,tag:w.tag,payload:w.payload,callback:null,next:null};F===null?D=F=J:F=F.next=J,w=w.next}while(w!==null);F===null?D=F=g:F=F.next=g}else D=F=g;w={baseState:M.baseState,firstBaseUpdate:D,lastBaseUpdate:F,shared:M.shared,callbacks:M.callbacks},f.updateQueue=w;return}f=w.lastBaseUpdate,f===null?w.firstBaseUpdate=g:f.next=g,w.lastBaseUpdate=g}var Xk=!1;function fx(){if(Xk){var f=cp;if(f!==null)throw f}}function mx(f,g,w,M){Xk=!1;var D=f.updateQueue;md=!1;var F=D.firstBaseUpdate,J=D.lastBaseUpdate,ve=D.shared.pending;if(ve!==null){D.shared.pending=null;var ze=ve,lt=ze.next;ze.next=null,J===null?F=lt:J.next=lt,J=ze;var yt=f.alternate;yt!==null&&(yt=yt.updateQueue,ve=yt.lastBaseUpdate,ve!==J&&(ve===null?yt.firstBaseUpdate=lt:ve.next=lt,yt.lastBaseUpdate=ze))}if(F!==null){var _t=D.baseState;J=0,yt=lt=ze=null,ve=F;do{var ft=ve.lane&-536870913,bt=ft!==ve.lane;if(bt?(Xn&ft)===ft:(M&ft)===ft){ft!==0&&ft===lp&&(Xk=!0),yt!==null&&(yt=yt.next={lane:0,tag:ve.tag,payload:ve.payload,callback:null,next:null});e:{var qt=f,ln=ve;ft=g;var Tr=w;switch(ln.tag){case 1:if(qt=ln.payload,typeof qt=="function"){_t=qt.call(Tr,_t,ft);break e}_t=qt;break e;case 3:qt.flags=qt.flags&-65537|128;case 0:if(qt=ln.payload,ft=typeof qt=="function"?qt.call(Tr,_t,ft):qt,ft==null)break e;_t=h({},_t,ft);break e;case 2:md=!0}}ft=ve.callback,ft!==null&&(f.flags|=64,bt&&(f.flags|=8192),bt=D.callbacks,bt===null?D.callbacks=[ft]:bt.push(ft))}else bt={lane:ft,tag:ve.tag,payload:ve.payload,callback:ve.callback,next:null},yt===null?(lt=yt=bt,ze=_t):yt=yt.next=bt,J|=ft;if(ve=ve.next,ve===null){if(ve=D.shared.pending,ve===null)break;bt=ve,ve=bt.next,bt.next=null,D.lastBaseUpdate=bt,D.shared.pending=null}}while(!0);yt===null&&(ze=_t),D.baseState=ze,D.firstBaseUpdate=lt,D.lastBaseUpdate=yt,F===null&&(D.shared.lanes=0),wd|=J,f.lanes=J,f.memoizedState=_t}}function PI(f,g){if(typeof f!="function")throw Error(r(191,f));f.call(g)}function DI(f,g){var w=f.callbacks;if(w!==null)for(f.callbacks=null,f=0;fF?F:8;var J=q.T,ve={};q.T=ve,mE(f,!1,g,w);try{var ze=D(),lt=q.S;if(lt!==null&<(ve,ze),ze!==null&&typeof ze=="object"&&typeof ze.then=="function"){var yt=Vae(ze,M);bx(f,g,yt,no(f))}else bx(f,g,M,no(f))}catch(_t){bx(f,g,{then:function(){},status:"rejected",reason:_t},no())}finally{I.p=F,J!==null&&ve.types!==null&&(J.types=ve.types),q.T=J}}function Yae(){}function hE(f,g,w,M){if(f.tag!==5)throw Error(r(476));var D=d5(f).queue;u5(f,D,g,G,w===null?Yae:function(){return h5(f),w(M)})}function d5(f){var g=f.memoizedState;if(g!==null)return g;g={memoizedState:G,baseState:G,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$c,lastRenderedState:G},next:null};var w={};return g.next={memoizedState:w,baseState:w,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$c,lastRenderedState:w},next:null},f.memoizedState=g,f=f.alternate,f!==null&&(f.memoizedState=g),g}function h5(f){var g=d5(f);g.next===null&&(g=f.alternate.memoizedState),bx(f,g.next.queue,{},no())}function fE(){return Ta(Rx)}function f5(){return Ci().memoizedState}function m5(){return Ci().memoizedState}function Qae(f){for(var g=f.return;g!==null;){switch(g.tag){case 24:case 3:var w=no();f=pd(w);var M=gd(g,f,w);M!==null&&(Rs(M,g,w),hx(M,g,w)),g={cache:Hk()},f.payload=g;return}g=g.return}}function Zae(f,g,w){var M=no();w={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null},lw(f)?g5(g,w):(w=jk(f,g,w,M),w!==null&&(Rs(w,f,M),b5(w,g,M)))}function p5(f,g,w){var M=no();bx(f,g,w,M)}function bx(f,g,w,M){var D={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null};if(lw(f))g5(g,D);else{var F=f.alternate;if(f.lanes===0&&(F===null||F.lanes===0)&&(F=g.lastRenderedReducer,F!==null))try{var J=g.lastRenderedState,ve=F(J,w);if(D.hasEagerState=!0,D.eagerState=ve,Ys(ve,J))return Hv(f,g,D,0),Fr===null&&Bv(),!1}catch{}if(w=jk(f,g,D,M),w!==null)return Rs(w,f,M),b5(w,g,M),!0}return!1}function mE(f,g,w,M){if(M={lane:2,revertLane:qE(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},lw(f)){if(g)throw Error(r(479))}else g=jk(f,w,M,2),g!==null&&Rs(g,f,2)}function lw(f){var g=f.alternate;return f===Tn||g!==null&&g===Tn}function g5(f,g){fp=tw=!0;var w=f.pending;w===null?g.next=g:(g.next=w.next,w.next=g),f.pending=g}function b5(f,g,w){if((w&4194048)!==0){var M=g.lanes;M&=f.pendingLanes,w|=M,g.lanes=w,xt(f,w)}}var xx={readContext:Ta,use:iw,useCallback:fi,useContext:fi,useEffect:fi,useImperativeHandle:fi,useLayoutEffect:fi,useInsertionEffect:fi,useMemo:fi,useReducer:fi,useRef:fi,useState:fi,useDebugValue:fi,useDeferredValue:fi,useTransition:fi,useSyncExternalStore:fi,useId:fi,useHostTransitionStatus:fi,useFormState:fi,useActionState:fi,useOptimistic:fi,useMemoCache:fi,useCacheRefresh:fi};xx.useEffectEvent=fi;var x5={readContext:Ta,use:iw,useCallback:function(f,g){return us().memoizedState=[f,g===void 0?null:g],f},useContext:Ta,useEffect:t5,useImperativeHandle:function(f,g,w){w=w!=null?w.concat([f]):null,sw(4194308,4,a5.bind(null,g,f),w)},useLayoutEffect:function(f,g){return sw(4194308,4,f,g)},useInsertionEffect:function(f,g){sw(4,2,f,g)},useMemo:function(f,g){var w=us();g=g===void 0?null:g;var M=f();if(xf){Ae(!0);try{f()}finally{Ae(!1)}}return w.memoizedState=[M,g],M},useReducer:function(f,g,w){var M=us();if(w!==void 0){var D=w(g);if(xf){Ae(!0);try{w(g)}finally{Ae(!1)}}}else D=g;return M.memoizedState=M.baseState=D,f={pending:null,lanes:0,dispatch:null,lastRenderedReducer:f,lastRenderedState:D},M.queue=f,f=f.dispatch=Zae.bind(null,Tn,f),[M.memoizedState,f]},useRef:function(f){var g=us();return f={current:f},g.memoizedState=f},useState:function(f){f=oE(f);var g=f.queue,w=p5.bind(null,Tn,g);return g.dispatch=w,[f.memoizedState,w]},useDebugValue:uE,useDeferredValue:function(f,g){var w=us();return dE(w,f,g)},useTransition:function(){var f=oE(!1);return f=u5.bind(null,Tn,f.queue,!0,!1),us().memoizedState=f,[!1,f]},useSyncExternalStore:function(f,g,w){var M=Tn,D=us();if(Zn){if(w===void 0)throw Error(r(407));w=w()}else{if(w=g(),Fr===null)throw Error(r(349));(Xn&127)!==0||UI(M,g,w)}D.memoizedState=w;var F={value:w,getSnapshot:g};return D.queue=F,t5(BI.bind(null,M,F,f),[f]),M.flags|=2048,pp(9,{destroy:void 0},zI.bind(null,M,F,w,g),null),w},useId:function(){var f=us(),g=Fr.identifierPrefix;if(Zn){var w=Kl,M=Wl;w=(M&~(1<<32-Ie(M)-1)).toString(32)+w,g="_"+g+"R_"+w,w=nw++,0<\/script>",F=F.removeChild(F.firstChild);break;case"select":F=typeof M.is=="string"?J.createElement("select",{is:M.is}):J.createElement("select"),M.multiple?F.multiple=!0:M.size&&(F.size=M.size);break;default:F=typeof M.is=="string"?J.createElement(D,{is:M.is}):J.createElement(D)}}F[Qn]=g,F[An]=M;e:for(J=g.child;J!==null;){if(J.tag===5||J.tag===6)F.appendChild(J.stateNode);else if(J.tag!==4&&J.tag!==27&&J.child!==null){J.child.return=J,J=J.child;continue}if(J===g)break e;for(;J.sibling===null;){if(J.return===null||J.return===g)break e;J=J.return}J.sibling.return=J.return,J=J.sibling}g.stateNode=F;e:switch(Ca(F,D,M),D){case"button":case"input":case"select":case"textarea":M=!!M.autoFocus;break e;case"img":M=!0;break e;default:M=!1}M&&Gc(g)}}return Gr(g),TE(g,g.type,f===null?null:f.memoizedProps,g.pendingProps,w),null;case 6:if(f&&g.stateNode!=null)f.memoizedProps!==M&&Gc(g);else{if(typeof M!="string"&&g.stateNode===null)throw Error(r(166));if(f=pe.current,sp(g)){if(f=g.stateNode,w=g.memoizedProps,M=null,D=Ea,D!==null)switch(D.tag){case 27:case 5:M=D.memoizedProps}f[Qn]=g,f=!!(f.nodeValue===w||M!==null&&M.suppressHydrationWarning===!0||FU(f.nodeValue,w)),f||hd(g,!0)}else f=Tw(f).createTextNode(M),f[Qn]=g,g.stateNode=f}return Gr(g),null;case 31:if(w=g.memoizedState,f===null||f.memoizedState!==null){if(M=sp(g),w!==null){if(f===null){if(!M)throw Error(r(318));if(f=g.memoizedState,f=f!==null?f.dehydrated:null,!f)throw Error(r(557));f[Qn]=g}else df(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Gr(g),f=!1}else w=Ik(),f!==null&&f.memoizedState!==null&&(f.memoizedState.hydrationErrors=w),f=!0;if(!f)return g.flags&256?(Js(g),g):(Js(g),null);if((g.flags&128)!==0)throw Error(r(558))}return Gr(g),null;case 13:if(M=g.memoizedState,f===null||f.memoizedState!==null&&f.memoizedState.dehydrated!==null){if(D=sp(g),M!==null&&M.dehydrated!==null){if(f===null){if(!D)throw Error(r(318));if(D=g.memoizedState,D=D!==null?D.dehydrated:null,!D)throw Error(r(317));D[Qn]=g}else df(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Gr(g),D=!1}else D=Ik(),f!==null&&f.memoizedState!==null&&(f.memoizedState.hydrationErrors=D),D=!0;if(!D)return g.flags&256?(Js(g),g):(Js(g),null)}return Js(g),(g.flags&128)!==0?(g.lanes=w,g):(w=M!==null,f=f!==null&&f.memoizedState!==null,w&&(M=g.child,D=null,M.alternate!==null&&M.alternate.memoizedState!==null&&M.alternate.memoizedState.cachePool!==null&&(D=M.alternate.memoizedState.cachePool.pool),F=null,M.memoizedState!==null&&M.memoizedState.cachePool!==null&&(F=M.memoizedState.cachePool.pool),F!==D&&(M.flags|=2048)),w!==f&&w&&(g.child.flags|=8192),fw(g,g.updateQueue),Gr(g),null);case 4:return ae(),f===null&&YE(g.stateNode.containerInfo),Gr(g),null;case 10:return Bc(g.type),Gr(g),null;case 19:if(K(Ai),M=g.memoizedState,M===null)return Gr(g),null;if(D=(g.flags&128)!==0,F=M.rendering,F===null)if(D)vx(M,!1);else{if(mi!==0||f!==null&&(f.flags&128)!==0)for(f=g.child;f!==null;){if(F=ew(f),F!==null){for(g.flags|=128,vx(M,!1),f=F.updateQueue,g.updateQueue=f,fw(g,f),g.subtreeFlags=0,f=w,w=g.child;w!==null;)pI(w,f),w=w.sibling;return ne(Ai,Ai.current&1|2),Zn&&Uc(g,M.treeForkCount),g.child}f=f.sibling}M.tail!==null&&O()>xw&&(g.flags|=128,D=!0,vx(M,!1),g.lanes=4194304)}else{if(!D)if(f=ew(F),f!==null){if(g.flags|=128,D=!0,f=f.updateQueue,g.updateQueue=f,fw(g,f),vx(M,!0),M.tail===null&&M.tailMode==="hidden"&&!F.alternate&&!Zn)return Gr(g),null}else 2*O()-M.renderingStartTime>xw&&w!==536870912&&(g.flags|=128,D=!0,vx(M,!1),g.lanes=4194304);M.isBackwards?(F.sibling=g.child,g.child=F):(f=M.last,f!==null?f.sibling=F:g.child=F,M.last=F)}return M.tail!==null?(f=M.tail,M.rendering=f,M.tail=f.sibling,M.renderingStartTime=O(),f.sibling=null,w=Ai.current,ne(Ai,D?w&1|2:w&1),Zn&&Uc(g,M.treeForkCount),f):(Gr(g),null);case 22:case 23:return Js(g),Qk(),M=g.memoizedState!==null,f!==null?f.memoizedState!==null!==M&&(g.flags|=8192):M&&(g.flags|=8192),M?(w&536870912)!==0&&(g.flags&128)===0&&(Gr(g),g.subtreeFlags&6&&(g.flags|=8192)):Gr(g),w=g.updateQueue,w!==null&&fw(g,w.retryQueue),w=null,f!==null&&f.memoizedState!==null&&f.memoizedState.cachePool!==null&&(w=f.memoizedState.cachePool.pool),M=null,g.memoizedState!==null&&g.memoizedState.cachePool!==null&&(M=g.memoizedState.cachePool.pool),M!==w&&(g.flags|=2048),f!==null&&K(mf),null;case 24:return w=null,f!==null&&(w=f.memoizedState.cache),g.memoizedState.cache!==w&&(g.flags|=2048),Bc(Ri),Gr(g),null;case 25:return null;case 30:return null}throw Error(r(156,g.tag))}function rse(f,g){switch(Lk(g),g.tag){case 1:return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 3:return Bc(Ri),ae(),f=g.flags,(f&65536)!==0&&(f&128)===0?(g.flags=f&-65537|128,g):null;case 26:case 27:case 5:return Le(g),null;case 31:if(g.memoizedState!==null){if(Js(g),g.alternate===null)throw Error(r(340));df()}return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 13:if(Js(g),f=g.memoizedState,f!==null&&f.dehydrated!==null){if(g.alternate===null)throw Error(r(340));df()}return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 19:return K(Ai),null;case 4:return ae(),null;case 10:return Bc(g.type),null;case 22:case 23:return Js(g),Qk(),f!==null&&K(mf),f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 24:return Bc(Ri),null;case 25:return null;default:return null}}function H5(f,g){switch(Lk(g),g.tag){case 3:Bc(Ri),ae();break;case 26:case 27:case 5:Le(g);break;case 4:ae();break;case 31:g.memoizedState!==null&&Js(g);break;case 13:Js(g);break;case 19:K(Ai);break;case 10:Bc(g.type);break;case 22:case 23:Js(g),Qk(),f!==null&&K(mf);break;case 24:Bc(Ri)}}function wx(f,g){try{var w=g.updateQueue,M=w!==null?w.lastEffect:null;if(M!==null){var D=M.next;w=D;do{if((w.tag&f)===f){M=void 0;var F=w.create,J=w.inst;M=F(),J.destroy=M}w=w.next}while(w!==D)}}catch(ve){vr(g,g.return,ve)}}function yd(f,g,w){try{var M=g.updateQueue,D=M!==null?M.lastEffect:null;if(D!==null){var F=D.next;M=F;do{if((M.tag&f)===f){var J=M.inst,ve=J.destroy;if(ve!==void 0){J.destroy=void 0,D=g;var ze=w,lt=ve;try{lt()}catch(yt){vr(D,ze,yt)}}}M=M.next}while(M!==F)}}catch(yt){vr(g,g.return,yt)}}function $5(f){var g=f.updateQueue;if(g!==null){var w=f.stateNode;try{DI(g,w)}catch(M){vr(f,f.return,M)}}}function V5(f,g,w){w.props=yf(f.type,f.memoizedProps),w.state=f.memoizedState;try{w.componentWillUnmount()}catch(M){vr(f,g,M)}}function _x(f,g){try{var w=f.ref;if(w!==null){switch(f.tag){case 26:case 27:case 5:var M=f.stateNode;break;case 30:M=f.stateNode;break;default:M=f.stateNode}typeof w=="function"?f.refCleanup=w(M):w.current=M}}catch(D){vr(f,g,D)}}function Xl(f,g){var w=f.ref,M=f.refCleanup;if(w!==null)if(typeof M=="function")try{M()}catch(D){vr(f,g,D)}finally{f.refCleanup=null,f=f.alternate,f!=null&&(f.refCleanup=null)}else if(typeof w=="function")try{w(null)}catch(D){vr(f,g,D)}else w.current=null}function G5(f){var g=f.type,w=f.memoizedProps,M=f.stateNode;try{e:switch(g){case"button":case"input":case"select":case"textarea":w.autoFocus&&M.focus();break e;case"img":w.src?M.src=w.src:w.srcSet&&(M.srcset=w.srcSet)}}catch(D){vr(f,f.return,D)}}function AE(f,g,w){try{var M=f.stateNode;Mse(M,f.type,w,g),M[An]=g}catch(D){vr(f,f.return,D)}}function q5(f){return f.tag===5||f.tag===3||f.tag===26||f.tag===27&&kd(f.type)||f.tag===4}function CE(f){e:for(;;){for(;f.sibling===null;){if(f.return===null||q5(f.return))return null;f=f.return}for(f.sibling.return=f.return,f=f.sibling;f.tag!==5&&f.tag!==6&&f.tag!==18;){if(f.tag===27&&kd(f.type)||f.flags&2||f.child===null||f.tag===4)continue e;f.child.return=f,f=f.child}if(!(f.flags&2))return f.stateNode}}function jE(f,g,w){var M=f.tag;if(M===5||M===6)f=f.stateNode,g?(w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w).insertBefore(f,g):(g=w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w,g.appendChild(f),w=w._reactRootContainer,w!=null||g.onclick!==null||(g.onclick=Mr));else if(M!==4&&(M===27&&kd(f.type)&&(w=f.stateNode,g=null),f=f.child,f!==null))for(jE(f,g,w),f=f.sibling;f!==null;)jE(f,g,w),f=f.sibling}function mw(f,g,w){var M=f.tag;if(M===5||M===6)f=f.stateNode,g?w.insertBefore(f,g):w.appendChild(f);else if(M!==4&&(M===27&&kd(f.type)&&(w=f.stateNode),f=f.child,f!==null))for(mw(f,g,w),f=f.sibling;f!==null;)mw(f,g,w),f=f.sibling}function W5(f){var g=f.stateNode,w=f.memoizedProps;try{for(var M=f.type,D=g.attributes;D.length;)g.removeAttributeNode(D[0]);Ca(g,M,w),g[Qn]=f,g[An]=w}catch(F){vr(f,f.return,F)}}var qc=!1,Fi=!1,PE=!1,K5=typeof WeakSet=="function"?WeakSet:Set,ha=null;function ise(f,g){if(f=f.containerInfo,JE=Ow,f=sI(f),Mk(f)){if("selectionStart"in f)var w={start:f.selectionStart,end:f.selectionEnd};else e:{w=(w=f.ownerDocument)&&w.defaultView||window;var M=w.getSelection&&w.getSelection();if(M&&M.rangeCount!==0){w=M.anchorNode;var D=M.anchorOffset,F=M.focusNode;M=M.focusOffset;try{w.nodeType,F.nodeType}catch{w=null;break e}var J=0,ve=-1,ze=-1,lt=0,yt=0,_t=f,ft=null;t:for(;;){for(var bt;_t!==w||D!==0&&_t.nodeType!==3||(ve=J+D),_t!==F||M!==0&&_t.nodeType!==3||(ze=J+M),_t.nodeType===3&&(J+=_t.nodeValue.length),(bt=_t.firstChild)!==null;)ft=_t,_t=bt;for(;;){if(_t===f)break t;if(ft===w&&++lt===D&&(ve=J),ft===F&&++yt===M&&(ze=J),(bt=_t.nextSibling)!==null)break;_t=ft,ft=_t.parentNode}_t=bt}w=ve===-1||ze===-1?null:{start:ve,end:ze}}else w=null}w=w||{start:0,end:0}}else w=null;for(eT={focusedElem:f,selectionRange:w},Ow=!1,ha=g;ha!==null;)if(g=ha,f=g.child,(g.subtreeFlags&1028)!==0&&f!==null)f.return=g,ha=f;else for(;ha!==null;){switch(g=ha,F=g.alternate,f=g.flags,g.tag){case 0:if((f&4)!==0&&(f=g.updateQueue,f=f!==null?f.events:null,f!==null))for(w=0;w title"))),Ca(F,M,w),F[Qn]=f,_e(F),M=F;break e;case"link":var J=ez("link","href",D).get(M+(w.href||""));if(J){for(var ve=0;veTr&&(J=Tr,Tr=ln,ln=J);var Ze=iI(ve,ln),qe=iI(ve,Tr);if(Ze&&qe&&(bt.rangeCount!==1||bt.anchorNode!==Ze.node||bt.anchorOffset!==Ze.offset||bt.focusNode!==qe.node||bt.focusOffset!==qe.offset)){var ot=_t.createRange();ot.setStart(Ze.node,Ze.offset),bt.removeAllRanges(),ln>Tr?(bt.addRange(ot),bt.extend(qe.node,qe.offset)):(ot.setEnd(qe.node,qe.offset),bt.addRange(ot))}}}}for(_t=[],bt=ve;bt=bt.parentNode;)bt.nodeType===1&&_t.push({element:bt,left:bt.scrollLeft,top:bt.scrollTop});for(typeof ve.focus=="function"&&ve.focus(),ve=0;ve<_t.length;ve++){var wt=_t[ve];wt.element.scrollLeft=wt.left,wt.element.scrollTop=wt.top}}Ow=!!JE,eT=JE=null}finally{mr=D,I.p=M,q.T=w}}f.current=g,Qi=2}}function wU(){if(Qi===2){Qi=0;var f=Sd,g=vp,w=(g.flags&8772)!==0;if((g.subtreeFlags&8772)!==0||w){w=q.T,q.T=null;var M=I.p;I.p=2;var D=mr;mr|=4;try{X5(f,g.alternate,g)}finally{mr=D,I.p=M,q.T=w}}Qi=3}}function _U(){if(Qi===4||Qi===3){Qi=0,U();var f=Sd,g=vp,w=Qc,M=lU;(g.subtreeFlags&10256)!==0||(g.flags&10256)!==0?Qi=5:(Qi=0,vp=Sd=null,SU(f,f.pendingLanes));var D=f.pendingLanes;if(D===0&&(_d=null),En(w),g=g.stateNode,xe&&typeof xe.onCommitFiberRoot=="function")try{xe.onCommitFiberRoot(Ue,g,void 0,(g.current.flags&128)===128)}catch{}if(M!==null){g=q.T,D=I.p,I.p=2,q.T=null;try{for(var F=f.onRecoverableError,J=0;Jw?32:w,q.T=null,w=UE,UE=null;var F=Sd,J=Qc;if(Qi=0,vp=Sd=null,Qc=0,(mr&6)!==0)throw Error(r(331));var ve=mr;if(mr|=4,aU(F.current),nU(F,F.current,J,w),mr=ve,Tx(0,!1),xe&&typeof xe.onPostCommitFiberRoot=="function")try{xe.onPostCommitFiberRoot(Ue,F)}catch{}return!0}finally{I.p=D,q.T=M,SU(f,g)}}function MU(f,g,w){g=jo(w,g),g=xE(f.stateNode,g,2),f=gd(f,g,2),f!==null&&(zt(f,2),Yl(f))}function vr(f,g,w){if(f.tag===3)MU(f,f,w);else for(;g!==null;){if(g.tag===3){MU(g,f,w);break}else if(g.tag===1){var M=g.stateNode;if(typeof g.type.getDerivedStateFromError=="function"||typeof M.componentDidCatch=="function"&&(_d===null||!_d.has(M))){f=jo(w,f),w=k5(2),M=gd(g,w,2),M!==null&&(E5(w,M,g,f),zt(M,2),Yl(M));break}}g=g.return}}function $E(f,g,w){var M=f.pingCache;if(M===null){M=f.pingCache=new ose;var D=new Set;M.set(g,D)}else D=M.get(g),D===void 0&&(D=new Set,M.set(g,D));D.has(w)||(OE=!0,D.add(w),f=hse.bind(null,f,g,w),g.then(f,f))}function hse(f,g,w){var M=f.pingCache;M!==null&&M.delete(g),f.pingedLanes|=f.suspendedLanes&w,f.warmLanes&=~w,Fr===f&&(Xn&w)===w&&(mi===4||mi===3&&(Xn&62914560)===Xn&&300>O()-bw?(mr&2)===0&&wp(f,0):LE|=w,yp===Xn&&(yp=0)),Yl(f)}function kU(f,g){g===0&&(g=kt()),f=cf(f,g),f!==null&&(zt(f,g),Yl(f))}function fse(f){var g=f.memoizedState,w=0;g!==null&&(w=g.retryLane),kU(f,w)}function mse(f,g){var w=0;switch(f.tag){case 31:case 13:var M=f.stateNode,D=f.memoizedState;D!==null&&(w=D.retryLane);break;case 19:M=f.stateNode;break;case 22:M=f.stateNode._retryCache;break;default:throw Error(r(314))}M!==null&&M.delete(g),kU(f,w)}function pse(f,g){return ge(f,g)}var Nw=null,Sp=null,VE=!1,Mw=!1,GE=!1,Md=0;function Yl(f){f!==Sp&&f.next===null&&(Sp===null?Nw=Sp=f:Sp=Sp.next=f),Mw=!0,VE||(VE=!0,bse())}function Tx(f,g){if(!GE&&Mw){GE=!0;do for(var w=!1,M=Nw;M!==null;){if(f!==0){var D=M.pendingLanes;if(D===0)var F=0;else{var J=M.suspendedLanes,ve=M.pingedLanes;F=(1<<31-Ie(42|f)+1)-1,F&=D&~(J&~ve),F=F&201326741?F&201326741|1:F?F|2:0}F!==0&&(w=!0,CU(M,F))}else F=Xn,F=ue(M,M===Fr?F:0,M.cancelPendingCommit!==null||M.timeoutHandle!==-1),(F&3)===0||$e(M,F)||(w=!0,CU(M,F));M=M.next}while(w);GE=!1}}function gse(){EU()}function EU(){Mw=VE=!1;var f=0;Md!==0&&Ese()&&(f=Md);for(var g=O(),w=null,M=Nw;M!==null;){var D=M.next,F=TU(M,g);F===0?(M.next=null,w===null?Nw=D:w.next=D,D===null&&(Sp=w)):(w=M,(f!==0||(F&3)!==0)&&(Mw=!0)),M=D}Qi!==0&&Qi!==5||Tx(f),Md!==0&&(Md=0)}function TU(f,g){for(var w=f.suspendedLanes,M=f.pingedLanes,D=f.expirationTimes,F=f.pendingLanes&-62914561;0ve)break;var yt=ze.transferSize,_t=ze.initiatorType;yt&&IU(_t)&&(ze=ze.responseEnd,J+=yt*(ze"u"?null:document;function YU(f,g,w){var M=Np;if(M&&typeof g=="string"&&g){var D=In(g);D='link[rel="'+f+'"][href="'+D+'"]',typeof w=="string"&&(D+='[crossorigin="'+w+'"]'),XU.has(D)||(XU.add(D),f={rel:f,crossOrigin:w,href:g},M.querySelector(D)===null&&(g=M.createElement("link"),Ca(g,"link",f),_e(g),M.head.appendChild(g)))}}function Lse(f){Zc.D(f),YU("dns-prefetch",f,null)}function Fse(f,g){Zc.C(f,g),YU("preconnect",f,g)}function Ise(f,g,w){Zc.L(f,g,w);var M=Np;if(M&&f&&g){var D='link[rel="preload"][as="'+In(g)+'"]';g==="image"&&w&&w.imageSrcSet?(D+='[imagesrcset="'+In(w.imageSrcSet)+'"]',typeof w.imageSizes=="string"&&(D+='[imagesizes="'+In(w.imageSizes)+'"]')):D+='[href="'+In(f)+'"]';var F=D;switch(g){case"style":F=Mp(f);break;case"script":F=kp(f)}Fo.has(F)||(f=h({rel:"preload",href:g==="image"&&w&&w.imageSrcSet?void 0:f,as:g},w),Fo.set(F,f),M.querySelector(D)!==null||g==="style"&&M.querySelector(Px(F))||g==="script"&&M.querySelector(Dx(F))||(g=M.createElement("link"),Ca(g,"link",f),_e(g),M.head.appendChild(g)))}}function Use(f,g){Zc.m(f,g);var w=Np;if(w&&f){var M=g&&typeof g.as=="string"?g.as:"script",D='link[rel="modulepreload"][as="'+In(M)+'"][href="'+In(f)+'"]',F=D;switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":F=kp(f)}if(!Fo.has(F)&&(f=h({rel:"modulepreload",href:f},g),Fo.set(F,f),w.querySelector(D)===null)){switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(w.querySelector(Dx(F)))return}M=w.createElement("link"),Ca(M,"link",f),_e(M),w.head.appendChild(M)}}}function zse(f,g,w){Zc.S(f,g,w);var M=Np;if(M&&f){var D=Ve(M).hoistableStyles,F=Mp(f);g=g||"default";var J=D.get(F);if(!J){var ve={loading:0,preload:null};if(J=M.querySelector(Px(F)))ve.loading=5;else{f=h({rel:"stylesheet",href:f,"data-precedence":g},w),(w=Fo.get(F))&&oT(f,w);var ze=J=M.createElement("link");_e(ze),Ca(ze,"link",f),ze._p=new Promise(function(lt,yt){ze.onload=lt,ze.onerror=yt}),ze.addEventListener("load",function(){ve.loading|=1}),ze.addEventListener("error",function(){ve.loading|=2}),ve.loading|=4,Cw(J,g,M)}J={type:"stylesheet",instance:J,count:1,state:ve},D.set(F,J)}}}function Bse(f,g){Zc.X(f,g);var w=Np;if(w&&f){var M=Ve(w).hoistableScripts,D=kp(f),F=M.get(D);F||(F=w.querySelector(Dx(D)),F||(f=h({src:f,async:!0},g),(g=Fo.get(D))&&lT(f,g),F=w.createElement("script"),_e(F),Ca(F,"link",f),w.head.appendChild(F)),F={type:"script",instance:F,count:1,state:null},M.set(D,F))}}function Hse(f,g){Zc.M(f,g);var w=Np;if(w&&f){var M=Ve(w).hoistableScripts,D=kp(f),F=M.get(D);F||(F=w.querySelector(Dx(D)),F||(f=h({src:f,async:!0,type:"module"},g),(g=Fo.get(D))&&lT(f,g),F=w.createElement("script"),_e(F),Ca(F,"link",f),w.head.appendChild(F)),F={type:"script",instance:F,count:1,state:null},M.set(D,F))}}function QU(f,g,w,M){var D=(D=pe.current)?Aw(D):null;if(!D)throw Error(r(446));switch(f){case"meta":case"title":return null;case"style":return typeof w.precedence=="string"&&typeof w.href=="string"?(g=Mp(w.href),w=Ve(D).hoistableStyles,M=w.get(g),M||(M={type:"style",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};case"link":if(w.rel==="stylesheet"&&typeof w.href=="string"&&typeof w.precedence=="string"){f=Mp(w.href);var F=Ve(D).hoistableStyles,J=F.get(f);if(J||(D=D.ownerDocument||D,J={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},F.set(f,J),(F=D.querySelector(Px(f)))&&!F._p&&(J.instance=F,J.state.loading=5),Fo.has(f)||(w={rel:"preload",as:"style",href:w.href,crossOrigin:w.crossOrigin,integrity:w.integrity,media:w.media,hrefLang:w.hrefLang,referrerPolicy:w.referrerPolicy},Fo.set(f,w),F||$se(D,f,w,J.state))),g&&M===null)throw Error(r(528,""));return J}if(g&&M!==null)throw Error(r(529,""));return null;case"script":return g=w.async,w=w.src,typeof w=="string"&&g&&typeof g!="function"&&typeof g!="symbol"?(g=kp(w),w=Ve(D).hoistableScripts,M=w.get(g),M||(M={type:"script",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,f))}}function Mp(f){return'href="'+In(f)+'"'}function Px(f){return'link[rel="stylesheet"]['+f+"]"}function ZU(f){return h({},f,{"data-precedence":f.precedence,precedence:null})}function $se(f,g,w,M){f.querySelector('link[rel="preload"][as="style"]['+g+"]")?M.loading=1:(g=f.createElement("link"),M.preload=g,g.addEventListener("load",function(){return M.loading|=1}),g.addEventListener("error",function(){return M.loading|=2}),Ca(g,"link",w),_e(g),f.head.appendChild(g))}function kp(f){return'[src="'+In(f)+'"]'}function Dx(f){return"script[async]"+f}function JU(f,g,w){if(g.count++,g.instance===null)switch(g.type){case"style":var M=f.querySelector('style[data-href~="'+In(w.href)+'"]');if(M)return g.instance=M,_e(M),M;var D=h({},w,{"data-href":w.href,"data-precedence":w.precedence,href:null,precedence:null});return M=(f.ownerDocument||f).createElement("style"),_e(M),Ca(M,"style",D),Cw(M,w.precedence,f),g.instance=M;case"stylesheet":D=Mp(w.href);var F=f.querySelector(Px(D));if(F)return g.state.loading|=4,g.instance=F,_e(F),F;M=ZU(w),(D=Fo.get(D))&&oT(M,D),F=(f.ownerDocument||f).createElement("link"),_e(F);var J=F;return J._p=new Promise(function(ve,ze){J.onload=ve,J.onerror=ze}),Ca(F,"link",M),g.state.loading|=4,Cw(F,w.precedence,f),g.instance=F;case"script":return F=kp(w.src),(D=f.querySelector(Dx(F)))?(g.instance=D,_e(D),D):(M=w,(D=Fo.get(F))&&(M=h({},w),lT(M,D)),f=f.ownerDocument||f,D=f.createElement("script"),_e(D),Ca(D,"link",M),f.head.appendChild(D),g.instance=D);case"void":return null;default:throw Error(r(443,g.type))}else g.type==="stylesheet"&&(g.state.loading&4)===0&&(M=g.instance,g.state.loading|=4,Cw(M,w.precedence,f));return g.instance}function Cw(f,g,w){for(var M=w.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),D=M.length?M[M.length-1]:null,F=D,J=0;J title"):null)}function Vse(f,g,w){if(w===1||g.itemProp!=null)return!1;switch(f){case"meta":case"title":return!0;case"style":if(typeof g.precedence!="string"||typeof g.href!="string"||g.href==="")break;return!0;case"link":if(typeof g.rel!="string"||typeof g.href!="string"||g.href===""||g.onLoad||g.onError)break;return g.rel==="stylesheet"?(f=g.disabled,typeof g.precedence=="string"&&f==null):!0;case"script":if(g.async&&typeof g.async!="function"&&typeof g.async!="symbol"&&!g.onLoad&&!g.onError&&g.src&&typeof g.src=="string")return!0}return!1}function nz(f){return!(f.type==="stylesheet"&&(f.state.loading&3)===0)}function Gse(f,g,w,M){if(w.type==="stylesheet"&&(typeof M.media!="string"||matchMedia(M.media).matches!==!1)&&(w.state.loading&4)===0){if(w.instance===null){var D=Mp(M.href),F=g.querySelector(Px(D));if(F){g=F._p,g!==null&&typeof g=="object"&&typeof g.then=="function"&&(f.count++,f=Pw.bind(f),g.then(f,f)),w.state.loading|=4,w.instance=F,_e(F);return}F=g.ownerDocument||g,M=ZU(M),(D=Fo.get(D))&&oT(M,D),F=F.createElement("link"),_e(F);var J=F;J._p=new Promise(function(ve,ze){J.onload=ve,J.onerror=ze}),Ca(F,"link",M),w.instance=F}f.stylesheets===null&&(f.stylesheets=new Map),f.stylesheets.set(w,g),(g=w.state.preload)&&(w.state.loading&3)===0&&(f.count++,w=Pw.bind(f),g.addEventListener("load",w),g.addEventListener("error",w))}}var cT=0;function qse(f,g){return f.stylesheets&&f.count===0&&Rw(f,f.stylesheets),0cT?50:800)+g);return f.unsuspend=w,function(){f.unsuspend=null,clearTimeout(M),clearTimeout(D)}}:null}function Pw(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Rw(this,this.stylesheets);else if(this.unsuspend){var f=this.unsuspend;this.unsuspend=null,f()}}}var Dw=null;function Rw(f,g){f.stylesheets=null,f.unsuspend!==null&&(f.count++,Dw=new Map,g.forEach(Wse,f),Dw=null,Pw.call(f))}function Wse(f,g){if(!(g.state.loading&4)){var w=Dw.get(f);if(w)var M=w.get(null);else{w=new Map,Dw.set(f,w);for(var D=f.querySelectorAll("link[data-precedence],style[data-precedence]"),F=0;F"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),xT.exports=uoe(),xT.exports}var hoe=doe();const gn=t=>typeof t=="string",zx=()=>{let t,e;const n=new Promise((r,i)=>{t=r,e=i});return n.resolve=t,n.reject=e,n},kz=t=>t==null?"":""+t,foe=(t,e,n)=>{t.forEach(r=>{e[r]&&(n[r]=e[r])})},moe=/###/g,Ez=t=>t&&t.indexOf("###")>-1?t.replace(moe,"."):t,Tz=t=>!t||gn(t),j0=(t,e,n)=>{const r=gn(e)?e.split("."):e;let i=0;for(;i{const{obj:r,k:i}=j0(t,e,Object);if(r!==void 0||e.length===1){r[i]=n;return}let s=e[e.length-1],o=e.slice(0,e.length-1),l=j0(t,o,Object);for(;l.obj===void 0&&o.length;)s=`${o[o.length-1]}.${s}`,o=o.slice(0,o.length-1),l=j0(t,o,Object),l?.obj&&typeof l.obj[`${l.k}.${s}`]<"u"&&(l.obj=void 0);l.obj[`${l.k}.${s}`]=n},poe=(t,e,n,r)=>{const{obj:i,k:s}=j0(t,e,Object);i[s]=i[s]||[],i[s].push(n)},rS=(t,e)=>{const{obj:n,k:r}=j0(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},goe=(t,e,n)=>{const r=rS(t,n);return r!==void 0?r:rS(e,n)},BW=(t,e,n)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in t?gn(t[r])||t[r]instanceof String||gn(e[r])||e[r]instanceof String?n&&(t[r]=e[r]):BW(t[r],e[r],n):t[r]=e[r]);return t},Tp=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var boe={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const xoe=t=>gn(t)?t.replace(/[&<>"'\/]/g,e=>boe[e]):t;class yoe{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const voe=[" ",",","?","!",";"],woe=new yoe(20),_oe=(t,e,n)=>{e=e||"",n=n||"";const r=voe.filter(o=>e.indexOf(o)<0&&n.indexOf(o)<0);if(r.length===0)return!0;const i=woe.getRegExp(`(${r.map(o=>o==="?"?"\\?":o).join("|")})`);let s=!i.test(t);if(!s){const o=t.indexOf(n);o>0&&!i.test(t.substring(0,o))&&(s=!0)}return s},NP=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const r=e.split(n);let i=t;for(let s=0;s-1&&ct?.replace("_","-"),Soe={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class iS{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||Soe,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,r,i){return i&&!this.debug?null:(gn(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new iS(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new iS(this.logger,e)}}var hc=new iS;let kM=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const i=this.observers[r].get(n)||0;this.observers[r].set(n,i+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,s])=>{for(let o=0;o{for(let o=0;o-1&&this.options.ns.splice(n,1)}getResource(e,n,r,i={}){const s=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,o=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let l;e.indexOf(".")>-1?l=e.split("."):(l=[e,n],r&&(Array.isArray(r)?l.push(...r):gn(r)&&s?l.push(...r.split(s)):l.push(r)));const c=rS(this.data,l);return!c&&!n&&!r&&e.indexOf(".")>-1&&(e=l[0],n=l[1],r=l.slice(2).join(".")),c||!o||!gn(r)?c:NP(this.data?.[e]?.[n],r,s)}addResource(e,n,r,i,s={silent:!1}){const o=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator;let l=[e,n];r&&(l=l.concat(o?r.split(o):r)),e.indexOf(".")>-1&&(l=e.split("."),i=n,n=l[1]),this.addNamespaces(n),Az(this.data,l,i),s.silent||this.emit("added",e,n,r,i)}addResources(e,n,r,i={silent:!1}){for(const s in r)(gn(r[s])||Array.isArray(r[s]))&&this.addResource(e,n,s,r[s],{silent:!0});i.silent||this.emit("added",e,n,r)}addResourceBundle(e,n,r,i,s,o={silent:!1,skipCopy:!1}){let l=[e,n];e.indexOf(".")>-1&&(l=e.split("."),i=r,r=n,n=l[1]),this.addNamespaces(n);let c=rS(this.data,l)||{};o.skipCopy||(r=JSON.parse(JSON.stringify(r))),i?BW(c,r,s):c={...c,...r},Az(this.data,l,c),o.silent||this.emit("added",e,n,r)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var HW={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,r,i){return t.forEach(s=>{e=this.processors[s]?.process(e,n,r,i)??e}),e}};const $W=Symbol("i18next/PATH_KEY");function Noe(){const t=[],e=Object.create(null);let n;return e.get=(r,i)=>(n?.revoke?.(),i===$W?t:(t.push(i),n=Proxy.revocable(r,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function MP(t,e){const{[$W]:n}=t(Noe());return n.join(e?.keySeparator??".")}const jz={},_T=t=>!gn(t)&&typeof t!="boolean"&&typeof t!="number";class aS extends kM{constructor(e,n={}){super(),foe(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=hc.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const r={...n};if(e==null)return!1;const i=this.resolve(e,r);if(i?.res===void 0)return!1;const s=_T(i.res);return!(r.returnObjects===!1&&s)}extractFromKey(e,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let s=n.ns||this.options.defaultNS||[];const o=r&&e.indexOf(r)>-1,l=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!_oe(e,r,i);if(o&&!l){const c=e.match(this.interpolator.nestingRegexp);if(c&&c.length>0)return{key:e,namespaces:gn(s)?[s]:s};const u=e.split(r);(r!==i||r===i&&this.options.ns.indexOf(u[0])>-1)&&(s=u.shift()),e=u.join(i)}return{key:e,namespaces:gn(s)?[s]:s}}translate(e,n,r){let i=typeof n=="object"?{...n}:n;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i={...i}),i||(i={}),e==null)return"";typeof e=="function"&&(e=MP(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]);const s=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,o=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:l,namespaces:c}=this.extractFromKey(e[e.length-1],i),u=c[c.length-1];let d=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const h=i.lng||this.language,m=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h?.toLowerCase()==="cimode")return m?s?{res:`${u}${d}${l}`,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:`${u}${d}${l}`:s?{res:l,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:l;const p=this.resolve(e,i);let b=p?.res;const v=p?.usedKey||l,x=p?.exactUsedKey||l,y=["[object Number]","[object Function]","[object RegExp]"],S=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,N=!this.i18nFormat||this.i18nFormat.handleAsObject,T=i.count!==void 0&&!gn(i.count),k=aS.hasDefaultValue(i),C=T?this.pluralResolver.getSuffix(h,i.count,i):"",E=i.ordinal&&T?this.pluralResolver.getSuffix(h,i.count,{ordinal:!1}):"",P=T&&!i.ordinal&&i.count===0,A=P&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${C}`]||i[`defaultValue${E}`]||i.defaultValue;let j=b;N&&!b&&k&&(j=A);const z=_T(j),L=Object.prototype.toString.apply(j);if(N&&j&&z&&y.indexOf(L)<0&&!(gn(S)&&Array.isArray(j))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const B=this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,j,{...i,ns:c}):`key '${l} (${this.language})' returned an object instead of string.`;return s?(p.res=B,p.usedParams=this.getUsedParamsDetails(i),p):B}if(o){const B=Array.isArray(j),R=B?[]:{},$=B?x:v;for(const q in j)if(Object.prototype.hasOwnProperty.call(j,q)){const I=`${$}${o}${q}`;k&&!b?R[q]=this.translate(I,{...i,defaultValue:_T(A)?A[q]:void 0,joinArrays:!1,ns:c}):R[q]=this.translate(I,{...i,joinArrays:!1,ns:c}),R[q]===I&&(R[q]=j[q])}b=R}}else if(N&&gn(S)&&Array.isArray(b))b=b.join(S),b&&(b=this.extendTranslation(b,e,i,r));else{let B=!1,R=!1;!this.isValidLookup(b)&&k&&(B=!0,b=A),this.isValidLookup(b)||(R=!0,b=l);const q=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&R?void 0:b,I=k&&A!==b&&this.options.updateMissing;if(R||B||I){if(this.logger.log(I?"updateKey":"missingKey",h,u,l,I?A:b),o){const H=this.resolve(l,{...i,keySeparator:!1});H&&H.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let G=[];const Y=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Y&&Y[0])for(let H=0;H{const ie=k&&ne!==b?ne:q;this.options.missingKeyHandler?this.options.missingKeyHandler(H,u,K,ie,I,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(H,u,K,ie,I,i),this.emit("missingKey",H,u,K,b)};this.options.saveMissing&&(this.options.saveMissingPlurals&&T?G.forEach(H=>{const K=this.pluralResolver.getSuffixes(H,i);P&&i[`defaultValue${this.options.pluralSeparator}zero`]&&K.indexOf(`${this.options.pluralSeparator}zero`)<0&&K.push(`${this.options.pluralSeparator}zero`),K.forEach(ne=>{re([H],l+ne,i[`defaultValue${ne}`]||A)})}):re(G,l,A))}b=this.extendTranslation(b,e,i,p,r),R&&b===l&&this.options.appendNamespaceToMissingKey&&(b=`${u}${d}${l}`),(R||B)&&this.options.parseMissingKeyHandler&&(b=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${l}`:l,B?b:void 0,i))}return s?(p.res=b,p.usedParams=this.getUsedParamsDetails(i),p):b}extendTranslation(e,n,r,i,s){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const c=gn(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let u;if(c){const h=e.match(this.interpolator.nestingRegexp);u=h&&h.length}let d=r.replace&&!gn(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,r.lng||this.language||i.usedLng,r),c){const h=e.match(this.interpolator.nestingRegexp),m=h&&h.length;us?.[0]===h[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${n[0]}`),null):this.translate(...h,n),r)),r.interpolation&&this.interpolator.reset()}const o=r.postProcess||this.options.postProcess,l=gn(o)?[o]:o;return e!=null&&l?.length&&r.applyPostProcessor!==!1&&(e=HW.handle(l,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,s,o,l;return gn(e)&&(e=[e]),e.forEach(c=>{if(this.isValidLookup(r))return;const u=this.extractFromKey(c,n),d=u.key;i=d;let h=u.namespaces;this.options.fallbackNS&&(h=h.concat(this.options.fallbackNS));const m=n.count!==void 0&&!gn(n.count),p=m&&!n.ordinal&&n.count===0,b=n.context!==void 0&&(gn(n.context)||typeof n.context=="number")&&n.context!=="",v=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);h.forEach(x=>{this.isValidLookup(r)||(l=x,!jz[`${v[0]}-${x}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(l)&&(jz[`${v[0]}-${x}`]=!0,this.logger.warn(`key "${i}" for languages "${v.join(", ")}" won't get resolved as namespace "${l}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),v.forEach(y=>{if(this.isValidLookup(r))return;o=y;const S=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(S,d,y,x,n);else{let T;m&&(T=this.pluralResolver.getSuffix(y,n.count,n));const k=`${this.options.pluralSeparator}zero`,C=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(m&&(n.ordinal&&T.indexOf(C)===0&&S.push(d+T.replace(C,this.options.pluralSeparator)),S.push(d+T),p&&S.push(d+k)),b){const E=`${d}${this.options.contextSeparator||"_"}${n.context}`;S.push(E),m&&(n.ordinal&&T.indexOf(C)===0&&S.push(E+T.replace(C,this.options.pluralSeparator)),S.push(E+T),p&&S.push(E+k))}}let N;for(;N=S.pop();)this.isValidLookup(r)||(s=N,r=this.getResource(y,x,N,n))}))})}),{res:r,usedKey:i,exactUsedKey:s,usedLng:o,usedNS:l}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,r,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,r,i):this.resourceStore.getResource(e,n,r,i)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!gn(e.replace);let i=r?e.replace:e;if(r&&typeof e.count<"u"&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(const s of n)delete i[s]}return i}static hasDefaultValue(e){const n="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n===r.substring(0,n.length)&&e[r]!==void 0)return!0;return!1}}class Pz{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=hc.create("languageUtils")}getScriptPartFromCode(e){if(e=ty(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=ty(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(gn(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&e.forEach(r=>{if(n)return;const i=this.getScriptPartFromCode(r);if(this.isSupportedCode(i))return n=i;const s=this.getLanguagePartFromCode(r);if(this.isSupportedCode(s))return n=s;n=this.options.supportedLngs.find(o=>{if(o===s)return o;if(!(o.indexOf("-")<0&&s.indexOf("-")<0)&&(o.indexOf("-")>0&&s.indexOf("-")<0&&o.substring(0,o.indexOf("-"))===s||o.indexOf(s)===0&&s.length>1))return o})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),gn(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||(r=e[this.getScriptPartFromCode(n)]),r||(r=e[this.formatLanguageCode(n)]),r||(r=e[this.getLanguagePartFromCode(n)]),r||(r=e.default),r||[]}toResolveHierarchy(e,n){const r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],s=o=>{o&&(this.isSupportedCode(o)?i.push(o):this.logger.warn(`rejecting language code not found in supportedLngs: ${o}`))};return gn(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(e))):gn(e)&&s(this.formatLanguageCode(e)),r.forEach(o=>{i.indexOf(o)<0&&s(this.formatLanguageCode(o))}),i}}const Dz={zero:0,one:1,two:2,few:3,many:4,other:5},Rz={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Moe{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=hc.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const r=ty(e==="dev"?"en":e),i=n.ordinal?"ordinal":"cardinal",s=JSON.stringify({cleanedCode:r,type:i});if(s in this.pluralRulesCache)return this.pluralRulesCache[s];let o;try{o=new Intl.PluralRules(r,{type:i})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),Rz;if(!e.match(/-|_/))return Rz;const c=this.languageUtils.getLanguagePartFromCode(e);o=this.getRule(c,n)}return this.pluralRulesCache[s]=o,o}needsPlural(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,r={}){return this.getSuffixes(e,r).map(i=>`${n}${i}`)}getSuffixes(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?r.resolvedOptions().pluralCategories.sort((i,s)=>Dz[i]-Dz[s]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(e,n,r={}){const i=this.getRule(e,r);return i?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,r))}}const Oz=(t,e,n,r=".",i=!0)=>{let s=goe(t,e,n);return!s&&i&&gn(n)&&(s=NP(t,n,r),s===void 0&&(s=NP(e,n,r))),s},ST=t=>t.replace(/\$/g,"$$$$");class Lz{constructor(e={}){this.logger=hc.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:r,useRawValueToEscape:i,prefix:s,prefixEscaped:o,suffix:l,suffixEscaped:c,formatSeparator:u,unescapeSuffix:d,unescapePrefix:h,nestingPrefix:m,nestingPrefixEscaped:p,nestingSuffix:b,nestingSuffixEscaped:v,nestingOptionsSeparator:x,maxReplaces:y,alwaysFormat:S}=e.interpolation;this.escape=n!==void 0?n:xoe,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=s?Tp(s):o||"{{",this.suffix=l?Tp(l):c||"}}",this.formatSeparator=u||",",this.unescapePrefix=d?"":h||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=m?Tp(m):p||Tp("$t("),this.nestingSuffix=b?Tp(b):v||Tp(")"),this.nestingOptionsSeparator=x||",",this.maxReplaces=y||1e3,this.alwaysFormat=S!==void 0?S:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,r)=>n?.source===r?(n.lastIndex=0,n):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,r,i){let s,o,l;const c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=p=>{if(p.indexOf(this.formatSeparator)<0){const y=Oz(n,c,p,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(y,void 0,r,{...i,...n,interpolationkey:p}):y}const b=p.split(this.formatSeparator),v=b.shift().trim(),x=b.join(this.formatSeparator).trim();return this.format(Oz(n,c,v,this.options.keySeparator,this.options.ignoreJSONStructure),x,r,{...i,...n,interpolationkey:v})};this.resetRegExp();const d=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:p=>ST(p)},{regex:this.regexp,safeValue:p=>this.escapeValue?ST(this.escape(p)):ST(p)}].forEach(p=>{for(l=0;s=p.regex.exec(e);){const b=s[1].trim();if(o=u(b),o===void 0)if(typeof d=="function"){const x=d(e,s,i);o=gn(x)?x:""}else if(i&&Object.prototype.hasOwnProperty.call(i,b))o="";else if(h){o=s[0];continue}else this.logger.warn(`missed to pass in variable ${b} for interpolating ${e}`),o="";else!gn(o)&&!this.useRawValueToEscape&&(o=kz(o));const v=p.safeValue(o);if(e=e.replace(s[0],v),h?(p.regex.lastIndex+=o.length,p.regex.lastIndex-=s[0].length):p.regex.lastIndex=0,l++,l>=this.maxReplaces)break}}),e}nest(e,n,r={}){let i,s,o;const l=(c,u)=>{const d=this.nestingOptionsSeparator;if(c.indexOf(d)<0)return c;const h=c.split(new RegExp(`${d}[ ]*{`));let m=`{${h[1]}`;c=h[0],m=this.interpolate(m,o);const p=m.match(/'/g),b=m.match(/"/g);((p?.length??0)%2===0&&!b||b.length%2!==0)&&(m=m.replace(/'/g,'"'));try{o=JSON.parse(m),u&&(o={...u,...o})}catch(v){return this.logger.warn(`failed parsing options string in nesting for key ${c}`,v),`${c}${d}${m}`}return o.defaultValue&&o.defaultValue.indexOf(this.prefix)>-1&&delete o.defaultValue,c};for(;i=this.nestingRegexp.exec(e);){let c=[];o={...r},o=o.replace&&!gn(o.replace)?o.replace:o,o.applyPostProcessor=!1,delete o.defaultValue;const u=/{.*}/.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(u!==-1&&(c=i[1].slice(u).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),i[1]=i[1].slice(0,u)),s=n(l.call(this,i[1].trim(),o),o),s&&i[0]===e&&!gn(s))return s;gn(s)||(s=kz(s)),s||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),s=""),c.length&&(s=c.reduce((d,h)=>this.format(d,h,r.lng,{...r,interpolationkey:i[1].trim()}),s.trim())),e=e.replace(i[0],s),this.regexp.lastIndex=0}return e}}const koe=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const r=t.split("(");e=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);e==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):e==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(o=>{if(o){const[l,...c]=o.split(":"),u=c.join(":").trim().replace(/^'+|'+$/g,""),d=l.trim();n[d]||(n[d]=u),u==="false"&&(n[d]=!1),u==="true"&&(n[d]=!0),isNaN(u)||(n[d]=parseInt(u,10))}})}return{formatName:e,formatOptions:n}},Fz=t=>{const e={};return(n,r,i)=>{let s=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(s={...s,[i.interpolationkey]:void 0});const o=r+JSON.stringify(s);let l=e[o];return l||(l=t(ty(r),i),e[o]=l),l(n)}},Eoe=t=>(e,n,r)=>t(ty(n),r)(e);class Toe{constructor(e={}){this.logger=hc.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const r=n.cacheInBuiltFormats?Fz:Eoe;this.formats={number:r((i,s)=>{const o=new Intl.NumberFormat(i,{...s});return l=>o.format(l)}),currency:r((i,s)=>{const o=new Intl.NumberFormat(i,{...s,style:"currency"});return l=>o.format(l)}),datetime:r((i,s)=>{const o=new Intl.DateTimeFormat(i,{...s});return l=>o.format(l)}),relativetime:r((i,s)=>{const o=new Intl.RelativeTimeFormat(i,{...s});return l=>o.format(l,s.range||"day")}),list:r((i,s)=>{const o=new Intl.ListFormat(i,{...s});return l=>o.format(l)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=Fz(n)}format(e,n,r,i={}){const s=n.split(this.formatSeparator);if(s.length>1&&s[0].indexOf("(")>1&&s[0].indexOf(")")<0&&s.find(l=>l.indexOf(")")>-1)){const l=s.findIndex(c=>c.indexOf(")")>-1);s[0]=[s[0],...s.splice(1,l)].join(this.formatSeparator)}return s.reduce((l,c)=>{const{formatName:u,formatOptions:d}=koe(c);if(this.formats[u]){let h=l;try{const m=i?.formatParams?.[i.interpolationkey]||{},p=m.locale||m.lng||i.locale||i.lng||r;h=this.formats[u](l,p,{...d,...i,...m})}catch(m){this.logger.warn(m)}return h}else this.logger.warn(`there was no format function for ${u}`);return l},e)}}const Aoe=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class Coe extends kM{constructor(e,n,r,i={}){super(),this.backend=e,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=hc.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,i.backend,i)}queueLoad(e,n,r,i){const s={},o={},l={},c={};return e.forEach(u=>{let d=!0;n.forEach(h=>{const m=`${u}|${h}`;!r.reload&&this.store.hasResourceBundle(u,h)?this.state[m]=2:this.state[m]<0||(this.state[m]===1?o[m]===void 0&&(o[m]=!0):(this.state[m]=1,d=!1,o[m]===void 0&&(o[m]=!0),s[m]===void 0&&(s[m]=!0),c[h]===void 0&&(c[h]=!0)))}),d||(l[u]=!0)}),(Object.keys(s).length||Object.keys(o).length)&&this.queue.push({pending:o,pendingCount:Object.keys(o).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(s),pending:Object.keys(o),toLoadLanguages:Object.keys(l),toLoadNamespaces:Object.keys(c)}}loaded(e,n,r){const i=e.split("|"),s=i[0],o=i[1];n&&this.emit("failedLoading",s,o,n),!n&&r&&this.store.addResourceBundle(s,o,r,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&r&&(this.state[e]=0);const l={};this.queue.forEach(c=>{poe(c.loaded,[s],o),Aoe(c,e),n&&c.errors.push(n),c.pendingCount===0&&!c.done&&(Object.keys(c.loaded).forEach(u=>{l[u]||(l[u]={});const d=c.loaded[u];d.length&&d.forEach(h=>{l[u][h]===void 0&&(l[u][h]=!0)})}),c.done=!0,c.errors.length?c.callback(c.errors):c.callback())}),this.emit("loaded",l),this.queue=this.queue.filter(c=>!c.done)}read(e,n,r,i=0,s=this.retryTimeout,o){if(!e.length)return o(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:r,tried:i,wait:s,callback:o});return}this.readingCalls++;const l=(u,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const h=this.waitingReads.shift();this.read(h.lng,h.ns,h.fcName,h.tried,h.wait,h.callback)}if(u&&d&&i{this.read.call(this,e,n,r,i+1,s*2,o)},s);return}o(u,d)},c=this.backend[r].bind(this.backend);if(c.length===2){try{const u=c(e,n);u&&typeof u.then=="function"?u.then(d=>l(null,d)).catch(l):l(null,u)}catch(u){l(u)}return}return c(e,n,l)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();gn(e)&&(e=this.languageUtils.toResolveHierarchy(e)),gn(n)&&(n=[n]);const s=this.queueLoad(e,n,r,i);if(!s.toLoad.length)return s.pending.length||i(),null;s.toLoad.forEach(o=>{this.loadOne(o)})}load(e,n,r){this.prepareLoading(e,n,{},r)}reload(e,n,r){this.prepareLoading(e,n,{reload:!0},r)}loadOne(e,n=""){const r=e.split("|"),i=r[0],s=r[1];this.read(i,s,"read",void 0,void 0,(o,l)=>{o&&this.logger.warn(`${n}loading namespace ${s} for language ${i} failed`,o),!o&&l&&this.logger.log(`${n}loaded namespace ${s} for language ${i}`,l),this.loaded(e,o,l)})}saveMissing(e,n,r,i,s,o={},l=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const c={...o,isUpdate:s},u=this.backend.create.bind(this.backend);if(u.length<6)try{let d;u.length===5?d=u(e,n,r,i,c):d=u(e,n,r,i),d&&typeof d.then=="function"?d.then(h=>l(null,h)).catch(l):l(null,d)}catch(d){l(d)}else u(e,n,r,i,l,c)}!e||!e[0]||this.store.addResource(e[0],n,r,i)}}}const NT=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),gn(t[1])&&(e.defaultValue=t[1]),gn(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(r=>{e[r]=n[r]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),Iz=t=>(gn(t.ns)&&(t.ns=[t.ns]),gn(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),gn(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),$w=()=>{},joe=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})},Poe=t=>!!(t?.modules?.backend?.name?.indexOf("Locize")>0||t?.modules?.backend?.constructor?.name?.indexOf("Locize")>0||t?.options?.backend?.backends&&t.options.backend.backends.some(e=>e?.name?.indexOf("Locize")>0||e?.constructor?.name?.indexOf("Locize")>0));class P0 extends kM{constructor(e={},n){if(super(),this.options=Iz(e),this.services={},this.logger=hc,this.modules={external:[]},joe(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(gn(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=NT();this.options={...r,...this.options,...Iz(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=r.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!Poe(this)&&typeof console<"u"&&typeof console.info<"u"&&console.info("🌐 i18next is maintained with support from locize.com — consider powering your project with managed localization (AI, CDN, integrations): https://locize.com 💙");const i=u=>u?typeof u=="function"?new u:u:null;if(!this.options.isClone){this.modules.logger?hc.init(i(this.modules.logger),this.options):hc.init(null,this.options);let u;this.modules.formatter?u=this.modules.formatter:u=Toe;const d=new Pz(this.options);this.store=new Cz(this.options.resources,this.options);const h=this.services;h.logger=hc,h.resourceStore=this.store,h.languageUtils=d,h.pluralResolver=new Moe(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),u&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(h.formatter=i(u),h.formatter.init&&h.formatter.init(h,this.options),this.options.interpolation.format=h.formatter.format.bind(h.formatter)),h.interpolator=new Lz(this.options),h.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},h.backendConnector=new Coe(i(this.modules.backend),h.resourceStore,h,this.options),h.backendConnector.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.languageDetector&&(h.languageDetector=i(this.modules.languageDetector),h.languageDetector.init&&h.languageDetector.init(h,this.options.detection,this.options)),this.modules.i18nFormat&&(h.i18nFormat=i(this.modules.i18nFormat),h.i18nFormat.init&&h.i18nFormat.init(this)),this.translator=new aS(this.services,this.options),this.translator.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.external.forEach(p=>{p.init&&p.init(this)})}if(this.format=this.options.interpolation.format,n||(n=$w),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.length>0&&u[0]!=="dev"&&(this.options.lng=u[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(u=>{this[u]=(...d)=>this.store[u](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(u=>{this[u]=(...d)=>(this.store[u](...d),this)});const l=zx(),c=()=>{const u=(d,h)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(h),n(d,h)};if(this.languages&&!this.isInitialized)return u(null,this.t.bind(this));this.changeLanguage(this.options.lng,u)};return this.options.resources||!this.options.initAsync?c():setTimeout(c,0),l}loadResources(e,n=$w){let r=n;const i=gn(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const s=[],o=l=>{if(!l||l==="cimode")return;this.services.languageUtils.toResolveHierarchy(l).forEach(u=>{u!=="cimode"&&s.indexOf(u)<0&&s.push(u)})};i?o(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(c=>o(c)),this.options.preload?.forEach?.(l=>o(l)),this.services.backendConnector.load(s,this.options.ns,l=>{!l&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(l)})}else r(null)}reloadResources(e,n,r){const i=zx();return typeof e=="function"&&(r=e,e=void 0),typeof n=="function"&&(r=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),r||(r=$w),this.services.backendConnector.reload(e,n,s=>{i.resolve(),r(s)}),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&HW.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const r=zx();this.emit("languageChanging",e);const i=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},s=(l,c)=>{c?this.isLanguageChangingTo===e&&(i(c),this.translator.changeLanguage(c),this.isLanguageChangingTo=void 0,this.emit("languageChanged",c),this.logger.log("languageChanged",c)):this.isLanguageChangingTo=void 0,r.resolve((...u)=>this.t(...u)),n&&n(l,(...u)=>this.t(...u))},o=l=>{!e&&!l&&this.services.languageDetector&&(l=[]);const c=gn(l)?l:l&&l[0],u=this.store.hasLanguageSomeTranslations(c)?c:this.services.languageUtils.getBestMatchFromCodes(gn(l)?[l]:l);u&&(this.language||i(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector?.cacheUserLanguage?.(u)),this.loadResources(u,d=>{s(d,u)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?o(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(o):this.services.languageDetector.detect(o):o(e),r}getFixedT(e,n,r){const i=(s,o,...l)=>{let c;typeof o!="object"?c=this.options.overloadTranslationOptionHandler([s,o].concat(l)):c={...o},c.lng=c.lng||i.lng,c.lngs=c.lngs||i.lngs,c.ns=c.ns||i.ns,c.keyPrefix!==""&&(c.keyPrefix=c.keyPrefix||r||i.keyPrefix);const u=this.options.keySeparator||".";let d;return c.keyPrefix&&Array.isArray(s)?d=s.map(h=>(typeof h=="function"&&(h=MP(h,{...this.options,...o})),`${c.keyPrefix}${u}${h}`)):(typeof s=="function"&&(s=MP(s,{...this.options,...o})),d=c.keyPrefix?`${c.keyPrefix}${u}${s}`:s),this.t(d,c)};return gn(e)?i.lng=e:i.lngs=e,i.ns=n,i.keyPrefix=r,i}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,s=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const o=(l,c)=>{const u=this.services.backendConnector.state[`${l}|${c}`];return u===-1||u===0||u===2};if(n.precheck){const l=n.precheck(this,o);if(l!==void 0)return l}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||o(r,e)&&(!i||o(s,e)))}loadNamespaces(e,n){const r=zx();return this.options.ns?(gn(e)&&(e=[e]),e.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(e,n){const r=zx();gn(e)&&(e=[e]);const i=this.options.preload||[],s=e.filter(o=>i.indexOf(o)<0&&this.services.languageUtils.isSupportedCode(o));return s.length?(this.options.preload=i.concat(s),this.loadResources(o=>{r.resolve(),n&&n(o)}),r):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const i=new Intl.Locale(e);if(i&&i.getTextInfo){const s=i.getTextInfo();if(s&&s.direction)return s.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new Pz(NT());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const r=new P0(e,n);return r.createInstance=P0.createInstance,r}cloneInstance(e={},n=$w){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},s=new P0(i);if((e.debug!==void 0||e.prefix!==void 0)&&(s.logger=s.logger.clone(e)),["store","services","language"].forEach(l=>{s[l]=this[l]}),s.services={...this.services},s.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},r){const l=Object.keys(this.store.data).reduce((c,u)=>(c[u]={...this.store.data[u]},c[u]=Object.keys(c[u]).reduce((d,h)=>(d[h]={...c[u][h]},d),c[u]),c),{});s.store=new Cz(l,i),s.services.resourceStore=s.store}if(e.interpolation){const c={...NT().interpolation,...this.options.interpolation,...e.interpolation},u={...i,interpolation:c};s.services.interpolator=new Lz(u)}return s.translator=new aS(s.services,i),s.translator.on("*",(l,...c)=>{s.emit(l,...c)}),s.init(i,n),s.translator.options=i,s.translator.backendConnector.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},s}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Es=P0.createInstance();Es.createInstance;Es.dir;Es.init;Es.loadResources;Es.reloadResources;Es.use;Es.changeLanguage;Es.getFixedT;Es.t;Es.exists;Es.setDefaultNamespace;Es.hasLoadedNamespace;Es.loadNamespaces;Es.loadLanguages;const Doe=(t,e,n,r)=>{const i=[n,{code:e,...r||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(i,"warn","react-i18next::",!0);bm(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...i):console?.warn&&console.warn(...i)},Uz={},VW=(t,e,n,r)=>{bm(n)&&Uz[n]||(bm(n)&&(Uz[n]=new Date),Doe(t,e,n,r))},GW=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},kP=(t,e,n)=>{t.loadNamespaces(e,GW(t,n))},zz=(t,e,n,r)=>{if(bm(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return kP(t,n,r);n.forEach(i=>{t.options.ns.indexOf(i)<0&&t.options.ns.push(i)}),t.loadLanguages(e,GW(t,r))},Roe=(t,e,n={})=>!e.languages||!e.languages.length?(VW(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(r,i)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!i(r.isLanguageChangingTo,t))return!1}}),bm=t=>typeof t=="string",Ooe=t=>typeof t=="object"&&t!==null,Loe=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,Foe={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},Ioe=t=>Foe[t],Uoe=t=>t.replace(Loe,Ioe);let EP={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Uoe,transDefaultProps:void 0};const zoe=(t={})=>{EP={...EP,...t}},Boe=()=>EP;let qW;const Hoe=t=>{qW=t},$oe=()=>qW,Voe={type:"3rdParty",init(t){zoe(t.options.react),Hoe(t)}},Goe=_.createContext();class qoe{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var MT={exports:{}},kT={};var Bz;function Woe(){if(Bz)return kT;Bz=1;var t=Tb();function e(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:e,r=t.useState,i=t.useEffect,s=t.useLayoutEffect,o=t.useDebugValue;function l(h,m){var p=m(),b=r({inst:{value:p,getSnapshot:m}}),v=b[0].inst,x=b[1];return s(function(){v.value=p,v.getSnapshot=m,c(v)&&x({inst:v})},[h,p,m]),i(function(){return c(v)&&x({inst:v}),h(function(){c(v)&&x({inst:v})})},[h]),o(p),p}function c(h){var m=h.getSnapshot;h=h.value;try{var p=m();return!n(h,p)}catch{return!0}}function u(h,m){return m()}var d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?u:l;return kT.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:d,kT}var Hz;function WW(){return Hz||(Hz=1,MT.exports=Woe()),MT.exports}var HR=WW();const Koe=(t,e)=>bm(e)?e:Ooe(e)&&bm(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,Xoe={t:Koe,ready:!1},Yoe=()=>()=>{},Sn=(t,e={})=>{const{i18n:n}=e,{i18n:r,defaultNS:i}=_.useContext(Goe)||{},s=n||r||$oe();s&&!s.reportNamespaces&&(s.reportNamespaces=new qoe),s||VW(s,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const o=_.useMemo(()=>({...Boe(),...s?.options?.react,...e}),[s,e]),{useSuspense:l,keyPrefix:c}=o,u=i||s?.options?.defaultNS,d=bm(u)?[u]:u||["translation"],h=_.useMemo(()=>d,d);s?.reportNamespaces?.addUsedNamespaces?.(h);const m=_.useRef(0),p=_.useCallback(A=>{if(!s)return Yoe;const{bindI18n:j,bindI18nStore:z}=o,L=()=>{m.current+=1,A()};return j&&s.on(j,L),z&&s.store.on(z,L),()=>{j&&j.split(" ").forEach(B=>s.off(B,L)),z&&z.split(" ").forEach(B=>s.store.off(B,L))}},[s,o]),b=_.useRef(),v=_.useCallback(()=>{if(!s)return Xoe;const A=!!(s.isInitialized||s.initializedStoreOnce)&&h.every($=>Roe($,s,o)),j=e.lng||s.language,z=m.current,L=b.current;if(L&&L.ready===A&&L.lng===j&&L.keyPrefix===c&&L.revision===z)return L;const R={t:s.getFixedT(j,o.nsMode==="fallback"?h:h[0],c),ready:A,lng:j,keyPrefix:c,revision:z};return b.current=R,R},[s,h,c,o,e.lng]),[x,y]=_.useState(0),{t:S,ready:N}=HR.useSyncExternalStore(p,v,v);_.useEffect(()=>{if(s&&!N&&!l){const A=()=>y(j=>j+1);e.lng?zz(s,e.lng,h,A):kP(s,h,A)}},[s,e.lng,h,N,l,x]);const T=s||{},k=_.useRef(null),C=_.useRef(),E=A=>{const j=Object.getOwnPropertyDescriptors(A);j.__original&&delete j.__original;const z=Object.create(Object.getPrototypeOf(A),j);if(!Object.prototype.hasOwnProperty.call(z,"__original"))try{Object.defineProperty(z,"__original",{value:A,writable:!1,enumerable:!1,configurable:!1})}catch{}return z},P=_.useMemo(()=>{const A=T,j=A?.language;let z=A;A&&(k.current&&k.current.__original===A?C.current!==j?(z=E(A),k.current=z,C.current=j):z=k.current:(z=E(A),k.current=z,C.current=j));const L=[S,z,N];return L.t=S,L.i18n=z,L.ready=N,L},[S,T,N,T.resolvedLanguage,T.language,T.languages]);if(s&&l&&!N)throw new Promise(A=>{const j=()=>A();e.lng?zz(s,e.lng,h,j):kP(s,h,j)});return P},{slice:Qoe,forEach:Zoe}=[];function Joe(t){return Zoe.call(Qoe.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function ele(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const $z=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,tle=function(t,e){const r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},i=encodeURIComponent(e);let s=`${t}=${i}`;if(r.maxAge>0){const o=r.maxAge-0;if(Number.isNaN(o))throw new Error("maxAge should be a Number");s+=`; Max-Age=${Math.floor(o)}`}if(r.domain){if(!$z.test(r.domain))throw new TypeError("option domain is invalid");s+=`; Domain=${r.domain}`}if(r.path){if(!$z.test(r.path))throw new TypeError("option path is invalid");s+=`; Path=${r.path}`}if(r.expires){if(typeof r.expires.toUTCString!="function")throw new TypeError("option expires is invalid");s+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(s+="; HttpOnly"),r.secure&&(s+="; Secure"),r.sameSite)switch(typeof r.sameSite=="string"?r.sameSite.toLowerCase():r.sameSite){case!0:s+="; SameSite=Strict";break;case"lax":s+="; SameSite=Lax";break;case"strict":s+="; SameSite=Strict";break;case"none":s+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return r.partitioned&&(s+="; Partitioned"),s},Vz={create(t,e,n,r){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+n*60*1e3)),r&&(i.domain=r),document.cookie=tle(t,e,i)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let r=0;r-1&&(r=window.location.hash.substring(window.location.hash.indexOf("?")));const s=r.substring(1).split("&");for(let o=0;o0&&s[o].substring(0,l)===e&&(n=s[o].substring(l+1))}}return n}},ile={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,r;if(typeof window<"u"){const{hash:i}=window.location;if(i&&i.length>2){const s=i.substring(1);if(e){const o=s.split("&");for(let l=0;l0&&o[l].substring(0,c)===e&&(r=o[l].substring(c+1))}}if(r)return r;if(!r&&n>-1){const o=i.match(/\/([a-zA-Z-]*)/g);return Array.isArray(o)?o[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return r}};let Ap=null;const Gz=()=>{if(Ap!==null)return Ap;try{if(Ap=typeof window<"u"&&window.localStorage!==null,!Ap)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{Ap=!1}return Ap};var ale={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&Gz())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&Gz()&&window.localStorage.setItem(n,t)}};let Cp=null;const qz=()=>{if(Cp!==null)return Cp;try{if(Cp=typeof window<"u"&&window.sessionStorage!==null,!Cp)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{Cp=!1}return Cp};var sle={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&qz())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&qz()&&window.sessionStorage.setItem(n,t)}},ole={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:r,language:i}=navigator;if(n)for(let s=0;s0?e:void 0}},lle={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const r=e||(typeof document<"u"?document.documentElement:null);return r&&typeof r.getAttribute=="function"&&(n=r.getAttribute("lang")),n}},cle={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},ule={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,r=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r[n]}};let KW=!1;try{document.cookie,KW=!0}catch{}const XW=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];KW||XW.splice(1,1);const dle=()=>({order:XW,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class YW{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=Joe(n,this.options||{},dle()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=i=>i.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(nle),this.addDetector(rle),this.addDetector(ale),this.addDetector(sle),this.addDetector(ole),this.addDetector(lle),this.addDetector(cle),this.addDetector(ule),this.addDetector(ile)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(r=>{if(this.detectors[r]){let i=this.detectors[r].lookup(this.options);i&&typeof i=="string"&&(i=[i]),i&&(n=n.concat(i))}}),n=n.filter(r=>r!=null&&!ele(r)).map(r=>this.options.convertDetectedLanguage(r)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(r=>{this.detectors[r]&&this.detectors[r].cacheUserLanguage(e,this.options)}))}}YW.type="languageDetector";const hle={nav:{printers:"Printers",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",projects:"Projects",files:"File Manager",settings:"Settings",system:"System",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",updateAvailableBanner:"Version {{version}} is available!",viewUpdate:"View update",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode",smartSwitches:"Smart Switches",logout:"Logout"},common:{save:"Save",saving:"Saving...",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",days:"days",enable:"Enable",disable:"Disable",permissions:"Permissions",noPrinters:"No printers configured",noData:"No data available",linkNotFound:"Link not found",required:"Required",optional:"Optional",dismiss:"Dismiss",apply:"Apply",reset:"Reset",clear:"Clear",selectAll:"Select All",deselectAll:"Deselect All",noChange:"— No change —",unchanged:"Unchanged",unassigned:"Unassigned",unknown:"Unknown",unknownError:"Unknown error",today:"Today",asap:"ASAP",overdue:"Overdue",now:"Now",collapse:"Collapse",expand:"Expand",viewArchive:"View archive",viewInFileManager:"View in File Manager",addedBy:"Added by {{username}}",prints:"prints",more:"+{{count}} more",ascending:"Ascending",descending:"Descending",printer:"Printer",remove:"Remove",type:"Type",print:"Print",rename:"Rename",move:"Move",create:"Create",duplicate:"Duplicate",left:"Left",right:"Right"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due",sort:{name:"Name",status:"Status",model:"Model",location:"Location",ascending:"Sort ascending",descending:"Sort descending"},cardSize:{small:"Small cards",medium:"Medium cards",large:"Large cards",extraLarge:"Extra large cards"},hideOffline:"Hide offline",powerOn:"Power On",offlinePrintersWithPlugs:"Offline printers with smart plugs",noPrintersConfigured:"No printers configured yet",readyToPrint:"Ready to print",external:"External",deleteArchives:"Delete print archives",noLabel:"No label",printPreview:"Print preview",width:"Width",height:"Height",noObjectsFound:"No objects found",objectsLoadedOnPrintStart:"Objects are loaded when a print starts",willBeSkipped:"Will be skipped",name:"Name",serialCannotBeChanged:"Serial number cannot be changed",locationHelp:"Used to group printers and filter queue jobs",wifiSignal:{veryWeak:"Very weak",weak:"Weak",fair:"Fair",good:"Good",excellent:"Excellent"},maintenanceUpToDate:"All maintenance up to date - Click to view",chamberLightOn:"Turn on chamber light",chamberLightOff:"Turn off chamber light",browseFiles:"Browse printer files",autoOffAfterPrint:"Auto power-off after print",autoOffExecuted:"Auto-off was executed - turn printer on to reset",hmsErrors:"HMS Errors",viewHmsErrors:"View {{count}} HMS error(s)",resume:"Resume",pause:"Pause",stop:"Stop",camera:"Camera",skipObject:"Skip Object",reconnect:"Reconnect",mqttDebug:"MQTT Debug",activeNozzle:"Active: {{nozzle}} nozzle",firmwareUpdate:"Firmware Update",firmwareInstructions:"On the printer's touchscreen, go to",firmwareNav:"Navigate to",settings:"Settings",firmware:"Firmware",discoverPrinters:"Discover Printers",searching:"Searching...",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",toast:{printerDeleted:"Printer deleted",printerAdded:"Printer added",printerUpdated:"Printer updated",failedToDelete:"Failed to delete printer",failedToAdd:"Failed to add printer",failedToUpdate:"Failed to update printer",commandSent:"Command sent",failedToSendCommand:"Failed to send command",turnedOn:"{{name}} turned on",failedToPowerOn:"Failed to power on {{name}}",scriptTriggered:"Script triggered",printStopped:"Print stopped",printPaused:"Print paused",printResumed:"Print resumed",referenceDeleted:"Reference deleted",detectionAreaSaved:"Detection area saved",failedToRunScript:"Failed to run script",failedToStopPrint:"Failed to stop print",failedToPausePrint:"Failed to pause print",failedToResumePrint:"Failed to resume print",failedToControlChamberLight:"Failed to control chamber light",failedToUpdateSetting:"Failed to update setting",failedToSkipObjects:"Failed to skip objects",failedToRereadRfid:"Failed to re-read RFID",failedToCheckPlate:"Failed to check plate",failedToUpdateLabel:"Failed to update label",failedToDeleteReference:"Failed to delete reference",failedToSaveDetectionArea:"Failed to save detection area",plateCheckEnabled:"Plate check enabled",plateCheckDisabled:"Plate check disabled",calibrationSaved:"Calibration saved!",calibrationFailed:"Calibration failed",rfidRereadInitiated:"RFID re-read initiated"},connection:{connected:"Connected",offline:"Offline"},queue:{inQueue:"{{count}} print in queue",inQueue_plural:"{{count}} prints in queue"},controls:"Controls",rfid:{reread:"Re-read RFID"},permission:{noAdd:"You do not have permission to add printers",noEdit:"You do not have permission to edit printers",noDelete:"You do not have permission to delete printers",noControl:"You do not have permission to control printers",noFiles:"You do not have permission to access printer files",noAmsRfid:"You do not have permission to re-read AMS RFID",noSmartPlugControl:"You do not have permission to control smart plugs"},modal:{addTitle:"Add Printer",editTitle:"Edit Printer",myPrinter:"My Printer",selectModel:"Select model...",locationGroup:"Location / Group (optional)",locationPlaceholder:"e.g., Workshop, Office, Basement",autoArchiveLabel:"Auto-archive completed prints",fromPrinterSettings:"From printer settings",modelOptional:"Model (optional)",saveChanges:"Save Changes"},skipObjects:{tooltip:"Skip objects",onlyWhilePrinting:"Skip objects (only while printing)",requiresMultiple:"Skip objects (requires 2+ objects)",title:"Skip Objects",matchIdsInfo:"Match IDs with your printer display",printerShowsIds:"The printer screen shows object IDs on the build plate",skipSelected:"Skip Selected",skipping:"Skipping...",noObjectsSelected:"No objects selected",selectObjectsToSkip:"Select objects you want to skip from the current print",skipped:"skipped",objectsSkipped:"Objects skipped",activeCount:"{{count}} active",waitForLayer:"Wait for layer 2+ to skip objects (currently layer {{layer}})",skip:"Skip"},confirm:{deleteTitle:"Delete Printer",deleteMessage:'Are you sure you want to delete "{{name}}"? This will remove all connection settings.',deleteArchivesNote:"All print history for this printer will be permanently deleted.",keepArchivesNote:"Print history will be kept but no longer associated with this printer.",stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print on "{{name}}"? This will cancel the print job.',stopButton:"Stop Print",pauseTitle:"Pause Print",pauseMessage:'Are you sure you want to pause the current print on "{{name}}"?',pauseButton:"Pause Print",resumeTitle:"Resume Print",resumeMessage:'Are you sure you want to resume the print on "{{name}}"?',resumeButton:"Resume Print",powerOnTitle:"Power On Printer",powerOnMessage:'Are you sure you want to turn ON the power for "{{name}}"?',powerOnButton:"Power On",powerOffTitle:"Power Off Printer",powerOffMessage:'Are you sure you want to turn OFF the power for "{{name}}"?',powerOffWarning:'WARNING: "{{name}}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.',powerOffButton:"Power Off"},discovery:{title:"Discover Printers",searching:"Searching...",scanning:"Scanning...",scanProgress:"Scanning... {{scanned}}/{{total}}",foundPrinters:"Found {{count}} printer(s)",noPrintersFound:"No printers found",noPrintersFoundSubnet:"No printers found in the specified subnet.",noPrintersFoundNetwork:"No printers found on the network.",allConfigured:"All discovered printers are already configured.",alreadyAdded:"Already added",select:"Select",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",subnetToScan:"Subnet to scan",dockerNote:"Docker detected. Enter your printer's subnet in CIDR notation. Requires network_mode: host in docker-compose.yml.",scanSubnet:"Scan Subnet for Printers",discoverNetwork:"Discover Printers on Network",scanningSubnet:"Scanning subnet for Bambu printers...",scanningNetwork:"Scanning network...",serialRequired:"Serial required",unknown:"Unknown",failedToStart:"Failed to start discovery"},filaments:"Filaments",openCameraOverlay:"Open camera overlay",openCameraWindow:"Open camera in new window",firmwareUpdateAvailable:"Firmware update available: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"You do not have permission to update printers",enabledClick:"Plate check enabled - Click to disable",disabledClick:"Plate check disabled - Click to enable",manageCalibration:"Manage plate detection calibration",calibrationRequired:"Calibration Required",calibrationInstructions:"Please ensure the build plate is completely empty, then click Calibrate.",calibrationDescription:"Calibration captures a reference image of the empty plate. Future checks will compare against this reference to detect objects.",calibrationTip:"Tip: You can store up to 5 calibrations for different plates. The system automatically uses the best match when checking.",plateEmpty:"Plate appears empty",objectsDetected:"Objects detected on plate",confidence:"Confidence",difference:"Difference",analysisPreview:"Analysis preview:",analysisLegend:"Green box = detection area, Red overlay = differences from calibration",savedReferences:"Saved References ({{count}}/{{max}})",deleteReference:"Delete reference",labelPlaceholder:"Label...",clickToEdit:"{{label}} - Click to edit",clickToAddLabel:"Click to add label"},fans:{partCooling:"Part Cooling Fan",auxiliary:"Auxiliary Fan",chamber:"Chamber Fan"},clickToViewHmsErrors:"Click to view HMS errors",estimatedCompletion:"Estimated completion time",slotOptions:"Slot options",firmwareModal:{title:"Firmware Update",currentVersion:"Current:",latestVersion:"Latest:",releaseNotes:"Release Notes",checkingPrereqs:"Checking prerequisites...",sdCardReady:"SD card ready. Click below to upload firmware.",uploadedSuccess:"Firmware uploaded to SD card!",applyInstructions:"To apply the update on your printer:",step1:"On the printer's touchscreen, go to Settings",step2:"Navigate to Firmware",step3:"Select Update from SD card",step4:"The update will take 10-20 minutes",done:"Done",starting:"Starting...",uploadFirmware:"Upload Firmware",uploadedToast:"Firmware uploaded! Trigger update from printer screen."},accessCodePlaceholder:"Leave empty to keep current",roi:{title:"Detection Area (ROI)",xStart:"X Start",yStart:"Y Start",width:"Width",height:"Height",instruction:"Adjust the detection area to focus on the build plate. The green box in the preview shows the current area."}},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",sortLargest:"Largest first",sortSmallest:"Smallest first",sortSize:"Size",noArchives:"No archives found",noArchivesSearch:"No archives match your search",noArchivesYet:"No archives yet",loadingArchives:"Loading archives...",releaseToUpload:"Release to upload",showAll:"Show all",showFavoritesOnly:"Show favorites only",gridView:"Grid view",listView:"List view",calendarView:"Calendar view",manageTags:"Manage Tags",showFailedPrints:"Show failed prints",hideFailedPrints:"Hide failed prints",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"},toast:{source3mfAttached:"Source 3MF attached: {{filename}}",failedUploadSource3mf:"Failed to upload source 3MF",source3mfRemoved:"Source 3MF removed",failedRemoveSource3mf:"Failed to remove source 3MF",f3dAttached:"F3D attached: {{filename}}",failedUploadF3d:"Failed to upload F3D",f3dRemoved:"F3D removed",failedRemoveF3d:"Failed to remove F3D",timelapseAttached:"Timelapse attached: {{filename}}",timelapseAlreadyAttached:"Timelapse already attached",noMatchingTimelapse:"No matching timelapse found",failedScanTimelapse:"Failed to scan for timelapse",failedAttachTimelapse:"Failed to attach timelapse",archiveDeleted:"Archive deleted",failedDeleteArchive:"Failed to delete archive",addedToFavorites:"Added to favorites",removedFromFavorites:"Removed from favorites",projectUpdated:"Project updated",failedUpdateProject:"Failed to update project",linkCopied:"Link copied to clipboard",failedCopyLink:"Failed to copy link",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo",failedDeleteArchives:"Failed to delete archives",failedUpdateFavorites:"Failed to update favorites",exportDownloaded:"Export downloaded",exportFailed:"Export failed"},menu:{print:"Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",slice:"Slice",externalLink:"External Link",viewOnMakerWorld:"View on MakerWorld",preview3d:"3D Preview",viewTimelapse:"View Timelapse",scanForTimelapse:"Scan for Timelapse",downloadSource3mf:"Download Source 3MF",uploadSource3mf:"Upload Source 3MF",replaceSource3mf:"Replace Source 3MF",removeSource3mf:"Remove Source 3MF",uploadF3d:"Upload F3D",replaceF3d:"Replace F3D",downloadF3d:"Download F3D",removeF3d:"Remove F3D",download:"Download",copyDownloadLink:"Copy Download Link",qrCode:"QR Code",viewPhotos:"View Photos",viewPhotosCount:"View Photos ({{count}})",projectPage:"Project Page",addToFavorites:"Add to Favorites",removeFromFavorites:"Remove from Favorites",edit:"Edit",goToProject:"Go to Project: {{name}}",addToProject:"Add to Project",removeFromProject:"Remove from Project",loading:"Loading...",noProjectsAvailable:"No projects available",select:"Select",deselect:"Deselect",delete:"Delete"},permission:{noReprint:"You do not have permission to reprint this archive",noAddToQueue:"You do not have permission to add to queue",noUpdateArchives:"You do not have permission to update archives",noUploadFiles:"You do not have permission to upload files",noDownload:"You do not have permission to download archives",noCopyLink:"You do not have permission to copy download links",noDelete:"You do not have permission to delete this archive",noCreate:"You do not have permission to create archives"},card:{previousPlate:"Previous plate",nextPlate:"Next plate",plateNumber:"Plate {{index}}",moreOptions:"Right-click for more options",addToFavorites:"Add to favorites",removeFromFavorites:"Remove from favorites",cancelled:"cancelled",failed:"failed",duplicate:"duplicate",duplicateTitle:"This model has been printed before",openSource3mf:"Open source 3MF in Bambu Studio (right-click for more options)",downloadF3d:"Download Fusion 360 design file",viewTimelapse:"View timelapse",viewPhoto:"View 1 photo",viewPhotos:"View {{count}} photos",openFolder:"Open folder: {{name}}",slicedFile:"Sliced file - ready to print",sourceFile:"Source file only - no AMS mapping available",gcode:"GCODE",source:"SOURCE",project:"Project: {{name}}",estimated:"Estimated: {{time}}",actual:"Actual: {{time}}",accuracy:"Accuracy: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} layer",layers:"{{count}} layers",object:"{{count}} object",objects:"{{count}} objects",slicedFor:"Sliced for {{model}}",uploadedBy:"Uploaded By",noPermissionReprint:"You do not have permission to reprint",noPermissionEdit:"You do not have permission to edit archives",noPermissionDelete:"You do not have permission to delete archives",reprint:"Reprint",schedulePrint:"Schedule Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",openInBambuStudioToSlice:"Open in Bambu Studio to slice",slice:"Slice",externalLink:"External Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"View project",noExternalLink:"No external link",preview3d:"3D Preview",download:"Download",edit:"Edit",delete:"Delete"},modal:{deleteArchive:"Delete Archive",deleteConfirm:'Are you sure you want to delete "{{name}}"? This action cannot be undone.',deleteButton:"Delete",removeSource3mf:"Remove Source 3MF",removeSource3mfConfirm:'Are you sure you want to remove the source 3MF file from "{{name}}"? This will delete the original slicer project file.',removeButton:"Remove",removeF3d:"Remove F3D",removeF3dConfirm:'Are you sure you want to remove the Fusion 360 design file from "{{name}}"?',timelapse:"{{name}} - Timelapse",selectTimelapse:"Select Timelapse",selectTimelapseDesc:"No auto-match found. Select the timelapse for this print:",deleteArchives:"Delete Archives",deleteArchivesConfirm:"Are you sure you want to delete {{count}} archive(s)? This action cannot be undone.",deleteCount:"Delete {{count}}"},page:{title:"Archives",printsCount:"{{filtered}} of {{total}} prints",dropFilesHere:"Drop .3mf files here",releaseToUpload:"Release to upload",only3mfSupported:"Only .3mf files are supported",close:"Close",selected:"{{count}} selected",selectAll:"Select All",tags:"Tags",project:"Project",favorite:"Favorite",delete:"Delete",toggledFavorites:"Toggled favorites for {{count}} archive(s)",failedUpdateFavorites:"Failed to update favorites",archivesDeleted:"{{count}} archive(s) deleted",failedDeleteArchives:"Failed to delete archives",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo"},list:{name:"Name",printer:"Printer",date:"Date",size:"Size",actions:"Actions",hasTimelapse:"Has timelapse"}},queue:{title:"Print Queue",subtitle:"Schedule and manage your print jobs",addToQueue:"Add to Queue",print:"Print",reprint:"Re-print",schedulePrint:"Schedule Print",editQueueItem:"Edit Queue Item",printToPrinters:"Print to {{count}} Printers",queueToPrinters:"Queue to {{count}} Printers",sending:"Sending...",sendingProgress:"Sending {{current}}/{{total}}...",adding:"Adding...",addingProgress:"Adding {{current}}/{{total}}...",savingProgress:"Saving {{current}}/{{total}}...",clearQueue:"Clear Queue",clearHistory:"Clear History",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",startNow:"Start Now",printingInProgress:"Printing in progress...",viewArchive:"View archive",viewInFileManager:"View in File Manager",itemCount:"{{count}} item",itemCount_plural:"{{count}} items",dragToReorder:"Drag to reorder (ASAP only)",reorderHint:"Position only affects ASAP items. Scheduled items run at their set time.",addedBy:"Added by {{name}}",sections:{currentlyPrinting:"Currently Printing",queued:"Queued",history:"History"},status:{pending:"Pending",waiting:"Waiting",printing:"Printing",paused:"Paused",completed:"Completed",failed:"Failed",skipped:"Skipped",cancelled:"Cancelled"},summary:{printing:"Printing",queued:"Queued",totalTime:"Total Queue Time",history:"History"},filter:{allPrinters:"All Printers",unassigned:"Unassigned",allStatus:"All Status",allLocations:"All Locations",any:"Any"},sort:{byPosition:"Sort by Position",byName:"Sort by Name",byPrinter:"Sort by Printer",bySchedule:"Sort by Schedule",byDate:"Sort by Date",ascendingOldest:"Ascending (oldest first)",descendingNewest:"Descending (newest first)"},badges:{staged:"Staged",requiresPrevious:"Requires previous success",autoPowerOff:"Auto power off"},empty:{title:"No prints scheduled",description:'Schedule a print from the Archives page using the "Schedule" option in the context menu, or drag and drop files to get started.'},time:{asap:"ASAP",overdue:"Overdue",now:"Now",lessThanMinute:"In less than a minute",inMinutes:"In {{count}} min",inHours:"In {{count}} hours"},actions:{stopPrint:"Stop Print",startPrint:"Start Print",requeue:"Re-queue"},bulkEdit:{title:"Edit {{count}} Item",title_plural:"Edit {{count}} Items",description:"Only changed settings will be applied to selected items.",printer:"Printer",noChange:"— No change —",queueOptions:"Queue Options",staged:"Staged (manual start)",autoPowerOff:"Auto power off after print",requirePrevious:"Require previous success",printOptions:"Print Options",bedLevelling:"Bed levelling",flowCalibration:"Flow calibration",vibrationCalibration:"Vibration calibration",layerInspection:"First layer inspection",timelapse:"Timelapse",useAms:"Use AMS",applyChanges:"Apply Changes",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",editSelected:"Edit Selected",cancelSelected:"Cancel Selected"},confirm:{cancelTitle:"Cancel Scheduled Print",cancelMessage:'Are you sure you want to cancel "{{name}}"?',stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print "{{name}}"? This will cancel the print job on the printer.',removeTitle:"Remove from History",removeMessage:'Are you sure you want to remove "{{name}}" from the queue history?',clearHistoryTitle:"Clear History",clearHistoryMessage:"Are you sure you want to remove all {{count}} item(s) from the history?",cancelButton:"Cancel Print",stopButton:"Stop Print",thisPrint:"this print",thisItem:"this item"},toast:{cancelled:"Queue item cancelled",cancelFailed:"Failed to cancel item",removed:"Queue item removed",removeFailed:"Failed to remove item",stopped:"Print stopped",stopFailed:"Failed to stop print",released:"Print released to queue",startFailed:"Failed to start print",reorderFailed:"Failed to reorder queue",historyCleared:"Cleared {{count}} history item(s)",clearHistoryFailed:"Failed to clear history",updateFailed:"Failed to update items",bulkCancelled:"Cancelled {{count}} item(s)",bulkCancelFailed:"Failed to cancel items"},permissions:{noStopPrint:"You do not have permission to stop prints",noStartPrint:"You do not have permission to start prints",noEdit:"You do not have permission to edit this queue item",noCancel:"You do not have permission to cancel this queue item",noRequeue:"You do not have permission to re-queue items",noRemove:"You do not have permission to remove this queue item",noClearHistory:"You do not have permission to clear all history",noEditItems:"You do not have permission to edit queue items",noCancelItems:"You do not have permission to cancel queue items"}},stats:{title:"Dashboard",subtitle:"Drag widgets to rearrange. Click the eye icon to hide.",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",printTime:"Print Time",totalFilament:"Total Filament Used",filamentUsed:"Filament Used",filamentCost:"Filament Cost",totalCost:"Total Cost",energyUsed:"Energy Used",energyCost:"Energy Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",printsByPrinter:"Prints by Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time",quickStats:"Quick Stats",printActivity:"Print Activity",filamentTypes:"Filament Types",filamentTrends:"Filament Trends",failureAnalysis:"Failure Analysis",timeAccuracy:"Time Accuracy",successful:"Successful:",failed:"Failed:",perfectEstimate:"100% = perfect estimate",noTimeAccuracyData:"No time accuracy data yet",noFilamentData:"No filament data available",noPrinterData:"No printer data available",noPrintData:"No print data available",noPrintDataLast30Days:"No print data in the last 30 days",failureReasons:"Failure Reasons",topFailureReasons:"Top Failure Reasons",failedPrintsCount:"{{failed}} / {{total}} prints failed",lastWeekRate:"Last week: {{rate}}%",resetLayout:"Reset Layout",recalculateCosts:"Recalculate Costs",recalculateCostsHint:"Recalculate all archive costs using current filament prices",exportStats:"Export Stats",exportAsCsv:"Export as CSV",exportAsExcel:"Export as Excel",hiddenCount:"{{count}} Hidden",exportDownloaded:"Export downloaded",exportFailed:"Export failed",layoutReset:"Layout reset",recalculatedCosts:"Recalculated costs for {{count}} archives",recalculateFailed:"Failed to recalculate costs",loadingStats:"Loading statistics...",noPermissionResetLayout:"You do not have permission to reset layout",noPermissionRecalculate:"You do not have permission to recalculate costs"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",statusTab:"Status",settingsTab:"Settings",overdueCount:"{{count}} overdue",dueSoonCount:"{{count}} due soon",dueSoon:"Due soon",allGood:"All good",overdueBy:"Overdue by {{duration}}",dueIn:"Due in {{duration}}",timeLeft:"{{duration}} left",day:"1 day",days:"{{count}} days",week:"1 week",weeks:"{{count}} weeks",month:"1 month",months:"{{count}} months",year:"1 year",maintenanceTypes:"Maintenance Types",maintenanceTypesDescription:"System types and your custom maintenance tasks",addCustomType:"Add Custom Type",intervalType:"Interval Type",intervalValue:"Interval ({{type}})",icon:"Icon",documentationLink:"Documentation Link (optional)",assignToPrinters:"Assign to Printers",selectAtLeastOnePrinter:"Select at least one printer",addType:"Add Type",custom:"Custom",printHours:"Print Hours",calendarDays:"Calendar Days",exampleName:"e.g., Replace HEPA Filter",viewDocumentation:"View documentation",timeBasedInterval:"Time-based interval",intervalOverrides:"Interval Overrides",intervalOverridesDescription:"Customize intervals for specific printers",assignedToPrinters:"Assigned to printers:",noPrintersAssigned:"No printers assigned",addPrinterShort:"Add:",printersAssignedClick:"{{count}} printer(s) assigned - click to manage",removeFromPrinter:"Remove from this printer",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection",cleanCarbonRods:"Clean Carbon Rods",checkPtfeTube:"Check PTFE Tube",replaceHepaFilter:"Replace HEPA Filter",replaceCarbonFilter:"Replace Carbon Filter",lubricateLeftNozzleRail:"Lubricate Left Nozzle Rail"},maintenanceComplete:"Maintenance marked as complete",typeUpdated:"Maintenance type updated",typeDeleted:"Maintenance type deleted",printHoursUpdated:"Print hours updated",printerAssigned:"Printer assigned",printerRemoved:"Printer removed",deleteTypeConfirm:'Delete "{{name}}"?',noPermissionUpdate:"You do not have permission to update maintenance items",noPermissionPerform:"You do not have permission to perform maintenance",noPermissionEditTypes:"You do not have permission to edit maintenance types",noPermissionDeleteTypes:"You do not have permission to delete maintenance types",noPermissionEditHours:"You do not have permission to edit print hours",noPermissionRemovePrinter:"You do not have permission to remove printer assignments",noPermissionAssignPrinter:"You do not have permission to assign printers",noPermissionEditIntervals:"You do not have permission to edit intervals",configureSettings:"Configure maintenance types and intervals"},settings:{title:"Settings",general:"General",tabs:{general:"General",smartPlugs:"Smart Plugs",notifications:"Notifications",filament:"Filament",network:"Network",apiKeys:"API Keys",virtualPrinter:"Virtual Printer",users:"Users",backup:"Backup",globalEmail:"Global Email"},email:{smtpSettings:"SMTP Configuration",smtpHost:"SMTP Server",smtpPort:"SMTP Port",security:"Security",authentication:"Authentication",username:"Username",password:"Password",fromEmail:"From Email",fromName:"From Name",testConnection:"Test SMTP Connection",testRecipient:"Test Recipient Email",sendTest:"Send Test Email",sending:"Sending...",save:"Save Settings",saving:"Saving...",advancedAuth:"Advanced Authentication",advancedAuthEnabled:"Advanced Authentication is enabled",advancedAuthDisabled:"Advanced Authentication is disabled",advancedAuthDisabledDesc:"Enable advanced authentication to activate email-based features for user management.",enable:"Enable",disable:"Disable",feature1:"Passwords are auto-generated and emailed to new users",feature2:"Users can login with username or email",feature3:"Forgot password feature is available",feature4:"Admins can reset user passwords via email"},appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected",noDefaultPrinter:"No default (ask each time)",sidebarOrder:"Sidebar order",saveThumbnails:"Save thumbnails",captureFinishPhoto:"Capture finish photo",noPrintersConfigured:"No printers configured",archiveMode:{always:"Always create archive entry",never:"Never create archive entry",ask:"Ask each time"},checkForUpdatesLabel:"Check for updates",checkPrinterFirmware:"Check printer firmware",enableRetry:"Enable retry",homeAssistantDescription:"Control smart plugs via Home Assistant",mqttConnectedTo:"Connected to",prometheusDescription:"Expose printer data in Prometheus format",noSmartPlugsTitle:"No smart plugs configured",noSmartPlugsDescription:"Add a Tasmota-based smart plug to track energy usage and automate power control.",noProvidersTitle:"No providers configured",noProvidersDescription:"Add a provider to receive alerts.",noTemplatesAvailable:"No templates available. Restart the backend to seed default templates.",apiPermissionView:"View printer status and queue",apiPermissionEdit:"Add and remove items from print queue",apiKeysEmptyTitle:"No API keys",apiKeysEmptyDescription:"Create an API key to integrate with external services.",noUsersFound:"No users found",noGroupsFound:"No groups found",noGroupsAvailable:"No groups available",passwordsDoNotMatch:"Passwords do not match",systemGroupWarning:"System group names cannot be changed",authDisabledTitle:"Authentication is Disabled",authDisabledFeature1:"Require login to access the system",authDisabledFeature2:"Create multiple users with group-based permissions",authDisabledFeature3:"Control access with 50+ granular permissions",userHasCreated:"This user has created:",userItemsQuestion:"What would you like to do with these items?",deleteUserConfirm:"Are you sure you want to delete this user?",actionCannotBeUndone:"This action cannot be undone.",addFirstSmartPlug:"Add Your First Smart Plug",providers:"Providers",log:"Log",testAll:"Test All",testResults:"Test Results",testPassedCount:"{{count}} passed",testFailedCount:"{{count}} failed",messageTemplates:"Message Templates",messageTemplatesDescription:"Customize notification messages for each event.",apiKeys:"API Keys",apiKeysDescription:"Create API keys for external integrations and webhooks.",createKey:"Create Key",apiKeyCreated:"API Key Created Successfully",apiKeyCopyWarning:"Copy this key now - it won't be shown again!",useInApiBrowser:"Use in API Browser",createNewApiKey:"Create New API Key",keyName:"Key Name",keyNamePlaceholder:"e.g., Home Assistant, OctoPrint",readStatus:"Read Status",readStatusDescription:"View printer status and queue",manageQueue:"Manage Queue",manageQueueDescription:"Add and remove items from print queue",controlPrinter:"Control Printer",controlPrinterDescription:"Pause, resume, and stop prints",unnamedKey:"Unnamed Key",lastUsed:"Last used",read:"Read",control:"Control",createFirstKey:"Create Your First Key",webhookEndpoints:"Webhook Endpoints",webhookApiKeyHint:"Use your API key in the X-API-Key header.",webhook:{getAllStatus:"Get all printer status",getSpecificStatus:"Get specific printer status",addToQueue:"Add to print queue",pausePrint:"Pause print",resumePrint:"Resume print",stopPrint:"Stop print"},apiBrowser:"API Browser",apiBrowserDescription:"Explore and test all available API endpoints.",apiKeyForTesting:"API Key for Testing",apiKeyPlaceholder:"Paste your API key here to test authenticated endpoints...",apiKeyHint:"This key will be sent as X-API-Key header with requests.",deleteApiKeyTitle:"Delete API Key",deleteApiKeyMessage:"Are you sure you want to delete this API key? Any integrations using this key will stop working.",deleteKey:"Delete Key",amsDisplayThresholds:"AMS Display Thresholds",amsThresholdsDescription:"Configure color thresholds for AMS humidity and temperature indicators.",humidity:"Humidity",goodGreen:"Good (green)",fairOrange:"Fair (orange)",aboveFairBad:"Above fair threshold shows as red (bad)",temperature:"Temperature",goodBlue:"Good (blue)",aboveFairHot:"Above fair threshold shows as red (hot)",historyRetention:"History Retention",keepSensorHistory:"Keep sensor history for",historyRetentionDescription:"Older humidity and temperature data will be automatically deleted",printModal:"Print Modal",expandCustomMapping:"Expand custom mapping by default",expandCustomMappingDescription:"When printing to multiple printers, show per-printer AMS mapping expanded",authentication:"Authentication",authEnabledDescription:"Your instance is secured with user authentication",authDisabledDescription:"Enable to require login and manage user access",authDisabledMessage:"Enable authentication to create user accounts, manage permissions, and secure your Bambuddy instance.",enableAuthentication:"Enable Authentication",currentUser:"Current User",changePassword:"Change Password",admin:"Admin",users:"Users",addUser:"Add User",groups:"Groups",addGroup:"Add Group",system:"System",noDescription:"No description",userCount:"{{count}} users",permissionCount:"{{count}} permissions",createUser:"Create User",username:"Username",enterUsername:"Enter username",password:"Password",enterPassword:"Enter password (min 6 characters)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",viewReleaseOnGitHub:"View release on GitHub",turnAllPlugsOn:"Turn all plugs on",turnAllPlugsOff:"Turn all plugs off",clearNotificationLogs:"Clear Notification Logs",clearLogsMessage:"This will permanently delete all notification logs older than 30 days. This action cannot be undone.",clearLogs:"Clear Logs",resetUiPreferences:"Reset UI Preferences",resetUiPreferencesMessage:"This will reset all UI preferences to defaults: sidebar order, theme, dashboard layout, view modes, and sorting preferences. Your printers, archives, and server settings will NOT be affected. The page will reload after clearing.",resetPreferences:"Reset Preferences",deleteGroupTitle:"Delete Group",deleteGroupMessage:"Are you sure you want to delete this group? Users in this group will lose these permissions.",deleteGroup:"Delete Group",disableAuthenticationTitle:"Disable Authentication",disableAuthenticationMessage:"Are you sure you want to disable authentication? This will make your Bambuddy instance accessible without login. All users will remain in the database but authentication will be disabled.",disableAuthentication:"Disable Authentication",configureBambuddy:"Configure Bambuddy",systemDefault:"System Default",archiveSettings:"Archive Settings",newWindow:"New Window",embeddedOverlay:"Embedded Overlay",externalCameras:"External Cameras",costTracking:"Cost Tracking",printsOnly:"Prints Only",totalConsumption:"Total Consumption",dataManagement:"Data Management",clearNotificationLogsDescription:"Delete notification logs older than 30 days",resetUiPreferencesDescription:"Reset sidebar order, theme, view modes, and layout preferences. Printers, archives, and settings are not affected.",enableHomeAssistant:"Enable Home Assistant",enableMqtt:"Enable MQTT",useTls:"Use TLS",enableMetricsEndpoint:"Enable Metrics Endpoint",availableMetrics:"Available Metrics",editUser:"Edit User",deleteUserTitle:"Delete User",groupName:"Group Name",leaveEmptyForAnonymous:"Leave empty for anonymous",leaveEmptyForNoAuth:"Leave empty for no authentication",enterNewPassword:"Enter new password",confirmNewPassword:"Confirm new password",enterGroupName:"Enter group name",enterDescriptionOptional:"Enter description (optional)",enterCurrentPassword:"Enter current password",enterNewPasswordMin6:"Enter new password (min 6 characters)",toast:{keyCopied:"Key copied to clipboard",copyFailed:"Failed to copy key",keyAddedToBrowser:"Key added to API Browser",clearLogsFailed:"Failed to clear logs",uiPreferencesReset:"UI preferences reset. Refreshing...",authDisabled:"Authentication disabled successfully",authDisableFailed:"Failed to disable authentication",apiKeyCreated:"API key created",apiKeyDeleted:"API key deleted",userCreated:"User created successfully",userUpdated:"User updated successfully",userDeleted:"User deleted successfully",groupCreated:"Group created successfully",groupUpdated:"Group updated successfully",groupDeleted:"Group deleted successfully",fillRequiredFields:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",enterGroupName:"Please enter a group name",settingsSaved:"Settings saved",cameraSettingsSaved:"Camera settings saved",enterCameraUrl:"Please enter a camera URL",passwordChanged:"Password changed successfully",connectionFailed:"Connection failed",testFailed:"Test failed",cameraConnected:"Camera connected{{resolution}}"},testConnection:"Test Connection"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},hmsErrors:{title:"Errors - {{name}}",noErrors:"No errors",viewOnWiki:"View on Bambu Lab Wiki",clearInstructions:"Clear errors on the printer to dismiss them here."},mqttDebug:{title:"MQTT Debug Log",searchPlaceholder:"Search topic or payload...",noMessages:"No messages logged yet",startLoggingHint:'Click "Start Logging" to begin capturing MQTT messages',noMessagesMatch:"No messages match your filter",adjustFilterHint:"Try adjusting your search or filter criteria",incoming:"Incoming",outgoing:"Outgoing",loggingStopped:"Logging stopped",loggingActive:"Logging active - messages will auto-refresh",startLogging:"Start Logging",stopLogging:"Stop Logging",clearLog:"Clear Log",topic:"Topic",timestamp:"Timestamp",direction:"Direction",all:"All"},printerFiles:{title:"File Manager",storageUsed:"Used:",storageFree:"Free:",filterPlaceholder:"Filter files...",deleteButton:"Delete",deleteFiles:"Delete {{count}} Files",deleteFileConfirm:'Delete "{{name}}"? This cannot be undone.',deleteFilesConfirm:"Delete {{count}} selected files? This cannot be undone.",noFiles:"No files on printer",loadingFiles:"Loading files...",failedToLoad:"Failed to load files",toast:{filesDeleted:"Deleted {{count}} file(s)",deleteFailed:"Delete failed: {{error}}"}},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"},login:{title:"Bambuddy Login",subtitle:"Sign in to your account",username:"Username",usernamePlaceholder:"Enter your username",usernameOrEmail:"Username or Email",usernameOrEmailPlaceholder:"Username or @ Email",password:"Password",passwordPlaceholder:"Enter your password",signIn:"Sign in",signingIn:"Logging in...",forgotPassword:"Forgot your password?",loginSuccess:"Logged in successfully",loginFailed:"Login failed",enterCredentials:"Please enter username and password",forgotPasswordTitle:"Forgot Password",forgotPasswordMessage:"If you've forgotten your password, please contact your system administrator to reset it.",forgotPasswordEmailMessage:"Enter your email address and we'll send you a new password.",emailAddress:"Email Address",emailPlaceholder:"your.email@example.com",cancel:"Cancel",sending:"Sending...",sendResetEmail:"Send Reset Email",howToReset:"How to reset your password:",resetStep1:"Contact your Bambuddy administrator",resetStep2:"Ask them to reset your password in User Management",resetStep3:"They can set a new temporary password for you",resetStep4:"Log in with the new password and change it in Settings",gotIt:"Got it"},setup:{title:"Bambuddy Setup",subtitle:"Configure authentication for your Bambuddy instance",enableAuth:"Enable Authentication",adminAccount:"Admin Account",adminAccountDesc:"If admin users already exist, authentication will be enabled using the existing admin accounts. Leave the fields below empty to use existing admins, or enter new credentials to create a new admin user.",adminUsername:"Admin Username",adminPassword:"Admin Password",optionalIfAdminExists:"(optional if admin users exist)",adminUsernamePlaceholder:"Enter admin username (optional)",adminPasswordPlaceholder:"Enter admin password (optional)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm admin password",settingUp:"Setting up...",completeSetup:"Complete Setup",toast:{authEnabledAdminCreated:"Authentication enabled and admin user created",authEnabledExistingAdmins:"Authentication enabled using existing admin users",setupCompleted:"Setup completed",enterBothCredentials:"Please enter both admin username and password, or leave both empty to use existing admin users",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"}},changePassword:{title:"Change Password",currentPassword:"Current Password",currentPasswordPlaceholder:"Enter current password",newPassword:"New Password",newPasswordPlaceholder:"Enter new password (min 6 characters)",confirmPassword:"Confirm New Password",confirmPasswordPlaceholder:"Confirm new password",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",changing:"Changing...",success:"Password changed successfully",failed:"Failed to change password"},plateAlert:{title:"Print Paused!",message:"Objects detected on build plate. The print has been automatically paused. Please clear the plate and resume the print.",understand:"I Understand"},camera:{title:"Camera View",invalidPrinterId:"Invalid printer ID",live:"Live",snapshot:"Snapshot",restartStream:"Restart stream",refreshSnapshot:"Refresh snapshot",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",connectingToCamera:"Connecting to camera...",capturingSnapshot:"Capturing snapshot...",connectionLost:"Connection lost",connectionFailed:"Camera connection failed",reconnecting:"Reconnecting in {{countdown}}s... (attempt {{attempt}}/{{max}})",reconnectNow:"Reconnect now",cameraUnavailable:"Camera unavailable",cameraUnavailableDesc:"Make sure the printer is powered on and connected.",noCamera:"No camera available",retry:"Retry",cameraStream:"Camera stream",zoomOut:"Zoom out",zoomIn:"Zoom in",resetZoom:"Reset zoom",recording:"Recording",startRecording:"Start Recording",stopRecording:"Stop Recording"},groups:{title:"Group Management",subtitle:"Manage permission groups for access control",backToSettings:"Back to Settings",createGroup:"Create Group",noPermission:"You do not have permission to access this page.",system:"System",noDescription:"No description",usersCount:"{{count}} users",permissionsCount:"{{count}} permissions",edit:"Edit",delete:"Delete",toast:{created:"Group created successfully",updated:"Group updated successfully",deleted:"Group deleted successfully",enterGroupName:"Please enter a group name"},modal:{editGroup:"Edit Group",createGroup:"Create Group",cancel:"Cancel",saving:"Saving...",creating:"Creating...",saveChanges:"Save Changes"},form:{groupName:"Group Name",groupNamePlaceholder:"Enter group name",systemGroupWarning:"System group names cannot be changed",description:"Description",descriptionPlaceholder:"Enter description (optional)",permissions:"Permissions ({{count}} selected)"},deleteModal:{title:"Delete Group",message:"Are you sure you want to delete this group? Users in this group will lose these permissions.",confirm:"Delete Group"}},users:{title:"User Management",subtitle:"Manage users and their access to your Bambuddy instance",backToSettings:"Back to Settings",createUser:"Create User",noPermission:"You do not have permission to access this page.",admin:"Admin",noGroups:"No groups",active:"Active",inactive:"Inactive",edit:"Edit",delete:"Delete",system:"System",noGroupsAvailable:"No groups available",table:{username:"Username",groups:"Groups",status:"Status",actions:"Actions"},toast:{created:"User created successfully",updated:"User updated successfully",deleted:"User deleted successfully",fillRequired:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"},modal:{createUser:"Create User",editUser:"Edit User",cancel:"Cancel",creating:"Creating...",saving:"Saving...",saveChanges:"Save Changes"},form:{username:"Username",usernamePlaceholder:"Enter username",email:"Email",emailPlaceholder:"user@example.com",password:"Password",passwordPlaceholder:"Enter password",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",newPasswordPlaceholder:"Enter new password",confirmNewPasswordPlaceholder:"Confirm new password",leaveBlankToKeep:"leave blank to keep current",groups:"Groups",optional:"optional",autoGeneratedPassword:"A secure password will be automatically generated and emailed to the user."},deleteModal:{title:"Delete User",message:"Are you sure you want to delete this user? This action cannot be undone.",confirm:"Delete User"}},streamOverlay:{title:"Stream Overlay",invalidPrinterId:"Invalid printer ID",cameraStream:"Camera stream",progress:"Progress",eta:"ETA",tomorrow:"Tomorrow",printerIdle:"Printer is idle",printerOffline:"Printer offline",status:{printing:"Printing",paused:"Paused",finished:"Finished",failed:"Failed",idle:"Idle",unknown:"Unknown"}},profiles:{title:"Profiles",subtitle:"Manage your slicer presets and pressure advance calibrations",tabs:{cloud:"Cloud Profiles",kprofiles:"K-Profiles"},connectedAs:"Connected as",logout:"Logout",noLogoutPermission:"You do not have permission to logout",failedToLoad:"Failed to load profiles",retry:"Retry",time:{justNow:"Just now",minsAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},toast:{loggedOut:"Logged out"},login:{title:"Connect to Bambu Cloud",subtitle:"Sync your slicer presets across devices",email:"Email",password:"Password",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Verification Code",totpCode:"Authenticator Code",checkEmail:"Check your email ({{email}}) for a 6-digit code",enterTotpHint:"Enter the 6-digit code from your authenticator app",accessToken:"Access Token",accessTokenHint:"Paste your Bambu Lab access token (from Bambu Studio)",back:"Back",loginButton:"Login",verifyButton:"Verify",setTokenButton:"Set Token",useToken:"Use access token instead",useEmail:"Login with email instead",toast:{loggedIn:"Logged in successfully",codeSent:"Verification code sent to your email",enterTotp:"Enter code from your authenticator app",tokenSet:"Token set successfully"}},presets:{myPreset:"My preset (editable)",duplicate:"Duplicate",editable:"Editable",failedToLoadDetails:"Failed to load preset details",deleteConfirm:"Delete this preset?",deleteWarning:'This will permanently delete "{{name}}" from Bambu Cloud. This cannot be undone.',noDuplicatePermission:"You do not have permission to duplicate presets",noEditPermission:"You do not have permission to edit presets",noDeletePermission:"You do not have permission to delete presets",types:{filament:"Filament preset",printer:"Printer preset",process:"Process preset"},toast:{deleted:"Preset deleted",created:"Preset created",updated:"Preset updated",duplicated:"Preset duplicated",fieldAdded:'Field "{{key}}" added',exported:"Preset exported"},baseLabel:"Base: {{name}}",currentLabel:"Current: {{name}}",newPreset:"New Preset",editPreset:"Edit Preset",duplicatePreset:"Duplicate Preset",createNewPreset:"Create New Preset",customizeSettings:"Customize settings for your new preset",compareWithBase:"Compare with base preset",compare:"Compare",basePreset:"Base Preset",selectBasePreset:"Select base preset...",presetName:"Preset Name",myCustomPreset:"My custom preset",inheritsFrom:"Inherits from",dropJsonToImport:"Drop JSON to import",tabs:{common:"Common",allFields:"All Fields"},availableFields:"Available Fields",searchFieldsPlaceholder:"Search fields...",noMatchingFields:"No matching fields",allFieldsAdded:"All fields added",addCustomField:"Add custom field",yourOverrides:"Your Overrides",noOverridesYet:"No overrides yet",clickFieldsToAdd:"Click fields on the left to add them",saveAsTemplate:"Save as template",jsonTip:"Tip: Drag & drop a .json file anywhere on this modal to import settings"},cloudView:{searchPlaceholder:"Search presets...",templates:"Templates",refresh:"Refresh",newPreset:"New Preset",clearFilters:"Clear filters",compareMode:"Compare Mode",selectAnotherPreset:"Select another {{type}} preset",clickTwoPresets:"Click two presets of the same type to compare",selectFirst:"1. Select first",selectSecond:"2. Select second",compareNow:"Compare Now",lastSynced:"Last synced:",showingCount:"Showing {{showing}} of {{total}} presets",noPresetsFound:"No presets found",columns:{filament:"Filament",process:"Process",printer:"Printer"},noFilamentPresets:"No filament presets",noProcessPresets:"No process presets",noPrinterPresets:"No printer presets",filters:{type:"Type",owner:"Owner",printer:"Printer",nozzle:"Nozzle",filament:"Filament",layer:"Layer",all:"All",myPresets:"My Presets",builtIn:"Built-in",process:"Process"},noTemplatesPermission:"You do not have permission to manage templates",noRefreshPermission:"You do not have permission to refresh profiles",noCreatePermission:"You do not have permission to create presets"},templates:{title:"Quick Templates",noTemplates:"No templates yet",createFirst:"Create templates from the preset editor",typeFilter:"Type:",deleteTitle:"Delete Template",deleteWarning:"This action cannot be undone",deleteConfirm:'Are you sure you want to delete "{{name}}"?',namePlaceholder:"Template name",descriptionPlaceholder:"Description",settingsJson:"Settings (JSON)",fieldsCount:"{{count}} fields",shownInModals:"Shown in modals",hiddenInModals:"Hidden in modals",apply:"Apply",toast:{deleted:"Template deleted",updated:"Template updated",created:"Template created",applied:"Template applied"}}},support:{debugLoggingActive:"Debug logging is active",manageLogs:"Manage"},fileManager:{title:"File Manager",subtitle:"Organize and manage your print files",uploadFiles:"Upload Files",newFolder:"New Folder",folderName:"Folder Name",folderNamePlaceholder:"e.g., Functional Parts",renameFile:"Rename File",renameFolder:"Rename Folder",moveFiles:"Move {{count}} File(s)",rootNoFolder:"Root (No Folder)",current:"current",linkFolder:"Link Folder",linkFolderDescription:'Link "{{name}}" to a project or archive for quick access.',project:"Project",archive:"Archive",noProjectsFound:"No projects found",noArchivesFound:"No archives found",unlink:"Unlink",link:"Link",dragDropFiles:"Drag & drop files here",dropFilesHere:"Drop files here",orClickToBrowse:"or click to browse",allFileTypesSupported:"All file types supported. ZIP files will be extracted.",zipFilesDetected:"ZIP files detected",zipExtractOptions:"ZIP files will be extracted. Choose how to handle folder structure:",preserveZipStructure:"Preserve folder structure from ZIP",createFolderFromZip:"Create folder from ZIP filename",stlThumbnailGeneration:"STL thumbnail generation",zipMayContainStl:"ZIP files may contain STL files. Thumbnails can be generated during extraction.",thumbnailsCanBeGenerated:"Thumbnails can be generated for STL files. Large models may take longer to process.",generateThumbnailsForStl:"Generate thumbnails for STL files",threemfDetected:"3MF files detected",threemfExtractionInfo:"Printer model, material, color, and print settings will be automatically extracted from 3MF files.",willBeExtracted:"Will be extracted",filesExtracted:"{{count}} files extracted",uploadComplete:"Upload complete: {{succeeded}} succeeded",uploadFailed:"{{count}} failed",uploading:"Uploading...",changeLink:"Change Link...",linkTo:"Link to...",linkToProjectOrArchive:"Link to project or archive",addToQueue:"Add to Queue",schedulePrint:"Schedule",generateThumbnail:"Generate Thumbnail",generateThumbnails:"Generate Thumbnails",generateThumbnailsForMissing:"Generate thumbnails for STL files missing them",gridView:"Grid view",listView:"List view",lowDiskSpaceWarning:"Low disk space warning",lowDiskSpaceDetails:"Only {{free}} free of {{total}} total. Threshold is set to {{threshold}} GB in settings.",files:"Files",folders:"Folders",size:"Size",free:"Free",allFiles:"All Files",wrap:"Wrap",enableTextWrapping:"Enable text wrapping",disableTextWrapping:"Disable text wrapping",dragToResizeTooltip:"Drag to resize, double-click to reset",searchFiles:"Search files...",allTypes:"All types",prints:"Prints",ascending:"Ascending",descending:"Descending",resultsCount:"{{showing}} of {{total}} files",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",adding:"Adding...",loadingFiles:"Loading files...",folderIsEmpty:"Folder is empty",noFilesYet:"No files yet",folderEmptyDescription:"Upload files or move files into this folder to get started.",noFilesDescription:"Upload files to start organizing your print-related files.",noMatchingFiles:"No matching files",noMatchingFilesDescription:"No files match your current search or filter criteria.",clearFilters:"Clear filters",printedCount:"Printed {{count}}x",uploadedBy:"Uploaded By",deleteFolder:"Delete Folder",deleteFile:"Delete File",deleteFilesCount:"Delete {{count}} Files",deleteFolderConfirm:"Are you sure you want to delete this folder? All files inside will also be deleted.",deleteFileConfirm:"Are you sure you want to delete this file?",deleteFilesConfirm:"Are you sure you want to delete {{count}} selected files? This action cannot be undone.",deleting:"Deleting...",noPermissionRenameFolder:"You do not have permission to rename folders",noPermissionLinkFolder:"You do not have permission to link folders",noPermissionDeleteFolder:"You do not have permission to delete folders",noPermissionPrint:"You do not have permission to print",noPermissionAddToQueue:"You do not have permission to add to queue",noPermissionDownload:"You do not have permission to download files",noPermissionRenameFile:"You do not have permission to rename this file",noPermissionGenerateThumbnail:"You do not have permission to generate thumbnails",noPermissionDeleteFile:"You do not have permission to delete this file",noPermissionCreateFolder:"You do not have permission to create folders",noPermissionUpload:"You do not have permission to upload files",noPermissionMoveFiles:"You do not have permission to move files",noPermissionDeleteFiles:"You do not have permission to delete files",toast:{folderCreated:"Folder created",folderDeleted:"Folder deleted",fileDeleted:"File deleted",filesDeleted:"Deleted {{count}} files",filesMoved:"Files moved",folderLinked:"Folder linked",folderUnlinked:"Folder unlinked",addedToQueue:"Added {{count}} file(s) to queue",addedToQueuePartial:"Added {{added}} file(s), {{failed}} failed",failedToAddToQueue:"Failed to add files: {{error}}",fileRenamed:"File renamed",folderRenamed:"Folder renamed",thumbnailsGenerated:"Generated {{count}} thumbnail(s)",thumbnailsGeneratedPartial:"Generated {{succeeded}} thumbnail(s), {{failed}} failed",noStlMissingThumbnails:"No STL files missing thumbnails",failedToGenerateThumbnails:"Failed to generate thumbnails: {{error}}",thumbnailGenerated:"Thumbnail generated",failedToGenerateThumbnail:"Failed to generate thumbnail: {{error}}"}},projects:{title:"Projects",subtitle:"Organize and track your 3D printing projects",newProject:"New Project",editProject:"Edit Project",deleteProject:"Delete Project",projectName:"Project Name",description:"Description",noProjects:"No projects yet",noProjectsFiltered:"No {{status}} projects",noProjectsFilteredHelp:"You don't have any {{status}} projects. Projects will appear here when their status changes.",createFirst:"Create your first project to start organizing related prints, tracking progress, and managing your builds.",createFirstButton:"Create Your First Project",create:"Create",files:"Files",prints:"Prints",plates:"plates",parts:"parts",lastModified:"Last Modified",deleteConfirm:"Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.",addFiles:"Add Files",removeFile:"Remove File",viewDetails:"View Details",namePlaceholder:"e.g., Voron 2.4 Build",descriptionPlaceholder:"Optional description...",color:"Color",targetPlates:"Target Plates",targetPlatesPlaceholder:"e.g., 25",targetPlatesHelp:"Number of print jobs",targetParts:"Target Parts",targetPartsPlaceholder:"e.g., 150",targetPartsHelp:"Total objects needed",tagsLabel:"Tags (comma-separated)",tagsPlaceholder:"e.g., voron, functional, gift",dueDate:"Due Date",priority:"Priority",priorityLow:"Low",priorityNormal:"Normal",priorityHigh:"High",priorityUrgent:"Urgent",statusActive:"Active",statusCompleted:"Completed",statusArchived:"Archived",done:"Done",completed:"completed",failed:"failed",inQueue:"in queue",noPrintsYet:"No prints yet",printJobs:"Print jobs (plates)",partsPrinted:"Parts printed",failedParts:"Failed parts",import:"Import",export:"Export",importProject:"Import project",exportAll:"Export all projects",loading:"Loading projects...",noEditPermission:"You do not have permission to edit projects",noDeletePermission:"You do not have permission to delete projects",noCreatePermission:"You do not have permission to create projects",noImportPermission:"You do not have permission to import projects",noExportPermission:"You do not have permission to export projects",toast:{created:"Project created",updated:"Project updated",deleted:"Project deleted",imported:"Project imported",multipleImported:"{{count}} projects imported",importFailed:"Import failed",exported:"Projects exported (metadata only)"}},projectDetail:{notFound:"Project not found",backToProjects:"Back to Projects",export:"Export",exportProject:"Export project",noExportPermission:"You do not have permission to export projects",noEditPermission:"You do not have permission to edit projects",partOf:"Part of:",priorityLabel:"Priority:",noPrints:"No prints in this project yet",status:{active:"Active",completed:"Completed",archived:"Archived"},priority:{low:"Low",normal:"Normal",high:"High",urgent:"Urgent"},dueDate:{overdue:"Overdue",today:"Due today",daysLeft:"{{count}} days left"},progress:{platesProgress:"Plates Progress",partsProgress:"Parts Progress",printJobs:"print jobs",parts:"parts",percentComplete:"{{percent}}% complete",remaining:"{{count}} remaining"},stats:{printJobs:"Print Jobs",total:"total",failed:"{{count}} failed",partsPrinted:"{{count}} parts printed",printTime:"Print Time",filamentUsed:"Filament Used"},cost:{title:"Cost Tracking",filamentCost:"Filament Cost",energy:"Energy",budget:"Budget",remaining:"Remaining"},subProjects:{title:"Sub-projects ({{count}})"},notes:{title:"Notes",noEditPermission:"You do not have permission to edit notes",placeholder:"Add notes about this project...",empty:"No notes yet. Click Edit to add notes."},files:{title:"Files",linkFolders:"Link folders from the File Manager",forQuickAccess:"to this project for quick access.",fileCount:"{{count}} file(s)",empty:"No folders linked. Go to File Manager and link a folder to this project."},bom:{title:"Bill of Materials",acquired:"{{completed}}/{{total}} acquired",showAll:"Show all",hideDone:"Hide done",addPart:"Add Part",noAddPermission:"You do not have permission to add parts",partNamePlaceholder:"Part name (e.g., M3x8 screws)",partName:"Part name",qty:"Qty",price:"Price ({{currency}})",sourcingUrlPlaceholder:"Sourcing URL (optional)",remarksPlaceholder:"Remarks (optional)",deletePart:"Delete Part",deleteConfirm:'Are you sure you want to delete "{{name}}"?',noUpdatePermission:"You do not have permission to update parts",noEditPermission:"You do not have permission to edit parts",noDeletePermission:"You do not have permission to delete parts",totalCost:"Total cost:",empty:"No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced."},timeline:{title:"Activity Timeline",empty:"No activity yet."},template:{saveAsTemplate:"Save as Template",noCreatePermission:"You do not have permission to create templates"},queue:{title:"Queue",viewAll:"View all",printing:"{{count}} printing",queued:"{{count}} queued"},prints:{title:"Prints ({{count}})"},toast:{projectUpdated:"Project updated",partAdded:"Part added",partRemoved:"Part removed",exportFailed:"Export failed",projectExported:"Project exported",templateCreated:"Template created"}},system:{title:"System Information",version:"Version",uptime:"Uptime",cpuUsage:"CPU Usage",memoryUsage:"Memory Usage",diskUsage:"Disk Usage",networkInfo:"Network Info",logs:"Logs",debugMode:"Debug Mode",enableDebug:"Enable Debug Logging",disableDebug:"Disable Debug Logging",downloadLogs:"Download Logs",clearLogs:"Clear Logs",dockerInfo:"Docker Info",containerName:"Container Name",imageName:"Image Name",platform:"Platform",architecture:"Architecture"},library:{title:"Filament Library",addFilament:"Add Filament",editFilament:"Edit Filament",deleteFilament:"Delete Filament",vendor:"Vendor",material:"Material",color:"Color",kFactor:"K Factor",temperature:"Temperature",noFilaments:"No filaments in library",deleteConfirm:"Are you sure you want to delete this filament?",importFromPrinter:"Import from Printer",exportToFile:"Export to File"},spoolman:{title:"Spoolman Integration",enabled:"Spoolman Enabled",url:"Spoolman URL",connected:"Connected",disconnected:"Not Connected",testConnection:"Test Connection",sync:"Sync",syncing:"Syncing...",lastSync:"Last Sync",linkToSpoolman:"Link to Spoolman",openInSpoolman:"Open in Spoolman",unlinkSpool:"Unlink Spool",selectSpool:"Select Spool",noUnlinkedSpools:"No unlinked spools available",linkSuccess:"Spool linked to Spoolman successfully",linkFailed:"Failed to link spool",spoolId:"Spool ID",weight:"Weight",remaining:"Remaining",disableWeightSync:"Disable AMS Estimated Weight Sync",disableWeightSyncDesc:"Don't update remaining capacity from AMS estimates. Use this if you prefer Spoolman's usage tracking over AMS percentage-based estimates. New spools will still use the AMS estimate as their initial weight.",reportPartialUsage:"Report Partial Usage for Failed Prints",reportPartialUsageDesc:"When a print fails or is cancelled, report the estimated filament used up to that point based on layer progress."},timelapse:{title:"Timelapse",create:"Create Timelapse",download:"Download",delete:"Delete",preview:"Preview",frameRate:"Frame Rate",quality:"Quality",processing:"Processing...",noTimelapses:"No timelapses available"},ams:{title:"AMS",slot:"Slot",empty:"Empty",emptySlot:"Empty slot",unknown:"Unknown",humidity:"Humidity",temperature:"Temperature",filamentType:"Filament Type",filamentColor:"Color",remaining:"Remaining",history:"AMS History",noHistory:"No history available",configureSlot:"Configure Slot",externalSpool:"External Spool",profile:"Profile",kFactor:"K Factor",fill:"Fill",configure:"Configure"},printModal:{title:"Start Print",selectPrinter:"Select Printer",selectPlate:"Select Plate",filamentMapping:"Filament Mapping",printSettings:"Print Settings",bedLeveling:"Bed Leveling",flowCalibration:"Flow Calibration",vibrationCalibration:"Vibration Calibration",layerInspection:"First Layer Inspection",timelapse:"Timelapse",startPrint:"Start Print",addToQueue:"Add to Queue",cancel:"Cancel",noPrintersAvailable:"No printers available",printerBusy:"Printer is busy",printerOffline:"Printer is offline"},backup:{title:"Backup & Restore",createBackup:"Create Backup",restoreBackup:"Restore Backup",restoreDescription:"Replace all data from a backup file",downloadBackup:"Download Backup",uploadBackup:"Upload Backup",lastBackup:"Last Backup",autoBackup:"Auto Backup",backupNow:"Backup Now",restoreWarning:"Warning: Restoring a backup will overwrite all current data.",includeArchives:"Include Archives",includeSettings:"Include Settings",includeProfiles:"Include Profiles",backupSuccess:"Backup created successfully",restoreSuccess:"Backup restored successfully",backupFailed:"Backup failed",restoreFailed:"Restore failed",restoreNote:"Virtual Printer will be stopped during restore"},tags:{title:"Tags",addTag:"Add Tag",editTag:"Edit Tag",deleteTag:"Delete Tag",tagName:"Tag Name",tagColor:"Tag Color",noTags:"No tags",deleteConfirm:"Are you sure you want to delete this tag?",manageTags:"Manage Tags"},uploadModal:{title:"Upload 3MF Files",dragDrop:"Drag & drop .3mf files here",or:"or",browseFiles:"Browse Files",extractionInfo:"The printer model will be automatically extracted from the 3MF file metadata.",uploaded:"uploaded",failed:"failed",uploading:"Uploading...",upload:"Upload",uploadFailed:"Upload failed"},editArchive:{title:"Edit Archive",name:"Name",namePlaceholder:"Print name",printer:"Printer",noPrinter:"No printer",project:"Project",noProject:"No project",itemsPrinted:"Items Printed",itemsPrintedHelp:"Number of items produced in this print job",notes:"Notes",notesPlaceholder:"Add notes about this print...",externalLink:"External Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link to Printables, Thingiverse, or other source",tags:"Tags",tagsPlaceholder:"Add tags...",addMoreTags:"Add more tags...",matchingTags:'Matching "{{query}}"',existingTags:"Existing tags",clickToAdd:"(click to add)",status:"Status",failureReason:"Failure Reason",selectReason:"Select reason...",photos:"Photos of Printed Result",photosHelp:"Click + to add photos of your printed result",printResult:"Print result",saving:"Saving...",failureReasons:{adhesionFailure:"Adhesion failure",spaghettiDetached:"Spaghetti / Detached",layerShift:"Layer shift",cloggedNozzle:"Clogged nozzle",filamentRunout:"Filament runout",warping:"Warping",stringing:"Stringing",underExtrusion:"Under-extrusion",powerFailure:"Power failure",userCancelled:"User cancelled",other:"Other"},statuses:{completed:"Completed",failed:"Failed",aborted:"Cancelled",printing:"Printing"}},kProfiles:{title:"K-Profiles",noPrintersConfigured:"No Printers Configured",addPrinterInSettings:"Add a printer in Settings to manage K-profiles",noActivePrinters:"No Active Printers",enablePrinterConnection:"Enable a printer connection to view its K-profiles",loadingProfiles:"Loading K-Profiles...",printerOffline:"Printer Offline",printerOfflineDesc:"The selected printer is not connected. Power it on to view K-profiles.",noMatchingProfiles:"No Matching Profiles",noMatchingProfilesDesc:"No profiles match your search criteria",noKProfiles:"No K-Profiles",noKProfilesDesc:"No pressure advance profiles found for {{diameter}}mm nozzle",createFirstProfile:"Create First Profile",printer:"Printer",nozzle:"Nozzle",refresh:"Refresh",addProfile:"Add Profile",export:"Export",import:"Import",select:"Select",selectAll:"Select All",delete:"Delete",searchPlaceholder:"Search by name or filament...",allExtruders:"All Extruders",leftOnly:"Left Only",rightOnly:"Right Only",allFlow:"All Flow",hfOnly:"HF Only",sOnly:"S Only",sortName:"Sort: Name",sortKValue:"Sort: K-Value",sortFilament:"Sort: Filament",leftExtruder:"Left Extruder",rightExtruder:"Right Extruder",modal:{addTitle:"Add K-Profile",editTitle:"Edit K-Profile",profileName:"Profile Name",profileNamePlaceholder:"My PLA Profile",kValue:"K-Value",kValuePlaceholder:"0.020",kValueHelp:"Typical range: 0.01 - 0.06 for PLA, 0.02 - 0.10 for PETG",filament:"Filament",selectFilament:"Select filament...",noFilamentsHelp:"No filaments found. Create a K-profile in Bambu Studio first.",flowType:"Flow Type",highFlow:"High Flow",standard:"Standard",nozzleSize:"Nozzle Size",extruder:"Extruder",extruders:"Extruders",left:"Left",right:"Right",notes:"Notes (stored locally)",notesPlaceholder:"Add notes about this profile...",notesHelp:"Notes are saved in Bambuddy, not on the printer",syncing:"Syncing with printer...",savingExtruder:"Saving to extruder {{current}}/{{total}}...",pleaseWait:"Please wait"},deleteConfirm:{title:"Delete Profile",cannotUndo:"This cannot be undone",message:'Are you sure you want to delete "{{name}}" from the printer?'},bulkDelete:{title:"Delete Profiles",cannotUndo:"This cannot be undone",message:"Are you sure you want to delete {{count}} selected profiles from the printer?"},toast:{profileSaved:"K-profile saved",profilesSaved:"K-profile saved to {{count}} extruders",selectAtLeastOneExtruder:"Please select at least one extruder",profileDeleted:"K-profile deleted",profilesDeleted:"Deleted {{count}} profiles",exportedProfiles:"Exported {{count}} profiles",importedProfiles:"Imported {{count}} of {{total}} profiles",noProfilesToExport:"No profiles to export",invalidFileFormat:"Invalid file format",failedToParseImport:"Failed to parse import file",failedToSaveBatch:"Failed to save K-profiles",noteSaved:"Note saved",failedToSaveNote:"Failed to save note"},permission:{noRead:"You do not have permission to refresh profiles",noCreate:"You do not have permission to add profiles",noUpdate:"You do not have permission to update K-profiles",noDelete:"You do not have permission to delete K-profiles",noExport:"You do not have permission to export profiles",noImport:"You do not have permission to import profiles"}},virtualPrinter:{title:"Virtual Printer",running:"Running",stopped:"Stopped",description:{default:"Enable a virtual printer that appears in Bambu Studio and OrcaSlicer. Files sent to this printer will be archived directly without printing.",proxy:"Enable a proxy that relays slicer traffic to a real printer, allowing remote printing over any network."},enable:{title:"Enable Virtual Printer",visibleInSlicer:'Visible as "Bambuddy" in slicer discovery',proxyingTo:"Proxying to {{name}}",notActive:"Not active"},model:{title:"Printer Model",description:"Select which printer model to emulate.",restartWarning:"Changing the model will restart the virtual printer"},accessCode:{title:"Access Code",isSet:"Access code is set",notSet:"No access code set - required to enable",placeholder:"Enter 8-char code",placeholderChange:"Enter new code to change",hint:"Must be exactly 8 characters. Used by slicers to authenticate.",charCount:"({{count}}/8)"},targetPrinter:{title:"Target Printer",configured:"Proxy target configured",notConfigured:"No target printer selected - required for proxy mode",placeholder:"Select a printer...",hint:"Select the printer to proxy slicer traffic to. The printer must be in LAN mode.",noPrinters:"No printers configured. Add a printer first to use proxy mode."},remoteInterface:{title:"Slicer Network Interface",configured:"SSDP proxy enabled",optional:"Optional - for SSDP discovery across networks",placeholder:"Select interface for slicer network...",hint:"Select the network interface connected to the slicer. Enables automatic printer discovery in Bambu Studio."},mode:{title:"Mode",archive:"Archive",archiveDesc:"Archive files immediately",review:"Review",reviewDesc:"Review before archiving",queue:"Queue",queueDesc:"Archive and add to queue",proxy:"Proxy",proxyDesc:"Relay to real printer"},setupRequired:{title:"Setup Required",description:"The virtual printer feature requires additional system configuration before it will work. This includes port forwarding, firewall rules, and platform-specific settings.",readGuide:"Read the setup guide before enabling"},howItWorks:{title:"How it works",titleProxy:"How it works (Proxy Mode)",step1:"Complete the setup guide for your platform",step2:"Enable the virtual printer and set an access code",step3:'In Bambu Studio or OrcaSlicer, go to "Add Printer"',step4:'The "Bambuddy" printer should appear in the discovery list',step5:"Connect using the access code you set",step6:'When you "print" to Bambuddy, the 3MF file is archived instead',proxyStep1:"Select the target printer (must be in LAN mode)",proxyStep2:"For cross-network: select the slicer network interface",proxyStep3:"Enable the proxy - printer appears in slicer discovery via SSDP",proxyStep4:"Connect using the printer's access code",proxyStep5:"Print as normal - traffic is relayed through Bambuddy",proxyStep6:"Camera streaming requires NAT/IP forwarding (see docs)"},status:{title:"Status Details",printerName:"Printer Name",model:"Model",serialNumber:"Serial Number",mode:"Mode",pendingFiles:"Pending Files",targetPrinter:"Target Printer",ftpPort:"FTP Port",mqttPort:"MQTT Port",ftpConnections:"FTP Connections",mqttConnections:"MQTT Connections"},toast:{updated:"Virtual printer settings updated",failedToUpdate:"Failed to update settings",accessCodeRequired:"Please set an access code first",targetPrinterRequired:"Please select a target printer first",accessCodeEmpty:"Access code cannot be empty",accessCodeLength:"Access code must be exactly 8 characters"}},modelViewer:{openInSlicer:"Open in Slicer",tabs:{model:"3D Model",gcode:"G-code Preview"},notAvailable:"not available",notSliced:"not sliced",plates:"Plates",allPlates:"All Plates",plateNumber:"Plate {{number}}",plateCount:"{{count}} plate",plateCount_other:"{{count}} plates",objectCount:"{{count}} object",objectCount_other:"{{count}} objects",filamentCount:"{{count}} filament",filamentCount_other:"{{count}} filaments",eta:"ETA {{minutes}} min",noPreview:"No preview available for this file",pagination:{pageOf:"Page {{current}} of {{total}}",prev:"Prev",next:"Next"},errors:{failedToLoad:"Failed to load file",noMeshes:"No meshes found in 3MF file",unsupportedFormat:"Unsupported file format"}},maintenanceDescriptions:{lubricateRails:"Apply lubricant to linear rails for smooth motion",cleanNozzle:"Clean hotend and nozzle to prevent clogs",checkBelts:"Verify belt tension for accurate prints",cleanBuildPlate:"Clean build plate for better adhesion",checkExtruder:"Inspect extruder gears for wear",checkCooling:"Ensure cooling fans are working properly",generalInspection:"General printer inspection",cleanCarbonRods:"Clean carbon rods to reduce friction",checkPtfeTube:"Inspect PTFE tube for wear or damage",replaceHepaFilter:"Replace HEPA filter for air quality",replaceCarbonFilter:"Replace activated carbon filter",lubricateLeftNozzleRail:"Lubricate left nozzle rail (H2 series)"}},fle={nav:{printers:"Drucker",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",projects:"Projekte",files:"Dateimanager",settings:"Einstellungen",system:"System",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",updateAvailableBanner:"Version {{version}} ist verfügbar!",viewUpdate:"Update anzeigen",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln",smartSwitches:"Smart Switches",logout:"Abmelden"},common:{save:"Speichern",saving:"Speichern...",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",days:"Tage",enable:"Aktivieren",disable:"Deaktivieren",permissions:"Berechtigungen",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",linkNotFound:"Link nicht gefunden",required:"Erforderlich",optional:"Optional",dismiss:"Schließen",apply:"Anwenden",reset:"Zurücksetzen",clear:"Leeren",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",noChange:"— Keine Änderung —",unchanged:"Unverändert",unassigned:"Nicht zugewiesen",unknown:"Unbekannt",unknownError:"Unbekannter Fehler",today:"Heute",asap:"Sofort",overdue:"Überfällig",now:"Jetzt",collapse:"Einklappen",expand:"Ausklappen",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",addedBy:"Hinzugefügt von {{username}}",prints:"Drucke",more:"+{{count}} weitere",ascending:"Aufsteigend",descending:"Absteigend",printer:"Drucker",remove:"Entfernen",type:"Typ",print:"Drucken",rename:"Umbenennen",move:"Verschieben",create:"Erstellen",duplicate:"Duplizieren",left:"Links",right:"Rechts"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig",sort:{name:"Name",status:"Status",model:"Modell",location:"Standort",ascending:"Aufsteigend sortieren",descending:"Absteigend sortieren"},cardSize:{small:"Kleine Karten",medium:"Mittlere Karten",large:"Große Karten",extraLarge:"Extra große Karten"},hideOffline:"Offline ausblenden",powerOn:"Einschalten",offlinePrintersWithPlugs:"Offline-Drucker mit Smart-Plugs",noPrintersConfigured:"Noch keine Drucker konfiguriert",readyToPrint:"Druckbereit",external:"Extern",deleteArchives:"Druckarchive löschen",noLabel:"Keine Bezeichnung",printPreview:"Druckvorschau",width:"Breite",height:"Höhe",noObjectsFound:"Keine Objekte gefunden",objectsLoadedOnPrintStart:"Objekte werden beim Druckstart geladen",willBeSkipped:"Wird übersprungen",name:"Name",serialCannotBeChanged:"Seriennummer kann nicht geändert werden",locationHelp:"Dient zur Gruppierung von Druckern und zum Filtern von Warteschlangenaufträgen",wifiSignal:{veryWeak:"Sehr schwach",weak:"Schwach",fair:"Ausreichend",good:"Gut",excellent:"Ausgezeichnet"},maintenanceUpToDate:"Alle Wartungen aktuell - Klicken zum Anzeigen",chamberLightOn:"Kammerbeleuchtung einschalten",chamberLightOff:"Kammerbeleuchtung ausschalten",browseFiles:"Druckerdateien durchsuchen",autoOffAfterPrint:"Automatisches Ausschalten nach Druck",autoOffExecuted:"Auto-off wurde ausgeführt - Drucker einschalten zum Zurücksetzen",hmsErrors:"HMS-Fehler",viewHmsErrors:"{{count}} HMS-Fehler anzeigen",resume:"Fortsetzen",pause:"Pausieren",stop:"Stoppen",camera:"Kamera",skipObject:"Objekt überspringen",reconnect:"Neu verbinden",mqttDebug:"MQTT-Debug",activeNozzle:"Aktiv: {{nozzle}} Düse",firmwareUpdate:"Firmware-Update",firmwareInstructions:"Gehen Sie auf dem Touchscreen des Druckers zu",firmwareNav:"Navigieren Sie zu",settings:"Einstellungen",firmware:"Firmware",discoverPrinters:"Drucker entdecken",searching:"Suche...",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",toast:{printerDeleted:"Drucker gelöscht",printerAdded:"Drucker hinzugefügt",printerUpdated:"Drucker aktualisiert",failedToDelete:"Drucker konnte nicht gelöscht werden",failedToAdd:"Drucker konnte nicht hinzugefügt werden",failedToUpdate:"Drucker konnte nicht aktualisiert werden",commandSent:"Befehl gesendet",failedToSendCommand:"Befehl konnte nicht gesendet werden",turnedOn:"{{name}} eingeschaltet",failedToPowerOn:"{{name}} konnte nicht eingeschaltet werden",scriptTriggered:"Skript ausgelöst",printStopped:"Druck gestoppt",printPaused:"Druck pausiert",printResumed:"Druck fortgesetzt",referenceDeleted:"Referenz gelöscht",detectionAreaSaved:"Erkennungsbereich gespeichert",failedToRunScript:"Skript konnte nicht ausgeführt werden",failedToStopPrint:"Druck konnte nicht gestoppt werden",failedToPausePrint:"Druck konnte nicht pausiert werden",failedToResumePrint:"Druck konnte nicht fortgesetzt werden",failedToControlChamberLight:"Kammerbeleuchtung konnte nicht gesteuert werden",failedToUpdateSetting:"Einstellung konnte nicht aktualisiert werden",failedToSkipObjects:"Objekte konnten nicht übersprungen werden",failedToRereadRfid:"RFID konnte nicht erneut gelesen werden",failedToCheckPlate:"Platte konnte nicht überprüft werden",failedToUpdateLabel:"Bezeichnung konnte nicht aktualisiert werden",failedToDeleteReference:"Referenz konnte nicht gelöscht werden",failedToSaveDetectionArea:"Erkennungsbereich konnte nicht gespeichert werden",plateCheckEnabled:"Plattenprüfung aktiviert",plateCheckDisabled:"Plattenprüfung deaktiviert",calibrationSaved:"Kalibrierung gespeichert!",calibrationFailed:"Kalibrierung fehlgeschlagen",rfidRereadInitiated:"RFID-Neueinlesen gestartet"},connection:{connected:"Verbunden",offline:"Offline"},queue:{inQueue:"{{count}} Druck in Warteschlange",inQueue_plural:"{{count}} Drucke in Warteschlange"},controls:"Steuerung",rfid:{reread:"RFID neu lesen"},permission:{noAdd:"Sie haben keine Berechtigung, Drucker hinzuzufügen",noEdit:"Sie haben keine Berechtigung, Drucker zu bearbeiten",noDelete:"Sie haben keine Berechtigung, Drucker zu löschen",noControl:"Sie haben keine Berechtigung, Drucker zu steuern",noFiles:"Sie haben keine Berechtigung, auf Druckerdateien zuzugreifen",noAmsRfid:"Sie haben keine Berechtigung, AMS-RFID erneut zu lesen",noSmartPlugControl:"Sie haben keine Berechtigung, Smart Plugs zu steuern"},modal:{addTitle:"Drucker hinzufügen",editTitle:"Drucker bearbeiten",myPrinter:"Mein Drucker",selectModel:"Modell auswählen...",locationGroup:"Standort / Gruppe (optional)",locationPlaceholder:"z.B. Werkstatt, Büro, Keller",autoArchiveLabel:"Abgeschlossene Drucke automatisch archivieren",fromPrinterSettings:"Aus Druckereinstellungen",modelOptional:"Modell (optional)",saveChanges:"Änderungen speichern"},skipObjects:{tooltip:"Objekte überspringen",onlyWhilePrinting:"Objekte überspringen (nur während des Drucks)",requiresMultiple:"Objekte überspringen (erfordert 2+ Objekte)",title:"Objekte überspringen",matchIdsInfo:"IDs mit Drucker-Display abgleichen",printerShowsIds:"Der Druckerbildschirm zeigt Objekt-IDs auf der Bauplatte",skipSelected:"Ausgewählte überspringen",skipping:"Überspringe...",noObjectsSelected:"Keine Objekte ausgewählt",selectObjectsToSkip:"Wählen Sie Objekte aus, die Sie vom aktuellen Druck überspringen möchten",skipped:"übersprungen",objectsSkipped:"Objekte übersprungen",activeCount:"{{count}} aktiv",waitForLayer:"Warten Sie auf Schicht 2+ zum Überspringen von Objekten (aktuell Schicht {{layer}})",skip:"Überspringen"},confirm:{deleteTitle:"Drucker löschen",deleteMessage:'Möchten Sie "{{name}}" wirklich löschen? Alle Verbindungseinstellungen werden entfernt.',deleteArchivesNote:"Der gesamte Druckverlauf für diesen Drucker wird dauerhaft gelöscht.",keepArchivesNote:"Der Druckverlauf wird beibehalten, aber nicht mehr mit diesem Drucker verknüpft.",stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich stoppen? Der Druckauftrag wird abgebrochen.',stopButton:"Druck stoppen",pauseTitle:"Druck pausieren",pauseMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich pausieren?',pauseButton:"Druck pausieren",resumeTitle:"Druck fortsetzen",resumeMessage:'Möchten Sie den Druck auf "{{name}}" fortsetzen?',resumeButton:"Druck fortsetzen",powerOnTitle:"Drucker einschalten",powerOnMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich EINSCHALTEN?',powerOnButton:"Einschalten",powerOffTitle:"Drucker ausschalten",powerOffMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich AUSSCHALTEN?',powerOffWarning:'WARNUNG: "{{name}}" druckt gerade! Möchten Sie die Stromversorgung wirklich AUSSCHALTEN? Dies unterbricht den Druck und kann den Drucker beschädigen.',powerOffButton:"Ausschalten"},discovery:{title:"Drucker entdecken",searching:"Suche...",scanning:"Scanne...",scanProgress:"Scanne... {{scanned}}/{{total}}",foundPrinters:"{{count}} Drucker gefunden",noPrintersFound:"Keine Drucker gefunden",noPrintersFoundSubnet:"Keine Drucker im angegebenen Subnetz gefunden.",noPrintersFoundNetwork:"Keine Drucker im Netzwerk gefunden.",allConfigured:"Alle erkannten Drucker sind bereits konfiguriert.",alreadyAdded:"Bereits hinzugefügt",select:"Auswählen",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",subnetToScan:"Zu scannendes Subnetz",dockerNote:"Docker erkannt. Geben Sie das Subnetz Ihres Druckers in CIDR-Notation ein. Erfordert network_mode: host in docker-compose.yml.",scanSubnet:"Subnetz nach Druckern scannen",discoverNetwork:"Drucker im Netzwerk suchen",scanningSubnet:"Subnetz wird nach Bambu-Druckern gescannt...",scanningNetwork:"Netzwerk wird gescannt...",serialRequired:"Seriennummer erforderlich",unknown:"Unbekannt",failedToStart:"Erkennung konnte nicht gestartet werden"},filaments:"Filamente",openCameraOverlay:"Kamera-Overlay öffnen",openCameraWindow:"Kamera in neuem Fenster öffnen",firmwareUpdateAvailable:"Firmware-Update verfügbar: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"Sie haben keine Berechtigung, Drucker zu aktualisieren",enabledClick:"Plattenprüfung aktiviert - Klicken zum Deaktivieren",disabledClick:"Plattenprüfung deaktiviert - Klicken zum Aktivieren",manageCalibration:"Platten-Erkennungskalibrierung verwalten",calibrationRequired:"Kalibrierung erforderlich",calibrationInstructions:"Bitte stellen Sie sicher, dass die Druckplatte vollständig leer ist, und klicken Sie dann auf Kalibrieren.",calibrationDescription:"Die Kalibrierung erfasst ein Referenzbild der leeren Platte. Zukünftige Prüfungen vergleichen mit dieser Referenz, um Objekte zu erkennen.",calibrationTip:"Tipp: Sie können bis zu 5 Kalibrierungen für verschiedene Platten speichern. Das System verwendet automatisch die beste Übereinstimmung bei der Prüfung.",plateEmpty:"Platte erscheint leer",objectsDetected:"Objekte auf Platte erkannt",confidence:"Konfidenz",difference:"Differenz",analysisPreview:"Analysevorschau:",analysisLegend:"Grüner Rahmen = Erkennungsbereich, Rote Überlagerung = Unterschiede zur Kalibrierung",savedReferences:"Gespeicherte Referenzen ({{count}}/{{max}})",deleteReference:"Referenz löschen",labelPlaceholder:"Bezeichnung...",clickToEdit:"{{label}} - Zum Bearbeiten klicken",clickToAddLabel:"Zum Hinzufügen einer Bezeichnung klicken"},fans:{partCooling:"Bauteilkühlung",auxiliary:"Hilfsventilator",chamber:"Kammerventilator"},clickToViewHmsErrors:"Klicken, um HMS-Fehler anzuzeigen",estimatedCompletion:"Geschätzte Fertigstellungszeit",slotOptions:"Slot-Optionen",firmwareModal:{title:"Firmware-Update",currentVersion:"Aktuell:",latestVersion:"Neueste:",releaseNotes:"Versionshinweise",checkingPrereqs:"Prüfe Voraussetzungen...",sdCardReady:"SD-Karte bereit. Klicken Sie unten, um die Firmware hochzuladen.",uploadedSuccess:"Firmware auf SD-Karte hochgeladen!",applyInstructions:"So wenden Sie das Update auf Ihrem Drucker an:",step1:"Gehen Sie auf dem Touchscreen des Druckers zu Einstellungen",step2:"Navigieren Sie zu Firmware",step3:"Wählen Sie Update von SD-Karte",step4:"Das Update dauert 10-20 Minuten",done:"Fertig",starting:"Starte...",uploadFirmware:"Firmware hochladen",uploadedToast:"Firmware hochgeladen! Starten Sie das Update vom Druckerbildschirm."},accessCodePlaceholder:"Leer lassen, um den aktuellen zu behalten",roi:{title:"Erkennungsbereich (ROI)",xStart:"X-Start",yStart:"Y-Start",width:"Breite",height:"Höhe",instruction:"Passen Sie den Erkennungsbereich an, um sich auf die Druckplatte zu konzentrieren. Der grüne Rahmen in der Vorschau zeigt den aktuellen Bereich."}},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",sortLargest:"Größte zuerst",sortSmallest:"Kleinste zuerst",sortSize:"Größe",noArchives:"Keine Archive gefunden",noArchivesSearch:"Keine Archive entsprechen Ihrer Suche",noArchivesYet:"Noch keine Archive",loadingArchives:"Lade Archive...",releaseToUpload:"Loslassen zum Hochladen",showAll:"Alle anzeigen",showFavoritesOnly:"Nur Favoriten anzeigen",gridView:"Rasteransicht",listView:"Listenansicht",calendarView:"Kalenderansicht",manageTags:"Tags verwalten",showFailedPrints:"Fehlgeschlagene Drucke anzeigen",hideFailedPrints:"Fehlgeschlagene Drucke ausblenden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"},toast:{source3mfAttached:"Quell-3MF angehängt: {{filename}}",failedUploadSource3mf:"Fehler beim Hochladen der Quell-3MF",source3mfRemoved:"Quell-3MF entfernt",failedRemoveSource3mf:"Fehler beim Entfernen der Quell-3MF",f3dAttached:"F3D angehängt: {{filename}}",failedUploadF3d:"Fehler beim Hochladen der F3D",f3dRemoved:"F3D entfernt",failedRemoveF3d:"Fehler beim Entfernen der F3D",timelapseAttached:"Zeitraffer angehängt: {{filename}}",timelapseAlreadyAttached:"Zeitraffer bereits angehängt",noMatchingTimelapse:"Kein passender Zeitraffer gefunden",failedScanTimelapse:"Fehler beim Suchen nach Zeitraffer",failedAttachTimelapse:"Fehler beim Anhängen des Zeitraffers",archiveDeleted:"Archiv gelöscht",failedDeleteArchive:"Fehler beim Löschen des Archivs",addedToFavorites:"Zu Favoriten hinzugefügt",removedFromFavorites:"Aus Favoriten entfernt",projectUpdated:"Projekt aktualisiert",failedUpdateProject:"Fehler beim Aktualisieren des Projekts",linkCopied:"Link in die Zwischenablage kopiert",failedCopyLink:"Fehler beim Kopieren des Links",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos",failedDeleteArchives:"Fehler beim Löschen der Archive",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen"},menu:{print:"Drucken",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",slice:"Slicen",externalLink:"Externer Link",viewOnMakerWorld:"Auf MakerWorld ansehen",preview3d:"3D-Vorschau",viewTimelapse:"Zeitraffer ansehen",scanForTimelapse:"Nach Zeitraffer suchen",downloadSource3mf:"Quell-3MF herunterladen",uploadSource3mf:"Quell-3MF hochladen",replaceSource3mf:"Quell-3MF ersetzen",removeSource3mf:"Quell-3MF entfernen",uploadF3d:"F3D hochladen",replaceF3d:"F3D ersetzen",downloadF3d:"F3D herunterladen",removeF3d:"F3D entfernen",download:"Herunterladen",copyDownloadLink:"Download-Link kopieren",qrCode:"QR-Code",viewPhotos:"Fotos ansehen",viewPhotosCount:"Fotos ansehen ({{count}})",projectPage:"Projektseite",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",edit:"Bearbeiten",goToProject:"Zum Projekt: {{name}}",addToProject:"Zu Projekt hinzufügen",removeFromProject:"Aus Projekt entfernen",loading:"Laden...",noProjectsAvailable:"Keine Projekte verfügbar",select:"Auswählen",deselect:"Abwählen",delete:"Löschen"},permission:{noReprint:"Sie haben keine Berechtigung, dieses Archiv erneut zu drucken",noAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noUpdateArchives:"Sie haben keine Berechtigung, Archive zu aktualisieren",noUploadFiles:"Sie haben keine Berechtigung, Dateien hochzuladen",noDownload:"Sie haben keine Berechtigung, Archive herunterzuladen",noCopyLink:"Sie haben keine Berechtigung, Download-Links zu kopieren",noDelete:"Sie haben keine Berechtigung, dieses Archiv zu löschen",noCreate:"Sie haben keine Berechtigung, Archive zu erstellen"},card:{previousPlate:"Vorherige Platte",nextPlate:"Nächste Platte",plateNumber:"Platte {{index}}",moreOptions:"Rechtsklick für mehr Optionen",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",cancelled:"abgebrochen",failed:"fehlgeschlagen",duplicate:"Duplikat",duplicateTitle:"Dieses Modell wurde bereits zuvor gedruckt",openSource3mf:"Quell-3MF in Bambu Studio öffnen (Rechtsklick für mehr Optionen)",downloadF3d:"Fusion 360 Designdatei herunterladen",viewTimelapse:"Zeitraffer ansehen",viewPhoto:"1 Foto ansehen",viewPhotos:"{{count}} Fotos ansehen",openFolder:"Ordner öffnen: {{name}}",slicedFile:"Geslicte Datei - druckbereit",sourceFile:"Nur Quelldatei - keine AMS-Zuordnung verfügbar",gcode:"GCODE",source:"QUELLE",project:"Projekt: {{name}}",estimated:"Geschätzt: {{time}}",actual:"Tatsächlich: {{time}}",accuracy:"Genauigkeit: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} Schicht",layers:"{{count}} Schichten",object:"{{count}} Objekt",objects:"{{count}} Objekte",slicedFor:"Geslict für {{model}}",uploadedBy:"Hochgeladen von",noPermissionReprint:"Sie haben keine Berechtigung, erneut zu drucken",noPermissionEdit:"Sie haben keine Berechtigung, Archive zu bearbeiten",noPermissionDelete:"Sie haben keine Berechtigung, Archive zu löschen",reprint:"Drucken",schedulePrint:"Druck planen",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",openInBambuStudioToSlice:"In Bambu Studio öffnen zum Slicen",slice:"Slicen",externalLink:"Externer Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"Projekt ansehen",noExternalLink:"Kein externer Link",preview3d:"3D-Vorschau",download:"Herunterladen",edit:"Bearbeiten",delete:"Löschen"},modal:{deleteArchive:"Archiv löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',deleteButton:"Löschen",removeSource3mf:"Quell-3MF entfernen",removeSource3mfConfirm:'Möchten Sie die Quell-3MF-Datei wirklich von "{{name}}" entfernen? Die ursprüngliche Slicer-Projektdatei wird gelöscht.',removeButton:"Entfernen",removeF3d:"F3D entfernen",removeF3dConfirm:'Möchten Sie die Fusion 360 Designdatei wirklich von "{{name}}" entfernen?',timelapse:"{{name}} - Zeitraffer",selectTimelapse:"Zeitraffer auswählen",selectTimelapseDesc:"Keine automatische Übereinstimmung gefunden. Wählen Sie den Zeitraffer für diesen Druck:",deleteArchives:"Archive löschen",deleteArchivesConfirm:"Möchten Sie wirklich {{count}} Archiv(e) löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleteCount:"{{count}} löschen"},page:{title:"Archive",printsCount:"{{filtered}} von {{total}} Drucken",dropFilesHere:".3mf-Dateien hier ablegen",releaseToUpload:"Loslassen zum Hochladen",only3mfSupported:"Nur .3mf-Dateien werden unterstützt",close:"Schließen",selected:"{{count}} ausgewählt",selectAll:"Alle auswählen",tags:"Tags",project:"Projekt",favorite:"Favorit",delete:"Löschen",toggledFavorites:"Favoriten für {{count}} Archiv(e) umgeschaltet",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",archivesDeleted:"{{count}} Archiv(e) gelöscht",failedDeleteArchives:"Fehler beim Löschen der Archive",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos"},list:{name:"Name",printer:"Drucker",date:"Datum",size:"Größe",actions:"Aktionen",hasTimelapse:"Hat Zeitraffer"}},queue:{title:"Druckwarteschlange",subtitle:"Planen und verwalten Sie Ihre Druckaufträge",addToQueue:"Zur Warteschlange hinzufügen",print:"Drucken",reprint:"Erneut drucken",schedulePrint:"Druck planen",editQueueItem:"Warteschlangeneintrag bearbeiten",printToPrinters:"Auf {{count}} Druckern drucken",queueToPrinters:"Zu {{count}} Druckern hinzufügen",sending:"Wird gesendet...",sendingProgress:"Sende {{current}}/{{total}}...",adding:"Wird hinzugefügt...",addingProgress:"Füge hinzu {{current}}/{{total}}...",savingProgress:"Speichere {{current}}/{{total}}...",clearQueue:"Warteschlange leeren",clearHistory:"Verlauf löschen",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",startNow:"Jetzt starten",printingInProgress:"Druck läuft...",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",itemCount:"{{count}} Element",itemCount_plural:"{{count}} Elemente",dragToReorder:"Ziehen zum Neuordnen (nur Sofort)",reorderHint:"Position betrifft nur Sofort-Elemente. Geplante Elemente werden zur festgelegten Zeit ausgeführt.",addedBy:"Hinzugefügt von {{name}}",sections:{currentlyPrinting:"Aktuell druckend",queued:"In Warteschlange",history:"Verlauf"},status:{pending:"Ausstehend",waiting:"Wartend",printing:"Druckt",paused:"Pausiert",completed:"Abgeschlossen",failed:"Fehlgeschlagen",skipped:"Übersprungen",cancelled:"Abgebrochen"},summary:{printing:"Druckt",queued:"In Warteschlange",totalTime:"Gesamte Wartezeit",history:"Verlauf"},filter:{allPrinters:"Alle Drucker",unassigned:"Nicht zugewiesen",allStatus:"Alle Status",allLocations:"Alle Standorte",any:"Beliebig"},sort:{byPosition:"Nach Position sortieren",byName:"Nach Name sortieren",byPrinter:"Nach Drucker sortieren",bySchedule:"Nach Zeitplan sortieren",byDate:"Nach Datum sortieren",ascendingOldest:"Aufsteigend (älteste zuerst)",descendingNewest:"Absteigend (neueste zuerst)"},badges:{staged:"Bereitgestellt",requiresPrevious:"Erfordert vorherigen Erfolg",autoPowerOff:"Automatisch ausschalten"},empty:{title:"Keine Drucke geplant",description:'Planen Sie einen Druck von der Archivseite über die Option "Planen" im Kontextmenü oder ziehen Sie Dateien hierher.'},time:{asap:"Sofort",overdue:"Überfällig",now:"Jetzt",lessThanMinute:"In weniger als einer Minute",inMinutes:"In {{count}} Min",inHours:"In {{count}} Stunden"},actions:{stopPrint:"Druck stoppen",startPrint:"Druck starten",requeue:"Erneut einreihen"},bulkEdit:{title:"{{count}} Element bearbeiten",title_plural:"{{count}} Elemente bearbeiten",description:"Nur geänderte Einstellungen werden auf ausgewählte Elemente angewendet.",printer:"Drucker",noChange:"— Keine Änderung —",queueOptions:"Warteschlangenoptionen",staged:"Bereitgestellt (manueller Start)",autoPowerOff:"Nach Druck automatisch ausschalten",requirePrevious:"Vorherigen Erfolg erfordern",printOptions:"Druckoptionen",bedLevelling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",useAms:"AMS verwenden",applyChanges:"Änderungen übernehmen",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",editSelected:"Ausgewählte bearbeiten",cancelSelected:"Ausgewählte abbrechen"},confirm:{cancelTitle:"Geplanten Druck abbrechen",cancelMessage:'Möchten Sie "{{name}}" wirklich abbrechen?',stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck "{{name}}" wirklich stoppen? Der Druckauftrag wird am Drucker abgebrochen.',removeTitle:"Aus Verlauf entfernen",removeMessage:'Möchten Sie "{{name}}" wirklich aus dem Warteschlangenverlauf entfernen?',clearHistoryTitle:"Verlauf löschen",clearHistoryMessage:"Möchten Sie alle {{count}} Element(e) aus dem Verlauf entfernen?",cancelButton:"Druck abbrechen",stopButton:"Druck stoppen",thisPrint:"diesen Druck",thisItem:"dieses Element"},toast:{cancelled:"Warteschlangenelement abgebrochen",cancelFailed:"Element konnte nicht abgebrochen werden",removed:"Warteschlangenelement entfernt",removeFailed:"Element konnte nicht entfernt werden",stopped:"Druck gestoppt",stopFailed:"Druck konnte nicht gestoppt werden",released:"Druck in Warteschlange freigegeben",startFailed:"Druck konnte nicht gestartet werden",reorderFailed:"Warteschlange konnte nicht neu geordnet werden",historyCleared:"{{count}} Verlaufselement(e) gelöscht",clearHistoryFailed:"Verlauf konnte nicht gelöscht werden",updateFailed:"Elemente konnten nicht aktualisiert werden",bulkCancelled:"{{count}} Element(e) abgebrochen",bulkCancelFailed:"Elemente konnten nicht abgebrochen werden"},permissions:{noStopPrint:"Sie haben keine Berechtigung, Drucke zu stoppen",noStartPrint:"Sie haben keine Berechtigung, Drucke zu starten",noEdit:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu bearbeiten",noCancel:"Sie haben keine Berechtigung, dieses Warteschlangenelement abzubrechen",noRequeue:"Sie haben keine Berechtigung, Elemente erneut einzureihen",noRemove:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu entfernen",noClearHistory:"Sie haben keine Berechtigung, den gesamten Verlauf zu löschen",noEditItems:"Sie haben keine Berechtigung, Warteschlangenelemente zu bearbeiten",noCancelItems:"Sie haben keine Berechtigung, Warteschlangenelemente abzubrechen"}},stats:{title:"Dashboard",subtitle:"Widgets zum Neuanordnen ziehen. Auf das Augensymbol klicken zum Ausblenden.",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",printTime:"Druckzeit",totalFilament:"Gesamtverbrauch Filament",filamentUsed:"Filamentverbrauch",filamentCost:"Filamentkosten",totalCost:"Gesamtkosten",energyUsed:"Energieverbrauch",energyCost:"Energiekosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",printsByPrinter:"Drucke nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt",quickStats:"Schnellstatistiken",printActivity:"Druckaktivität",filamentTypes:"Filamenttypen",filamentTrends:"Filamenttrends",failureAnalysis:"Fehleranalyse",timeAccuracy:"Zeitgenauigkeit",successful:"Erfolgreich:",failed:"Fehlgeschlagen:",perfectEstimate:"100% = perfekte Schätzung",noTimeAccuracyData:"Noch keine Zeitgenauigkeitsdaten",noFilamentData:"Keine Filamentdaten verfügbar",noPrinterData:"Keine Druckerdaten verfügbar",noPrintData:"Keine Druckdaten verfügbar",noPrintDataLast30Days:"Keine Druckdaten in den letzten 30 Tagen",failureReasons:"Fehlerursachen",topFailureReasons:"Häufigste Fehlerursachen",failedPrintsCount:"{{failed}} / {{total}} Drucke fehlgeschlagen",lastWeekRate:"Letzte Woche: {{rate}}%",resetLayout:"Layout zurücksetzen",recalculateCosts:"Kosten neu berechnen",recalculateCostsHint:"Alle Archivkosten mit aktuellen Filamentpreisen neu berechnen",exportStats:"Statistiken exportieren",exportAsCsv:"Als CSV exportieren",exportAsExcel:"Als Excel exportieren",hiddenCount:"{{count}} ausgeblendet",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen",layoutReset:"Layout zurückgesetzt",recalculatedCosts:"Kosten für {{count}} Archive neu berechnet",recalculateFailed:"Kosten konnten nicht neu berechnet werden",loadingStats:"Statistiken werden geladen...",noPermissionResetLayout:"Sie haben keine Berechtigung, das Layout zurückzusetzen",noPermissionRecalculate:"Sie haben keine Berechtigung, Kosten neu zu berechnen"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",statusTab:"Status",settingsTab:"Einstellungen",overdueCount:"{{count}} überfällig",dueSoonCount:"{{count}} bald fällig",dueSoon:"Bald fällig",allGood:"Alles in Ordnung",overdueBy:"Überfällig um {{duration}}",dueIn:"Fällig in {{duration}}",timeLeft:"{{duration}} verbleibend",day:"1 Tag",days:"{{count}} Tage",week:"1 Woche",weeks:"{{count}} Wochen",month:"1 Monat",months:"{{count}} Monate",year:"1 Jahr",maintenanceTypes:"Wartungstypen",maintenanceTypesDescription:"Systemtypen und Ihre benutzerdefinierten Wartungsaufgaben",addCustomType:"Benutzerdefinierten Typ hinzufügen",intervalType:"Intervalltyp",intervalValue:"Intervall ({{type}})",icon:"Symbol",documentationLink:"Dokumentationslink (optional)",assignToPrinters:"Druckern zuweisen",selectAtLeastOnePrinter:"Wählen Sie mindestens einen Drucker",addType:"Typ hinzufügen",custom:"Benutzerdefiniert",printHours:"Druckstunden",calendarDays:"Kalendertage",exampleName:"z.B. HEPA-Filter ersetzen",viewDocumentation:"Dokumentation anzeigen",timeBasedInterval:"Zeitbasiertes Intervall",intervalOverrides:"Intervall-Überschreibungen",intervalOverridesDescription:"Intervalle für bestimmte Drucker anpassen",assignedToPrinters:"Druckern zugewiesen:",noPrintersAssigned:"Keine Drucker zugewiesen",addPrinterShort:"Hinzufügen:",printersAssignedClick:"{{count}} Drucker zugewiesen - klicken zum Verwalten",removeFromPrinter:"Von diesem Drucker entfernen",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion",cleanCarbonRods:"Kohlenstoffstangen reinigen",checkPtfeTube:"PTFE-Schlauch prüfen",replaceHepaFilter:"HEPA-Filter ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren"},maintenanceComplete:"Wartung als abgeschlossen markiert",typeUpdated:"Wartungstyp aktualisiert",typeDeleted:"Wartungstyp gelöscht",printHoursUpdated:"Druckstunden aktualisiert",printerAssigned:"Drucker zugewiesen",printerRemoved:"Drucker entfernt",deleteTypeConfirm:'"{{name}}" löschen?',noPermissionUpdate:"Sie haben keine Berechtigung, Wartungselemente zu aktualisieren",noPermissionPerform:"Sie haben keine Berechtigung, Wartungen durchzuführen",noPermissionEditTypes:"Sie haben keine Berechtigung, Wartungstypen zu bearbeiten",noPermissionDeleteTypes:"Sie haben keine Berechtigung, Wartungstypen zu löschen",noPermissionEditHours:"Sie haben keine Berechtigung, Druckstunden zu bearbeiten",noPermissionRemovePrinter:"Sie haben keine Berechtigung, Druckerzuweisungen zu entfernen",noPermissionAssignPrinter:"Sie haben keine Berechtigung, Drucker zuzuweisen",noPermissionEditIntervals:"Sie haben keine Berechtigung, Intervalle zu bearbeiten",configureSettings:"Wartungstypen und Intervalle konfigurieren"},settings:{title:"Einstellungen",general:"Allgemein",tabs:{general:"Allgemein",smartPlugs:"Smart Plugs",notifications:"Benachrichtigungen",filament:"Filament",network:"Netzwerk",apiKeys:"API-Schlüssel",virtualPrinter:"Virtueller Drucker",users:"Benutzer",backup:"Sicherung",globalEmail:"Globale E-Mail"},email:{smtpSettings:"SMTP-Konfiguration",smtpHost:"SMTP-Server",smtpPort:"SMTP-Port",security:"Sicherheit",authentication:"Authentifizierung",username:"Benutzername",password:"Passwort",fromEmail:"Absender-E-Mail",fromName:"Absendername",testConnection:"SMTP-Verbindung testen",testRecipient:"Test-Empfänger-E-Mail",sendTest:"Test-E-Mail senden",sending:"Wird gesendet...",save:"Einstellungen speichern",saving:"Wird gespeichert...",advancedAuth:"Erweiterte Authentifizierung",advancedAuthEnabled:"Erweiterte Authentifizierung ist aktiviert",advancedAuthDisabled:"Erweiterte Authentifizierung ist deaktiviert",advancedAuthDisabledDesc:"Aktivieren Sie die erweiterte Authentifizierung, um E-Mail-basierte Funktionen für die Benutzerverwaltung zu aktivieren.",enable:"Aktivieren",disable:"Deaktivieren",feature1:"Passwörter werden automatisch generiert und an neue Benutzer gesendet",feature2:"Benutzer können sich mit Benutzername oder E-Mail anmelden",feature3:"Passwort vergessen Funktion ist verfügbar",feature4:"Administratoren können Benutzerpasswörter per E-Mail zurücksetzen"},appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden",noDefaultPrinter:"Kein Standard (jedes Mal fragen)",sidebarOrder:"Seitenleisten-Reihenfolge",saveThumbnails:"Vorschaubilder speichern",captureFinishPhoto:"Abschlussfoto aufnehmen",noPrintersConfigured:"Keine Drucker konfiguriert",archiveMode:{always:"Immer Archiveintrag erstellen",never:"Nie Archiveintrag erstellen",ask:"Jedes Mal fragen"},checkForUpdatesLabel:"Nach Updates suchen",checkPrinterFirmware:"Drucker-Firmware prüfen",enableRetry:"Wiederholung aktivieren",homeAssistantDescription:"Smart Plugs über Home Assistant steuern",mqttConnectedTo:"Verbunden mit",prometheusDescription:"Druckerdaten im Prometheus-Format bereitstellen",noSmartPlugsTitle:"Keine Smart Plugs konfiguriert",noSmartPlugsDescription:"Fügen Sie einen Tasmota-basierten Smart Plug hinzu, um den Energieverbrauch zu verfolgen und die Stromsteuerung zu automatisieren.",noProvidersTitle:"Keine Anbieter konfiguriert",noProvidersDescription:"Fügen Sie einen Anbieter hinzu, um Benachrichtigungen zu erhalten.",noTemplatesAvailable:"Keine Vorlagen verfügbar. Starten Sie das Backend neu, um Standardvorlagen zu laden.",apiPermissionView:"Druckerstatus und Warteschlange anzeigen",apiPermissionEdit:"Elemente zur Druckwarteschlange hinzufügen und entfernen",apiKeysEmptyTitle:"Keine API-Schlüssel",apiKeysEmptyDescription:"Erstellen Sie einen API-Schlüssel zur Integration mit externen Diensten.",noUsersFound:"Keine Benutzer gefunden",noGroupsFound:"Keine Gruppen gefunden",noGroupsAvailable:"Keine Gruppen verfügbar",passwordsDoNotMatch:"Passwörter stimmen nicht überein",systemGroupWarning:"System-Gruppennamen können nicht geändert werden",authDisabledTitle:"Authentifizierung ist deaktiviert",authDisabledFeature1:"Anmeldung zum Zugriff auf das System erforderlich",authDisabledFeature2:"Mehrere Benutzer mit gruppenbasierten Berechtigungen erstellen",authDisabledFeature3:"Zugriff mit über 50 granularen Berechtigungen steuern",userHasCreated:"Dieser Benutzer hat erstellt:",userItemsQuestion:"Was möchten Sie mit diesen Elementen tun?",deleteUserConfirm:"Möchten Sie diesen Benutzer wirklich löschen?",actionCannotBeUndone:"Diese Aktion kann nicht rückgängig gemacht werden.",addFirstSmartPlug:"Ersten Smart Plug hinzufügen",providers:"Anbieter",log:"Protokoll",testAll:"Alle testen",testResults:"Testergebnisse",testPassedCount:"{{count}} bestanden",testFailedCount:"{{count}} fehlgeschlagen",messageTemplates:"Nachrichtenvorlagen",messageTemplatesDescription:"Passen Sie Benachrichtigungen für jedes Ereignis an.",apiKeys:"API-Schlüssel",apiKeysDescription:"Erstellen Sie API-Schlüssel für externe Integrationen und Webhooks.",createKey:"Schlüssel erstellen",apiKeyCreated:"API-Schlüssel erfolgreich erstellt",apiKeyCopyWarning:"Kopieren Sie diesen Schlüssel jetzt - er wird nicht mehr angezeigt!",useInApiBrowser:"Im API-Browser verwenden",createNewApiKey:"Neuen API-Schlüssel erstellen",keyName:"Schlüsselname",keyNamePlaceholder:"z.B. Home Assistant, OctoPrint",readStatus:"Status lesen",readStatusDescription:"Druckerstatus und Warteschlange anzeigen",manageQueue:"Warteschlange verwalten",manageQueueDescription:"Elemente zur Druckwarteschlange hinzufügen und entfernen",controlPrinter:"Drucker steuern",controlPrinterDescription:"Drucke pausieren, fortsetzen und stoppen",unnamedKey:"Unbenannter Schlüssel",lastUsed:"Zuletzt verwendet",read:"Lesen",control:"Steuern",createFirstKey:"Ersten Schlüssel erstellen",webhookEndpoints:"Webhook-Endpunkte",webhookApiKeyHint:"Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.",webhook:{getAllStatus:"Alle Druckerstatus abrufen",getSpecificStatus:"Spezifischen Druckerstatus abrufen",addToQueue:"Zur Druckwarteschlange hinzufügen",pausePrint:"Druck pausieren",resumePrint:"Druck fortsetzen",stopPrint:"Druck stoppen"},apiBrowser:"API-Browser",apiBrowserDescription:"Erkunden und testen Sie alle verfügbaren API-Endpunkte.",apiKeyForTesting:"API-Schlüssel zum Testen",apiKeyPlaceholder:"Fügen Sie hier Ihren API-Schlüssel ein, um authentifizierte Endpunkte zu testen...",apiKeyHint:"Dieser Schlüssel wird als X-API-Key-Header mit Anfragen gesendet.",deleteApiKeyTitle:"API-Schlüssel löschen",deleteApiKeyMessage:"Möchten Sie diesen API-Schlüssel wirklich löschen? Alle Integrationen, die diesen Schlüssel verwenden, funktionieren nicht mehr.",deleteKey:"Schlüssel löschen",amsDisplayThresholds:"AMS-Anzeigeschwellenwerte",amsThresholdsDescription:"Konfigurieren Sie Farbschwellenwerte für AMS-Feuchtigkeits- und Temperaturanzeigen.",humidity:"Luftfeuchtigkeit",goodGreen:"Gut (grün)",fairOrange:"Mittel (orange)",aboveFairBad:"Über dem mittleren Schwellenwert wird rot angezeigt (schlecht)",temperature:"Temperatur",goodBlue:"Gut (blau)",aboveFairHot:"Über dem mittleren Schwellenwert wird rot angezeigt (heiß)",historyRetention:"Verlaufsaufbewahrung",keepSensorHistory:"Sensorverlauf behalten für",historyRetentionDescription:"Ältere Feuchtigkeits- und Temperaturdaten werden automatisch gelöscht",printModal:"Druckdialog",expandCustomMapping:"Benutzerdefinierte Zuordnung standardmäßig erweitern",expandCustomMappingDescription:"Bei Druck auf mehrere Drucker die AMS-Zuordnung pro Drucker erweitert anzeigen",authentication:"Authentifizierung",authEnabledDescription:"Ihre Instanz ist mit Benutzerauthentifizierung gesichert",authDisabledDescription:"Aktivieren Sie die Anmeldepflicht und verwalten Sie den Benutzerzugriff",authDisabledMessage:"Aktivieren Sie die Authentifizierung, um Benutzerkonten zu erstellen, Berechtigungen zu verwalten und Ihre Bambuddy-Instanz zu sichern.",enableAuthentication:"Authentifizierung aktivieren",currentUser:"Aktueller Benutzer",changePassword:"Passwort ändern",admin:"Admin",users:"Benutzer",addUser:"Benutzer hinzufügen",groups:"Gruppen",addGroup:"Gruppe hinzufügen",system:"System",noDescription:"Keine Beschreibung",userCount:"{{count}} Benutzer",permissionCount:"{{count}} Berechtigungen",createUser:"Benutzer erstellen",username:"Benutzername",enterUsername:"Benutzername eingeben",password:"Passwort",enterPassword:"Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",viewReleaseOnGitHub:"Release auf GitHub anzeigen",turnAllPlugsOn:"Alle Stecker einschalten",turnAllPlugsOff:"Alle Stecker ausschalten",clearNotificationLogs:"Benachrichtigungsprotokolle löschen",clearLogsMessage:"Dadurch werden alle Benachrichtigungsprotokolle, die älter als 30 Tage sind, dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",clearLogs:"Protokolle löschen",resetUiPreferences:"UI-Einstellungen zurücksetzen",resetUiPreferencesMessage:"Dadurch werden alle UI-Einstellungen auf Standardwerte zurückgesetzt: Seitenleisten-Reihenfolge, Theme, Dashboard-Layout, Ansichtsmodi und Sortiereinstellungen. Ihre Drucker, Archive und Servereinstellungen werden NICHT beeinträchtigt. Die Seite wird nach dem Löschen neu geladen.",resetPreferences:"Einstellungen zurücksetzen",deleteGroupTitle:"Gruppe löschen",deleteGroupMessage:"Möchten Sie diese Gruppe wirklich löschen? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",deleteGroup:"Gruppe löschen",disableAuthenticationTitle:"Authentifizierung deaktivieren",disableAuthenticationMessage:"Möchten Sie die Authentifizierung wirklich deaktivieren? Dadurch wird Ihre Bambuddy-Instanz ohne Anmeldung zugänglich. Alle Benutzer bleiben in der Datenbank, aber die Authentifizierung wird deaktiviert.",disableAuthentication:"Authentifizierung deaktivieren",configureBambuddy:"Bambuddy konfigurieren",systemDefault:"Systemstandard",archiveSettings:"Archiv-Einstellungen",newWindow:"Neues Fenster",embeddedOverlay:"Eingebettetes Overlay",externalCameras:"Externe Kameras",costTracking:"Kostenverfolgung",printsOnly:"Nur Drucke",totalConsumption:"Gesamtverbrauch",dataManagement:"Datenverwaltung",clearNotificationLogsDescription:"Benachrichtigungsprotokolle älter als 30 Tage löschen",resetUiPreferencesDescription:"Seitenleisten-Reihenfolge, Theme, Ansichtsmodi und Layout-Einstellungen zurücksetzen. Drucker, Archive und Einstellungen werden nicht beeinflusst.",enableHomeAssistant:"Home Assistant aktivieren",enableMqtt:"MQTT aktivieren",useTls:"TLS verwenden",enableMetricsEndpoint:"Metrik-Endpunkt aktivieren",availableMetrics:"Verfügbare Metriken",editUser:"Benutzer bearbeiten",deleteUserTitle:"Benutzer löschen",groupName:"Gruppenname",leaveEmptyForAnonymous:"Leer lassen für anonym",leaveEmptyForNoAuth:"Leer lassen für keine Authentifizierung",enterNewPassword:"Neues Passwort eingeben",confirmNewPassword:"Neues Passwort bestätigen",enterGroupName:"Gruppenname eingeben",enterDescriptionOptional:"Beschreibung eingeben (optional)",enterCurrentPassword:"Aktuelles Passwort eingeben",enterNewPasswordMin6:"Neues Passwort eingeben (min. 6 Zeichen)",toast:{keyCopied:"Schlüssel in Zwischenablage kopiert",copyFailed:"Schlüssel konnte nicht kopiert werden",keyAddedToBrowser:"Schlüssel zum API-Browser hinzugefügt",clearLogsFailed:"Protokolle konnten nicht gelöscht werden",uiPreferencesReset:"UI-Einstellungen zurückgesetzt. Wird neu geladen...",authDisabled:"Authentifizierung erfolgreich deaktiviert",authDisableFailed:"Authentifizierung konnte nicht deaktiviert werden",apiKeyCreated:"API-Schlüssel erstellt",apiKeyDeleted:"API-Schlüssel gelöscht",userCreated:"Benutzer erfolgreich erstellt",userUpdated:"Benutzer erfolgreich aktualisiert",userDeleted:"Benutzer erfolgreich gelöscht",groupCreated:"Gruppe erfolgreich erstellt",groupUpdated:"Gruppe erfolgreich aktualisiert",groupDeleted:"Gruppe erfolgreich gelöscht",fillRequiredFields:"Bitte füllen Sie alle erforderlichen Felder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",enterGroupName:"Bitte geben Sie einen Gruppennamen ein",settingsSaved:"Einstellungen gespeichert",cameraSettingsSaved:"Kamera-Einstellungen gespeichert",enterCameraUrl:"Bitte geben Sie eine Kamera-URL ein",passwordChanged:"Passwort erfolgreich geändert",connectionFailed:"Verbindung fehlgeschlagen",testFailed:"Test fehlgeschlagen",cameraConnected:"Kamera verbunden{{resolution}}"},testConnection:"Verbindung testen"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},hmsErrors:{title:"Fehler - {{name}}",noErrors:"Keine Fehler",viewOnWiki:"Im Bambu Lab Wiki ansehen",clearInstructions:"Löschen Sie die Fehler am Drucker, um sie hier zu entfernen."},mqttDebug:{title:"MQTT-Debug-Protokoll",searchPlaceholder:"Topic oder Payload suchen...",noMessages:"Noch keine Nachrichten protokolliert",startLoggingHint:'Klicken Sie auf "Protokollierung starten", um MQTT-Nachrichten aufzuzeichnen',noMessagesMatch:"Keine Nachrichten entsprechen Ihrem Filter",adjustFilterHint:"Versuchen Sie, Ihre Such- oder Filterkriterien anzupassen",incoming:"Eingehend",outgoing:"Ausgehend",loggingStopped:"Protokollierung gestoppt",loggingActive:"Protokollierung aktiv - Nachrichten werden automatisch aktualisiert",startLogging:"Protokollierung starten",stopLogging:"Protokollierung stoppen",clearLog:"Protokoll löschen",topic:"Topic",timestamp:"Zeitstempel",direction:"Richtung",all:"Alle"},printerFiles:{title:"Dateimanager",storageUsed:"Belegt:",storageFree:"Frei:",filterPlaceholder:"Dateien filtern...",deleteButton:"Löschen",deleteFiles:"{{count}} Dateien löschen",deleteFileConfirm:'"{{name}}" löschen? Dies kann nicht rückgängig gemacht werden.',deleteFilesConfirm:"{{count}} ausgewählte Dateien löschen? Dies kann nicht rückgängig gemacht werden.",noFiles:"Keine Dateien auf dem Drucker",loadingFiles:"Dateien werden geladen...",failedToLoad:"Dateien konnten nicht geladen werden",toast:{filesDeleted:"{{count}} Datei(en) gelöscht",deleteFailed:"Löschen fehlgeschlagen: {{error}}"}},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"},login:{title:"Bambuddy Anmeldung",subtitle:"Melden Sie sich bei Ihrem Konto an",username:"Benutzername",usernamePlaceholder:"Benutzername eingeben",usernameOrEmail:"Benutzername oder E-Mail",usernameOrEmailPlaceholder:"Benutzername oder @ E-Mail",password:"Passwort",passwordPlaceholder:"Passwort eingeben",signIn:"Anmelden",signingIn:"Anmeldung läuft...",forgotPassword:"Passwort vergessen?",loginSuccess:"Erfolgreich angemeldet",loginFailed:"Anmeldung fehlgeschlagen",enterCredentials:"Bitte Benutzername und Passwort eingeben",forgotPasswordTitle:"Passwort vergessen",forgotPasswordMessage:"Wenn Sie Ihr Passwort vergessen haben, wenden Sie sich bitte an Ihren Systemadministrator.",forgotPasswordEmailMessage:"Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen ein neues Passwort.",emailAddress:"E-Mail-Adresse",emailPlaceholder:"ihre.email@beispiel.de",cancel:"Abbrechen",sending:"Wird gesendet...",sendResetEmail:"Zurücksetzungs-E-Mail senden",howToReset:"So setzen Sie Ihr Passwort zurück:",resetStep1:"Kontaktieren Sie Ihren Bambuddy-Administrator",resetStep2:"Bitten Sie ihn, Ihr Passwort in der Benutzerverwaltung zurückzusetzen",resetStep3:"Er kann ein neues temporäres Passwort für Sie festlegen",resetStep4:"Melden Sie sich mit dem neuen Passwort an und ändern Sie es in den Einstellungen",gotIt:"Verstanden"},setup:{title:"Bambuddy Einrichtung",subtitle:"Konfigurieren Sie die Authentifizierung für Ihre Bambuddy-Instanz",enableAuth:"Authentifizierung aktivieren",adminAccount:"Admin-Konto",adminAccountDesc:"Wenn bereits Admin-Benutzer existieren, wird die Authentifizierung mit den vorhandenen Admin-Konten aktiviert. Lassen Sie die Felder unten leer, um vorhandene Admins zu verwenden, oder geben Sie neue Anmeldedaten ein, um einen neuen Admin-Benutzer zu erstellen.",adminUsername:"Admin-Benutzername",adminPassword:"Admin-Passwort",optionalIfAdminExists:"(optional, wenn Admin-Benutzer existieren)",adminUsernamePlaceholder:"Admin-Benutzernamen eingeben (optional)",adminPasswordPlaceholder:"Admin-Passwort eingeben (optional)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Admin-Passwort bestätigen",settingUp:"Einrichtung läuft...",completeSetup:"Einrichtung abschließen",toast:{authEnabledAdminCreated:"Authentifizierung aktiviert und Admin-Benutzer erstellt",authEnabledExistingAdmins:"Authentifizierung mit vorhandenen Admin-Benutzern aktiviert",setupCompleted:"Einrichtung abgeschlossen",enterBothCredentials:"Bitte geben Sie sowohl Admin-Benutzernamen als auch Passwort ein, oder lassen Sie beide leer, um vorhandene Admin-Benutzer zu verwenden",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"}},changePassword:{title:"Passwort ändern",currentPassword:"Aktuelles Passwort",currentPasswordPlaceholder:"Aktuelles Passwort eingeben",newPassword:"Neues Passwort",newPasswordPlaceholder:"Neues Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Neues Passwort bestätigen",confirmPasswordPlaceholder:"Neues Passwort bestätigen",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",changing:"Wird geändert...",success:"Passwort erfolgreich geändert",failed:"Passwortänderung fehlgeschlagen"},plateAlert:{title:"Druck pausiert!",message:"Objekte auf dem Druckbett erkannt. Der Druck wurde automatisch pausiert. Bitte räumen Sie das Druckbett und setzen Sie den Druck fort.",understand:"Verstanden"},camera:{title:"Kameraansicht",invalidPrinterId:"Ungültige Drucker-ID",live:"Live",snapshot:"Schnappschuss",restartStream:"Stream neu starten",refreshSnapshot:"Schnappschuss aktualisieren",fullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",connectingToCamera:"Verbinde mit Kamera...",capturingSnapshot:"Schnappschuss wird aufgenommen...",connectionLost:"Verbindung verloren",connectionFailed:"Kameraverbindung fehlgeschlagen",reconnecting:"Neuverbindung in {{countdown}}s... (Versuch {{attempt}}/{{max}})",reconnectNow:"Jetzt verbinden",cameraUnavailable:"Kamera nicht verfügbar",cameraUnavailableDesc:"Stellen Sie sicher, dass der Drucker eingeschaltet und verbunden ist.",noCamera:"Keine Kamera verfügbar",retry:"Erneut versuchen",cameraStream:"Kamera-Stream",zoomOut:"Verkleinern",zoomIn:"Vergrößern",resetZoom:"Zoom zurücksetzen",recording:"Aufnahme",startRecording:"Aufnahme starten",stopRecording:"Aufnahme stoppen"},groups:{title:"Gruppenverwaltung",subtitle:"Berechtigungsgruppen für Zugriffskontrolle verwalten",backToSettings:"Zurück zu Einstellungen",createGroup:"Gruppe erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",system:"System",noDescription:"Keine Beschreibung",usersCount:"{{count}} Benutzer",permissionsCount:"{{count}} Berechtigungen",edit:"Bearbeiten",delete:"Löschen",toast:{created:"Gruppe erfolgreich erstellt",updated:"Gruppe erfolgreich aktualisiert",deleted:"Gruppe erfolgreich gelöscht",enterGroupName:"Bitte geben Sie einen Gruppennamen ein"},modal:{editGroup:"Gruppe bearbeiten",createGroup:"Gruppe erstellen",cancel:"Abbrechen",saving:"Speichern...",creating:"Erstellen...",saveChanges:"Änderungen speichern"},form:{groupName:"Gruppenname",groupNamePlaceholder:"Gruppennamen eingeben",systemGroupWarning:"Systemgruppennamen können nicht geändert werden",description:"Beschreibung",descriptionPlaceholder:"Beschreibung eingeben (optional)",permissions:"Berechtigungen ({{count}} ausgewählt)"},deleteModal:{title:"Gruppe löschen",message:"Sind Sie sicher, dass Sie diese Gruppe löschen möchten? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",confirm:"Gruppe löschen"}},users:{title:"Benutzerverwaltung",subtitle:"Benutzer und deren Zugriff auf Ihre Bambuddy-Instanz verwalten",backToSettings:"Zurück zu Einstellungen",createUser:"Benutzer erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",admin:"Admin",noGroups:"Keine Gruppen",active:"Aktiv",inactive:"Inaktiv",edit:"Bearbeiten",delete:"Löschen",system:"System",noGroupsAvailable:"Keine Gruppen verfügbar",table:{username:"Benutzername",groups:"Gruppen",status:"Status",actions:"Aktionen"},toast:{created:"Benutzer erfolgreich erstellt",updated:"Benutzer erfolgreich aktualisiert",deleted:"Benutzer erfolgreich gelöscht",fillRequired:"Bitte füllen Sie alle Pflichtfelder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"},modal:{createUser:"Benutzer erstellen",editUser:"Benutzer bearbeiten",cancel:"Abbrechen",creating:"Erstellen...",saving:"Speichern...",saveChanges:"Änderungen speichern"},form:{username:"Benutzername",usernamePlaceholder:"Benutzernamen eingeben",email:"E-Mail",emailPlaceholder:"benutzer@beispiel.de",password:"Passwort",passwordPlaceholder:"Passwort eingeben",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",newPasswordPlaceholder:"Neues Passwort eingeben",confirmNewPasswordPlaceholder:"Neues Passwort bestätigen",leaveBlankToKeep:"leer lassen, um das aktuelle zu behalten",groups:"Gruppen",optional:"optional",autoGeneratedPassword:"Ein sicheres Passwort wird automatisch generiert und per E-Mail an den Benutzer gesendet."},deleteModal:{title:"Benutzer löschen",message:"Sind Sie sicher, dass Sie diesen Benutzer löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",confirm:"Benutzer löschen"}},streamOverlay:{title:"Stream-Overlay",invalidPrinterId:"Ungültige Drucker-ID",cameraStream:"Kamera-Stream",progress:"Fortschritt",eta:"ETA",tomorrow:"Morgen",printerIdle:"Drucker ist inaktiv",printerOffline:"Drucker offline",status:{printing:"Druckt",paused:"Pausiert",finished:"Fertig",failed:"Fehlgeschlagen",idle:"Inaktiv",unknown:"Unbekannt"}},profiles:{title:"Profile",subtitle:"Verwalten Sie Ihre Slicer-Voreinstellungen und Druckvorschub-Kalibrierungen",tabs:{cloud:"Cloud-Profile",kprofiles:"K-Profile"},connectedAs:"Verbunden als",logout:"Abmelden",noLogoutPermission:"Sie haben keine Berechtigung zum Abmelden",failedToLoad:"Profile konnten nicht geladen werden",retry:"Erneut versuchen",time:{justNow:"Gerade eben",minsAgo:"vor {{count}}m",hoursAgo:"vor {{count}}h",daysAgo:"vor {{count}}d"},toast:{loggedOut:"Abgemeldet"},login:{title:"Mit Bambu Cloud verbinden",subtitle:"Synchronisieren Sie Ihre Slicer-Voreinstellungen geräteübergreifend",email:"E-Mail",password:"Passwort",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Bestätigungscode",totpCode:"Authenticator-Code",checkEmail:"Prüfen Sie Ihre E-Mail ({{email}}) für einen 6-stelligen Code",enterTotpHint:"Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",accessToken:"Zugriffstoken",accessTokenHint:"Fügen Sie Ihr Bambu Lab Zugriffstoken ein (aus Bambu Studio)",back:"Zurück",loginButton:"Anmelden",verifyButton:"Bestätigen",setTokenButton:"Token setzen",useToken:"Stattdessen Zugriffstoken verwenden",useEmail:"Stattdessen mit E-Mail anmelden",toast:{loggedIn:"Erfolgreich angemeldet",codeSent:"Bestätigungscode an Ihre E-Mail gesendet",enterTotp:"Geben Sie den Code aus Ihrer Authenticator-App ein",tokenSet:"Token erfolgreich gesetzt"}},presets:{myPreset:"Mein Profil (bearbeitbar)",duplicate:"Duplizieren",editable:"Bearbeitbar",failedToLoadDetails:"Profil-Details konnten nicht geladen werden",deleteConfirm:"Dieses Profil löschen?",deleteWarning:'"{{name}}" wird dauerhaft aus Bambu Cloud gelöscht. Dies kann nicht rückgängig gemacht werden.',noDuplicatePermission:"Sie haben keine Berechtigung zum Duplizieren von Profilen",noEditPermission:"Sie haben keine Berechtigung zum Bearbeiten von Profilen",noDeletePermission:"Sie haben keine Berechtigung zum Löschen von Profilen",types:{filament:"Filament-Profil",printer:"Drucker-Profil",process:"Prozess-Profil"},toast:{deleted:"Profil gelöscht",created:"Profil erstellt",updated:"Profil aktualisiert",duplicated:"Profil dupliziert",fieldAdded:'Feld "{{key}}" hinzugefügt',exported:"Profil exportiert"},baseLabel:"Basis: {{name}}",currentLabel:"Aktuell: {{name}}",newPreset:"Neues Profil",editPreset:"Profil bearbeiten",duplicatePreset:"Profil duplizieren",createNewPreset:"Neues Profil erstellen",customizeSettings:"Passen Sie die Einstellungen für Ihr neues Profil an",compareWithBase:"Mit Basis-Profil vergleichen",compare:"Vergleichen",basePreset:"Basis-Profil",selectBasePreset:"Basis-Profil auswählen...",presetName:"Profilname",myCustomPreset:"Mein eigenes Profil",inheritsFrom:"Erbt von",dropJsonToImport:"JSON zum Importieren ablegen",tabs:{common:"Allgemein",allFields:"Alle Felder"},availableFields:"Verfügbare Felder",searchFieldsPlaceholder:"Felder suchen...",noMatchingFields:"Keine passenden Felder",allFieldsAdded:"Alle Felder hinzugefügt",addCustomField:"Eigenes Feld hinzufügen",yourOverrides:"Ihre Überschreibungen",noOverridesYet:"Noch keine Überschreibungen",clickFieldsToAdd:"Klicken Sie links auf Felder, um sie hinzuzufügen",saveAsTemplate:"Als Vorlage speichern",jsonTip:"Tipp: Ziehen Sie eine .json-Datei auf dieses Fenster, um Einstellungen zu importieren"},cloudView:{searchPlaceholder:"Profile suchen...",templates:"Vorlagen",refresh:"Aktualisieren",newPreset:"Neues Profil",clearFilters:"Filter zurücksetzen",compareMode:"Vergleichsmodus",selectAnotherPreset:"Wählen Sie ein weiteres {{type}}-Profil",clickTwoPresets:"Klicken Sie auf zwei Profile des gleichen Typs zum Vergleichen",selectFirst:"1. Erstes auswählen",selectSecond:"2. Zweites auswählen",compareNow:"Jetzt vergleichen",lastSynced:"Zuletzt synchronisiert:",showingCount:"{{showing}} von {{total}} Profilen",noPresetsFound:"Keine Profile gefunden",columns:{filament:"Filament",process:"Prozess",printer:"Drucker"},noFilamentPresets:"Keine Filament-Profile",noProcessPresets:"Keine Prozess-Profile",noPrinterPresets:"Keine Drucker-Profile",filters:{type:"Typ",owner:"Besitzer",printer:"Drucker",nozzle:"Düse",filament:"Filament",layer:"Schicht",all:"Alle",myPresets:"Meine Profile",builtIn:"Voreingestellt",process:"Prozess"},noTemplatesPermission:"Sie haben keine Berechtigung, Vorlagen zu verwalten",noRefreshPermission:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreatePermission:"Sie haben keine Berechtigung, Profile zu erstellen"},templates:{title:"Schnellvorlagen",noTemplates:"Noch keine Vorlagen",createFirst:"Erstellen Sie Vorlagen aus dem Preset-Editor",typeFilter:"Typ:",deleteTitle:"Vorlage löschen",deleteWarning:"Diese Aktion kann nicht rückgängig gemacht werden",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',namePlaceholder:"Vorlagenname",descriptionPlaceholder:"Beschreibung",settingsJson:"Einstellungen (JSON)",fieldsCount:"{{count}} Felder",shownInModals:"In Dialogen angezeigt",hiddenInModals:"In Dialogen ausgeblendet",apply:"Anwenden",toast:{deleted:"Vorlage gelöscht",updated:"Vorlage aktualisiert",created:"Vorlage erstellt",applied:"Vorlage angewendet"}}},support:{debugLoggingActive:"Debug-Protokollierung ist aktiv",manageLogs:"Verwalten"},fileManager:{title:"Dateimanager",subtitle:"Organisieren und verwalten Sie Ihre Druckdateien",uploadFiles:"Dateien hochladen",newFolder:"Neuer Ordner",folderName:"Ordnername",folderNamePlaceholder:"z.B. Funktionsteile",renameFile:"Datei umbenennen",renameFolder:"Ordner umbenennen",moveFiles:"{{count}} Datei(en) verschieben",rootNoFolder:"Stammverzeichnis (Kein Ordner)",current:"aktuell",linkFolder:"Ordner verknüpfen",linkFolderDescription:'"{{name}}" mit einem Projekt oder Archiv verknüpfen für schnellen Zugriff.',project:"Projekt",archive:"Archiv",noProjectsFound:"Keine Projekte gefunden",noArchivesFound:"Keine Archive gefunden",unlink:"Verknüpfung aufheben",link:"Verknüpfen",dragDropFiles:"Dateien hierher ziehen",dropFilesHere:"Dateien hier ablegen",orClickToBrowse:"oder klicken zum Durchsuchen",allFileTypesSupported:"Alle Dateitypen werden unterstützt. ZIP-Dateien werden extrahiert.",zipFilesDetected:"ZIP-Dateien erkannt",zipExtractOptions:"ZIP-Dateien werden extrahiert. Wählen Sie, wie die Ordnerstruktur behandelt werden soll:",preserveZipStructure:"Ordnerstruktur aus ZIP beibehalten",createFolderFromZip:"Ordner aus ZIP-Dateiname erstellen",stlThumbnailGeneration:"STL-Vorschaubildgenerierung",zipMayContainStl:"ZIP-Dateien können STL-Dateien enthalten. Vorschaubilder können während der Extraktion generiert werden.",thumbnailsCanBeGenerated:"Vorschaubilder können für STL-Dateien generiert werden. Große Modelle benötigen möglicherweise mehr Zeit.",generateThumbnailsForStl:"Vorschaubilder für STL-Dateien generieren",threemfDetected:"3MF-Dateien erkannt",threemfExtractionInfo:"Druckermodell, Material, Farbe und Druckeinstellungen werden automatisch aus 3MF-Dateien extrahiert.",willBeExtracted:"Wird extrahiert",filesExtracted:"{{count}} Dateien extrahiert",uploadComplete:"Upload abgeschlossen: {{succeeded}} erfolgreich",uploadFailed:"{{count}} fehlgeschlagen",uploading:"Hochladen...",changeLink:"Verknüpfung ändern...",linkTo:"Verknüpfen mit...",linkToProjectOrArchive:"Mit Projekt oder Archiv verknüpfen",addToQueue:"Zur Warteschlange",schedulePrint:"Planen",generateThumbnail:"Vorschaubild generieren",generateThumbnails:"Vorschaubilder generieren",generateThumbnailsForMissing:"Vorschaubilder für STL-Dateien ohne Vorschau generieren",gridView:"Rasteransicht",listView:"Listenansicht",lowDiskSpaceWarning:"Warnung: Wenig Speicherplatz",lowDiskSpaceDetails:"Nur {{free}} frei von {{total}} gesamt. Schwellenwert ist auf {{threshold}} GB eingestellt.",files:"Dateien",folders:"Ordner",size:"Größe",free:"Frei",allFiles:"Alle Dateien",wrap:"Umbrechen",enableTextWrapping:"Textumbruch aktivieren",disableTextWrapping:"Textumbruch deaktivieren",dragToResizeTooltip:"Ziehen zum Ändern der Größe, Doppelklick zum Zurücksetzen",searchFiles:"Dateien suchen...",allTypes:"Alle Typen",prints:"Drucke",ascending:"Aufsteigend",descending:"Absteigend",resultsCount:"{{showing}} von {{total}} Dateien",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",adding:"Hinzufügen...",loadingFiles:"Dateien werden geladen...",folderIsEmpty:"Ordner ist leer",noFilesYet:"Noch keine Dateien",folderEmptyDescription:"Laden Sie Dateien hoch oder verschieben Sie Dateien in diesen Ordner.",noFilesDescription:"Laden Sie Dateien hoch, um Ihre Druckdateien zu organisieren.",noMatchingFiles:"Keine passenden Dateien",noMatchingFilesDescription:"Keine Dateien entsprechen Ihren aktuellen Such- oder Filterkriterien.",clearFilters:"Filter zurücksetzen",printedCount:"{{count}}x gedruckt",uploadedBy:"Hochgeladen von",deleteFolder:"Ordner löschen",deleteFile:"Datei löschen",deleteFilesCount:"{{count}} Dateien löschen",deleteFolderConfirm:"Möchten Sie diesen Ordner wirklich löschen? Alle Dateien darin werden ebenfalls gelöscht.",deleteFileConfirm:"Möchten Sie diese Datei wirklich löschen?",deleteFilesConfirm:"Möchten Sie {{count}} ausgewählte Dateien wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleting:"Wird gelöscht...",noPermissionRenameFolder:"Sie haben keine Berechtigung, Ordner umzubenennen",noPermissionLinkFolder:"Sie haben keine Berechtigung, Ordner zu verknüpfen",noPermissionDeleteFolder:"Sie haben keine Berechtigung, Ordner zu löschen",noPermissionPrint:"Sie haben keine Berechtigung zum Drucken",noPermissionAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noPermissionDownload:"Sie haben keine Berechtigung, Dateien herunterzuladen",noPermissionRenameFile:"Sie haben keine Berechtigung, diese Datei umzubenennen",noPermissionGenerateThumbnail:"Sie haben keine Berechtigung, Vorschaubilder zu generieren",noPermissionDeleteFile:"Sie haben keine Berechtigung, diese Datei zu löschen",noPermissionCreateFolder:"Sie haben keine Berechtigung, Ordner zu erstellen",noPermissionUpload:"Sie haben keine Berechtigung, Dateien hochzuladen",noPermissionMoveFiles:"Sie haben keine Berechtigung, Dateien zu verschieben",noPermissionDeleteFiles:"Sie haben keine Berechtigung, Dateien zu löschen",toast:{folderCreated:"Ordner erstellt",folderDeleted:"Ordner gelöscht",fileDeleted:"Datei gelöscht",filesDeleted:"{{count}} Dateien gelöscht",filesMoved:"Dateien verschoben",folderLinked:"Ordner verknüpft",folderUnlinked:"Ordnerverknüpfung aufgehoben",addedToQueue:"{{count}} Datei(en) zur Warteschlange hinzugefügt",addedToQueuePartial:"{{added}} Datei(en) hinzugefügt, {{failed}} fehlgeschlagen",failedToAddToQueue:"Fehler beim Hinzufügen: {{error}}",fileRenamed:"Datei umbenannt",folderRenamed:"Ordner umbenannt",thumbnailsGenerated:"{{count}} Vorschaubild(er) generiert",thumbnailsGeneratedPartial:"{{succeeded}} Vorschaubild(er) generiert, {{failed}} fehlgeschlagen",noStlMissingThumbnails:"Keine STL-Dateien ohne Vorschaubild",failedToGenerateThumbnails:"Fehler beim Generieren der Vorschaubilder: {{error}}",thumbnailGenerated:"Vorschaubild generiert",failedToGenerateThumbnail:"Fehler beim Generieren des Vorschaubildes: {{error}}"}},projects:{title:"Projekte",subtitle:"Organisieren und verfolgen Sie Ihre 3D-Druckprojekte",newProject:"Neues Projekt",editProject:"Projekt bearbeiten",deleteProject:"Projekt löschen",projectName:"Projektname",description:"Beschreibung",noProjects:"Noch keine Projekte",noProjectsFiltered:"Keine {{status}} Projekte",noProjectsFilteredHelp:"Sie haben keine {{status}} Projekte. Projekte werden hier angezeigt, wenn sich ihr Status ändert.",createFirst:"Erstellen Sie Ihr erstes Projekt, um verwandte Drucke zu organisieren, den Fortschritt zu verfolgen und Ihre Builds zu verwalten.",createFirstButton:"Erstes Projekt erstellen",create:"Erstellen",files:"Dateien",prints:"Drucke",plates:"Platten",parts:"Teile",lastModified:"Zuletzt geändert",deleteConfirm:"Möchten Sie dieses Projekt wirklich löschen? Archive und Warteschlangenelemente werden getrennt, aber nicht gelöscht.",addFiles:"Dateien hinzufügen",removeFile:"Datei entfernen",viewDetails:"Details anzeigen",namePlaceholder:"z.B. Voron 2.4 Build",descriptionPlaceholder:"Optionale Beschreibung...",color:"Farbe",targetPlates:"Ziel-Platten",targetPlatesPlaceholder:"z.B. 25",targetPlatesHelp:"Anzahl der Druckaufträge",targetParts:"Ziel-Teile",targetPartsPlaceholder:"z.B. 150",targetPartsHelp:"Benötigte Objekte insgesamt",tagsLabel:"Tags (kommagetrennt)",tagsPlaceholder:"z.B. voron, funktional, geschenk",dueDate:"Fälligkeitsdatum",priority:"Priorität",priorityLow:"Niedrig",priorityNormal:"Normal",priorityHigh:"Hoch",priorityUrgent:"Dringend",statusActive:"Aktiv",statusCompleted:"Abgeschlossen",statusArchived:"Archiviert",done:"Fertig",completed:"abgeschlossen",failed:"fehlgeschlagen",inQueue:"in Warteschlange",noPrintsYet:"Noch keine Drucke",printJobs:"Druckaufträge (Platten)",partsPrinted:"Gedruckte Teile",failedParts:"Fehlgeschlagene Teile",import:"Importieren",export:"Exportieren",importProject:"Projekt importieren",exportAll:"Alle Projekte exportieren",loading:"Projekte werden geladen...",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Projekte zu löschen",noCreatePermission:"Sie haben keine Berechtigung, Projekte zu erstellen",noImportPermission:"Sie haben keine Berechtigung, Projekte zu importieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",toast:{created:"Projekt erstellt",updated:"Projekt aktualisiert",deleted:"Projekt gelöscht",imported:"Projekt importiert",multipleImported:"{{count}} Projekte importiert",importFailed:"Import fehlgeschlagen",exported:"Projekte exportiert (nur Metadaten)"}},projectDetail:{notFound:"Projekt nicht gefunden",backToProjects:"Zurück zu Projekten",export:"Exportieren",exportProject:"Projekt exportieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",partOf:"Teil von:",priorityLabel:"Priorität:",noPrints:"Noch keine Drucke in diesem Projekt",status:{active:"Aktiv",completed:"Abgeschlossen",archived:"Archiviert"},priority:{low:"Niedrig",normal:"Normal",high:"Hoch",urgent:"Dringend"},dueDate:{overdue:"Überfällig",today:"Heute fällig",daysLeft:"{{count}} Tage übrig"},progress:{platesProgress:"Platten-Fortschritt",partsProgress:"Teile-Fortschritt",printJobs:"Druckaufträge",parts:"Teile",percentComplete:"{{percent}}% abgeschlossen",remaining:"{{count}} verbleibend"},stats:{printJobs:"Druckaufträge",total:"gesamt",failed:"{{count}} fehlgeschlagen",partsPrinted:"{{count}} Teile gedruckt",printTime:"Druckzeit",filamentUsed:"Filament verbraucht"},cost:{title:"Kostenverfolgung",filamentCost:"Filamentkosten",energy:"Energie",budget:"Budget",remaining:"Verbleibend"},subProjects:{title:"Unterprojekte ({{count}})"},notes:{title:"Notizen",noEditPermission:"Sie haben keine Berechtigung, Notizen zu bearbeiten",placeholder:"Notizen zu diesem Projekt hinzufügen...",empty:"Noch keine Notizen. Klicken Sie auf Bearbeiten, um Notizen hinzuzufügen."},files:{title:"Dateien",linkFolders:"Ordner aus dem Dateimanager verknüpfen",forQuickAccess:"für schnellen Zugriff auf dieses Projekt.",fileCount:"{{count}} Datei(en)",empty:"Keine Ordner verknüpft. Gehen Sie zum Dateimanager und verknüpfen Sie einen Ordner mit diesem Projekt."},bom:{title:"Stückliste",acquired:"{{completed}}/{{total}} beschafft",showAll:"Alle anzeigen",hideDone:"Erledigte ausblenden",addPart:"Teil hinzufügen",noAddPermission:"Sie haben keine Berechtigung, Teile hinzuzufügen",partNamePlaceholder:"Teilename (z.B. M3x8 Schrauben)",partName:"Teilename",qty:"Menge",price:"Preis ({{currency}})",sourcingUrlPlaceholder:"Bezugsquelle-URL (optional)",remarksPlaceholder:"Bemerkungen (optional)",deletePart:"Teil löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',noUpdatePermission:"Sie haben keine Berechtigung, Teile zu aktualisieren",noEditPermission:"Sie haben keine Berechtigung, Teile zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Teile zu löschen",totalCost:"Gesamtkosten:",empty:"Keine Teile in der Stückliste. Fügen Sie Hardware, Elektronik oder andere Komponenten hinzu, um zu verfolgen, was beschafft werden muss."},timeline:{title:"Aktivitätsverlauf",empty:"Noch keine Aktivität."},template:{saveAsTemplate:"Als Vorlage speichern",noCreatePermission:"Sie haben keine Berechtigung, Vorlagen zu erstellen"},queue:{title:"Warteschlange",viewAll:"Alle anzeigen",printing:"{{count}} druckend",queued:"{{count}} in Warteschlange"},prints:{title:"Drucke ({{count}})"},toast:{projectUpdated:"Projekt aktualisiert",partAdded:"Teil hinzugefügt",partRemoved:"Teil entfernt",exportFailed:"Export fehlgeschlagen",projectExported:"Projekt exportiert",templateCreated:"Vorlage erstellt"}},system:{title:"Systeminformationen",version:"Version",uptime:"Laufzeit",cpuUsage:"CPU-Auslastung",memoryUsage:"Speicherauslastung",diskUsage:"Festplattenauslastung",networkInfo:"Netzwerkinformationen",logs:"Protokolle",debugMode:"Debug-Modus",enableDebug:"Debug-Protokollierung aktivieren",disableDebug:"Debug-Protokollierung deaktivieren",downloadLogs:"Protokolle herunterladen",clearLogs:"Protokolle löschen",dockerInfo:"Docker-Info",containerName:"Container-Name",imageName:"Image-Name",platform:"Plattform",architecture:"Architektur"},library:{title:"Filament-Bibliothek",addFilament:"Filament hinzufügen",editFilament:"Filament bearbeiten",deleteFilament:"Filament löschen",vendor:"Hersteller",material:"Material",color:"Farbe",kFactor:"K-Faktor",temperature:"Temperatur",noFilaments:"Keine Filamente in der Bibliothek",deleteConfirm:"Möchten Sie dieses Filament wirklich löschen?",importFromPrinter:"Vom Drucker importieren",exportToFile:"In Datei exportieren"},spoolman:{title:"Spoolman-Integration",enabled:"Spoolman aktiviert",url:"Spoolman URL",connected:"Verbunden",disconnected:"Nicht verbunden",testConnection:"Verbindung testen",sync:"Synchronisieren",syncing:"Synchronisiert...",lastSync:"Letzte Synchronisierung",linkToSpoolman:"Mit Spoolman verknüpfen",openInSpoolman:"In Spoolman öffnen",unlinkSpool:"Spule trennen",selectSpool:"Spule auswählen",noUnlinkedSpools:"Keine nicht verknüpften Spulen verfügbar",linkSuccess:"Spule erfolgreich mit Spoolman verknüpft",linkFailed:"Verknüpfung mit Spoolman fehlgeschlagen",spoolId:"Spulen-ID",weight:"Gewicht",remaining:"Verbleibend",disableWeightSync:"AMS-Gewichtsschätzung deaktivieren",disableWeightSyncDesc:"Verbleibende Kapazität nicht aus AMS-Schätzungen aktualisieren. Verwenden Sie dies, wenn Sie die Verbrauchserfassung von Spoolman gegenüber den prozentualen AMS-Schätzungen bevorzugen. Neue Spulen verwenden weiterhin die AMS-Schätzung als Anfangsgewicht.",reportPartialUsage:"Teilverbrauch bei fehlgeschlagenen Drucken melden",reportPartialUsageDesc:"Wenn ein Druck fehlschlägt oder abgebrochen wird, den geschätzten Filamentverbrauch bis zu diesem Zeitpunkt basierend auf dem Schichtfortschritt melden."},timelapse:{title:"Zeitraffer",create:"Zeitraffer erstellen",download:"Herunterladen",delete:"Löschen",preview:"Vorschau",frameRate:"Bildrate",quality:"Qualität",processing:"Wird verarbeitet...",noTimelapses:"Keine Zeitraffer verfügbar"},ams:{title:"AMS",slot:"Slot",empty:"Leer",emptySlot:"Leerer Slot",unknown:"Unbekannt",humidity:"Luftfeuchtigkeit",temperature:"Temperatur",filamentType:"Filamenttyp",filamentColor:"Farbe",remaining:"Verbleibend",history:"AMS-Verlauf",noHistory:"Kein Verlauf verfügbar",configureSlot:"Slot konfigurieren",externalSpool:"Externe Spule",profile:"Profil",kFactor:"K-Faktor",fill:"Füllstand",configure:"Konfigurieren"},printModal:{title:"Druck starten",selectPrinter:"Drucker auswählen",selectPlate:"Platte auswählen",filamentMapping:"Filamentzuordnung",printSettings:"Druckeinstellungen",bedLeveling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",startPrint:"Druck starten",addToQueue:"Zur Warteschlange hinzufügen",cancel:"Abbrechen",noPrintersAvailable:"Keine Drucker verfügbar",printerBusy:"Drucker ist beschäftigt",printerOffline:"Drucker ist offline"},backup:{title:"Sichern & Wiederherstellen",createBackup:"Sicherung erstellen",restoreBackup:"Sicherung wiederherstellen",restoreDescription:"Alle Daten aus einer Sicherungsdatei ersetzen",downloadBackup:"Sicherung herunterladen",uploadBackup:"Sicherung hochladen",lastBackup:"Letzte Sicherung",autoBackup:"Automatische Sicherung",backupNow:"Jetzt sichern",restoreWarning:"Warnung: Das Wiederherstellen einer Sicherung überschreibt alle aktuellen Daten.",includeArchives:"Archive einschließen",includeSettings:"Einstellungen einschließen",includeProfiles:"Profile einschließen",backupSuccess:"Sicherung erfolgreich erstellt",restoreSuccess:"Sicherung erfolgreich wiederhergestellt",backupFailed:"Sicherung fehlgeschlagen",restoreFailed:"Wiederherstellung fehlgeschlagen",restoreNote:"Virtueller Drucker wird während der Wiederherstellung gestoppt"},tags:{title:"Tags",addTag:"Tag hinzufügen",editTag:"Tag bearbeiten",deleteTag:"Tag löschen",tagName:"Tag-Name",tagColor:"Tag-Farbe",noTags:"Keine Tags",deleteConfirm:"Möchten Sie diesen Tag wirklich löschen?",manageTags:"Tags verwalten"},uploadModal:{title:"3MF-Dateien hochladen",dragDrop:"3MF-Dateien hierher ziehen",or:"oder",browseFiles:"Dateien durchsuchen",extractionInfo:"Das Druckermodell wird automatisch aus den 3MF-Datei-Metadaten extrahiert.",uploaded:"hochgeladen",failed:"fehlgeschlagen",uploading:"Wird hochgeladen...",upload:"Hochladen",uploadFailed:"Hochladen fehlgeschlagen"},editArchive:{title:"Archiv bearbeiten",name:"Name",namePlaceholder:"Druckname",printer:"Drucker",noPrinter:"Kein Drucker",project:"Projekt",noProject:"Kein Projekt",itemsPrinted:"Gedruckte Teile",itemsPrintedHelp:"Anzahl der in diesem Druckauftrag produzierten Teile",notes:"Notizen",notesPlaceholder:"Notizen zu diesem Druck hinzufügen...",externalLink:"Externer Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link zu Printables, Thingiverse oder anderer Quelle",tags:"Tags",tagsPlaceholder:"Tags hinzufügen...",addMoreTags:"Weitere Tags hinzufügen...",matchingTags:'Übereinstimmend mit "{{query}}"',existingTags:"Vorhandene Tags",clickToAdd:"(zum Hinzufügen klicken)",status:"Status",failureReason:"Fehlergrund",selectReason:"Grund auswählen...",photos:"Fotos des Druckergebnisses",photosHelp:"Klicken Sie auf + um Fotos Ihres Druckergebnisses hinzuzufügen",printResult:"Druckergebnis",saving:"Wird gespeichert...",failureReasons:{adhesionFailure:"Haftungsfehler",spaghettiDetached:"Spaghetti / Abgelöst",layerShift:"Schichtversatz",cloggedNozzle:"Verstopfte Düse",filamentRunout:"Filament aufgebraucht",warping:"Verformung",stringing:"Fadenziehen",underExtrusion:"Unterextrusion",powerFailure:"Stromausfall",userCancelled:"Vom Benutzer abgebrochen",other:"Sonstiges"},statuses:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",aborted:"Abgebrochen",printing:"Druckt"}},kProfiles:{title:"K-Profile",noPrintersConfigured:"Keine Drucker konfiguriert",addPrinterInSettings:"Fügen Sie einen Drucker in den Einstellungen hinzu, um K-Profile zu verwalten",noActivePrinters:"Keine aktiven Drucker",enablePrinterConnection:"Aktivieren Sie eine Druckerverbindung, um K-Profile anzuzeigen",loadingProfiles:"Lade K-Profile...",printerOffline:"Drucker offline",printerOfflineDesc:"Der ausgewählte Drucker ist nicht verbunden. Schalten Sie ihn ein, um K-Profile anzuzeigen.",noMatchingProfiles:"Keine passenden Profile",noMatchingProfilesDesc:"Keine Profile entsprechen Ihren Suchkriterien",noKProfiles:"Keine K-Profile",noKProfilesDesc:"Keine Druckvorschub-Profile für {{diameter}}mm Düse gefunden",createFirstProfile:"Erstes Profil erstellen",printer:"Drucker",nozzle:"Düse",refresh:"Aktualisieren",addProfile:"Profil hinzufügen",export:"Exportieren",import:"Importieren",select:"Auswählen",selectAll:"Alle auswählen",delete:"Löschen",searchPlaceholder:"Nach Name oder Filament suchen...",allExtruders:"Alle Extruder",leftOnly:"Nur links",rightOnly:"Nur rechts",allFlow:"Alle Flusstypen",hfOnly:"Nur HF",sOnly:"Nur S",sortName:"Sortieren: Name",sortKValue:"Sortieren: K-Wert",sortFilament:"Sortieren: Filament",leftExtruder:"Linker Extruder",rightExtruder:"Rechter Extruder",modal:{addTitle:"K-Profil hinzufügen",editTitle:"K-Profil bearbeiten",profileName:"Profilname",profileNamePlaceholder:"Mein PLA-Profil",kValue:"K-Wert",kValuePlaceholder:"0,020",kValueHelp:"Typischer Bereich: 0,01 - 0,06 für PLA, 0,02 - 0,10 für PETG",filament:"Filament",selectFilament:"Filament auswählen...",noFilamentsHelp:"Keine Filamente gefunden. Erstellen Sie zuerst ein K-Profil in Bambu Studio.",flowType:"Flusstyp",highFlow:"High Flow",standard:"Standard",nozzleSize:"Düsengröße",extruder:"Extruder",extruders:"Extruder",left:"Links",right:"Rechts",notes:"Notizen (lokal gespeichert)",notesPlaceholder:"Notizen zu diesem Profil hinzufügen...",notesHelp:"Notizen werden in Bambuddy gespeichert, nicht auf dem Drucker",syncing:"Synchronisiert mit Drucker...",savingExtruder:"Speichern auf Extruder {{current}}/{{total}}...",pleaseWait:"Bitte warten"},deleteConfirm:{title:"Profil löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:'Möchten Sie "{{name}}" wirklich vom Drucker löschen?'},bulkDelete:{title:"Profile löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:"Möchten Sie wirklich {{count}} ausgewählte Profile vom Drucker löschen?"},toast:{profileSaved:"K-Profil gespeichert",profilesSaved:"K-Profil auf {{count}} Extrudern gespeichert",selectAtLeastOneExtruder:"Bitte wählen Sie mindestens einen Extruder aus",profileDeleted:"K-Profil gelöscht",profilesDeleted:"{{count}} Profile gelöscht",exportedProfiles:"{{count}} Profile exportiert",importedProfiles:"{{count}} von {{total}} Profilen importiert",noProfilesToExport:"Keine Profile zum Exportieren",invalidFileFormat:"Ungültiges Dateiformat",failedToParseImport:"Import-Datei konnte nicht gelesen werden",failedToSaveBatch:"K-Profile konnten nicht gespeichert werden",noteSaved:"Notiz gespeichert",failedToSaveNote:"Notiz konnte nicht gespeichert werden"},permission:{noRead:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreate:"Sie haben keine Berechtigung, Profile hinzuzufügen",noUpdate:"Sie haben keine Berechtigung, K-Profile zu aktualisieren",noDelete:"Sie haben keine Berechtigung, K-Profile zu löschen",noExport:"Sie haben keine Berechtigung, Profile zu exportieren",noImport:"Sie haben keine Berechtigung, Profile zu importieren"}},virtualPrinter:{title:"Virtueller Drucker",running:"Läuft",stopped:"Gestoppt",description:{default:"Aktiviere einen virtuellen Drucker, der in Bambu Studio und OrcaSlicer erscheint. Dateien, die an diesen Drucker gesendet werden, werden direkt archiviert ohne zu drucken.",proxy:"Aktiviere einen Proxy, der Slicer-Datenverkehr an einen echten Drucker weiterleitet, um Ferndruck über jedes Netzwerk zu ermöglichen."},enable:{title:"Virtuellen Drucker aktivieren",visibleInSlicer:'Sichtbar als "Bambuddy" in der Slicer-Erkennung',proxyingTo:"Proxy zu {{name}}",notActive:"Nicht aktiv"},model:{title:"Druckermodell",description:"Wähle welches Druckermodell emuliert werden soll.",restartWarning:"Das Ändern des Modells startet den virtuellen Drucker neu"},accessCode:{title:"Zugangscode",isSet:"Zugangscode ist gesetzt",notSet:"Kein Zugangscode gesetzt - erforderlich zum Aktivieren",placeholder:"8-Zeichen-Code eingeben",placeholderChange:"Neuen Code eingeben zum Ändern",hint:"Muss genau 8 Zeichen lang sein. Wird von Slicern zur Authentifizierung verwendet.",charCount:"({{count}}/8)"},targetPrinter:{title:"Zieldrucker",configured:"Proxy-Ziel konfiguriert",notConfigured:"Kein Zieldrucker ausgewählt - erforderlich für Proxy-Modus",placeholder:"Drucker auswählen...",hint:"Wähle den Drucker aus, an den der Slicer-Datenverkehr weitergeleitet werden soll. Der Drucker muss im LAN-Modus sein.",noPrinters:"Keine Drucker konfiguriert. Füge zuerst einen Drucker hinzu, um den Proxy-Modus zu verwenden."},remoteInterface:{title:"Slicer-Netzwerkschnittstelle",configured:"SSDP-Proxy aktiviert",optional:"Optional - für SSDP-Erkennung über Netzwerke hinweg",placeholder:"Schnittstelle für Slicer-Netzwerk auswählen...",hint:"Wähle die Netzwerkschnittstelle, die mit dem Slicer verbunden ist. Ermöglicht automatische Druckererkennung in Bambu Studio."},mode:{title:"Modus",archive:"Archivieren",archiveDesc:"Dateien sofort archivieren",review:"Überprüfen",reviewDesc:"Vor dem Archivieren überprüfen",queue:"Warteschlange",queueDesc:"Archivieren und zur Warteschlange hinzufügen",proxy:"Proxy",proxyDesc:"An echten Drucker weiterleiten"},setupRequired:{title:"Einrichtung erforderlich",description:"Die virtuelle Druckerfunktion erfordert zusätzliche Systemkonfiguration, bevor sie funktioniert. Dies beinhaltet Portweiterleitung, Firewall-Regeln und plattformspezifische Einstellungen.",readGuide:"Lese die Einrichtungsanleitung vor dem Aktivieren"},howItWorks:{title:"So funktioniert es",titleProxy:"So funktioniert es (Proxy-Modus)",step1:"Schließe die Einrichtungsanleitung für deine Plattform ab",step2:"Aktiviere den virtuellen Drucker und setze einen Zugangscode",step3:'In Bambu Studio oder OrcaSlicer gehe zu "Drucker hinzufügen"',step4:'Der "Bambuddy"-Drucker sollte in der Erkennungsliste erscheinen',step5:"Verbinde mit dem von dir gesetzten Zugangscode",step6:'Wenn du zu Bambuddy "druckst", wird die 3MF-Datei stattdessen archiviert',proxyStep1:"Wähle den Zieldrucker (muss im LAN-Modus sein)",proxyStep2:"Bei Netzwerkübergreifend: Wähle die Slicer-Netzwerkschnittstelle",proxyStep3:"Aktiviere den Proxy - Drucker erscheint per SSDP in der Slicer-Erkennung",proxyStep4:"Verbinde mit dem Zugangscode des Druckers",proxyStep5:"Drucke wie gewohnt - der Datenverkehr wird über Bambuddy weitergeleitet",proxyStep6:"Kamera-Streaming erfordert NAT/IP-Weiterleitung (siehe Dokumentation)"},status:{title:"Status-Details",printerName:"Druckername",model:"Modell",serialNumber:"Seriennummer",mode:"Modus",pendingFiles:"Ausstehende Dateien",targetPrinter:"Zieldrucker",ftpPort:"FTP-Port",mqttPort:"MQTT-Port",ftpConnections:"FTP-Verbindungen",mqttConnections:"MQTT-Verbindungen"},toast:{updated:"Virtuelle Druckereinstellungen aktualisiert",failedToUpdate:"Einstellungen konnten nicht aktualisiert werden",accessCodeRequired:"Bitte zuerst einen Zugangscode setzen",targetPrinterRequired:"Bitte zuerst einen Zieldrucker auswählen",accessCodeEmpty:"Zugangscode darf nicht leer sein",accessCodeLength:"Zugangscode muss genau 8 Zeichen lang sein"}},modelViewer:{openInSlicer:"Im Slicer öffnen",tabs:{model:"3D-Modell",gcode:"G-Code Vorschau"},notAvailable:"nicht verfügbar",notSliced:"nicht geslicet",plates:"Platten",allPlates:"Alle Platten",plateNumber:"Platte {{number}}",plateCount:"{{count}} Platte",plateCount_other:"{{count}} Platten",objectCount:"{{count}} Objekt",objectCount_other:"{{count}} Objekte",filamentCount:"{{count}} Filament",filamentCount_other:"{{count}} Filamente",eta:"ETA {{minutes}} Min",noPreview:"Keine Vorschau für diese Datei verfügbar",pagination:{pageOf:"Seite {{current}} von {{total}}",prev:"Zurück",next:"Weiter"},errors:{failedToLoad:"Datei konnte nicht geladen werden",noMeshes:"Keine Meshes in 3MF-Datei gefunden",unsupportedFormat:"Nicht unterstütztes Dateiformat"}},maintenanceDescriptions:{lubricateRails:"Schmiermittel auf Linearschienen für sanfte Bewegung auftragen",cleanNozzle:"Hotend und Düse reinigen, um Verstopfungen zu verhindern",checkBelts:"Riemenspannung für präzise Drucke überprüfen",cleanBuildPlate:"Druckplatte für bessere Haftung reinigen",checkExtruder:"Extruderzahnräder auf Verschleiß prüfen",checkCooling:"Sicherstellen, dass Lüfter ordnungsgemäß funktionieren",generalInspection:"Allgemeine Druckerinspektion",cleanCarbonRods:"Karbonstäbe reinigen, um Reibung zu reduzieren",checkPtfeTube:"PTFE-Schlauch auf Verschleiß oder Beschädigung prüfen",replaceHepaFilter:"HEPA-Filter für Luftqualität ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren (H2-Serie)"}},mle={nav:{printers:"プリンター",archives:"アーカイブ",queue:"キュー",stats:"統計",profiles:"プロファイル",maintenance:"メンテナンス",projects:"プロジェクト",files:"ファイル管理",settings:"設定",system:"システム",collapseSidebar:"サイドバーを閉じる",expandSidebar:"サイドバーを開く",update:"アップデート",updateAvailable:"アップデートあり: v{{version}}",viewOnGithub:"GitHubで表示",keyboardShortcuts:"キーボードショートカット (?)",switchToLight:"ライトモードに切替",switchToDark:"ダークモードに切替"},common:{save:"保存",cancel:"キャンセル",delete:"削除",edit:"編集",add:"追加",close:"閉じる",confirm:"確認",loading:"読み込み中...",error:"エラー",success:"成功",warning:"警告",enabled:"有効",disabled:"無効",yes:"はい",no:"いいえ",on:"オン",off:"オフ",all:"すべて",none:"なし",search:"検索",filter:"フィルター",sort:"並べ替え",refresh:"更新",download:"ダウンロード",upload:"アップロード",actions:"操作",status:"ステータス",name:"名前",description:"説明",date:"日付",time:"時間",hours:"時間",minutes:"分",seconds:"秒",noPrinters:"プリンターが登録されていません",noData:"データがありません",required:"必須",optional:"オプション",unknown:"不明",done:"完了",saving:"保存中...",saveChanges:"変更を保存",today:"今日",turnOn:"オンにする",turnOff:"オフにする",deletePhoto:"写真を削除",deletePhotoConfirm:"この写真を削除しますか?元に戻せません。",create:"作成",print:"印刷",clear:"クリア",project:"プロジェクト",archive:"アーカイブ",unknownError:"不明なエラー",show:"表示",hide:"非表示",back:"戻る",export:"エクスポート",import:"インポート",retry:"リトライ",printer:"プリンター",model:"モデル",ok:"OK"},printers:{title:"プリンター",addPrinter:"プリンターを追加",editPrinter:"プリンターを編集",deletePrinter:"プリンターを削除",printerName:"プリンター名",serialNumber:"シリアル番号",ipAddress:"IPアドレス",accessCode:"アクセスコード",model:"モデル",nozzleCount:"ノズル数",autoArchive:"自動アーカイブ",connected:"接続中",offline:"オフライン",unknownModel:"不明なモデル",statusLabel:"ステータス",status:{printing:"印刷中",paused:"一時停止",finished:"完了",failed:"失敗",idle:"待機中"},lastPrint:"最後",readyToPrint:"印刷可能",estimatedCompletion:"完了予定時刻",filaments:"フィラメント",controls:"コントロール",external:"外部",externalSpool:"外部スプール",files:"ファイル",browseFiles:"プリンターのファイルを参照",update:"アップデート",loading:"プリンターを読み込み中...",hideOffline:"オフラインを非表示",ungrouped:"未グループ",hmsErrors:"クリックしてHMSエラーを表示",slotOptions:"スロットオプション",rereadRfid:"RFIDを再読み取り",clickToView:"クリックして表示",maintenanceUpToDate:"すべてのメンテナンスが最新です",maintenanceDue:"{{count}}件のメンテナンス期限",maintenanceDueSoon:"{{count}}件のメンテナンスがまもなく期限",printsInQueue:"キューに{{count}}件の印刷",firmwareUpdateAvailable:"ファームウェアアップデートあり: {{current}} → {{latest}}",statusSummary:{printing:"印刷中",idle:"待機中",offline:"オフライン"},sort:{name:"名前",status:"ステータス",model:"モデル",location:"ロケーション",ascending:"昇順で並べ替え",descending:"降順で並べ替え"},cardSize:{small:"小",medium:"中",large:"大",extraLarge:"特大",cards:"カード"},temps:{nozzle:"ノズル",bed:"ベッド",chamber:"チャンバー",left:"左",right:"右",activeNozzle:"アクティブ: {{side}}ノズル"},fans:{partCooling:"パーツ冷却ファン",auxiliary:"補助ファン",chamber:"チャンバーファン"},printControl:{stop:"停止",pause:"一時停止",resume:"再開",stopPrint:"印刷を停止",pausePrint:"印刷を一時停止",resumePrint:"印刷を再開"},power:{on:"オン",off:"オフ",powerOn:"電源オン",autoOff:"自動オフ",autoOffDone:"自動オフ完了",autoOffTooltip:"印刷後に自動電源オフ",autoOffExecutedTooltip:"自動オフが実行されました - リセットするにはプリンターの電源を入れてください",offlineWithPlugs:"スマートプラグ付きオフラインプリンター",noPlugs:"スマートプラグ付きプリンターなし"},chamberLight:{turnOn:"チャンバーライトをオン",turnOff:"チャンバーライトをオフ"},camera:{openOverlay:"カメラオーバーレイを開く",openWindow:"カメラを新しいウィンドウで開く"},menu:{reconnect:"再接続",mqttDebug:"MQTTデバッグ"},confirm:{deleteTitle:"プリンターを削除",deleteMessage:"「{{name}}」を削除しますか?すべての接続設定が削除されます。",deleteArchives:"印刷アーカイブを削除",deleteArchivesYes:"このプリンターのすべての印刷履歴が完全に削除されます。",deleteArchivesNo:"印刷履歴は保持されますが、このプリンターとの関連付けは解除されます。",powerOnTitle:"プリンターの電源をオン",powerOnMessage:"「{{name}}」の電源をオンにしますか?",powerOn:"電源オン",powerOffTitle:"プリンターの電源をオフ",powerOffMessage:"「{{name}}」の電源をオフにしますか?",powerOffWarning:"警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。",powerOff:"電源オフ",stopTitle:"印刷を停止",stopMessage:"「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",pauseTitle:"印刷を一時停止",pauseMessage:"「{{name}}」の現在の印刷を一時停止しますか?",pauseButton:"印刷を一時停止",resumeTitle:"印刷を再開",resumeMessage:"「{{name}}」の印刷を再開しますか?",resumeButton:"印刷を再開"},skipObjects:{title:"オブジェクトスキップ",onlyWhilePrinting:"オブジェクトスキップ(印刷中のみ)",requires2Objects:"オブジェクトスキップ(2つ以上のオブジェクトが必要)",noObjects:"オブジェクトが見つかりません",objectsLoadedOnStart:"オブジェクトは印刷開始時に読み込まれます",matchIds:"プリンターのディスプレイとIDを照合してください",printerScreenShows:"プリンター画面にビルドプレート上のオブジェクトIDが表示されます",skippedCount:"{{skipped}}/{{total}}スキップ済み",waitForLayer:"オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})",activeCount:"{{count}}個アクティブ",willBeSkipped:"スキップされます",waitForLayer2:"レイヤー2以降をお待ちください",skipThisObject:"このオブジェクトをスキップ",skip:"スキップ",skipped:"スキップ済み"},form:{name:"名前",namePlaceholder:"マイプリンター",ipAddress:"IPアドレス",serialNumber:"シリアル番号",serialCannotChange:"シリアル番号は変更できません",accessCode:"アクセスコード",accessCodePlaceholder:"プリンター設定から取得",accessCodeKeepCurrent:"現在のコードを維持する場合は空のまま",modelOptional:"モデル(任意)",model:"モデル",selectModel:"モデルを選択...",locationGroup:"ロケーション / グループ",locationPlaceholder:"例: 工房、オフィス、地下室",locationHint:"プリンターのグループ化とキュージョブのフィルタリングに使用",autoArchive:"完了した印刷を自動アーカイブ"},discovery:{subnetToScan:"スキャンするサブネット",dockerSubnetHint:"Dockerが検出されました。CIDR表記でプリンターのサブネットを入力してください。docker-compose.ymlにnetwork_mode: hostが必要です。",scanning:"スキャン中...",scanningProgress:"スキャン中... {{scanned}}/{{total}}",scanSubnet:"サブネットをスキャンしてプリンターを検出",discoverNetwork:"ネットワーク上のプリンターを検出",serialRequired:"シリアル番号が必要です",scanningSubnet:"サブネットでBambuプリンターをスキャン中...",scanningNetwork:"ネットワークをスキャン中...",noPrintersSubnet:"指定されたサブネットにプリンターが見つかりません。",noPrintersNetwork:"ネットワーク上にプリンターが見つかりません。",allConfigured:"検出されたすべてのプリンターは既に設定済みです。"},firmware:{title:"ファームウェアアップデート",current:"現在",latest:"最新",releaseNotes:"リリースノート",checkingPrerequisites:"前提条件を確認中...",sdCardReady:"SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。",uploadedToSd:"ファームウェアをSDカードにアップロードしました!",applyInstructions:"プリンターでアップデートを適用するには:",step1:"プリンターのタッチスクリーンで設定に移動",step2:"ファームウェアに移動",step3:"SDカードからアップデートを選択",step4:"アップデートには10〜20分かかります",starting:"開始中...",uploadFirmware:"ファームウェアをアップロード",uploadSuccess:"ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。"},empty:{noPrinters:"プリンターがまだ設定されていません",addFirst:"最初のプリンターを追加"},toast:{printStopped:"印刷を停止しました",printPaused:"印刷を一時停止しました",printResumed:"印刷を再開しました",failedToStop:"印刷の停止に失敗しました",failedToPause:"印刷の一時停止に失敗しました",failedToResume:"印刷の再開に失敗しました",chamberLightOn:"チャンバーライトをオンにしました",chamberLightOff:"チャンバーライトをオフにしました",failedChamberLight:"チャンバーライトの制御に失敗しました",objectsSkipped:"オブジェクトをスキップしました",failedToSkipObjects:"オブジェクトのスキップに失敗しました",rfidRereadInitiated:"RFID再読み取りを開始しました",failedRfidReread:"RFID再読み取りに失敗しました"},progress:"{{percent}}% 完了",timeRemaining:"残り {{time}}",maintenanceOk:"メンテナンス正常",maintenanceWarning:"{{count}}件の警告",maintenanceWarning_plural:"{{count}}件の警告",colors:{unknown:"不明",black:"黒",white:"白",darkGray:"ダークグレー",lightGray:"ライトグレー",gray:"グレー",brown:"茶色",red:"赤",orange:"オレンジ",yellow:"黄色",green:"緑",cyan:"シアン",blue:"青",purple:"紫",pink:"ピンク"},humidity:{unknown:"不明",good:"良好",fair:"注意",bad:"警告"},temperature:{good:"良好",fair:"注意",bad:"高温"},wifi:{excellent:"非常に良い",good:"良い",fair:"普通",weak:"弱い",veryWeak:"非常に弱い"},h2Series:"H2シリーズ",x1Series:"X1シリーズ",pSeries:"Pシリーズ",a1Series:"A1シリーズ",searchPresets:"プリセットを検索...",noCloudPresets:"クラウドプリセットがありません。Bambu Cloudにログインして同期してください。",noMatchingPresets:"一致するプリセットが見つかりません。",colorNamePlaceholder:"色の名前またはHex値(例:brown、FF8800)",clearCustomColor:"カスタムカラーをクリア",copySpoolUuid:"スプールUUIDをコピー",configureSlot:"フィラメントプロファイルとK値でスロットを設定"},archives:{title:"印刷アーカイブ",searchPlaceholder:"アーカイブを検索...",filterByPrinter:"プリンターで絞り込み",filterByStatus:"ステータスで絞り込み",sortBy:"並べ替え",sortNewest:"新しい順",sortOldest:"古い順",sortName:"名前順",sortDuration:"時間順",noArchives:"アーカイブが見つかりません",printTime:"印刷時間",filamentUsed:"フィラメント使用量",cost:"コスト",reprint:"再印刷",preview:"プレビュー",deleteArchive:"アーカイブを削除",deleteConfirm:"このアーカイブを削除しますか?",favorite:"お気に入り",unfavorite:"お気に入りから削除",viewDetails:"詳細を表示",status:{completed:"完了",failed:"失敗",stopped:"中止"},collections:{all:"すべてのアーカイブ",recent:"過去24時間","this-week":"今週","this-month":"今月",favorites:"お気に入り",failed:"失敗した印刷",duplicates:"重複"},bulkDeleted:"{{count}}件のアーカイブを削除しました",bulkDeleteFailed:"アーカイブの削除に失敗しました",bulkDeleteTitle:"アーカイブを削除",bulkDeleteConfirm:"{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。",deleteCount:"{{count}}件を削除",only3mfSupported:".3mfファイルのみ対応しています",dropFilesHere:".3mfファイルをここにドロップ",releaseToUpload:"ドロップしてアップロード",selectedCount:"{{count}}件選択中",selectAll:"すべて選択",tags:"タグ",project:"プロジェクト",toggledFavorites:"{{count}}件のアーカイブのお気に入りを切替えました",favoriteUpdateFailed:"お気に入りの更新に失敗しました",favoriteBulk:"お気に入り",showingCount:"{{total}}件中{{shown}}件を表示",export:"エクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",exportCsv:"CSVでエクスポート",exportExcel:"Excelでエクスポート",compare:"比較 ({{count}})",select:"選択",upload3mf:"3MFアップロード",allPrinters:"すべてのプリンター",allMaterials:"すべての素材",allFiles:"すべてのファイル",slicedGcode:"スライス済み (GCODE)",sourceFileOnly:"ソースのみ",showAll:"すべて表示",showFavoritesOnly:"お気に入りのみ表示",favorites:"お気に入り",showFailedPrints:"失敗した印刷を表示",hideFailedPrints:"失敗した印刷を非表示",hideFailed:"失敗を非表示",allTags:"すべてのタグ",enterNewTag:"新しいタグを入力...",sortNewestFirst:"新しい順",sortOldestFirst:"古い順",sortNameAZ:"名前 A-Z",sortNameZA:"名前 Z-A",sortLargestFirst:"大きい順",sortSmallestFirst:"小さい順",gridView:"グリッド表示",listView:"リスト表示",calendarView:"カレンダー表示",reset:"リセット",colors:"カラー:",matchAnyColor:"いずれかの選択色に一致",matchAllColors:"すべての選択色に一致",clear:"クリア",loading:"アーカイブを読み込み中...",noMatchingArchives:"検索に一致するアーカイブはありません",noArchivesYet:"アーカイブはまだありません",autoCreated:"印刷完了時にアーカイブは自動的に作成されます",unknownPrinter:"不明",noPrinter:"プリンターなし",rightClickOptions:"右クリックでオプション表示",printedBefore:"このモデルは以前印刷されたことがあります",openSource3mf:"ソース3MFをBambu Studioで開く(右クリックでオプション表示)",viewPhotos:"{{count}}枚の写真を表示",openFolder:"フォルダーを開く: {{name}}",projectName:"プロジェクト: {{name}}",makerWorldDesigner:"MakerWorld: {{designer}}",notFromMakerWorld:"MakerWorldではありません",hasTimelapse:"タイムラプスあり",moreOptions:"その他のオプション",downloadF3d:"Fusion 360デザインファイルをダウンロード",listName:"名前",listPrinter:"プリンター",listDate:"日付",listSize:"サイズ",listActions:"アクション"},queue:{title:"印刷キュー",description:"印刷ジョブのスケジュールと管理",addToQueue:"キューに追加",clearQueue:"キューをクリア",clearHistory:"履歴をクリア",emptyQueue:"キューは空です",position:"順番",scheduledTime:"予定時刻",moveUp:"上に移動",moveDown:"下に移動",remove:"削除",requeue:"再キュー",startNow:"今すぐ開始",startPrint:"印刷を開始",stopPrint:"印刷を停止",unassigned:"未割当",printerNumber:"プリンター #{{id}}",staged:"ステージ済み",requiresPreviousSuccess:"前の印刷の成功が必要",autoPowerOff:"自動電源オフ",printingInProgress:"印刷中...",currentlyPrinting:"印刷中",viewArchive:"アーカイブを表示",viewInFileManager:"ファイルマネージャーで表示",itemCount:"{{count}}件",dragToReorder:"ドラッグして並べ替え(ASAPのみ)",overdue:"期限超過",dragReorderTooltip:"順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定された時間に実行されます。",anyModel:"任意の{{model}}{{location}}{{filaments}}",addedBy:"{{username}}が追加",bulkEdit:{title:"{{count}}件のアイテムを編集",description:"変更した設定のみが選択されたアイテムに適用されます。",printer:"プリンター",noChange:"— 変更なし —",queueOptions:"キューオプション",stagedManualStart:"ステージ済み(手動開始)",autoPowerOff:"印刷後に自動電源オフ",requirePreviousSuccess:"前の印刷の成功が必要",printOptions:"印刷オプション",bedLevelling:"ベッドレベリング",flowCalibration:"フローキャリブレーション",vibrationCalibration:"振動キャリブレーション",firstLayerInspection:"第一層検査",timelapse:"タイムラプス",useAms:"AMS使用",on:"オン",off:"オフ",saving:"保存中...",applyChanges:"変更を適用"},bulkActions:{selectAll:"すべて選択",deselectAll:"すべて選択解除",selected:"{{count}}件選択中",editSelected:"選択を編集",cancelSelected:"選択をキャンセル"},permissions:{noStopPermission:"印刷を停止する権限がありません",noStartPermission:"印刷を開始する権限がありません",noEditPermission:"キューアイテムを編集する権限がありません",noCancelPermission:"キューアイテムをキャンセルする権限がありません",noRequeuePermission:"アイテムを再キューする権限がありません",noRemovePermission:"キューアイテムを削除する権限がありません",noClearHistoryPermission:"履歴をクリアする権限がありません"},status:{pending:"待機中",printing:"印刷中",paused:"一時停止",completed:"完了",failed:"失敗",skipped:"スキップ",cancelled:"キャンセル済み",waiting:"待機中"},summary:{printing:"印刷中",queued:"キュー中",totalQueueTime:"合計キュー時間",history:"履歴"},filters:{allPrinters:"すべてのプリンター",allStatus:"すべてのステータス"},sort:{byPosition:"順番で並べ替え",byName:"名前で並べ替え",byPrinter:"プリンターで並べ替え",bySchedule:"スケジュールで並べ替え",byDate:"日付で並べ替え",ascending:"昇順",descending:"降順",ascendingOldest:"昇順(古い順)",descendingNewest:"降順(新しい順)"},empty:{title:"スケジュールされた印刷はありません",description:"アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。"},confirm:{cancelTitle:"スケジュール済み印刷をキャンセル",cancelMessage:"「{{name}}」をキャンセルしますか?",cancelButton:"印刷をキャンセル",stopTitle:"印刷を停止",stopMessage:"現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",removeTitle:"履歴から削除",removeMessage:"「{{name}}」をキュー履歴から削除しますか?",clearHistoryMessage:"{{count}}件の履歴をすべて削除しますか?",thisPrint:"この印刷",thisItem:"このアイテム"},toast:{itemCancelled:"キューアイテムをキャンセルしました",itemRemoved:"キューアイテムを削除しました",printStopped:"印刷を停止しました",printReleased:"印刷をキューに戻しました",clearedHistory:"{{count}}件の履歴をクリアしました",failedToCancel:"アイテムのキャンセルに失敗しました",failedToRemove:"アイテムの削除に失敗しました",failedToStop:"印刷の停止に失敗しました",failedToStart:"印刷の開始に失敗しました",failedToReorder:"キューの並べ替えに失敗しました",failedToClear:"履歴のクリアに失敗しました",failedToUpdateItems:"アイテムの更新に失敗しました",cancelledItems:"{{count}}件のアイテムをキャンセルしました",failedToCancelItems:"アイテムの一括キャンセルに失敗しました"}},stats:{title:"統計",overview:"概要",totalPrints:"総印刷数",successRate:"成功率",totalPrintTime:"総印刷時間",totalFilament:"総フィラメント使用量",totalCost:"総コスト",averagePrintTime:"平均印刷時間",printsPerDay:"1日あたりの印刷数",byPrinter:"プリンター別",byMaterial:"素材別",byMonth:"月別",last7Days:"過去7日間",last30Days:"過去30日間",last90Days:"過去90日間",allTime:"全期間",dashboard:"統計ダッシュボード",dashboardDescription:"3Dプリントアクティビティの概要",loadingStatistics:"統計を読み込み中...",quickStats:"クイック統計",printTime:"印刷時間",filamentUsed:"フィラメント使用量",filamentCost:"フィラメントコスト",energyUsed:"エネルギー使用量",energyCost:"エネルギーコスト",successful:"成功",failed:"失敗",printsByPrinter:"プリンター別印刷数",printerFallback:"プリンター #{{id}}",timeAccuracy:"時間精度",noTimeAccuracyData:"時間精度データがありません",perfectEstimate:"100% = 完全な推定",filamentTypes:"フィラメントタイプ",noFilamentData:"フィラメントデータがありません",printsCount:"{{count}}回印刷",moreTypes:"+{{count}}種類",noPrinterData:"プリンターデータがありません",filamentUsageTrends:"フィラメント使用トレンド",noPrintData:"印刷データがありません",printActivity:"印刷アクティビティ",failureAnalysis30Days:"失敗分析(30日間)",noPrintDataLast30Days:"過去30日間の印刷データがありません",printsFailed:"{{total}}回中{{failed}}回失敗",lastWeek:"先週",failureReasons:"失敗理由",topFailureReasons:"主な失敗理由",unknown:"不明",moreReasons:"+{{count}}件の理由",hiddenCount:"{{count}}件非表示",layoutReset:"レイアウトをリセットしました",resetLayout:"レイアウトをリセット",exportStats:"統計をエクスポート",exportAsCsv:"CSVでエクスポート",exportAsExcel:"Excelでエクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",filament:"フィラメント",cost:"コスト",prints:"プリント",filamentGrams:"フィラメント (g)",weekOf:"週:",periodFilament:"期間フィラメント",periodCost:"期間コスト",avgPerPrint:"プリントあたりの平均",total:"合計",avg:"平均",usageOverTime:"使用量の推移",noDataForTimeRange:"選択した期間のデータがありません",byFilamentType:"フィラメントタイプ別",usage:"使用量",monthlyComparison:"月間比較",noPermissionRecalculate:"コストを再計算する権限がありません",noPermissionResetLayout:"レイアウトをリセットする権限がありません",recalculateCosts:"コストを再計算",recalculateFailed:"コストの再計算に失敗しました",recalculateTooltip:"現在のフィラメント価格に基づいてすべてのプリントコストを再計算します"},profiles:{title:"フィラメントプロファイル",addProfile:"プロファイルを追加",editProfile:"プロファイルを編集",deleteProfile:"プロファイルを削除",material:"素材",brand:"ブランド",color:"色",diameter:"直径",density:"密度",costPerKg:"1kgあたりの価格",spoolWeight:"スプール重量",noProfiles:"プロファイルが登録されていません",deleteConfirm:"このプロファイルを削除しますか?",templateName:"テンプレート名",descriptionOptional:"説明(任意)",searchFields:"フィールドを検索...",presetNamePlaceholder:"マイカスタムプリセット",searchPresets:"プリセットを検索...",connectToCloud:"Bambu Cloudに接続",syncDescription:"デバイス間でスライサープリセットを同期",email:"メールアドレス",password:"パスワード",region:"リージョン",regionGlobal:"グローバル",regionChina:"中国",verificationCode:"認証コード",totpCode:"認証アプリコード",checkEmail:"メール ({{email}}) に届いた6桁のコードを入力してください",enterTotpHint:"認証アプリの6桁のコードを入力してください",accessToken:"アクセストークン",accessTokenHint:"Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)",login:"ログイン",verify:"認証",setToken:"トークン設定",useTokenInstead:"アクセストークンを使用",loginWithEmail:"メールでログイン",loggedIn:"ログインしました",verificationSent:"認証コードをメールに送信しました",enterTotp:"認証アプリのコードを入力してください",tokenSet:"トークンを設定しました",loggedOut:"ログアウトしました",logout:"ログアウト",connectedAs:"接続中:",pageTitle:"プロファイル",pageDescription:"スライサープリセットと圧力キャリブレーションの管理",cloudProfiles:"クラウドプロファイル",kProfiles:"Kプロファイル",scrollToTop:"トップに戻る",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",lastSynced:"最終同期:",duplicate:"複製",myPresetEditable:"マイプリセット(編集可能)",editable:"編集可能",typePreset:"{{type}}プリセット",presetDeleted:"プリセットを削除しました",presetCreated:"プリセットを作成しました",presetUpdated:"プリセットを更新しました",presetExported:"プリセットをエクスポートしました",presetName:"プリセット名",failedToLoadDetails:"プリセットの詳細を読み込めませんでした",failedToLoadProfiles:"プロファイルの読み込みに失敗しました",deletePresetConfirm:"このプリセットを削除しますか?",deletePresetWarning:'"{{name}}"をBambu Cloudから完全に削除します。この操作は元に戻せません。',noPresetsFound:"プリセットが見つかりません",showingPresets:"{{total}}件中{{count}}件を表示",myPresetLegend:"= マイプリセット(編集可能)",typeLabel:"タイプ",typeFilter:"タイプ:",owner:"所有者",myPresets:"マイプリセット",builtIn:"ビルトイン",nozzle:"ノズル",filament:"フィラメント",process:"プロセス",printer:"プリンター",layer:"レイヤー",clearFilters:"フィルターをクリア",noFilamentPresets:"フィラメントプリセットなし",noProcessPresets:"プロセスプリセットなし",noPrinterPresets:"プリンタープリセットなし",compare:"比較",compareMode:"比較モード",comparePresets:"プリセットを比較",compareNow:"比較を実行",compareWithBase:"ベースプリセットと比較",selectAnotherPreset:"同じタイプ({{type}})の別のプリセットを選択",clickTwoPresets:"同じタイプのプリセットを2つクリックして比較",selectFirst:"1. 最初を選択",selectSecond:"2. 2番目を選択",left:"左:",right:"右:",addedCount:"{{count}}件追加",removedCount:"{{count}}件削除",changedCount:"{{count}}件変更",sameCount:"{{count}}件同じ",changes:"変更点",noDifferences:"差分はありません",noFieldsMatch:"検索に一致するフィールドがありません",field:"フィールド",quickTemplates:"クイックテンプレート",templates:"テンプレート",deleteTemplate:"テンプレートを削除",actionCannotBeUndone:"この操作は元に戻せません",confirmDeleteTemplate:'"{{name}}"を削除してもよろしいですか?',templateDeleted:"テンプレートを削除しました",templateUpdated:"テンプレートを更新しました",templateApplied:"テンプレートを適用しました",templateAppliedName:"テンプレート適用: {{name}}",templateSaved:"テンプレートを保存しました",customTemplate:"カスタムテンプレート",noTemplatesYet:"テンプレートはまだありません",createTemplatesHint:"プリセットエディターからテンプレートを作成",noTemplatesSelected:"テンプレートが選択されていません。テンプレートボタンから有効にしてください。",manageTemplatesHint:"メインページのテンプレートボタンからテンプレートを管理",settingsJson:"設定 (JSON)",fieldsCount:"{{count}}フィールド",shownInModals:"モーダルに表示",hiddenInModals:"モーダルで非表示",apply:"適用",saveAsTemplate:"テンプレートとして保存",editPreset:"プリセットを編集",duplicatePreset:"プリセットを複製",createNewPreset:"新しいプリセットを作成",newPreset:"新規プリセット",customizeSettings:"新しいプリセットの設定をカスタマイズ",dropJsonToImport:"JSONファイルをドロップしてインポート",basePreset:"ベースプリセット",selectBasePreset:"ベースプリセットを選択...",inheritsFrom:"継承元:",commonTab:"共通",allFieldsTab:"全フィールド",jsonTab:"JSON",exportToJsonFile:"設定をJSONファイルにエクスポート",importFromJsonFile:"JSONファイルから設定をインポート",commonSettings:"共通設定",currentOverrides:"現在のオーバーライド",availableFields:"利用可能なフィールド",noMatchingFields:"一致するフィールドがありません",allFieldsAdded:"すべてのフィールドが追加済みです",addCustomField:"カスタムフィールドを追加",yourOverrides:"オーバーライド一覧",noOverridesYet:"オーバーライドはまだありません",clickFieldsToAdd:"左のフィールドをクリックして追加",dragDropTip:"ヒント: このモーダルに.jsonファイルをドラッグ&ドロップして設定をインポート",fieldAdded:'フィールド "{{key}}" を追加しました',noOverridesToSave:"保存するオーバーライドがありません",fileImported:"ファイルをインポートしました",fileImportedSuccess:"ファイルを正常にインポートしました",invalidJson:"無効なJSON",noPermissionCreate:"プロファイルを作成する権限がありません",noPermissionDelete:"プロファイルを削除する権限がありません",noPermissionDuplicate:"プロファイルを複製する権限がありません",noPermissionEdit:"プロファイルを編集する権限がありません",noPermissionLogout:"ログアウトする権限がありません",noPermissionManageTemplates:"テンプレートを管理する権限がありません",noPermissionRefresh:"プロファイルを更新する権限がありません"},maintenance:{title:"メンテナンス",overview:"概要",allOk:"すべてのメンテナンスは最新です",dueCount:"{{count}}件の期限到来",dueCount_plural:"{{count}}件の期限到来",warningCount:"{{count}}件の警告",warningCount_plural:"{{count}}件の警告",totalPrintTime:"総印刷時間",nextMaintenance:"次回メンテナンス",nothingDue:"予定なし",tasks:"タスク",lastPerformed:"前回実施日",interval:"間隔",hoursRemaining:"残り{{hours}}時間",hoursOverdue:"{{hours}}時間超過",markDone:"完了にする",performMaintenance:"メンテナンスを実施",history:"履歴",noHistory:"メンテナンス履歴がありません",editPrintHours:"印刷時間を編集",currentHours:"現在の時間",today:"今日",overdue:"期限超過",dueSoon:"まもなく期限",collapse:"折りたたむ",expand:"展開",left:"残り",timeBasedInterval:"時間ベースのインターバル",viewDocumentation:"ドキュメントを表示",printersAssigned:"{{count}}台のプリンターが割り当て済み - クリックして管理",deleteTypeConfirm:"「{{name}}」を削除しますか?",removeFromPrinter:"このプリンターから削除",addLabel:"追加:",maintenanceTypes:"メンテナンスタイプ",systemTypesDescription:"システムタイプとカスタムメンテナンスタスク",addCustomType:"カスタムタイプを追加",intervalType:"インターバルタイプ",printHours:"印刷時間",calendarDays:"カレンダー日数",intervalWithUnit:"インターバル ({{unit}})",days:"日",icon:"アイコン",documentationLink:"ドキュメントリンク(任意)",docLinkPlaceholder:"ドキュメントリンク(任意)",namePlaceholder:"例:HEPAフィルター交換",assignToPrinters:"プリンターに割り当て",selectAtLeastOnePrinter:"プリンターを1台以上選択してください",addType:"タイプを追加",custom:"カスタム",assignedToPrinters:"割り当て済みプリンター:",noPrintersAssigned:"プリンター未割り当て",intervalOverrides:"インターバルのオーバーライド",customizeIntervals:"プリンターごとにインターバルをカスタマイズ",addPrintersForMaintenance:"メンテナンスインターバルを設定するにはプリンターを追加してください",reset:"リセット",countOverdue:"{{count}}件が期限超過",countDueSoon:"{{count}}件がまもなく期限",allGood:"問題なし",nHours:"{{count}}時間",tasksOverdue:"{{count}}件のタスクが期限超過",configureDescription:"メンテナンスタイプとインターバルを設定",addPrintersToTrack:"メンテナンスを追跡するにはプリンターを追加してください",markedComplete:"メンテナンスを完了としてマーク",typeUpdated:"メンテナンスタイプを更新しました",typeDeleted:"メンテナンスタイプを削除しました",typeAdded:"メンテナンスタイプを追加しました",hoursUpdated:"印刷時間を更新しました",printerAssigned:"プリンターを割り当てました",printerRemoved:"プリンターを削除しました",wikiUrlPlaceholder:"https://wiki.bambulab.com/...",duration:{oneDay:"1日",days:"{{count}}日",weeks:"{{count}}週間",months:"{{count}}ヶ月",oneWeek:"1週間",nWeeks:"{{count}}週間",oneMonth:"1ヶ月",nMonths:"{{count}}ヶ月",oneYear:"1年"},noPermissionCreate:"メンテナンス記録を作成する権限がありません",noPermissionUpdate:"メンテナンス記録を更新する権限がありません",noPermissionPerform:"メンテナンスを実行する権限がありません",noPermissionRemove:"メンテナンス記録を削除する権限がありません",noPermissionAssign:"メンテナンスを割り当てる権限がありません",noPermissionEditTypes:"メンテナンスタイプを編集する権限がありません",noPermissionDeleteTypes:"メンテナンスタイプを削除する権限がありません",noPermissionEditIntervals:"メンテナンス間隔を編集する権限がありません",noPermissionEditHours:"メンテナンス時間を編集する権限がありません",types:{lubricateRails:"リニアレールの潤滑",cleanNozzle:"ノズル/ホットエンドの清掃",checkBelts:"ベルト張力の確認",cleanBuildPlate:"ビルドプレートの清掃",checkExtruder:"エクストルーダーギアの確認",checkCooling:"冷却ファンの確認",generalInspection:"総合点検",cleanCarbonRods:"カーボンロッドの清掃",checkPtfeTube:"PTFEチューブの確認",replaceHepaFilter:"HEPAフィルター交換",replaceCarbonFilter:"カーボンフィルター交換",lubricateLeftNozzleRail:"左ノズルレールの潤滑"}},settings:{title:"設定",general:"一般",appearance:"外観",notifications:"通知",smartPlugs:"スマートプラグ",tabSpoolman:"Spoolman",updates:"アップデート",language:"言語",languageDescription:"表示言語を選択してください",theme:"テーマ",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム設定に従う",defaultView:"デフォルト画面",defaultViewDescription:"アプリ起動時に表示するページ",checkForUpdates:"アップデートを確認",autoUpdate:"自動アップデート",currentVersion:"現在のバージョン",latestVersion:"最新バージョン",upToDate:"最新です",updateAvailable:"アップデートあり",telemetry:"匿名テレメトリ",telemetryDescription:"匿名の使用状況データを送信してBamBuddyの改善に協力する",telemetryLearnMore:"詳しく見る",telemetryInfoTitle:"どのようなデータが収集されますか?",telemetryInfoIntro:"BamBuddyはアプリの利用者数、使用バージョン、プリンターモデルを把握するために最小限の匿名データを収集します。これはバグ修正や新機能の優先順位付けに役立ちます。",telemetryInfoCollected:"収集するデータ:",telemetryInfoItem1:"ランダムなインストールID(個人やハードウェアとは紐付きません)",telemetryInfoItem2:"使用中のアプリバージョン",telemetryInfoItem3:"プリンターのモデル名(例: X1C, P1S)- 名前やシリアル番号は含みません",telemetryInfoItem4:"タイムスタンプ(日次/週次のアクティブユーザー数の計測用)",telemetryInfoNotCollected:"収集しないデータ:",telemetryInfoNotItem1:"IPアドレスはハッシュ化され、復元できません",telemetryInfoNotItem2:"プリンター名、シリアル番号、アクセスコード",telemetryInfoNotItem3:"印刷履歴、ファイル名、その他の個人的なコンテンツ",telemetryInfoNotItem4:"個人を特定できる情報",telemetryInfoFooter:"テレメトリはいつでも無効にできます。インストールIDはランダムに生成され、個人を追跡することはできません。",notificationLanguage:"通知の言語",notificationLanguageDescription:"プッシュ通知の言語",notificationProviders:"通知プロバイダー",addProvider:"プロバイダーを追加",editProvider:"プロバイダーを編集",providerType:"プロバイダーの種類",testNotification:"テスト通知",testSuccess:"テスト通知を送信しました",testFailed:"テスト通知の送信に失敗しました",quietHours:"おやすみ時間",quietHoursDescription:"この時間帯は通知を送信しません",quietHoursStart:"開始",quietHoursEnd:"終了",events:{title:"通知イベント",printStart:"印刷開始",printComplete:"印刷完了",printFailed:"印刷失敗",printStopped:"印刷中止",printProgress:"進捗マイルストーン",printProgressDescription:"25%, 50%, 75%で通知",printerOffline:"プリンターオフライン",printerError:"プリンターエラー",filamentLow:"フィラメント残量低下",maintenanceDue:"メンテナンス期限",maintenanceDueDescription:"メンテナンスが必要なときに通知"},smartPlug:{title:"スマートプラグ",add:"スマートプラグを追加",edit:"スマートプラグを編集",name:"名前",ipAddress:"IPアドレス",linkedPrinter:"連携プリンター",autoOn:"自動電源オン",autoOnDescription:"印刷開始時に電源を入れる",autoOff:"自動電源オフ",autoOffDescription:"印刷完了後に電源を切る",offDelay:"オフ遅延",offDelayMinutes:"印刷後の待機時間(分)",offDelayTemp:"ノズル温度が下回ったとき",currentState:"現在の状態",turnOn:"電源オン",turnOff:"電源オフ"},spoolman:{title:"Spoolman連携",description:"Spoolmanに接続してフィラメント在庫を管理します。AMSデータは自動的に同期されます。",howSyncWorks:"同期の仕組み",syncInfo1:"公式Bambu LabスプールのみRFIDで同期されます",syncInfo2:"新しいスプールは初回同期時にSpoolmanに自動作成されます",syncInfo3:"サードパーティ・詰め替えスプールはスキップされます",linkingExisting:"既存スプールの連携",linkingExistingDesc:"既存のSpoolmanスプールをAMSに連携するには、AMSスロットにカーソルを合わせて「Spoolmanに連携」をクリックしてください。",enable:"Spoolmanを有効化",enableDesc:"Spoolmanサーバーとフィラメントデータを同期",url:"Spoolman URL",urlHint:"SpoolmanサーバーのURL(例: http://localhost:7912)",syncMode:"同期モード",syncModeAuto:"自動",syncModeManual:"手動のみ",syncModeAutoDesc:"変更が検出されるとAMSデータが自動同期されます",syncModeManualDesc:"手動トリガー時のみ同期",statusLabel:"ステータス:",connected:"接続中",disconnected:"未接続",disconnect:"切断",connect:"接続",syncAmsData:"AMSデータを同期",syncAmsDataDesc:"プリンターのAMSデータをSpoolmanに手動同期",allPrinters:"すべてのプリンター",sync:"同期",syncSuccess:"{{count}}個のスプールを同期しました",syncWithErrors:"{{count}}個のスプールを同期({{errorCount}}件のエラー)",spoolsSkipped:"{{count}}個のスプールをスキップ",showAll:"すべて表示",showLess:"折りたたむ",andMore:"...他{{count}}件",errors:"エラー:",linkToSpoolman:"Spoolmanに連携",linkingAmsTray:"連携するAMSトレイ:",spoolUuid:"スプールUUID:",selectSpoolToLink:"連携するSpoolmanスプールを選択:",unknownFilament:"不明なフィラメント",noUnlinkedSpools:"Spoolmanに未連携のスプールが見つかりません。",allSpoolsLinked:"すべてのスプールはAMSトレイに連携済みです。",linking:"連携中...",linkSpool:"スプールを連携",linkTooltip:"このスプールをSpoolmanスプールに連携",noUnlinked:"未連携のスプールがありません",disableWeightSync:"AMS推定重量同期を無効化",disableWeightSyncDesc:"AMS推定値から残量を更新しません。AMSの割合ベースの推定よりもSpoolmanの使用量追跡を優先する場合に使用してください。新しいスプールは引き続きAMS推定値を初期重量として使用します。",reportPartialUsage:"失敗した印刷の部分使用量を報告",reportPartialUsageDesc:"印刷が失敗またはキャンセルされた場合、レイヤー進捗に基づいてその時点までの推定フィラメント使用量を報告します。"},subtitle:"Bambuddyの設定",saved:"設定を保存しました",saveFailed:"保存に失敗しました: {{error}}",tabGeneral:"一般",tabSmartPlugs:"スマートプラグ",tabNotifications:"通知",tabFilament:"フィラメント",tabNetwork:"ネットワーク",tabApiKeys:"APIキー",tabVirtualPrinter:"仮想プリンター",tabUsers:"ユーザー",tabGlobalEmail:"グローバルメール",tabBackup:"バックアップ",tabs:{general:"一般",smartPlugs:"スマートプラグ",notifications:"通知",filament:"フィラメント",network:"ネットワーク",apiKeys:"APIキー",virtualPrinter:"仮想プリンター",users:"ユーザー",backup:"バックアップ",globalEmail:"グローバルメール"},email:{smtpSettings:"SMTP設定",smtpHost:"SMTPサーバー",smtpPort:"SMTPポート",security:"セキュリティ",authentication:"認証",username:"ユーザー名",password:"パスワード",fromEmail:"送信元メールアドレス",fromName:"送信者名",testConnection:"SMTP接続テスト",testRecipient:"テスト受信者メール",sendTest:"テストメール送信",sending:"送信中...",save:"設定を保存",saving:"保存中...",advancedAuth:"高度な認証",advancedAuthEnabled:"高度な認証が有効です",advancedAuthDisabled:"高度な認証が無効です",advancedAuthDisabledDesc:"高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。",enable:"有効にする",disable:"無効にする",feature1:"パスワードは自動生成され、新規ユーザーにメールで送信されます",feature2:"ユーザーはユーザー名またはメールでログインできます",feature3:"パスワード忘れ機能が利用可能です",feature4:"管理者はメールでユーザーパスワードをリセットできます"},dateFormat:"日付形式",timeFormat:"時刻形式",systemDefault:"システムデフォルト",dateFormatUS:"US (MM/DD/YYYY)",dateFormatEU:"EU (DD/MM/YYYY)",dateFormatISO:"ISO (YYYY-MM-DD)",timeFormat12h:"12時間 (3:30 PM)",timeFormat24h:"24時間 (15:30)",defaultPrinter:"デフォルトプリンター",noDefaultPrinter:"デフォルトなし(毎回選択)",defaultPrinterDescription:"アップロード、再印刷、その他の操作でこのプリンターを事前選択します。",sidebarOrder:"サイドバーの順序",sidebarOrderDescription:"サイドバーの項目をドラッグ&ドロップで並べ替えできます。ここでデフォルトの順序にリセットできます。",reset:"リセット",darkMode:"ダークモード",lightMode:"ライトモード",active:"(有効)",background:"背景",accent:"アクセント",style:"スタイル",bgNeutral:"ニュートラル",bgWarm:"ウォーム",bgCool:"クール",bgOLED:"OLED ブラック",bgSlate:"スレートブルー",bgForest:"フォレストグリーン",accentGreen:"グリーン",accentTeal:"ティール",accentBlue:"ブルー",accentOrange:"オレンジ",accentPurple:"パープル",accentRed:"レッド",styleClassic:"クラシック",styleGlow:"グロー",styleVibrant:"ビブラント",themeToggleHint:"サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。",archiveSettings:"アーカイブ設定",autoArchive:"自動アーカイブ",autoArchiveDescription:"印刷完了時に3MFファイルを自動的に保存",saveThumbnails:"サムネイルを保存",saveThumbnailsDescription:"3MFファイルからプレビュー画像を抽出して保存",captureFinishPhoto:"完了写真を撮影",captureFinishPhotoDescription:"印刷完了時にプリンターカメラから写真を撮影",ffmpegNotInstalled:"ffmpegがインストールされていません",ffmpegInstruction:"カメラキャプチャにはffmpegが必要です。brew install ffmpeg(macOS)またはapt install ffmpeg(Linux)でインストールしてください。",camera:"カメラ",cameraViewMode:"カメラ表示モード",cameraNewWindow:"新しいウィンドウ",cameraEmbedded:"埋め込みオーバーレイ",cameraEmbeddedDescription:"メイン画面上のリサイズ可能なオーバーレイでカメラを開きます",cameraNewWindowDescription:"別のブラウザウィンドウでカメラを開きます",costTracking:"コスト追跡",defaultFilamentCost:"デフォルトフィラメントコスト(kg単位)",currency:"通貨",electricityCost:"電気代(kWh単位)",energyDisplayMode:"エネルギー表示モード",energyPrintsOnly:"印刷のみ",energyTotalConsumption:"総消費量",energyPrintsOnlyDescription:"ダッシュボードに印刷中に使用されたエネルギーの合計を表示",energyTotalDescription:"ダッシュボードにスマートプラグの累計エネルギーを表示",fileManager:"ファイルマネージャー",archiveOnPrint:"印刷時のアーカイブエントリ作成",archiveAlways:"常にアーカイブエントリを作成",archiveNever:"アーカイブエントリを作成しない",archiveAsk:"毎回確認",archiveOnPrintDescription:"ファイルマネージャーから印刷する際、オプションでアーカイブエントリを作成",lowDiskWarning:"ディスク容量不足の警告",lowDiskWarningDescription:"空きディスク容量がこのしきい値を下回ると警告を表示",checkPrinterFirmware:"プリンターファームウェアの確認",checkPrinterFirmwareDescription:"Bambu Labのプリンターファームウェア更新を確認",checkForUpdatesDescription:"起動時に自動的に新しいバージョンを確認",checkNow:"今すぐ確認",releaseNotes:"リリースノート",viewOnGitHub:"GitHubで表示",updateViaDocker:"Docker Composeでアップデート:",installUpdate:"アップデートをインストール",close:"閉じる",dataManagement:"データ管理",backupData:"データのバックアップ",backupDescription:"設定、プロバイダー、プリンターなどをエクスポート",export:"エクスポート",restoreBackup:"バックアップの復元",restoreDescription:"重複処理オプション付きでバックアップファイルから設定をインポート",restore:"復元",clearLogs:"通知ログを削除",clearLogsDescription:"30日以上前の通知ログを削除",clear:"削除",resetUI:"UIの設定をリセット",resetUIDescription:"サイドバーの順序、テーマ、表示モード、レイアウト設定をリセットします。プリンター、アーカイブ、設定には影響しません。",clearLogsTitle:"通知ログを削除",clearLogsMessage:"30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。",clearLogsConfirm:"ログを削除",clearLogsFailed:"ログの削除に失敗しました",resetUITitle:"UIの設定をリセット",resetUIMessage:"すべてのUI設定をデフォルトにリセットします:サイドバーの順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定には影響しません。クリア後にページが再読み込みされます。",resetPreferences:"設定をリセット",preferencesReset:"UI設定をリセットしました。更新中...",externalUrl:"外部URL",externalUrlDescription:"Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。",bambuddyUrl:"Bambuddy URL",externalUrlHint:"プロトコルとポートを含めてください(例: http://192.168.1.100:8000)",ftpRetry:"FTPリトライ",ftpRetryDescription:"プリンターのWi-Fiが不安定な場合にFTP操作をリトライします。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェアアップデートに適用されます。",enableRetry:"リトライを有効化",enableRetryDescription:"失敗したFTP操作を自動的にリトライ",retryAttempts:"リトライ回数",times:"回",retryAttemptsDescription:"諦めるまでのリトライ回数(1-10)",retryDelay:"リトライ間隔",seconds:"秒",retryDelayDescription:"リトライ間の待ち時間(1-30)",connectionTimeout:"接続タイムアウト",connectionTimeoutDescription:"遅い接続用のソケットタイムアウト。Wi-Fiが弱いA1/A1 Miniプリンターの場合は増やしてください(10-120)",homeAssistant:"Home Assistant",connected:"接続済み",disconnected:"未接続",homeAssistantDescription:"Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。",enableHA:"Home Assistantを有効化",enableHADescription:"Home Assistantでスマートプラグを制御",haUrl:"Home Assistant URL",haToken:"長期アクセストークン",haTokenHint:"HAでトークンを作成: プロフィール → 長期アクセストークン → トークン作成",testConnection:"接続テスト",connectionSuccessful:"接続成功",connectionFailed:"接続失敗",haConnectionSuccess:"Home Assistantへの接続に成功しました。",haConnectionFailed:"Home Assistantへの接続に失敗しました。",mqttPublishing:"MQTT配信",mqttDescription:"BamBuddyイベントを外部MQTTブローカーに配信し、Node-RED、Home Assistant、その他の自動化システムと連携します。",enableMqtt:"MQTTを有効化",enableMqttDescription:"外部MQTTブローカーにイベントを配信",brokerHostname:"ブローカーホスト名",port:"ポート",useTls:"TLSを使用",usernameOptional:"ユーザー名(オプション)",passwordOptional:"パスワード(オプション)",topicPrefix:"トピックプレフィックス",connectedTo:"接続先:",notConnected:"未接続",smartPlugsDescription:"スマートプラグ(TasmotaまたはHome Assistant)を接続して、電源制御を自動化し、プリンターのエネルギー消費を追跡します。",turnAllPlugsOn:"すべてのプラグをオン",turnAllPlugsOff:"すべてのプラグをオフ",allOn:"全オン",allOff:"全オフ",addSmartPlug:"スマートプラグを追加",energySummary:"エネルギー概要",currentPower:"現在の電力",today:"今日",yesterday:"昨日",total:"合計",enablePlugsForEnergy:"プラグを有効にしてエネルギー概要を表示",noSmartPlugs:"スマートプラグが設定されていません",noSmartPlugsDescription:"Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。",addFirstSmartPlug:"最初のスマートプラグを追加",providers:"プロバイダー",log:"ログ",testAll:"すべてテスト",add:"追加",testResults:"テスト結果",dismiss:"閉じる",noProviders:"プロバイダーが設定されていません",noProvidersDescription:"アラートを受信するにはプロバイダーを追加してください。",messageTemplates:"メッセージテンプレート",templatesDescription:"各イベントの通知メッセージをカスタマイズします。",noTemplates:"テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。",testAllSuccess:"すべて{{count}}件のプロバイダーのテストに成功しました!",testAllPartial:"{{success}}/{{tested}}件のプロバイダーが成功",testProvidersFailed:"プロバイダーのテストに失敗しました: {{error}}",bulkPlugSuccess:"すべて{{count}}個のプラグを{{action}}にしました",bulkPlugPartial:"{{success}}個のプラグを{{action}}にしました、{{failed}}個が失敗",bulkPlugFailed:"失敗: {{error}}",apiKeys:"APIキー",apiKeysDescription:"外部連携やWebhook用のAPIキーを作成します。",createKey:"キーを作成",apiKeyCreated:"APIキーを作成しました",apiKeyDeleted:"APIキーを削除しました",apiKeySuccess:"APIキーが正常に作成されました",apiKeyCopyWarning:"今すぐこのキーをコピーしてください - 再表示されません!",keyCopied:"キーをクリップボードにコピーしました",keyCopyFailed:"キーのコピーに失敗しました",keyAddedToBrowser:"キーをAPIブラウザに追加しました",useInBrowser:"APIブラウザで使用",createNewApiKey:"新しいAPIキーを作成",keyName:"キー名",permissions:"権限",readStatus:"ステータスの読み取り",readStatusDescription:"プリンターのステータスとキューを表示",manageQueue:"キューの管理",manageQueueDescription:"印刷キューへのアイテムの追加と削除",controlPrinter:"プリンターの制御",controlPrinterDescription:"印刷の一時停止、再開、停止",cancel:"キャンセル",lastUsed:"最終使用:",badgeRead:"読取",badgeQueue:"キュー",badgeControl:"制御",noApiKeys:"APIキーがありません",noApiKeysDescription:"外部サービスとの連携用にAPIキーを作成してください。",createFirstKey:"最初のキーを作成",deleteApiKeyTitle:"APIキーを削除",deleteApiKeyMessage:"このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。",deleteKey:"キーを削除",webhookEndpoints:"Webhookエンドポイント",webhookApiKeyHint:"X-API-KeyヘッダーでAPIキーを使用してください。",webhookGetAll:"すべてのプリンターステータスを取得",webhookGetOne:"特定のプリンターステータスを取得",webhookQueue:"印刷キューに追加",webhookPause:"印刷を一時停止",webhookResume:"印刷を再開",webhookStop:"印刷を停止",apiBrowser:"APIブラウザ",apiBrowserDescription:"すべての利用可能なAPIエンドポイントを探索してテストします。",apiKeyForTesting:"テスト用APIキー",apiKeyHeaderHint:"このキーはリクエストのX-API-Keyヘッダーとして送信されます。",apiKeyCreateFailed:"APIキーの作成に失敗しました: {{error}}",apiKeyDeleteFailed:"APIキーの削除に失敗しました: {{error}}",amsThresholds:"AMS表示しきい値",amsThresholdsDescription:"AMS湿度と温度インジケーターの色しきい値を設定します。",humidity:"湿度",goodGreen:"良好(緑)≤",fairOrange:"普通(オレンジ)≤",aboveFairBad:"普通のしきい値以上は赤(悪い)で表示",temperature:"温度",goodBlue:"良好(青)≤",aboveFairHot:"普通のしきい値以上は赤(高温)で表示",historyRetention:"履歴の保持",keepHistoryFor:"センサー履歴の保持期間",days:"日",historyRetentionDescription:"古い湿度と温度データは自動的に削除されます",printModal:"印刷ダイアログ",expandMapping:"カスタムマッピングをデフォルトで展開",expandMappingDescription:"複数のプリンターに印刷する際、プリンターごとのAMSマッピングを展開して表示",currentUser:"現在のユーザー",role:"ロール:",roleAdmin:"管理者",roleUser:"ユーザー",manageUsers:"ユーザー管理",disableAuth:"認証を無効化",rolePermissions:"ロール権限",rolePermissionsDescription:"各ロールの権限の概要。",adminPerm1:"プリンター設定の管理",adminPerm2:"ユーザーの作成、編集、削除",adminPerm3:"すべてのシステム機能へのアクセス",userPerm1:"印刷ジョブの送信",userPerm2:"ファイルとアーカイブの管理",userPerm3:"フィラメントの管理",disableAuthTitle:"認証を無効化",disableAuthMessage:"認証を無効にしてもよろしいですか?これにより、Bambuddyインスタンスはログインなしでアクセス可能になります。すべてのユーザーはデータベースに残りますが、認証は無効になります。",disableAuthConfirm:"認証を無効化",authDisabledSuccess:"認証を正常に無効化しました",disableAuthFailed:"認証の無効化に失敗しました",unknownError:"不明なエラー",haUrlPlaceholder:"http://homeassistant.local:8123",haTokenPlaceholder:"長期アクセストークン",mqttHostPlaceholder:"例: 192.168.1.100",leaveEmptyAnonymous:"匿名接続の場合は空欄",mqttTopicDefault:"bambuddy",apiKeyNamePlaceholder:"例: Home Assistantインテグレーション",apiKeyTestPlaceholder:"テスト用APIキーを貼り付け",unnamedKey:"名前なしキー",plugsOnline:"{{online}}/{{total}} オンライン",passed:"{{count}}件 成功",failed:"{{count}}件 失敗",externalUrlPlaceholder:"http://192.168.1.100:8000",bulkPlugTitle:"すべてのプラグを{{action}}",bulkPlugMessage:"有効な{{count}}個のスマートプラグをすべて{{action}}しますか?",bulkPlugConfirm:"すべて{{action}}",updateCheckFailed:"確認失敗: {{error}}",releaseNotesTitle:"リリースノート - v{{version}}",mqttTopicsHint:"トピック: {{prefix}}/printers//status など",virtualPrinterUpdated:"仮想プリンター設定を更新しました",vp:{title:"仮想プリンター",running:"稼働中",stopped:"停止中",description:"Bambu StudioやOrcaSlicerに表示される仮想プリンターを有効にします。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。",enable:"仮想プリンターを有効化",visibleInSlicer:"スライサーの検出リストに「Bambuddy」として表示",notVisible:"スライサーに表示されません",printerModel:"プリンターモデル",printerModelDescription:"エミュレートするプリンターモデルを選択します。",modelRestartWarning:"モデルを変更すると仮想プリンターが再起動されます",accessCode:"アクセスコード",accessCodeSet:"アクセスコードが設定済み",noAccessCode:"アクセスコード未設定 - 有効化に必要です",accessCodeRequired:"先にアクセスコードを設定してください",accessCodeEmpty:"アクセスコードは空にできません",accessCodeLength:"アクセスコードは8文字である必要があります",accessCodeHint:"8文字である必要があります。スライサーの認証に使用されます。",mode:"モード",modeArchive:"アーカイブ",modeArchiveDesc:"ファイルを即座にアーカイブ",modeReview:"レビュー",modeReviewDesc:"アーカイブ前にレビューとタグ付け",modeQueue:"キュー",modeQueueDesc:"アーカイブしてキューに追加",setupRequired:"セットアップが必要",setupDescription:"仮想プリンター機能を使用するには、追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。",readSetupGuide:"有効化する前にセットアップガイドをお読みください",howItWorks:"仕組み:",step1:"お使いのプラットフォームのセットアップガイドを完了する",step2:"仮想プリンターを有効にしてアクセスコードを設定する",step3:"Bambu StudioまたはOrcaSlicerで「プリンターを追加」を開く",step4:"検出リストに「Bambuddy」プリンターが表示される",step5:"設定したアクセスコードで接続する",step6:"Bambuddyに「印刷」すると、3MFファイルがアーカイブされる",statusDetails:"ステータス詳細",printerName:"プリンター名",model:"モデル",serialNumber:"シリアルナンバー",pendingFiles:"保留中のファイル",modeProxy:"プロキシ",modeProxyDesc:"実際のプリンターに中継",descriptionProxy:"スライサーのトラフィックを実際のプリンターに中継するプロキシを有効にし、任意のネットワーク経由でリモート印刷を可能にします。",proxyingTo:"{{name}}にプロキシ中",notActive:"非アクティブ",targetPrinterTitle:"ターゲットプリンター",targetPrinterConfigured:"プロキシターゲット設定済み",targetPrinterNotConfigured:"ターゲットプリンター未選択 - プロキシモードに必要です",targetPrinterPlaceholder:"プリンターを選択...",targetPrinterHint:"スライサーのトラフィックを中継するプリンターを選択します。プリンターはLANモードである必要があります。",targetPrinterNoPrinters:"プリンターが設定されていません。プロキシモードを使用するには、まずプリンターを追加してください。",remoteInterfaceTitle:"スライサーネットワークインターフェース",remoteInterfaceConfigured:"SSDPプロキシ有効",remoteInterfaceOptional:"オプション - ネットワーク間のSSDPディスカバリー用",remoteInterfacePlaceholder:"スライサーネットワークのインターフェースを選択...",remoteInterfaceHint:"スライサーに接続されているネットワークインターフェースを選択します。Bambu Studioでの自動プリンター検出を有効にします。",targetPrinterRequired:"先にターゲットプリンターを選択してください",ftpPort:"FTPポート",mqttPort:"MQTTポート",ftpConnections:"FTP接続数",mqttConnections:"MQTT接続数",targetPrinterStatus:"ターゲットプリンター",howItWorksProxy:"仕組み(プロキシモード)",proxyStep1:"ターゲットプリンターを選択(LANモードである必要があります)",proxyStep2:"クロスネットワーク時:スライサーネットワークインターフェースを選択",proxyStep3:"プロキシを有効化 - プリンターがSSDPでスライサー検出に表示されます",proxyStep4:"プリンターのアクセスコードで接続",proxyStep5:"通常通り印刷 - トラフィックはBambuddyを経由して中継されます",proxyStep6:"カメラストリーミングにはNAT/IP転送が必要です(ドキュメント参照)"},enterNewCodeToChange:"新しいコードを入力して変更",enter8CharCode:"8文字のコードを入力",notificationTitlePlaceholder:"通知タイトル...",notificationBodyPlaceholder:"通知本文...",templateTitleRequired:"タイトルは必須です",templateBodyRequired:"本文は必須です",editTemplate:"テンプレートを編集: {{name}}",templateTitle:"タイトル",templateBody:"本文",availableVariables:"利用可能な変数",insertVariableHint:"クリックして本文のカーソル位置に挿入",livePreview:"ライブプレビュー",loadingPreview:"プレビューを読み込み中...",previewTitle:"タイトル:",previewBody:"本文:",enterTemplateToPreview:"テンプレートの内容を入力するとプレビューが表示されます",resetToDefault:"デフォルトに戻す",noExternalLinks:"外部リンクが設定されていません",clickAddLink:"「リンクを追加」をクリックして追加",deleteLink:"リンクを削除",deleteLinkConfirm:"「{{name}}」を削除しますか?この操作は取り消せません。",editLink:"リンクを編集",addExternalLink:"外部リンクを追加",addLink:"リンクを追加",sidebarLinks:"サイドバーリンク",sidebarLinksDescription:"外部リンクをサイドバーナビゲーションに追加します。ドラッグで並べ替え。",linkNamePlaceholder:"マイリンク",linkNameLabel:"名前",linkUrlLabel:"URL",linkIconLabel:"アイコン",linkCustomIcon:"カスタムアイコン",linkCustomIconHint:"PNG, JPG, GIF, SVG, WebP, ICO。最大1MB。",linkChoosePresetIcon:"またはプリセットアイコンを選択",linkNameRequired:"名前は必須です",linkUrlRequired:"URLは必須です",linkUrlInvalid:"URLは http:// または https:// で始まる必要があります",linkInvalidImageType:"有効な画像ファイルを選択してください(PNG, JPG, GIF, SVG, WebP, ICO)",linkImageTooLarge:"画像ファイルは1MB以下にしてください",removeCustomIcon:"カスタムアイコンを削除",jsonRequestBody:"JSONリクエストボディ...",searchEndpoints:"エンドポイントを検索...",groups:"グループ",addGroup:"グループを追加",noGroupsFound:"グループが見つかりません",systemGroup:"システム",noDescription:"説明なし",users:"ユーザー",addUser:"ユーザーを追加",noUsersFound:"ユーザーが見つかりません",admin:"管理者",authentication:"認証",authEnableDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティ保護を行います。",authSecuredDescription:"Bambuddyインスタンスは認証で保護されています。",enable:"有効にする",disable:"無効にする",changePassword:"パスワードを変更",backup:"バックアップ",backupAndRestore:"バックアップと復元",backupAndRestoreDescription:"Bambuddyデータのバックアップを作成および復元します",goToBackup:"バックアップへ移動",homeAssistantDescriptionFull:"Home Assistantに接続してスマートホームデバイスを制御します",usersCount:"{{count}}人のユーザー",permissionsCount:"{{count}}個の権限",authDisabledTitle:"認証が無効です",authDisabledDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。",authFeature1:"システムへのアクセスにログインを要求",authFeature2:"グループベースの権限を持つ複数のユーザーを作成",authFeature3:"50以上のきめ細かい権限でアクセスを制御",enableAuthentication:"認証を有効にする",createUser:"ユーザーを作成",username:"ユーザー名",enterUsername:"ユーザー名を入力",password:"パスワード",enterPassword:"パスワードを入力(6文字以上)",confirmPassword:"パスワードの確認",confirmPasswordPlaceholder:"パスワードを確認",passwordsDoNotMatch:"パスワードが一致しません",groupsLabel:"グループ",systemLabel:"(システム)",noGroupsAvailable:"利用可能なグループがありません",creating:"作成中...",editUser:"ユーザーを編集",leaveBlankToKeep:"(現在のパスワードを維持する場合は空白)",enterNewPassword:"新しいパスワードを入力",confirmNewPassword:"新しいパスワードを確認",deleteUser:"ユーザーを削除",deleteUserConfirm:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",createGroup:"グループを作成",editGroup:"グループを編集",groupName:"グループ名",enterGroupName:"グループ名を入力",systemGroupNameReadonly:"システムグループ名は変更できません",descriptionLabel:"説明",enterDescription:"説明を入力(任意)",permissionsSelected:"権限({{count}}件選択中)",deleteGroup:"グループを削除",deleteGroupConfirm:"このグループを削除してもよろしいですか?このグループのユーザーはこれらの権限を失います。",changePasswordTitle:"パスワードの変更",currentPassword:"現在のパスワード",enterCurrentPassword:"現在のパスワードを入力",newPassword:"新しいパスワード",enterNewPasswordMin6:"新しいパスワードを入力(6文字以上)",confirmNewPasswordPlaceholder:"新しいパスワードを確認",passwordMinLength:"パスワードは6文字以上である必要があります",passwordChanged:"パスワードが正常に変更されました",failedToChangePassword:"パスワードの変更に失敗しました",changingPassword:"変更中...",prometheusTitle:"Prometheusメトリクス",prometheusDescriptionPre:"プリンターメトリクスを",prometheusDescriptionPost:"でPrometheus/Grafanaモニタリング用に公開します。",enableMetricsEndpoint:"メトリクスエンドポイントを有効化",exposePrometheusData:"プリンターデータをPrometheus形式で公開",bearerTokenOptional:"Bearerトークン(任意)",bearerTokenPlaceholder:"認証不要の場合は空欄のまま",bearerTokenHint:"設定した場合、リクエストに次のヘッダーが必要: ",availableMetrics:"利用可能なメトリクス",metricConnectionStatus:"接続状態",metricPrinterState:"プリンター状態(アイドル/印刷中など)",metricPrintProgress:"印刷進捗 0-100%",metricBedTemp:"ベッド温度",metricNozzleTemp:"ノズル温度",metricPrintsTotal:"結果別の合計印刷数",metricAndMore:"...その他(レイヤー、ファン、キュー、フィラメント使用量)"},notification:{printStarted:{title:"印刷開始",body:"{{printer}}: {{filename}} の印刷を開始しました"},printCompleted:{title:"印刷完了",body:"{{printer}}: {{filename}} が正常に完了しました"},printFailed:{title:"印刷失敗",body:"{{printer}}: {{filename}} が失敗しました"},printStopped:{title:"印刷中止",body:"{{printer}}: {{filename}} が中止されました"},printProgress:{title:"印刷進捗",body:"{{printer}}: {{filename}} は {{percent}}% 完了"},printerOffline:{title:"プリンターオフライン",body:"{{printer}} がオフラインです"},printerError:{title:"プリンターエラー",body:"{{printer}}: {{error}}"},filamentLow:{title:"フィラメント残量低下",body:"{{printer}}: フィラメントが残りわずかです"},maintenanceDue:{title:"メンテナンス期限",body:"{{printer}}: {{items}} の対応が必要です"}},errors:{generic:"問題が発生しました",networkError:"ネットワークエラーです。接続を確認してください。",notFound:"見つかりません",unauthorized:"認証エラー",serverError:"サーバーエラー",validationError:"入力内容を確認してください",printerConnectionFailed:"プリンターへの接続に失敗しました",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",loadFailed:"データの読み込みに失敗しました"},confirm:{delete:"削除しますか?",unsavedChanges:"保存されていない変更があります。このページを離れますか?",clearQueue:"キューをクリアしますか?"},calendar:{months:{january:"1月",february:"2月",march:"3月",april:"4月",may:"5月",june:"6月",july:"7月",august:"8月",september:"9月",october:"10月",november:"11月",december:"12月"},daysShort:{sun:"日",mon:"月",tue:"火",wed:"水",thu:"木",fri:"金",sat:"土"}},notificationLog:{title:"通知ログ",lastDays:"過去{{days}}日間:",notifications:"件の通知",sent:"送信済み",failed:"失敗",last24Hours:"過去24時間",showFailedOnly:"失敗のみ表示",clearOld:"古いログを削除",noFailedNotifications:"失敗した通知はありません",noNotificationsLogged:"通知ログはありません",unknownProvider:"不明なプロバイダー",titleLabel:"タイトル",messageLabel:"メッセージ",errorLabel:"エラー",provider:"プロバイダー:",time:"時間:",clearLogsFailed:"ログの削除に失敗しました: {{error}}",events:{print_start:"印刷開始",print_complete:"印刷完了",print_failed:"印刷失敗",print_stopped:"印刷中止",print_progress:"進捗",printer_offline:"プリンターオフライン",printer_error:"プリンターエラー",filament_low:"フィラメント残量低下",maintenance_due:"メンテナンス期限",ams_humidity_high:"AMS湿度高",ams_temperature_high:"AMS温度高",test:"テスト"}},providers:{callmebot:"CallMeBot/WhatsApp",ntfy:"ntfy",pushover:"Pushover",telegram:"Telegram",email:"メール",discord:"Discord",webhook:"Webhook",descriptions:{email:"SMTPメール通知",telegram:"Telegramボット経由の通知",discord:"Webhook経由でDiscordチャンネルに送信",ntfy:"無料のセルフホスト対応プッシュ通知",pushover:"シンプルで確実なプッシュ通知",callmebot:"CallMeBot経由の無料WhatsApp通知",webhook:"任意のURLへの汎用HTTP POST"}},backup:{categories:{settings:"設定",notification_providers:"通知プロバイダー",notification_templates:"通知テンプレート",smart_plugs:"スマートプラグ",printers:"プリンター",filaments:"フィラメント",maintenance_types:"メンテナンスタイプ",archives:"アーカイブ",projects:"プロジェクト",pending_uploads:"アップロード待ち",external_links:"外部リンク",api_keys:"APIキー"},notificationProviders:"通知プロバイダー",notificationTemplates:"通知テンプレート",externalLinks:"外部リンク",printers:"プリンター",filamentInventory:"フィラメント在庫",maintenanceTypes:"メンテナンスタイプ",printArchives:"印刷アーカイブ",projects:"プロジェクト",pendingUploads:"保留中のアップロード",apiKeys:"APIキー",settingsDescription:"言語、テーマ、更新設定",notificationProvidersDescription:"ntfy、Pushover、Discordなど",notificationTemplatesDescription:"カスタムメッセージテンプレート",smartPlugsDescription:"Tasmotaプラグ設定",externalLinksDescription:"外部サービスへのサイドバーリンク",printersDescription:"プリンター情報(アクセスコードを除く)",filamentInventoryDescription:"フィラメントの種類とコスト",maintenanceDescription:"カスタムメンテナンススケジュール",printArchivesDescription:"全印刷データ+ファイル(3MF、サムネイル、写真)",projectsDescription:"プロジェクト、BOMアイテム、添付ファイル",pendingUploadsDescription:"レビュー待ちの仮想プリンターアップロード",apiKeysDescription:"Webhook APIキー(インポート時に新しいキーが生成されます)",restoreBackup:"バックアップの復元",restoreDescription:"バックアップファイルからすべてのデータを置き換える",restoreNote:"復元中、仮想プリンターは停止されます"},restore:{failedToRestore:"バックアップの復元に失敗しました。ファイル形式を確認してください。",title:"バックアップの復元",restoring:"復元中...",complete:"復元完了",failed:"復元失敗",importDescription:"バックアップファイルから設定をインポート",pleaseWait:"データを復元しています。しばらくお待ちください",duplicateHandling:"重複処理の仕組み:",clickToSelect:"クリックしてバックアップファイルを選択 (.json または .zip)",replaceExisting:"既存データを上書き",keepExisting:"既存データを保持",overwriteDescription:"既に存在する項目をバックアップデータで上書きします",skipDescription:"まだ存在しない項目のみ復元します",caution:"注意:",overwriteWarning:"上書きすると、現在の設定がバックアップのデータに置き換えられます。セキュリティのため、プリンターのアクセスコードは上書きされません。",restore:"復元",processing:"バックアップファイルを処理中...",itemsRestored:"復元済み項目",itemsSkipped:"スキップ済み項目",restoredSection:"復元済み",filesSection:"ファイル (3MF、サムネイルなど)",skippedSection:"スキップ (既に存在)",andMore:"...他 {{count}} 件",newApiKeys:"新しいAPIキーが生成されました",copyKeysWarning:"これらのキーは一度だけ表示されます。今すぐコピーしてください!",copy:"コピー",noDataFound:"バックアップファイルに復元するデータが見つかりませんでした。",dupPrinters:"プリンター",dupPrintersDesc:"シリアル番号で照合",dupSmartPlugs:"スマートプラグ",dupSmartPlugsDesc:"IPアドレスで照合",dupNotificationProviders:"通知プロバイダー",dupNotificationProvidersDesc:"名前で照合",dupFilaments:"フィラメント",dupFilamentsDesc:"名前 + 種類 + ブランドで照合",dupArchives:"アーカイブ",dupArchivesDesc:"コンテンツハッシュで照合 (常にスキップ)",dupPendingUploads:"アップロード待ち",dupPendingUploadsDesc:"ファイル名で照合",dupSettingsTemplates:"設定とテンプレート",dupSettingsTemplatesDesc:"常に上書き"},files:{root:"ルート",cache:"キャッシュ",models:"モデル",timelapse:"タイムラプス",used:"使用中:",free:"空き:",filterPlaceholder:"ファイルを検索...",noFiles:"このディレクトリにファイルがありません",deleteFile:"ファイルを削除",deleteConfirm:'"{{name}}"を削除しますか?この操作は元に戻せません。',fileManager:"ファイル管理",pageDescription:"プリントファイルを整理・管理",newFolder:"新しいフォルダ",folderName:"フォルダ名",folderNamePlaceholder:"例: 機能パーツ",renameFile:"ファイル名を変更",renameFolder:"フォルダ名を変更",rename:"名前変更",rootNoFolder:"ルート(フォルダなし)",moveFilesCount:"{{count}}個のファイルを移動",current:"(現在)",move:"移動",linkFolder:"フォルダをリンク",linkFolderDescription:"「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。",noProjectsFound:"プロジェクトが見つかりません",noArchivesFound:"アーカイブが見つかりません",unlink:"リンク解除",link:"リンク",uploadFiles:"ファイルをアップロード",dropFilesHere:"ここにファイルをドロップ",dragAndDropFiles:"ファイルをドラッグ&ドロップ",orClickToBrowse:"またはクリックして選択",zipAutoExtract:"ZIPファイルは自動的に展開されます",zipFilesDetected:"ZIPファイルを検出",zipChooseHandling:"ZIPファイルが展開されます。フォルダ構造の処理方法を選択してください:",preserveZipStructure:"ZIPのフォルダ構造を保持",willBeExtracted:"• 展開予定",filesExtracted:"• {{count}}個のファイルを展開済み",uploadComplete:"アップロード完了: {{count}}個成功",uploadErrorCount:"、{{count}}個失敗",uploading:"アップロード中...",filesFailed:"{{count}}個のファイルが失敗",uploadFailed:"アップロード失敗",linkToProjectOrArchive:"プロジェクトまたはアーカイブにリンク",changeLink:"リンクを変更...",linkTo:"リンク先...",printedCount:"{{count}}回印刷済み",addToQueue:"キューに追加",schedulePrint:"印刷をスケジュール",adding:"追加中...",folderCreated:"フォルダを作成しました",folderDeleted:"フォルダを削除しました",fileDeleted:"ファイルを削除しました",deletedFiles:"{{count}}個のファイルを削除しました",filesMoved:"ファイルを移動しました",folderUnlinked:"フォルダのリンクを解除しました",folderLinked:"フォルダをリンクしました",addedToQueue:"{{count}}個のファイルをキューに追加しました",addedToQueueWithErrors:"{{added}}個追加、{{errors}}個失敗",failedToAddFiles:"ファイルの追加に失敗: {{error}}",fileRenamed:"ファイル名を変更しました",folderRenamed:"フォルダ名を変更しました",gridView:"グリッド表示",listView:"リスト表示",lowDiskSpaceWarning:"ディスク容量不足の警告",lowDiskSpaceDescription:"空き容量は{{free}}(合計{{total}})。しきい値は設定で{{threshold}} GBに設定されています。",filesLabel:"ファイル:",foldersLabel:"フォルダ:",sizeLabel:"サイズ:",freeLabel:"空き:",folders:"フォルダ",allFiles:"すべてのファイル",allTypes:"すべての種類",date:"日付",size:"サイズ",type:"種類",prints:"印刷回数",ascending:"昇順",descending:"降順",filteredCount:"{{total}}件中{{filtered}}件",deselectAll:"すべて選択解除",selectAll:"すべて選択",selectedCount:"{{count}}件選択中",loadingFiles:"ファイルを読み込み中...",folderEmpty:"フォルダは空です",noFilesYet:"ファイルはまだありません",emptyFolderDescription:"ファイルをアップロードするか、このフォルダにファイルを移動してください。",emptyRootDescription:"プリント関連ファイルの整理を始めるにはファイルをアップロードしてください。",noMatchingFiles:"一致するファイルがありません",noMatchingFilesDescription:"現在の検索またはフィルター条件に一致するファイルがありません。",clearFilters:"フィルターをクリア",sort:{nameAsc:"名前 (A-Z)",nameDesc:"名前 (Z-A)",sizeAsc:"サイズ (小さい順)",sizeDesc:"サイズ (大きい順)",dateAsc:"日付 (古い順)",dateDesc:"日付 (新しい順)"},searchFiles:"ファイルを検索...",deleteFolder:"フォルダを削除",deleteBulkTitle:"{{count}}件のファイルを削除",deleteFolderConfirm:"このフォルダを削除しますか?中のファイルもすべて削除されます。",deleteMultipleConfirm:"選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。",deleteFileConfirm:"このファイルを削除しますか?",deleting:"削除中..."},printOptions:{title:"印刷オプション",bedLevelling:"ベッドレベリング",bedLevellingDesc:"印刷前にベッドを自動レベリング",flowCali:"フローキャリブレーション",flowCaliDesc:"押出量を校正",vibrationCali:"振動キャリブレーション",vibrationCaliDesc:"リンギングを低減",layerInspect:"初層検査",layerInspectDesc:"AIによる初層の検査",timelapse:"タイムラプス",timelapseDesc:"タイムラプス動画を記録"},printModal:{powerOffWhenDone:"完了後にプリンターの電源をオフ",immediateHelp:"プリンターがアイドル状態になり次第、印刷を開始します。",scheduledHelp:"スケジュールされた時間にプリンターがアイドル状態であれば印刷を開始します。ビジー状態の場合は、利用可能になるまで待機します。",stagedHelp:"印刷はステージングされますが、自動的には開始されません。キューに送るにはスタートボタンを使用してください。",print:"印刷",reprint:"再印刷",printToMultiple:"{{count}}台のプリンターに印刷",editQueueItem:"キューアイテムを編集",sameTypeDifferentColor:"同じタイプ、異なる色",filamentTypeNotLoaded:"フィラメントタイプが読み込まれていません",specificPrinter:"特定のプリンター",selectPrinters:"プリンターを選択",selectAll:"すべて選択",printersSelected:"{{count}}台のプリンターを選択中",noPrintersAvailable:"利用可能なプリンターがありません",noActivePrintersAvailable:"アクティブなプリンターがありません",inactive:"非アクティブ",unknownModel:"不明なモデル",customMapping:"カスタムマッピング",auto:"自動",showAll:"すべて表示",selectAtLeastOne:"プリンターを1台以上選択してください",selectTargetModel:"ターゲットモデルを選択",selectSlot:"スロットを選択...",reRead:"再読み込み",customSlotMapping:"カスタムスロットマッピング",autoMatched:"自動マッチ",manuallySelected:"手動選択",schedulerWillAssign:"スケジューラーが最初に利用可能なアイドル状態の{{model}}プリンターに割り当てます",inLocation:"{{location}}内",anyModel:"任意の{{model}}",hiddenPrinters:"他{{count}}台のプリンターが非表示(異なるモデル)",showOnlyModel:"{{model}}プリンターのみ表示",matchedCount:"({{matched}}/{{total}} 一致)",targetModelLabel:"ターゲットモデル",selectAModel:"モデルを選択...",locationFilterLabel:"ロケーションフィルター(任意)",anyLocation:"すべてのロケーション"},login:{title:"Bambuddy ログイン",subtitle:"アカウントにサインイン",username:"ユーザー名",usernamePlaceholder:"ユーザー名を入力",usernameOrEmail:"ユーザー名またはメール",usernameOrEmailPlaceholder:"ユーザー名または @ メール",password:"パスワード",passwordPlaceholder:"パスワードを入力",loggingIn:"ログイン中...",signIn:"サインイン",enterCredentials:"ユーザー名とパスワードを入力してください",success:"ログインしました",failed:"ログインに失敗しました",forgotPasswordEmailMessage:"メールアドレスを入力すると、新しいパスワードを送信します。",emailAddress:"メールアドレス",emailPlaceholder:"your.email@example.com",cancel:"キャンセル",sending:"送信中...",sendResetEmail:"リセットメールを送信"},setup:{title:"Bambuddy セットアップ",description:"Bambuddyインスタンスの認証を設定します",enableAuthentication:"認証を有効にする",adminAccount:"管理者アカウント",adminAccountDescription:"既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効になります。既存の管理者を使用するには以下のフィールドを空のままにするか、新しい管理者ユーザーを作成するには新しい認証情報を入力してください。",adminUsername:"管理者ユーザー名",adminPassword:"管理者パスワード",optionalIfAdminsExist:"管理者ユーザーが存在する場合は任意",placeholderAdminUsername:"管理者ユーザー名を入力(任意)",placeholderAdminPassword:"管理者パスワードを入力(任意)",confirmPassword:"パスワードの確認",placeholderConfirmPassword:"管理者パスワードを確認",settingUp:"セットアップ中...",completeSetup:"セットアップを完了",toast:{authEnabledAdminCreated:"認証が有効になり、管理者ユーザーが作成されました",authEnabledExistingAdmins:"既存の管理者ユーザーを使用して認証が有効になりました",setupCompleted:"セットアップが完了しました",enterBothOrLeaveEmpty:"管理者ユーザー名とパスワードの両方を入力するか、既存の管理者ユーザーを使用するには両方を空にしてください",passwordsDoNotMatch:"パスワードが一致しません",passwordMinLength:"パスワードは6文字以上必要です"}},users:{title:"ユーザー管理",description:"Bambuddyインスタンスのユーザーとアクセスを管理します",noPermission:"このページにアクセスする権限がありません。",backToSettings:"設定に戻る",createUser:"ユーザーを作成",deleteUser:"ユーザーを削除",deleteConfirmMessage:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",roleUser:"ユーザー",roleAdmin:"管理者",statusActive:"アクティブ",statusInactive:"非アクティブ",save:"保存",cancel:"キャンセル",edit:"編集",delete:"削除",creating:"作成中...",admin:"管理者",editUser:"ユーザーを編集",groups:"グループ",noGroups:"グループなし",noGroupsAvailable:"利用可能なグループがありません",saveChanges:"変更を保存",saving:"保存中...",system:"システム",active:"アクティブ",inactive:"非アクティブ",subtitle:"Bambuddyインスタンスのユーザーとアクセスを管理します",form:{username:"ユーザー名",usernamePlaceholder:"ユーザー名を入力",email:"メール",emailPlaceholder:"user@example.com",password:"パスワード",passwordPlaceholder:"パスワードを入力",confirmPassword:"パスワードの確認",confirmPasswordPlaceholder:"パスワードの確認",newPasswordPlaceholder:"新しいパスワード",confirmNewPasswordPlaceholder:"新しいパスワードの確認",leaveBlankToKeep:"現在のパスワードを維持する場合は空のままにしてください",groups:"グループ",optional:"オプション",autoGeneratedPassword:"安全なパスワードが自動的に生成され、ユーザーにメールで送信されます。"},modal:{createUser:"ユーザーを作成",editUser:"ユーザーを編集",cancel:"キャンセル",creating:"作成中...",saving:"保存中...",saveChanges:"変更を保存"},deleteModal:{title:"ユーザーを削除",message:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",confirm:"ユーザーを削除"},table:{username:"ユーザー名",role:"ロール",status:"ステータス",actions:"アクション",groups:"グループ"},toast:{userCreated:"ユーザーが正常に作成されました",userUpdated:"ユーザーが正常に更新されました",userDeleted:"ユーザーが正常に削除されました",fillRequiredFields:"必須項目をすべて入力してください",passwordMinLength:"パスワードは6文字以上である必要があります",passwordsDoNotMatch:"パスワードが一致しません"}},upload:{title:"3MFファイルのアップロード",dragDrop:".3mfファイルをここにドラッグ&ドロップ",or:"または",browseFiles:"ファイルを参照",associatePrinter:"プリンターに関連付け(任意)",noPrinter:"プリンターなし",uploaded:"アップロード済み",failedCount:"失敗",filesUploaded:"{{count}}ファイルをアップロードしました",printerModelExtracted:"プリンターモデルは3MFメタデータから自動抽出されます",filesFailed:"{{count}}ファイルのアップロードに失敗しました",partialResult:"{{uploaded}}件アップロード、{{failed}}件失敗",failed:"アップロードに失敗しました",uploading:"アップロード中...",upload:"アップロード"},gcode:{loading:"G-codeを読み込み中...",notAvailable:"G-codeが利用できません",notSlicedMessage:"このファイルはまだスライスされていません。G-codeプレビューはBambu StudioまたはOrca Slicerでスライス後に利用可能です。",loadFailed:"G-codeの読み込みに失敗しました"},dashboard:{dragToReorder:"ドラッグして並べ替え",sizeClickCycle:"サイズ: {{size}} - クリックで変更",hideWidget:"ウィジェットを非表示",resetLayout:"レイアウトをリセット",hiddenCount:"{{count}}件非表示",hiddenWidgets:"非表示のウィジェット(クリックで表示):",allHidden:"すべてのウィジェットが非表示です。"},printerQueue:{nextInQueue:"次のキュー",asap:"即時",now:"今すぐ",inLessThanMin:"1分以内",inMinutes:"{{count}}分後",inHours:"{{count}}時間後"},smartPlug:{offline:"オフライン",admin:"管理",openAdminPage:"プラグの管理ページを開く",linkedTo:"接続先:",alerts:"アラート",automationSettings:"自動化設定",showInSwitchbar:"スイッチバーに表示",switchbarDesc:"サイドバーからクイックアクセス",enabledDesc:"このプラグの自動化を有効にする",autoOffDesc:"印刷完了後に自動オフ(1回のみ)",delayMode:"オフ遅延モード",temp:"温度",delayMinutes:"遅延(分)",tempThreshold:"温度しきい値(℃)",tempThresholdDesc:"ノズルがこの温度以下に冷えたらオフにします",deleteTitle:"スマートプラグを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',turnOnTitle:"スマートプラグをオン",turnOnConfirm:'"{{name}}"をオンにしてもよろしいですか?',turnOn:"オン",turnOffTitle:"スマートプラグをオフ",turnOffConfirm:'"{{name}}"をオフにしてもよろしいですか?接続されたデバイスの電源が切断されます。',turnOff:"オフ",controlFailed:'"{{name}}"の{{action}}に失敗しました',monitorOnly:"モニタリングのみ",waiting:"データを待機中...",monitor:"モニター",power:"電力",kwhToday:"本日の消費電力",settings:"設定",smartSwitches:"スマートスイッチ",noSwitchesInSwitchbar:"スイッチバーに有効なスイッチがありません",enableInSettings:"設定 → スマートプラグで有効にしてください"},addSmartPlug:{addTitle:"スマートプラグを追加",editTitle:"スマートプラグを編集",tasmota:"Tasmota",homeAssistant:"Home Assistant",stopScanning:"スキャンを停止",discoverDevices:"Tasmotaデバイスを検出",scanningNetwork:"ネットワークをスキャン中...",foundDevices:"{{count}}台のデバイスが見つかりました - クリックして選択:",noDevicesFound:"ネットワーク上にTasmotaデバイスが見つかりません",failedToStartScan:"スキャンの開始に失敗しました",haNotConfigured:"Home Assistantが設定されていません。",haNotConfiguredPath:"設定 → ネットワーク → Home Assistant で設定してください",selectEntity:"エンティティを選択",chooseEntity:"エンティティを選択...",loadingEntities:"エンティティを読み込み中...",failedToLoadEntities:"エンティティの読み込みに失敗しました: {{error}}",searchEntities:"エンティティを検索...",noEntitiesMatching:"「{{search}}」に一致するエンティティが見つかりません",noEntitiesAvailable:"利用可能なエンティティがありません",searchingEntities:"すべてのエンティティを検索中({{count}}件見つかりました)",showingEntities:"switch、light、input_booleanを表示中({{count}}件利用可能)",energyMonitoring:"エネルギーモニタリング(任意)",energyMonitoringDescription:"電力/エネルギーデータを提供するセンサーを検索して選択します。",powerSensor:"電力センサー(W)",searchPowerSensors:"電力センサーを検索...",energyToday:"今日のエネルギー(kWh)",totalEnergy:"総エネルギー(kWh)",searchEnergySensors:"エネルギーセンサーを検索...",noMatchingSensors:"一致するセンサーがありません",ipAddress:"IPアドレス",ipAddressPlaceholder:"192.168.1.100",test:"テスト",connected:"接続されました!",device:"デバイス",state:"状態",connectionFailed:"接続に失敗しました",name:"名前",namePlaceholder:"リビングのプラグ",username:"ユーザー名",usernamePlaceholder:"admin",password:"パスワード",passwordPlaceholder:"********",authHint:"Tasmotaデバイスが認証を必要としない場合は空のままにしてください",linkToPrinter:"プリンターに連携",noPrinterOption:"プリンターなし(手動制御のみ)",linkToPrinterHint:"連携すると印刷の開始/完了時に自動オン/オフが有効になります",powerAlerts:"電力アラート",alertAbove:"超過時にアラート(W)",alertAbovePlaceholder:"例: 200",alertBelow:"下回った時にアラート(W)",alertBelowPlaceholder:"例: 10",powerAlertHint:"消費電力がこれらのしきい値を超えた/下回った場合に通知します。無効にするには空のままにしてください。",dailySchedule:"デイリースケジュール",turnOnAt:"オンにする時刻",turnOffAt:"オフにする時刻",scheduleHint:"毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。",showInSwitchbar:"スイッチバーに表示",showInSwitchbarHint:"サイドバーからクイックアクセス",nameRequired:"名前は必須です",ipRequired:"Tasmotaプラグの場合、IPアドレスは必須です",entityRequired:"Home Assistantプラグの場合、エンティティは必須です",mqtt:"MQTT",mqttTopicRequired:"MQTTトピックは、電力、エネルギー、またはステートのいずれかを設定する必要があります",mqttBrokerNotConfigured:"MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:",mqttBrokerNotConfiguredPath:"設定 → ネットワーク → MQTT発行",mqttBrokerNotConfiguredHint:"(パブリッシュを有効にする必要はありません。ブローカーの詳細を入力するだけです)。",mqttMonitorOnly:"モニタリングのみ",mqttMonitorOnlyDescription:"MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御はできません - MQTTブローカーまたはホームオートメーションシステムを使用してください。",mqttPowerMonitoring:"電力モニタリング",mqttEnergyMonitoring:"エネルギーモニタリング",mqttStateMonitoring:"ステートモニタリング",mqttTopic:"トピック",mqttJsonPath:"JSONパス",mqttMultiplier:"乗数",mqttOnValue:"ONの値",mqttPowerJsonPathHint:"JSONパスはJSONペイロードから値を抽出します(例:「power_l1」)。トピックが生の数値を発行する場合は空のままにしてください。",mqttPowerMultiplierHint:"乗数 0.001 で mW→W、1000 で kW→W に変換します。",mqttEnergyJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttEnergyMultiplierHint:"乗数 0.001 で Wh→kWh、1000 で MWh→kWh に変換します。",mqttStateJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttStateOnValueHint:"ONの値:「ON」を意味する正確な文字列。自動検出(ON、true、1)の場合は空のままにしてください。"},addNotification:{addTitle:"通知プロバイダーを追加",editTitle:"通知プロバイダーを編集",nameRequired:"名前は必須です",fieldRequired:"{{field}}は必須です",namePlaceholder:"マイ通知",providerType:"プロバイダータイプ",configuration:"設定",testConfiguration:"設定をテスト",printerFilter:"プリンターフィルター",allPrinters:"すべてのプリンター",printerFilterDesc:"このプリンターのイベントのみ通知を送信",quietHours:"サイレント時間(おやすみモード)",start:"開始",end:"終了",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知をまとめて1日1回のサマリーとして送信",sendDigestAt:"ダイジェスト送信時刻",digestDescription:"イベントを収集し、この時刻にまとめて送信します",notificationEvents:"通知イベント",printEvents:"印刷イベント",printerStatus:"プリンターステータス",events:{start:"開始",complete:"完了",failed:"失敗",stopped:"停止",progress:"進捗",offline:"オフライン",error:"エラー",lowFilament:"フィラメント残量少",maintenance:"メンテナンス"},config:{callmebot:{phoneNumber:"電話番号",apiKey:"APIキー",apiKeyPlaceholder:"CallMeBot APIキー"},ntfy:{serverUrl:"サーバーURL",topic:"トピック",authToken:"認証トークン",authTokenPlaceholder:"認証(任意)"},pushover:{userKey:"ユーザーキー",userKeyPlaceholder:"Pushoverユーザーキー",appToken:"アプリトークン",appTokenPlaceholder:"Pushoverアプリトークン",priority:"優先度",priorityPlaceholder:"0(通常)"},telegram:{botToken:"Botトークン",botTokenPlaceholder:"@BotFatherから取得したトークン",chatId:"チャットID",chatIdPlaceholder:"チャットまたはグループID"},email:{smtpServer:"SMTPサーバー",smtpPort:"SMTPポート",security:"セキュリティ",starttls:"STARTTLS(ポート587)",ssl:"SSL/TLS(ポート465)",securityNone:"なし(ポート25)",authentication:"認証",username:"ユーザー名",password:"パスワード",passwordPlaceholder:"アプリパスワード",fromEmail:"送信元メール",toEmail:"送信先メール"},discord:{webhookUrl:"Webhook URL"},webhook:{webhookUrl:"Webhook URL",payloadFormat:"ペイロード形式",genericJson:"汎用JSON",slackMattermost:"Slack / Mattermost",authorization:"認証",authorizationPlaceholder:"Bearerトークン(任意)",titleFieldName:"タイトルフィールド名",messageFieldName:"メッセージフィールド名"}}},pendingUploads:{title:"保留中のアップロード({{count}}件)",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",fromSource:"{{ip}}から",archive:"アーカイブ",archiveAll:"すべてアーカイブ",discardAll:"すべて破棄",discard:"破棄",discardTitle:"アップロードを破棄",discardConfirm:'"{{filename}}"を破棄してもよろしいですか?この操作は元に戻せません。',tags:"タグ",tagsPlaceholder:"例: 機能部品、プロトタイプ、ギフト",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",project:"プロジェクト",noProject:"プロジェクトなし",description:"これらのファイルはバーチャルプリンター経由でアップロードされました。確認してアーカイブし、コレクションに追加してください。",archiveAllTitle:"すべてのアップロードをアーカイブ",archiveAllConfirm:"保留中のアップロード{{count}}件をすべてアーカイブしてもよろしいですか?",discardAllTitle:"すべてのアップロードを破棄",discardAllConfirm:"保留中のアップロード{{count}}件をすべて破棄してもよろしいですか?この操作は元に戻せません。",archived:"アーカイブ済み: {{name}}",archiveFailed:"アーカイブに失敗しました",discarded:"アップロードを破棄しました",discardFailed:"破棄に失敗しました",archivedCount:"{{count}}ファイルをアーカイブしました",discardedCount:"{{count}}ファイルを破棄しました",archiveAllFailed:"すべてのアーカイブに失敗しました",discardAllFailed:"すべての破棄に失敗しました"},shortcuts:{title:"キーボードショートカット",navigation:"ナビゲーション",archives:"アーカイブ",profiles:"K-プロファイル",general:"一般",goToPrinters:"プリンターへ",goToArchives:"アーカイブへ",goToQueue:"キューへ",goToStatistics:"統計へ",goToProfiles:"クラウドプロファイルへ",goToSettings:"設定へ",openItem:"{{item}}を開く",goToItem:"{{item}}へ移動",focusSearch:"検索にフォーカス",openUpload:"アップロードダイアログを開く",clearSelection:"選択解除 / 入力をクリア",contextMenu:"カードのコンテキストメニュー",refreshProfiles:"プロファイルを更新",newProfile:"新しいプロファイル",exitSelection:"選択モードを終了",showHelp:"このヘルプを表示",pressKey:"押す",orClickToClose:"または外側をクリックで閉じる"},logViewer:{title:"アプリケーションログ",liveStreaming:"ライブストリーミング - {{count}}エントリ",description:"アプリケーションログの表示とフィルタ",live:"ライブ",stop:"停止",start:"開始",clear:"クリア",autoScroll:"自動スクロール",searchPlaceholder:"メッセージまたはロガー名で検索...",noEntries:"ログエントリが見つかりません",emptyLog:"ログファイルが空またはクリアされています",autoRefreshing:"2秒ごとに自動更新中",clickStart:"開始をクリックしてライブログストリーミングを有効にする"},editArchive:{title:"アーカイブを編集",name:"名前",printNamePlaceholder:"印刷名",printer:"プリンター",noPrinter:"プリンターなし",project:"プロジェクト",noProject:"プロジェクトなし",itemsPrinted:"印刷数",itemsPrintedDescription:"この印刷ジョブで生産されたアイテム数",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",tags:"タグ",addTags:"タグを追加...",addMoreTags:"タグをさらに追加...",existingTagsHint:"既存のタグ(クリックで追加)",externalLink:"外部リンク",externalLinkPlaceholder:"https://...",externalLinkDescription:"MakerWorld、Printables、Thingiverseなどへのリンク",status:"ステータス",statusCompleted:"完了",statusFailed:"失敗",statusCancelled:"キャンセル",statusPrinting:"印刷中",failureReason:"失敗理由",selectReason:"理由を選択...",failureReasons:{adhesionFailure:"定着不良",spaghettiDetached:"スパゲッティ / 剥離",layerShift:"レイヤーシフト",cloggedNozzle:"ノズル詰まり",filamentRunout:"フィラメント切れ",warping:"反り",stringing:"糸引き",underExtrusion:"押出不足",powerFailure:"電源障害",userCancelled:"ユーザーによるキャンセル",other:"その他"},photos:"印刷結果の写真",printResult:"印刷結果",photosDescription:"+をクリックして印刷結果の写真を追加",saving:"保存中..."},mqttDebug:{title:"MQTTデバッグログ",empty:"<空>",startLogging:"ログ記録を開始",searchPlaceholder:"トピックまたはペイロードで検索...",incoming:"受信",outgoing:"送信",noMessages:"まだメッセージが記録されていません",clickStart:"「ログ記録を開始」をクリックしてMQTTメッセージの記録を開始",noMatch:"フィルタに一致するメッセージがありません",adjustFilter:"検索条件またはフィルタ条件を調整してみてください",loggingActive:"ログ記録中 - メッセージは自動更新されます",loggingStopped:"ログ記録停止"},archiveActions:{print:"印刷",schedule:"スケジュール",openInSlicer:"Bambu Studioで開く",slice:"スライス",viewMakerWorld:"MakerWorldで表示",preview3d:"3Dプレビュー",viewTimelapse:"タイムラプスを表示",scanTimelapse:"タイムラプスを検索",downloadSource3mf:"ソース3MFをダウンロード",uploadSource3mf:"ソース3MFをアップロード",replaceSource3mf:"ソース3MFを置換",removeSource3mf:"ソース3MFを削除",replaceF3d:"F3Dを置換",uploadF3d:"F3Dをアップロード",downloadF3d:"F3Dをダウンロード",removeF3d:"F3Dを削除",copyLink:"ダウンロードリンクをコピー",qrCode:"QRコード",viewPhotos:"写真を表示",projectPage:"プロジェクトページ",goToProject:"プロジェクトへ: {{name}}",addToProject:"プロジェクトに追加",removeFromProject:"プロジェクトから削除",noProjects:"利用可能なプロジェクトがありません",deselect:"選択解除",select:"選択",remove:"削除",source3mfAttached:"ソース3MFを添付しました: {{filename}}",source3mfUploadFailed:"ソース3MFのアップロードに失敗しました",source3mfRemoved:"ソース3MFを削除しました",source3mfRemoveFailed:"ソース3MFの削除に失敗しました",f3dAttached:"F3Dを添付しました: {{filename}}",f3dUploadFailed:"F3Dのアップロードに失敗しました",f3dRemoved:"F3Dを削除しました",f3dRemoveFailed:"F3Dの削除に失敗しました",timelapseAttached:"タイムラプスを添付しました: {{filename}}",timelapseExists:"タイムラプスは既に添付されています",noTimelapseFound:"一致するタイムラプスが見つかりません",timelapseScanFailed:"タイムラプスの検索に失敗しました",timelapseAttachFailed:"タイムラプスの添付に失敗しました",deleted:"アーカイブを削除しました",deleteFailed:"アーカイブの削除に失敗しました",addedToFavorites:"お気に入りに追加しました",removedFromFavorites:"お気に入りから削除しました",projectUpdated:"プロジェクトを更新しました",projectUpdateFailed:"プロジェクトの更新に失敗しました",linkCopied:"リンクをクリップボードにコピーしました",linkCopyFailed:"リンクのコピーに失敗しました",photoDeleted:"写真を削除しました",photoDeleteFailed:"写真の削除に失敗しました",deleteTitle:"アーカイブを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',removeSource3mfTitle:"ソース3MFを削除",removeSource3mfConfirm:'"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。',removeF3dTitle:"F3Dを削除",removeF3dConfirm:'"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?',selectTimelapse:"タイムラプスを選択",selectTimelapseDesc:"自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:"},camera:{camera:"カメラ",invalidPrinterId:"無効なプリンターID",printerFallback:"プリンター #{{id}}",live:"ライブ",snapshot:"スナップショット",restartStream:"ストリームを再開",refreshSnapshot:"スナップショットを更新",fullscreen:"フルスクリーン",exitFullscreen:"フルスクリーンを終了",connectingToCamera:"カメラに接続中...",capturingSnapshot:"スナップショットを撮影中...",connectionLost:"接続が切断されました",reconnectingIn:"{{seconds}}秒後に再接続します(試行{{attempt}}/{{maxAttempts}})",reconnectNow:"今すぐ再接続",cameraUnavailable:"カメラが利用できません",makeSurePrinterConnected:"プリンターが接続されていること、およびプリンター設定でカメラが有効になっていることを確認してください。",retry:"再試行",cameraStream:"カメラストリーム",zoomIn:"ズームイン",zoomOut:"ズームアウト",resetZoom:"ズームをリセット",skipBack:"5秒戻る",skipForward:"5秒進む",refreshStream:"ストリームを更新",dragToResize:"ドラッグしてリサイズ"},archiveCard:{slicedReady:"スライス済みファイル - 印刷可能",sourceOnly:"ソースファイルのみ - AMSマッピングなし",gcode:"GCODE",source:"ソース",layers:"レイヤー",objects:"{{count}}オブジェクト",objects_other:"{{count}}オブジェクト",cancelled:"キャンセル",failed:"失敗",duplicate:"重複"},providerCard:{last:"最終: ",lastSuccessAt:"最終: {{date}}",printer:"プリンター: ",allPrinters:"すべてのプリンター",tagStart:"開始",tagComplete:"完了",tagFailed:"失敗",tagStopped:"中止",tagProgress:"進捗",tagOffline:"オフライン",tagLowFilament:"フィラメント残量低下",tagMaintenance:"メンテナンス",tagAmsHumidity:"AMS湿度",tagAmsTemp:"AMS温度",tagAmsHtHumidity:"AMS-HT湿度",tagAmsHtTemp:"AMS-HT温度",quiet:"おやすみ",digest:"ダイジェスト ",digestAt:"ダイジェスト {{time}}",sendTest:"テスト通知を送信",eventSettings:"イベント設定",sendNotifications:"このプロバイダーから通知を送信",printEvents:"印刷イベント",printerStatus:"プリンターステータス",amsAlarms:"AMSアラーム",amsHumidityHigh:"AMS湿度高",amsHumidityHighDesc:"通常AMSの湿度がしきい値を超過",amsTempHigh:"AMS温度高",amsTempHighDesc:"通常AMSの温度がしきい値を超過",amsHtAlarms:"AMS-HTアラーム",amsHtHumidityHigh:"AMS-HT湿度高",amsHtHumidityHighDesc:"AMS-HTの湿度がしきい値を超過",amsHtTempHigh:"AMS-HT温度高",amsHtTempHighDesc:"AMS-HTの温度がしきい値を超過",noNotificationsDuring:"この時間帯は通知を送信しません",editQuietHours:"プロバイダーを編集しておやすみ時間を変更",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知を1日1回のサマリーにまとめる",sendAt:"送信時刻",editDigestTime:"プロバイダーを編集してダイジェスト時刻を変更",deleteTitle:"通知プロバイダーを削除",deleteConfirm:"「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。"},projects:{title:"プロジェクト",subtitle:"印刷プロジェクトを管理",editProject:"プロジェクトを編集",newProject:"新規プロジェクト",namePlaceholder:"プロジェクト名",descriptionPlaceholder:"プロジェクトの説明(任意)",color:"色",targetPlates:"目標プレート数",targetPlatesPlaceholder:"例: 10",targetPlatesHint:"必要な印刷ジョブ/プレート数",targetParts:"目標パーツ数",targetPartsPlaceholder:"例: 50",targetPartsHint:"必要な個別パーツの総数",tags:"タグ",tagsPlaceholder:"カンマ区切りのタグ",dueDate:"期限",priorityLabel:"優先度",priority:{low:"低",normal:"通常",high:"高",urgent:"緊急"},status:{active:"進行中",completed:"完了",archived:"アーカイブ済み"},create:"作成",parts:"パーツ",plates:"プレート",failed:"失敗",completed:"完了",inQueue:"キュー内",noPrintsYet:"印刷履歴なし",more:"もっと見る",printJobsPlates:"印刷ジョブ / プレート",partsPrinted:"印刷済みパーツ",failedParts:"失敗パーツ",projectCreated:"プロジェクトを作成しました",projectUpdated:"プロジェクトを更新しました",projectDeleted:"プロジェクトを削除しました",all:"すべて",loading:"プロジェクトを読み込み中...",noProjectsYet:"プロジェクトがまだありません",noStatusProjects:"{{status}}のプロジェクトはありません",noProjectsHint:"プロジェクトを作成して印刷を整理・追跡しましょう",noStatusProjectsHint:"ステータスが「{{status}}」のプロジェクトはありません",createFirstProject:"最初のプロジェクトを作成",deleteProject:"プロジェクトを削除",deleteProjectConfirm:"このプロジェクトを削除しますか?この操作は取り消せません。",exportAllProjects:"すべてのプロジェクトをエクスポート",importProject:"プロジェクトをインポート",importFailed:"インポートに失敗しました",projectImported:"プロジェクトがインポートされました",projectsExported:"プロジェクトがエクスポートされました",noCreatePermission:"プロジェクトを作成する権限がありません",noDeletePermission:"プロジェクトを削除する権限がありません",noEditPermission:"プロジェクトを編集する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません",noImportPermission:"プロジェクトをインポートする権限がありません"},projectDetail:{statusActive:"進行中",statusCompleted:"完了",statusArchived:"アーカイブ済み",noPrintsYet:"印刷履歴なし",print:"印刷",unknown:"不明",priorityLow:"低",priorityNormal:"通常",priorityHigh:"高",priorityUrgent:"緊急",overdue:"期限超過",dueToday:"本日期限",daysLeft:"残り{{count}}日",projectUpdated:"プロジェクトを更新しました",partAdded:"パーツを追加しました",partRemoved:"パーツを削除しました",deletePart:"パーツを削除",deletePartConfirm:"「{{name}}」を削除しますか?",templateCreated:"プロジェクトからテンプレートを作成しました",error:"エラー",projectNotFound:"プロジェクトが見つかりません",backToProjects:"プロジェクト一覧に戻る",projects:"プロジェクト",edit:"編集",platesProgress:"プレート進捗",printJobs:"印刷ジョブ",percentComplete:"% 完了",remaining:"残り",partsProgress:"パーツ進捗",parts:"パーツ",printJobsCard:"印刷ジョブ",total:"合計",failed:"失敗",partsPrinted:"印刷済みパーツ",printTime:"印刷時間",filamentUsed:"フィラメント使用量",costTracking:"コスト追跡",filamentCost:"フィラメント",energy:"エネルギー",budget:"予算",budgetRemaining:"残り予算",subProjects:"サブプロジェクト ({{count}})",partOf:"所属先",priority:"優先度",notes:"メモ",cancel:"キャンセル",save:"保存",notesPlaceholder:"このプロジェクトについてメモを追加...",noNotesYet:"メモがありません。編集をクリックして追加してください。",files:"ファイル",linkFoldersFromFileManager:"ファイルマネージャーからフォルダーをリンク",toThisProjectForQuickAccess:"してクイックアクセス。",fileCount:"{{count}}ファイル",noFoldersLinked:"リンクされたフォルダーはありません",billOfMaterials:"部品表(BOM)",bomAcquired:"{{completed}}/{{total}} 取得済み",showAll:"すべて表示",hideDone:"完了を非表示",addPart:"パーツを追加",partNamePlaceholder:"パーツ名",qty:"数量",pricePlaceholder:"価格 ({{currency}})",sourcingUrlPlaceholder:"URL(任意)",remarksPlaceholder:"備考",delete:"削除",totalCost:"合計コスト",noBomParts:"BOMにパーツがありません",activityTimeline:"アクティビティタイムライン",noActivityYet:"アクティビティがありません",timelineEvents:{project_created:"プロジェクト作成",print_completed:"印刷完了",print_failed:"印刷失敗",print_started:"印刷開始",queued:"キューに追加"},saveAsTemplate:"テンプレートとして保存",queue:"キュー",viewAll:"すべて表示",printing:"印刷中",queued:"キュー内",prints:"{{count}}件の印刷",exportProject:"プロジェクトをエクスポート",exportFailed:"エクスポートに失敗しました",projectExported:"プロジェクトがエクスポートされました",noEditPermission:"このプロジェクトを編集する権限がありません",noAddPartsPermission:"パーツを追加する権限がありません",noDeletePartsPermission:"パーツを削除する権限がありません",noEditPartsPermission:"パーツを編集する権限がありません",noUpdatePartsPermission:"パーツを更新する権限がありません",noEditNotesPermission:"ノートを編集する権限がありません",noCreateTemplatesPermission:"テンプレートを作成する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません"},projectPage:{title:"プロジェクトページ",loadFailed:"プロジェクトページデータの読み込みに失敗",noData:"プロジェクトページデータがありません",noDataHint:"このプロジェクトにはMakerWorldページデータがありません",titleField:"タイトル",designer:"デザイナー",license:"ライセンス",description:"説明",descriptionPlaceholder:"プロジェクトの説明...",printProfile:"印刷プロファイル",profileTitle:"プロファイルタイトル",profileDescriptionPlaceholder:"プロファイルの説明",byUser:"{{name}} 作",images:"画像 ({{count}})",viewOnMakerWorld:"MakerWorldで表示"},batchProject:{addedToProject:"{{count}}件のアーカイブを「{{project}}」に追加しました",assignFailed:"プロジェクトへのアーカイブ割り当てに失敗しました",removedFromProject:"{{count}}件のアーカイブをプロジェクトから削除しました",removeFailed:"プロジェクトからのアーカイブ削除に失敗しました",assignTitle:"プロジェクトに割り当て",assignDescription:"{{count}}件の選択されたアーカイブのプロジェクトを選択:",removeFromProject:"プロジェクトから削除",clearAssignment:"選択されたアーカイブのプロジェクト割り当てを解除",orAssignTo:"または割り当て先:",archiveCount:"{{count}}件のアーカイブ",noProjects:"プロジェクトがありません。先にプロジェクトを作成してください。"},richTextEditor:{bold:"太字",italic:"斜体",underline:"下線",bulletList:"箇条書き",numberedList:"番号付きリスト",alignLeft:"左揃え",alignCenter:"中央揃え",alignRight:"右揃え",addLink:"リンクを追加",removeLink:"リンクを削除"},kProfiles:{editProfile:"K-プロファイルを編集",addProfile:"K-プロファイルを追加",hasNote:"メモあり",copyProfile:"プロファイルをコピー",profileNamePlaceholder:"マイPLAプロファイル",notesPlaceholder:"このプロファイルのメモを追加...",searchPlaceholder:"名前またはフィラメントで検索...",exportToJson:"JSONにエクスポート",importFromJson:"JSONからインポート",selectAllVisible:"表示中のプロファイルをすべて選択",enterSelectionMode:"一括削除の選択モードに入る",unnamed:"名前なし",notePrefix:"メモ: ",profileName:"プロファイル名",kValue:"K値",kValueRange:"一般的な範囲: PLA 0.01 - 0.06、PETG 0.02 - 0.10",filament:"フィラメント",selectFilament:"フィラメントを選択...",noFilamentsFound:"フィラメントが見つかりません。まずBambu StudioでKプロファイルを作成してください。",flowType:"フロータイプ",highFlow:"ハイフロー",standard:"スタンダード",nozzleSize:"ノズルサイズ",extruder:"エクストルーダー",extruders:"エクストルーダー",left:"左",right:"右",notesStoredLocally:"メモ(ローカル保存)",notesHint:"メモはBambuddyに保存され、プリンターには保存されません",deleteProfileTitle:"プロファイルを削除",cannotBeUndone:"この操作は元に戻せません",confirmDeleteProfile:'"{{name}}"をプリンターから削除してもよろしいですか?',profileSaved:"Kプロファイルを保存しました",profileDeleted:"Kプロファイルを削除しました",selectExtruder:"エクストルーダーを少なくとも1つ選択してください",profileSavedToExtruders:"Kプロファイルを{{count}}個のエクストルーダーに保存しました",failedToSave:"Kプロファイルの保存に失敗しました",syncingWithPrinter:"プリンターと同期中...",pleaseWait:"お待ちください",savingToExtruder:"エクストルーダー {{current}}/{{total}} に保存中...",noPrintersConfigured:"プリンターが設定されていません",addPrinterHint:"設定でプリンターを追加してKプロファイルを管理",noActivePrinters:"アクティブなプリンターがありません",enablePrinterHint:"プリンター接続を有効にしてKプロファイルを表示",loadingProfiles:"Kプロファイルを読み込み中...",nozzle:"ノズル",allExtruders:"すべてのエクストルーダー",leftOnly:"左のみ",rightOnly:"右のみ",allFlow:"すべてのフロー",hfOnly:"HFのみ",sOnly:"Sのみ",sortName:"ソート: 名前",sortKValue:"ソート: K値",sortFilament:"ソート: フィラメント",selectAll:"すべて選択",select:"選択",printerOffline:"プリンターオフライン",printerOfflineHint:"プリンターが接続されていません。電源を入れてKプロファイルを表示してください。",leftExtruder:"左エクストルーダー",rightExtruder:"右エクストルーダー",noMatchingProfiles:"一致するプロファイルなし",noProfilesMatch:"検索条件に一致するプロファイルがありません",noKProfiles:"Kプロファイルなし",noProfilesForNozzle:"{{diameter}}mmノズルの圧力キャリブレーションプロファイルが見つかりません",createFirstProfile:"最初のプロファイルを作成",deleteProfiles:"プロファイルを削除",confirmBulkDelete:"{{count}}件の選択されたプロファイルをプリンターから削除してもよろしいですか?",noProfilesToExport:"エクスポートするプロファイルがありません",exportedProfiles:"{{count}}件のプロファイルをエクスポートしました",invalidFileFormat:"無効なファイル形式",importedProfiles:"{{total}}件中{{imported}}件のプロファイルをインポートしました",failedToParseImport:"インポートファイルの解析に失敗しました",deletedProfiles:"{{count}}件のプロファイルを削除しました",failedToSaveNote:"メモの保存に失敗しました",noPermissionAdd:"K-プロファイルを追加する権限がありません",noPermissionDelete:"K-プロファイルを削除する権限がありません",noPermissionDeleteBulk:"K-プロファイルを一括削除する権限がありません",noPermissionExport:"K-プロファイルをエクスポートする権限がありません",noPermissionImport:"K-プロファイルをインポートする権限がありません",noPermissionRefresh:"K-プロファイルを更新する権限がありません"},apiBrowser:{validationError:"バリデーションエラー",missingRequiredParams:"必須パラメーターが不足: {{params}}",networkError:"ネットワークエラー",pathParameters:"パスパラメーター",queryParameters:"クエリパラメーター",selectOption:"-- 選択 --",requestBody:"リクエストボディ",execute:"実行",fillInRequired:"入力してください: {{params}}",response:"レスポンス",failedToFetchSchema:"OpenAPIスキーマの取得に失敗しました",failedToLoadSchema:"APIスキーマの読み込みに失敗しました",otherCategory:"その他",expandAll:"すべて展開",collapseAll:"すべて折りたたむ",swaggerUI:"Swagger UI",endpointCount:"{{categories}}カテゴリー内{{count}}エンドポイント"},githubBackup:{title:"GitHubバックアップ",enabled:"有効",cloudLoginRequired:"Bambu Cloudのログインが必要です。プロファイル → クラウドプロファイルからサインインしてGitHubバックアップを有効にしてください。",description:"プロファイルをプライベートGitHubリポジトリに自動同期し、バックアップとバージョン履歴を管理します。",repositoryUrl:"リポジトリURL",personalAccessToken:"パーソナルアクセストークン",saved:"保存済み",enterNewToken:"新しいトークンを入力して更新",tokenHint:"Contents読み取り/書き込み権限を持つFine-grainedトークン",branch:"ブランチ",autoBackup:"自動バックアップ",manualOnly:"手動のみ",hourly:"毎時",daily:"毎日",weekly:"毎週",includeInBackup:"バックアップに含める",kProfiles:"Kプロファイル",noPrintersConnected:"プリンター未接続",printersConnected:"{{connected}}/{{total}} 接続中",kProfilesDescription:"接続されたプリンターからの圧力前進キャリブレーション",cloudProfiles:"クラウドプロファイル",cloudProfilesDescription:"Bambu Cloudのフィラメント、プリンター、プロセスプリセット",appSettings:"アプリ設定",appSettingsDescription:"Bambuddyの設定(機密データを除く)",lastBackup:"最終バックアップ",noBackupsYet:"バックアップなし",next:"次回",startingBackup:"バックアップ開始中...",backupNow:"今すぐバックアップ",test:"テスト",enableBackup:"バックアップを有効化",testConnection:"接続テスト",history:"履歴",date:"日付",status:"ステータス",commit:"コミット",localBackup:"ローカルバックアップ",localDescription:"Bambuddyデータをローカルファイルとしてエクスポートまたはインポートし、手動バックアップや移行に利用できます。",exportData:"データエクスポート",exportDescription:"すべての設定、プリンター、プロファイルをダウンロード",importBackup:"バックアップのインポート",importDescription:"以前のエクスポートファイルから復元",tokenUpdated:"トークンを更新しました",settingsSaved:"設定を保存しました",failedToSave:"保存に失敗しました: {{error}}",backupEnabled:"GitHubバックアップを有効にしました",backupComplete:"バックアップ完了 - {{count}}ファイル更新",backupSkipped:"バックアップをスキップ - 変更なし",backupFailed:"バックアップに失敗しました: {{error}}",logsCleared:"{{count}}件のログを削除しました",failedToClearLogs:"ログの削除に失敗しました: {{error}}",enterRepoUrl:"リポジトリURLを入力してください",enterRepoUrlAndToken:"リポジトリURLとアクセストークンを入力してください",repoUrlRequired:"リポジトリURLは必須です",tokenRequired:"アクセストークンは必須です",backupDownloaded:"バックアップのダウンロードが完了しました",failedToCreateBackup:"バックアップの作成に失敗しました",backupRestored:"バックアップの復元が完了しました"},modelViewer:{openInSlicer:"スライサーで開く",tabs:{model:"3Dモデル",gcode:"G-codeプレビュー"},notAvailable:"利用不可",notSliced:"未スライス",plates:"プレート",allPlates:"全プレート",plateNumber:"プレート {{number}}",plateCount:"{{count}} プレート",plateCount_other:"{{count}} プレート",objectCount:"{{count}} オブジェクト",objectCount_other:"{{count}} オブジェクト",filamentCount:"{{count}} フィラメント",filamentCount_other:"{{count}} フィラメント",eta:"予想時間 {{minutes}} 分",noPreview:"このファイルのプレビューは利用できません",pagination:{pageOf:"ページ {{current}} / {{total}}",prev:"前へ",next:"次へ"},errors:{failedToLoad:"ファイルの読み込みに失敗しました",noMeshes:"3MFファイルにメッシュが見つかりません",unsupportedFormat:"サポートされていないファイル形式です"}}},ple={en:{translation:hle},de:{translation:fle},ja:{translation:mle}};Es.use(YW).use(Voe).init({resources:ple,fallbackLng:"en",supportedLngs:["en","de","ja"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const Wz=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"},{code:"ja",name:"Japanese",nativeName:"日本語"}];var Kz="popstate";function gle(t={}){function e(r,i){let{pathname:s,search:o,hash:l}=r.location;return TP("",{pathname:s,search:o,hash:l},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function n(r,i){return typeof i=="string"?i:ny(i)}return xle(e,n,null,t)}function ni(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function ol(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function ble(){return Math.random().toString(36).substring(2,10)}function Xz(t,e){return{usr:t.state,key:t.key,idx:e}}function TP(t,e,n=null,r){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?Ab(e):e,state:n,key:e&&e.key||r||ble()}}function ny({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Ab(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let r=t.indexOf("?");r>=0&&(e.search=t.substring(r),t=t.substring(0,r)),t&&(e.pathname=t)}return e}function xle(t,e,n,r={}){let{window:i=document.defaultView,v5Compat:s=!1}=r,o=i.history,l="POP",c=null,u=d();u==null&&(u=0,o.replaceState({...o.state,idx:u},""));function d(){return(o.state||{idx:null}).idx}function h(){l="POP";let x=d(),y=x==null?null:x-u;u=x,c&&c({action:l,location:v.location,delta:y})}function m(x,y){l="PUSH";let S=TP(v.location,x,y);u=d()+1;let N=Xz(S,u),T=v.createHref(S);try{o.pushState(N,"",T)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;i.location.assign(T)}s&&c&&c({action:l,location:v.location,delta:1})}function p(x,y){l="REPLACE";let S=TP(v.location,x,y);u=d();let N=Xz(S,u),T=v.createHref(S);o.replaceState(N,"",T),s&&c&&c({action:l,location:v.location,delta:0})}function b(x){return yle(x)}let v={get action(){return l},get location(){return t(i,o)},listen(x){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(Kz,h),c=x,()=>{i.removeEventListener(Kz,h),c=null}},createHref(x){return e(i,x)},createURL:b,encodeLocation(x){let y=b(x);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:m,replace:p,go(x){return o.go(x)}};return v}function yle(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),ni(n,"No window.location.(origin|href) available to create URL");let r=typeof t=="string"?t:ny(t);return r=r.replace(/ $/,"%20"),!e&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function QW(t,e,n="/"){return vle(t,e,n,!1)}function vle(t,e,n,r){let i=typeof e=="string"?Ab(e):e,s=zu(i.pathname||"/",n);if(s==null)return null;let o=ZW(t);wle(o);let l=null;for(let c=0;l==null&&c{let d={relativePath:u===void 0?o.path||"":u,caseSensitive:o.caseSensitive===!0,childrenIndex:l,route:o};if(d.relativePath.startsWith("/")){if(!d.relativePath.startsWith(r)&&c)return;ni(d.relativePath.startsWith(r),`Absolute route path "${d.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(r.length)}let h=Cu([r,d.relativePath]),m=n.concat(d);o.children&&o.children.length>0&&(ni(o.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),ZW(o.children,e,m,h,c)),!(o.path==null&&!o.index)&&e.push({path:h,score:Tle(h,o.index),routesMeta:m})};return t.forEach((o,l)=>{if(o.path===""||!o.path?.includes("?"))s(o,l);else for(let c of JW(o.path))s(o,l,!0,c)}),e}function JW(t){let e=t.split("/");if(e.length===0)return[];let[n,...r]=e,i=n.endsWith("?"),s=n.replace(/\?$/,"");if(r.length===0)return i?[s,""]:[s];let o=JW(r.join("/")),l=[];return l.push(...o.map(c=>c===""?s:[s,c].join("/"))),i&&l.push(...o),l.map(c=>t.startsWith("/")&&c===""?"/":c)}function wle(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:Ale(e.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var _le=/^:[\w-]+$/,Sle=3,Nle=2,Mle=1,kle=10,Ele=-2,Yz=t=>t==="*";function Tle(t,e){let n=t.split("/"),r=n.length;return n.some(Yz)&&(r+=Ele),e&&(r+=Nle),n.filter(i=>!Yz(i)).reduce((i,s)=>i+(_le.test(s)?Sle:s===""?Mle:kle),r)}function Ale(t,e){return t.length===e.length&&t.slice(0,-1).every((r,i)=>r===e[i])?t[t.length-1]-e[e.length-1]:0}function Cle(t,e,n=!1){let{routesMeta:r}=t,i={},s="/",o=[];for(let l=0;l{if(d==="*"){let b=l[m]||"";o=s.slice(0,s.length-b.length).replace(/(.)\/+$/,"$1")}const p=l[m];return h&&!p?u[d]=void 0:u[d]=(p||"").replace(/%2F/g,"/"),u},{}),pathname:s,pathnameBase:o,pattern:t}}function jle(t,e=!1,n=!0){ol(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let r=[],i="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,l,c)=>(r.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(r.push({paramName:"*"}),i+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?i+="\\/*$":t!==""&&t!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,e?void 0:"i"),r]}function Ple(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return ol(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function zu(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,r=t.charAt(n);return r&&r!=="/"?null:t.slice(n)||"/"}var Dle=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Rle(t,e="/"){let{pathname:n,search:r="",hash:i=""}=typeof t=="string"?Ab(t):t,s;return n?(n=n.replace(/\/\/+/g,"/"),n.startsWith("/")?s=Qz(n.substring(1),"/"):s=Qz(n,e)):s=e,{pathname:s,search:Fle(r),hash:Ile(i)}}function Qz(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(i=>{i===".."?n.length>1&&n.pop():i!=="."&&n.push(i)}),n.length>1?n.join("/"):"/"}function ET(t,e,n,r){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Ole(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function $R(t){let e=Ole(t);return e.map((n,r)=>r===e.length-1?n.pathname:n.pathnameBase)}function VR(t,e,n,r=!1){let i;typeof t=="string"?i=Ab(t):(i={...t},ni(!i.pathname||!i.pathname.includes("?"),ET("?","pathname","search",i)),ni(!i.pathname||!i.pathname.includes("#"),ET("#","pathname","hash",i)),ni(!i.search||!i.search.includes("#"),ET("#","search","hash",i)));let s=t===""||i.pathname==="",o=s?"/":i.pathname,l;if(o==null)l=n;else{let h=e.length-1;if(!r&&o.startsWith("..")){let m=o.split("/");for(;m[0]==="..";)m.shift(),h-=1;i.pathname=m.join("/")}l=h>=0?e[h]:"/"}let c=Rle(i,l),u=o&&o!=="/"&&o.endsWith("/"),d=(s||o===".")&&n.endsWith("/");return!c.pathname.endsWith("/")&&(u||d)&&(c.pathname+="/"),c}var Cu=t=>t.join("/").replace(/\/\/+/g,"/"),Lle=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),Fle=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,Ile=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t,Ule=class{constructor(t,e,n,r=!1){this.status=t,this.statusText=e||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function zle(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}function Ble(t){return t.map(e=>e.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var eK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function tK(t,e){let n=t;if(typeof n!="string"||!Dle.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(eK)try{let s=new URL(window.location.href),o=n.startsWith("//")?new URL(s.protocol+n):new URL(n),l=zu(o.pathname,e);o.origin===s.origin&&l!=null?n=l+o.search+o.hash:i=!0}catch{ol(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var nK=["POST","PUT","PATCH","DELETE"];new Set(nK);var Hle=["GET",...nK];new Set(Hle);var Cb=_.createContext(null);Cb.displayName="DataRouter";var EM=_.createContext(null);EM.displayName="DataRouterState";var $le=_.createContext(!1),rK=_.createContext({isTransitioning:!1});rK.displayName="ViewTransition";var Vle=_.createContext(new Map);Vle.displayName="Fetchers";var Gle=_.createContext(null);Gle.displayName="Await";var So=_.createContext(null);So.displayName="Navigation";var Yy=_.createContext(null);Yy.displayName="Location";var ml=_.createContext({outlet:null,matches:[],isDataRoute:!1});ml.displayName="Route";var GR=_.createContext(null);GR.displayName="RouteError";var iK="REACT_ROUTER_ERROR",qle="REDIRECT",Wle="ROUTE_ERROR_RESPONSE";function Kle(t){if(t.startsWith(`${iK}:${qle}:{`))try{let e=JSON.parse(t.slice(28));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.location=="string"&&typeof e.reloadDocument=="boolean"&&typeof e.replace=="boolean")return e}catch{}}function Xle(t){if(t.startsWith(`${iK}:${Wle}:{`))try{let e=JSON.parse(t.slice(40));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string")return new Ule(e.status,e.statusText,e.data)}catch{}}function Yle(t,{relative:e}={}){ni(jb(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=_.useContext(So),{hash:i,pathname:s,search:o}=Qy(t,{relative:e}),l=s;return n!=="/"&&(l=s==="/"?n:Cu([n,s])),r.createHref({pathname:l,search:o,hash:i})}function jb(){return _.useContext(Yy)!=null}function Pc(){return ni(jb(),"useLocation() may be used only in the context of a component."),_.useContext(Yy).location}var aK="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function sK(t){_.useContext(So).static||_.useLayoutEffect(t)}function Dc(){let{isDataRoute:t}=_.useContext(ml);return t?dce():Qle()}function Qle(){ni(jb(),"useNavigate() may be used only in the context of a component.");let t=_.useContext(Cb),{basename:e,navigator:n}=_.useContext(So),{matches:r}=_.useContext(ml),{pathname:i}=Pc(),s=JSON.stringify($R(r)),o=_.useRef(!1);return sK(()=>{o.current=!0}),_.useCallback((c,u={})=>{if(ol(o.current,aK),!o.current)return;if(typeof c=="number"){n.go(c);return}let d=VR(c,JSON.parse(s),i,u.relative==="path");t==null&&e!=="/"&&(d.pathname=d.pathname==="/"?e:Cu([e,d.pathname])),(u.replace?n.replace:n.push)(d,u.state,u)},[e,n,s,i,t])}var Zle=_.createContext(null);function Jle(t){let e=_.useContext(ml).outlet;return _.useMemo(()=>e&&_.createElement(Zle.Provider,{value:t},e),[e,t])}function TM(){let{matches:t}=_.useContext(ml),e=t[t.length-1];return e?e.params:{}}function Qy(t,{relative:e}={}){let{matches:n}=_.useContext(ml),{pathname:r}=Pc(),i=JSON.stringify($R(n));return _.useMemo(()=>VR(t,JSON.parse(i),r,e==="path"),[t,i,r,e])}function ece(t,e){return oK(t,e)}function oK(t,e,n,r,i){ni(jb(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=_.useContext(So),{matches:o}=_.useContext(ml),l=o[o.length-1],c=l?l.params:{},u=l?l.pathname:"/",d=l?l.pathnameBase:"/",h=l&&l.route;{let S=h&&h.path||"";cK(u,!h||S.endsWith("*")||S.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${u}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. +`+M.stack}}var V=Object.prototype.hasOwnProperty,ge=t.unstable_scheduleCallback,Se=t.unstable_cancelCallback,ee=t.unstable_shouldYield,U=t.unstable_requestPaint,O=t.unstable_now,Z=t.unstable_getCurrentPriorityLevel,le=t.unstable_ImmediatePriority,we=t.unstable_UserBlockingPriority,ye=t.unstable_NormalPriority,se=t.unstable_LowPriority,Oe=t.unstable_IdlePriority,He=t.log,tt=t.unstable_setDisableYieldValue,Ue=null,xe=null;function Te(f){if(typeof He=="function"&&tt(f),xe&&typeof xe.setStrictMode=="function")try{xe.setStrictMode(Ue,f)}catch{}}var Ie=Math.clz32?Math.clz32:Me,Ne=Math.log,Ge=Math.LN2;function Me(f){return f>>>=0,f===0?32:31-(Ne(f)/Ge|0)|0}var rt=256,Ee=262144,Ke=4194304;function Be(f){var g=f&42;if(g!==0)return g;switch(f&-f){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return f&261888;case 262144:case 524288:case 1048576:case 2097152:return f&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return f&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return f}}function ue(f,g,w){var M=f.pendingLanes;if(M===0)return 0;var D=0,F=f.suspendedLanes,J=f.pingedLanes;f=f.warmLanes;var ve=M&134217727;return ve!==0?(M=ve&~F,M!==0?D=Be(M):(J&=ve,J!==0?D=Be(J):w||(w=ve&~f,w!==0&&(D=Be(w))))):(ve=M&~F,ve!==0?D=Be(ve):J!==0?D=Be(J):w||(w=M&~f,w!==0&&(D=Be(w)))),D===0?0:g!==0&&g!==D&&(g&F)===0&&(F=D&-D,w=g&-g,F>=w||F===32&&(w&4194048)!==0)?g:D}function $e(f,g){return(f.pendingLanes&~(f.suspendedLanes&~f.pingedLanes)&g)===0}function at(f,g){switch(f){case 1:case 2:case 4:case 8:case 64:return g+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return g+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function kt(){var f=Ke;return Ke<<=1,(Ke&62914560)===0&&(Ke=4194304),f}function gt(f){for(var g=[],w=0;31>w;w++)g.push(f);return g}function Ut(f,g){f.pendingLanes|=g,g!==268435456&&(f.suspendedLanes=0,f.pingedLanes=0,f.warmLanes=0)}function Ft(f,g,w,M,D,F){var J=f.pendingLanes;f.pendingLanes=w,f.suspendedLanes=0,f.pingedLanes=0,f.warmLanes=0,f.expiredLanes&=w,f.entangledLanes&=w,f.errorRecoveryDisabledLanes&=w,f.shellSuspendCounter=0;var ve=f.entanglements,ze=f.expirationTimes,lt=f.hiddenUpdates;for(w=J&~w;0"u")return null;try{return f.activeElement||f.body}catch{return f.body}}var ir=/[\n"\\]/g;function In(f){return f.replace(ir,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function ai(f,g,w,M,D,F,J,ve){f.name="",J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"?f.type=J:f.removeAttribute("type"),g!=null?J==="number"?(g===0&&f.value===""||f.value!=g)&&(f.value=""+fn(g)):f.value!==""+fn(g)&&(f.value=""+fn(g)):J!=="submit"&&J!=="reset"||f.removeAttribute("value"),g!=null?fr(f,J,fn(g)):w!=null?fr(f,J,fn(w)):M!=null&&f.removeAttribute("value"),D==null&&F!=null&&(f.defaultChecked=!!F),D!=null&&(f.checked=D&&typeof D!="function"&&typeof D!="symbol"),ve!=null&&typeof ve!="function"&&typeof ve!="symbol"&&typeof ve!="boolean"?f.name=""+fn(ve):f.removeAttribute("name")}function ar(f,g,w,M,D,F,J,ve){if(F!=null&&typeof F!="function"&&typeof F!="symbol"&&typeof F!="boolean"&&(f.type=F),g!=null||w!=null){if(!(F!=="submit"&&F!=="reset"||g!=null)){dn(f);return}w=w!=null?""+fn(w):"",g=g!=null?""+fn(g):w,ve||g===f.value||(f.value=g),f.defaultValue=g}M=M??D,M=typeof M!="function"&&typeof M!="symbol"&&!!M,f.checked=ve?f.checked:!!M,f.defaultChecked=!!M,J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"&&(f.name=J),dn(f)}function fr(f,g,w){g==="number"&&en(f.ownerDocument)===f||f.defaultValue===""+w||(f.defaultValue=""+w)}function nt(f,g,w,M){if(f=f.options,g){g={};for(var D=0;D"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Zb=!1;if(pr)try{var tf={};Object.defineProperty(tf,"passive",{get:function(){Zb=!0}}),window.addEventListener("test",tf,tf),window.removeEventListener("test",tf,tf)}catch{Zb=!1}var ql=null,Jb=null,Ym=null;function Lv(){if(Ym)return Ym;var f,g=Jb,w=g.length,M,D="value"in ql?ql.value:ql.textContent,F=D.length;for(f=0;f=tx),qF=" ",WF=!1;function KF(f,g){switch(f){case"keyup":return Nae.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function XF(f){return f=f.detail,typeof f=="object"&&"data"in f?f.data:null}var Jm=!1;function kae(f,g){switch(f){case"compositionend":return XF(g);case"keypress":return g.which!==32?null:(WF=!0,qF);case"textInput":return f=g.data,f===qF&&WF?null:f;default:return null}}function Eae(f,g){if(Jm)return f==="compositionend"||!_k&&KF(f,g)?(f=Lv(),Ym=Jb=ql=null,Jm=!1,f):null;switch(f){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:w,offset:g-f};f=M}e:{for(;w;){if(w.nextSibling){w=w.nextSibling;break e}w=w.parentNode}w=void 0}w=rI(w)}}function aI(f,g){return f&&g?f===g?!0:f&&f.nodeType===3?!1:g&&g.nodeType===3?aI(f,g.parentNode):"contains"in f?f.contains(g):f.compareDocumentPosition?!!(f.compareDocumentPosition(g)&16):!1:!1}function sI(f){f=f!=null&&f.ownerDocument!=null&&f.ownerDocument.defaultView!=null?f.ownerDocument.defaultView:window;for(var g=en(f.document);g instanceof f.HTMLIFrameElement;){try{var w=typeof g.contentWindow.location.href=="string"}catch{w=!1}if(w)f=g.contentWindow;else break;g=en(f.document)}return g}function Mk(f){var g=f&&f.nodeName&&f.nodeName.toLowerCase();return g&&(g==="input"&&(f.type==="text"||f.type==="search"||f.type==="tel"||f.type==="url"||f.type==="password")||g==="textarea"||f.contentEditable==="true")}var Oae=pr&&"documentMode"in document&&11>=document.documentMode,ep=null,kk=null,ax=null,Ek=!1;function oI(f,g,w){var M=w.window===w?w.document:w.nodeType===9?w:w.ownerDocument;Ek||ep==null||ep!==en(M)||(M=ep,"selectionStart"in M&&Mk(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),ax&&ix(ax,M)||(ax=M,M=Aw(kk,"onSelect"),0>=J,D-=J,Wl=1<<32-Ie(g)+D|w<jn?(Yn=Yt,Yt=null):Yn=Yt.sibling;var cr=ft(Ze,Yt,ot[jn],wt);if(cr===null){Yt===null&&(Yt=Yn);break}f&&Yt&&cr.alternate===null&&g(Ze,Yt),qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr,Yt=Yn}if(jn===ot.length)return w(Ze,Yt),Zn&&Uc(Ze,jn),Jt;if(Yt===null){for(;jnjn?(Yn=Yt,Yt=null):Yn=Yt.sibling;var jd=ft(Ze,Yt,cr.value,wt);if(jd===null){Yt===null&&(Yt=Yn);break}f&&Yt&&jd.alternate===null&&g(Ze,Yt),qe=F(jd,qe,jn),lr===null?Jt=jd:lr.sibling=jd,lr=jd,Yt=Yn}if(cr.done)return w(Ze,Yt),Zn&&Uc(Ze,jn),Jt;if(Yt===null){for(;!cr.done;jn++,cr=ot.next())cr=St(Ze,cr.value,wt),cr!==null&&(qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr);return Zn&&Uc(Ze,jn),Jt}for(Yt=M(Yt);!cr.done;jn++,cr=ot.next())cr=bt(Yt,Ze,jn,cr.value,wt),cr!==null&&(f&&cr.alternate!==null&&Yt.delete(cr.key===null?jn:cr.key),qe=F(cr,qe,jn),lr===null?Jt=cr:lr.sibling=cr,lr=cr);return f&&Yt.forEach(function(toe){return g(Ze,toe)}),Zn&&Uc(Ze,jn),Jt}function Ar(Ze,qe,ot,wt){if(typeof ot=="object"&&ot!==null&&ot.type===v&&ot.key===null&&(ot=ot.props.children),typeof ot=="object"&&ot!==null){switch(ot.$$typeof){case p:e:{for(var Jt=ot.key;qe!==null;){if(qe.key===Jt){if(Jt=ot.type,Jt===v){if(qe.tag===7){w(Ze,qe.sibling),wt=D(qe,ot.props.children),wt.return=Ze,Ze=wt;break e}}else if(qe.elementType===Jt||typeof Jt=="object"&&Jt!==null&&Jt.$$typeof===P&&pf(Jt)===qe.type){w(Ze,qe.sibling),wt=D(qe,ot.props),dx(wt,ot),wt.return=Ze,Ze=wt;break e}w(Ze,qe);break}else g(Ze,qe);qe=qe.sibling}ot.type===v?(wt=uf(ot.props.children,Ze.mode,wt,ot.key),wt.return=Ze,Ze=wt):(wt=Gv(ot.type,ot.key,ot.props,null,Ze.mode,wt),dx(wt,ot),wt.return=Ze,Ze=wt)}return J(Ze);case b:e:{for(Jt=ot.key;qe!==null;){if(qe.key===Jt)if(qe.tag===4&&qe.stateNode.containerInfo===ot.containerInfo&&qe.stateNode.implementation===ot.implementation){w(Ze,qe.sibling),wt=D(qe,ot.children||[]),wt.return=Ze,Ze=wt;break e}else{w(Ze,qe);break}else g(Ze,qe);qe=qe.sibling}wt=Rk(ot,Ze.mode,wt),wt.return=Ze,Ze=wt}return J(Ze);case P:return ot=pf(ot),Ar(Ze,qe,ot,wt)}if($(ot))return qt(Ze,qe,ot,wt);if(L(ot)){if(Jt=L(ot),typeof Jt!="function")throw Error(r(150));return ot=Jt.call(ot),ln(Ze,qe,ot,wt)}if(typeof ot.then=="function")return Ar(Ze,qe,Zv(ot),wt);if(ot.$$typeof===N)return Ar(Ze,qe,Kv(Ze,ot),wt);Jv(Ze,ot)}return typeof ot=="string"&&ot!==""||typeof ot=="number"||typeof ot=="bigint"?(ot=""+ot,qe!==null&&qe.tag===6?(w(Ze,qe.sibling),wt=D(qe,ot),wt.return=Ze,Ze=wt):(w(Ze,qe),wt=Dk(ot,Ze.mode,wt),wt.return=Ze,Ze=wt),J(Ze)):w(Ze,qe)}return function(Ze,qe,ot,wt){try{ux=0;var Jt=Ar(Ze,qe,ot,wt);return dp=null,Jt}catch(Yt){if(Yt===up||Yt===Yv)throw Yt;var lr=Qs(29,Yt,null,Ze.mode);return lr.lanes=wt,lr.return=Ze,lr}}}var bf=CI(!0),jI=CI(!1),md=!1;function qk(f){f.updateQueue={baseState:f.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wk(f,g){f=f.updateQueue,g.updateQueue===f&&(g.updateQueue={baseState:f.baseState,firstBaseUpdate:f.firstBaseUpdate,lastBaseUpdate:f.lastBaseUpdate,shared:f.shared,callbacks:null})}function pd(f){return{lane:f,tag:0,payload:null,callback:null,next:null}}function gd(f,g,w){var M=f.updateQueue;if(M===null)return null;if(M=M.shared,(mr&2)!==0){var D=M.pending;return D===null?g.next=g:(g.next=D.next,D.next=g),M.pending=g,g=Vv(f),mI(f,null,w),g}return $v(f,M,g,w),Vv(f)}function hx(f,g,w){if(g=g.updateQueue,g!==null&&(g=g.shared,(w&4194048)!==0)){var M=g.lanes;M&=f.pendingLanes,w|=M,g.lanes=w,xt(f,w)}}function Kk(f,g){var w=f.updateQueue,M=f.alternate;if(M!==null&&(M=M.updateQueue,w===M)){var D=null,F=null;if(w=w.firstBaseUpdate,w!==null){do{var J={lane:w.lane,tag:w.tag,payload:w.payload,callback:null,next:null};F===null?D=F=J:F=F.next=J,w=w.next}while(w!==null);F===null?D=F=g:F=F.next=g}else D=F=g;w={baseState:M.baseState,firstBaseUpdate:D,lastBaseUpdate:F,shared:M.shared,callbacks:M.callbacks},f.updateQueue=w;return}f=w.lastBaseUpdate,f===null?w.firstBaseUpdate=g:f.next=g,w.lastBaseUpdate=g}var Xk=!1;function fx(){if(Xk){var f=cp;if(f!==null)throw f}}function mx(f,g,w,M){Xk=!1;var D=f.updateQueue;md=!1;var F=D.firstBaseUpdate,J=D.lastBaseUpdate,ve=D.shared.pending;if(ve!==null){D.shared.pending=null;var ze=ve,lt=ze.next;ze.next=null,J===null?F=lt:J.next=lt,J=ze;var yt=f.alternate;yt!==null&&(yt=yt.updateQueue,ve=yt.lastBaseUpdate,ve!==J&&(ve===null?yt.firstBaseUpdate=lt:ve.next=lt,yt.lastBaseUpdate=ze))}if(F!==null){var St=D.baseState;J=0,yt=lt=ze=null,ve=F;do{var ft=ve.lane&-536870913,bt=ft!==ve.lane;if(bt?(Xn&ft)===ft:(M&ft)===ft){ft!==0&&ft===lp&&(Xk=!0),yt!==null&&(yt=yt.next={lane:0,tag:ve.tag,payload:ve.payload,callback:null,next:null});e:{var qt=f,ln=ve;ft=g;var Ar=w;switch(ln.tag){case 1:if(qt=ln.payload,typeof qt=="function"){St=qt.call(Ar,St,ft);break e}St=qt;break e;case 3:qt.flags=qt.flags&-65537|128;case 0:if(qt=ln.payload,ft=typeof qt=="function"?qt.call(Ar,St,ft):qt,ft==null)break e;St=h({},St,ft);break e;case 2:md=!0}}ft=ve.callback,ft!==null&&(f.flags|=64,bt&&(f.flags|=8192),bt=D.callbacks,bt===null?D.callbacks=[ft]:bt.push(ft))}else bt={lane:ft,tag:ve.tag,payload:ve.payload,callback:ve.callback,next:null},yt===null?(lt=yt=bt,ze=St):yt=yt.next=bt,J|=ft;if(ve=ve.next,ve===null){if(ve=D.shared.pending,ve===null)break;bt=ve,ve=bt.next,bt.next=null,D.lastBaseUpdate=bt,D.shared.pending=null}}while(!0);yt===null&&(ze=St),D.baseState=ze,D.firstBaseUpdate=lt,D.lastBaseUpdate=yt,F===null&&(D.shared.lanes=0),wd|=J,f.lanes=J,f.memoizedState=St}}function PI(f,g){if(typeof f!="function")throw Error(r(191,f));f.call(g)}function DI(f,g){var w=f.callbacks;if(w!==null)for(f.callbacks=null,f=0;fF?F:8;var J=q.T,ve={};q.T=ve,mE(f,!1,g,w);try{var ze=D(),lt=q.S;if(lt!==null&<(ve,ze),ze!==null&&typeof ze=="object"&&typeof ze.then=="function"){var yt=Vae(ze,M);bx(f,g,yt,no(f))}else bx(f,g,M,no(f))}catch(St){bx(f,g,{then:function(){},status:"rejected",reason:St},no())}finally{I.p=F,J!==null&&ve.types!==null&&(J.types=ve.types),q.T=J}}function Yae(){}function hE(f,g,w,M){if(f.tag!==5)throw Error(r(476));var D=d5(f).queue;u5(f,D,g,G,w===null?Yae:function(){return h5(f),w(M)})}function d5(f){var g=f.memoizedState;if(g!==null)return g;g={memoizedState:G,baseState:G,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$c,lastRenderedState:G},next:null};var w={};return g.next={memoizedState:w,baseState:w,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$c,lastRenderedState:w},next:null},f.memoizedState=g,f=f.alternate,f!==null&&(f.memoizedState=g),g}function h5(f){var g=d5(f);g.next===null&&(g=f.alternate.memoizedState),bx(f,g.next.queue,{},no())}function fE(){return Aa(Rx)}function f5(){return Ci().memoizedState}function m5(){return Ci().memoizedState}function Qae(f){for(var g=f.return;g!==null;){switch(g.tag){case 24:case 3:var w=no();f=pd(w);var M=gd(g,f,w);M!==null&&(Rs(M,g,w),hx(M,g,w)),g={cache:Hk()},f.payload=g;return}g=g.return}}function Zae(f,g,w){var M=no();w={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null},cw(f)?g5(g,w):(w=jk(f,g,w,M),w!==null&&(Rs(w,f,M),b5(w,g,M)))}function p5(f,g,w){var M=no();bx(f,g,w,M)}function bx(f,g,w,M){var D={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null};if(cw(f))g5(g,D);else{var F=f.alternate;if(f.lanes===0&&(F===null||F.lanes===0)&&(F=g.lastRenderedReducer,F!==null))try{var J=g.lastRenderedState,ve=F(J,w);if(D.hasEagerState=!0,D.eagerState=ve,Ys(ve,J))return $v(f,g,D,0),Fr===null&&Hv(),!1}catch{}if(w=jk(f,g,D,M),w!==null)return Rs(w,f,M),b5(w,g,M),!0}return!1}function mE(f,g,w,M){if(M={lane:2,revertLane:qE(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},cw(f)){if(g)throw Error(r(479))}else g=jk(f,w,M,2),g!==null&&Rs(g,f,2)}function cw(f){var g=f.alternate;return f===An||g!==null&&g===An}function g5(f,g){fp=nw=!0;var w=f.pending;w===null?g.next=g:(g.next=w.next,w.next=g),f.pending=g}function b5(f,g,w){if((w&4194048)!==0){var M=g.lanes;M&=f.pendingLanes,w|=M,g.lanes=w,xt(f,w)}}var xx={readContext:Aa,use:aw,useCallback:fi,useContext:fi,useEffect:fi,useImperativeHandle:fi,useLayoutEffect:fi,useInsertionEffect:fi,useMemo:fi,useReducer:fi,useRef:fi,useState:fi,useDebugValue:fi,useDeferredValue:fi,useTransition:fi,useSyncExternalStore:fi,useId:fi,useHostTransitionStatus:fi,useFormState:fi,useActionState:fi,useOptimistic:fi,useMemoCache:fi,useCacheRefresh:fi};xx.useEffectEvent=fi;var x5={readContext:Aa,use:aw,useCallback:function(f,g){return us().memoizedState=[f,g===void 0?null:g],f},useContext:Aa,useEffect:t5,useImperativeHandle:function(f,g,w){w=w!=null?w.concat([f]):null,ow(4194308,4,a5.bind(null,g,f),w)},useLayoutEffect:function(f,g){return ow(4194308,4,f,g)},useInsertionEffect:function(f,g){ow(4,2,f,g)},useMemo:function(f,g){var w=us();g=g===void 0?null:g;var M=f();if(xf){Te(!0);try{f()}finally{Te(!1)}}return w.memoizedState=[M,g],M},useReducer:function(f,g,w){var M=us();if(w!==void 0){var D=w(g);if(xf){Te(!0);try{w(g)}finally{Te(!1)}}}else D=g;return M.memoizedState=M.baseState=D,f={pending:null,lanes:0,dispatch:null,lastRenderedReducer:f,lastRenderedState:D},M.queue=f,f=f.dispatch=Zae.bind(null,An,f),[M.memoizedState,f]},useRef:function(f){var g=us();return f={current:f},g.memoizedState=f},useState:function(f){f=oE(f);var g=f.queue,w=p5.bind(null,An,g);return g.dispatch=w,[f.memoizedState,w]},useDebugValue:uE,useDeferredValue:function(f,g){var w=us();return dE(w,f,g)},useTransition:function(){var f=oE(!1);return f=u5.bind(null,An,f.queue,!0,!1),us().memoizedState=f,[!1,f]},useSyncExternalStore:function(f,g,w){var M=An,D=us();if(Zn){if(w===void 0)throw Error(r(407));w=w()}else{if(w=g(),Fr===null)throw Error(r(349));(Xn&127)!==0||UI(M,g,w)}D.memoizedState=w;var F={value:w,getSnapshot:g};return D.queue=F,t5(BI.bind(null,M,F,f),[f]),M.flags|=2048,pp(9,{destroy:void 0},zI.bind(null,M,F,w,g),null),w},useId:function(){var f=us(),g=Fr.identifierPrefix;if(Zn){var w=Kl,M=Wl;w=(M&~(1<<32-Ie(M)-1)).toString(32)+w,g="_"+g+"R_"+w,w=rw++,0<\/script>",F=F.removeChild(F.firstChild);break;case"select":F=typeof M.is=="string"?J.createElement("select",{is:M.is}):J.createElement("select"),M.multiple?F.multiple=!0:M.size&&(F.size=M.size);break;default:F=typeof M.is=="string"?J.createElement(D,{is:M.is}):J.createElement(D)}}F[Qn]=g,F[Tn]=M;e:for(J=g.child;J!==null;){if(J.tag===5||J.tag===6)F.appendChild(J.stateNode);else if(J.tag!==4&&J.tag!==27&&J.child!==null){J.child.return=J,J=J.child;continue}if(J===g)break e;for(;J.sibling===null;){if(J.return===null||J.return===g)break e;J=J.return}J.sibling.return=J.return,J=J.sibling}g.stateNode=F;e:switch(Ca(F,D,M),D){case"button":case"input":case"select":case"textarea":M=!!M.autoFocus;break e;case"img":M=!0;break e;default:M=!1}M&&Gc(g)}}return Gr(g),AE(g,g.type,f===null?null:f.memoizedProps,g.pendingProps,w),null;case 6:if(f&&g.stateNode!=null)f.memoizedProps!==M&&Gc(g);else{if(typeof M!="string"&&g.stateNode===null)throw Error(r(166));if(f=pe.current,sp(g)){if(f=g.stateNode,w=g.memoizedProps,M=null,D=Ea,D!==null)switch(D.tag){case 27:case 5:M=D.memoizedProps}f[Qn]=g,f=!!(f.nodeValue===w||M!==null&&M.suppressHydrationWarning===!0||FU(f.nodeValue,w)),f||hd(g,!0)}else f=Tw(f).createTextNode(M),f[Qn]=g,g.stateNode=f}return Gr(g),null;case 31:if(w=g.memoizedState,f===null||f.memoizedState!==null){if(M=sp(g),w!==null){if(f===null){if(!M)throw Error(r(318));if(f=g.memoizedState,f=f!==null?f.dehydrated:null,!f)throw Error(r(557));f[Qn]=g}else df(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Gr(g),f=!1}else w=Ik(),f!==null&&f.memoizedState!==null&&(f.memoizedState.hydrationErrors=w),f=!0;if(!f)return g.flags&256?(Js(g),g):(Js(g),null);if((g.flags&128)!==0)throw Error(r(558))}return Gr(g),null;case 13:if(M=g.memoizedState,f===null||f.memoizedState!==null&&f.memoizedState.dehydrated!==null){if(D=sp(g),M!==null&&M.dehydrated!==null){if(f===null){if(!D)throw Error(r(318));if(D=g.memoizedState,D=D!==null?D.dehydrated:null,!D)throw Error(r(317));D[Qn]=g}else df(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Gr(g),D=!1}else D=Ik(),f!==null&&f.memoizedState!==null&&(f.memoizedState.hydrationErrors=D),D=!0;if(!D)return g.flags&256?(Js(g),g):(Js(g),null)}return Js(g),(g.flags&128)!==0?(g.lanes=w,g):(w=M!==null,f=f!==null&&f.memoizedState!==null,w&&(M=g.child,D=null,M.alternate!==null&&M.alternate.memoizedState!==null&&M.alternate.memoizedState.cachePool!==null&&(D=M.alternate.memoizedState.cachePool.pool),F=null,M.memoizedState!==null&&M.memoizedState.cachePool!==null&&(F=M.memoizedState.cachePool.pool),F!==D&&(M.flags|=2048)),w!==f&&w&&(g.child.flags|=8192),mw(g,g.updateQueue),Gr(g),null);case 4:return ae(),f===null&&YE(g.stateNode.containerInfo),Gr(g),null;case 10:return Bc(g.type),Gr(g),null;case 19:if(K(Ti),M=g.memoizedState,M===null)return Gr(g),null;if(D=(g.flags&128)!==0,F=M.rendering,F===null)if(D)vx(M,!1);else{if(mi!==0||f!==null&&(f.flags&128)!==0)for(f=g.child;f!==null;){if(F=tw(f),F!==null){for(g.flags|=128,vx(M,!1),f=F.updateQueue,g.updateQueue=f,mw(g,f),g.subtreeFlags=0,f=w,w=g.child;w!==null;)pI(w,f),w=w.sibling;return ne(Ti,Ti.current&1|2),Zn&&Uc(g,M.treeForkCount),g.child}f=f.sibling}M.tail!==null&&O()>yw&&(g.flags|=128,D=!0,vx(M,!1),g.lanes=4194304)}else{if(!D)if(f=tw(F),f!==null){if(g.flags|=128,D=!0,f=f.updateQueue,g.updateQueue=f,mw(g,f),vx(M,!0),M.tail===null&&M.tailMode==="hidden"&&!F.alternate&&!Zn)return Gr(g),null}else 2*O()-M.renderingStartTime>yw&&w!==536870912&&(g.flags|=128,D=!0,vx(M,!1),g.lanes=4194304);M.isBackwards?(F.sibling=g.child,g.child=F):(f=M.last,f!==null?f.sibling=F:g.child=F,M.last=F)}return M.tail!==null?(f=M.tail,M.rendering=f,M.tail=f.sibling,M.renderingStartTime=O(),f.sibling=null,w=Ti.current,ne(Ti,D?w&1|2:w&1),Zn&&Uc(g,M.treeForkCount),f):(Gr(g),null);case 22:case 23:return Js(g),Qk(),M=g.memoizedState!==null,f!==null?f.memoizedState!==null!==M&&(g.flags|=8192):M&&(g.flags|=8192),M?(w&536870912)!==0&&(g.flags&128)===0&&(Gr(g),g.subtreeFlags&6&&(g.flags|=8192)):Gr(g),w=g.updateQueue,w!==null&&mw(g,w.retryQueue),w=null,f!==null&&f.memoizedState!==null&&f.memoizedState.cachePool!==null&&(w=f.memoizedState.cachePool.pool),M=null,g.memoizedState!==null&&g.memoizedState.cachePool!==null&&(M=g.memoizedState.cachePool.pool),M!==w&&(g.flags|=2048),f!==null&&K(mf),null;case 24:return w=null,f!==null&&(w=f.memoizedState.cache),g.memoizedState.cache!==w&&(g.flags|=2048),Bc(Ri),Gr(g),null;case 25:return null;case 30:return null}throw Error(r(156,g.tag))}function rse(f,g){switch(Lk(g),g.tag){case 1:return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 3:return Bc(Ri),ae(),f=g.flags,(f&65536)!==0&&(f&128)===0?(g.flags=f&-65537|128,g):null;case 26:case 27:case 5:return Le(g),null;case 31:if(g.memoizedState!==null){if(Js(g),g.alternate===null)throw Error(r(340));df()}return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 13:if(Js(g),f=g.memoizedState,f!==null&&f.dehydrated!==null){if(g.alternate===null)throw Error(r(340));df()}return f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 19:return K(Ti),null;case 4:return ae(),null;case 10:return Bc(g.type),null;case 22:case 23:return Js(g),Qk(),f!==null&&K(mf),f=g.flags,f&65536?(g.flags=f&-65537|128,g):null;case 24:return Bc(Ri),null;case 25:return null;default:return null}}function H5(f,g){switch(Lk(g),g.tag){case 3:Bc(Ri),ae();break;case 26:case 27:case 5:Le(g);break;case 4:ae();break;case 31:g.memoizedState!==null&&Js(g);break;case 13:Js(g);break;case 19:K(Ti);break;case 10:Bc(g.type);break;case 22:case 23:Js(g),Qk(),f!==null&&K(mf);break;case 24:Bc(Ri)}}function wx(f,g){try{var w=g.updateQueue,M=w!==null?w.lastEffect:null;if(M!==null){var D=M.next;w=D;do{if((w.tag&f)===f){M=void 0;var F=w.create,J=w.inst;M=F(),J.destroy=M}w=w.next}while(w!==D)}}catch(ve){vr(g,g.return,ve)}}function yd(f,g,w){try{var M=g.updateQueue,D=M!==null?M.lastEffect:null;if(D!==null){var F=D.next;M=F;do{if((M.tag&f)===f){var J=M.inst,ve=J.destroy;if(ve!==void 0){J.destroy=void 0,D=g;var ze=w,lt=ve;try{lt()}catch(yt){vr(D,ze,yt)}}}M=M.next}while(M!==F)}}catch(yt){vr(g,g.return,yt)}}function $5(f){var g=f.updateQueue;if(g!==null){var w=f.stateNode;try{DI(g,w)}catch(M){vr(f,f.return,M)}}}function V5(f,g,w){w.props=yf(f.type,f.memoizedProps),w.state=f.memoizedState;try{w.componentWillUnmount()}catch(M){vr(f,g,M)}}function _x(f,g){try{var w=f.ref;if(w!==null){switch(f.tag){case 26:case 27:case 5:var M=f.stateNode;break;case 30:M=f.stateNode;break;default:M=f.stateNode}typeof w=="function"?f.refCleanup=w(M):w.current=M}}catch(D){vr(f,g,D)}}function Xl(f,g){var w=f.ref,M=f.refCleanup;if(w!==null)if(typeof M=="function")try{M()}catch(D){vr(f,g,D)}finally{f.refCleanup=null,f=f.alternate,f!=null&&(f.refCleanup=null)}else if(typeof w=="function")try{w(null)}catch(D){vr(f,g,D)}else w.current=null}function G5(f){var g=f.type,w=f.memoizedProps,M=f.stateNode;try{e:switch(g){case"button":case"input":case"select":case"textarea":w.autoFocus&&M.focus();break e;case"img":w.src?M.src=w.src:w.srcSet&&(M.srcset=w.srcSet)}}catch(D){vr(f,f.return,D)}}function TE(f,g,w){try{var M=f.stateNode;Mse(M,f.type,w,g),M[Tn]=g}catch(D){vr(f,f.return,D)}}function q5(f){return f.tag===5||f.tag===3||f.tag===26||f.tag===27&&kd(f.type)||f.tag===4}function CE(f){e:for(;;){for(;f.sibling===null;){if(f.return===null||q5(f.return))return null;f=f.return}for(f.sibling.return=f.return,f=f.sibling;f.tag!==5&&f.tag!==6&&f.tag!==18;){if(f.tag===27&&kd(f.type)||f.flags&2||f.child===null||f.tag===4)continue e;f.child.return=f,f=f.child}if(!(f.flags&2))return f.stateNode}}function jE(f,g,w){var M=f.tag;if(M===5||M===6)f=f.stateNode,g?(w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w).insertBefore(f,g):(g=w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w,g.appendChild(f),w=w._reactRootContainer,w!=null||g.onclick!==null||(g.onclick=Mr));else if(M!==4&&(M===27&&kd(f.type)&&(w=f.stateNode,g=null),f=f.child,f!==null))for(jE(f,g,w),f=f.sibling;f!==null;)jE(f,g,w),f=f.sibling}function pw(f,g,w){var M=f.tag;if(M===5||M===6)f=f.stateNode,g?w.insertBefore(f,g):w.appendChild(f);else if(M!==4&&(M===27&&kd(f.type)&&(w=f.stateNode),f=f.child,f!==null))for(pw(f,g,w),f=f.sibling;f!==null;)pw(f,g,w),f=f.sibling}function W5(f){var g=f.stateNode,w=f.memoizedProps;try{for(var M=f.type,D=g.attributes;D.length;)g.removeAttributeNode(D[0]);Ca(g,M,w),g[Qn]=f,g[Tn]=w}catch(F){vr(f,f.return,F)}}var qc=!1,Fi=!1,PE=!1,K5=typeof WeakSet=="function"?WeakSet:Set,ha=null;function ise(f,g){if(f=f.containerInfo,JE=Lw,f=sI(f),Mk(f)){if("selectionStart"in f)var w={start:f.selectionStart,end:f.selectionEnd};else e:{w=(w=f.ownerDocument)&&w.defaultView||window;var M=w.getSelection&&w.getSelection();if(M&&M.rangeCount!==0){w=M.anchorNode;var D=M.anchorOffset,F=M.focusNode;M=M.focusOffset;try{w.nodeType,F.nodeType}catch{w=null;break e}var J=0,ve=-1,ze=-1,lt=0,yt=0,St=f,ft=null;t:for(;;){for(var bt;St!==w||D!==0&&St.nodeType!==3||(ve=J+D),St!==F||M!==0&&St.nodeType!==3||(ze=J+M),St.nodeType===3&&(J+=St.nodeValue.length),(bt=St.firstChild)!==null;)ft=St,St=bt;for(;;){if(St===f)break t;if(ft===w&&++lt===D&&(ve=J),ft===F&&++yt===M&&(ze=J),(bt=St.nextSibling)!==null)break;St=ft,ft=St.parentNode}St=bt}w=ve===-1||ze===-1?null:{start:ve,end:ze}}else w=null}w=w||{start:0,end:0}}else w=null;for(eA={focusedElem:f,selectionRange:w},Lw=!1,ha=g;ha!==null;)if(g=ha,f=g.child,(g.subtreeFlags&1028)!==0&&f!==null)f.return=g,ha=f;else for(;ha!==null;){switch(g=ha,F=g.alternate,f=g.flags,g.tag){case 0:if((f&4)!==0&&(f=g.updateQueue,f=f!==null?f.events:null,f!==null))for(w=0;w title"))),Ca(F,M,w),F[Qn]=f,_e(F),M=F;break e;case"link":var J=ez("link","href",D).get(M+(w.href||""));if(J){for(var ve=0;veAr&&(J=Ar,Ar=ln,ln=J);var Ze=iI(ve,ln),qe=iI(ve,Ar);if(Ze&&qe&&(bt.rangeCount!==1||bt.anchorNode!==Ze.node||bt.anchorOffset!==Ze.offset||bt.focusNode!==qe.node||bt.focusOffset!==qe.offset)){var ot=St.createRange();ot.setStart(Ze.node,Ze.offset),bt.removeAllRanges(),ln>Ar?(bt.addRange(ot),bt.extend(qe.node,qe.offset)):(ot.setEnd(qe.node,qe.offset),bt.addRange(ot))}}}}for(St=[],bt=ve;bt=bt.parentNode;)bt.nodeType===1&&St.push({element:bt,left:bt.scrollLeft,top:bt.scrollTop});for(typeof ve.focus=="function"&&ve.focus(),ve=0;vew?32:w,q.T=null,w=UE,UE=null;var F=Sd,J=Qc;if(Qi=0,vp=Sd=null,Qc=0,(mr&6)!==0)throw Error(r(331));var ve=mr;if(mr|=4,aU(F.current),nU(F,F.current,J,w),mr=ve,Ax(0,!1),xe&&typeof xe.onPostCommitFiberRoot=="function")try{xe.onPostCommitFiberRoot(Ue,F)}catch{}return!0}finally{I.p=D,q.T=M,SU(f,g)}}function MU(f,g,w){g=jo(w,g),g=xE(f.stateNode,g,2),f=gd(f,g,2),f!==null&&(Ut(f,2),Yl(f))}function vr(f,g,w){if(f.tag===3)MU(f,f,w);else for(;g!==null;){if(g.tag===3){MU(g,f,w);break}else if(g.tag===1){var M=g.stateNode;if(typeof g.type.getDerivedStateFromError=="function"||typeof M.componentDidCatch=="function"&&(_d===null||!_d.has(M))){f=jo(w,f),w=k5(2),M=gd(g,w,2),M!==null&&(E5(w,M,g,f),Ut(M,2),Yl(M));break}}g=g.return}}function $E(f,g,w){var M=f.pingCache;if(M===null){M=f.pingCache=new ose;var D=new Set;M.set(g,D)}else D=M.get(g),D===void 0&&(D=new Set,M.set(g,D));D.has(w)||(OE=!0,D.add(w),f=hse.bind(null,f,g,w),g.then(f,f))}function hse(f,g,w){var M=f.pingCache;M!==null&&M.delete(g),f.pingedLanes|=f.suspendedLanes&w,f.warmLanes&=~w,Fr===f&&(Xn&w)===w&&(mi===4||mi===3&&(Xn&62914560)===Xn&&300>O()-xw?(mr&2)===0&&wp(f,0):LE|=w,yp===Xn&&(yp=0)),Yl(f)}function kU(f,g){g===0&&(g=kt()),f=cf(f,g),f!==null&&(Ut(f,g),Yl(f))}function fse(f){var g=f.memoizedState,w=0;g!==null&&(w=g.retryLane),kU(f,w)}function mse(f,g){var w=0;switch(f.tag){case 31:case 13:var M=f.stateNode,D=f.memoizedState;D!==null&&(w=D.retryLane);break;case 19:M=f.stateNode;break;case 22:M=f.stateNode._retryCache;break;default:throw Error(r(314))}M!==null&&M.delete(g),kU(f,w)}function pse(f,g){return ge(f,g)}var Mw=null,Sp=null,VE=!1,kw=!1,GE=!1,Md=0;function Yl(f){f!==Sp&&f.next===null&&(Sp===null?Mw=Sp=f:Sp=Sp.next=f),kw=!0,VE||(VE=!0,bse())}function Ax(f,g){if(!GE&&kw){GE=!0;do for(var w=!1,M=Mw;M!==null;){if(f!==0){var D=M.pendingLanes;if(D===0)var F=0;else{var J=M.suspendedLanes,ve=M.pingedLanes;F=(1<<31-Ie(42|f)+1)-1,F&=D&~(J&~ve),F=F&201326741?F&201326741|1:F?F|2:0}F!==0&&(w=!0,CU(M,F))}else F=Xn,F=ue(M,M===Fr?F:0,M.cancelPendingCommit!==null||M.timeoutHandle!==-1),(F&3)===0||$e(M,F)||(w=!0,CU(M,F));M=M.next}while(w);GE=!1}}function gse(){EU()}function EU(){kw=VE=!1;var f=0;Md!==0&&Ese()&&(f=Md);for(var g=O(),w=null,M=Mw;M!==null;){var D=M.next,F=AU(M,g);F===0?(M.next=null,w===null?Mw=D:w.next=D,D===null&&(Sp=w)):(w=M,(f!==0||(F&3)!==0)&&(kw=!0)),M=D}Qi!==0&&Qi!==5||Ax(f),Md!==0&&(Md=0)}function AU(f,g){for(var w=f.suspendedLanes,M=f.pingedLanes,D=f.expirationTimes,F=f.pendingLanes&-62914561;0ve)break;var yt=ze.transferSize,St=ze.initiatorType;yt&&IU(St)&&(ze=ze.responseEnd,J+=yt*(ze"u"?null:document;function YU(f,g,w){var M=Np;if(M&&typeof g=="string"&&g){var D=In(g);D='link[rel="'+f+'"][href="'+D+'"]',typeof w=="string"&&(D+='[crossorigin="'+w+'"]'),XU.has(D)||(XU.add(D),f={rel:f,crossOrigin:w,href:g},M.querySelector(D)===null&&(g=M.createElement("link"),Ca(g,"link",f),_e(g),M.head.appendChild(g)))}}function Lse(f){Zc.D(f),YU("dns-prefetch",f,null)}function Fse(f,g){Zc.C(f,g),YU("preconnect",f,g)}function Ise(f,g,w){Zc.L(f,g,w);var M=Np;if(M&&f&&g){var D='link[rel="preload"][as="'+In(g)+'"]';g==="image"&&w&&w.imageSrcSet?(D+='[imagesrcset="'+In(w.imageSrcSet)+'"]',typeof w.imageSizes=="string"&&(D+='[imagesizes="'+In(w.imageSizes)+'"]')):D+='[href="'+In(f)+'"]';var F=D;switch(g){case"style":F=Mp(f);break;case"script":F=kp(f)}Fo.has(F)||(f=h({rel:"preload",href:g==="image"&&w&&w.imageSrcSet?void 0:f,as:g},w),Fo.set(F,f),M.querySelector(D)!==null||g==="style"&&M.querySelector(Px(F))||g==="script"&&M.querySelector(Dx(F))||(g=M.createElement("link"),Ca(g,"link",f),_e(g),M.head.appendChild(g)))}}function Use(f,g){Zc.m(f,g);var w=Np;if(w&&f){var M=g&&typeof g.as=="string"?g.as:"script",D='link[rel="modulepreload"][as="'+In(M)+'"][href="'+In(f)+'"]',F=D;switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":F=kp(f)}if(!Fo.has(F)&&(f=h({rel:"modulepreload",href:f},g),Fo.set(F,f),w.querySelector(D)===null)){switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(w.querySelector(Dx(F)))return}M=w.createElement("link"),Ca(M,"link",f),_e(M),w.head.appendChild(M)}}}function zse(f,g,w){Zc.S(f,g,w);var M=Np;if(M&&f){var D=Ve(M).hoistableStyles,F=Mp(f);g=g||"default";var J=D.get(F);if(!J){var ve={loading:0,preload:null};if(J=M.querySelector(Px(F)))ve.loading=5;else{f=h({rel:"stylesheet",href:f,"data-precedence":g},w),(w=Fo.get(F))&&oA(f,w);var ze=J=M.createElement("link");_e(ze),Ca(ze,"link",f),ze._p=new Promise(function(lt,yt){ze.onload=lt,ze.onerror=yt}),ze.addEventListener("load",function(){ve.loading|=1}),ze.addEventListener("error",function(){ve.loading|=2}),ve.loading|=4,jw(J,g,M)}J={type:"stylesheet",instance:J,count:1,state:ve},D.set(F,J)}}}function Bse(f,g){Zc.X(f,g);var w=Np;if(w&&f){var M=Ve(w).hoistableScripts,D=kp(f),F=M.get(D);F||(F=w.querySelector(Dx(D)),F||(f=h({src:f,async:!0},g),(g=Fo.get(D))&&lA(f,g),F=w.createElement("script"),_e(F),Ca(F,"link",f),w.head.appendChild(F)),F={type:"script",instance:F,count:1,state:null},M.set(D,F))}}function Hse(f,g){Zc.M(f,g);var w=Np;if(w&&f){var M=Ve(w).hoistableScripts,D=kp(f),F=M.get(D);F||(F=w.querySelector(Dx(D)),F||(f=h({src:f,async:!0,type:"module"},g),(g=Fo.get(D))&&lA(f,g),F=w.createElement("script"),_e(F),Ca(F,"link",f),w.head.appendChild(F)),F={type:"script",instance:F,count:1,state:null},M.set(D,F))}}function QU(f,g,w,M){var D=(D=pe.current)?Cw(D):null;if(!D)throw Error(r(446));switch(f){case"meta":case"title":return null;case"style":return typeof w.precedence=="string"&&typeof w.href=="string"?(g=Mp(w.href),w=Ve(D).hoistableStyles,M=w.get(g),M||(M={type:"style",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};case"link":if(w.rel==="stylesheet"&&typeof w.href=="string"&&typeof w.precedence=="string"){f=Mp(w.href);var F=Ve(D).hoistableStyles,J=F.get(f);if(J||(D=D.ownerDocument||D,J={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},F.set(f,J),(F=D.querySelector(Px(f)))&&!F._p&&(J.instance=F,J.state.loading=5),Fo.has(f)||(w={rel:"preload",as:"style",href:w.href,crossOrigin:w.crossOrigin,integrity:w.integrity,media:w.media,hrefLang:w.hrefLang,referrerPolicy:w.referrerPolicy},Fo.set(f,w),F||$se(D,f,w,J.state))),g&&M===null)throw Error(r(528,""));return J}if(g&&M!==null)throw Error(r(529,""));return null;case"script":return g=w.async,w=w.src,typeof w=="string"&&g&&typeof g!="function"&&typeof g!="symbol"?(g=kp(w),w=Ve(D).hoistableScripts,M=w.get(g),M||(M={type:"script",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,f))}}function Mp(f){return'href="'+In(f)+'"'}function Px(f){return'link[rel="stylesheet"]['+f+"]"}function ZU(f){return h({},f,{"data-precedence":f.precedence,precedence:null})}function $se(f,g,w,M){f.querySelector('link[rel="preload"][as="style"]['+g+"]")?M.loading=1:(g=f.createElement("link"),M.preload=g,g.addEventListener("load",function(){return M.loading|=1}),g.addEventListener("error",function(){return M.loading|=2}),Ca(g,"link",w),_e(g),f.head.appendChild(g))}function kp(f){return'[src="'+In(f)+'"]'}function Dx(f){return"script[async]"+f}function JU(f,g,w){if(g.count++,g.instance===null)switch(g.type){case"style":var M=f.querySelector('style[data-href~="'+In(w.href)+'"]');if(M)return g.instance=M,_e(M),M;var D=h({},w,{"data-href":w.href,"data-precedence":w.precedence,href:null,precedence:null});return M=(f.ownerDocument||f).createElement("style"),_e(M),Ca(M,"style",D),jw(M,w.precedence,f),g.instance=M;case"stylesheet":D=Mp(w.href);var F=f.querySelector(Px(D));if(F)return g.state.loading|=4,g.instance=F,_e(F),F;M=ZU(w),(D=Fo.get(D))&&oA(M,D),F=(f.ownerDocument||f).createElement("link"),_e(F);var J=F;return J._p=new Promise(function(ve,ze){J.onload=ve,J.onerror=ze}),Ca(F,"link",M),g.state.loading|=4,jw(F,w.precedence,f),g.instance=F;case"script":return F=kp(w.src),(D=f.querySelector(Dx(F)))?(g.instance=D,_e(D),D):(M=w,(D=Fo.get(F))&&(M=h({},w),lA(M,D)),f=f.ownerDocument||f,D=f.createElement("script"),_e(D),Ca(D,"link",M),f.head.appendChild(D),g.instance=D);case"void":return null;default:throw Error(r(443,g.type))}else g.type==="stylesheet"&&(g.state.loading&4)===0&&(M=g.instance,g.state.loading|=4,jw(M,w.precedence,f));return g.instance}function jw(f,g,w){for(var M=w.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),D=M.length?M[M.length-1]:null,F=D,J=0;J title"):null)}function Vse(f,g,w){if(w===1||g.itemProp!=null)return!1;switch(f){case"meta":case"title":return!0;case"style":if(typeof g.precedence!="string"||typeof g.href!="string"||g.href==="")break;return!0;case"link":if(typeof g.rel!="string"||typeof g.href!="string"||g.href===""||g.onLoad||g.onError)break;return g.rel==="stylesheet"?(f=g.disabled,typeof g.precedence=="string"&&f==null):!0;case"script":if(g.async&&typeof g.async!="function"&&typeof g.async!="symbol"&&!g.onLoad&&!g.onError&&g.src&&typeof g.src=="string")return!0}return!1}function nz(f){return!(f.type==="stylesheet"&&(f.state.loading&3)===0)}function Gse(f,g,w,M){if(w.type==="stylesheet"&&(typeof M.media!="string"||matchMedia(M.media).matches!==!1)&&(w.state.loading&4)===0){if(w.instance===null){var D=Mp(M.href),F=g.querySelector(Px(D));if(F){g=F._p,g!==null&&typeof g=="object"&&typeof g.then=="function"&&(f.count++,f=Dw.bind(f),g.then(f,f)),w.state.loading|=4,w.instance=F,_e(F);return}F=g.ownerDocument||g,M=ZU(M),(D=Fo.get(D))&&oA(M,D),F=F.createElement("link"),_e(F);var J=F;J._p=new Promise(function(ve,ze){J.onload=ve,J.onerror=ze}),Ca(F,"link",M),w.instance=F}f.stylesheets===null&&(f.stylesheets=new Map),f.stylesheets.set(w,g),(g=w.state.preload)&&(w.state.loading&3)===0&&(f.count++,w=Dw.bind(f),g.addEventListener("load",w),g.addEventListener("error",w))}}var cA=0;function qse(f,g){return f.stylesheets&&f.count===0&&Ow(f,f.stylesheets),0cA?50:800)+g);return f.unsuspend=w,function(){f.unsuspend=null,clearTimeout(M),clearTimeout(D)}}:null}function Dw(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Ow(this,this.stylesheets);else if(this.unsuspend){var f=this.unsuspend;this.unsuspend=null,f()}}}var Rw=null;function Ow(f,g){f.stylesheets=null,f.unsuspend!==null&&(f.count++,Rw=new Map,g.forEach(Wse,f),Rw=null,Dw.call(f))}function Wse(f,g){if(!(g.state.loading&4)){var w=Rw.get(f);if(w)var M=w.get(null);else{w=new Map,Rw.set(f,w);for(var D=f.querySelectorAll("link[data-precedence],style[data-precedence]"),F=0;F"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),xA.exports=uoe(),xA.exports}var hoe=doe();const gn=t=>typeof t=="string",zx=()=>{let t,e;const n=new Promise((r,i)=>{t=r,e=i});return n.resolve=t,n.reject=e,n},kz=t=>t==null?"":""+t,foe=(t,e,n)=>{t.forEach(r=>{e[r]&&(n[r]=e[r])})},moe=/###/g,Ez=t=>t&&t.indexOf("###")>-1?t.replace(moe,"."):t,Az=t=>!t||gn(t),j0=(t,e,n)=>{const r=gn(e)?e.split("."):e;let i=0;for(;i{const{obj:r,k:i}=j0(t,e,Object);if(r!==void 0||e.length===1){r[i]=n;return}let s=e[e.length-1],o=e.slice(0,e.length-1),l=j0(t,o,Object);for(;l.obj===void 0&&o.length;)s=`${o[o.length-1]}.${s}`,o=o.slice(0,o.length-1),l=j0(t,o,Object),l?.obj&&typeof l.obj[`${l.k}.${s}`]<"u"&&(l.obj=void 0);l.obj[`${l.k}.${s}`]=n},poe=(t,e,n,r)=>{const{obj:i,k:s}=j0(t,e,Object);i[s]=i[s]||[],i[s].push(n)},iS=(t,e)=>{const{obj:n,k:r}=j0(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},goe=(t,e,n)=>{const r=iS(t,n);return r!==void 0?r:iS(e,n)},BW=(t,e,n)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in t?gn(t[r])||t[r]instanceof String||gn(e[r])||e[r]instanceof String?n&&(t[r]=e[r]):BW(t[r],e[r],n):t[r]=e[r]);return t},Ap=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var boe={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const xoe=t=>gn(t)?t.replace(/[&<>"'\/]/g,e=>boe[e]):t;class yoe{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const voe=[" ",",","?","!",";"],woe=new yoe(20),_oe=(t,e,n)=>{e=e||"",n=n||"";const r=voe.filter(o=>e.indexOf(o)<0&&n.indexOf(o)<0);if(r.length===0)return!0;const i=woe.getRegExp(`(${r.map(o=>o==="?"?"\\?":o).join("|")})`);let s=!i.test(t);if(!s){const o=t.indexOf(n);o>0&&!i.test(t.substring(0,o))&&(s=!0)}return s},NP=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const r=e.split(n);let i=t;for(let s=0;s-1&&ct?.replace("_","-"),Soe={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class aS{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||Soe,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,r,i){return i&&!this.debug?null:(gn(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new aS(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new aS(this.logger,e)}}var hc=new aS;let EM=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const i=this.observers[r].get(n)||0;this.observers[r].set(n,i+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,s])=>{for(let o=0;o{for(let o=0;o-1&&this.options.ns.splice(n,1)}getResource(e,n,r,i={}){const s=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,o=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let l;e.indexOf(".")>-1?l=e.split("."):(l=[e,n],r&&(Array.isArray(r)?l.push(...r):gn(r)&&s?l.push(...r.split(s)):l.push(r)));const c=iS(this.data,l);return!c&&!n&&!r&&e.indexOf(".")>-1&&(e=l[0],n=l[1],r=l.slice(2).join(".")),c||!o||!gn(r)?c:NP(this.data?.[e]?.[n],r,s)}addResource(e,n,r,i,s={silent:!1}){const o=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator;let l=[e,n];r&&(l=l.concat(o?r.split(o):r)),e.indexOf(".")>-1&&(l=e.split("."),i=n,n=l[1]),this.addNamespaces(n),Tz(this.data,l,i),s.silent||this.emit("added",e,n,r,i)}addResources(e,n,r,i={silent:!1}){for(const s in r)(gn(r[s])||Array.isArray(r[s]))&&this.addResource(e,n,s,r[s],{silent:!0});i.silent||this.emit("added",e,n,r)}addResourceBundle(e,n,r,i,s,o={silent:!1,skipCopy:!1}){let l=[e,n];e.indexOf(".")>-1&&(l=e.split("."),i=r,r=n,n=l[1]),this.addNamespaces(n);let c=iS(this.data,l)||{};o.skipCopy||(r=JSON.parse(JSON.stringify(r))),i?BW(c,r,s):c={...c,...r},Tz(this.data,l,c),o.silent||this.emit("added",e,n,r)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var HW={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,r,i){return t.forEach(s=>{e=this.processors[s]?.process(e,n,r,i)??e}),e}};const $W=Symbol("i18next/PATH_KEY");function Noe(){const t=[],e=Object.create(null);let n;return e.get=(r,i)=>(n?.revoke?.(),i===$W?t:(t.push(i),n=Proxy.revocable(r,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function MP(t,e){const{[$W]:n}=t(Noe());return n.join(e?.keySeparator??".")}const jz={},_A=t=>!gn(t)&&typeof t!="boolean"&&typeof t!="number";class sS extends EM{constructor(e,n={}){super(),foe(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=hc.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const r={...n};if(e==null)return!1;const i=this.resolve(e,r);if(i?.res===void 0)return!1;const s=_A(i.res);return!(r.returnObjects===!1&&s)}extractFromKey(e,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let s=n.ns||this.options.defaultNS||[];const o=r&&e.indexOf(r)>-1,l=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!_oe(e,r,i);if(o&&!l){const c=e.match(this.interpolator.nestingRegexp);if(c&&c.length>0)return{key:e,namespaces:gn(s)?[s]:s};const u=e.split(r);(r!==i||r===i&&this.options.ns.indexOf(u[0])>-1)&&(s=u.shift()),e=u.join(i)}return{key:e,namespaces:gn(s)?[s]:s}}translate(e,n,r){let i=typeof n=="object"?{...n}:n;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i={...i}),i||(i={}),e==null)return"";typeof e=="function"&&(e=MP(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]);const s=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,o=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:l,namespaces:c}=this.extractFromKey(e[e.length-1],i),u=c[c.length-1];let d=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const h=i.lng||this.language,m=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h?.toLowerCase()==="cimode")return m?s?{res:`${u}${d}${l}`,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:`${u}${d}${l}`:s?{res:l,usedKey:l,exactUsedKey:l,usedLng:h,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:l;const p=this.resolve(e,i);let b=p?.res;const v=p?.usedKey||l,x=p?.exactUsedKey||l,y=["[object Number]","[object Function]","[object RegExp]"],S=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,N=!this.i18nFormat||this.i18nFormat.handleAsObject,A=i.count!==void 0&&!gn(i.count),k=sS.hasDefaultValue(i),C=A?this.pluralResolver.getSuffix(h,i.count,i):"",E=i.ordinal&&A?this.pluralResolver.getSuffix(h,i.count,{ordinal:!1}):"",P=A&&!i.ordinal&&i.count===0,T=P&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${C}`]||i[`defaultValue${E}`]||i.defaultValue;let j=b;N&&!b&&k&&(j=T);const z=_A(j),L=Object.prototype.toString.apply(j);if(N&&j&&z&&y.indexOf(L)<0&&!(gn(S)&&Array.isArray(j))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const B=this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,j,{...i,ns:c}):`key '${l} (${this.language})' returned an object instead of string.`;return s?(p.res=B,p.usedParams=this.getUsedParamsDetails(i),p):B}if(o){const B=Array.isArray(j),R=B?[]:{},$=B?x:v;for(const q in j)if(Object.prototype.hasOwnProperty.call(j,q)){const I=`${$}${o}${q}`;k&&!b?R[q]=this.translate(I,{...i,defaultValue:_A(T)?T[q]:void 0,joinArrays:!1,ns:c}):R[q]=this.translate(I,{...i,joinArrays:!1,ns:c}),R[q]===I&&(R[q]=j[q])}b=R}}else if(N&&gn(S)&&Array.isArray(b))b=b.join(S),b&&(b=this.extendTranslation(b,e,i,r));else{let B=!1,R=!1;!this.isValidLookup(b)&&k&&(B=!0,b=T),this.isValidLookup(b)||(R=!0,b=l);const q=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&R?void 0:b,I=k&&T!==b&&this.options.updateMissing;if(R||B||I){if(this.logger.log(I?"updateKey":"missingKey",h,u,l,I?T:b),o){const H=this.resolve(l,{...i,keySeparator:!1});H&&H.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let G=[];const Y=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Y&&Y[0])for(let H=0;H{const ie=k&&ne!==b?ne:q;this.options.missingKeyHandler?this.options.missingKeyHandler(H,u,K,ie,I,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(H,u,K,ie,I,i),this.emit("missingKey",H,u,K,b)};this.options.saveMissing&&(this.options.saveMissingPlurals&&A?G.forEach(H=>{const K=this.pluralResolver.getSuffixes(H,i);P&&i[`defaultValue${this.options.pluralSeparator}zero`]&&K.indexOf(`${this.options.pluralSeparator}zero`)<0&&K.push(`${this.options.pluralSeparator}zero`),K.forEach(ne=>{re([H],l+ne,i[`defaultValue${ne}`]||T)})}):re(G,l,T))}b=this.extendTranslation(b,e,i,p,r),R&&b===l&&this.options.appendNamespaceToMissingKey&&(b=`${u}${d}${l}`),(R||B)&&this.options.parseMissingKeyHandler&&(b=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${l}`:l,B?b:void 0,i))}return s?(p.res=b,p.usedParams=this.getUsedParamsDetails(i),p):b}extendTranslation(e,n,r,i,s){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const c=gn(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let u;if(c){const h=e.match(this.interpolator.nestingRegexp);u=h&&h.length}let d=r.replace&&!gn(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,r.lng||this.language||i.usedLng,r),c){const h=e.match(this.interpolator.nestingRegexp),m=h&&h.length;us?.[0]===h[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${n[0]}`),null):this.translate(...h,n),r)),r.interpolation&&this.interpolator.reset()}const o=r.postProcess||this.options.postProcess,l=gn(o)?[o]:o;return e!=null&&l?.length&&r.applyPostProcessor!==!1&&(e=HW.handle(l,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,s,o,l;return gn(e)&&(e=[e]),e.forEach(c=>{if(this.isValidLookup(r))return;const u=this.extractFromKey(c,n),d=u.key;i=d;let h=u.namespaces;this.options.fallbackNS&&(h=h.concat(this.options.fallbackNS));const m=n.count!==void 0&&!gn(n.count),p=m&&!n.ordinal&&n.count===0,b=n.context!==void 0&&(gn(n.context)||typeof n.context=="number")&&n.context!=="",v=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);h.forEach(x=>{this.isValidLookup(r)||(l=x,!jz[`${v[0]}-${x}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(l)&&(jz[`${v[0]}-${x}`]=!0,this.logger.warn(`key "${i}" for languages "${v.join(", ")}" won't get resolved as namespace "${l}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),v.forEach(y=>{if(this.isValidLookup(r))return;o=y;const S=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(S,d,y,x,n);else{let A;m&&(A=this.pluralResolver.getSuffix(y,n.count,n));const k=`${this.options.pluralSeparator}zero`,C=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(m&&(n.ordinal&&A.indexOf(C)===0&&S.push(d+A.replace(C,this.options.pluralSeparator)),S.push(d+A),p&&S.push(d+k)),b){const E=`${d}${this.options.contextSeparator||"_"}${n.context}`;S.push(E),m&&(n.ordinal&&A.indexOf(C)===0&&S.push(E+A.replace(C,this.options.pluralSeparator)),S.push(E+A),p&&S.push(E+k))}}let N;for(;N=S.pop();)this.isValidLookup(r)||(s=N,r=this.getResource(y,x,N,n))}))})}),{res:r,usedKey:i,exactUsedKey:s,usedLng:o,usedNS:l}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,r,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,r,i):this.resourceStore.getResource(e,n,r,i)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!gn(e.replace);let i=r?e.replace:e;if(r&&typeof e.count<"u"&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(const s of n)delete i[s]}return i}static hasDefaultValue(e){const n="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n===r.substring(0,n.length)&&e[r]!==void 0)return!0;return!1}}class Pz{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=hc.create("languageUtils")}getScriptPartFromCode(e){if(e=ty(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=ty(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(gn(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&e.forEach(r=>{if(n)return;const i=this.getScriptPartFromCode(r);if(this.isSupportedCode(i))return n=i;const s=this.getLanguagePartFromCode(r);if(this.isSupportedCode(s))return n=s;n=this.options.supportedLngs.find(o=>{if(o===s)return o;if(!(o.indexOf("-")<0&&s.indexOf("-")<0)&&(o.indexOf("-")>0&&s.indexOf("-")<0&&o.substring(0,o.indexOf("-"))===s||o.indexOf(s)===0&&s.length>1))return o})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),gn(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||(r=e[this.getScriptPartFromCode(n)]),r||(r=e[this.formatLanguageCode(n)]),r||(r=e[this.getLanguagePartFromCode(n)]),r||(r=e.default),r||[]}toResolveHierarchy(e,n){const r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],s=o=>{o&&(this.isSupportedCode(o)?i.push(o):this.logger.warn(`rejecting language code not found in supportedLngs: ${o}`))};return gn(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(e))):gn(e)&&s(this.formatLanguageCode(e)),r.forEach(o=>{i.indexOf(o)<0&&s(this.formatLanguageCode(o))}),i}}const Dz={zero:0,one:1,two:2,few:3,many:4,other:5},Rz={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Moe{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=hc.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const r=ty(e==="dev"?"en":e),i=n.ordinal?"ordinal":"cardinal",s=JSON.stringify({cleanedCode:r,type:i});if(s in this.pluralRulesCache)return this.pluralRulesCache[s];let o;try{o=new Intl.PluralRules(r,{type:i})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),Rz;if(!e.match(/-|_/))return Rz;const c=this.languageUtils.getLanguagePartFromCode(e);o=this.getRule(c,n)}return this.pluralRulesCache[s]=o,o}needsPlural(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,r={}){return this.getSuffixes(e,r).map(i=>`${n}${i}`)}getSuffixes(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?r.resolvedOptions().pluralCategories.sort((i,s)=>Dz[i]-Dz[s]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(e,n,r={}){const i=this.getRule(e,r);return i?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,r))}}const Oz=(t,e,n,r=".",i=!0)=>{let s=goe(t,e,n);return!s&&i&&gn(n)&&(s=NP(t,n,r),s===void 0&&(s=NP(e,n,r))),s},SA=t=>t.replace(/\$/g,"$$$$");class Lz{constructor(e={}){this.logger=hc.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:r,useRawValueToEscape:i,prefix:s,prefixEscaped:o,suffix:l,suffixEscaped:c,formatSeparator:u,unescapeSuffix:d,unescapePrefix:h,nestingPrefix:m,nestingPrefixEscaped:p,nestingSuffix:b,nestingSuffixEscaped:v,nestingOptionsSeparator:x,maxReplaces:y,alwaysFormat:S}=e.interpolation;this.escape=n!==void 0?n:xoe,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=s?Ap(s):o||"{{",this.suffix=l?Ap(l):c||"}}",this.formatSeparator=u||",",this.unescapePrefix=d?"":h||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=m?Ap(m):p||Ap("$t("),this.nestingSuffix=b?Ap(b):v||Ap(")"),this.nestingOptionsSeparator=x||",",this.maxReplaces=y||1e3,this.alwaysFormat=S!==void 0?S:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,r)=>n?.source===r?(n.lastIndex=0,n):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,r,i){let s,o,l;const c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=p=>{if(p.indexOf(this.formatSeparator)<0){const y=Oz(n,c,p,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(y,void 0,r,{...i,...n,interpolationkey:p}):y}const b=p.split(this.formatSeparator),v=b.shift().trim(),x=b.join(this.formatSeparator).trim();return this.format(Oz(n,c,v,this.options.keySeparator,this.options.ignoreJSONStructure),x,r,{...i,...n,interpolationkey:v})};this.resetRegExp();const d=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:p=>SA(p)},{regex:this.regexp,safeValue:p=>this.escapeValue?SA(this.escape(p)):SA(p)}].forEach(p=>{for(l=0;s=p.regex.exec(e);){const b=s[1].trim();if(o=u(b),o===void 0)if(typeof d=="function"){const x=d(e,s,i);o=gn(x)?x:""}else if(i&&Object.prototype.hasOwnProperty.call(i,b))o="";else if(h){o=s[0];continue}else this.logger.warn(`missed to pass in variable ${b} for interpolating ${e}`),o="";else!gn(o)&&!this.useRawValueToEscape&&(o=kz(o));const v=p.safeValue(o);if(e=e.replace(s[0],v),h?(p.regex.lastIndex+=o.length,p.regex.lastIndex-=s[0].length):p.regex.lastIndex=0,l++,l>=this.maxReplaces)break}}),e}nest(e,n,r={}){let i,s,o;const l=(c,u)=>{const d=this.nestingOptionsSeparator;if(c.indexOf(d)<0)return c;const h=c.split(new RegExp(`${d}[ ]*{`));let m=`{${h[1]}`;c=h[0],m=this.interpolate(m,o);const p=m.match(/'/g),b=m.match(/"/g);((p?.length??0)%2===0&&!b||b.length%2!==0)&&(m=m.replace(/'/g,'"'));try{o=JSON.parse(m),u&&(o={...u,...o})}catch(v){return this.logger.warn(`failed parsing options string in nesting for key ${c}`,v),`${c}${d}${m}`}return o.defaultValue&&o.defaultValue.indexOf(this.prefix)>-1&&delete o.defaultValue,c};for(;i=this.nestingRegexp.exec(e);){let c=[];o={...r},o=o.replace&&!gn(o.replace)?o.replace:o,o.applyPostProcessor=!1,delete o.defaultValue;const u=/{.*}/.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(u!==-1&&(c=i[1].slice(u).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),i[1]=i[1].slice(0,u)),s=n(l.call(this,i[1].trim(),o),o),s&&i[0]===e&&!gn(s))return s;gn(s)||(s=kz(s)),s||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),s=""),c.length&&(s=c.reduce((d,h)=>this.format(d,h,r.lng,{...r,interpolationkey:i[1].trim()}),s.trim())),e=e.replace(i[0],s),this.regexp.lastIndex=0}return e}}const koe=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const r=t.split("(");e=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);e==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):e==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(o=>{if(o){const[l,...c]=o.split(":"),u=c.join(":").trim().replace(/^'+|'+$/g,""),d=l.trim();n[d]||(n[d]=u),u==="false"&&(n[d]=!1),u==="true"&&(n[d]=!0),isNaN(u)||(n[d]=parseInt(u,10))}})}return{formatName:e,formatOptions:n}},Fz=t=>{const e={};return(n,r,i)=>{let s=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(s={...s,[i.interpolationkey]:void 0});const o=r+JSON.stringify(s);let l=e[o];return l||(l=t(ty(r),i),e[o]=l),l(n)}},Eoe=t=>(e,n,r)=>t(ty(n),r)(e);class Aoe{constructor(e={}){this.logger=hc.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const r=n.cacheInBuiltFormats?Fz:Eoe;this.formats={number:r((i,s)=>{const o=new Intl.NumberFormat(i,{...s});return l=>o.format(l)}),currency:r((i,s)=>{const o=new Intl.NumberFormat(i,{...s,style:"currency"});return l=>o.format(l)}),datetime:r((i,s)=>{const o=new Intl.DateTimeFormat(i,{...s});return l=>o.format(l)}),relativetime:r((i,s)=>{const o=new Intl.RelativeTimeFormat(i,{...s});return l=>o.format(l,s.range||"day")}),list:r((i,s)=>{const o=new Intl.ListFormat(i,{...s});return l=>o.format(l)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=Fz(n)}format(e,n,r,i={}){const s=n.split(this.formatSeparator);if(s.length>1&&s[0].indexOf("(")>1&&s[0].indexOf(")")<0&&s.find(l=>l.indexOf(")")>-1)){const l=s.findIndex(c=>c.indexOf(")")>-1);s[0]=[s[0],...s.splice(1,l)].join(this.formatSeparator)}return s.reduce((l,c)=>{const{formatName:u,formatOptions:d}=koe(c);if(this.formats[u]){let h=l;try{const m=i?.formatParams?.[i.interpolationkey]||{},p=m.locale||m.lng||i.locale||i.lng||r;h=this.formats[u](l,p,{...d,...i,...m})}catch(m){this.logger.warn(m)}return h}else this.logger.warn(`there was no format function for ${u}`);return l},e)}}const Toe=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class Coe extends EM{constructor(e,n,r,i={}){super(),this.backend=e,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=hc.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,i.backend,i)}queueLoad(e,n,r,i){const s={},o={},l={},c={};return e.forEach(u=>{let d=!0;n.forEach(h=>{const m=`${u}|${h}`;!r.reload&&this.store.hasResourceBundle(u,h)?this.state[m]=2:this.state[m]<0||(this.state[m]===1?o[m]===void 0&&(o[m]=!0):(this.state[m]=1,d=!1,o[m]===void 0&&(o[m]=!0),s[m]===void 0&&(s[m]=!0),c[h]===void 0&&(c[h]=!0)))}),d||(l[u]=!0)}),(Object.keys(s).length||Object.keys(o).length)&&this.queue.push({pending:o,pendingCount:Object.keys(o).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(s),pending:Object.keys(o),toLoadLanguages:Object.keys(l),toLoadNamespaces:Object.keys(c)}}loaded(e,n,r){const i=e.split("|"),s=i[0],o=i[1];n&&this.emit("failedLoading",s,o,n),!n&&r&&this.store.addResourceBundle(s,o,r,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&r&&(this.state[e]=0);const l={};this.queue.forEach(c=>{poe(c.loaded,[s],o),Toe(c,e),n&&c.errors.push(n),c.pendingCount===0&&!c.done&&(Object.keys(c.loaded).forEach(u=>{l[u]||(l[u]={});const d=c.loaded[u];d.length&&d.forEach(h=>{l[u][h]===void 0&&(l[u][h]=!0)})}),c.done=!0,c.errors.length?c.callback(c.errors):c.callback())}),this.emit("loaded",l),this.queue=this.queue.filter(c=>!c.done)}read(e,n,r,i=0,s=this.retryTimeout,o){if(!e.length)return o(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:r,tried:i,wait:s,callback:o});return}this.readingCalls++;const l=(u,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const h=this.waitingReads.shift();this.read(h.lng,h.ns,h.fcName,h.tried,h.wait,h.callback)}if(u&&d&&i{this.read.call(this,e,n,r,i+1,s*2,o)},s);return}o(u,d)},c=this.backend[r].bind(this.backend);if(c.length===2){try{const u=c(e,n);u&&typeof u.then=="function"?u.then(d=>l(null,d)).catch(l):l(null,u)}catch(u){l(u)}return}return c(e,n,l)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();gn(e)&&(e=this.languageUtils.toResolveHierarchy(e)),gn(n)&&(n=[n]);const s=this.queueLoad(e,n,r,i);if(!s.toLoad.length)return s.pending.length||i(),null;s.toLoad.forEach(o=>{this.loadOne(o)})}load(e,n,r){this.prepareLoading(e,n,{},r)}reload(e,n,r){this.prepareLoading(e,n,{reload:!0},r)}loadOne(e,n=""){const r=e.split("|"),i=r[0],s=r[1];this.read(i,s,"read",void 0,void 0,(o,l)=>{o&&this.logger.warn(`${n}loading namespace ${s} for language ${i} failed`,o),!o&&l&&this.logger.log(`${n}loaded namespace ${s} for language ${i}`,l),this.loaded(e,o,l)})}saveMissing(e,n,r,i,s,o={},l=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const c={...o,isUpdate:s},u=this.backend.create.bind(this.backend);if(u.length<6)try{let d;u.length===5?d=u(e,n,r,i,c):d=u(e,n,r,i),d&&typeof d.then=="function"?d.then(h=>l(null,h)).catch(l):l(null,d)}catch(d){l(d)}else u(e,n,r,i,l,c)}!e||!e[0]||this.store.addResource(e[0],n,r,i)}}}const NA=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),gn(t[1])&&(e.defaultValue=t[1]),gn(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(r=>{e[r]=n[r]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),Iz=t=>(gn(t.ns)&&(t.ns=[t.ns]),gn(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),gn(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),Vw=()=>{},joe=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})},Poe=t=>!!(t?.modules?.backend?.name?.indexOf("Locize")>0||t?.modules?.backend?.constructor?.name?.indexOf("Locize")>0||t?.options?.backend?.backends&&t.options.backend.backends.some(e=>e?.name?.indexOf("Locize")>0||e?.constructor?.name?.indexOf("Locize")>0));class P0 extends EM{constructor(e={},n){if(super(),this.options=Iz(e),this.services={},this.logger=hc,this.modules={external:[]},joe(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(gn(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=NA();this.options={...r,...this.options,...Iz(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=r.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!Poe(this)&&typeof console<"u"&&typeof console.info<"u"&&console.info("🌐 i18next is maintained with support from locize.com — consider powering your project with managed localization (AI, CDN, integrations): https://locize.com 💙");const i=u=>u?typeof u=="function"?new u:u:null;if(!this.options.isClone){this.modules.logger?hc.init(i(this.modules.logger),this.options):hc.init(null,this.options);let u;this.modules.formatter?u=this.modules.formatter:u=Aoe;const d=new Pz(this.options);this.store=new Cz(this.options.resources,this.options);const h=this.services;h.logger=hc,h.resourceStore=this.store,h.languageUtils=d,h.pluralResolver=new Moe(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),u&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(h.formatter=i(u),h.formatter.init&&h.formatter.init(h,this.options),this.options.interpolation.format=h.formatter.format.bind(h.formatter)),h.interpolator=new Lz(this.options),h.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},h.backendConnector=new Coe(i(this.modules.backend),h.resourceStore,h,this.options),h.backendConnector.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.languageDetector&&(h.languageDetector=i(this.modules.languageDetector),h.languageDetector.init&&h.languageDetector.init(h,this.options.detection,this.options)),this.modules.i18nFormat&&(h.i18nFormat=i(this.modules.i18nFormat),h.i18nFormat.init&&h.i18nFormat.init(this)),this.translator=new sS(this.services,this.options),this.translator.on("*",(p,...b)=>{this.emit(p,...b)}),this.modules.external.forEach(p=>{p.init&&p.init(this)})}if(this.format=this.options.interpolation.format,n||(n=Vw),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.length>0&&u[0]!=="dev"&&(this.options.lng=u[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(u=>{this[u]=(...d)=>this.store[u](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(u=>{this[u]=(...d)=>(this.store[u](...d),this)});const l=zx(),c=()=>{const u=(d,h)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(h),n(d,h)};if(this.languages&&!this.isInitialized)return u(null,this.t.bind(this));this.changeLanguage(this.options.lng,u)};return this.options.resources||!this.options.initAsync?c():setTimeout(c,0),l}loadResources(e,n=Vw){let r=n;const i=gn(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const s=[],o=l=>{if(!l||l==="cimode")return;this.services.languageUtils.toResolveHierarchy(l).forEach(u=>{u!=="cimode"&&s.indexOf(u)<0&&s.push(u)})};i?o(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(c=>o(c)),this.options.preload?.forEach?.(l=>o(l)),this.services.backendConnector.load(s,this.options.ns,l=>{!l&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(l)})}else r(null)}reloadResources(e,n,r){const i=zx();return typeof e=="function"&&(r=e,e=void 0),typeof n=="function"&&(r=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),r||(r=Vw),this.services.backendConnector.reload(e,n,s=>{i.resolve(),r(s)}),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&HW.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const r=zx();this.emit("languageChanging",e);const i=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},s=(l,c)=>{c?this.isLanguageChangingTo===e&&(i(c),this.translator.changeLanguage(c),this.isLanguageChangingTo=void 0,this.emit("languageChanged",c),this.logger.log("languageChanged",c)):this.isLanguageChangingTo=void 0,r.resolve((...u)=>this.t(...u)),n&&n(l,(...u)=>this.t(...u))},o=l=>{!e&&!l&&this.services.languageDetector&&(l=[]);const c=gn(l)?l:l&&l[0],u=this.store.hasLanguageSomeTranslations(c)?c:this.services.languageUtils.getBestMatchFromCodes(gn(l)?[l]:l);u&&(this.language||i(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector?.cacheUserLanguage?.(u)),this.loadResources(u,d=>{s(d,u)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?o(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(o):this.services.languageDetector.detect(o):o(e),r}getFixedT(e,n,r){const i=(s,o,...l)=>{let c;typeof o!="object"?c=this.options.overloadTranslationOptionHandler([s,o].concat(l)):c={...o},c.lng=c.lng||i.lng,c.lngs=c.lngs||i.lngs,c.ns=c.ns||i.ns,c.keyPrefix!==""&&(c.keyPrefix=c.keyPrefix||r||i.keyPrefix);const u=this.options.keySeparator||".";let d;return c.keyPrefix&&Array.isArray(s)?d=s.map(h=>(typeof h=="function"&&(h=MP(h,{...this.options,...o})),`${c.keyPrefix}${u}${h}`)):(typeof s=="function"&&(s=MP(s,{...this.options,...o})),d=c.keyPrefix?`${c.keyPrefix}${u}${s}`:s),this.t(d,c)};return gn(e)?i.lng=e:i.lngs=e,i.ns=n,i.keyPrefix=r,i}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,s=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const o=(l,c)=>{const u=this.services.backendConnector.state[`${l}|${c}`];return u===-1||u===0||u===2};if(n.precheck){const l=n.precheck(this,o);if(l!==void 0)return l}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||o(r,e)&&(!i||o(s,e)))}loadNamespaces(e,n){const r=zx();return this.options.ns?(gn(e)&&(e=[e]),e.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(e,n){const r=zx();gn(e)&&(e=[e]);const i=this.options.preload||[],s=e.filter(o=>i.indexOf(o)<0&&this.services.languageUtils.isSupportedCode(o));return s.length?(this.options.preload=i.concat(s),this.loadResources(o=>{r.resolve(),n&&n(o)}),r):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const i=new Intl.Locale(e);if(i&&i.getTextInfo){const s=i.getTextInfo();if(s&&s.direction)return s.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new Pz(NA());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const r=new P0(e,n);return r.createInstance=P0.createInstance,r}cloneInstance(e={},n=Vw){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},s=new P0(i);if((e.debug!==void 0||e.prefix!==void 0)&&(s.logger=s.logger.clone(e)),["store","services","language"].forEach(l=>{s[l]=this[l]}),s.services={...this.services},s.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},r){const l=Object.keys(this.store.data).reduce((c,u)=>(c[u]={...this.store.data[u]},c[u]=Object.keys(c[u]).reduce((d,h)=>(d[h]={...c[u][h]},d),c[u]),c),{});s.store=new Cz(l,i),s.services.resourceStore=s.store}if(e.interpolation){const c={...NA().interpolation,...this.options.interpolation,...e.interpolation},u={...i,interpolation:c};s.services.interpolator=new Lz(u)}return s.translator=new sS(s.services,i),s.translator.on("*",(l,...c)=>{s.emit(l,...c)}),s.init(i,n),s.translator.options=i,s.translator.backendConnector.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},s}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const Es=P0.createInstance();Es.createInstance;Es.dir;Es.init;Es.loadResources;Es.reloadResources;Es.use;Es.changeLanguage;Es.getFixedT;Es.t;Es.exists;Es.setDefaultNamespace;Es.hasLoadedNamespace;Es.loadNamespaces;Es.loadLanguages;const Doe=(t,e,n,r)=>{const i=[n,{code:e,...r||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(i,"warn","react-i18next::",!0);bm(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...i):console?.warn&&console.warn(...i)},Uz={},VW=(t,e,n,r)=>{bm(n)&&Uz[n]||(bm(n)&&(Uz[n]=new Date),Doe(t,e,n,r))},GW=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},kP=(t,e,n)=>{t.loadNamespaces(e,GW(t,n))},zz=(t,e,n,r)=>{if(bm(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return kP(t,n,r);n.forEach(i=>{t.options.ns.indexOf(i)<0&&t.options.ns.push(i)}),t.loadLanguages(e,GW(t,r))},Roe=(t,e,n={})=>!e.languages||!e.languages.length?(VW(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(r,i)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!i(r.isLanguageChangingTo,t))return!1}}),bm=t=>typeof t=="string",Ooe=t=>typeof t=="object"&&t!==null,Loe=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,Foe={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},Ioe=t=>Foe[t],Uoe=t=>t.replace(Loe,Ioe);let EP={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Uoe,transDefaultProps:void 0};const zoe=(t={})=>{EP={...EP,...t}},Boe=()=>EP;let qW;const Hoe=t=>{qW=t},$oe=()=>qW,Voe={type:"3rdParty",init(t){zoe(t.options.react),Hoe(t)}},Goe=_.createContext();class qoe{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var MA={exports:{}},kA={};var Bz;function Woe(){if(Bz)return kA;Bz=1;var t=Ab();function e(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:e,r=t.useState,i=t.useEffect,s=t.useLayoutEffect,o=t.useDebugValue;function l(h,m){var p=m(),b=r({inst:{value:p,getSnapshot:m}}),v=b[0].inst,x=b[1];return s(function(){v.value=p,v.getSnapshot=m,c(v)&&x({inst:v})},[h,p,m]),i(function(){return c(v)&&x({inst:v}),h(function(){c(v)&&x({inst:v})})},[h]),o(p),p}function c(h){var m=h.getSnapshot;h=h.value;try{var p=m();return!n(h,p)}catch{return!0}}function u(h,m){return m()}var d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?u:l;return kA.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:d,kA}var Hz;function WW(){return Hz||(Hz=1,MA.exports=Woe()),MA.exports}var HR=WW();const Koe=(t,e)=>bm(e)?e:Ooe(e)&&bm(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,Xoe={t:Koe,ready:!1},Yoe=()=>()=>{},Sn=(t,e={})=>{const{i18n:n}=e,{i18n:r,defaultNS:i}=_.useContext(Goe)||{},s=n||r||$oe();s&&!s.reportNamespaces&&(s.reportNamespaces=new qoe),s||VW(s,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const o=_.useMemo(()=>({...Boe(),...s?.options?.react,...e}),[s,e]),{useSuspense:l,keyPrefix:c}=o,u=i||s?.options?.defaultNS,d=bm(u)?[u]:u||["translation"],h=_.useMemo(()=>d,d);s?.reportNamespaces?.addUsedNamespaces?.(h);const m=_.useRef(0),p=_.useCallback(T=>{if(!s)return Yoe;const{bindI18n:j,bindI18nStore:z}=o,L=()=>{m.current+=1,T()};return j&&s.on(j,L),z&&s.store.on(z,L),()=>{j&&j.split(" ").forEach(B=>s.off(B,L)),z&&z.split(" ").forEach(B=>s.store.off(B,L))}},[s,o]),b=_.useRef(),v=_.useCallback(()=>{if(!s)return Xoe;const T=!!(s.isInitialized||s.initializedStoreOnce)&&h.every($=>Roe($,s,o)),j=e.lng||s.language,z=m.current,L=b.current;if(L&&L.ready===T&&L.lng===j&&L.keyPrefix===c&&L.revision===z)return L;const R={t:s.getFixedT(j,o.nsMode==="fallback"?h:h[0],c),ready:T,lng:j,keyPrefix:c,revision:z};return b.current=R,R},[s,h,c,o,e.lng]),[x,y]=_.useState(0),{t:S,ready:N}=HR.useSyncExternalStore(p,v,v);_.useEffect(()=>{if(s&&!N&&!l){const T=()=>y(j=>j+1);e.lng?zz(s,e.lng,h,T):kP(s,h,T)}},[s,e.lng,h,N,l,x]);const A=s||{},k=_.useRef(null),C=_.useRef(),E=T=>{const j=Object.getOwnPropertyDescriptors(T);j.__original&&delete j.__original;const z=Object.create(Object.getPrototypeOf(T),j);if(!Object.prototype.hasOwnProperty.call(z,"__original"))try{Object.defineProperty(z,"__original",{value:T,writable:!1,enumerable:!1,configurable:!1})}catch{}return z},P=_.useMemo(()=>{const T=A,j=T?.language;let z=T;T&&(k.current&&k.current.__original===T?C.current!==j?(z=E(T),k.current=z,C.current=j):z=k.current:(z=E(T),k.current=z,C.current=j));const L=[S,z,N];return L.t=S,L.i18n=z,L.ready=N,L},[S,A,N,A.resolvedLanguage,A.language,A.languages]);if(s&&l&&!N)throw new Promise(T=>{const j=()=>T();e.lng?zz(s,e.lng,h,j):kP(s,h,j)});return P},{slice:Qoe,forEach:Zoe}=[];function Joe(t){return Zoe.call(Qoe.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function ele(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const $z=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,tle=function(t,e){const r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},i=encodeURIComponent(e);let s=`${t}=${i}`;if(r.maxAge>0){const o=r.maxAge-0;if(Number.isNaN(o))throw new Error("maxAge should be a Number");s+=`; Max-Age=${Math.floor(o)}`}if(r.domain){if(!$z.test(r.domain))throw new TypeError("option domain is invalid");s+=`; Domain=${r.domain}`}if(r.path){if(!$z.test(r.path))throw new TypeError("option path is invalid");s+=`; Path=${r.path}`}if(r.expires){if(typeof r.expires.toUTCString!="function")throw new TypeError("option expires is invalid");s+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(s+="; HttpOnly"),r.secure&&(s+="; Secure"),r.sameSite)switch(typeof r.sameSite=="string"?r.sameSite.toLowerCase():r.sameSite){case!0:s+="; SameSite=Strict";break;case"lax":s+="; SameSite=Lax";break;case"strict":s+="; SameSite=Strict";break;case"none":s+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return r.partitioned&&(s+="; Partitioned"),s},Vz={create(t,e,n,r){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+n*60*1e3)),r&&(i.domain=r),document.cookie=tle(t,e,i)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let r=0;r-1&&(r=window.location.hash.substring(window.location.hash.indexOf("?")));const s=r.substring(1).split("&");for(let o=0;o0&&s[o].substring(0,l)===e&&(n=s[o].substring(l+1))}}return n}},ile={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,r;if(typeof window<"u"){const{hash:i}=window.location;if(i&&i.length>2){const s=i.substring(1);if(e){const o=s.split("&");for(let l=0;l0&&o[l].substring(0,c)===e&&(r=o[l].substring(c+1))}}if(r)return r;if(!r&&n>-1){const o=i.match(/\/([a-zA-Z-]*)/g);return Array.isArray(o)?o[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return r}};let Tp=null;const Gz=()=>{if(Tp!==null)return Tp;try{if(Tp=typeof window<"u"&&window.localStorage!==null,!Tp)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{Tp=!1}return Tp};var ale={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&Gz())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&Gz()&&window.localStorage.setItem(n,t)}};let Cp=null;const qz=()=>{if(Cp!==null)return Cp;try{if(Cp=typeof window<"u"&&window.sessionStorage!==null,!Cp)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{Cp=!1}return Cp};var sle={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&qz())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&qz()&&window.sessionStorage.setItem(n,t)}},ole={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:r,language:i}=navigator;if(n)for(let s=0;s0?e:void 0}},lle={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const r=e||(typeof document<"u"?document.documentElement:null);return r&&typeof r.getAttribute=="function"&&(n=r.getAttribute("lang")),n}},cle={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},ule={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,r=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r[n]}};let KW=!1;try{document.cookie,KW=!0}catch{}const XW=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];KW||XW.splice(1,1);const dle=()=>({order:XW,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class YW{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=Joe(n,this.options||{},dle()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=i=>i.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(nle),this.addDetector(rle),this.addDetector(ale),this.addDetector(sle),this.addDetector(ole),this.addDetector(lle),this.addDetector(cle),this.addDetector(ule),this.addDetector(ile)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(r=>{if(this.detectors[r]){let i=this.detectors[r].lookup(this.options);i&&typeof i=="string"&&(i=[i]),i&&(n=n.concat(i))}}),n=n.filter(r=>r!=null&&!ele(r)).map(r=>this.options.convertDetectedLanguage(r)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(r=>{this.detectors[r]&&this.detectors[r].cacheUserLanguage(e,this.options)}))}}YW.type="languageDetector";const hle={nav:{printers:"Printers",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",projects:"Projects",files:"File Manager",settings:"Settings",system:"System",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",updateAvailableBanner:"Version {{version}} is available!",viewUpdate:"View update",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode",smartSwitches:"Smart Switches",logout:"Logout"},common:{save:"Save",saving:"Saving...",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",days:"days",enable:"Enable",disable:"Disable",permissions:"Permissions",noPrinters:"No printers configured",noData:"No data available",linkNotFound:"Link not found",required:"Required",optional:"Optional",dismiss:"Dismiss",apply:"Apply",reset:"Reset",clear:"Clear",selectAll:"Select All",deselectAll:"Deselect All",noChange:"— No change —",unchanged:"Unchanged",unassigned:"Unassigned",unknown:"Unknown",unknownError:"Unknown error",today:"Today",asap:"ASAP",overdue:"Overdue",now:"Now",collapse:"Collapse",expand:"Expand",viewArchive:"View archive",viewInFileManager:"View in File Manager",addedBy:"Added by {{username}}",prints:"prints",more:"+{{count}} more",ascending:"Ascending",descending:"Descending",printer:"Printer",remove:"Remove",type:"Type",print:"Print",rename:"Rename",move:"Move",create:"Create",duplicate:"Duplicate",left:"Left",right:"Right"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due",sort:{name:"Name",status:"Status",model:"Model",location:"Location",ascending:"Sort ascending",descending:"Sort descending"},cardSize:{small:"Small cards",medium:"Medium cards",large:"Large cards",extraLarge:"Extra large cards"},hideOffline:"Hide offline",powerOn:"Power On",offlinePrintersWithPlugs:"Offline printers with smart plugs",noPrintersConfigured:"No printers configured yet",readyToPrint:"Ready to print",external:"External",deleteArchives:"Delete print archives",noLabel:"No label",printPreview:"Print preview",width:"Width",height:"Height",noObjectsFound:"No objects found",objectsLoadedOnPrintStart:"Objects are loaded when a print starts",willBeSkipped:"Will be skipped",name:"Name",serialCannotBeChanged:"Serial number cannot be changed",locationHelp:"Used to group printers and filter queue jobs",wifiSignal:{veryWeak:"Very weak",weak:"Weak",fair:"Fair",good:"Good",excellent:"Excellent"},maintenanceUpToDate:"All maintenance up to date - Click to view",chamberLightOn:"Turn on chamber light",chamberLightOff:"Turn off chamber light",browseFiles:"Browse printer files",autoOffAfterPrint:"Auto power-off after print",autoOffExecuted:"Auto-off was executed - turn printer on to reset",hmsErrors:"HMS Errors",viewHmsErrors:"View {{count}} HMS error(s)",resume:"Resume",pause:"Pause",stop:"Stop",camera:"Camera",skipObject:"Skip Object",reconnect:"Reconnect",mqttDebug:"MQTT Debug",activeNozzle:"Active: {{nozzle}} nozzle",firmwareUpdate:"Firmware Update",firmwareInstructions:"On the printer's touchscreen, go to",firmwareNav:"Navigate to",settings:"Settings",firmware:"Firmware",discoverPrinters:"Discover Printers",searching:"Searching...",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",toast:{printerDeleted:"Printer deleted",printerAdded:"Printer added",printerUpdated:"Printer updated",failedToDelete:"Failed to delete printer",failedToAdd:"Failed to add printer",failedToUpdate:"Failed to update printer",commandSent:"Command sent",failedToSendCommand:"Failed to send command",turnedOn:"{{name}} turned on",failedToPowerOn:"Failed to power on {{name}}",scriptTriggered:"Script triggered",printStopped:"Print stopped",printPaused:"Print paused",printResumed:"Print resumed",referenceDeleted:"Reference deleted",detectionAreaSaved:"Detection area saved",failedToRunScript:"Failed to run script",failedToStopPrint:"Failed to stop print",failedToPausePrint:"Failed to pause print",failedToResumePrint:"Failed to resume print",failedToControlChamberLight:"Failed to control chamber light",failedToUpdateSetting:"Failed to update setting",failedToSkipObjects:"Failed to skip objects",failedToRereadRfid:"Failed to re-read RFID",failedToCheckPlate:"Failed to check plate",failedToUpdateLabel:"Failed to update label",failedToDeleteReference:"Failed to delete reference",failedToSaveDetectionArea:"Failed to save detection area",plateCheckEnabled:"Plate check enabled",plateCheckDisabled:"Plate check disabled",calibrationSaved:"Calibration saved!",calibrationFailed:"Calibration failed",rfidRereadInitiated:"RFID re-read initiated"},connection:{connected:"Connected",offline:"Offline"},queue:{inQueue:"{{count}} print in queue",inQueue_plural:"{{count}} prints in queue"},controls:"Controls",rfid:{reread:"Re-read RFID"},permission:{noAdd:"You do not have permission to add printers",noEdit:"You do not have permission to edit printers",noDelete:"You do not have permission to delete printers",noControl:"You do not have permission to control printers",noFiles:"You do not have permission to access printer files",noAmsRfid:"You do not have permission to re-read AMS RFID",noSmartPlugControl:"You do not have permission to control smart plugs"},modal:{addTitle:"Add Printer",editTitle:"Edit Printer",myPrinter:"My Printer",selectModel:"Select model...",locationGroup:"Location / Group (optional)",locationPlaceholder:"e.g., Workshop, Office, Basement",autoArchiveLabel:"Auto-archive completed prints",fromPrinterSettings:"From printer settings",modelOptional:"Model (optional)",saveChanges:"Save Changes"},skipObjects:{tooltip:"Skip objects",onlyWhilePrinting:"Skip objects (only while printing)",requiresMultiple:"Skip objects (requires 2+ objects)",title:"Skip Objects",matchIdsInfo:"Match IDs with your printer display",printerShowsIds:"The printer screen shows object IDs on the build plate",skipSelected:"Skip Selected",skipping:"Skipping...",noObjectsSelected:"No objects selected",selectObjectsToSkip:"Select objects you want to skip from the current print",skipped:"skipped",objectsSkipped:"Objects skipped",activeCount:"{{count}} active",waitForLayer:"Wait for layer 2+ to skip objects (currently layer {{layer}})",skip:"Skip"},confirm:{deleteTitle:"Delete Printer",deleteMessage:'Are you sure you want to delete "{{name}}"? This will remove all connection settings.',deleteArchivesNote:"All print history for this printer will be permanently deleted.",keepArchivesNote:"Print history will be kept but no longer associated with this printer.",stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print on "{{name}}"? This will cancel the print job.',stopButton:"Stop Print",pauseTitle:"Pause Print",pauseMessage:'Are you sure you want to pause the current print on "{{name}}"?',pauseButton:"Pause Print",resumeTitle:"Resume Print",resumeMessage:'Are you sure you want to resume the print on "{{name}}"?',resumeButton:"Resume Print",powerOnTitle:"Power On Printer",powerOnMessage:'Are you sure you want to turn ON the power for "{{name}}"?',powerOnButton:"Power On",powerOffTitle:"Power Off Printer",powerOffMessage:'Are you sure you want to turn OFF the power for "{{name}}"?',powerOffWarning:'WARNING: "{{name}}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.',powerOffButton:"Power Off"},discovery:{title:"Discover Printers",searching:"Searching...",scanning:"Scanning...",scanProgress:"Scanning... {{scanned}}/{{total}}",foundPrinters:"Found {{count}} printer(s)",noPrintersFound:"No printers found",noPrintersFoundSubnet:"No printers found in the specified subnet.",noPrintersFoundNetwork:"No printers found on the network.",allConfigured:"All discovered printers are already configured.",alreadyAdded:"Already added",select:"Select",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",subnetToScan:"Subnet to scan",dockerNote:"Docker detected. Enter your printer's subnet in CIDR notation. Requires network_mode: host in docker-compose.yml.",scanSubnet:"Scan Subnet for Printers",discoverNetwork:"Discover Printers on Network",scanningSubnet:"Scanning subnet for Bambu printers...",scanningNetwork:"Scanning network...",serialRequired:"Serial required",unknown:"Unknown",failedToStart:"Failed to start discovery"},filaments:"Filaments",openCameraOverlay:"Open camera overlay",openCameraWindow:"Open camera in new window",firmwareUpdateAvailable:"Firmware update available: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"You do not have permission to update printers",enabledClick:"Plate check enabled - Click to disable",disabledClick:"Plate check disabled - Click to enable",manageCalibration:"Manage plate detection calibration",calibrationRequired:"Calibration Required",calibrationInstructions:"Please ensure the build plate is completely empty, then click Calibrate.",calibrationDescription:"Calibration captures a reference image of the empty plate. Future checks will compare against this reference to detect objects.",calibrationTip:"Tip: You can store up to 5 calibrations for different plates. The system automatically uses the best match when checking.",plateEmpty:"Plate appears empty",objectsDetected:"Objects detected on plate",confidence:"Confidence",difference:"Difference",analysisPreview:"Analysis preview:",analysisLegend:"Green box = detection area, Red overlay = differences from calibration",savedReferences:"Saved References ({{count}}/{{max}})",deleteReference:"Delete reference",labelPlaceholder:"Label...",clickToEdit:"{{label}} - Click to edit",clickToAddLabel:"Click to add label"},fans:{partCooling:"Part Cooling Fan",auxiliary:"Auxiliary Fan",chamber:"Chamber Fan"},clickToViewHmsErrors:"Click to view HMS errors",estimatedCompletion:"Estimated completion time",slotOptions:"Slot options",firmwareModal:{title:"Firmware Update",currentVersion:"Current:",latestVersion:"Latest:",releaseNotes:"Release Notes",checkingPrereqs:"Checking prerequisites...",sdCardReady:"SD card ready. Click below to upload firmware.",uploadedSuccess:"Firmware uploaded to SD card!",applyInstructions:"To apply the update on your printer:",step1:"On the printer's touchscreen, go to Settings",step2:"Navigate to Firmware",step3:"Select Update from SD card",step4:"The update will take 10-20 minutes",done:"Done",starting:"Starting...",uploadFirmware:"Upload Firmware",uploadedToast:"Firmware uploaded! Trigger update from printer screen."},accessCodePlaceholder:"Leave empty to keep current",roi:{title:"Detection Area (ROI)",xStart:"X Start",yStart:"Y Start",width:"Width",height:"Height",instruction:"Adjust the detection area to focus on the build plate. The green box in the preview shows the current area."}},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",sortLargest:"Largest first",sortSmallest:"Smallest first",sortSize:"Size",noArchives:"No archives found",noArchivesSearch:"No archives match your search",noArchivesYet:"No archives yet",loadingArchives:"Loading archives...",releaseToUpload:"Release to upload",showAll:"Show all",showFavoritesOnly:"Show favorites only",gridView:"Grid view",listView:"List view",calendarView:"Calendar view",manageTags:"Manage Tags",showFailedPrints:"Show failed prints",hideFailedPrints:"Hide failed prints",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"},toast:{source3mfAttached:"Source 3MF attached: {{filename}}",failedUploadSource3mf:"Failed to upload source 3MF",source3mfRemoved:"Source 3MF removed",failedRemoveSource3mf:"Failed to remove source 3MF",f3dAttached:"F3D attached: {{filename}}",failedUploadF3d:"Failed to upload F3D",f3dRemoved:"F3D removed",failedRemoveF3d:"Failed to remove F3D",timelapseAttached:"Timelapse attached: {{filename}}",timelapseAlreadyAttached:"Timelapse already attached",noMatchingTimelapse:"No matching timelapse found",failedScanTimelapse:"Failed to scan for timelapse",failedAttachTimelapse:"Failed to attach timelapse",archiveDeleted:"Archive deleted",failedDeleteArchive:"Failed to delete archive",addedToFavorites:"Added to favorites",removedFromFavorites:"Removed from favorites",projectUpdated:"Project updated",failedUpdateProject:"Failed to update project",linkCopied:"Link copied to clipboard",failedCopyLink:"Failed to copy link",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo",failedDeleteArchives:"Failed to delete archives",failedUpdateFavorites:"Failed to update favorites",exportDownloaded:"Export downloaded",exportFailed:"Export failed"},menu:{print:"Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",slice:"Slice",externalLink:"External Link",viewOnMakerWorld:"View on MakerWorld",preview3d:"3D Preview",viewTimelapse:"View Timelapse",scanForTimelapse:"Scan for Timelapse",downloadSource3mf:"Download Source 3MF",uploadSource3mf:"Upload Source 3MF",replaceSource3mf:"Replace Source 3MF",removeSource3mf:"Remove Source 3MF",uploadF3d:"Upload F3D",replaceF3d:"Replace F3D",downloadF3d:"Download F3D",removeF3d:"Remove F3D",download:"Download",copyDownloadLink:"Copy Download Link",qrCode:"QR Code",viewPhotos:"View Photos",viewPhotosCount:"View Photos ({{count}})",projectPage:"Project Page",addToFavorites:"Add to Favorites",removeFromFavorites:"Remove from Favorites",edit:"Edit",goToProject:"Go to Project: {{name}}",addToProject:"Add to Project",removeFromProject:"Remove from Project",loading:"Loading...",noProjectsAvailable:"No projects available",select:"Select",deselect:"Deselect",delete:"Delete"},permission:{noReprint:"You do not have permission to reprint this archive",noAddToQueue:"You do not have permission to add to queue",noUpdateArchives:"You do not have permission to update archives",noUploadFiles:"You do not have permission to upload files",noDownload:"You do not have permission to download archives",noCopyLink:"You do not have permission to copy download links",noDelete:"You do not have permission to delete this archive",noCreate:"You do not have permission to create archives"},card:{previousPlate:"Previous plate",nextPlate:"Next plate",plateNumber:"Plate {{index}}",moreOptions:"Right-click for more options",addToFavorites:"Add to favorites",removeFromFavorites:"Remove from favorites",cancelled:"cancelled",failed:"failed",duplicate:"duplicate",duplicateTitle:"This model has been printed before",openSource3mf:"Open source 3MF in Bambu Studio (right-click for more options)",downloadF3d:"Download Fusion 360 design file",viewTimelapse:"View timelapse",viewPhoto:"View 1 photo",viewPhotos:"View {{count}} photos",openFolder:"Open folder: {{name}}",slicedFile:"Sliced file - ready to print",sourceFile:"Source file only - no AMS mapping available",gcode:"GCODE",source:"SOURCE",project:"Project: {{name}}",estimated:"Estimated: {{time}}",actual:"Actual: {{time}}",accuracy:"Accuracy: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} layer",layers:"{{count}} layers",object:"{{count}} object",objects:"{{count}} objects",slicedFor:"Sliced for {{model}}",uploadedBy:"Uploaded By",noPermissionReprint:"You do not have permission to reprint",noPermissionEdit:"You do not have permission to edit archives",noPermissionDelete:"You do not have permission to delete archives",reprint:"Reprint",schedulePrint:"Schedule Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",openInBambuStudioToSlice:"Open in Bambu Studio to slice",slice:"Slice",externalLink:"External Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"View project",noExternalLink:"No external link",preview3d:"3D Preview",download:"Download",edit:"Edit",delete:"Delete"},modal:{deleteArchive:"Delete Archive",deleteConfirm:'Are you sure you want to delete "{{name}}"? This action cannot be undone.',deleteButton:"Delete",removeSource3mf:"Remove Source 3MF",removeSource3mfConfirm:'Are you sure you want to remove the source 3MF file from "{{name}}"? This will delete the original slicer project file.',removeButton:"Remove",removeF3d:"Remove F3D",removeF3dConfirm:'Are you sure you want to remove the Fusion 360 design file from "{{name}}"?',timelapse:"{{name}} - Timelapse",selectTimelapse:"Select Timelapse",selectTimelapseDesc:"No auto-match found. Select the timelapse for this print:",deleteArchives:"Delete Archives",deleteArchivesConfirm:"Are you sure you want to delete {{count}} archive(s)? This action cannot be undone.",deleteCount:"Delete {{count}}"},page:{title:"Archives",printsCount:"{{filtered}} of {{total}} prints",dropFilesHere:"Drop .3mf files here",releaseToUpload:"Release to upload",only3mfSupported:"Only .3mf files are supported",close:"Close",selected:"{{count}} selected",selectAll:"Select All",tags:"Tags",project:"Project",favorite:"Favorite",delete:"Delete",toggledFavorites:"Toggled favorites for {{count}} archive(s)",failedUpdateFavorites:"Failed to update favorites",archivesDeleted:"{{count}} archive(s) deleted",failedDeleteArchives:"Failed to delete archives",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo"},list:{name:"Name",printer:"Printer",date:"Date",size:"Size",actions:"Actions",hasTimelapse:"Has timelapse"}},queue:{title:"Print Queue",subtitle:"Schedule and manage your print jobs",addToQueue:"Add to Queue",print:"Print",reprint:"Re-print",schedulePrint:"Schedule Print",editQueueItem:"Edit Queue Item",printToPrinters:"Print to {{count}} Printers",queueToPrinters:"Queue to {{count}} Printers",sending:"Sending...",sendingProgress:"Sending {{current}}/{{total}}...",adding:"Adding...",addingProgress:"Adding {{current}}/{{total}}...",savingProgress:"Saving {{current}}/{{total}}...",clearQueue:"Clear Queue",clearHistory:"Clear History",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",startNow:"Start Now",printingInProgress:"Printing in progress...",viewArchive:"View archive",viewInFileManager:"View in File Manager",itemCount:"{{count}} item",itemCount_plural:"{{count}} items",dragToReorder:"Drag to reorder (ASAP only)",reorderHint:"Position only affects ASAP items. Scheduled items run at their set time.",addedBy:"Added by {{name}}",sections:{currentlyPrinting:"Currently Printing",queued:"Queued",history:"History"},status:{pending:"Pending",waiting:"Waiting",printing:"Printing",paused:"Paused",completed:"Completed",failed:"Failed",skipped:"Skipped",cancelled:"Cancelled"},summary:{printing:"Printing",queued:"Queued",totalTime:"Total Queue Time",history:"History"},filter:{allPrinters:"All Printers",unassigned:"Unassigned",allStatus:"All Status",allLocations:"All Locations",any:"Any"},sort:{byPosition:"Sort by Position",byName:"Sort by Name",byPrinter:"Sort by Printer",bySchedule:"Sort by Schedule",byDate:"Sort by Date",ascendingOldest:"Ascending (oldest first)",descendingNewest:"Descending (newest first)"},badges:{staged:"Staged",requiresPrevious:"Requires previous success",autoPowerOff:"Auto power off"},empty:{title:"No prints scheduled",description:'Schedule a print from the Archives page using the "Schedule" option in the context menu, or drag and drop files to get started.'},time:{asap:"ASAP",overdue:"Overdue",now:"Now",lessThanMinute:"In less than a minute",inMinutes:"In {{count}} min",inHours:"In {{count}} hours"},actions:{stopPrint:"Stop Print",startPrint:"Start Print",requeue:"Re-queue"},bulkEdit:{title:"Edit {{count}} Item",title_plural:"Edit {{count}} Items",description:"Only changed settings will be applied to selected items.",printer:"Printer",noChange:"— No change —",queueOptions:"Queue Options",staged:"Staged (manual start)",autoPowerOff:"Auto power off after print",requirePrevious:"Require previous success",printOptions:"Print Options",bedLevelling:"Bed levelling",flowCalibration:"Flow calibration",vibrationCalibration:"Vibration calibration",layerInspection:"First layer inspection",timelapse:"Timelapse",useAms:"Use AMS",applyChanges:"Apply Changes",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",editSelected:"Edit Selected",cancelSelected:"Cancel Selected"},confirm:{cancelTitle:"Cancel Scheduled Print",cancelMessage:'Are you sure you want to cancel "{{name}}"?',stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print "{{name}}"? This will cancel the print job on the printer.',removeTitle:"Remove from History",removeMessage:'Are you sure you want to remove "{{name}}" from the queue history?',clearHistoryTitle:"Clear History",clearHistoryMessage:"Are you sure you want to remove all {{count}} item(s) from the history?",cancelButton:"Cancel Print",stopButton:"Stop Print",thisPrint:"this print",thisItem:"this item"},toast:{cancelled:"Queue item cancelled",cancelFailed:"Failed to cancel item",removed:"Queue item removed",removeFailed:"Failed to remove item",stopped:"Print stopped",stopFailed:"Failed to stop print",released:"Print released to queue",startFailed:"Failed to start print",reorderFailed:"Failed to reorder queue",historyCleared:"Cleared {{count}} history item(s)",clearHistoryFailed:"Failed to clear history",updateFailed:"Failed to update items",bulkCancelled:"Cancelled {{count}} item(s)",bulkCancelFailed:"Failed to cancel items"},permissions:{noStopPrint:"You do not have permission to stop prints",noStartPrint:"You do not have permission to start prints",noEdit:"You do not have permission to edit this queue item",noCancel:"You do not have permission to cancel this queue item",noRequeue:"You do not have permission to re-queue items",noRemove:"You do not have permission to remove this queue item",noClearHistory:"You do not have permission to clear all history",noEditItems:"You do not have permission to edit queue items",noCancelItems:"You do not have permission to cancel queue items"}},stats:{title:"Dashboard",subtitle:"Drag widgets to rearrange. Click the eye icon to hide.",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",printTime:"Print Time",totalFilament:"Total Filament Used",filamentUsed:"Filament Used",filamentCost:"Filament Cost",totalCost:"Total Cost",energyUsed:"Energy Used",energyCost:"Energy Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",printsByPrinter:"Prints by Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time",quickStats:"Quick Stats",printActivity:"Print Activity",filamentTypes:"Filament Types",filamentTrends:"Filament Trends",failureAnalysis:"Failure Analysis",timeAccuracy:"Time Accuracy",successful:"Successful:",failed:"Failed:",perfectEstimate:"100% = perfect estimate",noTimeAccuracyData:"No time accuracy data yet",noFilamentData:"No filament data available",noPrinterData:"No printer data available",noPrintData:"No print data available",noPrintDataLast30Days:"No print data in the last 30 days",failureReasons:"Failure Reasons",topFailureReasons:"Top Failure Reasons",failedPrintsCount:"{{failed}} / {{total}} prints failed",lastWeekRate:"Last week: {{rate}}%",resetLayout:"Reset Layout",recalculateCosts:"Recalculate Costs",recalculateCostsHint:"Recalculate all archive costs using current filament prices",exportStats:"Export Stats",exportAsCsv:"Export as CSV",exportAsExcel:"Export as Excel",hiddenCount:"{{count}} Hidden",exportDownloaded:"Export downloaded",exportFailed:"Export failed",layoutReset:"Layout reset",recalculatedCosts:"Recalculated costs for {{count}} archives",recalculateFailed:"Failed to recalculate costs",loadingStats:"Loading statistics...",noPermissionResetLayout:"You do not have permission to reset layout",noPermissionRecalculate:"You do not have permission to recalculate costs"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",statusTab:"Status",settingsTab:"Settings",overdueCount:"{{count}} overdue",dueSoonCount:"{{count}} due soon",dueSoon:"Due soon",allGood:"All good",overdueBy:"Overdue by {{duration}}",dueIn:"Due in {{duration}}",timeLeft:"{{duration}} left",day:"1 day",days:"{{count}} days",week:"1 week",weeks:"{{count}} weeks",month:"1 month",months:"{{count}} months",year:"1 year",maintenanceTypes:"Maintenance Types",maintenanceTypesDescription:"System types and your custom maintenance tasks",addCustomType:"Add Custom Type",intervalType:"Interval Type",intervalValue:"Interval ({{type}})",icon:"Icon",documentationLink:"Documentation Link (optional)",assignToPrinters:"Assign to Printers",selectAtLeastOnePrinter:"Select at least one printer",addType:"Add Type",custom:"Custom",printHours:"Print Hours",calendarDays:"Calendar Days",exampleName:"e.g., Replace HEPA Filter",viewDocumentation:"View documentation",timeBasedInterval:"Time-based interval",intervalOverrides:"Interval Overrides",intervalOverridesDescription:"Customize intervals for specific printers",assignedToPrinters:"Assigned to printers:",noPrintersAssigned:"No printers assigned",addPrinterShort:"Add:",printersAssignedClick:"{{count}} printer(s) assigned - click to manage",removeFromPrinter:"Remove from this printer",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection",cleanCarbonRods:"Clean Carbon Rods",checkPtfeTube:"Check PTFE Tube",replaceHepaFilter:"Replace HEPA Filter",replaceCarbonFilter:"Replace Carbon Filter",lubricateLeftNozzleRail:"Lubricate Left Nozzle Rail"},maintenanceComplete:"Maintenance marked as complete",typeUpdated:"Maintenance type updated",typeDeleted:"Maintenance type deleted",printHoursUpdated:"Print hours updated",printerAssigned:"Printer assigned",printerRemoved:"Printer removed",deleteTypeConfirm:'Delete "{{name}}"?',noPermissionUpdate:"You do not have permission to update maintenance items",noPermissionPerform:"You do not have permission to perform maintenance",noPermissionEditTypes:"You do not have permission to edit maintenance types",noPermissionDeleteTypes:"You do not have permission to delete maintenance types",noPermissionEditHours:"You do not have permission to edit print hours",noPermissionRemovePrinter:"You do not have permission to remove printer assignments",noPermissionAssignPrinter:"You do not have permission to assign printers",noPermissionEditIntervals:"You do not have permission to edit intervals",configureSettings:"Configure maintenance types and intervals"},settings:{title:"Settings",general:"General",tabs:{general:"General",smartPlugs:"Smart Plugs",notifications:"Notifications",filament:"Filament",network:"Network",apiKeys:"API Keys",virtualPrinter:"Virtual Printer",users:"Users",backup:"Backup",globalEmail:"Global Email"},email:{smtpSettings:"SMTP Configuration",smtpHost:"SMTP Server",smtpPort:"SMTP Port",security:"Security",authentication:"Authentication",username:"Username",password:"Password",fromEmail:"From Email",fromName:"From Name",testConnection:"Test SMTP Connection",testRecipient:"Test Recipient Email",sendTest:"Send Test Email",sending:"Sending...",save:"Save Settings",saving:"Saving...",advancedAuth:"Advanced Authentication",advancedAuthEnabled:"Advanced Authentication is enabled",advancedAuthEnabledDesc:"Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature.",advancedAuthDisabled:"Advanced Authentication is disabled",advancedAuthDisabledDesc:"Enable advanced authentication to activate email-based features for user management.",enable:"Enable",disable:"Disable",feature1:"Passwords are auto-generated and emailed to new users",feature2:"Users can login with username or email",feature3:"Forgot password feature is available",feature4:"Admins can reset user passwords via email"},appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected",noDefaultPrinter:"No default (ask each time)",sidebarOrder:"Sidebar order",saveThumbnails:"Save thumbnails",captureFinishPhoto:"Capture finish photo",noPrintersConfigured:"No printers configured",archiveMode:{always:"Always create archive entry",never:"Never create archive entry",ask:"Ask each time"},checkForUpdatesLabel:"Check for updates",checkPrinterFirmware:"Check printer firmware",enableRetry:"Enable retry",homeAssistantDescription:"Control smart plugs via Home Assistant",mqttConnectedTo:"Connected to",prometheusDescription:"Expose printer data in Prometheus format",noSmartPlugsTitle:"No smart plugs configured",noSmartPlugsDescription:"Add a Tasmota-based smart plug to track energy usage and automate power control.",noProvidersTitle:"No providers configured",noProvidersDescription:"Add a provider to receive alerts.",noTemplatesAvailable:"No templates available. Restart the backend to seed default templates.",apiPermissionView:"View printer status and queue",apiPermissionEdit:"Add and remove items from print queue",apiKeysEmptyTitle:"No API keys",apiKeysEmptyDescription:"Create an API key to integrate with external services.",noUsersFound:"No users found",noGroupsFound:"No groups found",noGroupsAvailable:"No groups available",passwordsDoNotMatch:"Passwords do not match",systemGroupWarning:"System group names cannot be changed",authDisabledTitle:"Authentication is Disabled",authDisabledFeature1:"Require login to access the system",authDisabledFeature2:"Create multiple users with group-based permissions",authDisabledFeature3:"Control access with 50+ granular permissions",userHasCreated:"This user has created:",userItemsQuestion:"What would you like to do with these items?",deleteUserConfirm:"Are you sure you want to delete this user?",actionCannotBeUndone:"This action cannot be undone.",addFirstSmartPlug:"Add Your First Smart Plug",providers:"Providers",log:"Log",testAll:"Test All",testResults:"Test Results",testPassedCount:"{{count}} passed",testFailedCount:"{{count}} failed",messageTemplates:"Message Templates",messageTemplatesDescription:"Customize notification messages for each event.",apiKeys:"API Keys",apiKeysDescription:"Create API keys for external integrations and webhooks.",createKey:"Create Key",apiKeyCreated:"API Key Created Successfully",apiKeyCopyWarning:"Copy this key now - it won't be shown again!",useInApiBrowser:"Use in API Browser",createNewApiKey:"Create New API Key",keyName:"Key Name",keyNamePlaceholder:"e.g., Home Assistant, OctoPrint",readStatus:"Read Status",readStatusDescription:"View printer status and queue",manageQueue:"Manage Queue",manageQueueDescription:"Add and remove items from print queue",controlPrinter:"Control Printer",controlPrinterDescription:"Pause, resume, and stop prints",unnamedKey:"Unnamed Key",lastUsed:"Last used",read:"Read",control:"Control",createFirstKey:"Create Your First Key",webhookEndpoints:"Webhook Endpoints",webhookApiKeyHint:"Use your API key in the X-API-Key header.",webhook:{getAllStatus:"Get all printer status",getSpecificStatus:"Get specific printer status",addToQueue:"Add to print queue",pausePrint:"Pause print",resumePrint:"Resume print",stopPrint:"Stop print"},apiBrowser:"API Browser",apiBrowserDescription:"Explore and test all available API endpoints.",apiKeyForTesting:"API Key for Testing",apiKeyPlaceholder:"Paste your API key here to test authenticated endpoints...",apiKeyHint:"This key will be sent as X-API-Key header with requests.",deleteApiKeyTitle:"Delete API Key",deleteApiKeyMessage:"Are you sure you want to delete this API key? Any integrations using this key will stop working.",deleteKey:"Delete Key",amsDisplayThresholds:"AMS Display Thresholds",amsThresholdsDescription:"Configure color thresholds for AMS humidity and temperature indicators.",humidity:"Humidity",goodGreen:"Good (green)",fairOrange:"Fair (orange)",aboveFairBad:"Above fair threshold shows as red (bad)",temperature:"Temperature",goodBlue:"Good (blue)",aboveFairHot:"Above fair threshold shows as red (hot)",historyRetention:"History Retention",keepSensorHistory:"Keep sensor history for",historyRetentionDescription:"Older humidity and temperature data will be automatically deleted",printModal:"Print Modal",expandCustomMapping:"Expand custom mapping by default",expandCustomMappingDescription:"When printing to multiple printers, show per-printer AMS mapping expanded",authentication:"Authentication",authEnabledDescription:"Your instance is secured with user authentication",authDisabledDescription:"Enable to require login and manage user access",authDisabledMessage:"Enable authentication to create user accounts, manage permissions, and secure your Bambuddy instance.",enableAuthentication:"Enable Authentication",currentUser:"Current User",changePassword:"Change Password",admin:"Admin",users:"Users",addUser:"Add User",groups:"Groups",addGroup:"Add Group",system:"System",noDescription:"No description",userCount:"{{count}} users",permissionCount:"{{count}} permissions",createUser:"Create User",username:"Username",enterUsername:"Enter username",password:"Password",enterPassword:"Enter password (min 6 characters)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",viewReleaseOnGitHub:"View release on GitHub",turnAllPlugsOn:"Turn all plugs on",turnAllPlugsOff:"Turn all plugs off",clearNotificationLogs:"Clear Notification Logs",clearLogsMessage:"This will permanently delete all notification logs older than 30 days. This action cannot be undone.",clearLogs:"Clear Logs",resetUiPreferences:"Reset UI Preferences",resetUiPreferencesMessage:"This will reset all UI preferences to defaults: sidebar order, theme, dashboard layout, view modes, and sorting preferences. Your printers, archives, and server settings will NOT be affected. The page will reload after clearing.",resetPreferences:"Reset Preferences",deleteGroupTitle:"Delete Group",deleteGroupMessage:"Are you sure you want to delete this group? Users in this group will lose these permissions.",deleteGroup:"Delete Group",disableAuthenticationTitle:"Disable Authentication",disableAuthenticationMessage:"Are you sure you want to disable authentication? This will make your Bambuddy instance accessible without login. All users will remain in the database but authentication will be disabled.",disableAuthentication:"Disable Authentication",configureBambuddy:"Configure Bambuddy",systemDefault:"System Default",archiveSettings:"Archive Settings",newWindow:"New Window",embeddedOverlay:"Embedded Overlay",externalCameras:"External Cameras",costTracking:"Cost Tracking",printsOnly:"Prints Only",totalConsumption:"Total Consumption",dataManagement:"Data Management",clearNotificationLogsDescription:"Delete notification logs older than 30 days",resetUiPreferencesDescription:"Reset sidebar order, theme, view modes, and layout preferences. Printers, archives, and settings are not affected.",enableHomeAssistant:"Enable Home Assistant",enableMqtt:"Enable MQTT",useTls:"Use TLS",enableMetricsEndpoint:"Enable Metrics Endpoint",availableMetrics:"Available Metrics",editUser:"Edit User",deleteUserTitle:"Delete User",groupName:"Group Name",leaveEmptyForAnonymous:"Leave empty for anonymous",leaveEmptyForNoAuth:"Leave empty for no authentication",enterNewPassword:"Enter new password",confirmNewPassword:"Confirm new password",enterGroupName:"Enter group name",enterDescriptionOptional:"Enter description (optional)",enterCurrentPassword:"Enter current password",enterNewPasswordMin6:"Enter new password (min 6 characters)",toast:{keyCopied:"Key copied to clipboard",copyFailed:"Failed to copy key",keyAddedToBrowser:"Key added to API Browser",clearLogsFailed:"Failed to clear logs",uiPreferencesReset:"UI preferences reset. Refreshing...",authDisabled:"Authentication disabled successfully",authDisableFailed:"Failed to disable authentication",apiKeyCreated:"API key created",apiKeyDeleted:"API key deleted",userCreated:"User created successfully",userUpdated:"User updated successfully",userDeleted:"User deleted successfully",groupCreated:"Group created successfully",groupUpdated:"Group updated successfully",groupDeleted:"Group deleted successfully",fillRequiredFields:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",enterGroupName:"Please enter a group name",settingsSaved:"Settings saved",cameraSettingsSaved:"Camera settings saved",enterCameraUrl:"Please enter a camera URL",passwordChanged:"Password changed successfully",connectionFailed:"Connection failed",testFailed:"Test failed",cameraConnected:"Camera connected{{resolution}}"},testConnection:"Test Connection"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},hmsErrors:{title:"Errors - {{name}}",noErrors:"No errors",viewOnWiki:"View on Bambu Lab Wiki",clearInstructions:"Clear errors on the printer to dismiss them here."},mqttDebug:{title:"MQTT Debug Log",searchPlaceholder:"Search topic or payload...",noMessages:"No messages logged yet",startLoggingHint:'Click "Start Logging" to begin capturing MQTT messages',noMessagesMatch:"No messages match your filter",adjustFilterHint:"Try adjusting your search or filter criteria",incoming:"Incoming",outgoing:"Outgoing",loggingStopped:"Logging stopped",loggingActive:"Logging active - messages will auto-refresh",startLogging:"Start Logging",stopLogging:"Stop Logging",clearLog:"Clear Log",topic:"Topic",timestamp:"Timestamp",direction:"Direction",all:"All"},printerFiles:{title:"File Manager",storageUsed:"Used:",storageFree:"Free:",filterPlaceholder:"Filter files...",deleteButton:"Delete",deleteFiles:"Delete {{count}} Files",deleteFileConfirm:'Delete "{{name}}"? This cannot be undone.',deleteFilesConfirm:"Delete {{count}} selected files? This cannot be undone.",noFiles:"No files on printer",loadingFiles:"Loading files...",failedToLoad:"Failed to load files",toast:{filesDeleted:"Deleted {{count}} file(s)",deleteFailed:"Delete failed: {{error}}"}},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"},login:{title:"Bambuddy Login",subtitle:"Sign in to your account",username:"Username",usernamePlaceholder:"Enter your username",usernameOrEmail:"Username or Email",usernameOrEmailPlaceholder:"Username or @ Email",password:"Password",passwordPlaceholder:"Enter your password",signIn:"Sign in",signingIn:"Logging in...",forgotPassword:"Forgot your password?",loginSuccess:"Logged in successfully",loginFailed:"Login failed",enterCredentials:"Please enter username and password",forgotPasswordTitle:"Forgot Password",forgotPasswordMessage:"If you've forgotten your password, please contact your system administrator to reset it.",forgotPasswordEmailMessage:"Enter your email address and we'll send you a new password.",emailAddress:"Email Address",emailPlaceholder:"your.email@example.com",cancel:"Cancel",sending:"Sending...",sendResetEmail:"Send Reset Email",howToReset:"How to reset your password:",resetStep1:"Contact your Bambuddy administrator",resetStep2:"Ask them to reset your password in User Management",resetStep3:"They can set a new temporary password for you",resetStep4:"Log in with the new password and change it in Settings",gotIt:"Got it"},setup:{title:"Bambuddy Setup",subtitle:"Configure authentication for your Bambuddy instance",enableAuth:"Enable Authentication",adminAccount:"Admin Account",adminAccountDesc:"If admin users already exist, authentication will be enabled using the existing admin accounts. Leave the fields below empty to use existing admins, or enter new credentials to create a new admin user.",adminUsername:"Admin Username",adminPassword:"Admin Password",optionalIfAdminExists:"(optional if admin users exist)",adminUsernamePlaceholder:"Enter admin username (optional)",adminPasswordPlaceholder:"Enter admin password (optional)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm admin password",settingUp:"Setting up...",completeSetup:"Complete Setup",toast:{authEnabledAdminCreated:"Authentication enabled and admin user created",authEnabledExistingAdmins:"Authentication enabled using existing admin users",setupCompleted:"Setup completed",enterBothCredentials:"Please enter both admin username and password, or leave both empty to use existing admin users",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"}},changePassword:{title:"Change Password",currentPassword:"Current Password",currentPasswordPlaceholder:"Enter current password",newPassword:"New Password",newPasswordPlaceholder:"Enter new password (min 6 characters)",confirmPassword:"Confirm New Password",confirmPasswordPlaceholder:"Confirm new password",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",changing:"Changing...",success:"Password changed successfully",failed:"Failed to change password"},plateAlert:{title:"Print Paused!",message:"Objects detected on build plate. The print has been automatically paused. Please clear the plate and resume the print.",understand:"I Understand"},camera:{title:"Camera View",invalidPrinterId:"Invalid printer ID",live:"Live",snapshot:"Snapshot",restartStream:"Restart stream",refreshSnapshot:"Refresh snapshot",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",connectingToCamera:"Connecting to camera...",capturingSnapshot:"Capturing snapshot...",connectionLost:"Connection lost",connectionFailed:"Camera connection failed",reconnecting:"Reconnecting in {{countdown}}s... (attempt {{attempt}}/{{max}})",reconnectNow:"Reconnect now",cameraUnavailable:"Camera unavailable",cameraUnavailableDesc:"Make sure the printer is powered on and connected.",noCamera:"No camera available",retry:"Retry",cameraStream:"Camera stream",zoomOut:"Zoom out",zoomIn:"Zoom in",resetZoom:"Reset zoom",recording:"Recording",startRecording:"Start Recording",stopRecording:"Stop Recording"},groups:{title:"Group Management",subtitle:"Manage permission groups for access control",backToSettings:"Back to Settings",createGroup:"Create Group",noPermission:"You do not have permission to access this page.",system:"System",noDescription:"No description",usersCount:"{{count}} users",permissionsCount:"{{count}} permissions",edit:"Edit",delete:"Delete",toast:{created:"Group created successfully",updated:"Group updated successfully",deleted:"Group deleted successfully",enterGroupName:"Please enter a group name"},modal:{editGroup:"Edit Group",createGroup:"Create Group",cancel:"Cancel",saving:"Saving...",creating:"Creating...",saveChanges:"Save Changes"},form:{groupName:"Group Name",groupNamePlaceholder:"Enter group name",systemGroupWarning:"System group names cannot be changed",description:"Description",descriptionPlaceholder:"Enter description (optional)",permissions:"Permissions ({{count}} selected)"},deleteModal:{title:"Delete Group",message:"Are you sure you want to delete this group? Users in this group will lose these permissions.",confirm:"Delete Group"}},users:{title:"User Management",subtitle:"Manage users and their access to your Bambuddy instance",backToSettings:"Back to Settings",createUser:"Create User",noPermission:"You do not have permission to access this page.",admin:"Admin",noGroups:"No groups",active:"Active",inactive:"Inactive",edit:"Edit",delete:"Delete",system:"System",noGroupsAvailable:"No groups available",table:{username:"Username",groups:"Groups",status:"Status",actions:"Actions"},toast:{created:"User created successfully",updated:"User updated successfully",deleted:"User deleted successfully",fillRequired:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"},modal:{createUser:"Create User",editUser:"Edit User",cancel:"Cancel",creating:"Creating...",saving:"Saving...",saveChanges:"Save Changes",advancedAuthSubtitle:"with Advanced Authentication"},form:{username:"Username",usernamePlaceholder:"Enter username",email:"Email",emailPlaceholder:"user@example.com",password:"Password",passwordPlaceholder:"Enter password",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",newPasswordPlaceholder:"Enter new password",confirmNewPasswordPlaceholder:"Confirm new password",leaveBlankToKeep:"leave blank to keep current",groups:"Groups",optional:"optional",autoGeneratedPassword:"A secure password will be automatically generated and emailed to the user.",passwordManagedByAdvancedAuth:'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.'},deleteModal:{title:"Delete User",message:"Are you sure you want to delete this user? This action cannot be undone.",confirm:"Delete User"}},streamOverlay:{title:"Stream Overlay",invalidPrinterId:"Invalid printer ID",cameraStream:"Camera stream",progress:"Progress",eta:"ETA",tomorrow:"Tomorrow",printerIdle:"Printer is idle",printerOffline:"Printer offline",status:{printing:"Printing",paused:"Paused",finished:"Finished",failed:"Failed",idle:"Idle",unknown:"Unknown"}},profiles:{title:"Profiles",subtitle:"Manage your slicer presets and pressure advance calibrations",tabs:{cloud:"Cloud Profiles",kprofiles:"K-Profiles"},connectedAs:"Connected as",logout:"Logout",noLogoutPermission:"You do not have permission to logout",failedToLoad:"Failed to load profiles",retry:"Retry",time:{justNow:"Just now",minsAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},toast:{loggedOut:"Logged out"},login:{title:"Connect to Bambu Cloud",subtitle:"Sync your slicer presets across devices",email:"Email",password:"Password",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Verification Code",totpCode:"Authenticator Code",checkEmail:"Check your email ({{email}}) for a 6-digit code",enterTotpHint:"Enter the 6-digit code from your authenticator app",accessToken:"Access Token",accessTokenHint:"Paste your Bambu Lab access token (from Bambu Studio)",back:"Back",loginButton:"Login",verifyButton:"Verify",setTokenButton:"Set Token",useToken:"Use access token instead",useEmail:"Login with email instead",toast:{loggedIn:"Logged in successfully",codeSent:"Verification code sent to your email",enterTotp:"Enter code from your authenticator app",tokenSet:"Token set successfully"}},presets:{myPreset:"My preset (editable)",duplicate:"Duplicate",editable:"Editable",failedToLoadDetails:"Failed to load preset details",deleteConfirm:"Delete this preset?",deleteWarning:'This will permanently delete "{{name}}" from Bambu Cloud. This cannot be undone.',noDuplicatePermission:"You do not have permission to duplicate presets",noEditPermission:"You do not have permission to edit presets",noDeletePermission:"You do not have permission to delete presets",types:{filament:"Filament preset",printer:"Printer preset",process:"Process preset"},toast:{deleted:"Preset deleted",created:"Preset created",updated:"Preset updated",duplicated:"Preset duplicated",fieldAdded:'Field "{{key}}" added',exported:"Preset exported"},baseLabel:"Base: {{name}}",currentLabel:"Current: {{name}}",newPreset:"New Preset",editPreset:"Edit Preset",duplicatePreset:"Duplicate Preset",createNewPreset:"Create New Preset",customizeSettings:"Customize settings for your new preset",compareWithBase:"Compare with base preset",compare:"Compare",basePreset:"Base Preset",selectBasePreset:"Select base preset...",presetName:"Preset Name",myCustomPreset:"My custom preset",inheritsFrom:"Inherits from",dropJsonToImport:"Drop JSON to import",tabs:{common:"Common",allFields:"All Fields"},availableFields:"Available Fields",searchFieldsPlaceholder:"Search fields...",noMatchingFields:"No matching fields",allFieldsAdded:"All fields added",addCustomField:"Add custom field",yourOverrides:"Your Overrides",noOverridesYet:"No overrides yet",clickFieldsToAdd:"Click fields on the left to add them",saveAsTemplate:"Save as template",jsonTip:"Tip: Drag & drop a .json file anywhere on this modal to import settings"},cloudView:{searchPlaceholder:"Search presets...",templates:"Templates",refresh:"Refresh",newPreset:"New Preset",clearFilters:"Clear filters",compareMode:"Compare Mode",selectAnotherPreset:"Select another {{type}} preset",clickTwoPresets:"Click two presets of the same type to compare",selectFirst:"1. Select first",selectSecond:"2. Select second",compareNow:"Compare Now",lastSynced:"Last synced:",showingCount:"Showing {{showing}} of {{total}} presets",noPresetsFound:"No presets found",columns:{filament:"Filament",process:"Process",printer:"Printer"},noFilamentPresets:"No filament presets",noProcessPresets:"No process presets",noPrinterPresets:"No printer presets",filters:{type:"Type",owner:"Owner",printer:"Printer",nozzle:"Nozzle",filament:"Filament",layer:"Layer",all:"All",myPresets:"My Presets",builtIn:"Built-in",process:"Process"},noTemplatesPermission:"You do not have permission to manage templates",noRefreshPermission:"You do not have permission to refresh profiles",noCreatePermission:"You do not have permission to create presets"},templates:{title:"Quick Templates",noTemplates:"No templates yet",createFirst:"Create templates from the preset editor",typeFilter:"Type:",deleteTitle:"Delete Template",deleteWarning:"This action cannot be undone",deleteConfirm:'Are you sure you want to delete "{{name}}"?',namePlaceholder:"Template name",descriptionPlaceholder:"Description",settingsJson:"Settings (JSON)",fieldsCount:"{{count}} fields",shownInModals:"Shown in modals",hiddenInModals:"Hidden in modals",apply:"Apply",toast:{deleted:"Template deleted",updated:"Template updated",created:"Template created",applied:"Template applied"}}},support:{debugLoggingActive:"Debug logging is active",manageLogs:"Manage"},fileManager:{title:"File Manager",subtitle:"Organize and manage your print files",uploadFiles:"Upload Files",newFolder:"New Folder",folderName:"Folder Name",folderNamePlaceholder:"e.g., Functional Parts",renameFile:"Rename File",renameFolder:"Rename Folder",moveFiles:"Move {{count}} File(s)",rootNoFolder:"Root (No Folder)",current:"current",linkFolder:"Link Folder",linkFolderDescription:'Link "{{name}}" to a project or archive for quick access.',project:"Project",archive:"Archive",noProjectsFound:"No projects found",noArchivesFound:"No archives found",unlink:"Unlink",link:"Link",dragDropFiles:"Drag & drop files here",dropFilesHere:"Drop files here",orClickToBrowse:"or click to browse",allFileTypesSupported:"All file types supported. ZIP files will be extracted.",zipFilesDetected:"ZIP files detected",zipExtractOptions:"ZIP files will be extracted. Choose how to handle folder structure:",preserveZipStructure:"Preserve folder structure from ZIP",createFolderFromZip:"Create folder from ZIP filename",stlThumbnailGeneration:"STL thumbnail generation",zipMayContainStl:"ZIP files may contain STL files. Thumbnails can be generated during extraction.",thumbnailsCanBeGenerated:"Thumbnails can be generated for STL files. Large models may take longer to process.",generateThumbnailsForStl:"Generate thumbnails for STL files",threemfDetected:"3MF files detected",threemfExtractionInfo:"Printer model, material, color, and print settings will be automatically extracted from 3MF files.",willBeExtracted:"Will be extracted",filesExtracted:"{{count}} files extracted",uploadComplete:"Upload complete: {{succeeded}} succeeded",uploadFailed:"{{count}} failed",uploading:"Uploading...",changeLink:"Change Link...",linkTo:"Link to...",linkToProjectOrArchive:"Link to project or archive",addToQueue:"Add to Queue",schedulePrint:"Schedule",generateThumbnail:"Generate Thumbnail",generateThumbnails:"Generate Thumbnails",generateThumbnailsForMissing:"Generate thumbnails for STL files missing them",gridView:"Grid view",listView:"List view",lowDiskSpaceWarning:"Low disk space warning",lowDiskSpaceDetails:"Only {{free}} free of {{total}} total. Threshold is set to {{threshold}} GB in settings.",files:"Files",folders:"Folders",size:"Size",free:"Free",allFiles:"All Files",wrap:"Wrap",enableTextWrapping:"Enable text wrapping",disableTextWrapping:"Disable text wrapping",dragToResizeTooltip:"Drag to resize, double-click to reset",searchFiles:"Search files...",allTypes:"All types",prints:"Prints",ascending:"Ascending",descending:"Descending",resultsCount:"{{showing}} of {{total}} files",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",adding:"Adding...",loadingFiles:"Loading files...",folderIsEmpty:"Folder is empty",noFilesYet:"No files yet",folderEmptyDescription:"Upload files or move files into this folder to get started.",noFilesDescription:"Upload files to start organizing your print-related files.",noMatchingFiles:"No matching files",noMatchingFilesDescription:"No files match your current search or filter criteria.",clearFilters:"Clear filters",printedCount:"Printed {{count}}x",uploadedBy:"Uploaded By",deleteFolder:"Delete Folder",deleteFile:"Delete File",deleteFilesCount:"Delete {{count}} Files",deleteFolderConfirm:"Are you sure you want to delete this folder? All files inside will also be deleted.",deleteFileConfirm:"Are you sure you want to delete this file?",deleteFilesConfirm:"Are you sure you want to delete {{count}} selected files? This action cannot be undone.",deleting:"Deleting...",noPermissionRenameFolder:"You do not have permission to rename folders",noPermissionLinkFolder:"You do not have permission to link folders",noPermissionDeleteFolder:"You do not have permission to delete folders",noPermissionPrint:"You do not have permission to print",noPermissionAddToQueue:"You do not have permission to add to queue",noPermissionDownload:"You do not have permission to download files",noPermissionRenameFile:"You do not have permission to rename this file",noPermissionGenerateThumbnail:"You do not have permission to generate thumbnails",noPermissionDeleteFile:"You do not have permission to delete this file",noPermissionCreateFolder:"You do not have permission to create folders",noPermissionUpload:"You do not have permission to upload files",noPermissionMoveFiles:"You do not have permission to move files",noPermissionDeleteFiles:"You do not have permission to delete files",toast:{folderCreated:"Folder created",folderDeleted:"Folder deleted",fileDeleted:"File deleted",filesDeleted:"Deleted {{count}} files",filesMoved:"Files moved",folderLinked:"Folder linked",folderUnlinked:"Folder unlinked",addedToQueue:"Added {{count}} file(s) to queue",addedToQueuePartial:"Added {{added}} file(s), {{failed}} failed",failedToAddToQueue:"Failed to add files: {{error}}",fileRenamed:"File renamed",folderRenamed:"Folder renamed",thumbnailsGenerated:"Generated {{count}} thumbnail(s)",thumbnailsGeneratedPartial:"Generated {{succeeded}} thumbnail(s), {{failed}} failed",noStlMissingThumbnails:"No STL files missing thumbnails",failedToGenerateThumbnails:"Failed to generate thumbnails: {{error}}",thumbnailGenerated:"Thumbnail generated",failedToGenerateThumbnail:"Failed to generate thumbnail: {{error}}"}},projects:{title:"Projects",subtitle:"Organize and track your 3D printing projects",newProject:"New Project",editProject:"Edit Project",deleteProject:"Delete Project",projectName:"Project Name",description:"Description",noProjects:"No projects yet",noProjectsFiltered:"No {{status}} projects",noProjectsFilteredHelp:"You don't have any {{status}} projects. Projects will appear here when their status changes.",createFirst:"Create your first project to start organizing related prints, tracking progress, and managing your builds.",createFirstButton:"Create Your First Project",create:"Create",files:"Files",prints:"Prints",plates:"plates",parts:"parts",lastModified:"Last Modified",deleteConfirm:"Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.",addFiles:"Add Files",removeFile:"Remove File",viewDetails:"View Details",namePlaceholder:"e.g., Voron 2.4 Build",descriptionPlaceholder:"Optional description...",color:"Color",targetPlates:"Target Plates",targetPlatesPlaceholder:"e.g., 25",targetPlatesHelp:"Number of print jobs",targetParts:"Target Parts",targetPartsPlaceholder:"e.g., 150",targetPartsHelp:"Total objects needed",tagsLabel:"Tags (comma-separated)",tagsPlaceholder:"e.g., voron, functional, gift",dueDate:"Due Date",priority:"Priority",priorityLow:"Low",priorityNormal:"Normal",priorityHigh:"High",priorityUrgent:"Urgent",statusActive:"Active",statusCompleted:"Completed",statusArchived:"Archived",done:"Done",completed:"completed",failed:"failed",inQueue:"in queue",noPrintsYet:"No prints yet",printJobs:"Print jobs (plates)",partsPrinted:"Parts printed",failedParts:"Failed parts",import:"Import",export:"Export",importProject:"Import project",exportAll:"Export all projects",loading:"Loading projects...",noEditPermission:"You do not have permission to edit projects",noDeletePermission:"You do not have permission to delete projects",noCreatePermission:"You do not have permission to create projects",noImportPermission:"You do not have permission to import projects",noExportPermission:"You do not have permission to export projects",toast:{created:"Project created",updated:"Project updated",deleted:"Project deleted",imported:"Project imported",multipleImported:"{{count}} projects imported",importFailed:"Import failed",exported:"Projects exported (metadata only)"}},projectDetail:{notFound:"Project not found",backToProjects:"Back to Projects",export:"Export",exportProject:"Export project",noExportPermission:"You do not have permission to export projects",noEditPermission:"You do not have permission to edit projects",partOf:"Part of:",priorityLabel:"Priority:",noPrints:"No prints in this project yet",status:{active:"Active",completed:"Completed",archived:"Archived"},priority:{low:"Low",normal:"Normal",high:"High",urgent:"Urgent"},dueDate:{overdue:"Overdue",today:"Due today",daysLeft:"{{count}} days left"},progress:{platesProgress:"Plates Progress",partsProgress:"Parts Progress",printJobs:"print jobs",parts:"parts",percentComplete:"{{percent}}% complete",remaining:"{{count}} remaining"},stats:{printJobs:"Print Jobs",total:"total",failed:"{{count}} failed",partsPrinted:"{{count}} parts printed",printTime:"Print Time",filamentUsed:"Filament Used"},cost:{title:"Cost Tracking",filamentCost:"Filament Cost",energy:"Energy",budget:"Budget",remaining:"Remaining"},subProjects:{title:"Sub-projects ({{count}})"},notes:{title:"Notes",noEditPermission:"You do not have permission to edit notes",placeholder:"Add notes about this project...",empty:"No notes yet. Click Edit to add notes."},files:{title:"Files",linkFolders:"Link folders from the File Manager",forQuickAccess:"to this project for quick access.",fileCount:"{{count}} file(s)",empty:"No folders linked. Go to File Manager and link a folder to this project."},bom:{title:"Bill of Materials",acquired:"{{completed}}/{{total}} acquired",showAll:"Show all",hideDone:"Hide done",addPart:"Add Part",noAddPermission:"You do not have permission to add parts",partNamePlaceholder:"Part name (e.g., M3x8 screws)",partName:"Part name",qty:"Qty",price:"Price ({{currency}})",sourcingUrlPlaceholder:"Sourcing URL (optional)",remarksPlaceholder:"Remarks (optional)",deletePart:"Delete Part",deleteConfirm:'Are you sure you want to delete "{{name}}"?',noUpdatePermission:"You do not have permission to update parts",noEditPermission:"You do not have permission to edit parts",noDeletePermission:"You do not have permission to delete parts",totalCost:"Total cost:",empty:"No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced."},timeline:{title:"Activity Timeline",empty:"No activity yet."},template:{saveAsTemplate:"Save as Template",noCreatePermission:"You do not have permission to create templates"},queue:{title:"Queue",viewAll:"View all",printing:"{{count}} printing",queued:"{{count}} queued"},prints:{title:"Prints ({{count}})"},toast:{projectUpdated:"Project updated",partAdded:"Part added",partRemoved:"Part removed",exportFailed:"Export failed",projectExported:"Project exported",templateCreated:"Template created"}},system:{title:"System Information",version:"Version",uptime:"Uptime",cpuUsage:"CPU Usage",memoryUsage:"Memory Usage",diskUsage:"Disk Usage",networkInfo:"Network Info",logs:"Logs",debugMode:"Debug Mode",enableDebug:"Enable Debug Logging",disableDebug:"Disable Debug Logging",downloadLogs:"Download Logs",clearLogs:"Clear Logs",dockerInfo:"Docker Info",containerName:"Container Name",imageName:"Image Name",platform:"Platform",architecture:"Architecture"},library:{title:"Filament Library",addFilament:"Add Filament",editFilament:"Edit Filament",deleteFilament:"Delete Filament",vendor:"Vendor",material:"Material",color:"Color",kFactor:"K Factor",temperature:"Temperature",noFilaments:"No filaments in library",deleteConfirm:"Are you sure you want to delete this filament?",importFromPrinter:"Import from Printer",exportToFile:"Export to File"},spoolman:{title:"Spoolman Integration",enabled:"Spoolman Enabled",url:"Spoolman URL",connected:"Connected",disconnected:"Not Connected",testConnection:"Test Connection",sync:"Sync",syncing:"Syncing...",lastSync:"Last Sync",linkToSpoolman:"Link to Spoolman",openInSpoolman:"Open in Spoolman",unlinkSpool:"Unlink Spool",selectSpool:"Select Spool",noUnlinkedSpools:"No unlinked spools available",linkSuccess:"Spool linked to Spoolman successfully",linkFailed:"Failed to link spool",spoolId:"Spool ID",weight:"Weight",remaining:"Remaining",disableWeightSync:"Disable AMS Estimated Weight Sync",disableWeightSyncDesc:"Don't update remaining capacity from AMS estimates. Use this if you prefer Spoolman's usage tracking over AMS percentage-based estimates. New spools will still use the AMS estimate as their initial weight.",reportPartialUsage:"Report Partial Usage for Failed Prints",reportPartialUsageDesc:"When a print fails or is cancelled, report the estimated filament used up to that point based on layer progress."},timelapse:{title:"Timelapse",create:"Create Timelapse",download:"Download",delete:"Delete",preview:"Preview",frameRate:"Frame Rate",quality:"Quality",processing:"Processing...",noTimelapses:"No timelapses available"},ams:{title:"AMS",slot:"Slot",empty:"Empty",emptySlot:"Empty slot",unknown:"Unknown",humidity:"Humidity",temperature:"Temperature",filamentType:"Filament Type",filamentColor:"Color",remaining:"Remaining",history:"AMS History",noHistory:"No history available",configureSlot:"Configure Slot",externalSpool:"External Spool",profile:"Profile",kFactor:"K Factor",fill:"Fill",configure:"Configure"},printModal:{title:"Start Print",selectPrinter:"Select Printer",selectPlate:"Select Plate",filamentMapping:"Filament Mapping",printSettings:"Print Settings",bedLeveling:"Bed Leveling",flowCalibration:"Flow Calibration",vibrationCalibration:"Vibration Calibration",layerInspection:"First Layer Inspection",timelapse:"Timelapse",startPrint:"Start Print",addToQueue:"Add to Queue",cancel:"Cancel",noPrintersAvailable:"No printers available",printerBusy:"Printer is busy",printerOffline:"Printer is offline"},backup:{title:"Backup & Restore",createBackup:"Create Backup",restoreBackup:"Restore Backup",restoreDescription:"Replace all data from a backup file",downloadBackup:"Download Backup",uploadBackup:"Upload Backup",lastBackup:"Last Backup",autoBackup:"Auto Backup",backupNow:"Backup Now",restoreWarning:"Warning: Restoring a backup will overwrite all current data.",includeArchives:"Include Archives",includeSettings:"Include Settings",includeProfiles:"Include Profiles",backupSuccess:"Backup created successfully",restoreSuccess:"Backup restored successfully",backupFailed:"Backup failed",restoreFailed:"Restore failed",restoreNote:"Virtual Printer will be stopped during restore"},tags:{title:"Tags",addTag:"Add Tag",editTag:"Edit Tag",deleteTag:"Delete Tag",tagName:"Tag Name",tagColor:"Tag Color",noTags:"No tags",deleteConfirm:"Are you sure you want to delete this tag?",manageTags:"Manage Tags"},uploadModal:{title:"Upload 3MF Files",dragDrop:"Drag & drop .3mf files here",or:"or",browseFiles:"Browse Files",extractionInfo:"The printer model will be automatically extracted from the 3MF file metadata.",uploaded:"uploaded",failed:"failed",uploading:"Uploading...",upload:"Upload",uploadFailed:"Upload failed"},editArchive:{title:"Edit Archive",name:"Name",namePlaceholder:"Print name",printer:"Printer",noPrinter:"No printer",project:"Project",noProject:"No project",itemsPrinted:"Items Printed",itemsPrintedHelp:"Number of items produced in this print job",notes:"Notes",notesPlaceholder:"Add notes about this print...",externalLink:"External Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link to Printables, Thingiverse, or other source",tags:"Tags",tagsPlaceholder:"Add tags...",addMoreTags:"Add more tags...",matchingTags:'Matching "{{query}}"',existingTags:"Existing tags",clickToAdd:"(click to add)",status:"Status",failureReason:"Failure Reason",selectReason:"Select reason...",photos:"Photos of Printed Result",photosHelp:"Click + to add photos of your printed result",printResult:"Print result",saving:"Saving...",failureReasons:{adhesionFailure:"Adhesion failure",spaghettiDetached:"Spaghetti / Detached",layerShift:"Layer shift",cloggedNozzle:"Clogged nozzle",filamentRunout:"Filament runout",warping:"Warping",stringing:"Stringing",underExtrusion:"Under-extrusion",powerFailure:"Power failure",userCancelled:"User cancelled",other:"Other"},statuses:{completed:"Completed",failed:"Failed",aborted:"Cancelled",printing:"Printing"}},kProfiles:{title:"K-Profiles",noPrintersConfigured:"No Printers Configured",addPrinterInSettings:"Add a printer in Settings to manage K-profiles",noActivePrinters:"No Active Printers",enablePrinterConnection:"Enable a printer connection to view its K-profiles",loadingProfiles:"Loading K-Profiles...",printerOffline:"Printer Offline",printerOfflineDesc:"The selected printer is not connected. Power it on to view K-profiles.",noMatchingProfiles:"No Matching Profiles",noMatchingProfilesDesc:"No profiles match your search criteria",noKProfiles:"No K-Profiles",noKProfilesDesc:"No pressure advance profiles found for {{diameter}}mm nozzle",createFirstProfile:"Create First Profile",printer:"Printer",nozzle:"Nozzle",refresh:"Refresh",addProfile:"Add Profile",export:"Export",import:"Import",select:"Select",selectAll:"Select All",delete:"Delete",searchPlaceholder:"Search by name or filament...",allExtruders:"All Extruders",leftOnly:"Left Only",rightOnly:"Right Only",allFlow:"All Flow",hfOnly:"HF Only",sOnly:"S Only",sortName:"Sort: Name",sortKValue:"Sort: K-Value",sortFilament:"Sort: Filament",leftExtruder:"Left Extruder",rightExtruder:"Right Extruder",modal:{addTitle:"Add K-Profile",editTitle:"Edit K-Profile",profileName:"Profile Name",profileNamePlaceholder:"My PLA Profile",kValue:"K-Value",kValuePlaceholder:"0.020",kValueHelp:"Typical range: 0.01 - 0.06 for PLA, 0.02 - 0.10 for PETG",filament:"Filament",selectFilament:"Select filament...",noFilamentsHelp:"No filaments found. Create a K-profile in Bambu Studio first.",flowType:"Flow Type",highFlow:"High Flow",standard:"Standard",nozzleSize:"Nozzle Size",extruder:"Extruder",extruders:"Extruders",left:"Left",right:"Right",notes:"Notes (stored locally)",notesPlaceholder:"Add notes about this profile...",notesHelp:"Notes are saved in Bambuddy, not on the printer",syncing:"Syncing with printer...",savingExtruder:"Saving to extruder {{current}}/{{total}}...",pleaseWait:"Please wait"},deleteConfirm:{title:"Delete Profile",cannotUndo:"This cannot be undone",message:'Are you sure you want to delete "{{name}}" from the printer?'},bulkDelete:{title:"Delete Profiles",cannotUndo:"This cannot be undone",message:"Are you sure you want to delete {{count}} selected profiles from the printer?"},toast:{profileSaved:"K-profile saved",profilesSaved:"K-profile saved to {{count}} extruders",selectAtLeastOneExtruder:"Please select at least one extruder",profileDeleted:"K-profile deleted",profilesDeleted:"Deleted {{count}} profiles",exportedProfiles:"Exported {{count}} profiles",importedProfiles:"Imported {{count}} of {{total}} profiles",noProfilesToExport:"No profiles to export",invalidFileFormat:"Invalid file format",failedToParseImport:"Failed to parse import file",failedToSaveBatch:"Failed to save K-profiles",noteSaved:"Note saved",failedToSaveNote:"Failed to save note"},permission:{noRead:"You do not have permission to refresh profiles",noCreate:"You do not have permission to add profiles",noUpdate:"You do not have permission to update K-profiles",noDelete:"You do not have permission to delete K-profiles",noExport:"You do not have permission to export profiles",noImport:"You do not have permission to import profiles"}},virtualPrinter:{title:"Virtual Printer",running:"Running",stopped:"Stopped",description:{default:"Enable a virtual printer that appears in Bambu Studio and OrcaSlicer. Files sent to this printer will be archived directly without printing.",proxy:"Enable a proxy that relays slicer traffic to a real printer, allowing remote printing over any network."},enable:{title:"Enable Virtual Printer",visibleInSlicer:'Visible as "Bambuddy" in slicer discovery',proxyingTo:"Proxying to {{name}}",notActive:"Not active"},model:{title:"Printer Model",description:"Select which printer model to emulate.",restartWarning:"Changing the model will restart the virtual printer"},accessCode:{title:"Access Code",isSet:"Access code is set",notSet:"No access code set - required to enable",placeholder:"Enter 8-char code",placeholderChange:"Enter new code to change",hint:"Must be exactly 8 characters. Used by slicers to authenticate.",charCount:"({{count}}/8)"},targetPrinter:{title:"Target Printer",configured:"Proxy target configured",notConfigured:"No target printer selected - required for proxy mode",placeholder:"Select a printer...",hint:"Select the printer to proxy slicer traffic to. The printer must be in LAN mode.",noPrinters:"No printers configured. Add a printer first to use proxy mode."},remoteInterface:{title:"Slicer Network Interface",configured:"SSDP proxy enabled",optional:"Optional - for SSDP discovery across networks",placeholder:"Select interface for slicer network...",hint:"Select the network interface connected to the slicer. Enables automatic printer discovery in Bambu Studio."},mode:{title:"Mode",archive:"Archive",archiveDesc:"Archive files immediately",review:"Review",reviewDesc:"Review before archiving",queue:"Queue",queueDesc:"Archive and add to queue",proxy:"Proxy",proxyDesc:"Relay to real printer"},setupRequired:{title:"Setup Required",description:"The virtual printer feature requires additional system configuration before it will work. This includes port forwarding, firewall rules, and platform-specific settings.",readGuide:"Read the setup guide before enabling"},howItWorks:{title:"How it works",titleProxy:"How it works (Proxy Mode)",step1:"Complete the setup guide for your platform",step2:"Enable the virtual printer and set an access code",step3:'In Bambu Studio or OrcaSlicer, go to "Add Printer"',step4:'The "Bambuddy" printer should appear in the discovery list',step5:"Connect using the access code you set",step6:'When you "print" to Bambuddy, the 3MF file is archived instead',proxyStep1:"Select the target printer (must be in LAN mode)",proxyStep2:"For cross-network: select the slicer network interface",proxyStep3:"Enable the proxy - printer appears in slicer discovery via SSDP",proxyStep4:"Connect using the printer's access code",proxyStep5:"Print as normal - traffic is relayed through Bambuddy",proxyStep6:"Camera streaming requires NAT/IP forwarding (see docs)"},status:{title:"Status Details",printerName:"Printer Name",model:"Model",serialNumber:"Serial Number",mode:"Mode",pendingFiles:"Pending Files",targetPrinter:"Target Printer",ftpPort:"FTP Port",mqttPort:"MQTT Port",ftpConnections:"FTP Connections",mqttConnections:"MQTT Connections"},toast:{updated:"Virtual printer settings updated",failedToUpdate:"Failed to update settings",accessCodeRequired:"Please set an access code first",targetPrinterRequired:"Please select a target printer first",accessCodeEmpty:"Access code cannot be empty",accessCodeLength:"Access code must be exactly 8 characters"}},modelViewer:{openInSlicer:"Open in Slicer",tabs:{model:"3D Model",gcode:"G-code Preview"},notAvailable:"not available",notSliced:"not sliced",plates:"Plates",allPlates:"All Plates",plateNumber:"Plate {{number}}",plateCount:"{{count}} plate",plateCount_other:"{{count}} plates",objectCount:"{{count}} object",objectCount_other:"{{count}} objects",filamentCount:"{{count}} filament",filamentCount_other:"{{count}} filaments",eta:"ETA {{minutes}} min",noPreview:"No preview available for this file",pagination:{pageOf:"Page {{current}} of {{total}}",prev:"Prev",next:"Next"},errors:{failedToLoad:"Failed to load file",noMeshes:"No meshes found in 3MF file",unsupportedFormat:"Unsupported file format"}},maintenanceDescriptions:{lubricateRails:"Apply lubricant to linear rails for smooth motion",cleanNozzle:"Clean hotend and nozzle to prevent clogs",checkBelts:"Verify belt tension for accurate prints",cleanBuildPlate:"Clean build plate for better adhesion",checkExtruder:"Inspect extruder gears for wear",checkCooling:"Ensure cooling fans are working properly",generalInspection:"General printer inspection",cleanCarbonRods:"Clean carbon rods to reduce friction",checkPtfeTube:"Inspect PTFE tube for wear or damage",replaceHepaFilter:"Replace HEPA filter for air quality",replaceCarbonFilter:"Replace activated carbon filter",lubricateLeftNozzleRail:"Lubricate left nozzle rail (H2 series)"}},fle={nav:{printers:"Drucker",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",projects:"Projekte",files:"Dateimanager",settings:"Einstellungen",system:"System",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",updateAvailableBanner:"Version {{version}} ist verfügbar!",viewUpdate:"Update anzeigen",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln",smartSwitches:"Smart Switches",logout:"Abmelden"},common:{save:"Speichern",saving:"Speichern...",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",days:"Tage",enable:"Aktivieren",disable:"Deaktivieren",permissions:"Berechtigungen",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",linkNotFound:"Link nicht gefunden",required:"Erforderlich",optional:"Optional",dismiss:"Schließen",apply:"Anwenden",reset:"Zurücksetzen",clear:"Leeren",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",noChange:"— Keine Änderung —",unchanged:"Unverändert",unassigned:"Nicht zugewiesen",unknown:"Unbekannt",unknownError:"Unbekannter Fehler",today:"Heute",asap:"Sofort",overdue:"Überfällig",now:"Jetzt",collapse:"Einklappen",expand:"Ausklappen",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",addedBy:"Hinzugefügt von {{username}}",prints:"Drucke",more:"+{{count}} weitere",ascending:"Aufsteigend",descending:"Absteigend",printer:"Drucker",remove:"Entfernen",type:"Typ",print:"Drucken",rename:"Umbenennen",move:"Verschieben",create:"Erstellen",duplicate:"Duplizieren",left:"Links",right:"Rechts"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig",sort:{name:"Name",status:"Status",model:"Modell",location:"Standort",ascending:"Aufsteigend sortieren",descending:"Absteigend sortieren"},cardSize:{small:"Kleine Karten",medium:"Mittlere Karten",large:"Große Karten",extraLarge:"Extra große Karten"},hideOffline:"Offline ausblenden",powerOn:"Einschalten",offlinePrintersWithPlugs:"Offline-Drucker mit Smart-Plugs",noPrintersConfigured:"Noch keine Drucker konfiguriert",readyToPrint:"Druckbereit",external:"Extern",deleteArchives:"Druckarchive löschen",noLabel:"Keine Bezeichnung",printPreview:"Druckvorschau",width:"Breite",height:"Höhe",noObjectsFound:"Keine Objekte gefunden",objectsLoadedOnPrintStart:"Objekte werden beim Druckstart geladen",willBeSkipped:"Wird übersprungen",name:"Name",serialCannotBeChanged:"Seriennummer kann nicht geändert werden",locationHelp:"Dient zur Gruppierung von Druckern und zum Filtern von Warteschlangenaufträgen",wifiSignal:{veryWeak:"Sehr schwach",weak:"Schwach",fair:"Ausreichend",good:"Gut",excellent:"Ausgezeichnet"},maintenanceUpToDate:"Alle Wartungen aktuell - Klicken zum Anzeigen",chamberLightOn:"Kammerbeleuchtung einschalten",chamberLightOff:"Kammerbeleuchtung ausschalten",browseFiles:"Druckerdateien durchsuchen",autoOffAfterPrint:"Automatisches Ausschalten nach Druck",autoOffExecuted:"Auto-off wurde ausgeführt - Drucker einschalten zum Zurücksetzen",hmsErrors:"HMS-Fehler",viewHmsErrors:"{{count}} HMS-Fehler anzeigen",resume:"Fortsetzen",pause:"Pausieren",stop:"Stoppen",camera:"Kamera",skipObject:"Objekt überspringen",reconnect:"Neu verbinden",mqttDebug:"MQTT-Debug",activeNozzle:"Aktiv: {{nozzle}} Düse",firmwareUpdate:"Firmware-Update",firmwareInstructions:"Gehen Sie auf dem Touchscreen des Druckers zu",firmwareNav:"Navigieren Sie zu",settings:"Einstellungen",firmware:"Firmware",discoverPrinters:"Drucker entdecken",searching:"Suche...",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",toast:{printerDeleted:"Drucker gelöscht",printerAdded:"Drucker hinzugefügt",printerUpdated:"Drucker aktualisiert",failedToDelete:"Drucker konnte nicht gelöscht werden",failedToAdd:"Drucker konnte nicht hinzugefügt werden",failedToUpdate:"Drucker konnte nicht aktualisiert werden",commandSent:"Befehl gesendet",failedToSendCommand:"Befehl konnte nicht gesendet werden",turnedOn:"{{name}} eingeschaltet",failedToPowerOn:"{{name}} konnte nicht eingeschaltet werden",scriptTriggered:"Skript ausgelöst",printStopped:"Druck gestoppt",printPaused:"Druck pausiert",printResumed:"Druck fortgesetzt",referenceDeleted:"Referenz gelöscht",detectionAreaSaved:"Erkennungsbereich gespeichert",failedToRunScript:"Skript konnte nicht ausgeführt werden",failedToStopPrint:"Druck konnte nicht gestoppt werden",failedToPausePrint:"Druck konnte nicht pausiert werden",failedToResumePrint:"Druck konnte nicht fortgesetzt werden",failedToControlChamberLight:"Kammerbeleuchtung konnte nicht gesteuert werden",failedToUpdateSetting:"Einstellung konnte nicht aktualisiert werden",failedToSkipObjects:"Objekte konnten nicht übersprungen werden",failedToRereadRfid:"RFID konnte nicht erneut gelesen werden",failedToCheckPlate:"Platte konnte nicht überprüft werden",failedToUpdateLabel:"Bezeichnung konnte nicht aktualisiert werden",failedToDeleteReference:"Referenz konnte nicht gelöscht werden",failedToSaveDetectionArea:"Erkennungsbereich konnte nicht gespeichert werden",plateCheckEnabled:"Plattenprüfung aktiviert",plateCheckDisabled:"Plattenprüfung deaktiviert",calibrationSaved:"Kalibrierung gespeichert!",calibrationFailed:"Kalibrierung fehlgeschlagen",rfidRereadInitiated:"RFID-Neueinlesen gestartet"},connection:{connected:"Verbunden",offline:"Offline"},queue:{inQueue:"{{count}} Druck in Warteschlange",inQueue_plural:"{{count}} Drucke in Warteschlange"},controls:"Steuerung",rfid:{reread:"RFID neu lesen"},permission:{noAdd:"Sie haben keine Berechtigung, Drucker hinzuzufügen",noEdit:"Sie haben keine Berechtigung, Drucker zu bearbeiten",noDelete:"Sie haben keine Berechtigung, Drucker zu löschen",noControl:"Sie haben keine Berechtigung, Drucker zu steuern",noFiles:"Sie haben keine Berechtigung, auf Druckerdateien zuzugreifen",noAmsRfid:"Sie haben keine Berechtigung, AMS-RFID erneut zu lesen",noSmartPlugControl:"Sie haben keine Berechtigung, Smart Plugs zu steuern"},modal:{addTitle:"Drucker hinzufügen",editTitle:"Drucker bearbeiten",myPrinter:"Mein Drucker",selectModel:"Modell auswählen...",locationGroup:"Standort / Gruppe (optional)",locationPlaceholder:"z.B. Werkstatt, Büro, Keller",autoArchiveLabel:"Abgeschlossene Drucke automatisch archivieren",fromPrinterSettings:"Aus Druckereinstellungen",modelOptional:"Modell (optional)",saveChanges:"Änderungen speichern"},skipObjects:{tooltip:"Objekte überspringen",onlyWhilePrinting:"Objekte überspringen (nur während des Drucks)",requiresMultiple:"Objekte überspringen (erfordert 2+ Objekte)",title:"Objekte überspringen",matchIdsInfo:"IDs mit Drucker-Display abgleichen",printerShowsIds:"Der Druckerbildschirm zeigt Objekt-IDs auf der Bauplatte",skipSelected:"Ausgewählte überspringen",skipping:"Überspringe...",noObjectsSelected:"Keine Objekte ausgewählt",selectObjectsToSkip:"Wählen Sie Objekte aus, die Sie vom aktuellen Druck überspringen möchten",skipped:"übersprungen",objectsSkipped:"Objekte übersprungen",activeCount:"{{count}} aktiv",waitForLayer:"Warten Sie auf Schicht 2+ zum Überspringen von Objekten (aktuell Schicht {{layer}})",skip:"Überspringen"},confirm:{deleteTitle:"Drucker löschen",deleteMessage:'Möchten Sie "{{name}}" wirklich löschen? Alle Verbindungseinstellungen werden entfernt.',deleteArchivesNote:"Der gesamte Druckverlauf für diesen Drucker wird dauerhaft gelöscht.",keepArchivesNote:"Der Druckverlauf wird beibehalten, aber nicht mehr mit diesem Drucker verknüpft.",stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich stoppen? Der Druckauftrag wird abgebrochen.',stopButton:"Druck stoppen",pauseTitle:"Druck pausieren",pauseMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich pausieren?',pauseButton:"Druck pausieren",resumeTitle:"Druck fortsetzen",resumeMessage:'Möchten Sie den Druck auf "{{name}}" fortsetzen?',resumeButton:"Druck fortsetzen",powerOnTitle:"Drucker einschalten",powerOnMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich EINSCHALTEN?',powerOnButton:"Einschalten",powerOffTitle:"Drucker ausschalten",powerOffMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich AUSSCHALTEN?',powerOffWarning:'WARNUNG: "{{name}}" druckt gerade! Möchten Sie die Stromversorgung wirklich AUSSCHALTEN? Dies unterbricht den Druck und kann den Drucker beschädigen.',powerOffButton:"Ausschalten"},discovery:{title:"Drucker entdecken",searching:"Suche...",scanning:"Scanne...",scanProgress:"Scanne... {{scanned}}/{{total}}",foundPrinters:"{{count}} Drucker gefunden",noPrintersFound:"Keine Drucker gefunden",noPrintersFoundSubnet:"Keine Drucker im angegebenen Subnetz gefunden.",noPrintersFoundNetwork:"Keine Drucker im Netzwerk gefunden.",allConfigured:"Alle erkannten Drucker sind bereits konfiguriert.",alreadyAdded:"Bereits hinzugefügt",select:"Auswählen",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",subnetToScan:"Zu scannendes Subnetz",dockerNote:"Docker erkannt. Geben Sie das Subnetz Ihres Druckers in CIDR-Notation ein. Erfordert network_mode: host in docker-compose.yml.",scanSubnet:"Subnetz nach Druckern scannen",discoverNetwork:"Drucker im Netzwerk suchen",scanningSubnet:"Subnetz wird nach Bambu-Druckern gescannt...",scanningNetwork:"Netzwerk wird gescannt...",serialRequired:"Seriennummer erforderlich",unknown:"Unbekannt",failedToStart:"Erkennung konnte nicht gestartet werden"},filaments:"Filamente",openCameraOverlay:"Kamera-Overlay öffnen",openCameraWindow:"Kamera in neuem Fenster öffnen",firmwareUpdateAvailable:"Firmware-Update verfügbar: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"Sie haben keine Berechtigung, Drucker zu aktualisieren",enabledClick:"Plattenprüfung aktiviert - Klicken zum Deaktivieren",disabledClick:"Plattenprüfung deaktiviert - Klicken zum Aktivieren",manageCalibration:"Platten-Erkennungskalibrierung verwalten",calibrationRequired:"Kalibrierung erforderlich",calibrationInstructions:"Bitte stellen Sie sicher, dass die Druckplatte vollständig leer ist, und klicken Sie dann auf Kalibrieren.",calibrationDescription:"Die Kalibrierung erfasst ein Referenzbild der leeren Platte. Zukünftige Prüfungen vergleichen mit dieser Referenz, um Objekte zu erkennen.",calibrationTip:"Tipp: Sie können bis zu 5 Kalibrierungen für verschiedene Platten speichern. Das System verwendet automatisch die beste Übereinstimmung bei der Prüfung.",plateEmpty:"Platte erscheint leer",objectsDetected:"Objekte auf Platte erkannt",confidence:"Konfidenz",difference:"Differenz",analysisPreview:"Analysevorschau:",analysisLegend:"Grüner Rahmen = Erkennungsbereich, Rote Überlagerung = Unterschiede zur Kalibrierung",savedReferences:"Gespeicherte Referenzen ({{count}}/{{max}})",deleteReference:"Referenz löschen",labelPlaceholder:"Bezeichnung...",clickToEdit:"{{label}} - Zum Bearbeiten klicken",clickToAddLabel:"Zum Hinzufügen einer Bezeichnung klicken"},fans:{partCooling:"Bauteilkühlung",auxiliary:"Hilfsventilator",chamber:"Kammerventilator"},clickToViewHmsErrors:"Klicken, um HMS-Fehler anzuzeigen",estimatedCompletion:"Geschätzte Fertigstellungszeit",slotOptions:"Slot-Optionen",firmwareModal:{title:"Firmware-Update",currentVersion:"Aktuell:",latestVersion:"Neueste:",releaseNotes:"Versionshinweise",checkingPrereqs:"Prüfe Voraussetzungen...",sdCardReady:"SD-Karte bereit. Klicken Sie unten, um die Firmware hochzuladen.",uploadedSuccess:"Firmware auf SD-Karte hochgeladen!",applyInstructions:"So wenden Sie das Update auf Ihrem Drucker an:",step1:"Gehen Sie auf dem Touchscreen des Druckers zu Einstellungen",step2:"Navigieren Sie zu Firmware",step3:"Wählen Sie Update von SD-Karte",step4:"Das Update dauert 10-20 Minuten",done:"Fertig",starting:"Starte...",uploadFirmware:"Firmware hochladen",uploadedToast:"Firmware hochgeladen! Starten Sie das Update vom Druckerbildschirm."},accessCodePlaceholder:"Leer lassen, um den aktuellen zu behalten",roi:{title:"Erkennungsbereich (ROI)",xStart:"X-Start",yStart:"Y-Start",width:"Breite",height:"Höhe",instruction:"Passen Sie den Erkennungsbereich an, um sich auf die Druckplatte zu konzentrieren. Der grüne Rahmen in der Vorschau zeigt den aktuellen Bereich."}},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",sortLargest:"Größte zuerst",sortSmallest:"Kleinste zuerst",sortSize:"Größe",noArchives:"Keine Archive gefunden",noArchivesSearch:"Keine Archive entsprechen Ihrer Suche",noArchivesYet:"Noch keine Archive",loadingArchives:"Lade Archive...",releaseToUpload:"Loslassen zum Hochladen",showAll:"Alle anzeigen",showFavoritesOnly:"Nur Favoriten anzeigen",gridView:"Rasteransicht",listView:"Listenansicht",calendarView:"Kalenderansicht",manageTags:"Tags verwalten",showFailedPrints:"Fehlgeschlagene Drucke anzeigen",hideFailedPrints:"Fehlgeschlagene Drucke ausblenden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"},toast:{source3mfAttached:"Quell-3MF angehängt: {{filename}}",failedUploadSource3mf:"Fehler beim Hochladen der Quell-3MF",source3mfRemoved:"Quell-3MF entfernt",failedRemoveSource3mf:"Fehler beim Entfernen der Quell-3MF",f3dAttached:"F3D angehängt: {{filename}}",failedUploadF3d:"Fehler beim Hochladen der F3D",f3dRemoved:"F3D entfernt",failedRemoveF3d:"Fehler beim Entfernen der F3D",timelapseAttached:"Zeitraffer angehängt: {{filename}}",timelapseAlreadyAttached:"Zeitraffer bereits angehängt",noMatchingTimelapse:"Kein passender Zeitraffer gefunden",failedScanTimelapse:"Fehler beim Suchen nach Zeitraffer",failedAttachTimelapse:"Fehler beim Anhängen des Zeitraffers",archiveDeleted:"Archiv gelöscht",failedDeleteArchive:"Fehler beim Löschen des Archivs",addedToFavorites:"Zu Favoriten hinzugefügt",removedFromFavorites:"Aus Favoriten entfernt",projectUpdated:"Projekt aktualisiert",failedUpdateProject:"Fehler beim Aktualisieren des Projekts",linkCopied:"Link in die Zwischenablage kopiert",failedCopyLink:"Fehler beim Kopieren des Links",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos",failedDeleteArchives:"Fehler beim Löschen der Archive",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen"},menu:{print:"Drucken",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",slice:"Slicen",externalLink:"Externer Link",viewOnMakerWorld:"Auf MakerWorld ansehen",preview3d:"3D-Vorschau",viewTimelapse:"Zeitraffer ansehen",scanForTimelapse:"Nach Zeitraffer suchen",downloadSource3mf:"Quell-3MF herunterladen",uploadSource3mf:"Quell-3MF hochladen",replaceSource3mf:"Quell-3MF ersetzen",removeSource3mf:"Quell-3MF entfernen",uploadF3d:"F3D hochladen",replaceF3d:"F3D ersetzen",downloadF3d:"F3D herunterladen",removeF3d:"F3D entfernen",download:"Herunterladen",copyDownloadLink:"Download-Link kopieren",qrCode:"QR-Code",viewPhotos:"Fotos ansehen",viewPhotosCount:"Fotos ansehen ({{count}})",projectPage:"Projektseite",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",edit:"Bearbeiten",goToProject:"Zum Projekt: {{name}}",addToProject:"Zu Projekt hinzufügen",removeFromProject:"Aus Projekt entfernen",loading:"Laden...",noProjectsAvailable:"Keine Projekte verfügbar",select:"Auswählen",deselect:"Abwählen",delete:"Löschen"},permission:{noReprint:"Sie haben keine Berechtigung, dieses Archiv erneut zu drucken",noAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noUpdateArchives:"Sie haben keine Berechtigung, Archive zu aktualisieren",noUploadFiles:"Sie haben keine Berechtigung, Dateien hochzuladen",noDownload:"Sie haben keine Berechtigung, Archive herunterzuladen",noCopyLink:"Sie haben keine Berechtigung, Download-Links zu kopieren",noDelete:"Sie haben keine Berechtigung, dieses Archiv zu löschen",noCreate:"Sie haben keine Berechtigung, Archive zu erstellen"},card:{previousPlate:"Vorherige Platte",nextPlate:"Nächste Platte",plateNumber:"Platte {{index}}",moreOptions:"Rechtsklick für mehr Optionen",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",cancelled:"abgebrochen",failed:"fehlgeschlagen",duplicate:"Duplikat",duplicateTitle:"Dieses Modell wurde bereits zuvor gedruckt",openSource3mf:"Quell-3MF in Bambu Studio öffnen (Rechtsklick für mehr Optionen)",downloadF3d:"Fusion 360 Designdatei herunterladen",viewTimelapse:"Zeitraffer ansehen",viewPhoto:"1 Foto ansehen",viewPhotos:"{{count}} Fotos ansehen",openFolder:"Ordner öffnen: {{name}}",slicedFile:"Geslicte Datei - druckbereit",sourceFile:"Nur Quelldatei - keine AMS-Zuordnung verfügbar",gcode:"GCODE",source:"QUELLE",project:"Projekt: {{name}}",estimated:"Geschätzt: {{time}}",actual:"Tatsächlich: {{time}}",accuracy:"Genauigkeit: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} Schicht",layers:"{{count}} Schichten",object:"{{count}} Objekt",objects:"{{count}} Objekte",slicedFor:"Geslict für {{model}}",uploadedBy:"Hochgeladen von",noPermissionReprint:"Sie haben keine Berechtigung, erneut zu drucken",noPermissionEdit:"Sie haben keine Berechtigung, Archive zu bearbeiten",noPermissionDelete:"Sie haben keine Berechtigung, Archive zu löschen",reprint:"Drucken",schedulePrint:"Druck planen",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",openInBambuStudioToSlice:"In Bambu Studio öffnen zum Slicen",slice:"Slicen",externalLink:"Externer Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"Projekt ansehen",noExternalLink:"Kein externer Link",preview3d:"3D-Vorschau",download:"Herunterladen",edit:"Bearbeiten",delete:"Löschen"},modal:{deleteArchive:"Archiv löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',deleteButton:"Löschen",removeSource3mf:"Quell-3MF entfernen",removeSource3mfConfirm:'Möchten Sie die Quell-3MF-Datei wirklich von "{{name}}" entfernen? Die ursprüngliche Slicer-Projektdatei wird gelöscht.',removeButton:"Entfernen",removeF3d:"F3D entfernen",removeF3dConfirm:'Möchten Sie die Fusion 360 Designdatei wirklich von "{{name}}" entfernen?',timelapse:"{{name}} - Zeitraffer",selectTimelapse:"Zeitraffer auswählen",selectTimelapseDesc:"Keine automatische Übereinstimmung gefunden. Wählen Sie den Zeitraffer für diesen Druck:",deleteArchives:"Archive löschen",deleteArchivesConfirm:"Möchten Sie wirklich {{count}} Archiv(e) löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleteCount:"{{count}} löschen"},page:{title:"Archive",printsCount:"{{filtered}} von {{total}} Drucken",dropFilesHere:".3mf-Dateien hier ablegen",releaseToUpload:"Loslassen zum Hochladen",only3mfSupported:"Nur .3mf-Dateien werden unterstützt",close:"Schließen",selected:"{{count}} ausgewählt",selectAll:"Alle auswählen",tags:"Tags",project:"Projekt",favorite:"Favorit",delete:"Löschen",toggledFavorites:"Favoriten für {{count}} Archiv(e) umgeschaltet",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",archivesDeleted:"{{count}} Archiv(e) gelöscht",failedDeleteArchives:"Fehler beim Löschen der Archive",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos"},list:{name:"Name",printer:"Drucker",date:"Datum",size:"Größe",actions:"Aktionen",hasTimelapse:"Hat Zeitraffer"}},queue:{title:"Druckwarteschlange",subtitle:"Planen und verwalten Sie Ihre Druckaufträge",addToQueue:"Zur Warteschlange hinzufügen",print:"Drucken",reprint:"Erneut drucken",schedulePrint:"Druck planen",editQueueItem:"Warteschlangeneintrag bearbeiten",printToPrinters:"Auf {{count}} Druckern drucken",queueToPrinters:"Zu {{count}} Druckern hinzufügen",sending:"Wird gesendet...",sendingProgress:"Sende {{current}}/{{total}}...",adding:"Wird hinzugefügt...",addingProgress:"Füge hinzu {{current}}/{{total}}...",savingProgress:"Speichere {{current}}/{{total}}...",clearQueue:"Warteschlange leeren",clearHistory:"Verlauf löschen",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",startNow:"Jetzt starten",printingInProgress:"Druck läuft...",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",itemCount:"{{count}} Element",itemCount_plural:"{{count}} Elemente",dragToReorder:"Ziehen zum Neuordnen (nur Sofort)",reorderHint:"Position betrifft nur Sofort-Elemente. Geplante Elemente werden zur festgelegten Zeit ausgeführt.",addedBy:"Hinzugefügt von {{name}}",sections:{currentlyPrinting:"Aktuell druckend",queued:"In Warteschlange",history:"Verlauf"},status:{pending:"Ausstehend",waiting:"Wartend",printing:"Druckt",paused:"Pausiert",completed:"Abgeschlossen",failed:"Fehlgeschlagen",skipped:"Übersprungen",cancelled:"Abgebrochen"},summary:{printing:"Druckt",queued:"In Warteschlange",totalTime:"Gesamte Wartezeit",history:"Verlauf"},filter:{allPrinters:"Alle Drucker",unassigned:"Nicht zugewiesen",allStatus:"Alle Status",allLocations:"Alle Standorte",any:"Beliebig"},sort:{byPosition:"Nach Position sortieren",byName:"Nach Name sortieren",byPrinter:"Nach Drucker sortieren",bySchedule:"Nach Zeitplan sortieren",byDate:"Nach Datum sortieren",ascendingOldest:"Aufsteigend (älteste zuerst)",descendingNewest:"Absteigend (neueste zuerst)"},badges:{staged:"Bereitgestellt",requiresPrevious:"Erfordert vorherigen Erfolg",autoPowerOff:"Automatisch ausschalten"},empty:{title:"Keine Drucke geplant",description:'Planen Sie einen Druck von der Archivseite über die Option "Planen" im Kontextmenü oder ziehen Sie Dateien hierher.'},time:{asap:"Sofort",overdue:"Überfällig",now:"Jetzt",lessThanMinute:"In weniger als einer Minute",inMinutes:"In {{count}} Min",inHours:"In {{count}} Stunden"},actions:{stopPrint:"Druck stoppen",startPrint:"Druck starten",requeue:"Erneut einreihen"},bulkEdit:{title:"{{count}} Element bearbeiten",title_plural:"{{count}} Elemente bearbeiten",description:"Nur geänderte Einstellungen werden auf ausgewählte Elemente angewendet.",printer:"Drucker",noChange:"— Keine Änderung —",queueOptions:"Warteschlangenoptionen",staged:"Bereitgestellt (manueller Start)",autoPowerOff:"Nach Druck automatisch ausschalten",requirePrevious:"Vorherigen Erfolg erfordern",printOptions:"Druckoptionen",bedLevelling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",useAms:"AMS verwenden",applyChanges:"Änderungen übernehmen",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",editSelected:"Ausgewählte bearbeiten",cancelSelected:"Ausgewählte abbrechen"},confirm:{cancelTitle:"Geplanten Druck abbrechen",cancelMessage:'Möchten Sie "{{name}}" wirklich abbrechen?',stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck "{{name}}" wirklich stoppen? Der Druckauftrag wird am Drucker abgebrochen.',removeTitle:"Aus Verlauf entfernen",removeMessage:'Möchten Sie "{{name}}" wirklich aus dem Warteschlangenverlauf entfernen?',clearHistoryTitle:"Verlauf löschen",clearHistoryMessage:"Möchten Sie alle {{count}} Element(e) aus dem Verlauf entfernen?",cancelButton:"Druck abbrechen",stopButton:"Druck stoppen",thisPrint:"diesen Druck",thisItem:"dieses Element"},toast:{cancelled:"Warteschlangenelement abgebrochen",cancelFailed:"Element konnte nicht abgebrochen werden",removed:"Warteschlangenelement entfernt",removeFailed:"Element konnte nicht entfernt werden",stopped:"Druck gestoppt",stopFailed:"Druck konnte nicht gestoppt werden",released:"Druck in Warteschlange freigegeben",startFailed:"Druck konnte nicht gestartet werden",reorderFailed:"Warteschlange konnte nicht neu geordnet werden",historyCleared:"{{count}} Verlaufselement(e) gelöscht",clearHistoryFailed:"Verlauf konnte nicht gelöscht werden",updateFailed:"Elemente konnten nicht aktualisiert werden",bulkCancelled:"{{count}} Element(e) abgebrochen",bulkCancelFailed:"Elemente konnten nicht abgebrochen werden"},permissions:{noStopPrint:"Sie haben keine Berechtigung, Drucke zu stoppen",noStartPrint:"Sie haben keine Berechtigung, Drucke zu starten",noEdit:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu bearbeiten",noCancel:"Sie haben keine Berechtigung, dieses Warteschlangenelement abzubrechen",noRequeue:"Sie haben keine Berechtigung, Elemente erneut einzureihen",noRemove:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu entfernen",noClearHistory:"Sie haben keine Berechtigung, den gesamten Verlauf zu löschen",noEditItems:"Sie haben keine Berechtigung, Warteschlangenelemente zu bearbeiten",noCancelItems:"Sie haben keine Berechtigung, Warteschlangenelemente abzubrechen"}},stats:{title:"Dashboard",subtitle:"Widgets zum Neuanordnen ziehen. Auf das Augensymbol klicken zum Ausblenden.",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",printTime:"Druckzeit",totalFilament:"Gesamtverbrauch Filament",filamentUsed:"Filamentverbrauch",filamentCost:"Filamentkosten",totalCost:"Gesamtkosten",energyUsed:"Energieverbrauch",energyCost:"Energiekosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",printsByPrinter:"Drucke nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt",quickStats:"Schnellstatistiken",printActivity:"Druckaktivität",filamentTypes:"Filamenttypen",filamentTrends:"Filamenttrends",failureAnalysis:"Fehleranalyse",timeAccuracy:"Zeitgenauigkeit",successful:"Erfolgreich:",failed:"Fehlgeschlagen:",perfectEstimate:"100% = perfekte Schätzung",noTimeAccuracyData:"Noch keine Zeitgenauigkeitsdaten",noFilamentData:"Keine Filamentdaten verfügbar",noPrinterData:"Keine Druckerdaten verfügbar",noPrintData:"Keine Druckdaten verfügbar",noPrintDataLast30Days:"Keine Druckdaten in den letzten 30 Tagen",failureReasons:"Fehlerursachen",topFailureReasons:"Häufigste Fehlerursachen",failedPrintsCount:"{{failed}} / {{total}} Drucke fehlgeschlagen",lastWeekRate:"Letzte Woche: {{rate}}%",resetLayout:"Layout zurücksetzen",recalculateCosts:"Kosten neu berechnen",recalculateCostsHint:"Alle Archivkosten mit aktuellen Filamentpreisen neu berechnen",exportStats:"Statistiken exportieren",exportAsCsv:"Als CSV exportieren",exportAsExcel:"Als Excel exportieren",hiddenCount:"{{count}} ausgeblendet",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen",layoutReset:"Layout zurückgesetzt",recalculatedCosts:"Kosten für {{count}} Archive neu berechnet",recalculateFailed:"Kosten konnten nicht neu berechnet werden",loadingStats:"Statistiken werden geladen...",noPermissionResetLayout:"Sie haben keine Berechtigung, das Layout zurückzusetzen",noPermissionRecalculate:"Sie haben keine Berechtigung, Kosten neu zu berechnen"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",statusTab:"Status",settingsTab:"Einstellungen",overdueCount:"{{count}} überfällig",dueSoonCount:"{{count}} bald fällig",dueSoon:"Bald fällig",allGood:"Alles in Ordnung",overdueBy:"Überfällig um {{duration}}",dueIn:"Fällig in {{duration}}",timeLeft:"{{duration}} verbleibend",day:"1 Tag",days:"{{count}} Tage",week:"1 Woche",weeks:"{{count}} Wochen",month:"1 Monat",months:"{{count}} Monate",year:"1 Jahr",maintenanceTypes:"Wartungstypen",maintenanceTypesDescription:"Systemtypen und Ihre benutzerdefinierten Wartungsaufgaben",addCustomType:"Benutzerdefinierten Typ hinzufügen",intervalType:"Intervalltyp",intervalValue:"Intervall ({{type}})",icon:"Symbol",documentationLink:"Dokumentationslink (optional)",assignToPrinters:"Druckern zuweisen",selectAtLeastOnePrinter:"Wählen Sie mindestens einen Drucker",addType:"Typ hinzufügen",custom:"Benutzerdefiniert",printHours:"Druckstunden",calendarDays:"Kalendertage",exampleName:"z.B. HEPA-Filter ersetzen",viewDocumentation:"Dokumentation anzeigen",timeBasedInterval:"Zeitbasiertes Intervall",intervalOverrides:"Intervall-Überschreibungen",intervalOverridesDescription:"Intervalle für bestimmte Drucker anpassen",assignedToPrinters:"Druckern zugewiesen:",noPrintersAssigned:"Keine Drucker zugewiesen",addPrinterShort:"Hinzufügen:",printersAssignedClick:"{{count}} Drucker zugewiesen - klicken zum Verwalten",removeFromPrinter:"Von diesem Drucker entfernen",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion",cleanCarbonRods:"Kohlenstoffstangen reinigen",checkPtfeTube:"PTFE-Schlauch prüfen",replaceHepaFilter:"HEPA-Filter ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren"},maintenanceComplete:"Wartung als abgeschlossen markiert",typeUpdated:"Wartungstyp aktualisiert",typeDeleted:"Wartungstyp gelöscht",printHoursUpdated:"Druckstunden aktualisiert",printerAssigned:"Drucker zugewiesen",printerRemoved:"Drucker entfernt",deleteTypeConfirm:'"{{name}}" löschen?',noPermissionUpdate:"Sie haben keine Berechtigung, Wartungselemente zu aktualisieren",noPermissionPerform:"Sie haben keine Berechtigung, Wartungen durchzuführen",noPermissionEditTypes:"Sie haben keine Berechtigung, Wartungstypen zu bearbeiten",noPermissionDeleteTypes:"Sie haben keine Berechtigung, Wartungstypen zu löschen",noPermissionEditHours:"Sie haben keine Berechtigung, Druckstunden zu bearbeiten",noPermissionRemovePrinter:"Sie haben keine Berechtigung, Druckerzuweisungen zu entfernen",noPermissionAssignPrinter:"Sie haben keine Berechtigung, Drucker zuzuweisen",noPermissionEditIntervals:"Sie haben keine Berechtigung, Intervalle zu bearbeiten",configureSettings:"Wartungstypen und Intervalle konfigurieren"},settings:{title:"Einstellungen",general:"Allgemein",tabs:{general:"Allgemein",smartPlugs:"Smart Plugs",notifications:"Benachrichtigungen",filament:"Filament",network:"Netzwerk",apiKeys:"API-Schlüssel",virtualPrinter:"Virtueller Drucker",users:"Benutzer",backup:"Sicherung",globalEmail:"Globale E-Mail"},email:{smtpSettings:"SMTP-Konfiguration",smtpHost:"SMTP-Server",smtpPort:"SMTP-Port",security:"Sicherheit",authentication:"Authentifizierung",username:"Benutzername",password:"Passwort",fromEmail:"Absender-E-Mail",fromName:"Absendername",testConnection:"SMTP-Verbindung testen",testRecipient:"Test-Empfänger-E-Mail",sendTest:"Test-E-Mail senden",sending:"Wird gesendet...",save:"Einstellungen speichern",saving:"Wird gespeichert...",advancedAuth:"Erweiterte Authentifizierung",advancedAuthEnabled:"Erweiterte Authentifizierung ist aktiviert",advancedAuthEnabledDesc:"E-Mail-basierte Benutzerverwaltungsfunktionen sind aktiv. Neue Benutzer erhalten automatisch generierte Passwörter per E-Mail und können ihr Passwort über die Passwort vergessen Funktion zurücksetzen.",advancedAuthDisabled:"Erweiterte Authentifizierung ist deaktiviert",advancedAuthDisabledDesc:"Aktivieren Sie die erweiterte Authentifizierung, um E-Mail-basierte Funktionen für die Benutzerverwaltung zu aktivieren.",enable:"Aktivieren",disable:"Deaktivieren",feature1:"Passwörter werden automatisch generiert und an neue Benutzer gesendet",feature2:"Benutzer können sich mit Benutzername oder E-Mail anmelden",feature3:"Passwort vergessen Funktion ist verfügbar",feature4:"Administratoren können Benutzerpasswörter per E-Mail zurücksetzen"},appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden",noDefaultPrinter:"Kein Standard (jedes Mal fragen)",sidebarOrder:"Seitenleisten-Reihenfolge",saveThumbnails:"Vorschaubilder speichern",captureFinishPhoto:"Abschlussfoto aufnehmen",noPrintersConfigured:"Keine Drucker konfiguriert",archiveMode:{always:"Immer Archiveintrag erstellen",never:"Nie Archiveintrag erstellen",ask:"Jedes Mal fragen"},checkForUpdatesLabel:"Nach Updates suchen",checkPrinterFirmware:"Drucker-Firmware prüfen",enableRetry:"Wiederholung aktivieren",homeAssistantDescription:"Smart Plugs über Home Assistant steuern",mqttConnectedTo:"Verbunden mit",prometheusDescription:"Druckerdaten im Prometheus-Format bereitstellen",noSmartPlugsTitle:"Keine Smart Plugs konfiguriert",noSmartPlugsDescription:"Fügen Sie einen Tasmota-basierten Smart Plug hinzu, um den Energieverbrauch zu verfolgen und die Stromsteuerung zu automatisieren.",noProvidersTitle:"Keine Anbieter konfiguriert",noProvidersDescription:"Fügen Sie einen Anbieter hinzu, um Benachrichtigungen zu erhalten.",noTemplatesAvailable:"Keine Vorlagen verfügbar. Starten Sie das Backend neu, um Standardvorlagen zu laden.",apiPermissionView:"Druckerstatus und Warteschlange anzeigen",apiPermissionEdit:"Elemente zur Druckwarteschlange hinzufügen und entfernen",apiKeysEmptyTitle:"Keine API-Schlüssel",apiKeysEmptyDescription:"Erstellen Sie einen API-Schlüssel zur Integration mit externen Diensten.",noUsersFound:"Keine Benutzer gefunden",noGroupsFound:"Keine Gruppen gefunden",noGroupsAvailable:"Keine Gruppen verfügbar",passwordsDoNotMatch:"Passwörter stimmen nicht überein",systemGroupWarning:"System-Gruppennamen können nicht geändert werden",authDisabledTitle:"Authentifizierung ist deaktiviert",authDisabledFeature1:"Anmeldung zum Zugriff auf das System erforderlich",authDisabledFeature2:"Mehrere Benutzer mit gruppenbasierten Berechtigungen erstellen",authDisabledFeature3:"Zugriff mit über 50 granularen Berechtigungen steuern",userHasCreated:"Dieser Benutzer hat erstellt:",userItemsQuestion:"Was möchten Sie mit diesen Elementen tun?",deleteUserConfirm:"Möchten Sie diesen Benutzer wirklich löschen?",actionCannotBeUndone:"Diese Aktion kann nicht rückgängig gemacht werden.",addFirstSmartPlug:"Ersten Smart Plug hinzufügen",providers:"Anbieter",log:"Protokoll",testAll:"Alle testen",testResults:"Testergebnisse",testPassedCount:"{{count}} bestanden",testFailedCount:"{{count}} fehlgeschlagen",messageTemplates:"Nachrichtenvorlagen",messageTemplatesDescription:"Passen Sie Benachrichtigungen für jedes Ereignis an.",apiKeys:"API-Schlüssel",apiKeysDescription:"Erstellen Sie API-Schlüssel für externe Integrationen und Webhooks.",createKey:"Schlüssel erstellen",apiKeyCreated:"API-Schlüssel erfolgreich erstellt",apiKeyCopyWarning:"Kopieren Sie diesen Schlüssel jetzt - er wird nicht mehr angezeigt!",useInApiBrowser:"Im API-Browser verwenden",createNewApiKey:"Neuen API-Schlüssel erstellen",keyName:"Schlüsselname",keyNamePlaceholder:"z.B. Home Assistant, OctoPrint",readStatus:"Status lesen",readStatusDescription:"Druckerstatus und Warteschlange anzeigen",manageQueue:"Warteschlange verwalten",manageQueueDescription:"Elemente zur Druckwarteschlange hinzufügen und entfernen",controlPrinter:"Drucker steuern",controlPrinterDescription:"Drucke pausieren, fortsetzen und stoppen",unnamedKey:"Unbenannter Schlüssel",lastUsed:"Zuletzt verwendet",read:"Lesen",control:"Steuern",createFirstKey:"Ersten Schlüssel erstellen",webhookEndpoints:"Webhook-Endpunkte",webhookApiKeyHint:"Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.",webhook:{getAllStatus:"Alle Druckerstatus abrufen",getSpecificStatus:"Spezifischen Druckerstatus abrufen",addToQueue:"Zur Druckwarteschlange hinzufügen",pausePrint:"Druck pausieren",resumePrint:"Druck fortsetzen",stopPrint:"Druck stoppen"},apiBrowser:"API-Browser",apiBrowserDescription:"Erkunden und testen Sie alle verfügbaren API-Endpunkte.",apiKeyForTesting:"API-Schlüssel zum Testen",apiKeyPlaceholder:"Fügen Sie hier Ihren API-Schlüssel ein, um authentifizierte Endpunkte zu testen...",apiKeyHint:"Dieser Schlüssel wird als X-API-Key-Header mit Anfragen gesendet.",deleteApiKeyTitle:"API-Schlüssel löschen",deleteApiKeyMessage:"Möchten Sie diesen API-Schlüssel wirklich löschen? Alle Integrationen, die diesen Schlüssel verwenden, funktionieren nicht mehr.",deleteKey:"Schlüssel löschen",amsDisplayThresholds:"AMS-Anzeigeschwellenwerte",amsThresholdsDescription:"Konfigurieren Sie Farbschwellenwerte für AMS-Feuchtigkeits- und Temperaturanzeigen.",humidity:"Luftfeuchtigkeit",goodGreen:"Gut (grün)",fairOrange:"Mittel (orange)",aboveFairBad:"Über dem mittleren Schwellenwert wird rot angezeigt (schlecht)",temperature:"Temperatur",goodBlue:"Gut (blau)",aboveFairHot:"Über dem mittleren Schwellenwert wird rot angezeigt (heiß)",historyRetention:"Verlaufsaufbewahrung",keepSensorHistory:"Sensorverlauf behalten für",historyRetentionDescription:"Ältere Feuchtigkeits- und Temperaturdaten werden automatisch gelöscht",printModal:"Druckdialog",expandCustomMapping:"Benutzerdefinierte Zuordnung standardmäßig erweitern",expandCustomMappingDescription:"Bei Druck auf mehrere Drucker die AMS-Zuordnung pro Drucker erweitert anzeigen",authentication:"Authentifizierung",authEnabledDescription:"Ihre Instanz ist mit Benutzerauthentifizierung gesichert",authDisabledDescription:"Aktivieren Sie die Anmeldepflicht und verwalten Sie den Benutzerzugriff",authDisabledMessage:"Aktivieren Sie die Authentifizierung, um Benutzerkonten zu erstellen, Berechtigungen zu verwalten und Ihre Bambuddy-Instanz zu sichern.",enableAuthentication:"Authentifizierung aktivieren",currentUser:"Aktueller Benutzer",changePassword:"Passwort ändern",admin:"Admin",users:"Benutzer",addUser:"Benutzer hinzufügen",groups:"Gruppen",addGroup:"Gruppe hinzufügen",system:"System",noDescription:"Keine Beschreibung",userCount:"{{count}} Benutzer",permissionCount:"{{count}} Berechtigungen",createUser:"Benutzer erstellen",username:"Benutzername",enterUsername:"Benutzername eingeben",password:"Passwort",enterPassword:"Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",viewReleaseOnGitHub:"Release auf GitHub anzeigen",turnAllPlugsOn:"Alle Stecker einschalten",turnAllPlugsOff:"Alle Stecker ausschalten",clearNotificationLogs:"Benachrichtigungsprotokolle löschen",clearLogsMessage:"Dadurch werden alle Benachrichtigungsprotokolle, die älter als 30 Tage sind, dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",clearLogs:"Protokolle löschen",resetUiPreferences:"UI-Einstellungen zurücksetzen",resetUiPreferencesMessage:"Dadurch werden alle UI-Einstellungen auf Standardwerte zurückgesetzt: Seitenleisten-Reihenfolge, Theme, Dashboard-Layout, Ansichtsmodi und Sortiereinstellungen. Ihre Drucker, Archive und Servereinstellungen werden NICHT beeinträchtigt. Die Seite wird nach dem Löschen neu geladen.",resetPreferences:"Einstellungen zurücksetzen",deleteGroupTitle:"Gruppe löschen",deleteGroupMessage:"Möchten Sie diese Gruppe wirklich löschen? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",deleteGroup:"Gruppe löschen",disableAuthenticationTitle:"Authentifizierung deaktivieren",disableAuthenticationMessage:"Möchten Sie die Authentifizierung wirklich deaktivieren? Dadurch wird Ihre Bambuddy-Instanz ohne Anmeldung zugänglich. Alle Benutzer bleiben in der Datenbank, aber die Authentifizierung wird deaktiviert.",disableAuthentication:"Authentifizierung deaktivieren",configureBambuddy:"Bambuddy konfigurieren",systemDefault:"Systemstandard",archiveSettings:"Archiv-Einstellungen",newWindow:"Neues Fenster",embeddedOverlay:"Eingebettetes Overlay",externalCameras:"Externe Kameras",costTracking:"Kostenverfolgung",printsOnly:"Nur Drucke",totalConsumption:"Gesamtverbrauch",dataManagement:"Datenverwaltung",clearNotificationLogsDescription:"Benachrichtigungsprotokolle älter als 30 Tage löschen",resetUiPreferencesDescription:"Seitenleisten-Reihenfolge, Theme, Ansichtsmodi und Layout-Einstellungen zurücksetzen. Drucker, Archive und Einstellungen werden nicht beeinflusst.",enableHomeAssistant:"Home Assistant aktivieren",enableMqtt:"MQTT aktivieren",useTls:"TLS verwenden",enableMetricsEndpoint:"Metrik-Endpunkt aktivieren",availableMetrics:"Verfügbare Metriken",editUser:"Benutzer bearbeiten",deleteUserTitle:"Benutzer löschen",groupName:"Gruppenname",leaveEmptyForAnonymous:"Leer lassen für anonym",leaveEmptyForNoAuth:"Leer lassen für keine Authentifizierung",enterNewPassword:"Neues Passwort eingeben",confirmNewPassword:"Neues Passwort bestätigen",enterGroupName:"Gruppenname eingeben",enterDescriptionOptional:"Beschreibung eingeben (optional)",enterCurrentPassword:"Aktuelles Passwort eingeben",enterNewPasswordMin6:"Neues Passwort eingeben (min. 6 Zeichen)",toast:{keyCopied:"Schlüssel in Zwischenablage kopiert",copyFailed:"Schlüssel konnte nicht kopiert werden",keyAddedToBrowser:"Schlüssel zum API-Browser hinzugefügt",clearLogsFailed:"Protokolle konnten nicht gelöscht werden",uiPreferencesReset:"UI-Einstellungen zurückgesetzt. Wird neu geladen...",authDisabled:"Authentifizierung erfolgreich deaktiviert",authDisableFailed:"Authentifizierung konnte nicht deaktiviert werden",apiKeyCreated:"API-Schlüssel erstellt",apiKeyDeleted:"API-Schlüssel gelöscht",userCreated:"Benutzer erfolgreich erstellt",userUpdated:"Benutzer erfolgreich aktualisiert",userDeleted:"Benutzer erfolgreich gelöscht",groupCreated:"Gruppe erfolgreich erstellt",groupUpdated:"Gruppe erfolgreich aktualisiert",groupDeleted:"Gruppe erfolgreich gelöscht",fillRequiredFields:"Bitte füllen Sie alle erforderlichen Felder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",enterGroupName:"Bitte geben Sie einen Gruppennamen ein",settingsSaved:"Einstellungen gespeichert",cameraSettingsSaved:"Kamera-Einstellungen gespeichert",enterCameraUrl:"Bitte geben Sie eine Kamera-URL ein",passwordChanged:"Passwort erfolgreich geändert",connectionFailed:"Verbindung fehlgeschlagen",testFailed:"Test fehlgeschlagen",cameraConnected:"Kamera verbunden{{resolution}}"},testConnection:"Verbindung testen"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},hmsErrors:{title:"Fehler - {{name}}",noErrors:"Keine Fehler",viewOnWiki:"Im Bambu Lab Wiki ansehen",clearInstructions:"Löschen Sie die Fehler am Drucker, um sie hier zu entfernen."},mqttDebug:{title:"MQTT-Debug-Protokoll",searchPlaceholder:"Topic oder Payload suchen...",noMessages:"Noch keine Nachrichten protokolliert",startLoggingHint:'Klicken Sie auf "Protokollierung starten", um MQTT-Nachrichten aufzuzeichnen',noMessagesMatch:"Keine Nachrichten entsprechen Ihrem Filter",adjustFilterHint:"Versuchen Sie, Ihre Such- oder Filterkriterien anzupassen",incoming:"Eingehend",outgoing:"Ausgehend",loggingStopped:"Protokollierung gestoppt",loggingActive:"Protokollierung aktiv - Nachrichten werden automatisch aktualisiert",startLogging:"Protokollierung starten",stopLogging:"Protokollierung stoppen",clearLog:"Protokoll löschen",topic:"Topic",timestamp:"Zeitstempel",direction:"Richtung",all:"Alle"},printerFiles:{title:"Dateimanager",storageUsed:"Belegt:",storageFree:"Frei:",filterPlaceholder:"Dateien filtern...",deleteButton:"Löschen",deleteFiles:"{{count}} Dateien löschen",deleteFileConfirm:'"{{name}}" löschen? Dies kann nicht rückgängig gemacht werden.',deleteFilesConfirm:"{{count}} ausgewählte Dateien löschen? Dies kann nicht rückgängig gemacht werden.",noFiles:"Keine Dateien auf dem Drucker",loadingFiles:"Dateien werden geladen...",failedToLoad:"Dateien konnten nicht geladen werden",toast:{filesDeleted:"{{count}} Datei(en) gelöscht",deleteFailed:"Löschen fehlgeschlagen: {{error}}"}},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"},login:{title:"Bambuddy Anmeldung",subtitle:"Melden Sie sich bei Ihrem Konto an",username:"Benutzername",usernamePlaceholder:"Benutzername eingeben",usernameOrEmail:"Benutzername oder E-Mail",usernameOrEmailPlaceholder:"Benutzername oder @ E-Mail",password:"Passwort",passwordPlaceholder:"Passwort eingeben",signIn:"Anmelden",signingIn:"Anmeldung läuft...",forgotPassword:"Passwort vergessen?",loginSuccess:"Erfolgreich angemeldet",loginFailed:"Anmeldung fehlgeschlagen",enterCredentials:"Bitte Benutzername und Passwort eingeben",forgotPasswordTitle:"Passwort vergessen",forgotPasswordMessage:"Wenn Sie Ihr Passwort vergessen haben, wenden Sie sich bitte an Ihren Systemadministrator.",forgotPasswordEmailMessage:"Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen ein neues Passwort.",emailAddress:"E-Mail-Adresse",emailPlaceholder:"ihre.email@beispiel.de",cancel:"Abbrechen",sending:"Wird gesendet...",sendResetEmail:"Zurücksetzungs-E-Mail senden",howToReset:"So setzen Sie Ihr Passwort zurück:",resetStep1:"Kontaktieren Sie Ihren Bambuddy-Administrator",resetStep2:"Bitten Sie ihn, Ihr Passwort in der Benutzerverwaltung zurückzusetzen",resetStep3:"Er kann ein neues temporäres Passwort für Sie festlegen",resetStep4:"Melden Sie sich mit dem neuen Passwort an und ändern Sie es in den Einstellungen",gotIt:"Verstanden"},setup:{title:"Bambuddy Einrichtung",subtitle:"Konfigurieren Sie die Authentifizierung für Ihre Bambuddy-Instanz",enableAuth:"Authentifizierung aktivieren",adminAccount:"Admin-Konto",adminAccountDesc:"Wenn bereits Admin-Benutzer existieren, wird die Authentifizierung mit den vorhandenen Admin-Konten aktiviert. Lassen Sie die Felder unten leer, um vorhandene Admins zu verwenden, oder geben Sie neue Anmeldedaten ein, um einen neuen Admin-Benutzer zu erstellen.",adminUsername:"Admin-Benutzername",adminPassword:"Admin-Passwort",optionalIfAdminExists:"(optional, wenn Admin-Benutzer existieren)",adminUsernamePlaceholder:"Admin-Benutzernamen eingeben (optional)",adminPasswordPlaceholder:"Admin-Passwort eingeben (optional)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Admin-Passwort bestätigen",settingUp:"Einrichtung läuft...",completeSetup:"Einrichtung abschließen",toast:{authEnabledAdminCreated:"Authentifizierung aktiviert und Admin-Benutzer erstellt",authEnabledExistingAdmins:"Authentifizierung mit vorhandenen Admin-Benutzern aktiviert",setupCompleted:"Einrichtung abgeschlossen",enterBothCredentials:"Bitte geben Sie sowohl Admin-Benutzernamen als auch Passwort ein, oder lassen Sie beide leer, um vorhandene Admin-Benutzer zu verwenden",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"}},changePassword:{title:"Passwort ändern",currentPassword:"Aktuelles Passwort",currentPasswordPlaceholder:"Aktuelles Passwort eingeben",newPassword:"Neues Passwort",newPasswordPlaceholder:"Neues Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Neues Passwort bestätigen",confirmPasswordPlaceholder:"Neues Passwort bestätigen",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",changing:"Wird geändert...",success:"Passwort erfolgreich geändert",failed:"Passwortänderung fehlgeschlagen"},plateAlert:{title:"Druck pausiert!",message:"Objekte auf dem Druckbett erkannt. Der Druck wurde automatisch pausiert. Bitte räumen Sie das Druckbett und setzen Sie den Druck fort.",understand:"Verstanden"},camera:{title:"Kameraansicht",invalidPrinterId:"Ungültige Drucker-ID",live:"Live",snapshot:"Schnappschuss",restartStream:"Stream neu starten",refreshSnapshot:"Schnappschuss aktualisieren",fullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",connectingToCamera:"Verbinde mit Kamera...",capturingSnapshot:"Schnappschuss wird aufgenommen...",connectionLost:"Verbindung verloren",connectionFailed:"Kameraverbindung fehlgeschlagen",reconnecting:"Neuverbindung in {{countdown}}s... (Versuch {{attempt}}/{{max}})",reconnectNow:"Jetzt verbinden",cameraUnavailable:"Kamera nicht verfügbar",cameraUnavailableDesc:"Stellen Sie sicher, dass der Drucker eingeschaltet und verbunden ist.",noCamera:"Keine Kamera verfügbar",retry:"Erneut versuchen",cameraStream:"Kamera-Stream",zoomOut:"Verkleinern",zoomIn:"Vergrößern",resetZoom:"Zoom zurücksetzen",recording:"Aufnahme",startRecording:"Aufnahme starten",stopRecording:"Aufnahme stoppen"},groups:{title:"Gruppenverwaltung",subtitle:"Berechtigungsgruppen für Zugriffskontrolle verwalten",backToSettings:"Zurück zu Einstellungen",createGroup:"Gruppe erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",system:"System",noDescription:"Keine Beschreibung",usersCount:"{{count}} Benutzer",permissionsCount:"{{count}} Berechtigungen",edit:"Bearbeiten",delete:"Löschen",toast:{created:"Gruppe erfolgreich erstellt",updated:"Gruppe erfolgreich aktualisiert",deleted:"Gruppe erfolgreich gelöscht",enterGroupName:"Bitte geben Sie einen Gruppennamen ein"},modal:{editGroup:"Gruppe bearbeiten",createGroup:"Gruppe erstellen",cancel:"Abbrechen",saving:"Speichern...",creating:"Erstellen...",saveChanges:"Änderungen speichern"},form:{groupName:"Gruppenname",groupNamePlaceholder:"Gruppennamen eingeben",systemGroupWarning:"Systemgruppennamen können nicht geändert werden",description:"Beschreibung",descriptionPlaceholder:"Beschreibung eingeben (optional)",permissions:"Berechtigungen ({{count}} ausgewählt)"},deleteModal:{title:"Gruppe löschen",message:"Sind Sie sicher, dass Sie diese Gruppe löschen möchten? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",confirm:"Gruppe löschen"}},users:{title:"Benutzerverwaltung",subtitle:"Benutzer und deren Zugriff auf Ihre Bambuddy-Instanz verwalten",backToSettings:"Zurück zu Einstellungen",createUser:"Benutzer erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",admin:"Admin",noGroups:"Keine Gruppen",active:"Aktiv",inactive:"Inaktiv",edit:"Bearbeiten",delete:"Löschen",system:"System",noGroupsAvailable:"Keine Gruppen verfügbar",table:{username:"Benutzername",groups:"Gruppen",status:"Status",actions:"Aktionen"},toast:{created:"Benutzer erfolgreich erstellt",updated:"Benutzer erfolgreich aktualisiert",deleted:"Benutzer erfolgreich gelöscht",fillRequired:"Bitte füllen Sie alle Pflichtfelder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"},modal:{createUser:"Benutzer erstellen",editUser:"Benutzer bearbeiten",cancel:"Abbrechen",creating:"Erstellen...",saving:"Speichern...",saveChanges:"Änderungen speichern",advancedAuthSubtitle:"mit erweiterter Authentifizierung"},form:{username:"Benutzername",usernamePlaceholder:"Benutzernamen eingeben",email:"E-Mail",emailPlaceholder:"benutzer@beispiel.de",password:"Passwort",passwordPlaceholder:"Passwort eingeben",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",newPasswordPlaceholder:"Neues Passwort eingeben",confirmNewPasswordPlaceholder:"Neues Passwort bestätigen",leaveBlankToKeep:"leer lassen, um das aktuelle zu behalten",groups:"Gruppen",optional:"optional",autoGeneratedPassword:"Ein sicheres Passwort wird automatisch generiert und per E-Mail an den Benutzer gesendet.",passwordManagedByAdvancedAuth:'Das Passwort wird durch erweiterte Authentifizierung verwaltet. Verwenden Sie "Passwort zurücksetzen", um ein neues Passwort per E-Mail an den Benutzer zu senden.'},deleteModal:{title:"Benutzer löschen",message:"Sind Sie sicher, dass Sie diesen Benutzer löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",confirm:"Benutzer löschen"}},streamOverlay:{title:"Stream-Overlay",invalidPrinterId:"Ungültige Drucker-ID",cameraStream:"Kamera-Stream",progress:"Fortschritt",eta:"ETA",tomorrow:"Morgen",printerIdle:"Drucker ist inaktiv",printerOffline:"Drucker offline",status:{printing:"Druckt",paused:"Pausiert",finished:"Fertig",failed:"Fehlgeschlagen",idle:"Inaktiv",unknown:"Unbekannt"}},profiles:{title:"Profile",subtitle:"Verwalten Sie Ihre Slicer-Voreinstellungen und Druckvorschub-Kalibrierungen",tabs:{cloud:"Cloud-Profile",kprofiles:"K-Profile"},connectedAs:"Verbunden als",logout:"Abmelden",noLogoutPermission:"Sie haben keine Berechtigung zum Abmelden",failedToLoad:"Profile konnten nicht geladen werden",retry:"Erneut versuchen",time:{justNow:"Gerade eben",minsAgo:"vor {{count}}m",hoursAgo:"vor {{count}}h",daysAgo:"vor {{count}}d"},toast:{loggedOut:"Abgemeldet"},login:{title:"Mit Bambu Cloud verbinden",subtitle:"Synchronisieren Sie Ihre Slicer-Voreinstellungen geräteübergreifend",email:"E-Mail",password:"Passwort",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Bestätigungscode",totpCode:"Authenticator-Code",checkEmail:"Prüfen Sie Ihre E-Mail ({{email}}) für einen 6-stelligen Code",enterTotpHint:"Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",accessToken:"Zugriffstoken",accessTokenHint:"Fügen Sie Ihr Bambu Lab Zugriffstoken ein (aus Bambu Studio)",back:"Zurück",loginButton:"Anmelden",verifyButton:"Bestätigen",setTokenButton:"Token setzen",useToken:"Stattdessen Zugriffstoken verwenden",useEmail:"Stattdessen mit E-Mail anmelden",toast:{loggedIn:"Erfolgreich angemeldet",codeSent:"Bestätigungscode an Ihre E-Mail gesendet",enterTotp:"Geben Sie den Code aus Ihrer Authenticator-App ein",tokenSet:"Token erfolgreich gesetzt"}},presets:{myPreset:"Mein Profil (bearbeitbar)",duplicate:"Duplizieren",editable:"Bearbeitbar",failedToLoadDetails:"Profil-Details konnten nicht geladen werden",deleteConfirm:"Dieses Profil löschen?",deleteWarning:'"{{name}}" wird dauerhaft aus Bambu Cloud gelöscht. Dies kann nicht rückgängig gemacht werden.',noDuplicatePermission:"Sie haben keine Berechtigung zum Duplizieren von Profilen",noEditPermission:"Sie haben keine Berechtigung zum Bearbeiten von Profilen",noDeletePermission:"Sie haben keine Berechtigung zum Löschen von Profilen",types:{filament:"Filament-Profil",printer:"Drucker-Profil",process:"Prozess-Profil"},toast:{deleted:"Profil gelöscht",created:"Profil erstellt",updated:"Profil aktualisiert",duplicated:"Profil dupliziert",fieldAdded:'Feld "{{key}}" hinzugefügt',exported:"Profil exportiert"},baseLabel:"Basis: {{name}}",currentLabel:"Aktuell: {{name}}",newPreset:"Neues Profil",editPreset:"Profil bearbeiten",duplicatePreset:"Profil duplizieren",createNewPreset:"Neues Profil erstellen",customizeSettings:"Passen Sie die Einstellungen für Ihr neues Profil an",compareWithBase:"Mit Basis-Profil vergleichen",compare:"Vergleichen",basePreset:"Basis-Profil",selectBasePreset:"Basis-Profil auswählen...",presetName:"Profilname",myCustomPreset:"Mein eigenes Profil",inheritsFrom:"Erbt von",dropJsonToImport:"JSON zum Importieren ablegen",tabs:{common:"Allgemein",allFields:"Alle Felder"},availableFields:"Verfügbare Felder",searchFieldsPlaceholder:"Felder suchen...",noMatchingFields:"Keine passenden Felder",allFieldsAdded:"Alle Felder hinzugefügt",addCustomField:"Eigenes Feld hinzufügen",yourOverrides:"Ihre Überschreibungen",noOverridesYet:"Noch keine Überschreibungen",clickFieldsToAdd:"Klicken Sie links auf Felder, um sie hinzuzufügen",saveAsTemplate:"Als Vorlage speichern",jsonTip:"Tipp: Ziehen Sie eine .json-Datei auf dieses Fenster, um Einstellungen zu importieren"},cloudView:{searchPlaceholder:"Profile suchen...",templates:"Vorlagen",refresh:"Aktualisieren",newPreset:"Neues Profil",clearFilters:"Filter zurücksetzen",compareMode:"Vergleichsmodus",selectAnotherPreset:"Wählen Sie ein weiteres {{type}}-Profil",clickTwoPresets:"Klicken Sie auf zwei Profile des gleichen Typs zum Vergleichen",selectFirst:"1. Erstes auswählen",selectSecond:"2. Zweites auswählen",compareNow:"Jetzt vergleichen",lastSynced:"Zuletzt synchronisiert:",showingCount:"{{showing}} von {{total}} Profilen",noPresetsFound:"Keine Profile gefunden",columns:{filament:"Filament",process:"Prozess",printer:"Drucker"},noFilamentPresets:"Keine Filament-Profile",noProcessPresets:"Keine Prozess-Profile",noPrinterPresets:"Keine Drucker-Profile",filters:{type:"Typ",owner:"Besitzer",printer:"Drucker",nozzle:"Düse",filament:"Filament",layer:"Schicht",all:"Alle",myPresets:"Meine Profile",builtIn:"Voreingestellt",process:"Prozess"},noTemplatesPermission:"Sie haben keine Berechtigung, Vorlagen zu verwalten",noRefreshPermission:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreatePermission:"Sie haben keine Berechtigung, Profile zu erstellen"},templates:{title:"Schnellvorlagen",noTemplates:"Noch keine Vorlagen",createFirst:"Erstellen Sie Vorlagen aus dem Preset-Editor",typeFilter:"Typ:",deleteTitle:"Vorlage löschen",deleteWarning:"Diese Aktion kann nicht rückgängig gemacht werden",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',namePlaceholder:"Vorlagenname",descriptionPlaceholder:"Beschreibung",settingsJson:"Einstellungen (JSON)",fieldsCount:"{{count}} Felder",shownInModals:"In Dialogen angezeigt",hiddenInModals:"In Dialogen ausgeblendet",apply:"Anwenden",toast:{deleted:"Vorlage gelöscht",updated:"Vorlage aktualisiert",created:"Vorlage erstellt",applied:"Vorlage angewendet"}}},support:{debugLoggingActive:"Debug-Protokollierung ist aktiv",manageLogs:"Verwalten"},fileManager:{title:"Dateimanager",subtitle:"Organisieren und verwalten Sie Ihre Druckdateien",uploadFiles:"Dateien hochladen",newFolder:"Neuer Ordner",folderName:"Ordnername",folderNamePlaceholder:"z.B. Funktionsteile",renameFile:"Datei umbenennen",renameFolder:"Ordner umbenennen",moveFiles:"{{count}} Datei(en) verschieben",rootNoFolder:"Stammverzeichnis (Kein Ordner)",current:"aktuell",linkFolder:"Ordner verknüpfen",linkFolderDescription:'"{{name}}" mit einem Projekt oder Archiv verknüpfen für schnellen Zugriff.',project:"Projekt",archive:"Archiv",noProjectsFound:"Keine Projekte gefunden",noArchivesFound:"Keine Archive gefunden",unlink:"Verknüpfung aufheben",link:"Verknüpfen",dragDropFiles:"Dateien hierher ziehen",dropFilesHere:"Dateien hier ablegen",orClickToBrowse:"oder klicken zum Durchsuchen",allFileTypesSupported:"Alle Dateitypen werden unterstützt. ZIP-Dateien werden extrahiert.",zipFilesDetected:"ZIP-Dateien erkannt",zipExtractOptions:"ZIP-Dateien werden extrahiert. Wählen Sie, wie die Ordnerstruktur behandelt werden soll:",preserveZipStructure:"Ordnerstruktur aus ZIP beibehalten",createFolderFromZip:"Ordner aus ZIP-Dateiname erstellen",stlThumbnailGeneration:"STL-Vorschaubildgenerierung",zipMayContainStl:"ZIP-Dateien können STL-Dateien enthalten. Vorschaubilder können während der Extraktion generiert werden.",thumbnailsCanBeGenerated:"Vorschaubilder können für STL-Dateien generiert werden. Große Modelle benötigen möglicherweise mehr Zeit.",generateThumbnailsForStl:"Vorschaubilder für STL-Dateien generieren",threemfDetected:"3MF-Dateien erkannt",threemfExtractionInfo:"Druckermodell, Material, Farbe und Druckeinstellungen werden automatisch aus 3MF-Dateien extrahiert.",willBeExtracted:"Wird extrahiert",filesExtracted:"{{count}} Dateien extrahiert",uploadComplete:"Upload abgeschlossen: {{succeeded}} erfolgreich",uploadFailed:"{{count}} fehlgeschlagen",uploading:"Hochladen...",changeLink:"Verknüpfung ändern...",linkTo:"Verknüpfen mit...",linkToProjectOrArchive:"Mit Projekt oder Archiv verknüpfen",addToQueue:"Zur Warteschlange",schedulePrint:"Planen",generateThumbnail:"Vorschaubild generieren",generateThumbnails:"Vorschaubilder generieren",generateThumbnailsForMissing:"Vorschaubilder für STL-Dateien ohne Vorschau generieren",gridView:"Rasteransicht",listView:"Listenansicht",lowDiskSpaceWarning:"Warnung: Wenig Speicherplatz",lowDiskSpaceDetails:"Nur {{free}} frei von {{total}} gesamt. Schwellenwert ist auf {{threshold}} GB eingestellt.",files:"Dateien",folders:"Ordner",size:"Größe",free:"Frei",allFiles:"Alle Dateien",wrap:"Umbrechen",enableTextWrapping:"Textumbruch aktivieren",disableTextWrapping:"Textumbruch deaktivieren",dragToResizeTooltip:"Ziehen zum Ändern der Größe, Doppelklick zum Zurücksetzen",searchFiles:"Dateien suchen...",allTypes:"Alle Typen",prints:"Drucke",ascending:"Aufsteigend",descending:"Absteigend",resultsCount:"{{showing}} von {{total}} Dateien",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",adding:"Hinzufügen...",loadingFiles:"Dateien werden geladen...",folderIsEmpty:"Ordner ist leer",noFilesYet:"Noch keine Dateien",folderEmptyDescription:"Laden Sie Dateien hoch oder verschieben Sie Dateien in diesen Ordner.",noFilesDescription:"Laden Sie Dateien hoch, um Ihre Druckdateien zu organisieren.",noMatchingFiles:"Keine passenden Dateien",noMatchingFilesDescription:"Keine Dateien entsprechen Ihren aktuellen Such- oder Filterkriterien.",clearFilters:"Filter zurücksetzen",printedCount:"{{count}}x gedruckt",uploadedBy:"Hochgeladen von",deleteFolder:"Ordner löschen",deleteFile:"Datei löschen",deleteFilesCount:"{{count}} Dateien löschen",deleteFolderConfirm:"Möchten Sie diesen Ordner wirklich löschen? Alle Dateien darin werden ebenfalls gelöscht.",deleteFileConfirm:"Möchten Sie diese Datei wirklich löschen?",deleteFilesConfirm:"Möchten Sie {{count}} ausgewählte Dateien wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleting:"Wird gelöscht...",noPermissionRenameFolder:"Sie haben keine Berechtigung, Ordner umzubenennen",noPermissionLinkFolder:"Sie haben keine Berechtigung, Ordner zu verknüpfen",noPermissionDeleteFolder:"Sie haben keine Berechtigung, Ordner zu löschen",noPermissionPrint:"Sie haben keine Berechtigung zum Drucken",noPermissionAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noPermissionDownload:"Sie haben keine Berechtigung, Dateien herunterzuladen",noPermissionRenameFile:"Sie haben keine Berechtigung, diese Datei umzubenennen",noPermissionGenerateThumbnail:"Sie haben keine Berechtigung, Vorschaubilder zu generieren",noPermissionDeleteFile:"Sie haben keine Berechtigung, diese Datei zu löschen",noPermissionCreateFolder:"Sie haben keine Berechtigung, Ordner zu erstellen",noPermissionUpload:"Sie haben keine Berechtigung, Dateien hochzuladen",noPermissionMoveFiles:"Sie haben keine Berechtigung, Dateien zu verschieben",noPermissionDeleteFiles:"Sie haben keine Berechtigung, Dateien zu löschen",toast:{folderCreated:"Ordner erstellt",folderDeleted:"Ordner gelöscht",fileDeleted:"Datei gelöscht",filesDeleted:"{{count}} Dateien gelöscht",filesMoved:"Dateien verschoben",folderLinked:"Ordner verknüpft",folderUnlinked:"Ordnerverknüpfung aufgehoben",addedToQueue:"{{count}} Datei(en) zur Warteschlange hinzugefügt",addedToQueuePartial:"{{added}} Datei(en) hinzugefügt, {{failed}} fehlgeschlagen",failedToAddToQueue:"Fehler beim Hinzufügen: {{error}}",fileRenamed:"Datei umbenannt",folderRenamed:"Ordner umbenannt",thumbnailsGenerated:"{{count}} Vorschaubild(er) generiert",thumbnailsGeneratedPartial:"{{succeeded}} Vorschaubild(er) generiert, {{failed}} fehlgeschlagen",noStlMissingThumbnails:"Keine STL-Dateien ohne Vorschaubild",failedToGenerateThumbnails:"Fehler beim Generieren der Vorschaubilder: {{error}}",thumbnailGenerated:"Vorschaubild generiert",failedToGenerateThumbnail:"Fehler beim Generieren des Vorschaubildes: {{error}}"}},projects:{title:"Projekte",subtitle:"Organisieren und verfolgen Sie Ihre 3D-Druckprojekte",newProject:"Neues Projekt",editProject:"Projekt bearbeiten",deleteProject:"Projekt löschen",projectName:"Projektname",description:"Beschreibung",noProjects:"Noch keine Projekte",noProjectsFiltered:"Keine {{status}} Projekte",noProjectsFilteredHelp:"Sie haben keine {{status}} Projekte. Projekte werden hier angezeigt, wenn sich ihr Status ändert.",createFirst:"Erstellen Sie Ihr erstes Projekt, um verwandte Drucke zu organisieren, den Fortschritt zu verfolgen und Ihre Builds zu verwalten.",createFirstButton:"Erstes Projekt erstellen",create:"Erstellen",files:"Dateien",prints:"Drucke",plates:"Platten",parts:"Teile",lastModified:"Zuletzt geändert",deleteConfirm:"Möchten Sie dieses Projekt wirklich löschen? Archive und Warteschlangenelemente werden getrennt, aber nicht gelöscht.",addFiles:"Dateien hinzufügen",removeFile:"Datei entfernen",viewDetails:"Details anzeigen",namePlaceholder:"z.B. Voron 2.4 Build",descriptionPlaceholder:"Optionale Beschreibung...",color:"Farbe",targetPlates:"Ziel-Platten",targetPlatesPlaceholder:"z.B. 25",targetPlatesHelp:"Anzahl der Druckaufträge",targetParts:"Ziel-Teile",targetPartsPlaceholder:"z.B. 150",targetPartsHelp:"Benötigte Objekte insgesamt",tagsLabel:"Tags (kommagetrennt)",tagsPlaceholder:"z.B. voron, funktional, geschenk",dueDate:"Fälligkeitsdatum",priority:"Priorität",priorityLow:"Niedrig",priorityNormal:"Normal",priorityHigh:"Hoch",priorityUrgent:"Dringend",statusActive:"Aktiv",statusCompleted:"Abgeschlossen",statusArchived:"Archiviert",done:"Fertig",completed:"abgeschlossen",failed:"fehlgeschlagen",inQueue:"in Warteschlange",noPrintsYet:"Noch keine Drucke",printJobs:"Druckaufträge (Platten)",partsPrinted:"Gedruckte Teile",failedParts:"Fehlgeschlagene Teile",import:"Importieren",export:"Exportieren",importProject:"Projekt importieren",exportAll:"Alle Projekte exportieren",loading:"Projekte werden geladen...",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Projekte zu löschen",noCreatePermission:"Sie haben keine Berechtigung, Projekte zu erstellen",noImportPermission:"Sie haben keine Berechtigung, Projekte zu importieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",toast:{created:"Projekt erstellt",updated:"Projekt aktualisiert",deleted:"Projekt gelöscht",imported:"Projekt importiert",multipleImported:"{{count}} Projekte importiert",importFailed:"Import fehlgeschlagen",exported:"Projekte exportiert (nur Metadaten)"}},projectDetail:{notFound:"Projekt nicht gefunden",backToProjects:"Zurück zu Projekten",export:"Exportieren",exportProject:"Projekt exportieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",partOf:"Teil von:",priorityLabel:"Priorität:",noPrints:"Noch keine Drucke in diesem Projekt",status:{active:"Aktiv",completed:"Abgeschlossen",archived:"Archiviert"},priority:{low:"Niedrig",normal:"Normal",high:"Hoch",urgent:"Dringend"},dueDate:{overdue:"Überfällig",today:"Heute fällig",daysLeft:"{{count}} Tage übrig"},progress:{platesProgress:"Platten-Fortschritt",partsProgress:"Teile-Fortschritt",printJobs:"Druckaufträge",parts:"Teile",percentComplete:"{{percent}}% abgeschlossen",remaining:"{{count}} verbleibend"},stats:{printJobs:"Druckaufträge",total:"gesamt",failed:"{{count}} fehlgeschlagen",partsPrinted:"{{count}} Teile gedruckt",printTime:"Druckzeit",filamentUsed:"Filament verbraucht"},cost:{title:"Kostenverfolgung",filamentCost:"Filamentkosten",energy:"Energie",budget:"Budget",remaining:"Verbleibend"},subProjects:{title:"Unterprojekte ({{count}})"},notes:{title:"Notizen",noEditPermission:"Sie haben keine Berechtigung, Notizen zu bearbeiten",placeholder:"Notizen zu diesem Projekt hinzufügen...",empty:"Noch keine Notizen. Klicken Sie auf Bearbeiten, um Notizen hinzuzufügen."},files:{title:"Dateien",linkFolders:"Ordner aus dem Dateimanager verknüpfen",forQuickAccess:"für schnellen Zugriff auf dieses Projekt.",fileCount:"{{count}} Datei(en)",empty:"Keine Ordner verknüpft. Gehen Sie zum Dateimanager und verknüpfen Sie einen Ordner mit diesem Projekt."},bom:{title:"Stückliste",acquired:"{{completed}}/{{total}} beschafft",showAll:"Alle anzeigen",hideDone:"Erledigte ausblenden",addPart:"Teil hinzufügen",noAddPermission:"Sie haben keine Berechtigung, Teile hinzuzufügen",partNamePlaceholder:"Teilename (z.B. M3x8 Schrauben)",partName:"Teilename",qty:"Menge",price:"Preis ({{currency}})",sourcingUrlPlaceholder:"Bezugsquelle-URL (optional)",remarksPlaceholder:"Bemerkungen (optional)",deletePart:"Teil löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',noUpdatePermission:"Sie haben keine Berechtigung, Teile zu aktualisieren",noEditPermission:"Sie haben keine Berechtigung, Teile zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Teile zu löschen",totalCost:"Gesamtkosten:",empty:"Keine Teile in der Stückliste. Fügen Sie Hardware, Elektronik oder andere Komponenten hinzu, um zu verfolgen, was beschafft werden muss."},timeline:{title:"Aktivitätsverlauf",empty:"Noch keine Aktivität."},template:{saveAsTemplate:"Als Vorlage speichern",noCreatePermission:"Sie haben keine Berechtigung, Vorlagen zu erstellen"},queue:{title:"Warteschlange",viewAll:"Alle anzeigen",printing:"{{count}} druckend",queued:"{{count}} in Warteschlange"},prints:{title:"Drucke ({{count}})"},toast:{projectUpdated:"Projekt aktualisiert",partAdded:"Teil hinzugefügt",partRemoved:"Teil entfernt",exportFailed:"Export fehlgeschlagen",projectExported:"Projekt exportiert",templateCreated:"Vorlage erstellt"}},system:{title:"Systeminformationen",version:"Version",uptime:"Laufzeit",cpuUsage:"CPU-Auslastung",memoryUsage:"Speicherauslastung",diskUsage:"Festplattenauslastung",networkInfo:"Netzwerkinformationen",logs:"Protokolle",debugMode:"Debug-Modus",enableDebug:"Debug-Protokollierung aktivieren",disableDebug:"Debug-Protokollierung deaktivieren",downloadLogs:"Protokolle herunterladen",clearLogs:"Protokolle löschen",dockerInfo:"Docker-Info",containerName:"Container-Name",imageName:"Image-Name",platform:"Plattform",architecture:"Architektur"},library:{title:"Filament-Bibliothek",addFilament:"Filament hinzufügen",editFilament:"Filament bearbeiten",deleteFilament:"Filament löschen",vendor:"Hersteller",material:"Material",color:"Farbe",kFactor:"K-Faktor",temperature:"Temperatur",noFilaments:"Keine Filamente in der Bibliothek",deleteConfirm:"Möchten Sie dieses Filament wirklich löschen?",importFromPrinter:"Vom Drucker importieren",exportToFile:"In Datei exportieren"},spoolman:{title:"Spoolman-Integration",enabled:"Spoolman aktiviert",url:"Spoolman URL",connected:"Verbunden",disconnected:"Nicht verbunden",testConnection:"Verbindung testen",sync:"Synchronisieren",syncing:"Synchronisiert...",lastSync:"Letzte Synchronisierung",linkToSpoolman:"Mit Spoolman verknüpfen",openInSpoolman:"In Spoolman öffnen",unlinkSpool:"Spule trennen",selectSpool:"Spule auswählen",noUnlinkedSpools:"Keine nicht verknüpften Spulen verfügbar",linkSuccess:"Spule erfolgreich mit Spoolman verknüpft",linkFailed:"Verknüpfung mit Spoolman fehlgeschlagen",spoolId:"Spulen-ID",weight:"Gewicht",remaining:"Verbleibend",disableWeightSync:"AMS-Gewichtsschätzung deaktivieren",disableWeightSyncDesc:"Verbleibende Kapazität nicht aus AMS-Schätzungen aktualisieren. Verwenden Sie dies, wenn Sie die Verbrauchserfassung von Spoolman gegenüber den prozentualen AMS-Schätzungen bevorzugen. Neue Spulen verwenden weiterhin die AMS-Schätzung als Anfangsgewicht.",reportPartialUsage:"Teilverbrauch bei fehlgeschlagenen Drucken melden",reportPartialUsageDesc:"Wenn ein Druck fehlschlägt oder abgebrochen wird, den geschätzten Filamentverbrauch bis zu diesem Zeitpunkt basierend auf dem Schichtfortschritt melden."},timelapse:{title:"Zeitraffer",create:"Zeitraffer erstellen",download:"Herunterladen",delete:"Löschen",preview:"Vorschau",frameRate:"Bildrate",quality:"Qualität",processing:"Wird verarbeitet...",noTimelapses:"Keine Zeitraffer verfügbar"},ams:{title:"AMS",slot:"Slot",empty:"Leer",emptySlot:"Leerer Slot",unknown:"Unbekannt",humidity:"Luftfeuchtigkeit",temperature:"Temperatur",filamentType:"Filamenttyp",filamentColor:"Farbe",remaining:"Verbleibend",history:"AMS-Verlauf",noHistory:"Kein Verlauf verfügbar",configureSlot:"Slot konfigurieren",externalSpool:"Externe Spule",profile:"Profil",kFactor:"K-Faktor",fill:"Füllstand",configure:"Konfigurieren"},printModal:{title:"Druck starten",selectPrinter:"Drucker auswählen",selectPlate:"Platte auswählen",filamentMapping:"Filamentzuordnung",printSettings:"Druckeinstellungen",bedLeveling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",startPrint:"Druck starten",addToQueue:"Zur Warteschlange hinzufügen",cancel:"Abbrechen",noPrintersAvailable:"Keine Drucker verfügbar",printerBusy:"Drucker ist beschäftigt",printerOffline:"Drucker ist offline"},backup:{title:"Sichern & Wiederherstellen",createBackup:"Sicherung erstellen",restoreBackup:"Sicherung wiederherstellen",restoreDescription:"Alle Daten aus einer Sicherungsdatei ersetzen",downloadBackup:"Sicherung herunterladen",uploadBackup:"Sicherung hochladen",lastBackup:"Letzte Sicherung",autoBackup:"Automatische Sicherung",backupNow:"Jetzt sichern",restoreWarning:"Warnung: Das Wiederherstellen einer Sicherung überschreibt alle aktuellen Daten.",includeArchives:"Archive einschließen",includeSettings:"Einstellungen einschließen",includeProfiles:"Profile einschließen",backupSuccess:"Sicherung erfolgreich erstellt",restoreSuccess:"Sicherung erfolgreich wiederhergestellt",backupFailed:"Sicherung fehlgeschlagen",restoreFailed:"Wiederherstellung fehlgeschlagen",restoreNote:"Virtueller Drucker wird während der Wiederherstellung gestoppt"},tags:{title:"Tags",addTag:"Tag hinzufügen",editTag:"Tag bearbeiten",deleteTag:"Tag löschen",tagName:"Tag-Name",tagColor:"Tag-Farbe",noTags:"Keine Tags",deleteConfirm:"Möchten Sie diesen Tag wirklich löschen?",manageTags:"Tags verwalten"},uploadModal:{title:"3MF-Dateien hochladen",dragDrop:"3MF-Dateien hierher ziehen",or:"oder",browseFiles:"Dateien durchsuchen",extractionInfo:"Das Druckermodell wird automatisch aus den 3MF-Datei-Metadaten extrahiert.",uploaded:"hochgeladen",failed:"fehlgeschlagen",uploading:"Wird hochgeladen...",upload:"Hochladen",uploadFailed:"Hochladen fehlgeschlagen"},editArchive:{title:"Archiv bearbeiten",name:"Name",namePlaceholder:"Druckname",printer:"Drucker",noPrinter:"Kein Drucker",project:"Projekt",noProject:"Kein Projekt",itemsPrinted:"Gedruckte Teile",itemsPrintedHelp:"Anzahl der in diesem Druckauftrag produzierten Teile",notes:"Notizen",notesPlaceholder:"Notizen zu diesem Druck hinzufügen...",externalLink:"Externer Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link zu Printables, Thingiverse oder anderer Quelle",tags:"Tags",tagsPlaceholder:"Tags hinzufügen...",addMoreTags:"Weitere Tags hinzufügen...",matchingTags:'Übereinstimmend mit "{{query}}"',existingTags:"Vorhandene Tags",clickToAdd:"(zum Hinzufügen klicken)",status:"Status",failureReason:"Fehlergrund",selectReason:"Grund auswählen...",photos:"Fotos des Druckergebnisses",photosHelp:"Klicken Sie auf + um Fotos Ihres Druckergebnisses hinzuzufügen",printResult:"Druckergebnis",saving:"Wird gespeichert...",failureReasons:{adhesionFailure:"Haftungsfehler",spaghettiDetached:"Spaghetti / Abgelöst",layerShift:"Schichtversatz",cloggedNozzle:"Verstopfte Düse",filamentRunout:"Filament aufgebraucht",warping:"Verformung",stringing:"Fadenziehen",underExtrusion:"Unterextrusion",powerFailure:"Stromausfall",userCancelled:"Vom Benutzer abgebrochen",other:"Sonstiges"},statuses:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",aborted:"Abgebrochen",printing:"Druckt"}},kProfiles:{title:"K-Profile",noPrintersConfigured:"Keine Drucker konfiguriert",addPrinterInSettings:"Fügen Sie einen Drucker in den Einstellungen hinzu, um K-Profile zu verwalten",noActivePrinters:"Keine aktiven Drucker",enablePrinterConnection:"Aktivieren Sie eine Druckerverbindung, um K-Profile anzuzeigen",loadingProfiles:"Lade K-Profile...",printerOffline:"Drucker offline",printerOfflineDesc:"Der ausgewählte Drucker ist nicht verbunden. Schalten Sie ihn ein, um K-Profile anzuzeigen.",noMatchingProfiles:"Keine passenden Profile",noMatchingProfilesDesc:"Keine Profile entsprechen Ihren Suchkriterien",noKProfiles:"Keine K-Profile",noKProfilesDesc:"Keine Druckvorschub-Profile für {{diameter}}mm Düse gefunden",createFirstProfile:"Erstes Profil erstellen",printer:"Drucker",nozzle:"Düse",refresh:"Aktualisieren",addProfile:"Profil hinzufügen",export:"Exportieren",import:"Importieren",select:"Auswählen",selectAll:"Alle auswählen",delete:"Löschen",searchPlaceholder:"Nach Name oder Filament suchen...",allExtruders:"Alle Extruder",leftOnly:"Nur links",rightOnly:"Nur rechts",allFlow:"Alle Flusstypen",hfOnly:"Nur HF",sOnly:"Nur S",sortName:"Sortieren: Name",sortKValue:"Sortieren: K-Wert",sortFilament:"Sortieren: Filament",leftExtruder:"Linker Extruder",rightExtruder:"Rechter Extruder",modal:{addTitle:"K-Profil hinzufügen",editTitle:"K-Profil bearbeiten",profileName:"Profilname",profileNamePlaceholder:"Mein PLA-Profil",kValue:"K-Wert",kValuePlaceholder:"0,020",kValueHelp:"Typischer Bereich: 0,01 - 0,06 für PLA, 0,02 - 0,10 für PETG",filament:"Filament",selectFilament:"Filament auswählen...",noFilamentsHelp:"Keine Filamente gefunden. Erstellen Sie zuerst ein K-Profil in Bambu Studio.",flowType:"Flusstyp",highFlow:"High Flow",standard:"Standard",nozzleSize:"Düsengröße",extruder:"Extruder",extruders:"Extruder",left:"Links",right:"Rechts",notes:"Notizen (lokal gespeichert)",notesPlaceholder:"Notizen zu diesem Profil hinzufügen...",notesHelp:"Notizen werden in Bambuddy gespeichert, nicht auf dem Drucker",syncing:"Synchronisiert mit Drucker...",savingExtruder:"Speichern auf Extruder {{current}}/{{total}}...",pleaseWait:"Bitte warten"},deleteConfirm:{title:"Profil löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:'Möchten Sie "{{name}}" wirklich vom Drucker löschen?'},bulkDelete:{title:"Profile löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:"Möchten Sie wirklich {{count}} ausgewählte Profile vom Drucker löschen?"},toast:{profileSaved:"K-Profil gespeichert",profilesSaved:"K-Profil auf {{count}} Extrudern gespeichert",selectAtLeastOneExtruder:"Bitte wählen Sie mindestens einen Extruder aus",profileDeleted:"K-Profil gelöscht",profilesDeleted:"{{count}} Profile gelöscht",exportedProfiles:"{{count}} Profile exportiert",importedProfiles:"{{count}} von {{total}} Profilen importiert",noProfilesToExport:"Keine Profile zum Exportieren",invalidFileFormat:"Ungültiges Dateiformat",failedToParseImport:"Import-Datei konnte nicht gelesen werden",failedToSaveBatch:"K-Profile konnten nicht gespeichert werden",noteSaved:"Notiz gespeichert",failedToSaveNote:"Notiz konnte nicht gespeichert werden"},permission:{noRead:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreate:"Sie haben keine Berechtigung, Profile hinzuzufügen",noUpdate:"Sie haben keine Berechtigung, K-Profile zu aktualisieren",noDelete:"Sie haben keine Berechtigung, K-Profile zu löschen",noExport:"Sie haben keine Berechtigung, Profile zu exportieren",noImport:"Sie haben keine Berechtigung, Profile zu importieren"}},virtualPrinter:{title:"Virtueller Drucker",running:"Läuft",stopped:"Gestoppt",description:{default:"Aktiviere einen virtuellen Drucker, der in Bambu Studio und OrcaSlicer erscheint. Dateien, die an diesen Drucker gesendet werden, werden direkt archiviert ohne zu drucken.",proxy:"Aktiviere einen Proxy, der Slicer-Datenverkehr an einen echten Drucker weiterleitet, um Ferndruck über jedes Netzwerk zu ermöglichen."},enable:{title:"Virtuellen Drucker aktivieren",visibleInSlicer:'Sichtbar als "Bambuddy" in der Slicer-Erkennung',proxyingTo:"Proxy zu {{name}}",notActive:"Nicht aktiv"},model:{title:"Druckermodell",description:"Wähle welches Druckermodell emuliert werden soll.",restartWarning:"Das Ändern des Modells startet den virtuellen Drucker neu"},accessCode:{title:"Zugangscode",isSet:"Zugangscode ist gesetzt",notSet:"Kein Zugangscode gesetzt - erforderlich zum Aktivieren",placeholder:"8-Zeichen-Code eingeben",placeholderChange:"Neuen Code eingeben zum Ändern",hint:"Muss genau 8 Zeichen lang sein. Wird von Slicern zur Authentifizierung verwendet.",charCount:"({{count}}/8)"},targetPrinter:{title:"Zieldrucker",configured:"Proxy-Ziel konfiguriert",notConfigured:"Kein Zieldrucker ausgewählt - erforderlich für Proxy-Modus",placeholder:"Drucker auswählen...",hint:"Wähle den Drucker aus, an den der Slicer-Datenverkehr weitergeleitet werden soll. Der Drucker muss im LAN-Modus sein.",noPrinters:"Keine Drucker konfiguriert. Füge zuerst einen Drucker hinzu, um den Proxy-Modus zu verwenden."},remoteInterface:{title:"Slicer-Netzwerkschnittstelle",configured:"SSDP-Proxy aktiviert",optional:"Optional - für SSDP-Erkennung über Netzwerke hinweg",placeholder:"Schnittstelle für Slicer-Netzwerk auswählen...",hint:"Wähle die Netzwerkschnittstelle, die mit dem Slicer verbunden ist. Ermöglicht automatische Druckererkennung in Bambu Studio."},mode:{title:"Modus",archive:"Archivieren",archiveDesc:"Dateien sofort archivieren",review:"Überprüfen",reviewDesc:"Vor dem Archivieren überprüfen",queue:"Warteschlange",queueDesc:"Archivieren und zur Warteschlange hinzufügen",proxy:"Proxy",proxyDesc:"An echten Drucker weiterleiten"},setupRequired:{title:"Einrichtung erforderlich",description:"Die virtuelle Druckerfunktion erfordert zusätzliche Systemkonfiguration, bevor sie funktioniert. Dies beinhaltet Portweiterleitung, Firewall-Regeln und plattformspezifische Einstellungen.",readGuide:"Lese die Einrichtungsanleitung vor dem Aktivieren"},howItWorks:{title:"So funktioniert es",titleProxy:"So funktioniert es (Proxy-Modus)",step1:"Schließe die Einrichtungsanleitung für deine Plattform ab",step2:"Aktiviere den virtuellen Drucker und setze einen Zugangscode",step3:'In Bambu Studio oder OrcaSlicer gehe zu "Drucker hinzufügen"',step4:'Der "Bambuddy"-Drucker sollte in der Erkennungsliste erscheinen',step5:"Verbinde mit dem von dir gesetzten Zugangscode",step6:'Wenn du zu Bambuddy "druckst", wird die 3MF-Datei stattdessen archiviert',proxyStep1:"Wähle den Zieldrucker (muss im LAN-Modus sein)",proxyStep2:"Bei Netzwerkübergreifend: Wähle die Slicer-Netzwerkschnittstelle",proxyStep3:"Aktiviere den Proxy - Drucker erscheint per SSDP in der Slicer-Erkennung",proxyStep4:"Verbinde mit dem Zugangscode des Druckers",proxyStep5:"Drucke wie gewohnt - der Datenverkehr wird über Bambuddy weitergeleitet",proxyStep6:"Kamera-Streaming erfordert NAT/IP-Weiterleitung (siehe Dokumentation)"},status:{title:"Status-Details",printerName:"Druckername",model:"Modell",serialNumber:"Seriennummer",mode:"Modus",pendingFiles:"Ausstehende Dateien",targetPrinter:"Zieldrucker",ftpPort:"FTP-Port",mqttPort:"MQTT-Port",ftpConnections:"FTP-Verbindungen",mqttConnections:"MQTT-Verbindungen"},toast:{updated:"Virtuelle Druckereinstellungen aktualisiert",failedToUpdate:"Einstellungen konnten nicht aktualisiert werden",accessCodeRequired:"Bitte zuerst einen Zugangscode setzen",targetPrinterRequired:"Bitte zuerst einen Zieldrucker auswählen",accessCodeEmpty:"Zugangscode darf nicht leer sein",accessCodeLength:"Zugangscode muss genau 8 Zeichen lang sein"}},modelViewer:{openInSlicer:"Im Slicer öffnen",tabs:{model:"3D-Modell",gcode:"G-Code Vorschau"},notAvailable:"nicht verfügbar",notSliced:"nicht geslicet",plates:"Platten",allPlates:"Alle Platten",plateNumber:"Platte {{number}}",plateCount:"{{count}} Platte",plateCount_other:"{{count}} Platten",objectCount:"{{count}} Objekt",objectCount_other:"{{count}} Objekte",filamentCount:"{{count}} Filament",filamentCount_other:"{{count}} Filamente",eta:"ETA {{minutes}} Min",noPreview:"Keine Vorschau für diese Datei verfügbar",pagination:{pageOf:"Seite {{current}} von {{total}}",prev:"Zurück",next:"Weiter"},errors:{failedToLoad:"Datei konnte nicht geladen werden",noMeshes:"Keine Meshes in 3MF-Datei gefunden",unsupportedFormat:"Nicht unterstütztes Dateiformat"}},maintenanceDescriptions:{lubricateRails:"Schmiermittel auf Linearschienen für sanfte Bewegung auftragen",cleanNozzle:"Hotend und Düse reinigen, um Verstopfungen zu verhindern",checkBelts:"Riemenspannung für präzise Drucke überprüfen",cleanBuildPlate:"Druckplatte für bessere Haftung reinigen",checkExtruder:"Extruderzahnräder auf Verschleiß prüfen",checkCooling:"Sicherstellen, dass Lüfter ordnungsgemäß funktionieren",generalInspection:"Allgemeine Druckerinspektion",cleanCarbonRods:"Karbonstäbe reinigen, um Reibung zu reduzieren",checkPtfeTube:"PTFE-Schlauch auf Verschleiß oder Beschädigung prüfen",replaceHepaFilter:"HEPA-Filter für Luftqualität ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren (H2-Serie)"}},mle={nav:{printers:"プリンター",archives:"アーカイブ",queue:"キュー",stats:"統計",profiles:"プロファイル",maintenance:"メンテナンス",projects:"プロジェクト",files:"ファイル管理",settings:"設定",system:"システム",collapseSidebar:"サイドバーを閉じる",expandSidebar:"サイドバーを開く",update:"アップデート",updateAvailable:"アップデートあり: v{{version}}",viewOnGithub:"GitHubで表示",keyboardShortcuts:"キーボードショートカット (?)",switchToLight:"ライトモードに切替",switchToDark:"ダークモードに切替"},common:{save:"保存",cancel:"キャンセル",delete:"削除",edit:"編集",add:"追加",close:"閉じる",confirm:"確認",loading:"読み込み中...",error:"エラー",success:"成功",warning:"警告",enabled:"有効",disabled:"無効",yes:"はい",no:"いいえ",on:"オン",off:"オフ",all:"すべて",none:"なし",search:"検索",filter:"フィルター",sort:"並べ替え",refresh:"更新",download:"ダウンロード",upload:"アップロード",actions:"操作",status:"ステータス",name:"名前",description:"説明",date:"日付",time:"時間",hours:"時間",minutes:"分",seconds:"秒",noPrinters:"プリンターが登録されていません",noData:"データがありません",required:"必須",optional:"オプション",unknown:"不明",done:"完了",saving:"保存中...",saveChanges:"変更を保存",today:"今日",turnOn:"オンにする",turnOff:"オフにする",deletePhoto:"写真を削除",deletePhotoConfirm:"この写真を削除しますか?元に戻せません。",create:"作成",print:"印刷",clear:"クリア",project:"プロジェクト",archive:"アーカイブ",unknownError:"不明なエラー",show:"表示",hide:"非表示",back:"戻る",export:"エクスポート",import:"インポート",retry:"リトライ",printer:"プリンター",model:"モデル",ok:"OK"},printers:{title:"プリンター",addPrinter:"プリンターを追加",editPrinter:"プリンターを編集",deletePrinter:"プリンターを削除",printerName:"プリンター名",serialNumber:"シリアル番号",ipAddress:"IPアドレス",accessCode:"アクセスコード",model:"モデル",nozzleCount:"ノズル数",autoArchive:"自動アーカイブ",connected:"接続中",offline:"オフライン",unknownModel:"不明なモデル",statusLabel:"ステータス",status:{printing:"印刷中",paused:"一時停止",finished:"完了",failed:"失敗",idle:"待機中"},lastPrint:"最後",readyToPrint:"印刷可能",estimatedCompletion:"完了予定時刻",filaments:"フィラメント",controls:"コントロール",external:"外部",externalSpool:"外部スプール",files:"ファイル",browseFiles:"プリンターのファイルを参照",update:"アップデート",loading:"プリンターを読み込み中...",hideOffline:"オフラインを非表示",ungrouped:"未グループ",hmsErrors:"クリックしてHMSエラーを表示",slotOptions:"スロットオプション",rereadRfid:"RFIDを再読み取り",clickToView:"クリックして表示",maintenanceUpToDate:"すべてのメンテナンスが最新です",maintenanceDue:"{{count}}件のメンテナンス期限",maintenanceDueSoon:"{{count}}件のメンテナンスがまもなく期限",printsInQueue:"キューに{{count}}件の印刷",firmwareUpdateAvailable:"ファームウェアアップデートあり: {{current}} → {{latest}}",statusSummary:{printing:"印刷中",idle:"待機中",offline:"オフライン"},sort:{name:"名前",status:"ステータス",model:"モデル",location:"ロケーション",ascending:"昇順で並べ替え",descending:"降順で並べ替え"},cardSize:{small:"小",medium:"中",large:"大",extraLarge:"特大",cards:"カード"},temps:{nozzle:"ノズル",bed:"ベッド",chamber:"チャンバー",left:"左",right:"右",activeNozzle:"アクティブ: {{side}}ノズル"},fans:{partCooling:"パーツ冷却ファン",auxiliary:"補助ファン",chamber:"チャンバーファン"},printControl:{stop:"停止",pause:"一時停止",resume:"再開",stopPrint:"印刷を停止",pausePrint:"印刷を一時停止",resumePrint:"印刷を再開"},power:{on:"オン",off:"オフ",powerOn:"電源オン",autoOff:"自動オフ",autoOffDone:"自動オフ完了",autoOffTooltip:"印刷後に自動電源オフ",autoOffExecutedTooltip:"自動オフが実行されました - リセットするにはプリンターの電源を入れてください",offlineWithPlugs:"スマートプラグ付きオフラインプリンター",noPlugs:"スマートプラグ付きプリンターなし"},chamberLight:{turnOn:"チャンバーライトをオン",turnOff:"チャンバーライトをオフ"},camera:{openOverlay:"カメラオーバーレイを開く",openWindow:"カメラを新しいウィンドウで開く"},menu:{reconnect:"再接続",mqttDebug:"MQTTデバッグ"},confirm:{deleteTitle:"プリンターを削除",deleteMessage:"「{{name}}」を削除しますか?すべての接続設定が削除されます。",deleteArchives:"印刷アーカイブを削除",deleteArchivesYes:"このプリンターのすべての印刷履歴が完全に削除されます。",deleteArchivesNo:"印刷履歴は保持されますが、このプリンターとの関連付けは解除されます。",powerOnTitle:"プリンターの電源をオン",powerOnMessage:"「{{name}}」の電源をオンにしますか?",powerOn:"電源オン",powerOffTitle:"プリンターの電源をオフ",powerOffMessage:"「{{name}}」の電源をオフにしますか?",powerOffWarning:"警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。",powerOff:"電源オフ",stopTitle:"印刷を停止",stopMessage:"「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",pauseTitle:"印刷を一時停止",pauseMessage:"「{{name}}」の現在の印刷を一時停止しますか?",pauseButton:"印刷を一時停止",resumeTitle:"印刷を再開",resumeMessage:"「{{name}}」の印刷を再開しますか?",resumeButton:"印刷を再開"},skipObjects:{title:"オブジェクトスキップ",onlyWhilePrinting:"オブジェクトスキップ(印刷中のみ)",requires2Objects:"オブジェクトスキップ(2つ以上のオブジェクトが必要)",noObjects:"オブジェクトが見つかりません",objectsLoadedOnStart:"オブジェクトは印刷開始時に読み込まれます",matchIds:"プリンターのディスプレイとIDを照合してください",printerScreenShows:"プリンター画面にビルドプレート上のオブジェクトIDが表示されます",skippedCount:"{{skipped}}/{{total}}スキップ済み",waitForLayer:"オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})",activeCount:"{{count}}個アクティブ",willBeSkipped:"スキップされます",waitForLayer2:"レイヤー2以降をお待ちください",skipThisObject:"このオブジェクトをスキップ",skip:"スキップ",skipped:"スキップ済み"},form:{name:"名前",namePlaceholder:"マイプリンター",ipAddress:"IPアドレス",serialNumber:"シリアル番号",serialCannotChange:"シリアル番号は変更できません",accessCode:"アクセスコード",accessCodePlaceholder:"プリンター設定から取得",accessCodeKeepCurrent:"現在のコードを維持する場合は空のまま",modelOptional:"モデル(任意)",model:"モデル",selectModel:"モデルを選択...",locationGroup:"ロケーション / グループ",locationPlaceholder:"例: 工房、オフィス、地下室",locationHint:"プリンターのグループ化とキュージョブのフィルタリングに使用",autoArchive:"完了した印刷を自動アーカイブ"},discovery:{subnetToScan:"スキャンするサブネット",dockerSubnetHint:"Dockerが検出されました。CIDR表記でプリンターのサブネットを入力してください。docker-compose.ymlにnetwork_mode: hostが必要です。",scanning:"スキャン中...",scanningProgress:"スキャン中... {{scanned}}/{{total}}",scanSubnet:"サブネットをスキャンしてプリンターを検出",discoverNetwork:"ネットワーク上のプリンターを検出",serialRequired:"シリアル番号が必要です",scanningSubnet:"サブネットでBambuプリンターをスキャン中...",scanningNetwork:"ネットワークをスキャン中...",noPrintersSubnet:"指定されたサブネットにプリンターが見つかりません。",noPrintersNetwork:"ネットワーク上にプリンターが見つかりません。",allConfigured:"検出されたすべてのプリンターは既に設定済みです。"},firmware:{title:"ファームウェアアップデート",current:"現在",latest:"最新",releaseNotes:"リリースノート",checkingPrerequisites:"前提条件を確認中...",sdCardReady:"SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。",uploadedToSd:"ファームウェアをSDカードにアップロードしました!",applyInstructions:"プリンターでアップデートを適用するには:",step1:"プリンターのタッチスクリーンで設定に移動",step2:"ファームウェアに移動",step3:"SDカードからアップデートを選択",step4:"アップデートには10〜20分かかります",starting:"開始中...",uploadFirmware:"ファームウェアをアップロード",uploadSuccess:"ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。"},empty:{noPrinters:"プリンターがまだ設定されていません",addFirst:"最初のプリンターを追加"},toast:{printStopped:"印刷を停止しました",printPaused:"印刷を一時停止しました",printResumed:"印刷を再開しました",failedToStop:"印刷の停止に失敗しました",failedToPause:"印刷の一時停止に失敗しました",failedToResume:"印刷の再開に失敗しました",chamberLightOn:"チャンバーライトをオンにしました",chamberLightOff:"チャンバーライトをオフにしました",failedChamberLight:"チャンバーライトの制御に失敗しました",objectsSkipped:"オブジェクトをスキップしました",failedToSkipObjects:"オブジェクトのスキップに失敗しました",rfidRereadInitiated:"RFID再読み取りを開始しました",failedRfidReread:"RFID再読み取りに失敗しました"},progress:"{{percent}}% 完了",timeRemaining:"残り {{time}}",maintenanceOk:"メンテナンス正常",maintenanceWarning:"{{count}}件の警告",maintenanceWarning_plural:"{{count}}件の警告",colors:{unknown:"不明",black:"黒",white:"白",darkGray:"ダークグレー",lightGray:"ライトグレー",gray:"グレー",brown:"茶色",red:"赤",orange:"オレンジ",yellow:"黄色",green:"緑",cyan:"シアン",blue:"青",purple:"紫",pink:"ピンク"},humidity:{unknown:"不明",good:"良好",fair:"注意",bad:"警告"},temperature:{good:"良好",fair:"注意",bad:"高温"},wifi:{excellent:"非常に良い",good:"良い",fair:"普通",weak:"弱い",veryWeak:"非常に弱い"},h2Series:"H2シリーズ",x1Series:"X1シリーズ",pSeries:"Pシリーズ",a1Series:"A1シリーズ",searchPresets:"プリセットを検索...",noCloudPresets:"クラウドプリセットがありません。Bambu Cloudにログインして同期してください。",noMatchingPresets:"一致するプリセットが見つかりません。",colorNamePlaceholder:"色の名前またはHex値(例:brown、FF8800)",clearCustomColor:"カスタムカラーをクリア",copySpoolUuid:"スプールUUIDをコピー",configureSlot:"フィラメントプロファイルとK値でスロットを設定"},archives:{title:"印刷アーカイブ",searchPlaceholder:"アーカイブを検索...",filterByPrinter:"プリンターで絞り込み",filterByStatus:"ステータスで絞り込み",sortBy:"並べ替え",sortNewest:"新しい順",sortOldest:"古い順",sortName:"名前順",sortDuration:"時間順",noArchives:"アーカイブが見つかりません",printTime:"印刷時間",filamentUsed:"フィラメント使用量",cost:"コスト",reprint:"再印刷",preview:"プレビュー",deleteArchive:"アーカイブを削除",deleteConfirm:"このアーカイブを削除しますか?",favorite:"お気に入り",unfavorite:"お気に入りから削除",viewDetails:"詳細を表示",status:{completed:"完了",failed:"失敗",stopped:"中止"},collections:{all:"すべてのアーカイブ",recent:"過去24時間","this-week":"今週","this-month":"今月",favorites:"お気に入り",failed:"失敗した印刷",duplicates:"重複"},bulkDeleted:"{{count}}件のアーカイブを削除しました",bulkDeleteFailed:"アーカイブの削除に失敗しました",bulkDeleteTitle:"アーカイブを削除",bulkDeleteConfirm:"{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。",deleteCount:"{{count}}件を削除",only3mfSupported:".3mfファイルのみ対応しています",dropFilesHere:".3mfファイルをここにドロップ",releaseToUpload:"ドロップしてアップロード",selectedCount:"{{count}}件選択中",selectAll:"すべて選択",tags:"タグ",project:"プロジェクト",toggledFavorites:"{{count}}件のアーカイブのお気に入りを切替えました",favoriteUpdateFailed:"お気に入りの更新に失敗しました",favoriteBulk:"お気に入り",showingCount:"{{total}}件中{{shown}}件を表示",export:"エクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",exportCsv:"CSVでエクスポート",exportExcel:"Excelでエクスポート",compare:"比較 ({{count}})",select:"選択",upload3mf:"3MFアップロード",allPrinters:"すべてのプリンター",allMaterials:"すべての素材",allFiles:"すべてのファイル",slicedGcode:"スライス済み (GCODE)",sourceFileOnly:"ソースのみ",showAll:"すべて表示",showFavoritesOnly:"お気に入りのみ表示",favorites:"お気に入り",showFailedPrints:"失敗した印刷を表示",hideFailedPrints:"失敗した印刷を非表示",hideFailed:"失敗を非表示",allTags:"すべてのタグ",enterNewTag:"新しいタグを入力...",sortNewestFirst:"新しい順",sortOldestFirst:"古い順",sortNameAZ:"名前 A-Z",sortNameZA:"名前 Z-A",sortLargestFirst:"大きい順",sortSmallestFirst:"小さい順",gridView:"グリッド表示",listView:"リスト表示",calendarView:"カレンダー表示",reset:"リセット",colors:"カラー:",matchAnyColor:"いずれかの選択色に一致",matchAllColors:"すべての選択色に一致",clear:"クリア",loading:"アーカイブを読み込み中...",noMatchingArchives:"検索に一致するアーカイブはありません",noArchivesYet:"アーカイブはまだありません",autoCreated:"印刷完了時にアーカイブは自動的に作成されます",unknownPrinter:"不明",noPrinter:"プリンターなし",rightClickOptions:"右クリックでオプション表示",printedBefore:"このモデルは以前印刷されたことがあります",openSource3mf:"ソース3MFをBambu Studioで開く(右クリックでオプション表示)",viewPhotos:"{{count}}枚の写真を表示",openFolder:"フォルダーを開く: {{name}}",projectName:"プロジェクト: {{name}}",makerWorldDesigner:"MakerWorld: {{designer}}",notFromMakerWorld:"MakerWorldではありません",hasTimelapse:"タイムラプスあり",moreOptions:"その他のオプション",downloadF3d:"Fusion 360デザインファイルをダウンロード",listName:"名前",listPrinter:"プリンター",listDate:"日付",listSize:"サイズ",listActions:"アクション"},queue:{title:"印刷キュー",description:"印刷ジョブのスケジュールと管理",addToQueue:"キューに追加",clearQueue:"キューをクリア",clearHistory:"履歴をクリア",emptyQueue:"キューは空です",position:"順番",scheduledTime:"予定時刻",moveUp:"上に移動",moveDown:"下に移動",remove:"削除",requeue:"再キュー",startNow:"今すぐ開始",startPrint:"印刷を開始",stopPrint:"印刷を停止",unassigned:"未割当",printerNumber:"プリンター #{{id}}",staged:"ステージ済み",requiresPreviousSuccess:"前の印刷の成功が必要",autoPowerOff:"自動電源オフ",printingInProgress:"印刷中...",currentlyPrinting:"印刷中",viewArchive:"アーカイブを表示",viewInFileManager:"ファイルマネージャーで表示",itemCount:"{{count}}件",dragToReorder:"ドラッグして並べ替え(ASAPのみ)",overdue:"期限超過",dragReorderTooltip:"順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定された時間に実行されます。",anyModel:"任意の{{model}}{{location}}{{filaments}}",addedBy:"{{username}}が追加",bulkEdit:{title:"{{count}}件のアイテムを編集",description:"変更した設定のみが選択されたアイテムに適用されます。",printer:"プリンター",noChange:"— 変更なし —",queueOptions:"キューオプション",stagedManualStart:"ステージ済み(手動開始)",autoPowerOff:"印刷後に自動電源オフ",requirePreviousSuccess:"前の印刷の成功が必要",printOptions:"印刷オプション",bedLevelling:"ベッドレベリング",flowCalibration:"フローキャリブレーション",vibrationCalibration:"振動キャリブレーション",firstLayerInspection:"第一層検査",timelapse:"タイムラプス",useAms:"AMS使用",on:"オン",off:"オフ",saving:"保存中...",applyChanges:"変更を適用"},bulkActions:{selectAll:"すべて選択",deselectAll:"すべて選択解除",selected:"{{count}}件選択中",editSelected:"選択を編集",cancelSelected:"選択をキャンセル"},permissions:{noStopPermission:"印刷を停止する権限がありません",noStartPermission:"印刷を開始する権限がありません",noEditPermission:"キューアイテムを編集する権限がありません",noCancelPermission:"キューアイテムをキャンセルする権限がありません",noRequeuePermission:"アイテムを再キューする権限がありません",noRemovePermission:"キューアイテムを削除する権限がありません",noClearHistoryPermission:"履歴をクリアする権限がありません"},status:{pending:"待機中",printing:"印刷中",paused:"一時停止",completed:"完了",failed:"失敗",skipped:"スキップ",cancelled:"キャンセル済み",waiting:"待機中"},summary:{printing:"印刷中",queued:"キュー中",totalQueueTime:"合計キュー時間",history:"履歴"},filters:{allPrinters:"すべてのプリンター",allStatus:"すべてのステータス"},sort:{byPosition:"順番で並べ替え",byName:"名前で並べ替え",byPrinter:"プリンターで並べ替え",bySchedule:"スケジュールで並べ替え",byDate:"日付で並べ替え",ascending:"昇順",descending:"降順",ascendingOldest:"昇順(古い順)",descendingNewest:"降順(新しい順)"},empty:{title:"スケジュールされた印刷はありません",description:"アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。"},confirm:{cancelTitle:"スケジュール済み印刷をキャンセル",cancelMessage:"「{{name}}」をキャンセルしますか?",cancelButton:"印刷をキャンセル",stopTitle:"印刷を停止",stopMessage:"現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",removeTitle:"履歴から削除",removeMessage:"「{{name}}」をキュー履歴から削除しますか?",clearHistoryMessage:"{{count}}件の履歴をすべて削除しますか?",thisPrint:"この印刷",thisItem:"このアイテム"},toast:{itemCancelled:"キューアイテムをキャンセルしました",itemRemoved:"キューアイテムを削除しました",printStopped:"印刷を停止しました",printReleased:"印刷をキューに戻しました",clearedHistory:"{{count}}件の履歴をクリアしました",failedToCancel:"アイテムのキャンセルに失敗しました",failedToRemove:"アイテムの削除に失敗しました",failedToStop:"印刷の停止に失敗しました",failedToStart:"印刷の開始に失敗しました",failedToReorder:"キューの並べ替えに失敗しました",failedToClear:"履歴のクリアに失敗しました",failedToUpdateItems:"アイテムの更新に失敗しました",cancelledItems:"{{count}}件のアイテムをキャンセルしました",failedToCancelItems:"アイテムの一括キャンセルに失敗しました"}},stats:{title:"統計",overview:"概要",totalPrints:"総印刷数",successRate:"成功率",totalPrintTime:"総印刷時間",totalFilament:"総フィラメント使用量",totalCost:"総コスト",averagePrintTime:"平均印刷時間",printsPerDay:"1日あたりの印刷数",byPrinter:"プリンター別",byMaterial:"素材別",byMonth:"月別",last7Days:"過去7日間",last30Days:"過去30日間",last90Days:"過去90日間",allTime:"全期間",dashboard:"統計ダッシュボード",dashboardDescription:"3Dプリントアクティビティの概要",loadingStatistics:"統計を読み込み中...",quickStats:"クイック統計",printTime:"印刷時間",filamentUsed:"フィラメント使用量",filamentCost:"フィラメントコスト",energyUsed:"エネルギー使用量",energyCost:"エネルギーコスト",successful:"成功",failed:"失敗",printsByPrinter:"プリンター別印刷数",printerFallback:"プリンター #{{id}}",timeAccuracy:"時間精度",noTimeAccuracyData:"時間精度データがありません",perfectEstimate:"100% = 完全な推定",filamentTypes:"フィラメントタイプ",noFilamentData:"フィラメントデータがありません",printsCount:"{{count}}回印刷",moreTypes:"+{{count}}種類",noPrinterData:"プリンターデータがありません",filamentUsageTrends:"フィラメント使用トレンド",noPrintData:"印刷データがありません",printActivity:"印刷アクティビティ",failureAnalysis30Days:"失敗分析(30日間)",noPrintDataLast30Days:"過去30日間の印刷データがありません",printsFailed:"{{total}}回中{{failed}}回失敗",lastWeek:"先週",failureReasons:"失敗理由",topFailureReasons:"主な失敗理由",unknown:"不明",moreReasons:"+{{count}}件の理由",hiddenCount:"{{count}}件非表示",layoutReset:"レイアウトをリセットしました",resetLayout:"レイアウトをリセット",exportStats:"統計をエクスポート",exportAsCsv:"CSVでエクスポート",exportAsExcel:"Excelでエクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",filament:"フィラメント",cost:"コスト",prints:"プリント",filamentGrams:"フィラメント (g)",weekOf:"週:",periodFilament:"期間フィラメント",periodCost:"期間コスト",avgPerPrint:"プリントあたりの平均",total:"合計",avg:"平均",usageOverTime:"使用量の推移",noDataForTimeRange:"選択した期間のデータがありません",byFilamentType:"フィラメントタイプ別",usage:"使用量",monthlyComparison:"月間比較",noPermissionRecalculate:"コストを再計算する権限がありません",noPermissionResetLayout:"レイアウトをリセットする権限がありません",recalculateCosts:"コストを再計算",recalculateFailed:"コストの再計算に失敗しました",recalculateTooltip:"現在のフィラメント価格に基づいてすべてのプリントコストを再計算します"},profiles:{title:"フィラメントプロファイル",addProfile:"プロファイルを追加",editProfile:"プロファイルを編集",deleteProfile:"プロファイルを削除",material:"素材",brand:"ブランド",color:"色",diameter:"直径",density:"密度",costPerKg:"1kgあたりの価格",spoolWeight:"スプール重量",noProfiles:"プロファイルが登録されていません",deleteConfirm:"このプロファイルを削除しますか?",templateName:"テンプレート名",descriptionOptional:"説明(任意)",searchFields:"フィールドを検索...",presetNamePlaceholder:"マイカスタムプリセット",searchPresets:"プリセットを検索...",connectToCloud:"Bambu Cloudに接続",syncDescription:"デバイス間でスライサープリセットを同期",email:"メールアドレス",password:"パスワード",region:"リージョン",regionGlobal:"グローバル",regionChina:"中国",verificationCode:"認証コード",totpCode:"認証アプリコード",checkEmail:"メール ({{email}}) に届いた6桁のコードを入力してください",enterTotpHint:"認証アプリの6桁のコードを入力してください",accessToken:"アクセストークン",accessTokenHint:"Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)",login:"ログイン",verify:"認証",setToken:"トークン設定",useTokenInstead:"アクセストークンを使用",loginWithEmail:"メールでログイン",loggedIn:"ログインしました",verificationSent:"認証コードをメールに送信しました",enterTotp:"認証アプリのコードを入力してください",tokenSet:"トークンを設定しました",loggedOut:"ログアウトしました",logout:"ログアウト",connectedAs:"接続中:",pageTitle:"プロファイル",pageDescription:"スライサープリセットと圧力キャリブレーションの管理",cloudProfiles:"クラウドプロファイル",kProfiles:"Kプロファイル",scrollToTop:"トップに戻る",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",lastSynced:"最終同期:",duplicate:"複製",myPresetEditable:"マイプリセット(編集可能)",editable:"編集可能",typePreset:"{{type}}プリセット",presetDeleted:"プリセットを削除しました",presetCreated:"プリセットを作成しました",presetUpdated:"プリセットを更新しました",presetExported:"プリセットをエクスポートしました",presetName:"プリセット名",failedToLoadDetails:"プリセットの詳細を読み込めませんでした",failedToLoadProfiles:"プロファイルの読み込みに失敗しました",deletePresetConfirm:"このプリセットを削除しますか?",deletePresetWarning:'"{{name}}"をBambu Cloudから完全に削除します。この操作は元に戻せません。',noPresetsFound:"プリセットが見つかりません",showingPresets:"{{total}}件中{{count}}件を表示",myPresetLegend:"= マイプリセット(編集可能)",typeLabel:"タイプ",typeFilter:"タイプ:",owner:"所有者",myPresets:"マイプリセット",builtIn:"ビルトイン",nozzle:"ノズル",filament:"フィラメント",process:"プロセス",printer:"プリンター",layer:"レイヤー",clearFilters:"フィルターをクリア",noFilamentPresets:"フィラメントプリセットなし",noProcessPresets:"プロセスプリセットなし",noPrinterPresets:"プリンタープリセットなし",compare:"比較",compareMode:"比較モード",comparePresets:"プリセットを比較",compareNow:"比較を実行",compareWithBase:"ベースプリセットと比較",selectAnotherPreset:"同じタイプ({{type}})の別のプリセットを選択",clickTwoPresets:"同じタイプのプリセットを2つクリックして比較",selectFirst:"1. 最初を選択",selectSecond:"2. 2番目を選択",left:"左:",right:"右:",addedCount:"{{count}}件追加",removedCount:"{{count}}件削除",changedCount:"{{count}}件変更",sameCount:"{{count}}件同じ",changes:"変更点",noDifferences:"差分はありません",noFieldsMatch:"検索に一致するフィールドがありません",field:"フィールド",quickTemplates:"クイックテンプレート",templates:"テンプレート",deleteTemplate:"テンプレートを削除",actionCannotBeUndone:"この操作は元に戻せません",confirmDeleteTemplate:'"{{name}}"を削除してもよろしいですか?',templateDeleted:"テンプレートを削除しました",templateUpdated:"テンプレートを更新しました",templateApplied:"テンプレートを適用しました",templateAppliedName:"テンプレート適用: {{name}}",templateSaved:"テンプレートを保存しました",customTemplate:"カスタムテンプレート",noTemplatesYet:"テンプレートはまだありません",createTemplatesHint:"プリセットエディターからテンプレートを作成",noTemplatesSelected:"テンプレートが選択されていません。テンプレートボタンから有効にしてください。",manageTemplatesHint:"メインページのテンプレートボタンからテンプレートを管理",settingsJson:"設定 (JSON)",fieldsCount:"{{count}}フィールド",shownInModals:"モーダルに表示",hiddenInModals:"モーダルで非表示",apply:"適用",saveAsTemplate:"テンプレートとして保存",editPreset:"プリセットを編集",duplicatePreset:"プリセットを複製",createNewPreset:"新しいプリセットを作成",newPreset:"新規プリセット",customizeSettings:"新しいプリセットの設定をカスタマイズ",dropJsonToImport:"JSONファイルをドロップしてインポート",basePreset:"ベースプリセット",selectBasePreset:"ベースプリセットを選択...",inheritsFrom:"継承元:",commonTab:"共通",allFieldsTab:"全フィールド",jsonTab:"JSON",exportToJsonFile:"設定をJSONファイルにエクスポート",importFromJsonFile:"JSONファイルから設定をインポート",commonSettings:"共通設定",currentOverrides:"現在のオーバーライド",availableFields:"利用可能なフィールド",noMatchingFields:"一致するフィールドがありません",allFieldsAdded:"すべてのフィールドが追加済みです",addCustomField:"カスタムフィールドを追加",yourOverrides:"オーバーライド一覧",noOverridesYet:"オーバーライドはまだありません",clickFieldsToAdd:"左のフィールドをクリックして追加",dragDropTip:"ヒント: このモーダルに.jsonファイルをドラッグ&ドロップして設定をインポート",fieldAdded:'フィールド "{{key}}" を追加しました',noOverridesToSave:"保存するオーバーライドがありません",fileImported:"ファイルをインポートしました",fileImportedSuccess:"ファイルを正常にインポートしました",invalidJson:"無効なJSON",noPermissionCreate:"プロファイルを作成する権限がありません",noPermissionDelete:"プロファイルを削除する権限がありません",noPermissionDuplicate:"プロファイルを複製する権限がありません",noPermissionEdit:"プロファイルを編集する権限がありません",noPermissionLogout:"ログアウトする権限がありません",noPermissionManageTemplates:"テンプレートを管理する権限がありません",noPermissionRefresh:"プロファイルを更新する権限がありません"},maintenance:{title:"メンテナンス",overview:"概要",allOk:"すべてのメンテナンスは最新です",dueCount:"{{count}}件の期限到来",dueCount_plural:"{{count}}件の期限到来",warningCount:"{{count}}件の警告",warningCount_plural:"{{count}}件の警告",totalPrintTime:"総印刷時間",nextMaintenance:"次回メンテナンス",nothingDue:"予定なし",tasks:"タスク",lastPerformed:"前回実施日",interval:"間隔",hoursRemaining:"残り{{hours}}時間",hoursOverdue:"{{hours}}時間超過",markDone:"完了にする",performMaintenance:"メンテナンスを実施",history:"履歴",noHistory:"メンテナンス履歴がありません",editPrintHours:"印刷時間を編集",currentHours:"現在の時間",today:"今日",overdue:"期限超過",dueSoon:"まもなく期限",collapse:"折りたたむ",expand:"展開",left:"残り",timeBasedInterval:"時間ベースのインターバル",viewDocumentation:"ドキュメントを表示",printersAssigned:"{{count}}台のプリンターが割り当て済み - クリックして管理",deleteTypeConfirm:"「{{name}}」を削除しますか?",removeFromPrinter:"このプリンターから削除",addLabel:"追加:",maintenanceTypes:"メンテナンスタイプ",systemTypesDescription:"システムタイプとカスタムメンテナンスタスク",addCustomType:"カスタムタイプを追加",intervalType:"インターバルタイプ",printHours:"印刷時間",calendarDays:"カレンダー日数",intervalWithUnit:"インターバル ({{unit}})",days:"日",icon:"アイコン",documentationLink:"ドキュメントリンク(任意)",docLinkPlaceholder:"ドキュメントリンク(任意)",namePlaceholder:"例:HEPAフィルター交換",assignToPrinters:"プリンターに割り当て",selectAtLeastOnePrinter:"プリンターを1台以上選択してください",addType:"タイプを追加",custom:"カスタム",assignedToPrinters:"割り当て済みプリンター:",noPrintersAssigned:"プリンター未割り当て",intervalOverrides:"インターバルのオーバーライド",customizeIntervals:"プリンターごとにインターバルをカスタマイズ",addPrintersForMaintenance:"メンテナンスインターバルを設定するにはプリンターを追加してください",reset:"リセット",countOverdue:"{{count}}件が期限超過",countDueSoon:"{{count}}件がまもなく期限",allGood:"問題なし",nHours:"{{count}}時間",tasksOverdue:"{{count}}件のタスクが期限超過",configureDescription:"メンテナンスタイプとインターバルを設定",addPrintersToTrack:"メンテナンスを追跡するにはプリンターを追加してください",markedComplete:"メンテナンスを完了としてマーク",typeUpdated:"メンテナンスタイプを更新しました",typeDeleted:"メンテナンスタイプを削除しました",typeAdded:"メンテナンスタイプを追加しました",hoursUpdated:"印刷時間を更新しました",printerAssigned:"プリンターを割り当てました",printerRemoved:"プリンターを削除しました",wikiUrlPlaceholder:"https://wiki.bambulab.com/...",duration:{oneDay:"1日",days:"{{count}}日",weeks:"{{count}}週間",months:"{{count}}ヶ月",oneWeek:"1週間",nWeeks:"{{count}}週間",oneMonth:"1ヶ月",nMonths:"{{count}}ヶ月",oneYear:"1年"},noPermissionCreate:"メンテナンス記録を作成する権限がありません",noPermissionUpdate:"メンテナンス記録を更新する権限がありません",noPermissionPerform:"メンテナンスを実行する権限がありません",noPermissionRemove:"メンテナンス記録を削除する権限がありません",noPermissionAssign:"メンテナンスを割り当てる権限がありません",noPermissionEditTypes:"メンテナンスタイプを編集する権限がありません",noPermissionDeleteTypes:"メンテナンスタイプを削除する権限がありません",noPermissionEditIntervals:"メンテナンス間隔を編集する権限がありません",noPermissionEditHours:"メンテナンス時間を編集する権限がありません",types:{lubricateRails:"リニアレールの潤滑",cleanNozzle:"ノズル/ホットエンドの清掃",checkBelts:"ベルト張力の確認",cleanBuildPlate:"ビルドプレートの清掃",checkExtruder:"エクストルーダーギアの確認",checkCooling:"冷却ファンの確認",generalInspection:"総合点検",cleanCarbonRods:"カーボンロッドの清掃",checkPtfeTube:"PTFEチューブの確認",replaceHepaFilter:"HEPAフィルター交換",replaceCarbonFilter:"カーボンフィルター交換",lubricateLeftNozzleRail:"左ノズルレールの潤滑"}},settings:{title:"設定",general:"一般",appearance:"外観",notifications:"通知",smartPlugs:"スマートプラグ",tabSpoolman:"Spoolman",updates:"アップデート",language:"言語",languageDescription:"表示言語を選択してください",theme:"テーマ",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム設定に従う",defaultView:"デフォルト画面",defaultViewDescription:"アプリ起動時に表示するページ",checkForUpdates:"アップデートを確認",autoUpdate:"自動アップデート",currentVersion:"現在のバージョン",latestVersion:"最新バージョン",upToDate:"最新です",updateAvailable:"アップデートあり",telemetry:"匿名テレメトリ",telemetryDescription:"匿名の使用状況データを送信してBamBuddyの改善に協力する",telemetryLearnMore:"詳しく見る",telemetryInfoTitle:"どのようなデータが収集されますか?",telemetryInfoIntro:"BamBuddyはアプリの利用者数、使用バージョン、プリンターモデルを把握するために最小限の匿名データを収集します。これはバグ修正や新機能の優先順位付けに役立ちます。",telemetryInfoCollected:"収集するデータ:",telemetryInfoItem1:"ランダムなインストールID(個人やハードウェアとは紐付きません)",telemetryInfoItem2:"使用中のアプリバージョン",telemetryInfoItem3:"プリンターのモデル名(例: X1C, P1S)- 名前やシリアル番号は含みません",telemetryInfoItem4:"タイムスタンプ(日次/週次のアクティブユーザー数の計測用)",telemetryInfoNotCollected:"収集しないデータ:",telemetryInfoNotItem1:"IPアドレスはハッシュ化され、復元できません",telemetryInfoNotItem2:"プリンター名、シリアル番号、アクセスコード",telemetryInfoNotItem3:"印刷履歴、ファイル名、その他の個人的なコンテンツ",telemetryInfoNotItem4:"個人を特定できる情報",telemetryInfoFooter:"テレメトリはいつでも無効にできます。インストールIDはランダムに生成され、個人を追跡することはできません。",notificationLanguage:"通知の言語",notificationLanguageDescription:"プッシュ通知の言語",notificationProviders:"通知プロバイダー",addProvider:"プロバイダーを追加",editProvider:"プロバイダーを編集",providerType:"プロバイダーの種類",testNotification:"テスト通知",testSuccess:"テスト通知を送信しました",testFailed:"テスト通知の送信に失敗しました",quietHours:"おやすみ時間",quietHoursDescription:"この時間帯は通知を送信しません",quietHoursStart:"開始",quietHoursEnd:"終了",events:{title:"通知イベント",printStart:"印刷開始",printComplete:"印刷完了",printFailed:"印刷失敗",printStopped:"印刷中止",printProgress:"進捗マイルストーン",printProgressDescription:"25%, 50%, 75%で通知",printerOffline:"プリンターオフライン",printerError:"プリンターエラー",filamentLow:"フィラメント残量低下",maintenanceDue:"メンテナンス期限",maintenanceDueDescription:"メンテナンスが必要なときに通知"},smartPlug:{title:"スマートプラグ",add:"スマートプラグを追加",edit:"スマートプラグを編集",name:"名前",ipAddress:"IPアドレス",linkedPrinter:"連携プリンター",autoOn:"自動電源オン",autoOnDescription:"印刷開始時に電源を入れる",autoOff:"自動電源オフ",autoOffDescription:"印刷完了後に電源を切る",offDelay:"オフ遅延",offDelayMinutes:"印刷後の待機時間(分)",offDelayTemp:"ノズル温度が下回ったとき",currentState:"現在の状態",turnOn:"電源オン",turnOff:"電源オフ"},spoolman:{title:"Spoolman連携",description:"Spoolmanに接続してフィラメント在庫を管理します。AMSデータは自動的に同期されます。",howSyncWorks:"同期の仕組み",syncInfo1:"公式Bambu LabスプールのみRFIDで同期されます",syncInfo2:"新しいスプールは初回同期時にSpoolmanに自動作成されます",syncInfo3:"サードパーティ・詰め替えスプールはスキップされます",linkingExisting:"既存スプールの連携",linkingExistingDesc:"既存のSpoolmanスプールをAMSに連携するには、AMSスロットにカーソルを合わせて「Spoolmanに連携」をクリックしてください。",enable:"Spoolmanを有効化",enableDesc:"Spoolmanサーバーとフィラメントデータを同期",url:"Spoolman URL",urlHint:"SpoolmanサーバーのURL(例: http://localhost:7912)",syncMode:"同期モード",syncModeAuto:"自動",syncModeManual:"手動のみ",syncModeAutoDesc:"変更が検出されるとAMSデータが自動同期されます",syncModeManualDesc:"手動トリガー時のみ同期",statusLabel:"ステータス:",connected:"接続中",disconnected:"未接続",disconnect:"切断",connect:"接続",syncAmsData:"AMSデータを同期",syncAmsDataDesc:"プリンターのAMSデータをSpoolmanに手動同期",allPrinters:"すべてのプリンター",sync:"同期",syncSuccess:"{{count}}個のスプールを同期しました",syncWithErrors:"{{count}}個のスプールを同期({{errorCount}}件のエラー)",spoolsSkipped:"{{count}}個のスプールをスキップ",showAll:"すべて表示",showLess:"折りたたむ",andMore:"...他{{count}}件",errors:"エラー:",linkToSpoolman:"Spoolmanに連携",linkingAmsTray:"連携するAMSトレイ:",spoolUuid:"スプールUUID:",selectSpoolToLink:"連携するSpoolmanスプールを選択:",unknownFilament:"不明なフィラメント",noUnlinkedSpools:"Spoolmanに未連携のスプールが見つかりません。",allSpoolsLinked:"すべてのスプールはAMSトレイに連携済みです。",linking:"連携中...",linkSpool:"スプールを連携",linkTooltip:"このスプールをSpoolmanスプールに連携",noUnlinked:"未連携のスプールがありません",disableWeightSync:"AMS推定重量同期を無効化",disableWeightSyncDesc:"AMS推定値から残量を更新しません。AMSの割合ベースの推定よりもSpoolmanの使用量追跡を優先する場合に使用してください。新しいスプールは引き続きAMS推定値を初期重量として使用します。",reportPartialUsage:"失敗した印刷の部分使用量を報告",reportPartialUsageDesc:"印刷が失敗またはキャンセルされた場合、レイヤー進捗に基づいてその時点までの推定フィラメント使用量を報告します。"},subtitle:"Bambuddyの設定",saved:"設定を保存しました",saveFailed:"保存に失敗しました: {{error}}",tabGeneral:"一般",tabSmartPlugs:"スマートプラグ",tabNotifications:"通知",tabFilament:"フィラメント",tabNetwork:"ネットワーク",tabApiKeys:"APIキー",tabVirtualPrinter:"仮想プリンター",tabUsers:"ユーザー",tabGlobalEmail:"グローバルメール",tabBackup:"バックアップ",tabs:{general:"一般",smartPlugs:"スマートプラグ",notifications:"通知",filament:"フィラメント",network:"ネットワーク",apiKeys:"APIキー",virtualPrinter:"仮想プリンター",users:"ユーザー",backup:"バックアップ",globalEmail:"グローバルメール"},email:{smtpSettings:"SMTP設定",smtpHost:"SMTPサーバー",smtpPort:"SMTPポート",security:"セキュリティ",authentication:"認証",username:"ユーザー名",password:"パスワード",fromEmail:"送信元メールアドレス",fromName:"送信者名",testConnection:"SMTP接続テスト",testRecipient:"テスト受信者メール",sendTest:"テストメール送信",sending:"送信中...",save:"設定を保存",saving:"保存中...",advancedAuth:"高度な認証",advancedAuthEnabled:"高度な認証が有効です",advancedAuthEnabledDesc:"メールベースのユーザー管理機能が有効になっています。新規ユーザーには自動生成されたパスワードがメールで送信され、ユーザーはパスワード忘れ機能でパスワードをリセットできます。",advancedAuthDisabled:"高度な認証が無効です",advancedAuthDisabledDesc:"高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。",enable:"有効にする",disable:"無効にする",feature1:"パスワードは自動生成され、新規ユーザーにメールで送信されます",feature2:"ユーザーはユーザー名またはメールでログインできます",feature3:"パスワード忘れ機能が利用可能です",feature4:"管理者はメールでユーザーパスワードをリセットできます"},dateFormat:"日付形式",timeFormat:"時刻形式",systemDefault:"システムデフォルト",dateFormatUS:"US (MM/DD/YYYY)",dateFormatEU:"EU (DD/MM/YYYY)",dateFormatISO:"ISO (YYYY-MM-DD)",timeFormat12h:"12時間 (3:30 PM)",timeFormat24h:"24時間 (15:30)",defaultPrinter:"デフォルトプリンター",noDefaultPrinter:"デフォルトなし(毎回選択)",defaultPrinterDescription:"アップロード、再印刷、その他の操作でこのプリンターを事前選択します。",sidebarOrder:"サイドバーの順序",sidebarOrderDescription:"サイドバーの項目をドラッグ&ドロップで並べ替えできます。ここでデフォルトの順序にリセットできます。",reset:"リセット",darkMode:"ダークモード",lightMode:"ライトモード",active:"(有効)",background:"背景",accent:"アクセント",style:"スタイル",bgNeutral:"ニュートラル",bgWarm:"ウォーム",bgCool:"クール",bgOLED:"OLED ブラック",bgSlate:"スレートブルー",bgForest:"フォレストグリーン",accentGreen:"グリーン",accentTeal:"ティール",accentBlue:"ブルー",accentOrange:"オレンジ",accentPurple:"パープル",accentRed:"レッド",styleClassic:"クラシック",styleGlow:"グロー",styleVibrant:"ビブラント",themeToggleHint:"サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。",archiveSettings:"アーカイブ設定",autoArchive:"自動アーカイブ",autoArchiveDescription:"印刷完了時に3MFファイルを自動的に保存",saveThumbnails:"サムネイルを保存",saveThumbnailsDescription:"3MFファイルからプレビュー画像を抽出して保存",captureFinishPhoto:"完了写真を撮影",captureFinishPhotoDescription:"印刷完了時にプリンターカメラから写真を撮影",ffmpegNotInstalled:"ffmpegがインストールされていません",ffmpegInstruction:"カメラキャプチャにはffmpegが必要です。brew install ffmpeg(macOS)またはapt install ffmpeg(Linux)でインストールしてください。",camera:"カメラ",cameraViewMode:"カメラ表示モード",cameraNewWindow:"新しいウィンドウ",cameraEmbedded:"埋め込みオーバーレイ",cameraEmbeddedDescription:"メイン画面上のリサイズ可能なオーバーレイでカメラを開きます",cameraNewWindowDescription:"別のブラウザウィンドウでカメラを開きます",costTracking:"コスト追跡",defaultFilamentCost:"デフォルトフィラメントコスト(kg単位)",currency:"通貨",electricityCost:"電気代(kWh単位)",energyDisplayMode:"エネルギー表示モード",energyPrintsOnly:"印刷のみ",energyTotalConsumption:"総消費量",energyPrintsOnlyDescription:"ダッシュボードに印刷中に使用されたエネルギーの合計を表示",energyTotalDescription:"ダッシュボードにスマートプラグの累計エネルギーを表示",fileManager:"ファイルマネージャー",archiveOnPrint:"印刷時のアーカイブエントリ作成",archiveAlways:"常にアーカイブエントリを作成",archiveNever:"アーカイブエントリを作成しない",archiveAsk:"毎回確認",archiveOnPrintDescription:"ファイルマネージャーから印刷する際、オプションでアーカイブエントリを作成",lowDiskWarning:"ディスク容量不足の警告",lowDiskWarningDescription:"空きディスク容量がこのしきい値を下回ると警告を表示",checkPrinterFirmware:"プリンターファームウェアの確認",checkPrinterFirmwareDescription:"Bambu Labのプリンターファームウェア更新を確認",checkForUpdatesDescription:"起動時に自動的に新しいバージョンを確認",checkNow:"今すぐ確認",releaseNotes:"リリースノート",viewOnGitHub:"GitHubで表示",updateViaDocker:"Docker Composeでアップデート:",installUpdate:"アップデートをインストール",close:"閉じる",dataManagement:"データ管理",backupData:"データのバックアップ",backupDescription:"設定、プロバイダー、プリンターなどをエクスポート",export:"エクスポート",restoreBackup:"バックアップの復元",restoreDescription:"重複処理オプション付きでバックアップファイルから設定をインポート",restore:"復元",clearLogs:"通知ログを削除",clearLogsDescription:"30日以上前の通知ログを削除",clear:"削除",resetUI:"UIの設定をリセット",resetUIDescription:"サイドバーの順序、テーマ、表示モード、レイアウト設定をリセットします。プリンター、アーカイブ、設定には影響しません。",clearLogsTitle:"通知ログを削除",clearLogsMessage:"30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。",clearLogsConfirm:"ログを削除",clearLogsFailed:"ログの削除に失敗しました",resetUITitle:"UIの設定をリセット",resetUIMessage:"すべてのUI設定をデフォルトにリセットします:サイドバーの順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定には影響しません。クリア後にページが再読み込みされます。",resetPreferences:"設定をリセット",preferencesReset:"UI設定をリセットしました。更新中...",externalUrl:"外部URL",externalUrlDescription:"Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。",bambuddyUrl:"Bambuddy URL",externalUrlHint:"プロトコルとポートを含めてください(例: http://192.168.1.100:8000)",ftpRetry:"FTPリトライ",ftpRetryDescription:"プリンターのWi-Fiが不安定な場合にFTP操作をリトライします。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェアアップデートに適用されます。",enableRetry:"リトライを有効化",enableRetryDescription:"失敗したFTP操作を自動的にリトライ",retryAttempts:"リトライ回数",times:"回",retryAttemptsDescription:"諦めるまでのリトライ回数(1-10)",retryDelay:"リトライ間隔",seconds:"秒",retryDelayDescription:"リトライ間の待ち時間(1-30)",connectionTimeout:"接続タイムアウト",connectionTimeoutDescription:"遅い接続用のソケットタイムアウト。Wi-Fiが弱いA1/A1 Miniプリンターの場合は増やしてください(10-120)",homeAssistant:"Home Assistant",connected:"接続済み",disconnected:"未接続",homeAssistantDescription:"Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。",enableHA:"Home Assistantを有効化",enableHADescription:"Home Assistantでスマートプラグを制御",haUrl:"Home Assistant URL",haToken:"長期アクセストークン",haTokenHint:"HAでトークンを作成: プロフィール → 長期アクセストークン → トークン作成",testConnection:"接続テスト",connectionSuccessful:"接続成功",connectionFailed:"接続失敗",haConnectionSuccess:"Home Assistantへの接続に成功しました。",haConnectionFailed:"Home Assistantへの接続に失敗しました。",mqttPublishing:"MQTT配信",mqttDescription:"BamBuddyイベントを外部MQTTブローカーに配信し、Node-RED、Home Assistant、その他の自動化システムと連携します。",enableMqtt:"MQTTを有効化",enableMqttDescription:"外部MQTTブローカーにイベントを配信",brokerHostname:"ブローカーホスト名",port:"ポート",useTls:"TLSを使用",usernameOptional:"ユーザー名(オプション)",passwordOptional:"パスワード(オプション)",topicPrefix:"トピックプレフィックス",connectedTo:"接続先:",notConnected:"未接続",smartPlugsDescription:"スマートプラグ(TasmotaまたはHome Assistant)を接続して、電源制御を自動化し、プリンターのエネルギー消費を追跡します。",turnAllPlugsOn:"すべてのプラグをオン",turnAllPlugsOff:"すべてのプラグをオフ",allOn:"全オン",allOff:"全オフ",addSmartPlug:"スマートプラグを追加",energySummary:"エネルギー概要",currentPower:"現在の電力",today:"今日",yesterday:"昨日",total:"合計",enablePlugsForEnergy:"プラグを有効にしてエネルギー概要を表示",noSmartPlugs:"スマートプラグが設定されていません",noSmartPlugsDescription:"Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。",addFirstSmartPlug:"最初のスマートプラグを追加",providers:"プロバイダー",log:"ログ",testAll:"すべてテスト",add:"追加",testResults:"テスト結果",dismiss:"閉じる",noProviders:"プロバイダーが設定されていません",noProvidersDescription:"アラートを受信するにはプロバイダーを追加してください。",messageTemplates:"メッセージテンプレート",templatesDescription:"各イベントの通知メッセージをカスタマイズします。",noTemplates:"テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。",testAllSuccess:"すべて{{count}}件のプロバイダーのテストに成功しました!",testAllPartial:"{{success}}/{{tested}}件のプロバイダーが成功",testProvidersFailed:"プロバイダーのテストに失敗しました: {{error}}",bulkPlugSuccess:"すべて{{count}}個のプラグを{{action}}にしました",bulkPlugPartial:"{{success}}個のプラグを{{action}}にしました、{{failed}}個が失敗",bulkPlugFailed:"失敗: {{error}}",apiKeys:"APIキー",apiKeysDescription:"外部連携やWebhook用のAPIキーを作成します。",createKey:"キーを作成",apiKeyCreated:"APIキーを作成しました",apiKeyDeleted:"APIキーを削除しました",apiKeySuccess:"APIキーが正常に作成されました",apiKeyCopyWarning:"今すぐこのキーをコピーしてください - 再表示されません!",keyCopied:"キーをクリップボードにコピーしました",keyCopyFailed:"キーのコピーに失敗しました",keyAddedToBrowser:"キーをAPIブラウザに追加しました",useInBrowser:"APIブラウザで使用",createNewApiKey:"新しいAPIキーを作成",keyName:"キー名",permissions:"権限",readStatus:"ステータスの読み取り",readStatusDescription:"プリンターのステータスとキューを表示",manageQueue:"キューの管理",manageQueueDescription:"印刷キューへのアイテムの追加と削除",controlPrinter:"プリンターの制御",controlPrinterDescription:"印刷の一時停止、再開、停止",cancel:"キャンセル",lastUsed:"最終使用:",badgeRead:"読取",badgeQueue:"キュー",badgeControl:"制御",noApiKeys:"APIキーがありません",noApiKeysDescription:"外部サービスとの連携用にAPIキーを作成してください。",createFirstKey:"最初のキーを作成",deleteApiKeyTitle:"APIキーを削除",deleteApiKeyMessage:"このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。",deleteKey:"キーを削除",webhookEndpoints:"Webhookエンドポイント",webhookApiKeyHint:"X-API-KeyヘッダーでAPIキーを使用してください。",webhookGetAll:"すべてのプリンターステータスを取得",webhookGetOne:"特定のプリンターステータスを取得",webhookQueue:"印刷キューに追加",webhookPause:"印刷を一時停止",webhookResume:"印刷を再開",webhookStop:"印刷を停止",apiBrowser:"APIブラウザ",apiBrowserDescription:"すべての利用可能なAPIエンドポイントを探索してテストします。",apiKeyForTesting:"テスト用APIキー",apiKeyHeaderHint:"このキーはリクエストのX-API-Keyヘッダーとして送信されます。",apiKeyCreateFailed:"APIキーの作成に失敗しました: {{error}}",apiKeyDeleteFailed:"APIキーの削除に失敗しました: {{error}}",amsThresholds:"AMS表示しきい値",amsThresholdsDescription:"AMS湿度と温度インジケーターの色しきい値を設定します。",humidity:"湿度",goodGreen:"良好(緑)≤",fairOrange:"普通(オレンジ)≤",aboveFairBad:"普通のしきい値以上は赤(悪い)で表示",temperature:"温度",goodBlue:"良好(青)≤",aboveFairHot:"普通のしきい値以上は赤(高温)で表示",historyRetention:"履歴の保持",keepHistoryFor:"センサー履歴の保持期間",days:"日",historyRetentionDescription:"古い湿度と温度データは自動的に削除されます",printModal:"印刷ダイアログ",expandMapping:"カスタムマッピングをデフォルトで展開",expandMappingDescription:"複数のプリンターに印刷する際、プリンターごとのAMSマッピングを展開して表示",currentUser:"現在のユーザー",role:"ロール:",roleAdmin:"管理者",roleUser:"ユーザー",manageUsers:"ユーザー管理",disableAuth:"認証を無効化",rolePermissions:"ロール権限",rolePermissionsDescription:"各ロールの権限の概要。",adminPerm1:"プリンター設定の管理",adminPerm2:"ユーザーの作成、編集、削除",adminPerm3:"すべてのシステム機能へのアクセス",userPerm1:"印刷ジョブの送信",userPerm2:"ファイルとアーカイブの管理",userPerm3:"フィラメントの管理",disableAuthTitle:"認証を無効化",disableAuthMessage:"認証を無効にしてもよろしいですか?これにより、Bambuddyインスタンスはログインなしでアクセス可能になります。すべてのユーザーはデータベースに残りますが、認証は無効になります。",disableAuthConfirm:"認証を無効化",authDisabledSuccess:"認証を正常に無効化しました",disableAuthFailed:"認証の無効化に失敗しました",unknownError:"不明なエラー",haUrlPlaceholder:"http://homeassistant.local:8123",haTokenPlaceholder:"長期アクセストークン",mqttHostPlaceholder:"例: 192.168.1.100",leaveEmptyAnonymous:"匿名接続の場合は空欄",mqttTopicDefault:"bambuddy",apiKeyNamePlaceholder:"例: Home Assistantインテグレーション",apiKeyTestPlaceholder:"テスト用APIキーを貼り付け",unnamedKey:"名前なしキー",plugsOnline:"{{online}}/{{total}} オンライン",passed:"{{count}}件 成功",failed:"{{count}}件 失敗",externalUrlPlaceholder:"http://192.168.1.100:8000",bulkPlugTitle:"すべてのプラグを{{action}}",bulkPlugMessage:"有効な{{count}}個のスマートプラグをすべて{{action}}しますか?",bulkPlugConfirm:"すべて{{action}}",updateCheckFailed:"確認失敗: {{error}}",releaseNotesTitle:"リリースノート - v{{version}}",mqttTopicsHint:"トピック: {{prefix}}/printers//status など",virtualPrinterUpdated:"仮想プリンター設定を更新しました",vp:{title:"仮想プリンター",running:"稼働中",stopped:"停止中",description:"Bambu StudioやOrcaSlicerに表示される仮想プリンターを有効にします。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。",enable:"仮想プリンターを有効化",visibleInSlicer:"スライサーの検出リストに「Bambuddy」として表示",notVisible:"スライサーに表示されません",printerModel:"プリンターモデル",printerModelDescription:"エミュレートするプリンターモデルを選択します。",modelRestartWarning:"モデルを変更すると仮想プリンターが再起動されます",accessCode:"アクセスコード",accessCodeSet:"アクセスコードが設定済み",noAccessCode:"アクセスコード未設定 - 有効化に必要です",accessCodeRequired:"先にアクセスコードを設定してください",accessCodeEmpty:"アクセスコードは空にできません",accessCodeLength:"アクセスコードは8文字である必要があります",accessCodeHint:"8文字である必要があります。スライサーの認証に使用されます。",mode:"モード",modeArchive:"アーカイブ",modeArchiveDesc:"ファイルを即座にアーカイブ",modeReview:"レビュー",modeReviewDesc:"アーカイブ前にレビューとタグ付け",modeQueue:"キュー",modeQueueDesc:"アーカイブしてキューに追加",setupRequired:"セットアップが必要",setupDescription:"仮想プリンター機能を使用するには、追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。",readSetupGuide:"有効化する前にセットアップガイドをお読みください",howItWorks:"仕組み:",step1:"お使いのプラットフォームのセットアップガイドを完了する",step2:"仮想プリンターを有効にしてアクセスコードを設定する",step3:"Bambu StudioまたはOrcaSlicerで「プリンターを追加」を開く",step4:"検出リストに「Bambuddy」プリンターが表示される",step5:"設定したアクセスコードで接続する",step6:"Bambuddyに「印刷」すると、3MFファイルがアーカイブされる",statusDetails:"ステータス詳細",printerName:"プリンター名",model:"モデル",serialNumber:"シリアルナンバー",pendingFiles:"保留中のファイル",modeProxy:"プロキシ",modeProxyDesc:"実際のプリンターに中継",descriptionProxy:"スライサーのトラフィックを実際のプリンターに中継するプロキシを有効にし、任意のネットワーク経由でリモート印刷を可能にします。",proxyingTo:"{{name}}にプロキシ中",notActive:"非アクティブ",targetPrinterTitle:"ターゲットプリンター",targetPrinterConfigured:"プロキシターゲット設定済み",targetPrinterNotConfigured:"ターゲットプリンター未選択 - プロキシモードに必要です",targetPrinterPlaceholder:"プリンターを選択...",targetPrinterHint:"スライサーのトラフィックを中継するプリンターを選択します。プリンターはLANモードである必要があります。",targetPrinterNoPrinters:"プリンターが設定されていません。プロキシモードを使用するには、まずプリンターを追加してください。",remoteInterfaceTitle:"スライサーネットワークインターフェース",remoteInterfaceConfigured:"SSDPプロキシ有効",remoteInterfaceOptional:"オプション - ネットワーク間のSSDPディスカバリー用",remoteInterfacePlaceholder:"スライサーネットワークのインターフェースを選択...",remoteInterfaceHint:"スライサーに接続されているネットワークインターフェースを選択します。Bambu Studioでの自動プリンター検出を有効にします。",targetPrinterRequired:"先にターゲットプリンターを選択してください",ftpPort:"FTPポート",mqttPort:"MQTTポート",ftpConnections:"FTP接続数",mqttConnections:"MQTT接続数",targetPrinterStatus:"ターゲットプリンター",howItWorksProxy:"仕組み(プロキシモード)",proxyStep1:"ターゲットプリンターを選択(LANモードである必要があります)",proxyStep2:"クロスネットワーク時:スライサーネットワークインターフェースを選択",proxyStep3:"プロキシを有効化 - プリンターがSSDPでスライサー検出に表示されます",proxyStep4:"プリンターのアクセスコードで接続",proxyStep5:"通常通り印刷 - トラフィックはBambuddyを経由して中継されます",proxyStep6:"カメラストリーミングにはNAT/IP転送が必要です(ドキュメント参照)"},enterNewCodeToChange:"新しいコードを入力して変更",enter8CharCode:"8文字のコードを入力",notificationTitlePlaceholder:"通知タイトル...",notificationBodyPlaceholder:"通知本文...",templateTitleRequired:"タイトルは必須です",templateBodyRequired:"本文は必須です",editTemplate:"テンプレートを編集: {{name}}",templateTitle:"タイトル",templateBody:"本文",availableVariables:"利用可能な変数",insertVariableHint:"クリックして本文のカーソル位置に挿入",livePreview:"ライブプレビュー",loadingPreview:"プレビューを読み込み中...",previewTitle:"タイトル:",previewBody:"本文:",enterTemplateToPreview:"テンプレートの内容を入力するとプレビューが表示されます",resetToDefault:"デフォルトに戻す",noExternalLinks:"外部リンクが設定されていません",clickAddLink:"「リンクを追加」をクリックして追加",deleteLink:"リンクを削除",deleteLinkConfirm:"「{{name}}」を削除しますか?この操作は取り消せません。",editLink:"リンクを編集",addExternalLink:"外部リンクを追加",addLink:"リンクを追加",sidebarLinks:"サイドバーリンク",sidebarLinksDescription:"外部リンクをサイドバーナビゲーションに追加します。ドラッグで並べ替え。",linkNamePlaceholder:"マイリンク",linkNameLabel:"名前",linkUrlLabel:"URL",linkIconLabel:"アイコン",linkCustomIcon:"カスタムアイコン",linkCustomIconHint:"PNG, JPG, GIF, SVG, WebP, ICO。最大1MB。",linkChoosePresetIcon:"またはプリセットアイコンを選択",linkNameRequired:"名前は必須です",linkUrlRequired:"URLは必須です",linkUrlInvalid:"URLは http:// または https:// で始まる必要があります",linkInvalidImageType:"有効な画像ファイルを選択してください(PNG, JPG, GIF, SVG, WebP, ICO)",linkImageTooLarge:"画像ファイルは1MB以下にしてください",removeCustomIcon:"カスタムアイコンを削除",jsonRequestBody:"JSONリクエストボディ...",searchEndpoints:"エンドポイントを検索...",groups:"グループ",addGroup:"グループを追加",noGroupsFound:"グループが見つかりません",systemGroup:"システム",noDescription:"説明なし",users:"ユーザー",addUser:"ユーザーを追加",noUsersFound:"ユーザーが見つかりません",admin:"管理者",authentication:"認証",authEnableDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティ保護を行います。",authSecuredDescription:"Bambuddyインスタンスは認証で保護されています。",enable:"有効にする",disable:"無効にする",changePassword:"パスワードを変更",backup:"バックアップ",backupAndRestore:"バックアップと復元",backupAndRestoreDescription:"Bambuddyデータのバックアップを作成および復元します",goToBackup:"バックアップへ移動",homeAssistantDescriptionFull:"Home Assistantに接続してスマートホームデバイスを制御します",usersCount:"{{count}}人のユーザー",permissionsCount:"{{count}}個の権限",authDisabledTitle:"認証が無効です",authDisabledDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。",authFeature1:"システムへのアクセスにログインを要求",authFeature2:"グループベースの権限を持つ複数のユーザーを作成",authFeature3:"50以上のきめ細かい権限でアクセスを制御",enableAuthentication:"認証を有効にする",createUser:"ユーザーを作成",username:"ユーザー名",enterUsername:"ユーザー名を入力",password:"パスワード",enterPassword:"パスワードを入力(6文字以上)",confirmPassword:"パスワードの確認",confirmPasswordPlaceholder:"パスワードを確認",passwordsDoNotMatch:"パスワードが一致しません",groupsLabel:"グループ",systemLabel:"(システム)",noGroupsAvailable:"利用可能なグループがありません",creating:"作成中...",editUser:"ユーザーを編集",leaveBlankToKeep:"(現在のパスワードを維持する場合は空白)",enterNewPassword:"新しいパスワードを入力",confirmNewPassword:"新しいパスワードを確認",deleteUser:"ユーザーを削除",deleteUserConfirm:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",createGroup:"グループを作成",editGroup:"グループを編集",groupName:"グループ名",enterGroupName:"グループ名を入力",systemGroupNameReadonly:"システムグループ名は変更できません",descriptionLabel:"説明",enterDescription:"説明を入力(任意)",permissionsSelected:"権限({{count}}件選択中)",deleteGroup:"グループを削除",deleteGroupConfirm:"このグループを削除してもよろしいですか?このグループのユーザーはこれらの権限を失います。",changePasswordTitle:"パスワードの変更",currentPassword:"現在のパスワード",enterCurrentPassword:"現在のパスワードを入力",newPassword:"新しいパスワード",enterNewPasswordMin6:"新しいパスワードを入力(6文字以上)",confirmNewPasswordPlaceholder:"新しいパスワードを確認",passwordMinLength:"パスワードは6文字以上である必要があります",passwordChanged:"パスワードが正常に変更されました",failedToChangePassword:"パスワードの変更に失敗しました",changingPassword:"変更中...",prometheusTitle:"Prometheusメトリクス",prometheusDescriptionPre:"プリンターメトリクスを",prometheusDescriptionPost:"でPrometheus/Grafanaモニタリング用に公開します。",enableMetricsEndpoint:"メトリクスエンドポイントを有効化",exposePrometheusData:"プリンターデータをPrometheus形式で公開",bearerTokenOptional:"Bearerトークン(任意)",bearerTokenPlaceholder:"認証不要の場合は空欄のまま",bearerTokenHint:"設定した場合、リクエストに次のヘッダーが必要: ",availableMetrics:"利用可能なメトリクス",metricConnectionStatus:"接続状態",metricPrinterState:"プリンター状態(アイドル/印刷中など)",metricPrintProgress:"印刷進捗 0-100%",metricBedTemp:"ベッド温度",metricNozzleTemp:"ノズル温度",metricPrintsTotal:"結果別の合計印刷数",metricAndMore:"...その他(レイヤー、ファン、キュー、フィラメント使用量)"},notification:{printStarted:{title:"印刷開始",body:"{{printer}}: {{filename}} の印刷を開始しました"},printCompleted:{title:"印刷完了",body:"{{printer}}: {{filename}} が正常に完了しました"},printFailed:{title:"印刷失敗",body:"{{printer}}: {{filename}} が失敗しました"},printStopped:{title:"印刷中止",body:"{{printer}}: {{filename}} が中止されました"},printProgress:{title:"印刷進捗",body:"{{printer}}: {{filename}} は {{percent}}% 完了"},printerOffline:{title:"プリンターオフライン",body:"{{printer}} がオフラインです"},printerError:{title:"プリンターエラー",body:"{{printer}}: {{error}}"},filamentLow:{title:"フィラメント残量低下",body:"{{printer}}: フィラメントが残りわずかです"},maintenanceDue:{title:"メンテナンス期限",body:"{{printer}}: {{items}} の対応が必要です"}},errors:{generic:"問題が発生しました",networkError:"ネットワークエラーです。接続を確認してください。",notFound:"見つかりません",unauthorized:"認証エラー",serverError:"サーバーエラー",validationError:"入力内容を確認してください",printerConnectionFailed:"プリンターへの接続に失敗しました",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",loadFailed:"データの読み込みに失敗しました"},confirm:{delete:"削除しますか?",unsavedChanges:"保存されていない変更があります。このページを離れますか?",clearQueue:"キューをクリアしますか?"},calendar:{months:{january:"1月",february:"2月",march:"3月",april:"4月",may:"5月",june:"6月",july:"7月",august:"8月",september:"9月",october:"10月",november:"11月",december:"12月"},daysShort:{sun:"日",mon:"月",tue:"火",wed:"水",thu:"木",fri:"金",sat:"土"}},notificationLog:{title:"通知ログ",lastDays:"過去{{days}}日間:",notifications:"件の通知",sent:"送信済み",failed:"失敗",last24Hours:"過去24時間",showFailedOnly:"失敗のみ表示",clearOld:"古いログを削除",noFailedNotifications:"失敗した通知はありません",noNotificationsLogged:"通知ログはありません",unknownProvider:"不明なプロバイダー",titleLabel:"タイトル",messageLabel:"メッセージ",errorLabel:"エラー",provider:"プロバイダー:",time:"時間:",clearLogsFailed:"ログの削除に失敗しました: {{error}}",events:{print_start:"印刷開始",print_complete:"印刷完了",print_failed:"印刷失敗",print_stopped:"印刷中止",print_progress:"進捗",printer_offline:"プリンターオフライン",printer_error:"プリンターエラー",filament_low:"フィラメント残量低下",maintenance_due:"メンテナンス期限",ams_humidity_high:"AMS湿度高",ams_temperature_high:"AMS温度高",test:"テスト"}},providers:{callmebot:"CallMeBot/WhatsApp",ntfy:"ntfy",pushover:"Pushover",telegram:"Telegram",email:"メール",discord:"Discord",webhook:"Webhook",descriptions:{email:"SMTPメール通知",telegram:"Telegramボット経由の通知",discord:"Webhook経由でDiscordチャンネルに送信",ntfy:"無料のセルフホスト対応プッシュ通知",pushover:"シンプルで確実なプッシュ通知",callmebot:"CallMeBot経由の無料WhatsApp通知",webhook:"任意のURLへの汎用HTTP POST"}},backup:{categories:{settings:"設定",notification_providers:"通知プロバイダー",notification_templates:"通知テンプレート",smart_plugs:"スマートプラグ",printers:"プリンター",filaments:"フィラメント",maintenance_types:"メンテナンスタイプ",archives:"アーカイブ",projects:"プロジェクト",pending_uploads:"アップロード待ち",external_links:"外部リンク",api_keys:"APIキー"},notificationProviders:"通知プロバイダー",notificationTemplates:"通知テンプレート",externalLinks:"外部リンク",printers:"プリンター",filamentInventory:"フィラメント在庫",maintenanceTypes:"メンテナンスタイプ",printArchives:"印刷アーカイブ",projects:"プロジェクト",pendingUploads:"保留中のアップロード",apiKeys:"APIキー",settingsDescription:"言語、テーマ、更新設定",notificationProvidersDescription:"ntfy、Pushover、Discordなど",notificationTemplatesDescription:"カスタムメッセージテンプレート",smartPlugsDescription:"Tasmotaプラグ設定",externalLinksDescription:"外部サービスへのサイドバーリンク",printersDescription:"プリンター情報(アクセスコードを除く)",filamentInventoryDescription:"フィラメントの種類とコスト",maintenanceDescription:"カスタムメンテナンススケジュール",printArchivesDescription:"全印刷データ+ファイル(3MF、サムネイル、写真)",projectsDescription:"プロジェクト、BOMアイテム、添付ファイル",pendingUploadsDescription:"レビュー待ちの仮想プリンターアップロード",apiKeysDescription:"Webhook APIキー(インポート時に新しいキーが生成されます)",restoreBackup:"バックアップの復元",restoreDescription:"バックアップファイルからすべてのデータを置き換える",restoreNote:"復元中、仮想プリンターは停止されます"},restore:{failedToRestore:"バックアップの復元に失敗しました。ファイル形式を確認してください。",title:"バックアップの復元",restoring:"復元中...",complete:"復元完了",failed:"復元失敗",importDescription:"バックアップファイルから設定をインポート",pleaseWait:"データを復元しています。しばらくお待ちください",duplicateHandling:"重複処理の仕組み:",clickToSelect:"クリックしてバックアップファイルを選択 (.json または .zip)",replaceExisting:"既存データを上書き",keepExisting:"既存データを保持",overwriteDescription:"既に存在する項目をバックアップデータで上書きします",skipDescription:"まだ存在しない項目のみ復元します",caution:"注意:",overwriteWarning:"上書きすると、現在の設定がバックアップのデータに置き換えられます。セキュリティのため、プリンターのアクセスコードは上書きされません。",restore:"復元",processing:"バックアップファイルを処理中...",itemsRestored:"復元済み項目",itemsSkipped:"スキップ済み項目",restoredSection:"復元済み",filesSection:"ファイル (3MF、サムネイルなど)",skippedSection:"スキップ (既に存在)",andMore:"...他 {{count}} 件",newApiKeys:"新しいAPIキーが生成されました",copyKeysWarning:"これらのキーは一度だけ表示されます。今すぐコピーしてください!",copy:"コピー",noDataFound:"バックアップファイルに復元するデータが見つかりませんでした。",dupPrinters:"プリンター",dupPrintersDesc:"シリアル番号で照合",dupSmartPlugs:"スマートプラグ",dupSmartPlugsDesc:"IPアドレスで照合",dupNotificationProviders:"通知プロバイダー",dupNotificationProvidersDesc:"名前で照合",dupFilaments:"フィラメント",dupFilamentsDesc:"名前 + 種類 + ブランドで照合",dupArchives:"アーカイブ",dupArchivesDesc:"コンテンツハッシュで照合 (常にスキップ)",dupPendingUploads:"アップロード待ち",dupPendingUploadsDesc:"ファイル名で照合",dupSettingsTemplates:"設定とテンプレート",dupSettingsTemplatesDesc:"常に上書き"},files:{root:"ルート",cache:"キャッシュ",models:"モデル",timelapse:"タイムラプス",used:"使用中:",free:"空き:",filterPlaceholder:"ファイルを検索...",noFiles:"このディレクトリにファイルがありません",deleteFile:"ファイルを削除",deleteConfirm:'"{{name}}"を削除しますか?この操作は元に戻せません。',fileManager:"ファイル管理",pageDescription:"プリントファイルを整理・管理",newFolder:"新しいフォルダ",folderName:"フォルダ名",folderNamePlaceholder:"例: 機能パーツ",renameFile:"ファイル名を変更",renameFolder:"フォルダ名を変更",rename:"名前変更",rootNoFolder:"ルート(フォルダなし)",moveFilesCount:"{{count}}個のファイルを移動",current:"(現在)",move:"移動",linkFolder:"フォルダをリンク",linkFolderDescription:"「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。",noProjectsFound:"プロジェクトが見つかりません",noArchivesFound:"アーカイブが見つかりません",unlink:"リンク解除",link:"リンク",uploadFiles:"ファイルをアップロード",dropFilesHere:"ここにファイルをドロップ",dragAndDropFiles:"ファイルをドラッグ&ドロップ",orClickToBrowse:"またはクリックして選択",zipAutoExtract:"ZIPファイルは自動的に展開されます",zipFilesDetected:"ZIPファイルを検出",zipChooseHandling:"ZIPファイルが展開されます。フォルダ構造の処理方法を選択してください:",preserveZipStructure:"ZIPのフォルダ構造を保持",willBeExtracted:"• 展開予定",filesExtracted:"• {{count}}個のファイルを展開済み",uploadComplete:"アップロード完了: {{count}}個成功",uploadErrorCount:"、{{count}}個失敗",uploading:"アップロード中...",filesFailed:"{{count}}個のファイルが失敗",uploadFailed:"アップロード失敗",linkToProjectOrArchive:"プロジェクトまたはアーカイブにリンク",changeLink:"リンクを変更...",linkTo:"リンク先...",printedCount:"{{count}}回印刷済み",addToQueue:"キューに追加",schedulePrint:"印刷をスケジュール",adding:"追加中...",folderCreated:"フォルダを作成しました",folderDeleted:"フォルダを削除しました",fileDeleted:"ファイルを削除しました",deletedFiles:"{{count}}個のファイルを削除しました",filesMoved:"ファイルを移動しました",folderUnlinked:"フォルダのリンクを解除しました",folderLinked:"フォルダをリンクしました",addedToQueue:"{{count}}個のファイルをキューに追加しました",addedToQueueWithErrors:"{{added}}個追加、{{errors}}個失敗",failedToAddFiles:"ファイルの追加に失敗: {{error}}",fileRenamed:"ファイル名を変更しました",folderRenamed:"フォルダ名を変更しました",gridView:"グリッド表示",listView:"リスト表示",lowDiskSpaceWarning:"ディスク容量不足の警告",lowDiskSpaceDescription:"空き容量は{{free}}(合計{{total}})。しきい値は設定で{{threshold}} GBに設定されています。",filesLabel:"ファイル:",foldersLabel:"フォルダ:",sizeLabel:"サイズ:",freeLabel:"空き:",folders:"フォルダ",allFiles:"すべてのファイル",allTypes:"すべての種類",date:"日付",size:"サイズ",type:"種類",prints:"印刷回数",ascending:"昇順",descending:"降順",filteredCount:"{{total}}件中{{filtered}}件",deselectAll:"すべて選択解除",selectAll:"すべて選択",selectedCount:"{{count}}件選択中",loadingFiles:"ファイルを読み込み中...",folderEmpty:"フォルダは空です",noFilesYet:"ファイルはまだありません",emptyFolderDescription:"ファイルをアップロードするか、このフォルダにファイルを移動してください。",emptyRootDescription:"プリント関連ファイルの整理を始めるにはファイルをアップロードしてください。",noMatchingFiles:"一致するファイルがありません",noMatchingFilesDescription:"現在の検索またはフィルター条件に一致するファイルがありません。",clearFilters:"フィルターをクリア",sort:{nameAsc:"名前 (A-Z)",nameDesc:"名前 (Z-A)",sizeAsc:"サイズ (小さい順)",sizeDesc:"サイズ (大きい順)",dateAsc:"日付 (古い順)",dateDesc:"日付 (新しい順)"},searchFiles:"ファイルを検索...",deleteFolder:"フォルダを削除",deleteBulkTitle:"{{count}}件のファイルを削除",deleteFolderConfirm:"このフォルダを削除しますか?中のファイルもすべて削除されます。",deleteMultipleConfirm:"選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。",deleteFileConfirm:"このファイルを削除しますか?",deleting:"削除中..."},printOptions:{title:"印刷オプション",bedLevelling:"ベッドレベリング",bedLevellingDesc:"印刷前にベッドを自動レベリング",flowCali:"フローキャリブレーション",flowCaliDesc:"押出量を校正",vibrationCali:"振動キャリブレーション",vibrationCaliDesc:"リンギングを低減",layerInspect:"初層検査",layerInspectDesc:"AIによる初層の検査",timelapse:"タイムラプス",timelapseDesc:"タイムラプス動画を記録"},printModal:{powerOffWhenDone:"完了後にプリンターの電源をオフ",immediateHelp:"プリンターがアイドル状態になり次第、印刷を開始します。",scheduledHelp:"スケジュールされた時間にプリンターがアイドル状態であれば印刷を開始します。ビジー状態の場合は、利用可能になるまで待機します。",stagedHelp:"印刷はステージングされますが、自動的には開始されません。キューに送るにはスタートボタンを使用してください。",print:"印刷",reprint:"再印刷",printToMultiple:"{{count}}台のプリンターに印刷",editQueueItem:"キューアイテムを編集",sameTypeDifferentColor:"同じタイプ、異なる色",filamentTypeNotLoaded:"フィラメントタイプが読み込まれていません",specificPrinter:"特定のプリンター",selectPrinters:"プリンターを選択",selectAll:"すべて選択",printersSelected:"{{count}}台のプリンターを選択中",noPrintersAvailable:"利用可能なプリンターがありません",noActivePrintersAvailable:"アクティブなプリンターがありません",inactive:"非アクティブ",unknownModel:"不明なモデル",customMapping:"カスタムマッピング",auto:"自動",showAll:"すべて表示",selectAtLeastOne:"プリンターを1台以上選択してください",selectTargetModel:"ターゲットモデルを選択",selectSlot:"スロットを選択...",reRead:"再読み込み",customSlotMapping:"カスタムスロットマッピング",autoMatched:"自動マッチ",manuallySelected:"手動選択",schedulerWillAssign:"スケジューラーが最初に利用可能なアイドル状態の{{model}}プリンターに割り当てます",inLocation:"{{location}}内",anyModel:"任意の{{model}}",hiddenPrinters:"他{{count}}台のプリンターが非表示(異なるモデル)",showOnlyModel:"{{model}}プリンターのみ表示",matchedCount:"({{matched}}/{{total}} 一致)",targetModelLabel:"ターゲットモデル",selectAModel:"モデルを選択...",locationFilterLabel:"ロケーションフィルター(任意)",anyLocation:"すべてのロケーション"},login:{title:"Bambuddy ログイン",subtitle:"アカウントにサインイン",username:"ユーザー名",usernamePlaceholder:"ユーザー名を入力",usernameOrEmail:"ユーザー名またはメール",usernameOrEmailPlaceholder:"ユーザー名または @ メール",password:"パスワード",passwordPlaceholder:"パスワードを入力",loggingIn:"ログイン中...",signIn:"サインイン",enterCredentials:"ユーザー名とパスワードを入力してください",success:"ログインしました",failed:"ログインに失敗しました",forgotPasswordEmailMessage:"メールアドレスを入力すると、新しいパスワードを送信します。",emailAddress:"メールアドレス",emailPlaceholder:"your.email@example.com",cancel:"キャンセル",sending:"送信中...",sendResetEmail:"リセットメールを送信"},setup:{title:"Bambuddy セットアップ",description:"Bambuddyインスタンスの認証を設定します",enableAuthentication:"認証を有効にする",adminAccount:"管理者アカウント",adminAccountDescription:"既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効になります。既存の管理者を使用するには以下のフィールドを空のままにするか、新しい管理者ユーザーを作成するには新しい認証情報を入力してください。",adminUsername:"管理者ユーザー名",adminPassword:"管理者パスワード",optionalIfAdminsExist:"管理者ユーザーが存在する場合は任意",placeholderAdminUsername:"管理者ユーザー名を入力(任意)",placeholderAdminPassword:"管理者パスワードを入力(任意)",confirmPassword:"パスワードの確認",placeholderConfirmPassword:"管理者パスワードを確認",settingUp:"セットアップ中...",completeSetup:"セットアップを完了",toast:{authEnabledAdminCreated:"認証が有効になり、管理者ユーザーが作成されました",authEnabledExistingAdmins:"既存の管理者ユーザーを使用して認証が有効になりました",setupCompleted:"セットアップが完了しました",enterBothOrLeaveEmpty:"管理者ユーザー名とパスワードの両方を入力するか、既存の管理者ユーザーを使用するには両方を空にしてください",passwordsDoNotMatch:"パスワードが一致しません",passwordMinLength:"パスワードは6文字以上必要です"}},users:{title:"ユーザー管理",description:"Bambuddyインスタンスのユーザーとアクセスを管理します",noPermission:"このページにアクセスする権限がありません。",backToSettings:"設定に戻る",createUser:"ユーザーを作成",deleteUser:"ユーザーを削除",deleteConfirmMessage:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",roleUser:"ユーザー",roleAdmin:"管理者",statusActive:"アクティブ",statusInactive:"非アクティブ",save:"保存",cancel:"キャンセル",edit:"編集",delete:"削除",creating:"作成中...",admin:"管理者",editUser:"ユーザーを編集",groups:"グループ",noGroups:"グループなし",noGroupsAvailable:"利用可能なグループがありません",saveChanges:"変更を保存",saving:"保存中...",system:"システム",active:"アクティブ",inactive:"非アクティブ",subtitle:"Bambuddyインスタンスのユーザーとアクセスを管理します",form:{username:"ユーザー名",usernamePlaceholder:"ユーザー名を入力",email:"メール",emailPlaceholder:"user@example.com",password:"パスワード",passwordPlaceholder:"パスワードを入力",confirmPassword:"パスワードの確認",confirmPasswordPlaceholder:"パスワードの確認",newPasswordPlaceholder:"新しいパスワード",confirmNewPasswordPlaceholder:"新しいパスワードの確認",leaveBlankToKeep:"現在のパスワードを維持する場合は空のままにしてください",groups:"グループ",optional:"オプション",autoGeneratedPassword:"安全なパスワードが自動的に生成され、ユーザーにメールで送信されます。",passwordManagedByAdvancedAuth:"パスワードは高度な認証によって管理されています。「パスワードのリセット」を使用して、メールで新しいパスワードをユーザーに送信してください。"},modal:{createUser:"ユーザーを作成",editUser:"ユーザーを編集",cancel:"キャンセル",creating:"作成中...",saving:"保存中...",saveChanges:"変更を保存",advancedAuthSubtitle:"高度な認証を使用"},deleteModal:{title:"ユーザーを削除",message:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",confirm:"ユーザーを削除"},table:{username:"ユーザー名",role:"ロール",status:"ステータス",actions:"アクション",groups:"グループ"},toast:{userCreated:"ユーザーが正常に作成されました",userUpdated:"ユーザーが正常に更新されました",userDeleted:"ユーザーが正常に削除されました",fillRequiredFields:"必須項目をすべて入力してください",passwordMinLength:"パスワードは6文字以上である必要があります",passwordsDoNotMatch:"パスワードが一致しません"}},upload:{title:"3MFファイルのアップロード",dragDrop:".3mfファイルをここにドラッグ&ドロップ",or:"または",browseFiles:"ファイルを参照",associatePrinter:"プリンターに関連付け(任意)",noPrinter:"プリンターなし",uploaded:"アップロード済み",failedCount:"失敗",filesUploaded:"{{count}}ファイルをアップロードしました",printerModelExtracted:"プリンターモデルは3MFメタデータから自動抽出されます",filesFailed:"{{count}}ファイルのアップロードに失敗しました",partialResult:"{{uploaded}}件アップロード、{{failed}}件失敗",failed:"アップロードに失敗しました",uploading:"アップロード中...",upload:"アップロード"},gcode:{loading:"G-codeを読み込み中...",notAvailable:"G-codeが利用できません",notSlicedMessage:"このファイルはまだスライスされていません。G-codeプレビューはBambu StudioまたはOrca Slicerでスライス後に利用可能です。",loadFailed:"G-codeの読み込みに失敗しました"},dashboard:{dragToReorder:"ドラッグして並べ替え",sizeClickCycle:"サイズ: {{size}} - クリックで変更",hideWidget:"ウィジェットを非表示",resetLayout:"レイアウトをリセット",hiddenCount:"{{count}}件非表示",hiddenWidgets:"非表示のウィジェット(クリックで表示):",allHidden:"すべてのウィジェットが非表示です。"},printerQueue:{nextInQueue:"次のキュー",asap:"即時",now:"今すぐ",inLessThanMin:"1分以内",inMinutes:"{{count}}分後",inHours:"{{count}}時間後"},smartPlug:{offline:"オフライン",admin:"管理",openAdminPage:"プラグの管理ページを開く",linkedTo:"接続先:",alerts:"アラート",automationSettings:"自動化設定",showInSwitchbar:"スイッチバーに表示",switchbarDesc:"サイドバーからクイックアクセス",enabledDesc:"このプラグの自動化を有効にする",autoOffDesc:"印刷完了後に自動オフ(1回のみ)",delayMode:"オフ遅延モード",temp:"温度",delayMinutes:"遅延(分)",tempThreshold:"温度しきい値(℃)",tempThresholdDesc:"ノズルがこの温度以下に冷えたらオフにします",deleteTitle:"スマートプラグを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',turnOnTitle:"スマートプラグをオン",turnOnConfirm:'"{{name}}"をオンにしてもよろしいですか?',turnOn:"オン",turnOffTitle:"スマートプラグをオフ",turnOffConfirm:'"{{name}}"をオフにしてもよろしいですか?接続されたデバイスの電源が切断されます。',turnOff:"オフ",controlFailed:'"{{name}}"の{{action}}に失敗しました',monitorOnly:"モニタリングのみ",waiting:"データを待機中...",monitor:"モニター",power:"電力",kwhToday:"本日の消費電力",settings:"設定",smartSwitches:"スマートスイッチ",noSwitchesInSwitchbar:"スイッチバーに有効なスイッチがありません",enableInSettings:"設定 → スマートプラグで有効にしてください"},addSmartPlug:{addTitle:"スマートプラグを追加",editTitle:"スマートプラグを編集",tasmota:"Tasmota",homeAssistant:"Home Assistant",stopScanning:"スキャンを停止",discoverDevices:"Tasmotaデバイスを検出",scanningNetwork:"ネットワークをスキャン中...",foundDevices:"{{count}}台のデバイスが見つかりました - クリックして選択:",noDevicesFound:"ネットワーク上にTasmotaデバイスが見つかりません",failedToStartScan:"スキャンの開始に失敗しました",haNotConfigured:"Home Assistantが設定されていません。",haNotConfiguredPath:"設定 → ネットワーク → Home Assistant で設定してください",selectEntity:"エンティティを選択",chooseEntity:"エンティティを選択...",loadingEntities:"エンティティを読み込み中...",failedToLoadEntities:"エンティティの読み込みに失敗しました: {{error}}",searchEntities:"エンティティを検索...",noEntitiesMatching:"「{{search}}」に一致するエンティティが見つかりません",noEntitiesAvailable:"利用可能なエンティティがありません",searchingEntities:"すべてのエンティティを検索中({{count}}件見つかりました)",showingEntities:"switch、light、input_booleanを表示中({{count}}件利用可能)",energyMonitoring:"エネルギーモニタリング(任意)",energyMonitoringDescription:"電力/エネルギーデータを提供するセンサーを検索して選択します。",powerSensor:"電力センサー(W)",searchPowerSensors:"電力センサーを検索...",energyToday:"今日のエネルギー(kWh)",totalEnergy:"総エネルギー(kWh)",searchEnergySensors:"エネルギーセンサーを検索...",noMatchingSensors:"一致するセンサーがありません",ipAddress:"IPアドレス",ipAddressPlaceholder:"192.168.1.100",test:"テスト",connected:"接続されました!",device:"デバイス",state:"状態",connectionFailed:"接続に失敗しました",name:"名前",namePlaceholder:"リビングのプラグ",username:"ユーザー名",usernamePlaceholder:"admin",password:"パスワード",passwordPlaceholder:"********",authHint:"Tasmotaデバイスが認証を必要としない場合は空のままにしてください",linkToPrinter:"プリンターに連携",noPrinterOption:"プリンターなし(手動制御のみ)",linkToPrinterHint:"連携すると印刷の開始/完了時に自動オン/オフが有効になります",powerAlerts:"電力アラート",alertAbove:"超過時にアラート(W)",alertAbovePlaceholder:"例: 200",alertBelow:"下回った時にアラート(W)",alertBelowPlaceholder:"例: 10",powerAlertHint:"消費電力がこれらのしきい値を超えた/下回った場合に通知します。無効にするには空のままにしてください。",dailySchedule:"デイリースケジュール",turnOnAt:"オンにする時刻",turnOffAt:"オフにする時刻",scheduleHint:"毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。",showInSwitchbar:"スイッチバーに表示",showInSwitchbarHint:"サイドバーからクイックアクセス",nameRequired:"名前は必須です",ipRequired:"Tasmotaプラグの場合、IPアドレスは必須です",entityRequired:"Home Assistantプラグの場合、エンティティは必須です",mqtt:"MQTT",mqttTopicRequired:"MQTTトピックは、電力、エネルギー、またはステートのいずれかを設定する必要があります",mqttBrokerNotConfigured:"MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:",mqttBrokerNotConfiguredPath:"設定 → ネットワーク → MQTT発行",mqttBrokerNotConfiguredHint:"(パブリッシュを有効にする必要はありません。ブローカーの詳細を入力するだけです)。",mqttMonitorOnly:"モニタリングのみ",mqttMonitorOnlyDescription:"MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御はできません - MQTTブローカーまたはホームオートメーションシステムを使用してください。",mqttPowerMonitoring:"電力モニタリング",mqttEnergyMonitoring:"エネルギーモニタリング",mqttStateMonitoring:"ステートモニタリング",mqttTopic:"トピック",mqttJsonPath:"JSONパス",mqttMultiplier:"乗数",mqttOnValue:"ONの値",mqttPowerJsonPathHint:"JSONパスはJSONペイロードから値を抽出します(例:「power_l1」)。トピックが生の数値を発行する場合は空のままにしてください。",mqttPowerMultiplierHint:"乗数 0.001 で mW→W、1000 で kW→W に変換します。",mqttEnergyJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttEnergyMultiplierHint:"乗数 0.001 で Wh→kWh、1000 で MWh→kWh に変換します。",mqttStateJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttStateOnValueHint:"ONの値:「ON」を意味する正確な文字列。自動検出(ON、true、1)の場合は空のままにしてください。"},addNotification:{addTitle:"通知プロバイダーを追加",editTitle:"通知プロバイダーを編集",nameRequired:"名前は必須です",fieldRequired:"{{field}}は必須です",namePlaceholder:"マイ通知",providerType:"プロバイダータイプ",configuration:"設定",testConfiguration:"設定をテスト",printerFilter:"プリンターフィルター",allPrinters:"すべてのプリンター",printerFilterDesc:"このプリンターのイベントのみ通知を送信",quietHours:"サイレント時間(おやすみモード)",start:"開始",end:"終了",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知をまとめて1日1回のサマリーとして送信",sendDigestAt:"ダイジェスト送信時刻",digestDescription:"イベントを収集し、この時刻にまとめて送信します",notificationEvents:"通知イベント",printEvents:"印刷イベント",printerStatus:"プリンターステータス",events:{start:"開始",complete:"完了",failed:"失敗",stopped:"停止",progress:"進捗",offline:"オフライン",error:"エラー",lowFilament:"フィラメント残量少",maintenance:"メンテナンス"},config:{callmebot:{phoneNumber:"電話番号",apiKey:"APIキー",apiKeyPlaceholder:"CallMeBot APIキー"},ntfy:{serverUrl:"サーバーURL",topic:"トピック",authToken:"認証トークン",authTokenPlaceholder:"認証(任意)"},pushover:{userKey:"ユーザーキー",userKeyPlaceholder:"Pushoverユーザーキー",appToken:"アプリトークン",appTokenPlaceholder:"Pushoverアプリトークン",priority:"優先度",priorityPlaceholder:"0(通常)"},telegram:{botToken:"Botトークン",botTokenPlaceholder:"@BotFatherから取得したトークン",chatId:"チャットID",chatIdPlaceholder:"チャットまたはグループID"},email:{smtpServer:"SMTPサーバー",smtpPort:"SMTPポート",security:"セキュリティ",starttls:"STARTTLS(ポート587)",ssl:"SSL/TLS(ポート465)",securityNone:"なし(ポート25)",authentication:"認証",username:"ユーザー名",password:"パスワード",passwordPlaceholder:"アプリパスワード",fromEmail:"送信元メール",toEmail:"送信先メール"},discord:{webhookUrl:"Webhook URL"},webhook:{webhookUrl:"Webhook URL",payloadFormat:"ペイロード形式",genericJson:"汎用JSON",slackMattermost:"Slack / Mattermost",authorization:"認証",authorizationPlaceholder:"Bearerトークン(任意)",titleFieldName:"タイトルフィールド名",messageFieldName:"メッセージフィールド名"}}},pendingUploads:{title:"保留中のアップロード({{count}}件)",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",fromSource:"{{ip}}から",archive:"アーカイブ",archiveAll:"すべてアーカイブ",discardAll:"すべて破棄",discard:"破棄",discardTitle:"アップロードを破棄",discardConfirm:'"{{filename}}"を破棄してもよろしいですか?この操作は元に戻せません。',tags:"タグ",tagsPlaceholder:"例: 機能部品、プロトタイプ、ギフト",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",project:"プロジェクト",noProject:"プロジェクトなし",description:"これらのファイルはバーチャルプリンター経由でアップロードされました。確認してアーカイブし、コレクションに追加してください。",archiveAllTitle:"すべてのアップロードをアーカイブ",archiveAllConfirm:"保留中のアップロード{{count}}件をすべてアーカイブしてもよろしいですか?",discardAllTitle:"すべてのアップロードを破棄",discardAllConfirm:"保留中のアップロード{{count}}件をすべて破棄してもよろしいですか?この操作は元に戻せません。",archived:"アーカイブ済み: {{name}}",archiveFailed:"アーカイブに失敗しました",discarded:"アップロードを破棄しました",discardFailed:"破棄に失敗しました",archivedCount:"{{count}}ファイルをアーカイブしました",discardedCount:"{{count}}ファイルを破棄しました",archiveAllFailed:"すべてのアーカイブに失敗しました",discardAllFailed:"すべての破棄に失敗しました"},shortcuts:{title:"キーボードショートカット",navigation:"ナビゲーション",archives:"アーカイブ",profiles:"K-プロファイル",general:"一般",goToPrinters:"プリンターへ",goToArchives:"アーカイブへ",goToQueue:"キューへ",goToStatistics:"統計へ",goToProfiles:"クラウドプロファイルへ",goToSettings:"設定へ",openItem:"{{item}}を開く",goToItem:"{{item}}へ移動",focusSearch:"検索にフォーカス",openUpload:"アップロードダイアログを開く",clearSelection:"選択解除 / 入力をクリア",contextMenu:"カードのコンテキストメニュー",refreshProfiles:"プロファイルを更新",newProfile:"新しいプロファイル",exitSelection:"選択モードを終了",showHelp:"このヘルプを表示",pressKey:"押す",orClickToClose:"または外側をクリックで閉じる"},logViewer:{title:"アプリケーションログ",liveStreaming:"ライブストリーミング - {{count}}エントリ",description:"アプリケーションログの表示とフィルタ",live:"ライブ",stop:"停止",start:"開始",clear:"クリア",autoScroll:"自動スクロール",searchPlaceholder:"メッセージまたはロガー名で検索...",noEntries:"ログエントリが見つかりません",emptyLog:"ログファイルが空またはクリアされています",autoRefreshing:"2秒ごとに自動更新中",clickStart:"開始をクリックしてライブログストリーミングを有効にする"},editArchive:{title:"アーカイブを編集",name:"名前",printNamePlaceholder:"印刷名",printer:"プリンター",noPrinter:"プリンターなし",project:"プロジェクト",noProject:"プロジェクトなし",itemsPrinted:"印刷数",itemsPrintedDescription:"この印刷ジョブで生産されたアイテム数",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",tags:"タグ",addTags:"タグを追加...",addMoreTags:"タグをさらに追加...",existingTagsHint:"既存のタグ(クリックで追加)",externalLink:"外部リンク",externalLinkPlaceholder:"https://...",externalLinkDescription:"MakerWorld、Printables、Thingiverseなどへのリンク",status:"ステータス",statusCompleted:"完了",statusFailed:"失敗",statusCancelled:"キャンセル",statusPrinting:"印刷中",failureReason:"失敗理由",selectReason:"理由を選択...",failureReasons:{adhesionFailure:"定着不良",spaghettiDetached:"スパゲッティ / 剥離",layerShift:"レイヤーシフト",cloggedNozzle:"ノズル詰まり",filamentRunout:"フィラメント切れ",warping:"反り",stringing:"糸引き",underExtrusion:"押出不足",powerFailure:"電源障害",userCancelled:"ユーザーによるキャンセル",other:"その他"},photos:"印刷結果の写真",printResult:"印刷結果",photosDescription:"+をクリックして印刷結果の写真を追加",saving:"保存中..."},mqttDebug:{title:"MQTTデバッグログ",empty:"<空>",startLogging:"ログ記録を開始",searchPlaceholder:"トピックまたはペイロードで検索...",incoming:"受信",outgoing:"送信",noMessages:"まだメッセージが記録されていません",clickStart:"「ログ記録を開始」をクリックしてMQTTメッセージの記録を開始",noMatch:"フィルタに一致するメッセージがありません",adjustFilter:"検索条件またはフィルタ条件を調整してみてください",loggingActive:"ログ記録中 - メッセージは自動更新されます",loggingStopped:"ログ記録停止"},archiveActions:{print:"印刷",schedule:"スケジュール",openInSlicer:"Bambu Studioで開く",slice:"スライス",viewMakerWorld:"MakerWorldで表示",preview3d:"3Dプレビュー",viewTimelapse:"タイムラプスを表示",scanTimelapse:"タイムラプスを検索",downloadSource3mf:"ソース3MFをダウンロード",uploadSource3mf:"ソース3MFをアップロード",replaceSource3mf:"ソース3MFを置換",removeSource3mf:"ソース3MFを削除",replaceF3d:"F3Dを置換",uploadF3d:"F3Dをアップロード",downloadF3d:"F3Dをダウンロード",removeF3d:"F3Dを削除",copyLink:"ダウンロードリンクをコピー",qrCode:"QRコード",viewPhotos:"写真を表示",projectPage:"プロジェクトページ",goToProject:"プロジェクトへ: {{name}}",addToProject:"プロジェクトに追加",removeFromProject:"プロジェクトから削除",noProjects:"利用可能なプロジェクトがありません",deselect:"選択解除",select:"選択",remove:"削除",source3mfAttached:"ソース3MFを添付しました: {{filename}}",source3mfUploadFailed:"ソース3MFのアップロードに失敗しました",source3mfRemoved:"ソース3MFを削除しました",source3mfRemoveFailed:"ソース3MFの削除に失敗しました",f3dAttached:"F3Dを添付しました: {{filename}}",f3dUploadFailed:"F3Dのアップロードに失敗しました",f3dRemoved:"F3Dを削除しました",f3dRemoveFailed:"F3Dの削除に失敗しました",timelapseAttached:"タイムラプスを添付しました: {{filename}}",timelapseExists:"タイムラプスは既に添付されています",noTimelapseFound:"一致するタイムラプスが見つかりません",timelapseScanFailed:"タイムラプスの検索に失敗しました",timelapseAttachFailed:"タイムラプスの添付に失敗しました",deleted:"アーカイブを削除しました",deleteFailed:"アーカイブの削除に失敗しました",addedToFavorites:"お気に入りに追加しました",removedFromFavorites:"お気に入りから削除しました",projectUpdated:"プロジェクトを更新しました",projectUpdateFailed:"プロジェクトの更新に失敗しました",linkCopied:"リンクをクリップボードにコピーしました",linkCopyFailed:"リンクのコピーに失敗しました",photoDeleted:"写真を削除しました",photoDeleteFailed:"写真の削除に失敗しました",deleteTitle:"アーカイブを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',removeSource3mfTitle:"ソース3MFを削除",removeSource3mfConfirm:'"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。',removeF3dTitle:"F3Dを削除",removeF3dConfirm:'"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?',selectTimelapse:"タイムラプスを選択",selectTimelapseDesc:"自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:"},camera:{camera:"カメラ",invalidPrinterId:"無効なプリンターID",printerFallback:"プリンター #{{id}}",live:"ライブ",snapshot:"スナップショット",restartStream:"ストリームを再開",refreshSnapshot:"スナップショットを更新",fullscreen:"フルスクリーン",exitFullscreen:"フルスクリーンを終了",connectingToCamera:"カメラに接続中...",capturingSnapshot:"スナップショットを撮影中...",connectionLost:"接続が切断されました",reconnectingIn:"{{seconds}}秒後に再接続します(試行{{attempt}}/{{maxAttempts}})",reconnectNow:"今すぐ再接続",cameraUnavailable:"カメラが利用できません",makeSurePrinterConnected:"プリンターが接続されていること、およびプリンター設定でカメラが有効になっていることを確認してください。",retry:"再試行",cameraStream:"カメラストリーム",zoomIn:"ズームイン",zoomOut:"ズームアウト",resetZoom:"ズームをリセット",skipBack:"5秒戻る",skipForward:"5秒進む",refreshStream:"ストリームを更新",dragToResize:"ドラッグしてリサイズ"},archiveCard:{slicedReady:"スライス済みファイル - 印刷可能",sourceOnly:"ソースファイルのみ - AMSマッピングなし",gcode:"GCODE",source:"ソース",layers:"レイヤー",objects:"{{count}}オブジェクト",objects_other:"{{count}}オブジェクト",cancelled:"キャンセル",failed:"失敗",duplicate:"重複"},providerCard:{last:"最終: ",lastSuccessAt:"最終: {{date}}",printer:"プリンター: ",allPrinters:"すべてのプリンター",tagStart:"開始",tagComplete:"完了",tagFailed:"失敗",tagStopped:"中止",tagProgress:"進捗",tagOffline:"オフライン",tagLowFilament:"フィラメント残量低下",tagMaintenance:"メンテナンス",tagAmsHumidity:"AMS湿度",tagAmsTemp:"AMS温度",tagAmsHtHumidity:"AMS-HT湿度",tagAmsHtTemp:"AMS-HT温度",quiet:"おやすみ",digest:"ダイジェスト ",digestAt:"ダイジェスト {{time}}",sendTest:"テスト通知を送信",eventSettings:"イベント設定",sendNotifications:"このプロバイダーから通知を送信",printEvents:"印刷イベント",printerStatus:"プリンターステータス",amsAlarms:"AMSアラーム",amsHumidityHigh:"AMS湿度高",amsHumidityHighDesc:"通常AMSの湿度がしきい値を超過",amsTempHigh:"AMS温度高",amsTempHighDesc:"通常AMSの温度がしきい値を超過",amsHtAlarms:"AMS-HTアラーム",amsHtHumidityHigh:"AMS-HT湿度高",amsHtHumidityHighDesc:"AMS-HTの湿度がしきい値を超過",amsHtTempHigh:"AMS-HT温度高",amsHtTempHighDesc:"AMS-HTの温度がしきい値を超過",noNotificationsDuring:"この時間帯は通知を送信しません",editQuietHours:"プロバイダーを編集しておやすみ時間を変更",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知を1日1回のサマリーにまとめる",sendAt:"送信時刻",editDigestTime:"プロバイダーを編集してダイジェスト時刻を変更",deleteTitle:"通知プロバイダーを削除",deleteConfirm:"「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。"},projects:{title:"プロジェクト",subtitle:"印刷プロジェクトを管理",editProject:"プロジェクトを編集",newProject:"新規プロジェクト",namePlaceholder:"プロジェクト名",descriptionPlaceholder:"プロジェクトの説明(任意)",color:"色",targetPlates:"目標プレート数",targetPlatesPlaceholder:"例: 10",targetPlatesHint:"必要な印刷ジョブ/プレート数",targetParts:"目標パーツ数",targetPartsPlaceholder:"例: 50",targetPartsHint:"必要な個別パーツの総数",tags:"タグ",tagsPlaceholder:"カンマ区切りのタグ",dueDate:"期限",priorityLabel:"優先度",priority:{low:"低",normal:"通常",high:"高",urgent:"緊急"},status:{active:"進行中",completed:"完了",archived:"アーカイブ済み"},create:"作成",parts:"パーツ",plates:"プレート",failed:"失敗",completed:"完了",inQueue:"キュー内",noPrintsYet:"印刷履歴なし",more:"もっと見る",printJobsPlates:"印刷ジョブ / プレート",partsPrinted:"印刷済みパーツ",failedParts:"失敗パーツ",projectCreated:"プロジェクトを作成しました",projectUpdated:"プロジェクトを更新しました",projectDeleted:"プロジェクトを削除しました",all:"すべて",loading:"プロジェクトを読み込み中...",noProjectsYet:"プロジェクトがまだありません",noStatusProjects:"{{status}}のプロジェクトはありません",noProjectsHint:"プロジェクトを作成して印刷を整理・追跡しましょう",noStatusProjectsHint:"ステータスが「{{status}}」のプロジェクトはありません",createFirstProject:"最初のプロジェクトを作成",deleteProject:"プロジェクトを削除",deleteProjectConfirm:"このプロジェクトを削除しますか?この操作は取り消せません。",exportAllProjects:"すべてのプロジェクトをエクスポート",importProject:"プロジェクトをインポート",importFailed:"インポートに失敗しました",projectImported:"プロジェクトがインポートされました",projectsExported:"プロジェクトがエクスポートされました",noCreatePermission:"プロジェクトを作成する権限がありません",noDeletePermission:"プロジェクトを削除する権限がありません",noEditPermission:"プロジェクトを編集する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません",noImportPermission:"プロジェクトをインポートする権限がありません"},projectDetail:{statusActive:"進行中",statusCompleted:"完了",statusArchived:"アーカイブ済み",noPrintsYet:"印刷履歴なし",print:"印刷",unknown:"不明",priorityLow:"低",priorityNormal:"通常",priorityHigh:"高",priorityUrgent:"緊急",overdue:"期限超過",dueToday:"本日期限",daysLeft:"残り{{count}}日",projectUpdated:"プロジェクトを更新しました",partAdded:"パーツを追加しました",partRemoved:"パーツを削除しました",deletePart:"パーツを削除",deletePartConfirm:"「{{name}}」を削除しますか?",templateCreated:"プロジェクトからテンプレートを作成しました",error:"エラー",projectNotFound:"プロジェクトが見つかりません",backToProjects:"プロジェクト一覧に戻る",projects:"プロジェクト",edit:"編集",platesProgress:"プレート進捗",printJobs:"印刷ジョブ",percentComplete:"% 完了",remaining:"残り",partsProgress:"パーツ進捗",parts:"パーツ",printJobsCard:"印刷ジョブ",total:"合計",failed:"失敗",partsPrinted:"印刷済みパーツ",printTime:"印刷時間",filamentUsed:"フィラメント使用量",costTracking:"コスト追跡",filamentCost:"フィラメント",energy:"エネルギー",budget:"予算",budgetRemaining:"残り予算",subProjects:"サブプロジェクト ({{count}})",partOf:"所属先",priority:"優先度",notes:"メモ",cancel:"キャンセル",save:"保存",notesPlaceholder:"このプロジェクトについてメモを追加...",noNotesYet:"メモがありません。編集をクリックして追加してください。",files:"ファイル",linkFoldersFromFileManager:"ファイルマネージャーからフォルダーをリンク",toThisProjectForQuickAccess:"してクイックアクセス。",fileCount:"{{count}}ファイル",noFoldersLinked:"リンクされたフォルダーはありません",billOfMaterials:"部品表(BOM)",bomAcquired:"{{completed}}/{{total}} 取得済み",showAll:"すべて表示",hideDone:"完了を非表示",addPart:"パーツを追加",partNamePlaceholder:"パーツ名",qty:"数量",pricePlaceholder:"価格 ({{currency}})",sourcingUrlPlaceholder:"URL(任意)",remarksPlaceholder:"備考",delete:"削除",totalCost:"合計コスト",noBomParts:"BOMにパーツがありません",activityTimeline:"アクティビティタイムライン",noActivityYet:"アクティビティがありません",timelineEvents:{project_created:"プロジェクト作成",print_completed:"印刷完了",print_failed:"印刷失敗",print_started:"印刷開始",queued:"キューに追加"},saveAsTemplate:"テンプレートとして保存",queue:"キュー",viewAll:"すべて表示",printing:"印刷中",queued:"キュー内",prints:"{{count}}件の印刷",exportProject:"プロジェクトをエクスポート",exportFailed:"エクスポートに失敗しました",projectExported:"プロジェクトがエクスポートされました",noEditPermission:"このプロジェクトを編集する権限がありません",noAddPartsPermission:"パーツを追加する権限がありません",noDeletePartsPermission:"パーツを削除する権限がありません",noEditPartsPermission:"パーツを編集する権限がありません",noUpdatePartsPermission:"パーツを更新する権限がありません",noEditNotesPermission:"ノートを編集する権限がありません",noCreateTemplatesPermission:"テンプレートを作成する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません"},projectPage:{title:"プロジェクトページ",loadFailed:"プロジェクトページデータの読み込みに失敗",noData:"プロジェクトページデータがありません",noDataHint:"このプロジェクトにはMakerWorldページデータがありません",titleField:"タイトル",designer:"デザイナー",license:"ライセンス",description:"説明",descriptionPlaceholder:"プロジェクトの説明...",printProfile:"印刷プロファイル",profileTitle:"プロファイルタイトル",profileDescriptionPlaceholder:"プロファイルの説明",byUser:"{{name}} 作",images:"画像 ({{count}})",viewOnMakerWorld:"MakerWorldで表示"},batchProject:{addedToProject:"{{count}}件のアーカイブを「{{project}}」に追加しました",assignFailed:"プロジェクトへのアーカイブ割り当てに失敗しました",removedFromProject:"{{count}}件のアーカイブをプロジェクトから削除しました",removeFailed:"プロジェクトからのアーカイブ削除に失敗しました",assignTitle:"プロジェクトに割り当て",assignDescription:"{{count}}件の選択されたアーカイブのプロジェクトを選択:",removeFromProject:"プロジェクトから削除",clearAssignment:"選択されたアーカイブのプロジェクト割り当てを解除",orAssignTo:"または割り当て先:",archiveCount:"{{count}}件のアーカイブ",noProjects:"プロジェクトがありません。先にプロジェクトを作成してください。"},richTextEditor:{bold:"太字",italic:"斜体",underline:"下線",bulletList:"箇条書き",numberedList:"番号付きリスト",alignLeft:"左揃え",alignCenter:"中央揃え",alignRight:"右揃え",addLink:"リンクを追加",removeLink:"リンクを削除"},kProfiles:{editProfile:"K-プロファイルを編集",addProfile:"K-プロファイルを追加",hasNote:"メモあり",copyProfile:"プロファイルをコピー",profileNamePlaceholder:"マイPLAプロファイル",notesPlaceholder:"このプロファイルのメモを追加...",searchPlaceholder:"名前またはフィラメントで検索...",exportToJson:"JSONにエクスポート",importFromJson:"JSONからインポート",selectAllVisible:"表示中のプロファイルをすべて選択",enterSelectionMode:"一括削除の選択モードに入る",unnamed:"名前なし",notePrefix:"メモ: ",profileName:"プロファイル名",kValue:"K値",kValueRange:"一般的な範囲: PLA 0.01 - 0.06、PETG 0.02 - 0.10",filament:"フィラメント",selectFilament:"フィラメントを選択...",noFilamentsFound:"フィラメントが見つかりません。まずBambu StudioでKプロファイルを作成してください。",flowType:"フロータイプ",highFlow:"ハイフロー",standard:"スタンダード",nozzleSize:"ノズルサイズ",extruder:"エクストルーダー",extruders:"エクストルーダー",left:"左",right:"右",notesStoredLocally:"メモ(ローカル保存)",notesHint:"メモはBambuddyに保存され、プリンターには保存されません",deleteProfileTitle:"プロファイルを削除",cannotBeUndone:"この操作は元に戻せません",confirmDeleteProfile:'"{{name}}"をプリンターから削除してもよろしいですか?',profileSaved:"Kプロファイルを保存しました",profileDeleted:"Kプロファイルを削除しました",selectExtruder:"エクストルーダーを少なくとも1つ選択してください",profileSavedToExtruders:"Kプロファイルを{{count}}個のエクストルーダーに保存しました",failedToSave:"Kプロファイルの保存に失敗しました",syncingWithPrinter:"プリンターと同期中...",pleaseWait:"お待ちください",savingToExtruder:"エクストルーダー {{current}}/{{total}} に保存中...",noPrintersConfigured:"プリンターが設定されていません",addPrinterHint:"設定でプリンターを追加してKプロファイルを管理",noActivePrinters:"アクティブなプリンターがありません",enablePrinterHint:"プリンター接続を有効にしてKプロファイルを表示",loadingProfiles:"Kプロファイルを読み込み中...",nozzle:"ノズル",allExtruders:"すべてのエクストルーダー",leftOnly:"左のみ",rightOnly:"右のみ",allFlow:"すべてのフロー",hfOnly:"HFのみ",sOnly:"Sのみ",sortName:"ソート: 名前",sortKValue:"ソート: K値",sortFilament:"ソート: フィラメント",selectAll:"すべて選択",select:"選択",printerOffline:"プリンターオフライン",printerOfflineHint:"プリンターが接続されていません。電源を入れてKプロファイルを表示してください。",leftExtruder:"左エクストルーダー",rightExtruder:"右エクストルーダー",noMatchingProfiles:"一致するプロファイルなし",noProfilesMatch:"検索条件に一致するプロファイルがありません",noKProfiles:"Kプロファイルなし",noProfilesForNozzle:"{{diameter}}mmノズルの圧力キャリブレーションプロファイルが見つかりません",createFirstProfile:"最初のプロファイルを作成",deleteProfiles:"プロファイルを削除",confirmBulkDelete:"{{count}}件の選択されたプロファイルをプリンターから削除してもよろしいですか?",noProfilesToExport:"エクスポートするプロファイルがありません",exportedProfiles:"{{count}}件のプロファイルをエクスポートしました",invalidFileFormat:"無効なファイル形式",importedProfiles:"{{total}}件中{{imported}}件のプロファイルをインポートしました",failedToParseImport:"インポートファイルの解析に失敗しました",deletedProfiles:"{{count}}件のプロファイルを削除しました",failedToSaveNote:"メモの保存に失敗しました",noPermissionAdd:"K-プロファイルを追加する権限がありません",noPermissionDelete:"K-プロファイルを削除する権限がありません",noPermissionDeleteBulk:"K-プロファイルを一括削除する権限がありません",noPermissionExport:"K-プロファイルをエクスポートする権限がありません",noPermissionImport:"K-プロファイルをインポートする権限がありません",noPermissionRefresh:"K-プロファイルを更新する権限がありません"},apiBrowser:{validationError:"バリデーションエラー",missingRequiredParams:"必須パラメーターが不足: {{params}}",networkError:"ネットワークエラー",pathParameters:"パスパラメーター",queryParameters:"クエリパラメーター",selectOption:"-- 選択 --",requestBody:"リクエストボディ",execute:"実行",fillInRequired:"入力してください: {{params}}",response:"レスポンス",failedToFetchSchema:"OpenAPIスキーマの取得に失敗しました",failedToLoadSchema:"APIスキーマの読み込みに失敗しました",otherCategory:"その他",expandAll:"すべて展開",collapseAll:"すべて折りたたむ",swaggerUI:"Swagger UI",endpointCount:"{{categories}}カテゴリー内{{count}}エンドポイント"},githubBackup:{title:"GitHubバックアップ",enabled:"有効",cloudLoginRequired:"Bambu Cloudのログインが必要です。プロファイル → クラウドプロファイルからサインインしてGitHubバックアップを有効にしてください。",description:"プロファイルをプライベートGitHubリポジトリに自動同期し、バックアップとバージョン履歴を管理します。",repositoryUrl:"リポジトリURL",personalAccessToken:"パーソナルアクセストークン",saved:"保存済み",enterNewToken:"新しいトークンを入力して更新",tokenHint:"Contents読み取り/書き込み権限を持つFine-grainedトークン",branch:"ブランチ",autoBackup:"自動バックアップ",manualOnly:"手動のみ",hourly:"毎時",daily:"毎日",weekly:"毎週",includeInBackup:"バックアップに含める",kProfiles:"Kプロファイル",noPrintersConnected:"プリンター未接続",printersConnected:"{{connected}}/{{total}} 接続中",kProfilesDescription:"接続されたプリンターからの圧力前進キャリブレーション",cloudProfiles:"クラウドプロファイル",cloudProfilesDescription:"Bambu Cloudのフィラメント、プリンター、プロセスプリセット",appSettings:"アプリ設定",appSettingsDescription:"Bambuddyの設定(機密データを除く)",lastBackup:"最終バックアップ",noBackupsYet:"バックアップなし",next:"次回",startingBackup:"バックアップ開始中...",backupNow:"今すぐバックアップ",test:"テスト",enableBackup:"バックアップを有効化",testConnection:"接続テスト",history:"履歴",date:"日付",status:"ステータス",commit:"コミット",localBackup:"ローカルバックアップ",localDescription:"Bambuddyデータをローカルファイルとしてエクスポートまたはインポートし、手動バックアップや移行に利用できます。",exportData:"データエクスポート",exportDescription:"すべての設定、プリンター、プロファイルをダウンロード",importBackup:"バックアップのインポート",importDescription:"以前のエクスポートファイルから復元",tokenUpdated:"トークンを更新しました",settingsSaved:"設定を保存しました",failedToSave:"保存に失敗しました: {{error}}",backupEnabled:"GitHubバックアップを有効にしました",backupComplete:"バックアップ完了 - {{count}}ファイル更新",backupSkipped:"バックアップをスキップ - 変更なし",backupFailed:"バックアップに失敗しました: {{error}}",logsCleared:"{{count}}件のログを削除しました",failedToClearLogs:"ログの削除に失敗しました: {{error}}",enterRepoUrl:"リポジトリURLを入力してください",enterRepoUrlAndToken:"リポジトリURLとアクセストークンを入力してください",repoUrlRequired:"リポジトリURLは必須です",tokenRequired:"アクセストークンは必須です",backupDownloaded:"バックアップのダウンロードが完了しました",failedToCreateBackup:"バックアップの作成に失敗しました",backupRestored:"バックアップの復元が完了しました"},modelViewer:{openInSlicer:"スライサーで開く",tabs:{model:"3Dモデル",gcode:"G-codeプレビュー"},notAvailable:"利用不可",notSliced:"未スライス",plates:"プレート",allPlates:"全プレート",plateNumber:"プレート {{number}}",plateCount:"{{count}} プレート",plateCount_other:"{{count}} プレート",objectCount:"{{count}} オブジェクト",objectCount_other:"{{count}} オブジェクト",filamentCount:"{{count}} フィラメント",filamentCount_other:"{{count}} フィラメント",eta:"予想時間 {{minutes}} 分",noPreview:"このファイルのプレビューは利用できません",pagination:{pageOf:"ページ {{current}} / {{total}}",prev:"前へ",next:"次へ"},errors:{failedToLoad:"ファイルの読み込みに失敗しました",noMeshes:"3MFファイルにメッシュが見つかりません",unsupportedFormat:"サポートされていないファイル形式です"}}},ple={en:{translation:hle},de:{translation:fle},ja:{translation:mle}};Es.use(YW).use(Voe).init({resources:ple,fallbackLng:"en",supportedLngs:["en","de","ja"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const Wz=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"},{code:"ja",name:"Japanese",nativeName:"日本語"}];var Kz="popstate";function gle(t={}){function e(r,i){let{pathname:s,search:o,hash:l}=r.location;return AP("",{pathname:s,search:o,hash:l},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function n(r,i){return typeof i=="string"?i:ny(i)}return xle(e,n,null,t)}function ni(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function ol(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function ble(){return Math.random().toString(36).substring(2,10)}function Xz(t,e){return{usr:t.state,key:t.key,idx:e}}function AP(t,e,n=null,r){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?Tb(e):e,state:n,key:e&&e.key||r||ble()}}function ny({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Tb(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let r=t.indexOf("?");r>=0&&(e.search=t.substring(r),t=t.substring(0,r)),t&&(e.pathname=t)}return e}function xle(t,e,n,r={}){let{window:i=document.defaultView,v5Compat:s=!1}=r,o=i.history,l="POP",c=null,u=d();u==null&&(u=0,o.replaceState({...o.state,idx:u},""));function d(){return(o.state||{idx:null}).idx}function h(){l="POP";let x=d(),y=x==null?null:x-u;u=x,c&&c({action:l,location:v.location,delta:y})}function m(x,y){l="PUSH";let S=AP(v.location,x,y);u=d()+1;let N=Xz(S,u),A=v.createHref(S);try{o.pushState(N,"",A)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;i.location.assign(A)}s&&c&&c({action:l,location:v.location,delta:1})}function p(x,y){l="REPLACE";let S=AP(v.location,x,y);u=d();let N=Xz(S,u),A=v.createHref(S);o.replaceState(N,"",A),s&&c&&c({action:l,location:v.location,delta:0})}function b(x){return yle(x)}let v={get action(){return l},get location(){return t(i,o)},listen(x){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(Kz,h),c=x,()=>{i.removeEventListener(Kz,h),c=null}},createHref(x){return e(i,x)},createURL:b,encodeLocation(x){let y=b(x);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:m,replace:p,go(x){return o.go(x)}};return v}function yle(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),ni(n,"No window.location.(origin|href) available to create URL");let r=typeof t=="string"?t:ny(t);return r=r.replace(/ $/,"%20"),!e&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function QW(t,e,n="/"){return vle(t,e,n,!1)}function vle(t,e,n,r){let i=typeof e=="string"?Tb(e):e,s=zu(i.pathname||"/",n);if(s==null)return null;let o=ZW(t);wle(o);let l=null;for(let c=0;l==null&&c{let d={relativePath:u===void 0?o.path||"":u,caseSensitive:o.caseSensitive===!0,childrenIndex:l,route:o};if(d.relativePath.startsWith("/")){if(!d.relativePath.startsWith(r)&&c)return;ni(d.relativePath.startsWith(r),`Absolute route path "${d.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(r.length)}let h=Cu([r,d.relativePath]),m=n.concat(d);o.children&&o.children.length>0&&(ni(o.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),ZW(o.children,e,m,h,c)),!(o.path==null&&!o.index)&&e.push({path:h,score:Ale(h,o.index),routesMeta:m})};return t.forEach((o,l)=>{if(o.path===""||!o.path?.includes("?"))s(o,l);else for(let c of JW(o.path))s(o,l,!0,c)}),e}function JW(t){let e=t.split("/");if(e.length===0)return[];let[n,...r]=e,i=n.endsWith("?"),s=n.replace(/\?$/,"");if(r.length===0)return i?[s,""]:[s];let o=JW(r.join("/")),l=[];return l.push(...o.map(c=>c===""?s:[s,c].join("/"))),i&&l.push(...o),l.map(c=>t.startsWith("/")&&c===""?"/":c)}function wle(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:Tle(e.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var _le=/^:[\w-]+$/,Sle=3,Nle=2,Mle=1,kle=10,Ele=-2,Yz=t=>t==="*";function Ale(t,e){let n=t.split("/"),r=n.length;return n.some(Yz)&&(r+=Ele),e&&(r+=Nle),n.filter(i=>!Yz(i)).reduce((i,s)=>i+(_le.test(s)?Sle:s===""?Mle:kle),r)}function Tle(t,e){return t.length===e.length&&t.slice(0,-1).every((r,i)=>r===e[i])?t[t.length-1]-e[e.length-1]:0}function Cle(t,e,n=!1){let{routesMeta:r}=t,i={},s="/",o=[];for(let l=0;l{if(d==="*"){let b=l[m]||"";o=s.slice(0,s.length-b.length).replace(/(.)\/+$/,"$1")}const p=l[m];return h&&!p?u[d]=void 0:u[d]=(p||"").replace(/%2F/g,"/"),u},{}),pathname:s,pathnameBase:o,pattern:t}}function jle(t,e=!1,n=!0){ol(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let r=[],i="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,l,c)=>(r.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(r.push({paramName:"*"}),i+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?i+="\\/*$":t!==""&&t!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,e?void 0:"i"),r]}function Ple(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return ol(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function zu(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,r=t.charAt(n);return r&&r!=="/"?null:t.slice(n)||"/"}var Dle=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Rle(t,e="/"){let{pathname:n,search:r="",hash:i=""}=typeof t=="string"?Tb(t):t,s;return n?(n=n.replace(/\/\/+/g,"/"),n.startsWith("/")?s=Qz(n.substring(1),"/"):s=Qz(n,e)):s=e,{pathname:s,search:Fle(r),hash:Ile(i)}}function Qz(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(i=>{i===".."?n.length>1&&n.pop():i!=="."&&n.push(i)}),n.length>1?n.join("/"):"/"}function EA(t,e,n,r){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Ole(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function $R(t){let e=Ole(t);return e.map((n,r)=>r===e.length-1?n.pathname:n.pathnameBase)}function VR(t,e,n,r=!1){let i;typeof t=="string"?i=Tb(t):(i={...t},ni(!i.pathname||!i.pathname.includes("?"),EA("?","pathname","search",i)),ni(!i.pathname||!i.pathname.includes("#"),EA("#","pathname","hash",i)),ni(!i.search||!i.search.includes("#"),EA("#","search","hash",i)));let s=t===""||i.pathname==="",o=s?"/":i.pathname,l;if(o==null)l=n;else{let h=e.length-1;if(!r&&o.startsWith("..")){let m=o.split("/");for(;m[0]==="..";)m.shift(),h-=1;i.pathname=m.join("/")}l=h>=0?e[h]:"/"}let c=Rle(i,l),u=o&&o!=="/"&&o.endsWith("/"),d=(s||o===".")&&n.endsWith("/");return!c.pathname.endsWith("/")&&(u||d)&&(c.pathname+="/"),c}var Cu=t=>t.join("/").replace(/\/\/+/g,"/"),Lle=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),Fle=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,Ile=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t,Ule=class{constructor(t,e,n,r=!1){this.status=t,this.statusText=e||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function zle(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}function Ble(t){return t.map(e=>e.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var eK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function tK(t,e){let n=t;if(typeof n!="string"||!Dle.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(eK)try{let s=new URL(window.location.href),o=n.startsWith("//")?new URL(s.protocol+n):new URL(n),l=zu(o.pathname,e);o.origin===s.origin&&l!=null?n=l+o.search+o.hash:i=!0}catch{ol(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var nK=["POST","PUT","PATCH","DELETE"];new Set(nK);var Hle=["GET",...nK];new Set(Hle);var Cb=_.createContext(null);Cb.displayName="DataRouter";var AM=_.createContext(null);AM.displayName="DataRouterState";var $le=_.createContext(!1),rK=_.createContext({isTransitioning:!1});rK.displayName="ViewTransition";var Vle=_.createContext(new Map);Vle.displayName="Fetchers";var Gle=_.createContext(null);Gle.displayName="Await";var So=_.createContext(null);So.displayName="Navigation";var Qy=_.createContext(null);Qy.displayName="Location";var ml=_.createContext({outlet:null,matches:[],isDataRoute:!1});ml.displayName="Route";var GR=_.createContext(null);GR.displayName="RouteError";var iK="REACT_ROUTER_ERROR",qle="REDIRECT",Wle="ROUTE_ERROR_RESPONSE";function Kle(t){if(t.startsWith(`${iK}:${qle}:{`))try{let e=JSON.parse(t.slice(28));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.location=="string"&&typeof e.reloadDocument=="boolean"&&typeof e.replace=="boolean")return e}catch{}}function Xle(t){if(t.startsWith(`${iK}:${Wle}:{`))try{let e=JSON.parse(t.slice(40));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string")return new Ule(e.status,e.statusText,e.data)}catch{}}function Yle(t,{relative:e}={}){ni(jb(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=_.useContext(So),{hash:i,pathname:s,search:o}=Zy(t,{relative:e}),l=s;return n!=="/"&&(l=s==="/"?n:Cu([n,s])),r.createHref({pathname:l,search:o,hash:i})}function jb(){return _.useContext(Qy)!=null}function Pc(){return ni(jb(),"useLocation() may be used only in the context of a component."),_.useContext(Qy).location}var aK="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function sK(t){_.useContext(So).static||_.useLayoutEffect(t)}function Dc(){let{isDataRoute:t}=_.useContext(ml);return t?dce():Qle()}function Qle(){ni(jb(),"useNavigate() may be used only in the context of a component.");let t=_.useContext(Cb),{basename:e,navigator:n}=_.useContext(So),{matches:r}=_.useContext(ml),{pathname:i}=Pc(),s=JSON.stringify($R(r)),o=_.useRef(!1);return sK(()=>{o.current=!0}),_.useCallback((c,u={})=>{if(ol(o.current,aK),!o.current)return;if(typeof c=="number"){n.go(c);return}let d=VR(c,JSON.parse(s),i,u.relative==="path");t==null&&e!=="/"&&(d.pathname=d.pathname==="/"?e:Cu([e,d.pathname])),(u.replace?n.replace:n.push)(d,u.state,u)},[e,n,s,i,t])}var Zle=_.createContext(null);function Jle(t){let e=_.useContext(ml).outlet;return _.useMemo(()=>e&&_.createElement(Zle.Provider,{value:t},e),[e,t])}function TM(){let{matches:t}=_.useContext(ml),e=t[t.length-1];return e?e.params:{}}function Zy(t,{relative:e}={}){let{matches:n}=_.useContext(ml),{pathname:r}=Pc(),i=JSON.stringify($R(n));return _.useMemo(()=>VR(t,JSON.parse(i),r,e==="path"),[t,i,r,e])}function ece(t,e){return oK(t,e)}function oK(t,e,n,r,i){ni(jb(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=_.useContext(So),{matches:o}=_.useContext(ml),l=o[o.length-1],c=l?l.params:{},u=l?l.pathname:"/",d=l?l.pathnameBase:"/",h=l&&l.route;{let S=h&&h.path||"";cK(u,!h||S.endsWith("*")||S.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${u}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. -Please change the parent to .`)}let m=Pc(),p;if(e){let S=typeof e=="string"?Ab(e):e;ni(d==="/"||S.pathname?.startsWith(d),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${d}" but pathname "${S.pathname}" was given in the \`location\` prop.`),p=S}else p=m;let b=p.pathname||"/",v=b;if(d!=="/"){let S=d.replace(/^\//,"").split("/");v="/"+b.replace(/^\//,"").split("/").slice(S.length).join("/")}let x=QW(t,{pathname:v});ol(h||x!=null,`No routes matched location "${p.pathname}${p.search}${p.hash}" `),ol(x==null||x[x.length-1].route.element!==void 0||x[x.length-1].route.Component!==void 0||x[x.length-1].route.lazy!==void 0,`Matched leaf route at location "${p.pathname}${p.search}${p.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let y=ace(x&&x.map(S=>Object.assign({},S,{params:Object.assign({},c,S.params),pathname:Cu([d,s.encodeLocation?s.encodeLocation(S.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:S.pathname]),pathnameBase:S.pathnameBase==="/"?d:Cu([d,s.encodeLocation?s.encodeLocation(S.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:S.pathnameBase])})),o,n,r,i);return e&&y?_.createElement(Yy.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...p},navigationType:"POP"}},y):y}function tce(){let t=uce(),e=zle(t)?`${t.status} ${t.statusText}`:t instanceof Error?t.message:JSON.stringify(t),n=t instanceof Error?t.stack:null,r="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:r},s={padding:"2px 4px",backgroundColor:r},o=null;return console.error("Error handled by React Router default ErrorBoundary:",t),o=_.createElement(_.Fragment,null,_.createElement("p",null,"💿 Hey developer 👋"),_.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",_.createElement("code",{style:s},"ErrorBoundary")," or"," ",_.createElement("code",{style:s},"errorElement")," prop on your route.")),_.createElement(_.Fragment,null,_.createElement("h2",null,"Unexpected Application Error!"),_.createElement("h3",{style:{fontStyle:"italic"}},e),n?_.createElement("pre",{style:i},n):null,o)}var nce=_.createElement(tce,null),lK=class extends _.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,e){return e.location!==t.location||e.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:e.error,location:e.location,revalidation:t.revalidation||e.revalidation}}componentDidCatch(t,e){this.props.onError?this.props.onError(t,e):console.error("React Router caught the following error during render",t)}render(){let t=this.state.error;if(this.context&&typeof t=="object"&&t&&"digest"in t&&typeof t.digest=="string"){const n=Xle(t.digest);n&&(t=n)}let e=t!==void 0?_.createElement(ml.Provider,{value:this.props.routeContext},_.createElement(GR.Provider,{value:t,children:this.props.component})):this.props.children;return this.context?_.createElement(rce,{error:t},e):e}};lK.contextType=$le;var TT=new WeakMap;function rce({children:t,error:e}){let{basename:n}=_.useContext(So);if(typeof e=="object"&&e&&"digest"in e&&typeof e.digest=="string"){let r=Kle(e.digest);if(r){let i=TT.get(e);if(i)throw i;let s=tK(r.location,n);if(eK&&!TT.get(e))if(s.isExternal||r.reloadDocument)window.location.href=s.absoluteURL||s.to;else{const o=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(s.to,{replace:r.replace}));throw TT.set(e,o),o}return _.createElement("meta",{httpEquiv:"refresh",content:`0;url=${s.absoluteURL||s.to}`})}}return t}function ice({routeContext:t,match:e,children:n}){let r=_.useContext(Cb);return r&&r.static&&r.staticContext&&(e.route.errorElement||e.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=e.route.id),_.createElement(ml.Provider,{value:t},n)}function ace(t,e=[],n=null,r=null,i=null){if(t==null){if(!n)return null;if(n.errors)t=n.matches;else if(e.length===0&&!n.initialized&&n.matches.length>0)t=n.matches;else return null}let s=t,o=n?.errors;if(o!=null){let d=s.findIndex(h=>h.route.id&&o?.[h.route.id]!==void 0);ni(d>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(",")}`),s=s.slice(0,Math.min(s.length,d+1))}let l=!1,c=-1;if(n)for(let d=0;d=0?s=s.slice(0,c+1):s=[s[0]];break}}}let u=n&&r?(d,h)=>{r(d,{location:n.location,params:n.matches?.[0]?.params??{},unstable_pattern:Ble(n.matches),errorInfo:h})}:void 0;return s.reduceRight((d,h,m)=>{let p,b=!1,v=null,x=null;n&&(p=o&&h.route.id?o[h.route.id]:void 0,v=h.route.errorElement||nce,l&&(c<0&&m===0?(cK("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),b=!0,x=null):c===m&&(b=!0,x=h.route.hydrateFallbackElement||null)));let y=e.concat(s.slice(0,m+1)),S=()=>{let N;return p?N=v:b?N=x:h.route.Component?N=_.createElement(h.route.Component,null):h.route.element?N=h.route.element:N=d,_.createElement(ice,{match:h,routeContext:{outlet:d,matches:y,isDataRoute:n!=null},children:N})};return n&&(h.route.ErrorBoundary||h.route.errorElement||m===0)?_.createElement(lK,{location:n.location,revalidation:n.revalidation,component:v,error:p,children:S(),routeContext:{outlet:null,matches:y,isDataRoute:!0},onError:u}):S()},null)}function qR(t){return`${t} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function sce(t){let e=_.useContext(Cb);return ni(e,qR(t)),e}function oce(t){let e=_.useContext(EM);return ni(e,qR(t)),e}function lce(t){let e=_.useContext(ml);return ni(e,qR(t)),e}function WR(t){let e=lce(t),n=e.matches[e.matches.length-1];return ni(n.route.id,`${t} can only be used on routes that contain a unique "id"`),n.route.id}function cce(){return WR("useRouteId")}function uce(){let t=_.useContext(GR),e=oce("useRouteError"),n=WR("useRouteError");return t!==void 0?t:e.errors?.[n]}function dce(){let{router:t}=sce("useNavigate"),e=WR("useNavigate"),n=_.useRef(!1);return sK(()=>{n.current=!0}),_.useCallback(async(i,s={})=>{ol(n.current,aK),n.current&&(typeof i=="number"?await t.navigate(i):await t.navigate(i,{fromRouteId:e,...s}))},[t,e])}var Zz={};function cK(t,e,n){!e&&!Zz[t]&&(Zz[t]=!0,ol(!1,n))}_.memo(hce);function hce({routes:t,future:e,state:n,onError:r}){return oK(t,void 0,n,r,e)}function Qg({to:t,replace:e,state:n,relative:r}){ni(jb()," may be used only in the context of a component.");let{static:i}=_.useContext(So);ol(!i," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:s}=_.useContext(ml),{pathname:o}=Pc(),l=Dc(),c=VR(t,$R(s),o,r==="path"),u=JSON.stringify(c);return _.useEffect(()=>{l(JSON.parse(u),{replace:e,state:n,relative:r})},[l,u,r,e,n]),null}function fce(t){return Jle(t.context)}function zi(t){ni(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function mce({basename:t="/",children:e=null,location:n,navigationType:r="POP",navigator:i,static:s=!1,unstable_useTransitions:o}){ni(!jb(),"You cannot render a inside another . You should never have more than one in your app.");let l=t.replace(/^\/*/,"/"),c=_.useMemo(()=>({basename:l,navigator:i,static:s,unstable_useTransitions:o,future:{}}),[l,i,s,o]);typeof n=="string"&&(n=Ab(n));let{pathname:u="/",search:d="",hash:h="",state:m=null,key:p="default"}=n,b=_.useMemo(()=>{let v=zu(u,l);return v==null?null:{location:{pathname:v,search:d,hash:h,state:m,key:p},navigationType:r}},[l,u,d,h,m,p,r]);return ol(b!=null,` is not able to match the URL "${u}${d}${h}" because it does not start with the basename, so the won't render anything.`),b==null?null:_.createElement(So.Provider,{value:c},_.createElement(Yy.Provider,{children:e,value:b}))}function pce({children:t,location:e}){return ece(AP(t),e)}function AP(t,e=[]){let n=[];return _.Children.forEach(t,(r,i)=>{if(!_.isValidElement(r))return;let s=[...e,i];if(r.type===_.Fragment){n.push.apply(n,AP(r.props.children,s));return}ni(r.type===zi,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),ni(!r.props.index||!r.props.children,"An index route cannot have child routes.");let o={id:r.props.id||s.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=AP(r.props.children,s)),n.push(o)}),n}var T1="get",A1="application/x-www-form-urlencoded";function AM(t){return typeof HTMLElement<"u"&&t instanceof HTMLElement}function gce(t){return AM(t)&&t.tagName.toLowerCase()==="button"}function bce(t){return AM(t)&&t.tagName.toLowerCase()==="form"}function xce(t){return AM(t)&&t.tagName.toLowerCase()==="input"}function yce(t){return!!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)}function vce(t,e){return t.button===0&&(!e||e==="_self")&&!yce(t)}function CP(t=""){return new URLSearchParams(typeof t=="string"||Array.isArray(t)||t instanceof URLSearchParams?t:Object.keys(t).reduce((e,n)=>{let r=t[n];return e.concat(Array.isArray(r)?r.map(i=>[n,i]):[[n,r]])},[]))}function wce(t,e){let n=CP(t);return e&&e.forEach((r,i)=>{n.has(i)||e.getAll(i).forEach(s=>{n.append(i,s)})}),n}var Vw=null;function _ce(){if(Vw===null)try{new FormData(document.createElement("form"),0),Vw=!1}catch{Vw=!0}return Vw}var Sce=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function AT(t){return t!=null&&!Sce.has(t)?(ol(!1,`"${t}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${A1}"`),null):t}function Nce(t,e){let n,r,i,s,o;if(bce(t)){let l=t.getAttribute("action");r=l?zu(l,e):null,n=t.getAttribute("method")||T1,i=AT(t.getAttribute("enctype"))||A1,s=new FormData(t)}else if(gce(t)||xce(t)&&(t.type==="submit"||t.type==="image")){let l=t.form;if(l==null)throw new Error('Cannot submit a
-

{t('settings.email.advancedAuthEnabled') || 'Advanced Authentication is enabled'}

+

{t('settings.email.advancedAuthEnabled')}

- {t('settings.email.advancedAuthEnabledDesc') || 'Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature.'} + {t('settings.email.advancedAuthEnabledDesc')}

diff --git a/static/assets/index-NgO9xbrN.js b/static/assets/index-C4SeuzlU.js similarity index 98% rename from static/assets/index-NgO9xbrN.js rename to static/assets/index-C4SeuzlU.js index 2459a9135..0331edf4a 100644 --- a/static/assets/index-NgO9xbrN.js +++ b/static/assets/index-C4SeuzlU.js @@ -8648,7 +8648,7 @@ Accuracy: ${t.time_accuracy.toFixed(0)}%`:t.actual_time_seconds?`Actual: ${m0(t. transition-all duration-200 hover:border-bambu-dark-tertiary/80 ${k?"opacity-50 scale-[1.02] shadow-xl z-50":""} ${E?"border-blue-500/30 bg-gradient-to-r from-blue-500/5 to-transparent":""} - `,children:a.jsxs("div",{className:"flex items-center gap-4 p-4",children:[P&&d&&a.jsx("button",{onClick:j=>{j.stopPropagation(),d()},className:`flex items-center justify-center w-6 h-6 rounded border transition-colors ${u?"bg-bambu-green border-bambu-green text-white":"border-white/30 bg-black/30 hover:border-bambu-green/50"}`,children:u&&a.jsx(qi,{className:"w-4 h-4"})}),P?a.jsx("div",{...x,...y,className:"flex items-center justify-center w-10 h-10 md:w-8 md:h-8 rounded-lg bg-bambu-dark cursor-grab active:cursor-grabbing hover:bg-bambu-dark-tertiary transition-colors touch-manipulation",children:a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray"})}):e!==void 0?a.jsxs("div",{className:"flex items-center justify-center w-8 h-8 rounded-lg bg-bambu-dark text-bambu-gray text-sm font-medium",children:["#",e]}):a.jsx("div",{className:"w-8"}),a.jsx("div",{className:"w-14 h-14 flex-shrink-0 bg-bambu-dark rounded-lg overflow-hidden",children:t.archive_thumbnail?a.jsx("img",{src:t.plate_id!=null?ce.getArchivePlateThumbnail(t.archive_id,t.plate_id):ce.getArchiveThumbnail(t.archive_id),alt:"",className:"w-full h-full object-cover"}):t.library_file_thumbnail?a.jsx("img",{src:t.plate_id!=null?ce.getLibraryFilePlateThumbnail(t.library_file_id,t.plate_id):ce.getLibraryFileThumbnailUrl(t.library_file_id),alt:"",className:"w-full h-full object-cover"}):a.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray",children:a.jsx(ys,{className:"w-6 h-6"})})}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("p",{className:"text-white font-medium truncate",children:t.archive_name||t.library_file_name||`File #${t.archive_id||t.library_file_id}`}),t.archive_id?a.jsx(Fs,{to:`/archives?highlight=${t.archive_id}`,className:"text-bambu-gray hover:text-bambu-green transition-colors flex-shrink-0",title:b("queue.viewArchive"),children:a.jsx(Xr,{className:"w-3.5 h-3.5"})}):t.library_file_id?a.jsx(Fs,{to:`/library?highlight=${t.library_file_id}`,className:"text-bambu-gray hover:text-bambu-green transition-colors flex-shrink-0",title:b("queue.viewInFileManager"),children:a.jsx(Xr,{className:"w-3.5 h-3.5"})}):null]}),a.jsxs("div",{className:"flex items-center gap-3 text-sm text-bambu-gray",children:[a.jsxs("span",{className:`flex items-center gap-1.5 ${t.printer_id===null&&!t.target_model?"text-orange-400":""} ${t.target_model?"text-blue-400":""}`,children:[a.jsx(Or,{className:"w-3.5 h-3.5"}),t.target_model?`${b("queue.filter.any")} ${t.target_model}${t.target_location?` @ ${t.target_location}`:""}${t.required_filament_types?.length?` (${t.required_filament_types.join(", ")})`:""}`:t.printer_id===null?b("queue.filter.unassigned"):t.printer_name||`${b("common.printer")} #${t.printer_id}`]}),t.print_time_seconds&&a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx(Su,{className:"w-3.5 h-3.5"}),lae(t.print_time_seconds)]}),t.created_by_username&&a.jsxs("span",{className:"flex items-center gap-1.5",title:b("queue.addedBy",{name:t.created_by_username}),children:[a.jsx(Hu,{className:"w-3.5 h-3.5"}),t.created_by_username]}),P&&!t.manual_start&&a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx(nr,{className:"w-3.5 h-3.5"}),MYe(t.scheduled_time,c,b)]})]}),a.jsxs("div",{className:"flex items-center gap-2 mt-2",children:[t.manual_start&&a.jsxs("span",{className:"text-xs px-2 py-0.5 bg-purple-500/10 text-purple-400 rounded-full border border-purple-500/20 flex items-center gap-1",children:[a.jsx(LK,{className:"w-3 h-3"}),b("queue.badges.staged")]}),t.require_previous_success&&a.jsx("span",{className:"text-xs px-2 py-0.5 bg-orange-500/10 text-orange-400 rounded-full border border-orange-500/20",children:b("queue.badges.requiresPrevious")}),t.auto_off_after&&a.jsxs("span",{className:"text-xs px-2 py-0.5 bg-blue-500/10 text-blue-400 rounded-full border border-blue-500/20 flex items-center gap-1",children:[a.jsx(Zu,{className:"w-3 h-3"}),b("queue.badges.autoPowerOff")]})]}),E&&a.jsxs("div",{className:"mt-3",children:[a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full overflow-hidden",children:a.jsx("div",{className:"h-full bg-gradient-to-r from-blue-500 to-blue-400 animate-pulse w-full opacity-50"})}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:b("queue.printingInProgress")})]}),t.waiting_reason&&t.status==="pending"&&a.jsxs("p",{className:"text-xs text-purple-400 mt-2 flex items-start gap-1",children:[a.jsx(Wi,{className:"w-3 h-3 mt-0.5 flex-shrink-0"}),a.jsx("span",{children:t.waiting_reason})]}),t.error_message&&a.jsxs("p",{className:"text-xs text-red-400 mt-2 flex items-center gap-1",children:[a.jsx(Wi,{className:"w-3 h-3"}),t.error_message]})]}),a.jsx(kYe,{status:t.status,waitingReason:t.waiting_reason,printerState:p,t:b}),a.jsxs("div",{className:"flex items-center gap-1",children:[E&&a.jsx(ke,{variant:"ghost",size:"sm",onClick:s,disabled:!h("printers:control"),title:h("printers:control")?b("queue.actions.stopPrint"):b("queue.permissions.noStopPrint"),className:"text-red-400 hover:text-red-300 hover:bg-red-500/10",children:a.jsx(_de,{className:"w-4 h-4"})}),P&&a.jsxs(a.Fragment,{children:[t.manual_start&&a.jsx(ke,{variant:"ghost",size:"sm",onClick:l,disabled:!h("printers:control"),title:h("printers:control")?b("queue.actions.startPrint"):b("queue.permissions.noStartPrint"),className:"text-bambu-green hover:text-bambu-green-light hover:bg-bambu-green/10",children:a.jsx(vo,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:n,disabled:!m("queue","update",t.created_by_id),title:m("queue","update",t.created_by_id)?b("common.edit"):b("queue.permissions.noEdit"),children:a.jsx(na,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:r,disabled:!m("queue","delete",t.created_by_id),title:m("queue","delete",t.created_by_id)?b("common.cancel"):b("queue.permissions.noCancel"),className:"text-red-400 hover:text-red-300 hover:bg-red-500/10",children:a.jsx(Lt,{className:"w-4 h-4"})})]}),T&&a.jsxs(a.Fragment,{children:[a.jsx(ke,{variant:"ghost",size:"sm",onClick:o,disabled:!h("queue:create"),title:h("queue:create")?b("queue.actions.requeue"):b("queue.permissions.noRequeue"),className:"text-bambu-green hover:text-bambu-green/80 hover:bg-bambu-green/10",children:a.jsx(Ir,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:i,disabled:!m("queue","delete",t.created_by_id),title:m("queue","delete",t.created_by_id)?b("common.remove"):b("queue.permissions.noRemove"),children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})})}function AYe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),{hasPermission:r,hasAnyPermission:i,canModify:s}=Di(),[o,l]=_.useState(null),[c,u]=_.useState(""),[d,h]=_.useState(""),[m,p]=_.useState(!1),[b,v]=_.useState(null),[x,y]=_.useState(null),[S,N]=_.useState(null),[A,k]=_.useState([]),[C,E]=_.useState(!1),[P,T]=_.useState(()=>localStorage.getItem("queue.historySortBy")||"date"),[j,z]=_.useState(()=>{const ee=localStorage.getItem("queue.historySortAsc");return ee!==null?ee==="true":!1}),[L,B]=_.useState(()=>localStorage.getItem("queue.pendingSortBy")||"position"),[R,$]=_.useState(()=>{const ee=localStorage.getItem("queue.pendingSortAsc");return ee!==null?ee==="true":!0});_.useEffect(()=>{localStorage.setItem("queue.historySortBy",P)},[P]),_.useEffect(()=>{localStorage.setItem("queue.historySortAsc",String(j))},[j]),_.useEffect(()=>{localStorage.setItem("queue.pendingSortBy",L)},[L]),_.useEffect(()=>{localStorage.setItem("queue.pendingSortAsc",String(R))},[R]);const q=Fie(NM(pk,{activationConstraint:{distance:8}}),NM(mk,{coordinateGetter:sae})),{data:I}=st({queryKey:["settings"],queryFn:ce.getSettings}),G=I?.time_format||"system",{data:Y,isLoading:re}=st({queryKey:["queue",o,c],queryFn:()=>ce.getQueue(o||void 0,c||void 0),refetchInterval:5e3}),{data:H}=st({queryKey:["printers"],queryFn:()=>ce.getPrinters()}),K=pt({mutationFn:ee=>ce.cancelQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.cancelled"))},onError:()=>n(t("queue.toast.cancelFailed"),"error")}),ne=pt({mutationFn:ee=>ce.removeFromQueue(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.removed"))},onError:()=>n(t("queue.toast.removeFailed"),"error")}),ie=pt({mutationFn:ee=>ce.stopQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.stopped"))},onError:()=>n(t("queue.toast.stopFailed"),"error")}),be=pt({mutationFn:ee=>ce.startQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.released"))},onError:()=>n(t("queue.toast.startFailed"),"error")}),pe=pt({mutationFn:ee=>ce.reorderQueue(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]})},onError:()=>n(t("queue.toast.reorderFailed"),"error")}),de=pt({mutationFn:async()=>{const ee=Y?.filter(U=>["completed","failed","skipped","cancelled"].includes(U.status))||[];for(const U of ee)await ce.removeFromQueue(U.id);return ee.length},onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.historyCleared",{count:ee}))},onError:()=>n(t("queue.toast.clearHistoryFailed"),"error")}),Ce=pt({mutationFn:ee=>ce.bulkUpdateQueue(ee),onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),k([]),E(!1),n(ee.message)},onError:()=>n(t("queue.toast.updateFailed"),"error")}),ae=pt({mutationFn:async ee=>{for(const U of ee)await ce.cancelQueueItem(U);return ee.length},onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),k([]),n(t("queue.toast.bulkCancelled",{count:ee}))},onError:()=>n(t("queue.toast.bulkCancelFailed"),"error")}),Ae=ee=>{k(U=>U.includes(ee)?U.filter(O=>O!==ee):[...U,ee])},Le=_.useMemo(()=>{const ee=new Set;return H?.forEach(U=>{U.location&&ee.add(U.location)}),Y?.forEach(U=>{U.target_location&&ee.add(U.target_location)}),Array.from(ee).sort()},[H,Y]),fe=_.useCallback(ee=>d?ee.target_location?ee.target_location===d:ee.printer_id?H?.find(O=>O.id===ee.printer_id)?.location===d:!1:!0,[d,H]),Xe=_.useMemo(()=>{let ee=Y?.filter(O=>O.status==="pending")||[];d&&(ee=ee.filter(fe));const U=O=>{if(!O.scheduled_time)return 0;const Z=new Date(O.scheduled_time).getTime(),le=Date.now()+4320*60*60*1e3;return Z>le?0:Z};return[...ee].sort((O,Z)=>{let le;if(L==="name"){const we=O.archive_name||O.library_file_name||"",ye=Z.archive_name||Z.library_file_name||"";le=we.localeCompare(ye)}else L==="printer"?le=(O.printer_name||"").localeCompare(Z.printer_name||""):L==="time"?le=U(O)-U(Z):le=O.position-Z.position;return R?le:-le})},[Y,L,R,fe,d]),W=()=>{const ee=Xe.map(U=>U.id);A.length===ee.length?k([]):k(ee)},Q=_.useMemo(()=>{let ee=Y?.filter(U=>U.status==="printing")||[];return d&&(ee=ee.filter(fe)),ee},[Y,d,fe]),me=_.useMemo(()=>{const ee=new Set;return Q.forEach(U=>{U.printer_id&&ee.add(U.printer_id)}),Array.from(ee)},[Q]),X=iO({queries:me.map(ee=>({queryKey:["printerStatus",ee],queryFn:()=>ce.getPrinterStatus(ee),refetchInterval:5e3}))}),te=_.useMemo(()=>{const ee={};return me.forEach((U,O)=>{const Z=X[O];Z?.data?.state&&(ee[U]=Z.data.state)}),ee},[me,X]),V=_.useMemo(()=>{let ee=Y?.filter(U=>["completed","failed","skipped","cancelled"].includes(U.status))||[];return d&&(ee=ee.filter(fe)),[...ee].sort((U,O)=>{let Z;if(P==="name"){const le=U.archive_name||U.library_file_name||"",we=O.archive_name||O.library_file_name||"";Z=le.localeCompare(we)}else P==="printer"?Z=(U.printer_name||"").localeCompare(O.printer_name||""):Z=new Date(O.completed_at||O.created_at).getTime()-new Date(U.completed_at||U.created_at).getTime();return j?-Z:Z})},[Y,P,j,fe,d]),ge=_.useMemo(()=>Xe.reduce((ee,U)=>ee+(U.print_time_seconds||0),0),[Xe]),Se=ee=>{const{active:U,over:O}=ee;if(!O||U.id===O.id)return;const Z=Xe.findIndex(we=>we.id===U.id),le=Xe.findIndex(we=>we.id===O.id);if(Z!==-1&&le!==-1){const ye=xk(Xe,Z,le).map((se,Oe)=>({id:se.id,position:Oe+1}));pe.mutate(ye)}};return a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsx("div",{className:"flex items-center justify-between mb-8",children:a.jsxs("div",{children:[a.jsxs("h1",{className:"text-2xl font-bold text-white flex items-center gap-3",children:[a.jsx(FK,{className:"w-7 h-7 text-bambu-green"}),t("queue.title")]}),a.jsx("p",{className:"text-bambu-gray mt-1",children:t("queue.subtitle")})]})}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 mb-8",children:[a.jsx(_t,{className:"bg-gradient-to-br from-blue-500/10 to-transparent border-blue-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-blue-500/20 flex items-center justify-center",children:a.jsx(vo,{className:"w-5 h-5 text-blue-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:Q.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.printing")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-yellow-500/10 to-transparent border-yellow-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-yellow-500/20 flex items-center justify-center",children:a.jsx(nr,{className:"w-5 h-5 text-yellow-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:Xe.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.queued")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-bambu-green/10 to-transparent border-bambu-green/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-bambu-green/20 flex items-center justify-center",children:a.jsx(Su,{className:"w-5 h-5 text-bambu-green"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:lae(ge)}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.totalTime")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-gray-500/10 to-transparent border-gray-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-gray-500/20 flex items-center justify-center",children:a.jsx(Nr,{className:"w-5 h-5 text-gray-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:V.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.history")})]})]})})})]}),a.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:o===-1?"unassigned":o||"",onChange:ee=>{const U=ee.target.value;l(U==="unassigned"?-1:U===""?null:Number(U))},children:[a.jsx("option",{value:"",children:t("queue.filter.allPrinters")}),a.jsx("option",{value:"unassigned",children:t("queue.filter.unassigned")}),H?.map(ee=>a.jsx("option",{value:ee.id,children:ee.name},ee.id))]}),a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:c,onChange:ee=>u(ee.target.value),children:[a.jsx("option",{value:"",children:t("queue.filter.allStatus")}),a.jsx("option",{value:"pending",children:t("queue.status.pending")}),a.jsx("option",{value:"printing",children:t("queue.status.printing")}),a.jsx("option",{value:"completed",children:t("queue.status.completed")}),a.jsx("option",{value:"failed",children:t("queue.status.failed")}),a.jsx("option",{value:"skipped",children:t("queue.status.skipped")}),a.jsx("option",{value:"cancelled",children:t("queue.status.cancelled")})]}),Le.length>0&&a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:d,onChange:ee=>h(ee.target.value),children:[a.jsx("option",{value:"",children:t("queue.filter.allLocations")}),Le.map(ee=>a.jsx("option",{value:ee,children:ee},ee))]}),a.jsx("div",{className:"flex-1"}),V.length>0&&a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>p(!0),disabled:!r("queue:delete_all"),title:r("queue:delete_all")?void 0:t("queue.permissions.noClearHistory"),children:[a.jsx(cn,{className:"w-4 h-4"}),t("queue.clearHistory")]})]}),re?a.jsx("div",{className:"text-center py-12 text-bambu-gray",children:t("common.loading")}):Y?.length===0?a.jsxs(_t,{className:"p-12 text-center border-dashed",children:[a.jsx(ei,{className:"w-16 h-16 text-bambu-gray mx-auto mb-4 opacity-50"}),a.jsx("h3",{className:"text-xl font-medium text-white mb-2",children:t("queue.empty.title")}),a.jsx("p",{className:"text-bambu-gray max-w-md mx-auto",children:t("queue.empty.description")})]}):a.jsxs("div",{className:"space-y-8",children:[Q.length>0&&a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white mb-4 flex items-center gap-2",children:[a.jsx("div",{className:"w-2 h-2 rounded-full bg-blue-400 animate-pulse"}),t("queue.sections.currentlyPrinting")]}),a.jsx("div",{className:"space-y-3",children:Q.map(ee=>a.jsx(gP,{item:ee,onEdit:()=>{},onCancel:()=>{},onRemove:()=>{},onStop:()=>N({type:"stop",item:ee}),onRequeue:()=>{},onStart:()=>{},timeFormat:G,hasPermission:r,canModify:s,printerState:ee.printer_id?te[ee.printer_id]:null,t},ee.id))})]}),Xe.length>0&&a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(nr,{className:"w-5 h-5 text-yellow-400"}),t("queue.sections.queued"),a.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",t("queue.itemCount",{count:Xe.length}),")"]}),a.jsx("span",{className:"text-xs text-bambu-gray ml-2",title:t("queue.reorderHint"),children:t("queue.dragToReorder")})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("select",{className:"px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:L,onChange:ee=>B(ee.target.value),children:[a.jsx("option",{value:"position",children:t("queue.sort.byPosition")}),a.jsx("option",{value:"name",children:t("queue.sort.byName")}),a.jsx("option",{value:"printer",children:t("queue.sort.byPrinter")}),a.jsx("option",{value:"time",children:t("queue.sort.bySchedule")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>$(!R),title:t(R?"common.ascending":"common.descending"),className:"px-2",children:R?a.jsx(Zg,{className:"w-4 h-4"}):a.jsx(ay,{className:"w-4 h-4"})})]})]}),a.jsxs("div",{className:"flex items-center gap-3 mb-4 p-3 bg-bambu-dark rounded-lg",children:[a.jsxs(ke,{variant:"ghost",size:"sm",onClick:W,className:"flex items-center gap-2",children:[A.length===Xe.length&&Xe.length>0?a.jsx(qs,{className:"w-4 h-4 text-bambu-green"}):a.jsx(ll,{className:"w-4 h-4"}),A.length===Xe.length&&Xe.length>0?t("queue.bulkEdit.deselectAll"):t("queue.bulkEdit.selectAll")]}),A.length>0&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:t("queue.bulkEdit.selected",{count:A.length})}),a.jsx("div",{className:"h-4 w-px bg-bambu-dark-tertiary"}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>E(!0),className:"flex items-center gap-2 text-bambu-green hover:text-bambu-green-light",disabled:!i("queue:update_own","queue:update_all"),title:i("queue:update_own","queue:update_all")?void 0:t("queue.permissions.noEditItems"),children:[a.jsx(na,{className:"w-4 h-4"}),t("queue.bulkEdit.editSelected")]}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>ae.mutate(A),className:"flex items-center gap-2 text-red-400 hover:text-red-300",disabled:ae.isPending||!i("queue:delete_own","queue:delete_all"),title:i("queue:delete_own","queue:delete_all")?void 0:t("queue.permissions.noCancelItems"),children:[a.jsx(Lt,{className:"w-4 h-4"}),t("queue.bulkEdit.cancelSelected")]})]})]}),a.jsx(eae,{sensors:q,collisionDetection:Bie,onDragEnd:Se,children:a.jsx(rae,{items:Xe.map(ee=>ee.id),strategy:mYe,children:a.jsx("div",{className:"space-y-3",children:Xe.map((ee,U)=>a.jsx(gP,{item:ee,position:U+1,onEdit:()=>v(ee),onCancel:()=>N({type:"cancel",item:ee}),onRemove:()=>{},onStop:()=>{},onRequeue:()=>{},onStart:()=>be.mutate(ee.id),timeFormat:G,isSelected:A.includes(ee.id),onToggleSelect:()=>Ae(ee.id),hasPermission:r,canModify:s,t},ee.id))})})})]}),V.length>0&&a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Nr,{className:"w-5 h-5 text-bambu-gray"}),t("queue.sections.history"),a.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",t("queue.itemCount",{count:V.length}),")"]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("select",{className:"px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:P,onChange:ee=>T(ee.target.value),children:[a.jsx("option",{value:"date",children:t("queue.sort.byDate")}),a.jsx("option",{value:"name",children:t("queue.sort.byName")}),a.jsx("option",{value:"printer",children:t("queue.sort.byPrinter")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>z(!j),title:t(j?"queue.sort.ascendingOldest":"queue.sort.descendingNewest"),className:"px-2",children:j?a.jsx(Zg,{className:"w-4 h-4"}):a.jsx(ay,{className:"w-4 h-4"})})]})]}),a.jsx("div",{className:"space-y-3",children:V.slice(0,20).map((ee,U)=>a.jsx(gP,{item:ee,position:U+1,onEdit:()=>{},onCancel:()=>{},onRemove:()=>N({type:"remove",item:ee}),onStop:()=>{},onRequeue:()=>y(ee),onStart:()=>{},timeFormat:G,hasPermission:r,canModify:s,t},ee.id))})]})]}),b&&a.jsx(Fu,{mode:"edit-queue-item",archiveId:b.archive_id??void 0,libraryFileId:b.library_file_id??void 0,archiveName:b.archive_name||b.library_file_name||`File #${b.archive_id||b.library_file_id}`,queueItem:b,onClose:()=>v(null)}),x&&a.jsx(Fu,{mode:"add-to-queue",archiveId:x.archive_id??void 0,libraryFileId:x.library_file_id??void 0,archiveName:x.archive_name||x.library_file_name||`File #${x.archive_id||x.library_file_id}`,onClose:()=>y(null)}),S&&a.jsx(er,{title:S.type==="cancel"?t("queue.confirm.cancelTitle"):S.type==="stop"?t("queue.confirm.stopTitle"):t("queue.confirm.removeTitle"),message:S.type==="cancel"?t("queue.confirm.cancelMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisPrint")}):S.type==="stop"?t("queue.confirm.stopMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisPrint")}):t("queue.confirm.removeMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisItem")}),confirmText:S.type==="cancel"?t("queue.confirm.cancelButton"):S.type==="stop"?t("queue.confirm.stopButton"):t("common.remove"),variant:"danger",onConfirm:()=>{S.type==="cancel"?K.mutate(S.item.id):S.type==="stop"?ie.mutate(S.item.id):ne.mutate(S.item.id),N(null)},onCancel:()=>N(null)}),m&&a.jsx(er,{title:t("queue.confirm.clearHistoryTitle"),message:t("queue.confirm.clearHistoryMessage",{count:V.length}),confirmText:t("queue.clearHistory"),variant:"danger",onConfirm:()=>{de.mutate(),p(!1)},onCancel:()=>p(!1)}),C&&a.jsx(EYe,{selectedCount:A.length,printers:H?.map(ee=>({id:ee.id,name:ee.name}))||[],onSave:ee=>{Object.keys(ee).length>0&&Ce.mutate({item_ids:A,...ee})},onClose:()=>E(!1),isSaving:Ce.isPending,t})]})}function TYe({printDates:t,months:e=3}){const n=_.useRef(null),[r,i]=_.useState(0);_.useEffect(()=>{const S=n.current;if(!S)return;const N=new ResizeObserver(A=>{const k=A[0]?.contentRect.width||0;i(k)});return N.observe(S),()=>N.disconnect()},[]);const{weeks:s,monthLabels:o,printCounts:l}=_.useMemo(()=>{const S={};t.forEach(z=>{const L=z.split("T")[0];S[L]=(S[L]||0)+1});const N=new Date,A=new Date(N);A.setMonth(A.getMonth()-e),A.setDate(A.getDate()-A.getDay());const k=[],C=[];let E=[],P=-1;const T=new Date(A);let j=0;for(;T<=N;)T.getDay()===0&&E.length>0&&(k.push(E),E=[],j++),T.getMonth()!==P&&(C.push({month:T.toLocaleDateString("en-US",{month:"short"}),weekIndex:j}),P=T.getMonth()),E.push(new Date(T)),T.setDate(T.getDate()+1);return E.length>0&&k.push(E),{weeks:k,monthLabels:C,printCounts:S}},[t,e]),c=Math.max(1,...Object.values(l)),u=S=>{if(S===0)return"bg-bambu-dark";const N=S/c;return N<=.25?"bg-bambu-green/30":N<=.5?"bg-bambu-green/50":N<=.75?"bg-bambu-green/75":"bg-bambu-green"},d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h=s.length,m=32,p=2,b=r-m-16,v=h>0?Math.floor((b-(h-1)*p)/h):12,x=Math.max(8,Math.min(20,v)),y=x<=10?10:12;return a.jsx("div",{ref:n,className:"w-full flex justify-center",children:r>0&&a.jsxs("div",{children:[a.jsx("div",{className:"flex mb-1",style:{marginLeft:m+4},children:o.map(({month:S,weekIndex:N},A)=>a.jsx("div",{className:"text-bambu-gray",style:{fontSize:y,marginLeft:A===0?0:`${(N-(o[A-1]?.weekIndex||0))*(x+p)-24}px`},children:S},A))}),a.jsxs("div",{className:"flex",style:{gap:p},children:[a.jsx("div",{className:"flex flex-col",style:{gap:p,marginRight:4,width:m},children:d.map((S,N)=>a.jsx("div",{className:"text-bambu-gray flex items-center",style:{width:m,height:x,fontSize:y,visibility:N%2===1?"visible":"hidden"},children:S},S))}),s.map((S,N)=>a.jsx("div",{className:"flex flex-col",style:{gap:p},children:[0,1,2,3,4,5,6].map(A=>{const k=S.find(T=>T.getDay()===A);if(!k)return a.jsx("div",{style:{width:x,height:x}},A);const C=k.toISOString().split("T")[0],E=l[C]||0,P=C===new Date().toISOString().split("T")[0];return a.jsx("div",{className:`rounded-sm ${u(E)} ${P?"ring-1 ring-white":""}`,style:{width:x,height:x},title:`${k.toLocaleDateString()}: ${E} print${E!==1?"s":""}`},A)})},N))]}),a.jsxs("div",{className:"flex items-center gap-2 mt-3 text-bambu-gray",style:{fontSize:y},children:[a.jsx("span",{children:"Less"}),a.jsxs("div",{className:"flex",style:{gap:p},children:[a.jsx("div",{className:"rounded-sm bg-bambu-dark",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/30",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/50",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/75",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green",style:{width:x,height:x}})]}),a.jsx("span",{children:"More"})]})]})})}const E1=["#00ae42","#3b82f6","#f59e0b","#ef4444","#8b5cf6","#ec4899","#14b8a6","#f97316"];function CYe(t){const e=new Date;switch(t){case"7d":return new Date(e.getTime()-10080*60*1e3);case"30d":return new Date(e.getTime()-720*60*60*1e3);case"90d":return new Date(e.getTime()-2160*60*60*1e3);case"365d":return new Date(e.getTime()-365*24*60*60*1e3);case"all":return new Date(0)}}function jYe({archives:t,currency:e="$"}){const[n,r]=_.useState("30d"),i=_.useMemo(()=>{const p=CYe(n);return t.filter(b=>(Hi(b.completed_at||b.created_at)||new Date(0))>=p)},[t,n]),s=_.useMemo(()=>{const p=new Map;return i.forEach(b=>{const v=Hi(b.completed_at||b.created_at)||new Date,x=`${v.getFullYear()}-${String(v.getMonth()+1).padStart(2,"0")}-${String(v.getDate()).padStart(2,"0")}`,y=p.get(x)||{date:x,filament:0,cost:0,prints:0},S=b.quantity||1;y.filament+=(b.filament_used_grams||0)*S,y.cost+=b.cost||0,y.prints+=S,p.set(x,y)}),Array.from(p.values()).sort((b,v)=>b.date.localeCompare(v.date)).map(b=>({...b,dateLabel:new Date(b.date).toLocaleDateString("en-US",{month:"short",day:"numeric"})}))},[i]),o=_.useMemo(()=>{if(n==="7d"||n==="30d")return s;const p=new Map;return i.forEach(b=>{const v=Hi(b.completed_at||b.created_at)||new Date,x=new Date(v);x.setDate(v.getDate()-v.getDay());const y=`${x.getFullYear()}-${String(x.getMonth()+1).padStart(2,"0")}-${String(x.getDate()).padStart(2,"0")}`,S=p.get(y)||{week:y,filament:0,cost:0,prints:0},N=b.quantity||1;S.filament+=(b.filament_used_grams||0)*N,S.cost+=b.cost||0,S.prints+=N,p.set(y,S)}),Array.from(p.values()).sort((b,v)=>b.week.localeCompare(v.week)).map(b=>({date:b.week,dateLabel:`Week of ${new Date(b.week).toLocaleDateString("en-US",{month:"short",day:"numeric"})}`,...b}))},[i,s,n]),l=_.useMemo(()=>{const p=new Map;return i.forEach(b=>{const v=b.filament_type||"Unknown",x=b.quantity||1,y=v.split(", ");y.forEach(S=>{const N=(b.filament_used_grams||0)*x/y.length;p.set(S,(p.get(S)||0)+N)})}),Array.from(p.entries()).map(([b,v])=>({name:b,value:Math.round(v)})).sort((b,v)=>v.value-b.value)},[i]),c=_.useMemo(()=>{const p=new Date,b=[];for(let v=5;v>=0;v--){const x=new Date(p.getFullYear(),p.getMonth()-v,1),y=new Date(p.getFullYear(),p.getMonth()-v+1,0),S=x.toLocaleDateString("en-US",{month:"short",year:"2-digit"}),N=t.filter(A=>{const k=Hi(A.completed_at||A.created_at)||new Date(0);return k>=x&&k<=y});b.push({month:S,filament:Math.round(N.reduce((A,k)=>A+(k.filament_used_grams||0),0)),cost:N.reduce((A,k)=>A+(k.cost||0),0),prints:N.reduce((A,k)=>A+(k.quantity||1),0)})}return b},[t]),u=n==="7d"||n==="30d"?s:o,d=i.reduce((p,b)=>p+(b.filament_used_grams||0),0),h=i.reduce((p,b)=>p+(b.cost||0),0),m=i.reduce((p,b)=>p+(b.quantity||1),0);return a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:"Filament Usage Trends"}),a.jsx("div",{className:"flex gap-1 bg-bambu-dark rounded-lg p-1",children:["7d","30d","90d","365d","all"].map(p=>a.jsx("button",{onClick:()=>r(p),className:`px-3 py-1 text-sm rounded-md transition-colors ${n===p?"bg-bambu-green text-white":"text-bambu-gray hover:text-white"}`,children:p==="all"?"All":p.replace("d","D")},p))})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Period Filament"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[(d/1e3).toFixed(2),"kg"]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[d.toFixed(0),"g total"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Period Cost"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[e,h.toFixed(2)]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[m," prints"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Avg per Print"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[m>0?(d/m).toFixed(0):0,"g"]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[e,m>0?(h/m).toFixed(2):"0.00"," avg"]})]})]}),u.length>0?a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"Usage Over Time"}),a.jsx(W1,{width:"100%",height:250,children:a.jsxs(A6e,{data:u,children:[a.jsx("defs",{children:a.jsxs("linearGradient",{id:"colorFilament",x1:"0",y1:"0",x2:"0",y2:"1",children:[a.jsx("stop",{offset:"5%",stopColor:"#00ae42",stopOpacity:.3}),a.jsx("stop",{offset:"95%",stopColor:"#00ae42",stopOpacity:0})]})}),a.jsx(_N,{strokeDasharray:"3 3",stroke:"#3d3d3d"}),a.jsx(kN,{dataKey:"dateLabel",stroke:"#9ca3af",tick:{fontSize:12},interval:"preserveStartEnd"}),a.jsx(EN,{stroke:"#9ca3af",tick:{fontSize:12},tickFormatter:p=>`${p}g`}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},labelStyle:{color:"#fff"},formatter:p=>[`${Number(p??0).toFixed(0)}g`,"Filament"]}),a.jsx(fte,{type:"monotone",dataKey:"filament",stroke:"#00ae42",strokeWidth:2,fillOpacity:1,fill:"url(#colorFilament)"})]})})]}):a.jsx("div",{className:"bg-bambu-dark rounded-lg p-8 text-center text-bambu-gray",children:"No data for selected time range"}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"By Filament Type"}),l.length>0?a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx(W1,{width:160,height:160,children:a.jsxs(k6e,{children:[a.jsx(Uee,{data:l,cx:"50%",cy:"50%",innerRadius:40,outerRadius:70,paddingAngle:2,dataKey:"value",children:l.map((p,b)=>a.jsx(kv,{fill:E1[b%E1.length]},`cell-${b}`))}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},formatter:p=>[`${p??0}g`,"Usage"]})]})}),a.jsx("div",{className:"flex-1 space-y-2 overflow-hidden",children:l.map((p,b)=>{const v=l.reduce((y,S)=>y+S.value,0),x=v>0?(p.value/v*100).toFixed(0):0;return a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx("div",{className:"w-3 h-3 rounded-sm flex-shrink-0",style:{backgroundColor:E1[b%E1.length]}}),a.jsx("span",{className:"text-white truncate flex-1",children:p.name}),a.jsxs("span",{className:"text-bambu-gray flex-shrink-0",children:[x,"%"]})]},p.name)})})]}):a.jsx("div",{className:"h-[160px] flex items-center justify-center text-bambu-gray",children:"No filament data"})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"Monthly Comparison"}),a.jsx(W1,{width:"100%",height:200,children:a.jsxs(m6e,{data:c,children:[a.jsx(_N,{strokeDasharray:"3 3",stroke:"#3d3d3d"}),a.jsx(kN,{dataKey:"month",stroke:"#9ca3af",tick:{fontSize:12}}),a.jsx(EN,{stroke:"#9ca3af",tick:{fontSize:12},tickFormatter:p=>`${p}g`}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},formatter:(p,b)=>[b==="filament"?`${p??0}g`:b==="cost"?`${e}${Number(p??0).toFixed(2)}`:p??0,b==="filament"?"Filament":b==="cost"?"Cost":"Prints"]}),a.jsx(b4,{}),a.jsx(xte,{dataKey:"filament",name:"Filament (g)",fill:"#00ae42",radius:[4,4,0,0]})]})})]})]})]})}function PYe({id:t,title:e,component:n,isHidden:r,size:i,onToggleVisibility:s,onToggleSize:o}){const{attributes:l,listeners:c,setNodeRef:u,transform:d,transition:h,isDragging:m}=aae({id:t}),p={transform:Eb.Transform.toString(d),transition:h,opacity:m?.5:1};return r?null:a.jsxs("div",{ref:u,style:{...p,gridColumn:`span ${i}`},className:`bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary overflow-hidden ${m?"ring-2 ring-bambu-green shadow-lg":""}`,children:[a.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/30",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{...l,...c,className:"cursor-grab active:cursor-grabbing p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:"Drag to reorder",children:a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray"})}),a.jsx("h3",{className:"text-sm font-medium text-white",children:e})]}),a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("button",{onClick:o,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:`Size: ${i===1?"1/4":i===2?"1/2":"Full"} - Click to cycle`,children:i===4?a.jsx(lO,{className:"w-4 h-4 text-bambu-gray hover:text-white"}):a.jsx(oO,{className:"w-4 h-4 text-bambu-gray hover:text-white"})}),a.jsx("button",{onClick:s,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:"Hide widget",children:a.jsx(RM,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]})]}),a.jsx("div",{className:"p-4",children:typeof n=="function"?n(i):n})]})}function DYe({widgets:t,storageKey:e,columns:n=4,hideControls:r=!1,onResetLayout:i,renderControls:s}){const o=()=>{const A={};return t.forEach(k=>{A[k.id]=k.defaultSize||4}),A},[l,c]=_.useState(()=>{const A=localStorage.getItem(e);if(A)try{const k=JSON.parse(A);return k.sizes||(k.sizes=o()),k}catch{}return{order:t.map(k=>k.id),hidden:t.filter(k=>k.defaultVisible===!1).map(k=>k.id),sizes:o()}}),[u,d]=_.useState(!1);_.useEffect(()=>{const A=()=>d(k=>!k);return window.addEventListener("toggle-hidden-panel",A),()=>window.removeEventListener("toggle-hidden-panel",A)},[]),_.useEffect(()=>{localStorage.setItem(e,JSON.stringify(l))},[l,e]),_.useEffect(()=>{const k=t.map(C=>C.id).filter(C=>!l.order.includes(C));k.length>0&&c(C=>({...C,order:[...C.order,...k]}))},[t,l.order]);const h=Fie(NM(pk,{activationConstraint:{distance:8}}),NM(mk,{coordinateGetter:sae})),m=A=>{const{active:k,over:C}=A;C&&k.id!==C.id&&c(E=>{const P=E.order.indexOf(k.id),T=E.order.indexOf(C.id);return{...E,order:xk(E.order,P,T)}})},p=A=>{c(k=>({...k,hidden:k.hidden.includes(A)?k.hidden.filter(C=>C!==A):[...k.hidden,A]}))},b=A=>{c(k=>{const C=k.sizes[A]||4,E=C===1?2:C===2?4:1;return{...k,sizes:{...k.sizes,[A]:E}}})},v=()=>{const A={order:t.map(k=>k.id),hidden:t.filter(k=>k.defaultVisible===!1).map(k=>k.id),sizes:o()};c(A),i?.()},x=l.order.map(A=>t.find(k=>k.id===A)).filter(Boolean),y=x.filter(A=>!l.hidden.includes(A.id)),S=x.filter(A=>l.hidden.includes(A.id)),N=s?.({hiddenCount:S.length,showHiddenPanel:u,setShowHiddenPanel:d,resetLayout:v});return a.jsxs("div",{className:"space-y-4",children:[N,!r&&!s&&a.jsxs("div",{className:"flex items-center justify-end gap-2",children:[a.jsxs(ke,{variant:"secondary",size:"sm",onClick:v,children:[a.jsx($h,{className:"w-4 h-4"}),"Reset Layout"]}),S.length>0&&a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>d(!u),children:[a.jsx(_c,{className:"w-4 h-4"}),S.length," Hidden"]})]}),u&&S.length>0&&a.jsxs("div",{className:"p-4 bg-bambu-dark rounded-xl border border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-3",children:"Hidden widgets (click to show):"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:S.map(A=>a.jsxs("button",{onClick:()=>p(A.id),className:"px-3 py-1.5 bg-bambu-dark-tertiary hover:bg-bambu-green/20 rounded-lg text-sm text-white transition-colors flex items-center gap-2",children:[a.jsx(_c,{className:"w-3 h-3"}),A.title]},A.id))})]}),a.jsx(eae,{sensors:h,collisionDetection:Bie,onDragEnd:m,children:a.jsx(rae,{items:y.map(A=>A.id),strategy:BF,children:a.jsx("div",{className:"grid gap-6",style:{gridTemplateColumns:`repeat(${n}, minmax(0, 1fr))`},children:y.map(A=>a.jsx(PYe,{id:A.id,title:A.title,component:A.component,isHidden:l.hidden.includes(A.id),size:l.sizes[A.id]||2,onToggleVisibility:()=>p(A.id),onToggleSize:()=>b(A.id)},A.id))})})}),y.length===0&&a.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[a.jsx("p",{children:"All widgets are hidden."}),a.jsx(ke,{className:"mt-4",onClick:v,children:"Reset Layout"})]})]})}function RYe({stats:t,currency:e,t:n}){return a.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-bambu-green",children:a.jsx(Sc,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.totalPrints")}),a.jsx("p",{className:"text-xl font-bold text-white",children:t?.total_prints||0})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-blue-400",children:a.jsx(nr,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.printTime")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[t?.total_print_time_hours.toFixed(1)||0,"h"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-orange-400",children:a.jsx(Sc,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.filamentUsed")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[((t?.total_filament_grams||0)/1e3).toFixed(2),"kg"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-green-400",children:a.jsx(zP,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.filamentCost")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[e," ",t?.total_cost.toFixed(2)||"0.00"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-yellow-400",children:a.jsx(Dh,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.energyUsed")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[t?.total_energy_kwh.toFixed(2)||"0.00"," kWh"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-yellow-500",children:a.jsx(zP,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.energyCost")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[e," ",t?.total_energy_cost.toFixed(2)||"0.00"]})]})]})]})}function OYe({stats:t,printerMap:e,size:n=1,t:r}){const i=t?.total_prints?Math.round(t.successful_prints/t.total_prints*100):0,s=n===1?112:n===2?128:144,o=s/2-8,l=o*2*Math.PI;return a.jsxs("div",{className:"flex items-center gap-6",children:[a.jsxs("div",{className:"relative flex-shrink-0",style:{width:s,height:s},children:[a.jsxs("svg",{className:"w-full h-full -rotate-90",children:[a.jsx("circle",{cx:s/2,cy:s/2,r:o,fill:"none",stroke:"#3d3d3d",strokeWidth:"10"}),a.jsx("circle",{cx:s/2,cy:s/2,r:o,fill:"none",stroke:"#00ae42",strokeWidth:"10",strokeLinecap:"round",strokeDasharray:`${i/100*l} ${l}`})]}),a.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:a.jsxs("span",{className:`font-bold text-white ${n>=2?"text-2xl":"text-xl"}`,children:[i,"%"]})})]}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-status-ok flex-shrink-0"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:r("stats.successful")}),a.jsx("span",{className:"text-sm text-white font-medium",children:t?.successful_prints||0})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ta,{className:"w-4 h-4 text-status-error flex-shrink-0"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:r("stats.failed")}),a.jsx("span",{className:"text-sm text-white font-medium",children:t?.failed_prints||0})]})]}),n>=2&&t?.prints_by_printer&&Object.keys(t.prints_by_printer).length>0&&a.jsxs("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-xs text-bambu-gray font-medium mb-2",children:r("stats.printsByPrinter")}),a.jsx("div",{className:`grid gap-x-6 gap-y-1 ${n===4?"grid-cols-3":"grid-cols-2"}`,style:{width:"fit-content"},children:Object.entries(t.prints_by_printer).map(([c,u])=>a.jsxs("div",{className:"flex items-center gap-3 text-sm",children:[a.jsx("span",{className:"text-bambu-gray truncate max-w-[120px]",children:e.get(c)||`${r("common.printer")} ${c}`}),a.jsx("span",{className:"text-white font-medium",children:u})]},c))})]})]})]})}function LYe({stats:t,printerMap:e,size:n=1,t:r}){const i=t?.average_time_accuracy;if(i==null)return a.jsx("div",{className:"flex items-center justify-center h-full",children:a.jsx("p",{className:"text-bambu-gray text-center py-4",children:r("stats.noTimeAccuracyData")})});const o=(Math.min(150,Math.max(50,i))-50)/100*100,c=(v=>v>=95&&v<=105?"#00ae42":v>105?"#3b82f6":"#f97316")(i),u=i-100,d=n===1?112:n===2?128:144,h=d/2-8,m=h*2*Math.PI,p=n===1?3:n===2?6:999,b=t?.time_accuracy_by_printer?Object.entries(t.time_accuracy_by_printer).slice(0,p):[];return a.jsxs("div",{className:"flex items-center gap-6",children:[a.jsxs("div",{className:"relative flex-shrink-0",style:{width:d,height:d},children:[a.jsxs("svg",{className:"w-full h-full -rotate-90",children:[a.jsx("circle",{cx:d/2,cy:d/2,r:h,fill:"none",stroke:"#3d3d3d",strokeWidth:"10"}),a.jsx("circle",{cx:d/2,cy:d/2,r:h,fill:"none",stroke:c,strokeWidth:"10",strokeLinecap:"round",strokeDasharray:`${o/100*m} ${m}`})]}),a.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[a.jsxs("span",{className:`font-bold text-white ${n>=2?"text-2xl":"text-xl"}`,children:[i.toFixed(0),"%"]}),a.jsxs("span",{className:`text-xs ${u>=0?"text-blue-400":"text-orange-400"}`,children:[u>=0?"+":"",u.toFixed(0),"%"]})]})]}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2 text-xs text-bambu-gray",children:[a.jsx($K,{className:"w-3 h-3 flex-shrink-0"}),a.jsx("span",{children:r("stats.perfectEstimate")})]}),b.length>0&&a.jsx("div",{className:`mt-2 ${n===4?"grid grid-cols-3 gap-x-6 gap-y-1":n===2?"grid grid-cols-2 gap-x-6 gap-y-1":"space-y-1"}`,style:{width:"fit-content"},children:b.map(([v,x])=>a.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[a.jsx("span",{className:"text-bambu-gray truncate max-w-[100px]",children:e.get(v)||`${r("common.printer")} ${v}`}),a.jsxs("span",{className:`font-medium ${x>=95&&x<=105?"text-status-ok":x>105?"text-blue-400":"text-status-warning"}`,children:[x.toFixed(0),"%"]})]},v))})]})]})}function FYe({stats:t,size:e=1,t:n}){if(!t?.prints_by_filament_type||Object.keys(t.prints_by_filament_type).length===0)return a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noFilamentData")});const r=Object.entries(t.prints_by_filament_type).sort(([,l],[,c])=>c-l),i=e===1?5:e===2?8:999,s=r.slice(0,i),o=r.length>i;return e===4&&s.length>4?a.jsx("div",{className:"grid grid-cols-2 lg:grid-cols-3 gap-4",children:s.map(([l,c])=>{const u=Math.round(c/(t.total_prints||1)*100);return a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[a.jsx("span",{className:"text-white truncate max-w-[120px]",children:l}),a.jsx("span",{className:"text-bambu-gray",children:c})]}),a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full",children:a.jsx("div",{className:"h-full bg-bambu-green rounded-full transition-all",style:{width:`${u}%`}})})]},l)})}):a.jsxs("div",{className:"space-y-3",children:[s.map(([l,c])=>{const u=Math.round(c/(t.total_prints||1)*100);return a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[a.jsx("span",{className:"text-white",children:l}),a.jsxs("span",{className:"text-bambu-gray",children:[c," ",n("common.prints")]})]}),a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full",children:a.jsx("div",{className:"h-full bg-bambu-green rounded-full transition-all",style:{width:`${u}%`}})})]},l)}),o&&a.jsx("p",{className:"text-xs text-bambu-gray text-center pt-1",children:n("common.more",{count:r.length-i})})]})}function IYe({printDates:t,size:e=2}){const n=e===1?3:e===2?6:12;return a.jsx(TYe,{printDates:t,months:n})}function UYe({stats:t,printerMap:e,t:n}){return!t?.prints_by_printer||Object.keys(t.prints_by_printer).length===0?a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noPrinterData")}):a.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:Object.entries(t.prints_by_printer).map(([r,i])=>a.jsxs("div",{className:"flex items-center gap-3 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("div",{className:"p-2 bg-bambu-dark-tertiary rounded-lg",children:a.jsx(Or,{className:"w-4 h-4 text-bambu-green"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium text-sm",children:e.get(r)||`${n("common.printer")} ${r}`}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[i," ",n("common.prints")]})]})]},r))})}function zYe({archives:t,currency:e,t:n}){return!t||t.length===0?a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noPrintData")}):a.jsx(jYe,{archives:t,currency:e})}function BYe({size:t=1,t:e}){const{data:n,isLoading:r}=st({queryKey:["failureAnalysis"],queryFn:()=>ce.getFailureAnalysis({days:30})});if(r)return a.jsx("div",{className:"flex justify-center py-4",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})});if(!n||n.total_prints===0)return a.jsx("p",{className:"text-bambu-gray text-center py-4",children:e("stats.noPrintDataLast30Days")});const i=t===1?5:t===2?8:999,s=Object.entries(n.failures_by_reason).sort(([,c],[,u])=>u-c),o=s.slice(0,i),l=s.length>i;return a.jsxs("div",{className:`${t>=2?"flex gap-8":"space-y-4"}`,children:[a.jsxs("div",{className:t>=2?"flex-shrink-0":"",children:[a.jsx("div",{className:"flex items-center gap-4",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(kn,{className:`w-5 h-5 ${n.failure_rate>20?"text-status-error":n.failure_rate>10?"text-status-warning":"text-status-ok"}`}),a.jsxs("span",{className:`font-bold text-white ${t>=2?"text-3xl":"text-2xl"}`,children:[n.failure_rate.toFixed(1),"%"]})]})}),a.jsx("div",{className:"text-sm text-bambu-gray mt-1",children:e("stats.failedPrintsCount",{failed:n.failed_prints,total:n.total_prints})}),n.trend&&n.trend.length>=2&&a.jsx("div",{className:`${t>=2?"mt-4":"mt-2 pt-2 border-t border-bambu-dark-tertiary"}`,children:a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx(GK,{className:`w-4 h-4 ${n.trend[n.trend.length-1].failure_rate0&&a.jsxs("div",{className:`flex-1 ${t>=2?"border-l border-bambu-dark-tertiary pl-8":"pt-2"}`,children:[a.jsx("p",{className:"text-xs text-bambu-gray font-medium mb-2",children:t>=2?e("stats.failureReasons"):e("stats.topFailureReasons")}),a.jsx("div",{className:`${t===4?"grid grid-cols-2 gap-x-6 gap-y-1":"space-y-1"}`,children:o.map(([c,u])=>a.jsxs("div",{className:"flex items-center justify-between text-sm",children:[a.jsx("span",{className:`text-white truncate ${t===4?"max-w-[200px]":"max-w-[160px]"}`,children:c||e("common.unknown")}),a.jsx("span",{className:"text-bambu-gray ml-2",children:u})]},c))}),l&&a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:e("common.more",{count:s.length-i})})]})]})}function HYe(){const{t}=Sn(),{showToast:e}=Hn(),{hasPermission:n}=Di(),[r,i]=_.useState(!1),[s,o]=_.useState(!1),[l,c]=_.useState(0),[u,d]=_.useState(0),[h,m]=_.useState(!1);_.useEffect(()=>{const T=()=>{try{const z=localStorage.getItem("bambusy-dashboard-layout");if(z){const L=JSON.parse(z);d(L.hidden?.length||0)}}catch{d(0)}};T(),window.addEventListener("storage",T);const j=setInterval(T,500);return()=>{window.removeEventListener("storage",T),clearInterval(j)}},[l]);const{data:p,isLoading:b,refetch:v}=st({queryKey:["archiveStats"],queryFn:ce.getArchiveStats}),{data:x}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:y}=st({queryKey:["archives"],queryFn:()=>ce.getArchives(void 0,void 0,1e3,0)}),{data:S}=st({queryKey:["settings"],queryFn:ce.getSettings}),N=async T=>{o(!1),i(!0);try{const{blob:j,filename:z}=await ce.exportStats({format:T,days:90}),L=URL.createObjectURL(j),B=document.createElement("a");B.href=L,B.download=z,B.click(),URL.revokeObjectURL(L),e(t("stats.exportDownloaded"))}catch{e(t("stats.exportFailed"),"error")}finally{i(!1)}},A=async()=>{m(!0);try{const T=await ce.recalculateCosts();await v(),e(t("stats.recalculatedCosts",{count:T.updated}))}catch{e(t("stats.recalculateFailed"),"error")}finally{m(!1)}},k=S?.currency||"$",C=new Map(x?.map(T=>[String(T.id),T.name])||[]),E=y?.map(T=>T.created_at)||[];if(b)return a.jsx("div",{className:"p-4 md:p-8",children:a.jsx("div",{className:"text-center py-12 text-bambu-gray",children:t("stats.loadingStats")})});const P=[{id:"quick-stats",title:t("stats.quickStats"),component:a.jsx(RYe,{stats:p,currency:k,t}),defaultSize:2},{id:"success-rate",title:t("stats.successRate"),component:T=>a.jsx(OYe,{stats:p,printerMap:C,size:T,t}),defaultSize:1},{id:"time-accuracy",title:t("stats.timeAccuracy"),component:T=>a.jsx(LYe,{stats:p,printerMap:C,size:T,t}),defaultSize:1},{id:"filament-types",title:t("stats.filamentTypes"),component:T=>a.jsx(FYe,{stats:p,size:T,t}),defaultSize:1},{id:"failure-analysis",title:t("stats.failureAnalysis"),component:T=>a.jsx(BYe,{size:T,t}),defaultSize:1},{id:"print-activity",title:t("stats.printActivity"),component:T=>a.jsx(IYe,{printDates:E,size:T}),defaultSize:2},{id:"prints-by-printer",title:t("stats.printsByPrinter"),component:a.jsx(UYe,{stats:p,printerMap:C,t}),defaultSize:2},{id:"filament-trends",title:t("stats.filamentTrends"),component:a.jsx(zYe,{archives:y||[],currency:k,t}),defaultSize:4}];return a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-white",children:t("stats.title")}),a.jsx("p",{className:"text-bambu-gray",children:t("stats.subtitle")})]}),a.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[u>0&&a.jsxs(ke,{variant:"secondary",onClick:()=>{window.dispatchEvent(new CustomEvent("toggle-hidden-panel"))},children:[a.jsx(_c,{className:"w-4 h-4"}),t("stats.hiddenCount",{count:u})]}),a.jsxs(ke,{variant:"secondary",onClick:()=>{localStorage.removeItem("bambusy-dashboard-layout"),c(T=>T+1),e(t("stats.layoutReset"))},disabled:!n("settings:update"),title:n("settings:update")?void 0:t("stats.noPermissionResetLayout"),children:[a.jsx($h,{className:"w-4 h-4"}),t("stats.resetLayout")]}),a.jsxs(ke,{variant:"secondary",onClick:A,disabled:h||!n("archives:update_all"),title:n("archives:update_all")?t("stats.recalculateCostsHint"):t("stats.noPermissionRecalculate"),children:[h?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(rde,{className:"w-4 h-4"}),t("stats.recalculateCosts")]}),a.jsxs("div",{className:"relative",children:[a.jsxs(ke,{variant:"secondary",onClick:()=>o(!s),disabled:r,children:[r?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(dS,{className:"w-4 h-4"}),t("stats.exportStats")]}),s&&a.jsxs("div",{className:"absolute right-0 top-full mt-1 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20",children:[a.jsxs("button",{className:"w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-t-lg",onClick:()=>N("csv"),children:[a.jsx(ps,{className:"w-4 h-4"}),t("stats.exportAsCsv")]}),a.jsxs("button",{className:"w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-b-lg",onClick:()=>N("xlsx"),children:[a.jsx(dS,{className:"w-4 h-4"}),t("stats.exportAsExcel")]})]})]})]})]}),a.jsx(DYe,{widgets:P,storageKey:"bambusy-dashboard-layout",hideControls:!0},l)]})}function $Ye({plug:t,onEdit:e}){const n=un(),{showToast:r}=Hn(),[i,s]=_.useState(!1),[o,l]=_.useState(!1),[c,u]=_.useState(!1),[d,h]=_.useState(!1),{data:m,isLoading:p}=st({queryKey:["smart-plug-status",t.id],queryFn:()=>ce.getSmartPlugStatus(t.id),refetchInterval:3e4}),{data:b}=st({queryKey:["printers"],queryFn:ce.getPrinters}),v=b?.find(T=>T.id===t.printer_id),x=pt({mutationFn:T=>ce.controlSmartPlug(t.id,T),onMutate:async T=>{await n.cancelQueries({queryKey:["smart-plug-status",t.id]});const j=n.getQueryData(["smart-plug-status",t.id]),z=T==="on"?"ON":T==="off"||m?.state==="ON"?"OFF":"ON";return n.setQueryData(["smart-plug-status",t.id],L=>({...L,state:z})),{previousStatus:j}},onError:(T,j,z)=>{z?.previousStatus&&n.setQueryData(["smart-plug-status",t.id],z.previousStatus),r(`Failed to turn ${j} "${t.name}"`,"error")},onSettled:()=>{setTimeout(()=>{n.invalidateQueries({queryKey:["smart-plug-status",t.id]}),n.invalidateQueries({queryKey:["smart-plugs"]})},1e3)}}),y=pt({mutationFn:T=>ce.updateSmartPlug(t.id,T),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),t.printer_id&&(n.invalidateQueries({queryKey:["smartPlugByPrinter",t.printer_id]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter",t.printer_id]}))}}),S=pt({mutationFn:()=>ce.deleteSmartPlug(t.id),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),t.printer_id&&n.invalidateQueries({queryKey:["scriptPlugsByPrinter",t.printer_id]})}}),N=m?.state==="ON",A=t.plug_type==="mqtt"&&m?.energy?.power!==null&&m?.energy?.power!==void 0,k=(m?.reachable??!1)||A,C=x.isPending,P=(()=>{if(t.plug_type!=="tasmota"||!t.ip_address)return null;const T=t.ip_address;return t.username&&t.password?`http://${encodeURIComponent(t.username)}:${encodeURIComponent(t.password)}@${T}/`:`http://${T}/`})();return a.jsxs(a.Fragment,{children:[a.jsx(_t,{className:"relative",children:a.jsxs(Mt,{className:"p-4",children:[a.jsxs("div",{className:"flex items-start justify-between gap-2 mb-3",children:[a.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[a.jsx("div",{className:`p-2 rounded-lg flex-shrink-0 ${t.plug_type==="mqtt"?k?"bg-teal-500/20":"bg-red-500/20":k?N?"bg-bambu-green/20":"bg-bambu-dark":"bg-red-500/20"}`,children:t.plug_type==="mqtt"?a.jsx(cO,{className:`w-5 h-5 ${k?"text-teal-400":"text-red-400"}`}):t.plug_type==="homeassistant"?a.jsx(Jy,{className:`w-5 h-5 ${k?N?"text-bambu-green":"text-bambu-gray":"text-red-400"}`}):a.jsx(rl,{className:`w-5 h-5 ${k?N?"text-bambu-green":"text-bambu-gray":"text-red-400"}`})}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("h3",{className:"font-medium text-white truncate",children:t.name}),a.jsx("p",{className:"text-sm text-bambu-gray truncate",title:t.plug_type==="mqtt"?t.mqtt_topic??void 0:t.plug_type==="homeassistant"?t.ha_entity_id??void 0:t.ip_address??void 0,children:t.plug_type==="mqtt"?t.mqtt_topic:t.plug_type==="homeassistant"?t.ha_entity_id:t.ip_address})]})]}),a.jsxs("div",{className:"flex flex-col items-end gap-1 flex-shrink-0",children:[p?a.jsx(ut,{className:"w-4 h-4 text-bambu-gray animate-spin"}):t.plug_type==="mqtt"?a.jsxs("div",{className:"flex items-center gap-1.5 text-sm whitespace-nowrap",children:[a.jsx("span",{className:"px-1.5 py-0.5 bg-teal-500/20 text-teal-400 text-[10px] font-medium rounded flex-shrink-0",children:"MQTT"}),k&&a.jsx("span",{className:"text-status-ok",children:"✓"})]}):t.plug_type==="homeassistant"?a.jsxs("div",{className:"flex items-center gap-1 text-sm",children:[a.jsx("span",{className:"px-1 py-0.5 bg-blue-500/20 text-blue-400 text-[10px] font-medium rounded",children:"HA"}),a.jsx("span",{className:k?N?"text-status-ok":"text-bambu-gray":"text-status-error",children:k?m?.state||"?":"Offline"})]}):k?a.jsxs("div",{className:"flex items-center gap-1 text-sm",children:[a.jsx(Fg,{className:"w-4 h-4 text-status-ok"}),a.jsx("span",{className:N?"text-status-ok":"text-bambu-gray",children:m?.state||"Unknown"})]}):a.jsxs("div",{className:"flex items-center gap-1 text-sm text-status-error",children:[a.jsx(_m,{className:"w-4 h-4"}),a.jsx("span",{children:"Offline"})]}),P&&a.jsxs("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 px-2 py-0.5 bg-bambu-dark hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white text-xs rounded-full transition-colors",title:"Open plug admin page",children:[a.jsx(Xr,{className:"w-3 h-3"}),"Admin"]})]})]}),v&&a.jsxs("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Linked to: "}),a.jsx("span",{className:"text-sm text-white",children:v.name})]}),(t.power_alert_enabled||t.schedule_enabled||t.plug_type==="mqtt")&&a.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[t.plug_type==="mqtt"&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-teal-500/20 text-teal-400 text-xs rounded-full",children:[a.jsx(_c,{className:"w-3 h-3"}),"Monitor Only"]}),t.power_alert_enabled&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded-full",children:[a.jsx(Og,{className:"w-3 h-3"}),"Alerts"]}),t.schedule_enabled&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded-full",children:[a.jsx(ei,{className:"w-3 h-3"}),t.schedule_on_time&&t.schedule_off_time?`${t.schedule_on_time} - ${t.schedule_off_time}`:t.schedule_on_time?`On ${t.schedule_on_time}`:`Off ${t.schedule_off_time}`]})]}),t.plug_type!=="mqtt"&&a.jsxs("div",{className:"flex gap-2 mb-3",children:[a.jsxs(ke,{size:"sm",variant:N?"primary":"secondary",disabled:!k||C,onClick:()=>l(!0),className:"flex-1",children:[C?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Zu,{className:"w-4 h-4"}),"On"]}),a.jsxs(ke,{size:"sm",variant:N?"secondary":"primary",disabled:!k||C,onClick:()=>u(!0),className:"flex-1",children:[C?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(HM,{className:"w-4 h-4"}),"Off"]})]}),t.plug_type==="mqtt"&&m?.energy&&a.jsxs("div",{className:"flex gap-2 mb-3 px-3 py-2 bg-bambu-dark rounded-lg",children:[m.energy.power!==null&&m.energy.power!==void 0&&a.jsxs("div",{className:"flex-1 text-center",children:[a.jsxs("p",{className:"text-lg font-semibold text-white",children:[Math.round(m.energy.power),"W"]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Power"})]}),m.energy.today!==null&&m.energy.today!==void 0&&a.jsxs("div",{className:"flex-1 text-center border-l border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-lg font-semibold text-white",children:m.energy.today.toFixed(2)}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"kWh Today"})]})]}),a.jsxs("button",{onClick:()=>h(!d),className:"w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors",children:[a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx(jh,{className:"w-4 h-4"}),t.plug_type==="mqtt"?"Settings":"Automation Settings"]}),a.jsx("span",{children:d?"-":"+"})]}),d&&a.jsxs("div",{className:"pt-3 border-t border-bambu-dark-tertiary space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(UM,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Show in Switchbar"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Quick access from sidebar"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.show_in_switchbar,onChange:T=>y.mutate({show_in_switchbar:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),t.plug_type!=="mqtt"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Enabled"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Enable automation for this plug"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.enabled,onChange:T=>y.mutate({enabled:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Auto On"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Turn on when print starts"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.auto_on,onChange:T=>y.mutate({auto_on:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Auto Off"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Turn off when print completes (one-shot)"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.auto_off,onChange:T=>y.mutate({auto_off:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),t.auto_off&&a.jsxs("div",{className:"space-y-3 pl-4 border-l-2 border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white mb-2",children:"Turn Off Delay Mode"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("button",{onClick:()=>y.mutate({off_delay_mode:"time"}),className:`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${t.off_delay_mode==="time"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:[a.jsx(nr,{className:"w-4 h-4"}),"Time"]}),a.jsxs("button",{onClick:()=>y.mutate({off_delay_mode:"temperature"}),className:`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${t.off_delay_mode==="temperature"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:[a.jsx(GM,{className:"w-4 h-4"}),"Temp"]})]})]}),t.off_delay_mode==="time"?a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Delay (minutes)"}),a.jsx("input",{type:"number",min:"1",max:"60",value:t.off_delay_minutes,onChange:T=>y.mutate({off_delay_minutes:parseInt(T.target.value)||5}),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"})]}):a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Temperature threshold (C)"}),a.jsx("input",{type:"number",min:"30",max:"100",value:t.off_temp_threshold,onChange:T=>y.mutate({off_temp_threshold:parseInt(T.target.value)||70}),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Turns off when nozzle cools below this temperature"})]})]})]}),a.jsxs("div",{className:"flex gap-2 pt-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>e(t),className:"flex-1",children:[a.jsx(Eg,{className:"w-4 h-4"}),"Edit"]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>s(!0),className:"text-red-400 hover:text-red-300",children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})}),i&&a.jsx(er,{title:"Delete Smart Plug",message:`Are you sure you want to delete "${t.name}"? This cannot be undone.`,confirmText:"Delete",variant:"danger",onConfirm:()=>{S.mutate(),s(!1)},onCancel:()=>s(!1)}),o&&a.jsx(er,{title:"Turn On Smart Plug",message:`Are you sure you want to turn on "${t.name}"?`,confirmText:"Turn On",variant:"default",onConfirm:()=>{x.mutate("on"),l(!1)},onCancel:()=>l(!1)}),c&&a.jsx(er,{title:"Turn Off Smart Plug",message:`Are you sure you want to turn off "${t.name}"? This will cut power to the connected device.`,confirmText:"Turn Off",variant:"danger",onConfirm:()=>{x.mutate("off"),u(!1)},onCancel:()=>u(!1)})]})}function VYe({plug:t,onClose:e}){const n=un(),r=!!t,[i,s]=_.useState(t?.plug_type||"tasmota"),[o,l]=_.useState(t?.name||""),[c,u]=_.useState(t?.ip_address||""),[d,h]=_.useState(t?.username||""),[m,p]=_.useState(t?.password||""),[b,v]=_.useState(t?.ha_entity_id||""),[x,y]=_.useState(t?.mqtt_power_topic||t?.mqtt_topic||""),[S,N]=_.useState(t?.mqtt_power_path||""),[A,k]=_.useState((t?.mqtt_power_multiplier??t?.mqtt_multiplier??1).toString()),[C,E]=_.useState(t?.mqtt_energy_topic||""),[P,T]=_.useState(t?.mqtt_energy_path||""),[j,z]=_.useState((t?.mqtt_energy_multiplier??1).toString()),[L,B]=_.useState(t?.mqtt_state_topic||""),[R,$]=_.useState(t?.mqtt_state_path||""),[q,I]=_.useState(t?.mqtt_state_on_value||""),[G,Y]=_.useState(t?.ha_power_entity||""),[re,H]=_.useState(t?.ha_energy_today_entity||""),[K,ne]=_.useState(t?.ha_energy_total_entity||""),[ie,be]=_.useState(""),[pe,de]=_.useState(""),[Ce,ae]=_.useState(!1),Ae=_.useRef(null),[Le,fe]=_.useState(""),[Xe,W]=_.useState(!1),Q=_.useRef(null),[me,X]=_.useState(""),[te,V]=_.useState(!1),ge=_.useRef(null),[Se,ee]=_.useState(""),[U,O]=_.useState(!1),Z=_.useRef(null),[le,we]=_.useState(t?.printer_id||null),[ye,se]=_.useState(null),[Oe,He]=_.useState(null),[tt,Ue]=_.useState(t?.power_alert_enabled||!1),[xe,Te]=_.useState(t?.power_alert_high?.toString()||""),[Ie,Ne]=_.useState(t?.power_alert_low?.toString()||""),[Ge,Me]=_.useState(t?.schedule_enabled||!1),[rt,Ee]=_.useState(t?.schedule_on_time||""),[Ke,Be]=_.useState(t?.schedule_off_time||""),[ue,$e]=_.useState(t?.show_in_switchbar||!1),[at,kt]=_.useState(t?.show_on_printer_card??!0),[gt,Ut]=_.useState(!1),[Ft,Fe]=_.useState({scanned:0,total:0}),[xt,Wt]=_.useState([]),Qt=_.useRef(null),{data:En}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:hn}=st({queryKey:["smart-plugs"],queryFn:ce.getSmartPlugs}),{data:or}=st({queryKey:["settings"],queryFn:ce.getSettings}),Kn=!!(or?.ha_enabled&&or?.ha_url&&or?.ha_token);_.useEffect(()=>{const _e=setTimeout(()=>{de(ie)},300);return()=>clearTimeout(_e)},[ie]),_.useEffect(()=>{const _e=Re=>{Ae.current&&!Ae.current.contains(Re.target)&&ae(!1),Q.current&&!Q.current.contains(Re.target)&&W(!1),ge.current&&!ge.current.contains(Re.target)&&V(!1),Z.current&&!Z.current.contains(Re.target)&&O(!1)};return document.addEventListener("mousedown",_e),()=>document.removeEventListener("mousedown",_e)},[]);const{data:Qn,isLoading:Tn,error:di}=st({queryKey:["ha-entities",pe],queryFn:()=>ce.getHAEntities(pe||void 0),enabled:i==="homeassistant"&&Kn,retry:!1,staleTime:0}),{data:ii}=st({queryKey:["ha-sensor-entities"],queryFn:ce.getHASensorEntities,enabled:i==="homeassistant"&&Kn,retry:!1,staleTime:0});_.useEffect(()=>{const _e=Re=>{Re.key==="Escape"&&e()};return window.addEventListener("keydown",_e),()=>{window.removeEventListener("keydown",_e),Qt.current&&clearInterval(Qt.current)}},[e]);const je=async()=>{Ut(!0),Wt([]),Fe({scanned:0,total:0}),He(null);try{await ce.startTasmotaScan();const _e=async()=>{try{const Re=await ce.getTasmotaScanStatus();Fe({scanned:Re.scanned,total:Re.total});const et=await ce.getDiscoveredTasmotaDevices();Wt(et),Re.running||(Ut(!1),Qt.current&&(clearInterval(Qt.current),Qt.current=null))}catch(Re){console.error("Polling error:",Re)}};await _e(),Qt.current=setInterval(_e,500)}catch(_e){Ut(!1);const Re=_e instanceof Error?_e.message:typeof _e=="string"?_e:JSON.stringify(_e);He(Re||"Failed to start scan")}},Je=async()=>{try{await ce.stopTasmotaScan()}catch{}Ut(!1),Qt.current&&(clearInterval(Qt.current),Qt.current=null)},dt=_e=>{u(_e.ip_address),l(_e.name),se(null)},ht=pt({mutationFn:()=>ce.testSmartPlugConnection(c,d||null,m||null),onSuccess:_e=>{se(_e),He(null),!o&&_e.device_name&&l(_e.device_name)},onError:_e=>{se(null),He(_e.message)}}),ct=pt({mutationFn:_e=>ce.createSmartPlug(_e),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter"]}),e()},onError:_e=>{He(_e.message)}}),Tt=pt({mutationFn:_e=>ce.updateSmartPlug(t.id,_e),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter"]}),e()},onError:_e=>{He(_e.message)}}),he=En?.filter(_e=>i==="tasmota"?!hn?.some(et=>et.printer_id===_e.id&&et.id!==t?.id&&et.plug_type==="tasmota"):!0),De=_e=>{if(_e.preventDefault(),He(null),!o.trim()){He("Name is required");return}if(i==="tasmota"&&!c.trim()){He("IP address is required for Tasmota plugs");return}if(i==="homeassistant"&&!b){He("Entity is required for Home Assistant plugs");return}if(i==="mqtt"){const et=x.trim(),Ye=C.trim(),Ct=L.trim();if(!et&&!Ye&&!Ct){He("At least one MQTT topic must be configured for power, energy, or state monitoring");return}}const Re={name:o.trim(),plug_type:i,ip_address:i==="tasmota"?c.trim():null,ha_entity_id:i==="homeassistant"?b:null,ha_power_entity:i==="homeassistant"&&G||null,ha_energy_today_entity:i==="homeassistant"&&re||null,ha_energy_total_entity:i==="homeassistant"&&K||null,mqtt_power_topic:i==="mqtt"&&x.trim()||null,mqtt_power_path:i==="mqtt"&&S.trim()||null,mqtt_power_multiplier:i==="mqtt"&&parseFloat(A)||1,mqtt_energy_topic:i==="mqtt"&&C.trim()||null,mqtt_energy_path:i==="mqtt"&&P.trim()||null,mqtt_energy_multiplier:i==="mqtt"&&parseFloat(j)||1,mqtt_state_topic:i==="mqtt"&&L.trim()||null,mqtt_state_path:i==="mqtt"&&R.trim()||null,mqtt_state_on_value:i==="mqtt"&&q.trim()||null,username:i==="tasmota"&&d.trim()||null,password:i==="tasmota"&&m.trim()||null,printer_id:le,power_alert_enabled:tt,power_alert_high:xe?parseFloat(xe):null,power_alert_low:Ie?parseFloat(Ie):null,schedule_enabled:Ge,schedule_on_time:rt||null,schedule_off_time:Ke||null,show_in_switchbar:ue,show_on_printer_card:at};r?Tt.mutate(Re):ct.mutate(Re)},Ve=ct.isPending||Tt.isPending;return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md max-h-[90vh] flex flex-col",onClick:_e=>_e.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary flex-shrink-0",children:[a.jsx("h2",{className:"text-lg font-semibold text-white",children:r?"Edit Smart Plug":"Add Smart Plug"}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:De,className:"p-6 space-y-4 overflow-y-auto",children:[Oe&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:Oe}),!r&&a.jsxs("div",{className:"flex gap-2 mb-2",children:[a.jsxs("button",{type:"button",onClick:()=>{s("tasmota"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="tasmota"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(rl,{className:"w-4 h-4"}),"Tasmota"]}),a.jsxs("button",{type:"button",onClick:()=>{s("homeassistant"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="homeassistant"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(Jy,{className:"w-4 h-4"}),"HA"]}),a.jsxs("button",{type:"button",onClick:()=>{s("mqtt"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="mqtt"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(cO,{className:"w-4 h-4"}),"MQTT"]})]}),!r&&i==="tasmota"&&a.jsxs("div",{className:"space-y-3",children:[gt?a.jsxs(ke,{type:"button",variant:"secondary",onClick:Je,className:"w-full",children:[a.jsx(Lt,{className:"w-4 h-4"}),"Stop Scanning"]}):a.jsxs(ke,{type:"button",variant:"primary",onClick:je,className:"w-full",children:[a.jsx(va,{className:"w-4 h-4"}),"Discover Tasmota Devices"]}),gt&&Ft.total>0&&a.jsxs("div",{className:"space-y-1",children:[a.jsxs("div",{className:"flex justify-between text-xs text-bambu-gray",children:[a.jsx("span",{children:"Scanning network..."}),a.jsxs("span",{children:[Ft.scanned," / ",Ft.total]})]}),a.jsx("div",{className:"w-full bg-bambu-dark-tertiary rounded-full h-2",children:a.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all duration-300",style:{width:`${Ft.scanned/Ft.total*100}%`}})})]}),xt.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsxs("p",{className:"text-xs text-bambu-gray",children:["Found ",xt.length," device(s) - click to select:"]}),a.jsx("div",{className:"max-h-40 overflow-y-auto space-y-1",children:xt.map(_e=>a.jsxs("button",{type:"button",onClick:()=>dt(_e),className:"w-full flex items-center justify-between p-2 bg-bambu-dark hover:bg-bambu-dark-tertiary rounded-lg transition-colors text-left border border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(rl,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:_e.name}),a.jsx("p",{className:"text-xs text-bambu-gray",children:_e.ip_address})]})]}),_e.state&&a.jsxs("span",{className:`flex items-center gap-1 text-xs ${_e.state==="ON"?"text-bambu-green":"text-bambu-gray"}`,children:[a.jsx(Zu,{className:"w-3 h-3"}),_e.state]})]},_e.ip_address))})]}),!gt&&xt.length===0&&Ft.total>0&&a.jsx("p",{className:"text-xs text-bambu-gray text-center py-2",children:"No Tasmota devices found on your network"})]}),i==="homeassistant"&&a.jsxs("div",{className:"space-y-3",children:[!Kn&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"p-3 bg-yellow-500/20 border border-yellow-500/50 rounded-lg text-sm text-yellow-400",children:["Home Assistant is not configured. Set it up in"," ",a.jsx("span",{className:"font-medium",children:"Settings → Network → Home Assistant"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1 opacity-50",children:"Select Entity *"}),a.jsx("select",{disabled:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed opacity-50",children:a.jsx("option",{children:"Choose an entity..."})})]})]}),Kn&&a.jsxs(a.Fragment,{children:[Tn&&a.jsxs("div",{className:"flex items-center justify-center py-4 text-bambu-gray",children:[a.jsx(ut,{className:"w-5 h-5 animate-spin mr-2"}),"Loading entities..."]}),di&&a.jsxs("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:["Failed to load entities: ",di.message]}),(()=>{const _e=hn?.filter(Ye=>Ye.ha_entity_id&&Ye.id!==t?.id).map(Ye=>Ye.ha_entity_id)||[],Re=(Qn||[]).filter(Ye=>!_e.includes(Ye.entity_id)),et=Qn?.find(Ye=>Ye.entity_id===b);return a.jsxs("div",{ref:Ae,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Select Entity *"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:Ce?ie:et?`${et.friendly_name} (${et.entity_id})`:"",onChange:Ye=>{be(Ye.target.value),Ce||ae(!0)},onFocus:()=>{ae(!0),be("")},placeholder:"Search entities...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),b&&!Ce&&a.jsx("button",{type:"button",onClick:()=>{v(""),be("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})}),Tn&&a.jsx(ut,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray animate-spin"})]}),Ce&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-60 overflow-y-auto",children:[Tn&&a.jsxs("div",{className:"px-3 py-2 text-sm text-bambu-gray flex items-center gap-2",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Loading..."]}),!Tn&&Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:pe?`No entities found matching "${pe}"`:"No entities available"}),!Tn&&Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{v(Ye.entity_id),ae(!1),be(""),o||l(Ye.friendly_name)},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary transition-colors ${Ye.entity_id===b?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray flex items-center justify-between",children:[a.jsx("span",{children:Ye.entity_id}),a.jsx("span",{className:Ye.state==="on"?"text-bambu-green":"",children:Ye.state})]})]},Ye.entity_id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:pe?`Searching all entities (${Re.length} found)`:`Showing switch, light, input_boolean (${Re.length} available)`})]})})(),b&&ii&&ii.length>0&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 mt-4 space-y-3",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium mb-1",children:"Energy Monitoring (Optional)"}),a.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Search and select sensors that provide power/energy data."})]}),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="W"||Ye.unit_of_measurement==="kW"||Ye.unit_of_measurement==="mW"),Re=Le?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(Le.toLowerCase())||Ye.friendly_name.toLowerCase().includes(Le.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===G);return a.jsxs("div",{ref:Q,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Power Sensor (W)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:Xe?Le:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{fe(Ye.target.value),Xe||W(!0)},onFocus:()=>{W(!0),fe("")},placeholder:"Search power sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),G&&!Xe&&a.jsx("button",{type:"button",onClick:()=>{Y(""),fe("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),Xe&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{Y(""),W(!1),fe("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{Y(Ye.entity_id),W(!1),fe("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===G?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})(),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="kWh"||Ye.unit_of_measurement==="Wh"||Ye.unit_of_measurement==="MWh"),Re=me?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(me.toLowerCase())||Ye.friendly_name.toLowerCase().includes(me.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===re);return a.jsxs("div",{ref:ge,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Energy Today (kWh)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:te?me:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{X(Ye.target.value),te||V(!0)},onFocus:()=>{V(!0),X("")},placeholder:"Search energy sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),re&&!te&&a.jsx("button",{type:"button",onClick:()=>{H(""),X("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),te&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{H(""),V(!1),X("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{H(Ye.entity_id),V(!1),X("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===re?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})(),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="kWh"||Ye.unit_of_measurement==="Wh"||Ye.unit_of_measurement==="MWh"),Re=Se?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(Se.toLowerCase())||Ye.friendly_name.toLowerCase().includes(Se.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===K);return a.jsxs("div",{ref:Z,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Total Energy (kWh)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:U?Se:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{ee(Ye.target.value),U||O(!0)},onFocus:()=>{O(!0),ee("")},placeholder:"Search energy sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),K&&!U&&a.jsx("button",{type:"button",onClick:()=>{ne(""),ee("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),U&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{ne(""),O(!1),ee("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{ne(Ye.entity_id),O(!1),ee("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===K?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})()]})]})]}),i==="mqtt"&&a.jsxs("div",{className:"space-y-3",children:[!or?.mqtt_broker&&a.jsxs("div",{className:"p-3 bg-yellow-500/20 border border-yellow-500/50 rounded-lg text-sm text-yellow-400",children:["MQTT broker not configured. Set broker address in"," ",a.jsx("span",{className:"font-medium",children:"Settings → Network → MQTT Publishing"})," ","(you don't need to enable publishing, just fill in the broker details)."]}),or?.mqtt_broker&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg text-sm text-blue-300",children:[a.jsx("p",{className:"font-medium mb-1",children:"Monitor Only"}),a.jsx("p",{className:"text-xs opacity-80",children:"MQTT plugs receive power/energy data via MQTT subscription. On/off control is not available - use your MQTT broker or home automation system."})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-white font-medium text-sm",children:"Power Monitoring"}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:x,onChange:_e=>y(_e.target.value),placeholder:"zigbee2mqtt/shelly-working-room",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:S,onChange:_e=>N(_e.target.value),placeholder:"power_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Multiplier"}),a.jsx("input",{type:"text",value:A,onChange:_e=>k(_e.target.value),placeholder:"1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:['JSON path extracts value from JSON payload (e.g., "power_l1"). Leave empty if topic publishes raw numeric values.',a.jsx("br",{}),"Use multiplier 0.001 for mW→W, 1000 for kW→W."]})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsxs("p",{className:"text-white font-medium text-sm",children:["Energy Monitoring ",a.jsx("span",{className:"text-bambu-gray font-normal",children:"(optional)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:C,onChange:_e=>E(_e.target.value),placeholder:"Same as power topic, or different",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:P,onChange:_e=>T(_e.target.value),placeholder:"energy_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Multiplier"}),a.jsx("input",{type:"text",value:j,onChange:_e=>z(_e.target.value),placeholder:"1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:["JSON path extracts value from JSON payload. Leave empty for raw values.",a.jsx("br",{}),"Use multiplier 0.001 for Wh→kWh, 1000 for MWh→kWh."]})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsxs("p",{className:"text-white font-medium text-sm",children:["State Monitoring ",a.jsx("span",{className:"text-bambu-gray font-normal",children:"(optional)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:L,onChange:_e=>B(_e.target.value),placeholder:"Same as power topic, or different",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:R,onChange:_e=>$(_e.target.value),placeholder:"state_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"ON Value"}),a.jsx("input",{type:"text",value:q,onChange:_e=>I(_e.target.value),placeholder:"ON, true, 1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:["JSON path extracts value from JSON payload. Leave empty for raw values.",a.jsx("br",{}),'ON value: the exact string that means "ON". Leave empty for auto-detect (ON, true, 1).']})]})]})]}),i==="tasmota"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address *"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:"text",value:c,onChange:_e=>{u(_e.target.value),se(null)},placeholder:"192.168.1.100",className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs(ke,{type:"button",variant:"secondary",onClick:()=>ht.mutate(),disabled:!c.trim()||ht.isPending,children:[ht.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Fg,{className:"w-4 h-4"}),"Test"]})]})]}),i==="tasmota"&&ye&&a.jsx("div",{className:`p-3 rounded-lg flex items-center gap-2 ${ye.success?"bg-bambu-green/20 border border-bambu-green/50 text-bambu-green":"bg-red-500/20 border border-red-500/50 text-red-400"}`,children:ye.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-5 h-5"}),a.jsxs("div",{children:[a.jsx("p",{className:"font-medium",children:"Connected!"}),a.jsxs("p",{className:"text-sm opacity-80",children:[ye.device_name&&`Device: ${ye.device_name} - `,"State: ",ye.state]})]})]}):a.jsxs(a.Fragment,{children:[a.jsx(_m,{className:"w-5 h-5"}),a.jsx("span",{children:"Connection failed"})]})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:o,onChange:_e=>l(_e.target.value),placeholder:"Living Room Plug",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),i==="tasmota"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Username"}),a.jsx("input",{type:"text",value:d,onChange:_e=>h(_e.target.value),placeholder:"admin",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Password"}),a.jsx("input",{type:"password",value:m,onChange:_e=>p(_e.target.value),placeholder:"********",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray -mt-2",children:"Leave empty if your Tasmota device doesn't require authentication"})]}),i!=="mqtt"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Link to Printer"}),a.jsxs("select",{value:le??"",onChange:_e=>we(_e.target.value?Number(_e.target.value):null),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"No printer (manual control only)"}),he?.map(_e=>a.jsx("option",{value:_e.id,children:_e.name},_e.id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Linking enables automatic on/off when prints start/complete"})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Og,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"text-white font-medium",children:"Power Alerts"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:tt,onChange:_e=>Ue(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),tt&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Alert if above (W)"}),a.jsx("input",{type:"number",value:xe,onChange:_e=>Te(_e.target.value),placeholder:"e.g. 200",min:"0",max:"5000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Alert if below (W)"}),a.jsx("input",{type:"number",value:Ie,onChange:_e=>Ne(_e.target.value),placeholder:"e.g. 10",min:"0",max:"5000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Get notified when power consumption crosses these thresholds. Leave empty to disable that direction."})]})]}),i!=="mqtt"&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"text-white font-medium",children:"Daily Schedule"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:Ge,onChange:_e=>Me(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),Ge&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Turn On at"}),a.jsx("input",{type:"time",value:rt,onChange:_e=>Ee(_e.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Turn Off at"}),a.jsx("input",{type:"time",value:Ke,onChange:_e=>Be(_e.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Automatically turn the plug on/off at these times daily. Leave empty to skip that action."})]})]}),a.jsx("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(UM,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white font-medium",children:"Show in Switchbar"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Quick access from sidebar"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:ue,onChange:_e=>$e(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})}),i==="homeassistant"&&a.jsx("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(_c,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white font-medium",children:"Show on Printer Card"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Display button on printer card"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:at,onChange:_e=>kt(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:Ve,className:"flex-1",children:[Ve?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),r?"Save":"Add"]})]})]})]})})}function $n({checked:t,onChange:e,disabled:n}){const r=i=>{i.preventDefault(),i.stopPropagation(),n||e(!t)};return a.jsx("button",{type:"button",role:"switch","aria-checked":t,disabled:n,onClick:r,className:`relative inline-flex w-11 h-7 md:w-9 md:h-5 rounded-full transition-colors flex-shrink-0 focus:outline-none focus:ring-2 focus:ring-bambu-green focus:ring-offset-2 focus:ring-offset-bambu-dark ${n?"bg-bambu-dark-tertiary/50 cursor-not-allowed opacity-50":t?"bg-bambu-green cursor-pointer":"bg-bambu-dark-tertiary cursor-pointer hover:bg-bambu-dark-tertiary/80"}`,children:a.jsx("span",{className:`pointer-events-none absolute top-[3px] md:top-[2px] left-[3px] md:left-[2px] w-5 h-5 md:w-4 md:h-4 bg-white rounded-full shadow transition-transform duration-200 ease-in-out ${t?"translate-x-4":"translate-x-0"}`})})}const GYe={callmebot:"CallMeBot/WhatsApp",ntfy:"ntfy",pushover:"Pushover",telegram:"Telegram",email:"Email",discord:"Discord",webhook:"Webhook"};function qYe({provider:t,onEdit:e}){const n=un(),[r,i]=_.useState(!1),[s,o]=_.useState(!1),[l,c]=_.useState(null),{data:u}=st({queryKey:["printers"],queryFn:ce.getPrinters}),d=u?.find(v=>v.id===t.printer_id),h=pt({mutationFn:v=>ce.updateNotificationProvider(t.id,v),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]})}}),m=pt({mutationFn:()=>ce.deleteNotificationProvider(t.id),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]})}}),p=pt({mutationFn:()=>ce.testNotificationProvider(t.id),onSuccess:v=>{c(v),n.invalidateQueries({queryKey:["notification-providers"]})},onError:v=>{c({success:!1,message:v.message})}}),b=v=>v||"";return a.jsxs(a.Fragment,{children:[a.jsx(_t,{className:"relative",children:a.jsxs(Mt,{className:"p-4",children:[a.jsxs("div",{className:"flex items-start justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`p-2 rounded-lg ${t.enabled?"bg-bambu-green/20":"bg-bambu-dark"}`,children:a.jsx(Og,{className:`w-5 h-5 ${t.enabled?"text-bambu-green":"text-bambu-gray"}`})}),a.jsxs("div",{children:[a.jsx("h3",{className:"font-medium text-white",children:t.name}),a.jsx("p",{className:"text-sm text-bambu-gray",children:GYe[t.provider_type]||t.provider_type})]})]}),a.jsxs("div",{className:"flex items-center gap-3",children:[t.last_success&&a.jsxs("span",{className:"text-xs text-status-ok hidden sm:inline",children:["Last: ",tb(t.last_success)]}),t.last_error&&t.last_error_at&&(!t.last_success||(Hi(t.last_error_at)?.getTime()||0)>(Hi(t.last_success)?.getTime()||0))&&a.jsx("span",{className:"text-xs text-status-error",title:t.last_error,children:"Error"}),a.jsx($n,{checked:t.enabled,onChange:v=>h.mutate({enabled:v})})]})]}),d&&a.jsxs("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Printer: "}),a.jsx("span",{className:"text-sm text-white",children:d.name})]}),!d&&!t.printer_id&&a.jsx("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:a.jsx("span",{className:"text-xs text-bambu-gray",children:"All printers"})}),a.jsxs("div",{className:"mb-3 flex flex-wrap gap-1",children:[t.on_print_start&&a.jsx("span",{className:"px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded",children:"Start"}),t.on_plate_not_empty&&a.jsx("span",{className:"px-2 py-0.5 bg-rose-600/20 text-rose-300 text-xs rounded",children:"Plate Check"}),t.on_print_complete&&a.jsx("span",{className:"px-2 py-0.5 bg-bambu-green/20 text-bambu-green text-xs rounded",children:"Complete"}),t.on_print_failed&&a.jsx("span",{className:"px-2 py-0.5 bg-red-500/20 text-red-400 text-xs rounded",children:"Failed"}),t.on_print_stopped&&a.jsx("span",{className:"px-2 py-0.5 bg-orange-500/20 text-orange-400 text-xs rounded",children:"Stopped"}),t.on_print_progress&&a.jsx("span",{className:"px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded",children:"Progress"}),t.on_printer_offline&&a.jsx("span",{className:"px-2 py-0.5 bg-gray-500/20 text-gray-400 text-xs rounded",children:"Offline"}),t.on_printer_error&&a.jsx("span",{className:"px-2 py-0.5 bg-rose-500/20 text-rose-400 text-xs rounded",children:"Error"}),t.on_filament_low&&a.jsx("span",{className:"px-2 py-0.5 bg-cyan-500/20 text-cyan-400 text-xs rounded",children:"Low Filament"}),t.on_maintenance_due&&a.jsx("span",{className:"px-2 py-0.5 bg-purple-500/20 text-purple-400 text-xs rounded",children:"Maintenance"}),t.on_ams_humidity_high&&a.jsx("span",{className:"px-2 py-0.5 bg-blue-600/20 text-blue-300 text-xs rounded",children:"AMS Humidity"}),t.on_ams_temperature_high&&a.jsx("span",{className:"px-2 py-0.5 bg-orange-600/20 text-orange-300 text-xs rounded",children:"AMS Temp"}),t.on_ams_ht_humidity_high&&a.jsx("span",{className:"px-2 py-0.5 bg-cyan-600/20 text-cyan-300 text-xs rounded",children:"AMS-HT Humidity"}),t.on_ams_ht_temperature_high&&a.jsx("span",{className:"px-2 py-0.5 bg-amber-600/20 text-amber-300 text-xs rounded",children:"AMS-HT Temp"}),t.quiet_hours_enabled&&a.jsxs("span",{className:"px-2 py-0.5 bg-indigo-500/20 text-indigo-400 text-xs rounded flex items-center gap-1",children:[a.jsx(hS,{className:"w-3 h-3"}),"Quiet"]}),t.daily_digest_enabled&&a.jsxs("span",{className:"px-2 py-0.5 bg-emerald-500/20 text-emerald-400 text-xs rounded flex items-center gap-1",children:[a.jsx(ei,{className:"w-3 h-3"}),"Digest ",t.daily_digest_time]})]}),a.jsx("div",{className:"mb-3",children:a.jsxs(ke,{size:"sm",variant:"secondary",disabled:p.isPending,onClick:()=>{c(null),p.mutate()},className:"w-full",children:[p.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),"Send Test Notification"]})}),l&&a.jsxs("div",{className:`mb-3 p-2 rounded-lg flex items-center gap-2 text-sm ${l.success?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:[l.success?a.jsx(Nr,{className:"w-4 h-4"}):a.jsx(ta,{className:"w-4 h-4"}),a.jsx("span",{children:l.message})]}),a.jsxs("button",{onClick:()=>o(!s),className:"w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors border-t border-bambu-dark-tertiary",children:[a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx(jh,{className:"w-4 h-4"}),"Event Settings"]}),s?a.jsx(Ch,{className:"w-4 h-4"}):a.jsx(Sr,{className:"w-4 h-4"})]}),s&&a.jsxs("div",{className:"pt-3 border-t border-bambu-dark-tertiary space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Enabled"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Send notifications from this provider"})]}),a.jsx($n,{checked:t.enabled,onChange:v=>h.mutate({enabled:v})})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Print Events"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Started"}),a.jsx($n,{checked:t.on_print_start,onChange:v=>h.mutate({on_print_start:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Plate Not Empty"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Objects detected before print"})]}),a.jsx($n,{checked:t.on_plate_not_empty??!0,onChange:v=>h.mutate({on_plate_not_empty:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Completed"}),a.jsx($n,{checked:t.on_print_complete,onChange:v=>h.mutate({on_print_complete:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Failed"}),a.jsx($n,{checked:t.on_print_failed,onChange:v=>h.mutate({on_print_failed:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Stopped"}),a.jsx($n,{checked:t.on_print_stopped,onChange:v=>h.mutate({on_print_stopped:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Progress Milestones"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Notify at 25%, 50%, 75%"})]}),a.jsx($n,{checked:t.on_print_progress,onChange:v=>h.mutate({on_print_progress:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Printer Status"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Printer Offline"}),a.jsx($n,{checked:t.on_printer_offline,onChange:v=>h.mutate({on_printer_offline:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Printer Error"}),a.jsx($n,{checked:t.on_printer_error,onChange:v=>h.mutate({on_printer_error:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Low Filament"}),a.jsx($n,{checked:t.on_filament_low,onChange:v=>h.mutate({on_filament_low:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Maintenance Due"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Notify when maintenance is needed"})]}),a.jsx($n,{checked:t.on_maintenance_due??!1,onChange:v=>h.mutate({on_maintenance_due:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"AMS Alarms"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS Humidity High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Regular AMS humidity exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_humidity_high??!1,onChange:v=>h.mutate({on_ams_humidity_high:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS Temperature High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Regular AMS temperature exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_temperature_high??!1,onChange:v=>h.mutate({on_ams_temperature_high:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"AMS-HT Alarms"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS-HT Humidity High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"AMS-HT humidity exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_ht_humidity_high??!1,onChange:v=>h.mutate({on_ams_ht_humidity_high:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS-HT Temperature High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"AMS-HT temperature exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_ht_temperature_high??!1,onChange:v=>h.mutate({on_ams_ht_temperature_high:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Print Queue"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Added"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job added to queue"})]}),a.jsx($n,{checked:t.on_queue_job_added??!1,onChange:v=>h.mutate({on_queue_job_added:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Assigned"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Model-based job assigned to printer"})]}),a.jsx($n,{checked:t.on_queue_job_assigned??!1,onChange:v=>h.mutate({on_queue_job_assigned:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Started"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Queue job started printing"})]}),a.jsx($n,{checked:t.on_queue_job_started??!1,onChange:v=>h.mutate({on_queue_job_started:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Waiting"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job waiting for filament"})]}),a.jsx($n,{checked:t.on_queue_job_waiting??!0,onChange:v=>h.mutate({on_queue_job_waiting:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Skipped"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job skipped (previous failed)"})]}),a.jsx($n,{checked:t.on_queue_job_skipped??!0,onChange:v=>h.mutate({on_queue_job_skipped:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Failed"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job failed to start"})]}),a.jsx($n,{checked:t.on_queue_job_failed??!0,onChange:v=>h.mutate({on_queue_job_failed:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Queue Complete"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"All queue jobs finished"})]}),a.jsx($n,{checked:t.on_queue_completed??!1,onChange:v=>h.mutate({on_queue_completed:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(hS,{className:"w-4 h-4 text-purple-400"}),a.jsx("p",{className:"text-sm text-white",children:"Quiet Hours"})]}),a.jsx($n,{checked:t.quiet_hours_enabled,onChange:v=>h.mutate({quiet_hours_enabled:v})})]}),t.quiet_hours_enabled&&a.jsxs("div",{className:"pl-4 border-l-2 border-bambu-dark-tertiary space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:"No notifications during these hours"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-gray"}),a.jsxs("span",{className:"text-sm text-white",children:[b(t.quiet_hours_start)||"22:00"," - ",b(t.quiet_hours_end)||"07:00"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Edit provider to change quiet hours"})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ei,{className:"w-4 h-4 text-emerald-400"}),a.jsx("p",{className:"text-sm text-white",children:"Daily Digest"})]}),a.jsx($n,{checked:t.daily_digest_enabled,onChange:v=>h.mutate({daily_digest_enabled:v})})]}),t.daily_digest_enabled&&a.jsxs("div",{className:"pl-4 border-l-2 border-bambu-dark-tertiary space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:"Batch notifications into a single daily summary"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-gray"}),a.jsxs("span",{className:"text-sm text-white",children:["Send at ",b(t.daily_digest_time)||"08:00"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Edit provider to change digest time"})]})]}),a.jsxs("div",{className:"flex gap-2 pt-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>e(t),className:"flex-1",children:[a.jsx(Eg,{className:"w-4 h-4"}),"Edit"]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>i(!0),className:"text-red-400 hover:text-red-300",children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})}),r&&a.jsx(er,{title:"Delete Notification Provider",message:`Are you sure you want to delete "${t.name}"? This cannot be undone.`,confirmText:"Delete",variant:"danger",onConfirm:()=>{m.mutate(),i(!1)},onCancel:()=>i(!1)})]})}const DW=[{value:"email",label:"Email",description:"SMTP email notifications"},{value:"telegram",label:"Telegram",description:"Notifications via Telegram bot"},{value:"discord",label:"Discord",description:"Send to Discord channel via webhook"},{value:"ntfy",label:"ntfy",description:"Free, self-hostable push notifications"},{value:"pushover",label:"Pushover",description:"Simple, reliable push notifications"},{value:"callmebot",label:"CallMeBot/WhatsApp",description:"Free WhatsApp notifications via CallMeBot"},{value:"webhook",label:"Webhook",description:"Generic HTTP POST to any URL"}];function WYe({provider:t,onClose:e}){const n=un(),r=!!t,[i,s]=_.useState(t?.name||""),[o,l]=_.useState(t?.provider_type||"email"),[c,u]=_.useState(t?.printer_id||null),[d,h]=_.useState(t?.quiet_hours_enabled||!1),[m,p]=_.useState(t?.quiet_hours_start||"22:00"),[b,v]=_.useState(t?.quiet_hours_end||"07:00"),[x,y]=_.useState(t?.daily_digest_enabled||!1),[S,N]=_.useState(t?.daily_digest_time||"08:00"),[A,k]=_.useState(t?.on_print_start??!1),[C,E]=_.useState(t?.on_print_complete??!0),[P,T]=_.useState(t?.on_print_failed??!0),[j,z]=_.useState(t?.on_print_stopped??!0),[L,B]=_.useState(t?.on_print_progress??!1),[R,$]=_.useState(t?.on_printer_offline??!1),[q,I]=_.useState(t?.on_printer_error??!1),[G,Y]=_.useState(t?.on_filament_low??!1),[re,H]=_.useState(t?.on_maintenance_due??!1),[K,ne]=_.useState(t?.config?Object.fromEntries(Object.entries(t.config).map(([X,te])=>[X,String(te)])):{}),[ie,be]=_.useState(null),[pe,de]=_.useState(null),{data:Ce}=st({queryKey:["printers"],queryFn:ce.getPrinters});_.useEffect(()=>{const X=te=>{te.key==="Escape"&&e()};return window.addEventListener("keydown",X),()=>window.removeEventListener("keydown",X)},[e]);const ae=pt({mutationFn:()=>ce.testNotificationConfig({provider_type:o,config:K}),onSuccess:X=>{be(X),de(null)},onError:X=>{be({success:!1,message:X.message})}}),Ae=pt({mutationFn:X=>ce.createNotificationProvider(X),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]}),e()},onError:X=>{de(X.message)}}),Le=pt({mutationFn:X=>ce.updateNotificationProvider(t.id,X),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]}),e()},onError:X=>{de(X.message)}}),fe=X=>{if(X.preventDefault(),de(null),!i.trim()){de("Name is required");return}const te=Q(o);for(const ge of te)if(!K[ge.key]?.trim()){de(`${ge.label} is required`);return}const V={name:i.trim(),provider_type:o,config:K,printer_id:c,quiet_hours_enabled:d,quiet_hours_start:d?m:null,quiet_hours_end:d?b:null,daily_digest_enabled:x,daily_digest_time:x?S:null,on_print_start:A,on_print_complete:C,on_print_failed:P,on_print_stopped:j,on_print_progress:L,on_printer_offline:R,on_printer_error:q,on_filament_low:G,on_maintenance_due:re};r?Le.mutate(V):Ae.mutate(V)},Xe=Ae.isPending||Le.isPending,W=X=>{switch(X){case"callmebot":return[{key:"phone",label:"Phone Number",placeholder:"+1234567890",type:"text",required:!0},{key:"apikey",label:"API Key",placeholder:"Your CallMeBot API key",type:"text",required:!0}];case"ntfy":return[{key:"server",label:"Server URL",placeholder:"https://ntfy.sh",type:"text",required:!1},{key:"topic",label:"Topic",placeholder:"my-bambuddy",type:"text",required:!0},{key:"auth_token",label:"Auth Token",placeholder:"Optional authentication",type:"password",required:!1}];case"pushover":return[{key:"user_key",label:"User Key",placeholder:"Your Pushover user key",type:"text",required:!0},{key:"app_token",label:"App Token",placeholder:"Your Pushover app token",type:"text",required:!0},{key:"priority",label:"Priority",placeholder:"0 (normal)",type:"number",required:!1}];case"telegram":return[{key:"bot_token",label:"Bot Token",placeholder:"Bot token from @BotFather",type:"password",required:!0},{key:"chat_id",label:"Chat ID",placeholder:"Your chat or group ID",type:"text",required:!0}];case"email":return[{key:"smtp_server",label:"SMTP Server",placeholder:"smtp.gmail.com",type:"text",required:!0},{key:"smtp_port",label:"SMTP Port",placeholder:"587",type:"number",required:!1},{key:"security",label:"Security",type:"select",required:!1,options:[{value:"starttls",label:"STARTTLS (Port 587)"},{value:"ssl",label:"SSL/TLS (Port 465)"},{value:"none",label:"None (Port 25)"}]},{key:"auth_enabled",label:"Authentication",type:"select",required:!1,options:[{value:"true",label:"Enabled"},{value:"false",label:"Disabled"}]},{key:"username",label:"Username",placeholder:"your@email.com",type:"text",required:!1},{key:"password",label:"Password",placeholder:"App password",type:"password",required:!1},{key:"from_email",label:"From Email",placeholder:"your@email.com",type:"text",required:!0},{key:"to_email",label:"To Email",placeholder:"recipient@email.com",type:"text",required:!0}];case"discord":return[{key:"webhook_url",label:"Webhook URL",placeholder:"https://discord.com/api/webhooks/...",type:"text",required:!0}];case"webhook":return[{key:"webhook_url",label:"Webhook URL",placeholder:"https://example.com/webhook",type:"text",required:!0},{key:"payload_format",label:"Payload Format",type:"select",required:!1,options:[{value:"generic",label:"Generic JSON"},{value:"slack",label:"Slack / Mattermost"}]},{key:"auth_header",label:"Authorization",placeholder:"Bearer token (optional)",type:"password",required:!1},{key:"field_title",label:"Title Field Name",placeholder:"title",type:"text",required:!1,showIf:te=>te.payload_format!=="slack"},{key:"field_message",label:"Message Field Name",placeholder:"message",type:"text",required:!1,showIf:te=>te.payload_format!=="slack"}];default:return[]}},Q=X=>W(X).filter(te=>te.required),me=W(o);return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4 overflow-y-auto",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-lg my-8 max-h-[90vh] overflow-y-auto",onClick:X=>X.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary",children:[a.jsx("h2",{className:"text-lg font-semibold text-white",children:r?"Edit Notification Provider":"Add Notification Provider"}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:fe,className:"p-6 space-y-4",children:[pe&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:pe}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:i,onChange:X=>s(X.target.value),placeholder:"My Notifications",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Provider Type *"}),a.jsx("select",{value:o,onChange:X=>{l(X.target.value),ne({}),be(null)},disabled:r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50",children:DW.map(X=>a.jsx("option",{value:X.value,children:X.label},X.value))}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:DW.find(X=>X.value===o)?.description})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Configuration"}),me.filter(X=>!("showIf"in X)||X.showIf?.(K)!==!1).map(X=>a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[X.label," ",X.required&&"*"]}),X.type==="select"&&"options"in X&&X.options?a.jsx("select",{value:K[X.key]||X.options[0]?.value||"",onChange:te=>{ne({...K,[X.key]:te.target.value}),be(null)},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:X.options.map(te=>a.jsx("option",{value:te.value,children:te.label},te.value))}):a.jsx("input",{type:X.type,value:K[X.key]||"",onChange:te=>{ne({...K,[X.key]:te.target.value}),be(null)},placeholder:X.placeholder,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]},X.key))]}),a.jsx("div",{className:"flex gap-2",children:a.jsxs(ke,{type:"button",variant:"secondary",onClick:()=>{be(null),ae.mutate()},disabled:ae.isPending||!K[Q(o)[0]?.key],className:"flex-1",children:[ae.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),"Test Configuration"]})}),ie&&a.jsx("div",{className:`p-3 rounded-lg flex items-center gap-2 ${ie.success?"bg-bambu-green/20 border border-bambu-green/50 text-bambu-green":"bg-red-500/20 border border-red-500/50 text-red-400"}`,children:ie.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-5 h-5"}),a.jsx("span",{children:ie.message})]}):a.jsxs(a.Fragment,{children:[a.jsx(ta,{className:"w-5 h-5"}),a.jsx("span",{children:ie.message})]})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Printer Filter"}),a.jsxs("select",{value:c??"",onChange:X=>u(X.target.value?Number(X.target.value):null),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"All printers"}),Ce?.map(X=>a.jsx("option",{value:X.id,children:X.name},X.id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Only send notifications for events from this printer"})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("label",{className:"text-sm text-white",children:"Quiet Hours (Do Not Disturb)"}),a.jsx($n,{checked:d,onChange:h})]}),d&&a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Start"}),a.jsx("input",{type:"time",value:m,onChange:X=>p(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"End"}),a.jsx("input",{type:"time",value:b,onChange:X=>v(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("label",{className:"text-sm text-white",children:"Daily Digest"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Batch notifications into a single daily summary"})]}),a.jsx($n,{checked:x,onChange:y})]}),x&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Send digest at"}),a.jsx("input",{type:"time",value:S,onChange:X=>N(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Events will be collected and sent as a single summary at this time"})]})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Notification Events"}),a.jsxs("div",{className:"space-y-2 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide mb-2",children:"Print Events"}),a.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Start"}),a.jsx($n,{checked:A,onChange:k})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Complete"}),a.jsx($n,{checked:C,onChange:E})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Failed"}),a.jsx($n,{checked:P,onChange:T})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Stopped"}),a.jsx($n,{checked:j,onChange:z})]}),a.jsxs("div",{className:"flex items-center justify-between col-span-2",children:[a.jsxs("div",{children:[a.jsx("span",{className:"text-sm text-white",children:"Progress"}),a.jsx("span",{className:"text-xs text-bambu-gray ml-1",children:"(25%, 50%, 75%)"})]}),a.jsx($n,{checked:L,onChange:B})]})]})]}),a.jsxs("div",{className:"space-y-2 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide mb-2",children:"Printer Status"}),a.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Offline"}),a.jsx($n,{checked:R,onChange:$})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Error"}),a.jsx($n,{checked:q,onChange:I})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Low Filament"}),a.jsx($n,{checked:G,onChange:Y})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Maintenance"}),a.jsx($n,{checked:re,onChange:H})]})]})]})]}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:Xe,className:"flex-1",children:[Xe?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),r?"Save":"Add"]})]})]})]})})}function KYe({template:t,onClose:e}){const n=un(),r=_.useRef(null),[i,s]=_.useState(t.title_template),[o,l]=_.useState(t.body_template),[c,u]=_.useState(null),[d,h]=_.useState(!0),{data:m}=st({queryKey:["template-variables"],queryFn:ce.getTemplateVariables}),p=m?.find(k=>k.event_type===t.event_type),{data:b,isLoading:v}=st({queryKey:["template-preview",t.event_type,i,o],queryFn:()=>ce.previewTemplate({event_type:t.event_type,title_template:i,body_template:o}),enabled:d&&i.length>0&&o.length>0});_.useEffect(()=>{const k=C=>{C.key==="Escape"&&e()};return window.addEventListener("keydown",k),()=>window.removeEventListener("keydown",k)},[e]);const x=pt({mutationFn:k=>ce.updateNotificationTemplate(t.id,k),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-templates"]}),e()},onError:k=>{u(k.message)}}),y=pt({mutationFn:()=>ce.resetNotificationTemplate(t.id),onSuccess:k=>{s(k.title_template),l(k.body_template),n.invalidateQueries({queryKey:["notification-templates"]})},onError:k=>{u(k.message)}}),S=k=>{if(k.preventDefault(),u(null),!i.trim()){u("Title is required");return}if(!o.trim()){u("Body is required");return}x.mutate({title_template:i,body_template:o})},N=k=>{const C=r.current;if(!C)return;const E=C.selectionStart,P=C.selectionEnd,T=o,j=T.substring(0,E),z=T.substring(P),L=j+`{${k}}`+z;l(L),setTimeout(()=>{C.focus();const B=E+k.length+2;C.setSelectionRange(B,B)},0)},A=i!==t.title_template||o!==t.body_template;return a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4",children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg w-full max-w-2xl max-h-[90vh] flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary shrink-0",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white",children:["Edit Template: ",t.name]}),a.jsx("button",{onClick:e,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",children:a.jsx(Lt,{className:"w-5 h-5 text-bambu-gray"})})]}),a.jsxs("form",{onSubmit:S,className:"flex-1 overflow-y-auto p-4 space-y-4",children:[c&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded text-red-400 text-sm",children:c}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-1",children:"Title"}),a.jsx("input",{type:"text",value:i,onChange:k=>s(k.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green",placeholder:"Notification title..."})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-1",children:"Body"}),a.jsx("textarea",{ref:r,value:o,onChange:k=>l(k.target.value),rows:4,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green font-mono text-sm resize-none",placeholder:"Notification body..."})]}),p&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-2",children:"Available Variables"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:p.variables.map(k=>a.jsxs("button",{type:"button",onClick:()=>N(k),className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-dark hover:bg-bambu-dark-tertiary border border-bambu-dark-tertiary rounded text-xs text-bambu-gray hover:text-white transition-colors",children:[a.jsx(dr,{className:"w-3 h-3"}),k]},k))}),a.jsx("p",{className:"text-xs text-bambu-gray/60 mt-1",children:"Click to insert at cursor position in body"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("label",{className:"text-sm font-medium text-bambu-gray flex items-center gap-2",children:[a.jsx(_c,{className:"w-4 h-4"}),"Live Preview"]}),a.jsx("button",{type:"button",onClick:()=>h(!d),className:"text-xs text-bambu-green hover:text-bambu-green-light",children:d?"Hide":"Show"})]}),d&&a.jsx("div",{className:"bg-bambu-dark border border-bambu-dark-tertiary rounded p-3 space-y-2",children:v?a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-sm",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Loading preview..."]}):b?a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Title:"}),a.jsx("div",{className:"text-white font-medium",children:b.title})]}),a.jsxs("div",{children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Body:"}),a.jsx("div",{className:"text-white whitespace-pre-wrap text-sm",children:b.body})]})]}):a.jsx("div",{className:"text-bambu-gray text-sm",children:"Enter template content to see preview"})})]})]}),a.jsxs("div",{className:"flex items-center justify-between p-4 border-t border-bambu-dark-tertiary shrink-0",children:[a.jsxs(ke,{type:"button",variant:"ghost",onClick:()=>y.mutate(),disabled:y.isPending,className:"text-orange-400 hover:text-orange-300",children:[y.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin mr-2"}):a.jsx($h,{className:"w-4 h-4 mr-2"}),"Reset to Default"]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,children:"Cancel"}),a.jsxs(ke,{onClick:S,disabled:x.isPending||!A,children:[x.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin mr-2"}):a.jsx(gs,{className:"w-4 h-4 mr-2"}),"Save"]})]})]})]})})}const XYe={print_start:"Print Started",print_complete:"Print Complete",print_failed:"Print Failed",print_stopped:"Print Stopped",print_progress:"Progress",printer_offline:"Printer Offline",printer_error:"Printer Error",filament_low:"Low Filament",maintenance_due:"Maintenance Due",test:"Test"},YYe={print_start:"text-blue-400",print_complete:"text-bambu-green",print_failed:"text-red-400",print_stopped:"text-orange-400",print_progress:"text-yellow-400",printer_offline:"text-gray-400",printer_error:"text-rose-400",filament_low:"text-cyan-400",maintenance_due:"text-purple-400",test:"text-bambu-gray"};function QYe({onClose:t}){const e=un(),{showToast:n}=Hn(),[r,i]=_.useState(7),[s,o]=_.useState(null),[l,c]=_.useState(!1),{data:u}=st({queryKey:["settings"],queryFn:ce.getSettings}),d=u?.time_format||"system",{data:h,isLoading:m,refetch:p,isRefetching:b}=st({queryKey:["notification-logs",r,l],queryFn:()=>ce.getNotificationLogs({days:r,limit:100,success:l?!1:void 0})}),{data:v}=st({queryKey:["notification-log-stats",r],queryFn:()=>ce.getNotificationLogStats(r)}),x=pt({mutationFn:()=>ce.clearNotificationLogs(30),onSuccess:S=>{n(S.message,"success"),e.invalidateQueries({queryKey:["notification-logs"]}),e.invalidateQueries({queryKey:["notification-log-stats"]})},onError:S=>{n(`Failed to clear logs: ${S.message}`,"error")}}),y=S=>{const N=Hi(S);if(!N)return"";const k=new Date().getTime()-N.getTime();return k<6e4?"Just now":k<36e5?`${Math.floor(k/6e4)}m ago`:k<864e5?`${Math.floor(k/36e5)}h ago`:N.toLocaleDateString()+" "+cpe(N,d)};return a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:a.jsxs("div",{className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg w-full max-w-3xl max-h-[85vh] flex flex-col",children:[a.jsxs("div",{className:"p-4 border-b border-bambu-dark-tertiary flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(sy,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Notification Log"})]}),a.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white transition-colors",children:"×"})]}),v&&a.jsx("div",{className:"px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/50",children:a.jsxs("div",{className:"flex items-center gap-6 text-sm",children:[a.jsxs("span",{className:"text-bambu-gray",children:["Last ",r," days: ",a.jsx("span",{className:"text-white font-medium",children:v.total})," notifications"]}),a.jsxs("span",{className:"flex items-center gap-1 text-bambu-green",children:[a.jsx(Nr,{className:"w-4 h-4"}),v.success_count," sent"]}),v.failure_count>0&&a.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[a.jsx(ta,{className:"w-4 h-4"}),v.failure_count," failed"]})]})}),a.jsxs("div",{className:"px-4 py-3 border-b border-bambu-dark-tertiary flex items-center gap-4",children:[a.jsxs("select",{value:r,onChange:S=>i(Number(S.target.value)),className:"px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green",children:[a.jsx("option",{value:1,children:"Last 24 hours"}),a.jsx("option",{value:7,children:"Last 7 days"}),a.jsx("option",{value:30,children:"Last 30 days"}),a.jsx("option",{value:90,children:"Last 90 days"})]}),a.jsxs("label",{className:"flex items-center gap-2 text-sm text-bambu-gray cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:l,onChange:S=>c(S.target.checked),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),"Show failed only"]}),a.jsx("div",{className:"flex-1"}),a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>p(),disabled:b,children:[b?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Refresh"]}),a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>x.mutate(),disabled:x.isPending,className:"text-red-400 hover:text-red-300",children:[x.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),"Clear Old"]})]}),a.jsx("div",{className:"flex-1 overflow-y-auto p-4",children:m?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):h&&h.length>0?a.jsx("div",{className:"space-y-2",children:h.map(S=>a.jsx(ZYe,{log:S,isExpanded:s===S.id,onToggle:()=>o(s===S.id?null:S.id),formatDate:y,formatFullDate:N=>nb(N,d)},S.id))}):a.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[a.jsx(sy,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm",children:l?"No failed notifications":"No notifications logged"})]})})]})})}function ZYe({log:t,isExpanded:e,onToggle:n,formatDate:r,formatFullDate:i}){return a.jsxs("div",{className:`border rounded-lg overflow-hidden transition-colors ${t.success?"border-bambu-dark-tertiary bg-bambu-dark/30":"border-red-500/30 bg-red-500/5"}`,children:[a.jsxs("button",{className:"w-full px-3 py-2 flex items-center gap-3 text-left hover:bg-bambu-dark/50 transition-colors",onClick:n,children:[t.success?a.jsx(Nr,{className:"w-4 h-4 text-bambu-green shrink-0"}):a.jsx(ta,{className:"w-4 h-4 text-red-400 shrink-0"}),a.jsx("span",{className:`text-xs font-medium ${YYe[t.event_type]||"text-bambu-gray"}`,children:XYe[t.event_type]||t.event_type}),a.jsx("span",{className:"text-sm text-white truncate flex-1",children:t.provider_name||"Unknown Provider"}),t.printer_name&&a.jsx("span",{className:"text-xs text-bambu-gray",children:t.printer_name}),a.jsx("span",{className:"text-xs text-bambu-gray shrink-0",children:r(t.created_at)}),e?a.jsx(Ch,{className:"w-4 h-4 text-bambu-gray shrink-0"}):a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray shrink-0"})]}),e&&a.jsxs("div",{className:"px-3 py-2 border-t border-bambu-dark-tertiary bg-bambu-dark/20 space-y-2",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray mb-1",children:"Title"}),a.jsx("p",{className:"text-sm text-white",children:t.title})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray mb-1",children:"Message"}),a.jsx("p",{className:"text-sm text-white whitespace-pre-wrap",children:t.message})]}),!t.success&&t.error_message&&a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-red-400 mb-1",children:"Error"}),a.jsx("p",{className:"text-sm text-red-300",children:t.error_message})]}),a.jsxs("div",{className:"flex gap-4 text-xs text-bambu-gray pt-1",children:[a.jsxs("span",{children:["Provider: ",t.provider_type]}),a.jsxs("span",{children:["Time: ",i(t.created_at)]})]})]})]})}function JYe({formData:t,setFormData:e,groups:n,onClose:r,onCreate:i,isCreating:s,isCreateButtonDisabled:o}){const{t:l}=Sn();_.useEffect(()=>{const u=d=>{d.key==="Escape"&&r()};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[r]);const c=u=>{e({...t,group_ids:t.group_ids.includes(u)?t.group_ids.filter(d=>d!==u):[...t.group_ids,u]})};return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:r,children:a.jsxs(_t,{className:"w-full max-w-md",onClick:u=>u.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex flex-col gap-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:l("users.modal.createUser")})]}),a.jsx("p",{className:"text-sm text-bambu-gray ml-7",children:l("users.modal.advancedAuthSubtitle")||"with Advanced Authentication"})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:r,children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[l("users.form.username")," ",a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"text",value:t.username,onChange:u=>e({...t,username:u.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:l("users.form.usernamePlaceholder"),autoComplete:"username",required:!0})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[l("users.form.email")||"Email"," ",a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"email",value:t.email,onChange:u=>e({...t,email:u.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:l("users.form.emailPlaceholder")||"user@example.com",required:!0})]}),a.jsx("div",{className:"bg-bambu-dark-secondary/50 border border-bambu-green/20 rounded-lg p-3",children:a.jsx("p",{className:"text-sm text-bambu-gray",children:l("users.form.autoGeneratedPassword")||"A secure password will be automatically generated and emailed to the user."})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:l("users.form.groups")}),a.jsxs("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:[n.map(u=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.group_ids.includes(u.id),onChange:()=>c(u.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:u.name}),u.is_system&&a.jsxs("span",{className:"text-xs text-yellow-400",children:["(",l("users.system"),")"]})]},u.id)),n.length===0&&a.jsx("p",{className:"text-sm text-bambu-gray",children:l("users.noGroupsAvailable")})]})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:r,children:l("users.modal.cancel")}),a.jsx(ke,{onClick:i,disabled:o,children:s?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),l("users.modal.creating")]}):a.jsxs(a.Fragment,{children:[a.jsx(dr,{className:"w-4 h-4"}),l("users.modal.createUser")]})})]})]})]})})}function eQe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),[r,i]=_.useState(!1),[s,o]=_.useState(""),[l,c]=_.useState("auto"),[u,d]=_.useState(!1),[h,m]=_.useState(!0),[p,b]=_.useState("all"),[v,x]=_.useState(!1),[y,S]=_.useState(!1),{data:N,isLoading:A}=st({queryKey:["spoolman-settings"],queryFn:ce.getSpoolmanSettings}),{data:k,isLoading:C,refetch:E}=st({queryKey:["spoolman-status"],queryFn:ce.getSpoolmanStatus,refetchInterval:3e4}),{data:P}=st({queryKey:["printers"],queryFn:ce.getPrinters});_.useEffect(()=>{N&&(i(N.spoolman_enabled==="true"),o(N.spoolman_url||""),c(N.spoolman_sync_mode||"auto"),d(N.spoolman_disable_weight_sync==="true"),m(N.spoolman_report_partial_usage!=="false"),x(!0))},[N]),_.useEffect(()=>{if(!v||!N)return;if(N.spoolman_enabled==="true"!==r||(N.spoolman_url||"")!==s||(N.spoolman_sync_mode||"auto")!==l||N.spoolman_disable_weight_sync==="true"!==u||N.spoolman_report_partial_usage!=="false"!==h){const Y=setTimeout(()=>{T.mutate()},500);return()=>clearTimeout(Y)}},[r,s,l,u,h,v]);const T=pt({mutationFn:()=>ce.updateSpoolmanSettings({spoolman_enabled:r?"true":"false",spoolman_url:s,spoolman_sync_mode:l,spoolman_disable_weight_sync:u?"true":"false",spoolman_report_partial_usage:h?"true":"false"}),onSuccess:()=>{e.invalidateQueries({queryKey:["spoolman-settings"]}),e.invalidateQueries({queryKey:["spoolman-status"]}),n(t("settings.toast.settingsSaved"))}}),j=pt({mutationFn:ce.connectSpoolman,onSuccess:()=>{E()}}),z=pt({mutationFn:ce.disconnectSpoolman,onSuccess:()=>{E()}}),L=pt({mutationFn:ce.syncAllPrintersAms,onSuccess:G=>{G.success}}),B=pt({mutationFn:G=>ce.syncPrinterAms(G),onSuccess:G=>{G.success}}),R=()=>{p==="all"?L.mutate():B.mutate(p)},$=L.isPending||B.isPending,q=p==="all"?L.data:B.data,I=p==="all"?L.isSuccess:B.isSuccess;return A?a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Spoolman Integration"})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})})})]}):a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Spoolman Integration"})]}),T.isPending&&a.jsx(ut,{className:"w-4 h-4 text-bambu-green animate-spin"})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Connect to Spoolman for filament inventory tracking. AMS data will sync automatically."}),a.jsx("div",{className:"p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg",children:a.jsxs("div",{className:"flex gap-2",children:[a.jsx(ho,{className:"w-4 h-4 text-blue-400 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-xs text-blue-300",children:[a.jsx("p",{className:"font-medium mb-1",children:"How Sync Works"}),a.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-blue-300/80",children:[a.jsx("li",{children:"Only official Bambu Lab spools with RFID are synced"}),a.jsx("li",{children:"New spools are auto-created in Spoolman on first sync"}),a.jsx("li",{children:"Non-Bambu Lab spools (third-party, refilled) are skipped"})]}),a.jsx("p",{className:"font-medium mt-2 mb-1",children:"Linking Existing Spools"}),a.jsx("p",{className:"text-blue-300/80",children:'To link existing Spoolman spools to your AMS, hover over an AMS slot and click "Link to Spoolman".'})]})]})}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Enable Spoolman"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Sync filament data with Spoolman server"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:r,onChange:G=>i(G.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Spoolman URL"}),a.jsx("input",{type:"text",placeholder:"http://192.168.1.100:7912",value:s,onChange:G=>o(G.target.value),disabled:!r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray/50 focus:border-bambu-green focus:outline-none disabled:opacity-50"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"URL of your Spoolman server (e.g., http://localhost:7912)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Sync Mode"}),a.jsxs("select",{value:l,onChange:G=>c(G.target.value),disabled:!r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50",children:[a.jsx("option",{value:"auto",children:"Automatic"}),a.jsx("option",{value:"manual",children:"Manual Only"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:l==="auto"?"AMS data syncs automatically when changes are detected":"Only sync when manually triggered"})]}),l==="auto"&&a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:t("spoolman.disableWeightSync")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("spoolman.disableWeightSyncDesc")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:u,onChange:G=>d(G.target.checked),disabled:!r,className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),u&&a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:t("spoolman.reportPartialUsage")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("spoolman.reportPartialUsageDesc")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:h,onChange:G=>m(G.target.checked),disabled:!r,className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),r&&a.jsxs("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:"Status:"}),C?a.jsx(ut,{className:"w-4 h-4 text-bambu-gray animate-spin"}):k?.connected?a.jsxs("span",{className:"flex items-center gap-1 text-sm text-green-500",children:[a.jsx(qi,{className:"w-4 h-4"}),"Connected"]}):a.jsxs("span",{className:"flex items-center gap-1 text-sm text-red-500",children:[a.jsx(Lt,{className:"w-4 h-4"}),"Disconnected"]})]}),a.jsx("div",{className:"flex gap-2",children:k?.connected?a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>z.mutate(),disabled:z.isPending,children:[z.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($he,{className:"w-4 h-4"}),"Disconnect"]}):a.jsxs(ke,{size:"sm",onClick:()=>j.mutate(),disabled:j.isPending||!s,children:[j.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(bc,{className:"w-4 h-4"}),"Connect"]})})]}),j.isError&&a.jsx("div",{className:"mb-3 p-2 bg-red-500/20 border border-red-500/50 rounded text-sm text-red-400",children:j.error.message}),k?.connected&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Sync AMS Data"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Manually sync printer AMS data to Spoolman"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("div",{className:"relative flex-1",children:[a.jsxs("select",{value:p,onChange:G=>b(G.target.value==="all"?"all":Number(G.target.value)),className:"w-full px-3 py-2 pr-8 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"all",children:"All Printers"}),P?.map(G=>a.jsx("option",{value:G.id,children:G.name},G.id))]}),a.jsx(Sr,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:R,disabled:$,children:[$?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Sync"]})]})]}),I&&q&&a.jsxs("div",{className:"mt-3 space-y-2",children:[a.jsx("div",{className:`p-2 rounded text-sm ${q.success?"bg-green-500/20 border border-green-500/50 text-green-400":"bg-yellow-500/20 border border-yellow-500/50 text-yellow-400"}`,children:q.success?`Synced ${q.synced_count} spool${q.synced_count!==1?"s":""} successfully`:`Synced ${q.synced_count} spool${q.synced_count!==1?"s":""} with ${q.errors.length} error${q.errors.length!==1?"s":""}`}),q.skipped_count>0&&a.jsxs("div",{className:"p-2 bg-amber-500/10 border border-amber-500/30 rounded text-sm",children:[a.jsxs("div",{className:"flex items-center justify-between text-amber-400 mb-1",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx(kn,{className:"w-3.5 h-3.5"}),a.jsxs("span",{className:"font-medium",children:[q.skipped_count," spool",q.skipped_count!==1?"s":""," skipped"]})]}),q.skipped_count>5&&a.jsx("button",{onClick:()=>S(!y),className:"text-xs text-amber-400 hover:text-amber-300 underline",children:y?"Show less":"Show all"})]}),a.jsxs("ul",{className:"text-xs text-amber-300/80 space-y-0.5",children:[(y?q.skipped:q.skipped.slice(0,5)).map((G,Y)=>a.jsxs("li",{className:"flex items-center gap-2",children:[G.color&&a.jsx("span",{className:"w-3 h-3 rounded-full border border-white/20",style:{backgroundColor:`#${G.color}`}}),a.jsx("span",{children:G.location}),a.jsxs("span",{className:"text-amber-300/60",children:["- ",G.reason]})]},Y)),!y&&q.skipped_count>5&&a.jsxs("li",{className:"text-amber-300/60 italic",children:["...and ",q.skipped_count-5," more"]})]})]}),q.errors.length>0&&a.jsxs("div",{className:"p-2 bg-red-500/10 border border-red-500/30 rounded text-sm",children:[a.jsx("div",{className:"text-red-400 font-medium mb-1",children:"Errors:"}),a.jsx("ul",{className:"text-xs text-red-300/80 space-y-0.5",children:q.errors.map((G,Y)=>a.jsx("li",{children:G},Y))})]})]})]})]})]})}function tQe({link:t,onClose:e}){const n=un(),{mode:r}=Vh(),i=!!t,s=_.useRef(null),[o,l]=_.useState(t?.name||""),[c,u]=_.useState(t?.url||""),[d,h]=_.useState(t?.icon||"link"),[m,p]=_.useState(!!t?.custom_icon),[b,v]=_.useState(t?.custom_icon?ce.getExternalLinkIconUrl(t.id):null),[x,y]=_.useState(null),[S,N]=_.useState(null);_.useEffect(()=>{const z=L=>{L.key==="Escape"&&e()};return window.addEventListener("keydown",z),()=>window.removeEventListener("keydown",z)},[e]);const A=pt({mutationFn:async z=>{const L=await ce.createExternalLink(z);return x?await ce.uploadExternalLinkIcon(L.id,x):L},onSuccess:()=>{n.invalidateQueries({queryKey:["external-links"]}),e()},onError:z=>{N(z.message)}}),k=pt({mutationFn:async z=>{let L=await ce.updateExternalLink(t.id,z);return x?L=await ce.uploadExternalLinkIcon(t.id,x):!m&&t?.custom_icon&&(L=await ce.deleteExternalLinkIcon(t.id)),L},onSuccess:()=>{n.invalidateQueries({queryKey:["external-links"]}),e()},onError:z=>{N(z.message)}}),C=z=>{const L=z.target.files?.[0];if(L){if(!["image/png","image/jpeg","image/gif","image/svg+xml","image/webp","image/x-icon"].includes(L.type)){N("Please select a valid image file (PNG, JPG, GIF, SVG, WebP, or ICO)");return}if(L.size>1024*1024){N("Image file must be less than 1MB");return}y(L),p(!0);const R=new FileReader;R.onload=$=>{v($.target?.result)},R.readAsDataURL(L)}},E=()=>{y(null),v(null),p(!1),s.current&&(s.current.value="")},P=z=>{if(z.preventDefault(),N(null),!o.trim()){N("Name is required");return}if(!c.trim()){N("URL is required");return}if(!c.startsWith("http://")&&!c.startsWith("https://")){N("URL must start with http:// or https://");return}const L={name:o.trim(),url:c.trim(),icon:d};i?k.mutate(L):A.mutate(L)},T=A.isPending||k.isPending,j=qM(d);return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md",onClick:z=>z.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 rounded-full bg-bambu-green/20 text-bambu-green",children:m&&b?a.jsx("img",{src:b,alt:"",className:`w-5 h-5 rounded ${r==="dark"?"invert opacity-[0.65]":"opacity-60"}`}):a.jsx(j,{className:"w-5 h-5"})}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i?"Edit Link":"Add External Link"})]}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:P,className:"p-6 space-y-4",children:[S&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:S}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:o,onChange:z=>l(z.target.value),placeholder:"My Link",maxLength:50,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"URL *"}),a.jsx("input",{type:"text",value:c,onChange:z=>u(z.target.value),placeholder:"https://example.com",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("label",{className:"block text-sm text-bambu-gray",children:"Icon"}),a.jsxs("div",{className:"p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-sm text-white",children:"Custom Icon"}),a.jsx("input",{ref:s,type:"file",accept:"image/png,image/jpeg,image/gif,image/svg+xml,image/webp,image/x-icon",className:"hidden",onChange:C}),m&&b?a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("img",{src:b,alt:"Custom icon",className:`w-8 h-8 rounded border border-bambu-dark-tertiary ${r==="dark"?"invert opacity-[0.65]":"opacity-60"}`}),a.jsx("button",{type:"button",onClick:E,className:"p-1 text-red-400 hover:text-red-300 transition-colors",title:"Remove custom icon",children:a.jsx(cn,{className:"w-4 h-4"})})]}):a.jsxs(ke,{type:"button",variant:"secondary",size:"sm",onClick:()=>s.current?.click(),children:[a.jsx($a,{className:"w-4 h-4"}),"Upload"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"PNG, JPG, GIF, SVG, WebP, or ICO. Max 1MB."})]}),!m&&a.jsxs("div",{children:[a.jsx("span",{className:"text-sm text-bambu-gray block mb-2",children:"Or choose a preset icon"}),a.jsx(Yme,{value:d,onChange:h})]})]}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:T,className:"flex-1",children:[T?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),i?"Save":"Add"]})]})]})]})})}function nQe(){const t=un(),[e,n]=_.useState(!1),[r,i]=_.useState(null),[s,o]=_.useState(null),[l,c]=_.useState(null),{data:u,isLoading:d}=st({queryKey:["external-links"],queryFn:ce.getExternalLinks}),h=pt({mutationFn:S=>ce.deleteExternalLink(S),onSuccess:()=>{t.invalidateQueries({queryKey:["external-links"]})}}),m=pt({mutationFn:S=>ce.reorderExternalLinks(S),onSuccess:()=>{t.invalidateQueries({queryKey:["external-links"]})}}),p=(S,N)=>{c(N),S.dataTransfer.effectAllowed="move"},b=S=>{S.preventDefault(),S.dataTransfer.dropEffect="move"},v=(S,N)=>{if(S.preventDefault(),l===null||l===N||!u)return;const A=u.map(P=>P.id),k=A.indexOf(l),C=A.indexOf(N);if(k===-1||C===-1)return;const E=[...A];E.splice(k,1),E.splice(C,0,l),m.mutate(E),c(null)},x=S=>{o(S)},y=()=>{s&&(h.mutate(s.id),o(null))};return a.jsxs(a.Fragment,{children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(bc,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Sidebar Links"})]}),a.jsxs(ke,{size:"sm",onClick:()=>n(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),"Add Link"]})]})}),a.jsxs(Mt,{children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-4",children:"Add external links to the sidebar navigation. Drag to reorder."}),d?a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):u&&u.length>0?a.jsx("div",{className:"space-y-2",children:u.map(S=>{const N=qM(S.icon);return a.jsxs("div",{draggable:!0,onDragStart:A=>p(A,S.id),onDragOver:b,onDrop:A=>v(A,S.id),className:`flex items-center gap-3 p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary transition-colors ${l===S.id?"opacity-50":""}`,children:[a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray cursor-grab flex-shrink-0"}),a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark-tertiary text-bambu-gray",children:a.jsx(N,{className:"w-4 h-4"})}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-white font-medium truncate",children:S.name}),a.jsx(Xr,{className:"w-3 h-3 text-bambu-gray flex-shrink-0"})]}),a.jsx("span",{className:"text-sm text-bambu-gray truncate block",children:S.url})]}),a.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[a.jsx("button",{onClick:()=>i(S),className:"p-2 rounded-lg hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white transition-colors",title:"Edit",children:a.jsx(na,{className:"w-4 h-4"})}),a.jsx("button",{onClick:()=>x(S),disabled:h.isPending,className:"p-2 rounded-lg hover:bg-red-500/20 text-bambu-gray hover:text-red-400 transition-colors disabled:opacity-50",title:"Delete",children:a.jsx(cn,{className:"w-4 h-4"})})]})]},S.id)})}):a.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[a.jsx(bc,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),a.jsx("p",{children:"No external links configured"}),a.jsx("p",{className:"text-sm",children:'Click "Add Link" to add one'})]})]})]}),(e||r)&&a.jsx(tQe,{link:r,onClose:()=>{n(!1),i(null)}}),s&&a.jsx(er,{title:"Delete Link",message:`Are you sure you want to delete "${s.name}"? This action cannot be undone.`,confirmText:"Delete",cancelText:"Cancel",variant:"danger",onConfirm:y,onCancel:()=>o(null)})]})}function rQe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),[r,i]=_.useState(!1),[s,o]=_.useState(""),[l,c]=_.useState("immediate"),[u,d]=_.useState("3DPrinter-X1-Carbon"),[h,m]=_.useState(null),[p,b]=_.useState(""),[v,x]=_.useState(!1),[y,S]=_.useState(null),{data:N,isLoading:A}=st({queryKey:["virtual-printer-settings"],queryFn:D1.getSettings,refetchInterval:1e4}),{data:k}=st({queryKey:["virtual-printer-models"],queryFn:D1.getModels}),{data:C}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:E}=st({queryKey:["network-interfaces"],queryFn:()=>ce.getNetworkInterfaces().then(I=>I.interfaces),enabled:l==="proxy"});_.useEffect(()=>{if(N){i(N.enabled);let I=N.mode==="queue"?"review":N.mode;I!=="immediate"&&I!=="review"&&I!=="print_queue"&&I!=="proxy"&&(I="immediate"),c(I),d(N.model),m(N.target_printer_id),b(N.remote_interface_ip||"")}},[N]);const P=pt({mutationFn:I=>D1.updateSettings(I),onSuccess:()=>{e.invalidateQueries({queryKey:["virtual-printer-settings"]}),n(t("virtualPrinter.toast.updated")),S(null)},onError:I=>{if(n(I.message||t("virtualPrinter.toast.failedToUpdate"),"error"),N){i(N.enabled);const G=N.mode==="queue"?"review":N.mode;c(["immediate","review","print_queue","proxy"].includes(G)?G:"immediate"),d(N.model),m(N.target_printer_id)}S(null)}}),T=()=>{const I=!r;if(I){if(l==="proxy"){if(!h){n(t("virtualPrinter.toast.targetPrinterRequired"),"error");return}}else if(!s&&!N?.access_code_set){n(t("virtualPrinter.toast.accessCodeRequired"),"error");return}}i(I),S("toggle"),P.mutate({enabled:I,access_code:l!=="proxy"&&s||void 0,mode:l,target_printer_id:l==="proxy"?h??void 0:void 0})},j=()=>{if(!s){n(t("virtualPrinter.toast.accessCodeEmpty"),"error");return}if(s.length!==8){n(t("virtualPrinter.toast.accessCodeLength"),"error");return}S("accessCode"),P.mutate({access_code:s}),o("")},z=I=>{c(I),S("mode"),P.mutate({mode:I})},L=I=>{m(I),S("targetPrinter"),P.mutate({target_printer_id:I})},B=I=>{d(I),S("model"),P.mutate({model:I})},R=I=>{b(I),S("remoteInterface"),P.mutate({remote_interface_ip:I})};if(A)return a.jsx(_t,{children:a.jsx(Mt,{className:"py-8 flex justify-center",children:a.jsx(ut,{className:"w-6 h-6 animate-spin text-bambu-green"})})});const $=N?.status,q=$?.running||!1;return a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsx("div",{className:"space-y-6 lg:w-[480px] lg:flex-shrink-0",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Or,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("virtualPrinter.title")})]}),$&&a.jsxs("div",{className:`flex items-center gap-2 text-sm ${q?"text-green-400":"text-bambu-gray"}`,children:[a.jsx("span",{className:`w-2 h-2 rounded-full ${q?"bg-green-400 animate-pulse":"bg-gray-500"}`}),t(q?"virtualPrinter.running":"virtualPrinter.stopped")]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:t(l==="proxy"?"virtualPrinter.description.proxy":"virtualPrinter.description.default")}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.enable.title")}),a.jsx("div",{className:"text-sm text-bambu-gray",children:q?l==="proxy"?t("virtualPrinter.enable.proxyingTo",{name:C?.find(I=>I.id===h)?.name||"printer"}):t("virtualPrinter.enable.visibleInSlicer"):t("virtualPrinter.enable.notActive")})]}),a.jsx("button",{onClick:T,disabled:y==="toggle",className:`relative w-12 h-6 rounded-full transition-colors ${r?"bg-bambu-green":"bg-bambu-dark-tertiary"} ${y==="toggle"?"opacity-50":""}`,children:a.jsx("span",{className:`absolute top-1 left-1 w-4 h-4 bg-white rounded-full transition-transform ${r?"translate-x-6":""}`})})]}),l!=="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.model.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:t("virtualPrinter.model.description")}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:u,onChange:I=>B(I.target.value),disabled:y==="model",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:k?.models&&Object.entries(k.models).sort(([,I],[,G])=>I.localeCompare(G)).map(([I,G])=>a.jsx("option",{value:I,children:G},I))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),r&&q&&a.jsxs("p",{className:"text-xs text-bambu-gray mt-2",children:[a.jsx(ho,{className:"w-3 h-3 inline mr-1"}),t("virtualPrinter.model.restartWarning")]})]}),l!=="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.accessCode.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:N?.access_code_set?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.accessCode.isSet")]}):a.jsxs("span",{className:"flex items-center gap-1 text-yellow-400",children:[a.jsx(kn,{className:"w-4 h-4"}),t("virtualPrinter.accessCode.notSet")]})}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("div",{className:"relative flex-1",children:[a.jsx("input",{type:v?"text":"password",value:s,onChange:I=>o(I.target.value),placeholder:N?.access_code_set?t("virtualPrinter.accessCode.placeholderChange"):t("virtualPrinter.accessCode.placeholder"),maxLength:8,className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white placeholder-bambu-gray pr-10 font-mono"}),a.jsx("button",{onClick:()=>x(!v),className:"absolute right-2 top-1/2 -translate-y-1/2 text-bambu-gray hover:text-white",children:v?a.jsx(RM,{className:"w-4 h-4"}):a.jsx(_c,{className:"w-4 h-4"})})]}),a.jsx(ke,{onClick:j,disabled:!s||y==="accessCode",variant:"primary",children:y==="accessCode"?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):t("common.save")})]}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-2",children:[t("virtualPrinter.accessCode.hint"),s&&a.jsxs("span",{className:s.length===8?"text-green-400":"text-yellow-400",children:[" ",t("virtualPrinter.accessCode.charCount",{count:s.length})]})]})]}),l==="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.targetPrinter.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:h?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.targetPrinter.configured")]}):a.jsxs("span",{className:"flex items-center gap-1 text-yellow-400",children:[a.jsx(kn,{className:"w-4 h-4"}),t("virtualPrinter.targetPrinter.notConfigured")]})}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:h??"",onChange:I=>{const G=parseInt(I.target.value,10);isNaN(G)||L(G)},disabled:y==="targetPrinter",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:[a.jsx("option",{value:"",children:t("virtualPrinter.targetPrinter.placeholder")}),C?.map(I=>a.jsxs("option",{value:I.id,children:[I.name," (",I.ip_address,")"]},I.id))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:t("virtualPrinter.targetPrinter.hint")}),!C?.length&&a.jsxs("p",{className:"text-xs text-yellow-400 mt-2",children:[a.jsx(kn,{className:"w-3 h-3 inline mr-1"}),t("virtualPrinter.targetPrinter.noPrinters")]})]}),l==="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.remoteInterface.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:p?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.remoteInterface.configured")]}):a.jsxs("span",{className:"flex items-center gap-1 text-bambu-gray",children:[a.jsx(ho,{className:"w-4 h-4"}),t("virtualPrinter.remoteInterface.optional")]})}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:p,onChange:I=>R(I.target.value),disabled:y==="remoteInterface",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:[a.jsx("option",{value:"",children:t("virtualPrinter.remoteInterface.placeholder")}),E?.map(I=>a.jsxs("option",{value:I.ip,children:[I.name," (",I.ip,") - ",I.subnet]},I.ip))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:t("virtualPrinter.remoteInterface.hint")})]}),a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.mode.title")}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("button",{onClick:()=>z("immediate"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="immediate"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.archive")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.archiveDesc")})]}),a.jsxs("button",{onClick:()=>z("review"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="review"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.review")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.reviewDesc")})]}),a.jsxs("button",{onClick:()=>z("print_queue"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="print_queue"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.queue")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.queueDesc")})]}),a.jsxs("button",{onClick:()=>z("proxy"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="proxy"?"border-blue-500 bg-blue-500/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsxs("div",{className:"flex items-center gap-1.5 text-white font-medium",children:[a.jsx(hB,{className:"w-4 h-4"}),t("virtualPrinter.mode.proxy")]}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.proxyDesc")})]})]})]})]})]})}),a.jsxs("div",{className:"space-y-6 lg:w-[480px] lg:flex-shrink-0",children:[a.jsx(_t,{className:"border-l-4 border-l-yellow-500",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-500 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm",children:[a.jsx("p",{className:"text-white font-medium mb-2",children:t("virtualPrinter.setupRequired.title")}),a.jsx("p",{className:"text-bambu-gray mb-3",children:t("virtualPrinter.setupRequired.description")}),a.jsxs("a",{href:"https://wiki.bambuddy.cool/features/virtual-printer/",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 px-4 py-2 bg-yellow-500/20 border border-yellow-500/50 rounded-md text-yellow-400 hover:bg-yellow-500/30 transition-colors",children:[a.jsx(Xr,{className:"w-4 h-4"}),t("virtualPrinter.setupRequired.readGuide")]})]})]})})}),a.jsx(_t,{children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(ho,{className:"w-5 h-5 text-blue-400 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm text-bambu-gray",children:[a.jsx("p",{className:"mb-2",children:a.jsxs("strong",{className:"text-white",children:[t(l==="proxy"?"virtualPrinter.howItWorks.titleProxy":"virtualPrinter.howItWorks.title"),":"]})}),l==="proxy"?a.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep1")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep2")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep3")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep4")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep5")})]}):a.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[a.jsx("li",{children:t("virtualPrinter.howItWorks.step1")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step2")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step3")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step4")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step5")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step6")})]})]})]})})}),$&&q&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-md font-semibold text-white",children:t("virtualPrinter.status.title")})}),a.jsx(Mt,{children:$.mode==="proxy"&&$.proxy?a.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.targetPrinter")}),a.jsx("div",{className:"text-white",children:C?.find(I=>I.id===h)?.name||$.proxy.target_host}),a.jsx("div",{className:"text-xs text-bambu-gray font-mono",children:$.proxy.target_host})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mode")}),a.jsxs("div",{className:"text-white flex items-center gap-1.5",children:[a.jsx(hB,{className:"w-4 h-4"}),t("virtualPrinter.mode.proxy")]})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.ftpPort")}),a.jsx("div",{className:"text-white font-mono",children:$.proxy.ftp_port})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mqttPort")}),a.jsx("div",{className:"text-white font-mono",children:$.proxy.mqtt_port})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.ftpConnections")}),a.jsx("div",{className:"text-white",children:$.proxy.ftp_connections??0})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mqttConnections")}),a.jsx("div",{className:"text-white",children:$.proxy.mqtt_connections??0})]})]}):a.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.printerName")}),a.jsx("div",{className:"text-white",children:$.name})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.model")}),a.jsx("div",{className:"text-white",children:$.model_name||$.model})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.serialNumber")}),a.jsx("div",{className:"text-white font-mono",children:$.serial})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mode")}),a.jsx("div",{className:"text-white capitalize",children:$.mode})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.pendingFiles")}),a.jsx("div",{className:"text-white",children:$.pending_files})]})]})})]})]})]})}function RW({status:t}){if(!t)return null;const e={success:"bg-green-500/20 text-green-400",failed:"bg-red-500/20 text-red-400",skipped:"bg-yellow-500/20 text-yellow-400",running:"bg-blue-500/20 text-blue-400"},n={success:a.jsx(Nr,{className:"w-3 h-3"}),failed:a.jsx(ta,{className:"w-3 h-3"}),skipped:a.jsx(uO,{className:"w-3 h-3"}),running:a.jsx(ut,{className:"w-3 h-3 animate-spin"})};return a.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium ${e[t]||"bg-gray-500/20 text-gray-400"}`,children:[n[t],t.charAt(0).toUpperCase()+t.slice(1)]})}function iQe(t){return t?new Date(t).toLocaleString():"-"}function OW(t){if(!t)return"-";const e=new Date(t),n=new Date,r=e.getTime()-n.getTime(),i=Math.round(r/6e4);if(i<0){const s=Math.abs(i);if(s<60)return`${s}m ago`;const o=Math.floor(s/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}else{if(i<60)return`in ${i}m`;const s=Math.floor(i/60);return s<24?`in ${s}h`:`in ${Math.floor(s/24)}d`}}function aQe(){const t=un(),{showToast:e}=Hn(),{t:n}=Sn(),[r,i]=_.useState(""),[s,o]=_.useState(""),[l,c]=_.useState("main"),[u,d]=_.useState(!1),[h,m]=_.useState("daily"),[p,b]=_.useState(!0),[v,x]=_.useState(!0),[y,S]=_.useState(!1),[N,A]=_.useState(!0),[k,C]=_.useState(!1),[E,P]=_.useState(!1),[T,j]=_.useState(""),[z,L]=_.useState(!1),[B,R]=_.useState(null),[$,q]=_.useState(null),I=_.useRef(null);_.useEffect(()=>{if(k||E){const U=O=>(O.preventDefault(),O.returnValue="A backup operation is in progress. Are you sure you want to leave?",O.returnValue);return window.addEventListener("beforeunload",U),()=>window.removeEventListener("beforeunload",U)}},[k,E]);const[G,Y]=_.useState(!1),[re,H]=_.useState(null),K=_.useRef(null),ne=_.useRef(!1),{data:ie,isLoading:be}=st({queryKey:["github-backup-config"],queryFn:ce.getGitHubBackupConfig}),{data:pe}=st({queryKey:["github-backup-status"],queryFn:ce.getGitHubBackupStatus,refetchInterval:ee=>ee.state.data?.is_running?500:1e4}),{data:de}=st({queryKey:["github-backup-logs"],queryFn:()=>ce.getGitHubBackupLogs(20)}),{data:Ce}=st({queryKey:["cloud-status"],queryFn:ce.getCloudStatus}),{data:ae}=st({queryKey:["printers"],queryFn:ce.getPrinters}),Ae=iO({queries:(ae??[]).map(ee=>({queryKey:["printerStatus",ee.id],queryFn:()=>ce.getPrinterStatus(ee.id),staleTime:1e4,refetchInterval:3e4}))}),Le=(ae??[]).map((ee,U)=>({printer:ee,connected:Ae[U]?.data?.connected??!1})),fe=Le.length,Xe=Le.filter(ee=>ee.connected).length,W=fe>0&&Xe===0,Q=Xe>0&&Xe{ie&&(i(ie.repository_url),c(ie.branch),d(ie.schedule_enabled),m(ie.schedule_type),b(ie.backup_kprofiles),x(ie.backup_cloud_profiles),S(ie.backup_settings),A(ie.enabled),o(""),setTimeout(()=>{ne.current=!0},100))},[ie]);const me=_.useCallback(async(ee=!1)=>{if(ie?.has_token)try{ee&&s?(await ce.saveGitHubBackupConfig({repository_url:r,access_token:s,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N}),o(""),e("Token updated")):(await ce.updateGitHubBackupConfig({repository_url:r,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N}),e("Settings saved")),t.invalidateQueries({queryKey:["github-backup-config"]}),t.invalidateQueries({queryKey:["github-backup-status"]})}catch(U){e(`Failed to save: ${U.message}`,"error")}},[ie?.has_token,r,s,l,u,h,p,v,y,N,t,e]);_.useEffect(()=>{if(!(!ne.current||!ie?.has_token))return K.current&&clearTimeout(K.current),K.current=setTimeout(()=>{me(!1)},500),()=>{K.current&&clearTimeout(K.current)}},[r,l,u,h,p,v,y,N,me,ie?.has_token]),_.useEffect(()=>{if(!(!ne.current||!ie?.has_token||!s))return K.current&&clearTimeout(K.current),K.current=setTimeout(()=>{me(!0)},1e3),()=>{K.current&&clearTimeout(K.current)}},[s,me,ie?.has_token]);const X=pt({mutationFn:ee=>ce.saveGitHubBackupConfig(ee),onSuccess:()=>{t.invalidateQueries({queryKey:["github-backup-config"]}),t.invalidateQueries({queryKey:["github-backup-status"]}),e("GitHub backup enabled"),o(""),ne.current=!0},onError:ee=>{e(`Failed to save: ${ee.message}`,"error")}}),te=pt({mutationFn:ce.triggerGitHubBackup,onSuccess:ee=>{t.invalidateQueries({queryKey:["github-backup-status"]}),t.invalidateQueries({queryKey:["github-backup-logs"]}),ee.success?ee.files_changed>0?e(`Backup complete - ${ee.files_changed} files updated`):e("Backup skipped - no changes"):e(`Backup failed: ${ee.message}`,"error")},onError:ee=>{e(`Backup failed: ${ee.message}`,"error")}}),V=pt({mutationFn:()=>ce.clearGitHubBackupLogs(0),onSuccess:ee=>{t.invalidateQueries({queryKey:["github-backup-logs"]}),e(`Cleared ${ee.deleted} logs`)},onError:ee=>{e(`Failed to clear logs: ${ee.message}`,"error")}}),ge=async()=>{Y(!0),H(null);try{let ee;if(s){if(!r){e("Enter repository URL","error"),Y(!1);return}ee=await ce.testGitHubConnection(r,s)}else if(ie?.has_token)ee=await ce.testGitHubStoredConnection();else{e("Enter repository URL and access token","error"),Y(!1);return}H({success:ee.success,message:ee.message})}catch(ee){H({success:!1,message:ee.message})}finally{Y(!1)}},Se=()=>{if(!r){e("Repository URL is required","error");return}if(!s){e("Access token is required","error");return}X.mutate({repository_url:r,access_token:s,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N})};return be?a.jsx("div",{className:"flex items-center justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 animate-spin text-bambu-green"})}):a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-6",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(BP,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"GitHub Backup"})]}),ie&&Ce?.is_authenticated&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:"Enabled"}),a.jsx($n,{checked:N,onChange:A})]})]})}),a.jsx(Mt,{className:"space-y-4",children:Ce?.is_authenticated?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically sync your profiles to a private GitHub repository for backup and version history."}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Repository URL"}),a.jsx("input",{type:"text",value:r,onChange:ee=>{i(ee.target.value),H(null)},placeholder:"https://github.com/username/bambuddy-backup",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:["Personal Access Token ",ie?.has_token&&a.jsx("span",{className:"text-green-400",children:"(saved)"})]}),a.jsx("input",{type:"password",value:s,onChange:ee=>{o(ee.target.value),H(null)},placeholder:ie?.has_token?"Enter new token to update":"ghp_xxxxxxxxxxxx",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Fine-grained token with Contents read/write permission"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Branch"}),a.jsx("input",{type:"text",value:l,onChange:ee=>c(ee.target.value),placeholder:"main",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Auto-backup"}),a.jsxs("select",{value:u?h:"disabled",onChange:ee=>{ee.target.value==="disabled"?d(!1):(d(!0),m(ee.target.value))},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"disabled",children:"Manual only"}),a.jsx("option",{value:"hourly",children:"Hourly"}),a.jsx("option",{value:"daily",children:"Daily"}),a.jsx("option",{value:"weekly",children:"Weekly"})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:"Include in backup"}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("label",{className:`flex items-start gap-2 ${W?"cursor-not-allowed opacity-60":"cursor-pointer"}`,children:[a.jsx("input",{type:"checkbox",checked:p,onChange:ee=>b(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green",disabled:W}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`text-sm ${W?"text-bambu-gray":"text-white"}`,children:"K-Profiles"}),W&&a.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:[a.jsx(kn,{className:"w-3 h-3"}),"No printers connected"]}),Q&&a.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:[a.jsx(kn,{className:"w-3 h-3"}),Xe,"/",fe," connected"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Pressure advance calibration from connected printers"})]})]}),a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:v,onChange:ee=>x(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green",disabled:!Ce?.is_authenticated}),a.jsxs("div",{children:[a.jsx("span",{className:`text-sm ${Ce?.is_authenticated?"text-white":"text-bambu-gray"}`,children:"Cloud Profiles"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Filament, printer, and process presets from Bambu Cloud"})]})]}),a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:y,onChange:ee=>S(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white text-sm",children:"App Settings"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Bambuddy configuration (excludes sensitive data)"})]})]})]})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 space-y-3",children:[pe?.configured&&a.jsxs("div",{className:"flex items-center justify-between text-sm",children:[a.jsx("div",{className:"flex items-center gap-2 text-bambu-gray",children:pe.last_backup_at?a.jsxs(a.Fragment,{children:[a.jsxs("span",{children:["Last backup: ",OW(pe.last_backup_at)]}),a.jsx(RW,{status:pe.last_backup_status})]}):a.jsx("span",{children:"No backups yet"})}),pe.next_scheduled_run&&a.jsxs("span",{className:"text-bambu-gray",children:[a.jsx(nr,{className:"w-3 h-3 inline mr-1"}),"Next: ",OW(pe.next_scheduled_run)]})]}),re&&a.jsxs("div",{className:`text-sm flex items-center gap-1 ${re.success?"text-green-400":"text-red-400"}`,children:[re.success?a.jsx(Nr,{className:"w-4 h-4"}):a.jsx(ta,{className:"w-4 h-4"}),re.message]}),a.jsx("div",{className:"flex flex-wrap items-center gap-2",children:pe?.configured?a.jsx(a.Fragment,{children:te.isPending||pe.is_running?a.jsxs("div",{className:"flex items-center gap-2 text-bambu-green",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),a.jsx("span",{className:"text-sm",children:pe.progress||"Starting backup..."})]}):a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"primary",size:"sm",onClick:()=>te.mutate(),disabled:!ie?.enabled,children:[a.jsx(vo,{className:"w-4 h-4"}),"Backup Now"]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:ge,disabled:G,children:[G?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Test"]})]})}):a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"primary",size:"sm",onClick:Se,disabled:X.isPending||!r||!s,children:[X.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Nr,{className:"w-4 h-4"}),"Enable Backup"]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:ge,disabled:G||!r||!s,children:[G?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Test Connection"]})]})})]})]}):a.jsxs("div",{className:"flex items-start gap-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsx("p",{className:"text-sm text-yellow-400",children:"Bambu Cloud login required. Sign in under Profiles → Cloud Profiles to enable GitHub backup."})]})})]}),de&&de.length>0&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(sy,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"History"})]}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>V.mutate(),disabled:V.isPending,children:[a.jsx(cn,{className:"w-4 h-4"}),"Clear"]})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full text-sm",children:[a.jsx("thead",{children:a.jsxs("tr",{className:"text-bambu-gray border-b border-bambu-dark-tertiary",children:[a.jsx("th",{className:"text-left py-2 px-2",children:"Date"}),a.jsx("th",{className:"text-left py-2 px-2",children:"Status"}),a.jsx("th",{className:"text-left py-2 px-2",children:"Commit"})]})}),a.jsx("tbody",{children:de.slice(0,10).map(ee=>a.jsxs("tr",{className:"border-b border-bambu-dark-tertiary/50 hover:bg-bambu-dark-secondary",children:[a.jsx("td",{className:"py-2 px-2 text-white",children:iQe(ee.started_at)}),a.jsx("td",{className:"py-2 px-2",children:a.jsx(RW,{status:ee.status})}),a.jsx("td",{className:"py-2 px-2",children:ee.commit_sha?a.jsxs("a",{href:`${ie?.repository_url}/commit/${ee.commit_sha}`,target:"_blank",rel:"noopener noreferrer",className:"text-bambu-green hover:underline inline-flex items-center gap-1",children:[ee.commit_sha.substring(0,7),a.jsx(Xr,{className:"w-3 h-3"})]}):a.jsx("span",{className:"text-bambu-gray",children:"-"})})]},ee.id))})]})})})]})]}),a.jsx("div",{className:"space-y-6",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Local Backup"})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Create a complete backup of your Bambuddy data including the database, archives, uploads, and all files."}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Download Backup"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Complete backup: database + all files (ZIP)"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",disabled:k||E,onClick:async()=>{C(!0),j("Preparing backup...");try{j("Creating backup archive... This may take a while for large archives.");const{blob:ee,filename:U}=await ce.exportBackup();j("Downloading backup file...");const O=URL.createObjectURL(ee),Z=document.createElement("a");Z.href=O,Z.download=U,Z.click(),URL.revokeObjectURL(O),e("Backup downloaded successfully")}catch(ee){e(`Failed to create backup: ${ee instanceof Error?ee.message:"Unknown error"}`,"error")}finally{C(!1),j("")}},children:[a.jsx(Ni,{className:"w-4 h-4"}),"Download"]})]}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:n("backup.restoreBackup")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:n("backup.restoreDescription")}),a.jsx("p",{className:"text-xs text-bambu-gray-light mt-1",children:n("backup.restoreNote")})]}),a.jsx("input",{ref:I,type:"file",accept:".zip",className:"hidden",onChange:ee=>{const U=ee.target.files?.[0];U&&(R(U),L(!0)),ee.target.value=""}}),a.jsxs(ke,{variant:"secondary",size:"sm",disabled:E||k,onClick:()=>I.current?.click(),children:[a.jsx($a,{className:"w-4 h-4"}),"Restore"]})]}),$&&a.jsx("div",{className:`p-3 rounded-lg ${$.success?"bg-green-500/10 border border-green-500/30":"bg-red-500/10 border border-red-500/30"}`,children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[$.success?a.jsx(Nr,{className:"w-4 h-4 text-green-400 mt-0.5 flex-shrink-0"}):a.jsx(ta,{className:"w-4 h-4 text-red-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:$.success?"text-green-200":"text-red-200",children:[$.message,$.success&&a.jsx("div",{className:"mt-2",children:a.jsxs(ke,{size:"sm",onClick:()=>window.location.reload(),children:[a.jsx($h,{className:"w-3 h-3"}),"Reload Now"]})})]})]})}),a.jsx("div",{className:"p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"text-yellow-200",children:[a.jsx("span",{className:"font-medium",children:"Restore replaces all data."})," ",a.jsx("span",{className:"text-yellow-200/70",children:"Your current database and files will be completely replaced. A restart is required after restore."})]})]})})]})]})}),z&&B&&a.jsx(er,{title:"Restore Backup",message:`Are you sure you want to restore from "${B.name}"? This will completely replace your current database and all files. The application will need to be restarted after restore.`,confirmText:"Restore Backup",variant:"danger",onConfirm:async()=>{L(!1),P(!0),q(null);try{j("Uploading backup file...");const ee=await ce.importBackup(B);q(ee),ee.success?e("Backup restored. Please restart Bambuddy.","success"):e(ee.message,"error")}catch(ee){const U=ee instanceof Error?ee.message:"Failed to restore backup";q({success:!1,message:U}),e(U,"error")}finally{P(!1),j(""),R(null)}},onCancel:()=>{L(!1),R(null)}}),(k||E)&&a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-[100]",children:a.jsxs("div",{className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-xl p-8 max-w-md w-full mx-4 text-center",children:[a.jsx("div",{className:"flex justify-center mb-4",children:a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:"w-16 h-16 border-4 border-bambu-dark-tertiary rounded-full"}),a.jsx("div",{className:"w-16 h-16 border-4 border-bambu-green border-t-transparent rounded-full absolute inset-0 animate-spin"})]})}),a.jsx("h3",{className:"text-xl font-semibold text-white mb-2",children:k?"Creating Backup":"Restoring Backup"}),a.jsx("p",{className:"text-bambu-gray mb-4",children:T||(k?"Preparing...":"Processing...")}),a.jsx("div",{className:"p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsx("p",{className:"text-yellow-200 text-left",children:"Please do not close this page or navigate away. This operation may take several minutes for large backups."})]})})]})})]})}function sQe(){const{t}=Sn(),{showToast:e}=Hn(),n=un(),[r,i]=_.useState({smtp_host:"",smtp_port:587,smtp_username:"",smtp_password:"",smtp_security:"starttls",smtp_auth_enabled:!0,smtp_from_email:"",smtp_from_name:"BamBuddy"}),[s,o]=_.useState(""),{data:l,isLoading:c}=st({queryKey:["smtpSettings"],queryFn:()=>ce.getSMTPSettings()}),{data:u}=st({queryKey:["advancedAuthStatus"],queryFn:()=>ce.getAdvancedAuthStatus()});_.useEffect(()=>{l&&i({...l,smtp_password:""})},[l]);const d=pt({mutationFn:x=>ce.saveSMTPSettings(x),onSuccess:()=>{n.invalidateQueries({queryKey:["smtpSettings"]}),n.invalidateQueries({queryKey:["advancedAuthStatus"]}),e("SMTP settings saved successfully","success")},onError:x=>{e(x.message,"error")}}),h=pt({mutationFn:x=>ce.testSMTP(x),onSuccess:x=>{e(x.message,x.success?"success":"error")},onError:x=>{e(x.message,"error")}}),m=pt({mutationFn:x=>x?ce.enableAdvancedAuth():ce.disableAdvancedAuth(),onSuccess:x=>{n.invalidateQueries({queryKey:["advancedAuthStatus"]}),e(x.message,"success")},onError:x=>{e(x.message,"error")}}),p=()=>{if(!r.smtp_host||!r.smtp_from_email){e("Please fill in all required fields","error");return}if(r.smtp_auth_enabled&&!r.smtp_username){e("Username is required when authentication is enabled","error");return}d.mutate(r)},b=()=>{if(!s){e("Please enter a test email address","error");return}if(!r.smtp_host||!r.smtp_from_email){e("Please fill in SMTP Server and From Email before testing","error");return}if(r.smtp_auth_enabled&&(!r.smtp_username||!r.smtp_password)){e("Username and Password are required when authentication is enabled","error");return}h.mutate({smtp_host:r.smtp_host,smtp_port:r.smtp_port,smtp_username:r.smtp_username,smtp_password:r.smtp_password,smtp_security:r.smtp_security,smtp_auth_enabled:r.smtp_auth_enabled,smtp_from_email:r.smtp_from_email,test_recipient:s})},v=()=>{if(!u?.advanced_auth_enabled&&!u?.smtp_configured){e("Please configure and test SMTP settings first","error");return}m.mutate(!u?.advanced_auth_enabled)};return c?a.jsx("div",{className:"flex items-center justify-center p-12",children:a.jsx(ut,{className:"w-8 h-8 animate-spin text-bambu-green"})}):a.jsxs("div",{className:"space-y-6",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.smtpSettings")||"SMTP Configuration"})}),a.jsx(Mt,{children:a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[t("settings.email.smtpHost")||"SMTP Server"," *"]}),a.jsx("input",{type:"text",value:r.smtp_host,onChange:x=>i({...r,smtp_host:x.target.value}),placeholder:"smtp.gmail.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.smtpPort")||"SMTP Port"}),a.jsx("input",{type:"number",value:r.smtp_port,onChange:x=>i({...r,smtp_port:parseInt(x.target.value)||587}),placeholder:"587",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.security")||"Security"}),a.jsxs("select",{value:r.smtp_security,onChange:x=>i({...r,smtp_security:x.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",children:[a.jsx("option",{value:"starttls",children:"STARTTLS (Port 587)"}),a.jsx("option",{value:"ssl",children:"SSL/TLS (Port 465)"}),a.jsx("option",{value:"none",children:"None (Port 25)"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.authentication")||"Authentication"}),a.jsxs("select",{value:r.smtp_auth_enabled?"true":"false",onChange:x=>i({...r,smtp_auth_enabled:x.target.value==="true"}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",children:[a.jsx("option",{value:"true",children:"Enabled"}),a.jsx("option",{value:"false",children:"Disabled"})]})]})]}),r.smtp_auth_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.username")||"Username"}),a.jsx("input",{type:"text",value:r.smtp_username||"",onChange:x=>i({...r,smtp_username:x.target.value}),placeholder:"your.email@gmail.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.password")||"Password"}),a.jsx("input",{type:"password",value:r.smtp_password||"",onChange:x=>i({...r,smtp_password:x.target.value}),placeholder:l?"••••••••":"App password",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[t("settings.email.fromEmail")||"From Email"," *"]}),a.jsx("input",{type:"email",value:r.smtp_from_email,onChange:x=>i({...r,smtp_from_email:x.target.value}),placeholder:"your@email.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.fromName")||"From Name"}),a.jsx("input",{type:"text",value:r.smtp_from_name,onChange:x=>i({...r,smtp_from_name:x.target.value}),placeholder:"BamBuddy",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsx("div",{className:"flex gap-2",children:a.jsx(ke,{onClick:p,disabled:d.isPending,className:"flex-1",children:d.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),t("settings.email.saving")||"Saving..."]}):t("settings.email.save")||"Save Settings"})})]})})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.testConnection")||"Test SMTP Connection"})}),a.jsx(Mt,{children:a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.testRecipient")||"Test Recipient Email"}),a.jsx("input",{type:"email",value:s,onChange:x=>o(x.target.value),placeholder:"test@example.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsx(ke,{onClick:b,disabled:h.isPending,variant:"secondary",children:h.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),t("settings.email.sending")||"Sending..."]}):a.jsxs(a.Fragment,{children:[a.jsx($M,{className:"w-4 h-4"}),t("settings.email.sendTest")||"Send Test Email"]})})]})})]}),u?.smtp_configured&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(oy,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.advancedAuth")||"Advanced Authentication"})]}),a.jsx(ke,{onClick:v,disabled:m.isPending,variant:u?.advanced_auth_enabled?"danger":"primary",children:u?.advanced_auth_enabled?a.jsxs(a.Fragment,{children:[a.jsx(j1,{className:"w-4 h-4"}),t("settings.email.disable")||"Disable"]}):a.jsxs(a.Fragment,{children:[a.jsx(P1,{className:"w-4 h-4"}),t("settings.email.enable")||"Enable"]})})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"space-y-4",children:u?.advanced_auth_enabled?a.jsx("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(Nr,{className:"w-5 h-5 text-green-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-white font-medium",children:t("settings.email.advancedAuthEnabled")||"Advanced Authentication is enabled"}),a.jsxs("ul",{className:"text-sm text-green-300 space-y-1 list-disc list-inside",children:[a.jsx("li",{children:t("settings.email.feature1")||"Passwords are auto-generated and emailed to new users"}),a.jsx("li",{children:t("settings.email.feature2")||"Users can login with username or email"}),a.jsx("li",{children:t("settings.email.feature3")||"Forgot password feature is available"}),a.jsx("li",{children:t("settings.email.feature4")||"Admins can reset user passwords via email"})]})]})]})}):a.jsx("div",{className:"bg-yellow-500/10 border border-yellow-500/30 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-white font-medium",children:t("settings.email.advancedAuthDisabled")||"Advanced Authentication is disabled"}),a.jsx("p",{className:"text-sm text-yellow-300",children:t("settings.email.advancedAuthDisabledDesc")||"Enable advanced authentication to activate email-based features for user management."})]})]})})})})]})]})}const oQe={get:"bg-blue-500/20 text-blue-400 border-blue-500/30",post:"bg-green-500/20 text-green-400 border-green-500/30",put:"bg-yellow-500/20 text-yellow-400 border-yellow-500/30",patch:"bg-orange-500/20 text-orange-400 border-orange-500/30",delete:"bg-red-500/20 text-red-400 border-red-500/30"};function lQe(t,e){const n=e.replace("#/","").split("/");let r=t;for(const i of n)r=r[i];return r}function T0(t,e,n=0){if(n>5)return"...";if(e.$ref)return T0(t,lQe(t,e.$ref),n+1);if(e.allOf){const r={};for(const i of e.allOf){const s=T0(t,i,n+1);typeof s=="object"&&s!==null&&Object.assign(r,s)}return r}if(e.example!==void 0)return e.example;if(e.default!==void 0)return e.default;switch(e.type){case"string":return e.enum?e.enum[0]:"string";case"integer":case"number":return 0;case"boolean":return!1;case"array":return e.items?[T0(t,e.items,n+1)]:[];case"object":if(e.properties){const r={};for(const[i,s]of Object.entries(e.properties))r[i]=T0(t,s,n+1);return r}return{};default:return null}}function cQe({path:t,method:e,spec:n,schema:r,apiKey:i}){const[s,o]=_.useState(!1),[l,c]=_.useState({}),[u,d]=_.useState(""),[h,m]=_.useState(null),[p,b]=_.useState(!1),[v,x]=_.useState(!1);_.useEffect(()=>{if(s&&n.parameters){const P={};for(const T of n.parameters)T.schema?.default!==void 0&&(P[T.name]=String(T.schema.default));c(T=>({...P,...T}))}},[s,n.parameters]),_.useEffect(()=>{if(s&&n.requestBody?.content?.["application/json"]?.schema&&!u){const P=n.requestBody.content["application/json"].schema,T=T0(r,P);d(JSON.stringify(T,null,2))}},[s,n.requestBody,r,u]);const S=(()=>{const P=[];for(const T of n.parameters||[])if(T.in==="path"||T.required){const j=l[T.name];(j===void 0||j==="")&&P.push(T.name)}return P})(),N=async()=>{if(S.length>0){m({status:0,statusText:"Validation Error",headers:{},body:`Missing required parameters: ${S.join(", ")}`,duration:0});return}b(!0),m(null);try{let P=t;const T=new URLSearchParams;for(const re of n.parameters||[]){const H=l[re.name];H!==void 0&&H!==""&&(re.in==="path"?P=P.replace(`{${re.name}}`,encodeURIComponent(H)):re.in==="query"&&T.append(re.name,H))}const j=T.toString(),z=`${P}${j?`?${j}`:""}`,L={"Content-Type":"application/json"};i&&(L["X-API-Key"]=i);const B={method:e.toUpperCase(),headers:L};["post","put","patch"].includes(e)&&u&&(B.body=u);const R=performance.now(),$=await fetch(z,B),q=Math.round(performance.now()-R),I={};$.headers.forEach((re,H)=>{I[H]=re});let G;$.headers.get("content-type")?.includes("application/json")?G=await $.json():G=await $.text(),m({status:$.status,statusText:$.statusText,headers:I,body:G,duration:q})}catch(P){m({status:0,statusText:"Network Error",headers:{},body:P instanceof Error?P.message:"Unknown error",duration:0})}finally{b(!1)}},A=async()=>{if(h){const P=typeof h.body=="string"?h.body:JSON.stringify(h.body,null,2);try{await navigator.clipboard.writeText(P),x(!0),setTimeout(()=>x(!1),2e3)}catch{const T=document.createElement("textarea");T.value=P,T.style.position="fixed",T.style.left="-999999px",document.body.appendChild(T),T.select(),document.execCommand("copy"),document.body.removeChild(T),x(!0),setTimeout(()=>x(!1),2e3)}}},k=(n.parameters||[]).filter(P=>P.in==="path"),C=(n.parameters||[]).filter(P=>P.in==="query"),E=["post","put","patch"].includes(e)&&n.requestBody;return a.jsxs("div",{className:"border border-bambu-dark-tertiary rounded-lg overflow-hidden",children:[a.jsxs("button",{onClick:()=>o(!s),className:"w-full flex items-center gap-3 p-3 hover:bg-bambu-dark-tertiary/50 transition-colors text-left",children:[s?a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}):a.jsx(_s,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}),a.jsx("span",{className:`px-2 py-0.5 text-xs font-mono font-semibold uppercase rounded border ${oQe[e]||"bg-gray-500/20 text-gray-400"}`,children:e}),a.jsx("code",{className:"text-sm text-white font-mono flex-1 truncate",children:t}),n.summary&&a.jsx("span",{className:"text-sm text-bambu-gray truncate max-w-[40%]",children:n.summary})]}),s&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary p-4 space-y-4 bg-bambu-dark/50",children:[n.description&&a.jsx("p",{className:"text-sm text-bambu-gray",children:n.description}),k.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Path Parameters"}),a.jsx("div",{className:"space-y-2",children:k.map(P=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("label",{className:"text-sm text-bambu-gray w-32 flex-shrink-0",children:[P.name,P.required&&a.jsx("span",{className:"text-red-400 ml-1",children:"*"})]}),a.jsx("input",{type:"text",value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),placeholder:P.description||P.schema?.type||"value",className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm font-mono focus:border-bambu-green focus:outline-none"})]},P.name))})]}),C.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Query Parameters"}),a.jsx("div",{className:"space-y-2",children:C.map(P=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("label",{className:"text-sm text-bambu-gray w-32 flex-shrink-0",children:[P.name,P.required&&a.jsx("span",{className:"text-red-400 ml-1",children:"*"})]}),P.schema?.enum?a.jsxs("select",{value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"-- Select --"}),P.schema.enum.map(T=>a.jsx("option",{value:T,children:T},T))]}):a.jsx("input",{type:"text",value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),placeholder:P.description||P.schema?.type||"value",className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm font-mono focus:border-bambu-green focus:outline-none"})]},P.name))})]}),E&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Request Body"}),a.jsx("textarea",{value:u,onChange:P=>d(P.target.value),rows:8,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm font-mono focus:border-bambu-green focus:outline-none resize-y",placeholder:"JSON request body..."})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs(ke,{onClick:N,disabled:p,children:[p?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(vo,{className:"w-4 h-4"}),"Execute"]}),S.length>0&&a.jsxs("span",{className:"text-xs text-yellow-400 flex items-center gap-1",children:[a.jsx(Wi,{className:"w-3 h-3"}),"Fill in: ",S.join(", ")]})]}),h&&a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h4",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Response",a.jsxs("span",{className:`px-2 py-0.5 text-xs rounded ${h.status>=200&&h.status<300?"bg-green-500/20 text-green-400":h.status>=400?"bg-red-500/20 text-red-400":"bg-yellow-500/20 text-yellow-400"}`,children:[h.status," ",h.statusText]}),a.jsxs("span",{className:"text-xs text-bambu-gray",children:[h.duration,"ms"]})]}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:A,children:v?a.jsx(Nr,{className:"w-3 h-3 text-green-400"}):a.jsx(Fl,{className:"w-3 h-3"})})]}),a.jsx("pre",{className:"p-3 bg-bambu-dark rounded-lg text-sm font-mono text-white overflow-auto max-h-96 border border-bambu-dark-tertiary",children:typeof h.body=="string"?h.body:JSON.stringify(h.body,null,2)})]})]})]})}function uQe({apiKey:t=""}){const[e,n]=_.useState(null),[r,i]=_.useState(!0),[s,o]=_.useState(null),[l,c]=_.useState(new Set),[u,d]=_.useState("");if(_.useEffect(()=>{async function x(){try{const y=await fetch("/openapi.json");if(!y.ok)throw new Error("Failed to fetch OpenAPI schema");const S=await y.json();n(S)}catch(y){o(y instanceof Error?y.message:"Unknown error")}finally{i(!1)}}x()},[]),r)return a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})});if(s||!e)return a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-red-400",children:[a.jsx(Wi,{className:"w-12 h-12 mx-auto mb-3 opacity-50"}),a.jsx("p",{children:"Failed to load API schema"}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:s})]})})});const h={};for(const[x,y]of Object.entries(e.paths))for(const[S,N]of Object.entries(y)){if(S==="parameters")continue;const A=N.tags||["Other"];for(const k of A)h[k]||(h[k]=[]),h[k].push({path:x,method:S,spec:N})}const m=Object.entries(h).map(([x,y])=>{if(!u)return{tag:x,endpoints:y};const S=y.filter(({path:N,method:A,spec:k})=>{const C=u.toLowerCase();return N.toLowerCase().includes(C)||A.toLowerCase().includes(C)||(k.summary?.toLowerCase()||"").includes(C)||(k.description?.toLowerCase()||"").includes(C)});return{tag:x,endpoints:S}}).filter(({endpoints:x})=>x.length>0).sort((x,y)=>x.tag.localeCompare(y.tag)),p=x=>{c(y=>{const S=new Set(y);return S.has(x)?S.delete(x):S.add(x),S})},b=()=>{c(new Set(m.map(x=>x.tag)))},v=()=>{c(new Set)};return a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsx("div",{className:"flex-1",children:a.jsx("input",{type:"text",value:u,onChange:x=>d(x.target.value),placeholder:"Search endpoints...",className:"w-full max-w-md px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ke,{variant:"secondary",size:"sm",onClick:b,children:"Expand All"}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:v,children:"Collapse All"}),a.jsxs("a",{href:"/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-bambu-green hover:underline",children:[a.jsx(Xr,{className:"w-4 h-4"}),"Swagger UI"]})]})]}),a.jsxs("p",{className:"text-sm text-bambu-gray",children:[m.reduce((x,y)=>x+y.endpoints.length,0)," endpoints in ",m.length," categories"]}),a.jsx("div",{className:"space-y-3",children:m.map(({tag:x,endpoints:y})=>a.jsxs(_t,{children:[a.jsx("button",{onClick:()=>p(x),className:"w-full flex items-center justify-between p-4 hover:bg-bambu-dark-tertiary/30 transition-colors text-left",children:a.jsxs("div",{className:"flex items-center gap-2",children:[l.has(x)?a.jsx(Sr,{className:"w-5 h-5 text-bambu-gray"}):a.jsx(_s,{className:"w-5 h-5 text-bambu-gray"}),a.jsx("h3",{className:"text-base font-semibold text-white capitalize",children:x.replace(/-/g," ")}),a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-2 py-0.5 rounded-full text-bambu-gray",children:y.length})]})}),l.has(x)&&a.jsx(Mt,{className:"pt-0 space-y-2",children:y.map(({path:S,method:N,spec:A})=>a.jsx(cQe,{path:S,method:N,spec:A,schema:e,apiKey:t},`${N}-${S}`))})]},x))})]})}const dQe=["general","network","plugs","email","notifications","filament","apikeys","virtual-printer","users","backup"];function hQe(){const t=un(),e=Dc(),[n,r]=YR(),{t:i,i18n:s}=Sn(),{showToast:o}=Hn(),{authEnabled:l,user:c,refreshAuth:u}=Di(),{mode:d,darkStyle:h,darkBackground:m,darkAccent:p,lightStyle:b,lightBackground:v,lightAccent:x,setDarkStyle:y,setDarkBackground:S,setDarkAccent:N,setLightStyle:A,setLightBackground:k,setLightAccent:C}=Vh(),[E,P]=_.useState(null),[T,j]=_.useState(!1),[z,L]=_.useState(null),[B,R]=_.useState(!1),[$,q]=_.useState(null),[I,G]=_.useState(null),[Y,re]=_.useState(!1),[H,K]=_.useState(QK()),ne=n.get("tab"),ie=ne&&dQe.includes(ne)?ne:"general",[be,pe]=_.useState(ie),de=oe=>{pe(oe),oe==="general"?n.delete("tab"):n.set("tab",oe),r(n,{replace:!0})},[Ce,ae]=_.useState(!1),[Ae,Le]=_.useState(""),[fe,Xe]=_.useState({can_queue:!0,can_control_printer:!1,can_read_status:!0}),[W,Q]=_.useState(null),[me,X]=_.useState(null),[te,V]=_.useState(""),[ge,Se]=_.useState(!1),[ee,U]=_.useState(!1),[O,Z]=_.useState(null),[le,we]=_.useState(!1),[ye,se]=_.useState(!1),[Oe,He]=_.useState(!1),[tt,Ue]=_.useState({currentPassword:"",newPassword:"",confirmPassword:""}),[xe,Te]=_.useState(!1),[Ie,Ne]=_.useState(!1),[Ge,Me]=_.useState(!1),[rt,Ee]=_.useState(null),[Ke,Be]=_.useState(null),[ue,$e]=_.useState(null),[at,kt]=_.useState(!1),[gt,Ut]=_.useState({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),[Ft,Fe]=_.useState(!1),[xt,Wt]=_.useState(null),[Qt,En]=_.useState(null),[hn,or]=_.useState({name:"",description:"",permissions:[]}),[Kn,Qn]=_.useState(new Set),[Tn,di]=_.useState(null),[ii,je]=_.useState(!1),[Je,dt]=_.useState({}),[ht,ct]=_.useState({}),Tt=oe=>{K(oe),rpe(oe),o(i("settings.toast.settingsSaved"),"success")},he=()=>{localStorage.removeItem("sidebarOrder"),window.location.reload()},{data:De,isLoading:Ve}=st({queryKey:["settings"],queryFn:ce.getSettings}),{data:_e,isLoading:Re}=st({queryKey:["smart-plugs"],queryFn:ce.getSmartPlugs}),{data:et,isLoading:Ye}=st({queryKey:["smart-plugs-energy",_e?.map(oe=>oe.id)],queryFn:async()=>{if(!_e||_e.length===0)return null;const oe=await Promise.all(_e.filter(cs=>cs.enabled).map(async cs=>{try{const ka=await ce.getSmartPlugStatus(cs.id);return{plug:cs,status:ka}}catch{return{plug:cs,status:null}}}));let Nt=0,Un=0,sr=0,To=0,cd=0;for(const{plug:cs,status:ka}of oe){const wk=cs.plug_type==="mqtt"&&ka?.energy?.power!=null;(ka?.reachable||wk)&&ka?.energy&&(cd++,ka.energy?.power!=null&&(Nt+=ka.energy.power),ka.energy?.today!=null&&(Un+=ka.energy.today),ka.energy?.yesterday!=null&&(sr+=ka.energy.yesterday),ka.energy?.total!=null&&(To+=ka.energy.total))}return{totalPower:Nt,totalToday:Un,totalYesterday:sr,totalLifetime:To,reachableCount:cd,totalPlugs:_e.filter(cs=>cs.enabled).length}},enabled:be==="plugs"&&!!_e&&_e.length>0,refetchInterval:be==="plugs"?1e4:!1}),{data:Ct,isLoading:jt}=st({queryKey:["notification-providers"],queryFn:ce.getNotificationProviders}),{data:Bt,isLoading:Rt}=st({queryKey:["api-keys"],queryFn:ce.getAPIKeys}),Et=pt({mutationFn:oe=>ce.createAPIKey(oe),onSuccess:oe=>{Q(oe.key||null),ae(!1),Le(""),t.invalidateQueries({queryKey:["api-keys"]}),o(i("settings.toast.apiKeyCreated"))},onError:oe=>{o(`Failed to create API key: ${oe.message}`,"error")}}),an=pt({mutationFn:oe=>ce.deleteAPIKey(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["api-keys"]}),o(i("settings.toast.apiKeyDeleted"))},onError:oe=>{o(`Failed to delete API key: ${oe.message}`,"error")}}),{data:Vt}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:pn,isLoading:fn}=st({queryKey:["notification-templates"],queryFn:ce.getNotificationTemplates}),{data:Cn}=st({queryKey:["virtual-printer-settings"],queryFn:D1.getSettings,refetchInterval:1e4}),Xt=Cn?.status?.running??!1,{data:dn}=st({queryKey:["ffmpeg-status"],queryFn:ce.checkFfmpeg}),{data:mn}=st({queryKey:["version"],queryFn:ce.getVersion}),{data:en,refetch:ir,isRefetching:In}=st({queryKey:["updateCheck"],queryFn:ce.checkForUpdates,staleTime:300*1e3}),{data:ai,refetch:ar}=st({queryKey:["updateStatus"],queryFn:ce.getUpdateStatus,refetchInterval:oe=>{const Nt=oe.state.data;return Nt?.status==="downloading"||Nt?.status==="installing"?1e3:!1}}),{data:fr}=st({queryKey:["mqtt-status"],queryFn:ce.getMQTTStatus,refetchInterval:be==="network"?5e3:!1}),{data:nt}=st({queryKey:["github-backup-status"],queryFn:ce.getGitHubBackupStatus}),{data:Dt}=st({queryKey:["cloud-status"],queryFn:ce.getCloudStatus}),{data:Kt={advanced_auth_enabled:!1,smtp_configured:!1}}=st({queryKey:["advancedAuthStatus"],queryFn:()=>ce.getAdvancedAuthStatus()}),{hasPermission:vt}=Di(),{data:Nn=[],isLoading:hi}=st({queryKey:["users"],queryFn:()=>ce.getUsers(),enabled:l&&vt("users:read")}),{data:xr=[],isLoading:Yr}=st({queryKey:["groups"],queryFn:()=>ce.getGroups(),enabled:l&&vt("groups:read")}),{data:No}=st({queryKey:["permissions"],queryFn:()=>ce.getPermissions(),enabled:l&&vt("groups:read")}),nn=pt({mutationFn:oe=>ce.createUser(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),t.invalidateQueries({queryKey:["groups"]}),Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),o(i("settings.toast.userCreated"))},onError:oe=>{o(oe.message,"error")}}),Mn=pt({mutationFn:({id:oe,data:Nt})=>ce.updateUser(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),t.invalidateQueries({queryKey:["groups"]}),Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),o(i("settings.toast.userUpdated"))},onError:oe=>{o(oe.message,"error")}}),Mr=pt({mutationFn:({id:oe,deleteItems:Nt})=>ce.deleteUser(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),o(i("settings.toast.userDeleted")),Be(null),$e(null)},onError:oe=>{o(oe.message,"error")}}),Mo=async oe=>{Be(oe),kt(!0);try{const Nt=await ce.getUserItemsCount(oe);$e(Nt)}catch{$e({archives:0,queue_items:0,library_files:0})}finally{kt(!1)}},ko=pt({mutationFn:oe=>ce.createGroup(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),Fe(!1),pr(),o(i("settings.toast.groupCreated"))},onError:oe=>{o(oe.message,"error")}}),As=pt({mutationFn:({id:oe,data:Nt})=>ce.updateGroup(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),Wt(null),pr(),o(i("settings.toast.groupUpdated"))},onError:oe=>{o(oe.message,"error")}}),Eo=pt({mutationFn:oe=>ce.deleteGroup(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),o(i("settings.toast.groupDeleted"))},onError:oe=>{o(oe.message,"error")}}),ls=()=>{const oe=Kt?.advanced_auth_enabled||!1;if(!gt.username){o(i("settings.toast.fillRequiredFields"),"error");return}if(oe&&!gt.email){o("Email is required when advanced authentication is enabled","error");return}if(!oe){if(!gt.password){o(i("settings.toast.fillRequiredFields"),"error");return}if(gt.password!==gt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(gt.password.length<6){o(i("settings.toast.passwordTooShort"),"error");return}}nn.mutate({username:gt.username,password:oe?void 0:gt.password,email:gt.email||void 0,role:gt.role,group_ids:gt.group_ids.length>0?gt.group_ids:void 0})},Ei=oe=>{if(gt.password){if(gt.password!==gt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(gt.password.length<6){o(i("settings.toast.passwordTooShort"),"error");return}}const Nt={username:gt.username||void 0,password:gt.password||void 0,role:gt.role,group_ids:gt.group_ids};Nt.password||delete Nt.password,Mn.mutate({id:oe,data:Nt})},Ao=oe=>{Ee(oe.id),Ut({username:oe.username,password:"",confirmPassword:"",role:oe.role,group_ids:oe.groups?.map(Nt=>Nt.id)||[]}),Me(!0)},Ts=oe=>{Ut(Nt=>({...Nt,group_ids:Nt.group_ids.includes(oe)?Nt.group_ids.filter(Un=>Un!==oe):[...Nt.group_ids,oe]}))},pr=()=>{or({name:"",description:"",permissions:[]}),Qn(new Set)},Zb=()=>{if(!hn.name.trim()){o(i("settings.toast.enterGroupName"),"error");return}ko.mutate({name:hn.name,description:hn.description||void 0,permissions:hn.permissions})},tf=()=>{if(xt){if(!hn.name.trim()){o(i("settings.toast.enterGroupName"),"error");return}As.mutate({id:xt.id,data:{name:hn.name!==xt.name?hn.name:void 0,description:hn.description,permissions:hn.permissions}})}},ql=oe=>{Wt(oe),or({name:oe.name,description:oe.description||"",permissions:oe.permissions});const Nt=new Set;No?.categories.forEach(Un=>{Un.permissions.some(sr=>oe.permissions.includes(sr.value))&&Nt.add(Un.name)}),Qn(Nt)},Jb=oe=>{Qn(Nt=>{const Un=new Set(Nt);return Un.has(oe)?Un.delete(oe):Un.add(oe),Un})},Ym=oe=>{or(Nt=>{const Un=Nt.permissions.includes(oe)?Nt.permissions.filter(sr=>sr!==oe):[...Nt.permissions,oe];return{...Nt,permissions:Un}})},Lv=(oe,Nt)=>{or(Un=>{const sr=oe.permissions.map(cs=>cs.value),To=Un.permissions.filter(cs=>!sr.includes(cs)),cd=Nt?[...To,...sr]:To;return{...Un,permissions:cd}})},ad=oe=>oe.permissions.every(Nt=>hn.permissions.includes(Nt.value)),nf=oe=>{const Nt=oe.permissions.filter(Un=>hn.permissions.includes(Un.value));return Nt.length>0&&Nt.length{oe.is_docker?o(oe.message,"error"):ar()}}),[Ai,gl]=_.useState(null),sd=pt({mutationFn:ce.testAllNotificationProviders,onSuccess:oe=>{gl(oe),t.invalidateQueries({queryKey:["notification-providers"]}),oe.failed===0?o(`All ${oe.tested} providers tested successfully!`,"success"):o(`${oe.success}/${oe.tested} providers succeeded`,oe.failed>0?"error":"success")},onError:oe=>{o(`Failed to test providers: ${oe.message}`,"error")}}),bl=pt({mutationFn:async oe=>{if(!_e)return{success:0,failed:0};const Nt=_e.filter(sr=>sr.enabled),Un=await Promise.all(Nt.map(async sr=>{try{return await ce.controlSmartPlug(sr.id,oe),{success:!0}}catch{return{success:!1}}}));return{success:Un.filter(sr=>sr.success).length,failed:Un.filter(sr=>!sr.success).length}},onSuccess:(oe,Nt)=>{t.invalidateQueries({queryKey:["smart-plugs"]}),t.invalidateQueries({queryKey:["smart-plugs-energy"]}),oe.failed===0?o(`All ${oe.success} plugs turned ${Nt}`,"success"):o(`${oe.success} plugs turned ${Nt}, ${oe.failed} failed`,"error")},onError:oe=>{o(`Failed: ${oe.message}`,"error")}}),rf=_.useRef(null),od=_.useRef(!1),Zm=_.useRef(!0);_.useEffect(()=>{if(De&&!E){const oe={...De,external_url:De.external_url||window.location.origin};P(oe),setTimeout(()=>{Zm.current=!1},100)}},[De,E]);const ld=pt({mutationFn:ce.updateSettings,onSuccess:oe=>{t.setQueryData(["settings"],oe),P(oe),t.invalidateQueries({queryKey:["archiveStats"]}),o(i("settings.toast.settingsSaved"),"success")},onError:oe=>{o(`Failed to save: ${oe.message}`,"error")},onSettled:()=>{od.current=!1}}),af=pt({mutationFn:({id:oe,data:Nt})=>ce.updatePrinter(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["printers"]}),o(i("settings.toast.cameraSettingsSaved"),"success")},onError:oe=>{o(`Failed to update printer: ${oe.message}`,"error")}});_.useEffect(()=>{if(!(Zm.current||!E||!De||!(De.auto_archive!==E.auto_archive||De.save_thumbnails!==E.save_thumbnails||De.capture_finish_photo!==E.capture_finish_photo||De.default_filament_cost!==E.default_filament_cost||De.currency!==E.currency||De.energy_cost_per_kwh!==E.energy_cost_per_kwh||De.energy_tracking_mode!==E.energy_tracking_mode||De.check_updates!==E.check_updates||(De.check_printer_firmware??!0)!==(E.check_printer_firmware??!0)||De.notification_language!==E.notification_language||De.ams_humidity_good!==E.ams_humidity_good||De.ams_humidity_fair!==E.ams_humidity_fair||De.ams_temp_good!==E.ams_temp_good||De.ams_temp_fair!==E.ams_temp_fair||De.ams_history_retention_days!==E.ams_history_retention_days||De.per_printer_mapping_expanded!==E.per_printer_mapping_expanded||De.date_format!==E.date_format||De.time_format!==E.time_format||De.default_printer_id!==E.default_printer_id||De.ftp_retry_enabled!==E.ftp_retry_enabled||De.ftp_retry_count!==E.ftp_retry_count||De.ftp_retry_delay!==E.ftp_retry_delay||De.ftp_timeout!==E.ftp_timeout||De.mqtt_enabled!==E.mqtt_enabled||De.mqtt_broker!==E.mqtt_broker||De.mqtt_port!==E.mqtt_port||De.mqtt_username!==E.mqtt_username||De.mqtt_password!==E.mqtt_password||De.mqtt_topic_prefix!==E.mqtt_topic_prefix||De.mqtt_use_tls!==E.mqtt_use_tls||De.external_url!==E.external_url||De.ha_enabled!==E.ha_enabled||De.ha_url!==E.ha_url||De.ha_token!==E.ha_token||(De.library_archive_mode??"ask")!==(E.library_archive_mode??"ask")||Number(De.library_disk_warning_gb??5)!==Number(E.library_disk_warning_gb??5)||(De.camera_view_mode??"window")!==(E.camera_view_mode??"window")||De.prometheus_enabled!==E.prometheus_enabled||De.prometheus_token!==E.prometheus_token))&&!od.current)return rf.current&&clearTimeout(rf.current),rf.current=setTimeout(()=>{if(od.current)return;od.current=!0;const Nt={auto_archive:E.auto_archive,save_thumbnails:E.save_thumbnails,capture_finish_photo:E.capture_finish_photo,default_filament_cost:E.default_filament_cost,currency:E.currency,energy_cost_per_kwh:E.energy_cost_per_kwh,energy_tracking_mode:E.energy_tracking_mode,check_updates:E.check_updates,check_printer_firmware:E.check_printer_firmware,notification_language:E.notification_language,ams_humidity_good:E.ams_humidity_good,ams_humidity_fair:E.ams_humidity_fair,ams_temp_good:E.ams_temp_good,ams_temp_fair:E.ams_temp_fair,ams_history_retention_days:E.ams_history_retention_days,per_printer_mapping_expanded:E.per_printer_mapping_expanded,date_format:E.date_format,time_format:E.time_format,default_printer_id:E.default_printer_id,ftp_retry_enabled:E.ftp_retry_enabled,ftp_retry_count:E.ftp_retry_count,ftp_retry_delay:E.ftp_retry_delay,ftp_timeout:E.ftp_timeout,mqtt_enabled:E.mqtt_enabled,mqtt_broker:E.mqtt_broker,mqtt_port:E.mqtt_port,mqtt_username:E.mqtt_username,mqtt_password:E.mqtt_password,mqtt_topic_prefix:E.mqtt_topic_prefix,mqtt_use_tls:E.mqtt_use_tls,external_url:E.external_url,ha_enabled:E.ha_enabled,ha_url:E.ha_url,ha_token:E.ha_token,library_archive_mode:E.library_archive_mode,library_disk_warning_gb:E.library_disk_warning_gb,camera_view_mode:E.camera_view_mode,prometheus_enabled:E.prometheus_enabled,prometheus_token:E.prometheus_token};ld.mutate(Nt)},500),()=>{rf.current&&clearTimeout(rf.current)}},[E,De,ld]);const wn=_.useCallback((oe,Nt)=>{P(Un=>Un?{...Un,[oe]:Nt}:null)},[]),yk=async(oe,Nt,Un)=>{if(!Nt){o(i("settings.toast.enterCameraUrl"),"error");return}ct(sr=>({...sr,[oe]:!0})),dt(sr=>({...sr,[oe]:null}));try{const sr=await ce.testExternalCamera(oe,Nt,Un);dt(To=>({...To,[oe]:sr})),sr.success?o(i("settings.toast.cameraConnected",{resolution:sr.resolution||""}),"success"):o(sr.error||i("settings.toast.connectionFailed"),"error")}catch(sr){const To=sr instanceof Error?sr.message:i("settings.toast.testFailed");dt(cd=>({...cd,[oe]:{success:!1,error:To}})),o(To,"error")}finally{ct(sr=>({...sr,[oe]:!1}))}},[ex,Fv]=_.useState({}),sf=_.useRef({}),Iv=_.useRef(new Set);_.useEffect(()=>{if(Vt){const oe={};Vt.forEach(Nt=>{Nt.external_camera_url&&!Iv.current.has(Nt.id)&&(oe[Nt.id]=Nt.external_camera_url,Iv.current.add(Nt.id))}),Object.keys(oe).length>0&&Fv(Nt=>({...Nt,...oe}))}},[Vt]);const vk=(oe,Nt)=>{Fv(Un=>({...Un,[oe]:Nt})),sf.current[oe]&&clearTimeout(sf.current[oe]),sf.current[oe]=setTimeout(()=>{af.mutate({id:oe,data:{external_camera_url:Nt||null}})},800)},Uv=(oe,Nt)=>{const Un={};Nt.type!==void 0&&(Un.external_camera_type=Nt.type||null),Nt.enabled!==void 0&&(Un.external_camera_enabled=Nt.enabled),af.mutate({id:oe,data:Un})};return Ve||!E?a.jsx("div",{className:"p-4 md:p-8 flex justify-center",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsxs("div",{className:"mb-8",children:[a.jsx("h1",{className:"text-2xl font-bold text-white",children:i("settings.title")}),a.jsx("p",{className:"text-bambu-gray",children:i("settings.configureBambuddy")})]}),a.jsxs("div",{className:"flex flex-wrap gap-1 mb-6 border-b border-bambu-dark-tertiary overflow-y-auto max-h-32",children:[a.jsx("button",{onClick:()=>de("general"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${be==="general"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:i("settings.tabs.general")}),a.jsxs("button",{onClick:()=>de("plugs"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="plugs"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(rl,{className:"w-4 h-4"}),i("settings.tabs.smartPlugs"),_e&&_e.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:_e.length})]}),a.jsxs("button",{onClick:()=>de("email"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="email"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(oy,{className:"w-4 h-4"}),i("settings.tabs.globalEmail")||"Global Email"]}),a.jsxs("button",{onClick:()=>de("notifications"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="notifications"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Og,{className:"w-4 h-4"}),i("settings.tabs.notifications"),Ct&&Ct.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:Ct.length})]}),a.jsxs("button",{onClick:()=>de("filament"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="filament"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Ude,{className:"w-4 h-4"}),i("settings.tabs.filament")]}),a.jsxs("button",{onClick:()=>de("network"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="network"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Fg,{className:"w-4 h-4"}),i("settings.tabs.network"),a.jsx("span",{className:`w-2 h-2 rounded-full ${fr?.enabled?"bg-green-400":"bg-gray-500"}`})]}),a.jsxs("button",{onClick:()=>de("apikeys"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="apikeys"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Wo,{className:"w-4 h-4"}),i("settings.tabs.apiKeys"),Bt&&Bt.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:Bt.length})]}),a.jsxs("button",{onClick:()=>de("virtual-printer"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="virtual-printer"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Or,{className:"w-4 h-4"}),i("settings.tabs.virtualPrinter"),a.jsx("span",{className:`w-2 h-2 rounded-full ${Xt?"bg-green-400":"bg-gray-500"}`})]}),a.jsxs("button",{onClick:()=>de("users"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="users"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Kf,{className:"w-4 h-4"}),i("settings.tabs.users"),l&&a.jsx("span",{className:"w-2 h-2 rounded-full bg-green-400"})]}),a.jsxs("button",{onClick:()=>de("backup"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="backup"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(ju,{className:"w-4 h-4"}),i("settings.tabs.backup"),a.jsx("span",{className:`w-2 h-2 rounded-full ${Dt?.is_authenticated&&nt?.configured&&nt?.enabled?"bg-green-400":"bg-gray-500"}`})]})]}),be==="general"&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-xl",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.general")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[a.jsx(bh,{className:"w-4 h-4 inline mr-1"}),i("settings.language")]}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:s.language,onChange:oe=>{s.changeLanguage(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:Wz.map(oe=>a.jsxs("option",{value:oe.code,children:[oe.nativeName," (",oe.name,")"]},oe.code))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:i("settings.languageDescription")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.defaultView")}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:H,onChange:oe=>Tt(oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:cy.map(oe=>a.jsx("option",{value:oe.to,children:i(oe.labelKey)},oe.id))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:i("settings.defaultViewDescription")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Date Format"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.date_format||"system",onChange:oe=>wn("date_format",oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"system",children:i("settings.systemDefault")}),a.jsx("option",{value:"us",children:"US (MM/DD/YYYY)"}),a.jsx("option",{value:"eu",children:"EU (DD/MM/YYYY)"}),a.jsx("option",{value:"iso",children:"ISO (YYYY-MM-DD)"})]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Time Format"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.time_format||"system",onChange:oe=>wn("time_format",oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"system",children:i("settings.systemDefault")}),a.jsx("option",{value:"12h",children:"12-hour (3:30 PM)"}),a.jsx("option",{value:"24h",children:"24-hour (15:30)"})]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Default Printer"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.default_printer_id??"",onChange:oe=>wn("default_printer_id",oe.target.value?Number(oe.target.value):null),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"",children:i("settings.noDefaultPrinter")}),Vt?.map(oe=>a.jsx("option",{value:oe.id,children:oe.name},oe.id))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Pre-select this printer for uploads, reprints, and other operations."})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.sidebarOrder")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Drag items in the sidebar to reorder. Reset to default order here."})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:he,children:[a.jsx($h,{className:"w-4 h-4"}),"Reset"]})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(UK,{className:"w-5 h-5"}),"Appearance"]})}),a.jsxs(Mt,{className:"space-y-6",children:[a.jsxs("div",{className:`space-y-3 p-4 rounded-lg border ${d==="dark"?"border-bambu-green bg-bambu-green/5":"border-bambu-dark-tertiary"}`,children:[a.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Dark Mode",d==="dark"&&a.jsx("span",{className:"text-xs text-bambu-green",children:"(active)"})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Background"}),a.jsxs("select",{value:m,onChange:oe=>{S(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"neutral",children:"Neutral"}),a.jsx("option",{value:"warm",children:"Warm"}),a.jsx("option",{value:"cool",children:"Cool"}),a.jsx("option",{value:"oled",children:"OLED Black"}),a.jsx("option",{value:"slate",children:"Slate Blue"}),a.jsx("option",{value:"forest",children:"Forest Green"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Accent"}),a.jsxs("select",{value:p,onChange:oe=>{N(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"green",children:"Green"}),a.jsx("option",{value:"teal",children:"Teal"}),a.jsx("option",{value:"blue",children:"Blue"}),a.jsx("option",{value:"orange",children:"Orange"}),a.jsx("option",{value:"purple",children:"Purple"}),a.jsx("option",{value:"red",children:"Red"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Style"}),a.jsxs("select",{value:h,onChange:oe=>{y(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"classic",children:"Classic"}),a.jsx("option",{value:"glow",children:"Glow"}),a.jsx("option",{value:"vibrant",children:"Vibrant"})]})]})]})]}),a.jsxs("div",{className:`space-y-3 p-4 rounded-lg border ${d==="light"?"border-bambu-green bg-bambu-green/5":"border-bambu-dark-tertiary"}`,children:[a.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Light Mode",d==="light"&&a.jsx("span",{className:"text-xs text-bambu-green",children:"(active)"})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Background"}),a.jsxs("select",{value:v,onChange:oe=>{k(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"neutral",children:"Neutral"}),a.jsx("option",{value:"warm",children:"Warm"}),a.jsx("option",{value:"cool",children:"Cool"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Accent"}),a.jsxs("select",{value:x,onChange:oe=>{C(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"green",children:"Green"}),a.jsx("option",{value:"teal",children:"Teal"}),a.jsx("option",{value:"blue",children:"Blue"}),a.jsx("option",{value:"orange",children:"Orange"}),a.jsx("option",{value:"purple",children:"Purple"}),a.jsx("option",{value:"red",children:"Red"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Style"}),a.jsxs("select",{value:b,onChange:oe=>{A(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"classic",children:"Classic"}),a.jsx("option",{value:"glow",children:"Glow"}),a.jsx("option",{value:"vibrant",children:"Vibrant"})]})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Toggle between dark and light mode using the sun/moon icon in the sidebar."})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.archiveSettings")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Auto-archive prints"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically save 3MF files when prints complete"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.auto_archive,onChange:oe=>wn("auto_archive",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.saveThumbnails")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Extract and save preview images from 3MF files"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.save_thumbnails,onChange:oe=>wn("save_thumbnails",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.captureFinishPhoto")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Take a photo from printer camera when print completes"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.capture_finish_photo,onChange:oe=>wn("capture_finish_photo",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.capture_finish_photo&&dn&&!dn.installed&&a.jsxs("div",{className:"flex items-start gap-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-500 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm",children:[a.jsx("p",{className:"text-yellow-500 font-medium",children:"ffmpeg not installed"}),a.jsxs("p",{className:"text-bambu-gray mt-1",children:["Camera capture requires ffmpeg. Install it via"," ",a.jsx("code",{className:"bg-bambu-dark-tertiary px-1 rounded",children:"brew install ffmpeg"})," (macOS) or"," ",a.jsx("code",{className:"bg-bambu-dark-tertiary px-1 rounded",children:"apt install ffmpeg"})," (Linux)."]})]})]})]})]})]}),a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-md",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(hO,{className:"w-5 h-5 text-bambu-green"}),"Camera"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Camera View Mode"}),a.jsxs("select",{value:E.camera_view_mode??"window",onChange:oe=>wn("camera_view_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"window",children:i("settings.newWindow")}),a.jsx("option",{value:"embedded",children:i("settings.embeddedOverlay")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:E.camera_view_mode==="embedded"?"Camera opens in a resizable overlay on the main screen":"Camera opens in a separate browser window"})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 mt-4",children:[a.jsx("h3",{className:"text-sm font-medium text-white mb-2",children:i("settings.externalCameras")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Configure external cameras to replace the built-in printer camera. Supports MJPEG streams, RTSP, HTTP snapshots, and USB cameras (V4L2). When enabled, the external camera is used for live view and finish photos."}),Vt&&Vt.length>0?a.jsx("div",{className:"space-y-3",children:Vt.map(oe=>a.jsxs("div",{className:"p-3 bg-bambu-dark rounded-lg",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-white font-medium text-sm",children:oe.name}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:oe.external_camera_enabled,onChange:Nt=>Uv(oe.id,{enabled:Nt.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),oe.external_camera_enabled&&a.jsxs("div",{className:"space-y-2 mt-2",children:[a.jsx("input",{type:"text",placeholder:oe.external_camera_type==="usb"?"Device path (/dev/video0)":"Camera URL (rtsp://... or http://...)",value:ex[oe.id]??oe.external_camera_url??"",onChange:Nt=>vk(oe.id,Nt.target.value),className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("select",{value:oe.external_camera_type||"mjpeg",onChange:Nt=>Uv(oe.id,{type:Nt.target.value}),className:"flex-1 px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"mjpeg",children:"MJPEG Stream"}),a.jsx("option",{value:"rtsp",children:"RTSP Stream"}),a.jsx("option",{value:"snapshot",children:"HTTP Snapshot"}),a.jsx("option",{value:"usb",children:"USB Camera (V4L2)"})]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>yk(oe.id,ex[oe.id]??oe.external_camera_url??"",oe.external_camera_type||"mjpeg"),disabled:ht[oe.id]||!(ex[oe.id]??oe.external_camera_url),children:ht[oe.id]?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):"Test"})]}),Je[oe.id]&&a.jsx("div",{className:`text-xs flex items-center gap-1 ${Je[oe.id]?.success?"text-green-500":"text-red-500"}`,children:Je[oe.id]?.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-3 h-3"}),"Connected",Je[oe.id]?.resolution&&` (${Je[oe.id]?.resolution})`]}):a.jsxs(a.Fragment,{children:[a.jsx(ta,{className:"w-3 h-3"}),Je[oe.id]?.error||i("settings.toast.connectionFailed")]})})]})]},oe.id))}):a.jsx("p",{className:"text-xs text-bambu-gray italic",children:i("settings.noPrintersConfigured")})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.costTracking")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Default filament cost (per kg)"}),a.jsx("input",{type:"number",step:"0.01",min:"0",value:E.default_filament_cost,onChange:oe=>wn("default_filament_cost",parseFloat(oe.target.value)||0),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Currency"}),a.jsxs("select",{value:E.currency,onChange:oe=>wn("currency",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"USD",children:"USD ($)"}),a.jsx("option",{value:"EUR",children:"EUR (€)"}),a.jsx("option",{value:"GBP",children:"GBP (£)"}),a.jsx("option",{value:"CHF",children:"CHF (Fr.)"}),a.jsx("option",{value:"JPY",children:"JPY (¥)"}),a.jsx("option",{value:"CNY",children:"CNY (¥)"}),a.jsx("option",{value:"CAD",children:"CAD ($)"}),a.jsx("option",{value:"AUD",children:"AUD ($)"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Electricity cost per kWh"}),a.jsx("input",{type:"number",step:"0.01",min:"0",value:E.energy_cost_per_kwh,onChange:oe=>wn("energy_cost_per_kwh",parseFloat(oe.target.value)||0),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Energy display mode"}),a.jsxs("select",{value:E.energy_tracking_mode||"total",onChange:oe=>wn("energy_tracking_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"print",children:i("settings.printsOnly")}),a.jsx("option",{value:"total",children:i("settings.totalConsumption")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:E.energy_tracking_mode==="print"?"Dashboard shows sum of energy used during prints":"Dashboard shows lifetime energy from smart plugs"})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(ps,{className:"w-5 h-5 text-bambu-green"}),"File Manager"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Create Archive Entry When Printing"}),a.jsxs("select",{value:E.library_archive_mode??"ask",onChange:oe=>wn("library_archive_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"always",children:i("settings.archiveMode.always")}),a.jsx("option",{value:"never",children:i("settings.archiveMode.never")}),a.jsx("option",{value:"ask",children:i("settings.archiveMode.ask")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"When printing from File Manager, optionally create an archive entry"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Low Disk Space Warning"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0.5",max:"100",step:"0.5",value:E.library_disk_warning_gb??5,onChange:oe=>wn("library_disk_warning_gb",parseFloat(oe.target.value)||5),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"GB"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Show warning when free disk space falls below this threshold"})]})]})]})]}),a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-sm",children:[a.jsx(nQe,{}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Updates"})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.checkForUpdatesLabel")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically check for new versions on startup"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.check_updates,onChange:oe=>wn("check_updates",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.checkPrinterFirmware")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Check for printer firmware updates from Bambu Lab"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.check_printer_firmware??!0,onChange:oe=>wn("check_printer_firmware",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.currentVersion")}),a.jsxs("p",{className:"text-sm text-bambu-gray",children:["v",mn?.version||"..."]})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>ir(),disabled:In,children:[In?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Check now"]})]}),en?.update_available?a.jsxs("div",{className:"mt-4 p-3 bg-bambu-green/10 border border-bambu-green/30 rounded-lg",children:[a.jsxs("div",{className:"flex items-start justify-between",children:[a.jsxs("div",{children:[a.jsxs("p",{className:"text-bambu-green font-medium",children:["Update available: v",en.latest_version]}),en.release_name&&en.release_name!==en.latest_version&&a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:en.release_name})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[en.release_notes&&a.jsx("button",{onClick:()=>we(!0),className:"text-bambu-gray hover:text-white transition-colors text-sm underline",children:"Release Notes"}),en.release_url&&a.jsx("a",{href:en.release_url,target:"_blank",rel:"noopener noreferrer",className:"text-bambu-gray hover:text-white transition-colors",title:i("settings.viewReleaseOnGitHub"),children:a.jsx(Xr,{className:"w-4 h-4"})})]})]}),ai?.status==="downloading"||ai?.status==="installing"?a.jsxs("div",{className:"mt-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-sm text-bambu-gray",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),a.jsx("span",{children:ai.message})]}),a.jsx("div",{className:"mt-2 w-full bg-bambu-dark-tertiary rounded-full h-2",children:a.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all duration-300",style:{width:`${ai.progress}%`}})})]}):ai?.status==="complete"?a.jsx("div",{className:"mt-3 p-2 bg-bambu-green/20 rounded text-sm text-bambu-green",children:ai.message}):ai?.status==="error"?a.jsx("div",{className:"mt-3 p-2 bg-red-500/20 rounded text-sm text-red-400",children:ai.error||ai.message}):en?.is_docker?a.jsxs("div",{className:"mt-3 p-3 bg-bambu-dark-tertiary rounded-lg",children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-2",children:"Update via Docker Compose:"}),a.jsx("code",{className:"block text-xs bg-bambu-dark p-2 rounded text-bambu-green font-mono",children:"docker compose pull && docker compose up -d"})]}):a.jsxs(ke,{className:"mt-3",onClick:()=>Qm.mutate(),disabled:Qm.isPending,children:[Qm.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ni,{className:"w-4 h-4"}),"Install Update"]})]}):en?.error?a.jsxs("div",{className:"mt-2 p-2 bg-red-500/10 border border-red-500/30 rounded text-sm text-red-400",children:["Failed to check for updates: ",en.error]}):en&&!en.update_available?a.jsx("p",{className:"mt-2 text-sm text-bambu-gray",children:"You're running the latest version"}):null]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.dataManagement")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.clearNotificationLogs")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.clearNotificationLogsDescription")})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>Se(!0),children:[a.jsx(cn,{className:"w-4 h-4"}),i("common.clear")]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.resetUiPreferences")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.resetUiPreferencesDescription")})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>U(!0),children:[a.jsx(cn,{className:"w-4 h-4"}),"Reset"]})]}),a.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Backup & Restore"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Export/import settings and configure GitHub backup"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>de("backup"),children:[a.jsx(ju,{className:"w-4 h-4"}),"Go to Backup"]})]})]})]})]})]}),be==="network"&&E&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6",children:[a.jsxs("div",{className:"flex-1 lg:max-w-xl space-y-4",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(bh,{className:"w-5 h-5 text-blue-400"}),"External URL"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"The external URL where Bambuddy is accessible. Used for notification images and external integrations."}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Bambuddy URL"}),a.jsx("input",{type:"text",value:E.external_url??"",onChange:oe=>wn("external_url",oe.target.value),placeholder:"http://192.168.1.100:8000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Include protocol and port (e.g., http://192.168.1.100:8000)"})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Ir,{className:"w-5 h-5 text-blue-400"}),"FTP Retry"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Retry FTP operations when printer WiFi is unreliable. Applies to 3MF downloads, print uploads, timelapse downloads, and firmware updates."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableRetry")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically retry failed FTP operations"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.ftp_retry_enabled??!0,onChange:oe=>wn("ftp_retry_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.ftp_retry_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Retry attempts"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_retry_count??3,onChange:oe=>wn("ftp_retry_count",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[1,2,3,4,5,6,7,8,9,10].map(oe=>a.jsxs("option",{value:oe,children:[oe," ",oe===1?"time":"times"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Retry delay"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_retry_delay??2,onChange:oe=>wn("ftp_retry_delay",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[1,2,3,5,10,15,20,30].map(oe=>a.jsxs("option",{value:oe,children:[oe," ",oe===1?"second":"seconds"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Connection timeout"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_timeout??30,onChange:oe=>wn("ftp_timeout",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[10,15,20,30,45,60,90,120].map(oe=>a.jsxs("option",{value:oe,children:[oe," seconds"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Increase for printers with weak WiFi"})]})]})]})]})]}),a.jsxs("div",{className:"flex-1 lg:max-w-xl space-y-4",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Jy,{className:"w-5 h-5 text-bambu-green"}),"Home Assistant"]}),E.ha_enabled&&Tn&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2.5 h-2.5 rounded-full ${Tn.success?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:`text-sm ${Tn.success?"text-green-400":"text-red-400"}`,children:Tn.success?"Connected":"Disconnected"})]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Connect to Home Assistant to control smart plugs via HA's REST API. Supports switch, light, input_boolean, and script entities."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableHomeAssistant")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.homeAssistantDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.ha_enabled??!1,onChange:oe=>wn("ha_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.ha_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Home Assistant URL"}),a.jsx("input",{type:"text",value:E.ha_url??"",onChange:oe=>wn("ha_url",oe.target.value),placeholder:"http://192.168.1.100:8123",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Long-Lived Access Token"}),a.jsx("input",{type:"password",value:E.ha_token??"",onChange:oe=>wn("ha_token",oe.target.value),placeholder:"eyJ0eXAiOiJKV1QiLC...",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Create a token in HA: Profile → Long-Lived Access Tokens → Create Token"})]}),E.ha_url&&E.ha_token&&a.jsx("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:a.jsxs(ke,{variant:"secondary",size:"sm",disabled:ii,onClick:async()=>{je(!0),di(null);try{const oe=await ce.testHAConnection(E.ha_url,E.ha_token);di(oe)}catch(oe){di({success:!1,message:null,error:oe instanceof Error?oe.message:i("common.unknownError")})}finally{je(!1)}},children:[ii?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Fg,{className:"w-4 h-4"}),i("settings.testConnection")]})})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Fg,{className:"w-5 h-5 text-blue-400"}),"MQTT Publishing"]}),fr?.enabled&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2.5 h-2.5 rounded-full ${fr.connected?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:`text-sm ${fr.connected?"text-green-400":"text-red-400"}`,children:fr.connected?"Connected":"Disconnected"})]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Publish BamBuddy events to an external MQTT broker for integration with Node-RED, Home Assistant, and other automation systems."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableMqtt")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Publish events to external MQTT broker"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.mqtt_enabled??!1,onChange:oe=>wn("mqtt_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.mqtt_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Broker hostname"}),a.jsx("input",{type:"text",value:E.mqtt_broker??"",onChange:oe=>wn("mqtt_broker",oe.target.value),placeholder:"mqtt.example.com or 192.168.1.100",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"flex items-end gap-4",children:[a.jsxs("div",{className:"flex-1",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Port"}),a.jsx("input",{type:"number",min:"1",max:"65535",value:E.mqtt_port??1883,onChange:oe=>wn("mqtt_port",Math.min(65535,Math.max(1,parseInt(oe.target.value)||1883))),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"flex items-center gap-3 pb-2",children:[a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.mqtt_use_tls??!1,onChange:oe=>{const Nt=oe.target.checked;wn("mqtt_use_tls",Nt);const Un=E.mqtt_port??1883;Nt&&Un===1883?wn("mqtt_port",8883):!Nt&&Un===8883&&wn("mqtt_port",1883)},className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]}),a.jsx("span",{className:"text-white text-sm",children:i("settings.useTls")})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Username (optional)"}),a.jsx("input",{type:"text",value:E.mqtt_username??"",onChange:oe=>wn("mqtt_username",oe.target.value),placeholder:i("settings.leaveEmptyForAnonymous"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Password (optional)"}),a.jsx("input",{type:"password",value:E.mqtt_password??"",onChange:oe=>wn("mqtt_password",oe.target.value),placeholder:i("settings.leaveEmptyForAnonymous"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic prefix"}),a.jsx("input",{type:"text",value:E.mqtt_topic_prefix??"bambuddy",onChange:oe=>wn("mqtt_topic_prefix",oe.target.value),placeholder:"bambuddy",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:["Topics will be: ",E.mqtt_topic_prefix||"bambuddy","/printers//status, etc."]})]}),fr&&a.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx("span",{className:`w-2 h-2 rounded-full ${fr.connected?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:"text-bambu-gray",children:fr.connected?a.jsxs(a.Fragment,{children:[i("settings.mqttConnectedTo")," ",a.jsxs("span",{className:"text-white",children:[fr.broker,":",fr.port]})]}):i("settings.spoolmanDisconnected")})]})})]})]})]})]}),a.jsx("div",{className:"flex-1 lg:max-w-md space-y-4",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(WP,{className:"w-5 h-5 text-orange-400"}),"Prometheus Metrics"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("p",{className:"text-sm text-bambu-gray",children:["Expose printer metrics at ",a.jsx("code",{className:"bg-bambu-dark px-1 rounded",children:"/api/v1/metrics"})," for Prometheus/Grafana monitoring."]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableMetricsEndpoint")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.prometheusDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.prometheus_enabled??!1,onChange:oe=>wn("prometheus_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.prometheus_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Bearer Token (optional)"}),a.jsx("input",{type:"password",value:E.prometheus_token??"",onChange:oe=>wn("prometheus_token",oe.target.value),placeholder:i("settings.leaveEmptyForNoAuth"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:["If set, requests must include ",a.jsx("code",{className:"bg-bambu-dark px-1 rounded",children:"Authorization: Bearer "})]})]}),a.jsxs("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-sm text-white mb-2",children:i("settings.availableMetrics")}),a.jsxs("div",{className:"text-xs text-bambu-gray space-y-1",children:[a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_printer_connected"})," - Connection status"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_printer_state"})," - Printer state (idle/printing/etc)"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_print_progress"})," - Print progress 0-100%"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_bed_temp_celsius"})," - Bed temperature"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_nozzle_temp_celsius"})," - Nozzle temperature"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_prints_total"})," - Total prints by result"]}),a.jsx("p",{className:"text-bambu-gray/70 italic",children:"...and more (layers, fans, queue, filament usage)"})]})]})]})]})]})})]}),Tn&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg p-6 max-w-md w-full mx-4",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[Tn.success?a.jsx(Nr,{className:"w-8 h-8 text-green-400"}):a.jsx(ta,{className:"w-8 h-8 text-red-400"}),a.jsx("h3",{className:"text-lg font-medium text-white",children:Tn.success?"Connection Successful":"Connection Failed"})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:Tn.success?Tn.message||"Successfully connected to Home Assistant.":Tn.error||"Failed to connect to Home Assistant."}),a.jsx("div",{className:"flex justify-end",children:a.jsx(ke,{variant:"primary",onClick:()=>di(null),children:"OK"})})]})}),be==="plugs"&&a.jsxs("div",{className:"max-w-4xl",children:[a.jsxs("div",{className:"flex items-start justify-between mb-6",children:[a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(rl,{className:"w-5 h-5 text-bambu-green"}),"Smart Plugs"]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Connect smart plugs (Tasmota or Home Assistant) to automate power control and track energy usage for your printers."})]}),a.jsxs("div",{className:"flex items-center gap-2 pt-1 shrink-0",children:[_e&&_e.filter(oe=>oe.enabled).length>1&&a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"secondary",size:"sm",className:"whitespace-nowrap",onClick:()=>Z("on"),disabled:bl.isPending,title:i("settings.turnAllPlugsOn"),children:[bl.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Zu,{className:"w-4 h-4 text-bambu-green"}),"All On"]}),a.jsxs(ke,{variant:"secondary",size:"sm",className:"whitespace-nowrap",onClick:()=>Z("off"),disabled:bl.isPending,title:i("settings.turnAllPlugsOff"),children:[bl.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(HM,{className:"w-4 h-4 text-red-400"}),"All Off"]})]}),a.jsxs(ke,{className:"whitespace-nowrap",onClick:()=>{L(null),j(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),"Add Smart Plug"]})]})]}),_e&&_e.length>0&&a.jsxs(_t,{className:"mb-6",children:[a.jsx(Pn,{children:a.jsxs("h3",{className:"text-base font-semibold text-white flex items-center gap-2",children:[a.jsx(Dh,{className:"w-4 h-4 text-yellow-400"}),"Energy Summary",Ye&&a.jsx(ut,{className:"w-4 h-4 animate-spin text-bambu-gray ml-2"})]})}),a.jsx(Mt,{children:et?a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(Dh,{className:"w-3 h-3"}),"Current Power"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalPower.toFixed(1),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"W"})]}),a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:[et.reachableCount,"/",et.totalPlugs," plugs online"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(ei,{className:"w-3 h-3"}),"Today"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalToday.toFixed(2),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalToday*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(WP,{className:"w-3 h-3"}),"Yesterday"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalYesterday.toFixed(2),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalYesterday*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(zP,{className:"w-3 h-3"}),"Total"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalLifetime.toFixed(1),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalLifetime*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]})]}):Ye?null:a.jsx("p",{className:"text-sm text-bambu-gray",children:"Enable plugs to see energy summary"})})]}),Re?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):_e&&_e.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:_e.map(oe=>a.jsx($Ye,{plug:oe,onEdit:Nt=>{L(Nt),j(!0)}},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-12",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(rl,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),a.jsx("p",{className:"text-lg font-medium text-white mb-2",children:i("settings.noSmartPlugsTitle")}),a.jsx("p",{className:"text-sm mb-4",children:i("settings.noSmartPlugsDescription")}),a.jsxs(ke,{onClick:()=>{L(null),j(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addFirstSmartPlug")]})]})})})]}),be==="notifications"&&a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Og,{className:"w-5 h-5 text-bambu-green"}),i("settings.providers")]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>re(!0),children:[a.jsx(sy,{className:"w-4 h-4"}),i("settings.log")]}),Ct&&Ct.length>0&&a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>{gl(null),sd.mutate()},disabled:sd.isPending,children:[sd.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),i("settings.testAll")]}),a.jsxs(ke,{size:"sm",onClick:()=>{q(null),R(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),"Add"]})]})]}),a.jsx(_t,{className:"mb-4",children:a.jsx(Mt,{className:"py-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white text-sm font-medium",children:i("settings.notificationLanguage")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.notificationLanguageDescription")})]}),a.jsx("select",{value:E.notification_language||"en",onChange:oe=>wn("notification_language",oe.target.value),className:"px-2 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green",children:Wz.map(oe=>a.jsx("option",{value:oe.code,children:oe.nativeName},oe.code))})]})})}),Ai&&a.jsx(_t,{className:"mb-4",children:a.jsxs(Mt,{className:"py-3",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-sm font-medium text-white",children:i("settings.testResults")}),a.jsx("button",{onClick:()=>gl(null),className:"text-bambu-gray hover:text-white text-xs",children:i("common.dismiss")})]}),a.jsxs("div",{className:"flex items-center gap-4 text-sm mb-2",children:[a.jsxs("span",{className:"flex items-center gap-1 text-bambu-green",children:[a.jsx(Nr,{className:"w-4 h-4"}),i("settings.testPassedCount",{count:Ai.success})]}),Ai.failed>0&&a.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[a.jsx(ta,{className:"w-4 h-4"}),i("settings.testFailedCount",{count:Ai.failed})]})]}),Ai.results.filter(oe=>!oe.success).length>0&&a.jsx("div",{className:"space-y-1 mt-2 pt-2 border-t border-bambu-dark-tertiary",children:Ai.results.filter(oe=>!oe.success).map(oe=>a.jsxs("div",{className:"text-xs text-red-400",children:[a.jsxs("span",{className:"font-medium",children:[oe.provider_name,":"]})," ",oe.message]},oe.provider_id))})]})}),jt?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):Ct&&Ct.length>0?a.jsx("div",{className:"space-y-3",children:Ct.map(oe=>a.jsx(qYe,{provider:oe,onEdit:Nt=>{q(Nt),R(!0)}},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(Og,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm font-medium text-white mb-2",children:i("settings.noProvidersTitle")}),a.jsx("p",{className:"text-xs mb-3",children:i("settings.noProvidersDescription")}),a.jsxs(ke,{size:"sm",onClick:()=>{q(null),R(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addProvider")]})]})})})]}),a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2 mb-4",children:[a.jsx(ps,{className:"w-5 h-5 text-bambu-green"}),i("settings.messageTemplates")]}),a.jsx("p",{className:"text-sm text-bambu-gray mb-4",children:i("settings.messageTemplatesDescription")}),fn?a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):pn&&pn.length>0?a.jsx("div",{className:"space-y-2",children:pn.map(oe=>a.jsx(_t,{className:"cursor-pointer hover:border-bambu-green/50 transition-colors",onClick:()=>G(oe),children:a.jsx(Mt,{className:"py-2.5 px-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"min-w-0 flex-1",children:[a.jsx("p",{className:"text-white font-medium text-sm truncate",children:oe.name}),a.jsx("p",{className:"text-bambu-gray text-xs truncate mt-0.5",children:oe.title_template})]}),a.jsx("button",{className:"p-1.5 hover:bg-bambu-dark-tertiary rounded transition-colors shrink-0 ml-2",onClick:Nt=>{Nt.stopPropagation(),G(oe)},children:a.jsx(Eg,{className:"w-4 h-4 text-bambu-gray"})})]})})},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(ps,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm",children:i("settings.noTemplatesAvailable")})]})})})]})]}),be==="apikeys"&&a.jsxs("div",{className:"grid grid-cols-1 xl:grid-cols-2 gap-8",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-6",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Wo,{className:"w-5 h-5 text-bambu-green"}),i("settings.apiKeys")]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.apiKeysDescription")})]}),a.jsxs(ke,{size:"sm",onClick:()=>ae(!0),className:"flex-shrink-0",children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.createKey")]})]}),W&&a.jsx(_t,{className:"mb-6 border-bambu-green",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(Nr,{className:"w-5 h-5 text-bambu-green flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"flex-1",children:[a.jsx("p",{className:"text-white font-medium mb-1",children:i("settings.apiKeyCreated")}),a.jsx("p",{className:"text-sm text-bambu-gray mb-2",children:i("settings.apiKeyCopyWarning")}),a.jsxs("div",{className:"flex items-center gap-2 bg-bambu-dark rounded-lg p-2",children:[a.jsx("code",{className:"flex-1 text-sm text-bambu-green font-mono break-all",children:W}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:async()=>{try{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(W);else{const oe=document.createElement("textarea");oe.value=W,oe.style.position="fixed",oe.style.left="-999999px",document.body.appendChild(oe),oe.select(),document.execCommand("copy"),document.body.removeChild(oe)}o(i("settings.toast.keyCopied"))}catch{o(i("settings.toast.copyFailed"),"error")}},children:a.jsx(Fl,{className:"w-4 h-4"})})]}),a.jsxs("div",{className:"flex gap-2 mt-3",children:[a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>{V(W),o(i("settings.toast.keyAddedToBrowser"))},children:i("settings.useInApiBrowser")}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>Q(null),children:i("common.dismiss")})]})]})]})})}),Ce&&a.jsxs(_t,{className:"mb-6",children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-base font-semibold text-white",children:i("settings.createNewApiKey")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.keyName")}),a.jsx("input",{type:"text",value:Ae,onChange:oe=>Le(oe.target.value),placeholder:i("settings.keyNamePlaceholder"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:i("common.permissions")}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_read_status,onChange:oe=>Xe(Nt=>({...Nt,can_read_status:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.readStatus")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.readStatusDescription")})]})]}),a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_queue,onChange:oe=>Xe(Nt=>({...Nt,can_queue:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.manageQueue")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.manageQueueDescription")})]})]}),a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_control_printer,onChange:oe=>Xe(Nt=>({...Nt,can_control_printer:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.controlPrinter")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.controlPrinterDescription")})]})]})]})]}),a.jsxs("div",{className:"flex items-center gap-2 pt-2",children:[a.jsxs(ke,{onClick:()=>Et.mutate({name:Ae||i("settings.unnamedKey"),...fe}),disabled:Et.isPending,children:[Et.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(dr,{className:"w-4 h-4"}),i("settings.createKey")]}),a.jsx(ke,{variant:"secondary",onClick:()=>ae(!1),children:i("common.cancel")})]})]})]}),Rt?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):Bt&&Bt.length>0?a.jsx("div",{className:"space-y-3",children:Bt.map(oe=>a.jsx(_t,{children:a.jsx(Mt,{className:"py-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(Wo,{className:`w-5 h-5 ${oe.enabled?"text-bambu-green":"text-bambu-gray"}`}),a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium",children:oe.name}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[oe.key_prefix,"••••••••",oe.last_used&&` · ${i("settings.lastUsed")}: ${tb(oe.last_used)}`]})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("div",{className:"flex gap-1 text-xs",children:[oe.can_read_status&&a.jsx("span",{className:"px-1.5 py-0.5 bg-blue-500/20 text-blue-400 rounded",children:i("settings.read")}),oe.can_queue&&a.jsx("span",{className:"px-1.5 py-0.5 bg-green-500/20 text-green-400 rounded",children:i("queue.title")}),oe.can_control_printer&&a.jsx("span",{className:"px-1.5 py-0.5 bg-orange-500/20 text-orange-400 rounded",children:i("settings.control")})]}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>X(oe.id),children:a.jsx(cn,{className:"w-4 h-4 text-red-400"})})]})]})})},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-12",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(Wo,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),a.jsx("p",{className:"text-lg font-medium text-white mb-2",children:i("settings.apiKeysEmptyTitle")}),a.jsx("p",{className:"text-sm mb-4",children:i("settings.apiKeysEmptyDescription")}),a.jsxs(ke,{onClick:()=>ae(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.createFirstKey")]})]})})}),a.jsxs(_t,{className:"mt-6",children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-base font-semibold text-white",children:i("settings.webhookEndpoints")})}),a.jsxs(Mt,{className:"space-y-3 text-sm",children:[a.jsx("p",{className:"text-bambu-gray",children:i("settings.webhookApiKeyHint")}),a.jsxs("div",{className:"space-y-2 font-mono text-xs",children:[a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-blue-400",children:"GET"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/status"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.getAllStatus")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-blue-400",children:"GET"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/status/:id"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.getSpecificStatus")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-green-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/queue"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.addToQueue")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-orange-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/pause"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.pausePrint")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-orange-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/resume"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.resumePrint")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-red-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/stop"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.stopPrint")]})]})]})]})]})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"mb-6",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(bh,{className:"w-5 h-5 text-bambu-green"}),i("settings.apiBrowser")]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.apiBrowserDescription")})]}),a.jsx(_t,{className:"mb-4",children:a.jsxs(Mt,{className:"py-3",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:i("settings.apiKeyForTesting")}),a.jsx("input",{type:"text",value:te,onChange:oe=>V(oe.target.value),placeholder:i("settings.apiKeyPlaceholder"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white font-mono text-sm focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:i("settings.apiKeyHint")})]})}),a.jsx(uQe,{apiKey:te})]})]}),be==="virtual-printer"&&a.jsx(rQe,{}),be==="filament"&&E&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsx("div",{className:"flex-1 lg:max-w-xl",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.amsDisplayThresholds")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.amsThresholdsDescription")}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(sO,{className:"w-4 h-4 text-blue-400"}),a.jsx("span",{className:"font-medium",children:i("settings.humidity")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.goodGreen")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0",max:"100",value:E.ams_humidity_good??40,onChange:oe=>wn("ams_humidity_good",parseInt(oe.target.value)||40),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"%"})]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.fairOrange")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0",max:"100",value:E.ams_humidity_fair??60,onChange:oe=>wn("ams_humidity_fair",parseInt(oe.target.value)||60),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"%"})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.aboveFairBad")})]}),a.jsxs("div",{className:"space-y-3 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(GM,{className:"w-4 h-4 text-orange-400"}),a.jsx("span",{className:"font-medium",children:i("settings.temperature")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.goodBlue")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",step:"0.5",min:"0",max:"60",value:E.ams_temp_good??28,onChange:oe=>wn("ams_temp_good",parseFloat(oe.target.value)||28),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"°C"})]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.fairOrange")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",step:"0.5",min:"0",max:"60",value:E.ams_temp_fair??35,onChange:oe=>wn("ams_temp_fair",parseFloat(oe.target.value)||35),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"°C"})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.aboveFairHot")})]}),a.jsxs("div",{className:"space-y-3 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(ju,{className:"w-4 h-4 text-purple-400"}),a.jsx("span",{className:"font-medium",children:i("settings.historyRetention")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.keepSensorHistory")}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"1",max:"365",value:E.ams_history_retention_days??30,onChange:oe=>wn("ams_history_retention_days",parseInt(oe.target.value)||30),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:i("common.days")})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.historyRetentionDescription")})]}),a.jsxs("div",{className:"space-y-3 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(Or,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"font-medium",children:i("settings.printModal")})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-white",children:i("settings.expandCustomMapping")}),a.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:i("settings.expandCustomMappingDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.per_printer_mapping_expanded??!1,onChange:oe=>wn("per_printer_mapping_expanded",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})]})]})]})}),a.jsx("div",{className:"flex-1 lg:max-w-xl",children:a.jsx(eQe,{})})]}),me!==null&&a.jsx(er,{title:i("settings.deleteApiKeyTitle"),message:i("settings.deleteApiKeyMessage"),confirmText:i("settings.deleteKey"),variant:"danger",onConfirm:()=>{an.mutate(me),X(null)},onCancel:()=>X(null)}),T&&a.jsx(VYe,{plug:z,onClose:()=>{j(!1),L(null)}}),B&&a.jsx(WYe,{provider:$,onClose:()=>{R(!1),q(null)}}),I&&a.jsx(KYe,{template:I,onClose:()=>G(null)}),Y&&a.jsx(QYe,{onClose:()=>re(!1)}),ge&&a.jsx(er,{title:i("settings.clearNotificationLogs"),message:i("settings.clearLogsMessage"),confirmText:i("settings.clearLogs"),variant:"warning",onConfirm:async()=>{Se(!1);try{const oe=await ce.clearNotificationLogs(30);o(oe.message,"success")}catch{o(i("settings.toast.clearLogsFailed"),"error")}},onCancel:()=>Se(!1)}),ee&&a.jsx(er,{title:i("settings.resetUiPreferences"),message:i("settings.resetUiPreferencesMessage"),confirmText:i("settings.resetPreferences"),variant:"default",onConfirm:()=>{U(!1),localStorage.clear(),o(i("settings.toast.uiPreferencesReset"),"success"),setTimeout(()=>window.location.reload(),1e3)},onCancel:()=>U(!1)}),O&&a.jsx(er,{title:`Turn All Plugs ${O==="on"?"On":"Off"}`,message:`This will turn ${O==="on"?"ON":"OFF"} all ${_e?.filter(oe=>oe.enabled).length||0} enabled smart plugs. ${O==="off"?"Any running printers may be affected!":""}`,confirmText:`Turn All ${O==="on"?"On":"Off"}`,variant:O==="off"?"danger":"warning",onConfirm:()=>{const oe=O;Z(null),bl.mutate(oe)},onCancel:()=>Z(null)}),le&&en?.release_notes&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",onClick:()=>we(!1),children:a.jsxs(_t,{className:"w-full max-w-2xl max-h-[80vh] flex flex-col",onClick:oe=>oe.stopPropagation(),children:[a.jsxs(Pn,{className:"flex flex-row items-center justify-between shrink-0",children:[a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white",children:["Release Notes - v",en.latest_version]}),en.release_name&&en.release_name!==en.latest_version&&a.jsx("p",{className:"text-sm text-bambu-gray",children:en.release_name})]}),a.jsx("button",{onClick:()=>we(!1),className:"p-1 rounded hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsx(Mt,{className:"overflow-y-auto flex-1",children:a.jsx("pre",{className:"text-sm text-bambu-gray whitespace-pre-wrap font-sans",children:en.release_notes})}),a.jsxs("div",{className:"p-4 border-t border-bambu-dark-tertiary shrink-0 flex gap-2",children:[en.release_url&&a.jsx("a",{href:en.release_url,target:"_blank",rel:"noopener noreferrer",className:"flex-1",children:a.jsxs(ke,{variant:"secondary",className:"w-full",children:[a.jsx(Xr,{className:"w-4 h-4"}),"View on GitHub"]})}),a.jsx(ke,{onClick:()=>we(!1),className:"flex-1",children:"Close"})]})]})}),be==="users"&&a.jsxs("div",{className:"space-y-6",children:[a.jsx(_t,{children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center ${l?"bg-green-500/20":"bg-gray-500/20"}`,children:l?a.jsx(P1,{className:"w-5 h-5 text-green-400"}):a.jsx(j1,{className:"w-5 h-5 text-gray-400"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-white font-medium",children:i("settings.authentication")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i(l?"settings.authEnabledDescription":"settings.authDisabledDescription")})]})]}),l?c?.is_admin&&a.jsxs(ke,{variant:"secondary",onClick:()=>se(!0),children:[a.jsx(j1,{className:"w-4 h-4"}),i("common.disable")]}):a.jsxs(ke,{onClick:()=>e("/setup"),children:[a.jsx(P1,{className:"w-4 h-4"}),i("common.enable")]})]})})}),Kt?.advanced_auth_enabled&&a.jsx(_t,{className:"border-blue-500/30 bg-blue-500/5",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-full flex items-center justify-center bg-blue-500/20 flex-shrink-0",children:a.jsx(oy,{className:"w-5 h-5 text-blue-400"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-white font-medium",children:i("settings.email.advancedAuthEnabled")||"Advanced Authentication is enabled"}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.email.advancedAuthEnabledDesc")||"Email-based user management features are active. New users will receive auto-generated passwords via email, and users can reset their passwords through the forgot password feature."})]})]})})}),l&&a.jsxs("div",{className:"grid grid-cols-1 xl:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-6",children:[c&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),i("settings.currentUser")]}),a.jsxs(ke,{size:"sm",variant:"ghost",onClick:()=>He(!0),children:[a.jsx(Wo,{className:"w-4 h-4"}),i("settings.changePassword")]})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"flex items-center justify-between",children:a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium text-lg",children:c.username}),a.jsxs("div",{className:"flex flex-wrap gap-1 mt-2",children:[c.is_admin&&a.jsx("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-purple-500/20 text-purple-300",children:i("settings.admin")}),c.groups?.map(oe=>a.jsx("span",{className:`px-2 py-0.5 rounded-full text-xs font-medium ${oe.name==="Administrators"?"bg-purple-500/20 text-purple-300":oe.name==="Operators"?"bg-blue-500/20 text-blue-300":oe.name==="Viewers"?"bg-green-500/20 text-green-300":"bg-gray-500/20 text-gray-300"}`,children:oe.name},oe.id))]})]})})})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),i("settings.users")]}),vt("users:create")&&a.jsxs(ke,{size:"sm",onClick:()=>{Ne(!0),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addUser")]})]})}),a.jsx(Mt,{children:hi?a.jsx("div",{className:"flex items-center justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):Nn.length===0?a.jsx("p",{className:"text-center text-bambu-gray py-8",children:i("settings.noUsersFound")}):a.jsx("div",{className:"divide-y divide-bambu-dark-tertiary",children:Nn.map(oe=>a.jsxs("div",{className:"py-3 flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-white font-medium truncate",children:oe.username}),a.jsxs("div",{className:"flex flex-wrap gap-1 mt-1",children:[oe.is_admin&&a.jsx("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-purple-500/20 text-purple-300",children:i("settings.admin")}),oe.groups?.map(Nt=>a.jsx("span",{className:`px-2 py-0.5 rounded-full text-xs font-medium ${Nt.name==="Administrators"?"bg-purple-500/20 text-purple-300":Nt.name==="Operators"?"bg-blue-500/20 text-blue-300":Nt.name==="Viewers"?"bg-green-500/20 text-green-300":"bg-gray-500/20 text-gray-300"}`,children:Nt.name},Nt.id))]})]}),a.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[vt("users:update")&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>Ao(oe),children:a.jsx(Eg,{className:"w-4 h-4"})}),vt("users:delete")&&oe.id!==c?.id&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>Mo(oe.id),children:a.jsx(cn,{className:"w-4 h-4"})})]})]},oe.id))})})]})]}),a.jsx("div",{children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(PA,{className:"w-5 h-5 text-bambu-green"}),i("settings.groups")]}),vt("groups:create")&&a.jsxs(ke,{size:"sm",onClick:()=>{Fe(!0),pr()},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addGroup")]})]})}),a.jsx(Mt,{children:Yr?a.jsx("div",{className:"flex items-center justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):xr.length===0?a.jsx("p",{className:"text-center text-bambu-gray py-8",children:i("settings.noGroupsFound")}):a.jsx("div",{className:"divide-y divide-bambu-dark-tertiary",children:xr.map(oe=>a.jsxs("div",{className:"py-3",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(PA,{className:`w-4 h-4 ${oe.name==="Administrators"?"text-purple-400":oe.name==="Operators"?"text-blue-400":oe.name==="Viewers"?"text-green-400":"text-bambu-gray"}`}),a.jsx("span",{className:"text-white font-medium",children:oe.name}),oe.is_system&&a.jsx("span",{className:"px-2 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:i("settings.system")})]}),a.jsxs("div",{className:"flex items-center gap-1",children:[vt("groups:update")&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>ql(oe),children:a.jsx(Eg,{className:"w-4 h-4"})}),vt("groups:delete")&&!oe.is_system&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>En(oe.id),children:a.jsx(cn,{className:"w-4 h-4"})})]})]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1 ml-6",children:oe.description||i("settings.noDescription")}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 ml-6 text-xs text-bambu-gray",children:[a.jsx("span",{children:i("settings.userCount",{count:oe.user_count})}),a.jsx("span",{children:i("settings.permissionCount",{count:oe.permissions.length})})]})]},oe.id))})})]})})]}),!l&&a.jsx(_t,{children:a.jsx(Mt,{className:"py-6",children:a.jsxs("div",{className:"text-center",children:[a.jsx(j1,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-medium text-white mb-2",children:i("settings.authDisabledTitle")}),a.jsx("p",{className:"text-sm text-bambu-gray mb-4 max-w-md mx-auto",children:i("settings.authDisabledMessage")}),a.jsxs("ul",{className:"space-y-2 text-sm text-bambu-gray mb-6 text-left max-w-xs mx-auto",children:[a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature1")})]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature2")})]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature3")})]})]}),a.jsxs(ke,{onClick:()=>e("/setup"),children:[a.jsx(P1,{className:"w-4 h-4"}),i("settings.enableAuthentication")]})]})})})]}),Ie&&!Kt?.advanced_auth_enabled&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.createUser")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.username")}),a.jsx("input",{type:"text",value:gt.username,onChange:oe=>Ut({...gt,username:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterUsername"),autoComplete:"username"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.password")}),a.jsx("input",{type:"password",value:gt.password,onChange:oe=>Ut({...gt,password:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterPassword"),autoComplete:"new-password",minLength:6})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.confirmPassword")}),a.jsx("input",{type:"password",value:gt.confirmPassword,onChange:oe=>Ut({...gt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${gt.confirmPassword&>.password!==gt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmPasswordPlaceholder"),autoComplete:"new-password",minLength:6}),gt.confirmPassword&>.password!==gt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Groups"}),a.jsxs("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:[xr.map(oe=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:gt.group_ids.includes(oe.id),onChange:()=>Ts(oe.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:oe.name}),oe.is_system&&a.jsx("span",{className:"text-xs text-yellow-400",children:"(System)"})]},oe.id)),xr.length===0&&a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.noGroupsAvailable")})]})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:"Cancel"}),a.jsx(ke,{onClick:ls,disabled:nn.isPending||!gt.username||!gt.password||gt.password!==gt.confirmPassword||gt.password.length<6,children:nn.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Creating..."]}):a.jsxs(a.Fragment,{children:[a.jsx(dr,{className:"w-4 h-4"}),"Create User"]})})]})]})]})}),Ie&&Kt?.advanced_auth_enabled&&a.jsx(JYe,{formData:gt,setFormData:Ut,groups:xr,onClose:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},onCreate:ls,isCreating:nn.isPending,isCreateButtonDisabled:nn.isPending||!gt.username||!gt.email}),Ge&&rt!==null&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Eg,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.editUser")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("settings.username")," ",Kt?.advanced_auth_enabled&&a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"text",value:gt.username,onChange:oe=>Ut({...gt,username:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterUsername"),autoComplete:"username"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("users.form.email")||"Email"," ",Kt?.advanced_auth_enabled?a.jsx("span",{className:"text-red-400",children:"*"}):a.jsxs("span",{className:"text-bambu-gray font-normal",children:["(",i("users.form.optional")||"optional",")"]})]}),a.jsx("input",{type:"email",value:gt.email,onChange:oe=>Ut({...gt,email:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("users.form.emailPlaceholder")||"user@example.com",required:Kt?.advanced_auth_enabled})]}),!Kt?.advanced_auth_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("users.form.password")||"Password"," ",a.jsxs("span",{className:"text-bambu-gray font-normal",children:["(",i("users.form.leaveBlankToKeep")||"leave blank to keep current",")"]})]}),a.jsx("input",{type:"password",value:gt.password,onChange:oe=>Ut({...gt,password:oe.target.value,confirmPassword:""}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterNewPassword"),autoComplete:"new-password",minLength:6})]}),gt.password&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.confirmPassword")}),a.jsx("input",{type:"password",value:gt.confirmPassword,onChange:oe=>Ut({...gt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${gt.confirmPassword&>.password!==gt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmNewPassword"),autoComplete:"new-password",minLength:6}),gt.confirmPassword&>.password!==gt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]})]}),Kt?.advanced_auth_enabled&&a.jsx("div",{className:"bg-bambu-dark-secondary/50 border border-bambu-green/20 rounded-lg p-3",children:a.jsx("p",{className:"text-sm text-bambu-gray",children:i("users.form.passwordManagedByAdvancedAuth")||'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.'})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("users.form.groups")||"Groups"}),a.jsx("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:xr.map(oe=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:gt.group_ids.includes(oe.id),onChange:()=>Ts(oe.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:oe.name}),oe.is_system&&a.jsxs("span",{className:"text-xs text-yellow-400",children:["(",i("users.system")||"System",")"]})]},oe.id))})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:i("users.modal.cancel")||"Cancel"}),a.jsx(ke,{onClick:()=>Ei(rt),disabled:Mn.isPending||!gt.username||Kt?.advanced_auth_enabled&&!gt.email||!!(!Kt?.advanced_auth_enabled&>.password&&(gt.password!==gt.confirmPassword||gt.password.length<6)),children:Mn.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),i("users.modal.saving")||"Saving..."]}):a.jsxs(a.Fragment,{children:[a.jsx(gs,{className:"w-4 h-4"}),i("users.modal.saveChanges")||"Save Changes"]})})]})]})]})}),Ke!==null&&a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4",onClick:()=>{Be(null),$e(null)},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2 text-red-400",children:[a.jsx(cn,{className:"w-5 h-5"}),a.jsx("h3",{className:"text-lg font-semibold",children:i("settings.deleteUserTitle")})]})}),a.jsx(Mt,{className:"space-y-4",children:at?a.jsx("div",{className:"flex items-center justify-center py-4",children:a.jsx("div",{className:"animate-spin rounded-full h-6 w-6 border-2 border-bambu-green border-t-transparent"})}):ue&&ue.archives+ue.queue_items+ue.library_files>0?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-white",children:i("settings.userHasCreated")}),a.jsxs("ul",{className:"list-disc list-inside text-bambu-gray space-y-1",children:[ue.archives>0&&a.jsxs("li",{children:[ue.archives," archive",ue.archives!==1?"s":""]}),ue.queue_items>0&&a.jsxs("li",{children:[ue.queue_items," queue item",ue.queue_items!==1?"s":""]}),ue.library_files>0&&a.jsxs("li",{children:[ue.library_files," library file",ue.library_files!==1?"s":""]})]}),a.jsx("p",{className:"text-bambu-gray text-sm",children:i("settings.userItemsQuestion")}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(ke,{variant:"danger",onClick:()=>Mr.mutate({id:Ke,deleteItems:!0}),disabled:Mr.isPending,className:"justify-center",children:"Delete user AND their items"}),a.jsx(ke,{variant:"secondary",onClick:()=>Mr.mutate({id:Ke,deleteItems:!1}),disabled:Mr.isPending,className:"justify-center",children:"Delete user, keep items (become ownerless)"}),a.jsx(ke,{variant:"ghost",onClick:()=>{Be(null),$e(null)},disabled:Mr.isPending,className:"justify-center",children:"Cancel"})]})]}):a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-white",children:i("settings.deleteUserConfirm")}),a.jsx("p",{className:"text-bambu-gray text-sm",children:i("settings.actionCannotBeUndone")}),a.jsxs("div",{className:"flex gap-2 justify-end",children:[a.jsx(ke,{variant:"ghost",onClick:()=>{Be(null),$e(null)},disabled:Mr.isPending,children:"Cancel"}),a.jsx(ke,{variant:"danger",onClick:()=>Mr.mutate({id:Ke,deleteItems:!1}),disabled:Mr.isPending,children:"Delete User"})]})]})})]})}),(Ft||xt)&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Fe(!1),Wt(null),pr()},children:a.jsxs(_t,{className:"w-full max-w-2xl max-h-[90vh] overflow-y-auto",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(PA,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:xt?"Edit Group":"Create Group"})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Fe(!1),Wt(null),pr()},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.groupName")}),a.jsx("input",{type:"text",value:hn.name,onChange:oe=>or({...hn,name:oe.target.value}),disabled:xt?.is_system,className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors disabled:opacity-50",placeholder:i("settings.enterGroupName")}),xt?.is_system&&a.jsx("p",{className:"text-xs text-yellow-400 mt-1",children:i("settings.systemGroupWarning")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Description"}),a.jsx("textarea",{value:hn.description,onChange:oe=>or({...hn,description:oe.target.value}),rows:2,className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors resize-none",placeholder:i("settings.enterDescriptionOptional")})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:["Permissions (",hn.permissions.length," selected)"]}),a.jsx("div",{className:"space-y-2 max-h-96 overflow-y-auto",children:No?.categories.map(oe=>a.jsxs("div",{className:"border border-bambu-dark-tertiary rounded-lg overflow-hidden",children:[a.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-bambu-dark-secondary cursor-pointer hover:bg-bambu-dark-tertiary transition-colors",onClick:()=>Jb(oe.name),children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("button",{type:"button",onClick:Nt=>{Nt.stopPropagation(),Lv(oe,!ad(oe))},className:`w-5 h-5 rounded border flex items-center justify-center transition-colors ${ad(oe)?"bg-bambu-green border-bambu-green":nf(oe)?"bg-bambu-green/50 border-bambu-green":"border-bambu-gray hover:border-white"}`,children:(ad(oe)||nf(oe))&&a.jsx(qi,{className:"w-3 h-3 text-white"})}),a.jsx("span",{className:"text-white font-medium",children:oe.name}),a.jsxs("span",{className:"text-xs text-bambu-gray",children:["(",oe.permissions.filter(Nt=>hn.permissions.includes(Nt.value)).length,"/",oe.permissions.length,")"]})]}),Kn.has(oe.name)?a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray"}):a.jsx(_s,{className:"w-4 h-4 text-bambu-gray"})]}),Kn.has(oe.name)&&a.jsx("div",{className:"p-3 bg-bambu-dark space-y-2",children:oe.permissions.map(Nt=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-secondary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:hn.permissions.includes(Nt.value),onChange:()=>Ym(Nt.value),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark-secondary"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:Nt.label})]},Nt.value))})]},oe.name))})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Fe(!1),Wt(null),pr()},children:"Cancel"}),a.jsx(ke,{onClick:xt?tf:Zb,disabled:ko.isPending||As.isPending||!hn.name.trim(),children:ko.isPending||As.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),xt?"Saving...":"Creating..."]}):a.jsxs(a.Fragment,{children:[a.jsx(gs,{className:"w-4 h-4"}),xt?"Save Changes":"Create Group"]})})]})]})]})}),Qt!==null&&a.jsx(er,{title:i("settings.deleteGroupTitle"),message:i("settings.deleteGroupMessage"),confirmText:i("settings.deleteGroup"),variant:"danger",onConfirm:()=>{Eo.mutate(Qt),En(null)},onCancel:()=>En(null)}),be==="email"&&a.jsx(sQe,{}),be==="backup"&&a.jsx(aQe,{}),ye&&a.jsx(er,{title:i("settings.disableAuthenticationTitle"),message:i("settings.disableAuthenticationMessage"),confirmText:i("settings.disableAuthentication"),variant:"danger",onConfirm:async()=>{try{await ce.disableAuth(),o(i("settings.toast.authDisabled"),"success"),await u(),se(!1),window.location.href="/"}catch(oe){const Nt=oe instanceof Error?oe.message:i("settings.toast.authDisableFailed");o(Nt,"error")}},onCancel:()=>se(!1)}),Oe&&a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Wo,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.changePassword")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Current Password"}),a.jsx("input",{type:"password",value:tt.currentPassword,onChange:oe=>Ue({...tt,currentPassword:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterCurrentPassword"),autoComplete:"current-password"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"New Password"}),a.jsx("input",{type:"password",value:tt.newPassword,onChange:oe=>Ue({...tt,newPassword:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterNewPasswordMin6"),autoComplete:"new-password",minLength:6})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Confirm New Password"}),a.jsx("input",{type:"password",value:tt.confirmPassword,onChange:oe=>Ue({...tt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${tt.confirmPassword&&tt.newPassword!==tt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmNewPassword"),autoComplete:"new-password",minLength:6}),tt.confirmPassword&&tt.newPassword!==tt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:"Cancel"}),a.jsx(ke,{onClick:async()=>{if(tt.newPassword!==tt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(tt.newPassword.length<6){o(i("settings.toast.passwordTooShort"),"error");return}Te(!0);try{await ce.changePassword(tt.currentPassword,tt.newPassword),o(i("settings.toast.passwordChanged"),"success"),He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})}catch(oe){const Nt=oe instanceof Error?oe.message:"Failed to change password";o(Nt,"error")}finally{Te(!1)}},disabled:xe||!tt.currentPassword||!tt.newPassword||tt.newPassword!==tt.confirmPassword||tt.newPassword.length<6,children:xe?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Changing..."]}):a.jsxs(a.Fragment,{children:[a.jsx(Wo,{className:"w-4 h-4"}),"Change Password"]})})]})]})]})})]})}const cae=t=>{const e=parseFloat(t);return(Math.trunc(e*1e3)/1e3).toFixed(3)},fQe=t=>t.startsWith("HH")?"HF":"S",mQe=t=>{const e=t.match(/^([A-Z]{2}\d{2})/);return e?e[1]:"HH00"},UR=t=>{const e=["High Flow_","High Flow ","Standard_","Standard ","HF_","HF ","S_","S "];for(const r of e)if(t.startsWith(r))return t.slice(r.length);const n=t.indexOf("_");return n>0?t.slice(n+1):t};function bP({profile:t,onEdit:e,onCopy:n,selectionMode:r,isSelected:i,onToggleSelect:s,note:o}){const l=fQe(t.nozzle_id),c=t.nozzle_diameter,u=()=>{r&&s?s():e()};return a.jsxs("div",{className:"flex items-center gap-2",children:[r&&a.jsx("button",{onClick:s,className:"text-bambu-gray hover:text-white transition-colors p-1",children:i?a.jsx(qs,{className:"w-4 h-4 text-bambu-green"}):a.jsx(ll,{className:"w-4 h-4"})}),a.jsxs("button",{onClick:u,className:`flex-1 text-left px-3 py-2 bg-bambu-dark rounded hover:bg-bambu-dark-tertiary transition-colors ${i?"ring-1 ring-bambu-green":""}`,children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-bambu-green font-mono text-sm font-bold whitespace-nowrap",children:cae(t.k_value)}),a.jsx("span",{className:"text-white text-sm truncate flex-1",title:t.name,children:t.name||"Unnamed"}),o&&a.jsx("span",{title:"Has note",children:a.jsx(HK,{className:"w-3 h-3 text-yellow-500"})}),a.jsxs("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:[l," ",c]})]}),o&&a.jsxs("div",{className:"text-xs mt-0.5 truncate text-yellow-500/70",title:o,children:["Note: ",o.length>50?o.substring(0,50)+"...":o]})]}),!r&&n&&a.jsx("button",{onClick:d=>{d.stopPropagation(),n()},className:"text-bambu-gray hover:text-white transition-colors p-1",title:"Copy profile",children:a.jsx(Fl,{className:"w-4 h-4"})})]})}function xP({profile:t,printerId:e,nozzleDiameter:n,existingProfiles:r=[],isDualNozzle:i=!1,initialNote:s="",initialNoteKey:o=null,onClose:l,onSave:c,onSaveNote:u,hasPermission:d}){const{t:h}=Sn(),{showToast:m}=Hn(),[p,b]=_.useState(t?.name||""),[v,x]=_.useState(t?.k_value?cae(t.k_value):"0.020"),[y,S]=_.useState(t?.filament_id||""),[N,A]=_.useState(t?.nozzle_id?mQe(t.nozzle_id):"HH00"),[k,C]=_.useState(t?.nozzle_diameter||n),[E,P]=_.useState(t?[t.extruder_id]:i?[0,1]:[0]),[T,j]=_.useState(!1),[z,L]=_.useState({current:0,total:0}),[B,R]=_.useState(s),$=Jr.useMemo(()=>{const K=new Map;for(const ne of r)if(ne.filament_id&&!K.has(ne.filament_id)){const ie=UR(ne.name||"");K.set(ne.filament_id,{id:ne.filament_id,name:ie||ne.filament_id})}return Array.from(K.values()).sort((ne,ie)=>ne.name.localeCompare(ie.name))},[r]),q=pt({mutationFn:K=>(console.log("[KProfile] Calling API..."),ce.setKProfile(e,K)),onSuccess:K=>{if(console.log("[KProfile] Save success:",K),m(h("kProfiles.toast.profileSaved")),u&&B!==s){let ne;B===""&&o?ne=o:t&&t.slot_id>0?ne=t.setting_id||`slot_${t.slot_id}_${t.filament_id}_${t.extruder_id}`:ne=`name_${p}_${y}`,u(ne,B)}j(!0),setTimeout(()=>{j(!1),c()},2500)},onError:K=>{console.error("[KProfile] Save error:",K),m(K.message,"error"),j(!1)}}),I=pt({mutationFn:K=>(console.log("[KProfile] Deleting profile..."),ce.deleteKProfile(e,K)),onSuccess:K=>{console.log("[KProfile] Delete success:",K),m(h("kProfiles.toast.profileDeleted")),j(!0),setTimeout(()=>{j(!1),l()},4e3)},onError:K=>{console.error("[KProfile] Delete error:",K),m(K.message,"error"),j(!1)}}),[G,Y]=_.useState(!1),re=()=>{t&&I.mutate({slot_id:t.slot_id,extruder_id:t.extruder_id,nozzle_id:t.nozzle_id,nozzle_diameter:t.nozzle_diameter,filament_id:t.filament_id,setting_id:t.setting_id})},H=async K=>{if(K.preventDefault(),i&&!t&&E.length===0){m(h("kProfiles.toast.selectAtLeastOneExtruder"),"error");return}const ne=parseFloat(v).toFixed(6),ie=`${N}-${k}`;if(t||E.length===1){const pe={name:p,k_value:ne,filament_id:y,nozzle_id:ie,nozzle_diameter:k,extruder_id:t?t.extruder_id:E[0],setting_id:t?.setting_id,slot_id:t?.slot_id??0};console.log("[KProfile] Saving profile:",pe),q.mutate(pe);return}j(!0),L({current:1,total:E.length});const be=E.map(pe=>({name:p,k_value:ne,filament_id:y,nozzle_id:ie,nozzle_diameter:k,extruder_id:pe,setting_id:void 0,slot_id:0}));console.log(`[KProfile] Saving ${be.length} profiles in batch:`,be);try{if(await ce.setKProfilesBatch(e,be),m(h("kProfiles.toast.profilesSaved",{count:E.length})),u&&B){const pe=`name_${p}_${y}`;u(pe,B)}}catch(pe){console.error("[KProfile] Failed to save batch:",pe),m(h("kProfiles.toast.failedToSaveBatch"),"error"),j(!1),L({current:0,total:0});return}L({current:E.length,total:E.length}),setTimeout(()=>{j(!1),L({current:0,total:0}),c()},3e3)};return a.jsxs("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:[a.jsxs(_t,{className:"w-full max-w-md relative",children:[T&&a.jsxs("div",{className:"absolute inset-0 bg-bambu-dark-secondary/90 flex flex-col items-center justify-center z-10 rounded-lg",children:[a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin mb-3"}),a.jsx("p",{className:"text-white font-medium",children:z.total>1?h("kProfiles.modal.savingExtruder",{current:z.current,total:z.total}):h("kProfiles.modal.syncing")}),a.jsx("p",{className:"text-bambu-gray text-sm mt-1",children:h("kProfiles.modal.pleaseWait")})]}),a.jsxs(Mt,{className:"p-0",children:[a.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[a.jsx("h2",{className:"text-xl font-semibold text-white",children:h(t?"kProfiles.modal.editTitle":"kProfiles.modal.addTitle")}),a.jsx("button",{onClick:l,className:"text-bambu-gray hover:text-white transition-colors",disabled:T,children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:H,className:"p-4 space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.profileName")}),a.jsx("input",{type:"text",value:p,onChange:K=>b(K.target.value),disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,placeholder:h("kProfiles.modal.profileNamePlaceholder"),required:!t})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.kValue")}),a.jsx("input",{type:"text",inputMode:"decimal",value:v,onChange:K=>{const ne=K.target.value;(ne===""||/^\d*\.?\d*$/.test(ne))&&x(ne)},onBlur:K=>{const ne=parseFloat(K.target.value);isNaN(ne)||x((Math.trunc(ne*1e3)/1e3).toFixed(3))},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none font-mono",placeholder:h("kProfiles.modal.kValuePlaceholder"),required:!0}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.kValueHelp")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.filament")}),a.jsxs("select",{value:y,onChange:K=>{const ne=K.target.value;if(S(ne),!t&&ne&&!p){const ie=$.find(be=>be.id===ne);ie&&b(`${N==="HH00"?"HF":"S"} ${ie.name}`)}},disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,required:!t,children:[a.jsx("option",{value:"",children:h("kProfiles.modal.selectFilament")}),t?.filament_id&&a.jsx("option",{value:t.filament_id,children:$.find(K=>K.id===t.filament_id)?.name||t.filament_id},t.filament_id),!t&&$.map(K=>a.jsx("option",{value:K.id,children:K.name},K.id))]}),!t&&$.length===0&&a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.noFilamentsHelp")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.flowType")}),a.jsxs("select",{value:N,onChange:K=>{const ne=K.target.value;if(A(ne),!t&&y&&!p){const ie=$.find(be=>be.id===y);ie&&b(`${ne==="HS00"?"HF":"S"} ${ie.name}`)}},disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,children:[a.jsx("option",{value:"HH00",children:h("kProfiles.modal.highFlow")}),a.jsx("option",{value:"HS00",children:h("kProfiles.modal.standard")})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.nozzleSize")}),a.jsxs("select",{value:k,onChange:K=>C(K.target.value),disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,children:[a.jsx("option",{value:"0.2",children:"0.2mm"}),a.jsx("option",{value:"0.4",children:"0.4mm"}),a.jsx("option",{value:"0.6",children:"0.6mm"}),a.jsx("option",{value:"0.8",children:"0.8mm"})]})]})]}),i&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h(t?"kProfiles.modal.extruder":"kProfiles.modal.extruders")}),t?a.jsx("div",{className:"px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white opacity-60",children:t.extruder_id===1?h("kProfiles.modal.left"):h("kProfiles.modal.right")}):a.jsxs("div",{className:"flex gap-4",children:[a.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.includes(1),onChange:K=>{K.target.checked?P([...E,1]):P(E.filter(ne=>ne!==1))},className:"w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"}),a.jsx("span",{className:"text-white",children:h("kProfiles.modal.left")})]}),a.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.includes(0),onChange:K=>{K.target.checked?P([...E,0]):P(E.filter(ne=>ne!==0))},className:"w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"}),a.jsx("span",{className:"text-white",children:h("kProfiles.modal.right")})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.notes")}),a.jsx("textarea",{value:B,onChange:K=>R(K.target.value),placeholder:h("kProfiles.modal.notesPlaceholder"),rows:2,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none resize-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.notesHelp")})]}),a.jsxs("div",{className:"flex gap-2 pt-4",children:[t&&a.jsx(ke,{type:"button",variant:"secondary",onClick:()=>Y(!0),disabled:I.isPending||T||!d("kprofiles:delete"),title:d("kprofiles:delete")?void 0:h("kProfiles.permission.noDelete"),className:"text-red-500 hover:bg-red-500/10",children:I.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"})}),a.jsx(ke,{type:"button",variant:"secondary",onClick:l,disabled:T,className:"flex-1",children:h("common.cancel")}),a.jsxs(ke,{type:"submit",disabled:q.isPending||T||!d(t?"kprofiles:update":"kprofiles:create"),title:d(t?"kprofiles:update":"kprofiles:create")?void 0:h(t?"kProfiles.permission.noUpdate":"kProfiles.permission.noCreate"),className:"flex-1",children:[q.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(FM,{className:"w-4 h-4"}),h("common.save")]})]})]})]})]}),G&&a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-[60]",children:a.jsx(_t,{className:"w-full max-w-sm",children:a.jsxs(Mt,{className:"p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center",children:a.jsx(cn,{className:"w-5 h-5 text-red-500"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:h("kProfiles.deleteConfirm.title")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:h("kProfiles.deleteConfirm.cannotUndo")})]})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:h("kProfiles.deleteConfirm.message",{name:t?.name})}),a.jsxs("div",{className:"flex gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>Y(!1),className:"flex-1",children:h("common.cancel")}),a.jsxs(ke,{onClick:()=>{Y(!1),re()},disabled:I.isPending,className:"flex-1 bg-red-500 hover:bg-red-600 text-white",children:[I.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),h("common.delete")]})]})]})})})]})}const A1={NOZZLE_DIAMETER:"bambusy_kprofiles_nozzle",SORT_OPTION:"bambusy_kprofiles_sort"};function pQe(){const{t}=Sn(),{showToast:e}=Hn(),{hasPermission:n}=Di(),[r,i]=_.useState(null),[s,o]=_.useState(()=>localStorage.getItem(A1.NOZZLE_DIAMETER)||"0.4"),[l,c]=_.useState(null),[u,d]=_.useState(!1),[h,m]=_.useState(null),[p,b]=_.useState(""),[v,x]=_.useState("all"),[y,S]=_.useState("all"),[N,A]=_.useState(()=>localStorage.getItem(A1.SORT_OPTION)||"name"),[k,C]=_.useState(!1),[E,P]=_.useState(new Set),[T,j]=_.useState(!1),[z,L]=_.useState(!1),B=_.useCallback(V=>`${V.slot_id}_${V.extruder_id}`,[]);_.useEffect(()=>{localStorage.setItem(A1.NOZZLE_DIAMETER,s)},[s]),_.useEffect(()=>{localStorage.setItem(A1.SORT_OPTION,N)},[N]);const{data:R,isLoading:$}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:q,isLoading:I,isFetching:G,error:Y,refetch:re}=st({queryKey:["kprofiles",r,s],queryFn:async()=>{console.log("[KProfiles] Fetching profiles for printer",r,"nozzle",s);const V=await ce.getKProfiles(r,s);return console.log("[KProfiles] Received profiles:",V?.profiles?.length||0,"profiles"),V},enabled:!!r,retry:!1,staleTime:0,gcTime:0,refetchOnMount:"always"}),{data:H}=st({queryKey:["kprofiles",r,"0.4"],queryFn:()=>ce.getKProfiles(r,"0.4"),enabled:!!r,staleTime:6e4}),{data:K,refetch:ne}=st({queryKey:["kprofile-notes",r],queryFn:()=>ce.getKProfileNotes(r),enabled:!!r,staleTime:3e4}),ie=Y?.message?.includes("not connected");_.useEffect(()=>{if(!r&&R&&R.length>0){const V=R.find(ge=>ge.is_active);V&&i(V.id)}},[r,R]),_.useEffect(()=>{if(r){const V=setTimeout(()=>{re()},150);return()=>clearTimeout(V)}},[r,s]);const be=R?.filter(V=>V.is_active)||[],pe=Jr.useMemo(()=>q?.profiles?q.profiles.filter(ge=>{const Se=p.toLowerCase(),ee=!Se||ge.name.toLowerCase().includes(Se)||ge.filament_id.toLowerCase().includes(Se),U=v==="all"||v==="left"&&ge.extruder_id===1||v==="right"&&ge.extruder_id===0,O=y==="all"||y==="hf"&&ge.nozzle_id.startsWith("HH")||y==="s"&&ge.nozzle_id.startsWith("HS");return ee&&U&&O}).sort((ge,Se)=>{switch(N){case"k_value":return parseFloat(ge.k_value)-parseFloat(Se.k_value);case"filament":return UR(ge.name).localeCompare(UR(Se.name));default:return ge.name.localeCompare(Se.name)}}):[],[q?.profiles,p,v,y,N]),de=R?.find(V=>V.id===r),Ce=de?.nozzle_count===2;_.useEffect(()=>{const V=ge=>{ge.target instanceof HTMLInputElement||ge.target instanceof HTMLTextAreaElement||ge.target instanceof HTMLSelectElement||l||u||h||(ge.key==="r"||ge.key==="R"?(ge.preventDefault(),re()):ge.key==="n"||ge.key==="N"?(ge.preventDefault(),d(!0)):ge.key==="Escape"&&k&&(ge.preventDefault(),C(!1),P(new Set)))};return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[l,u,h,k,re]);const ae=_.useCallback(()=>{if(!q?.profiles||q.profiles.length===0){e(t("kProfiles.toast.noProfilesToExport"),"error");return}const V={version:1,exported_at:new Date().toISOString(),printer:de?.name||"Unknown",nozzle_diameter:s,profiles:q.profiles.map(U=>({name:U.name,k_value:U.k_value,filament_id:U.filament_id,nozzle_id:U.nozzle_id,nozzle_diameter:U.nozzle_diameter,extruder_id:U.extruder_id}))},ge=new Blob([JSON.stringify(V,null,2)],{type:"application/json"}),Se=URL.createObjectURL(ge),ee=document.createElement("a");ee.href=Se,ee.download=`kprofiles_${de?.name||"printer"}_${s}mm_${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(ee),ee.click(),document.body.removeChild(ee),URL.revokeObjectURL(Se),e(t("kProfiles.toast.exportedProfiles",{count:q.profiles.length}))},[q?.profiles,de,s,e,t]),Ae=_.useCallback(()=>{const V=document.createElement("input");V.type="file",V.accept=".json",V.onchange=async ge=>{const Se=ge.target.files?.[0];if(Se)try{const ee=await Se.text(),U=JSON.parse(ee);if(!U.profiles||!Array.isArray(U.profiles)){e(t("kProfiles.toast.invalidFileFormat"),"error");return}let O=0;for(const Z of U.profiles)if(!(!Z.name||!Z.k_value||!Z.filament_id))try{await ce.setKProfile(r,{name:Z.name,k_value:parseFloat(Z.k_value).toFixed(6),filament_id:Z.filament_id,nozzle_id:Z.nozzle_id||`HH00-${s}`,nozzle_diameter:Z.nozzle_diameter||s,extruder_id:Z.extruder_id??0,slot_id:0}),O++,await new Promise(le=>setTimeout(le,500))}catch(le){console.error("Failed to import profile:",Z.name,le)}e(t("kProfiles.toast.importedProfiles",{count:O,total:U.profiles.length})),re()}catch(ee){console.error("Import error:",ee),e(t("kProfiles.toast.failedToParseImport"),"error")}},V.click()},[r,s,e,re,t]),Le=_.useCallback(V=>{P(ge=>{const Se=new Set(ge);return Se.has(V)?Se.delete(V):Se.add(V),Se})},[]),fe=_.useCallback(()=>{P(new Set(pe.map(V=>B(V))))},[pe,B]),Xe=_.useCallback(()=>{E.size!==0&&j(!0)},[E.size]),W=_.useCallback(async()=>{const V=pe.filter(Se=>E.has(B(Se)));L(!0);let ge=0;for(const Se of V)try{await ce.deleteKProfile(r,{slot_id:Se.slot_id,extruder_id:Se.extruder_id,nozzle_id:Se.nozzle_id,nozzle_diameter:Se.nozzle_diameter,filament_id:Se.filament_id,setting_id:Se.setting_id}),ge++,await new Promise(ee=>setTimeout(ee,300))}catch(ee){console.error("Failed to delete profile:",Se.name,ee)}e(t("kProfiles.toast.profilesDeleted",{count:ge})),L(!1),j(!1),C(!1),P(new Set),re()},[r,E,pe,e,re,B,t]),Q=_.useCallback(V=>{const ge=[];return V.setting_id&&ge.push(V.setting_id),ge.push(`slot_${V.slot_id}_${V.filament_id}_${V.extruder_id}`),ge.push(`name_${V.name}_${V.filament_id}`),ge},[]),me=_.useCallback(async(V,ge)=>{if(r)try{await ce.setKProfileNote(r,V,ge),ne()}catch(Se){console.error("Failed to save note:",Se),e(t("kProfiles.toast.failedToSaveNote"),"error")}},[r,ne,e,t]),X=_.useCallback(V=>{if(!K?.notes)return{note:"",key:null};const ge=Q(V);for(const Se of ge)if(K.notes[Se])return{note:K.notes[Se],key:Se};return{note:"",key:null}},[K,Q]),te=_.useCallback(V=>X(V).note,[X]);return $?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):!R||R.length===0?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(Wi,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noPrintersConfigured")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.addPrinterInSettings")})]})}):be.length===0?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(Or,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noActivePrinters")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.enablePrinterConnection")})]})}):a.jsxs(a.Fragment,{children:[G&&!I&&a.jsxs("div",{className:"fixed inset-0 bg-black/50 flex flex-col items-center justify-center z-40",children:[a.jsx(ut,{className:"w-10 h-10 text-bambu-green animate-spin mb-3"}),a.jsx("p",{className:"text-white font-medium",children:t("kProfiles.loadingProfiles")})]}),a.jsxs("div",{className:"flex flex-wrap gap-4 mb-6",children:[a.jsxs("div",{className:"flex-1 min-w-48",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:t("kProfiles.printer")}),a.jsx("select",{value:r||"",onChange:V=>i(parseInt(V.target.value)),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:be.map(V=>a.jsx("option",{value:V.id,children:V.name},V.id))})]}),a.jsxs("div",{className:"w-32",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:t("kProfiles.nozzle")}),a.jsxs("select",{value:s,onChange:V=>o(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"0.2",children:"0.2mm"}),a.jsx("option",{value:"0.4",children:"0.4mm"}),a.jsx("option",{value:"0.6",children:"0.6mm"}),a.jsx("option",{value:"0.8",children:"0.8mm"})]})]}),a.jsxs("div",{className:"flex items-end gap-2",children:[a.jsxs(ke,{variant:"secondary",onClick:()=>re(),disabled:G||!n("kprofiles:read"),title:n("kprofiles:read")?void 0:t("kProfiles.permission.noRead"),children:[a.jsx(Ir,{className:`w-4 h-4 ${G?"animate-spin":""}`}),t("kProfiles.refresh")]}),a.jsxs(ke,{onClick:()=>d(!0),disabled:!n("kprofiles:create"),title:n("kprofiles:create")?void 0:t("kProfiles.permission.noCreate"),children:[a.jsx(dr,{className:"w-4 h-4"}),t("kProfiles.addProfile")]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4 mb-4",children:[a.jsxs("div",{className:"flex-1 min-w-48 relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),a.jsx("input",{type:"text",value:p,onChange:V=>b(V.target.value),placeholder:t("kProfiles.searchPlaceholder"),className:"w-full pl-10 pr-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),Ce&&a.jsx("div",{className:"w-36",children:a.jsxs("select",{value:v,onChange:V=>x(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"all",children:t("kProfiles.allExtruders")}),a.jsx("option",{value:"left",children:t("kProfiles.leftOnly")}),a.jsx("option",{value:"right",children:t("kProfiles.rightOnly")})]})}),a.jsx("div",{className:"w-32",children:a.jsxs("select",{value:y,onChange:V=>S(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"all",children:t("kProfiles.allFlow")}),a.jsx("option",{value:"hf",children:t("kProfiles.hfOnly")}),a.jsx("option",{value:"s",children:t("kProfiles.sOnly")})]})}),a.jsx("div",{className:"w-32",children:a.jsxs("select",{value:N,onChange:V=>A(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"name",children:t("kProfiles.sortName")}),a.jsx("option",{value:"k_value",children:t("kProfiles.sortKValue")}),a.jsx("option",{value:"filament",children:t("kProfiles.sortFilament")})]})})]}),a.jsxs("div",{className:"flex flex-wrap gap-2 mb-6",children:[a.jsxs(ke,{variant:"secondary",onClick:ae,disabled:!q?.profiles?.length||!n("kprofiles:read"),title:n("kprofiles:read")?void 0:t("kProfiles.permission.noExport"),children:[a.jsx(Ni,{className:"w-4 h-4"}),t("kProfiles.export")]}),a.jsxs(ke,{variant:"secondary",onClick:Ae,disabled:!n("kprofiles:create"),title:n("kprofiles:create")?void 0:t("kProfiles.permission.noImport"),children:[a.jsx($a,{className:"w-4 h-4"}),t("kProfiles.import")]}),a.jsx("div",{className:"flex-1"}),k?a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"secondary",onClick:fe,children:[a.jsx(qs,{className:"w-4 h-4"}),t("kProfiles.selectAll")]}),a.jsxs(ke,{variant:"secondary",onClick:Xe,disabled:E.size===0||!n("kprofiles:delete"),className:"text-red-500 hover:bg-red-500/10",title:n("kprofiles:delete")?void 0:t("kProfiles.permission.noDelete"),children:[a.jsx(cn,{className:"w-4 h-4"}),t("kProfiles.delete")," (",E.size,")"]}),a.jsxs(ke,{variant:"secondary",onClick:()=>{C(!1),P(new Set)},children:[a.jsx(Lt,{className:"w-4 h-4"}),t("common.cancel")]})]}):a.jsxs(ke,{variant:"secondary",onClick:()=>C(!0),disabled:!pe.length||!n("kprofiles:delete"),title:n("kprofiles:delete")?void 0:t("kProfiles.permission.noDelete"),children:[a.jsx(qs,{className:"w-4 h-4"}),t("kProfiles.select")]})]}),I?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):ie?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(_m,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.printerOffline")}),a.jsx("p",{className:"text-bambu-gray mb-4",children:t("kProfiles.printerOfflineDesc")}),a.jsxs(ke,{variant:"secondary",onClick:()=>re(),children:[a.jsx(Ir,{className:"w-4 h-4"}),t("common.refresh")]})]})}):pe.length>0?Ce?a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"text-sm font-medium text-bambu-gray mb-2 px-1",children:t("kProfiles.leftExtruder")}),a.jsx("div",{className:"space-y-1",children:pe.filter(V=>V.extruder_id===1).map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-sm font-medium text-bambu-gray mb-2 px-1",children:t("kProfiles.rightExtruder")}),a.jsx("div",{className:"space-y-1",children:pe.filter(V=>V.extruder_id===0).map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))})]})]}):a.jsx("div",{className:"space-y-1",children:pe.map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))}):p||v!=="all"||y!=="all"?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(va,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noMatchingProfiles")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.noMatchingProfilesDesc")})]})}):a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(FM,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noKProfiles")}),a.jsx("p",{className:"text-bambu-gray mb-4",children:t("kProfiles.noKProfilesDesc",{diameter:s})}),a.jsxs(ke,{onClick:()=>d(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),t("kProfiles.createFirstProfile")]})]})}),l&&r&&(()=>{const{note:V,key:ge}=X(l);return a.jsx(xP,{profile:l,printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,initialNote:V,initialNoteKey:ge,onSaveNote:me,hasPermission:n,onClose:()=>{console.log("[KProfiles] Edit modal onClose - refetching profiles..."),c(null),re()},onSave:()=>{c(null),re()}})})(),u&&r&&a.jsx(xP,{printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,onSaveNote:me,hasPermission:n,onClose:()=>{d(!1),re()},onSave:()=>{d(!1),re()}}),h&&r&&a.jsx(xP,{printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,onSaveNote:me,hasPermission:n,profile:{...h,slot_id:0,name:`${h.name} (Copy)`},onClose:()=>{m(null),re()},onSave:()=>{m(null),re()}}),T&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:a.jsx(_t,{className:"w-full max-w-sm",children:a.jsxs(Mt,{className:"p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center",children:a.jsx(cn,{className:"w-5 h-5 text-red-500"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:t("kProfiles.bulkDelete.title")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("kProfiles.bulkDelete.cannotUndo")})]})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:t("kProfiles.bulkDelete.message",{count:E.size})}),a.jsxs("div",{className:"flex gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>j(!1),disabled:z,className:"flex-1",children:t("common.cancel")}),a.jsxs(ke,{onClick:W,disabled:z,className:"flex-1 bg-red-500 hover:bg-red-600 text-white",children:[z?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),t("common.delete")]})]})]})})})]})}function HF(t,e){const n=`${t} ${e||""}`,r=n.match(/@?\s*(?:BBL\s+)?(?:Bambu\s+Lab\s+)?([XPAH][1-9][A-Z]?(?:\s*(?:Carbon|mini))?|H2D)/i),i=r?r[1].trim():null,s=n.match(/(\d+\.?\d*)\s*(?:mm\s*)?nozzle|nozzle\s*(\d+\.?\d*)/i),o=s?(s[1]||s[2])+"mm":null,l=n.match(/(\d+\.?\d*)mm\s*(?:Standard|Fine|Extra Fine|Draft|Quality)?/i),c=l?l[1]+"mm":null,u=n.match(/\b(PLA|PETG|ABS|ASA|TPU|PC|PA|PVA|HIPS|PP|PET(?:-?CF)?|PA(?:-?CF)?|PLA(?:-?CF)?)\b/i),d=u?u[1].toUpperCase():null;return{printer:i,nozzle:o,layerHeight:c,filamentType:d}}function Yy(t){return/^(P[FPM]US|PF\d|PP\d)/.test(t)}function gQe(t,e){const n=Hi(t);if(!n)return"";const i=new Date().getTime()-n.getTime(),s=Math.floor(i/6e4),o=Math.floor(i/36e5),l=Math.floor(i/864e5);return s<1?e("profiles.time.justNow"):s<60?e("profiles.time.minsAgo",{count:s}):o<24?e("profiles.time.hoursAgo",{count:o}):l<7?e("profiles.time.daysAgo",{count:l}):n.toLocaleDateString()}function bQe({onSuccess:t,t:e}){const{showToast:n}=Hn(),[r,i]=_.useState("email"),[s,o]=_.useState(""),[l,c]=_.useState(""),[u,d]=_.useState(""),[h,m]=_.useState(""),[p,b]=_.useState("global"),[v,x]=_.useState(null),[y,S]=_.useState(null),N=pt({mutationFn:()=>ce.cloudLogin(s,l,p),onSuccess:P=>{P.success?(n(e("profiles.login.toast.loggedIn")),t()):P.needs_verification?(x(P.verification_type||"email"),S(P.tfa_key||null),P.verification_type==="totp"?n(e("profiles.login.toast.enterTotp")):n(e("profiles.login.toast.codeSent")),i("code")):n(P.message,"error")},onError:P=>n(P.message,"error")}),A=pt({mutationFn:()=>ce.cloudVerify(s,u,y||void 0),onSuccess:P=>{P.success?(n(e("profiles.login.toast.loggedIn")),t()):n(P.message,"error")},onError:P=>n(P.message,"error")}),k=pt({mutationFn:()=>ce.cloudSetToken(h),onSuccess:()=>{n(e("profiles.login.toast.tokenSet")),t()},onError:P=>n(P.message,"error")}),C=P=>{P.preventDefault(),r==="email"?N.mutate():r==="code"?A.mutate():r==="token"&&k.mutate()},E=N.isPending||A.isPending||k.isPending;return a.jsx(_t,{className:"max-w-md mx-auto",children:a.jsxs(Mt,{children:[a.jsxs("div",{className:"text-center mb-6",children:[a.jsx("div",{className:"inline-flex items-center justify-center w-12 h-12 rounded-xl bg-bambu-green/20 mb-3",children:a.jsx(DM,{className:"w-6 h-6 text-bambu-green"})}),a.jsx("h2",{className:"text-xl font-semibold text-white",children:e("profiles.login.title")}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:e("profiles.login.subtitle")})]}),a.jsxs("form",{onSubmit:C,className:"space-y-4",children:[r==="email"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.email")}),a.jsx("input",{type:"email",value:s,onChange:P=>o(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",placeholder:"your@email.com",required:!0})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.password")}),a.jsx("input",{type:"password",value:l,onChange:P=>c(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",placeholder:"••••••••",required:!0})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.region")}),a.jsxs("select",{value:p,onChange:P=>b(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"global",children:e("profiles.login.regionGlobal")}),a.jsx("option",{value:"china",children:e("profiles.login.regionChina")})]})]})]}),r==="code"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e(v==="totp"?"profiles.login.totpCode":"profiles.login.verificationCode")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:v==="totp"?e("profiles.login.enterTotpHint"):e("profiles.login.checkEmail",{email:s})}),a.jsx("input",{type:"text",value:u,onChange:P=>d(P.target.value.replace(/\D/g,"").slice(0,6)),className:"w-full px-3 py-3 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-center text-2xl tracking-widest font-mono focus:border-bambu-green focus:outline-none",placeholder:"000000",maxLength:6,required:!0})]}),r==="token"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.accessToken")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:e("profiles.login.accessTokenHint")}),a.jsx("textarea",{value:h,onChange:P=>m(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-xs font-mono placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none resize-none",placeholder:"eyJ...",rows:4,required:!0})]}),a.jsxs("div",{className:"flex gap-2",children:[r==="code"&&a.jsx(ke,{type:"button",variant:"secondary",onClick:()=>i("email"),className:"flex-1",children:e("profiles.login.back")}),a.jsxs(ke,{type:"submit",disabled:E,className:"flex-1",children:[E?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(fB,{className:"w-4 h-4"}),e(r==="email"?"profiles.login.loginButton":r==="code"?"profiles.login.verifyButton":"profiles.login.setTokenButton")]})]}),r==="email"&&a.jsx("div",{className:"pt-4 border-t border-bambu-dark-tertiary",children:a.jsxs("button",{type:"button",onClick:()=>i("token"),className:"text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors",children:[a.jsx(Wo,{className:"w-4 h-4"}),e("profiles.login.useToken")]})}),r==="token"&&a.jsx("div",{className:"pt-4 border-t border-bambu-dark-tertiary",children:a.jsxs("button",{type:"button",onClick:()=>i("email"),className:"text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors",children:[a.jsx(fB,{className:"w-4 h-4"}),e("profiles.login.useEmail")]})})]})]})})}function xg({label:t,value:e,options:n,onChange:r}){const[i,s]=_.useState(!1),o=n.find(l=>l.value===e);return a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>s(!i),className:"flex items-center gap-2 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-sm text-white hover:border-bambu-gray-dark transition-colors",children:[a.jsxs("span",{className:"text-bambu-gray",children:[t,":"]}),a.jsx("span",{children:o?.label||"All"}),a.jsx(Sr,{className:`w-4 h-4 text-bambu-gray transition-transform ${i?"rotate-180":""}`})]}),i&&a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>s(!1)}),a.jsx("div",{className:"absolute top-full left-0 mt-1 min-w-[160px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20 py-1 max-h-60 overflow-y-auto",children:n.map(l=>a.jsxs("button",{onClick:()=>{r(l.value),s(!1)},className:`w-full px-3 py-2 text-left text-sm flex items-center justify-between hover:bg-bambu-dark-tertiary transition-colors ${e===l.value?"text-bambu-green":"text-white"}`,children:[a.jsx("span",{children:l.label}),l.count!==void 0&&a.jsx("span",{className:"text-bambu-gray text-xs",children:l.count})]},l.value))})]})]})}function xQe(){const[t,e]=_.useState(!1);_.useEffect(()=>{const r=()=>{e(window.scrollY>300)};return window.addEventListener("scroll",r),()=>window.removeEventListener("scroll",r)},[]);const n=()=>{window.scrollTo({top:0,behavior:"smooth"})};return t?a.jsx("button",{onClick:n,className:"fixed bottom-6 right-6 p-3 bg-bambu-green hover:bg-bambu-green-light text-white rounded-full shadow-lg shadow-bambu-green/25 transition-all z-40","aria-label":"Scroll to top",children:a.jsx(Zg,{className:"w-5 h-5"})}):null}function yP({setting:t,onClick:e,onDuplicate:n,compareMode:r,isCompareSelected:i,compareIndex:s,compareDisabled:o,t:l}){const c=HF(t.name),u=Yy(t.setting_id);return a.jsxs("div",{className:"flex items-center gap-2 group",children:[a.jsx("button",{onClick:e,disabled:o,className:`flex-1 text-left px-3 py-2 rounded transition-colors ${i?"bg-blue-500/20 border border-blue-500/50":o?"bg-bambu-dark/50 opacity-40 cursor-not-allowed":"bg-bambu-dark hover:bg-bambu-dark-tertiary"} ${r&&!o?"cursor-pointer":""}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[i&&s!==void 0&&a.jsx("span",{className:"flex-shrink-0 w-5 h-5 rounded-full bg-blue-500 text-white text-xs flex items-center justify-center font-medium",children:s+1}),!i&&u&&a.jsx("span",{className:"flex-shrink-0 w-1.5 h-1.5 rounded-full bg-bambu-green",title:l("profiles.presets.myPreset")}),a.jsx("span",{className:"text-white text-sm truncate flex-1",title:t.name,children:t.name}),c.filamentType&&t.type==="filament"&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.filamentType}),c.layerHeight&&t.type==="process"&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.layerHeight}),c.printer&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.printer})]})}),a.jsx("button",{onClick:d=>{d.stopPropagation(),n()},className:"opacity-0 group-hover:opacity-100 text-bambu-gray hover:text-white transition-all p-1",title:l("profiles.presets.duplicate"),children:a.jsx(Fl,{className:"w-4 h-4"})})]})}function zR(t,e=0){const n=" ".repeat(e);if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string"){if(t.includes("\\n")||t.includes(` + `,children:a.jsxs("div",{className:"flex items-center gap-4 p-4",children:[P&&d&&a.jsx("button",{onClick:j=>{j.stopPropagation(),d()},className:`flex items-center justify-center w-6 h-6 rounded border transition-colors ${u?"bg-bambu-green border-bambu-green text-white":"border-white/30 bg-black/30 hover:border-bambu-green/50"}`,children:u&&a.jsx(qi,{className:"w-4 h-4"})}),P?a.jsx("div",{...x,...y,className:"flex items-center justify-center w-10 h-10 md:w-8 md:h-8 rounded-lg bg-bambu-dark cursor-grab active:cursor-grabbing hover:bg-bambu-dark-tertiary transition-colors touch-manipulation",children:a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray"})}):e!==void 0?a.jsxs("div",{className:"flex items-center justify-center w-8 h-8 rounded-lg bg-bambu-dark text-bambu-gray text-sm font-medium",children:["#",e]}):a.jsx("div",{className:"w-8"}),a.jsx("div",{className:"w-14 h-14 flex-shrink-0 bg-bambu-dark rounded-lg overflow-hidden",children:t.archive_thumbnail?a.jsx("img",{src:t.plate_id!=null?ce.getArchivePlateThumbnail(t.archive_id,t.plate_id):ce.getArchiveThumbnail(t.archive_id),alt:"",className:"w-full h-full object-cover"}):t.library_file_thumbnail?a.jsx("img",{src:t.plate_id!=null?ce.getLibraryFilePlateThumbnail(t.library_file_id,t.plate_id):ce.getLibraryFileThumbnailUrl(t.library_file_id),alt:"",className:"w-full h-full object-cover"}):a.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray",children:a.jsx(ys,{className:"w-6 h-6"})})}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("p",{className:"text-white font-medium truncate",children:t.archive_name||t.library_file_name||`File #${t.archive_id||t.library_file_id}`}),t.archive_id?a.jsx(Fs,{to:`/archives?highlight=${t.archive_id}`,className:"text-bambu-gray hover:text-bambu-green transition-colors flex-shrink-0",title:b("queue.viewArchive"),children:a.jsx(Xr,{className:"w-3.5 h-3.5"})}):t.library_file_id?a.jsx(Fs,{to:`/library?highlight=${t.library_file_id}`,className:"text-bambu-gray hover:text-bambu-green transition-colors flex-shrink-0",title:b("queue.viewInFileManager"),children:a.jsx(Xr,{className:"w-3.5 h-3.5"})}):null]}),a.jsxs("div",{className:"flex items-center gap-3 text-sm text-bambu-gray",children:[a.jsxs("span",{className:`flex items-center gap-1.5 ${t.printer_id===null&&!t.target_model?"text-orange-400":""} ${t.target_model?"text-blue-400":""}`,children:[a.jsx(Or,{className:"w-3.5 h-3.5"}),t.target_model?`${b("queue.filter.any")} ${t.target_model}${t.target_location?` @ ${t.target_location}`:""}${t.required_filament_types?.length?` (${t.required_filament_types.join(", ")})`:""}`:t.printer_id===null?b("queue.filter.unassigned"):t.printer_name||`${b("common.printer")} #${t.printer_id}`]}),t.print_time_seconds&&a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx(Su,{className:"w-3.5 h-3.5"}),lae(t.print_time_seconds)]}),t.created_by_username&&a.jsxs("span",{className:"flex items-center gap-1.5",title:b("queue.addedBy",{name:t.created_by_username}),children:[a.jsx(Hu,{className:"w-3.5 h-3.5"}),t.created_by_username]}),P&&!t.manual_start&&a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx(nr,{className:"w-3.5 h-3.5"}),MYe(t.scheduled_time,c,b)]})]}),a.jsxs("div",{className:"flex items-center gap-2 mt-2",children:[t.manual_start&&a.jsxs("span",{className:"text-xs px-2 py-0.5 bg-purple-500/10 text-purple-400 rounded-full border border-purple-500/20 flex items-center gap-1",children:[a.jsx(LK,{className:"w-3 h-3"}),b("queue.badges.staged")]}),t.require_previous_success&&a.jsx("span",{className:"text-xs px-2 py-0.5 bg-orange-500/10 text-orange-400 rounded-full border border-orange-500/20",children:b("queue.badges.requiresPrevious")}),t.auto_off_after&&a.jsxs("span",{className:"text-xs px-2 py-0.5 bg-blue-500/10 text-blue-400 rounded-full border border-blue-500/20 flex items-center gap-1",children:[a.jsx(Zu,{className:"w-3 h-3"}),b("queue.badges.autoPowerOff")]})]}),E&&a.jsxs("div",{className:"mt-3",children:[a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full overflow-hidden",children:a.jsx("div",{className:"h-full bg-gradient-to-r from-blue-500 to-blue-400 animate-pulse w-full opacity-50"})}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:b("queue.printingInProgress")})]}),t.waiting_reason&&t.status==="pending"&&a.jsxs("p",{className:"text-xs text-purple-400 mt-2 flex items-start gap-1",children:[a.jsx(Wi,{className:"w-3 h-3 mt-0.5 flex-shrink-0"}),a.jsx("span",{children:t.waiting_reason})]}),t.error_message&&a.jsxs("p",{className:"text-xs text-red-400 mt-2 flex items-center gap-1",children:[a.jsx(Wi,{className:"w-3 h-3"}),t.error_message]})]}),a.jsx(kYe,{status:t.status,waitingReason:t.waiting_reason,printerState:p,t:b}),a.jsxs("div",{className:"flex items-center gap-1",children:[E&&a.jsx(ke,{variant:"ghost",size:"sm",onClick:s,disabled:!h("printers:control"),title:h("printers:control")?b("queue.actions.stopPrint"):b("queue.permissions.noStopPrint"),className:"text-red-400 hover:text-red-300 hover:bg-red-500/10",children:a.jsx(_de,{className:"w-4 h-4"})}),P&&a.jsxs(a.Fragment,{children:[t.manual_start&&a.jsx(ke,{variant:"ghost",size:"sm",onClick:l,disabled:!h("printers:control"),title:h("printers:control")?b("queue.actions.startPrint"):b("queue.permissions.noStartPrint"),className:"text-bambu-green hover:text-bambu-green-light hover:bg-bambu-green/10",children:a.jsx(vo,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:n,disabled:!m("queue","update",t.created_by_id),title:m("queue","update",t.created_by_id)?b("common.edit"):b("queue.permissions.noEdit"),children:a.jsx(na,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:r,disabled:!m("queue","delete",t.created_by_id),title:m("queue","delete",t.created_by_id)?b("common.cancel"):b("queue.permissions.noCancel"),className:"text-red-400 hover:text-red-300 hover:bg-red-500/10",children:a.jsx(Lt,{className:"w-4 h-4"})})]}),T&&a.jsxs(a.Fragment,{children:[a.jsx(ke,{variant:"ghost",size:"sm",onClick:o,disabled:!h("queue:create"),title:h("queue:create")?b("queue.actions.requeue"):b("queue.permissions.noRequeue"),className:"text-bambu-green hover:text-bambu-green/80 hover:bg-bambu-green/10",children:a.jsx(Ir,{className:"w-4 h-4"})}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:i,disabled:!m("queue","delete",t.created_by_id),title:m("queue","delete",t.created_by_id)?b("common.remove"):b("queue.permissions.noRemove"),children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})})}function AYe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),{hasPermission:r,hasAnyPermission:i,canModify:s}=Di(),[o,l]=_.useState(null),[c,u]=_.useState(""),[d,h]=_.useState(""),[m,p]=_.useState(!1),[b,v]=_.useState(null),[x,y]=_.useState(null),[S,N]=_.useState(null),[A,k]=_.useState([]),[C,E]=_.useState(!1),[P,T]=_.useState(()=>localStorage.getItem("queue.historySortBy")||"date"),[j,z]=_.useState(()=>{const ee=localStorage.getItem("queue.historySortAsc");return ee!==null?ee==="true":!1}),[L,B]=_.useState(()=>localStorage.getItem("queue.pendingSortBy")||"position"),[R,$]=_.useState(()=>{const ee=localStorage.getItem("queue.pendingSortAsc");return ee!==null?ee==="true":!0});_.useEffect(()=>{localStorage.setItem("queue.historySortBy",P)},[P]),_.useEffect(()=>{localStorage.setItem("queue.historySortAsc",String(j))},[j]),_.useEffect(()=>{localStorage.setItem("queue.pendingSortBy",L)},[L]),_.useEffect(()=>{localStorage.setItem("queue.pendingSortAsc",String(R))},[R]);const q=Fie(NM(pk,{activationConstraint:{distance:8}}),NM(mk,{coordinateGetter:sae})),{data:I}=st({queryKey:["settings"],queryFn:ce.getSettings}),G=I?.time_format||"system",{data:Y,isLoading:re}=st({queryKey:["queue",o,c],queryFn:()=>ce.getQueue(o||void 0,c||void 0),refetchInterval:5e3}),{data:H}=st({queryKey:["printers"],queryFn:()=>ce.getPrinters()}),K=pt({mutationFn:ee=>ce.cancelQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.cancelled"))},onError:()=>n(t("queue.toast.cancelFailed"),"error")}),ne=pt({mutationFn:ee=>ce.removeFromQueue(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.removed"))},onError:()=>n(t("queue.toast.removeFailed"),"error")}),ie=pt({mutationFn:ee=>ce.stopQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.stopped"))},onError:()=>n(t("queue.toast.stopFailed"),"error")}),be=pt({mutationFn:ee=>ce.startQueueItem(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.released"))},onError:()=>n(t("queue.toast.startFailed"),"error")}),pe=pt({mutationFn:ee=>ce.reorderQueue(ee),onSuccess:()=>{e.invalidateQueries({queryKey:["queue"]})},onError:()=>n(t("queue.toast.reorderFailed"),"error")}),de=pt({mutationFn:async()=>{const ee=Y?.filter(U=>["completed","failed","skipped","cancelled"].includes(U.status))||[];for(const U of ee)await ce.removeFromQueue(U.id);return ee.length},onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),n(t("queue.toast.historyCleared",{count:ee}))},onError:()=>n(t("queue.toast.clearHistoryFailed"),"error")}),Ce=pt({mutationFn:ee=>ce.bulkUpdateQueue(ee),onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),k([]),E(!1),n(ee.message)},onError:()=>n(t("queue.toast.updateFailed"),"error")}),ae=pt({mutationFn:async ee=>{for(const U of ee)await ce.cancelQueueItem(U);return ee.length},onSuccess:ee=>{e.invalidateQueries({queryKey:["queue"]}),k([]),n(t("queue.toast.bulkCancelled",{count:ee}))},onError:()=>n(t("queue.toast.bulkCancelFailed"),"error")}),Ae=ee=>{k(U=>U.includes(ee)?U.filter(O=>O!==ee):[...U,ee])},Le=_.useMemo(()=>{const ee=new Set;return H?.forEach(U=>{U.location&&ee.add(U.location)}),Y?.forEach(U=>{U.target_location&&ee.add(U.target_location)}),Array.from(ee).sort()},[H,Y]),fe=_.useCallback(ee=>d?ee.target_location?ee.target_location===d:ee.printer_id?H?.find(O=>O.id===ee.printer_id)?.location===d:!1:!0,[d,H]),Xe=_.useMemo(()=>{let ee=Y?.filter(O=>O.status==="pending")||[];d&&(ee=ee.filter(fe));const U=O=>{if(!O.scheduled_time)return 0;const Z=new Date(O.scheduled_time).getTime(),le=Date.now()+4320*60*60*1e3;return Z>le?0:Z};return[...ee].sort((O,Z)=>{let le;if(L==="name"){const we=O.archive_name||O.library_file_name||"",ye=Z.archive_name||Z.library_file_name||"";le=we.localeCompare(ye)}else L==="printer"?le=(O.printer_name||"").localeCompare(Z.printer_name||""):L==="time"?le=U(O)-U(Z):le=O.position-Z.position;return R?le:-le})},[Y,L,R,fe,d]),W=()=>{const ee=Xe.map(U=>U.id);A.length===ee.length?k([]):k(ee)},Q=_.useMemo(()=>{let ee=Y?.filter(U=>U.status==="printing")||[];return d&&(ee=ee.filter(fe)),ee},[Y,d,fe]),me=_.useMemo(()=>{const ee=new Set;return Q.forEach(U=>{U.printer_id&&ee.add(U.printer_id)}),Array.from(ee)},[Q]),X=iO({queries:me.map(ee=>({queryKey:["printerStatus",ee],queryFn:()=>ce.getPrinterStatus(ee),refetchInterval:5e3}))}),te=_.useMemo(()=>{const ee={};return me.forEach((U,O)=>{const Z=X[O];Z?.data?.state&&(ee[U]=Z.data.state)}),ee},[me,X]),V=_.useMemo(()=>{let ee=Y?.filter(U=>["completed","failed","skipped","cancelled"].includes(U.status))||[];return d&&(ee=ee.filter(fe)),[...ee].sort((U,O)=>{let Z;if(P==="name"){const le=U.archive_name||U.library_file_name||"",we=O.archive_name||O.library_file_name||"";Z=le.localeCompare(we)}else P==="printer"?Z=(U.printer_name||"").localeCompare(O.printer_name||""):Z=new Date(O.completed_at||O.created_at).getTime()-new Date(U.completed_at||U.created_at).getTime();return j?-Z:Z})},[Y,P,j,fe,d]),ge=_.useMemo(()=>Xe.reduce((ee,U)=>ee+(U.print_time_seconds||0),0),[Xe]),Se=ee=>{const{active:U,over:O}=ee;if(!O||U.id===O.id)return;const Z=Xe.findIndex(we=>we.id===U.id),le=Xe.findIndex(we=>we.id===O.id);if(Z!==-1&&le!==-1){const ye=xk(Xe,Z,le).map((se,Oe)=>({id:se.id,position:Oe+1}));pe.mutate(ye)}};return a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsx("div",{className:"flex items-center justify-between mb-8",children:a.jsxs("div",{children:[a.jsxs("h1",{className:"text-2xl font-bold text-white flex items-center gap-3",children:[a.jsx(FK,{className:"w-7 h-7 text-bambu-green"}),t("queue.title")]}),a.jsx("p",{className:"text-bambu-gray mt-1",children:t("queue.subtitle")})]})}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 mb-8",children:[a.jsx(_t,{className:"bg-gradient-to-br from-blue-500/10 to-transparent border-blue-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-blue-500/20 flex items-center justify-center",children:a.jsx(vo,{className:"w-5 h-5 text-blue-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:Q.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.printing")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-yellow-500/10 to-transparent border-yellow-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-yellow-500/20 flex items-center justify-center",children:a.jsx(nr,{className:"w-5 h-5 text-yellow-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:Xe.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.queued")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-bambu-green/10 to-transparent border-bambu-green/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-bambu-green/20 flex items-center justify-center",children:a.jsx(Su,{className:"w-5 h-5 text-bambu-green"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:lae(ge)}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.totalTime")})]})]})})}),a.jsx(_t,{className:"bg-gradient-to-br from-gray-500/10 to-transparent border-gray-500/20",children:a.jsx(Mt,{className:"p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-gray-500/20 flex items-center justify-center",children:a.jsx(Nr,{className:"w-5 h-5 text-gray-400"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-2xl font-bold text-white",children:V.length}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("queue.summary.history")})]})]})})})]}),a.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:o===-1?"unassigned":o||"",onChange:ee=>{const U=ee.target.value;l(U==="unassigned"?-1:U===""?null:Number(U))},children:[a.jsx("option",{value:"",children:t("queue.filter.allPrinters")}),a.jsx("option",{value:"unassigned",children:t("queue.filter.unassigned")}),H?.map(ee=>a.jsx("option",{value:ee.id,children:ee.name},ee.id))]}),a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:c,onChange:ee=>u(ee.target.value),children:[a.jsx("option",{value:"",children:t("queue.filter.allStatus")}),a.jsx("option",{value:"pending",children:t("queue.status.pending")}),a.jsx("option",{value:"printing",children:t("queue.status.printing")}),a.jsx("option",{value:"completed",children:t("queue.status.completed")}),a.jsx("option",{value:"failed",children:t("queue.status.failed")}),a.jsx("option",{value:"skipped",children:t("queue.status.skipped")}),a.jsx("option",{value:"cancelled",children:t("queue.status.cancelled")})]}),Le.length>0&&a.jsxs("select",{className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:d,onChange:ee=>h(ee.target.value),children:[a.jsx("option",{value:"",children:t("queue.filter.allLocations")}),Le.map(ee=>a.jsx("option",{value:ee,children:ee},ee))]}),a.jsx("div",{className:"flex-1"}),V.length>0&&a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>p(!0),disabled:!r("queue:delete_all"),title:r("queue:delete_all")?void 0:t("queue.permissions.noClearHistory"),children:[a.jsx(cn,{className:"w-4 h-4"}),t("queue.clearHistory")]})]}),re?a.jsx("div",{className:"text-center py-12 text-bambu-gray",children:t("common.loading")}):Y?.length===0?a.jsxs(_t,{className:"p-12 text-center border-dashed",children:[a.jsx(ei,{className:"w-16 h-16 text-bambu-gray mx-auto mb-4 opacity-50"}),a.jsx("h3",{className:"text-xl font-medium text-white mb-2",children:t("queue.empty.title")}),a.jsx("p",{className:"text-bambu-gray max-w-md mx-auto",children:t("queue.empty.description")})]}):a.jsxs("div",{className:"space-y-8",children:[Q.length>0&&a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white mb-4 flex items-center gap-2",children:[a.jsx("div",{className:"w-2 h-2 rounded-full bg-blue-400 animate-pulse"}),t("queue.sections.currentlyPrinting")]}),a.jsx("div",{className:"space-y-3",children:Q.map(ee=>a.jsx(gP,{item:ee,onEdit:()=>{},onCancel:()=>{},onRemove:()=>{},onStop:()=>N({type:"stop",item:ee}),onRequeue:()=>{},onStart:()=>{},timeFormat:G,hasPermission:r,canModify:s,printerState:ee.printer_id?te[ee.printer_id]:null,t},ee.id))})]}),Xe.length>0&&a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(nr,{className:"w-5 h-5 text-yellow-400"}),t("queue.sections.queued"),a.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",t("queue.itemCount",{count:Xe.length}),")"]}),a.jsx("span",{className:"text-xs text-bambu-gray ml-2",title:t("queue.reorderHint"),children:t("queue.dragToReorder")})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("select",{className:"px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:L,onChange:ee=>B(ee.target.value),children:[a.jsx("option",{value:"position",children:t("queue.sort.byPosition")}),a.jsx("option",{value:"name",children:t("queue.sort.byName")}),a.jsx("option",{value:"printer",children:t("queue.sort.byPrinter")}),a.jsx("option",{value:"time",children:t("queue.sort.bySchedule")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>$(!R),title:t(R?"common.ascending":"common.descending"),className:"px-2",children:R?a.jsx(Zg,{className:"w-4 h-4"}):a.jsx(ay,{className:"w-4 h-4"})})]})]}),a.jsxs("div",{className:"flex items-center gap-3 mb-4 p-3 bg-bambu-dark rounded-lg",children:[a.jsxs(ke,{variant:"ghost",size:"sm",onClick:W,className:"flex items-center gap-2",children:[A.length===Xe.length&&Xe.length>0?a.jsx(qs,{className:"w-4 h-4 text-bambu-green"}):a.jsx(ll,{className:"w-4 h-4"}),A.length===Xe.length&&Xe.length>0?t("queue.bulkEdit.deselectAll"):t("queue.bulkEdit.selectAll")]}),A.length>0&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:t("queue.bulkEdit.selected",{count:A.length})}),a.jsx("div",{className:"h-4 w-px bg-bambu-dark-tertiary"}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>E(!0),className:"flex items-center gap-2 text-bambu-green hover:text-bambu-green-light",disabled:!i("queue:update_own","queue:update_all"),title:i("queue:update_own","queue:update_all")?void 0:t("queue.permissions.noEditItems"),children:[a.jsx(na,{className:"w-4 h-4"}),t("queue.bulkEdit.editSelected")]}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>ae.mutate(A),className:"flex items-center gap-2 text-red-400 hover:text-red-300",disabled:ae.isPending||!i("queue:delete_own","queue:delete_all"),title:i("queue:delete_own","queue:delete_all")?void 0:t("queue.permissions.noCancelItems"),children:[a.jsx(Lt,{className:"w-4 h-4"}),t("queue.bulkEdit.cancelSelected")]})]})]}),a.jsx(eae,{sensors:q,collisionDetection:Bie,onDragEnd:Se,children:a.jsx(rae,{items:Xe.map(ee=>ee.id),strategy:mYe,children:a.jsx("div",{className:"space-y-3",children:Xe.map((ee,U)=>a.jsx(gP,{item:ee,position:U+1,onEdit:()=>v(ee),onCancel:()=>N({type:"cancel",item:ee}),onRemove:()=>{},onStop:()=>{},onRequeue:()=>{},onStart:()=>be.mutate(ee.id),timeFormat:G,isSelected:A.includes(ee.id),onToggleSelect:()=>Ae(ee.id),hasPermission:r,canModify:s,t},ee.id))})})})]}),V.length>0&&a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Nr,{className:"w-5 h-5 text-bambu-gray"}),t("queue.sections.history"),a.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",t("queue.itemCount",{count:V.length}),")"]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("select",{className:"px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:P,onChange:ee=>T(ee.target.value),children:[a.jsx("option",{value:"date",children:t("queue.sort.byDate")}),a.jsx("option",{value:"name",children:t("queue.sort.byName")}),a.jsx("option",{value:"printer",children:t("queue.sort.byPrinter")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>z(!j),title:t(j?"queue.sort.ascendingOldest":"queue.sort.descendingNewest"),className:"px-2",children:j?a.jsx(Zg,{className:"w-4 h-4"}):a.jsx(ay,{className:"w-4 h-4"})})]})]}),a.jsx("div",{className:"space-y-3",children:V.slice(0,20).map((ee,U)=>a.jsx(gP,{item:ee,position:U+1,onEdit:()=>{},onCancel:()=>{},onRemove:()=>N({type:"remove",item:ee}),onStop:()=>{},onRequeue:()=>y(ee),onStart:()=>{},timeFormat:G,hasPermission:r,canModify:s,t},ee.id))})]})]}),b&&a.jsx(Fu,{mode:"edit-queue-item",archiveId:b.archive_id??void 0,libraryFileId:b.library_file_id??void 0,archiveName:b.archive_name||b.library_file_name||`File #${b.archive_id||b.library_file_id}`,queueItem:b,onClose:()=>v(null)}),x&&a.jsx(Fu,{mode:"add-to-queue",archiveId:x.archive_id??void 0,libraryFileId:x.library_file_id??void 0,archiveName:x.archive_name||x.library_file_name||`File #${x.archive_id||x.library_file_id}`,onClose:()=>y(null)}),S&&a.jsx(er,{title:S.type==="cancel"?t("queue.confirm.cancelTitle"):S.type==="stop"?t("queue.confirm.stopTitle"):t("queue.confirm.removeTitle"),message:S.type==="cancel"?t("queue.confirm.cancelMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisPrint")}):S.type==="stop"?t("queue.confirm.stopMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisPrint")}):t("queue.confirm.removeMessage",{name:S.item.archive_name||S.item.library_file_name||t("queue.confirm.thisItem")}),confirmText:S.type==="cancel"?t("queue.confirm.cancelButton"):S.type==="stop"?t("queue.confirm.stopButton"):t("common.remove"),variant:"danger",onConfirm:()=>{S.type==="cancel"?K.mutate(S.item.id):S.type==="stop"?ie.mutate(S.item.id):ne.mutate(S.item.id),N(null)},onCancel:()=>N(null)}),m&&a.jsx(er,{title:t("queue.confirm.clearHistoryTitle"),message:t("queue.confirm.clearHistoryMessage",{count:V.length}),confirmText:t("queue.clearHistory"),variant:"danger",onConfirm:()=>{de.mutate(),p(!1)},onCancel:()=>p(!1)}),C&&a.jsx(EYe,{selectedCount:A.length,printers:H?.map(ee=>({id:ee.id,name:ee.name}))||[],onSave:ee=>{Object.keys(ee).length>0&&Ce.mutate({item_ids:A,...ee})},onClose:()=>E(!1),isSaving:Ce.isPending,t})]})}function TYe({printDates:t,months:e=3}){const n=_.useRef(null),[r,i]=_.useState(0);_.useEffect(()=>{const S=n.current;if(!S)return;const N=new ResizeObserver(A=>{const k=A[0]?.contentRect.width||0;i(k)});return N.observe(S),()=>N.disconnect()},[]);const{weeks:s,monthLabels:o,printCounts:l}=_.useMemo(()=>{const S={};t.forEach(z=>{const L=z.split("T")[0];S[L]=(S[L]||0)+1});const N=new Date,A=new Date(N);A.setMonth(A.getMonth()-e),A.setDate(A.getDate()-A.getDay());const k=[],C=[];let E=[],P=-1;const T=new Date(A);let j=0;for(;T<=N;)T.getDay()===0&&E.length>0&&(k.push(E),E=[],j++),T.getMonth()!==P&&(C.push({month:T.toLocaleDateString("en-US",{month:"short"}),weekIndex:j}),P=T.getMonth()),E.push(new Date(T)),T.setDate(T.getDate()+1);return E.length>0&&k.push(E),{weeks:k,monthLabels:C,printCounts:S}},[t,e]),c=Math.max(1,...Object.values(l)),u=S=>{if(S===0)return"bg-bambu-dark";const N=S/c;return N<=.25?"bg-bambu-green/30":N<=.5?"bg-bambu-green/50":N<=.75?"bg-bambu-green/75":"bg-bambu-green"},d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h=s.length,m=32,p=2,b=r-m-16,v=h>0?Math.floor((b-(h-1)*p)/h):12,x=Math.max(8,Math.min(20,v)),y=x<=10?10:12;return a.jsx("div",{ref:n,className:"w-full flex justify-center",children:r>0&&a.jsxs("div",{children:[a.jsx("div",{className:"flex mb-1",style:{marginLeft:m+4},children:o.map(({month:S,weekIndex:N},A)=>a.jsx("div",{className:"text-bambu-gray",style:{fontSize:y,marginLeft:A===0?0:`${(N-(o[A-1]?.weekIndex||0))*(x+p)-24}px`},children:S},A))}),a.jsxs("div",{className:"flex",style:{gap:p},children:[a.jsx("div",{className:"flex flex-col",style:{gap:p,marginRight:4,width:m},children:d.map((S,N)=>a.jsx("div",{className:"text-bambu-gray flex items-center",style:{width:m,height:x,fontSize:y,visibility:N%2===1?"visible":"hidden"},children:S},S))}),s.map((S,N)=>a.jsx("div",{className:"flex flex-col",style:{gap:p},children:[0,1,2,3,4,5,6].map(A=>{const k=S.find(T=>T.getDay()===A);if(!k)return a.jsx("div",{style:{width:x,height:x}},A);const C=k.toISOString().split("T")[0],E=l[C]||0,P=C===new Date().toISOString().split("T")[0];return a.jsx("div",{className:`rounded-sm ${u(E)} ${P?"ring-1 ring-white":""}`,style:{width:x,height:x},title:`${k.toLocaleDateString()}: ${E} print${E!==1?"s":""}`},A)})},N))]}),a.jsxs("div",{className:"flex items-center gap-2 mt-3 text-bambu-gray",style:{fontSize:y},children:[a.jsx("span",{children:"Less"}),a.jsxs("div",{className:"flex",style:{gap:p},children:[a.jsx("div",{className:"rounded-sm bg-bambu-dark",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/30",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/50",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green/75",style:{width:x,height:x}}),a.jsx("div",{className:"rounded-sm bg-bambu-green",style:{width:x,height:x}})]}),a.jsx("span",{children:"More"})]})]})})}const E1=["#00ae42","#3b82f6","#f59e0b","#ef4444","#8b5cf6","#ec4899","#14b8a6","#f97316"];function CYe(t){const e=new Date;switch(t){case"7d":return new Date(e.getTime()-10080*60*1e3);case"30d":return new Date(e.getTime()-720*60*60*1e3);case"90d":return new Date(e.getTime()-2160*60*60*1e3);case"365d":return new Date(e.getTime()-365*24*60*60*1e3);case"all":return new Date(0)}}function jYe({archives:t,currency:e="$"}){const[n,r]=_.useState("30d"),i=_.useMemo(()=>{const p=CYe(n);return t.filter(b=>(Hi(b.completed_at||b.created_at)||new Date(0))>=p)},[t,n]),s=_.useMemo(()=>{const p=new Map;return i.forEach(b=>{const v=Hi(b.completed_at||b.created_at)||new Date,x=`${v.getFullYear()}-${String(v.getMonth()+1).padStart(2,"0")}-${String(v.getDate()).padStart(2,"0")}`,y=p.get(x)||{date:x,filament:0,cost:0,prints:0},S=b.quantity||1;y.filament+=(b.filament_used_grams||0)*S,y.cost+=b.cost||0,y.prints+=S,p.set(x,y)}),Array.from(p.values()).sort((b,v)=>b.date.localeCompare(v.date)).map(b=>({...b,dateLabel:new Date(b.date).toLocaleDateString("en-US",{month:"short",day:"numeric"})}))},[i]),o=_.useMemo(()=>{if(n==="7d"||n==="30d")return s;const p=new Map;return i.forEach(b=>{const v=Hi(b.completed_at||b.created_at)||new Date,x=new Date(v);x.setDate(v.getDate()-v.getDay());const y=`${x.getFullYear()}-${String(x.getMonth()+1).padStart(2,"0")}-${String(x.getDate()).padStart(2,"0")}`,S=p.get(y)||{week:y,filament:0,cost:0,prints:0},N=b.quantity||1;S.filament+=(b.filament_used_grams||0)*N,S.cost+=b.cost||0,S.prints+=N,p.set(y,S)}),Array.from(p.values()).sort((b,v)=>b.week.localeCompare(v.week)).map(b=>({date:b.week,dateLabel:`Week of ${new Date(b.week).toLocaleDateString("en-US",{month:"short",day:"numeric"})}`,...b}))},[i,s,n]),l=_.useMemo(()=>{const p=new Map;return i.forEach(b=>{const v=b.filament_type||"Unknown",x=b.quantity||1,y=v.split(", ");y.forEach(S=>{const N=(b.filament_used_grams||0)*x/y.length;p.set(S,(p.get(S)||0)+N)})}),Array.from(p.entries()).map(([b,v])=>({name:b,value:Math.round(v)})).sort((b,v)=>v.value-b.value)},[i]),c=_.useMemo(()=>{const p=new Date,b=[];for(let v=5;v>=0;v--){const x=new Date(p.getFullYear(),p.getMonth()-v,1),y=new Date(p.getFullYear(),p.getMonth()-v+1,0),S=x.toLocaleDateString("en-US",{month:"short",year:"2-digit"}),N=t.filter(A=>{const k=Hi(A.completed_at||A.created_at)||new Date(0);return k>=x&&k<=y});b.push({month:S,filament:Math.round(N.reduce((A,k)=>A+(k.filament_used_grams||0),0)),cost:N.reduce((A,k)=>A+(k.cost||0),0),prints:N.reduce((A,k)=>A+(k.quantity||1),0)})}return b},[t]),u=n==="7d"||n==="30d"?s:o,d=i.reduce((p,b)=>p+(b.filament_used_grams||0),0),h=i.reduce((p,b)=>p+(b.cost||0),0),m=i.reduce((p,b)=>p+(b.quantity||1),0);return a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:"Filament Usage Trends"}),a.jsx("div",{className:"flex gap-1 bg-bambu-dark rounded-lg p-1",children:["7d","30d","90d","365d","all"].map(p=>a.jsx("button",{onClick:()=>r(p),className:`px-3 py-1 text-sm rounded-md transition-colors ${n===p?"bg-bambu-green text-white":"text-bambu-gray hover:text-white"}`,children:p==="all"?"All":p.replace("d","D")},p))})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Period Filament"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[(d/1e3).toFixed(2),"kg"]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[d.toFixed(0),"g total"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Period Cost"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[e,h.toFixed(2)]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[m," prints"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Avg per Print"}),a.jsxs("p",{className:"text-2xl font-bold text-white",children:[m>0?(d/m).toFixed(0):0,"g"]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[e,m>0?(h/m).toFixed(2):"0.00"," avg"]})]})]}),u.length>0?a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"Usage Over Time"}),a.jsx(W1,{width:"100%",height:250,children:a.jsxs(A6e,{data:u,children:[a.jsx("defs",{children:a.jsxs("linearGradient",{id:"colorFilament",x1:"0",y1:"0",x2:"0",y2:"1",children:[a.jsx("stop",{offset:"5%",stopColor:"#00ae42",stopOpacity:.3}),a.jsx("stop",{offset:"95%",stopColor:"#00ae42",stopOpacity:0})]})}),a.jsx(_N,{strokeDasharray:"3 3",stroke:"#3d3d3d"}),a.jsx(kN,{dataKey:"dateLabel",stroke:"#9ca3af",tick:{fontSize:12},interval:"preserveStartEnd"}),a.jsx(EN,{stroke:"#9ca3af",tick:{fontSize:12},tickFormatter:p=>`${p}g`}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},labelStyle:{color:"#fff"},formatter:p=>[`${Number(p??0).toFixed(0)}g`,"Filament"]}),a.jsx(fte,{type:"monotone",dataKey:"filament",stroke:"#00ae42",strokeWidth:2,fillOpacity:1,fill:"url(#colorFilament)"})]})})]}):a.jsx("div",{className:"bg-bambu-dark rounded-lg p-8 text-center text-bambu-gray",children:"No data for selected time range"}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"By Filament Type"}),l.length>0?a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx(W1,{width:160,height:160,children:a.jsxs(k6e,{children:[a.jsx(Uee,{data:l,cx:"50%",cy:"50%",innerRadius:40,outerRadius:70,paddingAngle:2,dataKey:"value",children:l.map((p,b)=>a.jsx(kv,{fill:E1[b%E1.length]},`cell-${b}`))}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},formatter:p=>[`${p??0}g`,"Usage"]})]})}),a.jsx("div",{className:"flex-1 space-y-2 overflow-hidden",children:l.map((p,b)=>{const v=l.reduce((y,S)=>y+S.value,0),x=v>0?(p.value/v*100).toFixed(0):0;return a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx("div",{className:"w-3 h-3 rounded-sm flex-shrink-0",style:{backgroundColor:E1[b%E1.length]}}),a.jsx("span",{className:"text-white truncate flex-1",children:p.name}),a.jsxs("span",{className:"text-bambu-gray flex-shrink-0",children:[x,"%"]})]},p.name)})})]}):a.jsx("div",{className:"h-[160px] flex items-center justify-center text-bambu-gray",children:"No filament data"})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-4",children:[a.jsx("h4",{className:"text-sm font-medium text-bambu-gray mb-4",children:"Monthly Comparison"}),a.jsx(W1,{width:"100%",height:200,children:a.jsxs(m6e,{data:c,children:[a.jsx(_N,{strokeDasharray:"3 3",stroke:"#3d3d3d"}),a.jsx(kN,{dataKey:"month",stroke:"#9ca3af",tick:{fontSize:12}}),a.jsx(EN,{stroke:"#9ca3af",tick:{fontSize:12},tickFormatter:p=>`${p}g`}),a.jsx(X1,{contentStyle:{backgroundColor:"#2d2d2d",border:"1px solid #3d3d3d",borderRadius:"8px"},formatter:(p,b)=>[b==="filament"?`${p??0}g`:b==="cost"?`${e}${Number(p??0).toFixed(2)}`:p??0,b==="filament"?"Filament":b==="cost"?"Cost":"Prints"]}),a.jsx(b4,{}),a.jsx(xte,{dataKey:"filament",name:"Filament (g)",fill:"#00ae42",radius:[4,4,0,0]})]})})]})]})]})}function PYe({id:t,title:e,component:n,isHidden:r,size:i,onToggleVisibility:s,onToggleSize:o}){const{attributes:l,listeners:c,setNodeRef:u,transform:d,transition:h,isDragging:m}=aae({id:t}),p={transform:Eb.Transform.toString(d),transition:h,opacity:m?.5:1};return r?null:a.jsxs("div",{ref:u,style:{...p,gridColumn:`span ${i}`},className:`bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary overflow-hidden ${m?"ring-2 ring-bambu-green shadow-lg":""}`,children:[a.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/30",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{...l,...c,className:"cursor-grab active:cursor-grabbing p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:"Drag to reorder",children:a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray"})}),a.jsx("h3",{className:"text-sm font-medium text-white",children:e})]}),a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("button",{onClick:o,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:`Size: ${i===1?"1/4":i===2?"1/2":"Full"} - Click to cycle`,children:i===4?a.jsx(lO,{className:"w-4 h-4 text-bambu-gray hover:text-white"}):a.jsx(oO,{className:"w-4 h-4 text-bambu-gray hover:text-white"})}),a.jsx("button",{onClick:s,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",title:"Hide widget",children:a.jsx(RM,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]})]}),a.jsx("div",{className:"p-4",children:typeof n=="function"?n(i):n})]})}function DYe({widgets:t,storageKey:e,columns:n=4,hideControls:r=!1,onResetLayout:i,renderControls:s}){const o=()=>{const A={};return t.forEach(k=>{A[k.id]=k.defaultSize||4}),A},[l,c]=_.useState(()=>{const A=localStorage.getItem(e);if(A)try{const k=JSON.parse(A);return k.sizes||(k.sizes=o()),k}catch{}return{order:t.map(k=>k.id),hidden:t.filter(k=>k.defaultVisible===!1).map(k=>k.id),sizes:o()}}),[u,d]=_.useState(!1);_.useEffect(()=>{const A=()=>d(k=>!k);return window.addEventListener("toggle-hidden-panel",A),()=>window.removeEventListener("toggle-hidden-panel",A)},[]),_.useEffect(()=>{localStorage.setItem(e,JSON.stringify(l))},[l,e]),_.useEffect(()=>{const k=t.map(C=>C.id).filter(C=>!l.order.includes(C));k.length>0&&c(C=>({...C,order:[...C.order,...k]}))},[t,l.order]);const h=Fie(NM(pk,{activationConstraint:{distance:8}}),NM(mk,{coordinateGetter:sae})),m=A=>{const{active:k,over:C}=A;C&&k.id!==C.id&&c(E=>{const P=E.order.indexOf(k.id),T=E.order.indexOf(C.id);return{...E,order:xk(E.order,P,T)}})},p=A=>{c(k=>({...k,hidden:k.hidden.includes(A)?k.hidden.filter(C=>C!==A):[...k.hidden,A]}))},b=A=>{c(k=>{const C=k.sizes[A]||4,E=C===1?2:C===2?4:1;return{...k,sizes:{...k.sizes,[A]:E}}})},v=()=>{const A={order:t.map(k=>k.id),hidden:t.filter(k=>k.defaultVisible===!1).map(k=>k.id),sizes:o()};c(A),i?.()},x=l.order.map(A=>t.find(k=>k.id===A)).filter(Boolean),y=x.filter(A=>!l.hidden.includes(A.id)),S=x.filter(A=>l.hidden.includes(A.id)),N=s?.({hiddenCount:S.length,showHiddenPanel:u,setShowHiddenPanel:d,resetLayout:v});return a.jsxs("div",{className:"space-y-4",children:[N,!r&&!s&&a.jsxs("div",{className:"flex items-center justify-end gap-2",children:[a.jsxs(ke,{variant:"secondary",size:"sm",onClick:v,children:[a.jsx($h,{className:"w-4 h-4"}),"Reset Layout"]}),S.length>0&&a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>d(!u),children:[a.jsx(_c,{className:"w-4 h-4"}),S.length," Hidden"]})]}),u&&S.length>0&&a.jsxs("div",{className:"p-4 bg-bambu-dark rounded-xl border border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-3",children:"Hidden widgets (click to show):"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:S.map(A=>a.jsxs("button",{onClick:()=>p(A.id),className:"px-3 py-1.5 bg-bambu-dark-tertiary hover:bg-bambu-green/20 rounded-lg text-sm text-white transition-colors flex items-center gap-2",children:[a.jsx(_c,{className:"w-3 h-3"}),A.title]},A.id))})]}),a.jsx(eae,{sensors:h,collisionDetection:Bie,onDragEnd:m,children:a.jsx(rae,{items:y.map(A=>A.id),strategy:BF,children:a.jsx("div",{className:"grid gap-6",style:{gridTemplateColumns:`repeat(${n}, minmax(0, 1fr))`},children:y.map(A=>a.jsx(PYe,{id:A.id,title:A.title,component:A.component,isHidden:l.hidden.includes(A.id),size:l.sizes[A.id]||2,onToggleVisibility:()=>p(A.id),onToggleSize:()=>b(A.id)},A.id))})})}),y.length===0&&a.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[a.jsx("p",{children:"All widgets are hidden."}),a.jsx(ke,{className:"mt-4",onClick:v,children:"Reset Layout"})]})]})}function RYe({stats:t,currency:e,t:n}){return a.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-bambu-green",children:a.jsx(Sc,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.totalPrints")}),a.jsx("p",{className:"text-xl font-bold text-white",children:t?.total_prints||0})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-blue-400",children:a.jsx(nr,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.printTime")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[t?.total_print_time_hours.toFixed(1)||0,"h"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-orange-400",children:a.jsx(Sc,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.filamentUsed")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[((t?.total_filament_grams||0)/1e3).toFixed(2),"kg"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-green-400",children:a.jsx(zP,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.filamentCost")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[e," ",t?.total_cost.toFixed(2)||"0.00"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-yellow-400",children:a.jsx(Dh,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.energyUsed")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[t?.total_energy_kwh.toFixed(2)||"0.00"," kWh"]})]})]}),a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark text-yellow-500",children:a.jsx(zP,{className:"w-5 h-5"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:n("stats.energyCost")}),a.jsxs("p",{className:"text-xl font-bold text-white",children:[e," ",t?.total_energy_cost.toFixed(2)||"0.00"]})]})]})]})}function OYe({stats:t,printerMap:e,size:n=1,t:r}){const i=t?.total_prints?Math.round(t.successful_prints/t.total_prints*100):0,s=n===1?112:n===2?128:144,o=s/2-8,l=o*2*Math.PI;return a.jsxs("div",{className:"flex items-center gap-6",children:[a.jsxs("div",{className:"relative flex-shrink-0",style:{width:s,height:s},children:[a.jsxs("svg",{className:"w-full h-full -rotate-90",children:[a.jsx("circle",{cx:s/2,cy:s/2,r:o,fill:"none",stroke:"#3d3d3d",strokeWidth:"10"}),a.jsx("circle",{cx:s/2,cy:s/2,r:o,fill:"none",stroke:"#00ae42",strokeWidth:"10",strokeLinecap:"round",strokeDasharray:`${i/100*l} ${l}`})]}),a.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:a.jsxs("span",{className:`font-bold text-white ${n>=2?"text-2xl":"text-xl"}`,children:[i,"%"]})})]}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-status-ok flex-shrink-0"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:r("stats.successful")}),a.jsx("span",{className:"text-sm text-white font-medium",children:t?.successful_prints||0})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ta,{className:"w-4 h-4 text-status-error flex-shrink-0"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:r("stats.failed")}),a.jsx("span",{className:"text-sm text-white font-medium",children:t?.failed_prints||0})]})]}),n>=2&&t?.prints_by_printer&&Object.keys(t.prints_by_printer).length>0&&a.jsxs("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-xs text-bambu-gray font-medium mb-2",children:r("stats.printsByPrinter")}),a.jsx("div",{className:`grid gap-x-6 gap-y-1 ${n===4?"grid-cols-3":"grid-cols-2"}`,style:{width:"fit-content"},children:Object.entries(t.prints_by_printer).map(([c,u])=>a.jsxs("div",{className:"flex items-center gap-3 text-sm",children:[a.jsx("span",{className:"text-bambu-gray truncate max-w-[120px]",children:e.get(c)||`${r("common.printer")} ${c}`}),a.jsx("span",{className:"text-white font-medium",children:u})]},c))})]})]})]})}function LYe({stats:t,printerMap:e,size:n=1,t:r}){const i=t?.average_time_accuracy;if(i==null)return a.jsx("div",{className:"flex items-center justify-center h-full",children:a.jsx("p",{className:"text-bambu-gray text-center py-4",children:r("stats.noTimeAccuracyData")})});const o=(Math.min(150,Math.max(50,i))-50)/100*100,c=(v=>v>=95&&v<=105?"#00ae42":v>105?"#3b82f6":"#f97316")(i),u=i-100,d=n===1?112:n===2?128:144,h=d/2-8,m=h*2*Math.PI,p=n===1?3:n===2?6:999,b=t?.time_accuracy_by_printer?Object.entries(t.time_accuracy_by_printer).slice(0,p):[];return a.jsxs("div",{className:"flex items-center gap-6",children:[a.jsxs("div",{className:"relative flex-shrink-0",style:{width:d,height:d},children:[a.jsxs("svg",{className:"w-full h-full -rotate-90",children:[a.jsx("circle",{cx:d/2,cy:d/2,r:h,fill:"none",stroke:"#3d3d3d",strokeWidth:"10"}),a.jsx("circle",{cx:d/2,cy:d/2,r:h,fill:"none",stroke:c,strokeWidth:"10",strokeLinecap:"round",strokeDasharray:`${o/100*m} ${m}`})]}),a.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[a.jsxs("span",{className:`font-bold text-white ${n>=2?"text-2xl":"text-xl"}`,children:[i.toFixed(0),"%"]}),a.jsxs("span",{className:`text-xs ${u>=0?"text-blue-400":"text-orange-400"}`,children:[u>=0?"+":"",u.toFixed(0),"%"]})]})]}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2 text-xs text-bambu-gray",children:[a.jsx($K,{className:"w-3 h-3 flex-shrink-0"}),a.jsx("span",{children:r("stats.perfectEstimate")})]}),b.length>0&&a.jsx("div",{className:`mt-2 ${n===4?"grid grid-cols-3 gap-x-6 gap-y-1":n===2?"grid grid-cols-2 gap-x-6 gap-y-1":"space-y-1"}`,style:{width:"fit-content"},children:b.map(([v,x])=>a.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[a.jsx("span",{className:"text-bambu-gray truncate max-w-[100px]",children:e.get(v)||`${r("common.printer")} ${v}`}),a.jsxs("span",{className:`font-medium ${x>=95&&x<=105?"text-status-ok":x>105?"text-blue-400":"text-status-warning"}`,children:[x.toFixed(0),"%"]})]},v))})]})]})}function FYe({stats:t,size:e=1,t:n}){if(!t?.prints_by_filament_type||Object.keys(t.prints_by_filament_type).length===0)return a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noFilamentData")});const r=Object.entries(t.prints_by_filament_type).sort(([,l],[,c])=>c-l),i=e===1?5:e===2?8:999,s=r.slice(0,i),o=r.length>i;return e===4&&s.length>4?a.jsx("div",{className:"grid grid-cols-2 lg:grid-cols-3 gap-4",children:s.map(([l,c])=>{const u=Math.round(c/(t.total_prints||1)*100);return a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[a.jsx("span",{className:"text-white truncate max-w-[120px]",children:l}),a.jsx("span",{className:"text-bambu-gray",children:c})]}),a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full",children:a.jsx("div",{className:"h-full bg-bambu-green rounded-full transition-all",style:{width:`${u}%`}})})]},l)})}):a.jsxs("div",{className:"space-y-3",children:[s.map(([l,c])=>{const u=Math.round(c/(t.total_prints||1)*100);return a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[a.jsx("span",{className:"text-white",children:l}),a.jsxs("span",{className:"text-bambu-gray",children:[c," ",n("common.prints")]})]}),a.jsx("div",{className:"h-2 bg-bambu-dark rounded-full",children:a.jsx("div",{className:"h-full bg-bambu-green rounded-full transition-all",style:{width:`${u}%`}})})]},l)}),o&&a.jsx("p",{className:"text-xs text-bambu-gray text-center pt-1",children:n("common.more",{count:r.length-i})})]})}function IYe({printDates:t,size:e=2}){const n=e===1?3:e===2?6:12;return a.jsx(TYe,{printDates:t,months:n})}function UYe({stats:t,printerMap:e,t:n}){return!t?.prints_by_printer||Object.keys(t.prints_by_printer).length===0?a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noPrinterData")}):a.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:Object.entries(t.prints_by_printer).map(([r,i])=>a.jsxs("div",{className:"flex items-center gap-3 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("div",{className:"p-2 bg-bambu-dark-tertiary rounded-lg",children:a.jsx(Or,{className:"w-4 h-4 text-bambu-green"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium text-sm",children:e.get(r)||`${n("common.printer")} ${r}`}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[i," ",n("common.prints")]})]})]},r))})}function zYe({archives:t,currency:e,t:n}){return!t||t.length===0?a.jsx("p",{className:"text-bambu-gray text-center py-4",children:n("stats.noPrintData")}):a.jsx(jYe,{archives:t,currency:e})}function BYe({size:t=1,t:e}){const{data:n,isLoading:r}=st({queryKey:["failureAnalysis"],queryFn:()=>ce.getFailureAnalysis({days:30})});if(r)return a.jsx("div",{className:"flex justify-center py-4",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})});if(!n||n.total_prints===0)return a.jsx("p",{className:"text-bambu-gray text-center py-4",children:e("stats.noPrintDataLast30Days")});const i=t===1?5:t===2?8:999,s=Object.entries(n.failures_by_reason).sort(([,c],[,u])=>u-c),o=s.slice(0,i),l=s.length>i;return a.jsxs("div",{className:`${t>=2?"flex gap-8":"space-y-4"}`,children:[a.jsxs("div",{className:t>=2?"flex-shrink-0":"",children:[a.jsx("div",{className:"flex items-center gap-4",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(kn,{className:`w-5 h-5 ${n.failure_rate>20?"text-status-error":n.failure_rate>10?"text-status-warning":"text-status-ok"}`}),a.jsxs("span",{className:`font-bold text-white ${t>=2?"text-3xl":"text-2xl"}`,children:[n.failure_rate.toFixed(1),"%"]})]})}),a.jsx("div",{className:"text-sm text-bambu-gray mt-1",children:e("stats.failedPrintsCount",{failed:n.failed_prints,total:n.total_prints})}),n.trend&&n.trend.length>=2&&a.jsx("div",{className:`${t>=2?"mt-4":"mt-2 pt-2 border-t border-bambu-dark-tertiary"}`,children:a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx(GK,{className:`w-4 h-4 ${n.trend[n.trend.length-1].failure_rate0&&a.jsxs("div",{className:`flex-1 ${t>=2?"border-l border-bambu-dark-tertiary pl-8":"pt-2"}`,children:[a.jsx("p",{className:"text-xs text-bambu-gray font-medium mb-2",children:t>=2?e("stats.failureReasons"):e("stats.topFailureReasons")}),a.jsx("div",{className:`${t===4?"grid grid-cols-2 gap-x-6 gap-y-1":"space-y-1"}`,children:o.map(([c,u])=>a.jsxs("div",{className:"flex items-center justify-between text-sm",children:[a.jsx("span",{className:`text-white truncate ${t===4?"max-w-[200px]":"max-w-[160px]"}`,children:c||e("common.unknown")}),a.jsx("span",{className:"text-bambu-gray ml-2",children:u})]},c))}),l&&a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:e("common.more",{count:s.length-i})})]})]})}function HYe(){const{t}=Sn(),{showToast:e}=Hn(),{hasPermission:n}=Di(),[r,i]=_.useState(!1),[s,o]=_.useState(!1),[l,c]=_.useState(0),[u,d]=_.useState(0),[h,m]=_.useState(!1);_.useEffect(()=>{const T=()=>{try{const z=localStorage.getItem("bambusy-dashboard-layout");if(z){const L=JSON.parse(z);d(L.hidden?.length||0)}}catch{d(0)}};T(),window.addEventListener("storage",T);const j=setInterval(T,500);return()=>{window.removeEventListener("storage",T),clearInterval(j)}},[l]);const{data:p,isLoading:b,refetch:v}=st({queryKey:["archiveStats"],queryFn:ce.getArchiveStats}),{data:x}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:y}=st({queryKey:["archives"],queryFn:()=>ce.getArchives(void 0,void 0,1e3,0)}),{data:S}=st({queryKey:["settings"],queryFn:ce.getSettings}),N=async T=>{o(!1),i(!0);try{const{blob:j,filename:z}=await ce.exportStats({format:T,days:90}),L=URL.createObjectURL(j),B=document.createElement("a");B.href=L,B.download=z,B.click(),URL.revokeObjectURL(L),e(t("stats.exportDownloaded"))}catch{e(t("stats.exportFailed"),"error")}finally{i(!1)}},A=async()=>{m(!0);try{const T=await ce.recalculateCosts();await v(),e(t("stats.recalculatedCosts",{count:T.updated}))}catch{e(t("stats.recalculateFailed"),"error")}finally{m(!1)}},k=S?.currency||"$",C=new Map(x?.map(T=>[String(T.id),T.name])||[]),E=y?.map(T=>T.created_at)||[];if(b)return a.jsx("div",{className:"p-4 md:p-8",children:a.jsx("div",{className:"text-center py-12 text-bambu-gray",children:t("stats.loadingStats")})});const P=[{id:"quick-stats",title:t("stats.quickStats"),component:a.jsx(RYe,{stats:p,currency:k,t}),defaultSize:2},{id:"success-rate",title:t("stats.successRate"),component:T=>a.jsx(OYe,{stats:p,printerMap:C,size:T,t}),defaultSize:1},{id:"time-accuracy",title:t("stats.timeAccuracy"),component:T=>a.jsx(LYe,{stats:p,printerMap:C,size:T,t}),defaultSize:1},{id:"filament-types",title:t("stats.filamentTypes"),component:T=>a.jsx(FYe,{stats:p,size:T,t}),defaultSize:1},{id:"failure-analysis",title:t("stats.failureAnalysis"),component:T=>a.jsx(BYe,{size:T,t}),defaultSize:1},{id:"print-activity",title:t("stats.printActivity"),component:T=>a.jsx(IYe,{printDates:E,size:T}),defaultSize:2},{id:"prints-by-printer",title:t("stats.printsByPrinter"),component:a.jsx(UYe,{stats:p,printerMap:C,t}),defaultSize:2},{id:"filament-trends",title:t("stats.filamentTrends"),component:a.jsx(zYe,{archives:y||[],currency:k,t}),defaultSize:4}];return a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-white",children:t("stats.title")}),a.jsx("p",{className:"text-bambu-gray",children:t("stats.subtitle")})]}),a.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[u>0&&a.jsxs(ke,{variant:"secondary",onClick:()=>{window.dispatchEvent(new CustomEvent("toggle-hidden-panel"))},children:[a.jsx(_c,{className:"w-4 h-4"}),t("stats.hiddenCount",{count:u})]}),a.jsxs(ke,{variant:"secondary",onClick:()=>{localStorage.removeItem("bambusy-dashboard-layout"),c(T=>T+1),e(t("stats.layoutReset"))},disabled:!n("settings:update"),title:n("settings:update")?void 0:t("stats.noPermissionResetLayout"),children:[a.jsx($h,{className:"w-4 h-4"}),t("stats.resetLayout")]}),a.jsxs(ke,{variant:"secondary",onClick:A,disabled:h||!n("archives:update_all"),title:n("archives:update_all")?t("stats.recalculateCostsHint"):t("stats.noPermissionRecalculate"),children:[h?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(rde,{className:"w-4 h-4"}),t("stats.recalculateCosts")]}),a.jsxs("div",{className:"relative",children:[a.jsxs(ke,{variant:"secondary",onClick:()=>o(!s),disabled:r,children:[r?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(dS,{className:"w-4 h-4"}),t("stats.exportStats")]}),s&&a.jsxs("div",{className:"absolute right-0 top-full mt-1 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20",children:[a.jsxs("button",{className:"w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-t-lg",onClick:()=>N("csv"),children:[a.jsx(ps,{className:"w-4 h-4"}),t("stats.exportAsCsv")]}),a.jsxs("button",{className:"w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-b-lg",onClick:()=>N("xlsx"),children:[a.jsx(dS,{className:"w-4 h-4"}),t("stats.exportAsExcel")]})]})]})]})]}),a.jsx(DYe,{widgets:P,storageKey:"bambusy-dashboard-layout",hideControls:!0},l)]})}function $Ye({plug:t,onEdit:e}){const n=un(),{showToast:r}=Hn(),[i,s]=_.useState(!1),[o,l]=_.useState(!1),[c,u]=_.useState(!1),[d,h]=_.useState(!1),{data:m,isLoading:p}=st({queryKey:["smart-plug-status",t.id],queryFn:()=>ce.getSmartPlugStatus(t.id),refetchInterval:3e4}),{data:b}=st({queryKey:["printers"],queryFn:ce.getPrinters}),v=b?.find(T=>T.id===t.printer_id),x=pt({mutationFn:T=>ce.controlSmartPlug(t.id,T),onMutate:async T=>{await n.cancelQueries({queryKey:["smart-plug-status",t.id]});const j=n.getQueryData(["smart-plug-status",t.id]),z=T==="on"?"ON":T==="off"||m?.state==="ON"?"OFF":"ON";return n.setQueryData(["smart-plug-status",t.id],L=>({...L,state:z})),{previousStatus:j}},onError:(T,j,z)=>{z?.previousStatus&&n.setQueryData(["smart-plug-status",t.id],z.previousStatus),r(`Failed to turn ${j} "${t.name}"`,"error")},onSettled:()=>{setTimeout(()=>{n.invalidateQueries({queryKey:["smart-plug-status",t.id]}),n.invalidateQueries({queryKey:["smart-plugs"]})},1e3)}}),y=pt({mutationFn:T=>ce.updateSmartPlug(t.id,T),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),t.printer_id&&(n.invalidateQueries({queryKey:["smartPlugByPrinter",t.printer_id]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter",t.printer_id]}))}}),S=pt({mutationFn:()=>ce.deleteSmartPlug(t.id),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),t.printer_id&&n.invalidateQueries({queryKey:["scriptPlugsByPrinter",t.printer_id]})}}),N=m?.state==="ON",A=t.plug_type==="mqtt"&&m?.energy?.power!==null&&m?.energy?.power!==void 0,k=(m?.reachable??!1)||A,C=x.isPending,P=(()=>{if(t.plug_type!=="tasmota"||!t.ip_address)return null;const T=t.ip_address;return t.username&&t.password?`http://${encodeURIComponent(t.username)}:${encodeURIComponent(t.password)}@${T}/`:`http://${T}/`})();return a.jsxs(a.Fragment,{children:[a.jsx(_t,{className:"relative",children:a.jsxs(Mt,{className:"p-4",children:[a.jsxs("div",{className:"flex items-start justify-between gap-2 mb-3",children:[a.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[a.jsx("div",{className:`p-2 rounded-lg flex-shrink-0 ${t.plug_type==="mqtt"?k?"bg-teal-500/20":"bg-red-500/20":k?N?"bg-bambu-green/20":"bg-bambu-dark":"bg-red-500/20"}`,children:t.plug_type==="mqtt"?a.jsx(cO,{className:`w-5 h-5 ${k?"text-teal-400":"text-red-400"}`}):t.plug_type==="homeassistant"?a.jsx(Jy,{className:`w-5 h-5 ${k?N?"text-bambu-green":"text-bambu-gray":"text-red-400"}`}):a.jsx(rl,{className:`w-5 h-5 ${k?N?"text-bambu-green":"text-bambu-gray":"text-red-400"}`})}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("h3",{className:"font-medium text-white truncate",children:t.name}),a.jsx("p",{className:"text-sm text-bambu-gray truncate",title:t.plug_type==="mqtt"?t.mqtt_topic??void 0:t.plug_type==="homeassistant"?t.ha_entity_id??void 0:t.ip_address??void 0,children:t.plug_type==="mqtt"?t.mqtt_topic:t.plug_type==="homeassistant"?t.ha_entity_id:t.ip_address})]})]}),a.jsxs("div",{className:"flex flex-col items-end gap-1 flex-shrink-0",children:[p?a.jsx(ut,{className:"w-4 h-4 text-bambu-gray animate-spin"}):t.plug_type==="mqtt"?a.jsxs("div",{className:"flex items-center gap-1.5 text-sm whitespace-nowrap",children:[a.jsx("span",{className:"px-1.5 py-0.5 bg-teal-500/20 text-teal-400 text-[10px] font-medium rounded flex-shrink-0",children:"MQTT"}),k&&a.jsx("span",{className:"text-status-ok",children:"✓"})]}):t.plug_type==="homeassistant"?a.jsxs("div",{className:"flex items-center gap-1 text-sm",children:[a.jsx("span",{className:"px-1 py-0.5 bg-blue-500/20 text-blue-400 text-[10px] font-medium rounded",children:"HA"}),a.jsx("span",{className:k?N?"text-status-ok":"text-bambu-gray":"text-status-error",children:k?m?.state||"?":"Offline"})]}):k?a.jsxs("div",{className:"flex items-center gap-1 text-sm",children:[a.jsx(Fg,{className:"w-4 h-4 text-status-ok"}),a.jsx("span",{className:N?"text-status-ok":"text-bambu-gray",children:m?.state||"Unknown"})]}):a.jsxs("div",{className:"flex items-center gap-1 text-sm text-status-error",children:[a.jsx(_m,{className:"w-4 h-4"}),a.jsx("span",{children:"Offline"})]}),P&&a.jsxs("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 px-2 py-0.5 bg-bambu-dark hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white text-xs rounded-full transition-colors",title:"Open plug admin page",children:[a.jsx(Xr,{className:"w-3 h-3"}),"Admin"]})]})]}),v&&a.jsxs("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Linked to: "}),a.jsx("span",{className:"text-sm text-white",children:v.name})]}),(t.power_alert_enabled||t.schedule_enabled||t.plug_type==="mqtt")&&a.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[t.plug_type==="mqtt"&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-teal-500/20 text-teal-400 text-xs rounded-full",children:[a.jsx(_c,{className:"w-3 h-3"}),"Monitor Only"]}),t.power_alert_enabled&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded-full",children:[a.jsx(Og,{className:"w-3 h-3"}),"Alerts"]}),t.schedule_enabled&&a.jsxs("span",{className:"flex items-center gap-1 px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded-full",children:[a.jsx(ei,{className:"w-3 h-3"}),t.schedule_on_time&&t.schedule_off_time?`${t.schedule_on_time} - ${t.schedule_off_time}`:t.schedule_on_time?`On ${t.schedule_on_time}`:`Off ${t.schedule_off_time}`]})]}),t.plug_type!=="mqtt"&&a.jsxs("div",{className:"flex gap-2 mb-3",children:[a.jsxs(ke,{size:"sm",variant:N?"primary":"secondary",disabled:!k||C,onClick:()=>l(!0),className:"flex-1",children:[C?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Zu,{className:"w-4 h-4"}),"On"]}),a.jsxs(ke,{size:"sm",variant:N?"secondary":"primary",disabled:!k||C,onClick:()=>u(!0),className:"flex-1",children:[C?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(HM,{className:"w-4 h-4"}),"Off"]})]}),t.plug_type==="mqtt"&&m?.energy&&a.jsxs("div",{className:"flex gap-2 mb-3 px-3 py-2 bg-bambu-dark rounded-lg",children:[m.energy.power!==null&&m.energy.power!==void 0&&a.jsxs("div",{className:"flex-1 text-center",children:[a.jsxs("p",{className:"text-lg font-semibold text-white",children:[Math.round(m.energy.power),"W"]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Power"})]}),m.energy.today!==null&&m.energy.today!==void 0&&a.jsxs("div",{className:"flex-1 text-center border-l border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-lg font-semibold text-white",children:m.energy.today.toFixed(2)}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"kWh Today"})]})]}),a.jsxs("button",{onClick:()=>h(!d),className:"w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors",children:[a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx(jh,{className:"w-4 h-4"}),t.plug_type==="mqtt"?"Settings":"Automation Settings"]}),a.jsx("span",{children:d?"-":"+"})]}),d&&a.jsxs("div",{className:"pt-3 border-t border-bambu-dark-tertiary space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(UM,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Show in Switchbar"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Quick access from sidebar"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.show_in_switchbar,onChange:T=>y.mutate({show_in_switchbar:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),t.plug_type!=="mqtt"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Enabled"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Enable automation for this plug"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.enabled,onChange:T=>y.mutate({enabled:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Auto On"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Turn on when print starts"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.auto_on,onChange:T=>y.mutate({auto_on:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Auto Off"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Turn off when print completes (one-shot)"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.auto_off,onChange:T=>y.mutate({auto_off:T.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),t.auto_off&&a.jsxs("div",{className:"space-y-3 pl-4 border-l-2 border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white mb-2",children:"Turn Off Delay Mode"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("button",{onClick:()=>y.mutate({off_delay_mode:"time"}),className:`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${t.off_delay_mode==="time"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:[a.jsx(nr,{className:"w-4 h-4"}),"Time"]}),a.jsxs("button",{onClick:()=>y.mutate({off_delay_mode:"temperature"}),className:`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${t.off_delay_mode==="temperature"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:[a.jsx(GM,{className:"w-4 h-4"}),"Temp"]})]})]}),t.off_delay_mode==="time"?a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Delay (minutes)"}),a.jsx("input",{type:"number",min:"1",max:"60",value:t.off_delay_minutes,onChange:T=>y.mutate({off_delay_minutes:parseInt(T.target.value)||5}),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"})]}):a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Temperature threshold (C)"}),a.jsx("input",{type:"number",min:"30",max:"100",value:t.off_temp_threshold,onChange:T=>y.mutate({off_temp_threshold:parseInt(T.target.value)||70}),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Turns off when nozzle cools below this temperature"})]})]})]}),a.jsxs("div",{className:"flex gap-2 pt-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>e(t),className:"flex-1",children:[a.jsx(Eg,{className:"w-4 h-4"}),"Edit"]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>s(!0),className:"text-red-400 hover:text-red-300",children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})}),i&&a.jsx(er,{title:"Delete Smart Plug",message:`Are you sure you want to delete "${t.name}"? This cannot be undone.`,confirmText:"Delete",variant:"danger",onConfirm:()=>{S.mutate(),s(!1)},onCancel:()=>s(!1)}),o&&a.jsx(er,{title:"Turn On Smart Plug",message:`Are you sure you want to turn on "${t.name}"?`,confirmText:"Turn On",variant:"default",onConfirm:()=>{x.mutate("on"),l(!1)},onCancel:()=>l(!1)}),c&&a.jsx(er,{title:"Turn Off Smart Plug",message:`Are you sure you want to turn off "${t.name}"? This will cut power to the connected device.`,confirmText:"Turn Off",variant:"danger",onConfirm:()=>{x.mutate("off"),u(!1)},onCancel:()=>u(!1)})]})}function VYe({plug:t,onClose:e}){const n=un(),r=!!t,[i,s]=_.useState(t?.plug_type||"tasmota"),[o,l]=_.useState(t?.name||""),[c,u]=_.useState(t?.ip_address||""),[d,h]=_.useState(t?.username||""),[m,p]=_.useState(t?.password||""),[b,v]=_.useState(t?.ha_entity_id||""),[x,y]=_.useState(t?.mqtt_power_topic||t?.mqtt_topic||""),[S,N]=_.useState(t?.mqtt_power_path||""),[A,k]=_.useState((t?.mqtt_power_multiplier??t?.mqtt_multiplier??1).toString()),[C,E]=_.useState(t?.mqtt_energy_topic||""),[P,T]=_.useState(t?.mqtt_energy_path||""),[j,z]=_.useState((t?.mqtt_energy_multiplier??1).toString()),[L,B]=_.useState(t?.mqtt_state_topic||""),[R,$]=_.useState(t?.mqtt_state_path||""),[q,I]=_.useState(t?.mqtt_state_on_value||""),[G,Y]=_.useState(t?.ha_power_entity||""),[re,H]=_.useState(t?.ha_energy_today_entity||""),[K,ne]=_.useState(t?.ha_energy_total_entity||""),[ie,be]=_.useState(""),[pe,de]=_.useState(""),[Ce,ae]=_.useState(!1),Ae=_.useRef(null),[Le,fe]=_.useState(""),[Xe,W]=_.useState(!1),Q=_.useRef(null),[me,X]=_.useState(""),[te,V]=_.useState(!1),ge=_.useRef(null),[Se,ee]=_.useState(""),[U,O]=_.useState(!1),Z=_.useRef(null),[le,we]=_.useState(t?.printer_id||null),[ye,se]=_.useState(null),[Oe,He]=_.useState(null),[tt,Ue]=_.useState(t?.power_alert_enabled||!1),[xe,Te]=_.useState(t?.power_alert_high?.toString()||""),[Ie,Ne]=_.useState(t?.power_alert_low?.toString()||""),[Ge,Me]=_.useState(t?.schedule_enabled||!1),[rt,Ee]=_.useState(t?.schedule_on_time||""),[Ke,Be]=_.useState(t?.schedule_off_time||""),[ue,$e]=_.useState(t?.show_in_switchbar||!1),[at,kt]=_.useState(t?.show_on_printer_card??!0),[gt,Ut]=_.useState(!1),[Ft,Fe]=_.useState({scanned:0,total:0}),[xt,Wt]=_.useState([]),Qt=_.useRef(null),{data:En}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:hn}=st({queryKey:["smart-plugs"],queryFn:ce.getSmartPlugs}),{data:or}=st({queryKey:["settings"],queryFn:ce.getSettings}),Kn=!!(or?.ha_enabled&&or?.ha_url&&or?.ha_token);_.useEffect(()=>{const _e=setTimeout(()=>{de(ie)},300);return()=>clearTimeout(_e)},[ie]),_.useEffect(()=>{const _e=Re=>{Ae.current&&!Ae.current.contains(Re.target)&&ae(!1),Q.current&&!Q.current.contains(Re.target)&&W(!1),ge.current&&!ge.current.contains(Re.target)&&V(!1),Z.current&&!Z.current.contains(Re.target)&&O(!1)};return document.addEventListener("mousedown",_e),()=>document.removeEventListener("mousedown",_e)},[]);const{data:Qn,isLoading:Tn,error:di}=st({queryKey:["ha-entities",pe],queryFn:()=>ce.getHAEntities(pe||void 0),enabled:i==="homeassistant"&&Kn,retry:!1,staleTime:0}),{data:ii}=st({queryKey:["ha-sensor-entities"],queryFn:ce.getHASensorEntities,enabled:i==="homeassistant"&&Kn,retry:!1,staleTime:0});_.useEffect(()=>{const _e=Re=>{Re.key==="Escape"&&e()};return window.addEventListener("keydown",_e),()=>{window.removeEventListener("keydown",_e),Qt.current&&clearInterval(Qt.current)}},[e]);const je=async()=>{Ut(!0),Wt([]),Fe({scanned:0,total:0}),He(null);try{await ce.startTasmotaScan();const _e=async()=>{try{const Re=await ce.getTasmotaScanStatus();Fe({scanned:Re.scanned,total:Re.total});const et=await ce.getDiscoveredTasmotaDevices();Wt(et),Re.running||(Ut(!1),Qt.current&&(clearInterval(Qt.current),Qt.current=null))}catch(Re){console.error("Polling error:",Re)}};await _e(),Qt.current=setInterval(_e,500)}catch(_e){Ut(!1);const Re=_e instanceof Error?_e.message:typeof _e=="string"?_e:JSON.stringify(_e);He(Re||"Failed to start scan")}},Je=async()=>{try{await ce.stopTasmotaScan()}catch{}Ut(!1),Qt.current&&(clearInterval(Qt.current),Qt.current=null)},dt=_e=>{u(_e.ip_address),l(_e.name),se(null)},ht=pt({mutationFn:()=>ce.testSmartPlugConnection(c,d||null,m||null),onSuccess:_e=>{se(_e),He(null),!o&&_e.device_name&&l(_e.device_name)},onError:_e=>{se(null),He(_e.message)}}),ct=pt({mutationFn:_e=>ce.createSmartPlug(_e),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter"]}),e()},onError:_e=>{He(_e.message)}}),Tt=pt({mutationFn:_e=>ce.updateSmartPlug(t.id,_e),onSuccess:()=>{n.invalidateQueries({queryKey:["smart-plugs"]}),n.invalidateQueries({queryKey:["scriptPlugsByPrinter"]}),e()},onError:_e=>{He(_e.message)}}),he=En?.filter(_e=>i==="tasmota"?!hn?.some(et=>et.printer_id===_e.id&&et.id!==t?.id&&et.plug_type==="tasmota"):!0),De=_e=>{if(_e.preventDefault(),He(null),!o.trim()){He("Name is required");return}if(i==="tasmota"&&!c.trim()){He("IP address is required for Tasmota plugs");return}if(i==="homeassistant"&&!b){He("Entity is required for Home Assistant plugs");return}if(i==="mqtt"){const et=x.trim(),Ye=C.trim(),Ct=L.trim();if(!et&&!Ye&&!Ct){He("At least one MQTT topic must be configured for power, energy, or state monitoring");return}}const Re={name:o.trim(),plug_type:i,ip_address:i==="tasmota"?c.trim():null,ha_entity_id:i==="homeassistant"?b:null,ha_power_entity:i==="homeassistant"&&G||null,ha_energy_today_entity:i==="homeassistant"&&re||null,ha_energy_total_entity:i==="homeassistant"&&K||null,mqtt_power_topic:i==="mqtt"&&x.trim()||null,mqtt_power_path:i==="mqtt"&&S.trim()||null,mqtt_power_multiplier:i==="mqtt"&&parseFloat(A)||1,mqtt_energy_topic:i==="mqtt"&&C.trim()||null,mqtt_energy_path:i==="mqtt"&&P.trim()||null,mqtt_energy_multiplier:i==="mqtt"&&parseFloat(j)||1,mqtt_state_topic:i==="mqtt"&&L.trim()||null,mqtt_state_path:i==="mqtt"&&R.trim()||null,mqtt_state_on_value:i==="mqtt"&&q.trim()||null,username:i==="tasmota"&&d.trim()||null,password:i==="tasmota"&&m.trim()||null,printer_id:le,power_alert_enabled:tt,power_alert_high:xe?parseFloat(xe):null,power_alert_low:Ie?parseFloat(Ie):null,schedule_enabled:Ge,schedule_on_time:rt||null,schedule_off_time:Ke||null,show_in_switchbar:ue,show_on_printer_card:at};r?Tt.mutate(Re):ct.mutate(Re)},Ve=ct.isPending||Tt.isPending;return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md max-h-[90vh] flex flex-col",onClick:_e=>_e.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary flex-shrink-0",children:[a.jsx("h2",{className:"text-lg font-semibold text-white",children:r?"Edit Smart Plug":"Add Smart Plug"}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:De,className:"p-6 space-y-4 overflow-y-auto",children:[Oe&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:Oe}),!r&&a.jsxs("div",{className:"flex gap-2 mb-2",children:[a.jsxs("button",{type:"button",onClick:()=>{s("tasmota"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="tasmota"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(rl,{className:"w-4 h-4"}),"Tasmota"]}),a.jsxs("button",{type:"button",onClick:()=>{s("homeassistant"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="homeassistant"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(Jy,{className:"w-4 h-4"}),"HA"]}),a.jsxs("button",{type:"button",onClick:()=>{s("mqtt"),se(null),He(null)},className:`flex-1 flex items-center justify-center gap-2 px-3 py-2.5 rounded-lg font-medium transition-colors ${i==="mqtt"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white border border-bambu-dark-tertiary"}`,children:[a.jsx(cO,{className:"w-4 h-4"}),"MQTT"]})]}),!r&&i==="tasmota"&&a.jsxs("div",{className:"space-y-3",children:[gt?a.jsxs(ke,{type:"button",variant:"secondary",onClick:Je,className:"w-full",children:[a.jsx(Lt,{className:"w-4 h-4"}),"Stop Scanning"]}):a.jsxs(ke,{type:"button",variant:"primary",onClick:je,className:"w-full",children:[a.jsx(va,{className:"w-4 h-4"}),"Discover Tasmota Devices"]}),gt&&Ft.total>0&&a.jsxs("div",{className:"space-y-1",children:[a.jsxs("div",{className:"flex justify-between text-xs text-bambu-gray",children:[a.jsx("span",{children:"Scanning network..."}),a.jsxs("span",{children:[Ft.scanned," / ",Ft.total]})]}),a.jsx("div",{className:"w-full bg-bambu-dark-tertiary rounded-full h-2",children:a.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all duration-300",style:{width:`${Ft.scanned/Ft.total*100}%`}})})]}),xt.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsxs("p",{className:"text-xs text-bambu-gray",children:["Found ",xt.length," device(s) - click to select:"]}),a.jsx("div",{className:"max-h-40 overflow-y-auto space-y-1",children:xt.map(_e=>a.jsxs("button",{type:"button",onClick:()=>dt(_e),className:"w-full flex items-center justify-between p-2 bg-bambu-dark hover:bg-bambu-dark-tertiary rounded-lg transition-colors text-left border border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(rl,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:_e.name}),a.jsx("p",{className:"text-xs text-bambu-gray",children:_e.ip_address})]})]}),_e.state&&a.jsxs("span",{className:`flex items-center gap-1 text-xs ${_e.state==="ON"?"text-bambu-green":"text-bambu-gray"}`,children:[a.jsx(Zu,{className:"w-3 h-3"}),_e.state]})]},_e.ip_address))})]}),!gt&&xt.length===0&&Ft.total>0&&a.jsx("p",{className:"text-xs text-bambu-gray text-center py-2",children:"No Tasmota devices found on your network"})]}),i==="homeassistant"&&a.jsxs("div",{className:"space-y-3",children:[!Kn&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"p-3 bg-yellow-500/20 border border-yellow-500/50 rounded-lg text-sm text-yellow-400",children:["Home Assistant is not configured. Set it up in"," ",a.jsx("span",{className:"font-medium",children:"Settings → Network → Home Assistant"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1 opacity-50",children:"Select Entity *"}),a.jsx("select",{disabled:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed opacity-50",children:a.jsx("option",{children:"Choose an entity..."})})]})]}),Kn&&a.jsxs(a.Fragment,{children:[Tn&&a.jsxs("div",{className:"flex items-center justify-center py-4 text-bambu-gray",children:[a.jsx(ut,{className:"w-5 h-5 animate-spin mr-2"}),"Loading entities..."]}),di&&a.jsxs("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:["Failed to load entities: ",di.message]}),(()=>{const _e=hn?.filter(Ye=>Ye.ha_entity_id&&Ye.id!==t?.id).map(Ye=>Ye.ha_entity_id)||[],Re=(Qn||[]).filter(Ye=>!_e.includes(Ye.entity_id)),et=Qn?.find(Ye=>Ye.entity_id===b);return a.jsxs("div",{ref:Ae,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Select Entity *"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:Ce?ie:et?`${et.friendly_name} (${et.entity_id})`:"",onChange:Ye=>{be(Ye.target.value),Ce||ae(!0)},onFocus:()=>{ae(!0),be("")},placeholder:"Search entities...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),b&&!Ce&&a.jsx("button",{type:"button",onClick:()=>{v(""),be("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})}),Tn&&a.jsx(ut,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray animate-spin"})]}),Ce&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-60 overflow-y-auto",children:[Tn&&a.jsxs("div",{className:"px-3 py-2 text-sm text-bambu-gray flex items-center gap-2",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Loading..."]}),!Tn&&Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:pe?`No entities found matching "${pe}"`:"No entities available"}),!Tn&&Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{v(Ye.entity_id),ae(!1),be(""),o||l(Ye.friendly_name)},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary transition-colors ${Ye.entity_id===b?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray flex items-center justify-between",children:[a.jsx("span",{children:Ye.entity_id}),a.jsx("span",{className:Ye.state==="on"?"text-bambu-green":"",children:Ye.state})]})]},Ye.entity_id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:pe?`Searching all entities (${Re.length} found)`:`Showing switch, light, input_boolean (${Re.length} available)`})]})})(),b&&ii&&ii.length>0&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 mt-4 space-y-3",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium mb-1",children:"Energy Monitoring (Optional)"}),a.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Search and select sensors that provide power/energy data."})]}),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="W"||Ye.unit_of_measurement==="kW"||Ye.unit_of_measurement==="mW"),Re=Le?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(Le.toLowerCase())||Ye.friendly_name.toLowerCase().includes(Le.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===G);return a.jsxs("div",{ref:Q,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Power Sensor (W)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:Xe?Le:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{fe(Ye.target.value),Xe||W(!0)},onFocus:()=>{W(!0),fe("")},placeholder:"Search power sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),G&&!Xe&&a.jsx("button",{type:"button",onClick:()=>{Y(""),fe("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),Xe&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{Y(""),W(!1),fe("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{Y(Ye.entity_id),W(!1),fe("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===G?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})(),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="kWh"||Ye.unit_of_measurement==="Wh"||Ye.unit_of_measurement==="MWh"),Re=me?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(me.toLowerCase())||Ye.friendly_name.toLowerCase().includes(me.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===re);return a.jsxs("div",{ref:ge,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Energy Today (kWh)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:te?me:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{X(Ye.target.value),te||V(!0)},onFocus:()=>{V(!0),X("")},placeholder:"Search energy sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),re&&!te&&a.jsx("button",{type:"button",onClick:()=>{H(""),X("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),te&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{H(""),V(!1),X("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{H(Ye.entity_id),V(!1),X("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===re?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})(),(()=>{const _e=ii.filter(Ye=>Ye.unit_of_measurement==="kWh"||Ye.unit_of_measurement==="Wh"||Ye.unit_of_measurement==="MWh"),Re=Se?_e.filter(Ye=>Ye.entity_id.toLowerCase().includes(Se.toLowerCase())||Ye.friendly_name.toLowerCase().includes(Se.toLowerCase())):_e,et=ii.find(Ye=>Ye.entity_id===K);return a.jsxs("div",{ref:Z,className:"relative",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Total Energy (kWh)"}),a.jsxs("div",{className:"relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"}),a.jsx("input",{type:"text",value:U?Se:et?`${et.friendly_name} (${et.state} ${et.unit_of_measurement})`:"",onChange:Ye=>{ee(Ye.target.value),U||O(!0)},onFocus:()=>{O(!0),ee("")},placeholder:"Search energy sensors...",className:"w-full pl-9 pr-8 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"}),K&&!U&&a.jsx("button",{type:"button",onClick:()=>{ne(""),ee("")},className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-bambu-dark-tertiary rounded",children:a.jsx(Lt,{className:"w-4 h-4 text-bambu-gray hover:text-white"})})]}),U&&a.jsxs("div",{className:"absolute z-50 w-full mt-1 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg shadow-lg max-h-48 overflow-y-auto",children:[a.jsx("button",{type:"button",onClick:()=>{ne(""),O(!1),ee("")},className:"w-full px-3 py-2 text-left text-sm text-bambu-gray hover:bg-bambu-dark-tertiary",children:"None"}),Re.map(Ye=>a.jsxs("button",{type:"button",onClick:()=>{ne(Ye.entity_id),O(!1),ee("")},className:`w-full px-3 py-2 text-left text-sm hover:bg-bambu-dark-tertiary ${Ye.entity_id===K?"bg-bambu-green/20 text-bambu-green":"text-white"}`,children:[a.jsx("div",{className:"font-medium",children:Ye.friendly_name}),a.jsxs("div",{className:"text-xs text-bambu-gray",children:[Ye.entity_id," • ",Ye.state," ",Ye.unit_of_measurement]})]},Ye.entity_id)),Re.length===0&&a.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No matching sensors"})]})]})})()]})]})]}),i==="mqtt"&&a.jsxs("div",{className:"space-y-3",children:[!or?.mqtt_broker&&a.jsxs("div",{className:"p-3 bg-yellow-500/20 border border-yellow-500/50 rounded-lg text-sm text-yellow-400",children:["MQTT broker not configured. Set broker address in"," ",a.jsx("span",{className:"font-medium",children:"Settings → Network → MQTT Publishing"})," ","(you don't need to enable publishing, just fill in the broker details)."]}),or?.mqtt_broker&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg text-sm text-blue-300",children:[a.jsx("p",{className:"font-medium mb-1",children:"Monitor Only"}),a.jsx("p",{className:"text-xs opacity-80",children:"MQTT plugs receive power/energy data via MQTT subscription. On/off control is not available - use your MQTT broker or home automation system."})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-white font-medium text-sm",children:"Power Monitoring"}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:x,onChange:_e=>y(_e.target.value),placeholder:"zigbee2mqtt/shelly-working-room",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:S,onChange:_e=>N(_e.target.value),placeholder:"power_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Multiplier"}),a.jsx("input",{type:"text",value:A,onChange:_e=>k(_e.target.value),placeholder:"1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:['JSON path extracts value from JSON payload (e.g., "power_l1"). Leave empty if topic publishes raw numeric values.',a.jsx("br",{}),"Use multiplier 0.001 for mW→W, 1000 for kW→W."]})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsxs("p",{className:"text-white font-medium text-sm",children:["Energy Monitoring ",a.jsx("span",{className:"text-bambu-gray font-normal",children:"(optional)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:C,onChange:_e=>E(_e.target.value),placeholder:"Same as power topic, or different",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:P,onChange:_e=>T(_e.target.value),placeholder:"energy_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Multiplier"}),a.jsx("input",{type:"text",value:j,onChange:_e=>z(_e.target.value),placeholder:"1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:["JSON path extracts value from JSON payload. Leave empty for raw values.",a.jsx("br",{}),"Use multiplier 0.001 for Wh→kWh, 1000 for MWh→kWh."]})]}),a.jsxs("div",{className:"space-y-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[a.jsxs("p",{className:"text-white font-medium text-sm",children:["State Monitoring ",a.jsx("span",{className:"text-bambu-gray font-normal",children:"(optional)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic"}),a.jsx("input",{type:"text",value:L,onChange:_e=>B(_e.target.value),placeholder:"Same as power topic, or different",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"JSON Path"}),a.jsx("input",{type:"text",value:R,onChange:_e=>$(_e.target.value),placeholder:"state_l1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"ON Value"}),a.jsx("input",{type:"text",value:q,onChange:_e=>I(_e.target.value),placeholder:"ON, true, 1",className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]})]}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:["JSON path extracts value from JSON payload. Leave empty for raw values.",a.jsx("br",{}),'ON value: the exact string that means "ON". Leave empty for auto-detect (ON, true, 1).']})]})]})]}),i==="tasmota"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address *"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx("input",{type:"text",value:c,onChange:_e=>{u(_e.target.value),se(null)},placeholder:"192.168.1.100",className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs(ke,{type:"button",variant:"secondary",onClick:()=>ht.mutate(),disabled:!c.trim()||ht.isPending,children:[ht.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Fg,{className:"w-4 h-4"}),"Test"]})]})]}),i==="tasmota"&&ye&&a.jsx("div",{className:`p-3 rounded-lg flex items-center gap-2 ${ye.success?"bg-bambu-green/20 border border-bambu-green/50 text-bambu-green":"bg-red-500/20 border border-red-500/50 text-red-400"}`,children:ye.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-5 h-5"}),a.jsxs("div",{children:[a.jsx("p",{className:"font-medium",children:"Connected!"}),a.jsxs("p",{className:"text-sm opacity-80",children:[ye.device_name&&`Device: ${ye.device_name} - `,"State: ",ye.state]})]})]}):a.jsxs(a.Fragment,{children:[a.jsx(_m,{className:"w-5 h-5"}),a.jsx("span",{children:"Connection failed"})]})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:o,onChange:_e=>l(_e.target.value),placeholder:"Living Room Plug",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),i==="tasmota"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Username"}),a.jsx("input",{type:"text",value:d,onChange:_e=>h(_e.target.value),placeholder:"admin",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Password"}),a.jsx("input",{type:"password",value:m,onChange:_e=>p(_e.target.value),placeholder:"********",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray -mt-2",children:"Leave empty if your Tasmota device doesn't require authentication"})]}),i!=="mqtt"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Link to Printer"}),a.jsxs("select",{value:le??"",onChange:_e=>we(_e.target.value?Number(_e.target.value):null),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"No printer (manual control only)"}),he?.map(_e=>a.jsx("option",{value:_e.id,children:_e.name},_e.id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Linking enables automatic on/off when prints start/complete"})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Og,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"text-white font-medium",children:"Power Alerts"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:tt,onChange:_e=>Ue(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),tt&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Alert if above (W)"}),a.jsx("input",{type:"number",value:xe,onChange:_e=>Te(_e.target.value),placeholder:"e.g. 200",min:"0",max:"5000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Alert if below (W)"}),a.jsx("input",{type:"number",value:Ie,onChange:_e=>Ne(_e.target.value),placeholder:"e.g. 10",min:"0",max:"5000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Get notified when power consumption crosses these thresholds. Leave empty to disable that direction."})]})]}),i!=="mqtt"&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"text-white font-medium",children:"Daily Schedule"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:Ge,onChange:_e=>Me(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),Ge&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Turn On at"}),a.jsx("input",{type:"time",value:rt,onChange:_e=>Ee(_e.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Turn Off at"}),a.jsx("input",{type:"time",value:Ke,onChange:_e=>Be(_e.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Automatically turn the plug on/off at these times daily. Leave empty to skip that action."})]})]}),a.jsx("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(UM,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white font-medium",children:"Show in Switchbar"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Quick access from sidebar"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:ue,onChange:_e=>$e(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})}),i==="homeassistant"&&a.jsx("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(_c,{className:"w-4 h-4 text-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white font-medium",children:"Show on Printer Card"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Display button on printer card"})]})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:at,onChange:_e=>kt(_e.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:Ve,className:"flex-1",children:[Ve?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),r?"Save":"Add"]})]})]})]})})}function $n({checked:t,onChange:e,disabled:n}){const r=i=>{i.preventDefault(),i.stopPropagation(),n||e(!t)};return a.jsx("button",{type:"button",role:"switch","aria-checked":t,disabled:n,onClick:r,className:`relative inline-flex w-11 h-7 md:w-9 md:h-5 rounded-full transition-colors flex-shrink-0 focus:outline-none focus:ring-2 focus:ring-bambu-green focus:ring-offset-2 focus:ring-offset-bambu-dark ${n?"bg-bambu-dark-tertiary/50 cursor-not-allowed opacity-50":t?"bg-bambu-green cursor-pointer":"bg-bambu-dark-tertiary cursor-pointer hover:bg-bambu-dark-tertiary/80"}`,children:a.jsx("span",{className:`pointer-events-none absolute top-[3px] md:top-[2px] left-[3px] md:left-[2px] w-5 h-5 md:w-4 md:h-4 bg-white rounded-full shadow transition-transform duration-200 ease-in-out ${t?"translate-x-4":"translate-x-0"}`})})}const GYe={callmebot:"CallMeBot/WhatsApp",ntfy:"ntfy",pushover:"Pushover",telegram:"Telegram",email:"Email",discord:"Discord",webhook:"Webhook"};function qYe({provider:t,onEdit:e}){const n=un(),[r,i]=_.useState(!1),[s,o]=_.useState(!1),[l,c]=_.useState(null),{data:u}=st({queryKey:["printers"],queryFn:ce.getPrinters}),d=u?.find(v=>v.id===t.printer_id),h=pt({mutationFn:v=>ce.updateNotificationProvider(t.id,v),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]})}}),m=pt({mutationFn:()=>ce.deleteNotificationProvider(t.id),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]})}}),p=pt({mutationFn:()=>ce.testNotificationProvider(t.id),onSuccess:v=>{c(v),n.invalidateQueries({queryKey:["notification-providers"]})},onError:v=>{c({success:!1,message:v.message})}}),b=v=>v||"";return a.jsxs(a.Fragment,{children:[a.jsx(_t,{className:"relative",children:a.jsxs(Mt,{className:"p-4",children:[a.jsxs("div",{className:"flex items-start justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`p-2 rounded-lg ${t.enabled?"bg-bambu-green/20":"bg-bambu-dark"}`,children:a.jsx(Og,{className:`w-5 h-5 ${t.enabled?"text-bambu-green":"text-bambu-gray"}`})}),a.jsxs("div",{children:[a.jsx("h3",{className:"font-medium text-white",children:t.name}),a.jsx("p",{className:"text-sm text-bambu-gray",children:GYe[t.provider_type]||t.provider_type})]})]}),a.jsxs("div",{className:"flex items-center gap-3",children:[t.last_success&&a.jsxs("span",{className:"text-xs text-status-ok hidden sm:inline",children:["Last: ",tb(t.last_success)]}),t.last_error&&t.last_error_at&&(!t.last_success||(Hi(t.last_error_at)?.getTime()||0)>(Hi(t.last_success)?.getTime()||0))&&a.jsx("span",{className:"text-xs text-status-error",title:t.last_error,children:"Error"}),a.jsx($n,{checked:t.enabled,onChange:v=>h.mutate({enabled:v})})]})]}),d&&a.jsxs("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Printer: "}),a.jsx("span",{className:"text-sm text-white",children:d.name})]}),!d&&!t.printer_id&&a.jsx("div",{className:"mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg",children:a.jsx("span",{className:"text-xs text-bambu-gray",children:"All printers"})}),a.jsxs("div",{className:"mb-3 flex flex-wrap gap-1",children:[t.on_print_start&&a.jsx("span",{className:"px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded",children:"Start"}),t.on_plate_not_empty&&a.jsx("span",{className:"px-2 py-0.5 bg-rose-600/20 text-rose-300 text-xs rounded",children:"Plate Check"}),t.on_print_complete&&a.jsx("span",{className:"px-2 py-0.5 bg-bambu-green/20 text-bambu-green text-xs rounded",children:"Complete"}),t.on_print_failed&&a.jsx("span",{className:"px-2 py-0.5 bg-red-500/20 text-red-400 text-xs rounded",children:"Failed"}),t.on_print_stopped&&a.jsx("span",{className:"px-2 py-0.5 bg-orange-500/20 text-orange-400 text-xs rounded",children:"Stopped"}),t.on_print_progress&&a.jsx("span",{className:"px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded",children:"Progress"}),t.on_printer_offline&&a.jsx("span",{className:"px-2 py-0.5 bg-gray-500/20 text-gray-400 text-xs rounded",children:"Offline"}),t.on_printer_error&&a.jsx("span",{className:"px-2 py-0.5 bg-rose-500/20 text-rose-400 text-xs rounded",children:"Error"}),t.on_filament_low&&a.jsx("span",{className:"px-2 py-0.5 bg-cyan-500/20 text-cyan-400 text-xs rounded",children:"Low Filament"}),t.on_maintenance_due&&a.jsx("span",{className:"px-2 py-0.5 bg-purple-500/20 text-purple-400 text-xs rounded",children:"Maintenance"}),t.on_ams_humidity_high&&a.jsx("span",{className:"px-2 py-0.5 bg-blue-600/20 text-blue-300 text-xs rounded",children:"AMS Humidity"}),t.on_ams_temperature_high&&a.jsx("span",{className:"px-2 py-0.5 bg-orange-600/20 text-orange-300 text-xs rounded",children:"AMS Temp"}),t.on_ams_ht_humidity_high&&a.jsx("span",{className:"px-2 py-0.5 bg-cyan-600/20 text-cyan-300 text-xs rounded",children:"AMS-HT Humidity"}),t.on_ams_ht_temperature_high&&a.jsx("span",{className:"px-2 py-0.5 bg-amber-600/20 text-amber-300 text-xs rounded",children:"AMS-HT Temp"}),t.quiet_hours_enabled&&a.jsxs("span",{className:"px-2 py-0.5 bg-indigo-500/20 text-indigo-400 text-xs rounded flex items-center gap-1",children:[a.jsx(hS,{className:"w-3 h-3"}),"Quiet"]}),t.daily_digest_enabled&&a.jsxs("span",{className:"px-2 py-0.5 bg-emerald-500/20 text-emerald-400 text-xs rounded flex items-center gap-1",children:[a.jsx(ei,{className:"w-3 h-3"}),"Digest ",t.daily_digest_time]})]}),a.jsx("div",{className:"mb-3",children:a.jsxs(ke,{size:"sm",variant:"secondary",disabled:p.isPending,onClick:()=>{c(null),p.mutate()},className:"w-full",children:[p.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),"Send Test Notification"]})}),l&&a.jsxs("div",{className:`mb-3 p-2 rounded-lg flex items-center gap-2 text-sm ${l.success?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:[l.success?a.jsx(Nr,{className:"w-4 h-4"}):a.jsx(ta,{className:"w-4 h-4"}),a.jsx("span",{children:l.message})]}),a.jsxs("button",{onClick:()=>o(!s),className:"w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors border-t border-bambu-dark-tertiary",children:[a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx(jh,{className:"w-4 h-4"}),"Event Settings"]}),s?a.jsx(Ch,{className:"w-4 h-4"}):a.jsx(Sr,{className:"w-4 h-4"})]}),s&&a.jsxs("div",{className:"pt-3 border-t border-bambu-dark-tertiary space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Enabled"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Send notifications from this provider"})]}),a.jsx($n,{checked:t.enabled,onChange:v=>h.mutate({enabled:v})})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Print Events"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Started"}),a.jsx($n,{checked:t.on_print_start,onChange:v=>h.mutate({on_print_start:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Plate Not Empty"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Objects detected before print"})]}),a.jsx($n,{checked:t.on_plate_not_empty??!0,onChange:v=>h.mutate({on_plate_not_empty:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Completed"}),a.jsx($n,{checked:t.on_print_complete,onChange:v=>h.mutate({on_print_complete:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Failed"}),a.jsx($n,{checked:t.on_print_failed,onChange:v=>h.mutate({on_print_failed:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Print Stopped"}),a.jsx($n,{checked:t.on_print_stopped,onChange:v=>h.mutate({on_print_stopped:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Progress Milestones"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Notify at 25%, 50%, 75%"})]}),a.jsx($n,{checked:t.on_print_progress,onChange:v=>h.mutate({on_print_progress:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Printer Status"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Printer Offline"}),a.jsx($n,{checked:t.on_printer_offline,onChange:v=>h.mutate({on_printer_offline:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Printer Error"}),a.jsx($n,{checked:t.on_printer_error,onChange:v=>h.mutate({on_printer_error:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("p",{className:"text-sm text-white",children:"Low Filament"}),a.jsx($n,{checked:t.on_filament_low,onChange:v=>h.mutate({on_filament_low:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Maintenance Due"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Notify when maintenance is needed"})]}),a.jsx($n,{checked:t.on_maintenance_due??!1,onChange:v=>h.mutate({on_maintenance_due:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"AMS Alarms"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS Humidity High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Regular AMS humidity exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_humidity_high??!1,onChange:v=>h.mutate({on_ams_humidity_high:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS Temperature High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Regular AMS temperature exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_temperature_high??!1,onChange:v=>h.mutate({on_ams_temperature_high:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"AMS-HT Alarms"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS-HT Humidity High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"AMS-HT humidity exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_ht_humidity_high??!1,onChange:v=>h.mutate({on_ams_ht_humidity_high:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"AMS-HT Temperature High"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"AMS-HT temperature exceeds threshold"})]}),a.jsx($n,{checked:t.on_ams_ht_temperature_high??!1,onChange:v=>h.mutate({on_ams_ht_temperature_high:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide",children:"Print Queue"}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Added"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job added to queue"})]}),a.jsx($n,{checked:t.on_queue_job_added??!1,onChange:v=>h.mutate({on_queue_job_added:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Assigned"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Model-based job assigned to printer"})]}),a.jsx($n,{checked:t.on_queue_job_assigned??!1,onChange:v=>h.mutate({on_queue_job_assigned:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Started"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Queue job started printing"})]}),a.jsx($n,{checked:t.on_queue_job_started??!1,onChange:v=>h.mutate({on_queue_job_started:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Waiting"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job waiting for filament"})]}),a.jsx($n,{checked:t.on_queue_job_waiting??!0,onChange:v=>h.mutate({on_queue_job_waiting:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Skipped"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job skipped (previous failed)"})]}),a.jsx($n,{checked:t.on_queue_job_skipped??!0,onChange:v=>h.mutate({on_queue_job_skipped:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Job Failed"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Job failed to start"})]}),a.jsx($n,{checked:t.on_queue_job_failed??!0,onChange:v=>h.mutate({on_queue_job_failed:v})})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Queue Complete"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"All queue jobs finished"})]}),a.jsx($n,{checked:t.on_queue_completed??!1,onChange:v=>h.mutate({on_queue_completed:v})})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(hS,{className:"w-4 h-4 text-purple-400"}),a.jsx("p",{className:"text-sm text-white",children:"Quiet Hours"})]}),a.jsx($n,{checked:t.quiet_hours_enabled,onChange:v=>h.mutate({quiet_hours_enabled:v})})]}),t.quiet_hours_enabled&&a.jsxs("div",{className:"pl-4 border-l-2 border-bambu-dark-tertiary space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:"No notifications during these hours"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-gray"}),a.jsxs("span",{className:"text-sm text-white",children:[b(t.quiet_hours_start)||"22:00"," - ",b(t.quiet_hours_end)||"07:00"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Edit provider to change quiet hours"})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ei,{className:"w-4 h-4 text-emerald-400"}),a.jsx("p",{className:"text-sm text-white",children:"Daily Digest"})]}),a.jsx($n,{checked:t.daily_digest_enabled,onChange:v=>h.mutate({daily_digest_enabled:v})})]}),t.daily_digest_enabled&&a.jsxs("div",{className:"pl-4 border-l-2 border-bambu-dark-tertiary space-y-2",children:[a.jsx("p",{className:"text-xs text-bambu-gray",children:"Batch notifications into a single daily summary"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(nr,{className:"w-4 h-4 text-bambu-gray"}),a.jsxs("span",{className:"text-sm text-white",children:["Send at ",b(t.daily_digest_time)||"08:00"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Edit provider to change digest time"})]})]}),a.jsxs("div",{className:"flex gap-2 pt-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>e(t),className:"flex-1",children:[a.jsx(Eg,{className:"w-4 h-4"}),"Edit"]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>i(!0),className:"text-red-400 hover:text-red-300",children:a.jsx(cn,{className:"w-4 h-4"})})]})]})]})}),r&&a.jsx(er,{title:"Delete Notification Provider",message:`Are you sure you want to delete "${t.name}"? This cannot be undone.`,confirmText:"Delete",variant:"danger",onConfirm:()=>{m.mutate(),i(!1)},onCancel:()=>i(!1)})]})}const DW=[{value:"email",label:"Email",description:"SMTP email notifications"},{value:"telegram",label:"Telegram",description:"Notifications via Telegram bot"},{value:"discord",label:"Discord",description:"Send to Discord channel via webhook"},{value:"ntfy",label:"ntfy",description:"Free, self-hostable push notifications"},{value:"pushover",label:"Pushover",description:"Simple, reliable push notifications"},{value:"callmebot",label:"CallMeBot/WhatsApp",description:"Free WhatsApp notifications via CallMeBot"},{value:"webhook",label:"Webhook",description:"Generic HTTP POST to any URL"}];function WYe({provider:t,onClose:e}){const n=un(),r=!!t,[i,s]=_.useState(t?.name||""),[o,l]=_.useState(t?.provider_type||"email"),[c,u]=_.useState(t?.printer_id||null),[d,h]=_.useState(t?.quiet_hours_enabled||!1),[m,p]=_.useState(t?.quiet_hours_start||"22:00"),[b,v]=_.useState(t?.quiet_hours_end||"07:00"),[x,y]=_.useState(t?.daily_digest_enabled||!1),[S,N]=_.useState(t?.daily_digest_time||"08:00"),[A,k]=_.useState(t?.on_print_start??!1),[C,E]=_.useState(t?.on_print_complete??!0),[P,T]=_.useState(t?.on_print_failed??!0),[j,z]=_.useState(t?.on_print_stopped??!0),[L,B]=_.useState(t?.on_print_progress??!1),[R,$]=_.useState(t?.on_printer_offline??!1),[q,I]=_.useState(t?.on_printer_error??!1),[G,Y]=_.useState(t?.on_filament_low??!1),[re,H]=_.useState(t?.on_maintenance_due??!1),[K,ne]=_.useState(t?.config?Object.fromEntries(Object.entries(t.config).map(([X,te])=>[X,String(te)])):{}),[ie,be]=_.useState(null),[pe,de]=_.useState(null),{data:Ce}=st({queryKey:["printers"],queryFn:ce.getPrinters});_.useEffect(()=>{const X=te=>{te.key==="Escape"&&e()};return window.addEventListener("keydown",X),()=>window.removeEventListener("keydown",X)},[e]);const ae=pt({mutationFn:()=>ce.testNotificationConfig({provider_type:o,config:K}),onSuccess:X=>{be(X),de(null)},onError:X=>{be({success:!1,message:X.message})}}),Ae=pt({mutationFn:X=>ce.createNotificationProvider(X),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]}),e()},onError:X=>{de(X.message)}}),Le=pt({mutationFn:X=>ce.updateNotificationProvider(t.id,X),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-providers"]}),e()},onError:X=>{de(X.message)}}),fe=X=>{if(X.preventDefault(),de(null),!i.trim()){de("Name is required");return}const te=Q(o);for(const ge of te)if(!K[ge.key]?.trim()){de(`${ge.label} is required`);return}const V={name:i.trim(),provider_type:o,config:K,printer_id:c,quiet_hours_enabled:d,quiet_hours_start:d?m:null,quiet_hours_end:d?b:null,daily_digest_enabled:x,daily_digest_time:x?S:null,on_print_start:A,on_print_complete:C,on_print_failed:P,on_print_stopped:j,on_print_progress:L,on_printer_offline:R,on_printer_error:q,on_filament_low:G,on_maintenance_due:re};r?Le.mutate(V):Ae.mutate(V)},Xe=Ae.isPending||Le.isPending,W=X=>{switch(X){case"callmebot":return[{key:"phone",label:"Phone Number",placeholder:"+1234567890",type:"text",required:!0},{key:"apikey",label:"API Key",placeholder:"Your CallMeBot API key",type:"text",required:!0}];case"ntfy":return[{key:"server",label:"Server URL",placeholder:"https://ntfy.sh",type:"text",required:!1},{key:"topic",label:"Topic",placeholder:"my-bambuddy",type:"text",required:!0},{key:"auth_token",label:"Auth Token",placeholder:"Optional authentication",type:"password",required:!1}];case"pushover":return[{key:"user_key",label:"User Key",placeholder:"Your Pushover user key",type:"text",required:!0},{key:"app_token",label:"App Token",placeholder:"Your Pushover app token",type:"text",required:!0},{key:"priority",label:"Priority",placeholder:"0 (normal)",type:"number",required:!1}];case"telegram":return[{key:"bot_token",label:"Bot Token",placeholder:"Bot token from @BotFather",type:"password",required:!0},{key:"chat_id",label:"Chat ID",placeholder:"Your chat or group ID",type:"text",required:!0}];case"email":return[{key:"smtp_server",label:"SMTP Server",placeholder:"smtp.gmail.com",type:"text",required:!0},{key:"smtp_port",label:"SMTP Port",placeholder:"587",type:"number",required:!1},{key:"security",label:"Security",type:"select",required:!1,options:[{value:"starttls",label:"STARTTLS (Port 587)"},{value:"ssl",label:"SSL/TLS (Port 465)"},{value:"none",label:"None (Port 25)"}]},{key:"auth_enabled",label:"Authentication",type:"select",required:!1,options:[{value:"true",label:"Enabled"},{value:"false",label:"Disabled"}]},{key:"username",label:"Username",placeholder:"your@email.com",type:"text",required:!1},{key:"password",label:"Password",placeholder:"App password",type:"password",required:!1},{key:"from_email",label:"From Email",placeholder:"your@email.com",type:"text",required:!0},{key:"to_email",label:"To Email",placeholder:"recipient@email.com",type:"text",required:!0}];case"discord":return[{key:"webhook_url",label:"Webhook URL",placeholder:"https://discord.com/api/webhooks/...",type:"text",required:!0}];case"webhook":return[{key:"webhook_url",label:"Webhook URL",placeholder:"https://example.com/webhook",type:"text",required:!0},{key:"payload_format",label:"Payload Format",type:"select",required:!1,options:[{value:"generic",label:"Generic JSON"},{value:"slack",label:"Slack / Mattermost"}]},{key:"auth_header",label:"Authorization",placeholder:"Bearer token (optional)",type:"password",required:!1},{key:"field_title",label:"Title Field Name",placeholder:"title",type:"text",required:!1,showIf:te=>te.payload_format!=="slack"},{key:"field_message",label:"Message Field Name",placeholder:"message",type:"text",required:!1,showIf:te=>te.payload_format!=="slack"}];default:return[]}},Q=X=>W(X).filter(te=>te.required),me=W(o);return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4 overflow-y-auto",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-lg my-8 max-h-[90vh] overflow-y-auto",onClick:X=>X.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary",children:[a.jsx("h2",{className:"text-lg font-semibold text-white",children:r?"Edit Notification Provider":"Add Notification Provider"}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:fe,className:"p-6 space-y-4",children:[pe&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:pe}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:i,onChange:X=>s(X.target.value),placeholder:"My Notifications",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Provider Type *"}),a.jsx("select",{value:o,onChange:X=>{l(X.target.value),ne({}),be(null)},disabled:r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50",children:DW.map(X=>a.jsx("option",{value:X.value,children:X.label},X.value))}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:DW.find(X=>X.value===o)?.description})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Configuration"}),me.filter(X=>!("showIf"in X)||X.showIf?.(K)!==!1).map(X=>a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[X.label," ",X.required&&"*"]}),X.type==="select"&&"options"in X&&X.options?a.jsx("select",{value:K[X.key]||X.options[0]?.value||"",onChange:te=>{ne({...K,[X.key]:te.target.value}),be(null)},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:X.options.map(te=>a.jsx("option",{value:te.value,children:te.label},te.value))}):a.jsx("input",{type:X.type,value:K[X.key]||"",onChange:te=>{ne({...K,[X.key]:te.target.value}),be(null)},placeholder:X.placeholder,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]},X.key))]}),a.jsx("div",{className:"flex gap-2",children:a.jsxs(ke,{type:"button",variant:"secondary",onClick:()=>{be(null),ae.mutate()},disabled:ae.isPending||!K[Q(o)[0]?.key],className:"flex-1",children:[ae.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),"Test Configuration"]})}),ie&&a.jsx("div",{className:`p-3 rounded-lg flex items-center gap-2 ${ie.success?"bg-bambu-green/20 border border-bambu-green/50 text-bambu-green":"bg-red-500/20 border border-red-500/50 text-red-400"}`,children:ie.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-5 h-5"}),a.jsx("span",{children:ie.message})]}):a.jsxs(a.Fragment,{children:[a.jsx(ta,{className:"w-5 h-5"}),a.jsx("span",{children:ie.message})]})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Printer Filter"}),a.jsxs("select",{value:c??"",onChange:X=>u(X.target.value?Number(X.target.value):null),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"All printers"}),Ce?.map(X=>a.jsx("option",{value:X.id,children:X.name},X.id))]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Only send notifications for events from this printer"})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("label",{className:"text-sm text-white",children:"Quiet Hours (Do Not Disturb)"}),a.jsx($n,{checked:d,onChange:h})]}),d&&a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Start"}),a.jsx("input",{type:"time",value:m,onChange:X=>p(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"End"}),a.jsx("input",{type:"time",value:b,onChange:X=>v(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("label",{className:"text-sm text-white",children:"Daily Digest"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Batch notifications into a single daily summary"})]}),a.jsx($n,{checked:x,onChange:y})]}),x&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Send digest at"}),a.jsx("input",{type:"time",value:S,onChange:X=>N(X.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Events will be collected and sent as a single summary at this time"})]})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Notification Events"}),a.jsxs("div",{className:"space-y-2 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide mb-2",children:"Print Events"}),a.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Start"}),a.jsx($n,{checked:A,onChange:k})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Complete"}),a.jsx($n,{checked:C,onChange:E})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Failed"}),a.jsx($n,{checked:P,onChange:T})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Stopped"}),a.jsx($n,{checked:j,onChange:z})]}),a.jsxs("div",{className:"flex items-center justify-between col-span-2",children:[a.jsxs("div",{children:[a.jsx("span",{className:"text-sm text-white",children:"Progress"}),a.jsx("span",{className:"text-xs text-bambu-gray ml-1",children:"(25%, 50%, 75%)"})]}),a.jsx($n,{checked:L,onChange:B})]})]})]}),a.jsxs("div",{className:"space-y-2 p-3 bg-bambu-dark rounded-lg",children:[a.jsx("p",{className:"text-xs text-bambu-gray uppercase tracking-wide mb-2",children:"Printer Status"}),a.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Offline"}),a.jsx($n,{checked:R,onChange:$})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Error"}),a.jsx($n,{checked:q,onChange:I})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Low Filament"}),a.jsx($n,{checked:G,onChange:Y})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm text-white",children:"Maintenance"}),a.jsx($n,{checked:re,onChange:H})]})]})]})]}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:Xe,className:"flex-1",children:[Xe?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),r?"Save":"Add"]})]})]})]})})}function KYe({template:t,onClose:e}){const n=un(),r=_.useRef(null),[i,s]=_.useState(t.title_template),[o,l]=_.useState(t.body_template),[c,u]=_.useState(null),[d,h]=_.useState(!0),{data:m}=st({queryKey:["template-variables"],queryFn:ce.getTemplateVariables}),p=m?.find(k=>k.event_type===t.event_type),{data:b,isLoading:v}=st({queryKey:["template-preview",t.event_type,i,o],queryFn:()=>ce.previewTemplate({event_type:t.event_type,title_template:i,body_template:o}),enabled:d&&i.length>0&&o.length>0});_.useEffect(()=>{const k=C=>{C.key==="Escape"&&e()};return window.addEventListener("keydown",k),()=>window.removeEventListener("keydown",k)},[e]);const x=pt({mutationFn:k=>ce.updateNotificationTemplate(t.id,k),onSuccess:()=>{n.invalidateQueries({queryKey:["notification-templates"]}),e()},onError:k=>{u(k.message)}}),y=pt({mutationFn:()=>ce.resetNotificationTemplate(t.id),onSuccess:k=>{s(k.title_template),l(k.body_template),n.invalidateQueries({queryKey:["notification-templates"]})},onError:k=>{u(k.message)}}),S=k=>{if(k.preventDefault(),u(null),!i.trim()){u("Title is required");return}if(!o.trim()){u("Body is required");return}x.mutate({title_template:i,body_template:o})},N=k=>{const C=r.current;if(!C)return;const E=C.selectionStart,P=C.selectionEnd,T=o,j=T.substring(0,E),z=T.substring(P),L=j+`{${k}}`+z;l(L),setTimeout(()=>{C.focus();const B=E+k.length+2;C.setSelectionRange(B,B)},0)},A=i!==t.title_template||o!==t.body_template;return a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4",children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg w-full max-w-2xl max-h-[90vh] flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary shrink-0",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white",children:["Edit Template: ",t.name]}),a.jsx("button",{onClick:e,className:"p-1 hover:bg-bambu-dark-tertiary rounded transition-colors",children:a.jsx(Lt,{className:"w-5 h-5 text-bambu-gray"})})]}),a.jsxs("form",{onSubmit:S,className:"flex-1 overflow-y-auto p-4 space-y-4",children:[c&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded text-red-400 text-sm",children:c}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-1",children:"Title"}),a.jsx("input",{type:"text",value:i,onChange:k=>s(k.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green",placeholder:"Notification title..."})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-1",children:"Body"}),a.jsx("textarea",{ref:r,value:o,onChange:k=>l(k.target.value),rows:4,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green font-mono text-sm resize-none",placeholder:"Notification body..."})]}),p&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-bambu-gray mb-2",children:"Available Variables"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:p.variables.map(k=>a.jsxs("button",{type:"button",onClick:()=>N(k),className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-dark hover:bg-bambu-dark-tertiary border border-bambu-dark-tertiary rounded text-xs text-bambu-gray hover:text-white transition-colors",children:[a.jsx(dr,{className:"w-3 h-3"}),k]},k))}),a.jsx("p",{className:"text-xs text-bambu-gray/60 mt-1",children:"Click to insert at cursor position in body"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("label",{className:"text-sm font-medium text-bambu-gray flex items-center gap-2",children:[a.jsx(_c,{className:"w-4 h-4"}),"Live Preview"]}),a.jsx("button",{type:"button",onClick:()=>h(!d),className:"text-xs text-bambu-green hover:text-bambu-green-light",children:d?"Hide":"Show"})]}),d&&a.jsx("div",{className:"bg-bambu-dark border border-bambu-dark-tertiary rounded p-3 space-y-2",children:v?a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-sm",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Loading preview..."]}):b?a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Title:"}),a.jsx("div",{className:"text-white font-medium",children:b.title})]}),a.jsxs("div",{children:[a.jsx("span",{className:"text-xs text-bambu-gray",children:"Body:"}),a.jsx("div",{className:"text-white whitespace-pre-wrap text-sm",children:b.body})]})]}):a.jsx("div",{className:"text-bambu-gray text-sm",children:"Enter template content to see preview"})})]})]}),a.jsxs("div",{className:"flex items-center justify-between p-4 border-t border-bambu-dark-tertiary shrink-0",children:[a.jsxs(ke,{type:"button",variant:"ghost",onClick:()=>y.mutate(),disabled:y.isPending,className:"text-orange-400 hover:text-orange-300",children:[y.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin mr-2"}):a.jsx($h,{className:"w-4 h-4 mr-2"}),"Reset to Default"]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,children:"Cancel"}),a.jsxs(ke,{onClick:S,disabled:x.isPending||!A,children:[x.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin mr-2"}):a.jsx(gs,{className:"w-4 h-4 mr-2"}),"Save"]})]})]})]})})}const XYe={print_start:"Print Started",print_complete:"Print Complete",print_failed:"Print Failed",print_stopped:"Print Stopped",print_progress:"Progress",printer_offline:"Printer Offline",printer_error:"Printer Error",filament_low:"Low Filament",maintenance_due:"Maintenance Due",test:"Test"},YYe={print_start:"text-blue-400",print_complete:"text-bambu-green",print_failed:"text-red-400",print_stopped:"text-orange-400",print_progress:"text-yellow-400",printer_offline:"text-gray-400",printer_error:"text-rose-400",filament_low:"text-cyan-400",maintenance_due:"text-purple-400",test:"text-bambu-gray"};function QYe({onClose:t}){const e=un(),{showToast:n}=Hn(),[r,i]=_.useState(7),[s,o]=_.useState(null),[l,c]=_.useState(!1),{data:u}=st({queryKey:["settings"],queryFn:ce.getSettings}),d=u?.time_format||"system",{data:h,isLoading:m,refetch:p,isRefetching:b}=st({queryKey:["notification-logs",r,l],queryFn:()=>ce.getNotificationLogs({days:r,limit:100,success:l?!1:void 0})}),{data:v}=st({queryKey:["notification-log-stats",r],queryFn:()=>ce.getNotificationLogStats(r)}),x=pt({mutationFn:()=>ce.clearNotificationLogs(30),onSuccess:S=>{n(S.message,"success"),e.invalidateQueries({queryKey:["notification-logs"]}),e.invalidateQueries({queryKey:["notification-log-stats"]})},onError:S=>{n(`Failed to clear logs: ${S.message}`,"error")}}),y=S=>{const N=Hi(S);if(!N)return"";const k=new Date().getTime()-N.getTime();return k<6e4?"Just now":k<36e5?`${Math.floor(k/6e4)}m ago`:k<864e5?`${Math.floor(k/36e5)}h ago`:N.toLocaleDateString()+" "+cpe(N,d)};return a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:a.jsxs("div",{className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg w-full max-w-3xl max-h-[85vh] flex flex-col",children:[a.jsxs("div",{className:"p-4 border-b border-bambu-dark-tertiary flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(sy,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Notification Log"})]}),a.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white transition-colors",children:"×"})]}),v&&a.jsx("div",{className:"px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/50",children:a.jsxs("div",{className:"flex items-center gap-6 text-sm",children:[a.jsxs("span",{className:"text-bambu-gray",children:["Last ",r," days: ",a.jsx("span",{className:"text-white font-medium",children:v.total})," notifications"]}),a.jsxs("span",{className:"flex items-center gap-1 text-bambu-green",children:[a.jsx(Nr,{className:"w-4 h-4"}),v.success_count," sent"]}),v.failure_count>0&&a.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[a.jsx(ta,{className:"w-4 h-4"}),v.failure_count," failed"]})]})}),a.jsxs("div",{className:"px-4 py-3 border-b border-bambu-dark-tertiary flex items-center gap-4",children:[a.jsxs("select",{value:r,onChange:S=>i(Number(S.target.value)),className:"px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green",children:[a.jsx("option",{value:1,children:"Last 24 hours"}),a.jsx("option",{value:7,children:"Last 7 days"}),a.jsx("option",{value:30,children:"Last 30 days"}),a.jsx("option",{value:90,children:"Last 90 days"})]}),a.jsxs("label",{className:"flex items-center gap-2 text-sm text-bambu-gray cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:l,onChange:S=>c(S.target.checked),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),"Show failed only"]}),a.jsx("div",{className:"flex-1"}),a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>p(),disabled:b,children:[b?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Refresh"]}),a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>x.mutate(),disabled:x.isPending,className:"text-red-400 hover:text-red-300",children:[x.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),"Clear Old"]})]}),a.jsx("div",{className:"flex-1 overflow-y-auto p-4",children:m?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):h&&h.length>0?a.jsx("div",{className:"space-y-2",children:h.map(S=>a.jsx(ZYe,{log:S,isExpanded:s===S.id,onToggle:()=>o(s===S.id?null:S.id),formatDate:y,formatFullDate:N=>nb(N,d)},S.id))}):a.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[a.jsx(sy,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm",children:l?"No failed notifications":"No notifications logged"})]})})]})})}function ZYe({log:t,isExpanded:e,onToggle:n,formatDate:r,formatFullDate:i}){return a.jsxs("div",{className:`border rounded-lg overflow-hidden transition-colors ${t.success?"border-bambu-dark-tertiary bg-bambu-dark/30":"border-red-500/30 bg-red-500/5"}`,children:[a.jsxs("button",{className:"w-full px-3 py-2 flex items-center gap-3 text-left hover:bg-bambu-dark/50 transition-colors",onClick:n,children:[t.success?a.jsx(Nr,{className:"w-4 h-4 text-bambu-green shrink-0"}):a.jsx(ta,{className:"w-4 h-4 text-red-400 shrink-0"}),a.jsx("span",{className:`text-xs font-medium ${YYe[t.event_type]||"text-bambu-gray"}`,children:XYe[t.event_type]||t.event_type}),a.jsx("span",{className:"text-sm text-white truncate flex-1",children:t.provider_name||"Unknown Provider"}),t.printer_name&&a.jsx("span",{className:"text-xs text-bambu-gray",children:t.printer_name}),a.jsx("span",{className:"text-xs text-bambu-gray shrink-0",children:r(t.created_at)}),e?a.jsx(Ch,{className:"w-4 h-4 text-bambu-gray shrink-0"}):a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray shrink-0"})]}),e&&a.jsxs("div",{className:"px-3 py-2 border-t border-bambu-dark-tertiary bg-bambu-dark/20 space-y-2",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray mb-1",children:"Title"}),a.jsx("p",{className:"text-sm text-white",children:t.title})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-bambu-gray mb-1",children:"Message"}),a.jsx("p",{className:"text-sm text-white whitespace-pre-wrap",children:t.message})]}),!t.success&&t.error_message&&a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-red-400 mb-1",children:"Error"}),a.jsx("p",{className:"text-sm text-red-300",children:t.error_message})]}),a.jsxs("div",{className:"flex gap-4 text-xs text-bambu-gray pt-1",children:[a.jsxs("span",{children:["Provider: ",t.provider_type]}),a.jsxs("span",{children:["Time: ",i(t.created_at)]})]})]})]})}function JYe({formData:t,setFormData:e,groups:n,onClose:r,onCreate:i,isCreating:s,isCreateButtonDisabled:o}){const{t:l}=Sn();_.useEffect(()=>{const u=d=>{d.key==="Escape"&&r()};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[r]);const c=u=>{e({...t,group_ids:t.group_ids.includes(u)?t.group_ids.filter(d=>d!==u):[...t.group_ids,u]})};return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:r,children:a.jsxs(_t,{className:"w-full max-w-md",onClick:u=>u.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex flex-col gap-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:l("users.modal.createUser")})]}),a.jsx("p",{className:"text-sm text-bambu-gray ml-7",children:l("users.modal.advancedAuthSubtitle")||"with Advanced Authentication"})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:r,children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[l("users.form.username")," ",a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"text",value:t.username,onChange:u=>e({...t,username:u.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:l("users.form.usernamePlaceholder"),autoComplete:"username",required:!0})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[l("users.form.email")||"Email"," ",a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"email",value:t.email,onChange:u=>e({...t,email:u.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:l("users.form.emailPlaceholder")||"user@example.com",required:!0})]}),a.jsx("div",{className:"bg-bambu-dark-secondary/50 border border-bambu-green/20 rounded-lg p-3",children:a.jsx("p",{className:"text-sm text-bambu-gray",children:l("users.form.autoGeneratedPassword")||"A secure password will be automatically generated and emailed to the user."})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:l("users.form.groups")}),a.jsxs("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:[n.map(u=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:t.group_ids.includes(u.id),onChange:()=>c(u.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:u.name}),u.is_system&&a.jsxs("span",{className:"text-xs text-yellow-400",children:["(",l("users.system"),")"]})]},u.id)),n.length===0&&a.jsx("p",{className:"text-sm text-bambu-gray",children:l("users.noGroupsAvailable")})]})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:r,children:l("users.modal.cancel")}),a.jsx(ke,{onClick:i,disabled:o,children:s?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),l("users.modal.creating")]}):a.jsxs(a.Fragment,{children:[a.jsx(dr,{className:"w-4 h-4"}),l("users.modal.createUser")]})})]})]})]})})}function eQe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),[r,i]=_.useState(!1),[s,o]=_.useState(""),[l,c]=_.useState("auto"),[u,d]=_.useState(!1),[h,m]=_.useState(!0),[p,b]=_.useState("all"),[v,x]=_.useState(!1),[y,S]=_.useState(!1),{data:N,isLoading:A}=st({queryKey:["spoolman-settings"],queryFn:ce.getSpoolmanSettings}),{data:k,isLoading:C,refetch:E}=st({queryKey:["spoolman-status"],queryFn:ce.getSpoolmanStatus,refetchInterval:3e4}),{data:P}=st({queryKey:["printers"],queryFn:ce.getPrinters});_.useEffect(()=>{N&&(i(N.spoolman_enabled==="true"),o(N.spoolman_url||""),c(N.spoolman_sync_mode||"auto"),d(N.spoolman_disable_weight_sync==="true"),m(N.spoolman_report_partial_usage!=="false"),x(!0))},[N]),_.useEffect(()=>{if(!v||!N)return;if(N.spoolman_enabled==="true"!==r||(N.spoolman_url||"")!==s||(N.spoolman_sync_mode||"auto")!==l||N.spoolman_disable_weight_sync==="true"!==u||N.spoolman_report_partial_usage!=="false"!==h){const Y=setTimeout(()=>{T.mutate()},500);return()=>clearTimeout(Y)}},[r,s,l,u,h,v]);const T=pt({mutationFn:()=>ce.updateSpoolmanSettings({spoolman_enabled:r?"true":"false",spoolman_url:s,spoolman_sync_mode:l,spoolman_disable_weight_sync:u?"true":"false",spoolman_report_partial_usage:h?"true":"false"}),onSuccess:()=>{e.invalidateQueries({queryKey:["spoolman-settings"]}),e.invalidateQueries({queryKey:["spoolman-status"]}),n(t("settings.toast.settingsSaved"))}}),j=pt({mutationFn:ce.connectSpoolman,onSuccess:()=>{E()}}),z=pt({mutationFn:ce.disconnectSpoolman,onSuccess:()=>{E()}}),L=pt({mutationFn:ce.syncAllPrintersAms,onSuccess:G=>{G.success}}),B=pt({mutationFn:G=>ce.syncPrinterAms(G),onSuccess:G=>{G.success}}),R=()=>{p==="all"?L.mutate():B.mutate(p)},$=L.isPending||B.isPending,q=p==="all"?L.data:B.data,I=p==="all"?L.isSuccess:B.isSuccess;return A?a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Spoolman Integration"})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})})})]}):a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Spoolman Integration"})]}),T.isPending&&a.jsx(ut,{className:"w-4 h-4 text-bambu-green animate-spin"})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Connect to Spoolman for filament inventory tracking. AMS data will sync automatically."}),a.jsx("div",{className:"p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg",children:a.jsxs("div",{className:"flex gap-2",children:[a.jsx(ho,{className:"w-4 h-4 text-blue-400 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-xs text-blue-300",children:[a.jsx("p",{className:"font-medium mb-1",children:"How Sync Works"}),a.jsxs("ul",{className:"list-disc list-inside space-y-0.5 text-blue-300/80",children:[a.jsx("li",{children:"Only official Bambu Lab spools with RFID are synced"}),a.jsx("li",{children:"New spools are auto-created in Spoolman on first sync"}),a.jsx("li",{children:"Non-Bambu Lab spools (third-party, refilled) are skipped"})]}),a.jsx("p",{className:"font-medium mt-2 mb-1",children:"Linking Existing Spools"}),a.jsx("p",{className:"text-blue-300/80",children:'To link existing Spoolman spools to your AMS, hover over an AMS slot and click "Link to Spoolman".'})]})]})}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Enable Spoolman"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Sync filament data with Spoolman server"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:r,onChange:G=>i(G.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Spoolman URL"}),a.jsx("input",{type:"text",placeholder:"http://192.168.1.100:7912",value:s,onChange:G=>o(G.target.value),disabled:!r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray/50 focus:border-bambu-green focus:outline-none disabled:opacity-50"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"URL of your Spoolman server (e.g., http://localhost:7912)"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Sync Mode"}),a.jsxs("select",{value:l,onChange:G=>c(G.target.value),disabled:!r,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50",children:[a.jsx("option",{value:"auto",children:"Automatic"}),a.jsx("option",{value:"manual",children:"Manual Only"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:l==="auto"?"AMS data syncs automatically when changes are detected":"Only sync when manually triggered"})]}),l==="auto"&&a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:t("spoolman.disableWeightSync")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("spoolman.disableWeightSyncDesc")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:u,onChange:G=>d(G.target.checked),disabled:!r,className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),u&&a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:t("spoolman.reportPartialUsage")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("spoolman.reportPartialUsageDesc")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:h,onChange:G=>m(G.target.checked),disabled:!r,className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),r&&a.jsxs("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:"Status:"}),C?a.jsx(ut,{className:"w-4 h-4 text-bambu-gray animate-spin"}):k?.connected?a.jsxs("span",{className:"flex items-center gap-1 text-sm text-green-500",children:[a.jsx(qi,{className:"w-4 h-4"}),"Connected"]}):a.jsxs("span",{className:"flex items-center gap-1 text-sm text-red-500",children:[a.jsx(Lt,{className:"w-4 h-4"}),"Disconnected"]})]}),a.jsx("div",{className:"flex gap-2",children:k?.connected?a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>z.mutate(),disabled:z.isPending,children:[z.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($he,{className:"w-4 h-4"}),"Disconnect"]}):a.jsxs(ke,{size:"sm",onClick:()=>j.mutate(),disabled:j.isPending||!s,children:[j.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(bc,{className:"w-4 h-4"}),"Connect"]})})]}),j.isError&&a.jsx("div",{className:"mb-3 p-2 bg-red-500/20 border border-red-500/50 rounded text-sm text-red-400",children:j.error.message}),k?.connected&&a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-white",children:"Sync AMS Data"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Manually sync printer AMS data to Spoolman"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("div",{className:"relative flex-1",children:[a.jsxs("select",{value:p,onChange:G=>b(G.target.value==="all"?"all":Number(G.target.value)),className:"w-full px-3 py-2 pr-8 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"all",children:"All Printers"}),P?.map(G=>a.jsx("option",{value:G.id,children:G.name},G.id))]}),a.jsx(Sr,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:R,disabled:$,children:[$?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Sync"]})]})]}),I&&q&&a.jsxs("div",{className:"mt-3 space-y-2",children:[a.jsx("div",{className:`p-2 rounded text-sm ${q.success?"bg-green-500/20 border border-green-500/50 text-green-400":"bg-yellow-500/20 border border-yellow-500/50 text-yellow-400"}`,children:q.success?`Synced ${q.synced_count} spool${q.synced_count!==1?"s":""} successfully`:`Synced ${q.synced_count} spool${q.synced_count!==1?"s":""} with ${q.errors.length} error${q.errors.length!==1?"s":""}`}),q.skipped_count>0&&a.jsxs("div",{className:"p-2 bg-amber-500/10 border border-amber-500/30 rounded text-sm",children:[a.jsxs("div",{className:"flex items-center justify-between text-amber-400 mb-1",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx(kn,{className:"w-3.5 h-3.5"}),a.jsxs("span",{className:"font-medium",children:[q.skipped_count," spool",q.skipped_count!==1?"s":""," skipped"]})]}),q.skipped_count>5&&a.jsx("button",{onClick:()=>S(!y),className:"text-xs text-amber-400 hover:text-amber-300 underline",children:y?"Show less":"Show all"})]}),a.jsxs("ul",{className:"text-xs text-amber-300/80 space-y-0.5",children:[(y?q.skipped:q.skipped.slice(0,5)).map((G,Y)=>a.jsxs("li",{className:"flex items-center gap-2",children:[G.color&&a.jsx("span",{className:"w-3 h-3 rounded-full border border-white/20",style:{backgroundColor:`#${G.color}`}}),a.jsx("span",{children:G.location}),a.jsxs("span",{className:"text-amber-300/60",children:["- ",G.reason]})]},Y)),!y&&q.skipped_count>5&&a.jsxs("li",{className:"text-amber-300/60 italic",children:["...and ",q.skipped_count-5," more"]})]})]}),q.errors.length>0&&a.jsxs("div",{className:"p-2 bg-red-500/10 border border-red-500/30 rounded text-sm",children:[a.jsx("div",{className:"text-red-400 font-medium mb-1",children:"Errors:"}),a.jsx("ul",{className:"text-xs text-red-300/80 space-y-0.5",children:q.errors.map((G,Y)=>a.jsx("li",{children:G},Y))})]})]})]})]})]})}function tQe({link:t,onClose:e}){const n=un(),{mode:r}=Vh(),i=!!t,s=_.useRef(null),[o,l]=_.useState(t?.name||""),[c,u]=_.useState(t?.url||""),[d,h]=_.useState(t?.icon||"link"),[m,p]=_.useState(!!t?.custom_icon),[b,v]=_.useState(t?.custom_icon?ce.getExternalLinkIconUrl(t.id):null),[x,y]=_.useState(null),[S,N]=_.useState(null);_.useEffect(()=>{const z=L=>{L.key==="Escape"&&e()};return window.addEventListener("keydown",z),()=>window.removeEventListener("keydown",z)},[e]);const A=pt({mutationFn:async z=>{const L=await ce.createExternalLink(z);return x?await ce.uploadExternalLinkIcon(L.id,x):L},onSuccess:()=>{n.invalidateQueries({queryKey:["external-links"]}),e()},onError:z=>{N(z.message)}}),k=pt({mutationFn:async z=>{let L=await ce.updateExternalLink(t.id,z);return x?L=await ce.uploadExternalLinkIcon(t.id,x):!m&&t?.custom_icon&&(L=await ce.deleteExternalLinkIcon(t.id)),L},onSuccess:()=>{n.invalidateQueries({queryKey:["external-links"]}),e()},onError:z=>{N(z.message)}}),C=z=>{const L=z.target.files?.[0];if(L){if(!["image/png","image/jpeg","image/gif","image/svg+xml","image/webp","image/x-icon"].includes(L.type)){N("Please select a valid image file (PNG, JPG, GIF, SVG, WebP, or ICO)");return}if(L.size>1024*1024){N("Image file must be less than 1MB");return}y(L),p(!0);const R=new FileReader;R.onload=$=>{v($.target?.result)},R.readAsDataURL(L)}},E=()=>{y(null),v(null),p(!1),s.current&&(s.current.value="")},P=z=>{if(z.preventDefault(),N(null),!o.trim()){N("Name is required");return}if(!c.trim()){N("URL is required");return}if(!c.startsWith("http://")&&!c.startsWith("https://")){N("URL must start with http:// or https://");return}const L={name:o.trim(),url:c.trim(),icon:d};i?k.mutate(L):A.mutate(L)},T=A.isPending||k.isPending,j=qM(d);return a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:e,children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md",onClick:z=>z.stopPropagation(),children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 rounded-full bg-bambu-green/20 text-bambu-green",children:m&&b?a.jsx("img",{src:b,alt:"",className:`w-5 h-5 rounded ${r==="dark"?"invert opacity-[0.65]":"opacity-60"}`}):a.jsx(j,{className:"w-5 h-5"})}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i?"Edit Link":"Add External Link"})]}),a.jsx("button",{onClick:e,className:"text-bambu-gray hover:text-white transition-colors",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:P,className:"p-6 space-y-4",children:[S&&a.jsx("div",{className:"p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400",children:S}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name *"}),a.jsx("input",{type:"text",value:o,onChange:z=>l(z.target.value),placeholder:"My Link",maxLength:50,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"URL *"}),a.jsx("input",{type:"text",value:c,onChange:z=>u(z.target.value),placeholder:"https://example.com",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"space-y-3",children:[a.jsx("label",{className:"block text-sm text-bambu-gray",children:"Icon"}),a.jsxs("div",{className:"p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-sm text-white",children:"Custom Icon"}),a.jsx("input",{ref:s,type:"file",accept:"image/png,image/jpeg,image/gif,image/svg+xml,image/webp,image/x-icon",className:"hidden",onChange:C}),m&&b?a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("img",{src:b,alt:"Custom icon",className:`w-8 h-8 rounded border border-bambu-dark-tertiary ${r==="dark"?"invert opacity-[0.65]":"opacity-60"}`}),a.jsx("button",{type:"button",onClick:E,className:"p-1 text-red-400 hover:text-red-300 transition-colors",title:"Remove custom icon",children:a.jsx(cn,{className:"w-4 h-4"})})]}):a.jsxs(ke,{type:"button",variant:"secondary",size:"sm",onClick:()=>s.current?.click(),children:[a.jsx($a,{className:"w-4 h-4"}),"Upload"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"PNG, JPG, GIF, SVG, WebP, or ICO. Max 1MB."})]}),!m&&a.jsxs("div",{children:[a.jsx("span",{className:"text-sm text-bambu-gray block mb-2",children:"Or choose a preset icon"}),a.jsx(Yme,{value:d,onChange:h})]})]}),a.jsxs("div",{className:"flex gap-3 pt-2",children:[a.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),a.jsxs(ke,{type:"submit",disabled:T,className:"flex-1",children:[T?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(gs,{className:"w-4 h-4"}),i?"Save":"Add"]})]})]})]})})}function nQe(){const t=un(),[e,n]=_.useState(!1),[r,i]=_.useState(null),[s,o]=_.useState(null),[l,c]=_.useState(null),{data:u,isLoading:d}=st({queryKey:["external-links"],queryFn:ce.getExternalLinks}),h=pt({mutationFn:S=>ce.deleteExternalLink(S),onSuccess:()=>{t.invalidateQueries({queryKey:["external-links"]})}}),m=pt({mutationFn:S=>ce.reorderExternalLinks(S),onSuccess:()=>{t.invalidateQueries({queryKey:["external-links"]})}}),p=(S,N)=>{c(N),S.dataTransfer.effectAllowed="move"},b=S=>{S.preventDefault(),S.dataTransfer.dropEffect="move"},v=(S,N)=>{if(S.preventDefault(),l===null||l===N||!u)return;const A=u.map(P=>P.id),k=A.indexOf(l),C=A.indexOf(N);if(k===-1||C===-1)return;const E=[...A];E.splice(k,1),E.splice(C,0,l),m.mutate(E),c(null)},x=S=>{o(S)},y=()=>{s&&(h.mutate(s.id),o(null))};return a.jsxs(a.Fragment,{children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(bc,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Sidebar Links"})]}),a.jsxs(ke,{size:"sm",onClick:()=>n(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),"Add Link"]})]})}),a.jsxs(Mt,{children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-4",children:"Add external links to the sidebar navigation. Drag to reorder."}),d?a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):u&&u.length>0?a.jsx("div",{className:"space-y-2",children:u.map(S=>{const N=qM(S.icon);return a.jsxs("div",{draggable:!0,onDragStart:A=>p(A,S.id),onDragOver:b,onDrop:A=>v(A,S.id),className:`flex items-center gap-3 p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary transition-colors ${l===S.id?"opacity-50":""}`,children:[a.jsx(eb,{className:"w-6 h-6 md:w-4 md:h-4 text-bambu-gray cursor-grab flex-shrink-0"}),a.jsx("div",{className:"p-2 rounded-lg bg-bambu-dark-tertiary text-bambu-gray",children:a.jsx(N,{className:"w-4 h-4"})}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-white font-medium truncate",children:S.name}),a.jsx(Xr,{className:"w-3 h-3 text-bambu-gray flex-shrink-0"})]}),a.jsx("span",{className:"text-sm text-bambu-gray truncate block",children:S.url})]}),a.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[a.jsx("button",{onClick:()=>i(S),className:"p-2 rounded-lg hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white transition-colors",title:"Edit",children:a.jsx(na,{className:"w-4 h-4"})}),a.jsx("button",{onClick:()=>x(S),disabled:h.isPending,className:"p-2 rounded-lg hover:bg-red-500/20 text-bambu-gray hover:text-red-400 transition-colors disabled:opacity-50",title:"Delete",children:a.jsx(cn,{className:"w-4 h-4"})})]})]},S.id)})}):a.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[a.jsx(bc,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),a.jsx("p",{children:"No external links configured"}),a.jsx("p",{className:"text-sm",children:'Click "Add Link" to add one'})]})]})]}),(e||r)&&a.jsx(tQe,{link:r,onClose:()=>{n(!1),i(null)}}),s&&a.jsx(er,{title:"Delete Link",message:`Are you sure you want to delete "${s.name}"? This action cannot be undone.`,confirmText:"Delete",cancelText:"Cancel",variant:"danger",onConfirm:y,onCancel:()=>o(null)})]})}function rQe(){const{t}=Sn(),e=un(),{showToast:n}=Hn(),[r,i]=_.useState(!1),[s,o]=_.useState(""),[l,c]=_.useState("immediate"),[u,d]=_.useState("3DPrinter-X1-Carbon"),[h,m]=_.useState(null),[p,b]=_.useState(""),[v,x]=_.useState(!1),[y,S]=_.useState(null),{data:N,isLoading:A}=st({queryKey:["virtual-printer-settings"],queryFn:D1.getSettings,refetchInterval:1e4}),{data:k}=st({queryKey:["virtual-printer-models"],queryFn:D1.getModels}),{data:C}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:E}=st({queryKey:["network-interfaces"],queryFn:()=>ce.getNetworkInterfaces().then(I=>I.interfaces),enabled:l==="proxy"});_.useEffect(()=>{if(N){i(N.enabled);let I=N.mode==="queue"?"review":N.mode;I!=="immediate"&&I!=="review"&&I!=="print_queue"&&I!=="proxy"&&(I="immediate"),c(I),d(N.model),m(N.target_printer_id),b(N.remote_interface_ip||"")}},[N]);const P=pt({mutationFn:I=>D1.updateSettings(I),onSuccess:()=>{e.invalidateQueries({queryKey:["virtual-printer-settings"]}),n(t("virtualPrinter.toast.updated")),S(null)},onError:I=>{if(n(I.message||t("virtualPrinter.toast.failedToUpdate"),"error"),N){i(N.enabled);const G=N.mode==="queue"?"review":N.mode;c(["immediate","review","print_queue","proxy"].includes(G)?G:"immediate"),d(N.model),m(N.target_printer_id)}S(null)}}),T=()=>{const I=!r;if(I){if(l==="proxy"){if(!h){n(t("virtualPrinter.toast.targetPrinterRequired"),"error");return}}else if(!s&&!N?.access_code_set){n(t("virtualPrinter.toast.accessCodeRequired"),"error");return}}i(I),S("toggle"),P.mutate({enabled:I,access_code:l!=="proxy"&&s||void 0,mode:l,target_printer_id:l==="proxy"?h??void 0:void 0})},j=()=>{if(!s){n(t("virtualPrinter.toast.accessCodeEmpty"),"error");return}if(s.length!==8){n(t("virtualPrinter.toast.accessCodeLength"),"error");return}S("accessCode"),P.mutate({access_code:s}),o("")},z=I=>{c(I),S("mode"),P.mutate({mode:I})},L=I=>{m(I),S("targetPrinter"),P.mutate({target_printer_id:I})},B=I=>{d(I),S("model"),P.mutate({model:I})},R=I=>{b(I),S("remoteInterface"),P.mutate({remote_interface_ip:I})};if(A)return a.jsx(_t,{children:a.jsx(Mt,{className:"py-8 flex justify-center",children:a.jsx(ut,{className:"w-6 h-6 animate-spin text-bambu-green"})})});const $=N?.status,q=$?.running||!1;return a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsx("div",{className:"space-y-6 lg:w-[480px] lg:flex-shrink-0",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Or,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("virtualPrinter.title")})]}),$&&a.jsxs("div",{className:`flex items-center gap-2 text-sm ${q?"text-green-400":"text-bambu-gray"}`,children:[a.jsx("span",{className:`w-2 h-2 rounded-full ${q?"bg-green-400 animate-pulse":"bg-gray-500"}`}),t(q?"virtualPrinter.running":"virtualPrinter.stopped")]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:t(l==="proxy"?"virtualPrinter.description.proxy":"virtualPrinter.description.default")}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.enable.title")}),a.jsx("div",{className:"text-sm text-bambu-gray",children:q?l==="proxy"?t("virtualPrinter.enable.proxyingTo",{name:C?.find(I=>I.id===h)?.name||"printer"}):t("virtualPrinter.enable.visibleInSlicer"):t("virtualPrinter.enable.notActive")})]}),a.jsx("button",{onClick:T,disabled:y==="toggle",className:`relative w-12 h-6 rounded-full transition-colors ${r?"bg-bambu-green":"bg-bambu-dark-tertiary"} ${y==="toggle"?"opacity-50":""}`,children:a.jsx("span",{className:`absolute top-1 left-1 w-4 h-4 bg-white rounded-full transition-transform ${r?"translate-x-6":""}`})})]}),l!=="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.model.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:t("virtualPrinter.model.description")}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:u,onChange:I=>B(I.target.value),disabled:y==="model",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:k?.models&&Object.entries(k.models).sort(([,I],[,G])=>I.localeCompare(G)).map(([I,G])=>a.jsx("option",{value:I,children:G},I))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),r&&q&&a.jsxs("p",{className:"text-xs text-bambu-gray mt-2",children:[a.jsx(ho,{className:"w-3 h-3 inline mr-1"}),t("virtualPrinter.model.restartWarning")]})]}),l!=="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.accessCode.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:N?.access_code_set?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.accessCode.isSet")]}):a.jsxs("span",{className:"flex items-center gap-1 text-yellow-400",children:[a.jsx(kn,{className:"w-4 h-4"}),t("virtualPrinter.accessCode.notSet")]})}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("div",{className:"relative flex-1",children:[a.jsx("input",{type:v?"text":"password",value:s,onChange:I=>o(I.target.value),placeholder:N?.access_code_set?t("virtualPrinter.accessCode.placeholderChange"):t("virtualPrinter.accessCode.placeholder"),maxLength:8,className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white placeholder-bambu-gray pr-10 font-mono"}),a.jsx("button",{onClick:()=>x(!v),className:"absolute right-2 top-1/2 -translate-y-1/2 text-bambu-gray hover:text-white",children:v?a.jsx(RM,{className:"w-4 h-4"}):a.jsx(_c,{className:"w-4 h-4"})})]}),a.jsx(ke,{onClick:j,disabled:!s||y==="accessCode",variant:"primary",children:y==="accessCode"?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):t("common.save")})]}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-2",children:[t("virtualPrinter.accessCode.hint"),s&&a.jsxs("span",{className:s.length===8?"text-green-400":"text-yellow-400",children:[" ",t("virtualPrinter.accessCode.charCount",{count:s.length})]})]})]}),l==="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.targetPrinter.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:h?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.targetPrinter.configured")]}):a.jsxs("span",{className:"flex items-center gap-1 text-yellow-400",children:[a.jsx(kn,{className:"w-4 h-4"}),t("virtualPrinter.targetPrinter.notConfigured")]})}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:h??"",onChange:I=>{const G=parseInt(I.target.value,10);isNaN(G)||L(G)},disabled:y==="targetPrinter",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:[a.jsx("option",{value:"",children:t("virtualPrinter.targetPrinter.placeholder")}),C?.map(I=>a.jsxs("option",{value:I.id,children:[I.name," (",I.ip_address,")"]},I.id))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:t("virtualPrinter.targetPrinter.hint")}),!C?.length&&a.jsxs("p",{className:"text-xs text-yellow-400 mt-2",children:[a.jsx(kn,{className:"w-3 h-3 inline mr-1"}),t("virtualPrinter.targetPrinter.noPrinters")]})]}),l==="proxy"&&a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.remoteInterface.title")}),a.jsx("div",{className:"text-sm text-bambu-gray mb-3",children:p?a.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[a.jsx(qi,{className:"w-4 h-4"}),t("virtualPrinter.remoteInterface.configured")]}):a.jsxs("span",{className:"flex items-center gap-1 text-bambu-gray",children:[a.jsx(ho,{className:"w-4 h-4"}),t("virtualPrinter.remoteInterface.optional")]})}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:p,onChange:I=>R(I.target.value),disabled:y==="remoteInterface",className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-md px-3 py-2 text-white appearance-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed pr-10",children:[a.jsx("option",{value:"",children:t("virtualPrinter.remoteInterface.placeholder")}),E?.map(I=>a.jsxs("option",{value:I.ip,children:[I.name," (",I.ip,") - ",I.subnet]},I.ip))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:t("virtualPrinter.remoteInterface.hint")})]}),a.jsxs("div",{className:"py-3 border-t border-bambu-dark-tertiary",children:[a.jsx("div",{className:"text-white font-medium mb-2",children:t("virtualPrinter.mode.title")}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("button",{onClick:()=>z("immediate"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="immediate"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.archive")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.archiveDesc")})]}),a.jsxs("button",{onClick:()=>z("review"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="review"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.review")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.reviewDesc")})]}),a.jsxs("button",{onClick:()=>z("print_queue"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="print_queue"?"border-bambu-green bg-bambu-green/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsx("div",{className:"text-white font-medium",children:t("virtualPrinter.mode.queue")}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.queueDesc")})]}),a.jsxs("button",{onClick:()=>z("proxy"),disabled:y==="mode",className:`p-3 rounded-lg border text-left transition-colors ${l==="proxy"?"border-blue-500 bg-blue-500/10":"border-bambu-dark-tertiary hover:border-bambu-gray"}`,children:[a.jsxs("div",{className:"flex items-center gap-1.5 text-white font-medium",children:[a.jsx(hB,{className:"w-4 h-4"}),t("virtualPrinter.mode.proxy")]}),a.jsx("div",{className:"text-xs text-bambu-gray",children:t("virtualPrinter.mode.proxyDesc")})]})]})]})]})]})}),a.jsxs("div",{className:"space-y-6 lg:w-[480px] lg:flex-shrink-0",children:[a.jsx(_t,{className:"border-l-4 border-l-yellow-500",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-500 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm",children:[a.jsx("p",{className:"text-white font-medium mb-2",children:t("virtualPrinter.setupRequired.title")}),a.jsx("p",{className:"text-bambu-gray mb-3",children:t("virtualPrinter.setupRequired.description")}),a.jsxs("a",{href:"https://wiki.bambuddy.cool/features/virtual-printer/",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 px-4 py-2 bg-yellow-500/20 border border-yellow-500/50 rounded-md text-yellow-400 hover:bg-yellow-500/30 transition-colors",children:[a.jsx(Xr,{className:"w-4 h-4"}),t("virtualPrinter.setupRequired.readGuide")]})]})]})})}),a.jsx(_t,{children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(ho,{className:"w-5 h-5 text-blue-400 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm text-bambu-gray",children:[a.jsx("p",{className:"mb-2",children:a.jsxs("strong",{className:"text-white",children:[t(l==="proxy"?"virtualPrinter.howItWorks.titleProxy":"virtualPrinter.howItWorks.title"),":"]})}),l==="proxy"?a.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep1")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep2")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep3")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep4")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.proxyStep5")})]}):a.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[a.jsx("li",{children:t("virtualPrinter.howItWorks.step1")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step2")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step3")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step4")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step5")}),a.jsx("li",{children:t("virtualPrinter.howItWorks.step6")})]})]})]})})}),$&&q&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-md font-semibold text-white",children:t("virtualPrinter.status.title")})}),a.jsx(Mt,{children:$.mode==="proxy"&&$.proxy?a.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.targetPrinter")}),a.jsx("div",{className:"text-white",children:C?.find(I=>I.id===h)?.name||$.proxy.target_host}),a.jsx("div",{className:"text-xs text-bambu-gray font-mono",children:$.proxy.target_host})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mode")}),a.jsxs("div",{className:"text-white flex items-center gap-1.5",children:[a.jsx(hB,{className:"w-4 h-4"}),t("virtualPrinter.mode.proxy")]})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.ftpPort")}),a.jsx("div",{className:"text-white font-mono",children:$.proxy.ftp_port})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mqttPort")}),a.jsx("div",{className:"text-white font-mono",children:$.proxy.mqtt_port})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.ftpConnections")}),a.jsx("div",{className:"text-white",children:$.proxy.ftp_connections??0})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mqttConnections")}),a.jsx("div",{className:"text-white",children:$.proxy.mqtt_connections??0})]})]}):a.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.printerName")}),a.jsx("div",{className:"text-white",children:$.name})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.model")}),a.jsx("div",{className:"text-white",children:$.model_name||$.model})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.serialNumber")}),a.jsx("div",{className:"text-white font-mono",children:$.serial})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.mode")}),a.jsx("div",{className:"text-white capitalize",children:$.mode})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-bambu-gray",children:t("virtualPrinter.status.pendingFiles")}),a.jsx("div",{className:"text-white",children:$.pending_files})]})]})})]})]})]})}function RW({status:t}){if(!t)return null;const e={success:"bg-green-500/20 text-green-400",failed:"bg-red-500/20 text-red-400",skipped:"bg-yellow-500/20 text-yellow-400",running:"bg-blue-500/20 text-blue-400"},n={success:a.jsx(Nr,{className:"w-3 h-3"}),failed:a.jsx(ta,{className:"w-3 h-3"}),skipped:a.jsx(uO,{className:"w-3 h-3"}),running:a.jsx(ut,{className:"w-3 h-3 animate-spin"})};return a.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium ${e[t]||"bg-gray-500/20 text-gray-400"}`,children:[n[t],t.charAt(0).toUpperCase()+t.slice(1)]})}function iQe(t){return t?new Date(t).toLocaleString():"-"}function OW(t){if(!t)return"-";const e=new Date(t),n=new Date,r=e.getTime()-n.getTime(),i=Math.round(r/6e4);if(i<0){const s=Math.abs(i);if(s<60)return`${s}m ago`;const o=Math.floor(s/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}else{if(i<60)return`in ${i}m`;const s=Math.floor(i/60);return s<24?`in ${s}h`:`in ${Math.floor(s/24)}d`}}function aQe(){const t=un(),{showToast:e}=Hn(),{t:n}=Sn(),[r,i]=_.useState(""),[s,o]=_.useState(""),[l,c]=_.useState("main"),[u,d]=_.useState(!1),[h,m]=_.useState("daily"),[p,b]=_.useState(!0),[v,x]=_.useState(!0),[y,S]=_.useState(!1),[N,A]=_.useState(!0),[k,C]=_.useState(!1),[E,P]=_.useState(!1),[T,j]=_.useState(""),[z,L]=_.useState(!1),[B,R]=_.useState(null),[$,q]=_.useState(null),I=_.useRef(null);_.useEffect(()=>{if(k||E){const U=O=>(O.preventDefault(),O.returnValue="A backup operation is in progress. Are you sure you want to leave?",O.returnValue);return window.addEventListener("beforeunload",U),()=>window.removeEventListener("beforeunload",U)}},[k,E]);const[G,Y]=_.useState(!1),[re,H]=_.useState(null),K=_.useRef(null),ne=_.useRef(!1),{data:ie,isLoading:be}=st({queryKey:["github-backup-config"],queryFn:ce.getGitHubBackupConfig}),{data:pe}=st({queryKey:["github-backup-status"],queryFn:ce.getGitHubBackupStatus,refetchInterval:ee=>ee.state.data?.is_running?500:1e4}),{data:de}=st({queryKey:["github-backup-logs"],queryFn:()=>ce.getGitHubBackupLogs(20)}),{data:Ce}=st({queryKey:["cloud-status"],queryFn:ce.getCloudStatus}),{data:ae}=st({queryKey:["printers"],queryFn:ce.getPrinters}),Ae=iO({queries:(ae??[]).map(ee=>({queryKey:["printerStatus",ee.id],queryFn:()=>ce.getPrinterStatus(ee.id),staleTime:1e4,refetchInterval:3e4}))}),Le=(ae??[]).map((ee,U)=>({printer:ee,connected:Ae[U]?.data?.connected??!1})),fe=Le.length,Xe=Le.filter(ee=>ee.connected).length,W=fe>0&&Xe===0,Q=Xe>0&&Xe{ie&&(i(ie.repository_url),c(ie.branch),d(ie.schedule_enabled),m(ie.schedule_type),b(ie.backup_kprofiles),x(ie.backup_cloud_profiles),S(ie.backup_settings),A(ie.enabled),o(""),setTimeout(()=>{ne.current=!0},100))},[ie]);const me=_.useCallback(async(ee=!1)=>{if(ie?.has_token)try{ee&&s?(await ce.saveGitHubBackupConfig({repository_url:r,access_token:s,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N}),o(""),e("Token updated")):(await ce.updateGitHubBackupConfig({repository_url:r,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N}),e("Settings saved")),t.invalidateQueries({queryKey:["github-backup-config"]}),t.invalidateQueries({queryKey:["github-backup-status"]})}catch(U){e(`Failed to save: ${U.message}`,"error")}},[ie?.has_token,r,s,l,u,h,p,v,y,N,t,e]);_.useEffect(()=>{if(!(!ne.current||!ie?.has_token))return K.current&&clearTimeout(K.current),K.current=setTimeout(()=>{me(!1)},500),()=>{K.current&&clearTimeout(K.current)}},[r,l,u,h,p,v,y,N,me,ie?.has_token]),_.useEffect(()=>{if(!(!ne.current||!ie?.has_token||!s))return K.current&&clearTimeout(K.current),K.current=setTimeout(()=>{me(!0)},1e3),()=>{K.current&&clearTimeout(K.current)}},[s,me,ie?.has_token]);const X=pt({mutationFn:ee=>ce.saveGitHubBackupConfig(ee),onSuccess:()=>{t.invalidateQueries({queryKey:["github-backup-config"]}),t.invalidateQueries({queryKey:["github-backup-status"]}),e("GitHub backup enabled"),o(""),ne.current=!0},onError:ee=>{e(`Failed to save: ${ee.message}`,"error")}}),te=pt({mutationFn:ce.triggerGitHubBackup,onSuccess:ee=>{t.invalidateQueries({queryKey:["github-backup-status"]}),t.invalidateQueries({queryKey:["github-backup-logs"]}),ee.success?ee.files_changed>0?e(`Backup complete - ${ee.files_changed} files updated`):e("Backup skipped - no changes"):e(`Backup failed: ${ee.message}`,"error")},onError:ee=>{e(`Backup failed: ${ee.message}`,"error")}}),V=pt({mutationFn:()=>ce.clearGitHubBackupLogs(0),onSuccess:ee=>{t.invalidateQueries({queryKey:["github-backup-logs"]}),e(`Cleared ${ee.deleted} logs`)},onError:ee=>{e(`Failed to clear logs: ${ee.message}`,"error")}}),ge=async()=>{Y(!0),H(null);try{let ee;if(s){if(!r){e("Enter repository URL","error"),Y(!1);return}ee=await ce.testGitHubConnection(r,s)}else if(ie?.has_token)ee=await ce.testGitHubStoredConnection();else{e("Enter repository URL and access token","error"),Y(!1);return}H({success:ee.success,message:ee.message})}catch(ee){H({success:!1,message:ee.message})}finally{Y(!1)}},Se=()=>{if(!r){e("Repository URL is required","error");return}if(!s){e("Access token is required","error");return}X.mutate({repository_url:r,access_token:s,branch:l,schedule_enabled:u,schedule_type:h,backup_kprofiles:p,backup_cloud_profiles:v,backup_settings:y,enabled:N})};return be?a.jsx("div",{className:"flex items-center justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 animate-spin text-bambu-green"})}):a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-6",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(BP,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"GitHub Backup"})]}),ie&&Ce?.is_authenticated&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-bambu-gray",children:"Enabled"}),a.jsx($n,{checked:N,onChange:A})]})]})}),a.jsx(Mt,{className:"space-y-4",children:Ce?.is_authenticated?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically sync your profiles to a private GitHub repository for backup and version history."}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Repository URL"}),a.jsx("input",{type:"text",value:r,onChange:ee=>{i(ee.target.value),H(null)},placeholder:"https://github.com/username/bambuddy-backup",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:["Personal Access Token ",ie?.has_token&&a.jsx("span",{className:"text-green-400",children:"(saved)"})]}),a.jsx("input",{type:"password",value:s,onChange:ee=>{o(ee.target.value),H(null)},placeholder:ie?.has_token?"Enter new token to update":"ghp_xxxxxxxxxxxx",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Fine-grained token with Contents read/write permission"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Branch"}),a.jsx("input",{type:"text",value:l,onChange:ee=>c(ee.target.value),placeholder:"main",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Auto-backup"}),a.jsxs("select",{value:u?h:"disabled",onChange:ee=>{ee.target.value==="disabled"?d(!1):(d(!0),m(ee.target.value))},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"disabled",children:"Manual only"}),a.jsx("option",{value:"hourly",children:"Hourly"}),a.jsx("option",{value:"daily",children:"Daily"}),a.jsx("option",{value:"weekly",children:"Weekly"})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:"Include in backup"}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("label",{className:`flex items-start gap-2 ${W?"cursor-not-allowed opacity-60":"cursor-pointer"}`,children:[a.jsx("input",{type:"checkbox",checked:p,onChange:ee=>b(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green",disabled:W}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`text-sm ${W?"text-bambu-gray":"text-white"}`,children:"K-Profiles"}),W&&a.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:[a.jsx(kn,{className:"w-3 h-3"}),"No printers connected"]}),Q&&a.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:[a.jsx(kn,{className:"w-3 h-3"}),Xe,"/",fe," connected"]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Pressure advance calibration from connected printers"})]})]}),a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:v,onChange:ee=>x(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green",disabled:!Ce?.is_authenticated}),a.jsxs("div",{children:[a.jsx("span",{className:`text-sm ${Ce?.is_authenticated?"text-white":"text-bambu-gray"}`,children:"Cloud Profiles"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Filament, printer, and process presets from Bambu Cloud"})]})]}),a.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:y,onChange:ee=>S(ee.target.checked),className:"w-4 h-4 mt-0.5 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white text-sm",children:"App Settings"}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Bambuddy configuration (excludes sensitive data)"})]})]})]})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 space-y-3",children:[pe?.configured&&a.jsxs("div",{className:"flex items-center justify-between text-sm",children:[a.jsx("div",{className:"flex items-center gap-2 text-bambu-gray",children:pe.last_backup_at?a.jsxs(a.Fragment,{children:[a.jsxs("span",{children:["Last backup: ",OW(pe.last_backup_at)]}),a.jsx(RW,{status:pe.last_backup_status})]}):a.jsx("span",{children:"No backups yet"})}),pe.next_scheduled_run&&a.jsxs("span",{className:"text-bambu-gray",children:[a.jsx(nr,{className:"w-3 h-3 inline mr-1"}),"Next: ",OW(pe.next_scheduled_run)]})]}),re&&a.jsxs("div",{className:`text-sm flex items-center gap-1 ${re.success?"text-green-400":"text-red-400"}`,children:[re.success?a.jsx(Nr,{className:"w-4 h-4"}):a.jsx(ta,{className:"w-4 h-4"}),re.message]}),a.jsx("div",{className:"flex flex-wrap items-center gap-2",children:pe?.configured?a.jsx(a.Fragment,{children:te.isPending||pe.is_running?a.jsxs("div",{className:"flex items-center gap-2 text-bambu-green",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),a.jsx("span",{className:"text-sm",children:pe.progress||"Starting backup..."})]}):a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"primary",size:"sm",onClick:()=>te.mutate(),disabled:!ie?.enabled,children:[a.jsx(vo,{className:"w-4 h-4"}),"Backup Now"]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:ge,disabled:G,children:[G?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Test"]})]})}):a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"primary",size:"sm",onClick:Se,disabled:X.isPending||!r||!s,children:[X.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Nr,{className:"w-4 h-4"}),"Enable Backup"]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:ge,disabled:G||!r||!s,children:[G?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Test Connection"]})]})})]})]}):a.jsxs("div",{className:"flex items-start gap-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsx("p",{className:"text-sm text-yellow-400",children:"Bambu Cloud login required. Sign in under Profiles → Cloud Profiles to enable GitHub backup."})]})})]}),de&&de.length>0&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(sy,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"History"})]}),a.jsxs(ke,{variant:"ghost",size:"sm",onClick:()=>V.mutate(),disabled:V.isPending,children:[a.jsx(cn,{className:"w-4 h-4"}),"Clear"]})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full text-sm",children:[a.jsx("thead",{children:a.jsxs("tr",{className:"text-bambu-gray border-b border-bambu-dark-tertiary",children:[a.jsx("th",{className:"text-left py-2 px-2",children:"Date"}),a.jsx("th",{className:"text-left py-2 px-2",children:"Status"}),a.jsx("th",{className:"text-left py-2 px-2",children:"Commit"})]})}),a.jsx("tbody",{children:de.slice(0,10).map(ee=>a.jsxs("tr",{className:"border-b border-bambu-dark-tertiary/50 hover:bg-bambu-dark-secondary",children:[a.jsx("td",{className:"py-2 px-2 text-white",children:iQe(ee.started_at)}),a.jsx("td",{className:"py-2 px-2",children:a.jsx(RW,{status:ee.status})}),a.jsx("td",{className:"py-2 px-2",children:ee.commit_sha?a.jsxs("a",{href:`${ie?.repository_url}/commit/${ee.commit_sha}`,target:"_blank",rel:"noopener noreferrer",className:"text-bambu-green hover:underline inline-flex items-center gap-1",children:[ee.commit_sha.substring(0,7),a.jsx(Xr,{className:"w-3 h-3"})]}):a.jsx("span",{className:"text-bambu-gray",children:"-"})})]},ee.id))})]})})})]})]}),a.jsx("div",{className:"space-y-6",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ju,{className:"w-5 h-5 text-gray-400"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Local Backup"})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Create a complete backup of your Bambuddy data including the database, archives, uploads, and all files."}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Download Backup"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Complete backup: database + all files (ZIP)"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",disabled:k||E,onClick:async()=>{C(!0),j("Preparing backup...");try{j("Creating backup archive... This may take a while for large archives.");const{blob:ee,filename:U}=await ce.exportBackup();j("Downloading backup file...");const O=URL.createObjectURL(ee),Z=document.createElement("a");Z.href=O,Z.download=U,Z.click(),URL.revokeObjectURL(O),e("Backup downloaded successfully")}catch(ee){e(`Failed to create backup: ${ee instanceof Error?ee.message:"Unknown error"}`,"error")}finally{C(!1),j("")}},children:[a.jsx(Ni,{className:"w-4 h-4"}),"Download"]})]}),a.jsxs("div",{className:"flex items-center justify-between py-3 border-b border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:n("backup.restoreBackup")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:n("backup.restoreDescription")}),a.jsx("p",{className:"text-xs text-bambu-gray-light mt-1",children:n("backup.restoreNote")})]}),a.jsx("input",{ref:I,type:"file",accept:".zip",className:"hidden",onChange:ee=>{const U=ee.target.files?.[0];U&&(R(U),L(!0)),ee.target.value=""}}),a.jsxs(ke,{variant:"secondary",size:"sm",disabled:E||k,onClick:()=>I.current?.click(),children:[a.jsx($a,{className:"w-4 h-4"}),"Restore"]})]}),$&&a.jsx("div",{className:`p-3 rounded-lg ${$.success?"bg-green-500/10 border border-green-500/30":"bg-red-500/10 border border-red-500/30"}`,children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[$.success?a.jsx(Nr,{className:"w-4 h-4 text-green-400 mt-0.5 flex-shrink-0"}):a.jsx(ta,{className:"w-4 h-4 text-red-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:$.success?"text-green-200":"text-red-200",children:[$.message,$.success&&a.jsx("div",{className:"mt-2",children:a.jsxs(ke,{size:"sm",onClick:()=>window.location.reload(),children:[a.jsx($h,{className:"w-3 h-3"}),"Reload Now"]})})]})]})}),a.jsx("div",{className:"p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"text-yellow-200",children:[a.jsx("span",{className:"font-medium",children:"Restore replaces all data."})," ",a.jsx("span",{className:"text-yellow-200/70",children:"Your current database and files will be completely replaced. A restart is required after restore."})]})]})})]})]})}),z&&B&&a.jsx(er,{title:"Restore Backup",message:`Are you sure you want to restore from "${B.name}"? This will completely replace your current database and all files. The application will need to be restarted after restore.`,confirmText:"Restore Backup",variant:"danger",onConfirm:async()=>{L(!1),P(!0),q(null);try{j("Uploading backup file...");const ee=await ce.importBackup(B);q(ee),ee.success?e("Backup restored. Please restart Bambuddy.","success"):e(ee.message,"error")}catch(ee){const U=ee instanceof Error?ee.message:"Failed to restore backup";q({success:!1,message:U}),e(U,"error")}finally{P(!1),j(""),R(null)}},onCancel:()=>{L(!1),R(null)}}),(k||E)&&a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-[100]",children:a.jsxs("div",{className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-xl p-8 max-w-md w-full mx-4 text-center",children:[a.jsx("div",{className:"flex justify-center mb-4",children:a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:"w-16 h-16 border-4 border-bambu-dark-tertiary rounded-full"}),a.jsx("div",{className:"w-16 h-16 border-4 border-bambu-green border-t-transparent rounded-full absolute inset-0 animate-spin"})]})}),a.jsx("h3",{className:"text-xl font-semibold text-white mb-2",children:k?"Creating Backup":"Restoring Backup"}),a.jsx("p",{className:"text-bambu-gray mb-4",children:T||(k?"Preparing...":"Processing...")}),a.jsx("div",{className:"p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:a.jsxs("div",{className:"flex items-start gap-2 text-sm",children:[a.jsx(kn,{className:"w-4 h-4 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsx("p",{className:"text-yellow-200 text-left",children:"Please do not close this page or navigate away. This operation may take several minutes for large backups."})]})})]})})]})}function sQe(){const{t}=Sn(),{showToast:e}=Hn(),n=un(),[r,i]=_.useState({smtp_host:"",smtp_port:587,smtp_username:"",smtp_password:"",smtp_security:"starttls",smtp_auth_enabled:!0,smtp_from_email:"",smtp_from_name:"BamBuddy"}),[s,o]=_.useState(""),{data:l,isLoading:c}=st({queryKey:["smtpSettings"],queryFn:()=>ce.getSMTPSettings()}),{data:u}=st({queryKey:["advancedAuthStatus"],queryFn:()=>ce.getAdvancedAuthStatus()});_.useEffect(()=>{l&&i({...l,smtp_password:""})},[l]);const d=pt({mutationFn:x=>ce.saveSMTPSettings(x),onSuccess:()=>{n.invalidateQueries({queryKey:["smtpSettings"]}),n.invalidateQueries({queryKey:["advancedAuthStatus"]}),e("SMTP settings saved successfully","success")},onError:x=>{e(x.message,"error")}}),h=pt({mutationFn:x=>ce.testSMTP(x),onSuccess:x=>{e(x.message,x.success?"success":"error")},onError:x=>{e(x.message,"error")}}),m=pt({mutationFn:x=>x?ce.enableAdvancedAuth():ce.disableAdvancedAuth(),onSuccess:x=>{n.invalidateQueries({queryKey:["advancedAuthStatus"]}),e(x.message,"success")},onError:x=>{e(x.message,"error")}}),p=()=>{if(!r.smtp_host||!r.smtp_from_email){e("Please fill in all required fields","error");return}if(r.smtp_auth_enabled&&!r.smtp_username){e("Username is required when authentication is enabled","error");return}d.mutate(r)},b=()=>{if(!s){e("Please enter a test email address","error");return}if(!r.smtp_host||!r.smtp_from_email){e("Please fill in SMTP Server and From Email before testing","error");return}if(r.smtp_auth_enabled&&(!r.smtp_username||!r.smtp_password)){e("Username and Password are required when authentication is enabled","error");return}h.mutate({smtp_host:r.smtp_host,smtp_port:r.smtp_port,smtp_username:r.smtp_username,smtp_password:r.smtp_password,smtp_security:r.smtp_security,smtp_auth_enabled:r.smtp_auth_enabled,smtp_from_email:r.smtp_from_email,test_recipient:s})},v=()=>{if(!u?.advanced_auth_enabled&&!u?.smtp_configured){e("Please configure and test SMTP settings first","error");return}m.mutate(!u?.advanced_auth_enabled)};return c?a.jsx("div",{className:"flex items-center justify-center p-12",children:a.jsx(ut,{className:"w-8 h-8 animate-spin text-bambu-green"})}):a.jsxs("div",{className:"space-y-6",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.smtpSettings")||"SMTP Configuration"})}),a.jsx(Mt,{children:a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[t("settings.email.smtpHost")||"SMTP Server"," *"]}),a.jsx("input",{type:"text",value:r.smtp_host,onChange:x=>i({...r,smtp_host:x.target.value}),placeholder:"smtp.gmail.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.smtpPort")||"SMTP Port"}),a.jsx("input",{type:"number",value:r.smtp_port,onChange:x=>i({...r,smtp_port:parseInt(x.target.value)||587}),placeholder:"587",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.security")||"Security"}),a.jsxs("select",{value:r.smtp_security,onChange:x=>i({...r,smtp_security:x.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",children:[a.jsx("option",{value:"starttls",children:"STARTTLS (Port 587)"}),a.jsx("option",{value:"ssl",children:"SSL/TLS (Port 465)"}),a.jsx("option",{value:"none",children:"None (Port 25)"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.authentication")||"Authentication"}),a.jsxs("select",{value:r.smtp_auth_enabled?"true":"false",onChange:x=>i({...r,smtp_auth_enabled:x.target.value==="true"}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",children:[a.jsx("option",{value:"true",children:"Enabled"}),a.jsx("option",{value:"false",children:"Disabled"})]})]})]}),r.smtp_auth_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.username")||"Username"}),a.jsx("input",{type:"text",value:r.smtp_username||"",onChange:x=>i({...r,smtp_username:x.target.value}),placeholder:"your.email@gmail.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.password")||"Password"}),a.jsx("input",{type:"password",value:r.smtp_password||"",onChange:x=>i({...r,smtp_password:x.target.value}),placeholder:l?"••••••••":"App password",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[t("settings.email.fromEmail")||"From Email"," *"]}),a.jsx("input",{type:"email",value:r.smtp_from_email,onChange:x=>i({...r,smtp_from_email:x.target.value}),placeholder:"your@email.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.fromName")||"From Name"}),a.jsx("input",{type:"text",value:r.smtp_from_name,onChange:x=>i({...r,smtp_from_name:x.target.value}),placeholder:"BamBuddy",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]})]}),a.jsx("div",{className:"flex gap-2",children:a.jsx(ke,{onClick:p,disabled:d.isPending,className:"flex-1",children:d.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),t("settings.email.saving")||"Saving..."]}):t("settings.email.save")||"Save Settings"})})]})})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.testConnection")||"Test SMTP Connection"})}),a.jsx(Mt,{children:a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:t("settings.email.testRecipient")||"Test Recipient Email"}),a.jsx("input",{type:"email",value:s,onChange:x=>o(x.target.value),placeholder:"test@example.com",className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors"})]}),a.jsx(ke,{onClick:b,disabled:h.isPending,variant:"secondary",children:h.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),t("settings.email.sending")||"Sending..."]}):a.jsxs(a.Fragment,{children:[a.jsx($M,{className:"w-4 h-4"}),t("settings.email.sendTest")||"Send Test Email"]})})]})})]}),u?.smtp_configured&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(oy,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:t("settings.email.advancedAuth")||"Advanced Authentication"})]}),a.jsx(ke,{onClick:v,disabled:m.isPending,variant:u?.advanced_auth_enabled?"danger":"primary",children:u?.advanced_auth_enabled?a.jsxs(a.Fragment,{children:[a.jsx(j1,{className:"w-4 h-4"}),t("settings.email.disable")||"Disable"]}):a.jsxs(a.Fragment,{children:[a.jsx(P1,{className:"w-4 h-4"}),t("settings.email.enable")||"Enable"]})})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"space-y-4",children:u?.advanced_auth_enabled?a.jsx("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(Nr,{className:"w-5 h-5 text-green-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-white font-medium",children:t("settings.email.advancedAuthEnabled")||"Advanced Authentication is enabled"}),a.jsxs("ul",{className:"text-sm text-green-300 space-y-1 list-disc list-inside",children:[a.jsx("li",{children:t("settings.email.feature1")||"Passwords are auto-generated and emailed to new users"}),a.jsx("li",{children:t("settings.email.feature2")||"Users can login with username or email"}),a.jsx("li",{children:t("settings.email.feature3")||"Forgot password feature is available"}),a.jsx("li",{children:t("settings.email.feature4")||"Admins can reset user passwords via email"})]})]})]})}):a.jsx("div",{className:"bg-yellow-500/10 border border-yellow-500/30 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-400 mt-0.5 flex-shrink-0"}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("p",{className:"text-white font-medium",children:t("settings.email.advancedAuthDisabled")||"Advanced Authentication is disabled"}),a.jsx("p",{className:"text-sm text-yellow-300",children:t("settings.email.advancedAuthDisabledDesc")||"Enable advanced authentication to activate email-based features for user management."})]})]})})})})]})]})}const oQe={get:"bg-blue-500/20 text-blue-400 border-blue-500/30",post:"bg-green-500/20 text-green-400 border-green-500/30",put:"bg-yellow-500/20 text-yellow-400 border-yellow-500/30",patch:"bg-orange-500/20 text-orange-400 border-orange-500/30",delete:"bg-red-500/20 text-red-400 border-red-500/30"};function lQe(t,e){const n=e.replace("#/","").split("/");let r=t;for(const i of n)r=r[i];return r}function T0(t,e,n=0){if(n>5)return"...";if(e.$ref)return T0(t,lQe(t,e.$ref),n+1);if(e.allOf){const r={};for(const i of e.allOf){const s=T0(t,i,n+1);typeof s=="object"&&s!==null&&Object.assign(r,s)}return r}if(e.example!==void 0)return e.example;if(e.default!==void 0)return e.default;switch(e.type){case"string":return e.enum?e.enum[0]:"string";case"integer":case"number":return 0;case"boolean":return!1;case"array":return e.items?[T0(t,e.items,n+1)]:[];case"object":if(e.properties){const r={};for(const[i,s]of Object.entries(e.properties))r[i]=T0(t,s,n+1);return r}return{};default:return null}}function cQe({path:t,method:e,spec:n,schema:r,apiKey:i}){const[s,o]=_.useState(!1),[l,c]=_.useState({}),[u,d]=_.useState(""),[h,m]=_.useState(null),[p,b]=_.useState(!1),[v,x]=_.useState(!1);_.useEffect(()=>{if(s&&n.parameters){const P={};for(const T of n.parameters)T.schema?.default!==void 0&&(P[T.name]=String(T.schema.default));c(T=>({...P,...T}))}},[s,n.parameters]),_.useEffect(()=>{if(s&&n.requestBody?.content?.["application/json"]?.schema&&!u){const P=n.requestBody.content["application/json"].schema,T=T0(r,P);d(JSON.stringify(T,null,2))}},[s,n.requestBody,r,u]);const S=(()=>{const P=[];for(const T of n.parameters||[])if(T.in==="path"||T.required){const j=l[T.name];(j===void 0||j==="")&&P.push(T.name)}return P})(),N=async()=>{if(S.length>0){m({status:0,statusText:"Validation Error",headers:{},body:`Missing required parameters: ${S.join(", ")}`,duration:0});return}b(!0),m(null);try{let P=t;const T=new URLSearchParams;for(const re of n.parameters||[]){const H=l[re.name];H!==void 0&&H!==""&&(re.in==="path"?P=P.replace(`{${re.name}}`,encodeURIComponent(H)):re.in==="query"&&T.append(re.name,H))}const j=T.toString(),z=`${P}${j?`?${j}`:""}`,L={"Content-Type":"application/json"};i&&(L["X-API-Key"]=i);const B={method:e.toUpperCase(),headers:L};["post","put","patch"].includes(e)&&u&&(B.body=u);const R=performance.now(),$=await fetch(z,B),q=Math.round(performance.now()-R),I={};$.headers.forEach((re,H)=>{I[H]=re});let G;$.headers.get("content-type")?.includes("application/json")?G=await $.json():G=await $.text(),m({status:$.status,statusText:$.statusText,headers:I,body:G,duration:q})}catch(P){m({status:0,statusText:"Network Error",headers:{},body:P instanceof Error?P.message:"Unknown error",duration:0})}finally{b(!1)}},A=async()=>{if(h){const P=typeof h.body=="string"?h.body:JSON.stringify(h.body,null,2);try{await navigator.clipboard.writeText(P),x(!0),setTimeout(()=>x(!1),2e3)}catch{const T=document.createElement("textarea");T.value=P,T.style.position="fixed",T.style.left="-999999px",document.body.appendChild(T),T.select(),document.execCommand("copy"),document.body.removeChild(T),x(!0),setTimeout(()=>x(!1),2e3)}}},k=(n.parameters||[]).filter(P=>P.in==="path"),C=(n.parameters||[]).filter(P=>P.in==="query"),E=["post","put","patch"].includes(e)&&n.requestBody;return a.jsxs("div",{className:"border border-bambu-dark-tertiary rounded-lg overflow-hidden",children:[a.jsxs("button",{onClick:()=>o(!s),className:"w-full flex items-center gap-3 p-3 hover:bg-bambu-dark-tertiary/50 transition-colors text-left",children:[s?a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}):a.jsx(_s,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}),a.jsx("span",{className:`px-2 py-0.5 text-xs font-mono font-semibold uppercase rounded border ${oQe[e]||"bg-gray-500/20 text-gray-400"}`,children:e}),a.jsx("code",{className:"text-sm text-white font-mono flex-1 truncate",children:t}),n.summary&&a.jsx("span",{className:"text-sm text-bambu-gray truncate max-w-[40%]",children:n.summary})]}),s&&a.jsxs("div",{className:"border-t border-bambu-dark-tertiary p-4 space-y-4 bg-bambu-dark/50",children:[n.description&&a.jsx("p",{className:"text-sm text-bambu-gray",children:n.description}),k.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Path Parameters"}),a.jsx("div",{className:"space-y-2",children:k.map(P=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("label",{className:"text-sm text-bambu-gray w-32 flex-shrink-0",children:[P.name,P.required&&a.jsx("span",{className:"text-red-400 ml-1",children:"*"})]}),a.jsx("input",{type:"text",value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),placeholder:P.description||P.schema?.type||"value",className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm font-mono focus:border-bambu-green focus:outline-none"})]},P.name))})]}),C.length>0&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Query Parameters"}),a.jsx("div",{className:"space-y-2",children:C.map(P=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("label",{className:"text-sm text-bambu-gray w-32 flex-shrink-0",children:[P.name,P.required&&a.jsx("span",{className:"text-red-400 ml-1",children:"*"})]}),P.schema?.enum?a.jsxs("select",{value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"",children:"-- Select --"}),P.schema.enum.map(T=>a.jsx("option",{value:T,children:T},T))]}):a.jsx("input",{type:"text",value:l[P.name]||"",onChange:T=>c(j=>({...j,[P.name]:T.target.value})),placeholder:P.description||P.schema?.type||"value",className:"flex-1 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm font-mono focus:border-bambu-green focus:outline-none"})]},P.name))})]}),E&&a.jsxs("div",{className:"space-y-2",children:[a.jsx("h4",{className:"text-sm font-medium text-white",children:"Request Body"}),a.jsx("textarea",{value:u,onChange:P=>d(P.target.value),rows:8,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm font-mono focus:border-bambu-green focus:outline-none resize-y",placeholder:"JSON request body..."})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs(ke,{onClick:N,disabled:p,children:[p?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(vo,{className:"w-4 h-4"}),"Execute"]}),S.length>0&&a.jsxs("span",{className:"text-xs text-yellow-400 flex items-center gap-1",children:[a.jsx(Wi,{className:"w-3 h-3"}),"Fill in: ",S.join(", ")]})]}),h&&a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h4",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Response",a.jsxs("span",{className:`px-2 py-0.5 text-xs rounded ${h.status>=200&&h.status<300?"bg-green-500/20 text-green-400":h.status>=400?"bg-red-500/20 text-red-400":"bg-yellow-500/20 text-yellow-400"}`,children:[h.status," ",h.statusText]}),a.jsxs("span",{className:"text-xs text-bambu-gray",children:[h.duration,"ms"]})]}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:A,children:v?a.jsx(Nr,{className:"w-3 h-3 text-green-400"}):a.jsx(Fl,{className:"w-3 h-3"})})]}),a.jsx("pre",{className:"p-3 bg-bambu-dark rounded-lg text-sm font-mono text-white overflow-auto max-h-96 border border-bambu-dark-tertiary",children:typeof h.body=="string"?h.body:JSON.stringify(h.body,null,2)})]})]})]})}function uQe({apiKey:t=""}){const[e,n]=_.useState(null),[r,i]=_.useState(!0),[s,o]=_.useState(null),[l,c]=_.useState(new Set),[u,d]=_.useState("");if(_.useEffect(()=>{async function x(){try{const y=await fetch("/openapi.json");if(!y.ok)throw new Error("Failed to fetch OpenAPI schema");const S=await y.json();n(S)}catch(y){o(y instanceof Error?y.message:"Unknown error")}finally{i(!1)}}x()},[]),r)return a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})});if(s||!e)return a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-red-400",children:[a.jsx(Wi,{className:"w-12 h-12 mx-auto mb-3 opacity-50"}),a.jsx("p",{children:"Failed to load API schema"}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:s})]})})});const h={};for(const[x,y]of Object.entries(e.paths))for(const[S,N]of Object.entries(y)){if(S==="parameters")continue;const A=N.tags||["Other"];for(const k of A)h[k]||(h[k]=[]),h[k].push({path:x,method:S,spec:N})}const m=Object.entries(h).map(([x,y])=>{if(!u)return{tag:x,endpoints:y};const S=y.filter(({path:N,method:A,spec:k})=>{const C=u.toLowerCase();return N.toLowerCase().includes(C)||A.toLowerCase().includes(C)||(k.summary?.toLowerCase()||"").includes(C)||(k.description?.toLowerCase()||"").includes(C)});return{tag:x,endpoints:S}}).filter(({endpoints:x})=>x.length>0).sort((x,y)=>x.tag.localeCompare(y.tag)),p=x=>{c(y=>{const S=new Set(y);return S.has(x)?S.delete(x):S.add(x),S})},b=()=>{c(new Set(m.map(x=>x.tag)))},v=()=>{c(new Set)};return a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsx("div",{className:"flex-1",children:a.jsx("input",{type:"text",value:u,onChange:x=>d(x.target.value),placeholder:"Search endpoints...",className:"w-full max-w-md px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(ke,{variant:"secondary",size:"sm",onClick:b,children:"Expand All"}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:v,children:"Collapse All"}),a.jsxs("a",{href:"/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-bambu-green hover:underline",children:[a.jsx(Xr,{className:"w-4 h-4"}),"Swagger UI"]})]})]}),a.jsxs("p",{className:"text-sm text-bambu-gray",children:[m.reduce((x,y)=>x+y.endpoints.length,0)," endpoints in ",m.length," categories"]}),a.jsx("div",{className:"space-y-3",children:m.map(({tag:x,endpoints:y})=>a.jsxs(_t,{children:[a.jsx("button",{onClick:()=>p(x),className:"w-full flex items-center justify-between p-4 hover:bg-bambu-dark-tertiary/30 transition-colors text-left",children:a.jsxs("div",{className:"flex items-center gap-2",children:[l.has(x)?a.jsx(Sr,{className:"w-5 h-5 text-bambu-gray"}):a.jsx(_s,{className:"w-5 h-5 text-bambu-gray"}),a.jsx("h3",{className:"text-base font-semibold text-white capitalize",children:x.replace(/-/g," ")}),a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-2 py-0.5 rounded-full text-bambu-gray",children:y.length})]})}),l.has(x)&&a.jsx(Mt,{className:"pt-0 space-y-2",children:y.map(({path:S,method:N,spec:A})=>a.jsx(cQe,{path:S,method:N,spec:A,schema:e,apiKey:t},`${N}-${S}`))})]},x))})]})}const dQe=["general","network","plugs","email","notifications","filament","apikeys","virtual-printer","users","backup"];function hQe(){const t=un(),e=Dc(),[n,r]=YR(),{t:i,i18n:s}=Sn(),{showToast:o}=Hn(),{authEnabled:l,user:c,refreshAuth:u}=Di(),{mode:d,darkStyle:h,darkBackground:m,darkAccent:p,lightStyle:b,lightBackground:v,lightAccent:x,setDarkStyle:y,setDarkBackground:S,setDarkAccent:N,setLightStyle:A,setLightBackground:k,setLightAccent:C}=Vh(),[E,P]=_.useState(null),[T,j]=_.useState(!1),[z,L]=_.useState(null),[B,R]=_.useState(!1),[$,q]=_.useState(null),[I,G]=_.useState(null),[Y,re]=_.useState(!1),[H,K]=_.useState(QK()),ne=n.get("tab"),ie=ne&&dQe.includes(ne)?ne:"general",[be,pe]=_.useState(ie),de=oe=>{pe(oe),oe==="general"?n.delete("tab"):n.set("tab",oe),r(n,{replace:!0})},[Ce,ae]=_.useState(!1),[Ae,Le]=_.useState(""),[fe,Xe]=_.useState({can_queue:!0,can_control_printer:!1,can_read_status:!0}),[W,Q]=_.useState(null),[me,X]=_.useState(null),[te,V]=_.useState(""),[ge,Se]=_.useState(!1),[ee,U]=_.useState(!1),[O,Z]=_.useState(null),[le,we]=_.useState(!1),[ye,se]=_.useState(!1),[Oe,He]=_.useState(!1),[tt,Ue]=_.useState({currentPassword:"",newPassword:"",confirmPassword:""}),[xe,Te]=_.useState(!1),[Ie,Ne]=_.useState(!1),[Ge,Me]=_.useState(!1),[rt,Ee]=_.useState(null),[Ke,Be]=_.useState(null),[ue,$e]=_.useState(null),[at,kt]=_.useState(!1),[gt,Ut]=_.useState({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),[Ft,Fe]=_.useState(!1),[xt,Wt]=_.useState(null),[Qt,En]=_.useState(null),[hn,or]=_.useState({name:"",description:"",permissions:[]}),[Kn,Qn]=_.useState(new Set),[Tn,di]=_.useState(null),[ii,je]=_.useState(!1),[Je,dt]=_.useState({}),[ht,ct]=_.useState({}),Tt=oe=>{K(oe),rpe(oe),o(i("settings.toast.settingsSaved"),"success")},he=()=>{localStorage.removeItem("sidebarOrder"),window.location.reload()},{data:De,isLoading:Ve}=st({queryKey:["settings"],queryFn:ce.getSettings}),{data:_e,isLoading:Re}=st({queryKey:["smart-plugs"],queryFn:ce.getSmartPlugs}),{data:et,isLoading:Ye}=st({queryKey:["smart-plugs-energy",_e?.map(oe=>oe.id)],queryFn:async()=>{if(!_e||_e.length===0)return null;const oe=await Promise.all(_e.filter(cs=>cs.enabled).map(async cs=>{try{const ka=await ce.getSmartPlugStatus(cs.id);return{plug:cs,status:ka}}catch{return{plug:cs,status:null}}}));let Nt=0,Un=0,sr=0,To=0,cd=0;for(const{plug:cs,status:ka}of oe){const wk=cs.plug_type==="mqtt"&&ka?.energy?.power!=null;(ka?.reachable||wk)&&ka?.energy&&(cd++,ka.energy?.power!=null&&(Nt+=ka.energy.power),ka.energy?.today!=null&&(Un+=ka.energy.today),ka.energy?.yesterday!=null&&(sr+=ka.energy.yesterday),ka.energy?.total!=null&&(To+=ka.energy.total))}return{totalPower:Nt,totalToday:Un,totalYesterday:sr,totalLifetime:To,reachableCount:cd,totalPlugs:_e.filter(cs=>cs.enabled).length}},enabled:be==="plugs"&&!!_e&&_e.length>0,refetchInterval:be==="plugs"?1e4:!1}),{data:Ct,isLoading:jt}=st({queryKey:["notification-providers"],queryFn:ce.getNotificationProviders}),{data:Bt,isLoading:Rt}=st({queryKey:["api-keys"],queryFn:ce.getAPIKeys}),Et=pt({mutationFn:oe=>ce.createAPIKey(oe),onSuccess:oe=>{Q(oe.key||null),ae(!1),Le(""),t.invalidateQueries({queryKey:["api-keys"]}),o(i("settings.toast.apiKeyCreated"))},onError:oe=>{o(`Failed to create API key: ${oe.message}`,"error")}}),an=pt({mutationFn:oe=>ce.deleteAPIKey(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["api-keys"]}),o(i("settings.toast.apiKeyDeleted"))},onError:oe=>{o(`Failed to delete API key: ${oe.message}`,"error")}}),{data:Vt}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:pn,isLoading:fn}=st({queryKey:["notification-templates"],queryFn:ce.getNotificationTemplates}),{data:Cn}=st({queryKey:["virtual-printer-settings"],queryFn:D1.getSettings,refetchInterval:1e4}),Xt=Cn?.status?.running??!1,{data:dn}=st({queryKey:["ffmpeg-status"],queryFn:ce.checkFfmpeg}),{data:mn}=st({queryKey:["version"],queryFn:ce.getVersion}),{data:en,refetch:ir,isRefetching:In}=st({queryKey:["updateCheck"],queryFn:ce.checkForUpdates,staleTime:300*1e3}),{data:ai,refetch:ar}=st({queryKey:["updateStatus"],queryFn:ce.getUpdateStatus,refetchInterval:oe=>{const Nt=oe.state.data;return Nt?.status==="downloading"||Nt?.status==="installing"?1e3:!1}}),{data:fr}=st({queryKey:["mqtt-status"],queryFn:ce.getMQTTStatus,refetchInterval:be==="network"?5e3:!1}),{data:nt}=st({queryKey:["github-backup-status"],queryFn:ce.getGitHubBackupStatus}),{data:Dt}=st({queryKey:["cloud-status"],queryFn:ce.getCloudStatus}),{data:Kt={advanced_auth_enabled:!1,smtp_configured:!1}}=st({queryKey:["advancedAuthStatus"],queryFn:()=>ce.getAdvancedAuthStatus()}),{hasPermission:vt}=Di(),{data:Nn=[],isLoading:hi}=st({queryKey:["users"],queryFn:()=>ce.getUsers(),enabled:l&&vt("users:read")}),{data:xr=[],isLoading:Yr}=st({queryKey:["groups"],queryFn:()=>ce.getGroups(),enabled:l&&vt("groups:read")}),{data:No}=st({queryKey:["permissions"],queryFn:()=>ce.getPermissions(),enabled:l&&vt("groups:read")}),nn=pt({mutationFn:oe=>ce.createUser(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),t.invalidateQueries({queryKey:["groups"]}),Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),o(i("settings.toast.userCreated"))},onError:oe=>{o(oe.message,"error")}}),Mn=pt({mutationFn:({id:oe,data:Nt})=>ce.updateUser(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),t.invalidateQueries({queryKey:["groups"]}),Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]}),o(i("settings.toast.userUpdated"))},onError:oe=>{o(oe.message,"error")}}),Mr=pt({mutationFn:({id:oe,deleteItems:Nt})=>ce.deleteUser(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["users"]}),o(i("settings.toast.userDeleted")),Be(null),$e(null)},onError:oe=>{o(oe.message,"error")}}),Mo=async oe=>{Be(oe),kt(!0);try{const Nt=await ce.getUserItemsCount(oe);$e(Nt)}catch{$e({archives:0,queue_items:0,library_files:0})}finally{kt(!1)}},ko=pt({mutationFn:oe=>ce.createGroup(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),Fe(!1),pr(),o(i("settings.toast.groupCreated"))},onError:oe=>{o(oe.message,"error")}}),As=pt({mutationFn:({id:oe,data:Nt})=>ce.updateGroup(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),Wt(null),pr(),o(i("settings.toast.groupUpdated"))},onError:oe=>{o(oe.message,"error")}}),Eo=pt({mutationFn:oe=>ce.deleteGroup(oe),onSuccess:()=>{t.invalidateQueries({queryKey:["groups"]}),o(i("settings.toast.groupDeleted"))},onError:oe=>{o(oe.message,"error")}}),ls=()=>{const oe=Kt?.advanced_auth_enabled||!1;if(!gt.username){o(i("settings.toast.fillRequiredFields"),"error");return}if(oe&&!gt.email){o("Email is required when advanced authentication is enabled","error");return}if(!oe){if(!gt.password){o(i("settings.toast.fillRequiredFields"),"error");return}if(gt.password!==gt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(gt.password.length<6){o(i("settings.toast.passwordTooShort"),"error");return}}nn.mutate({username:gt.username,password:oe?void 0:gt.password,email:gt.email||void 0,role:gt.role,group_ids:gt.group_ids.length>0?gt.group_ids:void 0})},Ei=oe=>{if(gt.password){if(gt.password!==gt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(gt.password.length<6){o(i("settings.toast.passwordTooShort"),"error");return}}const Nt={username:gt.username||void 0,password:gt.password||void 0,role:gt.role,group_ids:gt.group_ids};Nt.password||delete Nt.password,Mn.mutate({id:oe,data:Nt})},Ao=oe=>{Ee(oe.id),Ut({username:oe.username,password:"",confirmPassword:"",role:oe.role,group_ids:oe.groups?.map(Nt=>Nt.id)||[]}),Me(!0)},Ts=oe=>{Ut(Nt=>({...Nt,group_ids:Nt.group_ids.includes(oe)?Nt.group_ids.filter(Un=>Un!==oe):[...Nt.group_ids,oe]}))},pr=()=>{or({name:"",description:"",permissions:[]}),Qn(new Set)},Zb=()=>{if(!hn.name.trim()){o(i("settings.toast.enterGroupName"),"error");return}ko.mutate({name:hn.name,description:hn.description||void 0,permissions:hn.permissions})},tf=()=>{if(xt){if(!hn.name.trim()){o(i("settings.toast.enterGroupName"),"error");return}As.mutate({id:xt.id,data:{name:hn.name!==xt.name?hn.name:void 0,description:hn.description,permissions:hn.permissions}})}},ql=oe=>{Wt(oe),or({name:oe.name,description:oe.description||"",permissions:oe.permissions});const Nt=new Set;No?.categories.forEach(Un=>{Un.permissions.some(sr=>oe.permissions.includes(sr.value))&&Nt.add(Un.name)}),Qn(Nt)},Jb=oe=>{Qn(Nt=>{const Un=new Set(Nt);return Un.has(oe)?Un.delete(oe):Un.add(oe),Un})},Ym=oe=>{or(Nt=>{const Un=Nt.permissions.includes(oe)?Nt.permissions.filter(sr=>sr!==oe):[...Nt.permissions,oe];return{...Nt,permissions:Un}})},Lv=(oe,Nt)=>{or(Un=>{const sr=oe.permissions.map(cs=>cs.value),To=Un.permissions.filter(cs=>!sr.includes(cs)),cd=Nt?[...To,...sr]:To;return{...Un,permissions:cd}})},ad=oe=>oe.permissions.every(Nt=>hn.permissions.includes(Nt.value)),nf=oe=>{const Nt=oe.permissions.filter(Un=>hn.permissions.includes(Un.value));return Nt.length>0&&Nt.length{oe.is_docker?o(oe.message,"error"):ar()}}),[Ai,gl]=_.useState(null),sd=pt({mutationFn:ce.testAllNotificationProviders,onSuccess:oe=>{gl(oe),t.invalidateQueries({queryKey:["notification-providers"]}),oe.failed===0?o(`All ${oe.tested} providers tested successfully!`,"success"):o(`${oe.success}/${oe.tested} providers succeeded`,oe.failed>0?"error":"success")},onError:oe=>{o(`Failed to test providers: ${oe.message}`,"error")}}),bl=pt({mutationFn:async oe=>{if(!_e)return{success:0,failed:0};const Nt=_e.filter(sr=>sr.enabled),Un=await Promise.all(Nt.map(async sr=>{try{return await ce.controlSmartPlug(sr.id,oe),{success:!0}}catch{return{success:!1}}}));return{success:Un.filter(sr=>sr.success).length,failed:Un.filter(sr=>!sr.success).length}},onSuccess:(oe,Nt)=>{t.invalidateQueries({queryKey:["smart-plugs"]}),t.invalidateQueries({queryKey:["smart-plugs-energy"]}),oe.failed===0?o(`All ${oe.success} plugs turned ${Nt}`,"success"):o(`${oe.success} plugs turned ${Nt}, ${oe.failed} failed`,"error")},onError:oe=>{o(`Failed: ${oe.message}`,"error")}}),rf=_.useRef(null),od=_.useRef(!1),Zm=_.useRef(!0);_.useEffect(()=>{if(De&&!E){const oe={...De,external_url:De.external_url||window.location.origin};P(oe),setTimeout(()=>{Zm.current=!1},100)}},[De,E]);const ld=pt({mutationFn:ce.updateSettings,onSuccess:oe=>{t.setQueryData(["settings"],oe),P(oe),t.invalidateQueries({queryKey:["archiveStats"]}),o(i("settings.toast.settingsSaved"),"success")},onError:oe=>{o(`Failed to save: ${oe.message}`,"error")},onSettled:()=>{od.current=!1}}),af=pt({mutationFn:({id:oe,data:Nt})=>ce.updatePrinter(oe,Nt),onSuccess:()=>{t.invalidateQueries({queryKey:["printers"]}),o(i("settings.toast.cameraSettingsSaved"),"success")},onError:oe=>{o(`Failed to update printer: ${oe.message}`,"error")}});_.useEffect(()=>{if(!(Zm.current||!E||!De||!(De.auto_archive!==E.auto_archive||De.save_thumbnails!==E.save_thumbnails||De.capture_finish_photo!==E.capture_finish_photo||De.default_filament_cost!==E.default_filament_cost||De.currency!==E.currency||De.energy_cost_per_kwh!==E.energy_cost_per_kwh||De.energy_tracking_mode!==E.energy_tracking_mode||De.check_updates!==E.check_updates||(De.check_printer_firmware??!0)!==(E.check_printer_firmware??!0)||De.notification_language!==E.notification_language||De.ams_humidity_good!==E.ams_humidity_good||De.ams_humidity_fair!==E.ams_humidity_fair||De.ams_temp_good!==E.ams_temp_good||De.ams_temp_fair!==E.ams_temp_fair||De.ams_history_retention_days!==E.ams_history_retention_days||De.per_printer_mapping_expanded!==E.per_printer_mapping_expanded||De.date_format!==E.date_format||De.time_format!==E.time_format||De.default_printer_id!==E.default_printer_id||De.ftp_retry_enabled!==E.ftp_retry_enabled||De.ftp_retry_count!==E.ftp_retry_count||De.ftp_retry_delay!==E.ftp_retry_delay||De.ftp_timeout!==E.ftp_timeout||De.mqtt_enabled!==E.mqtt_enabled||De.mqtt_broker!==E.mqtt_broker||De.mqtt_port!==E.mqtt_port||De.mqtt_username!==E.mqtt_username||De.mqtt_password!==E.mqtt_password||De.mqtt_topic_prefix!==E.mqtt_topic_prefix||De.mqtt_use_tls!==E.mqtt_use_tls||De.external_url!==E.external_url||De.ha_enabled!==E.ha_enabled||De.ha_url!==E.ha_url||De.ha_token!==E.ha_token||(De.library_archive_mode??"ask")!==(E.library_archive_mode??"ask")||Number(De.library_disk_warning_gb??5)!==Number(E.library_disk_warning_gb??5)||(De.camera_view_mode??"window")!==(E.camera_view_mode??"window")||De.prometheus_enabled!==E.prometheus_enabled||De.prometheus_token!==E.prometheus_token))&&!od.current)return rf.current&&clearTimeout(rf.current),rf.current=setTimeout(()=>{if(od.current)return;od.current=!0;const Nt={auto_archive:E.auto_archive,save_thumbnails:E.save_thumbnails,capture_finish_photo:E.capture_finish_photo,default_filament_cost:E.default_filament_cost,currency:E.currency,energy_cost_per_kwh:E.energy_cost_per_kwh,energy_tracking_mode:E.energy_tracking_mode,check_updates:E.check_updates,check_printer_firmware:E.check_printer_firmware,notification_language:E.notification_language,ams_humidity_good:E.ams_humidity_good,ams_humidity_fair:E.ams_humidity_fair,ams_temp_good:E.ams_temp_good,ams_temp_fair:E.ams_temp_fair,ams_history_retention_days:E.ams_history_retention_days,per_printer_mapping_expanded:E.per_printer_mapping_expanded,date_format:E.date_format,time_format:E.time_format,default_printer_id:E.default_printer_id,ftp_retry_enabled:E.ftp_retry_enabled,ftp_retry_count:E.ftp_retry_count,ftp_retry_delay:E.ftp_retry_delay,ftp_timeout:E.ftp_timeout,mqtt_enabled:E.mqtt_enabled,mqtt_broker:E.mqtt_broker,mqtt_port:E.mqtt_port,mqtt_username:E.mqtt_username,mqtt_password:E.mqtt_password,mqtt_topic_prefix:E.mqtt_topic_prefix,mqtt_use_tls:E.mqtt_use_tls,external_url:E.external_url,ha_enabled:E.ha_enabled,ha_url:E.ha_url,ha_token:E.ha_token,library_archive_mode:E.library_archive_mode,library_disk_warning_gb:E.library_disk_warning_gb,camera_view_mode:E.camera_view_mode,prometheus_enabled:E.prometheus_enabled,prometheus_token:E.prometheus_token};ld.mutate(Nt)},500),()=>{rf.current&&clearTimeout(rf.current)}},[E,De,ld]);const wn=_.useCallback((oe,Nt)=>{P(Un=>Un?{...Un,[oe]:Nt}:null)},[]),yk=async(oe,Nt,Un)=>{if(!Nt){o(i("settings.toast.enterCameraUrl"),"error");return}ct(sr=>({...sr,[oe]:!0})),dt(sr=>({...sr,[oe]:null}));try{const sr=await ce.testExternalCamera(oe,Nt,Un);dt(To=>({...To,[oe]:sr})),sr.success?o(i("settings.toast.cameraConnected",{resolution:sr.resolution||""}),"success"):o(sr.error||i("settings.toast.connectionFailed"),"error")}catch(sr){const To=sr instanceof Error?sr.message:i("settings.toast.testFailed");dt(cd=>({...cd,[oe]:{success:!1,error:To}})),o(To,"error")}finally{ct(sr=>({...sr,[oe]:!1}))}},[ex,Fv]=_.useState({}),sf=_.useRef({}),Iv=_.useRef(new Set);_.useEffect(()=>{if(Vt){const oe={};Vt.forEach(Nt=>{Nt.external_camera_url&&!Iv.current.has(Nt.id)&&(oe[Nt.id]=Nt.external_camera_url,Iv.current.add(Nt.id))}),Object.keys(oe).length>0&&Fv(Nt=>({...Nt,...oe}))}},[Vt]);const vk=(oe,Nt)=>{Fv(Un=>({...Un,[oe]:Nt})),sf.current[oe]&&clearTimeout(sf.current[oe]),sf.current[oe]=setTimeout(()=>{af.mutate({id:oe,data:{external_camera_url:Nt||null}})},800)},Uv=(oe,Nt)=>{const Un={};Nt.type!==void 0&&(Un.external_camera_type=Nt.type||null),Nt.enabled!==void 0&&(Un.external_camera_enabled=Nt.enabled),af.mutate({id:oe,data:Un})};return Ve||!E?a.jsx("div",{className:"p-4 md:p-8 flex justify-center",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):a.jsxs("div",{className:"p-4 md:p-8",children:[a.jsxs("div",{className:"mb-8",children:[a.jsx("h1",{className:"text-2xl font-bold text-white",children:i("settings.title")}),a.jsx("p",{className:"text-bambu-gray",children:i("settings.configureBambuddy")})]}),a.jsxs("div",{className:"flex flex-wrap gap-1 mb-6 border-b border-bambu-dark-tertiary overflow-y-auto max-h-32",children:[a.jsx("button",{onClick:()=>de("general"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${be==="general"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:i("settings.tabs.general")}),a.jsxs("button",{onClick:()=>de("plugs"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="plugs"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(rl,{className:"w-4 h-4"}),i("settings.tabs.smartPlugs"),_e&&_e.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:_e.length})]}),a.jsxs("button",{onClick:()=>de("email"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="email"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(oy,{className:"w-4 h-4"}),i("settings.tabs.globalEmail")||"Global Email"]}),a.jsxs("button",{onClick:()=>de("notifications"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="notifications"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Og,{className:"w-4 h-4"}),i("settings.tabs.notifications"),Ct&&Ct.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:Ct.length})]}),a.jsxs("button",{onClick:()=>de("filament"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="filament"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Ude,{className:"w-4 h-4"}),i("settings.tabs.filament")]}),a.jsxs("button",{onClick:()=>de("network"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="network"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Fg,{className:"w-4 h-4"}),i("settings.tabs.network"),a.jsx("span",{className:`w-2 h-2 rounded-full ${fr?.enabled?"bg-green-400":"bg-gray-500"}`})]}),a.jsxs("button",{onClick:()=>de("apikeys"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="apikeys"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Wo,{className:"w-4 h-4"}),i("settings.tabs.apiKeys"),Bt&&Bt.length>0&&a.jsx("span",{className:"text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full",children:Bt.length})]}),a.jsxs("button",{onClick:()=>de("virtual-printer"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="virtual-printer"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Or,{className:"w-4 h-4"}),i("settings.tabs.virtualPrinter"),a.jsx("span",{className:`w-2 h-2 rounded-full ${Xt?"bg-green-400":"bg-gray-500"}`})]}),a.jsxs("button",{onClick:()=>de("users"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="users"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(Kf,{className:"w-4 h-4"}),i("settings.tabs.users"),l&&a.jsx("span",{className:"w-2 h-2 rounded-full bg-green-400"})]}),a.jsxs("button",{onClick:()=>de("backup"),className:`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${be==="backup"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-gray-900 dark:hover:text-white border-transparent"}`,children:[a.jsx(ju,{className:"w-4 h-4"}),i("settings.tabs.backup"),a.jsx("span",{className:`w-2 h-2 rounded-full ${Dt?.is_authenticated&&nt?.configured&&nt?.enabled?"bg-green-400":"bg-gray-500"}`})]})]}),be==="general"&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-xl",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.general")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[a.jsx(bh,{className:"w-4 h-4 inline mr-1"}),i("settings.language")]}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:s.language,onChange:oe=>{s.changeLanguage(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:Wz.map(oe=>a.jsxs("option",{value:oe.code,children:[oe.nativeName," (",oe.name,")"]},oe.code))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:i("settings.languageDescription")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.defaultView")}),a.jsxs("div",{className:"relative",children:[a.jsx("select",{value:H,onChange:oe=>Tt(oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:cy.map(oe=>a.jsx("option",{value:oe.to,children:i(oe.labelKey)},oe.id))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:i("settings.defaultViewDescription")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Date Format"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.date_format||"system",onChange:oe=>wn("date_format",oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"system",children:i("settings.systemDefault")}),a.jsx("option",{value:"us",children:"US (MM/DD/YYYY)"}),a.jsx("option",{value:"eu",children:"EU (DD/MM/YYYY)"}),a.jsx("option",{value:"iso",children:"ISO (YYYY-MM-DD)"})]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Time Format"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.time_format||"system",onChange:oe=>wn("time_format",oe.target.value),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"system",children:i("settings.systemDefault")}),a.jsx("option",{value:"12h",children:"12-hour (3:30 PM)"}),a.jsx("option",{value:"24h",children:"24-hour (15:30)"})]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Default Printer"}),a.jsxs("div",{className:"relative",children:[a.jsxs("select",{value:E.default_printer_id??"",onChange:oe=>wn("default_printer_id",oe.target.value?Number(oe.target.value):null),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[a.jsx("option",{value:"",children:i("settings.noDefaultPrinter")}),Vt?.map(oe=>a.jsx("option",{value:oe.id,children:oe.name},oe.id))]}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Pre-select this printer for uploads, reprints, and other operations."})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.sidebarOrder")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Drag items in the sidebar to reorder. Reset to default order here."})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:he,children:[a.jsx($h,{className:"w-4 h-4"}),"Reset"]})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(UK,{className:"w-5 h-5"}),"Appearance"]})}),a.jsxs(Mt,{className:"space-y-6",children:[a.jsxs("div",{className:`space-y-3 p-4 rounded-lg border ${d==="dark"?"border-bambu-green bg-bambu-green/5":"border-bambu-dark-tertiary"}`,children:[a.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Dark Mode",d==="dark"&&a.jsx("span",{className:"text-xs text-bambu-green",children:"(active)"})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Background"}),a.jsxs("select",{value:m,onChange:oe=>{S(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"neutral",children:"Neutral"}),a.jsx("option",{value:"warm",children:"Warm"}),a.jsx("option",{value:"cool",children:"Cool"}),a.jsx("option",{value:"oled",children:"OLED Black"}),a.jsx("option",{value:"slate",children:"Slate Blue"}),a.jsx("option",{value:"forest",children:"Forest Green"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Accent"}),a.jsxs("select",{value:p,onChange:oe=>{N(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"green",children:"Green"}),a.jsx("option",{value:"teal",children:"Teal"}),a.jsx("option",{value:"blue",children:"Blue"}),a.jsx("option",{value:"orange",children:"Orange"}),a.jsx("option",{value:"purple",children:"Purple"}),a.jsx("option",{value:"red",children:"Red"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Style"}),a.jsxs("select",{value:h,onChange:oe=>{y(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"classic",children:"Classic"}),a.jsx("option",{value:"glow",children:"Glow"}),a.jsx("option",{value:"vibrant",children:"Vibrant"})]})]})]})]}),a.jsxs("div",{className:`space-y-3 p-4 rounded-lg border ${d==="light"?"border-bambu-green bg-bambu-green/5":"border-bambu-dark-tertiary"}`,children:[a.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:["Light Mode",d==="light"&&a.jsx("span",{className:"text-xs text-bambu-green",children:"(active)"})]}),a.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Background"}),a.jsxs("select",{value:v,onChange:oe=>{k(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"neutral",children:"Neutral"}),a.jsx("option",{value:"warm",children:"Warm"}),a.jsx("option",{value:"cool",children:"Cool"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Accent"}),a.jsxs("select",{value:x,onChange:oe=>{C(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"green",children:"Green"}),a.jsx("option",{value:"teal",children:"Teal"}),a.jsx("option",{value:"blue",children:"Blue"}),a.jsx("option",{value:"orange",children:"Orange"}),a.jsx("option",{value:"purple",children:"Purple"}),a.jsx("option",{value:"red",children:"Red"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-xs text-bambu-gray mb-1",children:"Style"}),a.jsxs("select",{value:b,onChange:oe=>{A(oe.target.value),o(i("settings.toast.settingsSaved"),"success")},className:"w-full px-2 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"classic",children:"Classic"}),a.jsx("option",{value:"glow",children:"Glow"}),a.jsx("option",{value:"vibrant",children:"Vibrant"})]})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:"Toggle between dark and light mode using the sun/moon icon in the sidebar."})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.archiveSettings")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Auto-archive prints"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically save 3MF files when prints complete"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.auto_archive,onChange:oe=>wn("auto_archive",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.saveThumbnails")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Extract and save preview images from 3MF files"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.save_thumbnails,onChange:oe=>wn("save_thumbnails",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.captureFinishPhoto")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Take a photo from printer camera when print completes"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.capture_finish_photo,onChange:oe=>wn("capture_finish_photo",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.capture_finish_photo&&dn&&!dn.installed&&a.jsxs("div",{className:"flex items-start gap-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg",children:[a.jsx(kn,{className:"w-5 h-5 text-yellow-500 flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"text-sm",children:[a.jsx("p",{className:"text-yellow-500 font-medium",children:"ffmpeg not installed"}),a.jsxs("p",{className:"text-bambu-gray mt-1",children:["Camera capture requires ffmpeg. Install it via"," ",a.jsx("code",{className:"bg-bambu-dark-tertiary px-1 rounded",children:"brew install ffmpeg"})," (macOS) or"," ",a.jsx("code",{className:"bg-bambu-dark-tertiary px-1 rounded",children:"apt install ffmpeg"})," (Linux)."]})]})]})]})]})]}),a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-md",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(hO,{className:"w-5 h-5 text-bambu-green"}),"Camera"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Camera View Mode"}),a.jsxs("select",{value:E.camera_view_mode??"window",onChange:oe=>wn("camera_view_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"window",children:i("settings.newWindow")}),a.jsx("option",{value:"embedded",children:i("settings.embeddedOverlay")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:E.camera_view_mode==="embedded"?"Camera opens in a resizable overlay on the main screen":"Camera opens in a separate browser window"})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4 mt-4",children:[a.jsx("h3",{className:"text-sm font-medium text-white mb-2",children:i("settings.externalCameras")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Configure external cameras to replace the built-in printer camera. Supports MJPEG streams, RTSP, HTTP snapshots, and USB cameras (V4L2). When enabled, the external camera is used for live view and finish photos."}),Vt&&Vt.length>0?a.jsx("div",{className:"space-y-3",children:Vt.map(oe=>a.jsxs("div",{className:"p-3 bg-bambu-dark rounded-lg",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-white font-medium text-sm",children:oe.name}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:oe.external_camera_enabled,onChange:Nt=>Uv(oe.id,{enabled:Nt.target.checked}),className:"sr-only peer"}),a.jsx("div",{className:"w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"})]})]}),oe.external_camera_enabled&&a.jsxs("div",{className:"space-y-2 mt-2",children:[a.jsx("input",{type:"text",placeholder:oe.external_camera_type==="usb"?"Device path (/dev/video0)":"Camera URL (rtsp://... or http://...)",value:ex[oe.id]??oe.external_camera_url??"",onChange:Nt=>vk(oe.id,Nt.target.value),className:"w-full px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("select",{value:oe.external_camera_type||"mjpeg",onChange:Nt=>Uv(oe.id,{type:Nt.target.value}),className:"flex-1 px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"mjpeg",children:"MJPEG Stream"}),a.jsx("option",{value:"rtsp",children:"RTSP Stream"}),a.jsx("option",{value:"snapshot",children:"HTTP Snapshot"}),a.jsx("option",{value:"usb",children:"USB Camera (V4L2)"})]}),a.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>yk(oe.id,ex[oe.id]??oe.external_camera_url??"",oe.external_camera_type||"mjpeg"),disabled:ht[oe.id]||!(ex[oe.id]??oe.external_camera_url),children:ht[oe.id]?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):"Test"})]}),Je[oe.id]&&a.jsx("div",{className:`text-xs flex items-center gap-1 ${Je[oe.id]?.success?"text-green-500":"text-red-500"}`,children:Je[oe.id]?.success?a.jsxs(a.Fragment,{children:[a.jsx(Nr,{className:"w-3 h-3"}),"Connected",Je[oe.id]?.resolution&&` (${Je[oe.id]?.resolution})`]}):a.jsxs(a.Fragment,{children:[a.jsx(ta,{className:"w-3 h-3"}),Je[oe.id]?.error||i("settings.toast.connectionFailed")]})})]})]},oe.id))}):a.jsx("p",{className:"text-xs text-bambu-gray italic",children:i("settings.noPrintersConfigured")})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.costTracking")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Default filament cost (per kg)"}),a.jsx("input",{type:"number",step:"0.01",min:"0",value:E.default_filament_cost,onChange:oe=>wn("default_filament_cost",parseFloat(oe.target.value)||0),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Currency"}),a.jsxs("select",{value:E.currency,onChange:oe=>wn("currency",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"USD",children:"USD ($)"}),a.jsx("option",{value:"EUR",children:"EUR (€)"}),a.jsx("option",{value:"GBP",children:"GBP (£)"}),a.jsx("option",{value:"CHF",children:"CHF (Fr.)"}),a.jsx("option",{value:"JPY",children:"JPY (¥)"}),a.jsx("option",{value:"CNY",children:"CNY (¥)"}),a.jsx("option",{value:"CAD",children:"CAD ($)"}),a.jsx("option",{value:"AUD",children:"AUD ($)"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Electricity cost per kWh"}),a.jsx("input",{type:"number",step:"0.01",min:"0",value:E.energy_cost_per_kwh,onChange:oe=>wn("energy_cost_per_kwh",parseFloat(oe.target.value)||0),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Energy display mode"}),a.jsxs("select",{value:E.energy_tracking_mode||"total",onChange:oe=>wn("energy_tracking_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"print",children:i("settings.printsOnly")}),a.jsx("option",{value:"total",children:i("settings.totalConsumption")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:E.energy_tracking_mode==="print"?"Dashboard shows sum of energy used during prints":"Dashboard shows lifetime energy from smart plugs"})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(ps,{className:"w-5 h-5 text-bambu-green"}),"File Manager"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Create Archive Entry When Printing"}),a.jsxs("select",{value:E.library_archive_mode??"ask",onChange:oe=>wn("library_archive_mode",oe.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"always",children:i("settings.archiveMode.always")}),a.jsx("option",{value:"never",children:i("settings.archiveMode.never")}),a.jsx("option",{value:"ask",children:i("settings.archiveMode.ask")})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"When printing from File Manager, optionally create an archive entry"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Low Disk Space Warning"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0.5",max:"100",step:"0.5",value:E.library_disk_warning_gb??5,onChange:oe=>wn("library_disk_warning_gb",parseFloat(oe.target.value)||5),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"GB"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Show warning when free disk space falls below this threshold"})]})]})]})]}),a.jsxs("div",{className:"space-y-6 flex-1 lg:max-w-sm",children:[a.jsx(nQe,{}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:"Updates"})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.checkForUpdatesLabel")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically check for new versions on startup"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.check_updates,onChange:oe=>wn("check_updates",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.checkPrinterFirmware")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Check for printer firmware updates from Bambu Lab"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.check_printer_firmware??!0,onChange:oe=>wn("check_printer_firmware",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),a.jsxs("div",{className:"border-t border-bambu-dark-tertiary pt-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.currentVersion")}),a.jsxs("p",{className:"text-sm text-bambu-gray",children:["v",mn?.version||"..."]})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>ir(),disabled:In,children:[In?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ir,{className:"w-4 h-4"}),"Check now"]})]}),en?.update_available?a.jsxs("div",{className:"mt-4 p-3 bg-bambu-green/10 border border-bambu-green/30 rounded-lg",children:[a.jsxs("div",{className:"flex items-start justify-between",children:[a.jsxs("div",{children:[a.jsxs("p",{className:"text-bambu-green font-medium",children:["Update available: v",en.latest_version]}),en.release_name&&en.release_name!==en.latest_version&&a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:en.release_name})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[en.release_notes&&a.jsx("button",{onClick:()=>we(!0),className:"text-bambu-gray hover:text-white transition-colors text-sm underline",children:"Release Notes"}),en.release_url&&a.jsx("a",{href:en.release_url,target:"_blank",rel:"noopener noreferrer",className:"text-bambu-gray hover:text-white transition-colors",title:i("settings.viewReleaseOnGitHub"),children:a.jsx(Xr,{className:"w-4 h-4"})})]})]}),ai?.status==="downloading"||ai?.status==="installing"?a.jsxs("div",{className:"mt-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-sm text-bambu-gray",children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),a.jsx("span",{children:ai.message})]}),a.jsx("div",{className:"mt-2 w-full bg-bambu-dark-tertiary rounded-full h-2",children:a.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all duration-300",style:{width:`${ai.progress}%`}})})]}):ai?.status==="complete"?a.jsx("div",{className:"mt-3 p-2 bg-bambu-green/20 rounded text-sm text-bambu-green",children:ai.message}):ai?.status==="error"?a.jsx("div",{className:"mt-3 p-2 bg-red-500/20 rounded text-sm text-red-400",children:ai.error||ai.message}):en?.is_docker?a.jsxs("div",{className:"mt-3 p-3 bg-bambu-dark-tertiary rounded-lg",children:[a.jsx("p",{className:"text-sm text-bambu-gray mb-2",children:"Update via Docker Compose:"}),a.jsx("code",{className:"block text-xs bg-bambu-dark p-2 rounded text-bambu-green font-mono",children:"docker compose pull && docker compose up -d"})]}):a.jsxs(ke,{className:"mt-3",onClick:()=>Qm.mutate(),disabled:Qm.isPending,children:[Qm.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Ni,{className:"w-4 h-4"}),"Install Update"]})]}):en?.error?a.jsxs("div",{className:"mt-2 p-2 bg-red-500/10 border border-red-500/30 rounded text-sm text-red-400",children:["Failed to check for updates: ",en.error]}):en&&!en.update_available?a.jsx("p",{className:"mt-2 text-sm text-bambu-gray",children:"You're running the latest version"}):null]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.dataManagement")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.clearNotificationLogs")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.clearNotificationLogsDescription")})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>Se(!0),children:[a.jsx(cn,{className:"w-4 h-4"}),i("common.clear")]})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.resetUiPreferences")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.resetUiPreferencesDescription")})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>U(!0),children:[a.jsx(cn,{className:"w-4 h-4"}),"Reset"]})]}),a.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:"Backup & Restore"}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Export/import settings and configure GitHub backup"})]}),a.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>de("backup"),children:[a.jsx(ju,{className:"w-4 h-4"}),"Go to Backup"]})]})]})]})]})]}),be==="network"&&E&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6",children:[a.jsxs("div",{className:"flex-1 lg:max-w-xl space-y-4",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(bh,{className:"w-5 h-5 text-blue-400"}),"External URL"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"The external URL where Bambuddy is accessible. Used for notification images and external integrations."}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Bambuddy URL"}),a.jsx("input",{type:"text",value:E.external_url??"",onChange:oe=>wn("external_url",oe.target.value),placeholder:"http://192.168.1.100:8000",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Include protocol and port (e.g., http://192.168.1.100:8000)"})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Ir,{className:"w-5 h-5 text-blue-400"}),"FTP Retry"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Retry FTP operations when printer WiFi is unreliable. Applies to 3MF downloads, print uploads, timelapse downloads, and firmware updates."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableRetry")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Automatically retry failed FTP operations"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.ftp_retry_enabled??!0,onChange:oe=>wn("ftp_retry_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.ftp_retry_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Retry attempts"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_retry_count??3,onChange:oe=>wn("ftp_retry_count",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[1,2,3,4,5,6,7,8,9,10].map(oe=>a.jsxs("option",{value:oe,children:[oe," ",oe===1?"time":"times"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Retry delay"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_retry_delay??2,onChange:oe=>wn("ftp_retry_delay",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[1,2,3,5,10,15,20,30].map(oe=>a.jsxs("option",{value:oe,children:[oe," ",oe===1?"second":"seconds"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Connection timeout"}),a.jsxs("div",{className:"relative w-44",children:[a.jsx("select",{value:E.ftp_timeout??30,onChange:oe=>wn("ftp_timeout",parseInt(oe.target.value)),className:"w-full px-3 py-2 pr-10 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none appearance-none cursor-pointer",children:[10,15,20,30,45,60,90,120].map(oe=>a.jsxs("option",{value:oe,children:[oe," seconds"]},oe))}),a.jsx(Sr,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none"})]}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Increase for printers with weak WiFi"})]})]})]})]})]}),a.jsxs("div",{className:"flex-1 lg:max-w-xl space-y-4",children:[a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Jy,{className:"w-5 h-5 text-bambu-green"}),"Home Assistant"]}),E.ha_enabled&&Tn&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2.5 h-2.5 rounded-full ${Tn.success?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:`text-sm ${Tn.success?"text-green-400":"text-red-400"}`,children:Tn.success?"Connected":"Disconnected"})]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Connect to Home Assistant to control smart plugs via HA's REST API. Supports switch, light, input_boolean, and script entities."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableHomeAssistant")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.homeAssistantDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.ha_enabled??!1,onChange:oe=>wn("ha_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.ha_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Home Assistant URL"}),a.jsx("input",{type:"text",value:E.ha_url??"",onChange:oe=>wn("ha_url",oe.target.value),placeholder:"http://192.168.1.100:8123",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Long-Lived Access Token"}),a.jsx("input",{type:"password",value:E.ha_token??"",onChange:oe=>wn("ha_token",oe.target.value),placeholder:"eyJ0eXAiOiJKV1QiLC...",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Create a token in HA: Profile → Long-Lived Access Tokens → Create Token"})]}),E.ha_url&&E.ha_token&&a.jsx("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:a.jsxs(ke,{variant:"secondary",size:"sm",disabled:ii,onClick:async()=>{je(!0),di(null);try{const oe=await ce.testHAConnection(E.ha_url,E.ha_token);di(oe)}catch(oe){di({success:!1,message:null,error:oe instanceof Error?oe.message:i("common.unknownError")})}finally{je(!1)}},children:[ii?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Fg,{className:"w-4 h-4"}),i("settings.testConnection")]})})]})]})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Fg,{className:"w-5 h-5 text-blue-400"}),"MQTT Publishing"]}),fr?.enabled&&a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2.5 h-2.5 rounded-full ${fr.connected?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:`text-sm ${fr.connected?"text-green-400":"text-red-400"}`,children:fr.connected?"Connected":"Disconnected"})]})]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:"Publish BamBuddy events to an external MQTT broker for integration with Node-RED, Home Assistant, and other automation systems."}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableMqtt")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:"Publish events to external MQTT broker"})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.mqtt_enabled??!1,onChange:oe=>wn("mqtt_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.mqtt_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Broker hostname"}),a.jsx("input",{type:"text",value:E.mqtt_broker??"",onChange:oe=>wn("mqtt_broker",oe.target.value),placeholder:"mqtt.example.com or 192.168.1.100",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"flex items-end gap-4",children:[a.jsxs("div",{className:"flex-1",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Port"}),a.jsx("input",{type:"number",min:"1",max:"65535",value:E.mqtt_port??1883,onChange:oe=>wn("mqtt_port",Math.min(65535,Math.max(1,parseInt(oe.target.value)||1883))),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{className:"flex items-center gap-3 pb-2",children:[a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.mqtt_use_tls??!1,onChange:oe=>{const Nt=oe.target.checked;wn("mqtt_use_tls",Nt);const Un=E.mqtt_port??1883;Nt&&Un===1883?wn("mqtt_port",8883):!Nt&&Un===8883&&wn("mqtt_port",1883)},className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]}),a.jsx("span",{className:"text-white text-sm",children:i("settings.useTls")})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Username (optional)"}),a.jsx("input",{type:"text",value:E.mqtt_username??"",onChange:oe=>wn("mqtt_username",oe.target.value),placeholder:i("settings.leaveEmptyForAnonymous"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Password (optional)"}),a.jsx("input",{type:"password",value:E.mqtt_password??"",onChange:oe=>wn("mqtt_password",oe.target.value),placeholder:i("settings.leaveEmptyForAnonymous"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Topic prefix"}),a.jsx("input",{type:"text",value:E.mqtt_topic_prefix??"bambuddy",onChange:oe=>wn("mqtt_topic_prefix",oe.target.value),placeholder:"bambuddy",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:["Topics will be: ",E.mqtt_topic_prefix||"bambuddy","/printers//status, etc."]})]}),fr&&a.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx("span",{className:`w-2 h-2 rounded-full ${fr.connected?"bg-green-400":"bg-red-400"}`}),a.jsx("span",{className:"text-bambu-gray",children:fr.connected?a.jsxs(a.Fragment,{children:[i("settings.mqttConnectedTo")," ",a.jsxs("span",{className:"text-white",children:[fr.broker,":",fr.port]})]}):i("settings.spoolmanDisconnected")})]})})]})]})]})]}),a.jsx("div",{className:"flex-1 lg:max-w-md space-y-4",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(WP,{className:"w-5 h-5 text-orange-400"}),"Prometheus Metrics"]})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("p",{className:"text-sm text-bambu-gray",children:["Expose printer metrics at ",a.jsx("code",{className:"bg-bambu-dark px-1 rounded",children:"/api/v1/metrics"})," for Prometheus/Grafana monitoring."]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white",children:i("settings.enableMetricsEndpoint")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.prometheusDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.prometheus_enabled??!1,onChange:oe=>wn("prometheus_enabled",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]}),E.prometheus_enabled&&a.jsxs("div",{className:"space-y-4 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Bearer Token (optional)"}),a.jsx("input",{type:"password",value:E.prometheus_token??"",onChange:oe=>wn("prometheus_token",oe.target.value),placeholder:i("settings.leaveEmptyForNoAuth"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:["If set, requests must include ",a.jsx("code",{className:"bg-bambu-dark px-1 rounded",children:"Authorization: Bearer "})]})]}),a.jsxs("div",{className:"pt-2 border-t border-bambu-dark-tertiary",children:[a.jsx("p",{className:"text-sm text-white mb-2",children:i("settings.availableMetrics")}),a.jsxs("div",{className:"text-xs text-bambu-gray space-y-1",children:[a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_printer_connected"})," - Connection status"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_printer_state"})," - Printer state (idle/printing/etc)"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_print_progress"})," - Print progress 0-100%"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_bed_temp_celsius"})," - Bed temperature"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_nozzle_temp_celsius"})," - Nozzle temperature"]}),a.jsxs("p",{children:[a.jsx("code",{className:"text-orange-400",children:"bambuddy_prints_total"})," - Total prints by result"]}),a.jsx("p",{className:"text-bambu-gray/70 italic",children:"...and more (layers, fans, queue, filament usage)"})]})]})]})]})]})})]}),Tn&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg p-6 max-w-md w-full mx-4",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[Tn.success?a.jsx(Nr,{className:"w-8 h-8 text-green-400"}):a.jsx(ta,{className:"w-8 h-8 text-red-400"}),a.jsx("h3",{className:"text-lg font-medium text-white",children:Tn.success?"Connection Successful":"Connection Failed"})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:Tn.success?Tn.message||"Successfully connected to Home Assistant.":Tn.error||"Failed to connect to Home Assistant."}),a.jsx("div",{className:"flex justify-end",children:a.jsx(ke,{variant:"primary",onClick:()=>di(null),children:"OK"})})]})}),be==="plugs"&&a.jsxs("div",{className:"max-w-4xl",children:[a.jsxs("div",{className:"flex items-start justify-between mb-6",children:[a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(rl,{className:"w-5 h-5 text-bambu-green"}),"Smart Plugs"]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Connect smart plugs (Tasmota or Home Assistant) to automate power control and track energy usage for your printers."})]}),a.jsxs("div",{className:"flex items-center gap-2 pt-1 shrink-0",children:[_e&&_e.filter(oe=>oe.enabled).length>1&&a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"secondary",size:"sm",className:"whitespace-nowrap",onClick:()=>Z("on"),disabled:bl.isPending,title:i("settings.turnAllPlugsOn"),children:[bl.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(Zu,{className:"w-4 h-4 text-bambu-green"}),"All On"]}),a.jsxs(ke,{variant:"secondary",size:"sm",className:"whitespace-nowrap",onClick:()=>Z("off"),disabled:bl.isPending,title:i("settings.turnAllPlugsOff"),children:[bl.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(HM,{className:"w-4 h-4 text-red-400"}),"All Off"]})]}),a.jsxs(ke,{className:"whitespace-nowrap",onClick:()=>{L(null),j(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),"Add Smart Plug"]})]})]}),_e&&_e.length>0&&a.jsxs(_t,{className:"mb-6",children:[a.jsx(Pn,{children:a.jsxs("h3",{className:"text-base font-semibold text-white flex items-center gap-2",children:[a.jsx(Dh,{className:"w-4 h-4 text-yellow-400"}),"Energy Summary",Ye&&a.jsx(ut,{className:"w-4 h-4 animate-spin text-bambu-gray ml-2"})]})}),a.jsx(Mt,{children:et?a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(Dh,{className:"w-3 h-3"}),"Current Power"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalPower.toFixed(1),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"W"})]}),a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:[et.reachableCount,"/",et.totalPlugs," plugs online"]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(ei,{className:"w-3 h-3"}),"Today"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalToday.toFixed(2),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalToday*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(WP,{className:"w-3 h-3"}),"Yesterday"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalYesterday.toFixed(2),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalYesterday*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]}),a.jsxs("div",{className:"bg-bambu-dark rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-bambu-gray text-xs mb-1",children:[a.jsx(zP,{className:"w-3 h-3"}),"Total"]}),a.jsxs("div",{className:"text-xl font-bold text-white",children:[et.totalLifetime.toFixed(1),a.jsx("span",{className:"text-sm font-normal text-bambu-gray ml-1",children:"kWh"})]}),(E?.energy_cost_per_kwh??0)>0&&a.jsxs("div",{className:"text-xs text-bambu-gray mt-1",children:["~",(et.totalLifetime*(E?.energy_cost_per_kwh??0)).toFixed(2)," ",E?.currency]})]})]}):Ye?null:a.jsx("p",{className:"text-sm text-bambu-gray",children:"Enable plugs to see energy summary"})})]}),Re?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):_e&&_e.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:_e.map(oe=>a.jsx($Ye,{plug:oe,onEdit:Nt=>{L(Nt),j(!0)}},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-12",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(rl,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),a.jsx("p",{className:"text-lg font-medium text-white mb-2",children:i("settings.noSmartPlugsTitle")}),a.jsx("p",{className:"text-sm mb-4",children:i("settings.noSmartPlugsDescription")}),a.jsxs(ke,{onClick:()=>{L(null),j(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addFirstSmartPlug")]})]})})})]}),be==="notifications"&&a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Og,{className:"w-5 h-5 text-bambu-green"}),i("settings.providers")]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>re(!0),children:[a.jsx(sy,{className:"w-4 h-4"}),i("settings.log")]}),Ct&&Ct.length>0&&a.jsxs(ke,{size:"sm",variant:"secondary",onClick:()=>{gl(null),sd.mutate()},disabled:sd.isPending,children:[sd.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx($M,{className:"w-4 h-4"}),i("settings.testAll")]}),a.jsxs(ke,{size:"sm",onClick:()=>{q(null),R(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),"Add"]})]})]}),a.jsx(_t,{className:"mb-4",children:a.jsx(Mt,{className:"py-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-white text-sm font-medium",children:i("settings.notificationLanguage")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.notificationLanguageDescription")})]}),a.jsx("select",{value:E.notification_language||"en",onChange:oe=>wn("notification_language",oe.target.value),className:"px-2 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green",children:Wz.map(oe=>a.jsx("option",{value:oe.code,children:oe.nativeName},oe.code))})]})})}),Ai&&a.jsx(_t,{className:"mb-4",children:a.jsxs(Mt,{className:"py-3",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-sm font-medium text-white",children:i("settings.testResults")}),a.jsx("button",{onClick:()=>gl(null),className:"text-bambu-gray hover:text-white text-xs",children:i("common.dismiss")})]}),a.jsxs("div",{className:"flex items-center gap-4 text-sm mb-2",children:[a.jsxs("span",{className:"flex items-center gap-1 text-bambu-green",children:[a.jsx(Nr,{className:"w-4 h-4"}),i("settings.testPassedCount",{count:Ai.success})]}),Ai.failed>0&&a.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[a.jsx(ta,{className:"w-4 h-4"}),i("settings.testFailedCount",{count:Ai.failed})]})]}),Ai.results.filter(oe=>!oe.success).length>0&&a.jsx("div",{className:"space-y-1 mt-2 pt-2 border-t border-bambu-dark-tertiary",children:Ai.results.filter(oe=>!oe.success).map(oe=>a.jsxs("div",{className:"text-xs text-red-400",children:[a.jsxs("span",{className:"font-medium",children:[oe.provider_name,":"]})," ",oe.message]},oe.provider_id))})]})}),jt?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):Ct&&Ct.length>0?a.jsx("div",{className:"space-y-3",children:Ct.map(oe=>a.jsx(qYe,{provider:oe,onEdit:Nt=>{q(Nt),R(!0)}},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(Og,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm font-medium text-white mb-2",children:i("settings.noProvidersTitle")}),a.jsx("p",{className:"text-xs mb-3",children:i("settings.noProvidersDescription")}),a.jsxs(ke,{size:"sm",onClick:()=>{q(null),R(!0)},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addProvider")]})]})})})]}),a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2 mb-4",children:[a.jsx(ps,{className:"w-5 h-5 text-bambu-green"}),i("settings.messageTemplates")]}),a.jsx("p",{className:"text-sm text-bambu-gray mb-4",children:i("settings.messageTemplatesDescription")}),fn?a.jsx("div",{className:"flex justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):pn&&pn.length>0?a.jsx("div",{className:"space-y-2",children:pn.map(oe=>a.jsx(_t,{className:"cursor-pointer hover:border-bambu-green/50 transition-colors",onClick:()=>G(oe),children:a.jsx(Mt,{className:"py-2.5 px-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"min-w-0 flex-1",children:[a.jsx("p",{className:"text-white font-medium text-sm truncate",children:oe.name}),a.jsx("p",{className:"text-bambu-gray text-xs truncate mt-0.5",children:oe.title_template})]}),a.jsx("button",{className:"p-1.5 hover:bg-bambu-dark-tertiary rounded transition-colors shrink-0 ml-2",onClick:Nt=>{Nt.stopPropagation(),G(oe)},children:a.jsx(Eg,{className:"w-4 h-4 text-bambu-gray"})})]})})},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-8",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(ps,{className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{className:"text-sm",children:i("settings.noTemplatesAvailable")})]})})})]})]}),be==="apikeys"&&a.jsxs("div",{className:"grid grid-cols-1 xl:grid-cols-2 gap-8",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-6",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Wo,{className:"w-5 h-5 text-bambu-green"}),i("settings.apiKeys")]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.apiKeysDescription")})]}),a.jsxs(ke,{size:"sm",onClick:()=>ae(!0),className:"flex-shrink-0",children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.createKey")]})]}),W&&a.jsx(_t,{className:"mb-6 border-bambu-green",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx(Nr,{className:"w-5 h-5 text-bambu-green flex-shrink-0 mt-0.5"}),a.jsxs("div",{className:"flex-1",children:[a.jsx("p",{className:"text-white font-medium mb-1",children:i("settings.apiKeyCreated")}),a.jsx("p",{className:"text-sm text-bambu-gray mb-2",children:i("settings.apiKeyCopyWarning")}),a.jsxs("div",{className:"flex items-center gap-2 bg-bambu-dark rounded-lg p-2",children:[a.jsx("code",{className:"flex-1 text-sm text-bambu-green font-mono break-all",children:W}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:async()=>{try{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(W);else{const oe=document.createElement("textarea");oe.value=W,oe.style.position="fixed",oe.style.left="-999999px",document.body.appendChild(oe),oe.select(),document.execCommand("copy"),document.body.removeChild(oe)}o(i("settings.toast.keyCopied"))}catch{o(i("settings.toast.copyFailed"),"error")}},children:a.jsx(Fl,{className:"w-4 h-4"})})]}),a.jsxs("div",{className:"flex gap-2 mt-3",children:[a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>{V(W),o(i("settings.toast.keyAddedToBrowser"))},children:i("settings.useInApiBrowser")}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>Q(null),children:i("common.dismiss")})]})]})]})})}),Ce&&a.jsxs(_t,{className:"mb-6",children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-base font-semibold text-white",children:i("settings.createNewApiKey")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.keyName")}),a.jsx("input",{type:"text",value:Ae,onChange:oe=>Le(oe.target.value),placeholder:i("settings.keyNamePlaceholder"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:i("common.permissions")}),a.jsxs("div",{className:"space-y-2",children:[a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_read_status,onChange:oe=>Xe(Nt=>({...Nt,can_read_status:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.readStatus")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.readStatusDescription")})]})]}),a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_queue,onChange:oe=>Xe(Nt=>({...Nt,can_queue:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.manageQueue")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.manageQueueDescription")})]})]}),a.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:fe.can_control_printer,onChange:oe=>Xe(Nt=>({...Nt,can_control_printer:oe.target.checked})),className:"w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"}),a.jsxs("div",{children:[a.jsx("span",{className:"text-white",children:i("settings.controlPrinter")}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.controlPrinterDescription")})]})]})]})]}),a.jsxs("div",{className:"flex items-center gap-2 pt-2",children:[a.jsxs(ke,{onClick:()=>Et.mutate({name:Ae||i("settings.unnamedKey"),...fe}),disabled:Et.isPending,children:[Et.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(dr,{className:"w-4 h-4"}),i("settings.createKey")]}),a.jsx(ke,{variant:"secondary",onClick:()=>ae(!1),children:i("common.cancel")})]})]})]}),Rt?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):Bt&&Bt.length>0?a.jsx("div",{className:"space-y-3",children:Bt.map(oe=>a.jsx(_t,{children:a.jsx(Mt,{className:"py-3",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(Wo,{className:`w-5 h-5 ${oe.enabled?"text-bambu-green":"text-bambu-gray"}`}),a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium",children:oe.name}),a.jsxs("p",{className:"text-xs text-bambu-gray",children:[oe.key_prefix,"••••••••",oe.last_used&&` · ${i("settings.lastUsed")}: ${tb(oe.last_used)}`]})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsxs("div",{className:"flex gap-1 text-xs",children:[oe.can_read_status&&a.jsx("span",{className:"px-1.5 py-0.5 bg-blue-500/20 text-blue-400 rounded",children:i("settings.read")}),oe.can_queue&&a.jsx("span",{className:"px-1.5 py-0.5 bg-green-500/20 text-green-400 rounded",children:i("queue.title")}),oe.can_control_printer&&a.jsx("span",{className:"px-1.5 py-0.5 bg-orange-500/20 text-orange-400 rounded",children:i("settings.control")})]}),a.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>X(oe.id),children:a.jsx(cn,{className:"w-4 h-4 text-red-400"})})]})]})})},oe.id))}):a.jsx(_t,{children:a.jsx(Mt,{className:"py-12",children:a.jsxs("div",{className:"text-center text-bambu-gray",children:[a.jsx(Wo,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),a.jsx("p",{className:"text-lg font-medium text-white mb-2",children:i("settings.apiKeysEmptyTitle")}),a.jsx("p",{className:"text-sm mb-4",children:i("settings.apiKeysEmptyDescription")}),a.jsxs(ke,{onClick:()=>ae(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.createFirstKey")]})]})})}),a.jsxs(_t,{className:"mt-6",children:[a.jsx(Pn,{children:a.jsx("h3",{className:"text-base font-semibold text-white",children:i("settings.webhookEndpoints")})}),a.jsxs(Mt,{className:"space-y-3 text-sm",children:[a.jsx("p",{className:"text-bambu-gray",children:i("settings.webhookApiKeyHint")}),a.jsxs("div",{className:"space-y-2 font-mono text-xs",children:[a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-blue-400",children:"GET"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/status"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.getAllStatus")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-blue-400",children:"GET"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/status/:id"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.getSpecificStatus")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-green-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/queue"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.addToQueue")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-orange-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/pause"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.pausePrint")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-orange-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/resume"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.resumePrint")]})]}),a.jsxs("div",{className:"p-2 bg-bambu-dark rounded",children:[a.jsx("span",{className:"text-red-400",children:"POST"})," ",a.jsx("span",{className:"text-white",children:"/api/v1/webhook/printer/:id/stop"}),a.jsxs("span",{className:"text-bambu-gray",children:[" - ",i("settings.webhook.stopPrint")]})]})]})]})]})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"mb-6",children:[a.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(bh,{className:"w-5 h-5 text-bambu-green"}),i("settings.apiBrowser")]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.apiBrowserDescription")})]}),a.jsx(_t,{className:"mb-4",children:a.jsxs(Mt,{className:"py-3",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-2",children:i("settings.apiKeyForTesting")}),a.jsx("input",{type:"text",value:te,onChange:oe=>V(oe.target.value),placeholder:i("settings.apiKeyPlaceholder"),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white font-mono text-sm focus:border-bambu-green focus:outline-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:i("settings.apiKeyHint")})]})}),a.jsx(uQe,{apiKey:te})]})]}),be==="virtual-printer"&&a.jsx(rQe,{}),be==="filament"&&E&&a.jsxs("div",{className:"flex flex-col lg:flex-row gap-6 lg:gap-8",children:[a.jsx("div",{className:"flex-1 lg:max-w-xl",children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.amsDisplayThresholds")})}),a.jsxs(Mt,{className:"space-y-4",children:[a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.amsThresholdsDescription")}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(sO,{className:"w-4 h-4 text-blue-400"}),a.jsx("span",{className:"font-medium",children:i("settings.humidity")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.goodGreen")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0",max:"100",value:E.ams_humidity_good??40,onChange:oe=>wn("ams_humidity_good",parseInt(oe.target.value)||40),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"%"})]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.fairOrange")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"0",max:"100",value:E.ams_humidity_fair??60,onChange:oe=>wn("ams_humidity_fair",parseInt(oe.target.value)||60),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"%"})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.aboveFairBad")})]}),a.jsxs("div",{className:"space-y-3 pt-2 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(GM,{className:"w-4 h-4 text-orange-400"}),a.jsx("span",{className:"font-medium",children:i("settings.temperature")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.goodBlue")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",step:"0.5",min:"0",max:"60",value:E.ams_temp_good??28,onChange:oe=>wn("ams_temp_good",parseFloat(oe.target.value)||28),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"°C"})]})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm text-bambu-gray mb-1",children:[i("settings.fairOrange")," ≤"]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",step:"0.5",min:"0",max:"60",value:E.ams_temp_fair??35,onChange:oe=>wn("ams_temp_fair",parseFloat(oe.target.value)||35),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:"°C"})]})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.aboveFairHot")})]}),a.jsxs("div",{className:"space-y-3 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(ju,{className:"w-4 h-4 text-purple-400"}),a.jsx("span",{className:"font-medium",children:i("settings.historyRetention")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:i("settings.keepSensorHistory")}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("input",{type:"number",min:"1",max:"365",value:E.ams_history_retention_days??30,onChange:oe=>wn("ams_history_retention_days",parseInt(oe.target.value)||30),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"}),a.jsx("span",{className:"text-bambu-gray",children:i("common.days")})]})]}),a.jsx("p",{className:"text-xs text-bambu-gray",children:i("settings.historyRetentionDescription")})]}),a.jsxs("div",{className:"space-y-3 pt-4 border-t border-bambu-dark-tertiary",children:[a.jsxs("div",{className:"flex items-center gap-2 text-white",children:[a.jsx(Or,{className:"w-4 h-4 text-bambu-green"}),a.jsx("span",{className:"font-medium",children:i("settings.printModal")})]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-white",children:i("settings.expandCustomMapping")}),a.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:i("settings.expandCustomMappingDescription")})]}),a.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.per_printer_mapping_expanded??!1,onChange:oe=>wn("per_printer_mapping_expanded",oe.target.checked),className:"sr-only peer"}),a.jsx("div",{className:"w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"})]})]})]})]})]})}),a.jsx("div",{className:"flex-1 lg:max-w-xl",children:a.jsx(eQe,{})})]}),me!==null&&a.jsx(er,{title:i("settings.deleteApiKeyTitle"),message:i("settings.deleteApiKeyMessage"),confirmText:i("settings.deleteKey"),variant:"danger",onConfirm:()=>{an.mutate(me),X(null)},onCancel:()=>X(null)}),T&&a.jsx(VYe,{plug:z,onClose:()=>{j(!1),L(null)}}),B&&a.jsx(WYe,{provider:$,onClose:()=>{R(!1),q(null)}}),I&&a.jsx(KYe,{template:I,onClose:()=>G(null)}),Y&&a.jsx(QYe,{onClose:()=>re(!1)}),ge&&a.jsx(er,{title:i("settings.clearNotificationLogs"),message:i("settings.clearLogsMessage"),confirmText:i("settings.clearLogs"),variant:"warning",onConfirm:async()=>{Se(!1);try{const oe=await ce.clearNotificationLogs(30);o(oe.message,"success")}catch{o(i("settings.toast.clearLogsFailed"),"error")}},onCancel:()=>Se(!1)}),ee&&a.jsx(er,{title:i("settings.resetUiPreferences"),message:i("settings.resetUiPreferencesMessage"),confirmText:i("settings.resetPreferences"),variant:"default",onConfirm:()=>{U(!1),localStorage.clear(),o(i("settings.toast.uiPreferencesReset"),"success"),setTimeout(()=>window.location.reload(),1e3)},onCancel:()=>U(!1)}),O&&a.jsx(er,{title:`Turn All Plugs ${O==="on"?"On":"Off"}`,message:`This will turn ${O==="on"?"ON":"OFF"} all ${_e?.filter(oe=>oe.enabled).length||0} enabled smart plugs. ${O==="off"?"Any running printers may be affected!":""}`,confirmText:`Turn All ${O==="on"?"On":"Off"}`,variant:O==="off"?"danger":"warning",onConfirm:()=>{const oe=O;Z(null),bl.mutate(oe)},onCancel:()=>Z(null)}),le&&en?.release_notes&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",onClick:()=>we(!1),children:a.jsxs(_t,{className:"w-full max-w-2xl max-h-[80vh] flex flex-col",onClick:oe=>oe.stopPropagation(),children:[a.jsxs(Pn,{className:"flex flex-row items-center justify-between shrink-0",children:[a.jsxs("div",{children:[a.jsxs("h2",{className:"text-lg font-semibold text-white",children:["Release Notes - v",en.latest_version]}),en.release_name&&en.release_name!==en.latest_version&&a.jsx("p",{className:"text-sm text-bambu-gray",children:en.release_name})]}),a.jsx("button",{onClick:()=>we(!1),className:"p-1 rounded hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white",children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsx(Mt,{className:"overflow-y-auto flex-1",children:a.jsx("pre",{className:"text-sm text-bambu-gray whitespace-pre-wrap font-sans",children:en.release_notes})}),a.jsxs("div",{className:"p-4 border-t border-bambu-dark-tertiary shrink-0 flex gap-2",children:[en.release_url&&a.jsx("a",{href:en.release_url,target:"_blank",rel:"noopener noreferrer",className:"flex-1",children:a.jsxs(ke,{variant:"secondary",className:"w-full",children:[a.jsx(Xr,{className:"w-4 h-4"}),"View on GitHub"]})}),a.jsx(ke,{onClick:()=>we(!1),className:"flex-1",children:"Close"})]})]})}),be==="users"&&a.jsxs("div",{className:"space-y-6",children:[a.jsx(_t,{children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center ${l?"bg-green-500/20":"bg-gray-500/20"}`,children:l?a.jsx(P1,{className:"w-5 h-5 text-green-400"}):a.jsx(j1,{className:"w-5 h-5 text-gray-400"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-white font-medium",children:i("settings.authentication")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:i(l?"settings.authEnabledDescription":"settings.authDisabledDescription")})]})]}),l?c?.is_admin&&a.jsxs(ke,{variant:"secondary",onClick:()=>se(!0),children:[a.jsx(j1,{className:"w-4 h-4"}),i("common.disable")]}):a.jsxs(ke,{onClick:()=>e("/setup"),children:[a.jsx(P1,{className:"w-4 h-4"}),i("common.enable")]})]})})}),Kt?.advanced_auth_enabled&&a.jsx(_t,{className:"border-blue-500/30 bg-blue-500/5",children:a.jsx(Mt,{className:"py-4",children:a.jsxs("div",{className:"flex items-start gap-3",children:[a.jsx("div",{className:"w-10 h-10 rounded-full flex items-center justify-center bg-blue-500/20 flex-shrink-0",children:a.jsx(oy,{className:"w-5 h-5 text-blue-400"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-white font-medium",children:i("settings.email.advancedAuthEnabled")}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:i("settings.email.advancedAuthEnabledDesc")})]})]})})}),l&&a.jsxs("div",{className:"grid grid-cols-1 xl:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-6",children:[c&&a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),i("settings.currentUser")]}),a.jsxs(ke,{size:"sm",variant:"ghost",onClick:()=>He(!0),children:[a.jsx(Wo,{className:"w-4 h-4"}),i("settings.changePassword")]})]})}),a.jsx(Mt,{children:a.jsx("div",{className:"flex items-center justify-between",children:a.jsxs("div",{children:[a.jsx("p",{className:"text-white font-medium text-lg",children:c.username}),a.jsxs("div",{className:"flex flex-wrap gap-1 mt-2",children:[c.is_admin&&a.jsx("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-purple-500/20 text-purple-300",children:i("settings.admin")}),c.groups?.map(oe=>a.jsx("span",{className:`px-2 py-0.5 rounded-full text-xs font-medium ${oe.name==="Administrators"?"bg-purple-500/20 text-purple-300":oe.name==="Operators"?"bg-blue-500/20 text-blue-300":oe.name==="Viewers"?"bg-green-500/20 text-green-300":"bg-gray-500/20 text-gray-300"}`,children:oe.name},oe.id))]})]})})})]}),a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),i("settings.users")]}),vt("users:create")&&a.jsxs(ke,{size:"sm",onClick:()=>{Ne(!0),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addUser")]})]})}),a.jsx(Mt,{children:hi?a.jsx("div",{className:"flex items-center justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):Nn.length===0?a.jsx("p",{className:"text-center text-bambu-gray py-8",children:i("settings.noUsersFound")}):a.jsx("div",{className:"divide-y divide-bambu-dark-tertiary",children:Nn.map(oe=>a.jsxs("div",{className:"py-3 flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-white font-medium truncate",children:oe.username}),a.jsxs("div",{className:"flex flex-wrap gap-1 mt-1",children:[oe.is_admin&&a.jsx("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-purple-500/20 text-purple-300",children:i("settings.admin")}),oe.groups?.map(Nt=>a.jsx("span",{className:`px-2 py-0.5 rounded-full text-xs font-medium ${Nt.name==="Administrators"?"bg-purple-500/20 text-purple-300":Nt.name==="Operators"?"bg-blue-500/20 text-blue-300":Nt.name==="Viewers"?"bg-green-500/20 text-green-300":"bg-gray-500/20 text-gray-300"}`,children:Nt.name},Nt.id))]})]}),a.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[vt("users:update")&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>Ao(oe),children:a.jsx(Eg,{className:"w-4 h-4"})}),vt("users:delete")&&oe.id!==c?.id&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>Mo(oe.id),children:a.jsx(cn,{className:"w-4 h-4"})})]})]},oe.id))})})]})]}),a.jsx("div",{children:a.jsxs(_t,{children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("h3",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[a.jsx(PA,{className:"w-5 h-5 text-bambu-green"}),i("settings.groups")]}),vt("groups:create")&&a.jsxs(ke,{size:"sm",onClick:()=>{Fe(!0),pr()},children:[a.jsx(dr,{className:"w-4 h-4"}),i("settings.addGroup")]})]})}),a.jsx(Mt,{children:Yr?a.jsx("div",{className:"flex items-center justify-center py-8",children:a.jsx(ut,{className:"w-6 h-6 text-bambu-green animate-spin"})}):xr.length===0?a.jsx("p",{className:"text-center text-bambu-gray py-8",children:i("settings.noGroupsFound")}):a.jsx("div",{className:"divide-y divide-bambu-dark-tertiary",children:xr.map(oe=>a.jsxs("div",{className:"py-3",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(PA,{className:`w-4 h-4 ${oe.name==="Administrators"?"text-purple-400":oe.name==="Operators"?"text-blue-400":oe.name==="Viewers"?"text-green-400":"text-bambu-gray"}`}),a.jsx("span",{className:"text-white font-medium",children:oe.name}),oe.is_system&&a.jsx("span",{className:"px-2 py-0.5 rounded text-xs bg-yellow-500/20 text-yellow-400",children:i("settings.system")})]}),a.jsxs("div",{className:"flex items-center gap-1",children:[vt("groups:update")&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>ql(oe),children:a.jsx(Eg,{className:"w-4 h-4"})}),vt("groups:delete")&&!oe.is_system&&a.jsx(ke,{size:"sm",variant:"ghost",onClick:()=>En(oe.id),children:a.jsx(cn,{className:"w-4 h-4"})})]})]}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1 ml-6",children:oe.description||i("settings.noDescription")}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 ml-6 text-xs text-bambu-gray",children:[a.jsx("span",{children:i("settings.userCount",{count:oe.user_count})}),a.jsx("span",{children:i("settings.permissionCount",{count:oe.permissions.length})})]})]},oe.id))})})]})})]}),!l&&a.jsx(_t,{children:a.jsx(Mt,{className:"py-6",children:a.jsxs("div",{className:"text-center",children:[a.jsx(j1,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-medium text-white mb-2",children:i("settings.authDisabledTitle")}),a.jsx("p",{className:"text-sm text-bambu-gray mb-4 max-w-md mx-auto",children:i("settings.authDisabledMessage")}),a.jsxs("ul",{className:"space-y-2 text-sm text-bambu-gray mb-6 text-left max-w-xs mx-auto",children:[a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature1")})]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature2")})]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Nr,{className:"w-4 h-4 text-bambu-green mt-0.5 flex-shrink-0"}),a.jsx("span",{children:i("settings.authDisabledFeature3")})]})]}),a.jsxs(ke,{onClick:()=>e("/setup"),children:[a.jsx(P1,{className:"w-4 h-4"}),i("settings.enableAuthentication")]})]})})})]}),Ie&&!Kt?.advanced_auth_enabled&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Kf,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.createUser")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.username")}),a.jsx("input",{type:"text",value:gt.username,onChange:oe=>Ut({...gt,username:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterUsername"),autoComplete:"username"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.password")}),a.jsx("input",{type:"password",value:gt.password,onChange:oe=>Ut({...gt,password:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterPassword"),autoComplete:"new-password",minLength:6})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.confirmPassword")}),a.jsx("input",{type:"password",value:gt.confirmPassword,onChange:oe=>Ut({...gt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${gt.confirmPassword&>.password!==gt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmPasswordPlaceholder"),autoComplete:"new-password",minLength:6}),gt.confirmPassword&>.password!==gt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Groups"}),a.jsxs("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:[xr.map(oe=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:gt.group_ids.includes(oe.id),onChange:()=>Ts(oe.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:oe.name}),oe.is_system&&a.jsx("span",{className:"text-xs text-yellow-400",children:"(System)"})]},oe.id)),xr.length===0&&a.jsx("p",{className:"text-sm text-bambu-gray",children:i("settings.noGroupsAvailable")})]})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:"Cancel"}),a.jsx(ke,{onClick:ls,disabled:nn.isPending||!gt.username||!gt.password||gt.password!==gt.confirmPassword||gt.password.length<6,children:nn.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Creating..."]}):a.jsxs(a.Fragment,{children:[a.jsx(dr,{className:"w-4 h-4"}),"Create User"]})})]})]})]})}),Ie&&Kt?.advanced_auth_enabled&&a.jsx(JYe,{formData:gt,setFormData:Ut,groups:xr,onClose:()=>{Ne(!1),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},onCreate:ls,isCreating:nn.isPending,isCreateButtonDisabled:nn.isPending||!gt.username||!gt.email}),Ge&&rt!==null&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Eg,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.editUser")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("settings.username")," ",Kt?.advanced_auth_enabled&&a.jsx("span",{className:"text-red-400",children:"*"})]}),a.jsx("input",{type:"text",value:gt.username,onChange:oe=>Ut({...gt,username:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterUsername"),autoComplete:"username"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("users.form.email")||"Email"," ",Kt?.advanced_auth_enabled?a.jsx("span",{className:"text-red-400",children:"*"}):a.jsxs("span",{className:"text-bambu-gray font-normal",children:["(",i("users.form.optional")||"optional",")"]})]}),a.jsx("input",{type:"email",value:gt.email,onChange:oe=>Ut({...gt,email:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("users.form.emailPlaceholder")||"user@example.com",required:Kt?.advanced_auth_enabled})]}),!Kt?.advanced_auth_enabled&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:[i("users.form.password")||"Password"," ",a.jsxs("span",{className:"text-bambu-gray font-normal",children:["(",i("users.form.leaveBlankToKeep")||"leave blank to keep current",")"]})]}),a.jsx("input",{type:"password",value:gt.password,onChange:oe=>Ut({...gt,password:oe.target.value,confirmPassword:""}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterNewPassword"),autoComplete:"new-password",minLength:6})]}),gt.password&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.confirmPassword")}),a.jsx("input",{type:"password",value:gt.confirmPassword,onChange:oe=>Ut({...gt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${gt.confirmPassword&>.password!==gt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmNewPassword"),autoComplete:"new-password",minLength:6}),gt.confirmPassword&>.password!==gt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]})]}),Kt?.advanced_auth_enabled&&a.jsx("div",{className:"bg-bambu-dark-secondary/50 border border-bambu-green/20 rounded-lg p-3",children:a.jsx("p",{className:"text-sm text-bambu-gray",children:i("users.form.passwordManagedByAdvancedAuth")||'Password is managed by Advanced Authentication. Use "Reset Password" to send a new password to the user via email.'})}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("users.form.groups")||"Groups"}),a.jsx("div",{className:"space-y-2 max-h-40 overflow-y-auto p-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg",children:xr.map(oe=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-tertiary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:gt.group_ids.includes(oe.id),onChange:()=>Ts(oe.id),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark"}),a.jsx("span",{className:"text-sm text-white",children:oe.name}),oe.is_system&&a.jsxs("span",{className:"text-xs text-yellow-400",children:["(",i("users.system")||"System",")"]})]},oe.id))})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Me(!1),Ee(null),Ut({username:"",password:"",email:"",confirmPassword:"",role:"user",group_ids:[]})},children:i("users.modal.cancel")||"Cancel"}),a.jsx(ke,{onClick:()=>Ei(rt),disabled:Mn.isPending||!gt.username||Kt?.advanced_auth_enabled&&!gt.email||!!(!Kt?.advanced_auth_enabled&>.password&&(gt.password!==gt.confirmPassword||gt.password.length<6)),children:Mn.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),i("users.modal.saving")||"Saving..."]}):a.jsxs(a.Fragment,{children:[a.jsx(gs,{className:"w-4 h-4"}),i("users.modal.saveChanges")||"Save Changes"]})})]})]})]})}),Ke!==null&&a.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4",onClick:()=>{Be(null),$e(null)},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center gap-2 text-red-400",children:[a.jsx(cn,{className:"w-5 h-5"}),a.jsx("h3",{className:"text-lg font-semibold",children:i("settings.deleteUserTitle")})]})}),a.jsx(Mt,{className:"space-y-4",children:at?a.jsx("div",{className:"flex items-center justify-center py-4",children:a.jsx("div",{className:"animate-spin rounded-full h-6 w-6 border-2 border-bambu-green border-t-transparent"})}):ue&&ue.archives+ue.queue_items+ue.library_files>0?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-white",children:i("settings.userHasCreated")}),a.jsxs("ul",{className:"list-disc list-inside text-bambu-gray space-y-1",children:[ue.archives>0&&a.jsxs("li",{children:[ue.archives," archive",ue.archives!==1?"s":""]}),ue.queue_items>0&&a.jsxs("li",{children:[ue.queue_items," queue item",ue.queue_items!==1?"s":""]}),ue.library_files>0&&a.jsxs("li",{children:[ue.library_files," library file",ue.library_files!==1?"s":""]})]}),a.jsx("p",{className:"text-bambu-gray text-sm",children:i("settings.userItemsQuestion")}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(ke,{variant:"danger",onClick:()=>Mr.mutate({id:Ke,deleteItems:!0}),disabled:Mr.isPending,className:"justify-center",children:"Delete user AND their items"}),a.jsx(ke,{variant:"secondary",onClick:()=>Mr.mutate({id:Ke,deleteItems:!1}),disabled:Mr.isPending,className:"justify-center",children:"Delete user, keep items (become ownerless)"}),a.jsx(ke,{variant:"ghost",onClick:()=>{Be(null),$e(null)},disabled:Mr.isPending,className:"justify-center",children:"Cancel"})]})]}):a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-white",children:i("settings.deleteUserConfirm")}),a.jsx("p",{className:"text-bambu-gray text-sm",children:i("settings.actionCannotBeUndone")}),a.jsxs("div",{className:"flex gap-2 justify-end",children:[a.jsx(ke,{variant:"ghost",onClick:()=>{Be(null),$e(null)},disabled:Mr.isPending,children:"Cancel"}),a.jsx(ke,{variant:"danger",onClick:()=>Mr.mutate({id:Ke,deleteItems:!1}),disabled:Mr.isPending,children:"Delete User"})]})]})})]})}),(Ft||xt)&&a.jsx("div",{className:"fixed inset-0 bg-black flex items-center justify-center z-50 p-4",onClick:()=>{Fe(!1),Wt(null),pr()},children:a.jsxs(_t,{className:"w-full max-w-2xl max-h-[90vh] overflow-y-auto",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(PA,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:xt?"Edit Group":"Create Group"})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{Fe(!1),Wt(null),pr()},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:i("settings.groupName")}),a.jsx("input",{type:"text",value:hn.name,onChange:oe=>or({...hn,name:oe.target.value}),disabled:xt?.is_system,className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors disabled:opacity-50",placeholder:i("settings.enterGroupName")}),xt?.is_system&&a.jsx("p",{className:"text-xs text-yellow-400 mt-1",children:i("settings.systemGroupWarning")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Description"}),a.jsx("textarea",{value:hn.description,onChange:oe=>or({...hn,description:oe.target.value}),rows:2,className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors resize-none",placeholder:i("settings.enterDescriptionOptional")})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-white mb-2",children:["Permissions (",hn.permissions.length," selected)"]}),a.jsx("div",{className:"space-y-2 max-h-96 overflow-y-auto",children:No?.categories.map(oe=>a.jsxs("div",{className:"border border-bambu-dark-tertiary rounded-lg overflow-hidden",children:[a.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-bambu-dark-secondary cursor-pointer hover:bg-bambu-dark-tertiary transition-colors",onClick:()=>Jb(oe.name),children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("button",{type:"button",onClick:Nt=>{Nt.stopPropagation(),Lv(oe,!ad(oe))},className:`w-5 h-5 rounded border flex items-center justify-center transition-colors ${ad(oe)?"bg-bambu-green border-bambu-green":nf(oe)?"bg-bambu-green/50 border-bambu-green":"border-bambu-gray hover:border-white"}`,children:(ad(oe)||nf(oe))&&a.jsx(qi,{className:"w-3 h-3 text-white"})}),a.jsx("span",{className:"text-white font-medium",children:oe.name}),a.jsxs("span",{className:"text-xs text-bambu-gray",children:["(",oe.permissions.filter(Nt=>hn.permissions.includes(Nt.value)).length,"/",oe.permissions.length,")"]})]}),Kn.has(oe.name)?a.jsx(Sr,{className:"w-4 h-4 text-bambu-gray"}):a.jsx(_s,{className:"w-4 h-4 text-bambu-gray"})]}),Kn.has(oe.name)&&a.jsx("div",{className:"p-3 bg-bambu-dark space-y-2",children:oe.permissions.map(Nt=>a.jsxs("label",{className:"flex items-center gap-3 px-2 py-1.5 rounded hover:bg-bambu-dark-secondary cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:hn.permissions.includes(Nt.value),onChange:()=>Ym(Nt.value),className:"w-4 h-4 rounded border-bambu-gray text-bambu-green focus:ring-bambu-green focus:ring-offset-0 bg-bambu-dark-secondary"}),a.jsx("span",{className:"text-sm text-bambu-gray",children:Nt.label})]},Nt.value))})]},oe.name))})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{Fe(!1),Wt(null),pr()},children:"Cancel"}),a.jsx(ke,{onClick:xt?tf:Zb,disabled:ko.isPending||As.isPending||!hn.name.trim(),children:ko.isPending||As.isPending?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),xt?"Saving...":"Creating..."]}):a.jsxs(a.Fragment,{children:[a.jsx(gs,{className:"w-4 h-4"}),xt?"Save Changes":"Create Group"]})})]})]})]})}),Qt!==null&&a.jsx(er,{title:i("settings.deleteGroupTitle"),message:i("settings.deleteGroupMessage"),confirmText:i("settings.deleteGroup"),variant:"danger",onConfirm:()=>{Eo.mutate(Qt),En(null)},onCancel:()=>En(null)}),be==="email"&&a.jsx(sQe,{}),be==="backup"&&a.jsx(aQe,{}),ye&&a.jsx(er,{title:i("settings.disableAuthenticationTitle"),message:i("settings.disableAuthenticationMessage"),confirmText:i("settings.disableAuthentication"),variant:"danger",onConfirm:async()=>{try{await ce.disableAuth(),o(i("settings.toast.authDisabled"),"success"),await u(),se(!1),window.location.href="/"}catch(oe){const Nt=oe instanceof Error?oe.message:i("settings.toast.authDisableFailed");o(Nt,"error")}},onCancel:()=>se(!1)}),Oe&&a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:a.jsxs(_t,{className:"w-full max-w-md",onClick:oe=>oe.stopPropagation(),children:[a.jsx(Pn,{children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Wo,{className:"w-5 h-5 text-bambu-green"}),a.jsx("h2",{className:"text-lg font-semibold text-white",children:i("settings.changePassword")})]}),a.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:a.jsx(Lt,{className:"w-5 h-5"})})]})}),a.jsxs(Mt,{children:[a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Current Password"}),a.jsx("input",{type:"password",value:tt.currentPassword,onChange:oe=>Ue({...tt,currentPassword:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterCurrentPassword"),autoComplete:"current-password"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"New Password"}),a.jsx("input",{type:"password",value:tt.newPassword,onChange:oe=>Ue({...tt,newPassword:oe.target.value}),className:"w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors",placeholder:i("settings.enterNewPasswordMin6"),autoComplete:"new-password",minLength:6})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-white mb-2",children:"Confirm New Password"}),a.jsx("input",{type:"password",value:tt.confirmPassword,onChange:oe=>Ue({...tt,confirmPassword:oe.target.value}),className:`w-full px-4 py-3 bg-bambu-dark-secondary border rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors ${tt.confirmPassword&&tt.newPassword!==tt.confirmPassword?"border-red-500":"border-bambu-dark-tertiary"}`,placeholder:i("settings.confirmNewPassword"),autoComplete:"new-password",minLength:6}),tt.confirmPassword&&tt.newPassword!==tt.confirmPassword&&a.jsx("p",{className:"text-red-400 text-xs mt-1",children:i("settings.passwordsDoNotMatch")})]})]}),a.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>{He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})},children:"Cancel"}),a.jsx(ke,{onClick:async()=>{if(tt.newPassword!==tt.confirmPassword){o(i("settings.toast.passwordsDoNotMatch"),"error");return}if(tt.newPassword.length<6){o(i("settings.toast.passwordTooShort"),"error");return}Te(!0);try{await ce.changePassword(tt.currentPassword,tt.newPassword),o(i("settings.toast.passwordChanged"),"success"),He(!1),Ue({currentPassword:"",newPassword:"",confirmPassword:""})}catch(oe){const Nt=oe instanceof Error?oe.message:"Failed to change password";o(Nt,"error")}finally{Te(!1)}},disabled:xe||!tt.currentPassword||!tt.newPassword||tt.newPassword!==tt.confirmPassword||tt.newPassword.length<6,children:xe?a.jsxs(a.Fragment,{children:[a.jsx(ut,{className:"w-4 h-4 animate-spin"}),"Changing..."]}):a.jsxs(a.Fragment,{children:[a.jsx(Wo,{className:"w-4 h-4"}),"Change Password"]})})]})]})]})})]})}const cae=t=>{const e=parseFloat(t);return(Math.trunc(e*1e3)/1e3).toFixed(3)},fQe=t=>t.startsWith("HH")?"HF":"S",mQe=t=>{const e=t.match(/^([A-Z]{2}\d{2})/);return e?e[1]:"HH00"},UR=t=>{const e=["High Flow_","High Flow ","Standard_","Standard ","HF_","HF ","S_","S "];for(const r of e)if(t.startsWith(r))return t.slice(r.length);const n=t.indexOf("_");return n>0?t.slice(n+1):t};function bP({profile:t,onEdit:e,onCopy:n,selectionMode:r,isSelected:i,onToggleSelect:s,note:o}){const l=fQe(t.nozzle_id),c=t.nozzle_diameter,u=()=>{r&&s?s():e()};return a.jsxs("div",{className:"flex items-center gap-2",children:[r&&a.jsx("button",{onClick:s,className:"text-bambu-gray hover:text-white transition-colors p-1",children:i?a.jsx(qs,{className:"w-4 h-4 text-bambu-green"}):a.jsx(ll,{className:"w-4 h-4"})}),a.jsxs("button",{onClick:u,className:`flex-1 text-left px-3 py-2 bg-bambu-dark rounded hover:bg-bambu-dark-tertiary transition-colors ${i?"ring-1 ring-bambu-green":""}`,children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-bambu-green font-mono text-sm font-bold whitespace-nowrap",children:cae(t.k_value)}),a.jsx("span",{className:"text-white text-sm truncate flex-1",title:t.name,children:t.name||"Unnamed"}),o&&a.jsx("span",{title:"Has note",children:a.jsx(HK,{className:"w-3 h-3 text-yellow-500"})}),a.jsxs("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:[l," ",c]})]}),o&&a.jsxs("div",{className:"text-xs mt-0.5 truncate text-yellow-500/70",title:o,children:["Note: ",o.length>50?o.substring(0,50)+"...":o]})]}),!r&&n&&a.jsx("button",{onClick:d=>{d.stopPropagation(),n()},className:"text-bambu-gray hover:text-white transition-colors p-1",title:"Copy profile",children:a.jsx(Fl,{className:"w-4 h-4"})})]})}function xP({profile:t,printerId:e,nozzleDiameter:n,existingProfiles:r=[],isDualNozzle:i=!1,initialNote:s="",initialNoteKey:o=null,onClose:l,onSave:c,onSaveNote:u,hasPermission:d}){const{t:h}=Sn(),{showToast:m}=Hn(),[p,b]=_.useState(t?.name||""),[v,x]=_.useState(t?.k_value?cae(t.k_value):"0.020"),[y,S]=_.useState(t?.filament_id||""),[N,A]=_.useState(t?.nozzle_id?mQe(t.nozzle_id):"HH00"),[k,C]=_.useState(t?.nozzle_diameter||n),[E,P]=_.useState(t?[t.extruder_id]:i?[0,1]:[0]),[T,j]=_.useState(!1),[z,L]=_.useState({current:0,total:0}),[B,R]=_.useState(s),$=Jr.useMemo(()=>{const K=new Map;for(const ne of r)if(ne.filament_id&&!K.has(ne.filament_id)){const ie=UR(ne.name||"");K.set(ne.filament_id,{id:ne.filament_id,name:ie||ne.filament_id})}return Array.from(K.values()).sort((ne,ie)=>ne.name.localeCompare(ie.name))},[r]),q=pt({mutationFn:K=>(console.log("[KProfile] Calling API..."),ce.setKProfile(e,K)),onSuccess:K=>{if(console.log("[KProfile] Save success:",K),m(h("kProfiles.toast.profileSaved")),u&&B!==s){let ne;B===""&&o?ne=o:t&&t.slot_id>0?ne=t.setting_id||`slot_${t.slot_id}_${t.filament_id}_${t.extruder_id}`:ne=`name_${p}_${y}`,u(ne,B)}j(!0),setTimeout(()=>{j(!1),c()},2500)},onError:K=>{console.error("[KProfile] Save error:",K),m(K.message,"error"),j(!1)}}),I=pt({mutationFn:K=>(console.log("[KProfile] Deleting profile..."),ce.deleteKProfile(e,K)),onSuccess:K=>{console.log("[KProfile] Delete success:",K),m(h("kProfiles.toast.profileDeleted")),j(!0),setTimeout(()=>{j(!1),l()},4e3)},onError:K=>{console.error("[KProfile] Delete error:",K),m(K.message,"error"),j(!1)}}),[G,Y]=_.useState(!1),re=()=>{t&&I.mutate({slot_id:t.slot_id,extruder_id:t.extruder_id,nozzle_id:t.nozzle_id,nozzle_diameter:t.nozzle_diameter,filament_id:t.filament_id,setting_id:t.setting_id})},H=async K=>{if(K.preventDefault(),i&&!t&&E.length===0){m(h("kProfiles.toast.selectAtLeastOneExtruder"),"error");return}const ne=parseFloat(v).toFixed(6),ie=`${N}-${k}`;if(t||E.length===1){const pe={name:p,k_value:ne,filament_id:y,nozzle_id:ie,nozzle_diameter:k,extruder_id:t?t.extruder_id:E[0],setting_id:t?.setting_id,slot_id:t?.slot_id??0};console.log("[KProfile] Saving profile:",pe),q.mutate(pe);return}j(!0),L({current:1,total:E.length});const be=E.map(pe=>({name:p,k_value:ne,filament_id:y,nozzle_id:ie,nozzle_diameter:k,extruder_id:pe,setting_id:void 0,slot_id:0}));console.log(`[KProfile] Saving ${be.length} profiles in batch:`,be);try{if(await ce.setKProfilesBatch(e,be),m(h("kProfiles.toast.profilesSaved",{count:E.length})),u&&B){const pe=`name_${p}_${y}`;u(pe,B)}}catch(pe){console.error("[KProfile] Failed to save batch:",pe),m(h("kProfiles.toast.failedToSaveBatch"),"error"),j(!1),L({current:0,total:0});return}L({current:E.length,total:E.length}),setTimeout(()=>{j(!1),L({current:0,total:0}),c()},3e3)};return a.jsxs("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:[a.jsxs(_t,{className:"w-full max-w-md relative",children:[T&&a.jsxs("div",{className:"absolute inset-0 bg-bambu-dark-secondary/90 flex flex-col items-center justify-center z-10 rounded-lg",children:[a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin mb-3"}),a.jsx("p",{className:"text-white font-medium",children:z.total>1?h("kProfiles.modal.savingExtruder",{current:z.current,total:z.total}):h("kProfiles.modal.syncing")}),a.jsx("p",{className:"text-bambu-gray text-sm mt-1",children:h("kProfiles.modal.pleaseWait")})]}),a.jsxs(Mt,{className:"p-0",children:[a.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[a.jsx("h2",{className:"text-xl font-semibold text-white",children:h(t?"kProfiles.modal.editTitle":"kProfiles.modal.addTitle")}),a.jsx("button",{onClick:l,className:"text-bambu-gray hover:text-white transition-colors",disabled:T,children:a.jsx(Lt,{className:"w-5 h-5"})})]}),a.jsxs("form",{onSubmit:H,className:"p-4 space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.profileName")}),a.jsx("input",{type:"text",value:p,onChange:K=>b(K.target.value),disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,placeholder:h("kProfiles.modal.profileNamePlaceholder"),required:!t})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.kValue")}),a.jsx("input",{type:"text",inputMode:"decimal",value:v,onChange:K=>{const ne=K.target.value;(ne===""||/^\d*\.?\d*$/.test(ne))&&x(ne)},onBlur:K=>{const ne=parseFloat(K.target.value);isNaN(ne)||x((Math.trunc(ne*1e3)/1e3).toFixed(3))},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none font-mono",placeholder:h("kProfiles.modal.kValuePlaceholder"),required:!0}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.kValueHelp")})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.filament")}),a.jsxs("select",{value:y,onChange:K=>{const ne=K.target.value;if(S(ne),!t&&ne&&!p){const ie=$.find(be=>be.id===ne);ie&&b(`${N==="HH00"?"HF":"S"} ${ie.name}`)}},disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,required:!t,children:[a.jsx("option",{value:"",children:h("kProfiles.modal.selectFilament")}),t?.filament_id&&a.jsx("option",{value:t.filament_id,children:$.find(K=>K.id===t.filament_id)?.name||t.filament_id},t.filament_id),!t&&$.map(K=>a.jsx("option",{value:K.id,children:K.name},K.id))]}),!t&&$.length===0&&a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.noFilamentsHelp")})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.flowType")}),a.jsxs("select",{value:N,onChange:K=>{const ne=K.target.value;if(A(ne),!t&&y&&!p){const ie=$.find(be=>be.id===y);ie&&b(`${ne==="HS00"?"HF":"S"} ${ie.name}`)}},disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,children:[a.jsx("option",{value:"HH00",children:h("kProfiles.modal.highFlow")}),a.jsx("option",{value:"HS00",children:h("kProfiles.modal.standard")})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.nozzleSize")}),a.jsxs("select",{value:k,onChange:K=>C(K.target.value),disabled:!!t,className:`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${t?"opacity-60 cursor-not-allowed":""}`,children:[a.jsx("option",{value:"0.2",children:"0.2mm"}),a.jsx("option",{value:"0.4",children:"0.4mm"}),a.jsx("option",{value:"0.6",children:"0.6mm"}),a.jsx("option",{value:"0.8",children:"0.8mm"})]})]})]}),i&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h(t?"kProfiles.modal.extruder":"kProfiles.modal.extruders")}),t?a.jsx("div",{className:"px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white opacity-60",children:t.extruder_id===1?h("kProfiles.modal.left"):h("kProfiles.modal.right")}):a.jsxs("div",{className:"flex gap-4",children:[a.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.includes(1),onChange:K=>{K.target.checked?P([...E,1]):P(E.filter(ne=>ne!==1))},className:"w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"}),a.jsx("span",{className:"text-white",children:h("kProfiles.modal.left")})]}),a.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[a.jsx("input",{type:"checkbox",checked:E.includes(0),onChange:K=>{K.target.checked?P([...E,0]):P(E.filter(ne=>ne!==0))},className:"w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"}),a.jsx("span",{className:"text-white",children:h("kProfiles.modal.right")})]})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:h("kProfiles.modal.notes")}),a.jsx("textarea",{value:B,onChange:K=>R(K.target.value),placeholder:h("kProfiles.modal.notesPlaceholder"),rows:2,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none resize-none"}),a.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:h("kProfiles.modal.notesHelp")})]}),a.jsxs("div",{className:"flex gap-2 pt-4",children:[t&&a.jsx(ke,{type:"button",variant:"secondary",onClick:()=>Y(!0),disabled:I.isPending||T||!d("kprofiles:delete"),title:d("kprofiles:delete")?void 0:h("kProfiles.permission.noDelete"),className:"text-red-500 hover:bg-red-500/10",children:I.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"})}),a.jsx(ke,{type:"button",variant:"secondary",onClick:l,disabled:T,className:"flex-1",children:h("common.cancel")}),a.jsxs(ke,{type:"submit",disabled:q.isPending||T||!d(t?"kprofiles:update":"kprofiles:create"),title:d(t?"kprofiles:update":"kprofiles:create")?void 0:h(t?"kProfiles.permission.noUpdate":"kProfiles.permission.noCreate"),className:"flex-1",children:[q.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(FM,{className:"w-4 h-4"}),h("common.save")]})]})]})]})]}),G&&a.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-[60]",children:a.jsx(_t,{className:"w-full max-w-sm",children:a.jsxs(Mt,{className:"p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center",children:a.jsx(cn,{className:"w-5 h-5 text-red-500"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:h("kProfiles.deleteConfirm.title")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:h("kProfiles.deleteConfirm.cannotUndo")})]})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:h("kProfiles.deleteConfirm.message",{name:t?.name})}),a.jsxs("div",{className:"flex gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>Y(!1),className:"flex-1",children:h("common.cancel")}),a.jsxs(ke,{onClick:()=>{Y(!1),re()},disabled:I.isPending,className:"flex-1 bg-red-500 hover:bg-red-600 text-white",children:[I.isPending?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),h("common.delete")]})]})]})})})]})}const A1={NOZZLE_DIAMETER:"bambusy_kprofiles_nozzle",SORT_OPTION:"bambusy_kprofiles_sort"};function pQe(){const{t}=Sn(),{showToast:e}=Hn(),{hasPermission:n}=Di(),[r,i]=_.useState(null),[s,o]=_.useState(()=>localStorage.getItem(A1.NOZZLE_DIAMETER)||"0.4"),[l,c]=_.useState(null),[u,d]=_.useState(!1),[h,m]=_.useState(null),[p,b]=_.useState(""),[v,x]=_.useState("all"),[y,S]=_.useState("all"),[N,A]=_.useState(()=>localStorage.getItem(A1.SORT_OPTION)||"name"),[k,C]=_.useState(!1),[E,P]=_.useState(new Set),[T,j]=_.useState(!1),[z,L]=_.useState(!1),B=_.useCallback(V=>`${V.slot_id}_${V.extruder_id}`,[]);_.useEffect(()=>{localStorage.setItem(A1.NOZZLE_DIAMETER,s)},[s]),_.useEffect(()=>{localStorage.setItem(A1.SORT_OPTION,N)},[N]);const{data:R,isLoading:$}=st({queryKey:["printers"],queryFn:ce.getPrinters}),{data:q,isLoading:I,isFetching:G,error:Y,refetch:re}=st({queryKey:["kprofiles",r,s],queryFn:async()=>{console.log("[KProfiles] Fetching profiles for printer",r,"nozzle",s);const V=await ce.getKProfiles(r,s);return console.log("[KProfiles] Received profiles:",V?.profiles?.length||0,"profiles"),V},enabled:!!r,retry:!1,staleTime:0,gcTime:0,refetchOnMount:"always"}),{data:H}=st({queryKey:["kprofiles",r,"0.4"],queryFn:()=>ce.getKProfiles(r,"0.4"),enabled:!!r,staleTime:6e4}),{data:K,refetch:ne}=st({queryKey:["kprofile-notes",r],queryFn:()=>ce.getKProfileNotes(r),enabled:!!r,staleTime:3e4}),ie=Y?.message?.includes("not connected");_.useEffect(()=>{if(!r&&R&&R.length>0){const V=R.find(ge=>ge.is_active);V&&i(V.id)}},[r,R]),_.useEffect(()=>{if(r){const V=setTimeout(()=>{re()},150);return()=>clearTimeout(V)}},[r,s]);const be=R?.filter(V=>V.is_active)||[],pe=Jr.useMemo(()=>q?.profiles?q.profiles.filter(ge=>{const Se=p.toLowerCase(),ee=!Se||ge.name.toLowerCase().includes(Se)||ge.filament_id.toLowerCase().includes(Se),U=v==="all"||v==="left"&&ge.extruder_id===1||v==="right"&&ge.extruder_id===0,O=y==="all"||y==="hf"&&ge.nozzle_id.startsWith("HH")||y==="s"&&ge.nozzle_id.startsWith("HS");return ee&&U&&O}).sort((ge,Se)=>{switch(N){case"k_value":return parseFloat(ge.k_value)-parseFloat(Se.k_value);case"filament":return UR(ge.name).localeCompare(UR(Se.name));default:return ge.name.localeCompare(Se.name)}}):[],[q?.profiles,p,v,y,N]),de=R?.find(V=>V.id===r),Ce=de?.nozzle_count===2;_.useEffect(()=>{const V=ge=>{ge.target instanceof HTMLInputElement||ge.target instanceof HTMLTextAreaElement||ge.target instanceof HTMLSelectElement||l||u||h||(ge.key==="r"||ge.key==="R"?(ge.preventDefault(),re()):ge.key==="n"||ge.key==="N"?(ge.preventDefault(),d(!0)):ge.key==="Escape"&&k&&(ge.preventDefault(),C(!1),P(new Set)))};return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[l,u,h,k,re]);const ae=_.useCallback(()=>{if(!q?.profiles||q.profiles.length===0){e(t("kProfiles.toast.noProfilesToExport"),"error");return}const V={version:1,exported_at:new Date().toISOString(),printer:de?.name||"Unknown",nozzle_diameter:s,profiles:q.profiles.map(U=>({name:U.name,k_value:U.k_value,filament_id:U.filament_id,nozzle_id:U.nozzle_id,nozzle_diameter:U.nozzle_diameter,extruder_id:U.extruder_id}))},ge=new Blob([JSON.stringify(V,null,2)],{type:"application/json"}),Se=URL.createObjectURL(ge),ee=document.createElement("a");ee.href=Se,ee.download=`kprofiles_${de?.name||"printer"}_${s}mm_${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(ee),ee.click(),document.body.removeChild(ee),URL.revokeObjectURL(Se),e(t("kProfiles.toast.exportedProfiles",{count:q.profiles.length}))},[q?.profiles,de,s,e,t]),Ae=_.useCallback(()=>{const V=document.createElement("input");V.type="file",V.accept=".json",V.onchange=async ge=>{const Se=ge.target.files?.[0];if(Se)try{const ee=await Se.text(),U=JSON.parse(ee);if(!U.profiles||!Array.isArray(U.profiles)){e(t("kProfiles.toast.invalidFileFormat"),"error");return}let O=0;for(const Z of U.profiles)if(!(!Z.name||!Z.k_value||!Z.filament_id))try{await ce.setKProfile(r,{name:Z.name,k_value:parseFloat(Z.k_value).toFixed(6),filament_id:Z.filament_id,nozzle_id:Z.nozzle_id||`HH00-${s}`,nozzle_diameter:Z.nozzle_diameter||s,extruder_id:Z.extruder_id??0,slot_id:0}),O++,await new Promise(le=>setTimeout(le,500))}catch(le){console.error("Failed to import profile:",Z.name,le)}e(t("kProfiles.toast.importedProfiles",{count:O,total:U.profiles.length})),re()}catch(ee){console.error("Import error:",ee),e(t("kProfiles.toast.failedToParseImport"),"error")}},V.click()},[r,s,e,re,t]),Le=_.useCallback(V=>{P(ge=>{const Se=new Set(ge);return Se.has(V)?Se.delete(V):Se.add(V),Se})},[]),fe=_.useCallback(()=>{P(new Set(pe.map(V=>B(V))))},[pe,B]),Xe=_.useCallback(()=>{E.size!==0&&j(!0)},[E.size]),W=_.useCallback(async()=>{const V=pe.filter(Se=>E.has(B(Se)));L(!0);let ge=0;for(const Se of V)try{await ce.deleteKProfile(r,{slot_id:Se.slot_id,extruder_id:Se.extruder_id,nozzle_id:Se.nozzle_id,nozzle_diameter:Se.nozzle_diameter,filament_id:Se.filament_id,setting_id:Se.setting_id}),ge++,await new Promise(ee=>setTimeout(ee,300))}catch(ee){console.error("Failed to delete profile:",Se.name,ee)}e(t("kProfiles.toast.profilesDeleted",{count:ge})),L(!1),j(!1),C(!1),P(new Set),re()},[r,E,pe,e,re,B,t]),Q=_.useCallback(V=>{const ge=[];return V.setting_id&&ge.push(V.setting_id),ge.push(`slot_${V.slot_id}_${V.filament_id}_${V.extruder_id}`),ge.push(`name_${V.name}_${V.filament_id}`),ge},[]),me=_.useCallback(async(V,ge)=>{if(r)try{await ce.setKProfileNote(r,V,ge),ne()}catch(Se){console.error("Failed to save note:",Se),e(t("kProfiles.toast.failedToSaveNote"),"error")}},[r,ne,e,t]),X=_.useCallback(V=>{if(!K?.notes)return{note:"",key:null};const ge=Q(V);for(const Se of ge)if(K.notes[Se])return{note:K.notes[Se],key:Se};return{note:"",key:null}},[K,Q]),te=_.useCallback(V=>X(V).note,[X]);return $?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):!R||R.length===0?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(Wi,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noPrintersConfigured")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.addPrinterInSettings")})]})}):be.length===0?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(Or,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noActivePrinters")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.enablePrinterConnection")})]})}):a.jsxs(a.Fragment,{children:[G&&!I&&a.jsxs("div",{className:"fixed inset-0 bg-black/50 flex flex-col items-center justify-center z-40",children:[a.jsx(ut,{className:"w-10 h-10 text-bambu-green animate-spin mb-3"}),a.jsx("p",{className:"text-white font-medium",children:t("kProfiles.loadingProfiles")})]}),a.jsxs("div",{className:"flex flex-wrap gap-4 mb-6",children:[a.jsxs("div",{className:"flex-1 min-w-48",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:t("kProfiles.printer")}),a.jsx("select",{value:r||"",onChange:V=>i(parseInt(V.target.value)),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:be.map(V=>a.jsx("option",{value:V.id,children:V.name},V.id))})]}),a.jsxs("div",{className:"w-32",children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:t("kProfiles.nozzle")}),a.jsxs("select",{value:s,onChange:V=>o(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"0.2",children:"0.2mm"}),a.jsx("option",{value:"0.4",children:"0.4mm"}),a.jsx("option",{value:"0.6",children:"0.6mm"}),a.jsx("option",{value:"0.8",children:"0.8mm"})]})]}),a.jsxs("div",{className:"flex items-end gap-2",children:[a.jsxs(ke,{variant:"secondary",onClick:()=>re(),disabled:G||!n("kprofiles:read"),title:n("kprofiles:read")?void 0:t("kProfiles.permission.noRead"),children:[a.jsx(Ir,{className:`w-4 h-4 ${G?"animate-spin":""}`}),t("kProfiles.refresh")]}),a.jsxs(ke,{onClick:()=>d(!0),disabled:!n("kprofiles:create"),title:n("kprofiles:create")?void 0:t("kProfiles.permission.noCreate"),children:[a.jsx(dr,{className:"w-4 h-4"}),t("kProfiles.addProfile")]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4 mb-4",children:[a.jsxs("div",{className:"flex-1 min-w-48 relative",children:[a.jsx(va,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),a.jsx("input",{type:"text",value:p,onChange:V=>b(V.target.value),placeholder:t("kProfiles.searchPlaceholder"),className:"w-full pl-10 pr-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"})]}),Ce&&a.jsx("div",{className:"w-36",children:a.jsxs("select",{value:v,onChange:V=>x(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"all",children:t("kProfiles.allExtruders")}),a.jsx("option",{value:"left",children:t("kProfiles.leftOnly")}),a.jsx("option",{value:"right",children:t("kProfiles.rightOnly")})]})}),a.jsx("div",{className:"w-32",children:a.jsxs("select",{value:y,onChange:V=>S(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"all",children:t("kProfiles.allFlow")}),a.jsx("option",{value:"hf",children:t("kProfiles.hfOnly")}),a.jsx("option",{value:"s",children:t("kProfiles.sOnly")})]})}),a.jsx("div",{className:"w-32",children:a.jsxs("select",{value:N,onChange:V=>A(V.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"name",children:t("kProfiles.sortName")}),a.jsx("option",{value:"k_value",children:t("kProfiles.sortKValue")}),a.jsx("option",{value:"filament",children:t("kProfiles.sortFilament")})]})})]}),a.jsxs("div",{className:"flex flex-wrap gap-2 mb-6",children:[a.jsxs(ke,{variant:"secondary",onClick:ae,disabled:!q?.profiles?.length||!n("kprofiles:read"),title:n("kprofiles:read")?void 0:t("kProfiles.permission.noExport"),children:[a.jsx(Ni,{className:"w-4 h-4"}),t("kProfiles.export")]}),a.jsxs(ke,{variant:"secondary",onClick:Ae,disabled:!n("kprofiles:create"),title:n("kprofiles:create")?void 0:t("kProfiles.permission.noImport"),children:[a.jsx($a,{className:"w-4 h-4"}),t("kProfiles.import")]}),a.jsx("div",{className:"flex-1"}),k?a.jsxs(a.Fragment,{children:[a.jsxs(ke,{variant:"secondary",onClick:fe,children:[a.jsx(qs,{className:"w-4 h-4"}),t("kProfiles.selectAll")]}),a.jsxs(ke,{variant:"secondary",onClick:Xe,disabled:E.size===0||!n("kprofiles:delete"),className:"text-red-500 hover:bg-red-500/10",title:n("kprofiles:delete")?void 0:t("kProfiles.permission.noDelete"),children:[a.jsx(cn,{className:"w-4 h-4"}),t("kProfiles.delete")," (",E.size,")"]}),a.jsxs(ke,{variant:"secondary",onClick:()=>{C(!1),P(new Set)},children:[a.jsx(Lt,{className:"w-4 h-4"}),t("common.cancel")]})]}):a.jsxs(ke,{variant:"secondary",onClick:()=>C(!0),disabled:!pe.length||!n("kprofiles:delete"),title:n("kprofiles:delete")?void 0:t("kProfiles.permission.noDelete"),children:[a.jsx(qs,{className:"w-4 h-4"}),t("kProfiles.select")]})]}),I?a.jsx("div",{className:"flex justify-center py-12",children:a.jsx(ut,{className:"w-8 h-8 text-bambu-green animate-spin"})}):ie?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(_m,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.printerOffline")}),a.jsx("p",{className:"text-bambu-gray mb-4",children:t("kProfiles.printerOfflineDesc")}),a.jsxs(ke,{variant:"secondary",onClick:()=>re(),children:[a.jsx(Ir,{className:"w-4 h-4"}),t("common.refresh")]})]})}):pe.length>0?Ce?a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"text-sm font-medium text-bambu-gray mb-2 px-1",children:t("kProfiles.leftExtruder")}),a.jsx("div",{className:"space-y-1",children:pe.filter(V=>V.extruder_id===1).map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-sm font-medium text-bambu-gray mb-2 px-1",children:t("kProfiles.rightExtruder")}),a.jsx("div",{className:"space-y-1",children:pe.filter(V=>V.extruder_id===0).map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))})]})]}):a.jsx("div",{className:"space-y-1",children:pe.map(V=>a.jsx(bP,{profile:V,onEdit:()=>c(V),onCopy:()=>m(V),selectionMode:k,isSelected:E.has(B(V)),onToggleSelect:()=>Le(B(V)),note:te(V)},B(V)))}):p||v!=="all"||y!=="all"?a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(va,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noMatchingProfiles")}),a.jsx("p",{className:"text-bambu-gray",children:t("kProfiles.noMatchingProfilesDesc")})]})}):a.jsx(_t,{children:a.jsxs(Mt,{className:"py-12 text-center",children:[a.jsx(FM,{className:"w-12 h-12 text-bambu-gray mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-white mb-2",children:t("kProfiles.noKProfiles")}),a.jsx("p",{className:"text-bambu-gray mb-4",children:t("kProfiles.noKProfilesDesc",{diameter:s})}),a.jsxs(ke,{onClick:()=>d(!0),children:[a.jsx(dr,{className:"w-4 h-4"}),t("kProfiles.createFirstProfile")]})]})}),l&&r&&(()=>{const{note:V,key:ge}=X(l);return a.jsx(xP,{profile:l,printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,initialNote:V,initialNoteKey:ge,onSaveNote:me,hasPermission:n,onClose:()=>{console.log("[KProfiles] Edit modal onClose - refetching profiles..."),c(null),re()},onSave:()=>{c(null),re()}})})(),u&&r&&a.jsx(xP,{printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,onSaveNote:me,hasPermission:n,onClose:()=>{d(!1),re()},onSave:()=>{d(!1),re()}}),h&&r&&a.jsx(xP,{printerId:r,nozzleDiameter:s,existingProfiles:H?.profiles||q?.profiles,isDualNozzle:Ce,onSaveNote:me,hasPermission:n,profile:{...h,slot_id:0,name:`${h.name} (Copy)`},onClose:()=>{m(null),re()},onSave:()=>{m(null),re()}}),T&&a.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:a.jsx(_t,{className:"w-full max-w-sm",children:a.jsxs(Mt,{className:"p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center",children:a.jsx(cn,{className:"w-5 h-5 text-red-500"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-white",children:t("kProfiles.bulkDelete.title")}),a.jsx("p",{className:"text-sm text-bambu-gray",children:t("kProfiles.bulkDelete.cannotUndo")})]})]}),a.jsx("p",{className:"text-bambu-gray mb-6",children:t("kProfiles.bulkDelete.message",{count:E.size})}),a.jsxs("div",{className:"flex gap-3",children:[a.jsx(ke,{variant:"secondary",onClick:()=>j(!1),disabled:z,className:"flex-1",children:t("common.cancel")}),a.jsxs(ke,{onClick:W,disabled:z,className:"flex-1 bg-red-500 hover:bg-red-600 text-white",children:[z?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(cn,{className:"w-4 h-4"}),t("common.delete")]})]})]})})})]})}function HF(t,e){const n=`${t} ${e||""}`,r=n.match(/@?\s*(?:BBL\s+)?(?:Bambu\s+Lab\s+)?([XPAH][1-9][A-Z]?(?:\s*(?:Carbon|mini))?|H2D)/i),i=r?r[1].trim():null,s=n.match(/(\d+\.?\d*)\s*(?:mm\s*)?nozzle|nozzle\s*(\d+\.?\d*)/i),o=s?(s[1]||s[2])+"mm":null,l=n.match(/(\d+\.?\d*)mm\s*(?:Standard|Fine|Extra Fine|Draft|Quality)?/i),c=l?l[1]+"mm":null,u=n.match(/\b(PLA|PETG|ABS|ASA|TPU|PC|PA|PVA|HIPS|PP|PET(?:-?CF)?|PA(?:-?CF)?|PLA(?:-?CF)?)\b/i),d=u?u[1].toUpperCase():null;return{printer:i,nozzle:o,layerHeight:c,filamentType:d}}function Yy(t){return/^(P[FPM]US|PF\d|PP\d)/.test(t)}function gQe(t,e){const n=Hi(t);if(!n)return"";const i=new Date().getTime()-n.getTime(),s=Math.floor(i/6e4),o=Math.floor(i/36e5),l=Math.floor(i/864e5);return s<1?e("profiles.time.justNow"):s<60?e("profiles.time.minsAgo",{count:s}):o<24?e("profiles.time.hoursAgo",{count:o}):l<7?e("profiles.time.daysAgo",{count:l}):n.toLocaleDateString()}function bQe({onSuccess:t,t:e}){const{showToast:n}=Hn(),[r,i]=_.useState("email"),[s,o]=_.useState(""),[l,c]=_.useState(""),[u,d]=_.useState(""),[h,m]=_.useState(""),[p,b]=_.useState("global"),[v,x]=_.useState(null),[y,S]=_.useState(null),N=pt({mutationFn:()=>ce.cloudLogin(s,l,p),onSuccess:P=>{P.success?(n(e("profiles.login.toast.loggedIn")),t()):P.needs_verification?(x(P.verification_type||"email"),S(P.tfa_key||null),P.verification_type==="totp"?n(e("profiles.login.toast.enterTotp")):n(e("profiles.login.toast.codeSent")),i("code")):n(P.message,"error")},onError:P=>n(P.message,"error")}),A=pt({mutationFn:()=>ce.cloudVerify(s,u,y||void 0),onSuccess:P=>{P.success?(n(e("profiles.login.toast.loggedIn")),t()):n(P.message,"error")},onError:P=>n(P.message,"error")}),k=pt({mutationFn:()=>ce.cloudSetToken(h),onSuccess:()=>{n(e("profiles.login.toast.tokenSet")),t()},onError:P=>n(P.message,"error")}),C=P=>{P.preventDefault(),r==="email"?N.mutate():r==="code"?A.mutate():r==="token"&&k.mutate()},E=N.isPending||A.isPending||k.isPending;return a.jsx(_t,{className:"max-w-md mx-auto",children:a.jsxs(Mt,{children:[a.jsxs("div",{className:"text-center mb-6",children:[a.jsx("div",{className:"inline-flex items-center justify-center w-12 h-12 rounded-xl bg-bambu-green/20 mb-3",children:a.jsx(DM,{className:"w-6 h-6 text-bambu-green"})}),a.jsx("h2",{className:"text-xl font-semibold text-white",children:e("profiles.login.title")}),a.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:e("profiles.login.subtitle")})]}),a.jsxs("form",{onSubmit:C,className:"space-y-4",children:[r==="email"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.email")}),a.jsx("input",{type:"email",value:s,onChange:P=>o(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",placeholder:"your@email.com",required:!0})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.password")}),a.jsx("input",{type:"password",value:l,onChange:P=>c(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",placeholder:"••••••••",required:!0})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.region")}),a.jsxs("select",{value:p,onChange:P=>b(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[a.jsx("option",{value:"global",children:e("profiles.login.regionGlobal")}),a.jsx("option",{value:"china",children:e("profiles.login.regionChina")})]})]})]}),r==="code"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e(v==="totp"?"profiles.login.totpCode":"profiles.login.verificationCode")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:v==="totp"?e("profiles.login.enterTotpHint"):e("profiles.login.checkEmail",{email:s})}),a.jsx("input",{type:"text",value:u,onChange:P=>d(P.target.value.replace(/\D/g,"").slice(0,6)),className:"w-full px-3 py-3 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-center text-2xl tracking-widest font-mono focus:border-bambu-green focus:outline-none",placeholder:"000000",maxLength:6,required:!0})]}),r==="token"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:e("profiles.login.accessToken")}),a.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:e("profiles.login.accessTokenHint")}),a.jsx("textarea",{value:h,onChange:P=>m(P.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-xs font-mono placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none resize-none",placeholder:"eyJ...",rows:4,required:!0})]}),a.jsxs("div",{className:"flex gap-2",children:[r==="code"&&a.jsx(ke,{type:"button",variant:"secondary",onClick:()=>i("email"),className:"flex-1",children:e("profiles.login.back")}),a.jsxs(ke,{type:"submit",disabled:E,className:"flex-1",children:[E?a.jsx(ut,{className:"w-4 h-4 animate-spin"}):a.jsx(fB,{className:"w-4 h-4"}),e(r==="email"?"profiles.login.loginButton":r==="code"?"profiles.login.verifyButton":"profiles.login.setTokenButton")]})]}),r==="email"&&a.jsx("div",{className:"pt-4 border-t border-bambu-dark-tertiary",children:a.jsxs("button",{type:"button",onClick:()=>i("token"),className:"text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors",children:[a.jsx(Wo,{className:"w-4 h-4"}),e("profiles.login.useToken")]})}),r==="token"&&a.jsx("div",{className:"pt-4 border-t border-bambu-dark-tertiary",children:a.jsxs("button",{type:"button",onClick:()=>i("email"),className:"text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors",children:[a.jsx(fB,{className:"w-4 h-4"}),e("profiles.login.useEmail")]})})]})]})})}function xg({label:t,value:e,options:n,onChange:r}){const[i,s]=_.useState(!1),o=n.find(l=>l.value===e);return a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>s(!i),className:"flex items-center gap-2 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-sm text-white hover:border-bambu-gray-dark transition-colors",children:[a.jsxs("span",{className:"text-bambu-gray",children:[t,":"]}),a.jsx("span",{children:o?.label||"All"}),a.jsx(Sr,{className:`w-4 h-4 text-bambu-gray transition-transform ${i?"rotate-180":""}`})]}),i&&a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>s(!1)}),a.jsx("div",{className:"absolute top-full left-0 mt-1 min-w-[160px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20 py-1 max-h-60 overflow-y-auto",children:n.map(l=>a.jsxs("button",{onClick:()=>{r(l.value),s(!1)},className:`w-full px-3 py-2 text-left text-sm flex items-center justify-between hover:bg-bambu-dark-tertiary transition-colors ${e===l.value?"text-bambu-green":"text-white"}`,children:[a.jsx("span",{children:l.label}),l.count!==void 0&&a.jsx("span",{className:"text-bambu-gray text-xs",children:l.count})]},l.value))})]})]})}function xQe(){const[t,e]=_.useState(!1);_.useEffect(()=>{const r=()=>{e(window.scrollY>300)};return window.addEventListener("scroll",r),()=>window.removeEventListener("scroll",r)},[]);const n=()=>{window.scrollTo({top:0,behavior:"smooth"})};return t?a.jsx("button",{onClick:n,className:"fixed bottom-6 right-6 p-3 bg-bambu-green hover:bg-bambu-green-light text-white rounded-full shadow-lg shadow-bambu-green/25 transition-all z-40","aria-label":"Scroll to top",children:a.jsx(Zg,{className:"w-5 h-5"})}):null}function yP({setting:t,onClick:e,onDuplicate:n,compareMode:r,isCompareSelected:i,compareIndex:s,compareDisabled:o,t:l}){const c=HF(t.name),u=Yy(t.setting_id);return a.jsxs("div",{className:"flex items-center gap-2 group",children:[a.jsx("button",{onClick:e,disabled:o,className:`flex-1 text-left px-3 py-2 rounded transition-colors ${i?"bg-blue-500/20 border border-blue-500/50":o?"bg-bambu-dark/50 opacity-40 cursor-not-allowed":"bg-bambu-dark hover:bg-bambu-dark-tertiary"} ${r&&!o?"cursor-pointer":""}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[i&&s!==void 0&&a.jsx("span",{className:"flex-shrink-0 w-5 h-5 rounded-full bg-blue-500 text-white text-xs flex items-center justify-center font-medium",children:s+1}),!i&&u&&a.jsx("span",{className:"flex-shrink-0 w-1.5 h-1.5 rounded-full bg-bambu-green",title:l("profiles.presets.myPreset")}),a.jsx("span",{className:"text-white text-sm truncate flex-1",title:t.name,children:t.name}),c.filamentType&&t.type==="filament"&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.filamentType}),c.layerHeight&&t.type==="process"&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.layerHeight}),c.printer&&a.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:c.printer})]})}),a.jsx("button",{onClick:d=>{d.stopPropagation(),n()},className:"opacity-0 group-hover:opacity-100 text-bambu-gray hover:text-white transition-all p-1",title:l("profiles.presets.duplicate"),children:a.jsx(Fl,{className:"w-4 h-4"})})]})}function zR(t,e=0){const n=" ".repeat(e);if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string"){if(t.includes("\\n")||t.includes(` `)){const i=t.replace(/\\n/g,` `).replace(/\\"/g,'"').replace(/\\t/g," ").split(` `);if(i.length>1)return`""" diff --git a/static/index.html b/static/index.html index 333700a1c..273659070 100644 --- a/static/index.html +++ b/static/index.html @@ -23,7 +23,7 @@ - +