@kb-labs/studio-app 2.119.0-canary.e120bc0ee → 2.119.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.
@@ -1,2 +0,0 @@
1
- ._551FIl{align-items:center;display:flex}.mlfd3P{background-color:var(--bg-secondary);border:1px solid var(--border-primary);width:400px;max-height:500px;box-shadow:0 4px 16px var(--shadow);border-radius:8px;flex-direction:column;display:flex}.rVdZ16{border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}._0qFRwF{flex:1;overflow-y:auto}.pCv56C{padding:48px 16px}.F355_f{border-bottom:1px solid var(--border-primary);cursor:pointer;padding:12px 16px;transition:background-color .15s}.F355_f:hover{background-color:var(--bg-hover)}.F355_f.jF9Bzm{background-color:var(--bg-tertiary)}.F355_f.jF9Bzm:hover{background-color:var(--bg-hover)}.wFqce8{gap:8px;display:flex}._4ZGBcj{flex-shrink:0;padding-top:2px}.-Yv9if{flex:1;min-width:0}.tXzAN0{align-items:center;gap:8px;margin-bottom:4px;display:flex}.kPT-eH{margin-left:auto}.dtd2mQ{color:var(--text-primary);word-break:break-word;margin:0;font-size:13px}.pjFmgm{margin-top:4px;font-family:monospace;font-size:11px;display:block}.Tbndlv{flex-shrink:0}.JdylH5{border-top:1px solid var(--border-primary);text-align:center;flex-shrink:0;padding:8px 16px}.yAgqJo{background-color:var(--bg-sidebar);height:calc(100vh - 28px);box-shadow:none;z-index:var(--z-sidebar);border-right:none;flex-direction:column;display:flex;position:fixed;top:0;bottom:28px;left:0;overflow:hidden}.yAgqJo .ant-layout-sider-children{flex-direction:column;height:100%;min-height:0;display:flex}.DxsVOa{flex-shrink:0;align-items:center;gap:4px;padding:12px 12px 4px;display:flex}.ZrmptU{flex-direction:column;padding:4px 0}.iatcBO{cursor:pointer;background:0 0;border:1px solid transparent;border-radius:14px;flex:1;align-items:center;gap:10px;min-width:0;margin:0;padding:8px 10px;transition:background-color .15s,border-color .15s;display:flex}.iatcBO:hover{background-color:var(--bg-hover);border-color:var(--border-primary)}._9hx-za{justify-content:center;width:40px;margin:0 auto;padding:6px}.UccfGt{text-align:left;flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.KT7eUL{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.OBPscq{color:var(--text-tertiary);align-items:center;gap:5px;font-size:11px;display:flex}.MQrR1J{background:var(--success);border-radius:50%;flex-shrink:0;width:6px;height:6px}.P_EGyT{color:var(--text-tertiary);flex-shrink:0}.i-ps0y{border:1px solid var(--border-primary);background:var(--bg-hover);width:calc(100% - 24px);height:34px;color:var(--text-tertiary);cursor:pointer;border-radius:10px;flex-shrink:0;align-items:center;gap:8px;margin:0 12px 8px;padding:0 10px;transition:background-color .15s,border-color .15s;display:flex}.i-ps0y:hover{background-color:var(--bg-tertiary);border-color:var(--text-tertiary)}.qKJzKG{justify-content:center;width:40px;margin:0 auto 8px;padding:0}.iCjJ_C{flex-shrink:0}.lo6S4t{text-align:left;flex:1;font-size:13px}.aSWqvW{background:var(--bg-tertiary);min-width:28px;height:20px;color:var(--text-tertiary);border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0 6px;font-family:ui-monospace,monospace;font-size:11px;display:flex}._90GtEn{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.r-p9ZW{padding:4px 12px;border-right:0!important}.r-p9ZW .ant-menu-item,.r-p9ZW .ant-menu-submenu-title{transition:background-color .15s,color .15s;border-radius:10px!important;height:34px!important;font-weight:400!important;line-height:34px!important}.r-p9ZW .ant-menu-item-selected{position:relative;background-color:var(--accent-subtle)!important;font-weight:500!important}.r-p9ZW .ant-menu-item-selected:before{content:"";background:var(--link);border-radius:0 3px 3px 0;width:3px;position:absolute;top:6px;bottom:6px;left:-12px}._2F5rlo{background-color:var(--bg-sidebar);flex-shrink:0;padding-top:4px}.Ux48UC{align-items:center;gap:4px;padding:4px 8px 8px 0;display:flex}._7e7lD4{flex-direction:column;align-items:center;padding:4px 0 8px}.m27LXt{flex-shrink:0}.SBUMMq{background-color:var(--bg-primary);background-image:radial-gradient(circle at 1px 1px, var(--border-primary) 1px, transparent 0);isolation:isolate;border-left:1px solid var(--border-primary);background-size:28px 28px;border-top-left-radius:20px;min-height:100vh;position:relative}.SBUMMq:before{content:"";background:radial-gradient(circle, var(--link) 0%, transparent 70%);opacity:.07;pointer-events:none;z-index:-1;width:640px;height:640px;position:fixed;top:-15%;right:-10%}.unDxz8{background-color:var(--bg-secondary);border-top:1px solid var(--border-primary);height:28px;z-index:var(--z-sticky);justify-content:space-between;align-items:center;padding:0 8px;font-size:12px;transition:background-color .15s ease-in-out,border-color .15s ease-in-out;display:flex;position:fixed;bottom:0;left:0;right:0}.OwEPmx{align-items:center;display:flex}.KaY1f-{cursor:default;height:28px;color:var(--text-secondary);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:6px;padding:0 12px;font-size:12px;transition:background-color .15s ease-in-out,color .15s ease-in-out;display:flex}.KaY1f-.KbKjcH{cursor:pointer}.KaY1f-.KbKjcH:hover{background-color:var(--bg-hover);color:var(--text-primary)}.E9xwCR{align-items:center;display:flex}.VGaObn .ant-modal-content{box-shadow:0 12px 32px var(--shadow), 0 0 0 1px var(--border-primary);border-radius:12px;overflow:hidden}.GZUwQ4{border-bottom:1px solid var(--border-primary);padding:16px 16px 12px}.GBCUk5{background:var(--bg-tertiary);border-color:transparent}.GBCUk5:hover,.GBCUk5:focus{background:var(--bg-secondary);border-color:var(--link)}.GBCUk5:focus-within{background:var(--bg-secondary);border-color:var(--link)}._8GlQFx{color:var(--text-tertiary)}._5f4z2Y{max-height:400px;overflow-y:auto}.mLOblq{padding:40px 16px}.Qh8-ZH+.Qh8-ZH{border-top:1px solid var(--border-primary)}.bEh-om{letter-spacing:.04em;text-transform:uppercase;color:var(--text-tertiary);padding:8px 16px 4px;font-size:11px;font-weight:600}.z8kzZl{cursor:pointer;border-left:3px solid transparent;padding:12px 16px;transition:background-color .15s,border-color .15s}.z8kzZl.kcvJZE{background-color:var(--bg-tertiary);border-left-color:var(--link)}.xz40I2{border-radius:6px;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.ILjDgd,.OBfHz8{align-items:center;gap:8px;display:flex}.zEjfzz{color:var(--text-secondary);font-size:12px}.F8leI2 .ant-scroll-number{height:18px;box-shadow:none;font-size:11px;line-height:18px}.FmhQSJ{color:var(--text-tertiary);align-items:center;gap:4px;font-size:11px;display:flex}.RzObbz{border-top:1px solid var(--border-primary);color:var(--text-tertiary);justify-content:space-between;align-items:center;padding:12px 16px;font-size:12px;display:flex}.FHi9mM{gap:12px;display:flex}._2qUbHG{align-items:center;gap:4px;display:flex}kbd{background:var(--bg-tertiary);border:1px solid var(--border-primary);border-radius:2px;padding:2px 4px;font-size:11px}.OcJbI-{border-bottom:1px solid transparent;align-items:center;gap:8px;padding:6px 16px;font-size:12px;line-height:1.4;display:flex}.uXgIdZ{color:var(--error);background:rgba(220,38,38,.07);border-color:rgba(220,38,38,.2)}.qVlr2k{color:var(--warning);background:rgba(245,158,11,.07);border-color:rgba(245,158,11,.2)}._1odHlZ{color:var(--info);background:rgba(14,165,233,.07);border-color:rgba(14,165,233,.2)}.CHzWrF{flex-shrink:0;align-items:center;display:flex}.cuz0pG{flex-shrink:0;font-weight:600}._0UeRIY{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.LpeNUE{cursor:pointer;color:inherit;opacity:.75;text-underline-offset:2px;background:0 0;border:none;flex-shrink:0;padding:0 4px;font-size:12px;text-decoration:underline}.LpeNUE:hover{opacity:1}._3Y74-x{cursor:pointer;color:inherit;opacity:.6;background:0 0;border:none;border-radius:3px;flex-shrink:0;align-items:center;padding:2px;display:flex}._3Y74-x:hover{opacity:1;background:rgba(0,0,0,.06)}.xzc-QM{border-bottom:1px solid var(--border-primary);background:var(--bg-tertiary);padding:8px 16px 10px 40px;font-size:12px}.PAhXSL{color:var(--text-secondary);margin:4px 0 0 12px;padding:0;list-style:outside}.PAhXSL li{margin-bottom:2px}.Uwo2uD{background-color:var(--bg-primary);background-image:radial-gradient(circle at 1px 1px, var(--border-primary) 1px, transparent 0);isolation:isolate;background-size:28px 28px;justify-content:center;align-items:center;min-height:100vh;padding:24px;display:flex;position:relative;overflow:hidden}.Uwo2uD:before{content:"";background:radial-gradient(circle, var(--link) 0%, transparent 70%);opacity:.07;pointer-events:none;z-index:-1;width:640px;height:640px;position:absolute;top:-15%;right:-10%}._7V9DVS{background:var(--bg-primary);border:1px solid var(--border-primary);width:100%;max-width:380px;box-shadow:var(--shadow-elevated);border-radius:16px;padding:40px 36px 36px;position:relative;overflow:hidden}._7V9DVS:before{content:"";background:linear-gradient(90deg, var(--link), var(--link-hover));height:3px;position:absolute;top:0;left:0;right:0}._7CviZh{align-items:center;gap:10px;margin-bottom:28px;display:flex}.xkTo5Z{background:linear-gradient(135deg, var(--link), var(--link-hover));width:34px;height:34px;color:var(--text-inverse);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;font-size:14px;font-weight:700;display:flex}.HQyT2m{color:var(--text-primary);margin:0;font-size:16px;font-weight:600;line-height:1.2}.H7ZQfB{color:var(--text-secondary);margin:2px 0 0;font-size:12.5px}._1ZN3w_{color:var(--text-primary);margin:0 0 4px;font-size:20px;font-weight:600}.EIQ3ZL{color:var(--text-secondary);margin:0 0 24px;font-size:13.5px}.z08Zfc{margin-bottom:22px}.mfwQG1 .ant-form-item-label{padding-bottom:6px}.mfwQG1 .ant-form-item-label>label{height:auto;color:var(--text-primary);font-size:13px;font-weight:500}.mfwQG1 .ant-form-item-explain{margin-top:2px;font-size:12px;line-height:1.4}._4IzoT7{color:var(--error);background:rgba(239,68,68,.1);border-radius:8px;margin:0 0 16px;padding:8px 12px;font-size:13px}.raykJq{width:100%;margin-top:8px}._ek-R7{color:var(--text-secondary);align-items:center;gap:10px;margin:22px 0;font-size:12px;display:flex}._ek-R7:before,._ek-R7:after{content:"";background:var(--border-primary);flex:1;height:1px}._89nkeY{border:1px solid var(--border-primary);background:var(--bg-secondary);width:100%;color:var(--text-primary);text-align:center;text-transform:capitalize;box-sizing:border-box;border-radius:8px;justify-content:center;align-items:center;gap:8px;margin-bottom:8px;padding:8px 12px;font-size:13.5px;font-weight:500;text-decoration:none;transition:border-color .15s,background .15s;display:flex}._89nkeY:hover{border-color:var(--link);background:var(--bg-tertiary)}.E7KhRr{border:1px dashed var(--border-primary);width:100%;color:var(--text-tertiary);text-align:center;box-sizing:border-box;cursor:not-allowed;background:0 0;border-radius:8px;justify-content:center;align-items:center;gap:8px;margin:0;padding:8px 12px;font-size:13.5px;font-weight:500;display:flex}._1oZ_w2{background:var(--bg-tertiary);color:var(--text-tertiary);letter-spacing:.02em;text-transform:uppercase;border-radius:999px;align-items:center;gap:3px;margin-left:2px;padding:1px 6px;font-size:10.5px;font-weight:600;display:inline-flex}.platform-pulse{flex-wrap:wrap;align-items:center;gap:24px;display:flex}.platform-pulse__status{align-items:center;gap:8px;display:flex}.platform-pulse__status-label{color:var(--text-primary);font-size:14px;font-weight:600}.platform-pulse__dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.platform-pulse__dot--healthy{background:var(--success)}.platform-pulse__dot--degraded{background:var(--warning)}.platform-pulse__dot--critical{background:var(--error)}.platform-pulse__divider{background:var(--border-primary);align-self:stretch;width:1px}.platform-pulse__metric{align-items:baseline;gap:6px;display:flex}.platform-pulse__value{font-size:20px;font-weight:700;font-family:var(--font-heading);font-variant-numeric:tabular-nums;letter-spacing:-.01em;color:var(--text-primary)}.platform-pulse__label{color:var(--text-tertiary);font-size:13px}.platform-pulse__trend{color:var(--success);font-size:12px;font-weight:600}.platform-pulse__live{letter-spacing:.04em;color:var(--info);align-items:center;gap:6px;margin-left:auto;font-size:12px;font-weight:600;display:flex}.platform-pulse__pulse-dot{background:var(--info);border-radius:50%;width:6px;height:6px;animation:2s infinite platform-pulse-dot}@keyframes platform-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.2)}}.plugin-status-strip{flex-direction:column;gap:12px;width:100%;display:flex}.plugin-status-strip__pulse{flex-wrap:wrap;align-items:center;gap:20px;display:flex}.plugin-status-strip__status{align-items:center;gap:8px;display:flex}.plugin-status-strip__dot{background:var(--success);border-radius:50%;flex-shrink:0;width:8px;height:8px}.plugin-status-strip__dot--error{background:var(--error)}.plugin-status-strip__status-label{color:var(--text-secondary);font-size:13px}.plugin-status-strip__divider{background:var(--border-primary);align-self:stretch;width:1px}.plugin-status-strip__metric{white-space:nowrap;align-items:baseline;gap:6px;display:flex}.plugin-status-strip__value{color:var(--text-primary);font-size:15px;font-weight:600}.plugin-status-strip__label{color:var(--text-tertiary);font-size:13px}.plugin-status-strip__metric--warning .plugin-status-strip__value{color:var(--warning)}.plugin-status-strip__links{align-items:center;gap:20px;display:flex}.plugin-status-strip__links a{color:var(--text-secondary);align-items:center;gap:6px;font-size:13px;display:inline-flex}.oZiHzq{flex-direction:column;height:100%;display:flex;overflow:hidden}.On7tzk{border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);flex-shrink:0;align-items:center;gap:8px;min-height:36px;padding:5px 10px;display:flex}.Vnx_ZA{flex-shrink:0}.VTQNpZ{flex:0 220px}._5vwlO-{flex-wrap:wrap;flex:1;gap:4px;display:flex}.ZNUkRr{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:11px!important}.A3uhyz{color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;border:none;border-radius:3px;flex-shrink:0;padding:2px 4px;font-size:11px;transition:color .15s}.A3uhyz:hover{color:var(--text-primary)}.f0O9qy{font-family:var(--font-mono,"JetBrains Mono", "Fira Code", "Menlo", monospace);flex:1;overflow-y:auto}.qHHgvr{border-bottom:1px solid var(--border-primary);cursor:default;padding:3px 8px}.qHHgvr.ZUlCWZ{cursor:pointer}.qHHgvr.ZUlCWZ:hover{background:var(--bg-hover)}.qHHgvr._8dm9ZA{background:var(--bg-tertiary)}.elnyYo{border-left:2px solid var(--error);background:rgba(220,38,38,.06)}.PUJW-i{border-left:2px solid var(--warning);background:rgba(245,158,11,.06)}.XNRuGR{opacity:.6}.H8lFfF{letter-spacing:.03em;text-transform:uppercase;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;min-width:52px;padding:1px 5px;font-size:10px;font-weight:600;display:inline-flex}._waK-U{color:var(--success);background:rgba(22,163,74,.12)}.fPYEZv{color:var(--warning);background:rgba(245,158,11,.15)}.IJXCYY{color:var(--error);background:rgba(220,38,38,.12)}.HyIqiI{background:var(--bg-tertiary);color:var(--text-secondary)}._2nwsSf{background:var(--bg-tertiary);padding:4px 8px 4px 16px}.KIVqTk{background:var(--bg-primary);border:1px solid var(--border-primary);white-space:pre-wrap;word-break:break-word;color:var(--text-primary);border-radius:4px;margin:0;padding:8px;font-family:inherit;font-size:11px;overflow-x:auto}.tMyCCU{text-align:center;padding:24px 16px}._9QSq4x{z-index:9999;background:var(--bg-spotlight,#1f1f1f);width:96px;height:22px;color:var(--text-inverse);cursor:pointer;letter-spacing:.02em;box-shadow:0 -2px 8px var(--shadow-elevated);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:none;border-radius:6px 6px 0 0;justify-content:center;align-items:center;gap:6px;padding:0 10px;font-size:11px;font-weight:500;transition:bottom .2s;display:flex;position:fixed;left:50%;transform:translate(-50%)}._9QSq4x.tEuxak{border-radius:0 0 6px 6px}._39e6nI{border-left:5px solid transparent;border-right:5px solid transparent;flex-shrink:0;width:0;height:0}._39e6nI._6RYNR_{border-bottom:5px solid var(--text-inverse)}._39e6nI.T7qOeg{border-top:5px solid var(--text-inverse)}.Ce_hKQ{z-index:9998;background:var(--bg-secondary);border-top:1px solid var(--border-primary);box-shadow:0 -4px 20px var(--shadow-elevated);flex-direction:column;display:flex;position:fixed;bottom:0;left:0;right:0;overflow:hidden}.fGSBiQ{cursor:ns-resize;background:0 0;flex-shrink:0;height:6px;position:relative}.OxyMZW{background:var(--border-secondary);pointer-events:none;border-radius:2px;width:36px;height:3px;position:absolute;top:2px;left:50%;transform:translate(-50%)}.PhN5EJ{border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:flex-end;align-items:center;gap:2px;height:28px;padding:0 8px;display:flex}.nFoPgu{cursor:pointer;color:var(--text-secondary);background:0 0;border:none;border-radius:4px;padding:2px 6px;font-size:13px;line-height:1;transition:background .15s,color .15s}.nFoPgu:hover{background:var(--bg-hover);color:var(--text-primary)}.otkcWG{flex:1;overflow:hidden}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:400;src:url(6bb9846031bb03b3.woff2)format("woff2"),url(93ea1e5033675bab.woff)format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:500;src:url(d1eb6e250d92a46a.woff2)format("woff2"),url(6286cecbd758c419.woff)format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:600;src:url(03e99ac36af9610f.woff2)format("woff2"),url(e5a203e29c550c75.woff)format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:700;src:url(047656d93d2f3e30.woff2)format("woff2"),url(f73c013eff2773e8.woff)format("woff")}.uiButton_3Yg7B svg{color:inherit!important;stroke:currentColor!important;fill:currentColor!important}.uiButton_3Yg7B:disabled svg,.uiButton_3Yg7B.ant-btn-disabled svg{opacity:.4}.uiButton_3Yg7B.ant-btn-sm svg{width:14px;height:14px}.uiButton_3Yg7B svg{width:16px;height:16px}.uiButton_3Yg7B.ant-btn-lg svg{width:18px;height:18px}.uiButton_3Yg7B .ant-btn-icon{justify-content:center;align-items:center;display:inline-flex;color:inherit!important}.uiButton_3Yg7B .ant-btn-icon svg{vertical-align:middle;display:block}.uiButton_3Yg7B{transition:transform .1s,box-shadow .15s,opacity .1s}.uiButton_3Yg7B:active:not(:disabled):not(.ant-btn-disabled){transition:transform 60ms;transform:scale(.96)}.uiButton_3Yg7B.ant-btn-primary{transition:transform .15s,box-shadow .15s}.uiButton_3Yg7B.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled){transform:translateY(-1px);box-shadow:0 4px 12px rgba(12,102,255,.3)}.uiButton_3Yg7B.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled){box-shadow:none;transition:transform 60ms;transform:scale(.97)}.uiButton_3Yg7B.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),.uiButton_3Yg7B.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled){opacity:.75}.uiButton_3Yg7B.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),.uiButton_3Yg7B.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled){transform:scale(.95);background:rgba(0,0,0,.06)!important}[dir=rtl] .uiButton_3Yg7B .ant-btn-icon{transform:scaleX(-1)}.card_0vX7-{--card-accent:var(--border-primary);box-shadow:0 1px 2px var(--shadow);transition:box-shadow .2s,transform .2s,border-color .2s;position:relative}.card_0vX7-:before{content:"";background:var(--card-accent);opacity:0;border-radius:0 0 2px 2px;height:2px;transition:opacity .2s;position:absolute;top:0;left:16px;right:16px}.card_0vX7-.accented_yICrq:before{opacity:1}.card_0vX7-.hoverable_NBVEA:hover{box-shadow:0 8px 20px -4px var(--shadow-hover);border-color:var(--border-secondary);transform:translateY(-1px)}.kb-ui-tag_D2ji0{transition:opacity .1s,transform .1s,box-shadow .15s,border-color .15s,background-color .15s,-webkit-filter .15s,filter .15s}.kb-ui-tag_D2ji0:not([disabled]):hover{-webkit-filter:brightness(1.06);filter:brightness(1.06)}.kb-ui-tag--clickable_FGDC8{cursor:pointer}.kb-ui-tag--clickable_FGDC8:not([disabled]):hover{box-shadow:0 2px 8px var(--shadow-hover,rgba(0,0,0,.1));border-color:var(--border-secondary);transform:translateY(-1px)}.kb-ui-tag--clickable_FGDC8:not([disabled]):active{opacity:.7;box-shadow:none;transition:opacity 50ms,transform 50ms;transform:scale(.94)}.uiIcon_k0ec4{vertical-align:middle;justify-content:center;align-items:center;display:inline-flex}.uiIcon_k0ec4 svg{color:currentColor;stroke:currentColor;fill:none;display:block}.uiIcon_k0ec4 .anticon{color:currentColor}.uiIcon_k0ec4.clickable_OssZj{cursor:pointer;transition:opacity .2s,transform .1s}.uiIcon_k0ec4.clickable_OssZj:hover{opacity:.8}.uiIcon_k0ec4.clickable_OssZj:active{transform:scale(.95)}.uiIcon_k0ec4.size-xs_M79Cj{width:12px;height:12px;font-size:12px}.uiIcon_k0ec4.size-sm_10jDl{width:14px;height:14px;font-size:14px}.uiIcon_k0ec4.size-base_h9Lkp{width:16px;height:16px;font-size:16px}.uiIcon_k0ec4.size-lg_O0C5x{width:20px;height:20px;font-size:20px}.uiIcon_k0ec4.size-xl_WXfPC{width:24px;height:24px;font-size:24px}.uiIcon_k0ec4.size-2xl_32DCm{width:32px;height:32px;font-size:32px}.uiIcon_k0ec4.color-primary_h3CLu{color:var(--link,#2563eb)}.uiIcon_k0ec4.color-secondary_4pb5w{color:var(--text-secondary,#6b7280)}.uiIcon_k0ec4.color-success_O8h6-{color:var(--success,#16a34a)}.uiIcon_k0ec4.color-warning_dYWdv{color:var(--warning,#f59e0b)}.uiIcon_k0ec4.color-error_adjhG{color:var(--error,#dc2626)}.uiIcon_k0ec4.color-info_TwzBK{color:var(--info,#0ea5e9)}.uiIcon_k0ec4.color-inherit_YCf-Z{color:inherit}.uiIcon_k0ec4.spin_rwV9G{animation:1s linear infinite uiIconSpin_JA9h9}@keyframes uiIconSpin_JA9h9{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.uiIcon_k0ec4.disabled_sSgts{opacity:.4;cursor:not-allowed;pointer-events:none}.shimmer_Vu6DO{background:linear-gradient(90deg, var(--shimmer-color-1,#888) 0%, var(--shimmer-color-2,#888) 25%, var(--shimmer-highlight,#fff) 50%, var(--shimmer-color-2,#888) 75%, var(--shimmer-color-1,#888) 100%);-webkit-text-fill-color:transparent;color:transparent;animation:shimmerMove_64hFq var(--shimmer-duration,2s) linear infinite;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;display:inline-block}@keyframes shimmerMove_64hFq{0%{background-position:100% 0}to{background-position:-100% 0}}@keyframes skeletonLoading_Cb6ey{0%{background-position:100%}to{background-position:0%}}.skeletonText_D4KLj{animation:1.4s infinite skeletonLoading_Cb6ey}:root{--bg-primary:#f4f5f7;--bg-secondary:#fff;--bg-tertiary:#f3f4f6;--bg-hover:#f3f4f6;--bg-sidebar:#fff;--text-primary:#0f1115;--text-secondary:#5c616d;--text-tertiary:#5c616d;--text-inverse:#fff;--border-primary:#d9dde6;--border-secondary:#c4cad8;--font-body:"Geist Sans", "Inter", "Segoe UI", sans-serif;--font-heading:"Plus Jakarta Sans", "Geist Sans", sans-serif;--link:#0c66ff;--link-hover:#0050cc;--accent-subtle:#dbeafe;--success:#16a34a;--warning:#f59e0b;--error:#dc2626;--info:#0ea5e9;--disabled:#9ca3af;--shadow:rgba(0,0,0,.05);--shadow-hover:rgba(0,0,0,.1);--shadow-elevated:rgba(0,0,0,.08);--z-base:0;--z-dropdown:100;--z-sticky:200;--z-header:300;--z-sidebar:400;--z-overlay:500;--z-modal:600;--z-popover:700;--z-toast:800;--z-top:900}.dark{--bg-primary:#09090b;--bg-secondary:#0f1014;--bg-tertiary:#1a1b22;--bg-hover:#1e2028;--bg-sidebar:#0f1014;--text-primary:#e6eaf4;--text-secondary:#8090a6;--text-tertiary:#8090a6;--text-inverse:#0f1115;--border-primary:#1e2535;--border-secondary:#2c3650;--link:#3a82f6;--link-hover:#60a5fa;--accent-subtle:rgba(58,130,246,.15);--success:#22c55e;--warning:#eab308;--error:#ef4444;--info:#38bdf8;--disabled:#52525b;--shadow:rgba(0,0,0,.6);--shadow-hover:rgba(0,0,0,.8);--shadow-elevated:rgba(255,255,255,.05)}body{background-color:var(--bg-sidebar);color:var(--text-primary);font-family:var(--font-body);-webkit-font-smoothing:antialiased}h1,h2,h3,h4,h5,h6{color:var(--text-primary);font-weight:600;font-family:var(--font-heading);letter-spacing:-.02em}p{color:var(--text-secondary)}a{color:var(--link);text-decoration:none;transition:color .15s ease-in-out}a:hover{color:var(--link-hover)}.text-primary{color:var(--text-primary)}.text-secondary{color:var(--text-secondary)}.text-tertiary{color:var(--text-tertiary)}.border-theme{border-color:var(--border-primary)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-error{color:var(--error)}.text-info{color:var(--info)}.bg-theme-primary{background-color:var(--bg-primary)}.bg-theme-secondary{background-color:var(--bg-secondary)}.bg-theme-tertiary{background-color:var(--bg-tertiary)}:root{--spacing-page:2rem;--spacing-section:1.5rem;--spacing-item:1rem;--spacing-tight:.5rem}.gap-page{gap:var(--spacing-page)}.gap-section{gap:var(--spacing-section)}.gap-item{gap:var(--spacing-item)}.gap-tight{gap:var(--spacing-tight)}:root{--typo-page-title-size:2.25rem;--typo-page-title-line-height:2.5rem;--typo-page-title-weight:700;--typo-section-title-size:1.875rem;--typo-section-title-line-height:2.25rem;--typo-section-title-weight:600;--typo-card-title-size:1.5rem;--typo-card-title-line-height:2rem;--typo-card-title-weight:600;--typo-body-size:1rem;--typo-body-line-height:1.5rem;--typo-body-weight:400;--typo-description-size:.875rem;--typo-description-line-height:1.25rem;--typo-description-weight:400;--typo-label-size:.875rem;--typo-label-line-height:1.25rem;--typo-label-weight:500;--typo-caption-size:.75rem;--typo-caption-line-height:1rem;--typo-caption-weight:400}.typo-page-title{font-size:var(--typo-page-title-size);line-height:var(--typo-page-title-line-height);font-weight:var(--typo-page-title-weight);color:var(--text-primary)}.typo-section-title{font-size:var(--typo-section-title-size);line-height:var(--typo-section-title-line-height);font-weight:var(--typo-section-title-weight);color:var(--text-primary)}.typo-card-title{font-size:var(--typo-card-title-size);line-height:var(--typo-card-title-line-height);font-weight:var(--typo-card-title-weight);color:var(--text-primary)}.typo-body{font-size:var(--typo-body-size);line-height:var(--typo-body-line-height);font-weight:var(--typo-body-weight);color:var(--text-primary)}.typo-description{font-size:var(--typo-description-size);line-height:var(--typo-description-line-height);font-weight:var(--typo-description-weight);color:var(--text-secondary)}.typo-label{font-size:var(--typo-label-size);line-height:var(--typo-label-line-height);font-weight:var(--typo-label-weight);color:var(--text-secondary)}.typo-caption{font-size:var(--typo-caption-size);line-height:var(--typo-caption-line-height);font-weight:var(--typo-caption-weight);color:var(--text-tertiary)}.ant-modal-root .ant-modal-wrap,.ant-modal-root .ant-modal-mask{z-index:var(--z-overlay)!important}.ant-modal-root .ant-modal,.ant-drawer-root .ant-drawer{z-index:var(--z-modal)!important}.ant-select-dropdown,.ant-dropdown,.ant-popover,.ant-tooltip{z-index:var(--z-popover)!important}.ant-message,.ant-notification{z-index:var(--z-toast)!important}.ant-layout-header .ant-btn{vertical-align:middle!important;justify-content:center!important;align-items:center!important;line-height:1!important;display:inline-flex!important}.ant-layout-header .ant-btn .ant-btn-icon{align-items:center!important;line-height:1!important;display:inline-flex!important}.ant-menu-item-group-title{text-transform:uppercase!important;letter-spacing:.04em!important;color:var(--text-tertiary)!important;padding-top:20px!important;padding-bottom:4px!important;font-size:11px!important;font-weight:500!important}.ant-menu-inline-collapsed .ant-menu-item-group-title{display:none!important}.ant-menu-inline-collapsed .ant-menu-item-group-list{padding-top:4px!important}.ant-menu-item,.ant-menu-submenu-title{border-radius:8px!important}.ant-layout{background:var(--bg-sidebar)!important}.menu-item-active,.ant-menu-item-selected{background-color:var(--accent-subtle)!important;color:var(--link)!important}.ant-menu-item-selected>.ant-menu-title-content{color:var(--link)!important}.ant-menu-submenu-selected>.ant-menu-submenu-title{color:var(--text-primary)!important;background-color:transparent!important}.ant-menu-submenu-selected>.ant-menu-submenu-title:hover{background-color:var(--bg-hover)!important;color:var(--text-primary)!important}.dark .menu-item-active,.dark .ant-menu-item-selected{color:var(--link)!important;background-color:rgba(96,165,250,.25)!important}.dark .ant-menu-item-selected>.ant-menu-title-content{color:var(--link)!important}.dark .ant-menu-submenu-selected>.ant-menu-submenu-title{color:var(--text-primary)!important;background-color:transparent!important}.dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover{background-color:var(--bg-hover)!important;color:var(--text-primary)!important}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled),.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) span,.ant-pagination-item-active a{color:var(--text-inverse)!important}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-submenu-title-selected{background-color:var(--accent-subtle)!important;color:var(--link)!important}.ant-dropdown-menu-item-selected .ant-dropdown-menu-title-content,.ant-dropdown-menu-submenu-title-selected .ant-dropdown-menu-title-content{color:var(--link)!important}.dark .ant-dropdown-menu-item-selected,.dark .ant-dropdown-menu-submenu-title-selected{color:var(--link-hover)!important;background-color:rgba(96,165,250,.15)!important}.dark .ant-dropdown-menu-item-selected .ant-dropdown-menu-title-content,.dark .ant-dropdown-menu-submenu-title-selected .ant-dropdown-menu-title-content{color:var(--link-hover)!important}.dark .ant-card{box-shadow:0 1px 3px var(--shadow), 0 0 0 1px var(--shadow-elevated)}.dark .ant-card:hover{box-shadow:0 2px 8px var(--shadow-hover), 0 0 0 1px var(--shadow-elevated)}.dark .ant-dropdown{box-shadow:0 4px 16px var(--shadow), 0 0 0 1px var(--shadow-elevated)!important}.dark .ant-popover{box-shadow:0 4px 16px var(--shadow), 0 0 0 1px var(--shadow-elevated)!important}.dark .ant-select-dropdown{box-shadow:0 4px 16px var(--shadow), 0 0 0 1px var(--shadow-elevated)!important}.dark .ant-btn:not(.ant-btn-primary):not(.ant-btn-text):hover{background-color:var(--bg-hover)!important;border-color:var(--border-secondary)!important}.dark .ant-table-tbody>tr.ant-table-row:hover>td{background-color:var(--bg-hover)!important}.dark .ant-table-thead>tr>th:hover{background-color:var(--bg-tertiary)!important}.dark a:not(.ant-btn){color:var(--link)}.dark a:not(.ant-btn):hover{color:var(--link-hover)}.dark .ant-btn-link{color:var(--link)!important}.dark .ant-btn-link:hover{color:var(--link-hover)!important}.dark .ant-btn-link:not(:disabled):not(.ant-btn-disabled){color:var(--link)!important}.dark .ant-btn-link:not(:disabled):not(.ant-btn-disabled):hover{color:var(--link-hover)!important}html.compact-mode{--ant-padding:12px;--ant-padding-lg:16px;--ant-padding-sm:8px;--ant-margin:12px;--ant-margin-lg:16px;--ant-margin-sm:8px}html.font-small,html.font-small .ant-typography{font-size:13px}html.font-small h1,html.font-small .ant-typography h1{font-size:32px!important}html.font-small h2,html.font-small .ant-typography h2{font-size:26px!important}html.font-small h3,html.font-small .ant-typography h3{font-size:20px!important}html.font-small h4,html.font-small .ant-typography h4{font-size:17px!important}html.font-small h5,html.font-small .ant-typography h5{font-size:14px!important}html.font-medium{font-size:14px}html.font-large,html.font-large .ant-typography{font-size:16px}html.font-large h1,html.font-large .ant-typography h1{font-size:42px!important}html.font-large h2,html.font-large .ant-typography h2{font-size:34px!important}html.font-large h3,html.font-large .ant-typography h3{font-size:28px!important}html.font-large h4,html.font-large .ant-typography h4{font-size:22px!important}html.font-large h5,html.font-large .ant-typography h5{font-size:18px!important}*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::-ms-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button{-webkit-appearance:button;background-color:transparent;background-image:none}input:where([type=button]){-webkit-appearance:button;background-color:transparent;background-image:none}input:where([type=reset]){-webkit-appearance:button;background-color:transparent;background-image:none}input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::-webkit-input-placeholder{opacity:1;color:#9ca3af}input::-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder{opacity:1;color:#9ca3af}textarea::-webkit-input-placeholder{opacity:1;color:#9ca3af}textarea::-ms-input-placeholder{opacity:1;color:#9ca3af}textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.border{border-width:1px}.font-medium{font-weight:500}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1), 0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent), var(--tw-ring-shadow,0 0 transparent), var(--tw-shadow)}.outline{outline-style:solid}.invert{--tw-invert:invert(100%);-webkit-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{-webkit-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,-webkit-text-decoration-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,-webkit-filter,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}
2
- /*# sourceMappingURL=main.c3a0243c.css.map*/
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.c3a0243c.css","sources":["webpack://@kb-labs/studio-app/./src/components/ui/kb-notification-bell.module.css","webpack://@kb-labs/studio-app/./src/components/ui/kb-sidebar.module.css","webpack://@kb-labs/studio-app/./src/components/ui/kb-page-layout.module.css","webpack://@kb-labs/studio-app/./src/components/ui/kb-status-bar.module.css","webpack://@kb-labs/studio-app/./src/components/ui/kb-quick-search.module.css","webpack://@kb-labs/studio-app/./src/components/health-banner.module.css","webpack://@kb-labs/studio-app/./src/pages/login-page.module.css","webpack://@kb-labs/studio-app/./src/modules/dashboard/components/PlatformPulse.css","webpack://@kb-labs/studio-app/./src/modules/plugins/components/plugin-detail/plugin-status-strip.css","webpack://@kb-labs/studio-app/./src/components/devtools/devtools-log-feed.module.css","webpack://@kb-labs/studio-app/./src/components/devtools/devtools-panel.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIButton.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UICard.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UITag.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIIcon.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/core/UIShimmerText.module.css","webpack://@kb-labs/studio-app/kb-css-modules-css:/home/runner/work/kb-labs/kb-labs/studio/ui-kit/src/feedback/UISkeleton.module.css","webpack://@kb-labs/studio-app/./src/styles/variables.css","webpack://@kb-labs/studio-app/./src/styles/base.css","webpack://@kb-labs/studio-app/./src/styles/antd-overrides.css","webpack://@kb-labs/studio-app/./src/styles/settings.css","webpack://@kb-labs/studio-app/./src/index.css"],"sourcesContent":[".bell {\n display: flex;\n align-items: center;\n}\n\n.panel {\n width: 400px;\n max-height: 500px;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: 8px;\n box-shadow: 0 4px 16px var(--shadow);\n}\n\n.panelHeader {\n padding: 12px 16px;\n border-bottom: 1px solid var(--border-primary);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.panelList {\n overflow-y: auto;\n flex: 1;\n}\n\n.emptyState {\n padding: 48px 16px;\n}\n\n.notifItem {\n padding: 12px 16px;\n border-bottom: 1px solid var(--border-primary);\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.notifItem:hover {\n background-color: var(--bg-hover);\n}\n\n.notifItem.unread {\n background-color: var(--bg-tertiary);\n}\n\n.notifItem.unread:hover {\n background-color: var(--bg-hover);\n}\n\n.notifRow {\n display: flex;\n gap: 8px;\n}\n\n.notifIcon {\n flex-shrink: 0;\n padding-top: 2px;\n}\n\n.notifBody {\n flex: 1;\n min-width: 0;\n}\n\n.notifMeta {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.notifTime {\n margin-left: auto;\n}\n\n.notifMessage {\n margin: 0;\n font-size: 13px;\n color: var(--text-primary);\n word-break: break-word;\n}\n\n.notifExecId {\n font-size: 11px;\n font-family: monospace;\n display: block;\n margin-top: 4px;\n}\n\n.notifClear {\n flex-shrink: 0;\n}\n\n.panelFooter {\n padding: 8px 16px;\n border-top: 1px solid var(--border-primary);\n text-align: center;\n flex-shrink: 0;\n}\n",".sider {\n overflow: hidden;\n height: calc(100vh - 28px);\n position: fixed;\n left: 0;\n top: 0;\n bottom: 28px;\n background-color: var(--bg-sidebar);\n border-right: none;\n box-shadow: none;\n z-index: var(--z-sidebar);\n display: flex;\n flex-direction: column;\n}\n\n/* AntSider wraps children in its own block-level container — without this,\n .scrollArea's flex:1 has no flex parent to size against, so it grows to\n fit content instead of the available space, and overflow silently clips\n against .sider's own overflow:hidden instead of scrolling. */\n.sider :global(.ant-layout-sider-children) {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n.profileRow {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 12px 12px 4px;\n}\n\n.profileRowCollapsed {\n flex-direction: column;\n padding: 4px 0 4px;\n}\n\n.profileCard {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n padding: 8px 10px;\n border-radius: 14px;\n border: 1px solid transparent;\n background: transparent;\n cursor: pointer;\n transition: background-color 150ms ease, border-color 150ms ease;\n}\n\n.profileCard:hover {\n background-color: var(--bg-hover);\n border-color: var(--border-primary);\n}\n\n.profileCardCollapsed {\n width: 40px;\n margin: 0 auto;\n padding: 6px;\n justify-content: center;\n}\n\n.profileMeta {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 1px;\n text-align: left;\n}\n\n.profileName {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.profileStatus {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n color: var(--text-tertiary);\n}\n\n.profileStatusDot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--success);\n flex-shrink: 0;\n}\n\n.profileChevron {\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n\n.searchTrigger {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n width: calc(100% - 24px);\n margin: 0 12px 8px;\n height: 34px;\n padding: 0 10px;\n border-radius: 10px;\n border: 1px solid var(--border-primary);\n background: var(--bg-hover);\n color: var(--text-tertiary);\n cursor: pointer;\n transition: background-color 150ms ease, border-color 150ms ease;\n}\n\n.searchTrigger:hover {\n background-color: var(--bg-tertiary);\n border-color: var(--text-tertiary);\n}\n\n.searchTriggerCollapsed {\n width: 40px;\n margin: 0 auto 8px;\n padding: 0;\n justify-content: center;\n}\n\n.searchIcon {\n flex-shrink: 0;\n}\n\n.searchLabel {\n flex: 1;\n text-align: left;\n font-size: 13px;\n}\n\n.kbd {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 6px;\n border-radius: 6px;\n background: var(--bg-tertiary);\n color: var(--text-tertiary);\n font-size: 11px;\n font-family: ui-monospace, monospace;\n flex-shrink: 0;\n}\n\n.scrollArea {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.menu {\n border-right: 0 !important;\n padding: 4px 12px;\n}\n\n.menu :global(.ant-menu-item),\n.menu :global(.ant-menu-submenu-title) {\n border-radius: 10px !important;\n height: 34px !important;\n line-height: 34px !important;\n font-weight: 400 !important;\n transition: background-color 150ms ease, color 150ms ease;\n}\n\n.menu :global(.ant-menu-item-selected) {\n position: relative;\n font-weight: 500 !important;\n background-color: var(--accent-subtle) !important;\n}\n\n.menu :global(.ant-menu-item-selected)::before {\n content: '';\n position: absolute;\n left: -12px;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--link);\n}\n\n.bottomStack {\n flex-shrink: 0;\n background-color: var(--bg-sidebar);\n padding-top: 4px;\n}\n\n.settingsRow {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px 8px 0;\n}\n\n.settingsRowCollapsed {\n flex-direction: column;\n align-items: center;\n padding: 4px 0 8px;\n}\n\n.collapseButton {\n flex-shrink: 0;\n}\n",".content {\n position: relative;\n min-height: 100vh;\n background-color: var(--bg-primary);\n background-image: radial-gradient(circle at 1px 1px, var(--border-primary) 1px, transparent 0);\n background-size: 28px 28px;\n isolation: isolate;\n border-left: 1px solid var(--border-primary);\n border-top-left-radius: 20px;\n}\n\n.content::before {\n content: '';\n position: fixed;\n top: -15%;\n right: -10%;\n width: 640px;\n height: 640px;\n background: radial-gradient(circle, var(--link) 0%, transparent 70%);\n opacity: 0.07;\n pointer-events: none;\n z-index: -1;\n}\n",".bar {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 28px;\n background-color: var(--bg-secondary);\n border-top: 1px solid var(--border-primary);\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n z-index: var(--z-sticky);\n font-size: 12px;\n transition: background-color 150ms ease-in-out, border-color 150ms ease-in-out;\n}\n\n.side {\n display: flex;\n align-items: center;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n height: 28px;\n font-size: 12px;\n cursor: default;\n color: var(--text-secondary);\n transition: background-color 150ms ease-in-out, color 150ms ease-in-out;\n border-radius: 4px;\n user-select: none;\n}\n\n.item.clickable {\n cursor: pointer;\n}\n\n.item.clickable:hover {\n background-color: var(--bg-hover);\n color: var(--text-primary);\n}\n\n.itemIcon {\n display: flex;\n align-items: center;\n}\n",".modal :global(.ant-modal-content) {\n overflow: hidden;\n border-radius: 12px;\n box-shadow: 0 12px 32px var(--shadow), 0 0 0 1px var(--border-primary);\n}\n\n.searchWrap {\n padding: 16px 16px 12px;\n border-bottom: 1px solid var(--border-primary);\n}\n\n.searchInput {\n background: var(--bg-tertiary);\n border-color: transparent;\n}\n\n.searchInput:hover,\n.searchInput:focus,\n.searchInput:focus-within {\n background: var(--bg-secondary);\n border-color: var(--link);\n}\n\n.escHint {\n color: var(--text-tertiary);\n}\n\n.list {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.emptyState {\n padding: 40px 16px;\n}\n\n.section + .section {\n border-top: 1px solid var(--border-primary);\n}\n\n.sectionHeader {\n padding: 8px 16px 4px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.resultItem {\n padding: 12px 16px;\n cursor: pointer;\n border-left: 3px solid transparent;\n transition: background-color 0.15s, border-color 0.15s;\n}\n\n.resultItem.selected {\n background-color: var(--bg-tertiary);\n border-left-color: var(--link);\n}\n\n.categoryIcon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.itemTitle {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.itemDesc {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.itemDescText {\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.itemBadge :global(.ant-scroll-number) {\n font-size: 11px;\n height: 18px;\n line-height: 18px;\n box-shadow: none;\n}\n\n.enterHint {\n font-size: 11px;\n color: var(--text-tertiary);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.footer {\n padding: 12px 16px;\n border-top: 1px solid var(--border-primary);\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n color: var(--text-tertiary);\n}\n\n.footerLeft {\n display: flex;\n gap: 12px;\n}\n\n.footerHint {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\nkbd {\n padding: 2px 4px;\n background: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: 2px;\n font-size: 11px;\n}\n","/* ── Health banner — compact top strip ───────────────────────────────── */\n\n.strip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n font-size: 12px;\n line-height: 1.4;\n border-bottom: 1px solid transparent;\n}\n\n.stripError {\n background: rgba(220, 38, 38, 0.07);\n border-color: rgba(220, 38, 38, 0.2);\n color: var(--error);\n}\n\n.stripWarning {\n background: rgba(245, 158, 11, 0.07);\n border-color: rgba(245, 158, 11, 0.2);\n color: var(--warning);\n}\n\n.stripInfo {\n background: rgba(14, 165, 233, 0.07);\n border-color: rgba(14, 165, 233, 0.2);\n color: var(--info);\n}\n\n.icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n}\n\n.message {\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.description {\n color: var(--text-secondary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detailsBtn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: inherit;\n opacity: 0.75;\n padding: 0 4px;\n flex-shrink: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.detailsBtn:hover {\n opacity: 1;\n}\n\n.retryBtn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n color: inherit;\n opacity: 0.6;\n flex-shrink: 0;\n border-radius: 3px;\n}\n\n.retryBtn:hover {\n opacity: 1;\n background: rgba(0, 0, 0, 0.06);\n}\n\n/* ── Expanded details panel ──────────────────────────────────────────── */\n\n.details {\n padding: 8px 16px 10px 40px;\n font-size: 12px;\n border-bottom: 1px solid var(--border-primary);\n background: var(--bg-tertiary);\n}\n\n.detailsList {\n margin: 4px 0 0 12px;\n padding: 0;\n list-style: disc;\n color: var(--text-secondary);\n}\n\n.detailsList li {\n margin-bottom: 2px;\n}\n","/* ── Login page ───────────────────────────────────────────────────────── */\n\n.screen {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 24px;\n background-color: var(--bg-primary);\n background-image: radial-gradient(circle at 1px 1px, var(--border-primary) 1px, transparent 0);\n background-size: 28px 28px;\n isolation: isolate;\n overflow: hidden;\n}\n\n.screen::before {\n content: '';\n position: absolute;\n top: -15%;\n right: -10%;\n width: 640px;\n height: 640px;\n background: radial-gradient(circle, var(--link) 0%, transparent 70%);\n opacity: 0.07;\n pointer-events: none;\n z-index: -1;\n}\n\n.card {\n position: relative;\n width: 100%;\n max-width: 380px;\n background: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: 16px;\n padding: 40px 36px 36px;\n box-shadow: var(--shadow-elevated);\n overflow: hidden;\n}\n\n.card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: linear-gradient(90deg, var(--link), var(--link-hover));\n}\n\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 28px;\n}\n\n.mark {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 8px;\n background: linear-gradient(135deg, var(--link), var(--link-hover));\n color: var(--text-inverse);\n font-weight: 700;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n line-height: 1.2;\n}\n\n.subtitle {\n margin: 2px 0 0;\n font-size: 12.5px;\n color: var(--text-secondary);\n}\n\n.heading {\n margin: 0 0 4px;\n font-size: 20px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.lede {\n margin: 0 0 24px;\n font-size: 13.5px;\n color: var(--text-secondary);\n}\n\n/* AntD injects a hidden .ant-form-item-margin-offset sibling that mirrors\n and cancels out any margin-bottom set on .ant-form-item itself (their\n anti-collapse trick for the error-message height animation) — so spacing\n between fields has to live on a plain wrapper div instead. */\n.fieldWrap {\n margin-bottom: 22px;\n}\n\n.field :global(.ant-form-item-label) {\n padding-bottom: 6px;\n}\n\n.field :global(.ant-form-item-label > label) {\n height: auto;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary);\n}\n\n.field :global(.ant-form-item-explain) {\n margin-top: 2px;\n font-size: 12px;\n line-height: 1.4;\n}\n\n.error {\n margin: 0 0 16px;\n padding: 8px 12px;\n border-radius: 8px;\n background: rgba(239, 68, 68, 0.1);\n color: var(--error);\n font-size: 13px;\n}\n\n.submit {\n width: 100%;\n margin-top: 8px;\n}\n\n.divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 22px 0;\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.divider::before,\n.divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--border-primary);\n}\n\n.providerLink {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n margin-bottom: 8px;\n border-radius: 8px;\n border: 1px solid var(--border-primary);\n background: var(--bg-secondary);\n color: var(--text-primary);\n font-weight: 500;\n font-size: 13.5px;\n text-align: center;\n text-decoration: none;\n text-transform: capitalize;\n box-sizing: border-box;\n transition: border-color 150ms ease, background 150ms ease;\n}\n\n.providerLink:hover {\n border-color: var(--link);\n background: var(--bg-tertiary);\n}\n\n.providerLinkDisabled {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n margin: 0;\n border-radius: 8px;\n border: 1px dashed var(--border-primary);\n background: transparent;\n color: var(--text-tertiary);\n font-weight: 500;\n font-size: 13.5px;\n text-align: center;\n box-sizing: border-box;\n cursor: not-allowed;\n}\n\n.soonBadge {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n margin-left: 2px;\n padding: 1px 6px;\n border-radius: 999px;\n background: var(--bg-tertiary);\n color: var(--text-tertiary);\n font-size: 10.5px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n",".platform-pulse {\n display: flex;\n align-items: center;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.platform-pulse__status {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.platform-pulse__status-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.platform-pulse__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.platform-pulse__dot--healthy { background: var(--success); }\n.platform-pulse__dot--degraded { background: var(--warning); }\n.platform-pulse__dot--critical { background: var(--error); }\n\n.platform-pulse__divider {\n width: 1px;\n align-self: stretch;\n background: var(--border-primary);\n}\n\n.platform-pulse__metric {\n display: flex;\n align-items: baseline;\n gap: 6px;\n}\n\n.platform-pulse__value {\n font-size: 20px;\n font-weight: 700;\n font-family: var(--font-heading);\n font-variant-numeric: tabular-nums;\n letter-spacing: -0.01em;\n color: var(--text-primary);\n}\n\n.platform-pulse__label {\n font-size: 13px;\n color: var(--text-tertiary);\n}\n\n.platform-pulse__trend {\n font-size: 12px;\n font-weight: 600;\n color: var(--success);\n}\n\n.platform-pulse__live {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.04em;\n color: var(--info);\n}\n\n.platform-pulse__pulse-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--info);\n animation: platform-pulse-dot 2s infinite;\n}\n\n@keyframes platform-pulse-dot {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.2); }\n}\n",".plugin-status-strip {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n}\n\n.plugin-status-strip__pulse {\n display: flex;\n align-items: center;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.plugin-status-strip__status {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.plugin-status-strip__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--success);\n}\n\n.plugin-status-strip__dot--error {\n background: var(--error);\n}\n\n.plugin-status-strip__status-label {\n font-size: 13px;\n color: var(--text-secondary);\n}\n\n.plugin-status-strip__divider {\n width: 1px;\n align-self: stretch;\n background: var(--border-primary);\n}\n\n.plugin-status-strip__metric {\n display: flex;\n align-items: baseline;\n gap: 6px;\n white-space: nowrap;\n}\n\n.plugin-status-strip__value {\n font-size: 15px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.plugin-status-strip__label {\n font-size: 13px;\n color: var(--text-tertiary);\n}\n\n.plugin-status-strip__metric--warning .plugin-status-strip__value {\n color: var(--warning);\n}\n\n.plugin-status-strip__links {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.plugin-status-strip__links a {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary);\n}\n","/* ── Log feed container ──────────────────────────────────────────────── */\n\n.container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* ── Toolbar ─────────────────────────────────────────────────────────── */\n\n.toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 10px;\n border-bottom: 1px solid var(--border-primary);\n flex-shrink: 0;\n min-height: 36px;\n background: var(--bg-secondary);\n}\n\n.toolbarTitle {\n flex-shrink: 0;\n}\n\n.toolbarSearch {\n flex: 0 1 220px;\n}\n\n.toolbarChips {\n flex: 1;\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.chip {\n cursor: pointer;\n user-select: none;\n font-size: 11px !important;\n}\n\n.clearBtn {\n font-size: 11px;\n color: var(--text-secondary);\n cursor: pointer;\n flex-shrink: 0;\n user-select: none;\n background: none;\n border: none;\n padding: 2px 4px;\n border-radius: 3px;\n transition: color 0.15s;\n}\n\n.clearBtn:hover {\n color: var(--text-primary);\n}\n\n/* ── Log list ────────────────────────────────────────────────────────── */\n\n.logList {\n flex: 1;\n overflow-y: auto;\n font-family: var(--font-mono, 'JetBrains Mono', 'Fira Code', 'Menlo', monospace);\n}\n\n/* ── Log row ─────────────────────────────────────────────────────────── */\n\n.row {\n padding: 3px 8px;\n border-bottom: 1px solid var(--border-primary);\n cursor: default;\n}\n\n.row.clickable {\n cursor: pointer;\n}\n\n.row.clickable:hover {\n background: var(--bg-hover);\n}\n\n.row.expanded {\n background: var(--bg-tertiary);\n}\n\n.rowError {\n background: rgba(220, 38, 38, 0.06);\n border-left: 2px solid var(--error);\n}\n\n.rowWarning {\n background: rgba(245, 158, 11, 0.06);\n border-left: 2px solid var(--warning);\n}\n\n.rowPending {\n opacity: 0.6;\n}\n\n/* ── Status badge ────────────────────────────────────────────────────── */\n\n.statusBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 52px;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.statusSuccess {\n background: rgba(22, 163, 74, 0.12);\n color: var(--success);\n}\n\n.statusWarning {\n background: rgba(245, 158, 11, 0.15);\n color: var(--warning);\n}\n\n.statusError {\n background: rgba(220, 38, 38, 0.12);\n color: var(--error);\n}\n\n.statusPending {\n background: var(--bg-tertiary);\n color: var(--text-secondary);\n}\n\n/* ── Expand detail ───────────────────────────────────────────────────── */\n\n.detail {\n padding: 4px 8px 4px 16px;\n background: var(--bg-tertiary);\n}\n\n.detailPre {\n margin: 0;\n padding: 8px;\n background: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: 4px;\n font-size: 11px;\n font-family: inherit;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--text-primary);\n}\n\n/* ── Empty state ─────────────────────────────────────────────────────── */\n\n.empty {\n padding: 24px 16px;\n text-align: center;\n}\n","/* ── Toggle button ───────────────────────────────────────────────────── */\n\n.toggleBtn {\n position: fixed;\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n transition: bottom 0.2s ease;\n width: 96px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 0 10px;\n background: var(--bg-spotlight, #1f1f1f);\n color: var(--text-inverse);\n border: none;\n cursor: pointer;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.02em;\n box-shadow: 0 -2px 8px var(--shadow-elevated);\n user-select: none;\n border-radius: 6px 6px 0 0;\n}\n\n.toggleBtn.open {\n border-radius: 0 0 6px 6px;\n}\n\n.toggleArrow {\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n flex-shrink: 0;\n}\n\n.toggleArrow.arrowUp {\n border-bottom: 5px solid var(--text-inverse);\n}\n\n.toggleArrow.arrowDown {\n border-top: 5px solid var(--text-inverse);\n}\n\n/* ── Floating panel ──────────────────────────────────────────────────── */\n\n.panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 9998;\n background: var(--bg-secondary);\n border-top: 1px solid var(--border-primary);\n box-shadow: 0 -4px 20px var(--shadow-elevated);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* ── Drag handle ─────────────────────────────────────────────────────── */\n\n.dragHandle {\n height: 6px;\n cursor: ns-resize;\n background: transparent;\n flex-shrink: 0;\n position: relative;\n}\n\n.dragGrip {\n position: absolute;\n top: 2px;\n left: 50%;\n transform: translateX(-50%);\n width: 36px;\n height: 3px;\n border-radius: 2px;\n background: var(--border-secondary);\n pointer-events: none;\n}\n\n/* ── Top bar ─────────────────────────────────────────────────────────── */\n\n.topBar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 0 8px;\n height: 28px;\n border-bottom: 1px solid var(--border-primary);\n flex-shrink: 0;\n}\n\n.iconBtn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 2px 6px;\n font-size: 13px;\n color: var(--text-secondary);\n border-radius: 4px;\n line-height: 1;\n transition: background 0.15s, color 0.15s;\n}\n\n.iconBtn:hover {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n/* ── Content ─────────────────────────────────────────────────────────── */\n\n.content {\n flex: 1;\n overflow: hidden;\n}\n","/**\n * UIButton styles - Proper SVG icon theming\n *\n * This ensures all SVG icons (lucide-react, etc.) inherit colors from CSS variables\n * and work correctly in both light and dark themes.\n *\n * `.ant-btn-*` / `.ant-btn-icon` are Ant Design's own (unscoped) classes on the\n * rendered DOM — wrapped in :global() so CSS Modules doesn't hash them away\n * from under the real selectors.\n */\n\n.uiButton_3Yg7B {\n /* Button inherits theme colors from Ant Design tokens */\n}\n\n/*\n * CRITICAL: SVG icon color inheritance\n *\n * Force all SVG icons to inherit button text color automatically\n * Works for lucide-react, heroicons, and any other icon libraries\n */\n.uiButton_3Yg7B svg {\n color: inherit !important;\n stroke: currentColor !important;\n fill: currentColor !important;\n}\n\n/*\n * Disabled state - reduce opacity\n */\n.uiButton_3Yg7B:disabled svg,\n.uiButton_3Yg7B.ant-btn-disabled svg {\n opacity: 0.4;\n}\n\n/*\n * Size variants - ensure SVG scales properly\n */\n.uiButton_3Yg7B.ant-btn-sm svg {\n /* Small button icons */\n width: 14px;\n height: 14px;\n}\n\n.uiButton_3Yg7B svg {\n /* Default (middle) button icons */\n width: 16px;\n height: 16px;\n}\n\n.uiButton_3Yg7B.ant-btn-lg svg {\n /* Large button icons */\n width: 18px;\n height: 18px;\n}\n\n/*\n * Icon positioning within button\n * Ensures proper spacing between icon and text\n */\n.uiButton_3Yg7B .ant-btn-icon {\n /* Icon wrapper - CRITICAL: must inherit color for SVG to get correct color */\n color: inherit !important;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.uiButton_3Yg7B .ant-btn-icon svg {\n /* SVG inside icon wrapper */\n vertical-align: middle;\n display: block; /* Remove inline spacing */\n}\n\n/*\n * All buttons — base transition and press feedback\n */\n.uiButton_3Yg7B {\n transition: transform 100ms ease, box-shadow 150ms ease, opacity 100ms ease;\n}\n\n.uiButton_3Yg7B:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.96);\n transition: transform 60ms ease;\n}\n\n/*\n * Primary button — subtle lift on hover, snap back on press\n */\n.uiButton_3Yg7B.ant-btn-primary {\n transition: transform 150ms ease, box-shadow 150ms ease;\n}\n\n.uiButton_3Yg7B.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);\n}\n\n.uiButton_3Yg7B.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {\n transform: scale(0.97);\n box-shadow: none;\n transition: transform 60ms ease;\n}\n\n/*\n * Default / dashed — dim on press\n */\n.uiButton_3Yg7B.ant-btn-default:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton_3Yg7B.ant-btn-dashed:active:not(:disabled):not(.ant-btn-disabled) {\n opacity: 0.75;\n}\n\n/*\n * Text / link — background flash on press for clear tactile signal\n */\n.uiButton_3Yg7B.ant-btn-text:active:not(:disabled):not(.ant-btn-disabled),\n.uiButton_3Yg7B.ant-btn-link:active:not(:disabled):not(.ant-btn-disabled) {\n background: rgba(0, 0, 0, 0.06) !important;\n transform: scale(0.95);\n}\n\n/*\n * RTL (Right-to-Left) support\n */\n[dir='rtl'] .uiButton_3Yg7B .ant-btn-icon {\n /* Mirror icon position in RTL */\n transform: scaleX(-1);\n}\n",".card_0vX7- {\n --card-accent: var(--border-primary);\n box-shadow: 0 1px 2px var(--shadow);\n transition: box-shadow 200ms ease, transform 200ms ease, border-color 200ms ease;\n position: relative;\n}\n\n.card_0vX7-::before {\n content: '';\n position: absolute;\n top: 0;\n left: 16px;\n right: 16px;\n height: 2px;\n border-radius: 0 0 2px 2px;\n background: var(--card-accent);\n opacity: 0;\n transition: opacity 200ms ease;\n}\n\n.card_0vX7-.accented_yICrq::before {\n opacity: 1;\n}\n\n.card_0vX7-.hoverable_NBVEA:hover {\n box-shadow: 0 8px 20px -4px var(--shadow-hover);\n border-color: var(--border-secondary);\n transform: translateY(-1px);\n}\n","/*\n * UITag styles — interactive feedback for clickable tags\n */\n\n.kb-ui-tag_D2ji0 {\n transition: opacity 100ms ease, transform 100ms ease, box-shadow 150ms ease, border-color 150ms ease, background-color 150ms ease, filter 150ms ease;\n}\n\n/*\n * All tags, even plain informational ones (e.g. capability badges on a\n * card), get a subtle brightness lift on hover so the whole UI feels alive.\n */\n.kb-ui-tag_D2ji0:not([disabled]):hover {\n filter: brightness(1.06);\n}\n\n/* Tags with an onClick additionally get lift/press feedback — they're pressable. */\n.kb-ui-tag--clickable_FGDC8 {\n cursor: pointer;\n}\n\n.kb-ui-tag--clickable_FGDC8:not([disabled]):hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px var(--shadow-hover, rgba(0, 0, 0, 0.1));\n border-color: var(--border-secondary);\n}\n\n.kb-ui-tag--clickable_FGDC8:not([disabled]):active {\n opacity: 0.7;\n transform: scale(0.94);\n box-shadow: none;\n transition: opacity 50ms ease, transform 50ms ease;\n}\n","/**\n * UIIcon styles - Proper SVG and icon font theming\n *\n * Ensures all icons (Ant Design icons, lucide-react, custom SVG)\n * inherit colors from CSS variables and work in both light and dark themes.\n */\n\n.uiIcon_k0ec4 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n}\n\n/*\n * SVG icons (lucide-react, custom SVG)\n * Use currentColor to inherit from parent color\n */\n.uiIcon_k0ec4 svg {\n color: currentColor;\n stroke: currentColor;\n fill: none; /* Most icon libraries use stroke, not fill */\n display: block; /* Remove inline spacing */\n}\n\n/*\n * Ant Design icons (icon fonts)\n * Already use currentColor by default, but ensure it's explicit\n * `.anticon` is Ant Design's own (unscoped) class — wrapped in :global()\n * so CSS Modules doesn't hash it away from the real DOM class.\n */\n.uiIcon_k0ec4 .anticon {\n color: currentColor;\n}\n\n/*\n * Clickable icons (icon buttons)\n */\n.uiIcon_k0ec4.clickable_OssZj {\n cursor: pointer;\n transition: opacity 0.2s ease, transform 0.1s ease;\n}\n\n.uiIcon_k0ec4.clickable_OssZj:hover {\n opacity: 0.8;\n}\n\n.uiIcon_k0ec4.clickable_OssZj:active {\n transform: scale(0.95);\n}\n\n/*\n * Size variants\n */\n.uiIcon_k0ec4.size-xs_M79Cj {\n font-size: 12px;\n width: 12px;\n height: 12px;\n}\n\n.uiIcon_k0ec4.size-sm_10jDl {\n font-size: 14px;\n width: 14px;\n height: 14px;\n}\n\n.uiIcon_k0ec4.size-base_h9Lkp {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.uiIcon_k0ec4.size-lg_O0C5x {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.uiIcon_k0ec4.size-xl_WXfPC {\n font-size: 24px;\n width: 24px;\n height: 24px;\n}\n\n.uiIcon_k0ec4.size-2xl_32DCm {\n font-size: 32px;\n width: 32px;\n height: 32px;\n}\n\n/*\n * Color variants using CSS variables\n */\n.uiIcon_k0ec4.color-primary_h3CLu {\n color: var(--link, #2563EB);\n}\n\n.uiIcon_k0ec4.color-secondary_4pb5w {\n color: var(--text-secondary, #6B7280);\n}\n\n.uiIcon_k0ec4.color-success_O8h6- {\n color: var(--success, #16A34A);\n}\n\n.uiIcon_k0ec4.color-warning_dYWdv {\n color: var(--warning, #F59E0B);\n}\n\n.uiIcon_k0ec4.color-error_adjhG {\n color: var(--error, #DC2626);\n}\n\n.uiIcon_k0ec4.color-info_TwzBK {\n color: var(--info, #0EA5E9);\n}\n\n.uiIcon_k0ec4.color-inherit_YCf-Z {\n color: inherit;\n}\n\n/*\n * Spin animation\n */\n.uiIcon_k0ec4.spin_rwV9G {\n animation: uiIconSpin_JA9h9 1s linear infinite;\n}\n\n@keyframes uiIconSpin_JA9h9 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*\n * Disabled state\n */\n.uiIcon_k0ec4.disabled_sSgts {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n}\n","/**\n * UIShimmerText - Animated gradient shimmer on text\n * Classic \"Cursor / ClickUp\" loading text effect.\n */\n\n.shimmer_Vu6DO {\n background: linear-gradient(\n 90deg,\n var(--shimmer-color-1, #888) 0%,\n var(--shimmer-color-2, #888) 25%,\n var(--shimmer-highlight, #fff) 50%,\n var(--shimmer-color-2, #888) 75%,\n var(--shimmer-color-1, #888) 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n color: transparent;\n animation: shimmerMove_64hFq var(--shimmer-duration, 2s) linear infinite;\n display: inline-block;\n}\n\n@keyframes shimmerMove_64hFq {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n}\n","@keyframes skeletonLoading_Cb6ey {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n}\n\n.skeletonText_D4KLj {\n animation: skeletonLoading_Cb6ey 1.4s ease infinite;\n}\n","/* KB Labs UI Color Kit */\n\n:root {\n /* Backgrounds — matches kblabs.ru neutral scale */\n --bg-primary: #F4F5F7;\n --bg-secondary: #FFFFFF;\n --bg-tertiary: #F3F4F6;\n --bg-hover: #F3F4F6; /* Same as tertiary for hover state */\n --bg-sidebar: #FFFFFF;\n\n /* Text */\n --text-primary: #0F1115;\n --text-secondary: #5C616D;\n --text-tertiary: #5C616D;\n --text-inverse: #FFFFFF;\n\n /* Borders */\n --border-primary: #D9DDE6;\n --border-secondary: #C4CAD8;\n\n /* Typography */\n --font-body: 'Geist Sans', 'Inter', 'Segoe UI', sans-serif;\n --font-heading: 'Plus Jakarta Sans', 'Geist Sans', sans-serif;\n\n /* Interactive */\n --link: #0c66ff;\n --link-hover: #0050cc;\n --accent-subtle: #dbeafe;\n\n /* Status */\n --success: #16A34A;\n --warning: #F59E0B;\n --error: #DC2626;\n --info: #0EA5E9;\n\n /* States */\n --disabled: #9CA3AF;\n\n /* Effects */\n --shadow: rgba(0, 0, 0, 0.05);\n --shadow-hover: rgba(0, 0, 0, 0.1); /* Darker on hover */\n --shadow-elevated: rgba(0, 0, 0, 0.08); /* Elevated cards */\n\n /* Z-index scale */\n --z-base: 0;\n --z-dropdown: 100;\n --z-sticky: 200;\n --z-header: 300;\n --z-sidebar: 400;\n --z-overlay: 500; /* Modal backdrop */\n --z-modal: 600; /* Modal, drawer */\n --z-popover: 700; /* Tooltip, popover, select dropdown */\n --z-toast: 800; /* Notifications */\n --z-top: 900; /* Command palette, spotlight */\n}\n\n.dark {\n /* Backgrounds — matches kblabs.ru dark neutral scale */\n --bg-primary: #09090B;\n --bg-secondary: #0F1014;\n --bg-tertiary: #1A1B22;\n --bg-hover: #1E2028; /* Lighter hover state for tables/cards */\n --bg-sidebar: #0F1014;\n\n /* Text */\n --text-primary: #E6EAF4;\n --text-secondary: #8090A6;\n --text-tertiary: #8090A6;\n --text-inverse: #0F1115;\n\n /* Borders */\n --border-primary: #1E2535;\n --border-secondary: #2C3650;\n\n /* Interactive */\n --link: #3A82F6;\n --link-hover: #60a5fa;\n --accent-subtle: rgba(58, 130, 246, 0.15);\n\n /* Status */\n --success: #22C55E;\n --warning: #EAB308;\n --error: #EF4444;\n --info: #38BDF8;\n\n /* States */\n --disabled: #52525B;\n\n /* Effects */\n --shadow: rgba(0, 0, 0, 0.6); /* Darker base shadow */\n --shadow-hover: rgba(0, 0, 0, 0.8); /* Even darker on hover */\n --shadow-elevated: rgba(255, 255, 255, 0.05); /* Subtle white glow for elevation */\n}\n\n","/* Base element styles and layout utilities */\n\nbody {\n background-color: var(--bg-sidebar);\n color: var(--text-primary);\n font-family: var(--font-body);\n -webkit-font-smoothing: antialiased;\n}\n\nh1, h2, h3, h4, h5, h6 {\n color: var(--text-primary);\n font-weight: 600;\n font-family: var(--font-heading);\n letter-spacing: -0.02em;\n}\n\np {\n color: var(--text-secondary);\n}\n\na {\n color: var(--link);\n text-decoration: none;\n transition: color 0.15s ease-in-out;\n}\n\na:hover {\n color: var(--link-hover);\n}\n\n/* Text utilities */\n.text-primary {\n color: var(--text-primary);\n}\n\n.text-secondary {\n color: var(--text-secondary);\n}\n\n.text-tertiary {\n color: var(--text-tertiary);\n}\n\n/* Border utilities */\n.border-theme {\n border-color: var(--border-primary);\n}\n\n/* Status colors */\n.text-success {\n color: var(--success);\n}\n\n.text-warning {\n color: var(--warning);\n}\n\n.text-error {\n color: var(--error);\n}\n\n.text-info {\n color: var(--info);\n}\n\n/* Background utilities */\n.bg-theme-primary {\n background-color: var(--bg-primary);\n}\n\n.bg-theme-secondary {\n background-color: var(--bg-secondary);\n}\n\n.bg-theme-tertiary {\n background-color: var(--bg-tertiary);\n}\n\n/* Spacing CSS variables */\n:root {\n --spacing-page: 2rem; /* 32px - Space between main page sections */\n --spacing-section: 1.5rem; /* 24px - Space between subsections */\n --spacing-item: 1rem; /* 16px - Space between related items */\n --spacing-tight: 0.5rem; /* 8px - Minimal space between tightly related items */\n}\n\n/* Spacing utility classes for gap */\n.gap-page {\n gap: var(--spacing-page);\n}\n\n.gap-section {\n gap: var(--spacing-section);\n}\n\n.gap-item {\n gap: var(--spacing-item);\n}\n\n.gap-tight {\n gap: var(--spacing-tight);\n}\n\n/* Typography CSS variables */\n:root {\n /* Page title */\n --typo-page-title-size: 2.25rem; /* 36px */\n --typo-page-title-line-height: 2.5rem; /* 40px */\n --typo-page-title-weight: 700;\n\n /* Section title */\n --typo-section-title-size: 1.875rem; /* 30px */\n --typo-section-title-line-height: 2.25rem; /* 36px */\n --typo-section-title-weight: 600;\n\n /* Card title */\n --typo-card-title-size: 1.5rem; /* 24px */\n --typo-card-title-line-height: 2rem; /* 32px */\n --typo-card-title-weight: 600;\n\n /* Body text */\n --typo-body-size: 1rem; /* 16px */\n --typo-body-line-height: 1.5rem; /* 24px */\n --typo-body-weight: 400;\n\n /* Description text */\n --typo-description-size: 0.875rem; /* 14px */\n --typo-description-line-height: 1.25rem; /* 20px */\n --typo-description-weight: 400;\n\n /* Label text */\n --typo-label-size: 0.875rem; /* 14px */\n --typo-label-line-height: 1.25rem; /* 20px */\n --typo-label-weight: 500;\n\n /* Caption text */\n --typo-caption-size: 0.75rem; /* 12px */\n --typo-caption-line-height: 1rem; /* 16px */\n --typo-caption-weight: 400;\n}\n\n/* Typography component classes */\n.typo-page-title {\n font-size: var(--typo-page-title-size);\n line-height: var(--typo-page-title-line-height);\n font-weight: var(--typo-page-title-weight);\n color: var(--text-primary);\n}\n\n.typo-section-title {\n font-size: var(--typo-section-title-size);\n line-height: var(--typo-section-title-line-height);\n font-weight: var(--typo-section-title-weight);\n color: var(--text-primary);\n}\n\n.typo-card-title {\n font-size: var(--typo-card-title-size);\n line-height: var(--typo-card-title-line-height);\n font-weight: var(--typo-card-title-weight);\n color: var(--text-primary);\n}\n\n.typo-body {\n font-size: var(--typo-body-size);\n line-height: var(--typo-body-line-height);\n font-weight: var(--typo-body-weight);\n color: var(--text-primary);\n}\n\n.typo-description {\n font-size: var(--typo-description-size);\n line-height: var(--typo-description-line-height);\n font-weight: var(--typo-description-weight);\n color: var(--text-secondary);\n}\n\n.typo-label {\n font-size: var(--typo-label-size);\n line-height: var(--typo-label-line-height);\n font-weight: var(--typo-label-weight);\n color: var(--text-secondary);\n}\n\n.typo-caption {\n font-size: var(--typo-caption-size);\n line-height: var(--typo-caption-line-height);\n font-weight: var(--typo-caption-weight);\n color: var(--text-tertiary);\n}\n","/* Ant Design component overrides — theme-aware patches */\n\n/* Z-index overrides — must be above sidebar (--z-sidebar: 400) */\n.ant-modal-root .ant-modal-wrap,\n.ant-modal-root .ant-modal-mask {\n z-index: var(--z-overlay) !important;\n}\n\n.ant-modal-root .ant-modal {\n z-index: var(--z-modal) !important;\n}\n\n.ant-drawer-root .ant-drawer {\n z-index: var(--z-modal) !important;\n}\n\n.ant-select-dropdown,\n.ant-dropdown,\n.ant-popover,\n.ant-tooltip {\n z-index: var(--z-popover) !important;\n}\n\n.ant-message,\n.ant-notification {\n z-index: var(--z-toast) !important;\n}\n\n/* Header buttons — consistent vertical alignment */\n.ant-layout-header .ant-btn {\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n line-height: 1 !important;\n vertical-align: middle !important;\n}\n\n.ant-layout-header .ant-btn .ant-btn-icon {\n line-height: 1 !important;\n display: inline-flex !important;\n align-items: center !important;\n}\n\n/* Menu group titles — uppercase label style */\n.ant-menu-item-group-title {\n text-transform: uppercase !important;\n letter-spacing: 0.04em !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n color: var(--text-tertiary) !important;\n padding-top: 20px !important;\n padding-bottom: 4px !important;\n}\n\n/* Hide group labels when sidebar is collapsed */\n.ant-menu-inline-collapsed .ant-menu-item-group-title {\n display: none !important;\n}\n\n.ant-menu-inline-collapsed .ant-menu-item-group-list {\n padding-top: 4px !important;\n}\n\n/* Menu items — pill shape */\n.ant-menu-item,\n.ant-menu-submenu-title {\n border-radius: 8px !important;\n}\n\n/* Layout frame background — matches sidebar; the content panel paints its own bg on top */\n.ant-layout {\n background: var(--bg-sidebar) !important;\n}\n\n/* Active menu item styles */\n.menu-item-active,\n.ant-menu-item-selected {\n background-color: var(--accent-subtle) !important;\n color: var(--link) !important;\n}\n\n.ant-menu-item-selected > .ant-menu-title-content {\n color: var(--link) !important;\n}\n\n/* Submenu title should stay normal when child is selected */\n.ant-menu-submenu-selected > .ant-menu-submenu-title {\n background-color: transparent !important;\n color: var(--text-primary) !important;\n}\n\n/* But allow hover on submenu title even when child is selected */\n.ant-menu-submenu-selected > .ant-menu-submenu-title:hover {\n background-color: var(--bg-hover) !important;\n color: var(--text-primary) !important;\n}\n\n/* Dark theme menu */\n.dark .menu-item-active,\n.dark .ant-menu-item-selected {\n background-color: rgba(96, 165, 250, 0.25) !important;\n color: var(--link) !important;\n}\n\n.dark .ant-menu-item-selected > .ant-menu-title-content {\n color: var(--link) !important;\n}\n\n.dark .ant-menu-submenu-selected > .ant-menu-submenu-title {\n background-color: transparent !important;\n color: var(--text-primary) !important;\n}\n\n.dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover {\n background-color: var(--bg-hover) !important;\n color: var(--text-primary) !important;\n}\n\n/* Fix radio button text color when checked */\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {\n color: var(--text-inverse) !important;\n}\n\n.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) span {\n color: var(--text-inverse) !important;\n}\n\n/* Fix pagination active page number text color (same blue as its bg otherwise) */\n.ant-pagination-item-active a {\n color: var(--text-inverse) !important;\n}\n\n/* Fix dropdown menu selected item */\n.ant-dropdown-menu-item-selected,\n.ant-dropdown-menu-submenu-title-selected {\n background-color: var(--accent-subtle) !important;\n color: var(--link) !important;\n}\n\n.ant-dropdown-menu-item-selected .ant-dropdown-menu-title-content,\n.ant-dropdown-menu-submenu-title-selected .ant-dropdown-menu-title-content {\n color: var(--link) !important;\n}\n\n/* Dark theme dropdown */\n.dark .ant-dropdown-menu-item-selected,\n.dark .ant-dropdown-menu-submenu-title-selected {\n background-color: rgba(96, 165, 250, 0.15) !important;\n color: var(--link-hover) !important;\n}\n\n.dark .ant-dropdown-menu-item-selected .ant-dropdown-menu-title-content,\n.dark .ant-dropdown-menu-submenu-title-selected .ant-dropdown-menu-title-content {\n color: var(--link-hover) !important;\n}\n\n/* Dark theme improvements */\n.dark {\n /* Better card shadows with subtle white glow for elevation */\n .ant-card {\n box-shadow: 0 1px 3px var(--shadow), 0 0 0 1px var(--shadow-elevated);\n }\n\n .ant-card:hover {\n box-shadow: 0 2px 8px var(--shadow-hover), 0 0 0 1px var(--shadow-elevated);\n }\n\n /* Better dropdown shadows */\n .ant-dropdown,\n .ant-popover,\n .ant-select-dropdown {\n box-shadow: 0 4px 16px var(--shadow), 0 0 0 1px var(--shadow-elevated) !important;\n }\n\n /* Better button hover states */\n .ant-btn:not(.ant-btn-primary):not(.ant-btn-text):hover {\n background-color: var(--bg-hover) !important;\n border-color: var(--border-secondary) !important;\n }\n\n /* Fix table row hover being too dark (only body rows, not header) */\n .ant-table-tbody > tr.ant-table-row:hover > td {\n background-color: var(--bg-hover) !important;\n }\n\n /* Fix table header hover - should stay same color */\n .ant-table-thead > tr > th:hover {\n background-color: var(--bg-tertiary) !important;\n }\n\n /* Better link contrast */\n a:not(.ant-btn) {\n color: var(--link);\n }\n\n a:not(.ant-btn):hover {\n color: var(--link-hover);\n }\n\n /* Fix link button visibility in dark theme */\n .ant-btn-link {\n color: var(--link) !important;\n }\n\n .ant-btn-link:hover {\n color: var(--link-hover) !important;\n }\n\n .ant-btn-link:not(:disabled):not(.ant-btn-disabled) {\n color: var(--link) !important;\n }\n\n .ant-btn-link:not(:disabled):not(.ant-btn-disabled):hover {\n color: var(--link-hover) !important;\n }\n}\n","/* Settings-related styles */\n\n/* Compact Mode - reduce spacing */\nhtml.compact-mode {\n /* Override Ant Design token values */\n --ant-padding: 12px;\n --ant-padding-lg: 16px;\n --ant-padding-sm: 8px;\n --ant-margin: 12px;\n --ant-margin-lg: 16px;\n --ant-margin-sm: 8px;\n}\n\n/* Font Size - Small */\nhtml.font-small {\n font-size: 13px;\n}\n\nhtml.font-small .ant-typography {\n font-size: 13px;\n}\n\nhtml.font-small h1, html.font-small .ant-typography h1 {\n font-size: 32px !important;\n}\n\nhtml.font-small h2, html.font-small .ant-typography h2 {\n font-size: 26px !important;\n}\n\nhtml.font-small h3, html.font-small .ant-typography h3 {\n font-size: 20px !important;\n}\n\nhtml.font-small h4, html.font-small .ant-typography h4 {\n font-size: 17px !important;\n}\n\nhtml.font-small h5, html.font-small .ant-typography h5 {\n font-size: 14px !important;\n}\n\n/* Font Size - Medium (default) */\nhtml.font-medium {\n font-size: 14px;\n}\n\n/* Font Size - Large */\nhtml.font-large {\n font-size: 16px;\n}\n\nhtml.font-large .ant-typography {\n font-size: 16px;\n}\n\nhtml.font-large h1, html.font-large .ant-typography h1 {\n font-size: 42px !important;\n}\n\nhtml.font-large h2, html.font-large .ant-typography h2 {\n font-size: 34px !important;\n}\n\nhtml.font-large h3, html.font-large .ant-typography h3 {\n font-size: 28px !important;\n}\n\nhtml.font-large h4, html.font-large .ant-typography h4 {\n font-size: 22px !important;\n}\n\nhtml.font-large h5, html.font-large .ant-typography h5 {\n font-size: 18px !important;\n}\n","/* Theme variables and base styles - must be first */\n@import './styles/variables.css';\n@import './styles/base.css';\n@import './styles/antd-overrides.css';\n@import './styles/settings.css';\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n"],"names":[],"mappings":"AAAA,yCAKA,0MAWA,oJASA,gCAKA,0BAIA,wHAOA,+CAIA,mDAIA,sDAIA,6BAKA,uCAKA,2BAKA,kEAOA,yBAIA,gFAOA,0EAOA,sBAIA,oGCjGA,2NAmBA,+FAOA,oFAQA,4CAKA,+NAeA,kFAKA,qEAOA,sFASA,2HASA,0FAQA,uFAQA,iDAKA,qTAiBA,oFAKA,sEAOA,sBAIA,8CAMA,mPAeA,+DAOA,kDAKA,2MASA,4HAMA,6JAWA,0EAMA,sEAOA,oEAMA,sBCxNA,gSAWA,qMCXA,yUAiBA,wCAKA,gTAcA,8BAIA,gFAKA,wCC7CA,oIAMA,6EAKA,+DAKA,iKAOA,oCAIA,0CAKA,0BAIA,2DAIA,qIASA,8HAOA,iFAKA,wGASA,wDAYA,mDAKA,uFAOA,0FAQA,6KAUA,8BAKA,iDAMA,0HCzHA,oIAUA,0FAMA,8FAMA,4FAMA,sDAMA,sCAKA,sGAQA,2KAaA,wBAIA,wJAaA,oDAOA,8HAOA,qFAOA,6BClGA,4SAcA,wMAaA,sNAYA,+IAUA,qEAOA,kPAcA,0FAQA,oEAMA,iFAOA,qEAUA,2BAIA,gDAIA,wGAOA,6EAMA,4HASA,kCAKA,0GASA,2FAQA,6YAqBA,sEAKA,4SAmBA,oPCxMA,wEAOA,gEAMA,uFAMA,0EAOA,wDACA,yDACA,uDAEA,uFAMA,kEAMA,wKASA,iEAKA,2EAMA,qJAWA,kIAQA,sGCjFA,4EAOA,oFAOA,qEAMA,yGAQA,yDAIA,8EAKA,4FAMA,0FAOA,qFAMA,sEAKA,uFAIA,qEAMA,wHCrEA,uEASA,4KAWA,sBAIA,qBAIA,oDAOA,qIAMA,wPAaA,wCAMA,8GAQA,qFAMA,8BAIA,gDAIA,8CAIA,0EAKA,6EAKA,mBAMA,kNAcA,4DAKA,6DAKA,0DAKA,kEAOA,gEAKA,2OAgBA,4CC/JA,+eAyBA,0CAIA,6GAQA,6DAIA,yDAMA,uOAgBA,mFAQA,oKAcA,+JAWA,mLAYA,mEAOA,+B,wrBChGA,sGASA,6EAQA,sDAMA,2CAMA,sDAUA,oHAQA,sEASA,qEAIA,4GAQA,0EAIA,iJAKA,4IASA,qKAQA,8MASA,6DC5HA,8JAOA,+KAaA,4CAIA,iJCpBA,8IAQA,+FAKA,2CAIA,0KAMA,0ICpBA,kGAWA,iFAaA,0CAOA,kFAKA,+CAIA,0DAOA,kEAMA,kEAMA,oEAMA,kEAMA,kEAMA,mEASA,4DAIA,wEAIA,+DAIA,+DAIA,2DAIA,yDAIA,gDAOA,uEAIA,gFAYA,+ECvIA,sbAkBA,2FCvBA,wFAKA,kECHA,8uBAsDA,ggBCtDA,kIAOA,kHAOA,8BAIA,2EAMA,gCAKA,wCAIA,4CAIA,0CAKA,iDAKA,mCAIA,mCAIA,+BAIA,6BAKA,qDAIA,yDAIA,uDAKA,6FAQA,kCAIA,wCAIA,kCAIA,oCAKA,0oBAsCA,0KAOA,sLAOA,0KAOA,kJAOA,gLAOA,wJAOA,+JCrLA,mGAKA,yFAQA,gGAOA,gEAMA,gLAQA,6HAOA,6OAWA,6EAIA,+EAKA,mEAMA,mDAKA,sHAMA,4EAKA,8HAMA,wIAMA,kIAMA,kFAIA,oIAKA,8IAMA,2NAcA,uJAMA,yKAMA,yKAMA,2LAQE,qFAIA,iGAKA,kTAOA,wJAMA,4FAKA,iFAKA,wCAIA,oDAKA,gDAIA,4DAIA,sFAIA,kGCjNF,2IAWA,+DAQA,+EAIA,+EAIA,+EAIA,+EAIA,+EAKA,gCAKA,+DAQA,+EAIA,+EAIA,+EAIA,+EAIA,+EClEA,guNACA,qSACA"}
@@ -1,26 +0,0 @@
1
- {
2
- "schema": "kb.service/1",
3
- "id": "studio",
4
- "name": "Studio",
5
- "version": "0.7.0",
6
- "description": "KB Labs Web UI — SPA served as static files",
7
- "runtime": {
8
- "entry": "server.js",
9
- "port": 3000,
10
- "healthCheck": "/"
11
- },
12
- "dependsOn": [
13
- "rest",
14
- "gateway"
15
- ],
16
- "env": {
17
- "PORT": {
18
- "description": "HTTP port",
19
- "default": "3000"
20
- },
21
- "HOST": {
22
- "description": "Bind host",
23
- "default": "127.0.0.1"
24
- }
25
- }
26
- }
@@ -1,240 +0,0 @@
1
- {
2
- "id": "studioHost",
3
- "name": "studioHost",
4
- "metaData": {
5
- "name": "studioHost",
6
- "globalName": "studioHost",
7
- "buildInfo": {
8
- "buildVersion": "2.119.0-canary.e120bc0ee",
9
- "buildName": "@kb-labs/studio-app"
10
- },
11
- "publicPath": "auto",
12
- "remoteEntry": {
13
- "name": "",
14
- "path": "",
15
- "type": "global"
16
- },
17
- "types": {
18
- "path": "",
19
- "name": "",
20
- "zip": "",
21
- "api": ""
22
- },
23
- "pluginVersion": "2.3.3",
24
- "prefetchInterface": false
25
- },
26
- "shared": [
27
- {
28
- "id": "studioHost:react-router-dom",
29
- "name": "react-router-dom",
30
- "version": "7.18.1",
31
- "singleton": true,
32
- "requiredVersion": "^7.0.0",
33
- "assets": {
34
- "js": {
35
- "sync": [
36
- "main.4a952960.js"
37
- ],
38
- "async": []
39
- },
40
- "css": {
41
- "sync": [
42
- "main.c3a0243c.css"
43
- ],
44
- "async": []
45
- }
46
- }
47
- },
48
- {
49
- "id": "studioHost:@kb-labs/studio-ui-core",
50
- "name": "@kb-labs/studio-ui-core",
51
- "version": "2.119.0-canary.e120bc0ee",
52
- "singleton": true,
53
- "requiredVersion": "^2.0.0",
54
- "assets": {
55
- "js": {
56
- "sync": [
57
- "main.4a952960.js"
58
- ],
59
- "async": []
60
- },
61
- "css": {
62
- "sync": [
63
- "main.c3a0243c.css"
64
- ],
65
- "async": []
66
- }
67
- }
68
- },
69
- {
70
- "id": "studioHost:@ant-design/icons",
71
- "name": "@ant-design/icons",
72
- "version": "5.6.1",
73
- "singleton": true,
74
- "requiredVersion": "^5.4.0",
75
- "assets": {
76
- "js": {
77
- "sync": [
78
- "main.4a952960.js"
79
- ],
80
- "async": []
81
- },
82
- "css": {
83
- "sync": [
84
- "main.c3a0243c.css"
85
- ],
86
- "async": []
87
- }
88
- }
89
- },
90
- {
91
- "id": "studioHost:antd",
92
- "name": "antd",
93
- "version": "5.29.3",
94
- "singleton": true,
95
- "requiredVersion": "^5.21.0",
96
- "assets": {
97
- "js": {
98
- "sync": [
99
- "main.4a952960.js"
100
- ],
101
- "async": []
102
- },
103
- "css": {
104
- "sync": [
105
- "main.c3a0243c.css"
106
- ],
107
- "async": []
108
- }
109
- }
110
- },
111
- {
112
- "id": "studioHost:@kb-labs/studio-hooks",
113
- "name": "@kb-labs/studio-hooks",
114
- "version": "2.119.0-canary.e120bc0ee",
115
- "singleton": true,
116
- "requiredVersion": "^2.0.0",
117
- "assets": {
118
- "js": {
119
- "sync": [
120
- "main.4a952960.js"
121
- ],
122
- "async": []
123
- },
124
- "css": {
125
- "sync": [
126
- "main.c3a0243c.css"
127
- ],
128
- "async": []
129
- }
130
- }
131
- },
132
- {
133
- "id": "studioHost:@kb-labs/studio-ui-kit",
134
- "name": "@kb-labs/studio-ui-kit",
135
- "version": "2.119.0-canary.e120bc0ee",
136
- "singleton": true,
137
- "requiredVersion": "^2.0.0",
138
- "assets": {
139
- "js": {
140
- "sync": [
141
- "main.4a952960.js"
142
- ],
143
- "async": []
144
- },
145
- "css": {
146
- "sync": [
147
- "main.c3a0243c.css"
148
- ],
149
- "async": []
150
- }
151
- }
152
- },
153
- {
154
- "id": "studioHost:react",
155
- "name": "react",
156
- "version": "19.2.5",
157
- "singleton": true,
158
- "requiredVersion": "^19.0.0",
159
- "assets": {
160
- "js": {
161
- "sync": [
162
- "main.4a952960.js"
163
- ],
164
- "async": []
165
- },
166
- "css": {
167
- "sync": [
168
- "main.c3a0243c.css"
169
- ],
170
- "async": []
171
- }
172
- }
173
- },
174
- {
175
- "id": "studioHost:react-dom",
176
- "name": "react-dom",
177
- "version": "19.2.5",
178
- "singleton": true,
179
- "requiredVersion": "^19.0.0",
180
- "assets": {
181
- "js": {
182
- "sync": [
183
- "main.4a952960.js"
184
- ],
185
- "async": []
186
- },
187
- "css": {
188
- "sync": [
189
- "main.c3a0243c.css"
190
- ],
191
- "async": []
192
- }
193
- }
194
- },
195
- {
196
- "id": "studioHost:@tanstack/react-query",
197
- "name": "@tanstack/react-query",
198
- "version": "5.97.0",
199
- "singleton": true,
200
- "requiredVersion": "^5.0.0",
201
- "assets": {
202
- "js": {
203
- "sync": [
204
- "main.4a952960.js"
205
- ],
206
- "async": []
207
- },
208
- "css": {
209
- "sync": [
210
- "main.c3a0243c.css"
211
- ],
212
- "async": []
213
- }
214
- }
215
- },
216
- {
217
- "id": "studioHost:@kb-labs/studio-event-bus",
218
- "name": "@kb-labs/studio-event-bus",
219
- "version": "2.119.0-canary.e120bc0ee",
220
- "singleton": true,
221
- "requiredVersion": "^2.0.0",
222
- "assets": {
223
- "js": {
224
- "sync": [
225
- "main.4a952960.js"
226
- ],
227
- "async": []
228
- },
229
- "css": {
230
- "sync": [
231
- "main.c3a0243c.css"
232
- ],
233
- "async": []
234
- }
235
- }
236
- }
237
- ],
238
- "remotes": [],
239
- "exposes": []
240
- }