@mp-consulting/homebridge-ui-kit 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ /* @mp-consulting/homebridge-ui-kit v1.3.0 */
2
+ :root{--mp-primary: #4f46e5;--mp-primary-rgb: 79, 70, 229;--mp-primary-hover: #4338ca;--mp-primary-text: #4f46e5;--mp-status-online: #10b981;--mp-status-online-glow: rgba(16, 185, 129, .35);--mp-status-offline: #ef4444;--mp-status-checking: #94a3b8;--mp-text-subtle: #5c636a;--mp-focus-ring: #4f46e5;--mp-surface: rgba(0, 0, 0, .02);--mp-border: rgba(0, 0, 0, .1);--mp-skeleton-base: rgba(0, 0, 0, .08);--mp-skeleton-shine: rgba(0, 0, 0, .03);--mp-radius: .5rem;--mp-shadow-hover: 0 .5rem 1rem rgba(0, 0, 0, .12);--mp-ai-1: #BC82F3;--mp-ai-2: #F5B9EA;--mp-ai-3: #8D9FFF;--mp-ai-4: #FF6778;--mp-ai-5: #FFBA71;--mp-ai-6: #C686FF;--mp-ai-stops: var(--mp-ai-1), var(--mp-ai-2), var(--mp-ai-3), var(--mp-ai-4), var(--mp-ai-5), var(--mp-ai-6), var(--mp-ai-1);--mp-ai-gradient: conic-gradient(from var(--mp-ai-angle), var(--mp-ai-stops));--mp-ai-gradient-linear: linear-gradient(90deg, var(--mp-ai-stops));--mp-ai-text: #7e22ce;--mp-ai-surface: var(--bs-body-bg, #fff);--mp-ai-fg: var(--bs-body-color, #212529);--mp-ai-fg-muted: var(--bs-secondary-color, #6c757d);--mp-ai-bg: var(--bs-body-bg, transparent);--mp-ai-border-color: var(--bs-border-color, #dee2e6);--mp-ai-success-text: var(--bs-success-text-emphasis, #0a3622);--mp-ai-danger-text: var(--bs-danger-text-emphasis, #b02a37);--mp-ai-border-width: 2px;--mp-ai-glow-blur: 12px;--mp-ai-glow-opacity: .45;--mp-ai-edge-glow-opacity: .55;--mp-ai-duration: 4s;--mp-ai-edge-width: 28px;--mp-ai-diff-add-bg: #dcfce7;--mp-ai-diff-add-text: #14532d;--mp-ai-diff-del-bg: #fee2e2;--mp-ai-diff-del-text: #7f1d1d}@property --mp-ai-angle{syntax: "<angle>"; inherits: false; initial-value: 0deg;}[data-bs-theme=dark],.mp-theme-dark{--mp-primary-text: #818cf8;--mp-text-subtle: #a3a9b0;--mp-focus-ring: #818cf8;--mp-surface: rgba(255, 255, 255, .03);--mp-border: rgba(255, 255, 255, .08);--mp-shadow-hover: 0 .5rem 1rem rgba(0, 0, 0, .3);--mp-skeleton-base: rgba(255, 255, 255, .08);--mp-skeleton-shine: rgba(255, 255, 255, .16);--mp-ai-text: #d8b4fe;--mp-ai-glow-opacity: .7;--mp-ai-edge-glow-opacity: .8;--mp-ai-diff-add-bg: rgba(34, 197, 94, .16);--mp-ai-diff-add-text: #bbf7d0;--mp-ai-diff-del-bg: rgba(239, 68, 68, .18);--mp-ai-diff-del-text: #fecaca}.mp-theme-dark{--mp-ai-surface: #212529;--mp-ai-fg: #dee2e6;--mp-ai-fg-muted: rgba(222, 226, 230, .75);--mp-ai-bg: transparent;--mp-ai-border-color: #495057;--mp-ai-success-text: #75b798;--mp-ai-danger-text: #ea868f}[data-bs-theme=dark]{--mp-ai-surface: var(--bs-body-bg, #212529);--mp-ai-fg: var(--bs-body-color, #dee2e6);--mp-ai-fg-muted: var(--bs-secondary-color, rgba(222, 226, 230, .75));--mp-ai-bg: var(--bs-body-bg, transparent);--mp-ai-border-color: var(--bs-border-color, #495057);--mp-ai-success-text: var(--bs-success-text-emphasis, #75b798);--mp-ai-danger-text: var(--bs-danger-text-emphasis, #ea868f)}.btn-primary{--bs-btn-bg: var(--mp-primary);--bs-btn-border-color: var(--mp-primary);--bs-btn-hover-bg: var(--mp-primary-hover);--bs-btn-hover-border-color: var(--mp-primary-hover);--bs-btn-active-bg: var(--mp-primary-hover);--bs-btn-active-border-color: var(--mp-primary-hover);--bs-btn-focus-shadow-rgb: var(--mp-primary-rgb);--bs-btn-disabled-bg: var(--mp-primary);--bs-btn-disabled-border-color: var(--mp-primary)}.spinner-border.text-primary,.spinner-grow.text-primary{color:var(--mp-primary)!important}.btn-outline-secondary{--bs-btn-color: var(--mp-text-subtle)}.mp-header{display:flex;align-items:center;gap:.875rem;margin-bottom:.5rem}.mp-header-icon{font-size:2rem;flex-shrink:0;line-height:1}.mp-header-title{font-size:1.375rem;font-weight:600;margin:0;line-height:1.3}.mp-header-subtitle{font-size:.875rem;color:var(--bs-secondary-color);margin:0}.mp-status{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0;vertical-align:middle}.badge>.mp-status{margin-inline-end:.25rem}.mp-status-online{background-color:var(--mp-status-online);box-shadow:0 0 5px var(--mp-status-online-glow)}.mp-status-offline{background-color:var(--mp-status-offline)}.mp-status-checking{background-color:var(--mp-status-checking);animation:mp-pulse 1.5s ease-in-out infinite}@keyframes mp-pulse{0%,to{opacity:1}50%{opacity:.35}}.mp-device-card{transition:transform .15s ease,box-shadow .15s ease;cursor:pointer}.mp-device-card:hover{transform:translateY(-1px);box-shadow:var(--mp-shadow-hover)!important}.mp-device-card:focus-visible{outline:2px solid var(--mp-focus-ring);outline-offset:2px}.mp-device-card-body{display:flex;align-items:center;gap:.75rem}.mp-device-card-icon{flex:none;font-size:1.5rem;line-height:1;color:var(--mp-primary-text)}.mp-device-card-text{flex:1;min-width:0}.mp-device-card-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mp-device-card-subtitle{font-size:.8125rem;color:var(--bs-secondary-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mp-device-list-search{margin-bottom:.75rem}.mp-device-list-items{display:grid;gap:.5rem}.mp-device-card-skeleton{cursor:default}.mp-device-card-skeleton:hover{transform:none;box-shadow:none!important}.mp-skeleton{display:block;border-radius:.25rem;background:linear-gradient(90deg,var(--mp-skeleton-base) 25%,var(--mp-skeleton-shine) 50%,var(--mp-skeleton-base) 75%);background-size:200% 100%;animation:mp-shimmer 1.4s ease-in-out infinite}.mp-skeleton-text{height:.75rem;width:100%}.mp-skeleton-text+.mp-skeleton-text{margin-top:.5rem}.mp-skeleton-circle{flex:none;width:2rem;height:2rem;border-radius:50%}.mp-skeleton-group{display:flex;align-items:center;gap:.75rem}.mp-skeleton-lines{flex:1;min-width:0}@keyframes mp-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}[dir=rtl] .mp-skeleton{animation-direction:reverse}.mp-log{position:relative}.mp-log-body{direction:ltr;unicode-bidi:isolate;max-height:var(--mp-log-height, 20rem);overflow:auto;padding:.5rem .75rem;border:1px solid var(--mp-border);border-radius:var(--mp-radius);background:var(--mp-surface);font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:.8125rem;line-height:1.5}.mp-log-body:focus-visible{outline:2px solid var(--mp-focus-ring);outline-offset:2px}.mp-log-line{min-height:1.5em;white-space:pre}.mp-log-wrap .mp-log-line{white-space:pre-wrap;overflow-wrap:anywhere}.mp-log-jump{position:absolute;inset-block-end:.75rem;inset-inline-end:1.25rem}.mp-settings-card{background:var(--mp-surface);border:1px solid var(--mp-border)!important;border-radius:var(--mp-radius)}.mp-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1.5rem;text-align:center}.mp-empty-state-icon{font-size:2.5rem;color:var(--bs-secondary-color);margin-bottom:.75rem;line-height:1}.mp-empty-state-title{font-size:.9375rem;font-weight:500;color:var(--bs-secondary-color);margin:0 0 .25rem}.mp-empty-state-hint{font-size:.8125rem;color:var(--mp-text-subtle);margin:0}.mp-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2.5rem 1.5rem;gap:.75rem;color:var(--bs-secondary-color);font-size:.875rem}.mp-tabs{border-bottom:1px solid var(--mp-border)}.mp-tabs .nav-link{color:var(--bs-secondary-color);border:none;border-bottom:2px solid transparent;padding:.75rem 1.25rem;font-weight:500}.mp-tabs .nav-link:hover{color:var(--bs-body-color);border-color:transparent}.mp-tabs .nav-link.active,.mp-tabs .nav-link[aria-selected=true]{color:var(--mp-primary-text);background:transparent;border-bottom-color:var(--mp-primary)}.mp-tabs .nav-link:focus-visible{outline:2px solid var(--mp-focus-ring);outline-offset:-2px;box-shadow:none}.mp-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.5px;color:var(--bs-secondary-color)}.mp-view{display:none}.mp-view.active{display:block}.mp-focus-target:focus:not(:focus-visible){outline:none}.mp-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.mp-footer{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.75rem 1rem;padding-top:1.5rem;margin-top:2rem;border-top:1px solid var(--mp-border);font-size:.8125rem;color:var(--bs-secondary-color)}.mp-footer a{color:var(--bs-secondary-color);text-decoration:none;display:inline-flex;align-items:center;gap:.3rem;transition:color .15s ease}.mp-footer a:hover{color:var(--mp-primary-text)}.mp-footer-icon{width:1em;height:1em;flex-shrink:0;fill:currentColor}.mp-footer-sep{color:var(--mp-border);-webkit-user-select:none;user-select:none}.mp-field .invalid-feedback,.mp-required{color:var(--bs-danger-text-emphasis, #b02a37)}.mp-secret-input{font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)}.mp-copy-btn.is-copied{color:var(--bs-success-text-emphasis, #0a3622);border-color:var(--bs-success, #198754)}.mp-savebar{position:sticky;inset-block-end:0;z-index:1020;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem;margin-top:1rem;padding:.625rem .875rem;border:1px solid var(--mp-border);border-radius:var(--mp-radius);background:var(--bs-body-bg, #fff);box-shadow:0 -.25rem 1rem #00000014;font-size:.875rem}.mp-savebar[hidden]{display:none}.mp-savebar-actions{display:inline-flex;gap:.5rem;margin-inline-start:auto}.mp-pin{display:inline-flex;flex-wrap:wrap;align-items:center;gap:1rem;margin:0}.mp-pin-label-box{display:inline-flex;flex-direction:column;align-items:center;gap:.25rem;padding:.5rem 1rem .625rem;border:2px solid currentColor;border-radius:.5rem;color:var(--bs-body-color, #212529)}.mp-pin-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--bs-secondary-color, #6c757d)}.mp-pin-code{direction:ltr;font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:1.75rem;font-weight:600;letter-spacing:.08em;line-height:1.1;white-space:nowrap}.mp-pin-qr{display:block;width:var(--mp-pin-qr-size, 8rem);height:var(--mp-pin-qr-size, 8rem);padding:.375rem;border-radius:.375rem;background:#fff}.mp-pin-qr-slot:empty{display:none}.mp-pin-actions{flex-basis:100%}.mp-auth-card{border-color:var(--mp-border)}.mp-auth-title{margin:0 0 .5rem;font-size:1.0625rem;font-weight:600}.mp-auth-instructions{color:var(--bs-secondary-color);font-size:.875rem}.mp-auth-steps{display:grid;gap:.75rem;margin:0 0 1rem;padding-inline-start:1.25rem}.mp-auth-steps>li{padding-inline-start:.25rem}.mp-auth-step-text{display:block;margin-bottom:.375rem;font-size:.875rem}.mp-auth-code-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5rem}.mp-auth-code{direction:ltr;padding:.25rem .75rem;border:1px dashed var(--mp-border);border-radius:.375rem;background:var(--mp-surface);color:var(--bs-body-color, #212529);font-size:1.375rem;font-weight:600;letter-spacing:.12em}.mp-auth-status{display:flex;align-items:center;gap:.5rem;margin:0;font-size:.875rem;color:var(--bs-secondary-color)}.mp-auth-status-icon{display:none;flex:none;width:1rem;height:1rem;border-radius:50%}.mp-auth-card.is-polling .mp-auth-status-icon{display:inline-block;border:2px solid currentColor;border-inline-end-color:transparent;animation:mp-spin .75s linear infinite}.mp-auth-card.is-success .mp-auth-status{color:var(--bs-success-text-emphasis, #0a3622)}.mp-auth-card.is-success .mp-auth-status-icon{display:inline-block;background:var(--bs-success, #198754)}.mp-auth-card.is-error .mp-auth-status,.mp-auth-card.is-expired .mp-auth-status{color:var(--bs-danger-text-emphasis, #b02a37)}.mp-auth-retry{margin-top:.75rem}@keyframes mp-spin{to{transform:rotate(360deg)}}.mp-steps{display:flex;gap:.5rem;margin:0 0 1.5rem;padding:0;list-style:none;counter-reset:none}.mp-step{position:relative;display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:.375rem;min-width:0;color:var(--bs-secondary-color);font-size:.8125rem;text-align:center}.mp-step+.mp-step:before{content:"";position:absolute;inset-block-start:.875rem;inset-inline-end:calc(50% + 1.125rem);width:calc(100% - 1.75rem);height:2px;background:var(--mp-border)}.mp-step.is-complete:before,.mp-step.is-current:before{background:var(--mp-primary)}.mp-step-marker{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border:2px solid var(--mp-border);border-radius:50%;background:var(--bs-body-bg, #fff);font-weight:600}.mp-step.is-current{color:var(--mp-primary-text);font-weight:600}.mp-step.is-current .mp-step-marker{border-color:var(--mp-primary);color:var(--mp-primary-text)}.mp-step.is-complete .mp-step-marker{border-color:var(--mp-primary);background:var(--mp-primary);color:#fff}.mp-step-title{max-width:100%;overflow-wrap:anywhere}@media(max-width:30rem){.mp-step:not(.is-current) .mp-step-title{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}}.mp-toast-container{position:fixed;inset-block-end:1rem;inset-inline-end:1rem;z-index:1095;display:flex;flex-direction:column;gap:.5rem;width:min(22rem,calc(100vw - 2rem));pointer-events:none}.mp-toast{display:flex;align-items:flex-start;gap:.625rem;padding:.75rem .875rem;border:1px solid var(--bs-border-color, #dee2e6);border-inline-start:4px solid var(--mp-toast-accent, var(--mp-primary));border-radius:var(--mp-radius);background:var(--bs-body-bg, #fff);color:var(--bs-body-color, #212529);box-shadow:0 .5rem 1rem #00000026;font-size:.875rem;pointer-events:auto;animation:mp-toast-in .2s ease-out}.mp-toast-success{--mp-toast-accent: var(--bs-success, #198754)}.mp-toast-error{--mp-toast-accent: var(--bs-danger, #dc3545)}.mp-toast-warning{--mp-toast-accent: var(--bs-warning, #ffc107)}.mp-toast-info{--mp-toast-accent: var(--mp-primary)}.mp-toast-icon{display:inline-flex;align-items:center;justify-content:center;flex:none;width:1.25rem;height:1.25rem;border-radius:50%;background:var(--mp-toast-accent);color:#fff;font-size:.75rem;font-weight:700;line-height:1}.mp-toast-warning .mp-toast-icon{color:#000}.mp-toast-body{flex:1;min-width:0;overflow-wrap:anywhere}.mp-toast-title{margin:0 0 .125rem;font-weight:600}.mp-toast-message{margin:0}.mp-toast-close,.mp-icon-button{flex:none;padding:0 .25rem;border:0;border-radius:.25rem;background:transparent;color:var(--bs-secondary-color, #6c757d);font-size:1.25rem;line-height:1;cursor:pointer}.mp-toast-close:hover{color:var(--bs-body-color, #212529)}.mp-toast-close:focus-visible,.mp-icon-button:focus-visible{outline:2px solid var(--mp-focus-ring);outline-offset:1px}@keyframes mp-toast-in{0%{opacity:0;transform:translateY(.5rem)}}.mp-dialog-backdrop{position:fixed;inset:0;z-index:1100;display:flex;align-items:center;justify-content:center;padding:1rem;background:#00000080;animation:mp-fade-in .15s ease-out}.mp-dialog{width:min(28rem,100%);padding:1.25rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:var(--mp-radius);background:var(--bs-body-bg, #fff);color:var(--bs-body-color, #212529);box-shadow:0 1rem 3rem #0000004d}.mp-dialog-title{margin:0 0 .5rem;font-size:1.125rem;font-weight:600}.mp-dialog-message{margin:0;color:var(--bs-secondary-color, #6c757d)}.mp-dialog-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;margin-top:1.25rem}.mp-dialog-open{overflow:hidden}@keyframes mp-fade-in{0%{opacity:0}}@media(prefers-reduced-motion:reduce){.mp-skeleton,.mp-auth-card.is-polling .mp-auth-status-icon,.mp-status-checking,.mp-toast,.mp-dialog-backdrop{animation:none}.mp-device-card,.mp-footer a{transition:none}.mp-device-card:hover{transform:none}}@keyframes mp-ai-spin{to{--mp-ai-angle: 360deg}}@keyframes mp-ai-glow-pulse{0%,to{opacity:calc(var(--mp-ai-glow-opacity) * .35)}50%{opacity:var(--mp-ai-glow-opacity)}}@keyframes mp-ai-orb-pulse{0%,to{transform:scale(.8);opacity:.65}50%{transform:scale(1.1);opacity:1}}@keyframes mp-ai-blink{50%{opacity:0}}@keyframes mp-ai-fade-in{0%{opacity:0}}.mp-ai-halo,.mp-ai-button,.mp-ai-badge,.mp-ai-panel{position:relative;isolation:isolate;background:transparent}.mp-ai-halo:before,.mp-ai-button:before,.mp-ai-badge:before,.mp-ai-panel:before{content:"";position:absolute;inset:0;z-index:-1;border:var(--mp-ai-border-width) solid transparent;border-radius:inherit;background:linear-gradient(var(--mp-ai-surface),var(--mp-ai-surface)) padding-box,conic-gradient(from var(--mp-ai-angle),var(--mp-ai-stops)) border-box;pointer-events:none}.mp-ai-halo:after,.mp-ai-button:after,.mp-ai-panel:after{content:"";position:absolute;inset:0;z-index:-2;border-radius:inherit;background:conic-gradient(from var(--mp-ai-angle),var(--mp-ai-stops));filter:blur(var(--mp-ai-glow-blur));opacity:var(--mp-ai-glow-opacity);pointer-events:none;transition:opacity .2s ease}.mp-ai-halo{display:block;border-radius:var(--mp-radius, .5rem)}.mp-ai-halo:before,.mp-ai-halo:after{animation:mp-ai-spin var(--mp-ai-duration) linear infinite}.mp-ai-badge{--mp-ai-border-width: 1.5px;display:inline-flex;align-items:center;gap:.3em;padding:.2em .65em;border-radius:999px;color:var(--mp-ai-text);font-size:.75rem;font-weight:600;line-height:1.2;white-space:nowrap}.mp-ai-icon{width:1em;height:1em;flex-shrink:0;fill:currentColor;color:var(--mp-ai-text)}.mp-ai-button{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.375rem .95rem;border:0;border-radius:999px;color:var(--mp-ai-fg);font:inherit;font-size:.875rem;font-weight:500;line-height:1.5;text-decoration:none;cursor:pointer}.mp-ai-button:after{opacity:0}.mp-ai-button:hover:before,.mp-ai-button:hover:after,.mp-ai-button:focus-visible:before,.mp-ai-button:focus-visible:after,.mp-ai-button[aria-busy=true]:before,.mp-ai-button[aria-busy=true]:after{animation:mp-ai-spin var(--mp-ai-duration) linear infinite}.mp-ai-button:hover:after,.mp-ai-button:focus-visible:after,.mp-ai-button[aria-busy=true]:after{opacity:var(--mp-ai-glow-opacity)}.mp-ai-button:focus-visible{outline:2px solid var(--mp-ai-text);outline-offset:3px}.mp-ai-button:disabled:not([aria-busy=true]){cursor:not-allowed;opacity:.6}.mp-ai-button-sm{padding:.25rem .7rem;font-size:.8125rem}.mp-ai-button-lg{padding:.55rem 1.25rem;font-size:1rem}.mp-ai-thinking:not(.mp-ai-halo,.mp-ai-button,.mp-ai-badge,.mp-ai-panel){display:inline-flex;align-items:center;gap:.5rem;color:var(--mp-ai-fg-muted);font-size:.875rem}.mp-ai-thinking:not(.mp-ai-halo,.mp-ai-button,.mp-ai-badge,.mp-ai-panel):before{content:"";width:.875em;height:.875em;flex-shrink:0;border-radius:50%;background:conic-gradient(from var(--mp-ai-angle),var(--mp-ai-stops));animation:mp-ai-spin 1.5s linear infinite,mp-ai-orb-pulse 1.4s ease-in-out infinite}.mp-ai-thinking:is(.mp-ai-halo,.mp-ai-button,.mp-ai-panel):before{animation:mp-ai-spin var(--mp-ai-duration) linear infinite}.mp-ai-thinking:is(.mp-ai-halo,.mp-ai-button,.mp-ai-panel):after{animation:mp-ai-spin var(--mp-ai-duration) linear infinite,mp-ai-glow-pulse 1.6s ease-in-out infinite}.mp-ai-panel{display:block;box-sizing:border-box;width:100%;max-width:100%;min-width:0;overflow-wrap:break-word;padding:1rem 1.125rem;border-radius:var(--mp-radius, .5rem);color:var(--mp-ai-fg);font-size:.9375rem}.mp-ai-panel:after{opacity:calc(var(--mp-ai-glow-opacity) * .4)}.mp-ai-panel.is-streaming:before,.mp-ai-panel.is-streaming:after{animation:mp-ai-spin var(--mp-ai-duration) linear infinite}.mp-ai-panel.is-streaming:after{opacity:var(--mp-ai-glow-opacity)}.mp-ai-panel-header{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem .5rem;margin-bottom:.625rem}.mp-ai-panel-header>.mp-ai-badge{flex:none}.mp-ai-panel-title{flex:1 1 12rem;min-width:0;margin:0;font-size:.875rem;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.mp-ai-panel-body{min-width:0}.mp-ai-panel-note{margin:.75rem 0 0;font-size:.75rem;color:var(--mp-ai-fg-muted)}.mp-ai-error{margin:.5rem 0 0;color:var(--mp-ai-danger-text);font-size:.875rem}.mp-ai-caret{display:inline-block;width:.5em;height:1.1em;margin-inline-start:2px;vertical-align:text-bottom;border-radius:1px;background:var(--mp-ai-text);animation:mp-ai-blink 1s steps(1) infinite}.mp-ai-prose>:first-child{margin-top:0}.mp-ai-prose>:last-child{margin-bottom:0}.mp-ai-prose p,.mp-ai-prose ul,.mp-ai-prose ol,.mp-ai-prose pre{margin:0 0 .625rem}.mp-ai-prose ul,.mp-ai-prose ol{padding-inline-start:1.25rem}.mp-ai-prose code{padding:.1em .35em;border-radius:.25rem;background:var(--mp-surface, rgba(0, 0, 0, .04));border:1px solid var(--mp-border, rgba(0, 0, 0, .1));color:inherit;font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:.85em}.mp-ai-prose pre{direction:ltr;unicode-bidi:isolate;padding:.625rem .75rem;overflow-x:auto;border-radius:.375rem;background:var(--mp-surface, rgba(0, 0, 0, .04));border:1px solid var(--mp-border, rgba(0, 0, 0, .1));font-size:.8125rem}.mp-ai-prose pre code{padding:0;border:0;background:none;font-size:inherit}.mp-ai-chat{display:flex;flex-direction:column;min-height:16rem;max-height:var(--mp-ai-chat-height, 28rem);overflow:hidden;border:1px solid var(--mp-border, rgba(0, 0, 0, .1));border-radius:var(--mp-radius, .5rem);background:var(--mp-ai-surface);color:var(--mp-ai-fg)}.mp-ai-chat-header{display:flex;align-items:center;gap:.5rem;padding:.625rem .875rem;border-bottom:1px solid var(--mp-border, rgba(0, 0, 0, .1))}.mp-ai-chat-log{display:flex;flex:1;flex-direction:column;gap:.75rem;padding:1rem;overflow-y:auto}.mp-ai-chat-empty{margin:auto;color:var(--mp-ai-fg-muted);font-size:.875rem;text-align:center}.mp-ai-chat-msg{display:flex}.mp-ai-chat-msg.is-user{justify-content:flex-end}.mp-ai-chat-bubble{max-width:85%;padding:.5rem .75rem;border-radius:.875rem;font-size:.9rem;overflow-wrap:anywhere}.is-user>.mp-ai-chat-bubble{border-end-end-radius:.25rem;background:var(--mp-primary, #4f46e5);color:#fff}.is-assistant>.mp-ai-chat-bubble{border:1px solid var(--mp-border, rgba(0, 0, 0, .1));border-end-start-radius:.25rem;background:var(--mp-surface, rgba(0, 0, 0, .02))}.mp-ai-chat-form{display:flex;align-items:flex-end;gap:.5rem;padding:.75rem;border-top:1px solid var(--mp-border, rgba(0, 0, 0, .1))}.mp-ai-chat-input{flex:1;min-height:2.375rem;max-height:8rem;padding:.45rem .75rem;resize:vertical;border:1px solid var(--mp-ai-border-color);border-radius:.5rem;background:var(--mp-ai-bg);color:inherit;font:inherit;font-size:.9rem}.mp-ai-chat-input:focus{outline:2px solid var(--mp-ai-text);outline-offset:1px;border-color:transparent}.mp-ai-diff{overflow:hidden;border:1px solid var(--mp-border, rgba(0, 0, 0, .1));border-radius:var(--mp-radius, .5rem);background:var(--mp-ai-surface);color:var(--mp-ai-fg)}.mp-ai-diff-header{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem .5rem;padding:.5rem .75rem;border-bottom:1px solid var(--mp-border, rgba(0, 0, 0, .1));font-size:.8125rem}.mp-ai-diff-header>.mp-ai-badge{flex:none}.mp-ai-diff-title{flex:1 1 12rem;min-width:0;font-weight:500;line-height:1.35;overflow-wrap:anywhere}.mp-ai-diff-stats{flex:none;display:inline-flex;margin-inline-start:auto;gap:.5rem;font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)}.mp-ai-diff-stat-add{color:var(--mp-ai-success-text)}.mp-ai-diff-stat-del{color:var(--mp-ai-danger-text)}.mp-ai-diff-body{direction:ltr;unicode-bidi:isolate;max-height:24rem;margin:0;padding:.375rem 0;overflow:auto;font-family:var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);font-size:.8125rem;line-height:1.55}.mp-ai-diff-line{display:block;min-width:max-content;padding-inline-end:.75rem;white-space:pre}.mp-ai-diff-sign{display:inline-block;width:1.75rem;color:var(--mp-ai-fg-muted);text-align:center;-webkit-user-select:none;user-select:none}.mp-ai-diff-line.is-add{background:var(--mp-ai-diff-add-bg);color:var(--mp-ai-diff-add-text)}.mp-ai-diff-line.is-del{background:var(--mp-ai-diff-del-bg);color:var(--mp-ai-diff-del-text)}.mp-ai-diff-line.is-add .mp-ai-diff-sign,.mp-ai-diff-line.is-del .mp-ai-diff-sign{color:inherit}.mp-ai-diff-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;padding:.5rem .75rem;border-top:1px solid var(--mp-border, rgba(0, 0, 0, .1))}.mp-ai-diff-status{margin-inline-end:auto;color:var(--mp-ai-fg-muted);font-size:.8125rem}.mp-ai-diff.is-applied .mp-ai-diff-status{color:var(--mp-ai-success-text)}.mp-ai-action{padding:.3rem .85rem;border:1px solid var(--mp-ai-border-color);border-radius:.375rem;background:transparent;color:var(--mp-ai-fg);font:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.mp-ai-action:hover{background:var(--mp-surface, rgba(0, 0, 0, .04))}.mp-ai-action-primary{border-color:var(--mp-primary, #4f46e5);background:var(--mp-primary, #4f46e5);color:#fff}.mp-ai-action-primary:hover{border-color:var(--mp-primary-hover, #4338ca);background:var(--mp-primary-hover, #4338ca)}.mp-ai-action:focus-visible{outline:2px solid var(--mp-ai-text);outline-offset:2px}.mp-ai-action:disabled{cursor:not-allowed;opacity:.6}.mp-ai-edge-glow{position:fixed;inset:0;z-index:1090;pointer-events:none;animation:mp-ai-fade-in .4s ease-out}.mp-ai-edge-glow[hidden]{display:none}.mp-ai-edge-glow:before,.mp-ai-edge-glow:after{content:"";position:absolute;inset:0;background:conic-gradient(from var(--mp-ai-angle) at 50% 50%,var(--mp-ai-stops));animation:mp-ai-spin var(--mp-ai-duration) linear infinite}.mp-ai-edge-glow:before{padding:3px;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0)}.mp-ai-edge-glow:after{opacity:var(--mp-ai-edge-glow-opacity);-webkit-mask-image:linear-gradient(to right,#000,transparent var(--mp-ai-edge-width),transparent calc(100% - var(--mp-ai-edge-width)),#000),linear-gradient(to bottom,#000,transparent var(--mp-ai-edge-width),transparent calc(100% - var(--mp-ai-edge-width)),#000);mask-image:linear-gradient(to right,#000,transparent var(--mp-ai-edge-width),transparent calc(100% - var(--mp-ai-edge-width)),#000),linear-gradient(to bottom,#000,transparent var(--mp-ai-edge-width),transparent calc(100% - var(--mp-ai-edge-width)),#000)}.mp-ai-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}@media(prefers-reduced-motion:reduce){.mp-ai-halo:before,.mp-ai-halo:after,.mp-ai-button:before,.mp-ai-button:after,.mp-ai-panel:before,.mp-ai-panel:after,.mp-ai-thinking:before,.mp-ai-thinking:after,.mp-ai-edge-glow,.mp-ai-edge-glow:before,.mp-ai-edge-glow:after,.mp-ai-caret{animation:none!important}.mp-ai-button:after{transition:none}}@media(forced-colors:active){.mp-ai-halo,.mp-ai-button,.mp-ai-badge,.mp-ai-panel{border:1px solid CanvasText}.mp-ai-edge-glow{display:none}}
3
+ /*# sourceMappingURL=kit.min.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens.css","../src/overrides.css","../src/components.css","../src/ai.css"],"sourcesContent":["/* ── Design tokens ──────────────────────────────────────────────────────────\n CSS custom properties used throughout the design system.\n Override these in your plugin's styles.css to customize per-plugin.\n Light values live on :root. Dark values apply under Bootstrap's\n [data-bs-theme=\"dark\"] or under the selector-agnostic .mp-theme-dark class,\n for hosts whose dark mode does not use Bootstrap's attribute (e.g. a\n `body.dark-mode` app): add .mp-theme-dark next to your own class instead of\n copying these values.\n\n The kit's rules are deliberately NOT wrapped in a cascade layer:\n unlayered styles beat every layered style regardless of specificity or\n order, so unlayered Bootstrap would then override the kit's Bootstrap\n remaps (primary button, tabs, spinner) and break them.\n ────────────────────────────────────────────────────────────────────────── */\n\n:root {\n /* Brand */\n --mp-primary: #4f46e5;\n --mp-primary-rgb: 79, 70, 229;\n --mp-primary-hover: #4338ca;\n --mp-primary-text: #4f46e5; /* brand color for text; meets WCAG AA on the body bg */\n\n /* Status */\n --mp-status-online: #10b981;\n --mp-status-online-glow: rgba(16, 185, 129, 0.35);\n --mp-status-offline: #ef4444;\n --mp-status-checking: #94a3b8;\n\n /* Accessible text and focus colours (plain values, so they hold contrast\n whether or not the host switches Bootstrap's variables) */\n --mp-text-subtle: #5c636a; /* secondary hints; 6.1:1 on white */\n --mp-focus-ring: #4f46e5; /* focus outlines; 6.3:1 on white */\n\n /* Surfaces */\n --mp-surface: rgba(0, 0, 0, 0.02);\n --mp-border: rgba(0, 0, 0, 0.1);\n\n /* Skeleton shimmer */\n --mp-skeleton-base: rgba(0, 0, 0, 0.08);\n --mp-skeleton-shine: rgba(0, 0, 0, 0.03);\n\n /* Shape */\n --mp-radius: 0.5rem;\n --mp-shadow-hover: 0 0.5rem 1rem rgba(0, 0, 0, 0.12);\n\n /* Assistant (AI) halo palette. Only ever used for borders, glows and\n decorative dots: text never sits on the gradient. */\n --mp-ai-1: #BC82F3;\n --mp-ai-2: #F5B9EA;\n --mp-ai-3: #8D9FFF;\n --mp-ai-4: #FF6778;\n --mp-ai-5: #FFBA71;\n --mp-ai-6: #C686FF;\n --mp-ai-stops: var(--mp-ai-1), var(--mp-ai-2), var(--mp-ai-3), var(--mp-ai-4),\n var(--mp-ai-5), var(--mp-ai-6), var(--mp-ai-1);\n /* Halo gradient. Custom properties resolve where they are declared, so this\n token is static (angle 0) when used as-is; the AI components rebuild it\n from --mp-ai-stops on the animated element so it rotates (see ai.css). */\n --mp-ai-gradient: conic-gradient(from var(--mp-ai-angle), var(--mp-ai-stops));\n --mp-ai-gradient-linear: linear-gradient(90deg, var(--mp-ai-stops));\n --mp-ai-text: #7e22ce; /* accent text; 7.1:1 on white */\n --mp-ai-surface: var(--bs-body-bg, #fff);\n /* Colours the AI components take from the host. They default to Bootstrap's,\n and are repeated in the dark block so they resolve on the element that\n switches theme. A host with its own theming (Glass UI) overrides them. */\n --mp-ai-fg: var(--bs-body-color, #212529);\n --mp-ai-fg-muted: var(--bs-secondary-color, #6c757d);\n --mp-ai-bg: var(--bs-body-bg, transparent);\n --mp-ai-border-color: var(--bs-border-color, #dee2e6);\n --mp-ai-success-text: var(--bs-success-text-emphasis, #0a3622);\n --mp-ai-danger-text: var(--bs-danger-text-emphasis, #b02a37);\n --mp-ai-border-width: 2px;\n --mp-ai-glow-blur: 12px;\n --mp-ai-glow-opacity: 0.45;\n --mp-ai-edge-glow-opacity: 0.55;\n --mp-ai-duration: 4s;\n --mp-ai-edge-width: 28px;\n\n /* Assistant diff lines (text/background pairs meet WCAG AA) */\n --mp-ai-diff-add-bg: #dcfce7;\n --mp-ai-diff-add-text: #14532d;\n --mp-ai-diff-del-bg: #fee2e2;\n --mp-ai-diff-del-text: #7f1d1d;\n}\n\n/* Animatable angle for the rotating halo. Browsers without @property simply\n show a static gradient. */\n@property --mp-ai-angle {\n syntax: '<angle>';\n inherits: false;\n initial-value: 0deg;\n}\n\n/* Dark values that do not depend on Bootstrap. */\n[data-bs-theme=\"dark\"],\n.mp-theme-dark {\n --mp-primary-text: #818cf8;\n --mp-text-subtle: #a3a9b0; /* 6.5:1 on #212529 */\n --mp-focus-ring: #818cf8; /* 5.2:1 on #212529 (the brand indigo is 2.5:1) */\n --mp-surface: rgba(255, 255, 255, 0.03);\n --mp-border: rgba(255, 255, 255, 0.08);\n --mp-shadow-hover: 0 0.5rem 1rem rgba(0, 0, 0, 0.3);\n --mp-skeleton-base: rgba(255, 255, 255, 0.08);\n --mp-skeleton-shine: rgba(255, 255, 255, 0.16);\n --mp-ai-text: #d8b4fe; /* 9.6:1 on #212529 */\n --mp-ai-glow-opacity: 0.7;\n --mp-ai-edge-glow-opacity: 0.8;\n --mp-ai-diff-add-bg: rgba(34, 197, 94, 0.16);\n --mp-ai-diff-add-text: #bbf7d0;\n --mp-ai-diff-del-bg: rgba(239, 68, 68, 0.18);\n --mp-ai-diff-del-text: #fecaca;\n}\n\n/* .mp-theme-dark alone: the host does not switch Bootstrap's variables, so\n the host colours are plain values (Bootstrap's dark palette). */\n.mp-theme-dark {\n --mp-ai-surface: #212529;\n --mp-ai-fg: #dee2e6;\n --mp-ai-fg-muted: rgba(222, 226, 230, 0.75);\n --mp-ai-bg: transparent;\n --mp-ai-border-color: #495057;\n --mp-ai-success-text: #75b798;\n --mp-ai-danger-text: #ea868f;\n}\n\n/* Bootstrap's dark theme: follow its variables, so a plugin that customises\n them is respected. Declared after .mp-theme-dark so it wins when an element\n has both. */\n[data-bs-theme=\"dark\"] {\n --mp-ai-surface: var(--bs-body-bg, #212529);\n --mp-ai-fg: var(--bs-body-color, #dee2e6);\n --mp-ai-fg-muted: var(--bs-secondary-color, rgba(222, 226, 230, 0.75));\n --mp-ai-bg: var(--bs-body-bg, transparent);\n --mp-ai-border-color: var(--bs-border-color, #495057);\n --mp-ai-success-text: var(--bs-success-text-emphasis, #75b798);\n --mp-ai-danger-text: var(--bs-danger-text-emphasis, #ea868f);\n}\n","/* ── Bootstrap 5 overrides ──────────────────────────────────────────────────\n Remap Bootstrap components to use brand tokens.\n ────────────────────────────────────────────────────────────────────────── */\n\n/* Primary button */\n.btn-primary {\n --bs-btn-bg: var(--mp-primary);\n --bs-btn-border-color: var(--mp-primary);\n --bs-btn-hover-bg: var(--mp-primary-hover);\n --bs-btn-hover-border-color: var(--mp-primary-hover);\n --bs-btn-active-bg: var(--mp-primary-hover);\n --bs-btn-active-border-color: var(--mp-primary-hover);\n --bs-btn-focus-shadow-rgb: var(--mp-primary-rgb);\n --bs-btn-disabled-bg: var(--mp-primary);\n --bs-btn-disabled-border-color: var(--mp-primary);\n}\n\n/* Primary spinner */\n.spinner-border.text-primary,\n.spinner-grow.text-primary {\n color: var(--mp-primary) !important;\n}\n\n/* Outline secondary button: Bootstrap's #6c757d text is 4.49:1 on a light\n surface and 3:1 on the dark background; use the contrast-safe token. */\n.btn-outline-secondary {\n --bs-btn-color: var(--mp-text-subtle);\n}\n","/* ── Components ─────────────────────────────────────────────────────────────\n Reusable UI components used across all Homebridge plugins.\n ────────────────────────────────────────────────────────────────────────── */\n\n/* ── Plugin header ──────────────────────────────────────── */\n\n.mp-header {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n margin-bottom: 0.5rem;\n}\n\n.mp-header-icon {\n font-size: 2rem;\n flex-shrink: 0;\n line-height: 1;\n}\n\n.mp-header-title {\n font-size: 1.375rem;\n font-weight: 600;\n margin: 0;\n line-height: 1.3;\n}\n\n.mp-header-subtitle {\n font-size: 0.875rem;\n color: var(--bs-secondary-color);\n margin: 0;\n}\n\n/* ── Status indicator dot ───────────────────────────────── */\n\n.mp-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n flex-shrink: 0;\n vertical-align: middle;\n}\n\n/* Spacing between a status dot and its badge label (logical, so RTL works\n without Bootstrap's RTL build). */\n.badge > .mp-status {\n margin-inline-end: 0.25rem;\n}\n\n.mp-status-online {\n background-color: var(--mp-status-online);\n box-shadow: 0 0 5px var(--mp-status-online-glow);\n}\n\n.mp-status-offline {\n background-color: var(--mp-status-offline);\n}\n\n.mp-status-checking {\n background-color: var(--mp-status-checking);\n animation: mp-pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes mp-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n/* ── Device card ────────────────────────────────────────── */\n\n.mp-device-card {\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n cursor: pointer;\n}\n\n.mp-device-card:hover {\n transform: translateY(-1px);\n box-shadow: var(--mp-shadow-hover) !important;\n}\n\n.mp-device-card:focus-visible {\n outline: 2px solid var(--mp-focus-ring);\n outline-offset: 2px;\n}\n\n/* Default card content rendered by MpKit.DeviceList */\n.mp-device-card-body {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.mp-device-card-icon {\n flex: none;\n font-size: 1.5rem;\n line-height: 1;\n color: var(--mp-primary-text);\n}\n\n.mp-device-card-text {\n flex: 1;\n min-width: 0;\n}\n\n.mp-device-card-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mp-device-card-subtitle {\n font-size: 0.8125rem;\n color: var(--bs-secondary-color);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ── Device list ────────────────────────────────────────── */\n\n.mp-device-list-search {\n margin-bottom: 0.75rem;\n}\n\n.mp-device-list-items {\n display: grid;\n gap: 0.5rem;\n}\n\n.mp-device-card-skeleton {\n cursor: default;\n}\n\n.mp-device-card-skeleton:hover {\n transform: none;\n box-shadow: none !important;\n}\n\n/* ── Skeleton shimmer ───────────────────────────────────── */\n\n.mp-skeleton {\n display: block;\n border-radius: 0.25rem;\n background: linear-gradient(90deg, var(--mp-skeleton-base) 25%, var(--mp-skeleton-shine) 50%, var(--mp-skeleton-base) 75%);\n background-size: 200% 100%;\n animation: mp-shimmer 1.4s ease-in-out infinite;\n}\n\n.mp-skeleton-text {\n height: 0.75rem;\n width: 100%;\n}\n\n.mp-skeleton-text + .mp-skeleton-text {\n margin-top: 0.5rem;\n}\n\n.mp-skeleton-circle {\n flex: none;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n}\n\n.mp-skeleton-group {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.mp-skeleton-lines {\n flex: 1;\n min-width: 0;\n}\n\n@keyframes mp-shimmer {\n from { background-position: 200% 0; }\n to { background-position: -200% 0; }\n}\n\n/* RTL: shimmer travels the other way */\n[dir=\"rtl\"] .mp-skeleton {\n animation-direction: reverse;\n}\n\n/* ── Log viewer ─────────────────────────────────────────── */\n\n.mp-log {\n position: relative;\n}\n\n.mp-log-body {\n direction: ltr;\n unicode-bidi: isolate;\n max-height: var(--mp-log-height, 20rem);\n overflow: auto;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--mp-border);\n border-radius: var(--mp-radius);\n background: var(--mp-surface);\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n font-size: 0.8125rem;\n line-height: 1.5;\n}\n\n.mp-log-body:focus-visible {\n outline: 2px solid var(--mp-focus-ring);\n outline-offset: 2px;\n}\n\n.mp-log-line {\n min-height: 1.5em;\n white-space: pre;\n}\n\n.mp-log-wrap .mp-log-line {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.mp-log-jump {\n position: absolute;\n inset-block-end: 0.75rem;\n inset-inline-end: 1.25rem;\n}\n\n/* ── Settings surface card ──────────────────────────────── */\n\n.mp-settings-card {\n background: var(--mp-surface);\n border: 1px solid var(--mp-border) !important;\n border-radius: var(--mp-radius);\n}\n\n/* ── Empty state ────────────────────────────────────────── */\n\n.mp-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 1.5rem;\n text-align: center;\n}\n\n.mp-empty-state-icon {\n font-size: 2.5rem;\n color: var(--bs-secondary-color);\n margin-bottom: 0.75rem;\n line-height: 1;\n}\n\n.mp-empty-state-title {\n font-size: 0.9375rem;\n font-weight: 500;\n color: var(--bs-secondary-color);\n margin: 0 0 0.25rem;\n}\n\n/* A token instead of opacity: the old 0.7 opacity dropped it to 3.3:1. */\n.mp-empty-state-hint {\n font-size: 0.8125rem;\n color: var(--mp-text-subtle);\n margin: 0;\n}\n\n/* ── Loading state ──────────────────────────────────────── */\n\n.mp-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2.5rem 1.5rem;\n gap: 0.75rem;\n color: var(--bs-secondary-color);\n font-size: 0.875rem;\n}\n\n/* ── Nav tabs ───────────────────────────────────────────── */\n\n.mp-tabs {\n border-bottom: 1px solid var(--mp-border);\n}\n\n.mp-tabs .nav-link {\n color: var(--bs-secondary-color);\n border: none;\n border-bottom: 2px solid transparent; /* reserve space so the active tab doesn't shift */\n padding: 0.75rem 1.25rem;\n font-weight: 500;\n}\n\n.mp-tabs .nav-link:hover {\n color: var(--bs-body-color);\n border-color: transparent;\n}\n\n.mp-tabs .nav-link.active,\n.mp-tabs .nav-link[aria-selected=\"true\"] {\n color: var(--mp-primary-text);\n background: transparent;\n border-bottom-color: var(--mp-primary);\n}\n\n.mp-tabs .nav-link:focus-visible {\n outline: 2px solid var(--mp-focus-ring);\n outline-offset: -2px;\n box-shadow: none;\n}\n\n/* ── Metadata label ─────────────────────────────────────── */\n\n.mp-label {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--bs-secondary-color);\n}\n\n/* ── View toggling ──────────────────────────────────────── */\n\n.mp-view {\n display: none;\n}\n\n.mp-view.active {\n display: block;\n}\n\n/* View.show() moves focus to the view's heading (tabindex=\"-1\"); a\n programmatic focus target needs no ring. */\n.mp-focus-target:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* ── Screen-reader only ─────────────────────────────────── */\n\n.mp-sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* ── Support footer ─────────────────────────────────────── */\n\n.mp-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 0.75rem 1rem;\n padding-top: 1.5rem;\n margin-top: 2rem;\n border-top: 1px solid var(--mp-border);\n font-size: 0.8125rem;\n color: var(--bs-secondary-color);\n}\n\n.mp-footer a {\n color: var(--bs-secondary-color);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 0.3rem;\n transition: color 0.15s ease;\n}\n\n.mp-footer a:hover {\n color: var(--mp-primary-text);\n}\n\n.mp-footer-icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n fill: currentColor;\n}\n\n.mp-footer-sep {\n color: var(--mp-border);\n user-select: none;\n}\n\n/* ── Forms ──────────────────────────────────────────────── */\n\n/* Bootstrap's invalid colour (#dc3545) is 4.3:1 on light surfaces. */\n.mp-field .invalid-feedback {\n color: var(--bs-danger-text-emphasis, #b02a37);\n}\n\n.mp-required {\n color: var(--bs-danger-text-emphasis, #b02a37);\n}\n\n.mp-secret-input {\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n}\n\n.mp-copy-btn.is-copied {\n color: var(--bs-success-text-emphasis, #0a3622);\n border-color: var(--bs-success, #198754);\n}\n\n/* Sticky Save bar shown by MpKit.Form.track() while there are unsaved changes */\n.mp-savebar {\n position: sticky;\n inset-block-end: 0;\n z-index: 1020;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem 1rem;\n margin-top: 1rem;\n padding: 0.625rem 0.875rem;\n border: 1px solid var(--mp-border);\n border-radius: var(--mp-radius);\n background: var(--bs-body-bg, #fff);\n box-shadow: 0 -0.25rem 1rem rgba(0, 0, 0, 0.08);\n font-size: 0.875rem;\n}\n\n.mp-savebar[hidden] {\n display: none;\n}\n\n.mp-savebar-actions {\n display: inline-flex;\n gap: 0.5rem;\n margin-inline-start: auto;\n}\n\n/* ── HomeKit setup code ─────────────────────────────────── */\n\n.mp-pin {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 1rem;\n margin: 0;\n}\n\n.mp-pin-label-box {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 0.25rem;\n padding: 0.5rem 1rem 0.625rem;\n border: 2px solid currentColor;\n border-radius: 0.5rem;\n color: var(--bs-body-color, #212529);\n}\n\n.mp-pin-label {\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--bs-secondary-color, #6c757d);\n}\n\n.mp-pin-code {\n direction: ltr;\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n font-size: 1.75rem;\n font-weight: 600;\n letter-spacing: 0.08em;\n line-height: 1.1;\n white-space: nowrap;\n}\n\n.mp-pin-qr {\n display: block;\n width: var(--mp-pin-qr-size, 8rem);\n height: var(--mp-pin-qr-size, 8rem);\n padding: 0.375rem;\n border-radius: 0.375rem;\n background: #fff; /* QR codes need a light quiet zone, also in dark mode */\n}\n\n.mp-pin-qr-slot:empty {\n display: none;\n}\n\n.mp-pin-actions {\n flex-basis: 100%;\n}\n\n/* ── Sign-in (OAuth / device code) card ─────────────────── */\n\n.mp-auth-card {\n border-color: var(--mp-border);\n}\n\n.mp-auth-title {\n margin: 0 0 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n}\n\n.mp-auth-instructions {\n color: var(--bs-secondary-color);\n font-size: 0.875rem;\n}\n\n.mp-auth-steps {\n display: grid;\n gap: 0.75rem;\n margin: 0 0 1rem;\n padding-inline-start: 1.25rem;\n}\n\n.mp-auth-steps > li {\n padding-inline-start: 0.25rem;\n}\n\n.mp-auth-step-text {\n display: block;\n margin-bottom: 0.375rem;\n font-size: 0.875rem;\n}\n\n.mp-auth-code-row {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n}\n\n.mp-auth-code {\n direction: ltr;\n padding: 0.25rem 0.75rem;\n border: 1px dashed var(--mp-border);\n border-radius: 0.375rem;\n background: var(--mp-surface);\n color: var(--bs-body-color, #212529);\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: 0.12em;\n}\n\n.mp-auth-status {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 0.875rem;\n color: var(--bs-secondary-color);\n}\n\n.mp-auth-status-icon {\n display: none;\n flex: none;\n width: 1rem;\n height: 1rem;\n border-radius: 50%;\n}\n\n.mp-auth-card.is-polling .mp-auth-status-icon {\n display: inline-block;\n border: 2px solid currentColor;\n border-inline-end-color: transparent;\n animation: mp-spin 0.75s linear infinite;\n}\n\n.mp-auth-card.is-success .mp-auth-status {\n color: var(--bs-success-text-emphasis, #0a3622);\n}\n\n.mp-auth-card.is-success .mp-auth-status-icon {\n display: inline-block;\n background: var(--bs-success, #198754);\n}\n\n.mp-auth-card.is-error .mp-auth-status,\n.mp-auth-card.is-expired .mp-auth-status {\n color: var(--bs-danger-text-emphasis, #b02a37);\n}\n\n.mp-auth-retry {\n margin-top: 0.75rem;\n}\n\n@keyframes mp-spin {\n to { transform: rotate(360deg); }\n}\n\n/* ── Steps (wizard progress) ────────────────────────────── */\n\n.mp-steps {\n display: flex;\n gap: 0.5rem;\n margin: 0 0 1.5rem;\n padding: 0;\n list-style: none;\n counter-reset: none;\n}\n\n.mp-step {\n position: relative;\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n align-items: center;\n gap: 0.375rem;\n min-width: 0;\n color: var(--bs-secondary-color);\n font-size: 0.8125rem;\n text-align: center;\n}\n\n/* Connector line to the previous step */\n.mp-step + .mp-step::before {\n content: '';\n position: absolute;\n inset-block-start: 0.875rem;\n inset-inline-end: calc(50% + 1.125rem);\n width: calc(100% - 2.25rem + 0.5rem);\n height: 2px;\n background: var(--mp-border);\n}\n\n.mp-step.is-complete::before,\n.mp-step.is-current::before {\n background: var(--mp-primary);\n}\n\n.mp-step-marker {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: 2px solid var(--mp-border);\n border-radius: 50%;\n background: var(--bs-body-bg, #fff);\n font-weight: 600;\n}\n\n.mp-step.is-current {\n color: var(--mp-primary-text);\n font-weight: 600;\n}\n\n.mp-step.is-current .mp-step-marker {\n border-color: var(--mp-primary);\n color: var(--mp-primary-text);\n}\n\n.mp-step.is-complete .mp-step-marker {\n border-color: var(--mp-primary);\n background: var(--mp-primary);\n color: #fff;\n}\n\n.mp-step-title {\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n\n/* Narrow: keep markers, hide titles except the current one */\n@media (max-width: 30rem) {\n .mp-step:not(.is-current) .mp-step-title {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n }\n}\n\n/* ── Toasts (fallback outside Homebridge) ───────────────── */\n\n.mp-toast-container {\n position: fixed;\n inset-block-end: 1rem;\n inset-inline-end: 1rem;\n z-index: 1095;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: min(22rem, calc(100vw - 2rem));\n pointer-events: none;\n}\n\n.mp-toast {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n padding: 0.75rem 0.875rem;\n border: 1px solid var(--bs-border-color, #dee2e6);\n border-inline-start: 4px solid var(--mp-toast-accent, var(--mp-primary));\n border-radius: var(--mp-radius);\n background: var(--bs-body-bg, #fff);\n color: var(--bs-body-color, #212529);\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n font-size: 0.875rem;\n pointer-events: auto;\n animation: mp-toast-in 0.2s ease-out;\n}\n\n.mp-toast-success { --mp-toast-accent: var(--bs-success, #198754); }\n.mp-toast-error { --mp-toast-accent: var(--bs-danger, #dc3545); }\n.mp-toast-warning { --mp-toast-accent: var(--bs-warning, #ffc107); }\n.mp-toast-info { --mp-toast-accent: var(--mp-primary); }\n\n.mp-toast-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--mp-toast-accent);\n color: #fff;\n font-size: 0.75rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.mp-toast-warning .mp-toast-icon {\n color: #000;\n}\n\n.mp-toast-body {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.mp-toast-title {\n margin: 0 0 0.125rem;\n font-weight: 600;\n}\n\n.mp-toast-message {\n margin: 0;\n}\n\n.mp-toast-close,\n.mp-icon-button {\n flex: none;\n padding: 0 0.25rem;\n border: 0;\n border-radius: 0.25rem;\n background: transparent;\n color: var(--bs-secondary-color, #6c757d);\n font-size: 1.25rem;\n line-height: 1;\n cursor: pointer;\n}\n\n.mp-toast-close:hover {\n color: var(--bs-body-color, #212529);\n}\n\n.mp-toast-close:focus-visible,\n.mp-icon-button:focus-visible {\n outline: 2px solid var(--mp-focus-ring);\n outline-offset: 1px;\n}\n\n@keyframes mp-toast-in {\n from { opacity: 0; transform: translateY(0.5rem); }\n}\n\n/* ── Confirm dialog ─────────────────────────────────────── */\n\n.mp-dialog-backdrop {\n position: fixed;\n inset: 0;\n z-index: 1100;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem;\n background: rgba(0, 0, 0, 0.5);\n animation: mp-fade-in 0.15s ease-out;\n}\n\n.mp-dialog {\n width: min(28rem, 100%);\n padding: 1.25rem;\n border: 1px solid var(--bs-border-color, #dee2e6);\n border-radius: var(--mp-radius);\n background: var(--bs-body-bg, #fff);\n color: var(--bs-body-color, #212529);\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.3);\n}\n\n.mp-dialog-title {\n margin: 0 0 0.5rem;\n font-size: 1.125rem;\n font-weight: 600;\n}\n\n.mp-dialog-message {\n margin: 0;\n color: var(--bs-secondary-color, #6c757d);\n}\n\n.mp-dialog-actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.5rem;\n margin-top: 1.25rem;\n}\n\n.mp-dialog-open {\n overflow: hidden;\n}\n\n@keyframes mp-fade-in {\n from { opacity: 0; }\n}\n\n/* ── Reduced motion ─────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .mp-skeleton,\n .mp-auth-card.is-polling .mp-auth-status-icon,\n .mp-status-checking,\n .mp-toast,\n .mp-dialog-backdrop {\n animation: none;\n }\n\n .mp-device-card,\n .mp-footer a {\n transition: none;\n }\n\n .mp-device-card:hover {\n transform: none;\n }\n}\n","/* ── Assistant (AI) components ──────────────────────────────────────────────\n Halo-styled surfaces for AI features. Text always sits on a neutral surface\n (--mp-ai-surface); the gradient is only used for rings, glows and dots.\n Bootstrap is optional: every colour has a fallback, so this file also works\n standalone as dist/ai.css (with the tokens).\n ────────────────────────────────────────────────────────────────────────── */\n\n@keyframes mp-ai-spin {\n to { --mp-ai-angle: 360deg; }\n}\n\n@keyframes mp-ai-glow-pulse {\n 0%, 100% { opacity: calc(var(--mp-ai-glow-opacity) * 0.35); }\n 50% { opacity: var(--mp-ai-glow-opacity); }\n}\n\n@keyframes mp-ai-orb-pulse {\n 0%, 100% { transform: scale(0.8); opacity: 0.65; }\n 50% { transform: scale(1.1); opacity: 1; }\n}\n\n@keyframes mp-ai-blink {\n 50% { opacity: 0; }\n}\n\n@keyframes mp-ai-fade-in {\n from { opacity: 0; }\n}\n\n/* ── Shared halo ring ───────────────────────────────────── */\n/* ::before paints the neutral surface plus a gradient border (padding-box /\n border-box layers); ::after is the blurred glow behind it. Both sit below\n the content inside the element's own stacking context. */\n\n.mp-ai-halo,\n.mp-ai-button,\n.mp-ai-badge,\n.mp-ai-panel {\n position: relative;\n isolation: isolate;\n background: transparent;\n}\n\n.mp-ai-halo::before,\n.mp-ai-button::before,\n.mp-ai-badge::before,\n.mp-ai-panel::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n border: var(--mp-ai-border-width) solid transparent;\n border-radius: inherit;\n background:\n linear-gradient(var(--mp-ai-surface), var(--mp-ai-surface)) padding-box,\n conic-gradient(from var(--mp-ai-angle), var(--mp-ai-stops)) border-box;\n pointer-events: none;\n}\n\n.mp-ai-halo::after,\n.mp-ai-button::after,\n.mp-ai-panel::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -2;\n border-radius: inherit;\n background: conic-gradient(from var(--mp-ai-angle), var(--mp-ai-stops));\n filter: blur(var(--mp-ai-glow-blur));\n opacity: var(--mp-ai-glow-opacity);\n pointer-events: none;\n transition: opacity 0.2s ease;\n}\n\n/* ── Halo container ─────────────────────────────────────── */\n\n.mp-ai-halo {\n display: block;\n border-radius: var(--mp-radius, 0.5rem);\n}\n\n.mp-ai-halo::before,\n.mp-ai-halo::after {\n animation: mp-ai-spin var(--mp-ai-duration) linear infinite;\n}\n\n/* ── Badge ──────────────────────────────────────────────── */\n\n.mp-ai-badge {\n --mp-ai-border-width: 1.5px;\n display: inline-flex;\n align-items: center;\n gap: 0.3em;\n padding: 0.2em 0.65em;\n border-radius: 999px;\n color: var(--mp-ai-text);\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.mp-ai-icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n fill: currentColor;\n color: var(--mp-ai-text);\n}\n\n/* ── Button ─────────────────────────────────────────────── */\n\n.mp-ai-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.375rem 0.95rem;\n border: 0;\n border-radius: 999px;\n color: var(--mp-ai-fg);\n font: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.5;\n text-decoration: none;\n cursor: pointer;\n}\n\n.mp-ai-button::after {\n opacity: 0;\n}\n\n.mp-ai-button:hover::before,\n.mp-ai-button:hover::after,\n.mp-ai-button:focus-visible::before,\n.mp-ai-button:focus-visible::after,\n.mp-ai-button[aria-busy=\"true\"]::before,\n.mp-ai-button[aria-busy=\"true\"]::after {\n animation: mp-ai-spin var(--mp-ai-duration) linear infinite;\n}\n\n.mp-ai-button:hover::after,\n.mp-ai-button:focus-visible::after,\n.mp-ai-button[aria-busy=\"true\"]::after {\n opacity: var(--mp-ai-glow-opacity);\n}\n\n.mp-ai-button:focus-visible {\n outline: 2px solid var(--mp-ai-text);\n outline-offset: 3px;\n}\n\n.mp-ai-button:disabled:not([aria-busy=\"true\"]) {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.mp-ai-button-sm {\n padding: 0.25rem 0.7rem;\n font-size: 0.8125rem;\n}\n\n.mp-ai-button-lg {\n padding: 0.55rem 1.25rem;\n font-size: 1rem;\n}\n\n/* ── Thinking indicator ─────────────────────────────────── */\n/* Standalone: a pulsing gradient orb before the label.\n On a halo/button/panel: the glow pulses instead. */\n\n.mp-ai-thinking:not(.mp-ai-halo, .mp-ai-button, .mp-ai-badge, .mp-ai-panel) {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--mp-ai-fg-muted);\n font-size: 0.875rem;\n}\n\n.mp-ai-thinking:not(.mp-ai-halo, .mp-ai-button, .mp-ai-badge, .mp-ai-panel)::before {\n content: '';\n width: 0.875em;\n height: 0.875em;\n flex-shrink: 0;\n border-radius: 50%;\n background: conic-gradient(from var(--mp-ai-angle), var(--mp-ai-stops));\n animation:\n mp-ai-spin 1.5s linear infinite,\n mp-ai-orb-pulse 1.4s ease-in-out infinite;\n}\n\n.mp-ai-thinking:is(.mp-ai-halo, .mp-ai-button, .mp-ai-panel)::before {\n animation: mp-ai-spin var(--mp-ai-duration) linear infinite;\n}\n\n.mp-ai-thinking:is(.mp-ai-halo, .mp-ai-button, .mp-ai-panel)::after {\n animation:\n mp-ai-spin var(--mp-ai-duration) linear infinite,\n mp-ai-glow-pulse 1.6s ease-in-out infinite;\n}\n\n/* ── Answer panel ───────────────────────────────────────── */\n\n.mp-ai-panel {\n display: block;\n /* Full width of its slot, and safe as a flex/grid item: it never forces its\n parent wider, and long words or URLs wrap instead of overflowing. */\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n overflow-wrap: break-word;\n padding: 1rem 1.125rem;\n border-radius: var(--mp-radius, 0.5rem);\n color: var(--mp-ai-fg);\n font-size: 0.9375rem;\n}\n\n.mp-ai-panel::after {\n opacity: calc(var(--mp-ai-glow-opacity) * 0.4);\n}\n\n.mp-ai-panel.is-streaming::before,\n.mp-ai-panel.is-streaming::after {\n animation: mp-ai-spin var(--mp-ai-duration) linear infinite;\n}\n\n.mp-ai-panel.is-streaming::after {\n opacity: var(--mp-ai-glow-opacity);\n}\n\n.mp-ai-panel-header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.375rem 0.5rem;\n margin-bottom: 0.625rem;\n}\n\n.mp-ai-panel-header > .mp-ai-badge {\n flex: none;\n}\n\n/* The title sits next to the badge when there is room for at least ~12rem of\n it; otherwise it wraps onto its own full-width line below the badge, so it\n is never squeezed into a narrow column. */\n.mp-ai-panel-title {\n flex: 1 1 12rem;\n min-width: 0;\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n line-height: 1.35;\n overflow-wrap: anywhere;\n}\n\n.mp-ai-panel-body {\n min-width: 0;\n}\n\n.mp-ai-panel-note {\n margin: 0.75rem 0 0;\n font-size: 0.75rem;\n color: var(--mp-ai-fg-muted);\n}\n\n.mp-ai-error {\n margin: 0.5rem 0 0;\n color: var(--mp-ai-danger-text);\n font-size: 0.875rem;\n}\n\n.mp-ai-caret {\n display: inline-block;\n width: 0.5em;\n height: 1.1em;\n margin-inline-start: 2px;\n vertical-align: text-bottom;\n border-radius: 1px;\n background: var(--mp-ai-text);\n animation: mp-ai-blink 1s steps(1) infinite;\n}\n\n/* ── Rendered answer text (safe markdown subset) ────────── */\n\n.mp-ai-prose > :first-child {\n margin-top: 0;\n}\n\n.mp-ai-prose > :last-child {\n margin-bottom: 0;\n}\n\n.mp-ai-prose p,\n.mp-ai-prose ul,\n.mp-ai-prose ol,\n.mp-ai-prose pre {\n margin: 0 0 0.625rem;\n}\n\n.mp-ai-prose ul,\n.mp-ai-prose ol {\n padding-inline-start: 1.25rem;\n}\n\n.mp-ai-prose code {\n padding: 0.1em 0.35em;\n border-radius: 0.25rem;\n background: var(--mp-surface, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n color: inherit;\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n font-size: 0.85em;\n}\n\n/* Code reads left to right even on an RTL page. */\n.mp-ai-prose pre {\n direction: ltr;\n unicode-bidi: isolate;\n padding: 0.625rem 0.75rem;\n overflow-x: auto;\n border-radius: 0.375rem;\n background: var(--mp-surface, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n font-size: 0.8125rem;\n}\n\n.mp-ai-prose pre code {\n padding: 0;\n border: 0;\n background: none;\n font-size: inherit;\n}\n\n/* ── Chat ───────────────────────────────────────────────── */\n\n.mp-ai-chat {\n display: flex;\n flex-direction: column;\n min-height: 16rem;\n max-height: var(--mp-ai-chat-height, 28rem);\n overflow: hidden;\n border: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--mp-radius, 0.5rem);\n background: var(--mp-ai-surface);\n color: var(--mp-ai-fg);\n}\n\n.mp-ai-chat-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.625rem 0.875rem;\n border-bottom: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n}\n\n.mp-ai-chat-log {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n overflow-y: auto;\n}\n\n.mp-ai-chat-empty {\n margin: auto;\n color: var(--mp-ai-fg-muted);\n font-size: 0.875rem;\n text-align: center;\n}\n\n.mp-ai-chat-msg {\n display: flex;\n}\n\n.mp-ai-chat-msg.is-user {\n justify-content: flex-end;\n}\n\n.mp-ai-chat-bubble {\n max-width: 85%;\n padding: 0.5rem 0.75rem;\n border-radius: 0.875rem;\n font-size: 0.9rem;\n overflow-wrap: anywhere;\n}\n\n.is-user > .mp-ai-chat-bubble {\n border-end-end-radius: 0.25rem;\n background: var(--mp-primary, #4f46e5);\n color: #fff;\n}\n\n.is-assistant > .mp-ai-chat-bubble {\n border: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n border-end-start-radius: 0.25rem;\n background: var(--mp-surface, rgba(0, 0, 0, 0.02));\n}\n\n.mp-ai-chat-form {\n display: flex;\n align-items: flex-end;\n gap: 0.5rem;\n padding: 0.75rem;\n border-top: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n}\n\n.mp-ai-chat-input {\n flex: 1;\n min-height: 2.375rem;\n max-height: 8rem;\n padding: 0.45rem 0.75rem;\n resize: vertical;\n border: 1px solid var(--mp-ai-border-color);\n border-radius: 0.5rem;\n background: var(--mp-ai-bg);\n color: inherit;\n font: inherit;\n font-size: 0.9rem;\n}\n\n.mp-ai-chat-input:focus {\n outline: 2px solid var(--mp-ai-text);\n outline-offset: 1px;\n border-color: transparent;\n}\n\n/* ── Diff ───────────────────────────────────────────────── */\n\n.mp-ai-diff {\n overflow: hidden;\n border: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n border-radius: var(--mp-radius, 0.5rem);\n background: var(--mp-ai-surface);\n color: var(--mp-ai-fg);\n}\n\n.mp-ai-diff-header {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.375rem 0.5rem;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n font-size: 0.8125rem;\n}\n\n.mp-ai-diff-header > .mp-ai-badge {\n flex: none;\n}\n\n/* Same as the panel title: next to the badge when there is room for ~12rem of\n it, otherwise on its own line below the badge (with the stats at its end),\n never squeezed into a narrow column. */\n.mp-ai-diff-title {\n flex: 1 1 12rem;\n min-width: 0;\n font-weight: 500;\n line-height: 1.35;\n overflow-wrap: anywhere;\n}\n\n.mp-ai-diff-stats {\n flex: none;\n display: inline-flex;\n margin-inline-start: auto;\n gap: 0.5rem;\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n}\n\n.mp-ai-diff-stat-add {\n color: var(--mp-ai-success-text);\n}\n\n.mp-ai-diff-stat-del {\n color: var(--mp-ai-danger-text);\n}\n\n.mp-ai-diff-body {\n direction: ltr;\n unicode-bidi: isolate;\n max-height: 24rem;\n margin: 0;\n padding: 0.375rem 0;\n overflow: auto;\n font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n font-size: 0.8125rem;\n line-height: 1.55;\n}\n\n.mp-ai-diff-line {\n display: block;\n min-width: max-content;\n padding-inline-end: 0.75rem;\n white-space: pre;\n}\n\n.mp-ai-diff-sign {\n display: inline-block;\n width: 1.75rem;\n color: var(--mp-ai-fg-muted);\n text-align: center;\n user-select: none;\n}\n\n.mp-ai-diff-line.is-add {\n background: var(--mp-ai-diff-add-bg);\n color: var(--mp-ai-diff-add-text);\n}\n\n.mp-ai-diff-line.is-del {\n background: var(--mp-ai-diff-del-bg);\n color: var(--mp-ai-diff-del-text);\n}\n\n.mp-ai-diff-line.is-add .mp-ai-diff-sign,\n.mp-ai-diff-line.is-del .mp-ai-diff-sign {\n color: inherit;\n}\n\n.mp-ai-diff-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n border-top: 1px solid var(--mp-border, rgba(0, 0, 0, 0.1));\n}\n\n.mp-ai-diff-status {\n margin-inline-end: auto;\n color: var(--mp-ai-fg-muted);\n font-size: 0.8125rem;\n}\n\n.mp-ai-diff.is-applied .mp-ai-diff-status {\n color: var(--mp-ai-success-text);\n}\n\n/* Plain action buttons, so the diff works without Bootstrap */\n.mp-ai-action {\n padding: 0.3rem 0.85rem;\n border: 1px solid var(--mp-ai-border-color);\n border-radius: 0.375rem;\n background: transparent;\n color: var(--mp-ai-fg);\n font: inherit;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.mp-ai-action:hover {\n background: var(--mp-surface, rgba(0, 0, 0, 0.04));\n}\n\n.mp-ai-action-primary {\n border-color: var(--mp-primary, #4f46e5);\n background: var(--mp-primary, #4f46e5);\n color: #fff;\n}\n\n.mp-ai-action-primary:hover {\n border-color: var(--mp-primary-hover, #4338ca);\n background: var(--mp-primary-hover, #4338ca);\n}\n\n.mp-ai-action:focus-visible {\n outline: 2px solid var(--mp-ai-text);\n outline-offset: 2px;\n}\n\n.mp-ai-action:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* ── Page edge glow ─────────────────────────────────────── */\n/* A fixed, click-through glow around the viewport while the Assistant works. */\n\n.mp-ai-edge-glow {\n position: fixed;\n inset: 0;\n z-index: 1090;\n pointer-events: none;\n animation: mp-ai-fade-in 0.4s ease-out;\n}\n\n.mp-ai-edge-glow[hidden] {\n display: none;\n}\n\n.mp-ai-edge-glow::before,\n.mp-ai-edge-glow::after {\n content: '';\n position: absolute;\n inset: 0;\n background: conic-gradient(from var(--mp-ai-angle) at 50% 50%, var(--mp-ai-stops));\n animation: mp-ai-spin var(--mp-ai-duration) linear infinite;\n}\n\n/* Crisp 3px line along the edges */\n.mp-ai-edge-glow::before {\n padding: 3px;\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(#000 0 0) content-box exclude,\n linear-gradient(#000 0 0);\n}\n\n/* Soft glow fading inwards */\n.mp-ai-edge-glow::after {\n opacity: var(--mp-ai-edge-glow-opacity);\n -webkit-mask-image:\n linear-gradient(to right, #000, transparent var(--mp-ai-edge-width),\n transparent calc(100% - var(--mp-ai-edge-width)), #000),\n linear-gradient(to bottom, #000, transparent var(--mp-ai-edge-width),\n transparent calc(100% - var(--mp-ai-edge-width)), #000);\n mask-image:\n linear-gradient(to right, #000, transparent var(--mp-ai-edge-width),\n transparent calc(100% - var(--mp-ai-edge-width)), #000),\n linear-gradient(to bottom, #000, transparent var(--mp-ai-edge-width),\n transparent calc(100% - var(--mp-ai-edge-width)), #000);\n}\n\n/* ── Utilities ──────────────────────────────────────────── */\n\n.mp-ai-sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* ── Reduced motion: static gradient, no pulse ──────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .mp-ai-halo::before,\n .mp-ai-halo::after,\n .mp-ai-button::before,\n .mp-ai-button::after,\n .mp-ai-panel::before,\n .mp-ai-panel::after,\n .mp-ai-thinking::before,\n .mp-ai-thinking::after,\n .mp-ai-edge-glow,\n .mp-ai-edge-glow::before,\n .mp-ai-edge-glow::after,\n .mp-ai-caret {\n animation: none !important;\n }\n\n .mp-ai-button::after {\n transition: none;\n }\n}\n\n/* ── Forced colours: rings and glows vanish, keep an outline ── */\n\n@media (forced-colors: active) {\n .mp-ai-halo,\n .mp-ai-button,\n .mp-ai-badge,\n .mp-ai-panel {\n border: 1px solid CanvasText;\n }\n\n .mp-ai-edge-glow {\n display: none;\n }\n}\n"],"mappings":"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","names":[],"sourceRoot":""}
@@ -0,0 +1,13 @@
1
+ /* @mp-consulting/homebridge-ui-kit v1.3.0 */
2
+ (()=>{var w=typeof window!="undefined"?window:globalThis;function L(){return typeof document!="undefined"?document:w.document}function q(){return w.homebridge||(typeof homebridge!="undefined"?homebridge:void 0)}var $e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function m(e){return String(e==null?"":e).replace(/[&<>"']/g,t=>$e[t])}function I(e){return typeof e!="string"?null:/^https?:\/\//i.test(e.trim())?e.trim():null}var de=0;function S(e){return de+=1,(e||"mp")+"-"+de}function E(e){if(!e)return null;if(typeof e=="string"){let t=L();return t?t.querySelector(e):null}return e}function _(e,t){return typeof e=="string"&&e?e:e&&e.message||t}var C=null;function M(e,t){let n=L();if(!n||!n.body||typeof n.createElement!="function")return;(!C||!C.isConnected)&&(C=n.createElement("div"),C.className="mp-sr-only",C.setAttribute("data-mp-live",""),C.setAttribute("aria-atomic","true"),n.body.appendChild(C)),C.setAttribute("aria-live",t==="assertive"?"assertive":"polite"),C.textContent="";let r=String(e==null?"":e);setTimeout(()=>{C.textContent=r},30)}var fe='a[href], button:not([disabled]), input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function pe(e){return Array.from(e.querySelectorAll(fe)).filter(t=>!t.hidden&&!t.closest("[hidden]"))}function F(e){if(!(!e||typeof e.focus!="function")){!e.matches(fe)&&!e.hasAttribute("tabindex")&&(e.setAttribute("tabindex","-1"),e.classList.add("mp-focus-target"));try{e.focus({preventScroll:!0})}catch{e.focus()}}}function U(e){return e?String(e.textContent||"").replace(/\s+/g," ").trim():""}function V(e,t,n){return'<span class="badge '+e+'">'+(t?'<span class="mp-status '+t+'" aria-hidden="true"></span>':"")+m(n)+"</span>"}var Je=[{key:"github",text:"GitHub",paths:["M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"]},{key:"npm",text:"npm",paths:["M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5l2.404.961L10.404 2zm3.564 1.426L5.596 5 8 5.961 14.154 3.5zm3.25 1.7-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464z"]},{key:"changelog",text:"Changelog",paths:["M8.515 1.019A7 7 0 0 0 8 1V0a8 8 0 0 1 .589.022zm2.004.45a7 7 0 0 0-.985-.299l.219-.976q.576.129 1.126.342zm1.37.71a7 7 0 0 0-.439-.27l.493-.87a8 8 0 0 1 .979.654l-.615.789a7 7 0 0 0-.418-.302zm1.834 1.79a7 7 0 0 0-.653-.796l.724-.69q.406.429.747.91zm.744 1.352a7 7 0 0 0-.214-.468l.893-.45a8 8 0 0 1 .45 1.088l-.95.313a7 7 0 0 0-.179-.483m.53 2.507a7 7 0 0 0-.1-1.025l.985-.17q.1.58.116 1.17zm-.131 1.538q.05-.254.081-.51l.993.123a8 8 0 0 1-.23 1.155l-.964-.267q.069-.247.12-.501m-.952 2.379q.276-.436.486-.908l.914.405q-.24.54-.555 1.038zm-.964 1.205q.183-.183.35-.378l.758.653a8 8 0 0 1-.401.432z","M8 1a7 7 0 1 0 4.95 11.95l.707.707A8.001 8.001 0 1 1 8 0z","M7.5 3a.5.5 0 0 1 .5.5v5.21l3.248 1.856a.5.5 0 0 1-.496.868l-3.5-2A.5.5 0 0 1 7 9V3.5a.5.5 0 0 1 .5-.5"]}];function Qe(e){return'<svg class="mp-footer-icon" viewBox="0 0 16 16" aria-hidden="true" focusable="false">'+e.map(t=>'<path d="'+t+'"/>').join("")+"</svg>"}var H={online:e=>V("bg-success-subtle text-success-emphasis","mp-status-online",e||"Online"),offline:e=>V("bg-danger-subtle text-danger-emphasis","mp-status-offline",e||"Offline"),checking:e=>V("bg-secondary-subtle text-secondary-emphasis","mp-status-checking",e||"Checking…"),disabled:e=>V("bg-secondary",null,e||"Disabled")},z={render(e){e=e||{};let t=e.iconClass||"bi bi-inbox",n=e.title||"No items",r=e.hint||"";return'<div class="mp-empty-state"><i class="'+m(t)+' mp-empty-state-icon" aria-hidden="true"></i><p class="mp-empty-state-title">'+m(n)+"</p>"+(r?'<p class="mp-empty-state-hint">'+m(r)+"</p>":"")+"</div>"}},me={render(e){return e=e||"Loading…",'<div class="mp-loading" role="status" aria-live="polite"><div class="spinner-border spinner-border-sm text-secondary" aria-hidden="true"></div><span>'+m(e)+"</span></div>"}},Ye="h1, h2, h3, h4, h5, h6, [data-mp-focus]",G={show(e,t){t=t||{};let n=null,r=!1,i=!1;if(L().querySelectorAll(".mp-view").forEach(s=>{let o=s.id===e,f=s.classList.contains("active");o?(n=s,r=!f):f&&(i=!0),s.classList.toggle("active",o)}),!n||!r||typeof n.querySelector!="function")return n;let l=n.querySelector(Ye);if((t.focus===void 0?i:t.focus)&&F(l||n),t.announce===void 0?i:t.announce){let s=typeof t.announce=="string"?t.announce:n.getAttribute("aria-label")||U(l);s&&M(s)}return n}},ge={render(e){e=e||{};let t=E(e.target||".mp-footer");if(!t)return;let n=[];Je.forEach(r=>{let i=I(e[r.key]);i&&n.push('<a href="'+m(i)+'" target="_blank" rel="noopener noreferrer">'+Qe(r.paths)+r.text+"</a>")}),t.innerHTML=n.join('<span class="mp-footer-sep" aria-hidden="true">|</span>')}};var re='<svg class="mp-ai-icon" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="M8 0c.4 3.9 2.1 5.6 6 6-3.9.4-5.6 2.1-6 6-.4-3.9-2.1-5.6-6-6 3.9-.4 5.6-2.1 6-6z"/><path d="M13.5 10.5c.15 1.5.85 2.2 2.5 2.5-1.65.3-2.35 1-2.5 2.5-.15-1.5-.85-2.2-2.5-2.5 1.65-.3 2.35-1 2.5-2.5z"/></svg>',Y='<span class="mp-ai-caret" aria-hidden="true"></span>',Ze="Generated by the Assistant. Check it before acting on it.",ie="The Assistant could not answer. Please try again.",We=4e6,he=0;function Xe(){return he+=1,"mpai-"+Date.now().toString(36)+"-"+he.toString(36)+"-"+Math.random().toString(36).slice(2,8)}function et(e){return e&&e.data!==void 0?e.data:e&&e.detail!==void 0?e.detail:e}function be(e){if(e!=null)return e;var t="The Assistant request was cancelled";if(typeof DOMException=="function")try{return new DOMException(t,"AbortError")}catch{}var n=new Error(t);return n.name="AbortError",n}function tt(e,t){try{Promise.resolve(e.request("/ai/cancel",{requestId:t})).catch(function(){})}catch{}}function Z(e,t,n){n=n||{};var r=q();if(!r||typeof r.request!="function")return W(Promise.reject(new Error("MpKit.ai needs the Homebridge plugin UI (window.homebridge)")));var i=n.signal;if(i&&i.aborted)return W(Promise.reject(be(i.reason)));var l=Xe(),s={};Object.keys(t||{}).forEach(function(g){s[g]=t[g]}),s.requestId=l;var o=!1,f=[];if(typeof r.addEventListener=="function"){var h=function(g,d){var p=function(A){var T=et(A);!o&&T&&T.requestId===l&&d(T)};r.addEventListener(g,p),f.push([g,p])};typeof n.onChunk=="function"&&h("ai:chunk",function(g){typeof g.delta=="string"&&g.delta&&n.onChunk(g.delta,g)}),typeof n.onDone=="function"&&h("ai:done",function(g){n.onDone(g)}),typeof n.onError=="function"&&h("ai:error",function(g){n.onError(g.message||ie,g)})}var b,c=new Promise(function(g,d){b=d});c.catch(function(){});function u(){v(i.reason)}function a(){o=!0,i&&typeof i.removeEventListener=="function"&&i.removeEventListener("abort",u),typeof r.removeEventListener=="function"&&(f.forEach(function(g){r.removeEventListener(g[0],g[1])}),f=[])}function v(g){return o?!1:(a(),n.notifyServer!==!1&&tt(r,l),b(be(g)),!0)}i&&typeof i.addEventListener=="function"&&i.addEventListener("abort",u);var y;try{y=Promise.resolve(r.request(e,s))}catch(g){y=Promise.reject(g)}var x=Promise.race([y,c]).then(function(g){return a(),g},function(g){throw a(),g});return W(x,v,l)}function W(e,t,n){return e.cancel=t||function(){return!1},e.requestId=n||null,e}function X(e){return String(e).split(/(`[^`\n]+`)/).map(function(t,n){return n%2===1?"<code>"+m(t.slice(1,-1))+"</code>":m(t).replace(/\*\*([^*\n]+?)\*\*|__([^_\n]+?)__/g,function(r,i,l){return"<strong>"+(i||l)+"</strong>"})}).join("")}var ee=/^\s*[-*+]\s+(.*)$/,ve=/^\s*\d+[.)]\s+(.*)$/,nt=/^\s*#{1,6}\s+(.*)$/,rt=/^\s*(```|~~~)/;function J(e){var t=String(e==null?"":e).replace(/\r\n?/g,`
3
+ `).split(`
4
+ `),n=[],r=[],i=0;function l(){r.length&&(n.push("<p>"+r.map(X).join("<br>")+"</p>"),r=[])}for(;i<t.length;){var s=t[i],o=rt.exec(s);if(o){l();var f=[];for(i+=1;i<t.length&&t[i].trim().indexOf(o[1])!==0;)f.push(t[i]),i+=1;i+=1,n.push("<pre><code>"+m(f.join(`
5
+ `))+"</code></pre>");continue}var h=ee.test(s)?ee:ve.test(s)?ve:null;if(h){l();for(var b=h===ee?"ul":"ol",c=[];i<t.length&&h.test(t[i]);)c.push("<li>"+X(h.exec(t[i])[1])+"</li>"),i+=1;n.push("<"+b+">"+c.join("")+"</"+b+">");continue}var u=nt.exec(s);u?(l(),n.push("<p><strong>"+X(u[1])+"</strong></p>")):s.trim()?r.push(s):l(),i+=1}return l(),n.join("")}function ye(e){return/<\/p>$/.test(e)?e.slice(0,-4)+Y+"</p>":/<\/li><\/[ou]l>$/.test(e)?e.slice(0,-10)+Y+e.slice(-10):e+Y}function xe(e){if(e==null)return[];var t=typeof e=="string"?e:JSON.stringify(e,null,2);return t=t.replace(/\r\n?/g,`
6
+ `),t===""?[]:(t.charAt(t.length-1)===`
7
+ `&&(t=t.slice(0,-1)),t.split(`
8
+ `))}function ae(e,t){for(var n=xe(e),r=xe(t),i=[],l=0;l<n.length&&l<r.length&&n[l]===r[l];)i.push({type:"same",text:n[l]}),l+=1;for(var s=n.length,o=r.length;s>l&&o>l&&n[s-1]===r[o-1];)s-=1,o-=1;var f=n.slice(l,s),h=r.slice(l,o),b=f.length,c=h.length,u,a;if(b*c>We)f.forEach(function(x){i.push({type:"del",text:x})}),h.forEach(function(x){i.push({type:"add",text:x})});else{var v=c+1,y=new Int32Array((b+1)*v);for(u=b-1;u>=0;u-=1)for(a=c-1;a>=0;a-=1)y[u*v+a]=f[u]===h[a]?y[(u+1)*v+a+1]+1:Math.max(y[(u+1)*v+a],y[u*v+a+1]);for(u=0,a=0;u<b&&a<c;)f[u]===h[a]?(i.push({type:"same",text:f[u]}),u+=1,a+=1):y[(u+1)*v+a]>=y[u*v+a+1]?(i.push({type:"del",text:f[u]}),u+=1):(i.push({type:"add",text:h[a]}),a+=1);for(;u<b;u+=1)i.push({type:"del",text:f[u]});for(;a<c;a+=1)i.push({type:"add",text:h[a]})}for(u=s;u<n.length;u+=1)i.push({type:"same",text:n[u]});return i}var it={add:"+",del:"−",same:" "},Ae={add:"Added: ",del:"Removed: ",same:""};function at(e){return'<span class="mp-ai-diff-line is-'+e.type+'"><span class="mp-ai-diff-sign" aria-hidden="true">'+it[e.type]+"</span>"+(Ae[e.type]?'<span class="mp-ai-sr-only">'+Ae[e.type]+"</span>":"")+m(e.text)+"</span>"}function te(e,t,n){var r=e.__mpAiListeners||(e.__mpAiListeners={});r[t]&&e.removeEventListener(t,r[t]),r[t]=n,e.addEventListener(t,n)}function ot(e){var t=e&&e.target;return t&&typeof t.closest=="function"?t.closest("[data-mp-ai-action]"):null}function $(e){return'<span class="mp-ai-badge">'+re+m(e||"Assistant")+"</span>"}function ne(e){return'<span class="mp-ai-thinking" role="status">'+m(e||"Thinking…")+"</span>"}var k=null,oe={status:function(){var e=q();return!e||typeof e.request!="function"?Promise.reject(new Error("MpKit.ai needs the Homebridge plugin UI (window.homebridge)")):Promise.resolve(e.request("/ai/status"))},explain:function(e,t){return Z("/ai/explain",e,t)},ask:function(e,t){return Z("/ai/ask",e,t)},config:function(e,t){return Z("/ai/config",e,t)},markdown:J,diffLines:ae,renderButton:function(e){e=e||{};var t="mp-ai-button"+(e.size==="sm"||e.size==="lg"?" mp-ai-button-"+e.size:"")+(e.className?" "+m(e.className):"");return'<button type="button" class="'+t+'"'+(e.id?' id="'+m(e.id)+'"':"")+(e.title?' title="'+m(e.title)+'"':"")+">"+re+"<span>"+m(e.label||"Ask Assistant")+"</span></button>"},renderBadge:$,renderThinking:ne,renderAnswer:function(e,t){t=t||{};var n=t.note===void 0?Ze:t.note;e.innerHTML='<section class="mp-ai-panel" aria-label="'+m(t.label||"Assistant")+' answer"><div class="mp-ai-panel-header">'+$(t.label)+(t.title?'<p class="mp-ai-panel-title">'+m(t.title)+"</p>":"")+'</div><div class="mp-ai-panel-body mp-ai-prose"></div><p class="mp-ai-error" role="alert" hidden></p>'+(n?'<p class="mp-ai-panel-note">'+m(n)+"</p>":"")+"</section>";var r=e.querySelector(".mp-ai-panel"),i=e.querySelector(".mp-ai-panel-body"),l=e.querySelector(".mp-ai-error"),s=t.text==null?"":String(t.text),o=t.streaming!==!1;function f(){var b=J(s);o&&(b=s?ye(b):ne()),i.innerHTML=b,r.classList.toggle("is-streaming",o),r.setAttribute("aria-busy",o?"true":"false")}var h={append:function(b){return s+=b==null?"":String(b),f(),h},setText:function(b){return s=b==null?"":String(b),f(),h},done:function(b){var c=b&&typeof b=="object"?b.text:b;return typeof c=="string"&&c&&(s=c),o=!1,f(),h},error:function(b){return o=!1,f(),l.textContent=_(b,ie),l.hidden=!1,h},getText:function(){return s}};return f(),h},renderDiff:function(e,t){t=t||{};var n=ae(t.before,t.after),r=n.filter(function(y){return y.type==="add"}).length,i=n.filter(function(y){return y.type==="del"}).length,l=typeof t.onApply=="function"||typeof t.onReject=="function",s=t.title||"Suggested changes";e.innerHTML='<div class="mp-ai-diff"><div class="mp-ai-diff-header">'+$(t.label)+'<span class="mp-ai-diff-title">'+m(s)+'</span><span class="mp-ai-diff-stats"><span class="mp-ai-diff-stat-add">+'+r+'<span class="mp-ai-sr-only"> added</span></span><span class="mp-ai-diff-stat-del">−'+i+'<span class="mp-ai-sr-only"> removed</span></span></span></div><pre class="mp-ai-diff-body" tabindex="0" aria-label="'+m(s)+'"><code>'+(r||i?n.map(at).join(""):'<span class="mp-ai-diff-line">No changes</span>')+"</code></pre>"+(l?'<div class="mp-ai-diff-actions"><span class="mp-ai-diff-status" role="status"></span><button type="button" class="mp-ai-action" data-mp-ai-action="reject">'+m(t.rejectLabel||"Reject")+'</button><button type="button" class="mp-ai-action mp-ai-action-primary" data-mp-ai-action="apply">'+m(t.applyLabel||"Apply")+"</button></div>":"")+"</div>";var o={lines:n,added:r,removed:i};if(!l)return o;var f=e.querySelector(".mp-ai-diff"),h=e.querySelector(".mp-ai-diff-status"),b=e.querySelector('[data-mp-ai-action="apply"]'),c=e.querySelector('[data-mp-ai-action="reject"]'),u=!1,a=!1;function v(y){b.disabled=y,c.disabled=y}return te(e,"click",function(y){var x=ot(y);if(!(!x||u||a)){var g=x.getAttribute("data-mp-ai-action");if(!(g!=="apply"&&g!=="reject")){var d=g==="apply"?t.onApply:t.onReject;a=!0,v(!0),h.textContent="",Promise.resolve().then(function(){return typeof d=="function"?d({before:t.before,after:t.after,lines:n}):void 0}).then(function(){a=!1,u=!0,f.classList.add(g==="apply"?"is-applied":"is-rejected"),h.textContent=g==="apply"?"Applied":"Rejected"},function(p){a=!1,v(!1),h.textContent=_(p,"Something went wrong")})}}}),o},renderChat:function(e,t){t=t||{};var n=S("mp-ai-chat-input");e.innerHTML='<div class="mp-ai-chat"><div class="mp-ai-chat-header">'+$(t.label)+'</div><div class="mp-ai-chat-log" role="log" aria-live="polite" aria-label="'+m(t.label||"Assistant")+' conversation"></div><form class="mp-ai-chat-form"><label class="mp-ai-sr-only" for="'+n+'">Message</label><textarea class="mp-ai-chat-input" id="'+n+'" rows="1" placeholder="'+m(t.placeholder||"Ask the Assistant…")+'"></textarea><button type="submit" class="mp-ai-button">'+re+"<span>Send</span></button></form></div>";var r=e.querySelector(".mp-ai-chat-log"),i=e.querySelector(".mp-ai-chat-input"),l=e.querySelector(".mp-ai-chat-form .mp-ai-button"),s=[],o=!1;function f(a){if(a.role==="user")return'<div class="mp-ai-chat-msg is-user"><div class="mp-ai-chat-bubble"><span class="mp-ai-sr-only">You: </span>'+m(a.text).replace(/\n/g,"<br>")+"</div></div>";var v=J(a.text);return a.streaming&&(v=a.text?ye(v):ne()),a.error&&(v+='<p class="mp-ai-error" role="alert">'+m(a.error)+"</p>"),a.stopped&&(v+='<p class="mp-ai-panel-note">Stopped</p>'),'<div class="mp-ai-chat-msg is-assistant"><div class="mp-ai-chat-bubble mp-ai-prose"><span class="mp-ai-sr-only">'+m(t.label||"Assistant")+": </span>"+v+"</div></div>"}function h(){r.innerHTML=s.length?s.map(f).join(""):'<p class="mp-ai-chat-empty">'+m(t.emptyText||"Ask the Assistant a question.")+"</p>",r.setAttribute("aria-busy",o?"true":"false"),r.scrollTop=r.scrollHeight,l.disabled=o,l.setAttribute("aria-busy",o?"true":"false")}function b(a,v){var y=v.history.slice(-10).map(function(d){return(d.role==="user"?"User":"Assistant")+": "+d.text}).join(`
9
+ `),x=[t.context,y?`Conversation so far:
10
+ `+y:""].filter(Boolean).join(`
11
+
12
+ `),g={prompt:a};return x&&(g.context=x),oe.ask(g,{onChunk:v.onChunk,signal:v.signal})}var c=null;function u(a){var v=String(a==null?i.value:a).trim();if(!v||o)return Promise.resolve(null);a==null&&(i.value="");var y=s.filter(function(p){return!p.error&&!p.stopped}).map(function(p){return{role:p.role,text:p.text}}),x={role:"assistant",text:"",streaming:!0};s.push({role:"user",text:v},x),o=!0,h();var g=typeof t.onSend=="function"?t.onSend:b;c=typeof AbortController=="function"?new AbortController:null;var d=c?c.signal:void 0;return Promise.resolve().then(function(){return g(v,{history:y,signal:d,onChunk:function(p){x.text+=p==null?"":String(p),h()}})}).then(function(p){var A=p&&typeof p=="object"?p.text:p;typeof A=="string"&&A&&(x.text=A)},function(p){p&&p.name==="AbortError"||d&&d.aborted?x.stopped=!0:x.error=_(p,ie)}).then(function(){return x.streaming=!1,o=!1,c=null,h(),x.error||x.stopped?null:x.text})}return te(e,"submit",function(a){a.preventDefault(),u()}),te(e,"keydown",function(a){var v=a.target;a.key==="Enter"&&!a.shiftKey&&!a.isComposing&&v===i&&(a.preventDefault(),u())}),h(),{send:u,cancel:function(){return c?(c.abort(),!0):!1},clear:function(){s=[],h()},messages:function(){return s.map(function(a){return{role:a.role,text:a.text,error:a.error}})}}},edgeGlow:function(e){return e===!1?(k&&(k.hidden=!0),k):(k||(k=L().createElement("div"),k.className="mp-ai-edge-glow",k.setAttribute("aria-hidden","true"),L().body.appendChild(k)),k.hidden=!1,k)}};var st="mp-kit-theme",lt="(prefers-color-scheme: dark)";function j(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return t==="dark"||t==="dark-mode"?"dark":t==="light"||t==="light-mode"?"light":t==="auto"||t==="system"?"auto":null}function Le(e,t){return e==="dark"||e!=="light"&&t?"dark":"light"}function Se(e){return!e||typeof e!="object"?null:j(e.colorScheme)||j(e.theme)||j(e.lightingMode)}function ct(){try{return typeof w.matchMedia=="function"?w.matchMedia(lt):null}catch{return null}}function ut(e,t){if(e)try{w.localStorage.setItem(e,t)}catch{}}function dt(e){if(!e)return null;try{return j(w.localStorage.getItem(e))}catch{return null}}async function ft(){let e=q();if(!e)return null;if(typeof e.getUserSettings=="function")try{let t=Se(await e.getUserSettings());if(t)return t}catch{}if(typeof e.userCurrentLightingMode=="function")try{let t=j(await e.userCurrentLightingMode());if(t)return t}catch{}return null}function Ee(e,t){t=t||{};let n=L(),r=t.target||n&&n.documentElement;if(!r)return;let i=e==="dark";t.attribute!==!1&&r.setAttribute("data-bs-theme",i?"dark":"light"),t.className!==!1&&r.classList.toggle("mp-theme-dark",i)}var we={init(e){e=e||{};let t=e.storageKey===void 0?st:e.storageKey,n=j(e.theme),r=n||dt(t)||"auto",i=null,l=!!n,s=!1,o=ct();function f(){let c=Le(r,o&&o.matches);if(Ee(c,e),ut(t,r),c!==i){let u=i===null;i=c,!u&&typeof e.onChange=="function"&&e.onChange(c,r)}}function h(){!s&&r==="auto"&&f()}o&&(typeof o.addEventListener=="function"?o.addEventListener("change",h):typeof o.addListener=="function"&&o.addListener(h)),f();let b={ready:null,preference:()=>r,resolved:()=>i,set(c){return r=j(c)||"auto",l=!0,f(),i},destroy(){s=!0,o&&(typeof o.removeEventListener=="function"?o.removeEventListener("change",h):typeof o.removeListener=="function"&&o.removeListener(h))}};return b.ready=(l||e.homebridge===!1?Promise.resolve(null):ft()).then(c=>(c&&!l&&!s&&(r=c,f()),i)),b},apply:Ee,resolve:Le,normalize:j,fromSettings:Se};function pt(e){let t=e.getAttribute("data-mp-view")||e.getAttribute("aria-controls")||e.getAttribute("data-bs-target")||e.getAttribute("href")||"",n=t.charAt(0)==="#"?t.slice(1):t;return/^[A-Za-z][\w:.-]*$/.test(n)?n:null}function mt(e){let t=e.closest("[dir]");if(t)return t.getAttribute("dir").toLowerCase()==="rtl";try{return e.ownerDocument.defaultView.getComputedStyle(e).direction==="rtl"}catch{return!1}}var Ce={init(e,t){t=t||{};let n=typeof e=="string"?L().querySelector(e):e;if(!n)return null;let r=Array.from(n.querySelectorAll('.nav-link, [role="tab"]')),i=n.getAttribute("aria-orientation")==="vertical";n.setAttribute("role","tablist"),r.forEach(c=>{c.parentElement!==n&&c.parentElement.tagName==="LI"&&c.parentElement.setAttribute("role","presentation"),c.setAttribute("role","tab"),c.id||(c.id=S("mp-tab"));let u=pt(c),a=u&&n.ownerDocument.getElementById(u);a&&(c.setAttribute("aria-controls",u),a.setAttribute("role","tabpanel"),a.hasAttribute("aria-labelledby")||a.setAttribute("aria-labelledby",c.id))});let l=-1;function s(c){let u=c.getAttribute("aria-controls");return u?n.ownerDocument.getElementById(u):null}function o(c,u){let a=typeof c=="number"?c:r.indexOf(c);if(a<0||a>=r.length)return;let v=a!==l;r.forEach((x,g)=>{let d=g===a;x.setAttribute("aria-selected",d?"true":"false"),x.setAttribute("tabindex",d?"0":"-1"),x.classList.toggle("active",d);let p=s(x);!p||p.classList.contains("mp-view")||(p.classList.contains("tab-pane")?(p.classList.toggle("active",d),p.classList.toggle("show",d)):p.hidden=!d)});let y=s(r[a]);y&&y.classList.contains("mp-view")&&G.show(y.id,{focus:!1,announce:!1}),l=a,v&&u&&typeof t.onChange=="function"&&t.onChange(r[a],a,y)}function f(c){let u=c.target.closest('[role="tab"]');!u||!n.contains(u)||(u.tagName==="A"&&c.preventDefault(),o(u,!0))}function h(c){let u=c.target.closest('[role="tab"]');if(!u||!n.contains(u))return;let a=r.filter(p=>!p.disabled&&p.getAttribute("aria-disabled")!=="true"),v=a.indexOf(u),y=!i&&mt(n),x=i?"ArrowDown":y?"ArrowLeft":"ArrowRight",g=i?"ArrowUp":y?"ArrowRight":"ArrowLeft",d=null;if(c.key===x)d=a[(v+1)%a.length];else if(c.key===g)d=a[(v-1+a.length)%a.length];else if(c.key==="Home")d=a[0];else if(c.key==="End")d=a[a.length-1];else if((c.key==="Enter"||c.key===" ")&&t.activation==="manual"){c.preventDefault(),o(u,!0);return}d&&(c.preventDefault(),t.activation==="manual"?r.forEach(p=>p.setAttribute("tabindex",p===d?"0":"-1")):o(d,!0),d.focus())}n.addEventListener("click",f),n.addEventListener("keydown",h);let b=r.findIndex(c=>c.classList.contains("active")||c.getAttribute("aria-selected")==="true");return o(b<0?0:b,!1),{select:c=>o(c,!0),selected:()=>l,tabs:()=>r.slice(),destroy(){n.removeEventListener("click",f),n.removeEventListener("keydown",h)}}}};var gt=["success","error","warning","info"],ht={success:5e3,info:5e3,warning:7e3,error:8e3},bt={success:"✓",info:"i",warning:"!",error:"✕"},P=null;function vt(e){return(!P||!P.isConnected)&&(P=e.createElement("div"),P.className="mp-toast-container",e.body.appendChild(P)),P}function R(e,t,n){gt.indexOf(e)<0&&(e="info"),n=typeof n=="string"?{title:n}:n||{};let r=String(t==null?"":t),i=q();if(!n.local&&i&&i.toast&&typeof i.toast[e]=="function")return i.toast[e](r,n.title),{close(){},element:null,native:!0};let l=L();if(!l||!l.body)return{close(){},element:null,native:!1};let s=l.createElement("div");s.className="mp-toast mp-toast-"+e,s.setAttribute("role",e==="error"||e==="warning"?"alert":"status"),s.setAttribute("aria-atomic","true"),s.innerHTML='<span class="mp-toast-icon" aria-hidden="true">'+bt[e]+'</span><div class="mp-toast-body">'+(n.title?'<p class="mp-toast-title">'+m(n.title)+"</p>":"")+'<p class="mp-toast-message">'+m(r)+'</p></div><button type="button" class="mp-toast-close" aria-label="Close">×</button>',vt(l).appendChild(s);let o=null,f=!1,h=n.duration===void 0?ht[e]:Number(n.duration)||0;function b(){f||(f=!0,clearTimeout(o),s.remove())}function c(){clearTimeout(o),h>0&&(o=setTimeout(b,h))}return s.addEventListener("mouseenter",()=>clearTimeout(o)),s.addEventListener("mouseleave",c),s.addEventListener("focusin",()=>clearTimeout(o)),s.addEventListener("focusout",c),s.querySelector(".mp-toast-close").addEventListener("click",b),c(),{close:b,element:s,native:!1}}var K={show:R,success:(e,t)=>R("success",e,t),error:(e,t)=>R("error",e,t),warning:(e,t)=>R("warning",e,t),info:(e,t)=>R("info",e,t)};function ke(e){e=typeof e=="string"?{message:e}:e||{};let t=L();if(!t||!t.body)return Promise.resolve(!1);let n=S("mp-dialog-title"),r=S("mp-dialog-message"),i=!!e.danger,l=t.createElement("div");l.className="mp-dialog-backdrop",l.innerHTML='<div class="mp-dialog'+(i?" mp-dialog-danger":"")+'" role="alertdialog" aria-modal="true" aria-labelledby="'+n+'"'+(e.message?' aria-describedby="'+r+'"':"")+'><h2 class="mp-dialog-title" id="'+n+'">'+m(e.title||"Are you sure?")+"</h2>"+(e.message?'<p class="mp-dialog-message" id="'+r+'">'+m(e.message)+"</p>":"")+'<div class="mp-dialog-actions"><button type="button" class="btn btn-outline-secondary" data-mp-dialog="cancel">'+m(e.cancelLabel||"Cancel")+'</button><button type="button" class="btn '+(i?"btn-danger":"btn-primary")+'" data-mp-dialog="confirm">'+m(e.confirmLabel||"Confirm")+"</button></div></div>";let s=l.firstChild,o=t.activeElement,f=Array.from(t.body.children).filter(h=>!h.hasAttribute("inert")&&!h.hasAttribute("data-mp-live")&&!h.classList.contains("mp-toast-container"));return f.forEach(h=>h.setAttribute("inert","")),t.body.appendChild(l),t.body.classList.add("mp-dialog-open"),new Promise(h=>{function b(u){if(t.removeEventListener("keydown",c,!0),l.remove(),f.forEach(a=>a.removeAttribute("inert")),t.querySelector(".mp-dialog-backdrop")||t.body.classList.remove("mp-dialog-open"),o&&typeof o.focus=="function"&&o.isConnected)try{o.focus({preventScroll:!0})}catch{o.focus()}h(u)}function c(u){if(u.key==="Escape")u.preventDefault(),u.stopPropagation(),b(!1);else if(u.key==="Tab"){let a=pe(s);if(!a.length)return;let v=a[0],y=a[a.length-1],x=t.activeElement;u.shiftKey&&(x===v||!s.contains(x))?(u.preventDefault(),y.focus()):!u.shiftKey&&(x===y||!s.contains(x))&&(u.preventDefault(),v.focus())}}l.addEventListener("click",u=>{let a=u.target.closest&&u.target.closest("[data-mp-dialog]");a?b(a.getAttribute("data-mp-dialog")==="confirm"):u.target===l&&b(!1)}),t.addEventListener("keydown",c,!0),s.querySelector('[data-mp-dialog="'+(i?"cancel":"confirm")+'"]').focus()})}function le(e){let t=String(e==null?"":e),n=w.navigator;return n&&n.clipboard&&typeof n.clipboard.writeText=="function"?n.clipboard.writeText(t).then(()=>!0,()=>Te(t)):Promise.resolve(Te(t))}function Te(e){let t=L();if(!t||!t.body||typeof t.execCommand!="function")return!1;let n=t.createElement("textarea");n.value=e,n.setAttribute("readonly",""),n.className="mp-sr-only",t.body.appendChild(n),n.select();let r=!1;try{r=t.execCommand("copy")}catch{r=!1}return n.remove(),!!r}function N(e){return Object.keys(e).map(t=>{let n=e[t];return n==null||n===!1?"":n===!0?" "+t:" "+t+'="'+m(n)+'"'}).join("")}var B={render(e){e=e||{};let t="btn btn-outline-secondary mp-copy-btn"+(e.size==="sm"?" btn-sm":"")+(e.className?" "+e.className:"");return'<button type="button"'+N({class:t,"data-mp-copy":e.target?void 0:String(e.text==null?"":e.text),"data-mp-copy-target":e.target,"data-mp-copied-label":e.copiedLabel||"Copied","aria-label":e.ariaLabel})+">"+m(e.label||"Copy")+"</button>"}};function Me(e){let t=e.getAttribute("data-mp-copy"),n=e.getAttribute("data-mp-copy-target");if(n){let r=E(n);if(!r)return Promise.resolve(!1);t="value"in r&&r.tagName!=="BUTTON"?r.value:r.textContent}return le(t).then(r=>{let i=e.getAttribute("data-mp-copied-label")||"Copied";return e.__mpLabel||(e.__mpLabel=e.textContent),e.textContent=r?i:"Copy failed",e.classList.toggle("is-copied",r),M(r?"Copied to clipboard":"Could not copy"),clearTimeout(e.__mpCopyTimer),e.__mpCopyTimer=setTimeout(()=>{e.textContent=e.__mpLabel,e.classList.remove("is-copied")},2e3),r})}function je(e){let t=L().getElementById(e.getAttribute("data-mp-reveal"));if(!t)return;let n=t.type==="password";t.type=n?"text":"password",e.setAttribute("aria-pressed",n?"true":"false"),e.textContent=n?e.getAttribute("data-mp-hide-label")||"Hide":e.getAttribute("data-mp-show-label")||"Show"}function yt(e){return(e||[]).map(t=>t&&typeof t=="object"?t:{value:t,label:String(t)})}function He(e,t){let n=e.id||S("mp-field"),r=e.help?n+"-help":null,i=e.error?n+"-error":null,l=[r,i].filter(Boolean).join(" ")||void 0,s='<label class="'+(t==="check"?"form-check-label":"form-label")+'" for="'+m(n)+'">'+m(e.label||e.name||"")+(e.required?'<span class="mp-required" aria-hidden="true"> *</span>':"")+"</label>",o=e.help?'<div class="form-text" id="'+m(r)+'">'+m(e.help)+"</div>":"",f=e.error?'<div class="invalid-feedback d-block" id="'+m(i)+'">'+m(e.error)+"</div>":"";return{id:n,describedBy:l,label:s,help:o,error:f}}function xt(e){e=e||{};let t=e.type||"text",n=t==="checkbox"||t==="switch",r=He(e,n?"check":"field"),i={id:r.id,name:e.name,required:!!e.required,disabled:!!e.disabled,"aria-describedby":r.describedBy,"aria-invalid":e.error?"true":void 0},l=e.error?" is-invalid":"";if(n)return'<div class="form-check'+(t==="switch"?" form-switch":"")+' mb-3 mp-field"><input'+N(Object.assign({class:"form-check-input"+l,type:"checkbox",role:t==="switch"?"switch":void 0,checked:!!(e.checked!==void 0?e.checked:e.value)},i))+">"+r.label+r.help+r.error+"</div>";let s;return t==="select"?s="<select"+N(Object.assign({class:"form-select"+l,multiple:!!e.multiple},i))+">"+yt(e.options).map(o=>{let f=Array.isArray(e.value)?e.value.map(String).indexOf(String(o.value))>=0:String(e.value)===String(o.value);return"<option"+N({value:String(o.value),selected:f,disabled:!!o.disabled})+">"+m(o.label)+"</option>"}).join("")+"</select>":t==="textarea"?s="<textarea"+N(Object.assign({class:"form-control"+l,rows:e.rows||3,placeholder:e.placeholder,readonly:!!e.readonly},i))+">"+m(e.value==null?"":e.value)+"</textarea>":s="<input"+N(Object.assign({class:"form-control"+l,type:t,value:e.value==null?void 0:String(e.value),placeholder:e.placeholder,readonly:!!e.readonly,min:e.min,max:e.max,step:e.step,pattern:e.pattern,autocomplete:e.autocomplete,inputmode:e.inputmode},i))+">",'<div class="mb-3 mp-field">'+r.label+s+r.help+r.error+"</div>"}function At(e){e=e||{};let t=He(e,"field"),n="<input"+N({class:"form-control mp-secret-input"+(e.error?" is-invalid":""),type:"password",id:t.id,name:e.name,value:e.value==null?void 0:String(e.value),placeholder:e.placeholder,required:!!e.required,disabled:!!e.disabled,readonly:!!e.readonly,autocomplete:e.autocomplete||"off",spellcheck:"false",autocapitalize:"off","aria-describedby":t.describedBy,"aria-invalid":e.error?"true":void 0})+">",r=m(e.label||e.name||"value"),i=e.reveal===!1?"":'<button type="button" class="btn btn-outline-secondary mp-reveal-btn" data-mp-reveal="'+m(t.id)+'" aria-controls="'+m(t.id)+'" aria-pressed="false" aria-label="Show '+r+'">Show</button>',l=e.copy===!1?"":B.render({target:"#"+t.id,ariaLabel:"Copy "+r});return'<div class="mb-3 mp-field">'+t.label+'<div class="input-group'+(e.error?" has-validation":"")+'">'+n+i+l+"</div>"+t.help+t.error+"</div>"}function O(e,t,n){let r=t.split("."),i=e;r.slice(0,-1).forEach(l=>{(!i[l]||typeof i[l]!="object")&&(i[l]={}),i=i[l]}),i[r[r.length-1]]=n}function se(e,t){return t.split(".").reduce((n,r)=>n==null?void 0:n[r],e)}function Oe(e){return Array.from(e.querySelectorAll("input[name], select[name], textarea[name]")).filter(t=>!t.disabled&&!t.hasAttribute("data-mp-ignore")&&["button","submit","reset","file","image"].indexOf(t.type)<0)}function D(e){e=E(e);let t={},n=Oe(e),r={};return n.forEach(i=>{i.type==="checkbox"&&(r[i.name]=(r[i.name]||0)+1)}),n.forEach(i=>{let l=i.name;if(i.type==="checkbox")if(r[l]>1){let s=se(t,l)||[];i.checked&&s.push(i.value),O(t,l,s)}else O(t,l,i.checked);else i.type==="radio"?i.checked?O(t,l,i.value):se(t,l)===void 0&&O(t,l,null):i.type==="number"||i.type==="range"?O(t,l,i.value===""?null:Number(i.value)):i.tagName==="SELECT"&&i.multiple?O(t,l,Array.from(i.selectedOptions).map(s=>s.value)):O(t,l,i.value)}),t}function De(e,t){return e=E(e),t=t||{},Oe(e).forEach(n=>{let r=se(t,n.name);if(r!==void 0)if(n.type==="checkbox")n.checked=Array.isArray(r)?r.map(String).indexOf(n.value)>=0:!!r;else if(n.type==="radio")n.checked=String(r)===n.value;else if(n.tagName==="SELECT"&&n.multiple){let i=(Array.isArray(r)?r:[r]).map(String);Array.from(n.options).forEach(l=>{l.selected=i.indexOf(l.value)>=0})}else n.value=r==null?"":String(r)}),e}function qe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Ne(e,t){let n=Object.assign({},e);return Object.keys(t||{}).forEach(r=>{n[r]=qe(n[r])&&qe(t[r])?Ne(n[r],t[r]):t[r]}),n}function Lt(e,t){t=t||{},e=E(e);let n=e.ownerDocument,r=JSON.stringify(D(e)),i=D(e),l=!1,s=!1,o=null;if(t.bar!==!1){o=n.createElement("div"),o.className="mp-savebar",o.setAttribute("role","region"),o.setAttribute("aria-label","Unsaved changes"),o.hidden=!0,o.innerHTML='<span class="mp-savebar-message" role="status">'+m(t.message||"You have unsaved changes")+'</span><span class="mp-savebar-actions"><button type="button" class="btn btn-sm btn-outline-secondary" data-mp-save="discard">'+m(t.discardLabel||"Discard")+'</button><button type="button" class="btn btn-sm btn-primary" data-mp-save="save">'+m(t.saveLabel||"Save")+"</button></span>";let g=t.bar&&t.bar!==!0?E(t.bar):null;g?g.appendChild(o):e.insertAdjacentElement("afterend",o)}function f(g){g!==l&&(l=g,o&&(o.hidden=!l),e.classList.toggle("is-dirty",l),typeof t.onDirtyChange=="function"&&t.onDirtyChange(l))}function h(){f(JSON.stringify(D(e))!==r)}function b(){i=D(e),r=JSON.stringify(i),f(!1)}function c(g){s=g,o&&(o.setAttribute("aria-busy",g?"true":"false"),o.querySelectorAll("button").forEach(d=>{d.disabled=g}))}async function u(g){let d=q();if(!d||typeof d.updatePluginConfig!="function")return null;let p=typeof d.getPluginConfig=="function"?await d.getPluginConfig()||[]:[],A=typeof t.toConfig=="function"?await t.toConfig(g,p):[Ne(p[0]||{},g)].concat(p.slice(1));return Array.isArray(A)||(A=[A]),await d.updatePluginConfig(A),t.persist!==!1&&typeof d.savePluginConfig=="function"&&await d.savePluginConfig(),A}async function a(){if(s)return!1;let g=D(e);c(!0);try{let d=typeof t.save=="function",p=d?await t.save(g):await u(g),A=d||p!==null;return b(),A&&(t.toast!==!1&&K.success(t.savedMessage||"Settings saved"),typeof t.onSaved=="function"&&t.onSaved(p)),A}catch(d){throw t.toast!==!1&&K.error(_(d,"Could not save the settings")),typeof t.onError=="function"&&t.onError(d),d}finally{c(!1)}}function v(){De(e,i),h()}function y(g){let d=g.target.closest("[data-mp-save]");d&&(d.getAttribute("data-mp-save")==="save"?a().catch(()=>{}):v())}function x(g){g.preventDefault(),a().catch(()=>{})}return e.addEventListener("input",h),e.addEventListener("change",h),t.submit!==!1&&e.addEventListener("submit",x),o&&o.addEventListener("click",y),{bar:o,isDirty:()=>l,values:()=>D(e),save:a,discard:v,reset:b,check:h,destroy(){e.removeEventListener("input",h),e.removeEventListener("change",h),e.removeEventListener("submit",x),o&&o.remove()}}}var Ie={field:xt,secret:At,values:D,fill:De,track:Lt};var Et='.mp-device-card[role="button"], [data-mp-activate][role="button"]';function St(e){let t=e.target;if(!t||typeof t.closest!="function")return;let n=t.closest("[data-mp-copy], [data-mp-copy-target]");if(n){Me(n);return}let r=t.closest("[data-mp-reveal]");r&&je(r)}function wt(e){if(e.defaultPrevented||e.key!=="Enter"&&e.key!==" ")return;let t=e.target;!t||typeof t.matches!="function"||!t.matches(Et)||(e.preventDefault(),t.click())}function _e(){let e=L();!e||typeof e.addEventListener!="function"||e.__mpKitDelegates||(e.__mpKitDelegates=!0,e.addEventListener("click",St),e.addEventListener("keydown",wt))}var ce={render(e){e=e||{};let t=Math.max(1,e.lines||3),n="";for(let r=0;r<t;r+=1)n+='<span class="mp-skeleton mp-skeleton-text"'+(r===t-1&&t>1?' style="width:60%"':"")+"></span>";return'<div class="mp-skeleton-group'+(e.className?" "+m(e.className):"")+'" aria-hidden="true">'+(e.avatar?'<span class="mp-skeleton mp-skeleton-circle"></span>':"")+'<span class="mp-skeleton-lines">'+n+"</span></div>"}},Pe={online:H.online,offline:H.offline,checking:H.checking,disabled:H.disabled};function Ct(e,t,n){let r=e.name||e.displayName||e.id||"Device "+(t+1),i=Pe[e.status]?Pe[e.status](e.statusLabel):"";return'<div class="card mp-device-card"'+(n?' role="button" tabindex="0"':"")+'><div class="card-body mp-device-card-body">'+(e.iconClass?'<i class="'+m(e.iconClass)+' mp-device-card-icon" aria-hidden="true"></i>':"")+'<div class="mp-device-card-text"><div class="mp-device-card-name">'+m(r)+"</div>"+(e.subtitle?'<div class="mp-device-card-subtitle">'+m(e.subtitle)+"</div>":"")+"</div>"+i+"</div></div>"}function kt(e){return(t,n)=>e.some(r=>{let i=t&&t[r];return i!=null&&String(i).toLowerCase().indexOf(n)>=0})}var Be={render(e,t){t=t||{},e=E(e);let n=t.label||"Devices",r=t.search===!1?null:typeof t.search=="object"?t.search:{},i=S("mp-device-search"),l=typeof t.filter=="function"?t.filter:kt(t.keys||["name","displayName","subtitle","id"]),s=typeof t.onActivate=="function",o=Array.isArray(t.items)?t.items.slice():[],f=!!t.loading,h="",b=[];e.innerHTML='<div class="mp-device-list">'+(r?'<div class="mp-device-list-search"><label class="mp-sr-only" for="'+i+'">'+m(r.label||"Search "+n.toLowerCase())+'</label><input type="search" class="form-control" id="'+i+'" autocomplete="off" placeholder="'+m(r.placeholder||"Search…")+'"></div>':"")+'<p class="mp-sr-only" role="status" aria-live="polite" aria-atomic="true"></p><div class="mp-device-list-items" role="list" aria-label="'+m(n)+'"></div></div>';let c=e.querySelector(".mp-device-list-items"),u=e.querySelector('.mp-device-list [role="status"]'),a=r?e.querySelector('input[type="search"]'):null;function v(d){u.textContent!==d&&(u.textContent=d)}function y(){if(c.setAttribute("aria-busy",f?"true":"false"),a&&(a.disabled=f&&!o.length),f&&!o.length){let d=t.skeletonCount||3,p="";for(let A=0;A<d;A+=1)p+='<div class="card mp-device-card mp-device-card-skeleton" role="listitem"><div class="card-body">'+ce.render({lines:2,avatar:!0})+"</div></div>";c.innerHTML=p,v("Loading "+n.toLowerCase()+"…"),b=[];return}if(b=h?o.filter(d=>l(d,h)):o.slice(),!o.length){c.innerHTML='<div role="listitem">'+z.render(Object.assign({title:"No "+n.toLowerCase()+" found"},t.empty))+"</div>",v("No "+n.toLowerCase());return}if(!b.length){let d=t.noResults||{};c.innerHTML='<div role="listitem">'+z.render({iconClass:d.iconClass||"bi bi-search",title:d.title||"No matches for “"+h+"”",hint:d.hint||"Try a different search"})+"</div>",v("No matches");return}c.innerHTML=b.map(d=>{let p=o.indexOf(d),A=typeof t.renderItem=="function"?t.renderItem(d,p):Ct(d,p,s);return'<div role="listitem" class="mp-device-list-item" data-mp-index="'+p+'">'+A+"</div>"}).join(""),v(h?b.length+" of "+o.length+" "+n.toLowerCase():"")}function x(){h=a.value.trim().toLowerCase(),y()}function g(d){if(!s)return;let p=d.target.closest("[data-mp-index]");if(!p||!c.contains(p))return;let A=d.target.closest('a, button, input, select, textarea, label, [role="button"]');if(A&&p.contains(A)&&!A.classList.contains("mp-device-card"))return;let T=Number(p.getAttribute("data-mp-index"));t.onActivate(o[T],T,d)}return a&&a.addEventListener("input",x),c.addEventListener("click",g),y(),{setItems(d){o=Array.isArray(d)?d.slice():[],f=!1,y()},setLoading(d){f=!!d,y()},setQuery(d){h=String(d==null?"":d).trim().toLowerCase(),a&&(a.value=d==null?"":String(d)),y()},items:()=>o.slice(),visible:()=>b.slice(),status:()=>U(u),destroy(){a&&a.removeEventListener("input",x),c.removeEventListener("click",g),e.innerHTML=""}}}};var Tt=/[\u001b\u009b][[\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\d/#&.:=?%@~_]+)*|[a-zA-Z\d]+(?:;[-a-zA-Z\d/#&.:=?%@~_]*)*)?\u0007)|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))/g;function Q(e){return String(e==null?"":e).replace(Tt,"")}var qt=8,ze={create(e,t){t=t||{},e=E(e);let n=e.ownerDocument,r=t.maxLines>0?t.maxLines:1e3;e.innerHTML='<div class="mp-log'+(t.wrap?" mp-log-wrap":"")+'"><div class="mp-log-body" role="log" tabindex="0"></div><button type="button" class="btn btn-sm btn-primary mp-log-jump" hidden></button></div>';let i=e.querySelector(".mp-log-body"),l=e.querySelector(".mp-log-jump");i.setAttribute("aria-label",t.label||"Log"),i.setAttribute("aria-live",t.live==="polite"?"polite":"off"),l.textContent=t.jumpLabel||"Jump to latest";let s=t.autoscroll!==!1,o=[];function f(){return i.scrollHeight-i.scrollTop-i.clientHeight<=qt}function h(){i.scrollTop=i.scrollHeight,s=t.autoscroll!==!1,l.hidden=!0}function b(){t.autoscroll!==!1&&(s=f(),s&&(l.hidden=!0))}function c(u){let a=(Array.isArray(u)?u:String(u==null?"":u).split(/\r?\n/)).map(Q);if(!Array.isArray(u)&&a.length>1&&a[a.length-1]===""&&a.pop(),!a.length)return;let v=s&&t.autoscroll!==!1,y=n.createDocumentFragment();a.forEach(g=>{let d=n.createElement("div"),p=typeof t.lineClass=="function"?t.lineClass(g):"";d.className="mp-log-line"+(p?" "+p:""),d.textContent=g,y.appendChild(d)}),i.appendChild(y),o=o.concat(a);let x=o.length-r;if(x>0){o=o.slice(x);for(let g=0;g<x&&i.firstChild;g+=1)i.removeChild(i.firstChild)}v?i.scrollTop=i.scrollHeight:t.autoscroll!==!1&&(l.hidden=!1)}return i.addEventListener("scroll",b),l.addEventListener("click",()=>{h(),i.focus()}),{element:i,append:c,clear(){o=[],i.textContent="",l.hidden=!0},lines:()=>o.slice(),scrollToBottom:h,isFollowing:()=>s,destroy(){i.removeEventListener("scroll",b),e.innerHTML=""}}},stripAnsi:Q};function ue(e){let t=String(e==null?"":e).replace(/\D/g,"");return t.length===8?t.slice(0,3)+"-"+t.slice(3,5)+"-"+t.slice(5):""}function Mt(e){if(typeof e!="string")return null;let t=e.trim();return I(t)||/^data:image\/(png|gif|jpeg|webp|svg\+xml)[;,]/i.test(t)||/^(\.{0,2}\/|[\w-]+(\/|\.))/.test(t)&&!/^[a-z][\w+.-]*:/i.test(t)?t:null}function Re(e){e=e||{};let t=ue(e.pin)||m(e.pin||""),n=String(e.pin==null?"":e.pin).replace(/\D/g,"").split("").join(" "),r=S("mp-pin"),i=Mt(e.qrSrc),l=e.label||"HomeKit setup code";return'<figure class="mp-pin" aria-labelledby="'+r+'"><div class="mp-pin-label-box"><span class="mp-pin-label" id="'+r+'">'+m(l)+'</span><span class="mp-pin-code" aria-hidden="true">'+t+'</span><span class="mp-sr-only">'+m(n||t)+"</span></div>"+(i?'<img class="mp-pin-qr" src="'+m(i)+'" alt="'+m(e.qrAlt||"QR code for "+l)+'">':"")+'<span class="mp-pin-qr-slot"></span>'+(e.copy===!1?"":'<figcaption class="mp-pin-actions">'+B.render({text:t,label:e.copyLabel||"Copy code",size:"sm"})+"</figcaption>")+"</figure>"}var Fe={formatPin:ue,pin:Re,renderPin(e,t){t=t||{},e=E(e);let n=t.qr;if(e.innerHTML=Re(Object.assign({},t,{qrSrc:typeof n=="string"?n:t.qrSrc})),n&&typeof n=="object"&&n.nodeType===1){let r=e.querySelector(".mp-pin-qr-slot");n.tagName.toLowerCase()==="svg"&&(n.setAttribute("role","img"),n.getAttribute("aria-label")||n.setAttribute("aria-label",t.qrAlt||"QR code for "+(t.label||"HomeKit setup code"))),n.classList.add("mp-pin-qr"),r.appendChild(n)}return e.querySelector(".mp-pin")}},Ke={waiting:"Waiting for you to sign in…",polling:"Waiting for authorization…",success:"Signed in.",error:"Sign-in failed.",expired:"The code expired. Start again to get a new one."},Ue={deviceCode(e,t){t=t||{},e=E(e);let n=S("mp-auth-title"),r=I(t.url);e.innerHTML='<section class="card mp-auth-card" aria-labelledby="'+n+'"><div class="card-body"><h3 class="mp-auth-title" id="'+n+'">'+m(t.title||"Sign in")+"</h3>"+(t.instructions?'<p class="mp-auth-instructions">'+m(t.instructions)+"</p>":"")+'<ol class="mp-auth-steps">'+(r?'<li><span class="mp-auth-step-text">Open the sign-in page</span><a class="btn btn-primary btn-sm mp-auth-open" href="'+m(r)+'" target="_blank" rel="noopener noreferrer">'+m(t.openLabel||"Open sign-in page")+'<span class="mp-sr-only"> (opens in a new tab)</span></a></li>':"")+(t.code?'<li><span class="mp-auth-step-text">Enter this code</span><span class="mp-auth-code-row"><code class="mp-auth-code">'+m(t.code)+"</code>"+B.render({text:t.code,label:"Copy",size:"sm",ariaLabel:"Copy code"})+"</span></li>":"")+'</ol><p class="mp-auth-status" role="status" aria-live="polite"><span class="mp-auth-status-icon" aria-hidden="true"></span><span class="mp-auth-status-text"></span></p><button type="button" class="btn btn-outline-secondary btn-sm mp-auth-retry" hidden>Try again</button></div></section>';let i=e.querySelector(".mp-auth-card"),l=e.querySelector(".mp-auth-status"),s=e.querySelector(".mp-auth-status-text"),o=e.querySelector(".mp-auth-retry"),f=null,h=null,b=null,c=!1,u=t.interval>0?t.interval:5e3;function a(p,A){return f=Ke[p]?p:"waiting",["waiting","polling","success","error","expired"].forEach(T=>i.classList.toggle("is-"+T,T===f)),s.textContent=A||f==="success"&&t.successMessage||Ke[f],l.setAttribute("role",f==="error"||f==="expired"?"alert":"status"),o.hidden=!((f==="error"||f==="expired")&&typeof t.onRetry=="function"),(f==="success"||f==="error"||f==="expired")&&v(),d}function v(){c=!1,clearTimeout(h),clearTimeout(b)}function y(){c&&(h=setTimeout(x,u))}function x(){c&&Promise.resolve().then(()=>t.poll()).then(p=>{if(c){if(p&&typeof p=="object"&&p.error)throw p.error;p&&typeof p=="object"&&p.interval>0&&(u=p.interval),p===!0||p&&typeof p=="object"&&p.done?(a("success"),typeof t.onSuccess=="function"&&t.onSuccess(p)):y()}}).catch(p=>{c&&(a("error",p&&p.message||(typeof p=="string"?p:"")),typeof t.onError=="function"&&t.onError(p))})}function g(){return typeof t.poll!="function"||(v(),c=!0,a("polling"),t.expiresIn>0&&(b=setTimeout(()=>a("expired"),t.expiresIn*1e3)),y()),d}o.addEventListener("click",()=>{a("waiting"),t.onRetry()});let d={element:i,setState:a,state:()=>f,start:g,stop:v,destroy(){v(),e.innerHTML=""}};return a("waiting"),typeof t.poll=="function"&&t.autoStart!==!1&&g(),d}},Ve={create(e,t){t=t||{},e=E(e);let n=(t.steps||[]).map(s=>typeof s=="string"?{title:s}:s),r=-1;function i(){e.innerHTML='<ol class="mp-steps" aria-label="'+m(t.label||"Progress")+'">'+n.map((s,o)=>{let f=o<r?"complete":o===r?"current":"upcoming";return'<li class="mp-step is-'+f+'"'+(f==="current"?' aria-current="step"':"")+'><span class="mp-step-marker" aria-hidden="true">'+(f==="complete"?"✓":o+1)+'</span><span class="mp-step-title">'+m(s.title)+"</span>"+(f==="complete"?'<span class="mp-sr-only"> (completed)</span>':"")+"</li>"}).join("")+"</ol>"}function l(s,o){if(s<0||s>=n.length||s===r)return r;if(r=s,i(),n.forEach((f,h)=>{let b=E(f.panel);b&&(b.hidden=h!==s)}),!o){let f=E(n[s].panel);f&&t.focus!==!1&&F(f.querySelector("h1, h2, h3, h4, h5, h6, [data-mp-focus]")||f),M("Step "+(s+1)+" of "+n.length+": "+n[s].title),typeof t.onChange=="function"&&t.onChange(s,n[s])}return r}return l(Math.min(Math.max(t.current||0,0),Math.max(n.length-1,0)),!0),{go:s=>l(s),next:()=>l(r+1),prev:()=>l(r-1),current:()=>r,destroy(){e.innerHTML=""}}}};var jt="1.3.0",Ge={version:jt,escapeHtml:m,announce:M,StatusBadge:H,EmptyState:z,Loading:me,View:G,Footer:ge,Tabs:Ce,Theme:we,Toast:K,confirm:ke,Form:Ie,CopyButton:B,copy:le,DeviceList:Be,Skeleton:ce,LogViewer:ze,stripAnsi:Q,Pairing:Fe,Auth:Ue,Steps:Ve,ai:oe};_e();w.MpKit=Ge;})();
13
+ //# sourceMappingURL=kit.min.js.map