@nice2dev/ui-ai 1.1.9 → 1.2.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.
@@ -335,11 +335,32 @@ export interface Prediction {
335
335
  embeddings?: number[];
336
336
  raw?: unknown;
337
337
  }
338
+ /** What a training run reports back to NiceMLStudio. Everything is optional. */
339
+ export interface ExperimentRunResult {
340
+ /** Evaluation metrics, shown on the experiment and copied to a model registered from it. */
341
+ metrics?: MetricValue[];
342
+ /** Run outputs; the `type: 'model'` ones become the registered model's files and size. */
343
+ artifacts?: Artifact[];
344
+ logs?: LogEntry[];
345
+ /** Seconds; when missing, the time from start to finish. */
346
+ duration?: number;
347
+ }
338
348
  export interface NiceMLStudioProps {
339
349
  project?: MLProject;
340
350
  onProjectChange?: (project: MLProject) => void;
341
- onExperimentRun?: (experiment: Experiment) => Promise<void>;
351
+ /**
352
+ * Trains the experiment. Resolve with what the run produced and the studio shows it; resolving
353
+ * with nothing completes the experiment without metrics (none are made up). A rejection marks
354
+ * it failed.
355
+ */
356
+ onExperimentRun?: (experiment: Experiment) => Promise<ExperimentRunResult | void>;
357
+ /** Deploys the model. Without it the Deploy button is disabled and says why. */
342
358
  onModelDeploy?: (model: MLModel) => Promise<Deployment>;
359
+ /**
360
+ * Downloads the model's files (its `artifacts` hold what the run reported). Fetching them is
361
+ * the host's job — storage and auth — so without it the Download button is disabled.
362
+ */
363
+ onModelDownload?: (model: MLModel) => void;
343
364
  className?: string;
344
365
  /** Optional "?" guided tour. Off by default; `true` uses the built-in tour. */
345
366
  tutorial?: NiceComponentTutorial;
package/dist/ui-ai.css CHANGED
@@ -1 +1 @@
1
- :root,.nice-theme-scope,[data-theme],.nice-dark,.nice-light{--ntd-ai-bg: var(--nice-bg, #1e1e2e);--ntd-ai-fg: #cdd6f4;--ntd-ai-border: #45475a;--ntd-ai-trigger-color: var(--nice-accent, #a78bfa);--ntd-ai-error: #f38ba8}.ntd-ai-trigger:hover{opacity:1!important;transform:scale(1.15)}.ntd-ai-trigger:focus-visible{outline:2px solid var(--ntd-ai-trigger-color);outline-offset:2px}.ntd-ai-popover{animation:ntd-ai-fade-in .15s ease-out}.ntd-ai-action:hover{background-color:var(--ntd-ai-border)!important}@keyframes ntd-ai-spin{to{transform:rotate(360deg)}}@keyframes ntd-ai-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes ntd-ai-fade-in{0%{opacity:0;transform:translate(-50%) translateY(4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@media(prefers-color-scheme:light){:root,.nice-theme-scope,[data-theme],.nice-dark,.nice-light{--ntd-ai-bg: var(--nice-bg, #ffffff);--ntd-ai-fg: var(--nice-text-primary, #1e1e2e);--ntd-ai-border: #dce0e8;--ntd-ai-trigger-color: var(--nice-accent, #7c3aed);--ntd-ai-error: var(--nice-danger-dark, #dc2626)}}:root,.nice-theme-scope,[data-theme],.nice-dark,.nice-light{--ml-primary: var(--nice-info, #6366f1);--ml-primary-dark: var(--nice-accent, #4f46e5);--ml-primary-light: var(--nice-accent, #818cf8);--ml-success: var(--nice-success, #22c55e);--ml-warning: var(--nice-warning, #f59e0b);--ml-error: var(--nice-danger, #ef4444);--ml-info: var(--nice-primary, #3b82f6);--ml-bg: var(--nice-bg-primary, #0f172a);--ml-surface: var(--nice-bg-secondary, #1e293b);--ml-surface-alt: var(--nice-bg-tertiary, #334155);--ml-border: var(--nice-border-color, #475569);--ml-text: var(--nice-text-primary, #f1f5f9);--ml-text-muted: var(--nice-text-muted, #94a3b8);--ml-radius: 8px;--ml-radius-sm: 4px;--ml-shadow: 0 4px 6px -1px var(--nice-overlay-30, rgba(0, 0, 0, .3));--ml-transition: .15s ease}.nice-ml-studio{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.ml-studio__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.ml-studio__header h2{margin:0;font-size:1.25rem;font-weight:600}.header__tabs{display:flex;gap:var(--nice-space-1, 4px)}.tab-button{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:none;background:transparent;color:var(--ml-text-muted);font-size:.875rem;font-weight:500;cursor:pointer;border-radius:var(--ml-radius-sm);transition:all var(--ml-transition)}.tab-button:hover{background:var(--ml-surface-alt);color:var(--ml-text)}.tab-button--active,.tab-button--active:hover{background:var(--ml-primary);color:#fff}.ml-studio__content{flex:1;padding:var(--nice-space-6, 24px);overflow:auto}.data-panel,.experiments-panel,.models-panel,.deploy-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.upload-section,.column-config,.create-experiment,.experiment-list,.model-list,.deployments-list{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.upload-section h3,.column-config h3,.create-experiment h3,.experiment-list h3,.model-list h3,.deployments-list h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.upload-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-10, 40px);border:2px dashed var(--ml-border);border-radius:var(--ml-radius);cursor:pointer;transition:all var(--ml-transition)}.upload-zone:hover{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.upload-icon{font-size:2rem}.columns-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-3, 12px)}.column-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.column-name{font-weight:500}.column-type-select{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.75rem}.experiment-form{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--nice-space-4, 16px)}.form-row label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem;color:var(--ml-text-muted)}.form-row input,.form-row select{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font-size:.875rem}.form-row input:focus,.form-row select:focus{outline:none;border-color:var(--ml-primary)}.run-button{padding:var(--nice-space-3, 12px) var(--nice-space-6, 24px);border:none;border-radius:var(--ml-radius);background:var(--ml-primary);color:#fff;font-size:.875rem;font-weight:600;cursor:pointer;transition:all var(--ml-transition);align-self:flex-start}.run-button:hover:not(:disabled){background:var(--ml-primary-dark)}.run-button:disabled{opacity:.5;cursor:not-allowed}.experiments-grid,.models-grid,.deployments-grid{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px)}.experiment-item,.model-item,.deployment-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px);background:var(--ml-surface-alt);border-radius:var(--ml-radius);border:1px solid transparent;cursor:pointer;transition:all var(--ml-transition)}.experiment-item:hover,.model-item:hover,.deployment-item:hover{border-color:var(--ml-primary)}.experiment-item--selected,.model-item--selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.experiment-item.running{border-color:var(--ml-warning)}.experiment-item.completed{border-color:var(--ml-success)}.experiment-item.failed{border-color:var(--ml-error)}.item-info{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px)}.item-name{font-weight:500}.item-meta{font-size:.75rem;color:var(--ml-text-muted)}.status-badge{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);font-size:.75rem;font-weight:500;text-transform:capitalize}.status-badge--running,.status-badge--deploying{background:var(--nice-warning-tint-20, rgba(245, 158, 11, .2));color:var(--ml-warning)}.status-badge--completed,.status-badge--running-live,.status-badge--success{background:var(--nice-success-tint-20, rgba(34, 197, 94, .2));color:var(--ml-success)}.status-badge--failed,.status-badge--error,.status-badge--stopped{background:var(--nice-danger-tint-20, rgba(239, 68, 68, .2));color:var(--ml-error)}.status-badge--pending{background:var(--nice-primary-tint-20, rgba(59, 130, 246, .2));color:var(--ml-info)}.item-metrics{display:flex;gap:var(--nice-space-4, 16px);font-size:.875rem}.model-register,.deployment-create{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-primary);background:transparent;color:var(--ml-primary);border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer;transition:all var(--ml-transition)}.model-register:hover,.deployment-create:hover{background:var(--ml-primary);color:#fff}.item-actions{display:flex;gap:var(--nice-space-2, 8px)}.action-button{padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:none;border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer;transition:all var(--ml-transition)}.action-button--stop{background:var(--ml-error);color:#fff}.action-button--start{background:var(--ml-success);color:#fff}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--nice-space-10, 40px);text-align:center;color:var(--ml-text-muted)}.empty-icon{font-size:2rem;margin-bottom:var(--nice-space-3, 12px)}.nice-data-labeler{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.labeler__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-3, 12px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.header__info{display:flex;align-items:center;gap:var(--nice-space-4, 16px)}.header__info h2{margin:0;font-size:1.25rem;font-weight:600}.progress-badge{padding:var(--nice-space-1, 4px) var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--nice-radius-full, 99px);font-size:.75rem;color:var(--ml-text-muted)}.label-panel{display:grid;grid-template-columns:1fr 320px;gap:0;height:100%}.labeling-workspace{display:flex;flex-direction:column;height:100%;overflow:hidden}.labeling-canvas{flex:1;position:relative;background:var(--ml-surface);border-right:1px solid var(--ml-border);overflow:hidden}.canvas-image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:var(--nice-space-5, 20px)}.canvas-image{max-width:100%;max-height:100%;object-fit:contain}.canvas-text-container{width:100%;height:100%;padding:var(--nice-space-5, 20px);overflow:auto}.canvas-text{background:var(--ml-surface-alt);padding:var(--nice-space-4, 16px);border-radius:var(--ml-radius);line-height:1.8;white-space:pre-wrap}.bbox-overlay{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.bbox-rect{position:absolute;border:2px solid var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1));pointer-events:auto;cursor:move}.bbox-label{position:absolute;top:-20px;left:0;padding:var(--nice-space-0-5, 2px) var(--nice-space-1-5, 6px);background:var(--ml-primary);color:#fff;font-size:.625rem;border-radius:var(--nice-radius-sm, 2px)}.bbox-delete{position:absolute;top:2px;right:2px;width:16px;height:16px;border:none;background:var(--ml-error);color:#fff;font-size:.625rem;border-radius:var(--nice-radius-full, 50%);cursor:pointer;display:flex;align-items:center;justify-content:center}.text-span{padding:var(--nice-space-0-5, 2px) 0;cursor:pointer;transition:background var(--ml-transition)}.text-span:hover{background:var(--nice-accent-tint-20, rgba(99, 102, 241, .2))}.text-span.labeled{background:var(--nice-accent-tint-30, rgba(99, 102, 241, .3));border-radius:var(--nice-radius-sm, 2px)}.canvas-empty{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--nice-space-4, 16px);color:var(--ml-text-muted)}.canvas-empty .icon{font-size:3rem}.toolbar{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-right:1px solid var(--ml-border)}.tool-button{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;display:flex;align-items:center;gap:var(--nice-space-1-5, 6px);font-size:.75rem;transition:all var(--ml-transition)}.tool-button:hover{background:var(--ml-surface);border-color:var(--ml-primary)}.tool-button--active{background:var(--ml-primary);border-color:var(--ml-primary);color:#fff}.tool-separator{width:1px;height:24px;background:var(--ml-border);margin:0 var(--nice-space-2, 8px)}.labeling-sidebar{display:flex;flex-direction:column;background:var(--ml-surface);height:100%}.classes-panel,.labels-panel{flex:1;display:flex;flex-direction:column;padding:var(--nice-space-4, 16px);overflow:hidden}.classes-panel h4,.labels-panel h4{margin:0 0 var(--nice-space-3, 12px);font-size:.875rem;font-weight:600;color:var(--ml-text-muted)}.class-list,.label-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);overflow-y:auto}.class-button{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;transition:all var(--ml-transition);text-align:left;font-size:.875rem}.class-button:hover{border-color:var(--ml-primary)}.class-button--selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.class-color{width:12px;height:12px;border-radius:var(--nice-radius-full, 50%);flex-shrink:0}.add-class-input{display:flex;gap:var(--nice-space-2, 8px);margin-top:var(--nice-space-3, 12px)}.add-class-input input{flex:1;padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font-size:.875rem}.add-button{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:none;background:var(--ml-primary);color:#fff;border-radius:var(--ml-radius-sm);cursor:pointer}.label-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);font-size:.75rem}.label-info{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.label-color{width:8px;height:8px;border-radius:var(--nice-radius-full, 50%)}.label-delete{padding:var(--nice-space-1, 4px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer;font-size:.875rem}.label-delete:hover{color:var(--ml-error)}.navigation-buttons{display:flex;gap:var(--nice-space-2, 8px);padding:var(--nice-space-4, 16px);border-top:1px solid var(--ml-border)}.nav-button{flex:1;padding:var(--nice-space-2-5, 10px);border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;font-size:.875rem;transition:all var(--ml-transition)}.nav-button:hover:not(:disabled){background:var(--ml-surface);border-color:var(--ml-primary)}.nav-button:disabled{opacity:.5;cursor:not-allowed}.nav-button--primary{background:var(--ml-success);border-color:var(--ml-success);color:#fff}.schema-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--nice-space-6, 24px);padding:var(--nice-space-6, 24px)}.classes-editor,.schema-settings{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.classes-editor h3,.schema-settings h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.class-editor-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);margin-bottom:var(--nice-space-4, 16px)}.class-editor-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.class-editor-item input[type=color]{width:32px;height:32px;border:none;border-radius:var(--ml-radius-sm);cursor:pointer}.class-editor-item input[type=text]{flex:1;padding:var(--nice-space-2, 8px);border:1px solid var(--ml-border);background:var(--ml-surface);color:var(--ml-text);border-radius:var(--ml-radius-sm)}.class-editor-item button{padding:var(--nice-space-2, 8px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer}.class-editor-item button:hover{color:var(--ml-error)}.add-class-form{display:flex;gap:var(--nice-space-2, 8px)}.add-class-form input{flex:1}.settings-group{margin-bottom:var(--nice-space-5, 20px)}.settings-group label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem;color:var(--ml-text-muted);margin-bottom:var(--nice-space-2, 8px)}.settings-group select,.settings-group input{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text)}.checkbox-label{flex-direction:row!important;align-items:center;gap:var(--nice-space-2, 8px)!important}.review-panel{display:flex;flex-direction:column;height:100%;padding:var(--nice-space-6, 24px)}.review-filters{display:flex;gap:var(--nice-space-3, 12px);margin-bottom:var(--nice-space-4, 16px);padding-bottom:var(--nice-space-4, 16px);border-bottom:1px solid var(--ml-border)}.filter-group label{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);font-size:.75rem;color:var(--ml-text-muted)}.filter-group select,.filter-group input{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.875rem}.review-grid{flex:1;display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-4, 16px);overflow-y:auto}.review-item{background:var(--ml-surface);border-radius:var(--ml-radius);overflow:hidden;border:2px solid transparent;cursor:pointer;transition:all var(--ml-transition)}.review-item:hover,.review-item.selected{border-color:var(--ml-primary)}.review-thumbnail{width:100%;height:120px;display:flex;align-items:center;justify-content:center;background:var(--ml-surface-alt);overflow:hidden}.review-thumbnail img{width:100%;height:100%;object-fit:cover}.review-thumbnail.text{font-size:.75rem;color:var(--ml-text-muted);padding:var(--nice-space-3, 12px)}.review-info{padding:var(--nice-space-3, 12px)}.review-labels{display:flex;flex-wrap:wrap;gap:var(--nice-space-1, 4px);margin-bottom:var(--nice-space-2, 8px)}.review-label-tag{padding:var(--nice-space-0-5, 2px) var(--nice-space-1-5, 6px);border-radius:var(--nice-radius-sm, 2px);font-size:.625rem;color:#fff}.review-meta{display:flex;justify-content:space-between;font-size:.625rem;color:var(--ml-text-muted)}.review-actions{display:flex;gap:var(--nice-space-2, 8px);padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-top:1px solid var(--ml-border)}.review-action-button{flex:1;padding:var(--nice-space-2-5, 10px);border:none;border-radius:var(--ml-radius-sm);font-size:.875rem;cursor:pointer;transition:all var(--ml-transition)}.review-action-button--approve{background:var(--ml-success);color:#fff}.review-action-button--reject{background:var(--ml-error);color:#fff}.export-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px);padding:var(--nice-space-6, 24px);max-width:600px}.format-selection,.export-options,.export-actions{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.format-selection h3,.export-options h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.format-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--nice-space-3, 12px)}.format-option{display:flex;flex-direction:column;padding:var(--nice-space-4, 16px);border:2px solid var(--ml-border);border-radius:var(--ml-radius);cursor:pointer;transition:all var(--ml-transition)}.format-option:hover{border-color:var(--ml-primary)}.format-option.selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.format-name{font-weight:500;margin-bottom:var(--nice-space-1, 4px)}.format-description{font-size:.75rem;color:var(--ml-text-muted)}.option-row{margin-bottom:var(--nice-space-4, 16px)}.option-row label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem}.option-row select,.option-row input[type=number]{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text)}.checkbox-option{flex-direction:row!important;align-items:center;gap:var(--nice-space-2, 8px)!important}.export-button{padding:var(--nice-space-3-5, 14px) var(--nice-space-6, 24px);border:none;border-radius:var(--ml-radius);background:var(--ml-primary);color:#fff;font-size:1rem;font-weight:600;cursor:pointer;transition:all var(--ml-transition)}.export-button:hover{background:var(--ml-primary-dark)}.nice-model-inference{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.inference__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.inference__content{flex:1;padding:var(--nice-space-6, 24px);overflow:auto}.test-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--nice-space-6, 24px);height:100%}.input-section,.output-section{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.input-type-selector{display:flex;gap:var(--nice-space-2, 8px)}.type-button{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;transition:all var(--ml-transition)}.type-button:hover{border-color:var(--ml-primary)}.type-button--active{background:var(--ml-primary);border-color:var(--ml-primary);color:#fff}.input-area{flex:1}.text-input,.json-input{width:100%;min-height:200px;padding:var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);color:var(--ml-text);font-family:Fira Code,monospace;font-size:.875rem;resize:vertical}.text-input:focus,.json-input:focus{outline:none;border-color:var(--ml-primary)}.image-input{min-height:200px;display:flex;align-items:center;justify-content:center}.image-preview{position:relative;max-width:100%;max-height:300px}.image-preview img{max-width:100%;max-height:300px;object-fit:contain;border-radius:var(--ml-radius)}.clear-button{position:absolute;top:8px;right:8px;padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:none;background:var(--ml-error);color:#fff;border-radius:var(--ml-radius-sm);cursor:pointer}.parameters-section h4{margin:0 0 var(--nice-space-3, 12px);font-size:.875rem;font-weight:500}.parameters-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--nice-space-3, 12px)}.parameters-grid label{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);font-size:.75rem;color:var(--ml-text-muted)}.parameters-grid input{padding:var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.875rem}.output-section h3{margin:0;font-size:1rem;font-weight:600}.error-message{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--nice-danger-tint-10, rgba(239, 68, 68, .1));border:1px solid var(--ml-error);border-radius:var(--ml-radius);color:var(--ml-error)}.result-container{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.result-meta{display:flex;gap:var(--nice-space-4, 16px);font-size:.75rem;color:var(--ml-text-muted);padding:var(--nice-space-3, 12px);background:var(--ml-surface);border-radius:var(--ml-radius-sm)}.predictions-list{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px)}.prediction-item{padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-radius:var(--ml-radius)}.prediction-label{display:flex;align-items:center;gap:var(--nice-space-3, 12px);margin-bottom:var(--nice-space-2, 8px)}.label-name{font-weight:500;font-size:1rem}.confidence-badge{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);font-size:.75rem;color:#fff}.prediction-score,.prediction-bbox{font-size:.875rem;color:var(--ml-text-muted);margin-bottom:var(--nice-space-1, 4px)}.prediction-text pre{margin:var(--nice-space-2, 8px) 0 0;padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);overflow-x:auto;font-size:.875rem}.raw-output{margin-top:var(--nice-space-2, 8px)}.raw-output summary{cursor:pointer;font-size:.75rem;color:var(--ml-text-muted)}.raw-output pre{margin-top:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);overflow-x:auto;font-size:.75rem}.empty-output{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--nice-space-15, 60px);background:var(--ml-surface);border-radius:var(--ml-radius);color:var(--ml-text-muted);text-align:center}.empty-output .icon{font-size:2rem;margin-bottom:var(--nice-space-2, 8px)}.batch-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.batch-upload{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.batch-upload h3{margin:0 0 var(--nice-space-2, 8px);font-size:1rem;font-weight:600}.batch-upload .hint{margin:0 0 var(--nice-space-4, 16px);font-size:.875rem;color:var(--ml-text-muted)}.batch-progress{display:flex;align-items:center;gap:var(--nice-space-4, 16px);padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-radius:var(--ml-radius)}.progress-bar{flex:1;height:8px;background:var(--ml-surface-alt);border-radius:var(--nice-radius-sm, 4px);overflow:hidden}.progress-fill{height:100%;background:var(--ml-primary);transition:width var(--ml-transition)}.batch-results{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.batch-results h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.results-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);max-height:400px;overflow-y:auto}.batch-result-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.result-index{font-weight:600;color:var(--ml-text-muted);min-width:40px}.result-prediction{font-size:.875rem}.metrics-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--nice-space-4, 16px)}.metric-card{display:flex;flex-direction:column;align-items:center;padding:var(--nice-space-6, 24px);background:var(--ml-surface);border-radius:var(--ml-radius);text-align:center}.metric-value{font-size:1.75rem;font-weight:700;color:var(--ml-primary-light);margin-bottom:var(--nice-space-1, 4px)}.metric-label{font-size:.875rem;color:var(--ml-text-muted)}.latency-histogram{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.latency-histogram h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.histogram-bars{display:flex;align-items:flex-end;gap:var(--nice-space-4, 16px);height:120px}.histogram-bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.bar-fill{width:100%;background:var(--ml-primary);border-radius:var(--ml-radius-sm) var(--ml-radius-sm) 0 0;min-height:10px}.percentile-label{margin-top:var(--nice-space-2, 8px);font-size:.75rem;color:var(--ml-text-muted)}.logs-panel{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--nice-space-4, 16px)}.logs-header h3{margin:0;font-size:1rem;font-weight:600}.clear-logs-button{padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer}.clear-logs-button:hover{background:var(--ml-surface-alt)}.logs-table{flex:1;overflow:auto;background:var(--ml-surface);border-radius:var(--ml-radius)}.logs-table table{width:100%;border-collapse:collapse}.logs-table th,.logs-table td{padding:var(--nice-space-3, 12px);text-align:left;border-bottom:1px solid var(--ml-border)}.logs-table th{font-weight:600;font-size:.75rem;color:var(--ml-text-muted);text-transform:uppercase;background:var(--ml-surface-alt);position:sticky;top:0}.logs-table td{font-size:.875rem}.empty-logs{text-align:center;color:var(--ml-text-muted);padding:var(--nice-space-10, 40px)!important}.log-row--error{background:var(--nice-danger-tint-10, rgba(239, 68, 68, .05))}.request-id{font-family:Fira Code,monospace;font-size:.75rem}.nice-ml-studio .header__info{gap:var(--nice-space-3, 12px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px)}.nice-ml-studio .header__tabs{padding:var(--nice-space-1, 4px) var(--nice-space-4, 16px)}.nice-ml-studio .project-name-input,.nice-ml-studio .project-type-select,.nice-ml-studio .new-experiment-form select,.nice-ml-studio .columns-table select{padding:var(--nice-space-1-5, 6px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font:inherit;font-size:.875rem}.nice-ml-studio .project-name-input{min-width:220px;font-weight:600}.nice-ml-studio .panel-header{display:flex;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px)}.nice-ml-studio .panel-header h2{margin:0;font-size:1.125rem;font-weight:600}.nice-ml-studio .upload-button,.nice-ml-studio .primary-button,.nice-ml-studio .secondary-button{display:inline-flex;align-items:center;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font:inherit;font-size:.875rem;font-weight:500;cursor:pointer;transition:background var(--ml-transition),border-color var(--ml-transition)}.nice-ml-studio .upload-button:hover,.nice-ml-studio .secondary-button:hover{border-color:var(--ml-primary)}.nice-ml-studio .primary-button{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-text-on-primary, #fff)}.nice-ml-studio .primary-button:hover:not(:disabled){background:var(--ml-primary-dark)}.nice-ml-studio .primary-button:disabled,.nice-ml-studio .action-button:disabled{opacity:.5;cursor:not-allowed}.nice-ml-studio .datasets-grid,.nice-ml-studio .experiments-list,.nice-ml-studio .models-list,.nice-ml-studio .deployments-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--nice-space-4, 16px);padding:0;background:none}.nice-ml-studio .datasets-grid>.empty-state,.nice-ml-studio .experiments-list>.empty-state,.nice-ml-studio .models-list>.empty-state,.nice-ml-studio .deployments-list>.empty-state{grid-column:1 / -1}.nice-ml-studio .dataset-card,.nice-ml-studio .experiment-card,.nice-ml-studio .model-card,.nice-ml-studio .deployment-card{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px);min-width:0;padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);cursor:pointer;transition:border-color var(--ml-transition),box-shadow var(--ml-transition)}.nice-ml-studio .deployment-card{cursor:default}.nice-ml-studio .dataset-card:hover,.nice-ml-studio .experiment-card:hover,.nice-ml-studio .model-card:hover{border-color:var(--ml-primary-light)}.nice-ml-studio .dataset-card--selected,.nice-ml-studio .experiment-card--selected,.nice-ml-studio .model-card--selected{border-color:var(--ml-primary);box-shadow:0 0 0 1px var(--ml-primary)}.nice-ml-studio .card-header{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.nice-ml-studio .card-header h3{flex:1;min-width:0;margin:0;overflow:hidden;font-size:.9375rem;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.nice-ml-studio .dataset-icon{display:inline-flex;color:var(--ml-primary)}.nice-ml-studio .remove-button{display:inline-flex;align-items:center;justify-content:center;padding:var(--nice-space-1, 4px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-ml-studio .remove-button:hover{background:var(--ml-surface-alt);color:var(--ml-error)}.nice-ml-studio .card-stats,.nice-ml-studio .card-meta,.nice-ml-studio .resources-info{display:flex;flex-wrap:wrap;gap:var(--nice-space-1, 4px) var(--nice-space-4, 16px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-ml-studio .card-meta span,.nice-ml-studio .resources-info span{overflow-wrap:anywhere}.nice-ml-studio .splits-bar{display:flex;height:6px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-ml-studio .split--train{background:var(--ml-primary)}.nice-ml-studio .split--validation{background:var(--ml-warning)}.nice-ml-studio .split--test{background:var(--ml-success)}.nice-ml-studio .dataset-details,.nice-ml-studio .new-experiment-form{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px);padding:var(--nice-space-5, 20px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-ml-studio .dataset-details h3,.nice-ml-studio .new-experiment-form h3{margin:0;font-size:1rem;font-weight:600}.nice-ml-studio .columns-table{width:100%;border-collapse:collapse;font-size:.875rem}.nice-ml-studio .columns-table th,.nice-ml-studio .columns-table td{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border-bottom:1px solid var(--ml-border);text-align:left}.nice-ml-studio .columns-table th{font-size:.75rem;font-weight:500;letter-spacing:.04em;text-transform:uppercase;color:var(--ml-text-muted)}.nice-ml-studio .form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-4, 16px)}.nice-ml-studio .form-grid label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-ml-studio .form-actions,.nice-ml-studio .card-actions{display:flex;justify-content:flex-end;gap:var(--nice-space-2, 8px)}.nice-ml-studio .metrics-row{display:flex;gap:var(--nice-space-2, 8px)}.nice-ml-studio .metric-item{display:flex;flex:1;flex-direction:column;gap:var(--nice-space-0-5, 2px);min-width:0;padding:var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt)}.nice-ml-studio .metric-name{overflow:hidden;font-size:.6875rem;letter-spacing:.04em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;color:var(--ml-text-muted)}.nice-ml-studio .metric-value{font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.nice-ml-studio .action-button{border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text)}.nice-ml-studio .action-button--primary{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-text-on-primary, #fff)}.nice-data-labeler{position:relative}.nice-data-labeler .labeler__header{flex-wrap:wrap;gap:var(--nice-space-3, 12px)}.nice-data-labeler .project-name-input,.nice-data-labeler .schema-settings select,.nice-data-labeler .filter-group select,.nice-data-labeler .class-name-input,.nice-data-labeler .shortcut-input,.nice-data-labeler .guidelines-section textarea{padding:var(--nice-space-1-5, 6px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font:inherit;font-size:.875rem}.nice-data-labeler .project-name-input{min-width:200px;font-weight:600}.nice-data-labeler .header__info .progress-bar{position:relative;width:180px;height:20px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-data-labeler .header__info .progress-fill{height:100%;background:var(--nice-accent-tint-40, rgba(99, 102, 241, .4));transition:width var(--ml-transition)}.nice-data-labeler .progress-text{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500}.nice-data-labeler .shortcuts-button,.nice-data-labeler .primary-button,.nice-data-labeler .approve-button,.nice-data-labeler .reject-button,.nice-data-labeler .zoom-group button,.nice-data-labeler .navigation-group button{display:inline-flex;align-items:center;justify-content:center;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font:inherit;font-size:.8125rem;cursor:pointer;transition:background var(--ml-transition),border-color var(--ml-transition)}.nice-data-labeler .shortcuts-button:hover,.nice-data-labeler .zoom-group button:hover,.nice-data-labeler .navigation-group button:hover:not(:disabled){border-color:var(--ml-primary)}.nice-data-labeler .zoom-group button{padding-inline:var(--nice-space-2, 8px)}.nice-data-labeler .navigation-group button:disabled{opacity:.45;cursor:not-allowed}.nice-data-labeler .primary-button{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-text-on-primary, #fff)}.nice-data-labeler .approve-button{border-color:var(--ml-success);background:var(--nice-success-tint-20, rgba(34, 197, 94, .2));color:var(--ml-success)}.nice-data-labeler .reject-button{border-color:var(--ml-error);background:var(--nice-danger-tint-20, rgba(239, 68, 68, .2));color:var(--ml-error)}.nice-data-labeler .labeler__content{flex:1;min-height:0;overflow:auto}.nice-data-labeler .label-panel{display:flex;flex-direction:column;height:100%}.nice-data-labeler .label-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border-bottom:1px solid var(--ml-border);background:var(--ml-surface)}.nice-data-labeler .tool-group,.nice-data-labeler .zoom-group,.nice-data-labeler .navigation-group{display:flex;align-items:center;gap:var(--nice-space-2, 8px);font-size:.8125rem;font-variant-numeric:tabular-nums}.nice-data-labeler .label-workspace{display:grid;flex:1;grid-template-columns:minmax(0,1fr) 260px;min-height:0}.nice-data-labeler .canvas-container{position:relative;display:flex;align-items:center;justify-content:center;min-width:0;padding:var(--nice-space-6, 24px);overflow:auto;background:var(--ml-bg)}.nice-data-labeler .labeling-image{max-width:100%;transform-origin:center}.nice-data-labeler .labeling-canvas{position:absolute;top:0;right:0;bottom:0;left:0;border:none;background:transparent}.nice-data-labeler .annotations-overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;transform-origin:top left}.nice-data-labeler .bbox-annotation,.nice-data-labeler .bbox-drawing{position:absolute;border:2px solid var(--ml-primary);pointer-events:auto}.nice-data-labeler .bbox-drawing{border-style:dashed}.nice-data-labeler .bbox-remove{position:absolute;top:-10px;right:-10px;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:1px solid var(--ml-border);border-radius:var(--nice-radius-full, 50%);background:var(--ml-surface);color:var(--ml-error);cursor:pointer}.nice-data-labeler .text-labeling{width:100%;max-width:640px;padding:var(--nice-space-6, 24px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-data-labeler .text-content{margin:0;font-size:1.0625rem;line-height:1.6}.nice-data-labeler .class-sidebar{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px);padding:var(--nice-space-4, 16px);overflow-y:auto;border-left:1px solid var(--ml-border);background:var(--ml-surface)}.nice-data-labeler .class-sidebar h3,.nice-data-labeler .current-labels h4{margin:0;font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ml-text-muted)}.nice-data-labeler .class-button--active{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.nice-data-labeler .class-button .class-name{flex:1}.nice-data-labeler .class-shortcut{min-width:20px;padding:0 var(--nice-space-1-5, 6px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);font-size:.6875rem;text-align:center;color:var(--ml-text-muted)}.nice-data-labeler .current-labels{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .label-item button{display:inline-flex;padding:var(--nice-space-0-5, 2px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .label-actions{display:flex;gap:var(--nice-space-2, 8px);margin-top:auto}.nice-data-labeler .label-actions button{flex:1}.nice-data-labeler .panel-header{display:flex;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px)}.nice-data-labeler .panel-header h2{margin:0;font-size:1.125rem;font-weight:600}.nice-data-labeler .schema-panel,.nice-data-labeler .review-panel,.nice-data-labeler .export-panel{display:flex;flex-direction:column;gap:var(--nice-space-5, 20px);padding:var(--nice-space-6, 24px)}.nice-data-labeler .schema-settings{display:flex;flex-wrap:wrap;gap:var(--nice-space-4, 16px);padding:0;background:none}.nice-data-labeler .schema-settings label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-data-labeler .classes-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .class-editor{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.nice-data-labeler .color-picker{width:36px;height:32px;padding:var(--nice-space-0-5, 2px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);cursor:pointer}.nice-data-labeler .class-name-input{flex:1;min-width:0}.nice-data-labeler .shortcut-input{width:48px;text-align:center}.nice-data-labeler .remove-class-button{display:inline-flex;padding:var(--nice-space-1-5, 6px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .remove-class-button:hover{background:var(--ml-surface-alt);color:var(--ml-error)}.nice-data-labeler .guidelines-section{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .guidelines-section h3,.nice-data-labeler .export-formats h3,.nice-data-labeler .class-distribution h3{margin:0 0 var(--nice-space-2, 8px);font-size:1rem;font-weight:600}.nice-data-labeler .guidelines-section textarea{min-height:120px;resize:vertical}.nice-data-labeler .items-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-3, 12px)}.nice-data-labeler .item-card{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);cursor:pointer;transition:border-color var(--ml-transition)}.nice-data-labeler .item-card:hover{border-color:var(--ml-primary-light)}.nice-data-labeler .item-card--active{border-color:var(--ml-primary);box-shadow:0 0 0 1px var(--ml-primary)}.nice-data-labeler .item-thumbnail{width:100%;aspect-ratio:4 / 3;border-radius:var(--ml-radius-sm);object-fit:cover}.nice-data-labeler .item-text-preview{margin:0;font-size:.8125rem;line-height:1.5}.nice-data-labeler .item-footer{display:flex;align-items:center;gap:var(--nice-space-1-5, 6px);font-size:.75rem;color:var(--ml-text-muted)}.nice-data-labeler .status-dot{flex-shrink:0;width:8px;height:8px;border-radius:var(--nice-radius-full, 50%)}.nice-data-labeler .export-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--nice-space-3, 12px)}.nice-data-labeler .stat-card{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-data-labeler .stat-value{font-size:1.5rem;font-weight:600;font-variant-numeric:tabular-nums}.nice-data-labeler .stat-label,.nice-data-labeler .format-desc{font-size:.75rem;color:var(--ml-text-muted)}.nice-data-labeler .format-button{display:flex;flex-direction:column;align-items:flex-start;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);color:var(--ml-text);font:inherit;text-align:left;cursor:pointer;transition:border-color var(--ml-transition)}.nice-data-labeler .format-button:hover{border-color:var(--ml-primary)}.nice-data-labeler .format-icon{display:inline-flex;color:var(--ml-primary)}.nice-data-labeler .distribution-bars{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .distribution-row{display:grid;grid-template-columns:120px minmax(0,1fr) 40px;align-items:center;gap:var(--nice-space-3, 12px);font-size:.8125rem}.nice-data-labeler .distribution-row .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nice-data-labeler .bar-container{height:8px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-data-labeler .bar-container .bar-fill{height:100%;border-radius:var(--nice-radius-full, 99px)}.nice-data-labeler .distribution-row .count{font-variant-numeric:tabular-nums;text-align:right;color:var(--ml-text-muted)}.nice-data-labeler .shortcuts-modal{position:absolute;top:0;right:0;bottom:0;left:0;z-index:20;display:flex;align-items:center;justify-content:center;background:var(--nice-overlay-60, rgba(0, 0, 0, .6))}.nice-data-labeler .modal-content{width:min(420px,calc(100% - 32px));max-height:calc(100% - 32px);padding:var(--nice-space-5, 20px);overflow:auto;border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);box-shadow:var(--ml-shadow)}.nice-data-labeler .modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--nice-space-3, 12px)}.nice-data-labeler .modal-header h3{margin:0;font-size:1rem;font-weight:600}.nice-data-labeler .modal-header button{display:inline-flex;padding:var(--nice-space-1, 4px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .shortcuts-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .shortcut-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);font-size:.875rem}.nice-data-labeler .shortcut-item .keys{min-width:88px;padding:var(--nice-space-0-5, 2px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);font-family:ui-monospace,monospace;font-size:.75rem;text-align:center}.nice-data-labeler .shortcut-item .description{color:var(--ml-text-muted)}.nice-model-inference .prediction-score{display:flex;gap:var(--nice-space-1, 4px)}.nice-model-inference .score-value{font-variant-numeric:tabular-nums}.nice-model-inference .error-icon{display:inline-flex;flex-shrink:0}@media(max-width:720px){.nice-data-labeler .label-workspace{grid-template-columns:1fr}.nice-data-labeler .class-sidebar{border-top:1px solid var(--ml-border);border-left:none}}@media(max-width:1200px){.test-panel,.schema-panel,.label-panel{grid-template-columns:1fr}.labeling-sidebar{display:none}}@media(max-width:768px){.parameters-grid,.metrics-grid{grid-template-columns:repeat(2,1fr)}.format-grid{grid-template-columns:1fr}}
1
+ :root,.nice-theme-scope,[data-theme],.nice-dark,.nice-light{--ntd-ai-bg: var(--nice-bg-elevated, #ffffff);--ntd-ai-fg: var(--nice-text-primary, #1e1e2e);--ntd-ai-border: var(--nice-border-color, #dce0e8);--ntd-ai-trigger-color: var(--nice-accent, #7c3aed);--ntd-ai-error: var(--nice-color-error, #dc2626)}.ntd-ai-trigger:hover{opacity:1!important;transform:scale(1.15)}.ntd-ai-trigger:focus-visible{outline:2px solid var(--ntd-ai-trigger-color);outline-offset:2px}.ntd-ai-popover{animation:ntd-ai-fade-in .15s ease-out}.ntd-ai-action:hover{background-color:var(--ntd-ai-border)!important}@keyframes ntd-ai-spin{to{transform:rotate(360deg)}}@keyframes ntd-ai-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes ntd-ai-fade-in{0%{opacity:0;transform:translate(-50%) translateY(4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}:root,.nice-theme-scope,[data-theme],.nice-dark,.nice-light{--ml-primary: var(--nice-info, #6366f1);--ml-primary-dark: var(--nice-accent, #4f46e5);--ml-primary-light: var(--nice-accent, #818cf8);--ml-success: var(--nice-success, #22c55e);--ml-warning: var(--nice-warning, #f59e0b);--ml-error: var(--nice-danger, #ef4444);--ml-info: var(--nice-primary, #3b82f6);--ml-bg: var(--nice-bg-primary, #0f172a);--ml-surface: var(--nice-bg-secondary, #1e293b);--ml-surface-alt: var(--nice-bg-tertiary, #334155);--ml-border: var(--nice-border-color, #475569);--ml-text: var(--nice-text-primary, #f1f5f9);--ml-text-muted: var(--nice-text-muted, #94a3b8);--ml-radius: 8px;--ml-radius-sm: 4px;--ml-shadow: 0 4px 6px -1px var(--nice-overlay-30, rgba(0, 0, 0, .3));--ml-transition: .15s ease}.nice-ml-studio{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.ml-studio__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.ml-studio__header h2{margin:0;font-size:1.25rem;font-weight:600}.header__tabs{display:flex;gap:var(--nice-space-1, 4px)}.tab-button{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:none;background:transparent;color:var(--ml-text-muted);font-size:.875rem;font-weight:500;cursor:pointer;border-radius:var(--ml-radius-sm);transition:all var(--ml-transition)}.tab-button:hover{background:var(--ml-surface-alt);color:var(--ml-text)}.tab-button--active,.tab-button--active:hover{background:var(--ml-primary);color:#fff}.ml-studio__content{flex:1;padding:var(--nice-space-6, 24px);overflow:auto}.data-panel,.experiments-panel,.models-panel,.deploy-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.upload-section,.column-config,.create-experiment,.experiment-list,.model-list,.deployments-list{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.upload-section h3,.column-config h3,.create-experiment h3,.experiment-list h3,.model-list h3,.deployments-list h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.upload-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-10, 40px);border:2px dashed var(--ml-border);border-radius:var(--ml-radius);cursor:pointer;transition:all var(--ml-transition)}.upload-zone:hover{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.upload-icon{font-size:2rem}.columns-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-3, 12px)}.column-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.column-name{font-weight:500}.column-type-select{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.75rem}.experiment-form{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--nice-space-4, 16px)}.form-row label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem;color:var(--ml-text-muted)}.form-row input,.form-row select{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font-size:.875rem}.form-row input:focus,.form-row select:focus{outline:none;border-color:var(--ml-primary)}.run-button{padding:var(--nice-space-3, 12px) var(--nice-space-6, 24px);border:none;border-radius:var(--ml-radius);background:var(--ml-primary);color:#fff;font-size:.875rem;font-weight:600;cursor:pointer;transition:all var(--ml-transition);align-self:flex-start}.run-button:hover:not(:disabled){background:var(--ml-primary-dark)}.run-button:disabled{opacity:.5;cursor:not-allowed}.experiments-grid,.models-grid,.deployments-grid{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px)}.experiment-item,.model-item,.deployment-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px);background:var(--ml-surface-alt);border-radius:var(--ml-radius);border:1px solid transparent;cursor:pointer;transition:all var(--ml-transition)}.experiment-item:hover,.model-item:hover,.deployment-item:hover{border-color:var(--ml-primary)}.experiment-item--selected,.model-item--selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.experiment-item.running{border-color:var(--ml-warning)}.experiment-item.completed{border-color:var(--ml-success)}.experiment-item.failed{border-color:var(--ml-error)}.item-info{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px)}.item-name{font-weight:500}.item-meta{font-size:.75rem;color:var(--ml-text-muted)}.status-badge{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);font-size:.75rem;font-weight:500;text-transform:capitalize}.nice-ml-studio .status-badge{text-transform:none}.status-badge--running,.status-badge--deploying{background:var(--nice-warning-tint-20, rgba(245, 158, 11, .2));color:var(--ml-warning)}.status-badge--completed,.status-badge--running-live,.status-badge--success{background:var(--nice-success-tint-20, rgba(34, 197, 94, .2));color:var(--ml-success)}.status-badge--failed,.status-badge--error,.status-badge--stopped{background:var(--nice-danger-tint-20, rgba(239, 68, 68, .2));color:var(--ml-error)}.status-badge--pending{background:var(--nice-primary-tint-20, rgba(59, 130, 246, .2));color:var(--ml-info)}.item-metrics{display:flex;gap:var(--nice-space-4, 16px);font-size:.875rem}.model-register,.deployment-create{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-primary);background:transparent;color:var(--ml-primary);border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer;transition:all var(--ml-transition)}.model-register:hover,.deployment-create:hover{background:var(--ml-primary);color:#fff}.item-actions{display:flex;gap:var(--nice-space-2, 8px)}.action-button{padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:none;border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer;transition:all var(--ml-transition)}.action-button--stop{background:var(--ml-error);color:#fff}.action-button--start{background:var(--ml-success);color:#fff}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--nice-space-10, 40px);text-align:center;color:var(--ml-text-muted)}.empty-icon{font-size:2rem;margin-bottom:var(--nice-space-3, 12px)}.nice-data-labeler{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.labeler__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-3, 12px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.header__info{display:flex;align-items:center;gap:var(--nice-space-4, 16px)}.header__info h2{margin:0;font-size:1.25rem;font-weight:600}.progress-badge{padding:var(--nice-space-1, 4px) var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--nice-radius-full, 99px);font-size:.75rem;color:var(--ml-text-muted)}.label-panel{display:grid;grid-template-columns:1fr 320px;gap:0;height:100%}.labeling-workspace{display:flex;flex-direction:column;height:100%;overflow:hidden}.labeling-canvas{flex:1;position:relative;background:var(--ml-surface);border-right:1px solid var(--ml-border);overflow:hidden}.canvas-image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:var(--nice-space-5, 20px)}.canvas-image{max-width:100%;max-height:100%;object-fit:contain}.canvas-text-container{width:100%;height:100%;padding:var(--nice-space-5, 20px);overflow:auto}.canvas-text{background:var(--ml-surface-alt);padding:var(--nice-space-4, 16px);border-radius:var(--ml-radius);line-height:1.8;white-space:pre-wrap}.bbox-overlay{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.bbox-rect{position:absolute;border:2px solid var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1));pointer-events:auto;cursor:move}.bbox-label{position:absolute;top:-20px;left:0;padding:var(--nice-space-0-5, 2px) var(--nice-space-1-5, 6px);background:var(--ml-primary);color:#fff;font-size:.625rem;border-radius:var(--nice-radius-sm, 2px)}.bbox-delete{position:absolute;top:2px;right:2px;width:16px;height:16px;border:none;background:var(--ml-error);color:#fff;font-size:.625rem;border-radius:var(--nice-radius-full, 50%);cursor:pointer;display:flex;align-items:center;justify-content:center}.text-span{padding:var(--nice-space-0-5, 2px) 0;cursor:pointer;transition:background var(--ml-transition)}.text-span:hover{background:var(--nice-accent-tint-20, rgba(99, 102, 241, .2))}.text-span.labeled{background:var(--nice-accent-tint-30, rgba(99, 102, 241, .3));border-radius:var(--nice-radius-sm, 2px)}.canvas-empty{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--nice-space-4, 16px);color:var(--ml-text-muted)}.canvas-empty .icon{font-size:3rem}.toolbar{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-right:1px solid var(--ml-border)}.tool-button{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;display:flex;align-items:center;gap:var(--nice-space-1-5, 6px);font-size:.75rem;transition:all var(--ml-transition)}.tool-button:hover{background:var(--ml-surface);border-color:var(--ml-primary)}.tool-button--active{background:var(--ml-primary);border-color:var(--ml-primary);color:#fff}.tool-separator{width:1px;height:24px;background:var(--ml-border);margin:0 var(--nice-space-2, 8px)}.labeling-sidebar{display:flex;flex-direction:column;background:var(--ml-surface);height:100%}.classes-panel,.labels-panel{flex:1;display:flex;flex-direction:column;padding:var(--nice-space-4, 16px);overflow:hidden}.classes-panel h4,.labels-panel h4{margin:0 0 var(--nice-space-3, 12px);font-size:.875rem;font-weight:600;color:var(--ml-text-muted)}.class-list,.label-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);overflow-y:auto}.class-button{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;transition:all var(--ml-transition);text-align:left;font-size:.875rem}.class-button:hover{border-color:var(--ml-primary)}.class-button--selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.class-color{width:12px;height:12px;border-radius:var(--nice-radius-full, 50%);flex-shrink:0}.add-class-input{display:flex;gap:var(--nice-space-2, 8px);margin-top:var(--nice-space-3, 12px)}.add-class-input input{flex:1;padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font-size:.875rem}.add-button{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:none;background:var(--ml-primary);color:#fff;border-radius:var(--ml-radius-sm);cursor:pointer}.label-item{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);font-size:.75rem}.label-info{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.label-color{width:8px;height:8px;border-radius:var(--nice-radius-full, 50%)}.label-delete{padding:var(--nice-space-1, 4px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer;font-size:.875rem}.label-delete:hover{color:var(--ml-error)}.navigation-buttons{display:flex;gap:var(--nice-space-2, 8px);padding:var(--nice-space-4, 16px);border-top:1px solid var(--ml-border)}.nav-button{flex:1;padding:var(--nice-space-2-5, 10px);border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;font-size:.875rem;transition:all var(--ml-transition)}.nav-button:hover:not(:disabled){background:var(--ml-surface);border-color:var(--ml-primary)}.nav-button:disabled{opacity:.5;cursor:not-allowed}.nav-button--primary{background:var(--ml-success);border-color:var(--ml-success);color:#fff}.schema-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--nice-space-6, 24px);padding:var(--nice-space-6, 24px)}.classes-editor,.schema-settings{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.classes-editor h3,.schema-settings h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.class-editor-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);margin-bottom:var(--nice-space-4, 16px)}.class-editor-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.class-editor-item input[type=color]{width:32px;height:32px;border:none;border-radius:var(--ml-radius-sm);cursor:pointer}.class-editor-item input[type=text]{flex:1;padding:var(--nice-space-2, 8px);border:1px solid var(--ml-border);background:var(--ml-surface);color:var(--ml-text);border-radius:var(--ml-radius-sm)}.class-editor-item button{padding:var(--nice-space-2, 8px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer}.class-editor-item button:hover{color:var(--ml-error)}.add-class-form{display:flex;gap:var(--nice-space-2, 8px)}.add-class-form input{flex:1}.settings-group{margin-bottom:var(--nice-space-5, 20px)}.settings-group label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem;color:var(--ml-text-muted);margin-bottom:var(--nice-space-2, 8px)}.settings-group select,.settings-group input{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text)}.checkbox-label{flex-direction:row!important;align-items:center;gap:var(--nice-space-2, 8px)!important}.review-panel{display:flex;flex-direction:column;height:100%;padding:var(--nice-space-6, 24px)}.review-filters{display:flex;gap:var(--nice-space-3, 12px);margin-bottom:var(--nice-space-4, 16px);padding-bottom:var(--nice-space-4, 16px);border-bottom:1px solid var(--ml-border)}.filter-group label{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);font-size:.75rem;color:var(--ml-text-muted)}.filter-group select,.filter-group input{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.875rem}.review-grid{flex:1;display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-4, 16px);overflow-y:auto}.review-item{background:var(--ml-surface);border-radius:var(--ml-radius);overflow:hidden;border:2px solid transparent;cursor:pointer;transition:all var(--ml-transition)}.review-item:hover,.review-item.selected{border-color:var(--ml-primary)}.review-thumbnail{width:100%;height:120px;display:flex;align-items:center;justify-content:center;background:var(--ml-surface-alt);overflow:hidden}.review-thumbnail img{width:100%;height:100%;object-fit:cover}.review-thumbnail.text{font-size:.75rem;color:var(--ml-text-muted);padding:var(--nice-space-3, 12px)}.review-info{padding:var(--nice-space-3, 12px)}.review-labels{display:flex;flex-wrap:wrap;gap:var(--nice-space-1, 4px);margin-bottom:var(--nice-space-2, 8px)}.review-label-tag{padding:var(--nice-space-0-5, 2px) var(--nice-space-1-5, 6px);border-radius:var(--nice-radius-sm, 2px);font-size:.625rem;color:#fff}.review-meta{display:flex;justify-content:space-between;font-size:.625rem;color:var(--ml-text-muted)}.review-actions{display:flex;gap:var(--nice-space-2, 8px);padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-top:1px solid var(--ml-border)}.review-action-button{flex:1;padding:var(--nice-space-2-5, 10px);border:none;border-radius:var(--ml-radius-sm);font-size:.875rem;cursor:pointer;transition:all var(--ml-transition)}.review-action-button--approve{background:var(--ml-success);color:#fff}.review-action-button--reject{background:var(--ml-error);color:#fff}.export-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px);padding:var(--nice-space-6, 24px);max-width:600px}.format-selection,.export-options,.export-actions{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.format-selection h3,.export-options h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.format-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--nice-space-3, 12px)}.format-option{display:flex;flex-direction:column;padding:var(--nice-space-4, 16px);border:2px solid var(--ml-border);border-radius:var(--ml-radius);cursor:pointer;transition:all var(--ml-transition)}.format-option:hover{border-color:var(--ml-primary)}.format-option.selected{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.format-name{font-weight:500;margin-bottom:var(--nice-space-1, 4px)}.format-description{font-size:.75rem;color:var(--ml-text-muted)}.option-row{margin-bottom:var(--nice-space-4, 16px)}.option-row label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.875rem}.option-row select,.option-row input[type=number]{padding:var(--nice-space-2-5, 10px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text)}.checkbox-option{flex-direction:row!important;align-items:center;gap:var(--nice-space-2, 8px)!important}.export-button{padding:var(--nice-space-3-5, 14px) var(--nice-space-6, 24px);border:none;border-radius:var(--ml-radius);background:var(--ml-primary);color:#fff;font-size:1rem;font-weight:600;cursor:pointer;transition:all var(--ml-transition)}.export-button:hover{background:var(--ml-primary-dark)}.nice-model-inference{display:flex;flex-direction:column;height:100%;min-height:600px;background:var(--ml-bg);color:var(--ml-text);font-family:system-ui,-apple-system,sans-serif}.inference__header{display:flex;justify-content:space-between;align-items:center;padding:var(--nice-space-4, 16px) var(--nice-space-6, 24px);background:var(--ml-surface);border-bottom:1px solid var(--ml-border)}.inference__content{flex:1;padding:var(--nice-space-6, 24px);overflow:auto}.test-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--nice-space-6, 24px);height:100%}.input-section,.output-section{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.input-type-selector{display:flex;gap:var(--nice-space-2, 8px)}.type-button{padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);cursor:pointer;transition:all var(--ml-transition)}.type-button:hover{border-color:var(--ml-primary)}.type-button--active{background:var(--ml-primary);border-color:var(--ml-primary);color:#fff}.input-area{flex:1}.text-input,.json-input{width:100%;min-height:200px;padding:var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);color:var(--ml-text);font-family:Fira Code,monospace;font-size:.875rem;resize:vertical}.text-input:focus,.json-input:focus{outline:none;border-color:var(--ml-primary)}.image-input{min-height:200px;display:flex;align-items:center;justify-content:center}.image-preview{position:relative;max-width:100%;max-height:300px}.image-preview img{max-width:100%;max-height:300px;object-fit:contain;border-radius:var(--ml-radius)}.clear-button{position:absolute;top:8px;right:8px;padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:none;background:var(--ml-error);color:#fff;border-radius:var(--ml-radius-sm);cursor:pointer}.parameters-section h4{margin:0 0 var(--nice-space-3, 12px);font-size:.875rem;font-weight:500}.parameters-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--nice-space-3, 12px)}.parameters-grid label{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);font-size:.75rem;color:var(--ml-text-muted)}.parameters-grid input{padding:var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font-size:.875rem}.output-section h3{margin:0;font-size:1rem;font-weight:600}.error-message{display:flex;align-items:center;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--nice-danger-tint-10, rgba(239, 68, 68, .1));border:1px solid var(--ml-error);border-radius:var(--ml-radius);color:var(--ml-error)}.result-container{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px)}.result-meta{display:flex;gap:var(--nice-space-4, 16px);font-size:.75rem;color:var(--ml-text-muted);padding:var(--nice-space-3, 12px);background:var(--ml-surface);border-radius:var(--ml-radius-sm)}.predictions-list{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px)}.prediction-item{padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-radius:var(--ml-radius)}.prediction-label{display:flex;align-items:center;gap:var(--nice-space-3, 12px);margin-bottom:var(--nice-space-2, 8px)}.label-name{font-weight:500;font-size:1rem}.confidence-badge{padding:var(--nice-space-1, 4px) var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);font-size:.75rem;color:#fff}.prediction-score,.prediction-bbox{font-size:.875rem;color:var(--ml-text-muted);margin-bottom:var(--nice-space-1, 4px)}.prediction-text pre{margin:var(--nice-space-2, 8px) 0 0;padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);overflow-x:auto;font-size:.875rem}.raw-output{margin-top:var(--nice-space-2, 8px)}.raw-output summary{cursor:pointer;font-size:.75rem;color:var(--ml-text-muted)}.raw-output pre{margin-top:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm);overflow-x:auto;font-size:.75rem}.empty-output{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--nice-space-15, 60px);background:var(--ml-surface);border-radius:var(--ml-radius);color:var(--ml-text-muted);text-align:center}.empty-output .icon{font-size:2rem;margin-bottom:var(--nice-space-2, 8px)}.batch-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.batch-upload{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.batch-upload h3{margin:0 0 var(--nice-space-2, 8px);font-size:1rem;font-weight:600}.batch-upload .hint{margin:0 0 var(--nice-space-4, 16px);font-size:.875rem;color:var(--ml-text-muted)}.batch-progress{display:flex;align-items:center;gap:var(--nice-space-4, 16px);padding:var(--nice-space-4, 16px);background:var(--ml-surface);border-radius:var(--ml-radius)}.progress-bar{flex:1;height:8px;background:var(--ml-surface-alt);border-radius:var(--nice-radius-sm, 4px);overflow:hidden}.progress-fill{height:100%;background:var(--ml-primary);transition:width var(--ml-transition)}.batch-results{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.batch-results h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.results-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);max-height:400px;overflow-y:auto}.batch-result-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);padding:var(--nice-space-3, 12px);background:var(--ml-surface-alt);border-radius:var(--ml-radius-sm)}.result-index{font-weight:600;color:var(--ml-text-muted);min-width:40px}.result-prediction{font-size:.875rem}.metrics-panel{display:flex;flex-direction:column;gap:var(--nice-space-6, 24px)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--nice-space-4, 16px)}.metric-card{display:flex;flex-direction:column;align-items:center;padding:var(--nice-space-6, 24px);background:var(--ml-surface);border-radius:var(--ml-radius);text-align:center}.metric-value{font-size:1.75rem;font-weight:700;color:var(--ml-primary-light);margin-bottom:var(--nice-space-1, 4px)}.metric-label{font-size:.875rem;color:var(--ml-text-muted)}.latency-histogram{background:var(--ml-surface);border-radius:var(--ml-radius);padding:var(--nice-space-5, 20px)}.latency-histogram h3{margin:0 0 var(--nice-space-4, 16px);font-size:1rem;font-weight:600}.histogram-bars{display:flex;align-items:flex-end;gap:var(--nice-space-4, 16px);height:120px}.histogram-bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.bar-fill{width:100%;background:var(--ml-primary);border-radius:var(--ml-radius-sm) var(--ml-radius-sm) 0 0;min-height:10px}.percentile-label{margin-top:var(--nice-space-2, 8px);font-size:.75rem;color:var(--ml-text-muted)}.logs-panel{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--nice-space-4, 16px)}.logs-header h3{margin:0;font-size:1rem;font-weight:600}.clear-logs-button{padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);background:transparent;color:var(--ml-text);border-radius:var(--ml-radius-sm);font-size:.75rem;cursor:pointer}.clear-logs-button:hover{background:var(--ml-surface-alt)}.logs-table{flex:1;overflow:auto;background:var(--ml-surface);border-radius:var(--ml-radius)}.logs-table table{width:100%;border-collapse:collapse}.logs-table th,.logs-table td{padding:var(--nice-space-3, 12px);text-align:left;border-bottom:1px solid var(--ml-border)}.logs-table th{font-weight:600;font-size:.75rem;color:var(--ml-text-muted);text-transform:uppercase;background:var(--ml-surface-alt);position:sticky;top:0}.logs-table td{font-size:.875rem}.empty-logs{text-align:center;color:var(--ml-text-muted);padding:var(--nice-space-10, 40px)!important}.log-row--error{background:var(--nice-danger-tint-10, rgba(239, 68, 68, .05))}.request-id{font-family:Fira Code,monospace;font-size:.75rem}.nice-ml-studio .header__info{gap:var(--nice-space-3, 12px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px)}.nice-ml-studio .header__tabs{padding:var(--nice-space-1, 4px) var(--nice-space-4, 16px)}.nice-ml-studio .project-name-input,.nice-ml-studio .project-type-select,.nice-ml-studio .new-experiment-form select,.nice-ml-studio .columns-table select{padding:var(--nice-space-1-5, 6px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font:inherit;font-size:.875rem}.nice-ml-studio .project-name-input{min-width:220px;font-weight:600}.nice-ml-studio .panel-header{display:flex;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px)}.nice-ml-studio .panel-header h2{margin:0;font-size:1.125rem;font-weight:600}.nice-ml-studio .upload-button,.nice-ml-studio .primary-button,.nice-ml-studio .secondary-button{display:inline-flex;align-items:center;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface);color:var(--ml-text);font:inherit;font-size:.875rem;font-weight:500;cursor:pointer;transition:background var(--ml-transition),border-color var(--ml-transition)}.nice-ml-studio .upload-button:hover,.nice-ml-studio .secondary-button:hover{border-color:var(--ml-primary)}.nice-ml-studio .primary-button{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-color-white, #fff)}.nice-ml-studio .primary-button:hover:not(:disabled){background:var(--ml-primary-dark)}.nice-ml-studio .primary-button:disabled,.nice-ml-studio .action-button:disabled{opacity:.5;cursor:not-allowed}.nice-ml-studio .datasets-grid,.nice-ml-studio .experiments-list,.nice-ml-studio .models-list,.nice-ml-studio .deployments-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--nice-space-4, 16px);padding:0;background:none}.nice-ml-studio .datasets-grid>.empty-state,.nice-ml-studio .experiments-list>.empty-state,.nice-ml-studio .models-list>.empty-state,.nice-ml-studio .deployments-list>.empty-state{grid-column:1 / -1}.nice-ml-studio .dataset-card,.nice-ml-studio .experiment-card,.nice-ml-studio .model-card,.nice-ml-studio .deployment-card{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px);min-width:0;padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);cursor:pointer;transition:border-color var(--ml-transition),box-shadow var(--ml-transition)}.nice-ml-studio .deployment-card{cursor:default}.nice-ml-studio .dataset-card:hover,.nice-ml-studio .experiment-card:hover,.nice-ml-studio .model-card:hover{border-color:var(--ml-primary-light)}.nice-ml-studio .dataset-card--selected,.nice-ml-studio .experiment-card--selected,.nice-ml-studio .model-card--selected{border-color:var(--ml-primary);box-shadow:0 0 0 1px var(--ml-primary)}.nice-ml-studio .card-header{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.nice-ml-studio .card-header h3{flex:1;min-width:0;margin:0;overflow:hidden;font-size:.9375rem;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.nice-ml-studio .dataset-icon{display:inline-flex;color:var(--ml-primary)}.nice-ml-studio .remove-button{display:inline-flex;align-items:center;justify-content:center;padding:var(--nice-space-1, 4px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-ml-studio .remove-button:hover{background:var(--ml-surface-alt);color:var(--ml-error)}.nice-ml-studio .card-stats,.nice-ml-studio .card-meta,.nice-ml-studio .resources-info{display:flex;flex-wrap:wrap;gap:var(--nice-space-1, 4px) var(--nice-space-4, 16px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-ml-studio .card-meta span,.nice-ml-studio .resources-info span{overflow-wrap:anywhere}.nice-ml-studio .splits-bar{display:flex;height:6px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-ml-studio .split--train{background:var(--ml-primary)}.nice-ml-studio .split--validation{background:var(--ml-warning)}.nice-ml-studio .split--test{background:var(--ml-success)}.nice-ml-studio .dataset-details,.nice-ml-studio .new-experiment-form{display:flex;flex-direction:column;gap:var(--nice-space-4, 16px);padding:var(--nice-space-5, 20px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-ml-studio .dataset-details h3,.nice-ml-studio .new-experiment-form h3{margin:0;font-size:1rem;font-weight:600}.nice-ml-studio .columns-table{width:100%;border-collapse:collapse;font-size:.875rem}.nice-ml-studio .columns-table th,.nice-ml-studio .columns-table td{padding:var(--nice-space-2, 8px) var(--nice-space-3, 12px);border-bottom:1px solid var(--ml-border);text-align:left}.nice-ml-studio .columns-table th{font-size:.75rem;font-weight:500;letter-spacing:.04em;text-transform:uppercase;color:var(--ml-text-muted)}.nice-ml-studio .form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-4, 16px)}.nice-ml-studio .form-grid label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-ml-studio .form-actions,.nice-ml-studio .card-actions{display:flex;justify-content:flex-end;gap:var(--nice-space-2, 8px)}.nice-ml-studio .metrics-row{display:flex;gap:var(--nice-space-2, 8px)}.nice-ml-studio .metric-item{display:flex;flex:1;flex-direction:column;gap:var(--nice-space-0-5, 2px);min-width:0;padding:var(--nice-space-2, 8px);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt)}.nice-ml-studio .metric-name{overflow:hidden;font-size:.6875rem;letter-spacing:.04em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;color:var(--ml-text-muted)}.nice-ml-studio .metric-value{font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.nice-ml-studio .action-button{border:1px solid var(--ml-border);background:var(--ml-surface-alt);color:var(--ml-text)}.nice-ml-studio .action-button--primary{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-color-white, #fff)}.nice-data-labeler{position:relative}.nice-data-labeler .labeler__header{flex-wrap:wrap;gap:var(--nice-space-3, 12px)}.nice-data-labeler .project-name-input,.nice-data-labeler .schema-settings select,.nice-data-labeler .filter-group select,.nice-data-labeler .class-name-input,.nice-data-labeler .shortcut-input,.nice-data-labeler .guidelines-section textarea{padding:var(--nice-space-1-5, 6px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font:inherit;font-size:.875rem}.nice-data-labeler .project-name-input{min-width:200px;font-weight:600}.nice-data-labeler .header__info .progress-bar{position:relative;width:180px;height:20px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-data-labeler .header__info .progress-fill{height:100%;background:var(--nice-accent-tint-40, rgba(99, 102, 241, .4));transition:width var(--ml-transition)}.nice-data-labeler .progress-text{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500}.nice-data-labeler .shortcuts-button,.nice-data-labeler .primary-button,.nice-data-labeler .approve-button,.nice-data-labeler .reject-button,.nice-data-labeler .zoom-group button,.nice-data-labeler .navigation-group button{display:inline-flex;align-items:center;justify-content:center;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-1-5, 6px) var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);color:var(--ml-text);font:inherit;font-size:.8125rem;cursor:pointer;transition:background var(--ml-transition),border-color var(--ml-transition)}.nice-data-labeler .shortcuts-button:hover,.nice-data-labeler .zoom-group button:hover,.nice-data-labeler .navigation-group button:hover:not(:disabled){border-color:var(--ml-primary)}.nice-data-labeler .zoom-group button{padding-inline:var(--nice-space-2, 8px)}.nice-data-labeler .navigation-group button:disabled{opacity:.45;cursor:not-allowed}.nice-data-labeler .primary-button{border-color:var(--ml-primary);background:var(--ml-primary);color:var(--nice-color-white, #fff)}.nice-data-labeler .approve-button{border-color:var(--ml-success);background:var(--nice-success-tint-20, rgba(34, 197, 94, .2));color:var(--ml-success)}.nice-data-labeler .reject-button{border-color:var(--ml-error);background:var(--nice-danger-tint-20, rgba(239, 68, 68, .2));color:var(--ml-error)}.nice-data-labeler .labeler__content{flex:1;min-height:0;overflow:auto}.nice-data-labeler .label-panel{display:flex;flex-direction:column;height:100%}.nice-data-labeler .label-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px);padding:var(--nice-space-2, 8px) var(--nice-space-4, 16px);border-bottom:1px solid var(--ml-border);background:var(--ml-surface)}.nice-data-labeler .tool-group,.nice-data-labeler .zoom-group,.nice-data-labeler .navigation-group{display:flex;align-items:center;gap:var(--nice-space-2, 8px);font-size:.8125rem;font-variant-numeric:tabular-nums}.nice-data-labeler .label-workspace{display:grid;flex:1;grid-template-columns:minmax(0,1fr) 260px;min-height:0}.nice-data-labeler .canvas-container{position:relative;display:flex;align-items:center;justify-content:center;min-width:0;padding:var(--nice-space-6, 24px);overflow:auto;background:var(--ml-bg)}.nice-data-labeler .labeling-image{max-width:100%;transform-origin:center}.nice-data-labeler .labeling-canvas{position:absolute;top:0;right:0;bottom:0;left:0;border:none;background:transparent}.nice-data-labeler .annotations-overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;transform-origin:top left}.nice-data-labeler .bbox-annotation,.nice-data-labeler .bbox-drawing{position:absolute;border:2px solid var(--ml-primary);pointer-events:auto}.nice-data-labeler .bbox-drawing{border-style:dashed}.nice-data-labeler .bbox-remove{position:absolute;top:-10px;right:-10px;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:1px solid var(--ml-border);border-radius:var(--nice-radius-full, 50%);background:var(--ml-surface);color:var(--ml-error);cursor:pointer}.nice-data-labeler .text-labeling{width:100%;max-width:640px;padding:var(--nice-space-6, 24px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-data-labeler .text-content{margin:0;font-size:1.0625rem;line-height:1.6}.nice-data-labeler .class-sidebar{display:flex;flex-direction:column;gap:var(--nice-space-3, 12px);padding:var(--nice-space-4, 16px);overflow-y:auto;border-left:1px solid var(--ml-border);background:var(--ml-surface)}.nice-data-labeler .class-sidebar h3,.nice-data-labeler .current-labels h4{margin:0;font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ml-text-muted)}.nice-data-labeler .class-button--active{border-color:var(--ml-primary);background:var(--nice-accent-tint-10, rgba(99, 102, 241, .1))}.nice-data-labeler .class-button .class-name{flex:1}.nice-data-labeler .class-shortcut{min-width:20px;padding:0 var(--nice-space-1-5, 6px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);font-size:.6875rem;text-align:center;color:var(--ml-text-muted)}.nice-data-labeler .current-labels{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .label-item button{display:inline-flex;padding:var(--nice-space-0-5, 2px);border:none;background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .label-actions{display:flex;gap:var(--nice-space-2, 8px);margin-top:auto}.nice-data-labeler .label-actions button{flex:1}.nice-data-labeler .panel-header{display:flex;align-items:center;justify-content:space-between;gap:var(--nice-space-3, 12px)}.nice-data-labeler .panel-header h2{margin:0;font-size:1.125rem;font-weight:600}.nice-data-labeler .schema-panel,.nice-data-labeler .review-panel,.nice-data-labeler .export-panel{display:flex;flex-direction:column;gap:var(--nice-space-5, 20px);padding:var(--nice-space-6, 24px)}.nice-data-labeler .schema-settings{display:flex;flex-wrap:wrap;gap:var(--nice-space-4, 16px);padding:0;background:none}.nice-data-labeler .schema-settings label{display:flex;flex-direction:column;gap:var(--nice-space-1-5, 6px);font-size:.8125rem;color:var(--ml-text-muted)}.nice-data-labeler .classes-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .class-editor{display:flex;align-items:center;gap:var(--nice-space-2, 8px)}.nice-data-labeler .color-picker{width:36px;height:32px;padding:var(--nice-space-0-5, 2px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);cursor:pointer}.nice-data-labeler .class-name-input{flex:1;min-width:0}.nice-data-labeler .shortcut-input{width:48px;text-align:center}.nice-data-labeler .remove-class-button{display:inline-flex;padding:var(--nice-space-1-5, 6px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .remove-class-button:hover{background:var(--ml-surface-alt);color:var(--ml-error)}.nice-data-labeler .guidelines-section{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .guidelines-section h3,.nice-data-labeler .export-formats h3,.nice-data-labeler .class-distribution h3{margin:0 0 var(--nice-space-2, 8px);font-size:1rem;font-weight:600}.nice-data-labeler .guidelines-section textarea{min-height:120px;resize:vertical}.nice-data-labeler .items-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--nice-space-3, 12px)}.nice-data-labeler .item-card{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px);padding:var(--nice-space-3, 12px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);cursor:pointer;transition:border-color var(--ml-transition)}.nice-data-labeler .item-card:hover{border-color:var(--ml-primary-light)}.nice-data-labeler .item-card--active{border-color:var(--ml-primary);box-shadow:0 0 0 1px var(--ml-primary)}.nice-data-labeler .item-thumbnail{width:100%;aspect-ratio:4 / 3;border-radius:var(--ml-radius-sm);object-fit:cover}.nice-data-labeler .item-text-preview{margin:0;font-size:.8125rem;line-height:1.5}.nice-data-labeler .item-footer{display:flex;align-items:center;gap:var(--nice-space-1-5, 6px);font-size:.75rem;color:var(--ml-text-muted)}.nice-data-labeler .status-dot{flex-shrink:0;width:8px;height:8px;border-radius:var(--nice-radius-full, 50%)}.nice-data-labeler .export-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--nice-space-3, 12px)}.nice-data-labeler .stat-card{display:flex;flex-direction:column;gap:var(--nice-space-1, 4px);padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface)}.nice-data-labeler .stat-value{font-size:1.5rem;font-weight:600;font-variant-numeric:tabular-nums}.nice-data-labeler .stat-label,.nice-data-labeler .format-desc{font-size:.75rem;color:var(--ml-text-muted)}.nice-data-labeler .format-button{display:flex;flex-direction:column;align-items:flex-start;gap:var(--nice-space-1-5, 6px);padding:var(--nice-space-4, 16px);border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);color:var(--ml-text);font:inherit;text-align:left;cursor:pointer;transition:border-color var(--ml-transition)}.nice-data-labeler .format-button:hover{border-color:var(--ml-primary)}.nice-data-labeler .format-icon{display:inline-flex;color:var(--ml-primary)}.nice-data-labeler .distribution-bars{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .distribution-row{display:grid;grid-template-columns:120px minmax(0,1fr) 40px;align-items:center;gap:var(--nice-space-3, 12px);font-size:.8125rem}.nice-data-labeler .distribution-row .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nice-data-labeler .bar-container{height:8px;overflow:hidden;border-radius:var(--nice-radius-full, 99px);background:var(--ml-surface-alt)}.nice-data-labeler .bar-container .bar-fill{height:100%;border-radius:var(--nice-radius-full, 99px)}.nice-data-labeler .distribution-row .count{font-variant-numeric:tabular-nums;text-align:right;color:var(--ml-text-muted)}.nice-data-labeler .shortcuts-modal{position:absolute;top:0;right:0;bottom:0;left:0;z-index:20;display:flex;align-items:center;justify-content:center;background:var(--nice-overlay-60, rgba(0, 0, 0, .6))}.nice-data-labeler .modal-content{width:min(420px,calc(100% - 32px));max-height:calc(100% - 32px);padding:var(--nice-space-5, 20px);overflow:auto;border:1px solid var(--ml-border);border-radius:var(--ml-radius);background:var(--ml-surface);box-shadow:var(--ml-shadow)}.nice-data-labeler .modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--nice-space-3, 12px)}.nice-data-labeler .modal-header h3{margin:0;font-size:1rem;font-weight:600}.nice-data-labeler .modal-header button{display:inline-flex;padding:var(--nice-space-1, 4px);border:none;border-radius:var(--ml-radius-sm);background:transparent;color:var(--ml-text-muted);cursor:pointer}.nice-data-labeler .shortcuts-list{display:flex;flex-direction:column;gap:var(--nice-space-2, 8px)}.nice-data-labeler .shortcut-item{display:flex;align-items:center;gap:var(--nice-space-3, 12px);font-size:.875rem}.nice-data-labeler .shortcut-item .keys{min-width:88px;padding:var(--nice-space-0-5, 2px) var(--nice-space-2, 8px);border:1px solid var(--ml-border);border-radius:var(--ml-radius-sm);background:var(--ml-surface-alt);font-family:ui-monospace,monospace;font-size:.75rem;text-align:center}.nice-data-labeler .shortcut-item .description{color:var(--ml-text-muted)}.nice-model-inference .prediction-score{display:flex;gap:var(--nice-space-1, 4px)}.nice-model-inference .score-value{font-variant-numeric:tabular-nums}.nice-model-inference .error-icon{display:inline-flex;flex-shrink:0}@media(max-width:720px){.nice-data-labeler .label-workspace{grid-template-columns:1fr}.nice-data-labeler .class-sidebar{border-top:1px solid var(--ml-border);border-left:none}}@media(max-width:1200px){.test-panel,.schema-panel,.label-panel{grid-template-columns:1fr}.labeling-sidebar{display:none}}@media(max-width:768px){.parameters-grid,.metrics-grid{grid-template-columns:repeat(2,1fr)}.format-grid{grid-template-columns:1fr}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nice2dev/ui-ai",
3
- "version": "1.1.9",
4
- "description": "Nice2Dev AI Hints — LLM-powered contextual suggestions for UI controls (OpenAI, Azure OpenAI, Ollama, custom endpoints)",
3
+ "version": "1.2.0",
4
+ "description": "Nice2Dev AI Hints — LLM-powered contextual suggestions for UI controls (OpenAI, Azure OpenAI, Ollama, custom endpoints)",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.mjs",
@@ -39,8 +39,8 @@
39
39
  "react-dom": ">=17.0.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@nice2dev/ui": "^1.1.9",
43
- "@nice2dev/ui-core": "^1.1.9",
42
+ "@nice2dev/ui": "^1.2.0",
43
+ "@nice2dev/ui-core": "^1.2.0",
44
44
  "@testing-library/jest-dom": "^7.0.1",
45
45
  "@testing-library/react": "^16.3.3",
46
46
  "@types/react": "^19.2.18",